ZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9DaGFuZ2VMb2cgYi91bml4L2ludGwvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MTI5MTkKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNCBAQAorMjAwNC0wMS0yOSAgR05VICA8YnVnLWdudS1nZXR0ZXh0QGdudS5vcmc+CisKKwkqIFZlcnNpb24gMC4xNC4xIHJlbGVhc2VkLgorCmRpZmYgLS1naXQgYS91bml4L2ludGwvTWFrZWZpbGUuaW4gYi91bml4L2ludGwvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM0NjhmOQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDQ5MyBAQAorIyBNYWtlZmlsZSBmb3IgZGlyZWN0b3J5IHdpdGggbWVzc2FnZSBjYXRhbG9nIGhhbmRsaW5nIGxpYnJhcnkgb2YgR05VIGdldHRleHQKKyMgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTgsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorIyBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisjIFVTQS4KKworUEFDS0FHRSA9IEBQQUNLQUdFQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorCitTSEVMTCA9IC9iaW4vc2gKKworc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3RvcF9idWlsZGRpciA9IC4uCitWUEFUSCA9ICQoc3JjZGlyKQorCitwcmVmaXggPSBAcHJlZml4QAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACit0cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK2xpYmRpciA9IEBsaWJkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitsb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQorZ2V0dGV4dHNyY2RpciA9ICQoZGF0YWRpcikvZ2V0dGV4dC9pbnRsCithbGlhc3BhdGggPSAkKGxvY2FsZWRpcikKK3N1YmRpciA9IGludGwKKworSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK01LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKK21raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKE1LSU5TVEFMTERJUlMpCisKK2wgPSBASU5UTF9MSUJUT09MX1NVRkZJWF9QUkVGSVhACisKK0FSID0gYXIKK0NDID0gQENDQAorTElCVE9PTCA9IEBMSUJUT09MQAorUkFOTElCID0gQFJBTkxJQkAKK1lBQ0MgPSBASU5UTEJJU09OQCAteSAtZAorWUZMQUdTID0gLS1uYW1lLXByZWZpeD1fX2dldHRleHQKKworREVGUyA9IC1ETE9DQUxFRElSPVwiJChsb2NhbGVkaXIpXCIgLURMT0NBTEVfQUxJQVNfUEFUSD1cIiQoYWxpYXNwYXRoKVwiIFwKKy1ETElCRElSPVwiJChsaWJkaXIpXCIgLURJTl9MSUJJTlRMIFwKKy1ERU5BQkxFX1JFTE9DQVRBQkxFPTEgLURJTl9MSUJSQVJZIC1ESU5TVEFMTERJUj1cIiQobGliZGlyKVwiIC1ETk9fWE1BTExPQyBcCistRHNldF9yZWxvY2F0aW9uX3ByZWZpeD1saWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeCBcCistRHJlbG9jYXRlPWxpYmludGxfcmVsb2NhdGUgXAorLURERVBFTkRTX09OX0xJQklDT05WPTEgQERFRlNACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NGTEFHUyA9IEBDRkxBR1NACitMREZMQUdTID0gQExERkxBR1NACitMSUJTID0gQExJQlNACisKK0NPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCisKK0hFQURFUlMgPSBcCisgIGdtby5oIFwKKyAgZ2V0dGV4dFAuaCBcCisgIGhhc2gtc3RyaW5nLmggXAorICBsb2FkaW5mby5oIFwKKyAgcGx1cmFsLWV4cC5oIFwKKyAgZXZhbC1wbHVyYWwuaCBcCisgIGxvY2FsY2hhcnNldC5oIFwKKyAgcmVsb2NhdGFibGUuaCBcCisgIHhzaXplLmggXAorICBwcmludGYtYXJncy5oIHByaW50Zi1hcmdzLmMgXAorICBwcmludGYtcGFyc2UuaCB3cHJpbnRmLXBhcnNlLmggcHJpbnRmLXBhcnNlLmMgXAorICB2YXNucHJpbnRmLmggdmFzbndwcmludGYuaCB2YXNucHJpbnRmLmMgXAorICBvczJjb21wYXQuaCBcCisgIGxpYmdudWludGwuaC5pbgorU09VUkNFUyA9IFwKKyAgYmluZHRleHRkb20uYyBcCisgIGRjZ2V0dGV4dC5jIFwKKyAgZGdldHRleHQuYyBcCisgIGdldHRleHQuYyBcCisgIGZpbmRkb21haW4uYyBcCisgIGxvYWRtc2djYXQuYyBcCisgIGxvY2FsZWFsaWFzLmMgXAorICB0ZXh0ZG9tYWluLmMgXAorICBsMTBuZmxpc3QuYyBcCisgIGV4cGxvZGVuYW1lLmMgXAorICBkY2lnZXR0ZXh0LmMgXAorICBkY25nZXR0ZXh0LmMgXAorICBkbmdldHRleHQuYyBcCisgIG5nZXR0ZXh0LmMgXAorICBwbHVyYWwueSBcCisgIHBsdXJhbC1leHAuYyBcCisgIGxvY2FsY2hhcnNldC5jIFwKKyAgcmVsb2NhdGFibGUuYyBcCisgIGxvY2FsZW5hbWUuYyBcCisgIGxvZy5jIFwKKyAgcHJpbnRmLmMgXAorICBvc2RlcC5jIFwKKyAgb3MyY29tcGF0LmMgXAorICBpbnRsLWNvbXBhdC5jCitPQkpFQ1RTID0gXAorICBiaW5kdGV4dGRvbS4kbG8gXAorICBkY2dldHRleHQuJGxvIFwKKyAgZGdldHRleHQuJGxvIFwKKyAgZ2V0dGV4dC4kbG8gXAorICBmaW5kZG9tYWluLiRsbyBcCisgIGxvYWRtc2djYXQuJGxvIFwKKyAgbG9jYWxlYWxpYXMuJGxvIFwKKyAgdGV4dGRvbWFpbi4kbG8gXAorICBsMTBuZmxpc3QuJGxvIFwKKyAgZXhwbG9kZW5hbWUuJGxvIFwKKyAgZGNpZ2V0dGV4dC4kbG8gXAorICBkY25nZXR0ZXh0LiRsbyBcCisgIGRuZ2V0dGV4dC4kbG8gXAorICBuZ2V0dGV4dC4kbG8gXAorICBwbHVyYWwuJGxvIFwKKyAgcGx1cmFsLWV4cC4kbG8gXAorICBsb2NhbGNoYXJzZXQuJGxvIFwKKyAgcmVsb2NhdGFibGUuJGxvIFwKKyAgbG9jYWxlbmFtZS4kbG8gXAorICBsb2cuJGxvIFwKKyAgcHJpbnRmLiRsbyBcCisgIG9zZGVwLiRsbyBcCisgIGludGwtY29tcGF0LiRsbworRElTVEZJTEVTLmNvbW1vbiA9IE1ha2VmaWxlLmluIFwKK2NvbmZpZy5jaGFyc2V0IGxvY2FsZS5hbGlhcyByZWYtYWRkLnNpbiByZWYtZGVsLnNpbiAkKEhFQURFUlMpICQoU09VUkNFUykKK0RJU1RGSUxFUy5nZW5lcmF0ZWQgPSBwbHVyYWwuYworRElTVEZJTEVTLm5vcm1hbCA9IFZFUlNJT04KK0RJU1RGSUxFUy5nZXR0ZXh0ID0gQ09QWUlORy5MSUItMi4wIENPUFlJTkcuTElCLTIuMSBsaWJpbnRsLmdsaWJjIFwKK2xpYmdudWludGwuaF92bXMgTWFrZWZpbGUudm1zIFwKK2xpYmdudWludGwuaC5tc3ZjLXN0YXRpYyBsaWJnbnVpbnRsLmgubXN2Yy1zaGFyZWQgUkVBRE1FLndvZTMyIE1ha2VmaWxlLm1zdmMKK0RJU1RGSUxFUy5vYnNvbGV0ZSA9IHhvcGVuLW1zZy5zZWQgbGludXgtbXNnLnNlZCBwbzJ0Ymwuc2VkLmluIGNhdC1jb21wYXQuYyBcCitDT1BZSU5HLkxJQi0yIGdldHRleHQuaCBsaWJnZXR0ZXh0LmggcGx1cmFsLWV2YWwuYyBsaWJnbnVpbnRsLmgKKworYWxsOiBhbGwtQFVTRV9JTkNMVURFRF9MSUJJTlRMQAorYWxsLXllczogbGliaW50bC4kbGEgbGliaW50bC5oIGNoYXJzZXQuYWxpYXMgcmVmLWFkZC5zZWQgcmVmLWRlbC5zZWQKK2FsbC1ubzogYWxsLW5vLUBCVUlMRF9JTkNMVURFRF9MSUJJTlRMQAorYWxsLW5vLXllczogbGliZ251aW50bC4kbGEKK2FsbC1uby1ubzoKKworbGliaW50bC5hIGxpYmdudWludGwuYTogJChPQkpFQ1RTKQorCXJtIC1mICRACisJJChBUikgY3J1ICRAICQoT0JKRUNUUykKKwkkKFJBTkxJQikgJEAKKworbGliaW50bC5sYSBsaWJnbnVpbnRsLmxhOiAkKE9CSkVDVFMpCisJJChMSUJUT09MKSAtLW1vZGU9bGluayBcCisJICAkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRAIFwKKwkgICQoT0JKRUNUUykgQExUTElCSUNPTlZAICQoTElCUykgLWxjIFwKKwkgIC12ZXJzaW9uLWluZm8gJChMVFZfQ1VSUkVOVCk6JChMVFZfUkVWSVNJT04pOiQoTFRWX0FHRSkgXAorCSAgLXJwYXRoICQobGliZGlyKSBcCisJICAtbm8tdW5kZWZpbmVkCisKKyMgTGlidG9vbCdzIGxpYnJhcnkgdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgbGliaW50bC4KKyMgQmVmb3JlIG1ha2luZyBhIGdldHRleHQgcmVsZWFzZSwgdGhlIGdldHRleHQgbWFpbnRhaW5lciBtdXN0IGNoYW5nZSB0aGlzCisjIGFjY29yZGluZyB0byB0aGUgbGlidG9vbCBkb2N1bWVudGF0aW9uLCBzZWN0aW9uICJMaWJyYXJ5IGludGVyZmFjZSB2ZXJzaW9ucyIuCisjIE1haW50YWluZXJzIG9mIG90aGVyIHBhY2thZ2VzIHRoYXQgaW5jbHVkZSB0aGUgaW50bCBkaXJlY3RvcnkgbXVzdCAqbm90KgorIyBjaGFuZ2UgdGhlc2UgdmFsdWVzLgorTFRWX0NVUlJFTlQ9NworTFRWX1JFVklTSU9OPTAKK0xUVl9BR0U9NAorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jIC55IC5vIC5sbyAuc2luIC5zZWQKKworLmMubzoKKwkkKENPTVBJTEUpICQ8CisKKy55LmM6CisJJChZQUNDKSAkKFlGTEFHUykgLS1vdXRwdXQgJEAgJDwKKwlybSAtZiAkKi5oCisKK2JpbmR0ZXh0ZG9tLmxvOiAkKHNyY2RpcikvYmluZHRleHRkb20uYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvYmluZHRleHRkb20uYworZGNnZXR0ZXh0LmxvOiAkKHNyY2RpcikvZGNnZXR0ZXh0LmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2RjZ2V0dGV4dC5jCitkZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RnZXR0ZXh0LmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2RnZXR0ZXh0LmMKK2dldHRleHQubG86ICQoc3JjZGlyKS9nZXR0ZXh0LmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2dldHRleHQuYworZmluZGRvbWFpbi5sbzogJChzcmNkaXIpL2ZpbmRkb21haW4uYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZmluZGRvbWFpbi5jCitsb2FkbXNnY2F0LmxvOiAkKHNyY2RpcikvbG9hZG1zZ2NhdC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9sb2FkbXNnY2F0LmMKK2xvY2FsZWFsaWFzLmxvOiAkKHNyY2RpcikvbG9jYWxlYWxpYXMuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbG9jYWxlYWxpYXMuYwordGV4dGRvbWFpbi5sbzogJChzcmNkaXIpL3RleHRkb21haW4uYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvdGV4dGRvbWFpbi5jCitsMTBuZmxpc3QubG86ICQoc3JjZGlyKS9sMTBuZmxpc3QuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvbDEwbmZsaXN0LmMKK2V4cGxvZGVuYW1lLmxvOiAkKHNyY2RpcikvZXhwbG9kZW5hbWUuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZXhwbG9kZW5hbWUuYworZGNpZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RjaWdldHRleHQuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvZGNpZ2V0dGV4dC5jCitkY25nZXR0ZXh0LmxvOiAkKHNyY2RpcikvZGNuZ2V0dGV4dC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kY25nZXR0ZXh0LmMKK2RuZ2V0dGV4dC5sbzogJChzcmNkaXIpL2RuZ2V0dGV4dC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9kbmdldHRleHQuYworbmdldHRleHQubG86ICQoc3JjZGlyKS9uZ2V0dGV4dC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9uZ2V0dGV4dC5jCitwbHVyYWwubG86ICQoc3JjZGlyKS9wbHVyYWwuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvcGx1cmFsLmMKK3BsdXJhbC1leHAubG86ICQoc3JjZGlyKS9wbHVyYWwtZXhwLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3BsdXJhbC1leHAuYworbG9jYWxjaGFyc2V0LmxvOiAkKHNyY2RpcikvbG9jYWxjaGFyc2V0LmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvY2FsY2hhcnNldC5jCityZWxvY2F0YWJsZS5sbzogJChzcmNkaXIpL3JlbG9jYXRhYmxlLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL3JlbG9jYXRhYmxlLmMKK2xvY2FsZW5hbWUubG86ICQoc3JjZGlyKS9sb2NhbGVuYW1lLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvY2FsZW5hbWUuYworbG9nLmxvOiAkKHNyY2RpcikvbG9nLmMKKwkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJChzcmNkaXIpL2xvZy5jCitwcmludGYubG86ICQoc3JjZGlyKS9wcmludGYuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2RpcikvcHJpbnRmLmMKK29zZGVwLmxvOiAkKHNyY2Rpcikvb3NkZXAuYworCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkKHNyY2Rpcikvb3NkZXAuYworaW50bC1jb21wYXQubG86ICQoc3JjZGlyKS9pbnRsLWNvbXBhdC5jCisJJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpICQoc3JjZGlyKS9pbnRsLWNvbXBhdC5jCisKK3JlZi1hZGQuc2VkOiAkKHNyY2RpcikvcmVmLWFkZC5zaW4KKwlzZWQgLWUgJy9eIy9kJyAtZSAncy9AJydQQUNLQUdFJydAL0BQQUNLQUdFQC9nJyAkKHNyY2RpcikvcmVmLWFkZC5zaW4gPiB0LXJlZi1hZGQuc2VkCisJbXYgdC1yZWYtYWRkLnNlZCByZWYtYWRkLnNlZAorcmVmLWRlbC5zZWQ6ICQoc3JjZGlyKS9yZWYtZGVsLnNpbgorCXNlZCAtZSAnL14jL2QnIC1lICdzL0AnJ1BBQ0tBR0UnJ0AvQFBBQ0tBR0VAL2cnICQoc3JjZGlyKS9yZWYtZGVsLnNpbiA+IHQtcmVmLWRlbC5zZWQKKwltdiB0LXJlZi1kZWwuc2VkIHJlZi1kZWwuc2VkCisKK0lOQ0xVREVTID0gLUkuIC1JJChzcmNkaXIpIC1JLi4KKworbGliZ251aW50bC5oOiAkKHNyY2RpcikvbGliZ251aW50bC5oLmluCisJc2VkIC1lICdzLEAnJ0hBVkVfUE9TSVhfUFJJTlRGJydALEBIQVZFX1BPU0lYX1BSSU5URkAsZycgXAorCSAgICAtZSAncyxAJydIQVZFX0FTUFJJTlRGJydALEBIQVZFX0FTUFJJTlRGQCxnJyBcCisJICAgIC1lICdzLEAnJ0hBVkVfU05QUklOVEYnJ0AsQEhBVkVfU05QUklOVEZALGcnIFwKKwkgICAgLWUgJ3MsQCcnSEFWRV9XUFJJTlRGJydALEBIQVZFX1dQUklOVEZALGcnIFwKKwkgIDwgJChzcmNkaXIpL2xpYmdudWludGwuaC5pbiA+IGxpYmdudWludGwuaAorCitsaWJpbnRsLmg6IGxpYmdudWludGwuaAorCWNwIGxpYmdudWludGwuaCBsaWJpbnRsLmgKKworY2hhcnNldC5hbGlhczogJChzcmNkaXIpL2NvbmZpZy5jaGFyc2V0CisJJChTSEVMTCkgJChzcmNkaXIpL2NvbmZpZy5jaGFyc2V0ICdAaG9zdEAnID4gdC0kQAorCW12IHQtJEAgJEAKKworY2hlY2s6IGFsbAorCisjIFdlIG11c3Qgbm90IGluc3RhbGwgdGhlIGxpYmludGwuaC9saWJpbnRsLmEgZmlsZXMgaWYgd2UgYXJlIG9uIGEKKyMgc3lzdGVtIHdoaWNoIGhhcyB0aGUgR05VIGdldHRleHQoKSBmdW5jdGlvbiBpbiBpdHMgQyBsaWJyYXJ5IG9yIGluIGEKKyMgc2VwYXJhdGUgbGlicmFyeS4KKyMgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBvbmUgd2hpY2ggY29tZXMgd2l0aCB0aGlzIHZlcnNpb24gb2YgdGhlCisjIHBhY2thZ2UsIHlvdSBoYXZlIHRvIHVzZSBgY29uZmlndXJlIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0Jy4KK2luc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKK2luc3RhbGwtZXhlYzogYWxsCisJaWYgeyB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXJ1bnRpbWUiIHx8IHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB9IFwKKwkgICAmJiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcikgJChERVNURElSKSQoaW5jbHVkZWRpcik7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSBsaWJpbnRsLmggJChERVNURElSKSQoaW5jbHVkZWRpcikvbGliaW50bC5oOyBcCisJICAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsIFwKKwkgICAgJChJTlNUQUxMX0RBVEEpIGxpYmludGwuJGxhICQoREVTVERJUikkKGxpYmRpcikvbGliaW50bC4kbGE7IFwKKwkgIGlmIHRlc3QgIkBSRUxPQ0FUQUJMRUAiID0geWVzOyB0aGVuIFwKKwkgICAgZGVwZW5kZW5jaWVzPWBzZWQgLW4gLWUgJ3MsXmRlcGVuZGVuY3lfbGlicz1cKC4qXCksXDEscCcgPCAkKERFU1RESVIpJChsaWJkaXIpL2xpYmludGwubGEgfCBzZWQgLWUgInMsXicsLCIgLWUgInMsJ1wkJCwsImA7IFwKKwkgICAgaWYgdGVzdCAtbiAiJCRkZXBlbmRlbmNpZXMiOyB0aGVuIFwKKwkgICAgICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYmludGwubGE7IFwKKwkgICAgZmk7IFwKKwkgIGZpOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyIgXAorCSAgICYmIHRlc3QgJ0BVU0VfSU5DTFVERURfTElCSU5UTEAnID0gbm87IHRoZW4gXAorCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsaWJkaXIpOyBcCisJICAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsIFwKKwkgICAgJChJTlNUQUxMX0RBVEEpIGxpYmdudWludGwuJGxhICQoREVTVERJUikkKGxpYmRpcikvbGliZ251aW50bC4kbGE7IFwKKwkgIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvcHJlbG9hZGFibGVfbGliaW50bC5zbzsgXAorCSAgJChJTlNUQUxMX0RBVEEpICQoREVTVERJUikkKGxpYmRpcikvbGliZ251aW50bC5zbyAkKERFU1RESVIpJChsaWJkaXIpL3ByZWxvYWRhYmxlX2xpYmludGwuc287IFwKKwkgICQoTElCVE9PTCkgLS1tb2RlPXVuaW5zdGFsbCBcCisJICAgIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliZ251aW50bC4kbGE7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKKwlpZiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCisJICB0ZXN0IEBHTElCQzIxQCAhPSBubyB8fCAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcik7IFwKKwkgIHRlbXA9JChERVNURElSKSQobGliZGlyKS90LWNoYXJzZXQuYWxpYXM7IFwKKwkgIGRlc3Q9JChERVNURElSKSQobGliZGlyKS9jaGFyc2V0LmFsaWFzOyBcCisJICBpZiB0ZXN0IC1mICQoREVTVERJUikkKGxpYmRpcikvY2hhcnNldC5hbGlhczsgdGhlbiBcCisJICAgIG9yaWc9JChERVNURElSKSQobGliZGlyKS9jaGFyc2V0LmFsaWFzOyBcCisJICAgIHNlZCAtZiByZWYtYWRkLnNlZCAkJG9yaWcgPiAkJHRlbXA7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICQkdGVtcCAkJGRlc3Q7IFwKKwkgICAgcm0gLWYgJCR0ZW1wOyBcCisJICBlbHNlIFwKKwkgICAgaWYgdGVzdCBAR0xJQkMyMUAgPSBubzsgdGhlbiBcCisJICAgICAgb3JpZz1jaGFyc2V0LmFsaWFzOyBcCisJICAgICAgc2VkIC1mIHJlZi1hZGQuc2VkICQkb3JpZyA+ICQkdGVtcDsgXAorCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJHRlbXAgJCRkZXN0OyBcCisJICAgICAgcm0gLWYgJCR0ZW1wOyBcCisJICAgIGZpOyBcCisJICBmaTsgXAorCSAgJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChsb2NhbGVkaXIpOyBcCisJICB0ZXN0IC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvbG9jYWxlLmFsaWFzIFwKKwkgICAgJiYgb3JpZz0kKERFU1RESVIpJChsb2NhbGVkaXIpL2xvY2FsZS5hbGlhcyBcCisJICAgIHx8IG9yaWc9JChzcmNkaXIpL2xvY2FsZS5hbGlhczsgXAorCSAgdGVtcD0kKERFU1RESVIpJChsb2NhbGVkaXIpL3QtbG9jYWxlLmFsaWFzOyBcCisJICBkZXN0PSQoREVTVERJUikkKGxvY2FsZWRpcikvbG9jYWxlLmFsaWFzOyBcCisJICBzZWQgLWYgcmVmLWFkZC5zZWQgJCRvcmlnID4gJCR0ZW1wOyBcCisJICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAorCSAgcm0gLWYgJCR0ZW1wOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCitpbnN0YWxsLWRhdGE6IGFsbAorCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFwKKwkgICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZ2V0dGV4dHNyY2Rpcik7IFwKKwkgICQoSU5TVEFMTF9EQVRBKSBWRVJTSU9OICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpL1ZFUlNJT047IFwKKwkgICQoSU5TVEFMTF9EQVRBKSBDaGFuZ2VMb2cuaW5zdCAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS9DaGFuZ2VMb2c7IFwKKwkgIGRpc3RzPSJDT1BZSU5HLkxJQi0yLjAgQ09QWUlORy5MSUItMi4xICQoRElTVEZJTEVTLmNvbW1vbikiOyBcCisJICBmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRmaWxlIFwKKwkJCSAgICAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS8kJGZpbGU7IFwKKwkgIGRvbmU7IFwKKwkgIGNobW9kIGEreCAkKERFU1RESVIpJChnZXR0ZXh0c3JjZGlyKS9jb25maWcuY2hhcnNldDsgXAorCSAgZGlzdHM9IiQoRElTVEZJTEVTLmdlbmVyYXRlZCkiOyBcCisJICBmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCisJICAgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGRpcj0uOyBlbHNlIGRpcj0kKHNyY2Rpcik7IGZpOyBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAkJGRpci8kJGZpbGUgXAorCQkJICAgICQoREVTVERJUikkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAorCSAgZG9uZTsgXAorCSAgZGlzdHM9IiQoRElTVEZJTEVTLm9ic29sZXRlKSI7IFwKKwkgIGZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKKwkgICAgcm0gLWYgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCisJICBkb25lOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisKK2luc3RhbGwtc3RyaXA6IGluc3RhbGwKKworaW5zdGFsbGRpcnM6CisJaWYgeyB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXJ1bnRpbWUiIHx8IHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB9IFwKKwkgICAmJiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcikgJChERVNURElSKSQoaW5jbHVkZWRpcik7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIiBcCisJICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSBubzsgdGhlbiBcCisJICAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcik7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKKwlpZiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCisJICB0ZXN0IEBHTElCQzIxQCAhPSBubyB8fCAkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGxpYmRpcik7IFwKKwkgICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobG9jYWxlZGlyKTsgXAorCWVsc2UgXAorCSAgOiA7IFwKKwlmaQorCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFwKKwkgICQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoZ2V0dGV4dHNyY2Rpcik7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKKworIyBEZWZpbmUgdGhpcyBhcyBlbXB0eSB1bnRpbCBJIGZvdW5kIGEgdXNlZnVsIGFwcGxpY2F0aW9uLgoraW5zdGFsbGNoZWNrOgorCit1bmluc3RhbGw6CisJaWYgeyB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXJ1bnRpbWUiIHx8IHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB9IFwKKwkgICAmJiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCisJICBybSAtZiAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9saWJpbnRsLmg7IFwKKwkgICQoTElCVE9PTCkgLS1tb2RlPXVuaW5zdGFsbCBcCisJICAgIHJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGliaW50bC4kbGE7IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKKwlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIiBcCisJICAgJiYgdGVzdCAnQFVTRV9JTkNMVURFRF9MSUJJTlRMQCcgPSBubzsgdGhlbiBcCisJICBybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL3ByZWxvYWRhYmxlX2xpYmludGwuc287IFwKKwllbHNlIFwKKwkgIDogOyBcCisJZmkKKwlpZiB0ZXN0ICdAVVNFX0lOQ0xVREVEX0xJQklOVExAJyA9IHllczsgdGhlbiBcCisJICBpZiB0ZXN0IC1mICQoREVTVERJUikkKGxpYmRpcikvY2hhcnNldC5hbGlhczsgdGhlbiBcCisJICAgIHRlbXA9JChERVNURElSKSQobGliZGlyKS90LWNoYXJzZXQuYWxpYXM7IFwKKwkgICAgZGVzdD0kKERFU1RESVIpJChsaWJkaXIpL2NoYXJzZXQuYWxpYXM7IFwKKwkgICAgc2VkIC1mIHJlZi1kZWwuc2VkICQkZGVzdCA+ICQkdGVtcDsgXAorCSAgICBpZiBncmVwICdeIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6ICQkJyAkJHRlbXAgPiAvZGV2L251bGw7IHRoZW4gXAorCSAgICAgIHJtIC1mICQkZGVzdDsgXAorCSAgICBlbHNlIFwKKwkgICAgICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAorCSAgICBmaTsgXAorCSAgICBybSAtZiAkJHRlbXA7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0IC1mICQoREVTVERJUikkKGxvY2FsZWRpcikvbG9jYWxlLmFsaWFzOyB0aGVuIFwKKwkgICAgdGVtcD0kKERFU1RESVIpJChsb2NhbGVkaXIpL3QtbG9jYWxlLmFsaWFzOyBcCisJICAgIGRlc3Q9JChERVNURElSKSQobG9jYWxlZGlyKS9sb2NhbGUuYWxpYXM7IFwKKwkgICAgc2VkIC1mIHJlZi1kZWwuc2VkICQkZGVzdCA+ICQkdGVtcDsgXAorCSAgICBpZiBncmVwICdeIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6ICQkJyAkJHRlbXAgPiAvZGV2L251bGw7IHRoZW4gXAorCSAgICAgIHJtIC1mICQkZGVzdDsgXAorCSAgICBlbHNlIFwKKwkgICAgICAkKElOU1RBTExfREFUQSkgJCR0ZW1wICQkZGVzdDsgXAorCSAgICBmaTsgXAorCSAgICBybSAtZiAkJHRlbXA7IFwKKwkgIGZpOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC10b29scyI7IHRoZW4gXAorCSAgZm9yIGZpbGUgaW4gVkVSU0lPTiBDaGFuZ2VMb2cgQ09QWUlORy5MSUItMi4wIENPUFlJTkcuTElCLTIuMSAkKERJU1RGSUxFUy5jb21tb24pICQoRElTVEZJTEVTLmdlbmVyYXRlZCk7IGRvIFwKKwkgICAgcm0gLWYgJChERVNURElSKSQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCisJICBkb25lOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisKK2luZm8gZHZpIHBzIHBkZiBodG1sOgorCiskKE9CSkVDVFMpOiBsaWJnbnVpbnRsLmgKK2JpbmR0ZXh0ZG9tLiRsbyBkY2dldHRleHQuJGxvIGRjaWdldHRleHQuJGxvIGRjbmdldHRleHQuJGxvIGRnZXR0ZXh0LiRsbyBkbmdldHRleHQuJGxvIGZpbmRkb21haW4uJGxvIGdldHRleHQuJGxvIGludGwtY29tcGF0LiRsbyBsb2FkbXNnY2F0LiRsbyBsb2NhbGVhbGlhcy4kbG8gbmdldHRleHQuJGxvIHRleHRkb21haW4uJGxvOiAkKHNyY2RpcikvZ2V0dGV4dFAuaCAkKHNyY2RpcikvZ21vLmggJChzcmNkaXIpL2xvYWRpbmZvLmgKK2RjaWdldHRleHQuJGxvIGxvYWRtc2djYXQuJGxvOiAkKHNyY2RpcikvaGFzaC1zdHJpbmcuaAorZXhwbG9kZW5hbWUuJGxvIGwxMG5mbGlzdC4kbG86ICQoc3JjZGlyKS9sb2FkaW5mby5oCitkY2lnZXR0ZXh0LiRsbyBsb2FkbXNnY2F0LiRsbyBwbHVyYWwuJGxvIHBsdXJhbC1leHAuJGxvOiAkKHNyY2RpcikvcGx1cmFsLWV4cC5oCitkY2lnZXR0ZXh0LiRsbzogJChzcmNkaXIpL2V2YWwtcGx1cmFsLmgKK2xvY2FsY2hhcnNldC4kbG86ICQoc3JjZGlyKS9sb2NhbGNoYXJzZXQuaAorbG9jYWxlYWxpYXMuJGxvIGxvY2FsY2hhcnNldC4kbG8gcmVsb2NhdGFibGUuJGxvOiAkKHNyY2RpcikvcmVsb2NhdGFibGUuaAorcHJpbnRmLiRsbzogJChzcmNkaXIpL3ByaW50Zi1hcmdzLmggJChzcmNkaXIpL3ByaW50Zi1hcmdzLmMgJChzcmNkaXIpL3ByaW50Zi1wYXJzZS5oICQoc3JjZGlyKS93cHJpbnRmLXBhcnNlLmggJChzcmNkaXIpL3hzaXplLmggJChzcmNkaXIpL3ByaW50Zi1wYXJzZS5jICQoc3JjZGlyKS92YXNucHJpbnRmLmggJChzcmNkaXIpL3Zhc253cHJpbnRmLmggJChzcmNkaXIpL3Zhc25wcmludGYuYworCit0YWdzOiBUQUdTCisKK1RBR1M6ICQoSEVBREVSUykgJChTT1VSQ0VTKQorCWhlcmU9YHB3ZGA7IGNkICQoc3JjZGlyKSAmJiBldGFncyAtbyAkJGhlcmUvVEFHUyAkKEhFQURFUlMpICQoU09VUkNFUykKKworY3RhZ3M6IENUQUdTCisKK0NUQUdTOiAkKEhFQURFUlMpICQoU09VUkNFUykKKwloZXJlPWBwd2RgOyBjZCAkKHNyY2RpcikgJiYgY3RhZ3MgLW8gJCRoZXJlL0NUQUdTICQoSEVBREVSUykgJChTT1VSQ0VTKQorCitpZDogSUQKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKQorCWhlcmU9YHB3ZGA7IGNkICQoc3JjZGlyKSAmJiBta2lkIC1mJCRoZXJlL0lEICQoSEVBREVSUykgJChTT1VSQ0VTKQorCisKK21vc3RseWNsZWFuOgorCXJtIC1mICouYSAqLmxhICoubyAqLm9iaiAqLmxvIGNvcmUgY29yZS4qCisJcm0gLWYgbGliZ251aW50bC5oIGxpYmludGwuaCBjaGFyc2V0LmFsaWFzIHJlZi1hZGQuc2VkIHJlZi1kZWwuc2VkCisJcm0gLWYgLXIgLmxpYnMgX2xpYnMKKworY2xlYW46IG1vc3RseWNsZWFuCisKK2Rpc3RjbGVhbjogY2xlYW4KKwlybSAtZiBNYWtlZmlsZSBJRCBUQUdTCisJaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dC1ydW50aW1lIiB8fCB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXRvb2xzIjsgdGhlbiBcCisJICBybSAtZiBDaGFuZ2VMb2cuaW5zdCAkKERJU1RGSUxFUy5ub3JtYWwpOyBcCisJZWxzZSBcCisJICA6IDsgXAorCWZpCisKK21haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCisKKyMgR05VIGdldHRleHQgbmVlZHMgbm90IGNvbnRhaW4gdGhlIGZpbGUgYFZFUlNJT04nIGJ1dCBjb250YWlucyBzb21lCisjIG90aGVyIGZpbGVzIHdoaWNoIHNob3VsZCBub3QgYmUgZGlzdHJpYnV0ZWQgaW4gb3RoZXIgcGFja2FnZXMuCitkaXN0ZGlyID0gLi4vJChQQUNLQUdFKS0kKFZFUlNJT04pLyQoc3ViZGlyKQorZGlzdCBkaXN0ZGlyOiBNYWtlZmlsZQorCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQtdG9vbHMiOyB0aGVuIFwKKwkgIDogOyBcCisJZWxzZSBcCisJICBpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0LXJ1bnRpbWUiOyB0aGVuIFwKKwkgICAgYWRkaXRpb25hbD0iJChESVNURklMRVMuZ2V0dGV4dCkiOyBcCisJICBlbHNlIFwKKwkgICAgYWRkaXRpb25hbD0iJChESVNURklMRVMubm9ybWFsKSI7IFwKKwkgIGZpOyBcCisJICAkKE1BS0UpICQoRElTVEZJTEVTLmNvbW1vbikgJChESVNURklMRVMuZ2VuZXJhdGVkKSAkJGFkZGl0aW9uYWw7IFwKKwkgIGZvciBmaWxlIGluIENoYW5nZUxvZyAkKERJU1RGSUxFUy5jb21tb24pICQoRElTVEZJTEVTLmdlbmVyYXRlZCkgJCRhZGRpdGlvbmFsOyBkbyBcCisJICAgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGRpcj0uOyBlbHNlIGRpcj0kKHNyY2Rpcik7IGZpOyBcCisJICAgIGNwIC1wICQkZGlyLyQkZmlsZSAkKGRpc3RkaXIpOyBcCisJICBkb25lOyBcCisJZmkKKworTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKyMgVGhpcyB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCwgYnV0IGRvZXNuJ3Qgd29yayBhbnkgbW9yZSB3aXRoIGF1dG9jb25mLTIuNTcsCisjIHdoZW4gQUNfQ09ORklHX0ZJTEVTKFtpbnRsL01ha2VmaWxlOnNvbWVkaXIvTWFrZWZpbGUuaW5dKSBpcyB1c2VkLgorIwljZCAkKHRvcF9idWlsZGRpcikgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9WRVJTSU9OIGIvdW5peC9pbnRsL1ZFUlNJT04KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiODQ2YwotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9WRVJTSU9OCkBAIC0wLDAgKzEgQEAKK0dOVSBnZXR0ZXh0IGxpYnJhcnkgZnJvbSBnZXR0ZXh0LTAuMTQuMQpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2JpbmR0ZXh0ZG9tLmMgYi91bml4L2ludGwvYmluZHRleHRkb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2RjNDAwCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2JpbmR0ZXh0ZG9tLmMKQEAgLTAsMCArMSwzNjMgQEAKKy8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBiaW5kdGV4dGRvbWFpbigzKSBmdW5jdGlvbgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTgsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKyNlbHNlCisjIGluY2x1ZGUgImxpYmdudWludGwuaCIKKyNlbmRpZgorI2luY2x1ZGUgImdldHRleHRQLmgiCisKKyNpZmRlZiBfTElCQworLyogV2UgaGF2ZSB0byBoYW5kbGUgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zLiAgKi8KKyMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KKyNlbHNlCisvKiBQcm92aWRlIGR1bW15IGltcGxlbWVudGF0aW9uIGlmIHRoaXMgaXMgb3V0c2lkZSBnbGliYy4gICovCisjIGRlZmluZSBfX2xpYmNfcndsb2NrX2RlZmluZShDTEFTUywgTkFNRSkKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfd3Jsb2NrKE5BTUUpCisjIGRlZmluZSBfX2xpYmNfcndsb2NrX3VubG9jayhOQU1FKQorI2VuZGlmCisKKy8qIFRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgaW4gdGhlIHN0YW5kYWxvbmUgbGliaW50bC5hIG11c3QgaGF2ZSBkaWZmZXJlbnQKKyAgIG5hbWVzIHRoYW4gdGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiBHTlUgbGliYywgb3RoZXJ3aXNlIHByb2dyYW1zCisgICB1c2luZyBsaWJpbnRsLmEgY2Fubm90IGJlIGxpbmtlZCBzdGF0aWNhbGx5LiAgKi8KKyNpZiAhZGVmaW5lZCBfTElCQworIyBkZWZpbmUgX25sX2RlZmF1bHRfZGlybmFtZSBsaWJpbnRsX25sX2RlZmF1bHRfZGlybmFtZQorIyBkZWZpbmUgX25sX2RvbWFpbl9iaW5kaW5ncyBsaWJpbnRsX25sX2RvbWFpbl9iaW5kaW5ncworI2VuZGlmCisKKy8qIFNvbWUgY29tcGlsZXJzLCBsaWtlIFN1bk9TNCBjYywgZG9uJ3QgaGF2ZSBvZmZzZXRvZiBpbiA8c3RkZGVmLmg+LiAgKi8KKyNpZm5kZWYgb2Zmc2V0b2YKKyMgZGVmaW5lIG9mZnNldG9mKHR5cGUsaWRlbnQpICgoc2l6ZV90KSYoKCh0eXBlKikwKS0+aWRlbnQpKQorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogQ29udGFpbnMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UgY2F0YWxvZ3MuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdOworI2lmZGVmIF9MSUJDCitleHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kaXJuYW1lX2ludGVybmFsW10gYXR0cmlidXRlX2hpZGRlbjsKKyNlbHNlCisjIGRlZmluZSBJTlRVU0UobmFtZSkgbmFtZQorI2VuZGlmCisKKy8qIExpc3Qgd2l0aCBiaW5kaW5ncyBvZiBzcGVjaWZpYyBkb21haW5zLiAgKi8KK2V4dGVybiBzdHJ1Y3QgYmluZGluZyAqX25sX2RvbWFpbl9iaW5kaW5nczsKKworLyogTG9jayB2YXJpYWJsZSB0byBwcm90ZWN0IHRoZSBnbG9iYWwgZGF0YSBpbiB0aGUgZ2V0dGV4dCBpbXBsZW1lbnRhdGlvbi4gICovCitfX2xpYmNfcndsb2NrX2RlZmluZSAoZXh0ZXJuLCBfbmxfc3RhdGVfbG9jayBhdHRyaWJ1dGVfaGlkZGVuKQorCisKKy8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKKyAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKKyAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXworICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KKyNpZmRlZiBfTElCQworIyBkZWZpbmUgQklORFRFWFRET01BSU4gX19iaW5kdGV4dGRvbWFpbgorIyBkZWZpbmUgQklORF9URVhURE9NQUlOX0NPREVTRVQgX19iaW5kX3RleHRkb21haW5fY29kZXNldAorIyBpZm5kZWYgc3RyZHVwCisjICBkZWZpbmUgc3RyZHVwKHN0cikgX19zdHJkdXAgKHN0cikKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBCSU5EVEVYVERPTUFJTiBsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluCisjIGRlZmluZSBCSU5EX1RFWFRET01BSU5fQ09ERVNFVCBsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0CisjZW5kaWYKKworLyogU3BlY2lmaWVzIHRoZSBkaXJlY3RvcnkgbmFtZSAqRElSTkFNRVAgYW5kIHRoZSBvdXRwdXQgY29kZXNldCAqQ09ERVNFVFAKKyAgIHRvIGJlIHVzZWQgZm9yIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZy4KKyAgIElmICpESVJOQU1FUCBvciAqQ09ERVNFVFAgaXMgTlVMTCwgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIGlzIG5vdAorICAgbW9kaWZpZWQsIG9ubHkgdGhlIGN1cnJlbnQgdmFsdWUgaXMgcmV0dXJuZWQuCisgICBJZiBESVJOQU1FUCBvciBDT0RFU0VUUCBpcyBOVUxMLCB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgaXMgbmVpdGhlcgorICAgbW9kaWZpZWQgbm9yIHJldHVybmVkLiAgKi8KK3N0YXRpYyB2b2lkCitzZXRfYmluZGluZ192YWx1ZXMgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCisJCSAgICBjb25zdCBjaGFyICoqZGlybmFtZXAsIGNvbnN0IGNoYXIgKipjb2Rlc2V0cCkKK3sKKyAgc3RydWN0IGJpbmRpbmcgKmJpbmRpbmc7CisgIGludCBtb2RpZmllZDsKKworICAvKiBTb21lIHNhbml0eSBjaGVja3MuICAqLworICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMIHx8IGRvbWFpbm5hbWVbMF0gPT0gJ1wwJykKKyAgICB7CisgICAgICBpZiAoZGlybmFtZXApCisJKmRpcm5hbWVwID0gTlVMTDsKKyAgICAgIGlmIChjb2Rlc2V0cCkKKwkqY29kZXNldHAgPSBOVUxMOworICAgICAgcmV0dXJuOworICAgIH0KKworICBfX2xpYmNfcndsb2NrX3dybG9jayAoX25sX3N0YXRlX2xvY2spOworCisgIG1vZGlmaWVkID0gMDsKKworICBmb3IgKGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOyBiaW5kaW5nICE9IE5VTEw7IGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0KQorICAgIHsKKyAgICAgIGludCBjb21wYXJlID0gc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5kb21haW5uYW1lKTsKKyAgICAgIGlmIChjb21wYXJlID09IDApCisJLyogV2UgZm91bmQgaXQhICAqLworCWJyZWFrOworICAgICAgaWYgKGNvbXBhcmUgPCAwKQorCXsKKwkgIC8qIEl0IGlzIG5vdCBpbiB0aGUgbGlzdC4gICovCisJICBiaW5kaW5nID0gTlVMTDsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKGJpbmRpbmcgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoZGlybmFtZXApCisJeworCSAgY29uc3QgY2hhciAqZGlybmFtZSA9ICpkaXJuYW1lcDsKKworCSAgaWYgKGRpcm5hbWUgPT0gTlVMTCkKKwkgICAgLyogVGhlIGN1cnJlbnQgYmluZGluZyBoYXMgYmUgdG8gcmV0dXJuZWQuICAqLworCSAgICAqZGlybmFtZXAgPSBiaW5kaW5nLT5kaXJuYW1lOworCSAgZWxzZQorCSAgICB7CisJICAgICAgLyogVGhlIGRvbWFpbiBpcyBhbHJlYWR5IGJvdW5kLiAgSWYgdGhlIG5ldyB2YWx1ZSBhbmQgdGhlIG9sZAorCQkgb25lIGFyZSBlcXVhbCB3ZSBzaW1wbHkgZG8gbm90aGluZy4gIE90aGVyd2lzZSByZXBsYWNlIHRoZQorCQkgb2xkIGJpbmRpbmcuICAqLworCSAgICAgIGNoYXIgKnJlc3VsdCA9IGJpbmRpbmctPmRpcm5hbWU7CisJICAgICAgaWYgKHN0cmNtcCAoZGlybmFtZSwgcmVzdWx0KSAhPSAwKQorCQl7CisJCSAgaWYgKHN0cmNtcCAoZGlybmFtZSwgSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpKSA9PSAwKQorCQkgICAgcmVzdWx0ID0gKGNoYXIgKikgSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpOworCQkgIGVsc2UKKwkJICAgIHsKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKKwkJICAgICAgcmVzdWx0ID0gc3RyZHVwIChkaXJuYW1lKTsKKyNlbHNlCisJCSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRpcm5hbWUpICsgMTsKKwkJICAgICAgcmVzdWx0ID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworCQkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ICE9IE5VTEwsIDEpKQorCQkJbWVtY3B5IChyZXN1bHQsIGRpcm5hbWUsIGxlbik7CisjZW5kaWYKKwkJICAgIH0KKworCQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgIT0gTlVMTCwgMSkpCisJCSAgICB7CisJCSAgICAgIGlmIChiaW5kaW5nLT5kaXJuYW1lICE9IElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKSkKKwkJCWZyZWUgKGJpbmRpbmctPmRpcm5hbWUpOworCisJCSAgICAgIGJpbmRpbmctPmRpcm5hbWUgPSByZXN1bHQ7CisJCSAgICAgIG1vZGlmaWVkID0gMTsKKwkJICAgIH0KKwkJfQorCSAgICAgICpkaXJuYW1lcCA9IHJlc3VsdDsKKwkgICAgfQorCX0KKworICAgICAgaWYgKGNvZGVzZXRwKQorCXsKKwkgIGNvbnN0IGNoYXIgKmNvZGVzZXQgPSAqY29kZXNldHA7CisKKwkgIGlmIChjb2Rlc2V0ID09IE5VTEwpCisJICAgIC8qIFRoZSBjdXJyZW50IGJpbmRpbmcgaGFzIGJlIHRvIHJldHVybmVkLiAgKi8KKwkgICAgKmNvZGVzZXRwID0gYmluZGluZy0+Y29kZXNldDsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIFRoZSBkb21haW4gaXMgYWxyZWFkeSBib3VuZC4gIElmIHRoZSBuZXcgdmFsdWUgYW5kIHRoZSBvbGQKKwkJIG9uZSBhcmUgZXF1YWwgd2Ugc2ltcGx5IGRvIG5vdGhpbmcuICBPdGhlcndpc2UgcmVwbGFjZSB0aGUKKwkJIG9sZCBiaW5kaW5nLiAgKi8KKwkgICAgICBjaGFyICpyZXN1bHQgPSBiaW5kaW5nLT5jb2Rlc2V0OworCSAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCB8fCBzdHJjbXAgKGNvZGVzZXQsIHJlc3VsdCkgIT0gMCkKKwkJeworI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAorCQkgIHJlc3VsdCA9IHN0cmR1cCAoY29kZXNldCk7CisjZWxzZQorCQkgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGNvZGVzZXQpICsgMTsKKwkJICByZXN1bHQgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7CisJCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCAhPSBOVUxMLCAxKSkKKwkJICAgIG1lbWNweSAocmVzdWx0LCBjb2Rlc2V0LCBsZW4pOworI2VuZGlmCisKKwkJICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ICE9IE5VTEwsIDEpKQorCQkgICAgeworCQkgICAgICBpZiAoYmluZGluZy0+Y29kZXNldCAhPSBOVUxMKQorCQkJZnJlZSAoYmluZGluZy0+Y29kZXNldCk7CisKKwkJICAgICAgYmluZGluZy0+Y29kZXNldCA9IHJlc3VsdDsKKwkJICAgICAgYmluZGluZy0+Y29kZXNldF9jbnRyKys7CisJCSAgICAgIG1vZGlmaWVkID0gMTsKKwkJICAgIH0KKwkJfQorCSAgICAgICpjb2Rlc2V0cCA9IHJlc3VsdDsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UgaWYgKChkaXJuYW1lcCA9PSBOVUxMIHx8ICpkaXJuYW1lcCA9PSBOVUxMKQorCSAgICYmIChjb2Rlc2V0cCA9PSBOVUxMIHx8ICpjb2Rlc2V0cCA9PSBOVUxMKSkKKyAgICB7CisgICAgICAvKiBTaW1wbHkgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlcy4gICovCisgICAgICBpZiAoZGlybmFtZXApCisJKmRpcm5hbWVwID0gSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpOworICAgICAgaWYgKGNvZGVzZXRwKQorCSpjb2Rlc2V0cCA9IE5VTEw7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogV2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgYmluZGluZy4gICovCisgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkb21haW5uYW1lKSArIDE7CisgICAgICBzdHJ1Y3QgYmluZGluZyAqbmV3X2JpbmRpbmcgPQorCShzdHJ1Y3QgYmluZGluZyAqKSBtYWxsb2MgKG9mZnNldG9mIChzdHJ1Y3QgYmluZGluZywgZG9tYWlubmFtZSkgKyBsZW4pOworCisgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAobmV3X2JpbmRpbmcgPT0gTlVMTCwgMCkpCisJZ290byBmYWlsZWQ7CisKKyAgICAgIG1lbWNweSAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUsIGRvbWFpbm5hbWUsIGxlbik7CisKKyAgICAgIGlmIChkaXJuYW1lcCkKKwl7CisJICBjb25zdCBjaGFyICpkaXJuYW1lID0gKmRpcm5hbWVwOworCisJICBpZiAoZGlybmFtZSA9PSBOVUxMKQorCSAgICAvKiBUaGUgZGVmYXVsdCB2YWx1ZS4gICovCisJICAgIGRpcm5hbWUgPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAoc3RyY21wIChkaXJuYW1lLCBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSkpID09IDApCisJCWRpcm5hbWUgPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSk7CisJICAgICAgZWxzZQorCQl7CisJCSAgY2hhciAqcmVzdWx0OworI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAorCQkgIHJlc3VsdCA9IHN0cmR1cCAoZGlybmFtZSk7CisJCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCA9PSBOVUxMLCAwKSkKKwkJICAgIGdvdG8gZmFpbGVkX2Rpcm5hbWU7CisjZWxzZQorCQkgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRpcm5hbWUpICsgMTsKKwkJICByZXN1bHQgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7CisJCSAgaWYgKF9fYnVpbHRpbl9leHBlY3QgKHJlc3VsdCA9PSBOVUxMLCAwKSkKKwkJICAgIGdvdG8gZmFpbGVkX2Rpcm5hbWU7CisJCSAgbWVtY3B5IChyZXN1bHQsIGRpcm5hbWUsIGxlbik7CisjZW5kaWYKKwkJICBkaXJuYW1lID0gcmVzdWx0OworCQl9CisJICAgIH0KKwkgICpkaXJuYW1lcCA9IGRpcm5hbWU7CisJICBuZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIGRpcm5hbWU7CisJfQorICAgICAgZWxzZQorCS8qIFRoZSBkZWZhdWx0IHZhbHVlLiAgKi8KKwluZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIElOVFVTRShfbmxfZGVmYXVsdF9kaXJuYW1lKTsKKworICAgICAgbmV3X2JpbmRpbmctPmNvZGVzZXRfY250ciA9IDA7CisKKyAgICAgIGlmIChjb2Rlc2V0cCkKKwl7CisJICBjb25zdCBjaGFyICpjb2Rlc2V0ID0gKmNvZGVzZXRwOworCisJICBpZiAoY29kZXNldCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgY2hhciAqcmVzdWx0OworCisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCisJICAgICAgcmVzdWx0ID0gc3RyZHVwIChjb2Rlc2V0KTsKKwkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAocmVzdWx0ID09IE5VTEwsIDApKQorCQlnb3RvIGZhaWxlZF9jb2Rlc2V0OworI2Vsc2UKKwkgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChjb2Rlc2V0KSArIDE7CisJICAgICAgcmVzdWx0ID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworCSAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChyZXN1bHQgPT0gTlVMTCwgMCkpCisJCWdvdG8gZmFpbGVkX2NvZGVzZXQ7CisJICAgICAgbWVtY3B5IChyZXN1bHQsIGNvZGVzZXQsIGxlbik7CisjZW5kaWYKKwkgICAgICBjb2Rlc2V0ID0gcmVzdWx0OworCSAgICAgIG5ld19iaW5kaW5nLT5jb2Rlc2V0X2NudHIrKzsKKwkgICAgfQorCSAgKmNvZGVzZXRwID0gY29kZXNldDsKKwkgIG5ld19iaW5kaW5nLT5jb2Rlc2V0ID0gKGNoYXIgKikgY29kZXNldDsKKwl9CisgICAgICBlbHNlCisJbmV3X2JpbmRpbmctPmNvZGVzZXQgPSBOVUxMOworCisgICAgICAvKiBOb3cgZW5xdWV1ZSBpdC4gICovCisgICAgICBpZiAoX25sX2RvbWFpbl9iaW5kaW5ncyA9PSBOVUxMCisJICB8fCBzdHJjbXAgKGRvbWFpbm5hbWUsIF9ubF9kb21haW5fYmluZGluZ3MtPmRvbWFpbm5hbWUpIDwgMCkKKwl7CisJICBuZXdfYmluZGluZy0+bmV4dCA9IF9ubF9kb21haW5fYmluZGluZ3M7CisJICBfbmxfZG9tYWluX2JpbmRpbmdzID0gbmV3X2JpbmRpbmc7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOworCSAgd2hpbGUgKGJpbmRpbmctPm5leHQgIT0gTlVMTAorCQkgJiYgc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5uZXh0LT5kb21haW5uYW1lKSA+IDApCisJICAgIGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0OworCisJICBuZXdfYmluZGluZy0+bmV4dCA9IGJpbmRpbmctPm5leHQ7CisJICBiaW5kaW5nLT5uZXh0ID0gbmV3X2JpbmRpbmc7CisJfQorCisgICAgICBtb2RpZmllZCA9IDE7CisKKyAgICAgIC8qIEhlcmUgd2UgZGVhbCB3aXRoIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVzLiAgKi8KKyAgICAgIGlmICgwKQorCXsKKwlmYWlsZWRfY29kZXNldDoKKwkgIGlmIChuZXdfYmluZGluZy0+ZGlybmFtZSAhPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSkpCisJICAgIGZyZWUgKG5ld19iaW5kaW5nLT5kaXJuYW1lKTsKKwlmYWlsZWRfZGlybmFtZToKKwkgIGZyZWUgKG5ld19iaW5kaW5nKTsKKwlmYWlsZWQ6CisJICBpZiAoZGlybmFtZXApCisJICAgICpkaXJuYW1lcCA9IE5VTEw7CisJICBpZiAoY29kZXNldHApCisJICAgICpjb2Rlc2V0cCA9IE5VTEw7CisJfQorICAgIH0KKworICAvKiBJZiB3ZSBtb2RpZmllZCBhbnkgYmluZGluZywgd2UgZmx1c2ggdGhlIGNhY2hlcy4gICovCisgIGlmIChtb2RpZmllZCkKKyAgICArK19ubF9tc2dfY2F0X2NudHI7CisKKyAgX19saWJjX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKK30KKworLyogU3BlY2lmeSB0aGF0IHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyB3aWxsIGJlIGZvdW5kCisgICBpbiBESVJOQU1FIHJhdGhlciB0aGFuIGluIHRoZSBzeXN0ZW0gbG9jYWxlIGRhdGEgYmFzZS4gICovCitjaGFyICoKK0JJTkRURVhURE9NQUlOIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICpkaXJuYW1lKQoreworICBzZXRfYmluZGluZ192YWx1ZXMgKGRvbWFpbm5hbWUsICZkaXJuYW1lLCBOVUxMKTsKKyAgcmV0dXJuIChjaGFyICopIGRpcm5hbWU7Cit9CisKKy8qIFNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBpbiB3aGljaCB0aGUgbWVzc2FnZXMgZnJvbSB0aGUKKyAgIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgcmV0dXJuZWQuICAqLworY2hhciAqCitCSU5EX1RFWFRET01BSU5fQ09ERVNFVCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqY29kZXNldCkKK3sKKyAgc2V0X2JpbmRpbmdfdmFsdWVzIChkb21haW5uYW1lLCBOVUxMLCAmY29kZXNldCk7CisgIHJldHVybiAoY2hhciAqKSBjb2Rlc2V0OworfQorCisjaWZkZWYgX0xJQkMKKy8qIEFsaWFzZXMgZm9yIGZ1bmN0aW9uIG5hbWVzIGluIEdOVSBDIExpYnJhcnkuICAqLword2Vha19hbGlhcyAoX19iaW5kdGV4dGRvbWFpbiwgYmluZHRleHRkb21haW4pOword2Vha19hbGlhcyAoX19iaW5kX3RleHRkb21haW5fY29kZXNldCwgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQpOworI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L2ludGwvY29uZmlnLmNoYXJzZXQgYi91bml4L2ludGwvY29uZmlnLmNoYXJzZXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDNkNDVmYgotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9jb25maWcuY2hhcnNldApAQCAtMCwwICsxLDYwOCBAQAorIyEgL2Jpbi9zaAorIyBPdXRwdXQgYSBzeXN0ZW0gZGVwZW5kZW50IHRhYmxlIG9mIGNoYXJhY3RlciBlbmNvZGluZyBhbGlhc2VzLgorIworIyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorIyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyMgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisjICAgVVNBLgorIworIyBUaGUgdGFibGUgY29uc2lzdHMgb2YgbGluZXMgb2YgdGhlIGZvcm0KKyMgICAgQUxJQVMgIENBTk9OSUNBTAorIworIyBBTElBUyBpcyB0aGUgKHN5c3RlbSBkZXBlbmRlbnQpIHJlc3VsdCBvZiAibmxfbGFuZ2luZm8gKENPREVTRVQpIi4KKyMgQUxJQVMgaXMgY29tcGFyZWQgaW4gYSBjYXNlIHNlbnNpdGl2ZSB3YXkuCisjCisjIENBTk9OSUNBTCBpcyB0aGUgR05VIGNhbm9uaWNhbCBuYW1lIGZvciB0aGlzIGNoYXJhY3RlciBlbmNvZGluZy4KKyMgSXQgbXVzdCBiZSBhbiBlbmNvZGluZyBzdXBwb3J0ZWQgYnkgbGliaWNvbnYuIFN1cHBvcnQgYnkgR05VIGxpYmMgaXMKKyMgYWxzbyBkZXNpcmFibGUuIENBTk9OSUNBTCBpcyBjYXNlIGluc2Vuc2l0aXZlLiBVc3VhbGx5IGFuIHVwcGVyIGNhc2UKKyMgTUlNRSBjaGFyc2V0IG5hbWUgaXMgcHJlZmVycmVkLgorIyBUaGUgY3VycmVudCBsaXN0IG9mIEdOVSBjYW5vbmljYWwgY2hhcnNldCBuYW1lcyBpcyBhcyBmb2xsb3dzLgorIworIyAgICAgICBuYW1lICAgICAgICAgICAgICBNSU1FPyAgICAgICAgICAgICB1c2VkIGJ5IHdoaWNoIHN5c3RlbXMKKyMgICBBU0NJSSwgQU5TSV9YMy40LTE5NjggICAgICAgZ2xpYmMgc29sYXJpcyBmcmVlYnNkIGRhcndpbgorIyAgIElTTy04ODU5LTEgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisjICAgSVNPLTg4NTktMiAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKyMgICBJU08tODg1OS0zICAgICAgICAgICAgICBZICAgZ2xpYmMgc29sYXJpcworIyAgIElTTy04ODU5LTQgICAgICAgICAgICAgIFkgICBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgorIyAgIElTTy04ODU5LTUgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisjICAgSVNPLTg4NTktNiAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IHNvbGFyaXMKKyMgICBJU08tODg1OS03ICAgICAgICAgICAgICBZICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcworIyAgIElTTy04ODU5LTggICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBvc2Ygc29sYXJpcworIyAgIElTTy04ODU5LTkgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzCisjICAgSVNPLTg4NTktMTMgICAgICAgICAgICAgICAgIGdsaWJjCisjICAgSVNPLTg4NTktMTQgICAgICAgICAgICAgICAgIGdsaWJjCisjICAgSVNPLTg4NTktMTUgICAgICAgICAgICAgICAgIGdsaWJjIGFpeCBvc2Ygc29sYXJpcyBmcmVlYnNkCisjICAgS09JOC1SICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKyMgICBLT0k4LVUgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMgZnJlZWJzZCBkYXJ3aW4KKyMgICBLT0k4LVQgICAgICAgICAgICAgICAgICAgICAgZ2xpYmMKKyMgICBDUDQzNyAgICAgICAgICAgICAgICAgICAgICAgZG9zCisjICAgQ1A3NzUgICAgICAgICAgICAgICAgICAgICAgIGRvcworIyAgIENQODUwICAgICAgICAgICAgICAgICAgICAgICBhaXggb3NmIGRvcworIyAgIENQODUyICAgICAgICAgICAgICAgICAgICAgICBkb3MKKyMgICBDUDg1NSAgICAgICAgICAgICAgICAgICAgICAgZG9zCisjICAgQ1A4NTYgICAgICAgICAgICAgICAgICAgICAgIGFpeAorIyAgIENQODU3ICAgICAgICAgICAgICAgICAgICAgICBkb3MKKyMgICBDUDg2MSAgICAgICAgICAgICAgICAgICAgICAgZG9zCisjICAgQ1A4NjIgICAgICAgICAgICAgICAgICAgICAgIGRvcworIyAgIENQODY0ICAgICAgICAgICAgICAgICAgICAgICBkb3MKKyMgICBDUDg2NSAgICAgICAgICAgICAgICAgICAgICAgZG9zCisjICAgQ1A4NjYgICAgICAgICAgICAgICAgICAgICAgIGZyZWVic2QgZGFyd2luIGRvcworIyAgIENQODY5ICAgICAgICAgICAgICAgICAgICAgICBkb3MKKyMgICBDUDg3NCAgICAgICAgICAgICAgICAgICAgICAgd29lMzIgZG9zCisjICAgQ1A5MjIgICAgICAgICAgICAgICAgICAgICAgIGFpeAorIyAgIENQOTMyICAgICAgICAgICAgICAgICAgICAgICBhaXggd29lMzIgZG9zCisjICAgQ1A5NDMgICAgICAgICAgICAgICAgICAgICAgIGFpeAorIyAgIENQOTQ5ICAgICAgICAgICAgICAgICAgICAgICBvc2Ygd29lMzIgZG9zCisjICAgQ1A5NTAgICAgICAgICAgICAgICAgICAgICAgIHdvZTMyIGRvcworIyAgIENQMTA0NiAgICAgICAgICAgICAgICAgICAgICBhaXgKKyMgICBDUDExMjQgICAgICAgICAgICAgICAgICAgICAgYWl4CisjICAgQ1AxMTI1ICAgICAgICAgICAgICAgICAgICAgIGRvcworIyAgIENQMTEyOSAgICAgICAgICAgICAgICAgICAgICBhaXgKKyMgICBDUDEyNTAgICAgICAgICAgICAgICAgICAgICAgd29lMzIKKyMgICBDUDEyNTEgICAgICAgICAgICAgICAgICAgICAgZ2xpYmMgc29sYXJpcyBkYXJ3aW4gd29lMzIKKyMgICBDUDEyNTIgICAgICAgICAgICAgICAgICAgICAgYWl4IHdvZTMyCisjICAgQ1AxMjUzICAgICAgICAgICAgICAgICAgICAgIHdvZTMyCisjICAgQ1AxMjU0ICAgICAgICAgICAgICAgICAgICAgIHdvZTMyCisjICAgQ1AxMjU1ICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIHdvZTMyCisjICAgQ1AxMjU2ICAgICAgICAgICAgICAgICAgICAgIHdvZTMyCisjICAgQ1AxMjU3ICAgICAgICAgICAgICAgICAgICAgIHdvZTMyCisjICAgR0IyMzEyICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggc29sYXJpcyBmcmVlYnNkIGRhcndpbgorIyAgIEVVQy1KUCAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBpcml4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisjICAgRVVDLUtSICAgICAgICAgICAgICAgICAgWSAgIGdsaWJjIGFpeCBocHV4IGlyaXggb3NmIHNvbGFyaXMgZnJlZWJzZCBkYXJ3aW4KKyMgICBFVUMtVFcgICAgICAgICAgICAgICAgICAgICAgZ2xpYmMgYWl4IGhwdXggaXJpeCBvc2Ygc29sYXJpcworIyAgIEJJRzUgICAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBvc2Ygc29sYXJpcyBmcmVlYnNkIGRhcndpbgorIyAgIEJJRzUtSEtTQ1MgICAgICAgICAgICAgICAgICBnbGliYyBzb2xhcmlzCisjICAgR0JLICAgICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIGFpeCBvc2Ygc29sYXJpcyB3b2UzMiBkb3MKKyMgICBHQjE4MDMwICAgICAgICAgICAgICAgICAgICAgZ2xpYmMgc29sYXJpcworIyAgIFNISUZUX0pJUyAgICAgICAgICAgICAgIFkgICBocHV4IG9zZiBzb2xhcmlzIGZyZWVic2QgZGFyd2luCisjICAgSk9IQUIgICAgICAgICAgICAgICAgICAgICAgIGdsaWJjIHNvbGFyaXMgd29lMzIKKyMgICBUSVMtNjIwICAgICAgICAgICAgICAgICAgICAgZ2xpYmMgYWl4IGhwdXggb3NmIHNvbGFyaXMKKyMgICBWSVNDSUkgICAgICAgICAgICAgICAgICBZICAgZ2xpYmMKKyMgICBUQ1ZONTcxMi0xICAgICAgICAgICAgICAgICAgZ2xpYmMKKyMgICBHRU9SR0lBTi1QUyAgICAgICAgICAgICAgICAgZ2xpYmMKKyMgICBIUC1ST01BTjggICAgICAgICAgICAgICAgICAgaHB1eAorIyAgIEhQLUFSQUJJQzggICAgICAgICAgICAgICAgICBocHV4CisjICAgSFAtR1JFRUs4ICAgICAgICAgICAgICAgICAgIGhwdXgKKyMgICBIUC1IRUJSRVc4ICAgICAgICAgICAgICAgICAgaHB1eAorIyAgIEhQLVRVUktJU0g4ICAgICAgICAgICAgICAgICBocHV4CisjICAgSFAtS0FOQTggICAgICAgICAgICAgICAgICAgIGhwdXgKKyMgICBERUMtS0FOSkkgICAgICAgICAgICAgICAgICAgb3NmCisjICAgREVDLUhBTllVICAgICAgICAgICAgICAgICAgIG9zZgorIyAgIFVURi04ICAgICAgICAgICAgICAgICAgIFkgICBnbGliYyBhaXggaHB1eCBvc2Ygc29sYXJpcworIworIyBOb3RlOiBOYW1lcyB3aGljaCBhcmUgbm90IG1hcmtlZCBhcyBiZWluZyBhIE1JTUUgbmFtZSBzaG91bGQgbm90IGJlIHVzZWQgaW4KKyMgSW50ZXJuZXQgcHJvdG9jb2xzIGZvciBpbmZvcm1hdGlvbiBpbnRlcmNoYW5nZSAobWFpbCwgbmV3cywgZXRjLikuCisjCisjIE5vdGU6IEFTQ0lJIGFuZCBBTlNJX1gzLjQtMTk2OCBhcmUgc3lub255bW91cyBjYW5vbmljYWwgbmFtZXMuIEFwcGxpY2F0aW9ucworIyBtdXN0IHVuZGVyc3RhbmQgYm90aCBuYW1lcyBhbmQgdHJlYXQgdGhlbSBhcyBlcXVpdmFsZW50LgorIworIyBUaGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIHRvIHRoaXMgZmlsZSBpcyB0aGUgY2Fub25pY2FsIGhvc3Qgc3BlY2lmaWNhdGlvbiwKKyMgICAgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KKyMgb3IKKyMgICAgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCisKK2hvc3Q9IiQxIgorb3M9YGVjaG8gIiRob3N0IiB8IHNlZCAtZSAncy9eW14tXSotW14tXSotXCguKlwpJC9cMS8nYAorZWNobyAiIyBUaGlzIGZpbGUgY29udGFpbnMgYSB0YWJsZSBvZiBjaGFyYWN0ZXIgZW5jb2RpbmcgYWxpYXNlcywiCitlY2hvICIjIHN1aXRhYmxlIGZvciBvcGVyYXRpbmcgc3lzdGVtICcke29zfScuIgorZWNobyAiIyBJdCB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSBjb25maWcuY2hhcnNldC4iCisjIExpc3Qgb2YgcmVmZXJlbmNlcywgdXBkYXRlZCBkdXJpbmcgaW5zdGFsbGF0aW9uOgorZWNobyAiIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6ICIKK2Nhc2UgIiRvcyIgaW4KKyAgICBsaW51eC1nbnVsaWJjMSopCisJIyBMaW51eCBsaWJjNSBkb2Vzbid0IGhhdmUgbmxfbGFuZ2luZm8oQ09ERVNFVCk7IHRoZXJlZm9yZQorCSMgbG9jYWxjaGFyc2V0LmMgZmFsbHMgYmFjayB0byB1c2luZyB0aGUgZnVsbCBsb2NhbGUgbmFtZQorCSMgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCWVjaG8gIkMgQVNDSUkiCisJZWNobyAiUE9TSVggQVNDSUkiCisJZm9yIGwgaW4gYWYgYWZfWkEgY2EgY2FfRVMgZGEgZGFfREsgZGUgZGVfQVQgZGVfQkUgZGVfQ0ggZGVfREUgZGVfTFUgXAorCSAgICAgICAgIGVuIGVuX0FVIGVuX0JXIGVuX0NBIGVuX0RLIGVuX0dCIGVuX0lFIGVuX05aIGVuX1VTIGVuX1pBIFwKKwkgICAgICAgICBlbl9aVyBlcyBlc19BUiBlc19CTyBlc19DTCBlc19DTyBlc19ETyBlc19FQyBlc19FUyBlc19HVCBcCisJICAgICAgICAgZXNfSE4gZXNfTVggZXNfUEEgZXNfUEUgZXNfUFkgZXNfU1YgZXNfVVMgZXNfVVkgZXNfVkUgZXQgXAorCSAgICAgICAgIGV0X0VFIGV1IGV1X0VTIGZpIGZpX0ZJIGZvIGZvX0ZPIGZyIGZyX0JFIGZyX0NBIGZyX0NIIGZyX0ZSIFwKKwkgICAgICAgICBmcl9MVSBnYSBnYV9JRSBnbCBnbF9FUyBpZCBpZF9JRCBpbiBpbl9JRCBpcyBpc19JUyBpdCBpdF9DSCBcCisJICAgICAgICAgaXRfSVQga2wga2xfR0wgbmwgbmxfQkUgbmxfTkwgbm8gbm9fTk8gcHQgcHRfQlIgcHRfUFQgc3YgXAorCSAgICAgICAgIHN2X0ZJIHN2X1NFOyBkbworCSAgZWNobyAiJGwgSVNPLTg4NTktMSIKKwkgIGVjaG8gIiRsLmlzby04ODU5LTEgSVNPLTg4NTktMSIKKwkgIGVjaG8gIiRsLmlzby04ODU5LTE1IElTTy04ODU5LTE1IgorCSAgZWNobyAiJGwuaXNvLTg4NTktMTVAZXVybyBJU08tODg1OS0xNSIKKwkgIGVjaG8gIiRsQGV1cm8gSVNPLTg4NTktMTUiCisJICBlY2hvICIkbC5jcC00MzcgQ1A0MzciCisJICBlY2hvICIkbC5jcC04NTAgQ1A4NTAiCisJICBlY2hvICIkbC5jcC0xMjUyIENQMTI1MiIKKwkgIGVjaG8gIiRsLmNwLTEyNTJAZXVybyBDUDEyNTIiCisJICAjZWNobyAiJGwuYXRhcmktc3QgQVRBUkktU1QiICMgbm90IGEgY29tbW9ubHkgdXNlZCBlbmNvZGluZworCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCisJICBlY2hvICIkbC51dGYtOEBldXJvIFVURi04IgorCWRvbmUKKwlmb3IgbCBpbiBjcyBjc19DWiBociBocl9IUiBodSBodV9IVSBwbCBwbF9QTCBybyByb19STyBzayBza19TSyBzbCBcCisJICAgICAgICAgc2xfU0kgc3Igc3JfQ1Mgc3JfWVU7IGRvCisJICBlY2hvICIkbCBJU08tODg1OS0yIgorCSAgZWNobyAiJGwuaXNvLTg4NTktMiBJU08tODg1OS0yIgorCSAgZWNobyAiJGwuY3AtODUyIENQODUyIgorCSAgZWNobyAiJGwuY3AtMTI1MCBDUDEyNTAiCisJICBlY2hvICIkbC51dGYtOCBVVEYtOCIKKwlkb25lCisJZm9yIGwgaW4gbWsgbWtfTUsgcnUgcnVfUlU7IGRvCisJICBlY2hvICIkbCBJU08tODg1OS01IgorCSAgZWNobyAiJGwuaXNvLTg4NTktNSBJU08tODg1OS01IgorCSAgZWNobyAiJGwua29pOC1yIEtPSTgtUiIKKwkgIGVjaG8gIiRsLmNwLTg2NiBDUDg2NiIKKwkgIGVjaG8gIiRsLmNwLTEyNTEgQ1AxMjUxIgorCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCisJZG9uZQorCWZvciBsIGluIGFyIGFyX1NBOyBkbworCSAgZWNobyAiJGwgSVNPLTg4NTktNiIKKwkgIGVjaG8gIiRsLmlzby04ODU5LTYgSVNPLTg4NTktNiIKKwkgIGVjaG8gIiRsLmNwLTg2NCBDUDg2NCIKKwkgICNlY2hvICIkbC5jcC04NjggQ1A4NjgiICMgbm90IGEgY29tbW9ubHkgdXNlZCBlbmNvZGluZworCSAgZWNobyAiJGwuY3AtMTI1NiBDUDEyNTYiCisJICBlY2hvICIkbC51dGYtOCBVVEYtOCIKKwlkb25lCisJZm9yIGwgaW4gZWwgZWxfR1IgZ3IgZ3JfR1I7IGRvCisJICBlY2hvICIkbCBJU08tODg1OS03IgorCSAgZWNobyAiJGwuaXNvLTg4NTktNyBJU08tODg1OS03IgorCSAgZWNobyAiJGwuY3AtODY5IENQODY5IgorCSAgZWNobyAiJGwuY3AtMTI1MyBDUDEyNTMiCisJICBlY2hvICIkbC5jcC0xMjUzQGV1cm8gQ1AxMjUzIgorCSAgZWNobyAiJGwudXRmLTggVVRGLTgiCisJICBlY2hvICIkbC51dGYtOEBldXJvIFVURi04IgorCWRvbmUKKwlmb3IgbCBpbiBoZSBoZV9JTCBpdyBpd19JTDsgZG8KKwkgIGVjaG8gIiRsIElTTy04ODU5LTgiCisJICBlY2hvICIkbC5pc28tODg1OS04IElTTy04ODU5LTgiCisJICBlY2hvICIkbC5jcC04NjIgQ1A4NjIiCisJICBlY2hvICIkbC5jcC0xMjU1IENQMTI1NSIKKwkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgorCWRvbmUKKwlmb3IgbCBpbiB0ciB0cl9UUjsgZG8KKwkgIGVjaG8gIiRsIElTTy04ODU5LTkiCisJICBlY2hvICIkbC5pc28tODg1OS05IElTTy04ODU5LTkiCisJICBlY2hvICIkbC5jcC04NTcgQ1A4NTciCisJICBlY2hvICIkbC5jcC0xMjU0IENQMTI1NCIKKwkgIGVjaG8gIiRsLnV0Zi04IFVURi04IgorCWRvbmUKKwlmb3IgbCBpbiBsdCBsdF9MVCBsdiBsdl9MVjsgZG8KKwkgICNlY2hvICIkbCBCQUxUSUMiICMgbm90IGEgY29tbW9ubHkgdXNlZCBlbmNvZGluZywgd3JvbmcgZW5jb2RpbmcgbmFtZQorCSAgZWNobyAiJGwgSVNPLTg4NTktMTMiCisJZG9uZQorCWZvciBsIGluIHJ1X1VBIHVrIHVrX1VBOyBkbworCSAgZWNobyAiJGwgS09JOC1VIgorCWRvbmUKKwlmb3IgbCBpbiB6aCB6aF9DTjsgZG8KKwkgICNlY2hvICIkbCBHQl8yMzEyLTgwIiAjIG5vdCBhIGNvbW1vbmx5IHVzZWQgZW5jb2RpbmcsIHdyb25nIGVuY29kaW5nIG5hbWUKKwkgIGVjaG8gIiRsIEdCMjMxMiIKKwlkb25lCisJZm9yIGwgaW4gamEgamFfSlAgamFfSlAuRVVDOyBkbworCSAgZWNobyAiJGwgRVVDLUpQIgorCWRvbmUKKwlmb3IgbCBpbiBrbyBrb19LUjsgZG8KKwkgIGVjaG8gIiRsIEVVQy1LUiIKKwlkb25lCisJZm9yIGwgaW4gdGggdGhfVEg7IGRvCisJICBlY2hvICIkbCBUSVMtNjIwIgorCWRvbmUKKwlmb3IgbCBpbiBmYSBmYV9JUjsgZG8KKwkgICNlY2hvICIkbCBJU0lSSS0zMzQyIiAjIGEgYnJva2VuIGVuY29kaW5nCisJICBlY2hvICIkbC51dGYtOCBVVEYtOCIKKwlkb25lCisJOzsKKyAgICBsaW51eCogfCAqLWdudSopCisJIyBXaXRoIGdsaWJjLTIuMSBvciBuZXdlciwgd2UgZG9uJ3QgbmVlZCBhbnkgY2Fub25pY2FsaXphdGlvbiwKKwkjIGJlY2F1c2UgZ2xpYmMgaGFzIGljb252IGFuZCBib3RoIGdsaWJjIGFuZCBsaWJpY29udiBzdXBwb3J0IGFsbAorCSMgR05VIGNhbm9uaWNhbCBuYW1lcyBkaXJlY3RseS4gVGhlcmVmb3JlLCB0aGUgTWFrZWZpbGUgZG9lcyBub3QKKwkjIG5lZWQgdG8gaW5zdGFsbCB0aGUgYWxpYXMgZmlsZSBhdCBhbGwuCisJIyBUaGUgZm9sbG93aW5nIGFwcGxpZXMgb25seSB0byBnbGliYy0yLjAueCBhbmQgb2xkZXIgbGliY3MuCisJZWNobyAiSVNPXzY0Ni5JUlY6MTk4MyBBU0NJSSIKKwk7OworICAgIGFpeCopCisJZWNobyAiSVNPODg1OS0xIElTTy04ODU5LTEiCisJZWNobyAiSVNPODg1OS0yIElTTy04ODU5LTIiCisJZWNobyAiSVNPODg1OS01IElTTy04ODU5LTUiCisJZWNobyAiSVNPODg1OS02IElTTy04ODU5LTYiCisJZWNobyAiSVNPODg1OS03IElTTy04ODU5LTciCisJZWNobyAiSVNPODg1OS04IElTTy04ODU5LTgiCisJZWNobyAiSVNPODg1OS05IElTTy04ODU5LTkiCisJZWNobyAiSVNPODg1OS0xNSBJU08tODg1OS0xNSIKKwllY2hvICJJQk0tODUwIENQODUwIgorCWVjaG8gIklCTS04NTYgQ1A4NTYiCisJZWNobyAiSUJNLTkyMSBJU08tODg1OS0xMyIKKwllY2hvICJJQk0tOTIyIENQOTIyIgorCWVjaG8gIklCTS05MzIgQ1A5MzIiCisJZWNobyAiSUJNLTk0MyBDUDk0MyIKKwllY2hvICJJQk0tMTA0NiBDUDEwNDYiCisJZWNobyAiSUJNLTExMjQgQ1AxMTI0IgorCWVjaG8gIklCTS0xMTI5IENQMTEyOSIKKwllY2hvICJJQk0tMTI1MiBDUDEyNTIiCisJZWNobyAiSUJNLWV1Y0NOIEdCMjMxMiIKKwllY2hvICJJQk0tZXVjSlAgRVVDLUpQIgorCWVjaG8gIklCTS1ldWNLUiBFVUMtS1IiCisJZWNobyAiSUJNLWV1Y1RXIEVVQy1UVyIKKwllY2hvICJiaWc1IEJJRzUiCisJZWNobyAiR0JLIEdCSyIKKwllY2hvICJUSVMtNjIwIFRJUy02MjAiCisJZWNobyAiVVRGLTggVVRGLTgiCisJOzsKKyAgICBocHV4KikKKwllY2hvICJpc284ODU5MSBJU08tODg1OS0xIgorCWVjaG8gImlzbzg4NTkyIElTTy04ODU5LTIiCisJZWNobyAiaXNvODg1OTUgSVNPLTg4NTktNSIKKwllY2hvICJpc284ODU5NiBJU08tODg1OS02IgorCWVjaG8gImlzbzg4NTk3IElTTy04ODU5LTciCisJZWNobyAiaXNvODg1OTggSVNPLTg4NTktOCIKKwllY2hvICJpc284ODU5OSBJU08tODg1OS05IgorCWVjaG8gImlzbzg4NTkxNSBJU08tODg1OS0xNSIKKwllY2hvICJyb21hbjggSFAtUk9NQU44IgorCWVjaG8gImFyYWJpYzggSFAtQVJBQklDOCIKKwllY2hvICJncmVlazggSFAtR1JFRUs4IgorCWVjaG8gImhlYnJldzggSFAtSEVCUkVXOCIKKwllY2hvICJ0dXJraXNoOCBIUC1UVVJLSVNIOCIKKwllY2hvICJrYW5hOCBIUC1LQU5BOCIKKwllY2hvICJ0aXM2MjAgVElTLTYyMCIKKwllY2hvICJiaWc1IEJJRzUiCisJZWNobyAiZXVjSlAgRVVDLUpQIgorCWVjaG8gImV1Y0tSIEVVQy1LUiIKKwllY2hvICJldWNUVyBFVUMtVFciCisJZWNobyAiaHAxNUNOIEdCMjMxMiIKKwkjZWNobyAiY2NkYyA/IiAjIHdoYXQgaXMgdGhpcz8KKwllY2hvICJTSklTIFNISUZUX0pJUyIKKwllY2hvICJ1dGY4IFVURi04IgorCTs7CisgICAgaXJpeCopCisJZWNobyAiSVNPODg1OS0xIElTTy04ODU5LTEiCisJZWNobyAiSVNPODg1OS0yIElTTy04ODU5LTIiCisJZWNobyAiSVNPODg1OS01IElTTy04ODU5LTUiCisJZWNobyAiSVNPODg1OS03IElTTy04ODU5LTciCisJZWNobyAiSVNPODg1OS05IElTTy04ODU5LTkiCisJZWNobyAiZXVjQ04gR0IyMzEyIgorCWVjaG8gImV1Y0pQIEVVQy1KUCIKKwllY2hvICJldWNLUiBFVUMtS1IiCisJZWNobyAiZXVjVFcgRVVDLVRXIgorCTs7CisgICAgb3NmKikKKwllY2hvICJJU084ODU5LTEgSVNPLTg4NTktMSIKKwllY2hvICJJU084ODU5LTIgSVNPLTg4NTktMiIKKwllY2hvICJJU084ODU5LTQgSVNPLTg4NTktNCIKKwllY2hvICJJU084ODU5LTUgSVNPLTg4NTktNSIKKwllY2hvICJJU084ODU5LTcgSVNPLTg4NTktNyIKKwllY2hvICJJU084ODU5LTggSVNPLTg4NTktOCIKKwllY2hvICJJU084ODU5LTkgSVNPLTg4NTktOSIKKwllY2hvICJJU084ODU5LTE1IElTTy04ODU5LTE1IgorCWVjaG8gImNwODUwIENQODUwIgorCWVjaG8gImJpZzUgQklHNSIKKwllY2hvICJkZWNoYW55dSBERUMtSEFOWVUiCisJZWNobyAiZGVjaGFuemkgR0IyMzEyIgorCWVjaG8gImRlY2thbmppIERFQy1LQU5KSSIKKwllY2hvICJkZWNrb3JlYW4gRVVDLUtSIgorCWVjaG8gImV1Y0pQIEVVQy1KUCIKKwllY2hvICJldWNLUiBFVUMtS1IiCisJZWNobyAiZXVjVFcgRVVDLVRXIgorCWVjaG8gIkdCSyBHQksiCisJZWNobyAiS1NDNTYwMSBDUDk0OSIKKwllY2hvICJzZGVja2FuamkgRVVDLUpQIgorCWVjaG8gIlNKSVMgU0hJRlRfSklTIgorCWVjaG8gIlRBQ1RJUyBUSVMtNjIwIgorCWVjaG8gIlVURi04IFVURi04IgorCTs7CisgICAgc29sYXJpcyopCisJZWNobyAiNjQ2IEFTQ0lJIgorCWVjaG8gIklTTzg4NTktMSBJU08tODg1OS0xIgorCWVjaG8gIklTTzg4NTktMiBJU08tODg1OS0yIgorCWVjaG8gIklTTzg4NTktMyBJU08tODg1OS0zIgorCWVjaG8gIklTTzg4NTktNCBJU08tODg1OS00IgorCWVjaG8gIklTTzg4NTktNSBJU08tODg1OS01IgorCWVjaG8gIklTTzg4NTktNiBJU08tODg1OS02IgorCWVjaG8gIklTTzg4NTktNyBJU08tODg1OS03IgorCWVjaG8gIklTTzg4NTktOCBJU08tODg1OS04IgorCWVjaG8gIklTTzg4NTktOSBJU08tODg1OS05IgorCWVjaG8gIklTTzg4NTktMTUgSVNPLTg4NTktMTUiCisJZWNobyAia29pOC1yIEtPSTgtUiIKKwllY2hvICJhbnNpLTEyNTEgQ1AxMjUxIgorCWVjaG8gIkJJRzUgQklHNSIKKwllY2hvICJCaWc1LUhLU0NTIEJJRzUtSEtTQ1MiCisJZWNobyAiZ2IyMzEyIEdCMjMxMiIKKwllY2hvICJHQksgR0JLIgorCWVjaG8gIkdCMTgwMzAgR0IxODAzMCIKKwllY2hvICJjbnMxMTY0MyBFVUMtVFciCisJZWNobyAiNTYwMSBFVUMtS1IiCisJZWNobyAia29fS1Iuam9oYXA5MiBKT0hBQiIKKwllY2hvICJldWNKUCBFVUMtSlAiCisJZWNobyAiUENLIFNISUZUX0pJUyIKKwllY2hvICJUSVM2MjAuMjUzMyBUSVMtNjIwIgorCSNlY2hvICJzdW5fZXVfZ3JlZWsgPyIgIyB3aGF0IGlzIHRoaXM/CisJZWNobyAiVVRGLTggVVRGLTgiCisJOzsKKyAgICBmcmVlYnNkKiB8IG9zMiopCisJIyBGcmVlQlNEIDQuMiBkb2Vzbid0IGhhdmUgbmxfbGFuZ2luZm8oQ09ERVNFVCk7IHRoZXJlZm9yZQorCSMgbG9jYWxjaGFyc2V0LmMgZmFsbHMgYmFjayB0byB1c2luZyB0aGUgZnVsbCBsb2NhbGUgbmFtZQorCSMgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCSMgTGlrZXdpc2UgZm9yIE9TLzIuIE9TLzIgaGFzIFhGcmVlODYganVzdCBsaWtlIEZyZWVCU0QuIEp1c3QKKwkjIHJldXNlIEZyZWVCU0QncyBsb2NhbGUgZGF0YSBmb3IgT1MvMi4KKwllY2hvICJDIEFTQ0lJIgorCWVjaG8gIlVTLUFTQ0lJIEFTQ0lJIgorCWZvciBsIGluIGxhX0xOIGx0X0xOOyBkbworCSAgZWNobyAiJGwuQVNDSUkgQVNDSUkiCisJZG9uZQorCWZvciBsIGluIGRhX0RLIGRlX0FUIGRlX0NIIGRlX0RFIGVuX0FVIGVuX0NBIGVuX0dCIGVuX1VTIGVzX0VTIFwKKwkgICAgICAgICBmaV9GSSBmcl9CRSBmcl9DQSBmcl9DSCBmcl9GUiBpc19JUyBpdF9DSCBpdF9JVCBsYV9MTiBcCisJICAgICAgICAgbHRfTE4gbmxfQkUgbmxfTkwgbm9fTk8gcHRfUFQgc3ZfU0U7IGRvCisJICBlY2hvICIkbC5JU09fODg1OS0xIElTTy04ODU5LTEiCisJICBlY2hvICIkbC5ESVNfODg1OS0xNSBJU08tODg1OS0xNSIKKwlkb25lCisJZm9yIGwgaW4gY3NfQ1ogaHJfSFIgaHVfSFUgbGFfTE4gbHRfTE4gcGxfUEwgc2xfU0k7IGRvCisJICBlY2hvICIkbC5JU09fODg1OS0yIElTTy04ODU5LTIiCisJZG9uZQorCWZvciBsIGluIGxhX0xOIGx0X0xUOyBkbworCSAgZWNobyAiJGwuSVNPXzg4NTktNCBJU08tODg1OS00IgorCWRvbmUKKwlmb3IgbCBpbiBydV9SVSBydV9TVTsgZG8KKwkgIGVjaG8gIiRsLktPSTgtUiBLT0k4LVIiCisJICBlY2hvICIkbC5JU09fODg1OS01IElTTy04ODU5LTUiCisJICBlY2hvICIkbC5DUDg2NiBDUDg2NiIKKwlkb25lCisJZWNobyAidWtfVUEuS09JOC1VIEtPSTgtVSIKKwllY2hvICJ6aF9UVy5CSUc1IEJJRzUiCisJZWNobyAiemhfVFcuQmlnNSBCSUc1IgorCWVjaG8gInpoX0NOLkVVQyBHQjIzMTIiCisJZWNobyAiamFfSlAuRVVDIEVVQy1KUCIKKwllY2hvICJqYV9KUC5TSklTIFNISUZUX0pJUyIKKwllY2hvICJqYV9KUC5TaGlmdF9KSVMgU0hJRlRfSklTIgorCWVjaG8gImtvX0tSLkVVQyBFVUMtS1IiCisJOzsKKyAgICBuZXRic2QqKQorCWVjaG8gIjY0NiBBU0NJSSIKKwllY2hvICJJU084ODU5LTEgSVNPLTg4NTktMSIKKwllY2hvICJJU084ODU5LTIgSVNPLTg4NTktMiIKKwllY2hvICJJU084ODU5LTQgSVNPLTg4NTktNCIKKwllY2hvICJJU084ODU5LTUgSVNPLTg4NTktNSIKKwllY2hvICJJU084ODU5LTE1IElTTy04ODU5LTE1IgorCWVjaG8gImV1Y0NOIEdCMjMxMiIKKwllY2hvICJldWNKUCBFVUMtSlAiCisJZWNobyAiZXVjS1IgRVVDLUtSIgorCWVjaG8gImV1Y1RXIEVVQy1UVyIKKwllY2hvICJCSUc1IEJJRzUiCisJZWNobyAiU0pJUyBTSElGVF9KSVMiCisJOzsKKyAgICBkYXJ3aW4qKQorCSMgRGFyd2luIDYuOCBkb2Vzbid0IGhhdmUgbmxfbGFuZ2luZm8oQ09ERVNFVCk7IHRoZXJlZm9yZQorCSMgbG9jYWxjaGFyc2V0LmMgZmFsbHMgYmFjayB0byB1c2luZyB0aGUgZnVsbCBsb2NhbGUgbmFtZQorCSMgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCWVjaG8gIkMgQVNDSUkiCisJZm9yIGwgaW4gZW5fQVUgZW5fQ0EgZW5fR0IgZW5fVVMgbGFfTE47IGRvCisJICBlY2hvICIkbC5VUy1BU0NJSSBBU0NJSSIKKwlkb25lCisJZm9yIGwgaW4gZGFfREsgZGVfQVQgZGVfQ0ggZGVfREUgZW5fQVUgZW5fQ0EgZW5fR0IgZW5fVVMgZXNfRVMgXAorCSAgICAgICAgIGZpX0ZJIGZyX0JFIGZyX0NBIGZyX0NIIGZyX0ZSIGlzX0lTIGl0X0NIIGl0X0lUIG5sX0JFIFwKKwkgICAgICAgICBubF9OTCBub19OTyBwdF9QVCBzdl9TRTsgZG8KKwkgIGVjaG8gIiRsIElTTy04ODU5LTEiCisJICBlY2hvICIkbC5JU084ODU5LTEgSVNPLTg4NTktMSIKKwkgIGVjaG8gIiRsLklTTzg4NTktMTUgSVNPLTg4NTktMTUiCisJZG9uZQorCWZvciBsIGluIGxhX0xOOyBkbworCSAgZWNobyAiJGwuSVNPODg1OS0xIElTTy04ODU5LTEiCisJICBlY2hvICIkbC5JU084ODU5LTE1IElTTy04ODU5LTE1IgorCWRvbmUKKwlmb3IgbCBpbiBjc19DWiBocl9IUiBodV9IVSBsYV9MTiBwbF9QTCBzbF9TSTsgZG8KKwkgIGVjaG8gIiRsLklTTzg4NTktMiBJU08tODg1OS0yIgorCWRvbmUKKwlmb3IgbCBpbiBsYV9MTiBsdF9MVDsgZG8KKwkgIGVjaG8gIiRsLklTTzg4NTktNCBJU08tODg1OS00IgorCWRvbmUKKwlmb3IgbCBpbiBydV9SVTsgZG8KKwkgIGVjaG8gIiRsLktPSTgtUiBLT0k4LVIiCisJICBlY2hvICIkbC5JU084ODU5LTUgSVNPLTg4NTktNSIKKwkgIGVjaG8gIiRsLkNQODY2IENQODY2IgorCWRvbmUKKwlmb3IgbCBpbiBiZ19CRzsgZG8KKwkgIGVjaG8gIiRsLkNQMTI1MSBDUDEyNTEiCisJZG9uZQorCWVjaG8gInVrX1VBLktPSTgtVSBLT0k4LVUiCisJZWNobyAiemhfVFcuQklHNSBCSUc1IgorCWVjaG8gInpoX1RXLkJpZzUgQklHNSIKKwllY2hvICJ6aF9DTi5FVUMgR0IyMzEyIgorCWVjaG8gImphX0pQLkVVQyBFVUMtSlAiCisJZWNobyAiamFfSlAuU0pJUyBTSElGVF9KSVMiCisJZWNobyAia29fS1IuRVVDIEVVQy1LUiIKKwk7OworICAgIGJlb3MqKQorCSMgQmVPUyBoYXMgYSBzaW5nbGUgbG9jYWxlLCBhbmQgaXQgaGFzIFVURi04IGVuY29kaW5nLgorCWVjaG8gIiogVVRGLTgiCisJOzsKKyAgICBtc2Rvc2RqZ3BwKikKKwkjIERKR1BQIDIuMDMgZG9lc24ndCBoYXZlIG5sX2xhbmdpbmZvKENPREVTRVQpOyB0aGVyZWZvcmUKKwkjIGxvY2FsY2hhcnNldC5jIGZhbGxzIGJhY2sgdG8gdXNpbmcgdGhlIGZ1bGwgbG9jYWxlIG5hbWUKKwkjIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKwllY2hvICIjIgorCWVjaG8gIiMgVGhlIGVuY29kaW5ncyBnaXZlbiBoZXJlIG1heSBub3QgYWxsIGJlIGNvcnJlY3QuIgorCWVjaG8gIiMgSWYgeW91IGZpbmQgdGhhdCB0aGUgZW5jb2RpbmcgZ2l2ZW4gZm9yIHlvdXIgbGFuZ3VhZ2UgYW5kIgorCWVjaG8gIiMgY291bnRyeSBpcyBub3QgdGhlIG9uZSB5b3VyIERPUyBtYWNoaW5lIGFjdHVhbGx5IHVzZXMsIGp1c3QiCisJZWNobyAiIyBjb3JyZWN0IGl0IGluIHRoaXMgZmlsZSwgYW5kIHNlbmQgYSBtYWlsIHRvIgorCWVjaG8gIiMgSnVhbiBNYW51ZWwgR3VlcnJlcm8gPHN0MDAxOTA2QGhyejEuaHJ6LnR1LWRhcm1zdGFkdC5kZT4iCisJZWNobyAiIyBhbmQgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LiIKKwllY2hvICIjIgorCWVjaG8gIkMgQVNDSUkiCisJIyBJU08tODg1OS0xIGxhbmd1YWdlcworCWVjaG8gImNhIENQODUwIgorCWVjaG8gImNhX0VTIENQODUwIgorCWVjaG8gImRhIENQODY1IiAgICAjIG5vdCBDUDg1MCA/PworCWVjaG8gImRhX0RLIENQODY1IiAjIG5vdCBDUDg1MCA/PworCWVjaG8gImRlIENQODUwIgorCWVjaG8gImRlX0FUIENQODUwIgorCWVjaG8gImRlX0NIIENQODUwIgorCWVjaG8gImRlX0RFIENQODUwIgorCWVjaG8gImVuIENQODUwIgorCWVjaG8gImVuX0FVIENQODUwIiAjIG5vdCBDUDQzNyA/PworCWVjaG8gImVuX0NBIENQODUwIgorCWVjaG8gImVuX0dCIENQODUwIgorCWVjaG8gImVuX05aIENQNDM3IgorCWVjaG8gImVuX1VTIENQNDM3IgorCWVjaG8gImVuX1pBIENQODUwIiAjIG5vdCBDUDQzNyA/PworCWVjaG8gImVzIENQODUwIgorCWVjaG8gImVzX0FSIENQODUwIgorCWVjaG8gImVzX0JPIENQODUwIgorCWVjaG8gImVzX0NMIENQODUwIgorCWVjaG8gImVzX0NPIENQODUwIgorCWVjaG8gImVzX0NSIENQODUwIgorCWVjaG8gImVzX0NVIENQODUwIgorCWVjaG8gImVzX0RPIENQODUwIgorCWVjaG8gImVzX0VDIENQODUwIgorCWVjaG8gImVzX0VTIENQODUwIgorCWVjaG8gImVzX0dUIENQODUwIgorCWVjaG8gImVzX0hOIENQODUwIgorCWVjaG8gImVzX01YIENQODUwIgorCWVjaG8gImVzX05JIENQODUwIgorCWVjaG8gImVzX1BBIENQODUwIgorCWVjaG8gImVzX1BZIENQODUwIgorCWVjaG8gImVzX1BFIENQODUwIgorCWVjaG8gImVzX1NWIENQODUwIgorCWVjaG8gImVzX1VZIENQODUwIgorCWVjaG8gImVzX1ZFIENQODUwIgorCWVjaG8gImV0IENQODUwIgorCWVjaG8gImV0X0VFIENQODUwIgorCWVjaG8gImV1IENQODUwIgorCWVjaG8gImV1X0VTIENQODUwIgorCWVjaG8gImZpIENQODUwIgorCWVjaG8gImZpX0ZJIENQODUwIgorCWVjaG8gImZyIENQODUwIgorCWVjaG8gImZyX0JFIENQODUwIgorCWVjaG8gImZyX0NBIENQODUwIgorCWVjaG8gImZyX0NIIENQODUwIgorCWVjaG8gImZyX0ZSIENQODUwIgorCWVjaG8gImdhIENQODUwIgorCWVjaG8gImdhX0lFIENQODUwIgorCWVjaG8gImdkIENQODUwIgorCWVjaG8gImdkX0dCIENQODUwIgorCWVjaG8gImdsIENQODUwIgorCWVjaG8gImdsX0VTIENQODUwIgorCWVjaG8gImlkIENQODUwIiAgICAjIG5vdCBDUDQzNyA/PworCWVjaG8gImlkX0lEIENQODUwIiAjIG5vdCBDUDQzNyA/PworCWVjaG8gImlzIENQODYxIiAgICAjIG5vdCBDUDg1MCA/PworCWVjaG8gImlzX0lTIENQODYxIiAjIG5vdCBDUDg1MCA/PworCWVjaG8gIml0IENQODUwIgorCWVjaG8gIml0X0NIIENQODUwIgorCWVjaG8gIml0X0lUIENQODUwIgorCWVjaG8gImx0IENQNzc1IgorCWVjaG8gImx0X0xUIENQNzc1IgorCWVjaG8gImx2IENQNzc1IgorCWVjaG8gImx2X0xWIENQNzc1IgorCWVjaG8gIm5iIENQODY1IiAgICAjIG5vdCBDUDg1MCA/PworCWVjaG8gIm5iX05PIENQODY1IiAjIG5vdCBDUDg1MCA/PworCWVjaG8gIm5sIENQODUwIgorCWVjaG8gIm5sX0JFIENQODUwIgorCWVjaG8gIm5sX05MIENQODUwIgorCWVjaG8gIm5uIENQODY1IiAgICAjIG5vdCBDUDg1MCA/PworCWVjaG8gIm5uX05PIENQODY1IiAjIG5vdCBDUDg1MCA/PworCWVjaG8gIm5vIENQODY1IiAgICAjIG5vdCBDUDg1MCA/PworCWVjaG8gIm5vX05PIENQODY1IiAjIG5vdCBDUDg1MCA/PworCWVjaG8gInB0IENQODUwIgorCWVjaG8gInB0X0JSIENQODUwIgorCWVjaG8gInB0X1BUIENQODUwIgorCWVjaG8gInN2IENQODUwIgorCWVjaG8gInN2X1NFIENQODUwIgorCSMgSVNPLTg4NTktMiBsYW5ndWFnZXMKKwllY2hvICJjcyBDUDg1MiIKKwllY2hvICJjc19DWiBDUDg1MiIKKwllY2hvICJociBDUDg1MiIKKwllY2hvICJocl9IUiBDUDg1MiIKKwllY2hvICJodSBDUDg1MiIKKwllY2hvICJodV9IVSBDUDg1MiIKKwllY2hvICJwbCBDUDg1MiIKKwllY2hvICJwbF9QTCBDUDg1MiIKKwllY2hvICJybyBDUDg1MiIKKwllY2hvICJyb19STyBDUDg1MiIKKwllY2hvICJzayBDUDg1MiIKKwllY2hvICJza19TSyBDUDg1MiIKKwllY2hvICJzbCBDUDg1MiIKKwllY2hvICJzbF9TSSBDUDg1MiIKKwllY2hvICJzcSBDUDg1MiIKKwllY2hvICJzcV9BTCBDUDg1MiIKKwllY2hvICJzciBDUDg1MiIgICAgIyBDUDg1MiBvciBDUDg2NiBvciBDUDg1NSA/PworCWVjaG8gInNyX0NTIENQODUyIiAjIENQODUyIG9yIENQODY2IG9yIENQODU1ID8/CisJZWNobyAic3JfWVUgQ1A4NTIiICMgQ1A4NTIgb3IgQ1A4NjYgb3IgQ1A4NTUgPz8KKwkjIElTTy04ODU5LTMgbGFuZ3VhZ2VzCisJZWNobyAibXQgQ1A4NTAiCisJZWNobyAibXRfTVQgQ1A4NTAiCisJIyBJU08tODg1OS01IGxhbmd1YWdlcworCWVjaG8gImJlIENQODY2IgorCWVjaG8gImJlX0JFIENQODY2IgorCWVjaG8gImJnIENQODY2IiAgICAjIG5vdCBDUDg1NSA/PworCWVjaG8gImJnX0JHIENQODY2IiAjIG5vdCBDUDg1NSA/PworCWVjaG8gIm1rIENQODY2IiAgICAjIG5vdCBDUDg1NSA/PworCWVjaG8gIm1rX01LIENQODY2IiAjIG5vdCBDUDg1NSA/PworCWVjaG8gInJ1IENQODY2IgorCWVjaG8gInJ1X1JVIENQODY2IgorCWVjaG8gInVrIENQMTEyNSIKKwllY2hvICJ1a19VQSBDUDExMjUiCisJIyBJU08tODg1OS02IGxhbmd1YWdlcworCWVjaG8gImFyIENQODY0IgorCWVjaG8gImFyX0FFIENQODY0IgorCWVjaG8gImFyX0RaIENQODY0IgorCWVjaG8gImFyX0VHIENQODY0IgorCWVjaG8gImFyX0lRIENQODY0IgorCWVjaG8gImFyX0lSIENQODY0IgorCWVjaG8gImFyX0pPIENQODY0IgorCWVjaG8gImFyX0tXIENQODY0IgorCWVjaG8gImFyX01BIENQODY0IgorCWVjaG8gImFyX09NIENQODY0IgorCWVjaG8gImFyX1FBIENQODY0IgorCWVjaG8gImFyX1NBIENQODY0IgorCWVjaG8gImFyX1NZIENQODY0IgorCSMgSVNPLTg4NTktNyBsYW5ndWFnZXMKKwllY2hvICJlbCBDUDg2OSIKKwllY2hvICJlbF9HUiBDUDg2OSIKKwkjIElTTy04ODU5LTggbGFuZ3VhZ2VzCisJZWNobyAiaGUgQ1A4NjIiCisJZWNobyAiaGVfSUwgQ1A4NjIiCisJIyBJU08tODg1OS05IGxhbmd1YWdlcworCWVjaG8gInRyIENQODU3IgorCWVjaG8gInRyX1RSIENQODU3IgorCSMgSmFwYW5lc2UKKwllY2hvICJqYSBDUDkzMiIKKwllY2hvICJqYV9KUCBDUDkzMiIKKwkjIENoaW5lc2UKKwllY2hvICJ6aF9DTiBHQksiCisJZWNobyAiemhfVFcgQ1A5NTAiICMgbm90IENQOTM4ID8/CisJIyBLb3JlYW4KKwllY2hvICJrciBDUDk0OSIgICAgIyBub3QgQ1A5MzQgPz8KKwllY2hvICJrcl9LUiBDUDk0OSIgIyBub3QgQ1A5MzQgPz8KKwkjIFRoYWkKKwllY2hvICJ0aCBDUDg3NCIKKwllY2hvICJ0aF9USCBDUDg3NCIKKwkjIE90aGVyCisJZWNobyAiZW8gQ1A4NTAiCisJZWNobyAiZW9fRU8gQ1A4NTAiCisJOzsKK2VzYWMKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9kY2dldHRleHQuYyBiL3VuaXgvaW50bC9kY2dldHRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTBhY2RlCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2RjZ2V0dGV4dC5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkY2dldHRleHQoMykgZnVuY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdldHRleHRQLmgiCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAibGliZ251aW50bC5oIgorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAorICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQorICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCisgICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBEQ0dFVFRFWFQgX19kY2dldHRleHQKKyMgZGVmaW5lIERDSUdFVFRFWFQgX19kY2lnZXR0ZXh0CisjZWxzZQorIyBkZWZpbmUgRENHRVRURVhUIGxpYmludGxfZGNnZXR0ZXh0CisjIGRlZmluZSBEQ0lHRVRURVhUIGxpYmludGxfZGNpZ2V0dGV4dAorI2VuZGlmCisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQorICAgbG9jYWxlLiAgKi8KK2NoYXIgKgorRENHRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICptc2dpZCwgaW50IGNhdGVnb3J5KQoreworICByZXR1cm4gRENJR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQsIE5VTEwsIDAsIDAsIGNhdGVnb3J5KTsKK30KKworI2lmZGVmIF9MSUJDCisvKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KK0lOVERFRihfX2RjZ2V0dGV4dCkKK3dlYWtfYWxpYXMgKF9fZGNnZXR0ZXh0LCBkY2dldHRleHQpOworI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L2ludGwvZGNpZ2V0dGV4dC5jIGIvdW5peC9pbnRsL2RjaWdldHRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTIzOGUyCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2RjaWdldHRleHQuYwpAQCAtMCwwICsxLDEyMTkgQEAKKy8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBkY2lnZXR0ZXh0IGZ1bmN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKy8qIFRlbGwgZ2xpYmMncyA8c3RyaW5nLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIG1lbXBjcHkoKS4KKyAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQorICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorIyBkZWZpbmUgX0dOVV9TT1VSQ0UJMQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2lmZGVmIF9fR05VQ19fCisjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQorI2Vsc2UKKyMgaWZkZWYgX01TQ19WRVIKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjIGVsc2UKKyMgIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhCitjaGFyICphbGxvY2EgKCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaWZuZGVmIGVycm5vCitleHRlcm4gaW50IGVycm5vOworI2VuZGlmCisjaWZuZGVmIF9fc2V0X2Vycm5vCisjIGRlZmluZSBfX3NldF9lcnJubyh2YWwpIGVycm5vID0gKHZhbCkKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQworIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKyNpZmRlZiBfTElCQworICAvKiBHdWVzcyB3aGV0aGVyIGludGVnZXIgZGl2aXNpb24gYnkgemVybyByYWlzZXMgc2lnbmFsIFNJR0ZQRS4KKyAgICAgU2V0IHRvIDEgb25seSBpZiB5b3Uga25vdyBmb3Igc3VyZS4gIEluIGNhc2Ugb2YgZG91YnQsIHNldCB0byAwLiAgKi8KKyMgaWYgZGVmaW5lZCBfX2FscGhhX18gfHwgZGVmaW5lZCBfX2FybV9fIHx8IGRlZmluZWQgX19pMzg2X18gXAorICAgICB8fCBkZWZpbmVkIF9fbTY4a19fIHx8IGRlZmluZWQgX19zMzkwX18KKyMgIGRlZmluZSBJTlRESVYwX1JBSVNFU19TSUdGUEUgMQorIyBlbHNlCisjICBkZWZpbmUgSU5URElWMF9SQUlTRVNfU0lHRlBFIDAKKyMgZW5kaWYKKyNlbmRpZgorI2lmICFJTlRESVYwX1JBSVNFU19TSUdGUEUKKyMgaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgSEFWRV9TWVNfUEFSQU1fSCB8fCBkZWZpbmVkIF9MSUJDCisjIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorI2luY2x1ZGUgInBsdXJhbC1leHAuaCIKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZWxzZQorIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisjZW5kaWYKKyNpbmNsdWRlICJoYXNoLXN0cmluZy5oIgorCisvKiBUaHJlYWQgc2FmZXR5bmVzcy4gICovCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8Yml0cy9saWJjLWxvY2suaD4KKyNlbHNlCisvKiBQcm92aWRlIGR1bW15IGltcGxlbWVudGF0aW9uIGlmIHRoaXMgaXMgb3V0c2lkZSBnbGliYy4gICovCisjIGRlZmluZSBfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQoQ0xBU1MsIE5BTUUpCisjIGRlZmluZSBfX2xpYmNfbG9ja19sb2NrKE5BTUUpCisjIGRlZmluZSBfX2xpYmNfbG9ja191bmxvY2soTkFNRSkKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfZGVmaW5lX2luaXRpYWxpemVkKENMQVNTLCBOQU1FKQorIyBkZWZpbmUgX19saWJjX3J3bG9ja19yZGxvY2soTkFNRSkKKyMgZGVmaW5lIF9fbGliY19yd2xvY2tfdW5sb2NrKE5BTUUpCisjZW5kaWYKKworLyogQWxpZ25tZW50IG9mIHR5cGVzLiAgKi8KKyNpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDIKKyMgZGVmaW5lIGFsaWdub2YoVFlQRSkgX19hbGlnbm9mX18gKFRZUEUpCisjZWxzZQorIyBkZWZpbmUgYWxpZ25vZihUWVBFKSBcCisgICAgKChpbnQpICYoKHN0cnVjdCB7IGNoYXIgZHVtbXkxOyBUWVBFIGR1bW15MjsgfSAqKSAwKS0+ZHVtbXkyKQorI2VuZGlmCisKKy8qIFRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgaW4gdGhlIHN0YW5kYWxvbmUgbGliaW50bC5hIG11c3QgaGF2ZSBkaWZmZXJlbnQKKyAgIG5hbWVzIHRoYW4gdGhlIGludGVybmFsIHZhcmlhYmxlcyBpbiBHTlUgbGliYywgb3RoZXJ3aXNlIHByb2dyYW1zCisgICB1c2luZyBsaWJpbnRsLmEgY2Fubm90IGJlIGxpbmtlZCBzdGF0aWNhbGx5LiAgKi8KKyNpZiAhZGVmaW5lZCBfTElCQworIyBkZWZpbmUgX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW4gbGliaW50bF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluCisjIGRlZmluZSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiBsaWJpbnRsX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4KKyMgZGVmaW5lIF9ubF9kZWZhdWx0X2Rpcm5hbWUgbGliaW50bF9ubF9kZWZhdWx0X2Rpcm5hbWUKKyMgZGVmaW5lIF9ubF9kb21haW5fYmluZGluZ3MgbGliaW50bF9ubF9kb21haW5fYmluZGluZ3MKKyNlbmRpZgorCisvKiBTb21lIGNvbXBpbGVycywgbGlrZSBTdW5PUzQgY2MsIGRvbid0IGhhdmUgb2Zmc2V0b2YgaW4gPHN0ZGRlZi5oPi4gICovCisjaWZuZGVmIG9mZnNldG9mCisjIGRlZmluZSBvZmZzZXRvZih0eXBlLGlkZW50KSAoKHNpemVfdCkmKCgodHlwZSopMCktPmlkZW50KSkKKyNlbmRpZgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKyNpZmRlZiBfTElCQworLyogUmVuYW1lIHRoZSBub24gQU5TSSBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCisgICBiZWNhdXNlIHNvbWUgQU5TSSBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0CisgICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCisjIGRlZmluZSBnZXRjd2QgX19nZXRjd2QKKyMgaWZuZGVmIHN0cGNweQorIyAgZGVmaW5lIHN0cGNweSBfX3N0cGNweQorIyBlbmRpZgorIyBkZWZpbmUgdGZpbmQgX190ZmluZAorI2Vsc2UKKyMgaWYgIWRlZmluZWQgSEFWRV9HRVRDV0QKK2NoYXIgKmdldHdkICgpOworIyAgZGVmaW5lIGdldGN3ZChidWYsIG1heCkgZ2V0d2QgKGJ1ZikKKyMgZWxzZQorIyAgaWYgVk1TCisjICAgZGVmaW5lIGdldGN3ZChidWYsIG1heCkgKGdldGN3ZCkgKGJ1ZiwgbWF4LCAwKQorIyAgZWxzZQorY2hhciAqZ2V0Y3dkICgpOworIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWZuZGVmIEhBVkVfU1RQQ1BZCitzdGF0aWMgY2hhciAqc3RwY3B5IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpOworIyBlbmRpZgorIyBpZm5kZWYgSEFWRV9NRU1QQ1BZCitzdGF0aWMgdm9pZCAqbWVtcGNweSAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgbik7CisjIGVuZGlmCisjZW5kaWYKKworLyogQW1vdW50IHRvIGluY3JlYXNlIGJ1ZmZlciBzaXplIGJ5IGluIGVhY2ggdHJ5LiAgKi8KKyNkZWZpbmUgUEFUSF9JTkNSIDMyCisKKy8qIFRoZSBmb2xsb3dpbmcgaXMgZnJvbSBwYXRobWF4LmguICAqLworLyogTm9uLVBPU0lYIEJTRCBzeXN0ZW1zIG1pZ2h0IGhhdmUgZ2NjJ3MgbGltaXRzLmgsIHdoaWNoIGRvZXNuJ3QgZGVmaW5lCisgICBQQVRIX01BWCBidXQgbWlnaHQgY2F1c2UgcmVkZWZpbml0aW9uIHdhcm5pbmdzIHdoZW4gc3lzL3BhcmFtLmggaXMKKyAgIGxhdGVyIGluY2x1ZGVkIChhcyBvbiBNT1JFL0JTRCA0LjMpLiAgKi8KKyNpZiBkZWZpbmVkIF9QT1NJWF9WRVJTSU9OIHx8IChkZWZpbmVkIEhBVkVfTElNSVRTX0ggJiYgIWRlZmluZWQgX19HTlVDX18pCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1BPU0lYX1BBVEhfTUFYCisjIGRlZmluZSBfUE9TSVhfUEFUSF9NQVggMjU1CisjZW5kaWYKKworI2lmICFkZWZpbmVkIFBBVEhfTUFYICYmIGRlZmluZWQgX1BDX1BBVEhfTUFYCisjIGRlZmluZSBQQVRIX01BWCAocGF0aGNvbmYgKCIvIiwgX1BDX1BBVEhfTUFYKSA8IDEgPyAxMDI0IDogcGF0aGNvbmYgKCIvIiwgX1BDX1BBVEhfTUFYKSkKKyNlbmRpZgorCisvKiBEb24ndCBpbmNsdWRlIHN5cy9wYXJhbS5oIGlmIGl0IGFscmVhZHkgaGFzIGJlZW4uICAqLworI2lmIGRlZmluZWQgSEFWRV9TWVNfUEFSQU1fSCAmJiAhZGVmaW5lZCBQQVRIX01BWCAmJiAhZGVmaW5lZCBNQVhQQVRITEVOCisjIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCBQQVRIX01BWCAmJiBkZWZpbmVkIE1BWFBBVEhMRU4KKyMgZGVmaW5lIFBBVEhfTUFYIE1BWFBBVEhMRU4KKyNlbmRpZgorCisjaWZuZGVmIFBBVEhfTUFYCisjIGRlZmluZSBQQVRIX01BWCBfUE9TSVhfUEFUSF9NQVgKKyNlbmRpZgorCisvKiBQYXRobmFtZSBzdXBwb3J0LgorICAgSVNTTEFTSChDKSAgICAgICAgICAgdGVzdHMgd2hldGhlciBDIGlzIGEgZGlyZWN0b3J5IHNlcGFyYXRvciBjaGFyYWN0ZXIuCisgICBJU19BQlNPTFVURV9QQVRIKFApICB0ZXN0cyB3aGV0aGVyIFAgaXMgYW4gYWJzb2x1dGUgcGF0aC4gIElmIGl0IGlzIG5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0IG1heSBiZSBjb25jYXRlbmF0ZWQgdG8gYSBkaXJlY3RvcnkgcGF0aG5hbWUuCisgICBJU19QQVRIX1dJVEhfRElSKFApICB0ZXN0cyB3aGV0aGVyIFAgY29udGFpbnMgYSBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbi4KKyAqLworI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXworICAvKiBXaW4zMiwgT1MvMiwgRE9TICovCisjIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nIHx8IChDKSA9PSAnXFwnKQorIyBkZWZpbmUgSEFTX0RFVklDRShQKSBcCisgICAgKCgoKFApWzBdID49ICdBJyAmJiAoUClbMF0gPD0gJ1onKSB8fCAoKFApWzBdID49ICdhJyAmJiAoUClbMF0gPD0gJ3onKSkgXAorICAgICAmJiAoUClbMV0gPT0gJzonKQorIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSAoSVNTTEFTSCAoKFApWzBdKSB8fCBIQVNfREVWSUNFIChQKSkKKyMgZGVmaW5lIElTX1BBVEhfV0lUSF9ESVIoUCkgXAorICAgIChzdHJjaHIgKFAsICcvJykgIT0gTlVMTCB8fCBzdHJjaHIgKFAsICdcXCcpICE9IE5VTEwgfHwgSEFTX0RFVklDRSAoUCkpCisjZWxzZQorICAvKiBVbml4ICovCisjIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nKQorIyBkZWZpbmUgSVNfQUJTT0xVVEVfUEFUSChQKSBJU1NMQVNIICgoUClbMF0pCisjIGRlZmluZSBJU19QQVRIX1dJVEhfRElSKFApIChzdHJjaHIgKFAsICcvJykgIT0gTlVMTCkKKyNlbmRpZgorCisvKiBUaGlzIGlzIHRoZSB0eXBlIHVzZWQgZm9yIHRoZSBzZWFyY2ggdHJlZSB3aGVyZSBrbm93biB0cmFuc2xhdGlvbnMKKyAgIGFyZSBzdG9yZWQuICAqLworc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QKK3sKKyAgLyogRG9tYWluIGluIHdoaWNoIHRvIHNlYXJjaC4gICovCisgIGNoYXIgKmRvbWFpbm5hbWU7CisKKyAgLyogVGhlIGNhdGVnb3J5LiAgKi8KKyAgaW50IGNhdGVnb3J5OworCisgIC8qIFN0YXRlIG9mIHRoZSBjYXRhbG9nIGNvdW50ZXIgYXQgdGhlIHBvaW50IHRoZSBzdHJpbmcgd2FzIGZvdW5kLiAgKi8KKyAgaW50IGNvdW50ZXI7CisKKyAgLyogQ2F0YWxvZyB3aGVyZSB0aGUgc3RyaW5nIHdhcyBmb3VuZC4gICovCisgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbjsKKworICAvKiBBbmQgZmluYWxseSB0aGUgdHJhbnNsYXRpb24uICAqLworICBjb25zdCBjaGFyICp0cmFuc2xhdGlvbjsKKyAgc2l6ZV90IHRyYW5zbGF0aW9uX2xlbmd0aDsKKworICAvKiBQb2ludGVyIHRvIHRoZSBzdHJpbmcgaW4gcXVlc3Rpb24uICAqLworICBjaGFyIG1zZ2lkW1pFUk9dOworfTsKKworLyogUm9vdCBvZiB0aGUgc2VhcmNoIHRyZWUgd2l0aCBrbm93biB0cmFuc2xhdGlvbnMuICBXZSBjYW4gdXNlIHRoaXMKKyAgIG9ubHkgaWYgdGhlIHN5c3RlbSBwcm92aWRlcyB0aGUgYHRzZWFyY2gnIGZ1bmN0aW9uIGZhbWlseS4gICovCisjaWYgZGVmaW5lZCBIQVZFX1RTRUFSQ0ggfHwgZGVmaW5lZCBfTElCQworIyBpbmNsdWRlIDxzZWFyY2guaD4KKworc3RhdGljIHZvaWQgKnJvb3Q7CisKKyMgaWZkZWYgX0xJQkMKKyMgIGRlZmluZSB0c2VhcmNoIF9fdHNlYXJjaAorIyBlbmRpZgorCisvKiBGdW5jdGlvbiB0byBjb21wYXJlIHR3byBlbnRyaWVzIGluIHRoZSB0YWJsZSBvZiBrbm93biB0cmFuc2xhdGlvbnMuICAqLworc3RhdGljIGludAordHJhbnNjbXAgKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKyAgY29uc3Qgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKnMxOworICBjb25zdCBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqczI7CisgIGludCByZXN1bHQ7CisKKyAgczEgPSAoY29uc3Qgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKikgcDE7CisgIHMyID0gKGNvbnN0IHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICopIHAyOworCisgIHJlc3VsdCA9IHN0cmNtcCAoczEtPm1zZ2lkLCBzMi0+bXNnaWQpOworICBpZiAocmVzdWx0ID09IDApCisgICAgeworICAgICAgcmVzdWx0ID0gc3RyY21wIChzMS0+ZG9tYWlubmFtZSwgczItPmRvbWFpbm5hbWUpOworICAgICAgaWYgKHJlc3VsdCA9PSAwKQorCS8qIFdlIGNvbXBhcmUgdGhlIGNhdGVnb3J5IGxhc3QgKHRob3VnaCB0aGlzIGlzIHRoZSBjaGVhcGVzdAorCSAgIG9wZXJhdGlvbikgc2luY2UgaXQgaXMgaG9wZWZ1bGx5IGFsd2F5cyB0aGUgc2FtZSAobmFtZWx5CisJICAgTENfTUVTU0FHRVMpLiAgKi8KKwlyZXN1bHQgPSBzMS0+Y2F0ZWdvcnkgLSBzMi0+Y2F0ZWdvcnk7CisgICAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworI2lmbmRlZiBJTlRWQVJERUYKKyMgZGVmaW5lIElOVFZBUkRFRihuYW1lKQorI2VuZGlmCisjaWZuZGVmIElOVFVTRQorIyBkZWZpbmUgSU5UVVNFKG5hbWUpIG5hbWUKKyNlbmRpZgorCisvKiBOYW1lIG9mIHRoZSBkZWZhdWx0IGRvbWFpbiB1c2VkIGZvciBnZXR0ZXh0KDMpIHByaW9yIGFueSBjYWxsIHRvCisgICB0ZXh0ZG9tYWluKDMpLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgaXMgIm1lc3NhZ2VzIi4gICovCitjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluW10gYXR0cmlidXRlX2hpZGRlbiA9ICJtZXNzYWdlcyI7CisKKy8qIFZhbHVlIHVzZWQgYXMgdGhlIGRlZmF1bHQgZG9tYWluIGZvciBnZXR0ZXh0KDMpLiAgKi8KK2NvbnN0IGNoYXIgKl9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluIGF0dHJpYnV0ZV9oaWRkZW4KKyAgICAgPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbjsKKworLyogQ29udGFpbnMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UgY2F0YWxvZ3MuICAqLworI2lmIGRlZmluZWQgX19FTVhfXworZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdOworI2Vsc2UKK2NvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdID0gTE9DQUxFRElSOworSU5UVkFSREVGIChfbmxfZGVmYXVsdF9kaXJuYW1lKQorI2VuZGlmCisKKy8qIExpc3Qgd2l0aCBiaW5kaW5ncyBvZiBzcGVjaWZpYyBkb21haW5zIGNyZWF0ZWQgYnkgYmluZHRleHRkb21haW4oKQorICAgY2FsbHMuICAqLworc3RydWN0IGJpbmRpbmcgKl9ubF9kb21haW5fYmluZGluZ3M7CisKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgY2hhciAqcGx1cmFsX2xvb2t1cCAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgaW50IG4sCisJCQkgICAgY29uc3QgY2hhciAqdHJhbnNsYXRpb24sIHNpemVfdCB0cmFuc2xhdGlvbl9sZW4pCisgICAgIGludGVybmFsX2Z1bmN0aW9uOworc3RhdGljIGNvbnN0IGNoYXIgKmd1ZXNzX2NhdGVnb3J5X3ZhbHVlIChpbnQgY2F0ZWdvcnksCisJCQkJCSBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpCisgICAgIGludGVybmFsX2Z1bmN0aW9uOworI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgIi4uL2xvY2FsZS9sb2NhbGVpbmZvLmgiCisjIGRlZmluZSBjYXRlZ29yeV90b19uYW1lKGNhdGVnb3J5KQlfbmxfY2F0ZWdvcnlfbmFtZXNbY2F0ZWdvcnldCisjZWxzZQorc3RhdGljIGNvbnN0IGNoYXIgKmNhdGVnb3J5X3RvX25hbWUgKGludCBjYXRlZ29yeSkgaW50ZXJuYWxfZnVuY3Rpb247CisjZW5kaWYKKworCisvKiBGb3IgdGhvc2UgbG9vc2luZyBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgYGFsbG9jYScgd2UgaGF2ZSB0byBhZGQKKyAgIHNvbWUgYWRkaXRpb25hbCBjb2RlIGVtdWxhdGluZyBpdC4gICovCisjaWZkZWYgSEFWRV9BTExPQ0EKKy8qIE5vdGhpbmcgaGFzIHRvIGJlIGRvbmUuICAqLworIyBkZWZpbmUgZnJlZWEocCkgLyogbm90aGluZyAqLworIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHJlc3MpIC8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpIC8qIG5vdGhpbmcgKi8KKyNlbHNlCitzdHJ1Y3QgYmxvY2tfbGlzdAoreworICB2b2lkICphZGRyZXNzOworICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV4dDsKK307CisjIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcikJCQkJCQkgICAgICBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgc3RydWN0IGJsb2NrX2xpc3QgKm5ld3AgPSAoc3RydWN0IGJsb2NrX2xpc3QgKikgbWFsbG9jIChzaXplb2YgKCpuZXdwKSk7ICBcCisgICAgLyogSWYgd2UgY2Fubm90IGdldCBhIGZyZWUgYmxvY2sgd2UgY2Fubm90IGFkZCB0aGUgbmV3IGVsZW1lbnQgdG8JICAgICAgXAorICAgICAgIHRoZSBsaXN0LiAgKi8JCQkJCQkJICAgICAgXAorICAgIGlmIChuZXdwICE9IE5VTEwpIHsJCQkJCQkJICAgICAgXAorICAgICAgbmV3cC0+YWRkcmVzcyA9IChhZGRyKTsJCQkJCQkgICAgICBcCisgICAgICBuZXdwLT5uZXh0ID0gKGxpc3QpOwkJCQkJCSAgICAgIFwKKyAgICAgIChsaXN0KSA9IG5ld3A7CQkJCQkJCSAgICAgIFwKKyAgICB9CQkJCQkJCQkJICAgICAgXAorICB9IHdoaWxlICgwKQorIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkJCQkJCQkgICAgICBcCisgIGRvIHsJCQkJCQkJCQkgICAgICBcCisgICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkgewkJCQkJCSAgICAgIFwKKyAgICAgIHN0cnVjdCBibG9ja19saXN0ICpvbGQgPSBsaXN0OwkJCQkJICAgICAgXAorICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CQkJCQkJICAgICAgXAorICAgICAgZnJlZSAob2xkLT5hZGRyZXNzKTsJCQkJCQkgICAgICBcCisgICAgICBmcmVlIChvbGQpOwkJCQkJCQkgICAgICBcCisgICAgfQkJCQkJCQkJCSAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyMgdW5kZWYgYWxsb2NhCisjIGRlZmluZSBhbGxvY2Eoc2l6ZSkgKG1hbGxvYyAoc2l6ZSkpCisjIGRlZmluZSBmcmVlYShwKSBmcmVlIChwKQorI2VuZGlmCS8qIGhhdmUgYWxsb2NhICovCisKKworI2lmZGVmIF9MSUJDCisvKiBMaXN0IG9mIGJsb2NrcyBhbGxvY2F0ZWQgZm9yIHRyYW5zbGF0aW9ucy4gICovCit0eXBlZGVmIHN0cnVjdCB0cmFuc21lbV9saXN0Cit7CisgIHN0cnVjdCB0cmFuc21lbV9saXN0ICpuZXh0OworICBjaGFyIGRhdGFbWkVST107Cit9IHRyYW5zbWVtX2Jsb2NrX3Q7CitzdGF0aWMgc3RydWN0IHRyYW5zbWVtX2xpc3QgKnRyYW5zbWVtX2xpc3Q7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHRyYW5zbWVtX2Jsb2NrX3Q7CisjZW5kaWYKKworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKyAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIERDSUdFVFRFWFQgX19kY2lnZXR0ZXh0CisjZWxzZQorIyBkZWZpbmUgRENJR0VUVEVYVCBsaWJpbnRsX2RjaWdldHRleHQKKyNlbmRpZgorCisvKiBMb2NrIHZhcmlhYmxlIHRvIHByb3RlY3QgdGhlIGdsb2JhbCBkYXRhIGluIHRoZSBnZXR0ZXh0IGltcGxlbWVudGF0aW9uLiAgKi8KKyNpZmRlZiBfTElCQworX19saWJjX3J3bG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQgKCwgX25sX3N0YXRlX2xvY2sgYXR0cmlidXRlX2hpZGRlbikKKyNlbmRpZgorCisvKiBDaGVja2luZyB3aGV0aGVyIHRoZSBiaW5hcmllcyBydW5zIFNVSUQgbXVzdCBiZSBkb25lIGFuZCBnbGliYyBwcm92aWRlcworICAgZWFzaWVyIG1ldGhvZHMgdGhlcmVmb3JlIHdlIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBFTkFCTEVfU0VDVVJFIF9fbGliY19lbmFibGVfc2VjdXJlCisjIGRlZmluZSBERVRFUk1JTkVfU0VDVVJFCisjZWxzZQorIyBpZm5kZWYgSEFWRV9HRVRVSUQKKyMgIGRlZmluZSBnZXR1aWQoKSAwCisjIGVuZGlmCisjIGlmbmRlZiBIQVZFX0dFVEdJRAorIyAgZGVmaW5lIGdldGdpZCgpIDAKKyMgZW5kaWYKKyMgaWZuZGVmIEhBVkVfR0VURVVJRAorIyAgZGVmaW5lIGdldGV1aWQoKSBnZXR1aWQoKQorIyBlbmRpZgorIyBpZm5kZWYgSEFWRV9HRVRFR0lECisjICBkZWZpbmUgZ2V0ZWdpZCgpIGdldGdpZCgpCisjIGVuZGlmCitzdGF0aWMgaW50IGVuYWJsZV9zZWN1cmU7CisjIGRlZmluZSBFTkFCTEVfU0VDVVJFIChlbmFibGVfc2VjdXJlID09IDEpCisjIGRlZmluZSBERVRFUk1JTkVfU0VDVVJFIFwKKyAgaWYgKGVuYWJsZV9zZWN1cmUgPT0gMCkJCQkJCQkgICAgICBcCisgICAgewkJCQkJCQkJCSAgICAgIFwKKyAgICAgIGlmIChnZXR1aWQgKCkgIT0gZ2V0ZXVpZCAoKSB8fCBnZXRnaWQgKCkgIT0gZ2V0ZWdpZCAoKSkJCSAgICAgIFwKKwllbmFibGVfc2VjdXJlID0gMTsJCQkJCQkgICAgICBcCisgICAgICBlbHNlCQkJCQkJCQkgICAgICBcCisJZW5hYmxlX3NlY3VyZSA9IC0xOwkJCQkJCSAgICAgIFwKKyAgICB9CisjZW5kaWYKKworLyogR2V0IHRoZSBmdW5jdGlvbiB0byBldmFsdWF0ZSB0aGUgcGx1cmFsIGV4cHJlc3Npb24uICAqLworI2luY2x1ZGUgImV2YWwtcGx1cmFsLmgiCisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAorICAgQ0FURUdPUlkgbG9jYWxlIGFuZCwgaWYgUExVUkFMIGlzIG5vbnplcm8sIHNlYXJjaCBvdmVyIHN0cmluZworICAgZGVwZW5kaW5nIG9uIHRoZSBwbHVyYWwgZm9ybSBkZXRlcm1pbmVkIGJ5IE4uICAqLworY2hhciAqCitEQ0lHRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwKKwkgICAgaW50IHBsdXJhbCwgdW5zaWduZWQgbG9uZyBpbnQgbiwgaW50IGNhdGVnb3J5KQoreworI2lmbmRlZiBIQVZFX0FMTE9DQQorICBzdHJ1Y3QgYmxvY2tfbGlzdCAqYmxvY2tfbGlzdCA9IE5VTEw7CisjZW5kaWYKKyAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluOworICBzdHJ1Y3QgYmluZGluZyAqYmluZGluZzsKKyAgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lOworICBjb25zdCBjaGFyICpjYXRlZ29yeXZhbHVlOworICBjaGFyICpkaXJuYW1lLCAqeGRvbWFpbm5hbWU7CisgIGNoYXIgKnNpbmdsZV9sb2NhbGU7CisgIGNoYXIgKnJldHZhbDsKKyAgc2l6ZV90IHJldGxlbjsKKyAgaW50IHNhdmVkX2Vycm5vOworI2lmIGRlZmluZWQgSEFWRV9UU0VBUkNIIHx8IGRlZmluZWQgX0xJQkMKKyAgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKnNlYXJjaDsKKyAgc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKipmb3VuZHAgPSBOVUxMOworICBzaXplX3QgbXNnaWRfbGVuOworI2VuZGlmCisgIHNpemVfdCBkb21haW5uYW1lX2xlbjsKKworICAvKiBJZiBubyByZWFsIE1TR0lEIGlzIGdpdmVuIHJldHVybiBOVUxMLiAgKi8KKyAgaWYgKG1zZ2lkMSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisjaWZkZWYgX0xJQkMKKyAgaWYgKGNhdGVnb3J5IDwgMCB8fCBjYXRlZ29yeSA+PSBfX0xDX0xBU1QgfHwgY2F0ZWdvcnkgPT0gTENfQUxMKQorICAgIC8qIEJvZ3VzLiAgKi8KKyAgICByZXR1cm4gKHBsdXJhbCA9PSAwCisJICAgID8gKGNoYXIgKikgbXNnaWQxCisJICAgIC8qIFVzZSB0aGUgR2VybWFuaWMgcGx1cmFsIHJ1bGUuICAqLworCSAgICA6IG4gPT0gMSA/IChjaGFyICopIG1zZ2lkMSA6IChjaGFyICopIG1zZ2lkMik7CisjZW5kaWYKKworICBfX2xpYmNfcndsb2NrX3JkbG9jayAoX25sX3N0YXRlX2xvY2spOworCisgIC8qIElmIERPTUFJTk5BTUUgaXMgTlVMTCwgd2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGRlZmF1bHQgZG9tYWluLiAgSWYKKyAgICAgQ0FURUdPUlkgaXMgbm90IExDX01FU1NBR0VTIHRoaXMgbWlnaHQgbm90IG1ha2UgbXVjaCBzZW5zZSBidXQgdGhlCisgICAgIGRlZmluaXRpb24gbGVmdCB0aGlzIHVuZGVmaW5lZC4gICovCisgIGlmIChkb21haW5uYW1lID09IE5VTEwpCisgICAgZG9tYWlubmFtZSA9IF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOworCisgIC8qIE9TLzIgc3BlY2lmaWM6IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBsaWJpbnRsIHZlcnNpb25zICAqLworI2lmZGVmIExDX01FU1NBR0VTX0NPTVBBVAorICBpZiAoY2F0ZWdvcnkgPT0gTENfTUVTU0FHRVNfQ09NUEFUKQorICAgIGNhdGVnb3J5ID0gTENfTUVTU0FHRVM7CisjZW5kaWYKKworI2lmIGRlZmluZWQgSEFWRV9UU0VBUkNIIHx8IGRlZmluZWQgX0xJQkMKKyAgbXNnaWRfbGVuID0gc3RybGVuIChtc2dpZDEpICsgMTsKKworICAvKiBUcnkgdG8gZmluZCB0aGUgdHJhbnNsYXRpb24gYW1vbmcgdGhvc2Ugd2hpY2ggd2UgZm91bmQgYXQKKyAgICAgc29tZSB0aW1lLiAgKi8KKyAgc2VhcmNoID0gKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICopCisJICAgYWxsb2NhIChvZmZzZXRvZiAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QsIG1zZ2lkKSArIG1zZ2lkX2xlbik7CisgIG1lbWNweSAoc2VhcmNoLT5tc2dpZCwgbXNnaWQxLCBtc2dpZF9sZW4pOworICBzZWFyY2gtPmRvbWFpbm5hbWUgPSAoY2hhciAqKSBkb21haW5uYW1lOworICBzZWFyY2gtPmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisKKyAgZm91bmRwID0gKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90ICoqKSB0ZmluZCAoc2VhcmNoLCAmcm9vdCwgdHJhbnNjbXApOworICBmcmVlYSAoc2VhcmNoKTsKKyAgaWYgKGZvdW5kcCAhPSBOVUxMICYmICgqZm91bmRwKS0+Y291bnRlciA9PSBfbmxfbXNnX2NhdF9jbnRyKQorICAgIHsKKyAgICAgIC8qIE5vdyBkZWFsIHdpdGggcGx1cmFsLiAgKi8KKyAgICAgIGlmIChwbHVyYWwpCisJcmV0dmFsID0gcGx1cmFsX2xvb2t1cCAoKCpmb3VuZHApLT5kb21haW4sIG4sICgqZm91bmRwKS0+dHJhbnNsYXRpb24sCisJCQkJKCpmb3VuZHApLT50cmFuc2xhdGlvbl9sZW5ndGgpOworICAgICAgZWxzZQorCXJldHZhbCA9IChjaGFyICopICgqZm91bmRwKS0+dHJhbnNsYXRpb247CisKKyAgICAgIF9fbGliY19yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyNlbmRpZgorCisgIC8qIFByZXNlcnZlIHRoZSBgZXJybm8nIHZhbHVlLiAgKi8KKyAgc2F2ZWRfZXJybm8gPSBlcnJubzsKKworICAvKiBTZWUgd2hldGhlciB0aGlzIGlzIGEgU1VJRCBiaW5hcnkgb3Igbm90LiAgKi8KKyAgREVURVJNSU5FX1NFQ1VSRTsKKworICAvKiBGaXJzdCBmaW5kIG1hdGNoaW5nIGJpbmRpbmcuICAqLworICBmb3IgKGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOyBiaW5kaW5nICE9IE5VTEw7IGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0KQorICAgIHsKKyAgICAgIGludCBjb21wYXJlID0gc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5kb21haW5uYW1lKTsKKyAgICAgIGlmIChjb21wYXJlID09IDApCisJLyogV2UgZm91bmQgaXQhICAqLworCWJyZWFrOworICAgICAgaWYgKGNvbXBhcmUgPCAwKQorCXsKKwkgIC8qIEl0IGlzIG5vdCBpbiB0aGUgbGlzdC4gICovCisJICBiaW5kaW5nID0gTlVMTDsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYgKGJpbmRpbmcgPT0gTlVMTCkKKyAgICBkaXJuYW1lID0gKGNoYXIgKikgSU5UVVNFKF9ubF9kZWZhdWx0X2Rpcm5hbWUpOworICBlbHNlIGlmIChJU19BQlNPTFVURV9QQVRIIChiaW5kaW5nLT5kaXJuYW1lKSkKKyAgICBkaXJuYW1lID0gYmluZGluZy0+ZGlybmFtZTsKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoLiAgTWFrZSBpdCBhYnNvbHV0ZSBub3cuICAqLworICAgICAgc2l6ZV90IGRpcm5hbWVfbGVuID0gc3RybGVuIChiaW5kaW5nLT5kaXJuYW1lKSArIDE7CisgICAgICBzaXplX3QgcGF0aF9tYXg7CisgICAgICBjaGFyICpyZXQ7CisKKyAgICAgIHBhdGhfbWF4ID0gKHVuc2lnbmVkIGludCkgUEFUSF9NQVg7CisgICAgICBwYXRoX21heCArPSAyOwkJLyogVGhlIGdldGN3ZCBkb2NzIHNheSB0byBkbyB0aGlzLiAgKi8KKworICAgICAgZm9yICg7OykKKwl7CisJICBkaXJuYW1lID0gKGNoYXIgKikgYWxsb2NhIChwYXRoX21heCArIGRpcm5hbWVfbGVuKTsKKwkgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgZGlybmFtZSk7CisKKwkgIF9fc2V0X2Vycm5vICgwKTsKKwkgIHJldCA9IGdldGN3ZCAoZGlybmFtZSwgcGF0aF9tYXgpOworCSAgaWYgKHJldCAhPSBOVUxMIHx8IGVycm5vICE9IEVSQU5HRSkKKwkgICAgYnJlYWs7CisKKwkgIHBhdGhfbWF4ICs9IHBhdGhfbWF4IC8gMjsKKwkgIHBhdGhfbWF4ICs9IFBBVEhfSU5DUjsKKwl9CisKKyAgICAgIGlmIChyZXQgPT0gTlVMTCkKKwkvKiBXZSBjYW5ub3QgZ2V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgRG9uJ3Qgc2lnbmFsIGFuCisJICAgZXJyb3IgYnV0IHNpbXBseSByZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nLiAgKi8KKwlnb3RvIHJldHVybl91bnRyYW5zbGF0ZWQ7CisKKyAgICAgIHN0cGNweSAoc3RwY3B5IChzdHJjaHIgKGRpcm5hbWUsICdcMCcpLCAiLyIpLCBiaW5kaW5nLT5kaXJuYW1lKTsKKyAgICB9CisKKyAgLyogTm93IGRldGVybWluZSB0aGUgc3ltYm9saWMgbmFtZSBvZiBDQVRFR09SWSBhbmQgaXRzIHZhbHVlLiAgKi8KKyAgY2F0ZWdvcnluYW1lID0gY2F0ZWdvcnlfdG9fbmFtZSAoY2F0ZWdvcnkpOworICBjYXRlZ29yeXZhbHVlID0gZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgKGNhdGVnb3J5LCBjYXRlZ29yeW5hbWUpOworCisgIGRvbWFpbm5hbWVfbGVuID0gc3RybGVuIChkb21haW5uYW1lKTsKKyAgeGRvbWFpbm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoY2F0ZWdvcnluYW1lKQorCQkJCSArIGRvbWFpbm5hbWVfbGVuICsgNSk7CisgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgeGRvbWFpbm5hbWUpOworCisgIHN0cGNweSAobWVtcGNweSAoc3RwY3B5IChzdHBjcHkgKHhkb21haW5uYW1lLCBjYXRlZ29yeW5hbWUpLCAiLyIpLAorCQkgIGRvbWFpbm5hbWUsIGRvbWFpbm5hbWVfbGVuKSwKKwkgICIubW8iKTsKKworICAvKiBDcmVhdGluZyB3b3JraW5nIGFyZWEuICAqLworICBzaW5nbGVfbG9jYWxlID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGNhdGVnb3J5dmFsdWUpICsgMSk7CisgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgc2luZ2xlX2xvY2FsZSk7CisKKworICAvKiBTZWFyY2ggZm9yIHRoZSBnaXZlbiBzdHJpbmcuICBUaGlzIGlzIGEgbG9vcCBiZWNhdXNlIHdlIHBlcmhhcHMKKyAgICAgZ290IGFuIG9yZGVyZWQgbGlzdCBvZiBsYW5ndWFnZXMgdG8gY29uc2lkZXIgZm9yIHRoZSB0cmFuc2xhdGlvbi4gICovCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIC8qIE1ha2UgQ0FURUdPUllWQUxVRSBwb2ludCB0byB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZSBsaXN0LiAgKi8KKyAgICAgIHdoaWxlIChjYXRlZ29yeXZhbHVlWzBdICE9ICdcMCcgJiYgY2F0ZWdvcnl2YWx1ZVswXSA9PSAnOicpCisJKytjYXRlZ29yeXZhbHVlOworICAgICAgaWYgKGNhdGVnb3J5dmFsdWVbMF0gPT0gJ1wwJykKKwl7CisJICAvKiBUaGUgd2hvbGUgY29udGVudHMgb2YgQ0FURUdPUllWQUxVRSBoYXMgYmVlbiBzZWFyY2hlZCBidXQKKwkgICAgIG5vIHZhbGlkIGVudHJ5IGhhcyBiZWVuIGZvdW5kLiAgV2Ugc29sdmUgdGhpcyBzaXR1YXRpb24KKwkgICAgIGJ5IGltcGxpY2l0bHkgYXBwZW5kaW5nIGEgIkMiIGVudHJ5LCBpLmUuIG5vIHRyYW5zbGF0aW9uCisJICAgICB3aWxsIHRha2UgcGxhY2UuICAqLworCSAgc2luZ2xlX2xvY2FsZVswXSA9ICdDJzsKKwkgIHNpbmdsZV9sb2NhbGVbMV0gPSAnXDAnOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBjaGFyICpjcCA9IHNpbmdsZV9sb2NhbGU7CisJICB3aGlsZSAoY2F0ZWdvcnl2YWx1ZVswXSAhPSAnXDAnICYmIGNhdGVnb3J5dmFsdWVbMF0gIT0gJzonKQorCSAgICAqY3ArKyA9ICpjYXRlZ29yeXZhbHVlKys7CisJICAqY3AgPSAnXDAnOworCisJICAvKiBXaGVuIHRoaXMgaXMgYSBTVUlEIGJpbmFyeSB3ZSBtdXN0IG5vdCBhbGxvdyBhY2Nlc3NpbmcgZmlsZXMKKwkgICAgIG91dHNpZGUgdGhlIGRlZGljYXRlZCBkaXJlY3Rvcmllcy4gICovCisJICBpZiAoRU5BQkxFX1NFQ1VSRSAmJiBJU19QQVRIX1dJVEhfRElSIChzaW5nbGVfbG9jYWxlKSkKKwkgICAgLyogSW5nb3JlIHRoaXMgZW50cnkuICAqLworCSAgICBjb250aW51ZTsKKwl9CisKKyAgICAgIC8qIElmIHRoZSBjdXJyZW50IGxvY2FsZSB2YWx1ZSBpcyBDIChvciBQT1NJWCkgd2UgZG9uJ3QgbG9hZCBhCisJIGRvbWFpbi4gIFJldHVybiB0aGUgTVNHSUQuICAqLworICAgICAgaWYgKHN0cmNtcCAoc2luZ2xlX2xvY2FsZSwgIkMiKSA9PSAwCisJICB8fCBzdHJjbXAgKHNpbmdsZV9sb2NhbGUsICJQT1NJWCIpID09IDApCisJYnJlYWs7CisKKyAgICAgIC8qIEZpbmQgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZyBtYXRjaGluZyB0aGUKKwkgRE9NQUlOTkFNRSBhbmQgQ0FURUdPUlkuICAqLworICAgICAgZG9tYWluID0gX25sX2ZpbmRfZG9tYWluIChkaXJuYW1lLCBzaW5nbGVfbG9jYWxlLCB4ZG9tYWlubmFtZSwgYmluZGluZyk7CisKKyAgICAgIGlmIChkb21haW4gIT0gTlVMTCkKKwl7CisJICByZXR2YWwgPSBfbmxfZmluZF9tc2cgKGRvbWFpbiwgYmluZGluZywgbXNnaWQxLCAmcmV0bGVuKTsKKworCSAgaWYgKHJldHZhbCA9PSBOVUxMKQorCSAgICB7CisJICAgICAgaW50IGNudDsKKworCSAgICAgIGZvciAoY250ID0gMDsgZG9tYWluLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKKwkJeworCQkgIHJldHZhbCA9IF9ubF9maW5kX21zZyAoZG9tYWluLT5zdWNjZXNzb3JbY250XSwgYmluZGluZywKKwkJCQkJIG1zZ2lkMSwgJnJldGxlbik7CisKKwkJICBpZiAocmV0dmFsICE9IE5VTEwpCisJCSAgICB7CisJCSAgICAgIGRvbWFpbiA9IGRvbWFpbi0+c3VjY2Vzc29yW2NudF07CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgaWYgKHJldHZhbCAhPSBOVUxMKQorCSAgICB7CisJICAgICAgLyogRm91bmQgdGhlIHRyYW5zbGF0aW9uIG9mIE1TR0lEMSBpbiBkb21haW4gRE9NQUlOOgorCQkgc3RhcnRpbmcgYXQgUkVUVkFMLCBSRVRMRU4gYnl0ZXMuICAqLworCSAgICAgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKKyNpZiBkZWZpbmVkIEhBVkVfVFNFQVJDSCB8fCBkZWZpbmVkIF9MSUJDCisJICAgICAgaWYgKGZvdW5kcCA9PSBOVUxMKQorCQl7CisJCSAgLyogQ3JlYXRlIGEgbmV3IGVudHJ5IGFuZCBhZGQgaXQgdG8gdGhlIHNlYXJjaCB0cmVlLiAgKi8KKwkJICBzdHJ1Y3Qga25vd25fdHJhbnNsYXRpb25fdCAqbmV3cDsKKworCQkgIG5ld3AgPSAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKikKKwkJICAgIG1hbGxvYyAob2Zmc2V0b2YgKHN0cnVjdCBrbm93bl90cmFuc2xhdGlvbl90LCBtc2dpZCkKKwkJCSAgICArIG1zZ2lkX2xlbiArIGRvbWFpbm5hbWVfbGVuICsgMSk7CisJCSAgaWYgKG5ld3AgIT0gTlVMTCkKKwkJICAgIHsKKwkJICAgICAgbmV3cC0+ZG9tYWlubmFtZSA9CisJCQltZW1wY3B5IChuZXdwLT5tc2dpZCwgbXNnaWQxLCBtc2dpZF9sZW4pOworCQkgICAgICBtZW1jcHkgKG5ld3AtPmRvbWFpbm5hbWUsIGRvbWFpbm5hbWUsIGRvbWFpbm5hbWVfbGVuICsgMSk7CisJCSAgICAgIG5ld3AtPmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisJCSAgICAgIG5ld3AtPmNvdW50ZXIgPSBfbmxfbXNnX2NhdF9jbnRyOworCQkgICAgICBuZXdwLT5kb21haW4gPSBkb21haW47CisJCSAgICAgIG5ld3AtPnRyYW5zbGF0aW9uID0gcmV0dmFsOworCQkgICAgICBuZXdwLT50cmFuc2xhdGlvbl9sZW5ndGggPSByZXRsZW47CisKKwkJICAgICAgLyogSW5zZXJ0IHRoZSBlbnRyeSBpbiB0aGUgc2VhcmNoIHRyZWUuICAqLworCQkgICAgICBmb3VuZHAgPSAoc3RydWN0IGtub3duX3RyYW5zbGF0aW9uX3QgKiopCisJCQl0c2VhcmNoIChuZXdwLCAmcm9vdCwgdHJhbnNjbXApOworCQkgICAgICBpZiAoZm91bmRwID09IE5VTEwKKwkJCSAgfHwgX19idWlsdGluX2V4cGVjdCAoKmZvdW5kcCAhPSBuZXdwLCAwKSkKKwkJCS8qIFRoZSBpbnNlcnQgZmFpbGVkLiAgKi8KKwkJCWZyZWUgKG5ld3ApOworCQkgICAgfQorCQl9CisJICAgICAgZWxzZQorCQl7CisJCSAgLyogV2UgY2FuIHVwZGF0ZSB0aGUgZXhpc3RpbmcgZW50cnkuICAqLworCQkgICgqZm91bmRwKS0+Y291bnRlciA9IF9ubF9tc2dfY2F0X2NudHI7CisJCSAgKCpmb3VuZHApLT5kb21haW4gPSBkb21haW47CisJCSAgKCpmb3VuZHApLT50cmFuc2xhdGlvbiA9IHJldHZhbDsKKwkJICAoKmZvdW5kcCktPnRyYW5zbGF0aW9uX2xlbmd0aCA9IHJldGxlbjsKKwkJfQorI2VuZGlmCisJICAgICAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKKworCSAgICAgIC8qIE5vdyBkZWFsIHdpdGggcGx1cmFsLiAgKi8KKwkgICAgICBpZiAocGx1cmFsKQorCQlyZXR2YWwgPSBwbHVyYWxfbG9va3VwIChkb21haW4sIG4sIHJldHZhbCwgcmV0bGVuKTsKKworCSAgICAgIF9fbGliY19yd2xvY2tfdW5sb2NrIChfbmxfc3RhdGVfbG9jayk7CisJICAgICAgcmV0dXJuIHJldHZhbDsKKwkgICAgfQorCX0KKyAgICB9CisKKyByZXR1cm5fdW50cmFuc2xhdGVkOgorICAvKiBSZXR1cm4gdGhlIHVudHJhbnNsYXRlZCBNU0dJRC4gICovCisgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKKyAgX19saWJjX3J3bG9ja191bmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKKyNpZm5kZWYgX0xJQkMKKyAgaWYgKCFFTkFCTEVfU0VDVVJFKQorICAgIHsKKyAgICAgIGV4dGVybiB2b2lkIF9ubF9sb2dfdW50cmFuc2xhdGVkIChjb25zdCBjaGFyICpsb2dmaWxlbmFtZSwKKwkJCQkJY29uc3QgY2hhciAqZG9tYWlubmFtZSwKKwkJCQkJY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsCisJCQkJCWludCBwbHVyYWwpOworICAgICAgY29uc3QgY2hhciAqbG9nZmlsZW5hbWUgPSBnZXRlbnYgKCJHRVRURVhUX0xPR19VTlRSQU5TTEFURUQiKTsKKworICAgICAgaWYgKGxvZ2ZpbGVuYW1lICE9IE5VTEwgJiYgbG9nZmlsZW5hbWVbMF0gIT0gJ1wwJykKKwlfbmxfbG9nX3VudHJhbnNsYXRlZCAobG9nZmlsZW5hbWUsIGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCBwbHVyYWwpOworICAgIH0KKyNlbmRpZgorICBfX3NldF9lcnJubyAoc2F2ZWRfZXJybm8pOworICByZXR1cm4gKHBsdXJhbCA9PSAwCisJICA/IChjaGFyICopIG1zZ2lkMQorCSAgLyogVXNlIHRoZSBHZXJtYW5pYyBwbHVyYWwgcnVsZS4gICovCisJICA6IG4gPT0gMSA/IChjaGFyICopIG1zZ2lkMSA6IChjaGFyICopIG1zZ2lkMik7Cit9CisKKworY2hhciAqCitpbnRlcm5hbF9mdW5jdGlvbgorX25sX2ZpbmRfbXNnIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKKwkgICAgICBzdHJ1Y3QgYmluZGluZyAqZG9tYWluYmluZGluZywgY29uc3QgY2hhciAqbXNnaWQsCisJICAgICAgc2l6ZV90ICpsZW5ndGhwKQoreworICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluOworICBubHNfdWludDMyIG5zdHJpbmdzOworICBzaXplX3QgYWN0OworICBjaGFyICpyZXN1bHQ7CisgIHNpemVfdCByZXN1bHRsZW47CisKKyAgaWYgKGRvbWFpbl9maWxlLT5kZWNpZGVkID09IDApCisgICAgX25sX2xvYWRfZG9tYWluIChkb21haW5fZmlsZSwgZG9tYWluYmluZGluZyk7CisKKyAgaWYgKGRvbWFpbl9maWxlLT5kYXRhID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZG9tYWluID0gKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIGRvbWFpbl9maWxlLT5kYXRhOworCisgIG5zdHJpbmdzID0gZG9tYWluLT5uc3RyaW5nczsKKworICAvKiBMb2NhdGUgdGhlIE1TR0lEIGFuZCBpdHMgdHJhbnNsYXRpb24uICAqLworICBpZiAoZG9tYWluLT5oYXNoX3RhYiAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFVzZSB0aGUgaGFzaGluZyB0YWJsZS4gICovCisgICAgICBubHNfdWludDMyIGxlbiA9IHN0cmxlbiAobXNnaWQpOworICAgICAgbmxzX3VpbnQzMiBoYXNoX3ZhbCA9IGhhc2hfc3RyaW5nIChtc2dpZCk7CisgICAgICBubHNfdWludDMyIGlkeCA9IGhhc2hfdmFsICUgZG9tYWluLT5oYXNoX3NpemU7CisgICAgICBubHNfdWludDMyIGluY3IgPSAxICsgKGhhc2hfdmFsICUgKGRvbWFpbi0+aGFzaF9zaXplIC0gMikpOworCisgICAgICB3aGlsZSAoMSkKKwl7CisJICBubHNfdWludDMyIG5zdHIgPQorCSAgICBXIChkb21haW4tPm11c3Rfc3dhcF9oYXNoX3RhYiwgZG9tYWluLT5oYXNoX3RhYltpZHhdKTsKKworCSAgaWYgKG5zdHIgPT0gMCkKKwkgICAgLyogSGFzaCB0YWJsZSBlbnRyeSBpcyBlbXB0eS4gICovCisJICAgIHJldHVybiBOVUxMOworCisJICBuc3RyLS07CisKKwkgIC8qIENvbXBhcmUgbXNnaWQgd2l0aCB0aGUgb3JpZ2luYWwgc3RyaW5nIGF0IGluZGV4IG5zdHIuCisJICAgICBXZSBjb21wYXJlIHRoZSBsZW5ndGhzIHdpdGggPj0sIG5vdCA9PSwgYmVjYXVzZSBwbHVyYWwgZW50cmllcworCSAgICAgYXJlIHJlcHJlc2VudGVkIGJ5IHN0cmluZ3Mgd2l0aCBhbiBlbWJlZGRlZCBOVUwuICAqLworCSAgaWYgKG5zdHIgPCBuc3RyaW5ncworCSAgICAgID8gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+b3JpZ190YWJbbnN0cl0ubGVuZ3RoKSA+PSBsZW4KKwkJJiYgKHN0cmNtcCAobXNnaWQsCisJCQkgICAgZG9tYWluLT5kYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCisJCQkJCSAgICAgIGRvbWFpbi0+b3JpZ190YWJbbnN0cl0ub2Zmc2V0KSkKKwkJICAgID09IDApCisJICAgICAgOiBkb21haW4tPm9yaWdfc3lzZGVwX3RhYltuc3RyIC0gbnN0cmluZ3NdLmxlbmd0aCA+IGxlbgorCQkmJiAoc3RyY21wIChtc2dpZCwKKwkJCSAgICBkb21haW4tPm9yaWdfc3lzZGVwX3RhYltuc3RyIC0gbnN0cmluZ3NdLnBvaW50ZXIpCisJCSAgICA9PSAwKSkKKwkgICAgeworCSAgICAgIGFjdCA9IG5zdHI7CisJICAgICAgZ290byBmb3VuZDsKKwkgICAgfQorCisJICBpZiAoaWR4ID49IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcikKKwkgICAgaWR4IC09IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcjsKKwkgIGVsc2UKKwkgICAgaWR4ICs9IGluY3I7CisJfQorICAgICAgLyogTk9UUkVBQ0hFRCAqLworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFRyeSB0aGUgZGVmYXVsdCBtZXRob2Q6ICBiaW5hcnkgc2VhcmNoIGluIHRoZSBzb3J0ZWQgYXJyYXkgb2YKKwkgbWVzc2FnZXMuICAqLworICAgICAgc2l6ZV90IHRvcCwgYm90dG9tOworCisgICAgICBib3R0b20gPSAwOworICAgICAgdG9wID0gbnN0cmluZ3M7CisgICAgICB3aGlsZSAoYm90dG9tIDwgdG9wKQorCXsKKwkgIGludCBjbXBfdmFsOworCisJICBhY3QgPSAoYm90dG9tICsgdG9wKSAvIDI7CisJICBjbXBfdmFsID0gc3RyY21wIChtc2dpZCwgKGRvbWFpbi0+ZGF0YQorCQkJCSAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAorCQkJCQkgZG9tYWluLT5vcmlnX3RhYlthY3RdLm9mZnNldCkpKTsKKwkgIGlmIChjbXBfdmFsIDwgMCkKKwkgICAgdG9wID0gYWN0OworCSAgZWxzZSBpZiAoY21wX3ZhbCA+IDApCisJICAgIGJvdHRvbSA9IGFjdCArIDE7CisJICBlbHNlCisJICAgIGdvdG8gZm91bmQ7CisJfQorICAgICAgLyogTm8gdHJhbnNsYXRpb24gd2FzIGZvdW5kLiAgKi8KKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworIGZvdW5kOgorICAvKiBUaGUgdHJhbnNsYXRpb24gd2FzIGZvdW5kIGF0IGluZGV4IEFDVC4gIElmIHdlIGhhdmUgdG8gY29udmVydCB0aGUKKyAgICAgc3RyaW5nIHRvIHVzZSBhIGRpZmZlcmVudCBjaGFyYWN0ZXIgc2V0LCB0aGlzIGlzIHRoZSB0aW1lLiAgKi8KKyAgaWYgKGFjdCA8IG5zdHJpbmdzKQorICAgIHsKKyAgICAgIHJlc3VsdCA9IChjaGFyICopCisJKGRvbWFpbi0+ZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPnRyYW5zX3RhYlthY3RdLm9mZnNldCkpOworICAgICAgcmVzdWx0bGVuID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+dHJhbnNfdGFiW2FjdF0ubGVuZ3RoKSArIDE7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgcmVzdWx0ID0gKGNoYXIgKikgZG9tYWluLT50cmFuc19zeXNkZXBfdGFiW2FjdCAtIG5zdHJpbmdzXS5wb2ludGVyOworICAgICAgcmVzdWx0bGVuID0gZG9tYWluLT50cmFuc19zeXNkZXBfdGFiW2FjdCAtIG5zdHJpbmdzXS5sZW5ndGg7CisgICAgfQorCisjaWYgZGVmaW5lZCBfTElCQyB8fCBIQVZFX0lDT05WCisgIGlmIChkb21haW4tPmNvZGVzZXRfY250cgorICAgICAgIT0gKGRvbWFpbmJpbmRpbmcgIT0gTlVMTCA/IGRvbWFpbmJpbmRpbmctPmNvZGVzZXRfY250ciA6IDApKQorICAgIHsKKyAgICAgIC8qIFRoZSBkb21haW4ncyBjb2Rlc2V0IGhhcyBjaGFuZ2VkIHRocm91Z2ggYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQoKQorCSBzaW5jZSB0aGUgbWVzc2FnZSBjYXRhbG9nIHdhcyBpbml0aWFsaXplZCBvciBsYXN0IGFjY2Vzc2VkLiAgV2UKKwkgaGF2ZSB0byByZWluaXRpYWxpemUgdGhlIGNvbnZlcnRlci4gICovCisgICAgICBfbmxfZnJlZV9kb21haW5fY29udiAoZG9tYWluKTsKKyAgICAgIF9ubF9pbml0X2RvbWFpbl9jb252IChkb21haW5fZmlsZSwgZG9tYWluLCBkb21haW5iaW5kaW5nKTsKKyAgICB9CisKKyAgaWYgKAorIyBpZmRlZiBfTElCQworICAgICAgZG9tYWluLT5jb252ICE9IChfX2djb252X3QpIC0xCisjIGVsc2UKKyMgIGlmIEhBVkVfSUNPTlYKKyAgICAgIGRvbWFpbi0+Y29udiAhPSAoaWNvbnZfdCkgLTEKKyMgIGVuZGlmCisjIGVuZGlmCisgICAgICApCisgICAgeworICAgICAgLyogV2UgYXJlIHN1cHBvc2VkIHRvIGRvIGEgY29udmVyc2lvbi4gIEZpcnN0IGFsbG9jYXRlIGFuCisJIGFwcHJvcHJpYXRlIHRhYmxlIHdpdGggdGhlIHNhbWUgc3RydWN0dXJlIGFzIHRoZSB0YWJsZQorCSBvZiB0cmFuc2xhdGlvbnMgaW4gdGhlIGZpbGUsIHdoZXJlIHdlIGNhbiBwdXQgdGhlIHBvaW50ZXJzCisJIHRvIHRoZSBjb252ZXJ0ZWQgc3RyaW5ncyBpbi4KKwkgVGhlcmUgaXMgYSBzbGlnaHQgY29tcGxpY2F0aW9uIHdpdGggcGx1cmFsIGVudHJpZXMuICBUaGV5CisJIGFyZSByZXByZXNlbnRlZCBieSBjb25zZWN1dGl2ZSBOVUwgdGVybWluYXRlZCBzdHJpbmdzLiAgV2UKKwkgaGFuZGxlIHRoaXMgY2FzZSBieSBjb252ZXJ0aW5nIFJFU1VMVExFTiBieXRlcywgaW5jbHVkaW5nCisJIE5VTHMuICAqLworCisgICAgICBpZiAoZG9tYWluLT5jb252X3RhYiA9PSBOVUxMCisJICAmJiAoKGRvbWFpbi0+Y29udl90YWIgPQorCQkgKGNoYXIgKiopIGNhbGxvYyAobnN0cmluZ3MgKyBkb21haW4tPm5fc3lzZGVwX3N0cmluZ3MsCisJCQkJICAgc2l6ZW9mIChjaGFyICopKSkKKwkgICAgICA9PSBOVUxMKSkKKwkvKiBNYXJrIHRoYXQgd2UgZGlkbid0IHN1Y2NlZWQgYWxsb2NhdGluZyBhIHRhYmxlLiAgKi8KKwlkb21haW4tPmNvbnZfdGFiID0gKGNoYXIgKiopIC0xOworCisgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAoZG9tYWluLT5jb252X3RhYiA9PSAoY2hhciAqKikgLTEsIDApKQorCS8qIE5vdGhpbmcgd2UgY2FuIGRvLCBubyBtb3JlIG1lbW9yeS4gICovCisJZ290byBjb252ZXJ0ZWQ7CisKKyAgICAgIGlmIChkb21haW4tPmNvbnZfdGFiW2FjdF0gPT0gTlVMTCkKKwl7CisJICAvKiBXZSBoYXZlbid0IHVzZWQgdGhpcyBzdHJpbmcgc28gZmFyLCBzbyBpdCBpcyBub3QKKwkgICAgIHRyYW5zbGF0ZWQgeWV0LiAgRG8gdGhpcyBub3cuICAqLworCSAgLyogV2UgdXNlIGEgYml0IG1vcmUgZWZmaWNpZW50IG1lbW9yeSBoYW5kbGluZy4KKwkgICAgIFdlIGFsbG9jYXRlIGFsd2F5cyBsYXJnZXIgYmxvY2tzIHdoaWNoIGdldCB1c2VkIG92ZXIKKwkgICAgIHRpbWUuICBUaGlzIGlzIGZhc3RlciB0aGFuIG1hbnkgc21hbGwgYWxsb2NhdGlvbnMuICAgKi8KKwkgIF9fbGliY19sb2NrX2RlZmluZV9pbml0aWFsaXplZCAoc3RhdGljLCBsb2NrKQorIyBkZWZpbmUgSU5JVElBTF9CTE9DS19TSVpFCTQwODAKKwkgIHN0YXRpYyB1bnNpZ25lZCBjaGFyICpmcmVlbWVtOworCSAgc3RhdGljIHNpemVfdCBmcmVlbWVtX3NpemU7CisKKwkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluYnVmOworCSAgdW5zaWduZWQgY2hhciAqb3V0YnVmOworCSAgaW50IG1hbGxvY19jb3VudDsKKyMgaWZuZGVmIF9MSUJDCisJICB0cmFuc21lbV9ibG9ja190ICp0cmFuc21lbV9saXN0ID0gTlVMTDsKKyMgZW5kaWYKKworCSAgX19saWJjX2xvY2tfbG9jayAobG9jayk7CisKKwkgIGluYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcmVzdWx0OworCSAgb3V0YnVmID0gZnJlZW1lbSArIHNpemVvZiAoc2l6ZV90KTsKKworCSAgbWFsbG9jX2NvdW50ID0gMDsKKwkgIHdoaWxlICgxKQorCSAgICB7CisJICAgICAgdHJhbnNtZW1fYmxvY2tfdCAqbmV3bWVtOworIyBpZmRlZiBfTElCQworCSAgICAgIHNpemVfdCBub25fcmV2ZXJzaWJsZTsKKwkgICAgICBpbnQgcmVzOworCisJICAgICAgaWYgKGZyZWVtZW1fc2l6ZSA8IHNpemVvZiAoc2l6ZV90KSkKKwkJZ290byByZXNpemVfZnJlZW1lbTsKKworCSAgICAgIHJlcyA9IF9fZ2NvbnYgKGRvbWFpbi0+Y29udiwKKwkJCSAgICAgJmluYnVmLCBpbmJ1ZiArIHJlc3VsdGxlbiwKKwkJCSAgICAgJm91dGJ1ZiwKKwkJCSAgICAgb3V0YnVmICsgZnJlZW1lbV9zaXplIC0gc2l6ZW9mIChzaXplX3QpLAorCQkJICAgICAmbm9uX3JldmVyc2libGUpOworCisJICAgICAgaWYgKHJlcyA9PSBfX0dDT05WX09LIHx8IHJlcyA9PSBfX0dDT05WX0VNUFRZX0lOUFVUKQorCQlicmVhazsKKworCSAgICAgIGlmIChyZXMgIT0gX19HQ09OVl9GVUxMX09VVFBVVCkKKwkJeworCQkgIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7CisJCSAgZ290byBjb252ZXJ0ZWQ7CisJCX0KKworCSAgICAgIGluYnVmID0gcmVzdWx0OworIyBlbHNlCisjICBpZiBIQVZFX0lDT05WCisJICAgICAgY29uc3QgY2hhciAqaW5wdHIgPSAoY29uc3QgY2hhciAqKSBpbmJ1ZjsKKwkgICAgICBzaXplX3QgaW5sZWZ0ID0gcmVzdWx0bGVuOworCSAgICAgIGNoYXIgKm91dHB0ciA9IChjaGFyICopIG91dGJ1ZjsKKwkgICAgICBzaXplX3Qgb3V0bGVmdDsKKworCSAgICAgIGlmIChmcmVlbWVtX3NpemUgPCBzaXplb2YgKHNpemVfdCkpCisJCWdvdG8gcmVzaXplX2ZyZWVtZW07CisKKwkgICAgICBvdXRsZWZ0ID0gZnJlZW1lbV9zaXplIC0gc2l6ZW9mIChzaXplX3QpOworCSAgICAgIGlmIChpY29udiAoZG9tYWluLT5jb252LAorCQkJIChJQ09OVl9DT05TVCBjaGFyICoqKSAmaW5wdHIsICZpbmxlZnQsCisJCQkgJm91dHB0ciwgJm91dGxlZnQpCisJCSAgIT0gKHNpemVfdCkgKC0xKSkKKwkJeworCQkgIG91dGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIG91dHB0cjsKKwkJICBicmVhazsKKwkJfQorCSAgICAgIGlmIChlcnJubyAhPSBFMkJJRykKKwkJeworCQkgIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7CisJCSAgZ290byBjb252ZXJ0ZWQ7CisJCX0KKyMgIGVuZGlmCisjIGVuZGlmCisKKwkgICAgcmVzaXplX2ZyZWVtZW06CisJICAgICAgLyogV2UgbXVzdCBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgb3IgcmVzaXplIHRoZSBvbGQgb25lLiAgKi8KKwkgICAgICBpZiAobWFsbG9jX2NvdW50ID4gMCkKKwkJeworCQkgICsrbWFsbG9jX2NvdW50OworCQkgIGZyZWVtZW1fc2l6ZSA9IG1hbGxvY19jb3VudCAqIElOSVRJQUxfQkxPQ0tfU0laRTsKKwkJICBuZXdtZW0gPSAodHJhbnNtZW1fYmxvY2tfdCAqKSByZWFsbG9jICh0cmFuc21lbV9saXN0LAorCQkJCQkJCSBmcmVlbWVtX3NpemUpOworIyBpZmRlZiBfTElCQworCQkgIGlmIChuZXdtZW0gIT0gTlVMTCkKKwkJICAgIHRyYW5zbWVtX2xpc3QgPSB0cmFuc21lbV9saXN0LT5uZXh0OworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgc3RydWN0IHRyYW5zbWVtX2xpc3QgKm9sZCA9IHRyYW5zbWVtX2xpc3Q7CisKKwkJICAgICAgdHJhbnNtZW1fbGlzdCA9IHRyYW5zbWVtX2xpc3QtPm5leHQ7CisJCSAgICAgIGZyZWUgKG9sZCk7CisJCSAgICB9CisjIGVuZGlmCisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBtYWxsb2NfY291bnQgPSAxOworCQkgIGZyZWVtZW1fc2l6ZSA9IElOSVRJQUxfQkxPQ0tfU0laRTsKKwkJICBuZXdtZW0gPSAodHJhbnNtZW1fYmxvY2tfdCAqKSBtYWxsb2MgKGZyZWVtZW1fc2l6ZSk7CisJCX0KKwkgICAgICBpZiAoX19idWlsdGluX2V4cGVjdCAobmV3bWVtID09IE5VTEwsIDApKQorCQl7CisJCSAgZnJlZW1lbSA9IE5VTEw7CisJCSAgZnJlZW1lbV9zaXplID0gMDsKKwkJICBfX2xpYmNfbG9ja191bmxvY2sgKGxvY2spOworCQkgIGdvdG8gY29udmVydGVkOworCQl9CisKKyMgaWZkZWYgX0xJQkMKKwkgICAgICAvKiBBZGQgdGhlIGJsb2NrIHRvIHRoZSBsaXN0IG9mIGJsb2NrcyB3ZSBoYXZlIHRvIGZyZWUKKyAgICAgICAgICAgICAgICAgYXQgc29tZSBwb2ludC4gICovCisJICAgICAgbmV3bWVtLT5uZXh0ID0gdHJhbnNtZW1fbGlzdDsKKwkgICAgICB0cmFuc21lbV9saXN0ID0gbmV3bWVtOworCisJICAgICAgZnJlZW1lbSA9IG5ld21lbS0+ZGF0YTsKKwkgICAgICBmcmVlbWVtX3NpemUgLT0gb2Zmc2V0b2YgKHN0cnVjdCB0cmFuc21lbV9saXN0LCBkYXRhKTsKKyMgZWxzZQorCSAgICAgIHRyYW5zbWVtX2xpc3QgPSBuZXdtZW07CisJICAgICAgZnJlZW1lbSA9IG5ld21lbTsKKyMgZW5kaWYKKworCSAgICAgIG91dGJ1ZiA9IGZyZWVtZW0gKyBzaXplb2YgKHNpemVfdCk7CisJICAgIH0KKworCSAgLyogV2UgaGF2ZSBub3cgaW4gb3VyIGJ1ZmZlciBhIGNvbnZlcnRlZCBzdHJpbmcuICBQdXQgdGhpcworCSAgICAgaW50byB0aGUgdGFibGUgb2YgY29udmVyc2lvbnMuICAqLworCSAgKihzaXplX3QgKikgZnJlZW1lbSA9IG91dGJ1ZiAtIGZyZWVtZW0gLSBzaXplb2YgKHNpemVfdCk7CisJICBkb21haW4tPmNvbnZfdGFiW2FjdF0gPSAoY2hhciAqKSBmcmVlbWVtOworCSAgLyogU2hyaW5rIGZyZWVtZW0sIGJ1dCBrZWVwIGl0IGFsaWduZWQuICAqLworCSAgZnJlZW1lbV9zaXplIC09IG91dGJ1ZiAtIGZyZWVtZW07CisJICBmcmVlbWVtID0gb3V0YnVmOworCSAgZnJlZW1lbSArPSBmcmVlbWVtX3NpemUgJiAoYWxpZ25vZiAoc2l6ZV90KSAtIDEpOworCSAgZnJlZW1lbV9zaXplID0gZnJlZW1lbV9zaXplICYgfiAoYWxpZ25vZiAoc2l6ZV90KSAtIDEpOworCisJICBfX2xpYmNfbG9ja191bmxvY2sgKGxvY2spOworCX0KKworICAgICAgLyogTm93IGRvbWFpbi0+Y29udl90YWJbYWN0XSBjb250YWlucyB0aGUgdHJhbnNsYXRpb24gb2YgYWxsCisJIHRoZSBwbHVyYWwgdmFyaWFudHMuICAqLworICAgICAgcmVzdWx0ID0gZG9tYWluLT5jb252X3RhYlthY3RdICsgc2l6ZW9mIChzaXplX3QpOworICAgICAgcmVzdWx0bGVuID0gKihzaXplX3QgKikgZG9tYWluLT5jb252X3RhYlthY3RdOworICAgIH0KKworIGNvbnZlcnRlZDoKKyAgLyogVGhlIHJlc3VsdCBzdHJpbmcgaXMgY29udmVydGVkLiAgKi8KKworI2VuZGlmIC8qIF9MSUJDIHx8IEhBVkVfSUNPTlYgKi8KKworICAqbGVuZ3RocCA9IHJlc3VsdGxlbjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBMb29rIHVwIGEgcGx1cmFsIHZhcmlhbnQuICAqLworc3RhdGljIGNoYXIgKgoraW50ZXJuYWxfZnVuY3Rpb24KK3BsdXJhbF9sb29rdXAgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBpbnQgbiwKKwkgICAgICAgY29uc3QgY2hhciAqdHJhbnNsYXRpb24sIHNpemVfdCB0cmFuc2xhdGlvbl9sZW4pCit7CisgIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW5kYXRhID0gKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIGRvbWFpbi0+ZGF0YTsKKyAgdW5zaWduZWQgbG9uZyBpbnQgaW5kZXg7CisgIGNvbnN0IGNoYXIgKnA7CisKKyAgaW5kZXggPSBwbHVyYWxfZXZhbCAoZG9tYWluZGF0YS0+cGx1cmFsLCBuKTsKKyAgaWYgKGluZGV4ID49IGRvbWFpbmRhdGEtPm5wbHVyYWxzKQorICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gIEl0IG1lYW5zIHRoZSBwbHVyYWwgZXhwcmVzc2lvbiBhbmQgdGhlCisgICAgICAgZ2l2ZW4gbWF4aW11bSB2YWx1ZSBkbyBub3QgbWF0Y2guICAqLworICAgIGluZGV4ID0gMDsKKworICAvKiBTa2lwIElOREVYIHN0cmluZ3MgYXQgVFJBTlNMQVRJT04uICAqLworICBwID0gdHJhbnNsYXRpb247CisgIHdoaWxlIChpbmRleC0tID4gMCkKKyAgICB7CisjaWZkZWYgX0xJQkMKKyAgICAgIHAgPSBfX3Jhd21lbWNociAocCwgJ1wwJyk7CisjZWxzZQorICAgICAgcCA9IHN0cmNociAocCwgJ1wwJyk7CisjZW5kaWYKKyAgICAgIC8qIEFuZCBza2lwIG92ZXIgdGhlIE5VTCBieXRlLiAgKi8KKyAgICAgIHArKzsKKworICAgICAgaWYgKHAgPj0gdHJhbnNsYXRpb24gKyB0cmFuc2xhdGlvbl9sZW4pCisJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgSXQgbWVhbnMgdGhlIHBsdXJhbCBleHByZXNzaW9uCisJICAgZXZhbHVhdGVkIHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiB2YXJpYW50cworCSAgIGF2YWlsYWJsZSBmb3IgTVNHSUQxLiAgKi8KKwlyZXR1cm4gKGNoYXIgKikgdHJhbnNsYXRpb247CisgICAgfQorICByZXR1cm4gKGNoYXIgKikgcDsKK30KKworI2lmbmRlZiBfTElCQworLyogUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBsb2NhbGUgQ0FURUdPUlkuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKgoraW50ZXJuYWxfZnVuY3Rpb24KK2NhdGVnb3J5X3RvX25hbWUgKGludCBjYXRlZ29yeSkKK3sKKyAgY29uc3QgY2hhciAqcmV0dmFsOworCisgIHN3aXRjaCAoY2F0ZWdvcnkpCisgIHsKKyNpZmRlZiBMQ19DT0xMQVRFCisgIGNhc2UgTENfQ09MTEFURToKKyAgICByZXR2YWwgPSAiTENfQ09MTEFURSI7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBMQ19DVFlQRQorICBjYXNlIExDX0NUWVBFOgorICAgIHJldHZhbCA9ICJMQ19DVFlQRSI7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBMQ19NT05FVEFSWQorICBjYXNlIExDX01PTkVUQVJZOgorICAgIHJldHZhbCA9ICJMQ19NT05FVEFSWSI7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBMQ19OVU1FUklDCisgIGNhc2UgTENfTlVNRVJJQzoKKyAgICByZXR2YWwgPSAiTENfTlVNRVJJQyI7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBMQ19USU1FCisgIGNhc2UgTENfVElNRToKKyAgICByZXR2YWwgPSAiTENfVElNRSI7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBMQ19NRVNTQUdFUworICBjYXNlIExDX01FU1NBR0VTOgorICAgIHJldHZhbCA9ICJMQ19NRVNTQUdFUyI7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBMQ19SRVNQT05TRQorICBjYXNlIExDX1JFU1BPTlNFOgorICAgIHJldHZhbCA9ICJMQ19SRVNQT05TRSI7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBMQ19BTEwKKyAgY2FzZSBMQ19BTEw6CisgICAgLyogVGhpcyBtaWdodCBub3QgbWFrZSBzZW5zZSBidXQgaXMgcGVyaGFwcyBiZXR0ZXIgdGhhbiBhbnkgb3RoZXIKKyAgICAgICB2YWx1ZS4gICovCisgICAgcmV0dmFsID0gIkxDX0FMTCI7CisgICAgYnJlYWs7CisjZW5kaWYKKyAgZGVmYXVsdDoKKyAgICAvKiBJZiB5b3UgaGF2ZSBhIGJldHRlciBpZGVhIGZvciBhIGRlZmF1bHQgdmFsdWUgbGV0IG1lIGtub3cuICAqLworICAgIHJldHZhbCA9ICJMQ19YWFgiOworICB9CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgorCisvKiBHdWVzcyB2YWx1ZSBvZiBjdXJyZW50IGxvY2FsZSBmcm9tIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKgoraW50ZXJuYWxfZnVuY3Rpb24KK2d1ZXNzX2NhdGVnb3J5X3ZhbHVlIChpbnQgY2F0ZWdvcnksIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSkKK3sKKyAgY29uc3QgY2hhciAqbGFuZ3VhZ2U7CisgIGNvbnN0IGNoYXIgKnJldHZhbDsKKworICAvKiBUaGUgaGlnaGVzdCBwcmlvcml0eSB2YWx1ZSBpcyB0aGUgYExBTkdVQUdFJyBlbnZpcm9ubWVudAorICAgICB2YXJpYWJsZS4gIEJ1dCB3ZSBkb24ndCB1c2UgdGhlIHZhbHVlIGlmIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKKyAgICAgbG9jYWxlIGlzIHRoZSBDIGxvY2FsZS4gIFRoaXMgaXMgYSBHTlUgZXh0ZW5zaW9uLiAgKi8KKyAgbGFuZ3VhZ2UgPSBnZXRlbnYgKCJMQU5HVUFHRSIpOworICBpZiAobGFuZ3VhZ2UgIT0gTlVMTCAmJiBsYW5ndWFnZVswXSA9PSAnXDAnKQorICAgIGxhbmd1YWdlID0gTlVMTDsKKworICAvKiBXZSBoYXZlIHRvIHByb2NlZWQgd2l0aCB0aGUgUE9TSVggbWV0aG9kcyBvZiBsb29raW5nIHRvIGBMQ19BTEwnLAorICAgICBgTENfeHh4JywgYW5kIGBMQU5HJy4gIE9uIHNvbWUgc3lzdGVtcyB0aGlzIGNhbiBiZSBkb25lIGJ5IHRoZQorICAgICBgc2V0bG9jYWxlJyBmdW5jdGlvbiBpdHNlbGYuICAqLworI2lmZGVmIF9MSUJDCisgIHJldHZhbCA9IF9fY3VycmVudF9sb2NhbGVfbmFtZSAoY2F0ZWdvcnkpOworI2Vsc2UKKyAgcmV0dmFsID0gX25sX2xvY2FsZV9uYW1lIChjYXRlZ29yeSwgY2F0ZWdvcnluYW1lKTsKKyNlbmRpZgorCisgIC8qIElnbm9yZSBMQU5HVUFHRSBpZiB0aGUgbG9jYWxlIGlzIHNldCB0byAiQyIgYmVjYXVzZQorICAgICAxLiAiQyIgbG9jYWxlIHVzdWFsbHkgdXNlcyB0aGUgQVNDSUkgZW5jb2RpbmcsIGFuZCBtb3N0IGludGVybmF0aW9uYWwKKwltZXNzYWdlcyB1c2Ugbm9uLUFTQ0lJIGNoYXJhY3RlcnMuIFRoZXNlIGNoYXJhY3RlcnMgZ2V0IGRpc3BsYXllZAorCWFzIHF1ZXN0aW9uIG1hcmtzIChpZiB1c2luZyBnbGliYydzIGljb252KCkpIG9yIGFzIGludmFsaWQgOC1iaXQKKwljaGFyYWN0ZXJzIChiZWNhdXNlIG90aGVyIGljb252KClzIHJlZnVzZSB0byBjb252ZXJ0IG1vc3Qgbm9uLUFTQ0lJCisJY2hhcmFjdGVycyB0byBBU0NJSSkuIEluIGFueSBjYXNlLCB0aGUgb3V0cHV0IGlzIHVnbHkuCisgICAgIDIuIFRoZSBwcmVjaXNlIG91dHB1dCBvZiBzb21lIHByb2dyYW1zIGluIHRoZSAiQyIgbG9jYWxlIGlzIHNwZWNpZmllZAorCWJ5IFBPU0lYIGFuZCBzaG91bGQgbm90IGRlcGVuZCBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbGlrZQorCSJMQU5HVUFHRSIuICBXZSBhbGxvdyBzdWNoIHByb2dyYW1zIHRvIHVzZSBnZXR0ZXh0KCkuICAqLworICByZXR1cm4gbGFuZ3VhZ2UgIT0gTlVMTCAmJiBzdHJjbXAgKHJldHZhbCwgIkMiKSAhPSAwID8gbGFuZ3VhZ2UgOiByZXR2YWw7Cit9CisKKy8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLworCisvKiBXZSBkb24ndCB3YW50IGxpYmludGwuYSB0byBkZXBlbmQgb24gYW55IG90aGVyIGxpYnJhcnkuICBTbyB3ZQorICAgYXZvaWQgdGhlIG5vbi1zdGFuZGFyZCBmdW5jdGlvbiBzdHBjcHkuICBJbiBHTlUgQyBMaWJyYXJ5IHRoaXMKKyAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgdGhvdWdoLiAgQWxzbyBhbGxvdyB0aGUgc3ltYm9sIEhBVkVfU1RQQ1BZCisgICB0byBiZSBkZWZpbmVkLiAgKi8KKyNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCitzdGF0aWMgY2hhciAqCitzdHBjcHkgKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKyAgd2hpbGUgKCgqZGVzdCsrID0gKnNyYysrKSAhPSAnXDAnKQorICAgIC8qIERvIG5vdGhpbmcuICovIDsKKyAgcmV0dXJuIGRlc3QgLSAxOworfQorI2VuZGlmCisKKyNpZiAhX0xJQkMgJiYgIUhBVkVfTUVNUENQWQorc3RhdGljIHZvaWQgKgorbWVtcGNweSAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKK3sKKyAgcmV0dXJuICh2b2lkICopICgoY2hhciAqKSBtZW1jcHkgKGRlc3QsIHNyYywgbikgKyBuKTsKK30KKyNlbmRpZgorCisKKyNpZmRlZiBfTElCQworLyogSWYgd2Ugd2FudCB0byBmcmVlIGFsbCByZXNvdXJjZXMgd2UgaGF2ZSB0byBkbyBzb21lIHdvcmsgYXQKKyAgIHByb2dyYW0ncyBlbmQuICAqLworbGliY19mcmVlcmVzX2ZuIChmcmVlX21lbSkKK3sKKyAgdm9pZCAqb2xkOworCisgIHdoaWxlIChfbmxfZG9tYWluX2JpbmRpbmdzICE9IE5VTEwpCisgICAgeworICAgICAgc3RydWN0IGJpbmRpbmcgKm9sZHAgPSBfbmxfZG9tYWluX2JpbmRpbmdzOworICAgICAgX25sX2RvbWFpbl9iaW5kaW5ncyA9IF9ubF9kb21haW5fYmluZGluZ3MtPm5leHQ7CisgICAgICBpZiAob2xkcC0+ZGlybmFtZSAhPSBJTlRVU0UoX25sX2RlZmF1bHRfZGlybmFtZSkpCisJLyogWWVzLCB0aGlzIGlzIGEgcG9pbnRlciBjb21wYXJpc29uLiAgKi8KKwlmcmVlIChvbGRwLT5kaXJuYW1lKTsKKyAgICAgIGZyZWUgKG9sZHAtPmNvZGVzZXQpOworICAgICAgZnJlZSAob2xkcCk7CisgICAgfQorCisgIGlmIChfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiAhPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikKKyAgICAvKiBZZXMsIGFnYWluIGEgcG9pbnRlciBjb21wYXJpc29uLiAgKi8KKyAgICBmcmVlICgoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbik7CisKKyAgLyogUmVtb3ZlIHRoZSBzZWFyY2ggdHJlZSB3aXRoIHRoZSBrbm93biB0cmFuc2xhdGlvbnMuICAqLworICBfX3RkZXN0cm95IChyb290LCBmcmVlKTsKKyAgcm9vdCA9IE5VTEw7CisKKyAgd2hpbGUgKHRyYW5zbWVtX2xpc3QgIT0gTlVMTCkKKyAgICB7CisgICAgICBvbGQgPSB0cmFuc21lbV9saXN0OworICAgICAgdHJhbnNtZW1fbGlzdCA9IHRyYW5zbWVtX2xpc3QtPm5leHQ7CisgICAgICBmcmVlIChvbGQpOworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2RjbmdldHRleHQuYyBiL3VuaXgvaW50bC9kY25nZXR0ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhM2UwOQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9kY25nZXR0ZXh0LmMKQEAgLTAsMCArMSw1NyBAQAorLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRjbmdldHRleHQoMykgZnVuY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImdldHRleHRQLmgiCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAibGliZ251aW50bC5oIgorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAorICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQorICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCisgICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBEQ05HRVRURVhUIF9fZGNuZ2V0dGV4dAorIyBkZWZpbmUgRENJR0VUVEVYVCBfX2RjaWdldHRleHQKKyNlbHNlCisjIGRlZmluZSBEQ05HRVRURVhUIGxpYmludGxfZGNuZ2V0dGV4dAorIyBkZWZpbmUgRENJR0VUVEVYVCBsaWJpbnRsX2RjaWdldHRleHQKKyNlbmRpZgorCisvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgQ0FURUdPUlkKKyAgIGxvY2FsZS4gICovCitjaGFyICoKK0RDTkdFVFRFWFQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCisJICAgIGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuLAorCSAgICBpbnQgY2F0ZWdvcnkpCit7CisgIHJldHVybiBEQ0lHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgMSwgbiwgY2F0ZWdvcnkpOworfQorCisjaWZkZWYgX0xJQkMKKy8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLword2Vha19hbGlhcyAoX19kY25nZXR0ZXh0LCBkY25nZXR0ZXh0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2RnZXR0ZXh0LmMgYi91bml4L2ludGwvZGdldHRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjRiMGY1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2RnZXR0ZXh0LmMKQEAgLTAsMCArMSw1OCBAQAorLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRnZXR0ZXh0KDMpIGZ1bmN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorCisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZWxzZQorIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisjZW5kaWYKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKyAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIERHRVRURVhUIF9fZGdldHRleHQKKyMgZGVmaW5lIERDR0VUVEVYVCBJTlRVU0UoX19kY2dldHRleHQpCisjZWxzZQorIyBkZWZpbmUgREdFVFRFWFQgbGliaW50bF9kZ2V0dGV4dAorIyBkZWZpbmUgRENHRVRURVhUIGxpYmludGxfZGNnZXR0ZXh0CisjZW5kaWYKKworLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgb2YgdGhlIGN1cnJlbnQKKyAgIExDX01FU1NBR0VTIGxvY2FsZS4gICovCitjaGFyICoKK0RHRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLCBjb25zdCBjaGFyICptc2dpZCkKK3sKKyAgcmV0dXJuIERDR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQsIExDX01FU1NBR0VTKTsKK30KKworI2lmZGVmIF9MSUJDCisvKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KK3dlYWtfYWxpYXMgKF9fZGdldHRleHQsIGRnZXR0ZXh0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2RuZ2V0dGV4dC5jIGIvdW5peC9pbnRsL2RuZ2V0dGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MTU2MzcKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvZG5nZXR0ZXh0LmMKQEAgLTAsMCArMSw1OSBAQAorLyogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRuZ2V0dGV4dCgzKSBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKworI2luY2x1ZGUgPGxvY2FsZS5oPgorCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2Vsc2UKKyMgaW5jbHVkZSAibGliZ251aW50bC5oIgorI2VuZGlmCisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAorICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQorICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCisgICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLworI2lmZGVmIF9MSUJDCisjIGRlZmluZSBETkdFVFRFWFQgX19kbmdldHRleHQKKyMgZGVmaW5lIERDTkdFVFRFWFQgX19kY25nZXR0ZXh0CisjZWxzZQorIyBkZWZpbmUgRE5HRVRURVhUIGxpYmludGxfZG5nZXR0ZXh0CisjIGRlZmluZSBEQ05HRVRURVhUIGxpYmludGxfZGNuZ2V0dGV4dAorI2VuZGlmCisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIG9mIHRoZSBjdXJyZW50CisgICBMQ19NRVNTQUdFUyBsb2NhbGUgYW5kIHNraXAgbWVzc2FnZSBhY2NvcmRpbmcgdG8gdGhlIHBsdXJhbCBmb3JtLiAgKi8KK2NoYXIgKgorRE5HRVRURVhUIChjb25zdCBjaGFyICpkb21haW5uYW1lLAorCSAgIGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuKQoreworICByZXR1cm4gRENOR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQxLCBtc2dpZDIsIG4sIExDX01FU1NBR0VTKTsKK30KKworI2lmZGVmIF9MSUJDCisvKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KK3dlYWtfYWxpYXMgKF9fZG5nZXR0ZXh0LCBkbmdldHRleHQpOworI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L2ludGwvZXZhbC1wbHVyYWwuaCBiL3VuaXgvaW50bC9ldmFsLXBsdXJhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYmQ1YWYKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvZXZhbC1wbHVyYWwuaApAQCAtMCwwICsxLDEwOCBAQAorLyogUGx1cmFsIGV4cHJlc3Npb24gZXZhbHVhdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBTVEFUSUMKKyNkZWZpbmUgU1RBVElDIHN0YXRpYworI2VuZGlmCisKKy8qIEV2YWx1YXRlIHRoZSBwbHVyYWwgZXhwcmVzc2lvbiBhbmQgcmV0dXJuIGFuIGluZGV4IHZhbHVlLiAgKi8KK1NUQVRJQwordW5zaWduZWQgbG9uZyBpbnQKK2ludGVybmFsX2Z1bmN0aW9uCitwbHVyYWxfZXZhbCAoc3RydWN0IGV4cHJlc3Npb24gKnBleHAsIHVuc2lnbmVkIGxvbmcgaW50IG4pCit7CisgIHN3aXRjaCAocGV4cC0+bmFyZ3MpCisgICAgeworICAgIGNhc2UgMDoKKyAgICAgIHN3aXRjaCAocGV4cC0+b3BlcmF0aW9uKQorCXsKKwljYXNlIHZhcjoKKwkgIHJldHVybiBuOworCWNhc2UgbnVtOgorCSAgcmV0dXJuIHBleHAtPnZhbC5udW07CisJZGVmYXVsdDoKKwkgIGJyZWFrOworCX0KKyAgICAgIC8qIE5PVFJFQUNIRUQgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIHsKKwkvKiBwZXhwLT5vcGVyYXRpb24gbXVzdCBiZSBsbm90LiAgKi8KKwl1bnNpZ25lZCBsb25nIGludCBhcmcgPSBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbMF0sIG4pOworCXJldHVybiAhIGFyZzsKKyAgICAgIH0KKyAgICBjYXNlIDI6CisgICAgICB7CisJdW5zaWduZWQgbG9uZyBpbnQgbGVmdGFyZyA9IHBsdXJhbF9ldmFsIChwZXhwLT52YWwuYXJnc1swXSwgbik7CisJaWYgKHBleHAtPm9wZXJhdGlvbiA9PSBsb3IpCisJICByZXR1cm4gbGVmdGFyZyB8fCBwbHVyYWxfZXZhbCAocGV4cC0+dmFsLmFyZ3NbMV0sIG4pOworCWVsc2UgaWYgKHBleHAtPm9wZXJhdGlvbiA9PSBsYW5kKQorCSAgcmV0dXJuIGxlZnRhcmcgJiYgcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzWzFdLCBuKTsKKwllbHNlCisJICB7CisJICAgIHVuc2lnbmVkIGxvbmcgaW50IHJpZ2h0YXJnID0gcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzWzFdLCBuKTsKKworCSAgICBzd2l0Y2ggKHBleHAtPm9wZXJhdGlvbikKKwkgICAgICB7CisJICAgICAgY2FzZSBtdWx0OgorCQlyZXR1cm4gbGVmdGFyZyAqIHJpZ2h0YXJnOworCSAgICAgIGNhc2UgZGl2aWRlOgorI2lmICFJTlRESVYwX1JBSVNFU19TSUdGUEUKKwkJaWYgKHJpZ2h0YXJnID09IDApCisJCSAgcmFpc2UgKFNJR0ZQRSk7CisjZW5kaWYKKwkJcmV0dXJuIGxlZnRhcmcgLyByaWdodGFyZzsKKwkgICAgICBjYXNlIG1vZHVsZToKKyNpZiAhSU5URElWMF9SQUlTRVNfU0lHRlBFCisJCWlmIChyaWdodGFyZyA9PSAwKQorCQkgIHJhaXNlIChTSUdGUEUpOworI2VuZGlmCisJCXJldHVybiBsZWZ0YXJnICUgcmlnaHRhcmc7CisJICAgICAgY2FzZSBwbHVzOgorCQlyZXR1cm4gbGVmdGFyZyArIHJpZ2h0YXJnOworCSAgICAgIGNhc2UgbWludXM6CisJCXJldHVybiBsZWZ0YXJnIC0gcmlnaHRhcmc7CisJICAgICAgY2FzZSBsZXNzX3RoYW46CisJCXJldHVybiBsZWZ0YXJnIDwgcmlnaHRhcmc7CisJICAgICAgY2FzZSBncmVhdGVyX3RoYW46CisJCXJldHVybiBsZWZ0YXJnID4gcmlnaHRhcmc7CisJICAgICAgY2FzZSBsZXNzX29yX2VxdWFsOgorCQlyZXR1cm4gbGVmdGFyZyA8PSByaWdodGFyZzsKKwkgICAgICBjYXNlIGdyZWF0ZXJfb3JfZXF1YWw6CisJCXJldHVybiBsZWZ0YXJnID49IHJpZ2h0YXJnOworCSAgICAgIGNhc2UgZXF1YWw6CisJCXJldHVybiBsZWZ0YXJnID09IHJpZ2h0YXJnOworCSAgICAgIGNhc2Ugbm90X2VxdWFsOgorCQlyZXR1cm4gbGVmdGFyZyAhPSByaWdodGFyZzsKKwkgICAgICBkZWZhdWx0OgorCQlicmVhazsKKwkgICAgICB9CisJICB9CisJLyogTk9UUkVBQ0hFRCAqLworCWJyZWFrOworICAgICAgfQorICAgIGNhc2UgMzoKKyAgICAgIHsKKwkvKiBwZXhwLT5vcGVyYXRpb24gbXVzdCBiZSBxbW9wLiAgKi8KKwl1bnNpZ25lZCBsb25nIGludCBib29sYXJnID0gcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzWzBdLCBuKTsKKwlyZXR1cm4gcGx1cmFsX2V2YWwgKHBleHAtPnZhbC5hcmdzW2Jvb2xhcmcgPyAxIDogMl0sIG4pOworICAgICAgfQorICAgIH0KKyAgLyogTk9UUkVBQ0hFRCAqLworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9leHBsb2RlbmFtZS5jIGIvdW5peC9pbnRsL2V4cGxvZGVuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjMjVlNwotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9leHBsb2RlbmFtZS5jCkBAIC0wLDAgKzEsMTg1IEBACisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCwgMjAwMC0yMDAxLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAibG9hZGluZm8uaCIKKworLyogT24gc29tZSBzdHJhbmdlIHN5c3RlbXMgc3RpbGwgbm8gZGVmaW5pdGlvbiBvZiBOVUxMIGlzIGZvdW5kLiAgU2lnaCEgICovCisjaWZuZGVmIE5VTEwKKyMgaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXworIyAgZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCisjIGVsc2UKKyMgIGRlZmluZSBOVUxMIDAKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKK2NoYXIgKgorX25sX2ZpbmRfbGFuZ3VhZ2UgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgIHdoaWxlIChuYW1lWzBdICE9ICdcMCcgJiYgbmFtZVswXSAhPSAnXycgJiYgbmFtZVswXSAhPSAnQCcKKwkgJiYgbmFtZVswXSAhPSAnKycgJiYgbmFtZVswXSAhPSAnLCcpCisgICAgKytuYW1lOworCisgIHJldHVybiAoY2hhciAqKSBuYW1lOworfQorCisKK2ludAorX25sX2V4cGxvZGVfbmFtZSAoY2hhciAqbmFtZSwKKwkJICBjb25zdCBjaGFyICoqbGFuZ3VhZ2UsIGNvbnN0IGNoYXIgKiptb2RpZmllciwKKwkJICBjb25zdCBjaGFyICoqdGVycml0b3J5LCBjb25zdCBjaGFyICoqY29kZXNldCwKKwkJICBjb25zdCBjaGFyICoqbm9ybWFsaXplZF9jb2Rlc2V0LCBjb25zdCBjaGFyICoqc3BlY2lhbCwKKwkJICBjb25zdCBjaGFyICoqc3BvbnNvciwgY29uc3QgY2hhciAqKnJldmlzaW9uKQoreworICBlbnVtIHsgdW5kZWNpZGVkLCB4cGcsIGNlbiB9IHN5bnRheDsKKyAgY2hhciAqY3A7CisgIGludCBtYXNrOworCisgICptb2RpZmllciA9IE5VTEw7CisgICp0ZXJyaXRvcnkgPSBOVUxMOworICAqY29kZXNldCA9IE5VTEw7CisgICpub3JtYWxpemVkX2NvZGVzZXQgPSBOVUxMOworICAqc3BlY2lhbCA9IE5VTEw7CisgICpzcG9uc29yID0gTlVMTDsKKyAgKnJldmlzaW9uID0gTlVMTDsKKworICAvKiBOb3cgd2UgZGV0ZXJtaW5lIHRoZSBzaW5nbGUgcGFydHMgb2YgdGhlIGxvY2FsZSBuYW1lLiAgRmlyc3QKKyAgICAgbG9vayBmb3IgdGhlIGxhbmd1YWdlLiAgVGVybWluYXRpb24gc3ltYm9scyBhcmUgYF8nIGFuZCBgQCcgaWYKKyAgICAgd2UgdXNlIFhQRzQgc3R5bGUsIGFuZCBgXycsIGArJywgYW5kIGAsJyBpZiB3ZSB1c2UgQ0VOIHN5bnRheC4gICovCisgIG1hc2sgPSAwOworICBzeW50YXggPSB1bmRlY2lkZWQ7CisgICpsYW5ndWFnZSA9IGNwID0gbmFtZTsKKyAgY3AgPSBfbmxfZmluZF9sYW5ndWFnZSAoKmxhbmd1YWdlKTsKKworICBpZiAoKmxhbmd1YWdlID09IGNwKQorICAgIC8qIFRoaXMgZG9lcyBub3QgbWFrZSBzZW5zZTogbGFuZ3VhZ2UgaGFzIHRvIGJlIHNwZWNpZmllZC4gIFVzZQorICAgICAgIHRoaXMgZW50cnkgYXMgaXQgaXMgd2l0aG91dCBleHBsb2RpbmcuICBQZXJoYXBzIGl0IGlzIGFuIGFsaWFzLiAgKi8KKyAgICBjcCA9IHN0cmNociAoKmxhbmd1YWdlLCAnXDAnKTsKKyAgZWxzZSBpZiAoY3BbMF0gPT0gJ18nKQorICAgIHsKKyAgICAgIC8qIE5leHQgaXMgdGhlIHRlcnJpdG9yeS4gICovCisgICAgICBjcFswXSA9ICdcMCc7CisgICAgICAqdGVycml0b3J5ID0gKytjcDsKKworICAgICAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJy4nICYmIGNwWzBdICE9ICdAJworCSAgICAgJiYgY3BbMF0gIT0gJysnICYmIGNwWzBdICE9ICcsJyAmJiBjcFswXSAhPSAnXycpCisJKytjcDsKKworICAgICAgbWFzayB8PSBURVJSSVRPUlk7CisKKyAgICAgIGlmIChjcFswXSA9PSAnLicpCisJeworCSAgLyogTmV4dCBpcyB0aGUgY29kZXNldC4gICovCisJICBzeW50YXggPSB4cGc7CisJICBjcFswXSA9ICdcMCc7CisJICAqY29kZXNldCA9ICsrY3A7CisKKwkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICdAJykKKwkgICAgKytjcDsKKworCSAgbWFzayB8PSBYUEdfQ09ERVNFVDsKKworCSAgaWYgKCpjb2Rlc2V0ICE9IGNwICYmICgqY29kZXNldClbMF0gIT0gJ1wwJykKKwkgICAgeworCSAgICAgICpub3JtYWxpemVkX2NvZGVzZXQgPSBfbmxfbm9ybWFsaXplX2NvZGVzZXQgKCpjb2Rlc2V0LAorCQkJCQkJCSAgIGNwIC0gKmNvZGVzZXQpOworCSAgICAgIGlmIChzdHJjbXAgKCpjb2Rlc2V0LCAqbm9ybWFsaXplZF9jb2Rlc2V0KSA9PSAwKQorCQlmcmVlICgoY2hhciAqKSAqbm9ybWFsaXplZF9jb2Rlc2V0KTsKKwkgICAgICBlbHNlCisJCW1hc2sgfD0gWFBHX05PUk1fQ09ERVNFVDsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKGNwWzBdID09ICdAJyB8fCAoc3ludGF4ICE9IHhwZyAmJiBjcFswXSA9PSAnKycpKQorICAgIHsKKyAgICAgIC8qIE5leHQgaXMgdGhlIG1vZGlmaWVyLiAgKi8KKyAgICAgIHN5bnRheCA9IGNwWzBdID09ICdAJyA/IHhwZyA6IGNlbjsKKyAgICAgIGNwWzBdID0gJ1wwJzsKKyAgICAgICptb2RpZmllciA9ICsrY3A7CisKKyAgICAgIHdoaWxlIChzeW50YXggPT0gY2VuICYmIGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJysnCisJICAgICAmJiBjcFswXSAhPSAnLCcgJiYgY3BbMF0gIT0gJ18nKQorCSsrY3A7CisKKyAgICAgIG1hc2sgfD0gWFBHX01PRElGSUVSIHwgQ0VOX0FVRElFTkNFOworICAgIH0KKworICBpZiAoc3ludGF4ICE9IHhwZyAmJiAoY3BbMF0gPT0gJysnIHx8IGNwWzBdID09ICcsJyB8fCBjcFswXSA9PSAnXycpKQorICAgIHsKKyAgICAgIHN5bnRheCA9IGNlbjsKKworICAgICAgaWYgKGNwWzBdID09ICcrJykKKwl7CisgCSAgLyogTmV4dCBpcyBzcGVjaWFsIGFwcGxpY2F0aW9uIChDRU4gc3ludGF4KS4gICovCisJICBjcFswXSA9ICdcMCc7CisJICAqc3BlY2lhbCA9ICsrY3A7CisKKwkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICcsJyAmJiBjcFswXSAhPSAnXycpCisJICAgICsrY3A7CisKKwkgIG1hc2sgfD0gQ0VOX1NQRUNJQUw7CisJfQorCisgICAgICBpZiAoY3BbMF0gPT0gJywnKQorCXsKKyAJICAvKiBOZXh0IGlzIHNwb25zb3IgKENFTiBzeW50YXgpLiAgKi8KKwkgIGNwWzBdID0gJ1wwJzsKKwkgICpzcG9uc29yID0gKytjcDsKKworCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJ18nKQorCSAgICArK2NwOworCisJICBtYXNrIHw9IENFTl9TUE9OU09SOworCX0KKworICAgICAgaWYgKGNwWzBdID09ICdfJykKKwl7CisgCSAgLyogTmV4dCBpcyByZXZpc2lvbiAoQ0VOIHN5bnRheCkuICAqLworCSAgY3BbMF0gPSAnXDAnOworCSAgKnJldmlzaW9uID0gKytjcDsKKworCSAgbWFzayB8PSBDRU5fUkVWSVNJT047CisJfQorICAgIH0KKworICAvKiBGb3IgQ0VOIHN5bnRheCB2YWx1ZXMgaXQgbWlnaHQgYmUgaW1wb3J0YW50IHRvIGhhdmUgdGhlCisgICAgIHNlcGFyYXRvciBjaGFyYWN0ZXIgaW4gdGhlIGZpbGUgbmFtZSwgbm90IGZvciBYUEcgc3ludGF4LiAgKi8KKyAgaWYgKHN5bnRheCA9PSB4cGcpCisgICAgeworICAgICAgaWYgKCp0ZXJyaXRvcnkgIT0gTlVMTCAmJiAoKnRlcnJpdG9yeSlbMF0gPT0gJ1wwJykKKwltYXNrICY9IH5URVJSSVRPUlk7CisKKyAgICAgIGlmICgqY29kZXNldCAhPSBOVUxMICYmICgqY29kZXNldClbMF0gPT0gJ1wwJykKKwltYXNrICY9IH5YUEdfQ09ERVNFVDsKKworICAgICAgaWYgKCptb2RpZmllciAhPSBOVUxMICYmICgqbW9kaWZpZXIpWzBdID09ICdcMCcpCisJbWFzayAmPSB+WFBHX01PRElGSUVSOworICAgIH0KKworICByZXR1cm4gbWFzazsKK30KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9maW5kZG9tYWluLmMgYi91bml4L2ludGwvZmluZGRvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OTJhOGMKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvZmluZGRvbWFpbi5jCkBAIC0wLDAgKzEsMTkyIEBACisvKiBIYW5kbGUgbGlzdCBvZiBuZWVkZWQgbWVzc2FnZSBjYXRhbG9ncworICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251Lm9yZz4sIDE5OTUuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKyNlbHNlCisjIGluY2x1ZGUgImxpYmdudWludGwuaCIKKyNlbmRpZgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisvKiBMaXN0IG9mIGFscmVhZHkgbG9hZGVkIGRvbWFpbnMuICAqLworc3RhdGljIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9ubF9sb2FkZWRfZG9tYWluczsKKworCisvKiBSZXR1cm4gYSBkYXRhIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGNhdGFsb2cgZGVzY3JpYmVkIGJ5CisgICB0aGUgRE9NQUlOTkFNRSBhbmQgQ0FURUdPUlkgcGFyYW1ldGVycyB3aXRoIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnRseQorICAgZXN0YWJsaXNoZWQgYmluZGluZ3MuICAqLworc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqCitpbnRlcm5hbF9mdW5jdGlvbgorX25sX2ZpbmRfZG9tYWluIChjb25zdCBjaGFyICpkaXJuYW1lLCBjaGFyICpsb2NhbGUsCisJCSBjb25zdCBjaGFyICpkb21haW5uYW1lLCBzdHJ1Y3QgYmluZGluZyAqZG9tYWluYmluZGluZykKK3sKKyAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqcmV0dmFsOworICBjb25zdCBjaGFyICpsYW5ndWFnZTsKKyAgY29uc3QgY2hhciAqbW9kaWZpZXI7CisgIGNvbnN0IGNoYXIgKnRlcnJpdG9yeTsKKyAgY29uc3QgY2hhciAqY29kZXNldDsKKyAgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0OworICBjb25zdCBjaGFyICpzcGVjaWFsOworICBjb25zdCBjaGFyICpzcG9uc29yOworICBjb25zdCBjaGFyICpyZXZpc2lvbjsKKyAgY29uc3QgY2hhciAqYWxpYXNfdmFsdWU7CisgIGludCBtYXNrOworCisgIC8qIExPQ0FMRSBjYW4gY29uc2lzdCBvZiB1cCB0byBmb3VyIHJlY29nbml6ZWQgcGFydHMgZm9yIHRoZSBYUEcgc3ludGF4OgorCisJCWxhbmd1YWdlW190ZXJyaXRvcnlbLmNvZGVzZXRdXVtAbW9kaWZpZXJdCisKKyAgICAgYW5kIHNpeCBwYXJ0cyBmb3IgdGhlIENFTiBzeW50YXg6CisKKwlsYW5ndWFnZVtfdGVycml0b3J5XVsrYXVkaWVuY2VdWytzcGVjaWFsXVssW3Nwb25zb3JdW19yZXZpc2lvbl1dCisKKyAgICAgQmVzaWRlIHRoZSBmaXJzdCBwYXJ0IGFsbCBvZiB0aGVtIGFyZSBhbGxvd2VkIHRvIGJlIG1pc3NpbmcuICBJZgorICAgICB0aGUgZnVsbCBzcGVjaWZpZWQgbG9jYWxlIGlzIG5vdCBmb3VuZCwgdGhlIGxlc3Mgc3BlY2lmaWMgb25lIGFyZQorICAgICBsb29rZWQgZm9yLiAgVGhlIHZhcmlvdXMgcGFydHMgd2lsbCBiZSBzdHJpcHBlZCBvZmYgYWNjb3JkaW5nIHRvCisgICAgIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisJCSgxKSByZXZpc2lvbgorCQkoMikgc3BvbnNvcgorCQkoMykgc3BlY2lhbAorCQkoNCkgY29kZXNldAorCQkoNSkgbm9ybWFsaXplZCBjb2Rlc2V0CisJCSg2KSB0ZXJyaXRvcnkKKwkJKDcpIGF1ZGllbmNlL21vZGlmaWVyCisgICAqLworCisgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSB0ZXN0ZWQgZm9yIHRoaXMgbG9jYWxlIGVudHJ5IHRoZXJlIGhhcyB0bworICAgICBiZSBvbmUgZGF0YSBzZXQgaW4gdGhlIGxpc3Qgb2YgbG9hZGVkIGRvbWFpbnMuICAqLworICByZXR2YWwgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKCZfbmxfbG9hZGVkX2RvbWFpbnMsIGRpcm5hbWUsCisJCQkgICAgICAgc3RybGVuIChkaXJuYW1lKSArIDEsIDAsIGxvY2FsZSwgTlVMTCwgTlVMTCwKKwkJCSAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBkb21haW5uYW1lLCAwKTsKKyAgaWYgKHJldHZhbCAhPSBOVUxMKQorICAgIHsKKyAgICAgIC8qIFdlIGtub3cgc29tZXRoaW5nIGFib3V0IHRoaXMgbG9jYWxlLiAgKi8KKyAgICAgIGludCBjbnQ7CisKKyAgICAgIGlmIChyZXR2YWwtPmRlY2lkZWQgPT0gMCkKKwlfbmxfbG9hZF9kb21haW4gKHJldHZhbCwgZG9tYWluYmluZGluZyk7CisKKyAgICAgIGlmIChyZXR2YWwtPmRhdGEgIT0gTlVMTCkKKwlyZXR1cm4gcmV0dmFsOworCisgICAgICBmb3IgKGNudCA9IDA7IHJldHZhbC0+c3VjY2Vzc29yW2NudF0gIT0gTlVMTDsgKytjbnQpCisJeworCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRlY2lkZWQgPT0gMCkKKwkgICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLCBkb21haW5iaW5kaW5nKTsKKworCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRhdGEgIT0gTlVMTCkKKwkgICAgYnJlYWs7CisJfQorICAgICAgcmV0dXJuIGNudCA+PSAwID8gcmV0dmFsIDogTlVMTDsKKyAgICAgIC8qIE5PVFJFQUNIRUQgKi8KKyAgICB9CisKKyAgLyogU2VlIHdoZXRoZXIgdGhlIGxvY2FsZSB2YWx1ZSBpcyBhbiBhbGlhcy4gIElmIHllcyBpdHMgdmFsdWUKKyAgICAgKm92ZXJ3cml0ZXMqIHRoZSBhbGlhcyBuYW1lLiAgTm8gdGVzdCBmb3IgdGhlIG9yaWdpbmFsIHZhbHVlIGlzCisgICAgIGRvbmUuICAqLworICBhbGlhc192YWx1ZSA9IF9ubF9leHBhbmRfYWxpYXMgKGxvY2FsZSk7CisgIGlmIChhbGlhc192YWx1ZSAhPSBOVUxMKQorICAgIHsKKyNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKKyAgICAgIGxvY2FsZSA9IHN0cmR1cCAoYWxpYXNfdmFsdWUpOworICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMKQorCXJldHVybiBOVUxMOworI2Vsc2UKKyAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGFsaWFzX3ZhbHVlKSArIDE7CisgICAgICBsb2NhbGUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7CisgICAgICBpZiAobG9jYWxlID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CisKKyAgICAgIG1lbWNweSAobG9jYWxlLCBhbGlhc192YWx1ZSwgbGVuKTsKKyNlbmRpZgorICAgIH0KKworICAvKiBOb3cgd2UgZGV0ZXJtaW5lIHRoZSBzaW5nbGUgcGFydHMgb2YgdGhlIGxvY2FsZSBuYW1lLiAgRmlyc3QKKyAgICAgbG9vayBmb3IgdGhlIGxhbmd1YWdlLiAgVGVybWluYXRpb24gc3ltYm9scyBhcmUgYF8nIGFuZCBgQCcgaWYKKyAgICAgd2UgdXNlIFhQRzQgc3R5bGUsIGFuZCBgXycsIGArJywgYW5kIGAsJyBpZiB3ZSB1c2UgQ0VOIHN5bnRheC4gICovCisgIG1hc2sgPSBfbmxfZXhwbG9kZV9uYW1lIChsb2NhbGUsICZsYW5ndWFnZSwgJm1vZGlmaWVyLCAmdGVycml0b3J5LAorCQkJICAgJmNvZGVzZXQsICZub3JtYWxpemVkX2NvZGVzZXQsICZzcGVjaWFsLAorCQkJICAgJnNwb25zb3IsICZyZXZpc2lvbik7CisKKyAgLyogQ3JlYXRlIGFsbCBwb3NzaWJsZSBsb2NhbGUgZW50cmllcyB3aGljaCBtaWdodCBiZSBpbnRlcmVzdGVkIGluCisgICAgIGdlbmVyYWxpemF0aW9uLiAgKi8KKyAgcmV0dmFsID0gX25sX21ha2VfbDEwbmZsaXN0ICgmX25sX2xvYWRlZF9kb21haW5zLCBkaXJuYW1lLAorCQkJICAgICAgIHN0cmxlbiAoZGlybmFtZSkgKyAxLCBtYXNrLCBsYW5ndWFnZSwgdGVycml0b3J5LAorCQkJICAgICAgIGNvZGVzZXQsIG5vcm1hbGl6ZWRfY29kZXNldCwgbW9kaWZpZXIsIHNwZWNpYWwsCisJCQkgICAgICAgc3BvbnNvciwgcmV2aXNpb24sIGRvbWFpbm5hbWUsIDEpOworICBpZiAocmV0dmFsID09IE5VTEwpCisgICAgLyogVGhpcyBtZWFucyB3ZSBhcmUgb3V0IG9mIGNvcmUuICAqLworICAgIHJldHVybiBOVUxMOworCisgIGlmIChyZXR2YWwtPmRlY2lkZWQgPT0gMCkKKyAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbCwgZG9tYWluYmluZGluZyk7CisgIGlmIChyZXR2YWwtPmRhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICBpbnQgY250OworICAgICAgZm9yIChjbnQgPSAwOyByZXR2YWwtPnN1Y2Nlc3NvcltjbnRdICE9IE5VTEw7ICsrY250KQorCXsKKwkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kZWNpZGVkID09IDApCisJICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLT5zdWNjZXNzb3JbY250XSwgZG9tYWluYmluZGluZyk7CisJICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGF0YSAhPSBOVUxMKQorCSAgICBicmVhazsKKwl9CisgICAgfQorCisgIC8qIFRoZSByb29tIGZvciBhbiBhbGlhcyB3YXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLiAgRnJlZSBpdCBub3cuICAqLworICBpZiAoYWxpYXNfdmFsdWUgIT0gTlVMTCkKKyAgICBmcmVlIChsb2NhbGUpOworCisgIC8qIFRoZSBzcGFjZSBmb3Igbm9ybWFsaXplZF9jb2Rlc2V0IGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gIEZyZWUgaXQuICAqLworICBpZiAobWFzayAmIFhQR19OT1JNX0NPREVTRVQpCisgICAgZnJlZSAoKHZvaWQgKikgbm9ybWFsaXplZF9jb2Rlc2V0KTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisKKyNpZmRlZiBfTElCQworbGliY19mcmVlcmVzX2ZuIChmcmVlX21lbSkKK3sKKyAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqcnVucCA9IF9ubF9sb2FkZWRfZG9tYWluczsKKworICB3aGlsZSAocnVucCAhPSBOVUxMKQorICAgIHsKKyAgICAgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmhlcmUgPSBydW5wOworICAgICAgaWYgKHJ1bnAtPmRhdGEgIT0gTlVMTCkKKwlfbmxfdW5sb2FkX2RvbWFpbiAoKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIHJ1bnAtPmRhdGEpOworICAgICAgcnVucCA9IHJ1bnAtPm5leHQ7CisgICAgICBmcmVlICgoY2hhciAqKSBoZXJlLT5maWxlbmFtZSk7CisgICAgICBmcmVlIChoZXJlKTsKKyAgICB9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9nZXR0ZXh0LmMgYi91bml4L2ludGwvZ2V0dGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzQyZmEKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvZ2V0dGV4dC5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qIEltcGxlbWVudGF0aW9uIG9mIGdldHRleHQoMykgZnVuY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpZmRlZiBfTElCQworIyBkZWZpbmUgX19uZWVkX05VTEwKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjZWxzZQorIyBpbmNsdWRlIDxzdGRsaWIuaD4JCS8qIEp1c3QgZm9yIE5VTEwuICAqLworI2VuZGlmCisKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKyNlbHNlCisjIGluY2x1ZGUgImxpYmdudWludGwuaCIKKyNlbmRpZgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKy8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKKyAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKKyAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXworICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KKyNpZmRlZiBfTElCQworIyBkZWZpbmUgR0VUVEVYVCBfX2dldHRleHQKKyMgZGVmaW5lIERDR0VUVEVYVCBJTlRVU0UoX19kY2dldHRleHQpCisjZWxzZQorIyBkZWZpbmUgR0VUVEVYVCBsaWJpbnRsX2dldHRleHQKKyMgZGVmaW5lIERDR0VUVEVYVCBsaWJpbnRsX2RjZ2V0dGV4dAorI2VuZGlmCisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50CisgICBMQ19NRVNTQUdFUyBsb2NhbGUuICBJZiBub3QgZm91bmQsIHJldHVybnMgTVNHSUQgaXRzZWxmICh0aGUgZGVmYXVsdAorICAgdGV4dCkuICAqLworY2hhciAqCitHRVRURVhUIChjb25zdCBjaGFyICptc2dpZCkKK3sKKyAgcmV0dXJuIERDR0VUVEVYVCAoTlVMTCwgbXNnaWQsIExDX01FU1NBR0VTKTsKK30KKworI2lmZGVmIF9MSUJDCisvKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KK3dlYWtfYWxpYXMgKF9fZ2V0dGV4dCwgZ2V0dGV4dCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9nZXR0ZXh0LmggYi91bml4L2ludGwvZ2V0dGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMjYyZjQKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvZ2V0dGV4dC5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qIENvbnZlbmllbmNlIGhlYWRlciBmb3IgY29uZGl0aW9uYWwgdXNlIG9mIEdOVSA8bGliaW50bC5oPi4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCAyMDAwLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIF9MSUJHRVRURVhUX0gKKyNkZWZpbmUgX0xJQkdFVFRFWFRfSCAxCisKKy8qIE5MUyBjYW4gYmUgZGlzYWJsZWQgdGhyb3VnaCB0aGUgY29uZmlndXJlIC0tZGlzYWJsZS1ubHMgb3B0aW9uLiAgKi8KKyNpZiBFTkFCTEVfTkxTCisKKy8qIEdldCBkZWNsYXJhdGlvbnMgb2YgR05VIG1lc3NhZ2UgY2F0YWxvZyBmdW5jdGlvbnMuICAqLworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisKKyNlbHNlCisKKy8qIFNvbGFyaXMgL3Vzci9pbmNsdWRlL2xvY2FsZS5oIGluY2x1ZGVzIC91c3IvaW5jbHVkZS9saWJpbnRsLmgsIHdoaWNoCisgICBjaG9rZXMgaWYgZGNnZXR0ZXh0IGlzIGRlZmluZWQgYXMgYSBtYWNyby4gIFNvIGluY2x1ZGUgaXQgbm93LCB0byBtYWtlCisgICBsYXRlciBpbmNsdXNpb25zIG9mIDxsb2NhbGUuaD4gYSBOT1AuICBXZSBkb24ndCBpbmNsdWRlIDxsaWJpbnRsLmg+CisgICBhcyB3ZWxsIGJlY2F1c2UgcGVvcGxlIHVzaW5nICJnZXR0ZXh0LmgiIHdpbGwgbm90IGluY2x1ZGUgPGxpYmludGwuaD4sCisgICBhbmQgYWxzbyBpbmNsdWRpbmcgPGxpYmludGwuaD4gd291bGQgZmFpbCBvbiBTdW5PUyA0LCB3aGVyZWFzIDxsb2NhbGUuaD4KKyAgIGlzIE9LLiAgKi8KKyNpZiBkZWZpbmVkKF9fc3VuKQorIyBpbmNsdWRlIDxsb2NhbGUuaD4KKyNlbmRpZgorCisvKiBEaXNhYmxlZCBOTFMuCisgICBUaGUgY2FzdHMgdG8gJ2NvbnN0IGNoYXIgKicgc2VydmUgdGhlIHB1cnBvc2Ugb2YgcHJvZHVjaW5nIHdhcm5pbmdzCisgICBmb3IgaW52YWxpZCB1c2VzIG9mIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZXNlIGZ1bmN0aW9ucy4KKyAgIE9uIHByZS1BTlNJIHN5c3RlbXMgd2l0aG91dCAnY29uc3QnLCB0aGUgY29uZmlnLmggZmlsZSBpcyBzdXBwb3NlZCB0bworICAgY29udGFpbiAiI2RlZmluZSBjb25zdCIuICAqLworIyBkZWZpbmUgZ2V0dGV4dChNc2dpZCkgKChjb25zdCBjaGFyICopIChNc2dpZCkpCisjIGRlZmluZSBkZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCkgKChjb25zdCBjaGFyICopIChNc2dpZCkpCisjIGRlZmluZSBkY2dldHRleHQoRG9tYWlubmFtZSwgTXNnaWQsIENhdGVnb3J5KSAoKGNvbnN0IGNoYXIgKikgKE1zZ2lkKSkKKyMgZGVmaW5lIG5nZXR0ZXh0KE1zZ2lkMSwgTXNnaWQyLCBOKSBcCisgICAgKChOKSA9PSAxID8gKGNvbnN0IGNoYXIgKikgKE1zZ2lkMSkgOiAoY29uc3QgY2hhciAqKSAoTXNnaWQyKSkKKyMgZGVmaW5lIGRuZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZDEsIE1zZ2lkMiwgTikgXAorICAgICgoTikgPT0gMSA/IChjb25zdCBjaGFyICopIChNc2dpZDEpIDogKGNvbnN0IGNoYXIgKikgKE1zZ2lkMikpCisjIGRlZmluZSBkY25nZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkMSwgTXNnaWQyLCBOLCBDYXRlZ29yeSkgXAorICAgICgoTikgPT0gMSA/IChjb25zdCBjaGFyICopIChNc2dpZDEpIDogKGNvbnN0IGNoYXIgKikgKE1zZ2lkMikpCisjIGRlZmluZSB0ZXh0ZG9tYWluKERvbWFpbm5hbWUpICgoY29uc3QgY2hhciAqKSAoRG9tYWlubmFtZSkpCisjIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW5uYW1lLCBEaXJuYW1lKSAoKGNvbnN0IGNoYXIgKikgKERpcm5hbWUpKQorIyBkZWZpbmUgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQoRG9tYWlubmFtZSwgQ29kZXNldCkgKChjb25zdCBjaGFyICopIChDb2Rlc2V0KSkKKworI2VuZGlmCisKKy8qIEEgcHNldWRvIGZ1bmN0aW9uIGNhbGwgdGhhdCBzZXJ2ZXMgYXMgYSBtYXJrZXIgZm9yIHRoZSBhdXRvbWF0ZWQKKyAgIGV4dHJhY3Rpb24gb2YgbWVzc2FnZXMsIGJ1dCBkb2VzIG5vdCBjYWxsIGdldHRleHQoKS4gIFRoZSBydW4tdGltZQorICAgdHJhbnNsYXRpb24gaXMgZG9uZSBhdCBhIGRpZmZlcmVudCBwbGFjZSBpbiB0aGUgY29kZS4KKyAgIFRoZSBhcmd1bWVudCwgU3RyaW5nLCBzaG91bGQgYmUgYSBsaXRlcmFsIHN0cmluZy4gIENvbmNhdGVuYXRlZCBzdHJpbmdzCisgICBhbmQgb3RoZXIgc3RyaW5nIGV4cHJlc3Npb25zIHdvbid0IHdvcmsuCisgICBUaGUgbWFjcm8ncyBleHBhbnNpb24gaXMgbm90IHBhcmVudGhlc2l6ZWQsIHNvIHRoYXQgaXQgaXMgc3VpdGFibGUgYXMKKyAgIGluaXRpYWxpemVyIGZvciBzdGF0aWMgJ2NoYXJbXScgb3IgJ2NvbnN0IGNoYXJbXScgdmFyaWFibGVzLiAgKi8KKyNkZWZpbmUgZ2V0dGV4dF9ub29wKFN0cmluZykgU3RyaW5nCisKKyNlbmRpZiAvKiBfTElCR0VUVEVYVF9IICovCmRpZmYgLS1naXQgYS91bml4L2ludGwvZ2V0dGV4dFAuaCBiL3VuaXgvaW50bC9nZXR0ZXh0UC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjZjM2QKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvZ2V0dGV4dFAuaApAQCAtMCwwICsxLDIxNSBAQAorLyogSGVhZGVyIGRlc2NyaWJpbmcgaW50ZXJuYWxzIG9mIGxpYmludGwgbGlicmFyeS4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfR0VUVEVYVFBfSAorI2RlZmluZSBfR0VUVEVYVFBfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CQkvKiBHZXQgc2l6ZV90LiAgKi8KKworI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgIi4uL2ljb252L2djb252X2ludC5oIgorI2Vsc2UKKyMgaWYgSEFWRV9JQ09OVgorIyAgaW5jbHVkZSA8aWNvbnYuaD4KKyMgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAibG9hZGluZm8uaCIKKworI2luY2x1ZGUgImdtby5oIgkJLyogR2V0IG5sc191aW50MzIuICAqLworCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKyNpZm5kZWYgaW50ZXJuYWxfZnVuY3Rpb24KKyMgZGVmaW5lIGludGVybmFsX2Z1bmN0aW9uCisjZW5kaWYKKworI2lmbmRlZiBhdHRyaWJ1dGVfaGlkZGVuCisjIGRlZmluZSBhdHRyaWJ1dGVfaGlkZGVuCisjZW5kaWYKKworLyogVGVsbCB0aGUgY29tcGlsZXIgd2hlbiBhIGNvbmRpdGlvbmFsIG9yIGludGVnZXIgZXhwcmVzc2lvbiBpcworICAgYWxtb3N0IGFsd2F5cyB0cnVlIG9yIGFsbW9zdCBhbHdheXMgZmFsc2UuICAqLworI2lmbmRlZiBIQVZFX0JVSUxUSU5fRVhQRUNUCisjIGRlZmluZSBfX2J1aWx0aW5fZXhwZWN0KGV4cHIsIHZhbCkgKGV4cHIpCisjZW5kaWYKKworI2lmbmRlZiBXCisjIGRlZmluZSBXKGZsYWcsIGRhdGEpICgoZmxhZykgPyBTV0FQIChkYXRhKSA6IChkYXRhKSkKKyNlbmRpZgorCisKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxieXRlc3dhcC5oPgorIyBkZWZpbmUgU1dBUChpKSBic3dhcF8zMiAoaSkKKyNlbHNlCitzdGF0aWMgaW5saW5lIG5sc191aW50MzIKK1NXQVAgKGkpCisgICAgIG5sc191aW50MzIgaTsKK3sKKyAgcmV0dXJuIChpIDw8IDI0KSB8ICgoaSAmIDB4ZmYwMCkgPDwgOCkgfCAoKGkgPj4gOCkgJiAweGZmMDApIHwgKGkgPj4gMjQpOworfQorI2VuZGlmCisKKworLyogSW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5nLiAgKi8KK3N0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MKK3sKKyAgLyogTGVuZ3RoIG9mIGFkZHJlc3NlZCBzdHJpbmcsIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLiAgKi8KKyAgc2l6ZV90IGxlbmd0aDsKKyAgLyogUG9pbnRlciB0byBhZGRyZXNzZWQgc3RyaW5nLiAgKi8KKyAgY29uc3QgY2hhciAqcG9pbnRlcjsKK307CisKKy8qIFRoZSByZXByZXNlbnRhdGlvbiBvZiBhbiBvcGVuZWQgbWVzc2FnZSBjYXRhbG9nLiAgKi8KK3N0cnVjdCBsb2FkZWRfZG9tYWluCit7CisgIC8qIFBvaW50ZXIgdG8gbWVtb3J5IGNvbnRhaW5pbmcgdGhlIC5tbyBmaWxlLiAgKi8KKyAgY29uc3QgY2hhciAqZGF0YTsKKyAgLyogMSBpZiB0aGUgbWVtb3J5IGlzIG1tYXAoKWVkLCAwIGlmIHRoZSBtZW1vcnkgaXMgbWFsbG9jKCllZC4gICovCisgIGludCB1c2VfbW1hcDsKKyAgLyogU2l6ZSBvZiBtbWFwKCllZCBtZW1vcnkuICAqLworICBzaXplX3QgbW1hcF9zaXplOworICAvKiAxIGlmIHRoZSAubW8gZmlsZSB1c2VzIGEgZGlmZmVyZW50IGVuZGlhbm5lc3MgdGhhbiB0aGlzIG1hY2hpbmUuICAqLworICBpbnQgbXVzdF9zd2FwOworICAvKiBQb2ludGVyIHRvIGFkZGl0aW9uYWwgbWFsbG9jKCllZCBtZW1vcnkuICAqLworICB2b2lkICptYWxsb2NlZDsKKworICAvKiBOdW1iZXIgb2Ygc3RhdGljIHN0cmluZ3MgcGFpcnMuICAqLworICBubHNfdWludDMyIG5zdHJpbmdzOworICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0b3JzIG9mIG9yaWdpbmFsIHN0cmluZ3MgaW4gdGhlIGZpbGUuICAqLworICBjb25zdCBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKm9yaWdfdGFiOworICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0b3JzIG9mIHRyYW5zbGF0ZWQgc3RyaW5ncyBpbiB0aGUgZmlsZS4gICovCisgIGNvbnN0IHN0cnVjdCBzdHJpbmdfZGVzYyAqdHJhbnNfdGFiOworCisgIC8qIE51bWJlciBvZiBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZ3MgcGFpcnMuICAqLworICBubHNfdWludDMyIG5fc3lzZGVwX3N0cmluZ3M7CisgIC8qIFBvaW50ZXIgdG8gZGVzY3JpcHRvcnMgb2Ygb3JpZ2luYWwgc3lzZGVwIHN0cmluZ3MuICAqLworICBjb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICpvcmlnX3N5c2RlcF90YWI7CisgIC8qIFBvaW50ZXIgdG8gZGVzY3JpcHRvcnMgb2YgdHJhbnNsYXRlZCBzeXNkZXAgc3RyaW5ncy4gICovCisgIGNvbnN0IHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKnRyYW5zX3N5c2RlcF90YWI7CisKKyAgLyogU2l6ZSBvZiBoYXNoIHRhYmxlLiAgKi8KKyAgbmxzX3VpbnQzMiBoYXNoX3NpemU7CisgIC8qIFBvaW50ZXIgdG8gaGFzaCB0YWJsZS4gICovCisgIGNvbnN0IG5sc191aW50MzIgKmhhc2hfdGFiOworICAvKiAxIGlmIHRoZSBoYXNoIHRhYmxlIHVzZXMgYSBkaWZmZXJlbnQgZW5kaWFubmVzcyB0aGFuIHRoaXMgbWFjaGluZS4gICovCisgIGludCBtdXN0X3N3YXBfaGFzaF90YWI7CisKKyAgaW50IGNvZGVzZXRfY250cjsKKyNpZmRlZiBfTElCQworICBfX2djb252X3QgY29udjsKKyNlbHNlCisjIGlmIEhBVkVfSUNPTlYKKyAgaWNvbnZfdCBjb252OworIyBlbmRpZgorI2VuZGlmCisgIGNoYXIgKipjb252X3RhYjsKKworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqcGx1cmFsOworICB1bnNpZ25lZCBsb25nIGludCBucGx1cmFsczsKK307CisKKy8qIFdlIHdhbnQgdG8gYWxsb2NhdGUgYSBzdHJpbmcgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0LiAgQnV0IElTTyBDCisgICBkb2Vzbid0IGFsbG93IHplcm8gc2l6ZWQgYXJyYXlzLiAgKi8KKyNpZmRlZiBfX0dOVUNfXworIyBkZWZpbmUgWkVSTyAwCisjZWxzZQorIyBkZWZpbmUgWkVSTyAxCisjZW5kaWYKKworLyogQSBzZXQgb2Ygc2V0dGluZ3MgYm91bmQgdG8gYSBtZXNzYWdlIGRvbWFpbi4gIFVzZWQgdG8gc3RvcmUgc2V0dGluZ3MKKyAgIGZyb20gYmluZHRleHRkb21haW4oKSBhbmQgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQoKS4gICovCitzdHJ1Y3QgYmluZGluZworeworICBzdHJ1Y3QgYmluZGluZyAqbmV4dDsKKyAgY2hhciAqZGlybmFtZTsKKyAgaW50IGNvZGVzZXRfY250cjsJLyogSW5jcmVtZW50ZWQgZWFjaCB0aW1lIGNvZGVzZXQgY2hhbmdlcy4gICovCisgIGNoYXIgKmNvZGVzZXQ7CisgIGNoYXIgZG9tYWlubmFtZVtaRVJPXTsKK307CisKKy8qIEEgY291bnRlciB3aGljaCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgc29tZSBwcmV2aW91cyB0cmFuc2xhdGlvbnMKKyAgIGJlY29tZSBpbnZhbGlkLgorICAgVGhpcyB2YXJpYWJsZSBpcyBwYXJ0IG9mIHRoZSBleHRlcm5hbCBBQkkgb2YgdGhlIEdOVSBsaWJpbnRsLiAgKi8KK2V4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKKworI2lmbmRlZiBfTElCQworY29uc3QgY2hhciAqX25sX2xvY2FsZV9uYW1lIChpbnQgY2F0ZWdvcnksIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSk7CisjZW5kaWYKKworc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX25sX2ZpbmRfZG9tYWluIChjb25zdCBjaGFyICpfX2Rpcm5hbWUsIGNoYXIgKl9fbG9jYWxlLAorCQkJCQkgY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJCQkgc3RydWN0IGJpbmRpbmcgKl9fZG9tYWluYmluZGluZykKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247Cit2b2lkIF9ubF9sb2FkX2RvbWFpbiAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX19kb21haW4sCisJCSAgICAgIHN0cnVjdCBiaW5kaW5nICpfX2RvbWFpbmJpbmRpbmcpCisgICAgIGludGVybmFsX2Z1bmN0aW9uOwordm9pZCBfbmxfdW5sb2FkX2RvbWFpbiAoc3RydWN0IGxvYWRlZF9kb21haW4gKl9fZG9tYWluKQorICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKK2NvbnN0IGNoYXIgKl9ubF9pbml0X2RvbWFpbl9jb252IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpfX2RvbWFpbl9maWxlLAorCQkJCSAgc3RydWN0IGxvYWRlZF9kb21haW4gKl9fZG9tYWluLAorCQkJCSAgc3RydWN0IGJpbmRpbmcgKl9fZG9tYWluYmluZGluZykKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247Cit2b2lkIF9ubF9mcmVlX2RvbWFpbl9jb252IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqX19kb21haW4pCisgICAgIGludGVybmFsX2Z1bmN0aW9uOworCitjaGFyICpfbmxfZmluZF9tc2cgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlLAorCQkgICAgc3RydWN0IGJpbmRpbmcgKmRvbWFpbmJpbmRpbmcsIGNvbnN0IGNoYXIgKm1zZ2lkLAorCQkgICAgc2l6ZV90ICpsZW5ndGhwKQorICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKKworI2lmZGVmIF9MSUJDCitleHRlcm4gY2hhciAqX19nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkKTsKK2V4dGVybiBjaGFyICpfX2RnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQpOworZXh0ZXJuIGNoYXIgKl9fZGNnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCisJCQkgIGludCBfX2NhdGVnb3J5KTsKK2V4dGVybiBjaGFyICpfX25nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisJCQkgdW5zaWduZWQgbG9uZyBpbnQgX19uKTsKK2V4dGVybiBjaGFyICpfX2RuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJICBjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisJCQkgIHVuc2lnbmVkIGxvbmcgaW50IG4pOworZXh0ZXJuIGNoYXIgKl9fZGNuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJICAgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJICAgdW5zaWduZWQgbG9uZyBpbnQgX19uLCBpbnQgX19jYXRlZ29yeSk7CitleHRlcm4gY2hhciAqX19kY2lnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkgICBjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisJCQkgICBpbnQgX19wbHVyYWwsIHVuc2lnbmVkIGxvbmcgaW50IF9fbiwKKwkJCSAgIGludCBfX2NhdGVnb3J5KTsKK2V4dGVybiBjaGFyICpfX3RleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSk7CitleHRlcm4gY2hhciAqX19iaW5kdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSk7CitleHRlcm4gY2hhciAqX19iaW5kX3RleHRkb21haW5fY29kZXNldCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJCQljb25zdCBjaGFyICpfX2NvZGVzZXQpOworI2Vsc2UKKy8qIERlY2xhcmUgdGhlIGV4cG9ydGVkIGxpYmludGxfKiBmdW5jdGlvbnMsIGluIGEgd2F5IHRoYXQgYWxsb3dzIHVzIHRvCisgICBjYWxsIHRoZW0gdW5kZXIgdGhlaXIgcmVhbCBuYW1lLiAgKi8KKyMgdW5kZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCisjIHVuZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUworIyBkZWZpbmUgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisjIGluY2x1ZGUgImxpYmdudWludGwuaCIKK2V4dGVybiBjaGFyICpsaWJpbnRsX2RjaWdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQkgY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJCSBpbnQgX19wbHVyYWwsIHVuc2lnbmVkIGxvbmcgaW50IF9fbiwKKwkJCQkgaW50IF9fY2F0ZWdvcnkpOworI2VuZGlmCisKKy8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLworCisjZW5kaWYgLyogZ2V0dGV4dFAuaCAgKi8KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9nbW8uaCBiL3VuaXgvaW50bC9nbW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2M5Y2MxCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2dtby5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKiBEZXNjcmlwdGlvbiBvZiBHTlUgbWVzc2FnZSBjYXRhbG9nIGZvcm1hdDogZ2VuZXJhbCBmaWxlIGxheW91dC4KKyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMjAwMC0yMDAyLCAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfR0VUVEVYVF9ICisjZGVmaW5lIF9HRVRURVhUX0ggMQorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKy8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KKworLyogVGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgR05VIG1lc3NhZ2UgY2F0YWxvZyBmb3JtYXQuICAqLworI2RlZmluZSBfTUFHSUMgMHg5NTA0MTJkZQorI2RlZmluZSBfTUFHSUNfU1dBUFBFRCAweGRlMTIwNDk1CisKKy8qIFJldmlzaW9uIG51bWJlciBvZiB0aGUgY3VycmVudGx5IHVzZWQgLm1vIChiaW5hcnkpIGZpbGUgZm9ybWF0LiAgKi8KKyNkZWZpbmUgTU9fUkVWSVNJT05fTlVNQkVSIDAKKyNkZWZpbmUgTU9fUkVWSVNJT05fTlVNQkVSX1dJVEhfU1lTREVQX0kgMQorCisvKiBUaGUgZm9sbG93aW5nIGNvbnRvcnRpb25zIGFyZSBhbiBhdHRlbXB0IHRvIHVzZSB0aGUgQyBwcmVwcm9jZXNzb3IKKyAgIHRvIGRldGVybWluZSBhbiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlIHRoYXQgaXMgMzIgYml0cyB3aWRlLiAgQW4KKyAgIGFsdGVybmF0aXZlIGFwcHJvYWNoIGlzIHRvIHVzZSBhdXRvY29uZidzIEFDX0NIRUNLX1NJWkVPRiBtYWNybywgYnV0CisgICBhcyBvZiB2ZXJzaW9uIGF1dG9jb25mLTIuMTMsIHRoZSBBQ19DSEVDS19TSVpFT0YgbWFjcm8gZG9lc24ndCB3b3JrCisgICB3aGVuIGNyb3NzLWNvbXBpbGluZy4gICovCisKKyNpZiBfX1NURENfXworIyBkZWZpbmUgVUlOVF9NQVhfMzJfQklUUyA0Mjk0OTY3Mjk1VQorI2Vsc2UKKyMgZGVmaW5lIFVJTlRfTUFYXzMyX0JJVFMgMHhGRkZGRkZGRgorI2VuZGlmCisKKy8qIElmIFVJTlRfTUFYIGlzbid0IGRlZmluZWQsIGFzc3VtZSBpdCdzIGEgMzItYml0IHR5cGUuCisgICBUaGlzIHNob3VsZCBiZSB2YWxpZCBmb3IgYWxsIHN5c3RlbXMgR05VIGNhcmVzIGFib3V0IGJlY2F1c2UKKyAgIHRoYXQgZG9lc24ndCBpbmNsdWRlIDE2LWJpdCBzeXN0ZW1zLCBhbmQgb25seSBtb2Rlcm4gc3lzdGVtcworICAgKHRoYXQgY2VydGFpbmx5IGhhdmUgPGxpbWl0cy5oPikgaGF2ZSA2NCstYml0IGludGVncmFsIHR5cGVzLiAgKi8KKworI2lmbmRlZiBVSU5UX01BWAorIyBkZWZpbmUgVUlOVF9NQVggVUlOVF9NQVhfMzJfQklUUworI2VuZGlmCisKKyNpZiBVSU5UX01BWCA9PSBVSU5UX01BWF8zMl9CSVRTCit0eXBlZGVmIHVuc2lnbmVkIG5sc191aW50MzI7CisjZWxzZQorIyBpZiBVU0hSVF9NQVggPT0gVUlOVF9NQVhfMzJfQklUUwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBubHNfdWludDMyOworIyBlbHNlCisjICBpZiBVTE9OR19NQVggPT0gVUlOVF9NQVhfMzJfQklUUwordHlwZWRlZiB1bnNpZ25lZCBsb25nIG5sc191aW50MzI7CisjICBlbHNlCisgIC8qIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBpbnRlbmRlZCB0byB0aHJvdyBhbiBlcnJvci4gIFVzaW5nICNlcnJvciBpcworICAgICBub3QgcG9ydGFibGUgZW5vdWdoLiAgKi8KKyAgIkNhbm5vdCBkZXRlcm1pbmUgdW5zaWduZWQgMzItYml0IGRhdGEgdHlwZS4iCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKworLyogSGVhZGVyIGZvciBiaW5hcnkgLm1vIGZpbGUgZm9ybWF0LiAgKi8KK3N0cnVjdCBtb19maWxlX2hlYWRlcgoreworICAvKiBUaGUgbWFnaWMgbnVtYmVyLiAgKi8KKyAgbmxzX3VpbnQzMiBtYWdpYzsKKyAgLyogVGhlIHJldmlzaW9uIG51bWJlciBvZiB0aGUgZmlsZSBmb3JtYXQuICAqLworICBubHNfdWludDMyIHJldmlzaW9uOworCisgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIG9ubHkgdXNlZCBpbiAubW8gZmlsZXMgd2l0aCBtYWpvciByZXZpc2lvbiAwIG9yIDEuICAqLworCisgIC8qIFRoZSBudW1iZXIgb2Ygc3RyaW5ncyBwYWlycy4gICovCisgIG5sc191aW50MzIgbnN0cmluZ3M7CisgIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2Ygb3JpZ2luYWwgc3RyaW5ncy4gICovCisgIG5sc191aW50MzIgb3JpZ190YWJfb2Zmc2V0OworICAvKiBPZmZzZXQgb2YgdGFibGUgd2l0aCBzdGFydCBvZmZzZXRzIG9mIHRyYW5zbGF0ZWQgc3RyaW5ncy4gICovCisgIG5sc191aW50MzIgdHJhbnNfdGFiX29mZnNldDsKKyAgLyogU2l6ZSBvZiBoYXNoIHRhYmxlLiAgKi8KKyAgbmxzX3VpbnQzMiBoYXNoX3RhYl9zaXplOworICAvKiBPZmZzZXQgb2YgZmlyc3QgaGFzaCB0YWJsZSBlbnRyeS4gICovCisgIG5sc191aW50MzIgaGFzaF90YWJfb2Zmc2V0OworCisgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIG9ubHkgdXNlZCBpbiAubW8gZmlsZXMgd2l0aCBtaW5vciByZXZpc2lvbiA+PSAxLiAgKi8KKworICAvKiBUaGUgbnVtYmVyIG9mIHN5c3RlbSBkZXBlbmRlbnQgc2VnbWVudHMuICAqLworICBubHNfdWludDMyIG5fc3lzZGVwX3NlZ21lbnRzOworICAvKiBPZmZzZXQgb2YgdGFibGUgZGVzY3JpYmluZyBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnRzLiAgKi8KKyAgbmxzX3VpbnQzMiBzeXNkZXBfc2VnbWVudHNfb2Zmc2V0OworICAvKiBUaGUgbnVtYmVyIG9mIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5ncyBwYWlycy4gICovCisgIG5sc191aW50MzIgbl9zeXNkZXBfc3RyaW5nczsKKyAgLyogT2Zmc2V0IG9mIHRhYmxlIHdpdGggc3RhcnQgb2Zmc2V0cyBvZiBvcmlnaW5hbCBzeXNkZXAgc3RyaW5ncy4gICovCisgIG5sc191aW50MzIgb3JpZ19zeXNkZXBfdGFiX29mZnNldDsKKyAgLyogT2Zmc2V0IG9mIHRhYmxlIHdpdGggc3RhcnQgb2Zmc2V0cyBvZiB0cmFuc2xhdGVkIHN5c2RlcCBzdHJpbmdzLiAgKi8KKyAgbmxzX3VpbnQzMiB0cmFuc19zeXNkZXBfdGFiX29mZnNldDsKK307CisKKy8qIERlc2NyaXB0b3IgZm9yIHN0YXRpYyBzdHJpbmcgY29udGFpbmVkIGluIHRoZSBiaW5hcnkgLm1vIGZpbGUuICAqLworc3RydWN0IHN0cmluZ19kZXNjCit7CisgIC8qIExlbmd0aCBvZiBhZGRyZXNzZWQgc3RyaW5nLCBub3QgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuICAqLworICBubHNfdWludDMyIGxlbmd0aDsKKyAgLyogT2Zmc2V0IG9mIHN0cmluZyBpbiBmaWxlLiAgKi8KKyAgbmxzX3VpbnQzMiBvZmZzZXQ7Cit9OworCisvKiBUaGUgZm9sbG93aW5nIGFyZSBvbmx5IHVzZWQgaW4gLm1vIGZpbGVzIHdpdGggbWlub3IgcmV2aXNpb24gPj0gMS4gICovCisKKy8qIERlc2NyaXB0b3IgZm9yIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5nIHNlZ21lbnQuICAqLworc3RydWN0IHN5c2RlcF9zZWdtZW50Cit7CisgIC8qIExlbmd0aCBvZiBhZGRyZXNzZWQgc3RyaW5nLCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTC4gICovCisgIG5sc191aW50MzIgbGVuZ3RoOworICAvKiBPZmZzZXQgb2Ygc3RyaW5nIGluIGZpbGUuICAqLworICBubHNfdWludDMyIG9mZnNldDsKK307CisKKy8qIERlc2NyaXB0b3IgZm9yIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5nLiAgKi8KK3N0cnVjdCBzeXNkZXBfc3RyaW5nCit7CisgIC8qIE9mZnNldCBvZiBzdGF0aWMgc3RyaW5nIHNlZ21lbnRzIGluIGZpbGUuICAqLworICBubHNfdWludDMyIG9mZnNldDsKKyAgLyogQWx0ZXJuYXRpbmcgc2VxdWVuY2Ugb2Ygc3RhdGljIGFuZCBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnRzLgorICAgICBUaGUgbGFzdCBzZWdtZW50IGlzIGEgc3RhdGljIHNlZ21lbnQsIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLiAgKi8KKyAgc3RydWN0IHNlZ21lbnRfcGFpcgorICB7CisgICAgLyogU2l6ZSBvZiBzdGF0aWMgc2VnbWVudC4gICovCisgICAgbmxzX3VpbnQzMiBzZWdzaXplOworICAgIC8qIFJlZmVyZW5jZSB0byBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZyBzZWdtZW50LCBvciB+MCBhdCB0aGUgZW5kLiAgKi8KKyAgICBubHNfdWludDMyIHN5c2RlcHJlZjsKKyAgfSBzZWdtZW50c1sxXTsKK307CisKKy8qIE1hcmtlciBmb3IgdGhlIGVuZCBvZiB0aGUgc2VnbWVudHNbXSBhcnJheS4gIFRoaXMgaGFzIHRoZSB2YWx1ZSAweEZGRkZGRkZGLAorICAgcmVnYXJkbGVzcyB3aGV0aGVyICdpbnQnIGlzIDE2IGJpdCwgMzIgYml0LCBvciA2NCBiaXQuICAqLworI2RlZmluZSBTRUdNRU5UU19FTkQgKChubHNfdWludDMyKSB+MCkKKworLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCisKKyNlbmRpZgkvKiBnZXR0ZXh0LmggICovCmRpZmYgLS1naXQgYS91bml4L2ludGwvaGFzaC1zdHJpbmcuaCBiL3VuaXgvaW50bC9oYXNoLXN0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5M2UzYjEKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvaGFzaC1zdHJpbmcuaApAQCAtMCwwICsxLDQ4IEBACisvKiBEZXNjcmlwdGlvbiBvZiBHTlUgbWVzc2FnZSBjYXRhbG9nIGZvcm1hdDogc3RyaW5nIGhhc2hpbmcgZnVuY3Rpb24uCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTctMTk5OCwgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisvKiBXZSBhc3N1bWUgdG8gaGF2ZSBgdW5zaWduZWQgbG9uZyBpbnQnIHZhbHVlIHdpdGggYXQgbGVhc3QgMzIgYml0cy4gICovCisjZGVmaW5lIEhBU0hXT1JEQklUUyAzMgorCisKKy8qIERlZmluZXMgdGhlIHNvIGNhbGxlZCBgaGFzaHBqdycgZnVuY3Rpb24gYnkgUC5KLiBXZWluYmVyZ2VyCisgICBbc2VlIEFoby9TZXRoaS9VbGxtYW4sIENPTVBJTEVSUzogUHJpbmNpcGxlcywgVGVjaG5pcXVlcyBhbmQgVG9vbHMsCisgICAxOTg2LCAxOTg3IEJlbGwgVGVsZXBob25lIExhYm9yYXRvcmllcywgSW5jLl0gICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaW50CitoYXNoX3N0cmluZyAoY29uc3QgY2hhciAqc3RyX3BhcmFtKQoreworICB1bnNpZ25lZCBsb25nIGludCBodmFsLCBnOworICBjb25zdCBjaGFyICpzdHIgPSBzdHJfcGFyYW07CisKKyAgLyogQ29tcHV0ZSB0aGUgaGFzaCB2YWx1ZSBmb3IgdGhlIGdpdmVuIHN0cmluZy4gICovCisgIGh2YWwgPSAwOworICB3aGlsZSAoKnN0ciAhPSAnXDAnKQorICAgIHsKKyAgICAgIGh2YWwgPDw9IDQ7CisgICAgICBodmFsICs9ICh1bnNpZ25lZCBjaGFyKSAqc3RyKys7CisgICAgICBnID0gaHZhbCAmICgodW5zaWduZWQgbG9uZyBpbnQpIDB4ZiA8PCAoSEFTSFdPUkRCSVRTIC0gNCkpOworICAgICAgaWYgKGcgIT0gMCkKKwl7CisJICBodmFsIF49IGcgPj4gKEhBU0hXT1JEQklUUyAtIDgpOworCSAgaHZhbCBePSBnOworCX0KKyAgICB9CisgIHJldHVybiBodmFsOworfQpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2ludGwtY29tcGF0LmMgYi91bml4L2ludGwvaW50bC1jb21wYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmY5ZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2ludGwtY29tcGF0LmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qIGludGwtY29tcGF0LmMgLSBTdHViIGZ1bmN0aW9ucyB0byBjYWxsIGdldHRleHQgZnVuY3Rpb25zIGZyb20gR05VIGdldHRleHQKKyAgIExpYnJhcnkuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDIwMDAtMjAwMyBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisvKiBUaGlzIGZpbGUgcmVkaXJlY3RzIHRoZSBnZXR0ZXh0IGZ1bmN0aW9ucyAod2l0aG91dCBwcmVmaXgpIHRvIHRob3NlCisgICBkZWZpbmVkIGluIHRoZSBpbmNsdWRlZCBHTlUgbGliaW50bCBsaWJyYXJ5ICh3aXRoICJsaWJpbnRsXyIgcHJlZml4KS4KKyAgIEl0IGlzIGNvbXBpbGVkIGludG8gbGliaW50bCBpbiBvcmRlciB0byBtYWtlIHRoZSBBTV9HTlVfR0VUVEVYVCB0ZXN0CisgICBvZiBnZXR0ZXh0IDw9IDAuMTEuMiB3b3JrIHdpdGggdGhlIGxpYmludGwgbGlicmFyeSA+PSAwLjExLjMgd2hpY2gKKyAgIGhhcyB0aGUgcmVkaXJlY3Rpb25zIHByaW1hcmlseSBpbiB0aGUgPGxpYmludGwuaD4gaW5jbHVkZSBmaWxlLgorICAgSXQgaXMgYWxzbyBjb21waWxlZCBpbnRvIGxpYmdudWludGwgc28gdGhhdCBsaWJnbnVpbnRsLnNvIGNhbiBiZSB1c2VkCisgICBhcyBMRF9QUkVMT0FEYWJsZSBsaWJyYXJ5IG9uIGdsaWJjIHN5c3RlbXMsIHRvIHByb3ZpZGUgdGhlIGV4dHJhCisgICBmZWF0dXJlcyB0aGF0IHRoZSBmdW5jdGlvbnMgaW4gdGhlIGxpYmMgZG9uJ3QgaGF2ZSAobmFtZWx5LCBsb2dnaW5nKS4gICovCisKKworI3VuZGVmIGdldHRleHQKKyN1bmRlZiBkZ2V0dGV4dAorI3VuZGVmIGRjZ2V0dGV4dAorI3VuZGVmIG5nZXR0ZXh0CisjdW5kZWYgZG5nZXR0ZXh0CisjdW5kZWYgZGNuZ2V0dGV4dAorI3VuZGVmIHRleHRkb21haW4KKyN1bmRlZiBiaW5kdGV4dGRvbWFpbgorI3VuZGVmIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0CisKKworLyogV2hlbiBidWlsZGluZyBhIERMTCwgd2UgbXVzdCBleHBvcnQgc29tZSBmdW5jdGlvbnMuICBOb3RlIHRoYXQgYmVjYXVzZQorICAgdGhlIGZ1bmN0aW9ucyBhcmUgb25seSBkZWZpbmVkIGZvciBiaW5hcnkgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgd2UKKyAgIGRvbid0IG5lZWQgdG8gdXNlIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbiBhbnkgY2FzZS4gICovCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBCVUlMRElOR19ETEwKKyMgZGVmaW5lIERMTF9FWFBPUlRFRCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyNlbHNlCisjIGRlZmluZSBETExfRVhQT1JURUQKKyNlbmRpZgorCisKK0RMTF9FWFBPUlRFRAorY2hhciAqCitnZXR0ZXh0IChjb25zdCBjaGFyICptc2dpZCkKK3sKKyAgcmV0dXJuIGxpYmludGxfZ2V0dGV4dCAobXNnaWQpOworfQorCisKK0RMTF9FWFBPUlRFRAorY2hhciAqCitkZ2V0dGV4dCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqbXNnaWQpCit7CisgIHJldHVybiBsaWJpbnRsX2RnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCk7Cit9CisKKworRExMX0VYUE9SVEVECitjaGFyICoKK2RjZ2V0dGV4dCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqbXNnaWQsIGludCBjYXRlZ29yeSkKK3sKKyAgcmV0dXJuIGxpYmludGxfZGNnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpOworfQorCisKK0RMTF9FWFBPUlRFRAorY2hhciAqCituZ2V0dGV4dCAoY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IG4pCit7CisgIHJldHVybiBsaWJpbnRsX25nZXR0ZXh0IChtc2dpZDEsIG1zZ2lkMiwgbik7Cit9CisKKworRExMX0VYUE9SVEVECitjaGFyICoKK2RuZ2V0dGV4dCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwKKwkgICBjb25zdCBjaGFyICptc2dpZDEsIGNvbnN0IGNoYXIgKm1zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgbikKK3sKKyAgcmV0dXJuIGxpYmludGxfZG5nZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZDEsIG1zZ2lkMiwgbik7Cit9CisKKworRExMX0VYUE9SVEVECitjaGFyICoKK2RjbmdldHRleHQgKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCisJICAgIGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBuLAorCSAgICBpbnQgY2F0ZWdvcnkpCit7CisgIHJldHVybiBsaWJpbnRsX2RjbmdldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkMSwgbXNnaWQyLCBuLCBjYXRlZ29yeSk7Cit9CisKKworRExMX0VYUE9SVEVECitjaGFyICoKK3RleHRkb21haW4gKGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUpCit7CisgIHJldHVybiBsaWJpbnRsX3RleHRkb21haW4gKGRvbWFpbm5hbWUpOworfQorCisKK0RMTF9FWFBPUlRFRAorY2hhciAqCitiaW5kdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqZGlybmFtZSkKK3sKKyAgcmV0dXJuIGxpYmludGxfYmluZHRleHRkb21haW4gKGRvbWFpbm5hbWUsIGRpcm5hbWUpOworfQorCisKK0RMTF9FWFBPUlRFRAorY2hhciAqCitiaW5kX3RleHRkb21haW5fY29kZXNldCAoY29uc3QgY2hhciAqZG9tYWlubmFtZSwgY29uc3QgY2hhciAqY29kZXNldCkKK3sKKyAgcmV0dXJuIGxpYmludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKGRvbWFpbm5hbWUsIGNvZGVzZXQpOworfQpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2wxMG5mbGlzdC5jIGIvdW5peC9pbnRsL2wxMG5mbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTk1YWEKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvbDEwbmZsaXN0LmMKQEAgLTAsMCArMSw0MjEgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk5LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisvKiBUZWxsIGdsaWJjJ3MgPHN0cmluZy5oPiB0byBwcm92aWRlIGEgcHJvdG90eXBlIGZvciBzdHBjcHkoKS4KKyAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQorICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorIyBkZWZpbmUgX0dOVV9TT1VSQ0UJMQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX0FSR1pfSAorIyBpbmNsdWRlIDxhcmd6Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibG9hZGluZm8uaCIKKworLyogT24gc29tZSBzdHJhbmdlIHN5c3RlbXMgc3RpbGwgbm8gZGVmaW5pdGlvbiBvZiBOVUxMIGlzIGZvdW5kLiAgU2lnaCEgICovCisjaWZuZGVmIE5VTEwKKyMgaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXworIyAgZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCisjIGVsc2UKKyMgIGRlZmluZSBOVUxMIDAKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKyNpZmRlZiBfTElCQworLyogUmVuYW1lIHRoZSBub24gQU5TSSBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCisgICBiZWNhdXNlIHNvbWUgQU5TSSBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0CisgICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCisjIGlmbmRlZiBzdHBjcHkKKyMgIGRlZmluZSBzdHBjcHkoZGVzdCwgc3JjKSBfX3N0cGNweShkZXN0LCBzcmMpCisjIGVuZGlmCisjZWxzZQorIyBpZm5kZWYgSEFWRV9TVFBDUFkKK3N0YXRpYyBjaGFyICpzdHBjcHkgKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYyk7CisjIGVuZGlmCisjZW5kaWYKKworLyogUGF0aG5hbWUgc3VwcG9ydC4KKyAgIElTU0xBU0goQykgICAgICAgICAgIHRlc3RzIHdoZXRoZXIgQyBpcyBhIGRpcmVjdG9yeSBzZXBhcmF0b3IgY2hhcmFjdGVyLgorICAgSVNfQUJTT0xVVEVfUEFUSChQKSAgdGVzdHMgd2hldGhlciBQIGlzIGFuIGFic29sdXRlIHBhdGguICBJZiBpdCBpcyBub3QsCisgICAgICAgICAgICAgICAgICAgICAgICBpdCBtYXkgYmUgY29uY2F0ZW5hdGVkIHRvIGEgZGlyZWN0b3J5IHBhdGhuYW1lLgorICovCisjaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX0VNWF9fIHx8IGRlZmluZWQgX19ESkdQUF9fCisgIC8qIFdpbjMyLCBPUy8yLCBET1MgKi8KKyMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycgfHwgKEMpID09ICdcXCcpCisjIGRlZmluZSBIQVNfREVWSUNFKFApIFwKKyAgICAoKCgoUClbMF0gPj0gJ0EnICYmIChQKVswXSA8PSAnWicpIHx8ICgoUClbMF0gPj0gJ2EnICYmIChQKVswXSA8PSAneicpKSBcCisgICAgICYmIChQKVsxXSA9PSAnOicpCisjIGRlZmluZSBJU19BQlNPTFVURV9QQVRIKFApIChJU1NMQVNIICgoUClbMF0pIHx8IEhBU19ERVZJQ0UgKFApKQorI2Vsc2UKKyAgLyogVW5peCAqLworIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09ICcvJykKKyMgZGVmaW5lIElTX0FCU09MVVRFX1BBVEgoUCkgSVNTTEFTSCAoKFApWzBdKQorI2VuZGlmCisKKy8qIERlZmluZSBmdW5jdGlvbiB3aGljaCBhcmUgdXN1YWxseSBub3QgYXZhaWxhYmxlLiAgKi8KKworI2lmICFkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIEhBVkVfX19BUkdaX0NPVU5UCisvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpbiBBUkdaLiAgKi8KK3N0YXRpYyBzaXplX3QKK2FyZ3pfY291bnRfXyAoY29uc3QgY2hhciAqYXJneiwgc2l6ZV90IGxlbikKK3sKKyAgc2l6ZV90IGNvdW50ID0gMDsKKyAgd2hpbGUgKGxlbiA+IDApCisgICAgeworICAgICAgc2l6ZV90IHBhcnRfbGVuID0gc3RybGVuIChhcmd6KTsKKyAgICAgIGFyZ3ogKz0gcGFydF9sZW4gKyAxOworICAgICAgbGVuIC09IHBhcnRfbGVuICsgMTsKKyAgICAgIGNvdW50Kys7CisgICAgfQorICByZXR1cm4gY291bnQ7Cit9CisjIHVuZGVmIF9fYXJnel9jb3VudAorIyBkZWZpbmUgX19hcmd6X2NvdW50KGFyZ3osIGxlbikgYXJnel9jb3VudF9fIChhcmd6LCBsZW4pCisjZWxzZQorIyBpZmRlZiBfTElCQworIyAgZGVmaW5lIF9fYXJnel9jb3VudChhcmd6LCBsZW4pIElOVFVTRShfX2FyZ3pfY291bnQpIChhcmd6LCBsZW4pCisjIGVuZGlmCisjZW5kaWYJLyogIV9MSUJDICYmICFIQVZFX19fQVJHWl9DT1VOVCAqLworCisjaWYgIWRlZmluZWQgX0xJQkMgJiYgIWRlZmluZWQgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCisvKiBNYWtlICdcMCcgc2VwYXJhdGVkIGFyZyB2ZWN0b3IgQVJHWiBwcmludGFibGUgYnkgY29udmVydGluZyBhbGwgdGhlICdcMCdzCisgICBleGNlcHQgdGhlIGxhc3QgaW50byB0aGUgY2hhcmFjdGVyIFNFUC4gICovCitzdGF0aWMgdm9pZAorYXJnel9zdHJpbmdpZnlfXyAoY2hhciAqYXJneiwgc2l6ZV90IGxlbiwgaW50IHNlcCkKK3sKKyAgd2hpbGUgKGxlbiA+IDApCisgICAgeworICAgICAgc2l6ZV90IHBhcnRfbGVuID0gc3RybGVuIChhcmd6KTsKKyAgICAgIGFyZ3ogKz0gcGFydF9sZW47CisgICAgICBsZW4gLT0gcGFydF9sZW4gKyAxOworICAgICAgaWYgKGxlbiA+IDApCisJKmFyZ3orKyA9IHNlcDsKKyAgICB9Cit9CisjIHVuZGVmIF9fYXJnel9zdHJpbmdpZnkKKyMgZGVmaW5lIF9fYXJnel9zdHJpbmdpZnkoYXJneiwgbGVuLCBzZXApIGFyZ3pfc3RyaW5naWZ5X18gKGFyZ3osIGxlbiwgc2VwKQorI2Vsc2UKKyMgaWZkZWYgX0xJQkMKKyMgIGRlZmluZSBfX2FyZ3pfc3RyaW5naWZ5KGFyZ3osIGxlbiwgc2VwKSBcCisgIElOVFVTRShfX2FyZ3pfc3RyaW5naWZ5KSAoYXJneiwgbGVuLCBzZXApCisjIGVuZGlmCisjZW5kaWYJLyogIV9MSUJDICYmICFIQVZFX19fQVJHWl9TVFJJTkdJRlkgKi8KKworI2lmICFkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIEhBVkVfX19BUkdaX05FWFQKK3N0YXRpYyBjaGFyICoKK2FyZ3pfbmV4dF9fIChjaGFyICphcmd6LCBzaXplX3QgYXJnel9sZW4sIGNvbnN0IGNoYXIgKmVudHJ5KQoreworICBpZiAoZW50cnkpCisgICAgeworICAgICAgaWYgKGVudHJ5IDwgYXJneiArIGFyZ3pfbGVuKQorICAgICAgICBlbnRyeSA9IHN0cmNociAoZW50cnksICdcMCcpICsgMTsKKworICAgICAgcmV0dXJuIGVudHJ5ID49IGFyZ3ogKyBhcmd6X2xlbiA/IE5VTEwgOiAoY2hhciAqKSBlbnRyeTsKKyAgICB9CisgIGVsc2UKKyAgICBpZiAoYXJnel9sZW4gPiAwKQorICAgICAgcmV0dXJuIGFyZ3o7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7Cit9CisjIHVuZGVmIF9fYXJnel9uZXh0CisjIGRlZmluZSBfX2FyZ3pfbmV4dChhcmd6LCBsZW4sIGVudHJ5KSBhcmd6X25leHRfXyAoYXJneiwgbGVuLCBlbnRyeSkKKyNlbmRpZgkvKiAhX0xJQkMgJiYgIUhBVkVfX19BUkdaX05FWFQgKi8KKworCisvKiBSZXR1cm4gbnVtYmVyIG9mIGJpdHMgc2V0IGluIFguICAqLworc3RhdGljIGlubGluZSBpbnQKK3BvcCAoaW50IHgpCit7CisgIC8qIFdlIGFzc3VtZSB0aGF0IG5vIG1vcmUgdGhhbiAxNiBiaXRzIGFyZSB1c2VkLiAgKi8KKyAgeCA9ICgoeCAmIH4weDU1NTUpID4+IDEpICsgKHggJiAweDU1NTUpOworICB4ID0gKCh4ICYgfjB4MzMzMykgPj4gMikgKyAoeCAmIDB4MzMzMyk7CisgIHggPSAoKHggPj4gNCkgKyB4KSAmIDB4MGYwZjsKKyAgeCA9ICgoeCA+PiA4KSArIHgpICYgMHhmZjsKKworICByZXR1cm4geDsKK30KKworDAorc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqCitfbmxfbWFrZV9sMTBuZmxpc3QgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKipsMTBuZmlsZV9saXN0LAorCQkgICAgY29uc3QgY2hhciAqZGlybGlzdCwgc2l6ZV90IGRpcmxpc3RfbGVuLAorCQkgICAgaW50IG1hc2ssIGNvbnN0IGNoYXIgKmxhbmd1YWdlLCBjb25zdCBjaGFyICp0ZXJyaXRvcnksCisJCSAgICBjb25zdCBjaGFyICpjb2Rlc2V0LCBjb25zdCBjaGFyICpub3JtYWxpemVkX2NvZGVzZXQsCisJCSAgICBjb25zdCBjaGFyICptb2RpZmllciwgY29uc3QgY2hhciAqc3BlY2lhbCwKKwkJICAgIGNvbnN0IGNoYXIgKnNwb25zb3IsIGNvbnN0IGNoYXIgKnJldmlzaW9uLAorCQkgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBkb19hbGxvY2F0ZSkKK3sKKyAgY2hhciAqYWJzX2ZpbGVuYW1lOworICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbGFzdHA7CisgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnJldHZhbDsKKyAgY2hhciAqY3A7CisgIHNpemVfdCBkaXJsaXN0X2NvdW50OworICBzaXplX3QgZW50cmllczsKKyAgaW50IGNudDsKKworICAvKiBJZiBMQU5HVUFHRSBjb250YWlucyBhbiBhYnNvbHV0ZSBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbiwgd2UgaWdub3JlCisgICAgIERJUkxJU1QuICAqLworICBpZiAoSVNfQUJTT0xVVEVfUEFUSCAobGFuZ3VhZ2UpKQorICAgIGRpcmxpc3RfbGVuID0gMDsKKworICAvKiBBbGxvY2F0ZSByb29tIGZvciB0aGUgZnVsbCBmaWxlIG5hbWUuICAqLworICBhYnNfZmlsZW5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGRpcmxpc3RfbGVuCisJCQkJICArIHN0cmxlbiAobGFuZ3VhZ2UpCisJCQkJICArICgobWFzayAmIFRFUlJJVE9SWSkgIT0gMAorCQkJCSAgICAgPyBzdHJsZW4gKHRlcnJpdG9yeSkgKyAxIDogMCkKKwkJCQkgICsgKChtYXNrICYgWFBHX0NPREVTRVQpICE9IDAKKwkJCQkgICAgID8gc3RybGVuIChjb2Rlc2V0KSArIDEgOiAwKQorCQkJCSAgKyAoKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKSAhPSAwCisJCQkJICAgICA/IHN0cmxlbiAobm9ybWFsaXplZF9jb2Rlc2V0KSArIDEgOiAwKQorCQkJCSAgKyAoKChtYXNrICYgWFBHX01PRElGSUVSKSAhPSAwCisJCQkJICAgICAgfHwgKG1hc2sgJiBDRU5fQVVESUVOQ0UpICE9IDApCisJCQkJICAgICA/IHN0cmxlbiAobW9kaWZpZXIpICsgMSA6IDApCisJCQkJICArICgobWFzayAmIENFTl9TUEVDSUFMKSAhPSAwCisJCQkJICAgICA/IHN0cmxlbiAoc3BlY2lhbCkgKyAxIDogMCkKKwkJCQkgICsgKCgobWFzayAmIENFTl9TUE9OU09SKSAhPSAwCisJCQkJICAgICAgfHwgKG1hc2sgJiBDRU5fUkVWSVNJT04pICE9IDApCisJCQkJICAgICA/ICgxICsgKChtYXNrICYgQ0VOX1NQT05TT1IpICE9IDAKKwkJCQkJICAgICA/IHN0cmxlbiAoc3BvbnNvcikgOiAwKQorCQkJCQkrICgobWFzayAmIENFTl9SRVZJU0lPTikgIT0gMAorCQkJCQkgICA/IHN0cmxlbiAocmV2aXNpb24pICsgMSA6IDApKSA6IDApCisJCQkJICArIDEgKyBzdHJsZW4gKGZpbGVuYW1lKSArIDEpOworCisgIGlmIChhYnNfZmlsZW5hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBDb25zdHJ1Y3QgZmlsZSBuYW1lLiAgKi8KKyAgY3AgPSBhYnNfZmlsZW5hbWU7CisgIGlmIChkaXJsaXN0X2xlbiA+IDApCisgICAgeworICAgICAgbWVtY3B5IChjcCwgZGlybGlzdCwgZGlybGlzdF9sZW4pOworICAgICAgX19hcmd6X3N0cmluZ2lmeSAoY3AsIGRpcmxpc3RfbGVuLCBQQVRIX1NFUEFSQVRPUik7CisgICAgICBjcCArPSBkaXJsaXN0X2xlbjsKKyAgICAgIGNwWy0xXSA9ICcvJzsKKyAgICB9CisKKyAgY3AgPSBzdHBjcHkgKGNwLCBsYW5ndWFnZSk7CisKKyAgaWYgKChtYXNrICYgVEVSUklUT1JZKSAhPSAwKQorICAgIHsKKyAgICAgICpjcCsrID0gJ18nOworICAgICAgY3AgPSBzdHBjcHkgKGNwLCB0ZXJyaXRvcnkpOworICAgIH0KKyAgaWYgKChtYXNrICYgWFBHX0NPREVTRVQpICE9IDApCisgICAgeworICAgICAgKmNwKysgPSAnLic7CisgICAgICBjcCA9IHN0cGNweSAoY3AsIGNvZGVzZXQpOworICAgIH0KKyAgaWYgKChtYXNrICYgWFBHX05PUk1fQ09ERVNFVCkgIT0gMCkKKyAgICB7CisgICAgICAqY3ArKyA9ICcuJzsKKyAgICAgIGNwID0gc3RwY3B5IChjcCwgbm9ybWFsaXplZF9jb2Rlc2V0KTsKKyAgICB9CisgIGlmICgobWFzayAmIChYUEdfTU9ESUZJRVIgfCBDRU5fQVVESUVOQ0UpKSAhPSAwKQorICAgIHsKKyAgICAgIC8qIFRoaXMgY29tcG9uZW50IGNhbiBiZSBwYXJ0IG9mIGJvdGggc3ludGFjZXMgYnV0IGhhcyBkaWZmZXJlbnQKKwkgbGVhZGluZyBjaGFyYWN0ZXJzLiAgRm9yIENFTiB3ZSB1c2UgYCsnLCBlbHNlIGBAJy4gICovCisgICAgICAqY3ArKyA9IChtYXNrICYgQ0VOX0FVRElFTkNFKSAhPSAwID8gJysnIDogJ0AnOworICAgICAgY3AgPSBzdHBjcHkgKGNwLCBtb2RpZmllcik7CisgICAgfQorICBpZiAoKG1hc2sgJiBDRU5fU1BFQ0lBTCkgIT0gMCkKKyAgICB7CisgICAgICAqY3ArKyA9ICcrJzsKKyAgICAgIGNwID0gc3RwY3B5IChjcCwgc3BlY2lhbCk7CisgICAgfQorICBpZiAoKG1hc2sgJiAoQ0VOX1NQT05TT1IgfCBDRU5fUkVWSVNJT04pKSAhPSAwKQorICAgIHsKKyAgICAgICpjcCsrID0gJywnOworICAgICAgaWYgKChtYXNrICYgQ0VOX1NQT05TT1IpICE9IDApCisJY3AgPSBzdHBjcHkgKGNwLCBzcG9uc29yKTsKKyAgICAgIGlmICgobWFzayAmIENFTl9SRVZJU0lPTikgIT0gMCkKKwl7CisJICAqY3ArKyA9ICdfJzsKKwkgIGNwID0gc3RwY3B5IChjcCwgcmV2aXNpb24pOworCX0KKyAgICB9CisKKyAgKmNwKysgPSAnLyc7CisgIHN0cGNweSAoY3AsIGZpbGVuYW1lKTsKKworICAvKiBMb29rIGluIGxpc3Qgb2YgYWxyZWFkeSBsb2FkZWQgZG9tYWlucyB3aGV0aGVyIGl0IGlzIGFscmVhZHkKKyAgICAgYXZhaWxhYmxlLiAgKi8KKyAgbGFzdHAgPSBsMTBuZmlsZV9saXN0OworICBmb3IgKHJldHZhbCA9ICpsMTBuZmlsZV9saXN0OyByZXR2YWwgIT0gTlVMTDsgcmV0dmFsID0gcmV0dmFsLT5uZXh0KQorICAgIGlmIChyZXR2YWwtPmZpbGVuYW1lICE9IE5VTEwpCisgICAgICB7CisJaW50IGNvbXBhcmUgPSBzdHJjbXAgKHJldHZhbC0+ZmlsZW5hbWUsIGFic19maWxlbmFtZSk7CisJaWYgKGNvbXBhcmUgPT0gMCkKKwkgIC8qIFdlIGZvdW5kIGl0ISAgKi8KKwkgIGJyZWFrOworCWlmIChjb21wYXJlIDwgMCkKKwkgIHsKKwkgICAgLyogSXQncyBub3QgaW4gdGhlIGxpc3QuICAqLworCSAgICByZXR2YWwgPSBOVUxMOworCSAgICBicmVhazsKKwkgIH0KKworCWxhc3RwID0gJnJldHZhbC0+bmV4dDsKKyAgICAgIH0KKworICBpZiAocmV0dmFsICE9IE5VTEwgfHwgZG9fYWxsb2NhdGUgPT0gMCkKKyAgICB7CisgICAgICBmcmVlIChhYnNfZmlsZW5hbWUpOworICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgZGlybGlzdF9jb3VudCA9IChkaXJsaXN0X2xlbiA+IDAgPyBfX2FyZ3pfY291bnQgKGRpcmxpc3QsIGRpcmxpc3RfbGVuKSA6IDEpOworCisgIC8qIEFsbG9jYXRlIGEgbmV3IGxvYWRlZF9sMTBuZmlsZS4gICovCisgIHJldHZhbCA9CisgICAgKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKikKKyAgICBtYWxsb2MgKHNpemVvZiAoKnJldHZhbCkKKwkgICAgKyAoKChkaXJsaXN0X2NvdW50IDw8IHBvcCAobWFzaykpICsgKGRpcmxpc3RfY291bnQgPiAxID8gMSA6IDApKQorCSAgICAgICAqIHNpemVvZiAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKSkpOworICBpZiAocmV0dmFsID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcmV0dmFsLT5maWxlbmFtZSA9IGFic19maWxlbmFtZTsKKworICAvKiBXZSBzZXQgcmV0dmFsLT5kYXRhIHRvIE5VTEwgaGVyZTsgaXQgaXMgZmlsbGVkIGluIGxhdGVyLgorICAgICBTZXR0aW5nIHJldHZhbC0+ZGVjaWRlZCB0byAxIGhlcmUgbWVhbnMgdGhhdCByZXR2YWwgZG9lcyBub3QKKyAgICAgY29ycmVzcG9uZCB0byBhIHJlYWwgZmlsZSAoZGlybGlzdF9jb3VudCA+IDEpIG9yIGlzIG5vdCB3b3J0aAorICAgICBsb29raW5nIHVwIChpZiBhbiB1bm5vcm1hbGl6ZWQgY29kZXNldCB3YXMgc3BlY2lmaWVkKS4gICovCisgIHJldHZhbC0+ZGVjaWRlZCA9IChkaXJsaXN0X2NvdW50ID4gMQorCQkgICAgIHx8ICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwCisJCQkgJiYgKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKSAhPSAwKSk7CisgIHJldHZhbC0+ZGF0YSA9IE5VTEw7CisKKyAgcmV0dmFsLT5uZXh0ID0gKmxhc3RwOworICAqbGFzdHAgPSByZXR2YWw7CisKKyAgZW50cmllcyA9IDA7CisgIC8qIFJlY3Vyc2UgdG8gZmlsbCB0aGUgaW5oZXJpdGFuY2UgbGlzdCBvZiBSRVRWQUwuCisgICAgIElmIHRoZSBESVJMSVNUIGlzIGEgcmVhbCBsaXN0IChpLmUuIERJUkxJU1RfQ09VTlQgPiAxKSwgdGhlIFJFVFZBTAorICAgICBlbnRyeSBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgcmVhbCBmaWxlOyByZXR2YWwtPmZpbGVuYW1lIGNvbnRhaW5zCisgICAgIGNvbG9ucy4gIEluIHRoaXMgY2FzZSB3ZSBsb29wIGFjcm9zcyBhbGwgZWxlbWVudHMgb2YgRElSTElTVCBhbmQKKyAgICAgYWNyb3NzIGFsbCBiaXQgcGF0dGVybnMgZG9taW5hdGVkIGJ5IE1BU0suCisgICAgIElmIHRoZSBESVJMSVNUIGlzIGEgc2luZ2xlIGRpcmVjdG9yeSBvciBlbnRpcmVseSByZWR1bmRhbnQgKGkuZS4KKyAgICAgRElSTElTVF9DT1VOVCA9PSAxKSwgd2UgbG9vcCBhY3Jvc3MgYWxsIGJpdCBwYXR0ZXJucyBkb21pbmF0ZWQgYnkKKyAgICAgTUFTSywgZXhjbHVkaW5nIE1BU0sgaXRzZWxmLgorICAgICBJbiBlaXRoZXIgY2FzZSwgd2UgbG9vcCBkb3duIGZyb20gTUFTSyB0byAwLiAgVGhpcyBoYXMgdGhlIGVmZmVjdAorICAgICB0aGF0IHRoZSBleHRyYSBiaXRzIGluIHRoZSBsb2NhbGUgbmFtZSBhcmUgZHJvcHBlZCBpbiB0aGlzIG9yZGVyOgorICAgICBmaXJzdCB0aGUgbW9kaWZpZXIsIHRoZW4gdGhlIHRlcnJpdG9yeSwgdGhlbiB0aGUgY29kZXNldCwgdGhlbiB0aGUKKyAgICAgbm9ybWFsaXplZF9jb2Rlc2V0LiAgKi8KKyAgZm9yIChjbnQgPSBkaXJsaXN0X2NvdW50ID4gMSA/IG1hc2sgOiBtYXNrIC0gMTsgY250ID49IDA7IC0tY250KQorICAgIGlmICgoY250ICYgfm1hc2spID09IDAKKwkmJiAoKGNudCAmIENFTl9TUEVDSUZJQykgPT0gMCB8fCAoY250ICYgWFBHX1NQRUNJRklDKSA9PSAwKQorCSYmICgoY250ICYgWFBHX0NPREVTRVQpID09IDAgfHwgKGNudCAmIFhQR19OT1JNX0NPREVTRVQpID09IDApKQorICAgICAgeworCWlmIChkaXJsaXN0X2NvdW50ID4gMSkKKwkgIHsKKwkgICAgLyogSXRlcmF0ZSBvdmVyIGFsbCBlbGVtZW50cyBvZiB0aGUgRElSTElTVC4gICovCisJICAgIGNoYXIgKmRpciA9IE5VTEw7CisKKwkgICAgd2hpbGUgKChkaXIgPSBfX2FyZ3pfbmV4dCAoKGNoYXIgKikgZGlybGlzdCwgZGlybGlzdF9sZW4sIGRpcikpCisJCSAgICE9IE5VTEwpCisJICAgICAgcmV0dmFsLT5zdWNjZXNzb3JbZW50cmllcysrXQorCQk9IF9ubF9tYWtlX2wxMG5mbGlzdCAobDEwbmZpbGVfbGlzdCwgZGlyLCBzdHJsZW4gKGRpcikgKyAxLAorCQkJCSAgICAgIGNudCwgbGFuZ3VhZ2UsIHRlcnJpdG9yeSwgY29kZXNldCwKKwkJCQkgICAgICBub3JtYWxpemVkX2NvZGVzZXQsIG1vZGlmaWVyLCBzcGVjaWFsLAorCQkJCSAgICAgIHNwb25zb3IsIHJldmlzaW9uLCBmaWxlbmFtZSwgMSk7CisJICB9CisJZWxzZQorCSAgcmV0dmFsLT5zdWNjZXNzb3JbZW50cmllcysrXQorCSAgICA9IF9ubF9tYWtlX2wxMG5mbGlzdCAobDEwbmZpbGVfbGlzdCwgZGlybGlzdCwgZGlybGlzdF9sZW4sCisJCQkJICBjbnQsIGxhbmd1YWdlLCB0ZXJyaXRvcnksIGNvZGVzZXQsCisJCQkJICBub3JtYWxpemVkX2NvZGVzZXQsIG1vZGlmaWVyLCBzcGVjaWFsLAorCQkJCSAgc3BvbnNvciwgcmV2aXNpb24sIGZpbGVuYW1lLCAxKTsKKyAgICAgIH0KKyAgcmV0dmFsLT5zdWNjZXNzb3JbZW50cmllc10gPSBOVUxMOworCisgIHJldHVybiByZXR2YWw7Cit9CisMCisvKiBOb3JtYWxpemUgY29kZXNldCBuYW1lLiAgVGhlcmUgaXMgbm8gc3RhbmRhcmQgZm9yIHRoZSBjb2Rlc2V0CisgICBuYW1lcy4gIE5vcm1hbGl6YXRpb24gYWxsb3dzIHRoZSB1c2VyIHRvIHVzZSBhbnkgb2YgdGhlIGNvbW1vbgorICAgbmFtZXMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhbmQgaGFzIHRvIGJlCisgICBmcmVlZCBieSB0aGUgY2FsbGVyLiAgKi8KK2NvbnN0IGNoYXIgKgorX25sX25vcm1hbGl6ZV9jb2Rlc2V0IChjb25zdCBjaGFyICpjb2Rlc2V0LCBzaXplX3QgbmFtZV9sZW4pCit7CisgIGludCBsZW4gPSAwOworICBpbnQgb25seV9kaWdpdCA9IDE7CisgIGNoYXIgKnJldHZhbDsKKyAgY2hhciAqd3A7CisgIHNpemVfdCBjbnQ7CisKKyAgZm9yIChjbnQgPSAwOyBjbnQgPCBuYW1lX2xlbjsgKytjbnQpCisgICAgaWYgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBjb2Rlc2V0W2NudF0pKQorICAgICAgeworCSsrbGVuOworCisJaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBjb2Rlc2V0W2NudF0pKQorCSAgb25seV9kaWdpdCA9IDA7CisgICAgICB9CisKKyAgcmV0dmFsID0gKGNoYXIgKikgbWFsbG9jICgob25seV9kaWdpdCA/IDMgOiAwKSArIGxlbiArIDEpOworCisgIGlmIChyZXR2YWwgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAob25seV9kaWdpdCkKKwl3cCA9IHN0cGNweSAocmV0dmFsLCAiaXNvIik7CisgICAgICBlbHNlCisJd3AgPSByZXR2YWw7CisKKyAgICAgIGZvciAoY250ID0gMDsgY250IDwgbmFtZV9sZW47ICsrY250KQorCWlmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgY29kZXNldFtjbnRdKSkKKwkgICp3cCsrID0gdG9sb3dlciAoKHVuc2lnbmVkIGNoYXIpIGNvZGVzZXRbY250XSk7CisJZWxzZSBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGNvZGVzZXRbY250XSkpCisJICAqd3ArKyA9IGNvZGVzZXRbY250XTsKKworICAgICAgKndwID0gJ1wwJzsKKyAgICB9CisKKyAgcmV0dXJuIChjb25zdCBjaGFyICopIHJldHZhbDsKK30KKworCisvKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KKworLyogV2UgZG9uJ3Qgd2FudCBsaWJpbnRsLmEgdG8gZGVwZW5kIG9uIGFueSBvdGhlciBsaWJyYXJ5LiAgU28gd2UKKyAgIGF2b2lkIHRoZSBub24tc3RhbmRhcmQgZnVuY3Rpb24gc3RwY3B5LiAgSW4gR05VIEMgTGlicmFyeSB0aGlzCisgICBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIHRob3VnaC4gIEFsc28gYWxsb3cgdGhlIHN5bWJvbCBIQVZFX1NUUENQWQorICAgdG8gYmUgZGVmaW5lZC4gICovCisjaWYgIV9MSUJDICYmICFIQVZFX1NUUENQWQorc3RhdGljIGNoYXIgKgorc3RwY3B5IChjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpCit7CisgIHdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKKyAgICAvKiBEbyBub3RoaW5nLiAqLyA7CisgIHJldHVybiBkZXN0IC0gMTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2xpYmdudWludGwuaC5pbiBiL3VuaXgvaW50bC9saWJnbnVpbnRsLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlN2ViOQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9saWJnbnVpbnRsLmguaW4KQEAgLTAsMCArMSwzODMgQEAKKy8qIE1lc3NhZ2UgY2F0YWxvZ3MgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX0xJQklOVExfSAorI2RlZmluZSBfTElCSU5UTF9ICTEKKworI2luY2x1ZGUgPGxvY2FsZS5oPgorCisvKiBUaGUgTENfTUVTU0FHRVMgbG9jYWxlIGNhdGVnb3J5IGlzIHRoZSBjYXRlZ29yeSB1c2VkIGJ5IHRoZSBmdW5jdGlvbnMKKyAgIGdldHRleHQoKSBhbmQgZGdldHRleHQoKS4gIEl0IGlzIHNwZWNpZmllZCBpbiBQT1NJWCwgYnV0IG5vdCBpbiBBTlNJIEMuCisgICBPbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgZGVmaW5lIGl0LCB1c2UgYW4gYXJiaXRyYXJ5IHZhbHVlIGluc3RlYWQuCisgICBPbiBTb2xhcmlzLCA8bG9jYWxlLmg+IGRlZmluZXMgX19MT0NBTEVfSCAob3IgX0xPQ0FMRV9IIGluIFNvbGFyaXMgMi41KQorICAgdGhlbiBpbmNsdWRlcyA8bGliaW50bC5oPiAoaS5lLiB0aGlzIGZpbGUhKSBhbmQgdGhlbiBvbmx5IGRlZmluZXMKKyAgIExDX01FU1NBR0VTLiAgVG8gYXZvaWQgYSByZWRlZmluaXRpb24gd2FybmluZywgZG9uJ3QgZGVmaW5lIExDX01FU1NBR0VTCisgICBpbiB0aGlzIGNhc2UuICAqLworI2lmICFkZWZpbmVkIExDX01FU1NBR0VTICYmICEoZGVmaW5lZCBfX0xPQ0FMRV9IIHx8IChkZWZpbmVkIF9MT0NBTEVfSCAmJiBkZWZpbmVkIF9fc3VuKSkKKyMgZGVmaW5lIExDX01FU1NBR0VTIDE3MjkKKyNlbmRpZgorCisvKiBXZSBkZWZpbmUgYW4gYWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIHRoZSBHTlUKKyAgIGltcGxlbWVudGF0aW9uIG9mIGdldHRleHQuICAqLworI2RlZmluZSBfX1VTRV9HTlVfR0VUVEVYVCAxCisKKy8qIFByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN1cHBvcnRlZCBmaWxlIGZvcm1hdHMuICBSZXR1cm5zIHRoZQorICAgbWF4aW11bSBtaW5vciByZXZpc2lvbiBudW1iZXIgc3VwcG9ydGVkIGZvciBhIGdpdmVuIG1ham9yIHJldmlzaW9uLiAgKi8KKyNkZWZpbmUgX19HTlVfR0VUVEVYVF9TVVBQT1JURURfUkVWSVNJT04obWFqb3IpIFwKKyAgKChtYWpvcikgPT0gMCA/IDEgOiAtMSkKKworLyogUmVzb2x2ZSBhIHBsYXRmb3JtIHNwZWNpZmljIGNvbmZsaWN0IG9uIERKR1BQLiAgR05VIGdldHRleHQgdGFrZXMKKyAgIHByZWNlZGVuY2Ugb3ZlciBfY29uaW9fZ2V0dGV4dC4gICovCisjaWZkZWYgX19ESkdQUF9fCisjIHVuZGVmIGdldHRleHQKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogV2UgcmVkaXJlY3QgdGhlIGZ1bmN0aW9ucyB0byB0aG9zZSBwcmVmaXhlZCB3aXRoICJsaWJpbnRsXyIuICBUaGlzIGlzCisgICBuZWNlc3NhcnksIGJlY2F1c2Ugc29tZSBzeXN0ZW1zIGRlZmluZSBnZXR0ZXh0L3RleHRkb21haW4vLi4uIGluIHRoZSBDCisgICBsaWJyYXJ5IChuYW1lbHksIFNvbGFyaXMgMi40IGFuZCBuZXdlciwgYW5kIEdOVSBsaWJjIDIuMCBhbmQgbmV3ZXIpLgorICAgSWYgd2UgdXNlZCB0aGUgdW5wcmVmaXhlZCBuYW1lcywgdGhlcmUgd291bGQgYmUgY2FzZXMgd2hlcmUgdGhlCisgICBkZWZpbml0aW9uIGluIHRoZSBDIGxpYnJhcnkgd291bGQgb3ZlcnJpZGUgdGhlIG9uZSBpbiB0aGUgbGliaW50bC5zbworICAgc2hhcmVkIGxpYnJhcnkuICBSZWNhbGwgdGhhdCBvbiBFTEYgc3lzdGVtcywgdGhlIHN5bWJvbHMgYXJlIGxvb2tlZAorICAgdXAgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKyAgICAgMS4gaW4gdGhlIGV4ZWN1dGFibGUsCisgICAgIDIuIGluIHRoZSBzaGFyZWQgbGlicmFyaWVzIHNwZWNpZmllZCBvbiB0aGUgbGluayBjb21tYW5kIGxpbmUsIGluIG9yZGVyLAorICAgICAzLiBpbiB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyaWVzIHNwZWNpZmllZCBvbiB0aGUgbGluaworICAgICAgICBjb21tYW5kIGxpbmUsCisgICAgIDQuIGluIHRoZSBkbG9wZW4oKWVkIHNoYXJlZCBsaWJyYXJpZXMsIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUKKyAgICAgICAgZGxvcGVuKCllZC4KKyAgIFRoZSBkZWZpbml0aW9uIGluIHRoZSBDIGxpYnJhcnkgd291bGQgb3ZlcnJpZGUgdGhlIG9uZSBpbiBsaWJpbnRsLnNvIGlmCisgICBlaXRoZXIKKyAgICAgKiAtbGMgaXMgZ2l2ZW4gb24gdGhlIGxpbmsgY29tbWFuZCBsaW5lIGFuZCAtbGludGwgaXNuJ3QsIG9yCisgICAgICogLWxjIGlzIGdpdmVuIG9uIHRoZSBsaW5rIGNvbW1hbmQgbGluZSBiZWZvcmUgLWxpbnRsLCBvcgorICAgICAqIGxpYmludGwuc28gaXMgYSBkZXBlbmRlbmN5IG9mIGEgZGxvcGVuKCllZCBzaGFyZWQgbGlicmFyeSBidXQgbm90CisgICAgICAgbGlua2VkIHRvIHRoZSBleGVjdXRhYmxlIGF0IGxpbmsgdGltZS4KKyAgIFNpbmNlIFNvbGFyaXMgZ2V0dGV4dCgpIGJlaGF2ZXMgZGlmZmVyZW50bHkgdGhhbiBHTlUgZ2V0dGV4dCgpLCB0aGlzCisgICB3b3VsZCBiZSB1bmFjY2VwdGFibGUuCisKKyAgIFRoZSByZWRpcmVjdGlvbiBoYXBwZW5zIGJ5IGRlZmF1bHQgdGhyb3VnaCBtYWNyb3MgaW4gQywgc28gdGhhdCAmZ2V0dGV4dAorICAgaXMgaW5kZXBlbmRlbnQgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIGJ1dCB0aHJvdWdoIGlubGluZSBmdW5jdGlvbnMgaW4KKyAgIEMrKywgaW4gb3JkZXIgbm90IHRvIGludGVyZmVyZSB3aXRoIHRoZSBuYW1lIG1hbmdsaW5nIG9mIGNsYXNzIGZpZWxkcyBvcgorICAgY2xhc3MgbWV0aG9kcyBjYWxsZWQgJ2dldHRleHQnLiAgKi8KKworLyogVGhlIHVzZXIgY2FuIGRlZmluZSBfSU5UTF9SRURJUkVDVF9JTkxJTkUgb3IgX0lOVExfUkVESVJFQ1RfTUFDUk9TLgorICAgSWYgaGUgZG9lc24ndCwgd2UgY2hvb3NlIHRoZSBtZXRob2QuICBBIHRoaXJkIHBvc3NpYmxlIG1ldGhvZCBpcworICAgX0lOVExfUkVESVJFQ1RfQVNNLCBzdXBwb3J0ZWQgb25seSBieSBHQ0MuICAqLworI2lmICEoZGVmaW5lZCBfSU5UTF9SRURJUkVDVF9JTkxJTkUgfHwgZGVmaW5lZCBfSU5UTF9SRURJUkVDVF9NQUNST1MpCisjIGlmIF9fR05VQ19fID49IDIgJiYgIWRlZmluZWQgX19BUFBMRV9DQ19fICYmICFkZWZpbmVkIF9fTUlOR1czMl9fICYmICEoX19HTlVDX18gPT0gMiAmJiBkZWZpbmVkIF9BSVgpICYmIChkZWZpbmVkIF9fU1REQ19fIHx8IGRlZmluZWQgX19jcGx1c3BsdXMpCisjICBkZWZpbmUgX0lOVExfUkVESVJFQ1RfQVNNCisjIGVsc2UKKyMgIGlmZGVmIF9fY3BsdXNwbHVzCisjICAgZGVmaW5lIF9JTlRMX1JFRElSRUNUX0lOTElORQorIyAgZWxzZQorIyAgIGRlZmluZSBfSU5UTF9SRURJUkVDVF9NQUNST1MKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKy8qIEF1eGlsaWFyeSBtYWNyb3MuICAqLworI2lmZGVmIF9JTlRMX1JFRElSRUNUX0FTTQorIyBkZWZpbmUgX0lOVExfQVNNKGNuYW1lKSBfX2FzbV9fIChfSU5UTF9BU01OQU1FIChfX1VTRVJfTEFCRUxfUFJFRklYX18sICNjbmFtZSkpCisjIGRlZmluZSBfSU5UTF9BU01OQU1FKHByZWZpeCxjbmFtZXN0cmluZykgX0lOVExfU1RSSU5HSUZZIChwcmVmaXgpIGNuYW1lc3RyaW5nCisjIGRlZmluZSBfSU5UTF9TVFJJTkdJRlkocHJlZml4KSAjcHJlZml4CisjZWxzZQorIyBkZWZpbmUgX0lOVExfQVNNKGNuYW1lKQorI2VuZGlmCisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50CisgICBMQ19NRVNTQUdFUyBsb2NhbGUuICBJZiBub3QgZm91bmQsIHJldHVybnMgTVNHSUQgaXRzZWxmICh0aGUgZGVmYXVsdAorICAgdGV4dCkuICAqLworI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorZXh0ZXJuIGNoYXIgKmxpYmludGxfZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZCk7CitzdGF0aWMgaW5saW5lIGNoYXIgKmdldHRleHQgKGNvbnN0IGNoYXIgKl9fbXNnaWQpCit7CisgIHJldHVybiBsaWJpbnRsX2dldHRleHQgKF9fbXNnaWQpOworfQorI2Vsc2UKKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKyMgZGVmaW5lIGdldHRleHQgbGliaW50bF9nZXR0ZXh0CisjZW5kaWYKK2V4dGVybiBjaGFyICpnZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkKQorICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9nZXR0ZXh0KTsKKyNlbmRpZgorCisvKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKKyAgIExDX01FU1NBR0VTIGxvY2FsZS4gICovCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCitleHRlcm4gY2hhciAqbGliaW50bF9kZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKTsKK3N0YXRpYyBpbmxpbmUgY2hhciAqZGdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCkKK3sKKyAgcmV0dXJuIGxpYmludGxfZGdldHRleHQgKF9fZG9tYWlubmFtZSwgX19tc2dpZCk7Cit9CisjZWxzZQorI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUworIyBkZWZpbmUgZGdldHRleHQgbGliaW50bF9kZ2V0dGV4dAorI2VuZGlmCitleHRlcm4gY2hhciAqZGdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCkKKyAgICAgICBfSU5UTF9BU00gKGxpYmludGxfZGdldHRleHQpOworI2VuZGlmCisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQorICAgbG9jYWxlLiAgKi8KKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKK2V4dGVybiBjaGFyICpsaWJpbnRsX2RjZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAorCQkJCWludCBfX2NhdGVnb3J5KTsKK3N0YXRpYyBpbmxpbmUgY2hhciAqZGNnZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCisJCQkgICAgICAgaW50IF9fY2F0ZWdvcnkpCit7CisgIHJldHVybiBsaWJpbnRsX2RjZ2V0dGV4dCAoX19kb21haW5uYW1lLCBfX21zZ2lkLCBfX2NhdGVnb3J5KTsKK30KKyNlbHNlCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisjIGRlZmluZSBkY2dldHRleHQgbGliaW50bF9kY2dldHRleHQKKyNlbmRpZgorZXh0ZXJuIGNoYXIgKmRjZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkLAorCQkJaW50IF9fY2F0ZWdvcnkpCisgICAgICAgX0lOVExfQVNNIChsaWJpbnRsX2RjZ2V0dGV4dCk7CisjZW5kaWYKKworCisvKiBTaW1pbGFyIHRvIGBnZXR0ZXh0JyBidXQgc2VsZWN0IHRoZSBwbHVyYWwgZm9ybSBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgbnVtYmVyIE4uICAqLworI2lmZGVmIF9JTlRMX1JFRElSRUNUX0lOTElORQorZXh0ZXJuIGNoYXIgKmxpYmludGxfbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGludCBfX24pOworc3RhdGljIGlubGluZSBjaGFyICpuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19tc2dpZDEsIGNvbnN0IGNoYXIgKl9fbXNnaWQyLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBpbnQgX19uKQoreworICByZXR1cm4gbGliaW50bF9uZ2V0dGV4dCAoX19tc2dpZDEsIF9fbXNnaWQyLCBfX24pOworfQorI2Vsc2UKKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9NQUNST1MKKyMgZGVmaW5lIG5nZXR0ZXh0IGxpYmludGxfbmdldHRleHQKKyNlbmRpZgorZXh0ZXJuIGNoYXIgKm5nZXR0ZXh0IChjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGludCBfX24pCisgICAgICAgX0lOVExfQVNNIChsaWJpbnRsX25nZXR0ZXh0KTsKKyNlbmRpZgorCisvKiBTaW1pbGFyIHRvIGBkZ2V0dGV4dCcgYnV0IHNlbGVjdCB0aGUgcGx1cmFsIGZvcm0gY29ycmVzcG9uZGluZyB0byB0aGUKKyAgIG51bWJlciBOLiAgKi8KKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKK2V4dGVybiBjaGFyICpsaWJpbnRsX2RuZ2V0dGV4dCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkMSwKKwkJCQljb25zdCBjaGFyICpfX21zZ2lkMiwgdW5zaWduZWQgbG9uZyBpbnQgX19uKTsKK3N0YXRpYyBpbmxpbmUgY2hhciAqZG5nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQxLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKl9fbXNnaWQyLCB1bnNpZ25lZCBsb25nIGludCBfX24pCit7CisgIHJldHVybiBsaWJpbnRsX2RuZ2V0dGV4dCAoX19kb21haW5uYW1lLCBfX21zZ2lkMSwgX19tc2dpZDIsIF9fbik7Cit9CisjZWxzZQorI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUworIyBkZWZpbmUgZG5nZXR0ZXh0IGxpYmludGxfZG5nZXR0ZXh0CisjZW5kaWYKK2V4dGVybiBjaGFyICpkbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCWNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKwkJCXVuc2lnbmVkIGxvbmcgaW50IF9fbikKKyAgICAgICBfSU5UTF9BU00gKGxpYmludGxfZG5nZXR0ZXh0KTsKKyNlbmRpZgorCisvKiBTaW1pbGFyIHRvIGBkY2dldHRleHQnIGJ1dCBzZWxlY3QgdGhlIHBsdXJhbCBmb3JtIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICBudW1iZXIgTi4gICovCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCitleHRlcm4gY2hhciAqbGliaW50bF9kY25nZXR0ZXh0IChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkJIGNvbnN0IGNoYXIgKl9fbXNnaWQxLCBjb25zdCBjaGFyICpfX21zZ2lkMiwKKwkJCQkgdW5zaWduZWQgbG9uZyBpbnQgX19uLCBpbnQgX19jYXRlZ29yeSk7CitzdGF0aWMgaW5saW5lIGNoYXIgKmRjbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCQljb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisJCQkJdW5zaWduZWQgbG9uZyBpbnQgX19uLCBpbnQgX19jYXRlZ29yeSkKK3sKKyAgcmV0dXJuIGxpYmludGxfZGNuZ2V0dGV4dCAoX19kb21haW5uYW1lLCBfX21zZ2lkMSwgX19tc2dpZDIsIF9fbiwgX19jYXRlZ29yeSk7Cit9CisjZWxzZQorI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUworIyBkZWZpbmUgZGNuZ2V0dGV4dCBsaWJpbnRsX2RjbmdldHRleHQKKyNlbmRpZgorZXh0ZXJuIGNoYXIgKmRjbmdldHRleHQgKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKKwkJCSBjb25zdCBjaGFyICpfX21zZ2lkMSwgY29uc3QgY2hhciAqX19tc2dpZDIsCisJCQkgdW5zaWduZWQgbG9uZyBpbnQgX19uLCBpbnQgX19jYXRlZ29yeSkKKyAgICAgICBfSU5UTF9BU00gKGxpYmludGxfZGNuZ2V0dGV4dCk7CisjZW5kaWYKKworCisvKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KKyAgIElmIERPTUFJTk5BTUUgaXMgbnVsbCwgcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQuCisgICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKK2V4dGVybiBjaGFyICpsaWJpbnRsX3RleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSk7CitzdGF0aWMgaW5saW5lIGNoYXIgKnRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkKK3sKKyAgcmV0dXJuIGxpYmludGxfdGV4dGRvbWFpbiAoX19kb21haW5uYW1lKTsKK30KKyNlbHNlCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisjIGRlZmluZSB0ZXh0ZG9tYWluIGxpYmludGxfdGV4dGRvbWFpbgorI2VuZGlmCitleHRlcm4gY2hhciAqdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lKQorICAgICAgIF9JTlRMX0FTTSAobGliaW50bF90ZXh0ZG9tYWluKTsKKyNlbmRpZgorCisvKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKKyAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KKyNpZmRlZiBfSU5UTF9SRURJUkVDVF9JTkxJTkUKK2V4dGVybiBjaGFyICpsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluIChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCisJCQkJICAgICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpOworc3RhdGljIGlubGluZSBjaGFyICpiaW5kdGV4dGRvbWFpbiAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJCSAgICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpCit7CisgIHJldHVybiBsaWJpbnRsX2JpbmR0ZXh0ZG9tYWluIChfX2RvbWFpbm5hbWUsIF9fZGlybmFtZSk7Cit9CisjZWxzZQorI2lmZGVmIF9JTlRMX1JFRElSRUNUX01BQ1JPUworIyBkZWZpbmUgYmluZHRleHRkb21haW4gbGliaW50bF9iaW5kdGV4dGRvbWFpbgorI2VuZGlmCitleHRlcm4gY2hhciAqYmluZHRleHRkb21haW4gKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19kaXJuYW1lKQorICAgICAgIF9JTlRMX0FTTSAobGliaW50bF9iaW5kdGV4dGRvbWFpbik7CisjZW5kaWYKKworLyogU3BlY2lmeSB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGluIHdoaWNoIHRoZSBtZXNzYWdlcyBmcm9tIHRoZQorICAgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSByZXR1cm5lZC4gICovCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfSU5MSU5FCitleHRlcm4gY2hhciAqbGliaW50bF9iaW5kX3RleHRkb21haW5fY29kZXNldCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJCQkgICAgICBjb25zdCBjaGFyICpfX2NvZGVzZXQpOworc3RhdGljIGlubGluZSBjaGFyICpiaW5kX3RleHRkb21haW5fY29kZXNldCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKl9fY29kZXNldCkKK3sKKyAgcmV0dXJuIGxpYmludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgKF9fZG9tYWlubmFtZSwgX19jb2Rlc2V0KTsKK30KKyNlbHNlCisjaWZkZWYgX0lOVExfUkVESVJFQ1RfTUFDUk9TCisjIGRlZmluZSBiaW5kX3RleHRkb21haW5fY29kZXNldCBsaWJpbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0CisjZW5kaWYKK2V4dGVybiBjaGFyICpiaW5kX3RleHRkb21haW5fY29kZXNldCAoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKl9fY29kZXNldCkKKyAgICAgICBfSU5UTF9BU00gKGxpYmludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQpOworI2VuZGlmCisKKworLyogU3VwcG9ydCBmb3IgZm9ybWF0IHN0cmluZ3Mgd2l0aCBwb3NpdGlvbnMgaW4gKnByaW50ZigpLCBmb2xsb3dpbmcgdGhlCisgICBQT1NJWC9YU0kgc3BlY2lmaWNhdGlvbi4KKyAgIE5vdGU6IFRoZXNlIHJlcGxhY2VtZW50cyBmb3IgdGhlICpwcmludGYoKSBmdW5jdGlvbnMgYXJlIHZpc2libGUgb25seQorICAgaW4gc291cmNlIGZpbGVzIHRoYXQgI2luY2x1ZGUgPGxpYmludGwuaD4gb3IgI2luY2x1ZGUgImdldHRleHQuaCIuCisgICBQYWNrYWdlcyB0aGF0IHVzZSAqcHJpbnRmKCkgaW4gc291cmNlIGZpbGVzIHRoYXQgZG9uJ3QgcmVmZXIgdG8gXygpCisgICBvciBnZXR0ZXh0KCkgYnV0IGZvciB3aGljaCB0aGUgZm9ybWF0IHN0cmluZyBjb3VsZCBiZSB0aGUgcmV0dXJuIHZhbHVlCisgICBvZiBfKCkgb3IgZ2V0dGV4dCgpIG5lZWQgdG8gYWRkIHRoaXMgI2luY2x1ZGUuICBPaCB3ZWxsLiAgKi8KKworI2lmICFASEFWRV9QT1NJWF9QUklOVEZACisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBHZXQgdmFfbGlzdC4gICovCisjaWYgX19TVERDX18gfHwgZGVmaW5lZCBfX2NwbHVzcGx1cyB8fCBkZWZpbmVkIF9NU0NfVkVSCisjIGluY2x1ZGUgPHN0ZGFyZy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8dmFyYXJncy5oPgorI2VuZGlmCisKKyN1bmRlZiBmcHJpbnRmCisjZGVmaW5lIGZwcmludGYgbGliaW50bF9mcHJpbnRmCitleHRlcm4gaW50IGZwcmludGYgKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pOworI3VuZGVmIHZmcHJpbnRmCisjZGVmaW5lIHZmcHJpbnRmIGxpYmludGxfdmZwcmludGYKK2V4dGVybiBpbnQgdmZwcmludGYgKEZJTEUgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKworI3VuZGVmIHByaW50ZgorI2RlZmluZSBwcmludGYgbGliaW50bF9wcmludGYKK2V4dGVybiBpbnQgcHJpbnRmIChjb25zdCBjaGFyICosIC4uLik7CisjdW5kZWYgdnByaW50ZgorI2RlZmluZSB2cHJpbnRmIGxpYmludGxfdnByaW50ZgorZXh0ZXJuIGludCB2cHJpbnRmIChjb25zdCBjaGFyICosIHZhX2xpc3QpOworCisjdW5kZWYgc3ByaW50ZgorI2RlZmluZSBzcHJpbnRmIGxpYmludGxfc3ByaW50ZgorZXh0ZXJuIGludCBzcHJpbnRmIChjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKKyN1bmRlZiB2c3ByaW50ZgorI2RlZmluZSB2c3ByaW50ZiBsaWJpbnRsX3ZzcHJpbnRmCitleHRlcm4gaW50IHZzcHJpbnRmIChjaGFyICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisKKyNpZiBASEFWRV9TTlBSSU5URkAKKworI3VuZGVmIHNucHJpbnRmCisjZGVmaW5lIHNucHJpbnRmIGxpYmludGxfc25wcmludGYKK2V4dGVybiBpbnQgc25wcmludGYgKGNoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosIC4uLik7CisjdW5kZWYgdnNucHJpbnRmCisjZGVmaW5lIHZzbnByaW50ZiBsaWJpbnRsX3ZzbnByaW50ZgorZXh0ZXJuIGludCB2c25wcmludGYgKGNoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworCisjZW5kaWYKKworI2lmIEBIQVZFX0FTUFJJTlRGQAorCisjdW5kZWYgYXNwcmludGYKKyNkZWZpbmUgYXNwcmludGYgbGliaW50bF9hc3ByaW50ZgorZXh0ZXJuIGludCBhc3ByaW50ZiAoY2hhciAqKiwgY29uc3QgY2hhciAqLCAuLi4pOworI3VuZGVmIHZhc3ByaW50ZgorI2RlZmluZSB2YXNwcmludGYgbGliaW50bF92YXNwcmludGYKK2V4dGVybiBpbnQgdmFzcHJpbnRmIChjaGFyICoqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworCisjZW5kaWYKKworI2lmIEBIQVZFX1dQUklOVEZACisKKyN1bmRlZiBmd3ByaW50ZgorI2RlZmluZSBmd3ByaW50ZiBsaWJpbnRsX2Z3cHJpbnRmCitleHRlcm4gaW50IGZ3cHJpbnRmIChGSUxFICosIGNvbnN0IHdjaGFyX3QgKiwgLi4uKTsKKyN1bmRlZiB2ZndwcmludGYKKyNkZWZpbmUgdmZ3cHJpbnRmIGxpYmludGxfdmZ3cHJpbnRmCitleHRlcm4gaW50IHZmd3ByaW50ZiAoRklMRSAqLCBjb25zdCB3Y2hhcl90ICosIHZhX2xpc3QpOworCisjdW5kZWYgd3ByaW50ZgorI2RlZmluZSB3cHJpbnRmIGxpYmludGxfd3ByaW50ZgorZXh0ZXJuIGludCB3cHJpbnRmIChjb25zdCB3Y2hhcl90ICosIC4uLik7CisjdW5kZWYgdndwcmludGYKKyNkZWZpbmUgdndwcmludGYgbGliaW50bF92d3ByaW50ZgorZXh0ZXJuIGludCB2d3ByaW50ZiAoY29uc3Qgd2NoYXJfdCAqLCB2YV9saXN0KTsKKworI3VuZGVmIHN3cHJpbnRmCisjZGVmaW5lIHN3cHJpbnRmIGxpYmludGxfc3dwcmludGYKK2V4dGVybiBpbnQgc3dwcmludGYgKHdjaGFyX3QgKiwgc2l6ZV90LCBjb25zdCB3Y2hhcl90ICosIC4uLik7CisjdW5kZWYgdnN3cHJpbnRmCisjZGVmaW5lIHZzd3ByaW50ZiBsaWJpbnRsX3Zzd3ByaW50ZgorZXh0ZXJuIGludCB2c3dwcmludGYgKHdjaGFyX3QgKiwgc2l6ZV90LCBjb25zdCB3Y2hhcl90ICosIHZhX2xpc3QpOworCisjZW5kaWYKKworI2VuZGlmCisKKworLyogU3VwcG9ydCBmb3IgcmVsb2NhdGFibGUgcGFja2FnZXMuICAqLworCisvKiBTZXRzIHRoZSBvcmlnaW5hbCBhbmQgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIHByZWZpeCBvZiB0aGUgcGFja2FnZS4KKyAgIFJlbG9jYXRpb24gc2ltcGx5IHJlcGxhY2VzIGEgcGF0aG5hbWUgc3RhcnRpbmcgd2l0aCB0aGUgb3JpZ2luYWwgcHJlZml4CisgICBieSB0aGUgY29ycmVzcG9uZGluZyBwYXRobmFtZSB3aXRoIHRoZSBjdXJyZW50IHByZWZpeCBpbnN0ZWFkLiAgQm90aAorICAgcHJlZml4ZXMgc2hvdWxkIGJlIGRpcmVjdG9yeSBuYW1lcyB3aXRob3V0IHRyYWlsaW5nIHNsYXNoIChpLmUuIHVzZSAiIgorICAgaW5zdGVhZCBvZiAiLyIpLiAgKi8KKyNkZWZpbmUgbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXgKK2V4dGVybiB2b2lkCisgICAgICAgbGliaW50bF9zZXRfcmVsb2NhdGlvbl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfcHJlZml4LAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmN1cnJfcHJlZml4KTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogbGliaW50bC5oICovCmRpZmYgLS1naXQgYS91bml4L2ludGwvbG9hZGluZm8uaCBiL3VuaXgvaW50bC9sb2FkaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTVlYmQKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvbG9hZGluZm8uaApAQCAtMCwwICsxLDE0NSBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk2LTE5OTksIDIwMDAtMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIF9MT0FESU5GT19ICisjZGVmaW5lIF9MT0FESU5GT19ICTEKKworLyogRGVjbGFyYXRpb25zIG9mIGxvY2FsZSBkZXBlbmRlbnQgY2F0YWxvZyBsb29rdXAgZnVuY3Rpb25zLgorICAgSW1wbGVtZW50ZWQgaW4KKworICAgICBsb2NhbGVhbGlhcy5jICAgIFBvc3NpYmx5IHJlcGxhY2UgYSBsb2NhbGUgbmFtZSBieSBhbm90aGVyLgorICAgICBleHBsb2RlbmFtZS5jICAgIFNwbGl0IGEgbG9jYWxlIG5hbWUgaW50byBpdHMgdmFyaW91cyBmaWVsZHMuCisgICAgIGwxMG5mbGlzdC5jICAgICAgR2VuZXJhdGUgYSBsaXN0IG9mIGZpbGVuYW1lcyBvZiBwb3NzaWJsZSBtZXNzYWdlIGNhdGFsb2dzLgorICAgICBmaW5kZG9tYWluLmMgICAgIEZpbmQgYW5kIG9wZW4gdGhlIHJlbGV2YW50IG1lc3NhZ2UgY2F0YWxvZ3MuCisKKyAgIFRoZSBtYWluIGZ1bmN0aW9uIF9ubF9maW5kX2RvbWFpbigpIGluIGZpbmRkb21haW4uYyBpcyBkZWNsYXJlZAorICAgaW4gZ2V0dGV4dFAuaC4KKyAqLworCisjaWZuZGVmIGludGVybmFsX2Z1bmN0aW9uCisjIGRlZmluZSBpbnRlcm5hbF9mdW5jdGlvbgorI2VuZGlmCisKKy8qIFRlbGwgdGhlIGNvbXBpbGVyIHdoZW4gYSBjb25kaXRpb25hbCBvciBpbnRlZ2VyIGV4cHJlc3Npb24gaXMKKyAgIGFsbW9zdCBhbHdheXMgdHJ1ZSBvciBhbG1vc3QgYWx3YXlzIGZhbHNlLiAgKi8KKyNpZm5kZWYgSEFWRV9CVUlMVElOX0VYUEVDVAorIyBkZWZpbmUgX19idWlsdGluX2V4cGVjdChleHByLCB2YWwpIChleHByKQorI2VuZGlmCisKKy8qIFNlcGFyYXRvciBpbiBQQVRIIGxpa2UgbGlzdHMgb2YgcGF0aG5hbWVzLiAgKi8KKyNpZiBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXyB8fCBkZWZpbmVkIF9fRU1YX18gfHwgZGVmaW5lZCBfX0RKR1BQX18KKyAgLyogV2luMzIsIE9TLzIsIERPUyAqLworIyBkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJzsnCisjZWxzZQorICAvKiBVbml4ICovCisjIGRlZmluZSBQQVRIX1NFUEFSQVRPUiAnOicKKyNlbmRpZgorCisvKiBFbmNvZGluZyBvZiBsb2NhbGUgbmFtZSBwYXJ0cy4gICovCisjZGVmaW5lIENFTl9SRVZJU0lPTgkJMQorI2RlZmluZSBDRU5fU1BPTlNPUgkJMgorI2RlZmluZSBDRU5fU1BFQ0lBTAkJNAorI2RlZmluZSBYUEdfTk9STV9DT0RFU0VUCTgKKyNkZWZpbmUgWFBHX0NPREVTRVQJCTE2CisjZGVmaW5lIFRFUlJJVE9SWQkJMzIKKyNkZWZpbmUgQ0VOX0FVRElFTkNFCQk2NAorI2RlZmluZSBYUEdfTU9ESUZJRVIJCTEyOAorCisjZGVmaW5lIENFTl9TUEVDSUZJQwkoQ0VOX1JFVklTSU9OfENFTl9TUE9OU09SfENFTl9TUEVDSUFMfENFTl9BVURJRU5DRSkKKyNkZWZpbmUgWFBHX1NQRUNJRklDCShYUEdfQ09ERVNFVHxYUEdfTk9STV9DT0RFU0VUfFhQR19NT0RJRklFUikKKworCitzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlCit7CisgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICBpbnQgZGVjaWRlZDsKKworICBjb25zdCB2b2lkICpkYXRhOworCisgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKm5leHQ7CisgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnN1Y2Nlc3NvclsxXTsKK307CisKKworLyogTm9ybWFsaXplIGNvZGVzZXQgbmFtZS4gIFRoZXJlIGlzIG5vIHN0YW5kYXJkIGZvciB0aGUgY29kZXNldAorICAgbmFtZXMuICBOb3JtYWxpemF0aW9uIGFsbG93cyB0aGUgdXNlciB0byB1c2UgYW55IG9mIHRoZSBjb21tb24KKyAgIG5hbWVzLiAgVGhlIHJldHVybiB2YWx1ZSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYW5kIGhhcyB0byBiZQorICAgZnJlZWQgYnkgdGhlIGNhbGxlci4gICovCitleHRlcm4gY29uc3QgY2hhciAqX25sX25vcm1hbGl6ZV9jb2Rlc2V0IChjb25zdCBjaGFyICpjb2Rlc2V0LAorCQkJCQkgIHNpemVfdCBuYW1lX2xlbik7CisKKy8qIExvb2t1cCBhIGxvY2FsZSBkZXBlbmRlbnQgZmlsZS4KKyAgICpMMTBORklMRV9MSVNUIGRlbm90ZXMgYSBwb29sIG9mIGxvb2t1cCByZXN1bHRzIG9mIGxvY2FsZSBkZXBlbmRlbnQKKyAgIGZpbGVzIG9mIHRoZSBzYW1lIGtpbmQsIHNvcnRlZCBpbiBkZWNyZWFzaW5nIG9yZGVyIG9mIC0+ZmlsZW5hbWUuCisgICBESVJMSVNUIGFuZCBESVJMSVNUX0xFTiBhcmUgYW4gYXJneiBsaXN0IG9mIGRpcmVjdG9yaWVzIGluIHdoaWNoIHRvCisgICBsb29rLCBjb250YWluaW5nIGF0IGxlYXN0IG9uZSBkaXJlY3RvcnkgKGkuZS4gRElSTElTVF9MRU4gPiAwKS4KKyAgIE1BU0ssIExBTkdVQUdFLCBURVJSSVRPUlksIENPREVTRVQsIE5PUk1BTElaRURfQ09ERVNFVCwgTU9ESUZJRVIsCisgICBTUEVDSUFMLCBTUE9OU09SLCBSRVZJU0lPTiBhcmUgdGhlIHBpZWNlcyBvZiB0aGUgbG9jYWxlIG5hbWUsIGFzCisgICBwcm9kdWNlZCBieSBfbmxfZXhwbG9kZV9uYW1lKCkuICBGSUxFTkFNRSBpcyB0aGUgZmlsZW5hbWUgc3VmZml4LgorICAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbG9va3VwIHJlc3VsdCwgZWl0aGVyIGZvdW5kIGluICpMMTBORklMRV9MSVNULAorICAgb3IgLSBpZiBET19BTExPQ0FURSBpcyBub256ZXJvIC0gZnJlc2hseSBhbGxvY2F0ZWQsIG9yIHBvc3NpYmx5IE5VTEwuCisgICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5vbi1OVUxMLCBpdCBpcyBhZGRlZCB0byAqTDEwTkZJTEVfTElTVCwgYW5kCisgICBpdHMgLT5uZXh0IGZpZWxkIGRlbm90ZXMgdGhlIGNoYWluaW5nIGluc2lkZSAqTDEwTkZJTEVfTElTVCwgYW5kCisgICBmdXJ0aGVybW9yZSBpdHMgLT5zdWNjZXNzb3JbXSBmaWVsZCBjb250YWlucyBhIGxpc3Qgb2Ygb3RoZXIgbG9va3VwCisgICByZXN1bHRzIGZyb20gd2hpY2ggdGhpcyBsb29rdXAgcmVzdWx0IGluaGVyaXRzLiAgKi8KK2V4dGVybiBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKK19ubF9tYWtlX2wxMG5mbGlzdCAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqKmwxMG5maWxlX2xpc3QsCisJCSAgICBjb25zdCBjaGFyICpkaXJsaXN0LCBzaXplX3QgZGlybGlzdF9sZW4sIGludCBtYXNrLAorCQkgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2UsIGNvbnN0IGNoYXIgKnRlcnJpdG9yeSwKKwkJICAgIGNvbnN0IGNoYXIgKmNvZGVzZXQsIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZWRfY29kZXNldCwKKwkJICAgIGNvbnN0IGNoYXIgKm1vZGlmaWVyLCBjb25zdCBjaGFyICpzcGVjaWFsLAorCQkgICAgY29uc3QgY2hhciAqc3BvbnNvciwgY29uc3QgY2hhciAqcmV2aXNpb24sCisJCSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGRvX2FsbG9jYXRlKTsKKworLyogTG9va3VwIHRoZSByZWFsIGxvY2FsZSBuYW1lIGZvciBhIGxvY2FsZSBhbGlhcyBOQU1FLCBvciBOVUxMIGlmCisgICBOQU1FIGlzIG5vdCBhIGxvY2FsZSBhbGlhcyAoYnV0IHBvc3NpYmx5IGEgcmVhbCBsb2NhbGUgbmFtZSkuCisgICBUaGUgcmV0dXJuIHZhbHVlIGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGFuZCBtdXN0IG5vdCBiZSBmcmVlZC4gICovCitleHRlcm4gY29uc3QgY2hhciAqX25sX2V4cGFuZF9hbGlhcyAoY29uc3QgY2hhciAqbmFtZSk7CisKKy8qIFNwbGl0IGEgbG9jYWxlIG5hbWUgTkFNRSBpbnRvIGl0cyBwaWVjZXM6IGxhbmd1YWdlLCBtb2RpZmllciwKKyAgIHRlcnJpdG9yeSwgY29kZXNldCwgc3BlY2lhbCwgc3BvbnNvciwgcmV2aXNpb24uCisgICBOQU1FIGdldHMgZGVzdHJ1Y3RpdmVseSBtb2RpZmllZDogTlVMIGJ5dGVzIGFyZSBpbnNlcnRlZCBoZXJlIGFuZAorICAgdGhlcmUuICAqTEFOR1VBR0UgZ2V0cyBhc3NpZ25lZCBOQU1FLiAgRWFjaCBvZiAqTU9ESUZJRVIsICpURVJSSVRPUlksCisgICAqQ09ERVNFVCwgKlNQRUNJQUwsICpTUE9OU09SLCAqUkVWSVNJT04gZ2V0cyBhc3NpZ25lZCBlaXRoZXIgYQorICAgcG9pbnRlciBpbnRvIHRoZSBvbGQgTkFNRSBzdHJpbmcsIG9yIE5VTEwuICAqTk9STUFMSVpFRF9DT0RFU0VUCisgICBnZXRzIGFzc2lnbmVkIHRoZSBleHBhbmRlZCAqQ09ERVNFVCwgaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gKkNPREVTRVQ7CisgICB0aGlzIG9uZSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYW5kIGhhcyB0byBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGJpdG1hc2ssIHdoZXJlIGVhY2ggYml0IGNvcnJlc3BvbmRzIHRvIG9uZQorICAgZmlsbGVkLWluIHZhbHVlOgorICAgICBYUEdfTU9ESUZJRVIsIENFTl9BVURJRU5DRSAgZm9yICpNT0RJRklFUiwKKyAgICAgVEVSUklUT1JZICAgICAgICAgICAgICAgICAgIGZvciAqVEVSUklUT1JZLAorICAgICBYUEdfQ09ERVNFVCAgICAgICAgICAgICAgICAgZm9yICpDT0RFU0VULAorICAgICBYUEdfTk9STV9DT0RFU0VUICAgICAgICAgICAgZm9yICpOT1JNQUxJWkVEX0NPREVTRVQsCisgICAgIENFTl9TUEVDSUFMICAgICAgICAgICAgICAgICBmb3IgKlNQRUNJQUwsCisgICAgIENFTl9TUE9OU09SICAgICAgICAgICAgICAgICBmb3IgKlNQT05TT1IsCisgICAgIENFTl9SRVZJU0lPTiAgICAgICAgICAgICAgICBmb3IgKlJFVklTSU9OLgorICovCitleHRlcm4gaW50IF9ubF9leHBsb2RlX25hbWUgKGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKipsYW5ndWFnZSwKKwkJCSAgICAgY29uc3QgY2hhciAqKm1vZGlmaWVyLCBjb25zdCBjaGFyICoqdGVycml0b3J5LAorCQkJICAgICBjb25zdCBjaGFyICoqY29kZXNldCwKKwkJCSAgICAgY29uc3QgY2hhciAqKm5vcm1hbGl6ZWRfY29kZXNldCwKKwkJCSAgICAgY29uc3QgY2hhciAqKnNwZWNpYWwsIGNvbnN0IGNoYXIgKipzcG9uc29yLAorCQkJICAgICBjb25zdCBjaGFyICoqcmV2aXNpb24pOworCisvKiBTcGxpdCBhIGxvY2FsZSBuYW1lIE5BTUUgaW50byBhIGxlYWRpbmcgbGFuZ3VhZ2UgcGFydCBhbmQgYWxsIHRoZQorICAgcmVzdC4gIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgbGFuZ3VhZ2UsCisgICBpLmUuIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSByZXN0LiAgKi8KK2V4dGVybiBjaGFyICpfbmxfZmluZF9sYW5ndWFnZSAoY29uc3QgY2hhciAqbmFtZSk7CisKKyNlbmRpZgkvKiBsb2FkaW5mby5oICovCmRpZmYgLS1naXQgYS91bml4L2ludGwvbG9hZG1zZ2NhdC5jIGIvdW5peC9pbnRsL2xvYWRtc2djYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWM1MWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2xvYWRtc2djYXQuYwpAQCAtMCwwICsxLDE0MjAgQEAKKy8qIExvYWQgbmVlZGVkIG1lc3NhZ2UgY2F0YWxvZ3MuCisgICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OSwgMjAwMC0yMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworLyogVGVsbCBnbGliYydzIDxzdHJpbmcuaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3IgbWVtcGNweSgpLgorICAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4gYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlCisgICA8ZmVhdHVyZXMuaD4sIGFuZCBvbmNlIDxmZWF0dXJlcy5oPiBoYXMgYmVlbiBpbmNsdWRlZCwgaXQncyB0b28gbGF0ZS4gICovCisjaWZuZGVmIF9HTlVfU09VUkNFCisjIGRlZmluZSBfR05VX1NPVVJDRSAgICAxCisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpZmRlZiBfX0dOVUNfXworIyB1bmRlZiAgYWxsb2NhCisjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQorI2Vsc2UKKyMgaWZkZWYgX01TQ19WRVIKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjIGVsc2UKKyMgIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhCitjaGFyICphbGxvY2EgKCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgZGVmaW5lZCBIQVZFX1VOSVNURF9IIHx8IGRlZmluZWQgX0xJQkMKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGxhbmdpbmZvLmg+CisjIGluY2x1ZGUgPGxvY2FsZS5oPgorI2VuZGlmCisKKyNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCisgICAgfHwgKGRlZmluZWQgX0xJQkMgJiYgZGVmaW5lZCBfUE9TSVhfTUFQUEVEX0ZJTEVTKQorIyBpbmNsdWRlIDxzeXMvbW1hbi5oPgorIyB1bmRlZiBIQVZFX01NQVAKKyMgZGVmaW5lIEhBVkVfTU1BUAkxCisjZWxzZQorIyB1bmRlZiBIQVZFX01NQVAKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBIQVZFX1NURElOVF9IX1dJVEhfVUlOVE1BWCB8fCBkZWZpbmVkIF9MSUJDCisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWYgZGVmaW5lZCBIQVZFX0lOVFRZUEVTX0ggfHwgZGVmaW5lZCBfTElCQworIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnbW8uaCIKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorI2luY2x1ZGUgImhhc2gtc3RyaW5nLmgiCisjaW5jbHVkZSAicGx1cmFsLWV4cC5oIgorCisjaWZkZWYgX0xJQkMKKyMgaW5jbHVkZSAiLi4vbG9jYWxlL2xvY2FsZWluZm8uaCIKKyNlbmRpZgorCisvKiBQcm92aWRlIGZhbGxiYWNrIHZhbHVlcyBmb3IgbWFjcm9zIHRoYXQgb3VnaHQgdG8gYmUgZGVmaW5lZCBpbiA8aW50dHlwZXMuaD4uCisgICBOb3RlIHRoYXQgb3VyIGZhbGxiYWNrIHZhbHVlcyBuZWVkIG5vdCBiZSBsaXRlcmFsIHN0cmluZ3MsIGJlY2F1c2Ugd2UgZG9uJ3QKKyAgIHVzZSB0aGVtIHdpdGggcHJlcHJvY2Vzc29yIHN0cmluZyBjb25jYXRlbmF0aW9uLiAgKi8KKyNpZiAhZGVmaW5lZCBQUklkOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkOAorIyBkZWZpbmUgUFJJZDggImQiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklpOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpOAorIyBkZWZpbmUgUFJJaTggImkiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklvOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvOAorIyBkZWZpbmUgUFJJbzggIm8iCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl1OCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1OAorIyBkZWZpbmUgUFJJdTggInUiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl4OCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4OAorIyBkZWZpbmUgUFJJeDggIngiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklYOCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYOAorIyBkZWZpbmUgUFJJWDggIlgiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklkMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZDE2CisjIGRlZmluZSBQUklkMTYgImQiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklpMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaTE2CisjIGRlZmluZSBQUklpMTYgImkiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklvMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJbzE2CisjIGRlZmluZSBQUklvMTYgIm8iCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl1MTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdTE2CisjIGRlZmluZSBQUkl1MTYgInUiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl4MTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeDE2CisjIGRlZmluZSBQUkl4MTYgIngiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklYMTYgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWDE2CisjIGRlZmluZSBQUklYMTYgIlgiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklkMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZDMyCisjIGRlZmluZSBQUklkMzIgImQiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklpMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaTMyCisjIGRlZmluZSBQUklpMzIgImkiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklvMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJbzMyCisjIGRlZmluZSBQUklvMzIgIm8iCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl1MzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdTMyCisjIGRlZmluZSBQUkl1MzIgInUiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl4MzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeDMyCisjIGRlZmluZSBQUkl4MzIgIngiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklYMzIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWDMyCisjIGRlZmluZSBQUklYMzIgIlgiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklkNjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZDY0CisjIGRlZmluZSBQUklkNjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJsZCIgOiAibGxkIikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSWk2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpNjQKKyMgZGVmaW5lIFBSSWk2NCAoc2l6ZW9mIChsb25nKSA9PSA4ID8gImxpIiA6ICJsbGkiKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJbzY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW82NAorIyBkZWZpbmUgUFJJbzY0IChzaXplb2YgKGxvbmcpID09IDggPyAibG8iIDogImxsbyIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl1NjQgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdTY0CisjIGRlZmluZSBQUkl1NjQgKHNpemVvZiAobG9uZykgPT0gOCA/ICJsdSIgOiAibGx1IikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSXg2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4NjQKKyMgZGVmaW5lIFBSSXg2NCAoc2l6ZW9mIChsb25nKSA9PSA4ID8gImx4IiA6ICJsbHgiKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJWDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVg2NAorIyBkZWZpbmUgUFJJWDY0IChzaXplb2YgKGxvbmcpID09IDggPyAibFgiIDogImxsWCIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklkTEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWRMRUFTVDgKKyMgZGVmaW5lIFBSSWRMRUFTVDggImQiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklpTEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWlMRUFTVDgKKyMgZGVmaW5lIFBSSWlMRUFTVDggImkiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklvTEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW9MRUFTVDgKKyMgZGVmaW5lIFBSSW9MRUFTVDggIm8iCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl1TEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXVMRUFTVDgKKyMgZGVmaW5lIFBSSXVMRUFTVDggInUiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl4TEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXhMRUFTVDgKKyMgZGVmaW5lIFBSSXhMRUFTVDggIngiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklYTEVBU1Q4IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVhMRUFTVDgKKyMgZGVmaW5lIFBSSVhMRUFTVDggIlgiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklkTEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkTEVBU1QxNgorIyBkZWZpbmUgUFJJZExFQVNUMTYgImQiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklpTEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpTEVBU1QxNgorIyBkZWZpbmUgUFJJaUxFQVNUMTYgImkiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklvTEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvTEVBU1QxNgorIyBkZWZpbmUgUFJJb0xFQVNUMTYgIm8iCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl1TEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1TEVBU1QxNgorIyBkZWZpbmUgUFJJdUxFQVNUMTYgInUiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl4TEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4TEVBU1QxNgorIyBkZWZpbmUgUFJJeExFQVNUMTYgIngiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklYTEVBU1QxNiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYTEVBU1QxNgorIyBkZWZpbmUgUFJJWExFQVNUMTYgIlgiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklkTEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkTEVBU1QzMgorIyBkZWZpbmUgUFJJZExFQVNUMzIgImQiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklpTEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpTEVBU1QzMgorIyBkZWZpbmUgUFJJaUxFQVNUMzIgImkiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklvTEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvTEVBU1QzMgorIyBkZWZpbmUgUFJJb0xFQVNUMzIgIm8iCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl1TEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1TEVBU1QzMgorIyBkZWZpbmUgUFJJdUxFQVNUMzIgInUiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl4TEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4TEVBU1QzMgorIyBkZWZpbmUgUFJJeExFQVNUMzIgIngiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklYTEVBU1QzMiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYTEVBU1QzMgorIyBkZWZpbmUgUFJJWExFQVNUMzIgIlgiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklkTEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklkTEVBU1Q2NAorIyBkZWZpbmUgUFJJZExFQVNUNjQgUFJJZDY0CisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklpTEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpTEVBU1Q2NAorIyBkZWZpbmUgUFJJaUxFQVNUNjQgUFJJaTY0CisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklvTEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklvTEVBU1Q2NAorIyBkZWZpbmUgUFJJb0xFQVNUNjQgUFJJbzY0CisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl1TEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl1TEVBU1Q2NAorIyBkZWZpbmUgUFJJdUxFQVNUNjQgUFJJdTY0CisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl4TEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4TEVBU1Q2NAorIyBkZWZpbmUgUFJJeExFQVNUNjQgUFJJeDY0CisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklYTEVBU1Q2NCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklYTEVBU1Q2NAorIyBkZWZpbmUgUFJJWExFQVNUNjQgUFJJWDY0CisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklkRkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJZEZBU1Q4CisjIGRlZmluZSBQUklkRkFTVDggImQiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklpRkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJaUZBU1Q4CisjIGRlZmluZSBQUklpRkFTVDggImkiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklvRkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJb0ZBU1Q4CisjIGRlZmluZSBQUklvRkFTVDggIm8iCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl1RkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJdUZBU1Q4CisjIGRlZmluZSBQUkl1RkFTVDggInUiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl4RkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJeEZBU1Q4CisjIGRlZmluZSBQUkl4RkFTVDggIngiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklYRkFTVDggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWEZBU1Q4CisjIGRlZmluZSBQUklYRkFTVDggIlgiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklkRkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWRGQVNUMTYKKyMgZGVmaW5lIFBSSWRGQVNUMTYgImQiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklpRkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWlGQVNUMTYKKyMgZGVmaW5lIFBSSWlGQVNUMTYgImkiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklvRkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW9GQVNUMTYKKyMgZGVmaW5lIFBSSW9GQVNUMTYgIm8iCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl1RkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXVGQVNUMTYKKyMgZGVmaW5lIFBSSXVGQVNUMTYgInUiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl4RkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXhGQVNUMTYKKyMgZGVmaW5lIFBSSXhGQVNUMTYgIngiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklYRkFTVDE2IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVhGQVNUMTYKKyMgZGVmaW5lIFBSSVhGQVNUMTYgIlgiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklkRkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWRGQVNUMzIKKyMgZGVmaW5lIFBSSWRGQVNUMzIgImQiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklpRkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWlGQVNUMzIKKyMgZGVmaW5lIFBSSWlGQVNUMzIgImkiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklvRkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW9GQVNUMzIKKyMgZGVmaW5lIFBSSW9GQVNUMzIgIm8iCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl1RkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXVGQVNUMzIKKyMgZGVmaW5lIFBSSXVGQVNUMzIgInUiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl4RkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXhGQVNUMzIKKyMgZGVmaW5lIFBSSXhGQVNUMzIgIngiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklYRkFTVDMyIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVhGQVNUMzIKKyMgZGVmaW5lIFBSSVhGQVNUMzIgIlgiCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklkRkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWRGQVNUNjQKKyMgZGVmaW5lIFBSSWRGQVNUNjQgUFJJZDY0CisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklpRkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWlGQVNUNjQKKyMgZGVmaW5lIFBSSWlGQVNUNjQgUFJJaTY0CisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklvRkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSW9GQVNUNjQKKyMgZGVmaW5lIFBSSW9GQVNUNjQgUFJJbzY0CisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl1RkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXVGQVNUNjQKKyMgZGVmaW5lIFBSSXVGQVNUNjQgUFJJdTY0CisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl4RkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXhGQVNUNjQKKyMgZGVmaW5lIFBSSXhGQVNUNjQgUFJJeDY0CisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklYRkFTVDY0IHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSVhGQVNUNjQKKyMgZGVmaW5lIFBSSVhGQVNUNjQgUFJJWDY0CisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklkTUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWRNQVgKKyMgZGVmaW5lIFBSSWRNQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImxkIiA6ICJsbGQiKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaU1BWCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpTUFYCisjIGRlZmluZSBQUklpTUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJsaSIgOiAibGxpIikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSW9NQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJb01BWAorIyBkZWZpbmUgUFJJb01BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibG8iIDogImxsbyIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl1TUFYIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXVNQVgKKyMgZGVmaW5lIFBSSXVNQVggKHNpemVvZiAodWludG1heF90KSA9PSBzaXplb2YgKGxvbmcpID8gImx1IiA6ICJsbHUiKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeE1BWCB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4TUFYCisjIGRlZmluZSBQUkl4TUFYIChzaXplb2YgKHVpbnRtYXhfdCkgPT0gc2l6ZW9mIChsb25nKSA/ICJseCIgOiAibGx4IikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSVhNQVggfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWE1BWAorIyBkZWZpbmUgUFJJWE1BWCAoc2l6ZW9mICh1aW50bWF4X3QpID09IHNpemVvZiAobG9uZykgPyAibFgiIDogImxsWCIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUklkUFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSWRQVFIKKyMgZGVmaW5lIFBSSWRQVFIgXAorICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibGQiIDogXAorICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJkIiA6IFwKKyAgICJsbGQiKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJaVBUUiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUklpUFRSCisjIGRlZmluZSBQUklpUFRSIFwKKyAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImxpIiA6IFwKKyAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAiaSIgOiBcCisgICAibGxpIikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSW9QVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJb1BUUgorIyBkZWZpbmUgUFJJb1BUUiBcCisgIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJsbyIgOiBcCisgICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gIm8iIDogXAorICAgImxsbyIpCisjZW5kaWYKKyNpZiAhZGVmaW5lZCBQUkl1UFRSIHx8IFBSSV9NQUNST1NfQlJPS0VOCisjIHVuZGVmIFBSSXVQVFIKKyMgZGVmaW5lIFBSSXVQVFIgXAorICAoc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAobG9uZykgPyAibHUiIDogXAorICAgc2l6ZW9mICh2b2lkICopID09IHNpemVvZiAoaW50KSA/ICJ1IiA6IFwKKyAgICJsbHUiKQorI2VuZGlmCisjaWYgIWRlZmluZWQgUFJJeFBUUiB8fCBQUklfTUFDUk9TX0JST0tFTgorIyB1bmRlZiBQUkl4UFRSCisjIGRlZmluZSBQUkl4UFRSIFwKKyAgKHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGxvbmcpID8gImx4IiA6IFwKKyAgIHNpemVvZiAodm9pZCAqKSA9PSBzaXplb2YgKGludCkgPyAieCIgOiBcCisgICAibGx4IikKKyNlbmRpZgorI2lmICFkZWZpbmVkIFBSSVhQVFIgfHwgUFJJX01BQ1JPU19CUk9LRU4KKyMgdW5kZWYgUFJJWFBUUgorIyBkZWZpbmUgUFJJWFBUUiBcCisgIChzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChsb25nKSA/ICJsWCIgOiBcCisgICBzaXplb2YgKHZvaWQgKikgPT0gc2l6ZW9mIChpbnQpID8gIlgiIDogXAorICAgImxsWCIpCisjZW5kaWYKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisjaWZkZWYgX0xJQkMKKy8qIFJlbmFtZSB0aGUgbm9uIElTTyBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCisgICBiZWNhdXNlIHNvbWUgSVNPIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKKyAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KKyMgZGVmaW5lIG9wZW4gICBfX29wZW4KKyMgZGVmaW5lIGNsb3NlICBfX2Nsb3NlCisjIGRlZmluZSByZWFkICAgX19yZWFkCisjIGRlZmluZSBtbWFwICAgX19tbWFwCisjIGRlZmluZSBtdW5tYXAgX19tdW5tYXAKKyNlbmRpZgorCisvKiBGb3IgdGhvc2UgbG9zaW5nIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSBgYWxsb2NhJyB3ZSBoYXZlIHRvIGFkZAorICAgc29tZSBhZGRpdGlvbmFsIGNvZGUgZW11bGF0aW5nIGl0LiAgKi8KKyNpZmRlZiBIQVZFX0FMTE9DQQorIyBkZWZpbmUgZnJlZWEocCkgLyogbm90aGluZyAqLworI2Vsc2UKKyMgZGVmaW5lIGFsbG9jYShuKSBtYWxsb2MgKG4pCisjIGRlZmluZSBmcmVlYShwKSBmcmVlIChwKQorI2VuZGlmCisKKy8qIEZvciBzeXN0ZW1zIHRoYXQgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0ZXh0IGFuZCBiaW5hcnkgSS9PLgorICAgT19CSU5BUlkgaXMgdXN1YWxseSBkZWNsYXJlZCBpbiA8ZmNudGwuaD4uICovCisjaWYgIWRlZmluZWQgT19CSU5BUlkgJiYgZGVmaW5lZCBfT19CSU5BUlkKKyAgLyogRm9yIE1TQy1jb21wYXRpYmxlIGNvbXBpbGVycy4gICovCisjIGRlZmluZSBPX0JJTkFSWSBfT19CSU5BUlkKKyMgZGVmaW5lIE9fVEVYVCBfT19URVhUCisjZW5kaWYKKyNpZmRlZiBfX0JFT1NfXworICAvKiBCZU9TIDUgaGFzIE9fQklOQVJZIGFuZCBPX1RFWFQsIGJ1dCB0aGV5IGhhdmUgbm8gZWZmZWN0LiAgKi8KKyMgdW5kZWYgT19CSU5BUlkKKyMgdW5kZWYgT19URVhUCisjZW5kaWYKKy8qIE9uIHJlYXNvbmFibGUgc3lzdGVtcywgYmluYXJ5IEkvTyBpcyB0aGUgZGVmYXVsdC4gICovCisjaWZuZGVmIE9fQklOQVJZCisjIGRlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKworCisvKiBXZSBuZWVkIGEgc2lnbiwgd2hldGhlciBhIG5ldyBjYXRhbG9nIHdhcyBsb2FkZWQsIHdoaWNoIGNhbiBiZSBhc3NvY2lhdGVkCisgICB3aXRoIGFsbCB0cmFuc2xhdGlvbnMuICBUaGlzIGlzIGltcG9ydGFudCBpZiB0aGUgdHJhbnNsYXRpb25zIGFyZQorICAgY2FjaGVkIGJ5IG9uZSBvZiBHQ0MncyBmZWF0dXJlcy4gICovCitpbnQgX25sX21zZ19jYXRfY250cjsKKworCisvKiBFeHBhbmQgYSBzeXN0ZW0gZGVwZW5kZW50IHN0cmluZyBzZWdtZW50LiAgUmV0dXJuIE5VTEwgaWYgdW5zdXBwb3J0ZWQuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorZ2V0X3N5c2RlcF9zZWdtZW50X3ZhbHVlIChjb25zdCBjaGFyICpuYW1lKQoreworICAvKiBUZXN0IGZvciBhbiBJU08gQyA5OSBzZWN0aW9uIDcuOC4xIGZvcm1hdCBzdHJpbmcgZGlyZWN0aXZlLgorICAgICBTeW50YXg6CisgICAgIFAgUiBJIHsgZCB8IGkgfCBvIHwgdSB8IHggfCBYIH0KKyAgICAgeyB7IHwgTEVBU1QgfCBGQVNUIH0geyA4IHwgMTYgfCAzMiB8IDY0IH0gfCBNQVggfCBQVFIgfSAgKi8KKyAgLyogV2UgZG9uJ3QgdXNlIGEgdGFibGUgb2YgMTQgdGltZXMgNiAnY29uc3QgY2hhciAqJyBzdHJpbmdzIGhlcmUsIGJlY2F1c2UKKyAgICAgZGF0YSByZWxvY2F0aW9ucyBjb3N0IHN0YXJ0dXAgdGltZS4gICovCisgIGlmIChuYW1lWzBdID09ICdQJyAmJiBuYW1lWzFdID09ICdSJyAmJiBuYW1lWzJdID09ICdJJykKKyAgICB7CisgICAgICBpZiAobmFtZVszXSA9PSAnZCcgfHwgbmFtZVszXSA9PSAnaScgfHwgbmFtZVszXSA9PSAnbycgfHwgbmFtZVszXSA9PSAndScKKwkgIHx8IG5hbWVbM10gPT0gJ3gnIHx8IG5hbWVbM10gPT0gJ1gnKQorCXsKKwkgIGlmIChuYW1lWzRdID09ICc4JyAmJiBuYW1lWzVdID09ICdcMCcpCisJICAgIHsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCisJCXJldHVybiBQUklkODsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCisJCXJldHVybiBQUklpODsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCisJCXJldHVybiBQUklvODsKKwkgICAgICBpZiAobmFtZVszXSA9PSAndScpCisJCXJldHVybiBQUkl1ODsKKwkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCisJCXJldHVybiBQUkl4ODsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCisJCXJldHVybiBQUklYODsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCSAgaWYgKG5hbWVbNF0gPT0gJzEnICYmIG5hbWVbNV0gPT0gJzYnICYmIG5hbWVbNl0gPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGlmIChuYW1lWzNdID09ICdkJykKKwkJcmV0dXJuIFBSSWQxNjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnaScpCisJCXJldHVybiBQUklpMTY7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQlyZXR1cm4gUFJJbzE2OworCSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKKwkJcmV0dXJuIFBSSXUxNjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAneCcpCisJCXJldHVybiBQUkl4MTY7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQlyZXR1cm4gUFJJWDE2OworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJICBpZiAobmFtZVs0XSA9PSAnMycgJiYgbmFtZVs1XSA9PSAnMicgJiYgbmFtZVs2XSA9PSAnXDAnKQorCSAgICB7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQlyZXR1cm4gUFJJZDMyOworCSAgICAgIGlmIChuYW1lWzNdID09ICdpJykKKwkJcmV0dXJuIFBSSWkzMjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCisJCXJldHVybiBQUklvMzI7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQlyZXR1cm4gUFJJdTMyOworCSAgICAgIGlmIChuYW1lWzNdID09ICd4JykKKwkJcmV0dXJuIFBSSXgzMjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCisJCXJldHVybiBQUklYMzI7CisJICAgICAgYWJvcnQgKCk7CisJICAgIH0KKwkgIGlmIChuYW1lWzRdID09ICc2JyAmJiBuYW1lWzVdID09ICc0JyAmJiBuYW1lWzZdID09ICdcMCcpCisJICAgIHsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCisJCXJldHVybiBQUklkNjQ7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQlyZXR1cm4gUFJJaTY0OworCSAgICAgIGlmIChuYW1lWzNdID09ICdvJykKKwkJcmV0dXJuIFBSSW82NDsKKwkgICAgICBpZiAobmFtZVszXSA9PSAndScpCisJCXJldHVybiBQUkl1NjQ7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQlyZXR1cm4gUFJJeDY0OworCSAgICAgIGlmIChuYW1lWzNdID09ICdYJykKKwkJcmV0dXJuIFBSSVg2NDsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCSAgaWYgKG5hbWVbNF0gPT0gJ0wnICYmIG5hbWVbNV0gPT0gJ0UnICYmIG5hbWVbNl0gPT0gJ0EnCisJICAgICAgJiYgbmFtZVs3XSA9PSAnUycgJiYgbmFtZVs4XSA9PSAnVCcpCisJICAgIHsKKwkgICAgICBpZiAobmFtZVs5XSA9PSAnOCcgJiYgbmFtZVsxMF0gPT0gJ1wwJykKKwkJeworCQkgIGlmIChuYW1lWzNdID09ICdkJykKKwkJICAgIHJldHVybiBQUklkTEVBU1Q4OworCQkgIGlmIChuYW1lWzNdID09ICdpJykKKwkJICAgIHJldHVybiBQUklpTEVBU1Q4OworCQkgIGlmIChuYW1lWzNdID09ICdvJykKKwkJICAgIHJldHVybiBQUklvTEVBU1Q4OworCQkgIGlmIChuYW1lWzNdID09ICd1JykKKwkJICAgIHJldHVybiBQUkl1TEVBU1Q4OworCQkgIGlmIChuYW1lWzNdID09ICd4JykKKwkJICAgIHJldHVybiBQUkl4TEVBU1Q4OworCQkgIGlmIChuYW1lWzNdID09ICdYJykKKwkJICAgIHJldHVybiBQUklYTEVBU1Q4OworCQkgIGFib3J0ICgpOworCQl9CisJICAgICAgaWYgKG5hbWVbOV0gPT0gJzEnICYmIG5hbWVbMTBdID09ICc2JyAmJiBuYW1lWzExXSA9PSAnXDAnKQorCQl7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQkgICAgcmV0dXJuIFBSSWRMRUFTVDE2OworCQkgIGlmIChuYW1lWzNdID09ICdpJykKKwkJICAgIHJldHVybiBQUklpTEVBU1QxNjsKKwkJICBpZiAobmFtZVszXSA9PSAnbycpCisJCSAgICByZXR1cm4gUFJJb0xFQVNUMTY7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQkgICAgcmV0dXJuIFBSSXVMRUFTVDE2OworCQkgIGlmIChuYW1lWzNdID09ICd4JykKKwkJICAgIHJldHVybiBQUkl4TEVBU1QxNjsKKwkJICBpZiAobmFtZVszXSA9PSAnWCcpCisJCSAgICByZXR1cm4gUFJJWExFQVNUMTY7CisJCSAgYWJvcnQgKCk7CisJCX0KKwkgICAgICBpZiAobmFtZVs5XSA9PSAnMycgJiYgbmFtZVsxMF0gPT0gJzInICYmIG5hbWVbMTFdID09ICdcMCcpCisJCXsKKwkJICBpZiAobmFtZVszXSA9PSAnZCcpCisJCSAgICByZXR1cm4gUFJJZExFQVNUMzI7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQkgICAgcmV0dXJuIFBSSWlMRUFTVDMyOworCQkgIGlmIChuYW1lWzNdID09ICdvJykKKwkJICAgIHJldHVybiBQUklvTEVBU1QzMjsKKwkJICBpZiAobmFtZVszXSA9PSAndScpCisJCSAgICByZXR1cm4gUFJJdUxFQVNUMzI7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQkgICAgcmV0dXJuIFBSSXhMRUFTVDMyOworCQkgIGlmIChuYW1lWzNdID09ICdYJykKKwkJICAgIHJldHVybiBQUklYTEVBU1QzMjsKKwkJICBhYm9ydCAoKTsKKwkJfQorCSAgICAgIGlmIChuYW1lWzldID09ICc2JyAmJiBuYW1lWzEwXSA9PSAnNCcgJiYgbmFtZVsxMV0gPT0gJ1wwJykKKwkJeworCQkgIGlmIChuYW1lWzNdID09ICdkJykKKwkJICAgIHJldHVybiBQUklkTEVBU1Q2NDsKKwkJICBpZiAobmFtZVszXSA9PSAnaScpCisJCSAgICByZXR1cm4gUFJJaUxFQVNUNjQ7CisJCSAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQkgICAgcmV0dXJuIFBSSW9MRUFTVDY0OworCQkgIGlmIChuYW1lWzNdID09ICd1JykKKwkJICAgIHJldHVybiBQUkl1TEVBU1Q2NDsKKwkJICBpZiAobmFtZVszXSA9PSAneCcpCisJCSAgICByZXR1cm4gUFJJeExFQVNUNjQ7CisJCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQkgICAgcmV0dXJuIFBSSVhMRUFTVDY0OworCQkgIGFib3J0ICgpOworCQl9CisJICAgIH0KKwkgIGlmIChuYW1lWzRdID09ICdGJyAmJiBuYW1lWzVdID09ICdBJyAmJiBuYW1lWzZdID09ICdTJworCSAgICAgICYmIG5hbWVbN10gPT0gJ1QnKQorCSAgICB7CisJICAgICAgaWYgKG5hbWVbOF0gPT0gJzgnICYmIG5hbWVbOV0gPT0gJ1wwJykKKwkJeworCQkgIGlmIChuYW1lWzNdID09ICdkJykKKwkJICAgIHJldHVybiBQUklkRkFTVDg7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQkgICAgcmV0dXJuIFBSSWlGQVNUODsKKwkJICBpZiAobmFtZVszXSA9PSAnbycpCisJCSAgICByZXR1cm4gUFJJb0ZBU1Q4OworCQkgIGlmIChuYW1lWzNdID09ICd1JykKKwkJICAgIHJldHVybiBQUkl1RkFTVDg7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQkgICAgcmV0dXJuIFBSSXhGQVNUODsKKwkJICBpZiAobmFtZVszXSA9PSAnWCcpCisJCSAgICByZXR1cm4gUFJJWEZBU1Q4OworCQkgIGFib3J0ICgpOworCQl9CisJICAgICAgaWYgKG5hbWVbOF0gPT0gJzEnICYmIG5hbWVbOV0gPT0gJzYnICYmIG5hbWVbMTBdID09ICdcMCcpCisJCXsKKwkJICBpZiAobmFtZVszXSA9PSAnZCcpCisJCSAgICByZXR1cm4gUFJJZEZBU1QxNjsKKwkJICBpZiAobmFtZVszXSA9PSAnaScpCisJCSAgICByZXR1cm4gUFJJaUZBU1QxNjsKKwkJICBpZiAobmFtZVszXSA9PSAnbycpCisJCSAgICByZXR1cm4gUFJJb0ZBU1QxNjsKKwkJICBpZiAobmFtZVszXSA9PSAndScpCisJCSAgICByZXR1cm4gUFJJdUZBU1QxNjsKKwkJICBpZiAobmFtZVszXSA9PSAneCcpCisJCSAgICByZXR1cm4gUFJJeEZBU1QxNjsKKwkJICBpZiAobmFtZVszXSA9PSAnWCcpCisJCSAgICByZXR1cm4gUFJJWEZBU1QxNjsKKwkJICBhYm9ydCAoKTsKKwkJfQorCSAgICAgIGlmIChuYW1lWzhdID09ICczJyAmJiBuYW1lWzldID09ICcyJyAmJiBuYW1lWzEwXSA9PSAnXDAnKQorCQl7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2QnKQorCQkgICAgcmV0dXJuIFBSSWRGQVNUMzI7CisJCSAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQkgICAgcmV0dXJuIFBSSWlGQVNUMzI7CisJCSAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQkgICAgcmV0dXJuIFBSSW9GQVNUMzI7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3UnKQorCQkgICAgcmV0dXJuIFBSSXVGQVNUMzI7CisJCSAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQkgICAgcmV0dXJuIFBSSXhGQVNUMzI7CisJCSAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQkgICAgcmV0dXJuIFBSSVhGQVNUMzI7CisJCSAgYWJvcnQgKCk7CisJCX0KKwkgICAgICBpZiAobmFtZVs4XSA9PSAnNicgJiYgbmFtZVs5XSA9PSAnNCcgJiYgbmFtZVsxMF0gPT0gJ1wwJykKKwkJeworCQkgIGlmIChuYW1lWzNdID09ICdkJykKKwkJICAgIHJldHVybiBQUklkRkFTVDY0OworCQkgIGlmIChuYW1lWzNdID09ICdpJykKKwkJICAgIHJldHVybiBQUklpRkFTVDY0OworCQkgIGlmIChuYW1lWzNdID09ICdvJykKKwkJICAgIHJldHVybiBQUklvRkFTVDY0OworCQkgIGlmIChuYW1lWzNdID09ICd1JykKKwkJICAgIHJldHVybiBQUkl1RkFTVDY0OworCQkgIGlmIChuYW1lWzNdID09ICd4JykKKwkJICAgIHJldHVybiBQUkl4RkFTVDY0OworCQkgIGlmIChuYW1lWzNdID09ICdYJykKKwkJICAgIHJldHVybiBQUklYRkFTVDY0OworCQkgIGFib3J0ICgpOworCQl9CisJICAgIH0KKwkgIGlmIChuYW1lWzRdID09ICdNJyAmJiBuYW1lWzVdID09ICdBJyAmJiBuYW1lWzZdID09ICdYJworCSAgICAgICYmIG5hbWVbN10gPT0gJ1wwJykKKwkgICAgeworCSAgICAgIGlmIChuYW1lWzNdID09ICdkJykKKwkJcmV0dXJuIFBSSWRNQVg7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ2knKQorCQlyZXR1cm4gUFJJaU1BWDsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnbycpCisJCXJldHVybiBQUklvTUFYOworCSAgICAgIGlmIChuYW1lWzNdID09ICd1JykKKwkJcmV0dXJuIFBSSXVNQVg7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ3gnKQorCQlyZXR1cm4gUFJJeE1BWDsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnWCcpCisJCXJldHVybiBQUklYTUFYOworCSAgICAgIGFib3J0ICgpOworCSAgICB9CisJICBpZiAobmFtZVs0XSA9PSAnUCcgJiYgbmFtZVs1XSA9PSAnVCcgJiYgbmFtZVs2XSA9PSAnUicKKwkgICAgICAmJiBuYW1lWzddID09ICdcMCcpCisJICAgIHsKKwkgICAgICBpZiAobmFtZVszXSA9PSAnZCcpCisJCXJldHVybiBQUklkUFRSOworCSAgICAgIGlmIChuYW1lWzNdID09ICdpJykKKwkJcmV0dXJuIFBSSWlQVFI7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ28nKQorCQlyZXR1cm4gUFJJb1BUUjsKKwkgICAgICBpZiAobmFtZVszXSA9PSAndScpCisJCXJldHVybiBQUkl1UFRSOworCSAgICAgIGlmIChuYW1lWzNdID09ICd4JykKKwkJcmV0dXJuIFBSSXhQVFI7CisJICAgICAgaWYgKG5hbWVbM10gPT0gJ1gnKQorCQlyZXR1cm4gUFJJWFBUUjsKKwkgICAgICBhYm9ydCAoKTsKKwkgICAgfQorCX0KKyAgICB9CisgIC8qIFRlc3QgZm9yIGEgZ2xpYmMgc3BlY2lmaWMgcHJpbnRmKCkgZm9ybWF0IGRpcmVjdGl2ZSBmbGFnLiAgKi8KKyAgaWYgKG5hbWVbMF0gPT0gJ0knICYmIG5hbWVbMV0gPT0gJ1wwJykKKyAgICB7CisjaWYgZGVmaW5lZCBfTElCQyB8fCBfX0dMSUJDX18gPiAyIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMikKKyAgICAgIC8qIFRoZSAnSScgZmxhZywgaW4gbnVtZXJpYyBmb3JtYXQgZGlyZWN0aXZlcywgcmVwbGFjZXMgQVNDSUkgZGlnaXRzCisJIHdpdGggdGhlICdvdXRkaWdpdHMnIGRlZmluZWQgaW4gdGhlIExDX0NUWVBFIGxvY2FsZSBmYWNldC4gIFRoaXMgaXMKKwkgdXNlZCBmb3IgRmFyc2kgKFBlcnNpYW4pIGFuZCBtYXliZSBBcmFiaWMuICAqLworICAgICAgcmV0dXJuICJJIjsKKyNlbHNlCisgICAgICByZXR1cm4gIiI7CisjZW5kaWYKKyAgICB9CisgIC8qIE90aGVyIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5ncyBhcmUgbm90IHZhbGlkLiAgKi8KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIEluaXRpYWxpemUgdGhlIGNvZGVzZXQgZGVwZW5kZW50IHBhcnRzIG9mIGFuIG9wZW5lZCBtZXNzYWdlIGNhdGFsb2cuCisgICBSZXR1cm4gdGhlIGhlYWRlciBlbnRyeS4gICovCitjb25zdCBjaGFyICoKK2ludGVybmFsX2Z1bmN0aW9uCitfbmxfaW5pdF9kb21haW5fY29udiAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluX2ZpbGUsCisJCSAgICAgIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW4sCisJCSAgICAgIHN0cnVjdCBiaW5kaW5nICpkb21haW5iaW5kaW5nKQoreworICAvKiBGaW5kIG91dCBhYm91dCB0aGUgY2hhcmFjdGVyIHNldCB0aGUgZmlsZSBpcyBlbmNvZGVkIHdpdGguCisgICAgIFRoaXMgY2FuIGJlIGZvdW5kIChpbiB0ZXh0dWFsIGZvcm0pIGluIHRoZSBlbnRyeSAiIi4gIElmIHRoaXMKKyAgICAgZW50cnkgZG9lcyBub3QgZXhpc3Qgb3IgaWYgdGhpcyBkb2VzIG5vdCBjb250YWluIHRoZSBgY2hhcnNldD0nCisgICAgIGluZm9ybWF0aW9uLCB3ZSB3aWxsIGFzc3VtZSB0aGUgY2hhcnNldCBtYXRjaGVzIHRoZSBvbmUgdGhlCisgICAgIGN1cnJlbnQgbG9jYWxlIGFuZCB3ZSBkb24ndCBoYXZlIHRvIHBlcmZvcm0gYW55IGNvbnZlcnNpb24uICAqLworICBjaGFyICpudWxsZW50cnk7CisgIHNpemVfdCBudWxsZW50cnlsZW47CisKKyAgLyogUHJlaW5pdGlhbGl6ZSBmaWVsZHMsIHRvIGF2b2lkIHJlY3Vyc2lvbiBkdXJpbmcgX25sX2ZpbmRfbXNnLiAgKi8KKyAgZG9tYWluLT5jb2Rlc2V0X2NudHIgPQorICAgIChkb21haW5iaW5kaW5nICE9IE5VTEwgPyBkb21haW5iaW5kaW5nLT5jb2Rlc2V0X2NudHIgOiAwKTsKKyNpZmRlZiBfTElCQworICBkb21haW4tPmNvbnYgPSAoX19nY29udl90KSAtMTsKKyNlbHNlCisjIGlmIEhBVkVfSUNPTlYKKyAgZG9tYWluLT5jb252ID0gKGljb252X3QpIC0xOworIyBlbmRpZgorI2VuZGlmCisgIGRvbWFpbi0+Y29udl90YWIgPSBOVUxMOworCisgIC8qIEdldCB0aGUgaGVhZGVyIGVudHJ5LiAgKi8KKyAgbnVsbGVudHJ5ID0gX25sX2ZpbmRfbXNnIChkb21haW5fZmlsZSwgZG9tYWluYmluZGluZywgIiIsICZudWxsZW50cnlsZW4pOworCisgIGlmIChudWxsZW50cnkgIT0gTlVMTCkKKyAgICB7CisjaWYgZGVmaW5lZCBfTElCQyB8fCBIQVZFX0lDT05WCisgICAgICBjb25zdCBjaGFyICpjaGFyc2V0c3RyOworCisgICAgICBjaGFyc2V0c3RyID0gc3Ryc3RyIChudWxsZW50cnksICJjaGFyc2V0PSIpOworICAgICAgaWYgKGNoYXJzZXRzdHIgIT0gTlVMTCkKKwl7CisJICBzaXplX3QgbGVuOworCSAgY2hhciAqY2hhcnNldDsKKwkgIGNvbnN0IGNoYXIgKm91dGNoYXJzZXQ7CisKKwkgIGNoYXJzZXRzdHIgKz0gc3RybGVuICgiY2hhcnNldD0iKTsKKwkgIGxlbiA9IHN0cmNzcG4gKGNoYXJzZXRzdHIsICIgXHRcbiIpOworCisJICBjaGFyc2V0ID0gKGNoYXIgKikgYWxsb2NhIChsZW4gKyAxKTsKKyMgaWYgZGVmaW5lZCBfTElCQyB8fCBIQVZFX01FTVBDUFkKKwkgICooKGNoYXIgKikgbWVtcGNweSAoY2hhcnNldCwgY2hhcnNldHN0ciwgbGVuKSkgPSAnXDAnOworIyBlbHNlCisJICBtZW1jcHkgKGNoYXJzZXQsIGNoYXJzZXRzdHIsIGxlbik7CisJICBjaGFyc2V0W2xlbl0gPSAnXDAnOworIyBlbmRpZgorCisJICAvKiBUaGUgb3V0cHV0IGNoYXJzZXQgc2hvdWxkIG5vcm1hbGx5IGJlIGRldGVybWluZWQgYnkgdGhlCisJICAgICBsb2NhbGUuICBCdXQgc29tZXRpbWVzIHRoZSBsb2NhbGUgaXMgbm90IHVzZWQgb3Igbm90IGNvcnJlY3RseQorCSAgICAgc2V0IHVwLCBzbyB3ZSBwcm92aWRlIGEgcG9zc2liaWxpdHkgZm9yIHRoZSB1c2VyIHRvIG92ZXJyaWRlCisJICAgICB0aGlzLiAgTW9yZW92ZXIsIHRoZSB2YWx1ZSBzcGVjaWZpZWQgdGhyb3VnaAorCSAgICAgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQgb3ZlcnJpZGVzIGJvdGguICAqLworCSAgaWYgKGRvbWFpbmJpbmRpbmcgIT0gTlVMTCAmJiBkb21haW5iaW5kaW5nLT5jb2Rlc2V0ICE9IE5VTEwpCisJICAgIG91dGNoYXJzZXQgPSBkb21haW5iaW5kaW5nLT5jb2Rlc2V0OworCSAgZWxzZQorCSAgICB7CisJICAgICAgb3V0Y2hhcnNldCA9IGdldGVudiAoIk9VVFBVVF9DSEFSU0VUIik7CisJICAgICAgaWYgKG91dGNoYXJzZXQgPT0gTlVMTCB8fCBvdXRjaGFyc2V0WzBdID09ICdcMCcpCisJCXsKKyMgaWZkZWYgX0xJQkMKKwkJICBvdXRjaGFyc2V0ID0gX05MX0NVUlJFTlQgKExDX0NUWVBFLCBDT0RFU0VUKTsKKyMgZWxzZQorIyAgaWYgSEFWRV9JQ09OVgorCQkgIGV4dGVybiBjb25zdCBjaGFyICpsb2NhbGVfY2hhcnNldCAodm9pZCk7CisJCSAgb3V0Y2hhcnNldCA9IGxvY2FsZV9jaGFyc2V0ICgpOworIyAgZW5kaWYKKyMgZW5kaWYKKwkJfQorCSAgICB9CisKKyMgaWZkZWYgX0xJQkMKKwkgIC8qIFdlIGFsd2F5cyB3YW50IHRvIHVzZSB0cmFuc2xpdGVyYXRpb24uICAqLworCSAgb3V0Y2hhcnNldCA9IG5vcm1fYWRkX3NsYXNoZXMgKG91dGNoYXJzZXQsICJUUkFOU0xJVCIpOworCSAgY2hhcnNldCA9IG5vcm1fYWRkX3NsYXNoZXMgKGNoYXJzZXQsIE5VTEwpOworCSAgaWYgKF9fZ2NvbnZfb3BlbiAob3V0Y2hhcnNldCwgY2hhcnNldCwgJmRvbWFpbi0+Y29udiwKKwkJCSAgICBHQ09OVl9BVk9JRF9OT0NPTlYpCisJICAgICAgIT0gX19HQ09OVl9PSykKKwkgICAgZG9tYWluLT5jb252ID0gKF9fZ2NvbnZfdCkgLTE7CisjIGVsc2UKKyMgIGlmIEhBVkVfSUNPTlYKKwkgIC8qIFdoZW4gdXNpbmcgR05VIGxpYmMgPj0gMi4yIG9yIEdOVSBsaWJpY29udiA+PSAxLjUsCisJICAgICB3ZSB3YW50IHRvIHVzZSB0cmFuc2xpdGVyYXRpb24uICAqLworIyAgIGlmIChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMikgfHwgX19HTElCQ19fID4gMiBcCisgICAgICAgfHwgX0xJQklDT05WX1ZFUlNJT04gPj0gMHgwMTA1CisJICBpZiAoc3RyY2hyIChvdXRjaGFyc2V0LCAnLycpID09IE5VTEwpCisJICAgIHsKKwkgICAgICBjaGFyICp0bXA7CisKKwkgICAgICBsZW4gPSBzdHJsZW4gKG91dGNoYXJzZXQpOworCSAgICAgIHRtcCA9IChjaGFyICopIGFsbG9jYSAobGVuICsgMTAgKyAxKTsKKwkgICAgICBtZW1jcHkgKHRtcCwgb3V0Y2hhcnNldCwgbGVuKTsKKwkgICAgICBtZW1jcHkgKHRtcCArIGxlbiwgIi8vVFJBTlNMSVQiLCAxMCArIDEpOworCSAgICAgIG91dGNoYXJzZXQgPSB0bXA7CisKKwkgICAgICBkb21haW4tPmNvbnYgPSBpY29udl9vcGVuIChvdXRjaGFyc2V0LCBjaGFyc2V0KTsKKworCSAgICAgIGZyZWVhIChvdXRjaGFyc2V0KTsKKwkgICAgfQorCSAgZWxzZQorIyAgIGVuZGlmCisJICAgIGRvbWFpbi0+Y29udiA9IGljb252X29wZW4gKG91dGNoYXJzZXQsIGNoYXJzZXQpOworIyAgZW5kaWYKKyMgZW5kaWYKKworCSAgZnJlZWEgKGNoYXJzZXQpOworCX0KKyNlbmRpZiAvKiBfTElCQyB8fCBIQVZFX0lDT05WICovCisgICAgfQorCisgIHJldHVybiBudWxsZW50cnk7Cit9CisKKy8qIEZyZWVzIHRoZSBjb2Rlc2V0IGRlcGVuZGVudCBwYXJ0cyBvZiBhbiBvcGVuZWQgbWVzc2FnZSBjYXRhbG9nLiAgKi8KK3ZvaWQKK2ludGVybmFsX2Z1bmN0aW9uCitfbmxfZnJlZV9kb21haW5fY29udiAoc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbikKK3sKKyAgaWYgKGRvbWFpbi0+Y29udl90YWIgIT0gTlVMTCAmJiBkb21haW4tPmNvbnZfdGFiICE9IChjaGFyICoqKSAtMSkKKyAgICBmcmVlIChkb21haW4tPmNvbnZfdGFiKTsKKworI2lmZGVmIF9MSUJDCisgIGlmIChkb21haW4tPmNvbnYgIT0gKF9fZ2NvbnZfdCkgLTEpCisgICAgX19nY29udl9jbG9zZSAoZG9tYWluLT5jb252KTsKKyNlbHNlCisjIGlmIEhBVkVfSUNPTlYKKyAgaWYgKGRvbWFpbi0+Y29udiAhPSAoaWNvbnZfdCkgLTEpCisgICAgaWNvbnZfY2xvc2UgKGRvbWFpbi0+Y29udik7CisjIGVuZGlmCisjZW5kaWYKK30KKworLyogTG9hZCB0aGUgbWVzc2FnZSBjYXRhbG9ncyBzcGVjaWZpZWQgYnkgRklMRU5BTUUuICBJZiBpdCBpcyBubyB2YWxpZAorICAgbWVzc2FnZSBjYXRhbG9nIGRvIG5vdGhpbmcuICAqLwordm9pZAoraW50ZXJuYWxfZnVuY3Rpb24KK19ubF9sb2FkX2RvbWFpbiAoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluX2ZpbGUsCisJCSBzdHJ1Y3QgYmluZGluZyAqZG9tYWluYmluZGluZykKK3sKKyAgaW50IGZkOworICBzaXplX3Qgc2l6ZTsKKyNpZmRlZiBfTElCQworICBzdHJ1Y3Qgc3RhdDY0IHN0OworI2Vsc2UKKyAgc3RydWN0IHN0YXQgc3Q7CisjZW5kaWYKKyAgc3RydWN0IG1vX2ZpbGVfaGVhZGVyICpkYXRhID0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMTsKKyAgaW50IHVzZV9tbWFwID0gMDsKKyAgc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbjsKKyAgaW50IHJldmlzaW9uOworICBjb25zdCBjaGFyICpudWxsZW50cnk7CisKKyAgZG9tYWluX2ZpbGUtPmRlY2lkZWQgPSAxOworICBkb21haW5fZmlsZS0+ZGF0YSA9IE5VTEw7CisKKyAgLyogTm90ZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWxlc3MgdG8gc3RvcmUgZG9tYWluYmluZGluZyBpbiBkb21haW5fZmlsZQorICAgICBiZWNhdXNlIGRvbWFpbmJpbmRpbmcgbWlnaHQgYmUgPT0gTlVMTCBub3cgYnV0ICE9IE5VTEwgbGF0ZXIgKGFmdGVyCisgICAgIGEgY2FsbCB0byBiaW5kX3RleHRkb21haW5fY29kZXNldCkuICAqLworCisgIC8qIElmIHRoZSByZWNvcmQgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQgbG9jYWxlIHRoZSBGSUxFTkFNRQorICAgICBtaWdodCBiZSBOVUxMLiAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gYWNjb3JkaW5nIHRvIHRoZSBnaXZlbgorICAgICBzcGVjaWZpY2F0aW9uIHRoZSBsb2NhbGUgZmlsZSBuYW1lIGlzIGRpZmZlcmVudCBmb3IgWFBHIGFuZCBDRU4KKyAgICAgc3ludGF4LiAgKi8KKyAgaWYgKGRvbWFpbl9maWxlLT5maWxlbmFtZSA9PSBOVUxMKQorICAgIHJldHVybjsKKworICAvKiBUcnkgdG8gb3BlbiB0aGUgYWRkcmVzc2VkIGZpbGUuICAqLworICBmZCA9IG9wZW4gKGRvbWFpbl9maWxlLT5maWxlbmFtZSwgT19SRE9OTFkgfCBPX0JJTkFSWSk7CisgIGlmIChmZCA9PSAtMSkKKyAgICByZXR1cm47CisKKyAgLyogV2UgbXVzdCBrbm93IGFib3V0IHRoZSBzaXplIG9mIHRoZSBmaWxlLiAgKi8KKyAgaWYgKAorI2lmZGVmIF9MSUJDCisgICAgICBfX2J1aWx0aW5fZXhwZWN0IChmc3RhdDY0IChmZCwgJnN0KSAhPSAwLCAwKQorI2Vsc2UKKyAgICAgIF9fYnVpbHRpbl9leHBlY3QgKGZzdGF0IChmZCwgJnN0KSAhPSAwLCAwKQorI2VuZGlmCisgICAgICB8fCBfX2J1aWx0aW5fZXhwZWN0ICgoc2l6ZSA9IChzaXplX3QpIHN0LnN0X3NpemUpICE9IHN0LnN0X3NpemUsIDApCisgICAgICB8fCBfX2J1aWx0aW5fZXhwZWN0IChzaXplIDwgc2l6ZW9mIChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIpLCAwKSkKKyAgICB7CisgICAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gICovCisgICAgICBjbG9zZSAoZmQpOworICAgICAgcmV0dXJuOworICAgIH0KKworI2lmZGVmIEhBVkVfTU1BUAorICAvKiBOb3cgd2UgYXJlIHJlYWR5IHRvIGxvYWQgdGhlIGZpbGUuICBJZiBtbWFwKCkgaXMgYXZhaWxhYmxlIHdlIHRyeQorICAgICB0aGlzIGZpcnN0LiAgSWYgbm90IGF2YWlsYWJsZSBvciBpdCBmYWlsZWQgd2UgdHJ5IHRvIGxvYWQgaXQuICAqLworICBkYXRhID0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSBtbWFwIChOVUxMLCBzaXplLCBQUk9UX1JFQUQsCisJCQkJCSBNQVBfUFJJVkFURSwgZmQsIDApOworCisgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChkYXRhICE9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgLTEsIDEpKQorICAgIHsKKyAgICAgIC8qIG1tYXAoKSBjYWxsIHdhcyBzdWNjZXNzZnVsLiAgKi8KKyAgICAgIGNsb3NlIChmZCk7CisgICAgICB1c2VfbW1hcCA9IDE7CisgICAgfQorI2VuZGlmCisKKyAgLyogSWYgdGhlIGRhdGEgaXMgbm90IHlldCBhdmFpbGFibGUgKGkuZS4gbW1hcCdlZCkgd2UgdHJ5IHRvIGxvYWQKKyAgICAgaXQgbWFudWFsbHkuICAqLworICBpZiAoZGF0YSA9PSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIC0xKQorICAgIHsKKyAgICAgIHNpemVfdCB0b19yZWFkOworICAgICAgY2hhciAqcmVhZF9wdHI7CisKKyAgICAgIGRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIG1hbGxvYyAoc2l6ZSk7CisgICAgICBpZiAoZGF0YSA9PSBOVUxMKQorCXJldHVybjsKKworICAgICAgdG9fcmVhZCA9IHNpemU7CisgICAgICByZWFkX3B0ciA9IChjaGFyICopIGRhdGE7CisgICAgICBkbworCXsKKwkgIGxvbmcgaW50IG5iID0gKGxvbmcgaW50KSByZWFkIChmZCwgcmVhZF9wdHIsIHRvX3JlYWQpOworCSAgaWYgKG5iIDw9IDApCisJICAgIHsKKyNpZmRlZiBFSU5UUgorCSAgICAgIGlmIChuYiA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikKKwkJY29udGludWU7CisjZW5kaWYKKwkgICAgICBjbG9zZSAoZmQpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgcmVhZF9wdHIgKz0gbmI7CisJICB0b19yZWFkIC09IG5iOworCX0KKyAgICAgIHdoaWxlICh0b19yZWFkID4gMCk7CisKKyAgICAgIGNsb3NlIChmZCk7CisgICAgfQorCisgIC8qIFVzaW5nIHRoZSBtYWdpYyBudW1iZXIgd2UgY2FuIHRlc3Qgd2hldGhlciBpdCByZWFsbHkgaXMgYSBtZXNzYWdlCisgICAgIGNhdGFsb2cgZmlsZS4gICovCisgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChkYXRhLT5tYWdpYyAhPSBfTUFHSUMgJiYgZGF0YS0+bWFnaWMgIT0gX01BR0lDX1NXQVBQRUQsCisJCQkwKSkKKyAgICB7CisgICAgICAvKiBUaGUgbWFnaWMgbnVtYmVyIGlzIHdyb25nOiBub3QgYSBtZXNzYWdlIGNhdGFsb2cgZmlsZS4gICovCisjaWZkZWYgSEFWRV9NTUFQCisgICAgICBpZiAodXNlX21tYXApCisJbXVubWFwICgoY2FkZHJfdCkgZGF0YSwgc2l6ZSk7CisgICAgICBlbHNlCisjZW5kaWYKKwlmcmVlIChkYXRhKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZG9tYWluID0gKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbG9hZGVkX2RvbWFpbikpOworICBpZiAoZG9tYWluID09IE5VTEwpCisgICAgcmV0dXJuOworICBkb21haW5fZmlsZS0+ZGF0YSA9IGRvbWFpbjsKKworICBkb21haW4tPmRhdGEgPSAoY2hhciAqKSBkYXRhOworICBkb21haW4tPnVzZV9tbWFwID0gdXNlX21tYXA7CisgIGRvbWFpbi0+bW1hcF9zaXplID0gc2l6ZTsKKyAgZG9tYWluLT5tdXN0X3N3YXAgPSBkYXRhLT5tYWdpYyAhPSBfTUFHSUM7CisgIGRvbWFpbi0+bWFsbG9jZWQgPSBOVUxMOworCisgIC8qIEZpbGwgaW4gdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhdmFpbGFibGUgdGFibGVzLiAgKi8KKyAgcmV2aXNpb24gPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+cmV2aXNpb24pOworICAvKiBXZSBzdXBwb3J0IG9ubHkgdGhlIG1ham9yIHJldmlzaW9ucyAwIGFuZCAxLiAgKi8KKyAgc3dpdGNoIChyZXZpc2lvbiA+PiAxNikKKyAgICB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICAgIGRvbWFpbi0+bnN0cmluZ3MgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+bnN0cmluZ3MpOworICAgICAgZG9tYWluLT5vcmlnX3RhYiA9IChjb25zdCBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKikKKwkoKGNoYXIgKikgZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5vcmlnX3RhYl9vZmZzZXQpKTsKKyAgICAgIGRvbWFpbi0+dHJhbnNfdGFiID0gKGNvbnN0IHN0cnVjdCBzdHJpbmdfZGVzYyAqKQorCSgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnRyYW5zX3RhYl9vZmZzZXQpKTsKKyAgICAgIGRvbWFpbi0+aGFzaF9zaXplID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPmhhc2hfdGFiX3NpemUpOworICAgICAgZG9tYWluLT5oYXNoX3RhYiA9CisJKGRvbWFpbi0+aGFzaF9zaXplID4gMgorCSA/IChjb25zdCBubHNfdWludDMyICopCisJICAgKChjaGFyICopIGRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+aGFzaF90YWJfb2Zmc2V0KSkKKwkgOiBOVUxMKTsKKyAgICAgIGRvbWFpbi0+bXVzdF9zd2FwX2hhc2hfdGFiID0gZG9tYWluLT5tdXN0X3N3YXA7CisKKyAgICAgIC8qIE5vdyBkaXNwYXRjaCBvbiB0aGUgbWlub3IgcmV2aXNpb24uICAqLworICAgICAgc3dpdGNoIChyZXZpc2lvbiAmIDB4ZmZmZikKKwl7CisJY2FzZSAwOgorCSAgZG9tYWluLT5uX3N5c2RlcF9zdHJpbmdzID0gMDsKKwkgIGRvbWFpbi0+b3JpZ19zeXNkZXBfdGFiID0gTlVMTDsKKwkgIGRvbWFpbi0+dHJhbnNfc3lzZGVwX3RhYiA9IE5VTEw7CisJICBicmVhazsKKwljYXNlIDE6CisJZGVmYXVsdDoKKwkgIHsKKwkgICAgbmxzX3VpbnQzMiBuX3N5c2RlcF9zdHJpbmdzOworCisJICAgIGlmIChkb21haW4tPmhhc2hfdGFiID09IE5VTEwpCisJICAgICAgLyogVGhpcyBpcyBpbnZhbGlkLiAgVGhlc2UgbWlub3IgcmV2aXNpb25zIG5lZWQgYSBoYXNoIHRhYmxlLiAgKi8KKwkgICAgICBnb3RvIGludmFsaWQ7CisKKwkgICAgbl9zeXNkZXBfc3RyaW5ncyA9CisJICAgICAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPm5fc3lzZGVwX3N0cmluZ3MpOworCSAgICBpZiAobl9zeXNkZXBfc3RyaW5ncyA+IDApCisJICAgICAgeworCQlubHNfdWludDMyIG5fc3lzZGVwX3NlZ21lbnRzOworCQljb25zdCBzdHJ1Y3Qgc3lzZGVwX3NlZ21lbnQgKnN5c2RlcF9zZWdtZW50czsKKwkJY29uc3QgY2hhciAqKnN5c2RlcF9zZWdtZW50X3ZhbHVlczsKKwkJY29uc3QgbmxzX3VpbnQzMiAqb3JpZ19zeXNkZXBfdGFiOworCQljb25zdCBubHNfdWludDMyICp0cmFuc19zeXNkZXBfdGFiOworCQlubHNfdWludDMyIG5faW5tZW1fc3lzZGVwX3N0cmluZ3M7CisJCXNpemVfdCBtZW1uZWVkOworCQljaGFyICptZW07CisJCXN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MgKmlubWVtX29yaWdfc3lzZGVwX3RhYjsKKwkJc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyAqaW5tZW1fdHJhbnNfc3lzZGVwX3RhYjsKKwkJbmxzX3VpbnQzMiAqaW5tZW1faGFzaF90YWI7CisJCXVuc2lnbmVkIGludCBpLCBqOworCisJCS8qIEdldCB0aGUgdmFsdWVzIG9mIHRoZSBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnRzLiAgKi8KKwkJbl9zeXNkZXBfc2VnbWVudHMgPQorCQkgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5uX3N5c2RlcF9zZWdtZW50cyk7CisJCXN5c2RlcF9zZWdtZW50cyA9IChjb25zdCBzdHJ1Y3Qgc3lzZGVwX3NlZ21lbnQgKikKKwkJICAoKGNoYXIgKikgZGF0YQorCQkgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5zeXNkZXBfc2VnbWVudHNfb2Zmc2V0KSk7CisJCXN5c2RlcF9zZWdtZW50X3ZhbHVlcyA9CisJCSAgYWxsb2NhIChuX3N5c2RlcF9zZWdtZW50cyAqIHNpemVvZiAoY29uc3QgY2hhciAqKSk7CisJCWZvciAoaSA9IDA7IGkgPCBuX3N5c2RlcF9zZWdtZW50czsgaSsrKQorCQkgIHsKKwkJICAgIGNvbnN0IGNoYXIgKm5hbWUgPQorCQkgICAgICAoY2hhciAqKSBkYXRhCisJCSAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHN5c2RlcF9zZWdtZW50c1tpXS5vZmZzZXQpOworCQkgICAgbmxzX3VpbnQzMiBuYW1lbGVuID0KKwkJICAgICAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHN5c2RlcF9zZWdtZW50c1tpXS5sZW5ndGgpOworCisJCSAgICBpZiAoIShuYW1lbGVuID4gMCAmJiBuYW1lW25hbWVsZW4gLSAxXSA9PSAnXDAnKSkKKwkJICAgICAgeworCQkJZnJlZWEgKHN5c2RlcF9zZWdtZW50X3ZhbHVlcyk7CisJCQlnb3RvIGludmFsaWQ7CisJCSAgICAgIH0KKworCQkgICAgc3lzZGVwX3NlZ21lbnRfdmFsdWVzW2ldID0gZ2V0X3N5c2RlcF9zZWdtZW50X3ZhbHVlIChuYW1lKTsKKwkJICB9CisKKwkJb3JpZ19zeXNkZXBfdGFiID0gKGNvbnN0IG5sc191aW50MzIgKikKKwkJICAoKGNoYXIgKikgZGF0YQorCQkgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5vcmlnX3N5c2RlcF90YWJfb2Zmc2V0KSk7CisJCXRyYW5zX3N5c2RlcF90YWIgPSAoY29uc3QgbmxzX3VpbnQzMiAqKQorCQkgICgoY2hhciAqKSBkYXRhCisJCSAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnRyYW5zX3N5c2RlcF90YWJfb2Zmc2V0KSk7CisKKwkJLyogQ29tcHV0ZSB0aGUgYW1vdW50IG9mIGFkZGl0aW9uYWwgbWVtb3J5IG5lZWRlZCBmb3IgdGhlCisJCSAgIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5ncyBhbmQgdGhlIGF1Z21lbnRlZCBoYXNoIHRhYmxlLgorCQkgICBBdCB0aGUgc2FtZSB0aW1lLCBhbHNvIGRyb3Agc3RyaW5nIHBhaXJzIHdoaWNoIHJlZmVyIHRvCisJCSAgIGFuIHVuZGVmaW5lZCBzeXN0ZW0gZGVwZW5kZW50IHNlZ21lbnQuICAqLworCQluX2lubWVtX3N5c2RlcF9zdHJpbmdzID0gMDsKKwkJbWVtbmVlZCA9IGRvbWFpbi0+aGFzaF9zaXplICogc2l6ZW9mIChubHNfdWludDMyKTsKKwkJZm9yIChpID0gMDsgaSA8IG5fc3lzZGVwX3N0cmluZ3M7IGkrKykKKwkJICB7CisJCSAgICBpbnQgdmFsaWQgPSAxOworCQkgICAgc2l6ZV90IG5lZWRzWzJdOworCisJCSAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorCQkgICAgICB7CisJCQljb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZyAqc3lzZGVwX3N0cmluZyA9CisJCQkgIChjb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZyAqKQorCQkJICAoKGNoYXIgKikgZGF0YQorCQkJICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKKwkJCQlqID09IDAKKwkJCQk/IG9yaWdfc3lzZGVwX3RhYltpXQorCQkJCTogdHJhbnNfc3lzZGVwX3RhYltpXSkpOworCQkJc2l6ZV90IG5lZWQgPSAwOworCQkJY29uc3Qgc3RydWN0IHNlZ21lbnRfcGFpciAqcCA9IHN5c2RlcF9zdHJpbmctPnNlZ21lbnRzOworCisJCQlpZiAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnN5c2RlcHJlZikgIT0gU0VHTUVOVFNfRU5EKQorCQkJICBmb3IgKHAgPSBzeXNkZXBfc3RyaW5nLT5zZWdtZW50czs7IHArKykKKwkJCSAgICB7CisJCQkgICAgICBubHNfdWludDMyIHN5c2RlcHJlZjsKKworCQkJICAgICAgbmVlZCArPSBXIChkb21haW4tPm11c3Rfc3dhcCwgcC0+c2Vnc2l6ZSk7CisKKwkJCSAgICAgIHN5c2RlcHJlZiA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpOworCQkJICAgICAgaWYgKHN5c2RlcHJlZiA9PSBTRUdNRU5UU19FTkQpCisJCQkJYnJlYWs7CisKKwkJCSAgICAgIGlmIChzeXNkZXByZWYgPj0gbl9zeXNkZXBfc2VnbWVudHMpCisJCQkJeworCQkJCSAgLyogSW52YWxpZC4gICovCisJCQkJICBmcmVlYSAoc3lzZGVwX3NlZ21lbnRfdmFsdWVzKTsKKwkJCQkgIGdvdG8gaW52YWxpZDsKKwkJCQl9CisKKwkJCSAgICAgIGlmIChzeXNkZXBfc2VnbWVudF92YWx1ZXNbc3lzZGVwcmVmXSA9PSBOVUxMKQorCQkJCXsKKwkJCQkgIC8qIFRoaXMgcGFydGljdWxhciBzdHJpbmcgcGFpciBpcyBpbnZhbGlkLiAgKi8KKwkJCQkgIHZhbGlkID0gMDsKKwkJCQkgIGJyZWFrOworCQkJCX0KKworCQkJICAgICAgbmVlZCArPSBzdHJsZW4gKHN5c2RlcF9zZWdtZW50X3ZhbHVlc1tzeXNkZXByZWZdKTsKKwkJCSAgICB9CisKKwkJCW5lZWRzW2pdID0gbmVlZDsKKwkJCWlmICghdmFsaWQpCisJCQkgIGJyZWFrOworCQkgICAgICB9CisKKwkJICAgIGlmICh2YWxpZCkKKwkJICAgICAgeworCQkJbl9pbm1lbV9zeXNkZXBfc3RyaW5ncysrOworCQkJbWVtbmVlZCArPSBuZWVkc1swXSArIG5lZWRzWzFdOworCQkgICAgICB9CisJCSAgfQorCQltZW1uZWVkICs9IDIgKiBuX2lubWVtX3N5c2RlcF9zdHJpbmdzCisJCQkgICAqIHNpemVvZiAoc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyk7CisKKwkJaWYgKG5faW5tZW1fc3lzZGVwX3N0cmluZ3MgPiAwKQorCQkgIHsKKwkJICAgIHVuc2lnbmVkIGludCBrOworCisJCSAgICAvKiBBbGxvY2F0ZSBhZGRpdGlvbmFsIG1lbW9yeS4gICovCisJCSAgICBtZW0gPSAoY2hhciAqKSBtYWxsb2MgKG1lbW5lZWQpOworCQkgICAgaWYgKG1lbSA9PSBOVUxMKQorCQkgICAgICBnb3RvIGludmFsaWQ7CisKKwkJICAgIGRvbWFpbi0+bWFsbG9jZWQgPSBtZW07CisJCSAgICBpbm1lbV9vcmlnX3N5c2RlcF90YWIgPSAoc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyAqKSBtZW07CisJCSAgICBtZW0gKz0gbl9pbm1lbV9zeXNkZXBfc3RyaW5ncworCQkJICAgKiBzaXplb2YgKHN0cnVjdCBzeXNkZXBfc3RyaW5nX2Rlc2MpOworCQkgICAgaW5tZW1fdHJhbnNfc3lzZGVwX3RhYiA9IChzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICopIG1lbTsKKwkJICAgIG1lbSArPSBuX2lubWVtX3N5c2RlcF9zdHJpbmdzCisJCQkgICAqIHNpemVvZiAoc3RydWN0IHN5c2RlcF9zdHJpbmdfZGVzYyk7CisJCSAgICBpbm1lbV9oYXNoX3RhYiA9IChubHNfdWludDMyICopIG1lbTsKKwkJICAgIG1lbSArPSBkb21haW4tPmhhc2hfc2l6ZSAqIHNpemVvZiAobmxzX3VpbnQzMik7CisKKwkJICAgIC8qIENvbXB1dGUgdGhlIHN5c3RlbSBkZXBlbmRlbnQgc3RyaW5ncy4gICovCisJCSAgICBrID0gMDsKKwkJICAgIGZvciAoaSA9IDA7IGkgPCBuX3N5c2RlcF9zdHJpbmdzOyBpKyspCisJCSAgICAgIHsKKwkJCWludCB2YWxpZCA9IDE7CisKKwkJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspCisJCQkgIHsKKwkJCSAgICBjb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZyAqc3lzZGVwX3N0cmluZyA9CisJCQkgICAgICAoY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKikKKwkJCSAgICAgICgoY2hhciAqKSBkYXRhCisJCQkgICAgICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKKwkJCQkgICAgaiA9PSAwCisJCQkJICAgID8gb3JpZ19zeXNkZXBfdGFiW2ldCisJCQkJICAgIDogdHJhbnNfc3lzZGVwX3RhYltpXSkpOworCQkJICAgIGNvbnN0IHN0cnVjdCBzZWdtZW50X3BhaXIgKnAgPQorCQkJICAgICAgc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7CisKKwkJCSAgICBpZiAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnN5c2RlcHJlZikKKwkJCQkhPSBTRUdNRU5UU19FTkQpCisJCQkgICAgICBmb3IgKHAgPSBzeXNkZXBfc3RyaW5nLT5zZWdtZW50czs7IHArKykKKwkJCQl7CisJCQkJICBubHNfdWludDMyIHN5c2RlcHJlZjsKKworCQkJCSAgc3lzZGVwcmVmID0KKwkJCQkgICAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnN5c2RlcHJlZik7CisJCQkJICBpZiAoc3lzZGVwcmVmID09IFNFR01FTlRTX0VORCkKKwkJCQkgICAgYnJlYWs7CisKKwkJCQkgIGlmIChzeXNkZXBfc2VnbWVudF92YWx1ZXNbc3lzZGVwcmVmXSA9PSBOVUxMKQorCQkJCSAgICB7CisJCQkJICAgICAgLyogVGhpcyBwYXJ0aWN1bGFyIHN0cmluZyBwYWlyIGlzCisJCQkJCSBpbnZhbGlkLiAgKi8KKwkJCQkgICAgICB2YWxpZCA9IDA7CisJCQkJICAgICAgYnJlYWs7CisJCQkJICAgIH0KKwkJCQl9CisKKwkJCSAgICBpZiAoIXZhbGlkKQorCQkJICAgICAgYnJlYWs7CisJCQkgIH0KKworCQkJaWYgKHZhbGlkKQorCQkJICB7CisJCQkgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKwkJCSAgICAgIHsKKwkJCQljb25zdCBzdHJ1Y3Qgc3lzZGVwX3N0cmluZyAqc3lzZGVwX3N0cmluZyA9CisJCQkJICAoY29uc3Qgc3RydWN0IHN5c2RlcF9zdHJpbmcgKikKKwkJCQkgICgoY2hhciAqKSBkYXRhCisJCQkJICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKKwkJCQkJaiA9PSAwCisJCQkJCT8gb3JpZ19zeXNkZXBfdGFiW2ldCisJCQkJCTogdHJhbnNfc3lzZGVwX3RhYltpXSkpOworCQkJCWNvbnN0IGNoYXIgKnN0YXRpY19zZWdtZW50cyA9CisJCQkJICAoY2hhciAqKSBkYXRhCisJCQkJICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBzeXNkZXBfc3RyaW5nLT5vZmZzZXQpOworCQkJCWNvbnN0IHN0cnVjdCBzZWdtZW50X3BhaXIgKnAgPQorCQkJCSAgc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7CisKKwkJCQkvKiBDb25jYXRlbmF0ZSB0aGUgc2VnbWVudHMsIGFuZCBmaWxsCisJCQkJICAgaW5tZW1fb3JpZ19zeXNkZXBfdGFiW2tdIChmb3IgaiA9PSAwKSBhbmQKKwkJCQkgICBpbm1lbV90cmFuc19zeXNkZXBfdGFiW2tdIChmb3IgaiA9PSAxKS4gICovCisKKwkJCQlzdHJ1Y3Qgc3lzZGVwX3N0cmluZ19kZXNjICppbm1lbV90YWJfZW50cnkgPQorCQkJCSAgKGogPT0gMAorCQkJCSAgID8gaW5tZW1fb3JpZ19zeXNkZXBfdGFiCisJCQkJICAgOiBpbm1lbV90cmFuc19zeXNkZXBfdGFiKQorCQkJCSAgKyBrOworCisJCQkJaWYgKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpCisJCQkJICAgID09IFNFR01FTlRTX0VORCkKKwkJCQkgIHsKKwkJCQkgICAgLyogT25seSBvbmUgc3RhdGljIHNlZ21lbnQuICAqLworCQkJCSAgICBpbm1lbV90YWJfZW50cnktPmxlbmd0aCA9CisJCQkJICAgICAgVyAoZG9tYWluLT5tdXN0X3N3YXAsIHAtPnNlZ3NpemUpOworCQkJCSAgICBpbm1lbV90YWJfZW50cnktPnBvaW50ZXIgPSBzdGF0aWNfc2VnbWVudHM7CisJCQkJICB9CisJCQkJZWxzZQorCQkJCSAgeworCQkJCSAgICBpbm1lbV90YWJfZW50cnktPnBvaW50ZXIgPSBtZW07CisKKwkJCQkgICAgZm9yIChwID0gc3lzZGVwX3N0cmluZy0+c2VnbWVudHM7OyBwKyspCisJCQkJICAgICAgeworCQkJCQlubHNfdWludDMyIHNlZ3NpemUgPQorCQkJCQkgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zZWdzaXplKTsKKwkJCQkJbmxzX3VpbnQzMiBzeXNkZXByZWYgPQorCQkJCQkgIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBwLT5zeXNkZXByZWYpOworCQkJCQlzaXplX3QgbjsKKworCQkJCQlpZiAoc2Vnc2l6ZSA+IDApCisJCQkJCSAgeworCQkJCQkgICAgbWVtY3B5IChtZW0sIHN0YXRpY19zZWdtZW50cywgc2Vnc2l6ZSk7CisJCQkJCSAgICBtZW0gKz0gc2Vnc2l6ZTsKKwkJCQkJICAgIHN0YXRpY19zZWdtZW50cyArPSBzZWdzaXplOworCQkJCQkgIH0KKworCQkJCQlpZiAoc3lzZGVwcmVmID09IFNFR01FTlRTX0VORCkKKwkJCQkJICBicmVhazsKKworCQkJCQluID0gc3RybGVuIChzeXNkZXBfc2VnbWVudF92YWx1ZXNbc3lzZGVwcmVmXSk7CisJCQkJCW1lbWNweSAobWVtLCBzeXNkZXBfc2VnbWVudF92YWx1ZXNbc3lzZGVwcmVmXSwgbik7CisJCQkJCW1lbSArPSBuOworCQkJCSAgICAgIH0KKworCQkJCSAgICBpbm1lbV90YWJfZW50cnktPmxlbmd0aCA9CisJCQkJICAgICAgbWVtIC0gaW5tZW1fdGFiX2VudHJ5LT5wb2ludGVyOworCQkJCSAgfQorCQkJICAgICAgfQorCisJCQkgICAgaysrOworCQkJICB9CisJCSAgICAgIH0KKwkJICAgIGlmIChrICE9IG5faW5tZW1fc3lzZGVwX3N0cmluZ3MpCisJCSAgICAgIGFib3J0ICgpOworCisJCSAgICAvKiBDb21wdXRlIHRoZSBhdWdtZW50ZWQgaGFzaCB0YWJsZS4gICovCisJCSAgICBmb3IgKGkgPSAwOyBpIDwgZG9tYWluLT5oYXNoX3NpemU7IGkrKykKKwkJICAgICAgaW5tZW1faGFzaF90YWJbaV0gPQorCQkJVyAoZG9tYWluLT5tdXN0X3N3YXBfaGFzaF90YWIsIGRvbWFpbi0+aGFzaF90YWJbaV0pOworCQkgICAgZm9yIChpID0gMDsgaSA8IG5faW5tZW1fc3lzZGVwX3N0cmluZ3M7IGkrKykKKwkJICAgICAgeworCQkJY29uc3QgY2hhciAqbXNnaWQgPSBpbm1lbV9vcmlnX3N5c2RlcF90YWJbaV0ucG9pbnRlcjsKKwkJCW5sc191aW50MzIgaGFzaF92YWwgPSBoYXNoX3N0cmluZyAobXNnaWQpOworCQkJbmxzX3VpbnQzMiBpZHggPSBoYXNoX3ZhbCAlIGRvbWFpbi0+aGFzaF9zaXplOworCQkJbmxzX3VpbnQzMiBpbmNyID0KKwkJCSAgMSArIChoYXNoX3ZhbCAlIChkb21haW4tPmhhc2hfc2l6ZSAtIDIpKTsKKworCQkJZm9yICg7OykKKwkJCSAgeworCQkJICAgIGlmIChpbm1lbV9oYXNoX3RhYltpZHhdID09IDApCisJCQkgICAgICB7CisJCQkJLyogSGFzaCB0YWJsZSBlbnRyeSBpcyBlbXB0eS4gIFVzZSBpdC4gICovCisJCQkJaW5tZW1faGFzaF90YWJbaWR4XSA9IDEgKyBkb21haW4tPm5zdHJpbmdzICsgaTsKKwkJCQlicmVhazsKKwkJCSAgICAgIH0KKworCQkJICAgIGlmIChpZHggPj0gZG9tYWluLT5oYXNoX3NpemUgLSBpbmNyKQorCQkJICAgICAgaWR4IC09IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcjsKKwkJCSAgICBlbHNlCisJCQkgICAgICBpZHggKz0gaW5jcjsKKwkJCSAgfQorCQkgICAgICB9CisKKwkJICAgIGRvbWFpbi0+bl9zeXNkZXBfc3RyaW5ncyA9IG5faW5tZW1fc3lzZGVwX3N0cmluZ3M7CisJCSAgICBkb21haW4tPm9yaWdfc3lzZGVwX3RhYiA9IGlubWVtX29yaWdfc3lzZGVwX3RhYjsKKwkJICAgIGRvbWFpbi0+dHJhbnNfc3lzZGVwX3RhYiA9IGlubWVtX3RyYW5zX3N5c2RlcF90YWI7CisKKwkJICAgIGRvbWFpbi0+aGFzaF90YWIgPSBpbm1lbV9oYXNoX3RhYjsKKwkJICAgIGRvbWFpbi0+bXVzdF9zd2FwX2hhc2hfdGFiID0gMDsKKwkJICB9CisJCWVsc2UKKwkJICB7CisJCSAgICBkb21haW4tPm5fc3lzZGVwX3N0cmluZ3MgPSAwOworCQkgICAgZG9tYWluLT5vcmlnX3N5c2RlcF90YWIgPSBOVUxMOworCQkgICAgZG9tYWluLT50cmFuc19zeXNkZXBfdGFiID0gTlVMTDsKKwkJICB9CisKKwkJZnJlZWEgKHN5c2RlcF9zZWdtZW50X3ZhbHVlcyk7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlkb21haW4tPm5fc3lzZGVwX3N0cmluZ3MgPSAwOworCQlkb21haW4tPm9yaWdfc3lzZGVwX3RhYiA9IE5VTEw7CisJCWRvbWFpbi0+dHJhbnNfc3lzZGVwX3RhYiA9IE5VTEw7CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIC8qIFRoaXMgaXMgYW4gaW52YWxpZCByZXZpc2lvbi4gICovCisgICAgaW52YWxpZDoKKyAgICAgIC8qIFRoaXMgaXMgYW4gaW52YWxpZCAubW8gZmlsZS4gICovCisgICAgICBpZiAoZG9tYWluLT5tYWxsb2NlZCkKKwlmcmVlIChkb21haW4tPm1hbGxvY2VkKTsKKyNpZmRlZiBIQVZFX01NQVAKKyAgICAgIGlmICh1c2VfbW1hcCkKKwltdW5tYXAgKChjYWRkcl90KSBkYXRhLCBzaXplKTsKKyAgICAgIGVsc2UKKyNlbmRpZgorCWZyZWUgKGRhdGEpOworICAgICAgZnJlZSAoZG9tYWluKTsKKyAgICAgIGRvbWFpbl9maWxlLT5kYXRhID0gTlVMTDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyogTm93IGluaXRpYWxpemUgdGhlIGNoYXJhY3RlciBzZXQgY29udmVydGVyIGZyb20gdGhlIGNoYXJhY3RlciBzZXQKKyAgICAgdGhlIGZpbGUgaXMgZW5jb2RlZCB3aXRoIChmb3VuZCBpbiB0aGUgaGVhZGVyIGVudHJ5KSB0byB0aGUgZG9tYWluJ3MKKyAgICAgc3BlY2lmaWVkIGNoYXJhY3RlciBzZXQgb3IgdGhlIGxvY2FsZSdzIGNoYXJhY3RlciBzZXQuICAqLworICBudWxsZW50cnkgPSBfbmxfaW5pdF9kb21haW5fY29udiAoZG9tYWluX2ZpbGUsIGRvbWFpbiwgZG9tYWluYmluZGluZyk7CisKKyAgLyogQWxzbyBsb29rIGZvciBhIHBsdXJhbCBzcGVjaWZpY2F0aW9uLiAgKi8KKyAgRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiAobnVsbGVudHJ5LCAmZG9tYWluLT5wbHVyYWwsICZkb21haW4tPm5wbHVyYWxzKTsKK30KKworCisjaWZkZWYgX0xJQkMKK3ZvaWQKK2ludGVybmFsX2Z1bmN0aW9uCitfbmxfdW5sb2FkX2RvbWFpbiAoc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbikKK3sKKyAgaWYgKGRvbWFpbi0+cGx1cmFsICE9ICZfX2dldHRleHRfZ2VybWFuaWNfcGx1cmFsKQorICAgIF9fZ2V0dGV4dF9mcmVlX2V4cCAoZG9tYWluLT5wbHVyYWwpOworCisgIF9ubF9mcmVlX2RvbWFpbl9jb252IChkb21haW4pOworCisgIGlmIChkb21haW4tPm1hbGxvY2VkKQorICAgIGZyZWUgKGRvbWFpbi0+bWFsbG9jZWQpOworCisjIGlmZGVmIF9QT1NJWF9NQVBQRURfRklMRVMKKyAgaWYgKGRvbWFpbi0+dXNlX21tYXApCisgICAgbXVubWFwICgoY2FkZHJfdCkgZG9tYWluLT5kYXRhLCBkb21haW4tPm1tYXBfc2l6ZSk7CisgIGVsc2UKKyMgZW5kaWYJLyogX1BPU0lYX01BUFBFRF9GSUxFUyAqLworICAgIGZyZWUgKCh2b2lkICopIGRvbWFpbi0+ZGF0YSk7CisKKyAgZnJlZSAoZG9tYWluKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2xvY2FsY2hhcnNldC5jIGIvdW5peC9pbnRsL2xvY2FsY2hhcnNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NjVmMTAKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvbG9jYWxjaGFyc2V0LmMKQEAgLTAsMCArMSwzOTggQEAKKy8qIERldGVybWluZSBhIGNhbm9uaWNhbCBuYW1lIGZvciB0aGUgY3VycmVudCBsb2NhbGUncyBjaGFyYWN0ZXIgZW5jb2RpbmcuCisKKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworLyogV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4uICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisvKiBTcGVjaWZpY2F0aW9uLiAgKi8KKyNpbmNsdWRlICJsb2NhbGNoYXJzZXQuaCIKKworI2lmIEhBVkVfU1REREVGX0gKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWYgSEFWRV9TVFJJTkdfSAorIyBpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyNlbmRpZgorI2lmIEhBVkVfU1RETElCX0gKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fCisjIHVuZGVmIFdJTjMyICAgLyogYXZvaWQgd2FybmluZyBvbiBtaW5ndzMyICovCisjIGRlZmluZSBXSU4zMgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIF9fRU1YX18KKy8qIEFzc3VtZSBFTVggcHJvZ3JhbSBydW5zIG9uIE9TLzIsIGV2ZW4gaWYgY29tcGlsZWQgdW5kZXIgRE9TLiAgKi8KKyMgZGVmaW5lIE9TMgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZCBXSU4zMgorIyBpZiBIQVZFX0xBTkdJTkZPX0NPREVTRVQKKyMgIGluY2x1ZGUgPGxhbmdpbmZvLmg+CisjIGVsc2UKKyMgIGlmIEhBVkVfU0VUTE9DQUxFCisjICAgaW5jbHVkZSA8bG9jYWxlLmg+CisjICBlbmRpZgorIyBlbmRpZgorI2VsaWYgZGVmaW5lZCBXSU4zMgorIyBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkIE9TMgorIyBkZWZpbmUgSU5DTF9ET1MKKyMgaW5jbHVkZSA8b3MyLmg+CisjZW5kaWYKKworI2lmIEVOQUJMRV9SRUxPQ0FUQUJMRQorIyBpbmNsdWRlICJyZWxvY2F0YWJsZS5oIgorI2Vsc2UKKyMgZGVmaW5lIHJlbG9jYXRlKHBhdGhuYW1lKSAocGF0aG5hbWUpCisjZW5kaWYKKworI2lmIGRlZmluZWQgX1dJTjMyIHx8IGRlZmluZWQgX19XSU4zMl9fIHx8IGRlZmluZWQgX19FTVhfXyB8fCBkZWZpbmVkIF9fREpHUFBfXworICAvKiBXaW4zMiwgT1MvMiwgRE9TICovCisjIGRlZmluZSBJU1NMQVNIKEMpICgoQykgPT0gJy8nIHx8IChDKSA9PSAnXFwnKQorI2VuZGlmCisKKyNpZm5kZWYgRElSRUNUT1JZX1NFUEFSQVRPUgorIyBkZWZpbmUgRElSRUNUT1JZX1NFUEFSQVRPUiAnLycKKyNlbmRpZgorCisjaWZuZGVmIElTU0xBU0gKKyMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSBESVJFQ1RPUllfU0VQQVJBVE9SKQorI2VuZGlmCisKKyNpZiBIQVZFX0RFQ0xfR0VUQ19VTkxPQ0tFRAorIyB1bmRlZiBnZXRjCisjIGRlZmluZSBnZXRjIGdldGNfdW5sb2NrZWQKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIHN0YXRpYyB2YXJpYWJsZSBpcyBkZWNsYXJlZCAndm9sYXRpbGUnIHRvIGF2b2lkIGEKKyAgIHBvc3NpYmxlIG11bHRpdGhyZWFkIHByb2JsZW0gaW4gdGhlIGZ1bmN0aW9uIGdldF9jaGFyc2V0X2FsaWFzZXMuIElmIHdlCisgICBhcmUgcnVubmluZyBpbiBhIHRocmVhZGVkIGVudmlyb25tZW50LCBhbmQgaWYgdHdvIHRocmVhZHMgaW5pdGlhbGl6ZQorICAgJ2NoYXJzZXRfYWxpYXNlcycgc2ltdWx0YW5lb3VzbHksIGJvdGggd2lsbCBwcm9kdWNlIHRoZSBzYW1lIHZhbHVlLAorICAgYW5kIGV2ZXJ5dGhpbmcgd2lsbCBiZSBvayBpZiB0aGUgdHdvIGFzc2lnbm1lbnRzIHRvICdjaGFyc2V0X2FsaWFzZXMnCisgICBhcmUgYXRvbWljLiBCdXQgSSBkb24ndCBrbm93IHdoYXQgd2lsbCBoYXBwZW4gaWYgdGhlIHR3byBhc3NpZ25tZW50cyBtaXguICAqLworI2lmIF9fU1REQ19fICE9IDEKKyMgZGVmaW5lIHZvbGF0aWxlIC8qIGVtcHR5ICovCisjZW5kaWYKKy8qIFBvaW50ZXIgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBjaGFyc2V0LmFsaWFzIGZpbGUsIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4KKyAgIHJlYWQsIGVsc2UgTlVMTC4gIEl0cyBmb3JtYXQgaXM6CisgICBBTElBU18xICdcMCcgQ0FOT05JQ0FMXzEgJ1wwJyAuLi4gQUxJQVNfbiAnXDAnIENBTk9OSUNBTF9uICdcMCcgJ1wwJyAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogdm9sYXRpbGUgY2hhcnNldF9hbGlhc2VzOworCisvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhcnNldC5hbGlhcyBmaWxlLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2dldF9jaGFyc2V0X2FsaWFzZXMgKCkKK3sKKyAgY29uc3QgY2hhciAqY3A7CisKKyAgY3AgPSBjaGFyc2V0X2FsaWFzZXM7CisgIGlmIChjcCA9PSBOVUxMKQorICAgIHsKKyNpZiAhKGRlZmluZWQgVk1TIHx8IGRlZmluZWQgV0lOMzIpCisgICAgICBGSUxFICpmcDsKKyAgICAgIGNvbnN0IGNoYXIgKmRpciA9IHJlbG9jYXRlIChMSUJESVIpOworICAgICAgY29uc3QgY2hhciAqYmFzZSA9ICJjaGFyc2V0LmFsaWFzIjsKKyAgICAgIGNoYXIgKmZpbGVfbmFtZTsKKworICAgICAgLyogQ29uY2F0ZW5hdGUgZGlyIGFuZCBiYXNlIGludG8gZnJlc2hseSBhbGxvY2F0ZWQgZmlsZV9uYW1lLiAgKi8KKyAgICAgIHsKKwlzaXplX3QgZGlyX2xlbiA9IHN0cmxlbiAoZGlyKTsKKwlzaXplX3QgYmFzZV9sZW4gPSBzdHJsZW4gKGJhc2UpOworCWludCBhZGRfc2xhc2ggPSAoZGlyX2xlbiA+IDAgJiYgIUlTU0xBU0ggKGRpcltkaXJfbGVuIC0gMV0pKTsKKwlmaWxlX25hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGRpcl9sZW4gKyBhZGRfc2xhc2ggKyBiYXNlX2xlbiArIDEpOworCWlmIChmaWxlX25hbWUgIT0gTlVMTCkKKwkgIHsKKwkgICAgbWVtY3B5IChmaWxlX25hbWUsIGRpciwgZGlyX2xlbik7CisJICAgIGlmIChhZGRfc2xhc2gpCisJICAgICAgZmlsZV9uYW1lW2Rpcl9sZW5dID0gRElSRUNUT1JZX1NFUEFSQVRPUjsKKwkgICAgbWVtY3B5IChmaWxlX25hbWUgKyBkaXJfbGVuICsgYWRkX3NsYXNoLCBiYXNlLCBiYXNlX2xlbiArIDEpOworCSAgfQorICAgICAgfQorCisgICAgICBpZiAoZmlsZV9uYW1lID09IE5VTEwgfHwgKGZwID0gZm9wZW4gKGZpbGVfbmFtZSwgInIiKSkgPT0gTlVMTCkKKwkvKiBPdXQgb2YgbWVtb3J5IG9yIGZpbGUgbm90IGZvdW5kLCB0cmVhdCBpdCBhcyBlbXB0eS4gICovCisJY3AgPSAiIjsKKyAgICAgIGVsc2UKKwl7CisJICAvKiBQYXJzZSB0aGUgZmlsZSdzIGNvbnRlbnRzLiAgKi8KKwkgIGludCBjOworCSAgY2hhciBidWYxWzUwKzFdOworCSAgY2hhciBidWYyWzUwKzFdOworCSAgY2hhciAqcmVzX3B0ciA9IE5VTEw7CisJICBzaXplX3QgcmVzX3NpemUgPSAwOworCSAgc2l6ZV90IGwxLCBsMjsKKworCSAgZm9yICg7OykKKwkgICAgeworCSAgICAgIGMgPSBnZXRjIChmcCk7CisJICAgICAgaWYgKGMgPT0gRU9GKQorCQlicmVhazsKKwkgICAgICBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykKKwkJY29udGludWU7CisJICAgICAgaWYgKGMgPT0gJyMnKQorCQl7CisJCSAgLyogU2tpcCBjb21tZW50LCB0byBlbmQgb2YgbGluZS4gICovCisJCSAgZG8KKwkJICAgIGMgPSBnZXRjIChmcCk7CisJCSAgd2hpbGUgKCEoYyA9PSBFT0YgfHwgYyA9PSAnXG4nKSk7CisJCSAgaWYgKGMgPT0gRU9GKQorCQkgICAgYnJlYWs7CisJCSAgY29udGludWU7CisJCX0KKwkgICAgICB1bmdldGMgKGMsIGZwKTsKKwkgICAgICBpZiAoZnNjYW5mIChmcCwgIiU1MHMgJTUwcyIsIGJ1ZjEsIGJ1ZjIpIDwgMikKKwkJYnJlYWs7CisJICAgICAgbDEgPSBzdHJsZW4gKGJ1ZjEpOworCSAgICAgIGwyID0gc3RybGVuIChidWYyKTsKKwkgICAgICBpZiAocmVzX3NpemUgPT0gMCkKKwkJeworCQkgIHJlc19zaXplID0gbDEgKyAxICsgbDIgKyAxOworCQkgIHJlc19wdHIgPSAoY2hhciAqKSBtYWxsb2MgKHJlc19zaXplICsgMSk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICByZXNfc2l6ZSArPSBsMSArIDEgKyBsMiArIDE7CisJCSAgcmVzX3B0ciA9IChjaGFyICopIHJlYWxsb2MgKHJlc19wdHIsIHJlc19zaXplICsgMSk7CisJCX0KKwkgICAgICBpZiAocmVzX3B0ciA9PSBOVUxMKQorCQl7CisJCSAgLyogT3V0IG9mIG1lbW9yeS4gKi8KKwkJICByZXNfc2l6ZSA9IDA7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgICBzdHJjcHkgKHJlc19wdHIgKyByZXNfc2l6ZSAtIChsMiArIDEpIC0gKGwxICsgMSksIGJ1ZjEpOworCSAgICAgIHN0cmNweSAocmVzX3B0ciArIHJlc19zaXplIC0gKGwyICsgMSksIGJ1ZjIpOworCSAgICB9CisJICBmY2xvc2UgKGZwKTsKKwkgIGlmIChyZXNfc2l6ZSA9PSAwKQorCSAgICBjcCA9ICIiOworCSAgZWxzZQorCSAgICB7CisJICAgICAgKihyZXNfcHRyICsgcmVzX3NpemUpID0gJ1wwJzsKKwkgICAgICBjcCA9IHJlc19wdHI7CisJICAgIH0KKwl9CisKKyAgICAgIGlmIChmaWxlX25hbWUgIT0gTlVMTCkKKwlmcmVlIChmaWxlX25hbWUpOworCisjZWxzZQorCisjIGlmIGRlZmluZWQgVk1TCisgICAgICAvKiBUbyBhdm9pZCB0aGUgdHJvdWJsZXMgb2YgYW4gZXh0cmEgZmlsZSBjaGFyc2V0LmFsaWFzX3ZtcyBpbiB0aGUKKwkgc291cmNlcyBvZiBtYW55IEdOVSBwYWNrYWdlcywgc2ltcGx5IGlubGluZSB0aGUgYWxpYXNlcyBoZXJlLiAgKi8KKyAgICAgIC8qIFRoZSBsaXN0IG9mIGVuY29kaW5ncyBpcyB0YWtlbiBmcm9tIHRoZSBPcGVuVk1TIDcuMy0xIGRvY3VtZW50YXRpb24KKwkgIkNvbXBhcSBDIFJ1bi1UaW1lIExpYnJhcnkgUmVmZXJlbmNlIE1hbnVhbCBmb3IgT3BlblZNUyBzeXN0ZW1zIgorCSBzZWN0aW9uIDEwLjcgIkhhbmRsaW5nIERpZmZlcmVudCBDaGFyYWN0ZXIgU2V0cyIuICAqLworICAgICAgY3AgPSAiSVNPODg1OS0xIiAiXDAiICJJU08tODg1OS0xIiAiXDAiCisJICAgIklTTzg4NTktMiIgIlwwIiAiSVNPLTg4NTktMiIgIlwwIgorCSAgICJJU084ODU5LTUiICJcMCIgIklTTy04ODU5LTUiICJcMCIKKwkgICAiSVNPODg1OS03IiAiXDAiICJJU08tODg1OS03IiAiXDAiCisJICAgIklTTzg4NTktOCIgIlwwIiAiSVNPLTg4NTktOCIgIlwwIgorCSAgICJJU084ODU5LTkiICJcMCIgIklTTy04ODU5LTkiICJcMCIKKwkgICAvKiBKYXBhbmVzZSAqLworCSAgICJldWNKUCIgIlwwIiAiRVVDLUpQIiAiXDAiCisJICAgIlNKSVMiICJcMCIgIlNISUZUX0pJUyIgIlwwIgorCSAgICJERUNLQU5KSSIgIlwwIiAiREVDLUtBTkpJIiAiXDAiCisJICAgIlNERUNLQU5KSSIgIlwwIiAiRVVDLUpQIiAiXDAiCisJICAgLyogQ2hpbmVzZSAqLworCSAgICJldWNUVyIgIlwwIiAiRVVDLVRXIiAiXDAiCisJICAgIkRFQ0hBTllVIiAiXDAiICJERUMtSEFOWVUiICJcMCIKKwkgICAiREVDSEFOWkkiICJcMCIgIkdCMjMxMiIgIlwwIgorCSAgIC8qIEtvcmVhbiAqLworCSAgICJERUNLT1JFQU4iICJcMCIgIkVVQy1LUiIgIlwwIjsKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkIFdJTjMyCisgICAgICAvKiBUbyBhdm9pZCB0aGUgdHJvdWJsZXMgb2YgaW5zdGFsbGluZyBhIHNlcGFyYXRlIGZpbGUgaW4gdGhlIHNhbWUKKwkgZGlyZWN0b3J5IGFzIHRoZSBETEwgYW5kIG9mIHJldHJpZXZpbmcgdGhlIERMTCdzIGRpcmVjdG9yeSBhdAorCSBydW50aW1lLCBzaW1wbHkgaW5saW5lIHRoZSBhbGlhc2VzIGhlcmUuICAqLworCisgICAgICBjcCA9ICJDUDkzNiIgIlwwIiAiR0JLIiAiXDAiCisJICAgIkNQMTM2MSIgIlwwIiAiSk9IQUIiICJcMCIKKwkgICAiQ1AyMDEyNyIgIlwwIiAiQVNDSUkiICJcMCIKKwkgICAiQ1AyMDg2NiIgIlwwIiAiS09JOC1SIiAiXDAiCisJICAgIkNQMjE4NjYiICJcMCIgIktPSTgtUlUiICJcMCIKKwkgICAiQ1AyODU5MSIgIlwwIiAiSVNPLTg4NTktMSIgIlwwIgorCSAgICJDUDI4NTkyIiAiXDAiICJJU08tODg1OS0yIiAiXDAiCisJICAgIkNQMjg1OTMiICJcMCIgIklTTy04ODU5LTMiICJcMCIKKwkgICAiQ1AyODU5NCIgIlwwIiAiSVNPLTg4NTktNCIgIlwwIgorCSAgICJDUDI4NTk1IiAiXDAiICJJU08tODg1OS01IiAiXDAiCisJICAgIkNQMjg1OTYiICJcMCIgIklTTy04ODU5LTYiICJcMCIKKwkgICAiQ1AyODU5NyIgIlwwIiAiSVNPLTg4NTktNyIgIlwwIgorCSAgICJDUDI4NTk4IiAiXDAiICJJU08tODg1OS04IiAiXDAiCisJICAgIkNQMjg1OTkiICJcMCIgIklTTy04ODU5LTkiICJcMCIKKwkgICAiQ1AyODYwNSIgIlwwIiAiSVNPLTg4NTktMTUiICJcMCI7CisjIGVuZGlmCisjZW5kaWYKKworICAgICAgY2hhcnNldF9hbGlhc2VzID0gY3A7CisgICAgfQorCisgIHJldHVybiBjcDsKK30KKworLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZywgYW5kIGNhbm9uaWNhbGl6ZSBpdAorICAgaW50byBvbmUgb2YgdGhlIGNhbm9uaWNhbCBuYW1lcyBsaXN0ZWQgaW4gY29uZmlnLmNoYXJzZXQuCisgICBUaGUgcmVzdWx0IG11c3Qgbm90IGJlIGZyZWVkOyBpdCBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZC4KKyAgIElmIHRoZSBjYW5vbmljYWwgbmFtZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhlIHJlc3VsdCBpcyBhIG5vbi1jYW5vbmljYWwKKyAgIG5hbWUuICAqLworCisjaWZkZWYgU1RBVElDCitTVEFUSUMKKyNlbmRpZgorY29uc3QgY2hhciAqCitsb2NhbGVfY2hhcnNldCAoKQoreworICBjb25zdCBjaGFyICpjb2Rlc2V0OworICBjb25zdCBjaGFyICphbGlhc2VzOworCisjaWYgIShkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgT1MyKQorCisjIGlmIEhBVkVfTEFOR0lORk9fQ09ERVNFVAorCisgIC8qIE1vc3Qgc3lzdGVtcyBzdXBwb3J0IG5sX2xhbmdpbmZvIChDT0RFU0VUKSBub3dhZGF5cy4gICovCisgIGNvZGVzZXQgPSBubF9sYW5naW5mbyAoQ09ERVNFVCk7CisKKyMgZWxzZQorCisgIC8qIE9uIG9sZCBzeXN0ZW1zIHdoaWNoIGxhY2sgaXQsIHVzZSBzZXRsb2NhbGUgb3IgZ2V0ZW52LiAgKi8KKyAgY29uc3QgY2hhciAqbG9jYWxlID0gTlVMTDsKKworICAvKiBCdXQgbW9zdCBvbGQgc3lzdGVtcyBkb24ndCBoYXZlIGEgY29tcGxldGUgc2V0IG9mIGxvY2FsZXMuICBTb21lCisgICAgIChsaWtlIFN1bk9TIDQgb3IgREpHUFApIGhhdmUgb25seSB0aGUgQyBsb2NhbGUuICBUaGVyZWZvcmUgd2UgZG9uJ3QKKyAgICAgdXNlIHNldGxvY2FsZSBoZXJlOyBpdCB3b3VsZCByZXR1cm4gIkMiIHdoZW4gaXQgZG9lc24ndCBzdXBwb3J0IHRoZQorICAgICBsb2NhbGUgbmFtZSB0aGUgdXNlciBoYXMgc2V0LiAgKi8KKyMgIGlmIEhBVkVfU0VUTE9DQUxFICYmIDAKKyAgbG9jYWxlID0gc2V0bG9jYWxlIChMQ19DVFlQRSwgTlVMTCk7CisjICBlbmRpZgorICBpZiAobG9jYWxlID09IE5VTEwgfHwgbG9jYWxlWzBdID09ICdcMCcpCisgICAgeworICAgICAgbG9jYWxlID0gZ2V0ZW52ICgiTENfQUxMIik7CisgICAgICBpZiAobG9jYWxlID09IE5VTEwgfHwgbG9jYWxlWzBdID09ICdcMCcpCisJeworCSAgbG9jYWxlID0gZ2V0ZW52ICgiTENfQ1RZUEUiKTsKKwkgIGlmIChsb2NhbGUgPT0gTlVMTCB8fCBsb2NhbGVbMF0gPT0gJ1wwJykKKwkgICAgbG9jYWxlID0gZ2V0ZW52ICgiTEFORyIpOworCX0KKyAgICB9CisKKyAgLyogT24gc29tZSBvbGQgc3lzdGVtcywgb25lIHVzZWQgdG8gc2V0IGxvY2FsZSA9ICJpc284ODU5XzEiLiBPbiBvdGhlcnMsCisgICAgIHlvdSBzZXQgaXQgdG8gImxhbmd1YWdlX0NPVU5UUlkuY2hhcnNldCIuIEluIGFueSBjYXNlLCB3ZSByZXNvbHZlIGl0CisgICAgIHRocm91Z2ggdGhlIGNoYXJzZXQuYWxpYXMgZmlsZS4gICovCisgIGNvZGVzZXQgPSBsb2NhbGU7CisKKyMgZW5kaWYKKworI2VsaWYgZGVmaW5lZCBXSU4zMgorCisgIHN0YXRpYyBjaGFyIGJ1ZlsyICsgMTAgKyAxXTsKKworICAvKiBXb2UzMiBoYXMgYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGxvY2FsZSdzIGNvZGVwYWdlIGFzIGEgbnVtYmVyLiAgKi8KKyAgc3ByaW50ZiAoYnVmLCAiQ1AldSIsIEdldEFDUCAoKSk7CisgIGNvZGVzZXQgPSBidWY7CisKKyNlbGlmIGRlZmluZWQgT1MyCisKKyAgY29uc3QgY2hhciAqbG9jYWxlOworICBzdGF0aWMgY2hhciBidWZbMiArIDEwICsgMV07CisgIFVMT05HIGNwWzNdOworICBVTE9ORyBjcGxlbjsKKworICAvKiBBbGxvdyB1c2VyIHRvIG92ZXJyaWRlIHRoZSBjb2Rlc2V0LCBhcyBzZXQgaW4gdGhlIG9wZXJhdGluZyBzeXN0ZW0sCisgICAgIHdpdGggc3RhbmRhcmQgbGFuZ3VhZ2UgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgKi8KKyAgbG9jYWxlID0gZ2V0ZW52ICgiTENfQUxMIik7CisgIGlmIChsb2NhbGUgPT0gTlVMTCB8fCBsb2NhbGVbMF0gPT0gJ1wwJykKKyAgICB7CisgICAgICBsb2NhbGUgPSBnZXRlbnYgKCJMQ19DVFlQRSIpOworICAgICAgaWYgKGxvY2FsZSA9PSBOVUxMIHx8IGxvY2FsZVswXSA9PSAnXDAnKQorCWxvY2FsZSA9IGdldGVudiAoIkxBTkciKTsKKyAgICB9CisgIGlmIChsb2NhbGUgIT0gTlVMTCAmJiBsb2NhbGVbMF0gIT0gJ1wwJykKKyAgICB7CisgICAgICAvKiBJZiB0aGUgbG9jYWxlIG5hbWUgY29udGFpbnMgYW4gZW5jb2RpbmcgYWZ0ZXIgdGhlIGRvdCwgcmV0dXJuIGl0LiAgKi8KKyAgICAgIGNvbnN0IGNoYXIgKmRvdCA9IHN0cmNociAobG9jYWxlLCAnLicpOworCisgICAgICBpZiAoZG90ICE9IE5VTEwpCisJeworCSAgY29uc3QgY2hhciAqbW9kaWZpZXI7CisKKwkgIGRvdCsrOworCSAgLyogTG9vayBmb3IgdGhlIHBvc3NpYmxlIEAuLi4gdHJhaWxlciBhbmQgcmVtb3ZlIGl0LCBpZiBhbnkuICAqLworCSAgbW9kaWZpZXIgPSBzdHJjaHIgKGRvdCwgJ0AnKTsKKwkgIGlmIChtb2RpZmllciA9PSBOVUxMKQorCSAgICByZXR1cm4gZG90OworCSAgaWYgKG1vZGlmaWVyIC0gZG90IDwgc2l6ZW9mIChidWYpKQorCSAgICB7CisJICAgICAgbWVtY3B5IChidWYsIGRvdCwgbW9kaWZpZXIgLSBkb3QpOworCSAgICAgIGJ1ZiBbbW9kaWZpZXIgLSBkb3RdID0gJ1wwJzsKKwkgICAgICByZXR1cm4gYnVmOworCSAgICB9CisJfQorCisgICAgICAvKiBSZXNvbHZlIHRocm91Z2ggdGhlIGNoYXJzZXQuYWxpYXMgZmlsZS4gICovCisgICAgICBjb2Rlc2V0ID0gbG9jYWxlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIE9TLzIgaGFzIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBsb2NhbGUncyBjb2RlcGFnZSBhcyBhIG51bWJlci4gICovCisgICAgICBpZiAoRG9zUXVlcnlDcCAoc2l6ZW9mIChjcCksIGNwLCAmY3BsZW4pKQorCWNvZGVzZXQgPSAiIjsKKyAgICAgIGVsc2UKKwl7CisJICBzcHJpbnRmIChidWYsICJDUCV1IiwgY3BbMF0pOworCSAgY29kZXNldCA9IGJ1ZjsKKwl9CisgICAgfQorCisjZW5kaWYKKworICBpZiAoY29kZXNldCA9PSBOVUxMKQorICAgIC8qIFRoZSBjYW5vbmljYWwgbmFtZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4gICovCisgICAgY29kZXNldCA9ICIiOworCisgIC8qIFJlc29sdmUgYWxpYXMuICovCisgIGZvciAoYWxpYXNlcyA9IGdldF9jaGFyc2V0X2FsaWFzZXMgKCk7CisgICAgICAgKmFsaWFzZXMgIT0gJ1wwJzsKKyAgICAgICBhbGlhc2VzICs9IHN0cmxlbiAoYWxpYXNlcykgKyAxLCBhbGlhc2VzICs9IHN0cmxlbiAoYWxpYXNlcykgKyAxKQorICAgIGlmIChzdHJjbXAgKGNvZGVzZXQsIGFsaWFzZXMpID09IDAKKwl8fCAoYWxpYXNlc1swXSA9PSAnKicgJiYgYWxpYXNlc1sxXSA9PSAnXDAnKSkKKyAgICAgIHsKKwljb2Rlc2V0ID0gYWxpYXNlcyArIHN0cmxlbiAoYWxpYXNlcykgKyAxOworCWJyZWFrOworICAgICAgfQorCisgIC8qIERvbid0IHJldHVybiBhbiBlbXB0eSBzdHJpbmcuICBHTlUgbGliYyBhbmQgR05VIGxpYmljb252IGludGVycHJldAorICAgICB0aGUgZW1wdHkgc3RyaW5nIGFzIGRlbm90aW5nICJ0aGUgbG9jYWxlJ3MgY2hhcmFjdGVyIGVuY29kaW5nIiwKKyAgICAgdGh1cyBHTlUgbGliaWNvbnYgd291bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGEgc2Vjb25kIHRpbWUuICAqLworICBpZiAoY29kZXNldFswXSA9PSAnXDAnKQorICAgIGNvZGVzZXQgPSAiQVNDSUkiOworCisgIHJldHVybiBjb2Rlc2V0OworfQpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2xvY2FsY2hhcnNldC5oIGIvdW5peC9pbnRsL2xvY2FsY2hhcnNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMTM3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvbG9jYWxjaGFyc2V0LmgKQEAgLTAsMCArMSw0MiBAQAorLyogRGV0ZXJtaW5lIGEgY2Fub25pY2FsIG5hbWUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZy4KKyAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDSEFSU0VUIExpYnJhcnkuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIF9MT0NBTENIQVJTRVRfSAorI2RlZmluZSBfTE9DQUxDSEFSU0VUX0gKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IGxvY2FsZSdzIGNoYXJhY3RlciBlbmNvZGluZywgYW5kIGNhbm9uaWNhbGl6ZSBpdAorICAgaW50byBvbmUgb2YgdGhlIGNhbm9uaWNhbCBuYW1lcyBsaXN0ZWQgaW4gY29uZmlnLmNoYXJzZXQuCisgICBUaGUgcmVzdWx0IG11c3Qgbm90IGJlIGZyZWVkOyBpdCBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZC4KKyAgIElmIHRoZSBjYW5vbmljYWwgbmFtZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhlIHJlc3VsdCBpcyBhIG5vbi1jYW5vbmljYWwKKyAgIG5hbWUuICAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKiBsb2NhbGVfY2hhcnNldCAodm9pZCk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogX0xPQ0FMQ0hBUlNFVF9IICovCmRpZmYgLS1naXQgYS91bml4L2ludGwvbG9jYWxlLmFsaWFzIGIvdW5peC9pbnRsL2xvY2FsZS5hbGlhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDZiYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2xvY2FsZS5hbGlhcwpAQCAtMCwwICsxLDc4IEBACisjIExvY2FsZSBuYW1lIGFsaWFzIGRhdGEgYmFzZS4KKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDEsMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorIyBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisjIFVTQS4KKworIyBUaGUgZm9ybWF0IG9mIHRoaXMgZmlsZSBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZSBvZgorIyB0aGUgWCBXaW5kb3cgU3lzdGVtLCB3aGljaCBub3JtYWxseSBjYW4gYmUgZm91bmQgaW4KKyMJL3Vzci9saWIvWDExL2xvY2FsZS9sb2NhbGUuYWxpYXMKKyMgQSBzaW5nbGUgbGluZSBjb250YWlucyB0d28gZmllbGRzOiBhbiBhbGlhcyBhbmQgYSBzdWJzdGl0dXRpb24gdmFsdWUuCisjIEFsbCBlbnRyaWVzIGFyZSBjYXNlIGluZGVwZW5kZW50LgorCisjIE5vdGU6IFRoaXMgZmlsZSBpcyBmYXIgZnJvbSBiZWluZyBjb21wbGV0ZS4gIElmIHlvdSBoYXZlIGEgdmFsdWUgZm9yCisjIHlvdXIgb3duIHNpdGUgd2hpY2ggeW91IHRoaW5rIG1pZ2h0IGJlIHVzZWZ1bCBmb3Igb3RoZXJzIHRvbywgc2hhcmUKKyMgaXQgd2l0aCB0aGUgcmVzdCBvZiB1cy4gIFNlbmQgaXQgdXNpbmcgdGhlIGBnbGliY2J1Zycgc2NyaXB0IHRvCisjIGJ1Z3NAZ251Lm9yZy4KKworIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6IAorCitib2ttYWwJCW5iX05PLklTTy04ODU5LTEKK2Jva23lbAkJbmJfTk8uSVNPLTg4NTktMQorY2F0YWxhbgkJY2FfRVMuSVNPLTg4NTktMQorY3JvYXRpYW4JaHJfSFIuSVNPLTg4NTktMgorY3plY2gJCWNzX0NaLklTTy04ODU5LTIKK2RhbmlzaCAgICAgICAgICBkYV9ESy5JU08tODg1OS0xCitkYW5zawkJZGFfREsuSVNPLTg4NTktMQorZGV1dHNjaAkJZGVfREUuSVNPLTg4NTktMQorZHV0Y2gJCW5sX05MLklTTy04ODU5LTEKK2Vlc3RpCQlldF9FRS5JU08tODg1OS0xCitlc3RvbmlhbglldF9FRS5JU08tODg1OS0xCitmaW5uaXNoICAgICAgICAgZmlfRkkuSVNPLTg4NTktMQorZnJhbudhaXMJZnJfRlIuSVNPLTg4NTktMQorZnJlbmNoCQlmcl9GUi5JU08tODg1OS0xCitnYWxlZ28JCWdsX0VTLklTTy04ODU5LTEKK2dhbGljaWFuCWdsX0VTLklTTy04ODU5LTEKK2dlcm1hbgkJZGVfREUuSVNPLTg4NTktMQorZ3JlZWsgICAgICAgICAgIGVsX0dSLklTTy04ODU5LTcKK2hlYnJldyAgICAgICAgICBoZV9JTC5JU08tODg1OS04CitocnZhdHNraQlocl9IUi5JU08tODg1OS0yCitodW5nYXJpYW4gICAgICAgaHVfSFUuSVNPLTg4NTktMgoraWNlbGFuZGljICAgICAgIGlzX0lTLklTTy04ODU5LTEKK2l0YWxpYW4gICAgICAgICBpdF9JVC5JU08tODg1OS0xCitqYXBhbmVzZQlqYV9KUC5ldWNKUAoramFwYW5lc2UuZXVjCWphX0pQLmV1Y0pQCitqYV9KUAkJamFfSlAuZXVjSlAKK2phX0pQLnVqaXMJamFfSlAuZXVjSlAKK2phcGFuZXNlLnNqaXMJamFfSlAuU0pJUwora29yZWFuCQlrb19LUi5ldWNLUgora29yZWFuLmV1YyAJa29fS1IuZXVjS1IKK2tvX0tSCQlrb19LUi5ldWNLUgorbGl0aHVhbmlhbiAgICAgIGx0X0xULklTTy04ODU5LTEzCitub19OTwkJbmJfTk8uSVNPLTg4NTktMQorbm9fTk8uSVNPLTg4NTktMSBuYl9OTy5JU08tODg1OS0xCitub3J3ZWdpYW4gICAgICAgbmJfTk8uSVNPLTg4NTktMQorbnlub3JzawkJbm5fTk8uSVNPLTg4NTktMQorcG9saXNoICAgICAgICAgIHBsX1BMLklTTy04ODU5LTIKK3BvcnR1Z3Vlc2UgICAgICBwdF9QVC5JU08tODg1OS0xCityb21hbmlhbiAgICAgICAgcm9fUk8uSVNPLTg4NTktMgorcnVzc2lhbiAgICAgICAgIHJ1X1JVLklTTy04ODU5LTUKK3Nsb3ZhayAgICAgICAgICBza19TSy5JU08tODg1OS0yCitzbG92ZW5lICAgICAgICAgc2xfU0kuSVNPLTg4NTktMgorc2xvdmVuaWFuICAgICAgIHNsX1NJLklTTy04ODU5LTIKK3NwYW5pc2ggICAgICAgICBlc19FUy5JU08tODg1OS0xCitzd2VkaXNoICAgICAgICAgc3ZfU0UuSVNPLTg4NTktMQordGhhaQkJdGhfVEguVElTLTYyMAordHVya2lzaCAgICAgICAgIHRyX1RSLklTTy04ODU5LTkKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9sb2NhbGVhbGlhcy5jIGIvdW5peC9pbnRsL2xvY2FsZWFsaWFzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVhZjg4MQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9sb2NhbGVhbGlhcy5jCkBAIC0wLDAgKzEsNDE0IEBACisvKiBIYW5kbGUgYWxpYXNlcyBmb3IgbG9jYWxlIG5hbWVzLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwMSwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKy8qIFRlbGwgZ2xpYmMncyA8c3RyaW5nLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIG1lbXBjcHkoKS4KKyAgIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+IGJlY2F1c2UgPGNvbmZpZy5oPiBtYXkgaW5jbHVkZQorICAgPGZlYXR1cmVzLmg+LCBhbmQgb25jZSA8ZmVhdHVyZXMuaD4gaGFzIGJlZW4gaW5jbHVkZWQsIGl0J3MgdG9vIGxhdGUuICAqLworI2lmbmRlZiBfR05VX1NPVVJDRQorIyBkZWZpbmUgX0dOVV9TT1VSQ0UgICAgMQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfX19GU0VUTE9DS0lORworIyBpbmNsdWRlIDxzdGRpb19leHQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWZkZWYgX19HTlVDX18KKyMgdW5kZWYgYWxsb2NhCisjIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQorI2Vsc2UKKyMgaWZkZWYgX01TQ19WRVIKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCisjIGVsc2UKKyMgIGlmIGRlZmluZWQgSEFWRV9BTExPQ0FfSCB8fCBkZWZpbmVkIF9MSUJDCisjICAgaW5jbHVkZSA8YWxsb2NhLmg+CisjICBlbHNlCisjICAgaWZkZWYgX0FJWAorICNwcmFnbWEgYWxsb2NhCisjICAgZWxzZQorIyAgICBpZm5kZWYgYWxsb2NhCitjaGFyICphbGxvY2EgKCk7CisjICAgIGVuZGlmCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKworI2lmIEVOQUJMRV9SRUxPQ0FUQUJMRQorIyBpbmNsdWRlICJyZWxvY2F0YWJsZS5oIgorI2Vsc2UKKyMgZGVmaW5lIHJlbG9jYXRlKHBhdGhuYW1lKSAocGF0aG5hbWUpCisjZW5kaWYKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisjaWZkZWYgX0xJQkMKKy8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAorICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAorICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLworIyBkZWZpbmUgc3RyY2FzZWNtcCBfX3N0cmNhc2VjbXAKKworIyBpZm5kZWYgbWVtcGNweQorIyAgZGVmaW5lIG1lbXBjcHkgX19tZW1wY3B5CisjIGVuZGlmCisjIGRlZmluZSBIQVZFX01FTVBDUFkJMQorIyBkZWZpbmUgSEFWRV9fX0ZTRVRMT0NLSU5HCTEKKworLyogV2UgbmVlZCBsb2NraW5nIGhlcmUgc2luY2Ugd2UgY2FuIGJlIGNhbGxlZCBmcm9tIGRpZmZlcmVudCBwbGFjZXMuICAqLworIyBpbmNsdWRlIDxiaXRzL2xpYmMtbG9jay5oPgorCitfX2xpYmNfbG9ja19kZWZpbmVfaW5pdGlhbGl6ZWQgKHN0YXRpYywgbG9jayk7CisjZW5kaWYKKworI2lmbmRlZiBpbnRlcm5hbF9mdW5jdGlvbgorIyBkZWZpbmUgaW50ZXJuYWxfZnVuY3Rpb24KKyNlbmRpZgorCisvKiBTb21lIG9wdGltaXphdGlvbnMgZm9yIGdsaWJjLiAgKi8KKyNpZmRlZiBfTElCQworIyBkZWZpbmUgRkVPRihmcCkJCWZlb2ZfdW5sb2NrZWQgKGZwKQorIyBkZWZpbmUgRkdFVFMoYnVmLCBuLCBmcCkJZmdldHNfdW5sb2NrZWQgKGJ1ZiwgbiwgZnApCisjZWxzZQorIyBkZWZpbmUgRkVPRihmcCkJCWZlb2YgKGZwKQorIyBkZWZpbmUgRkdFVFMoYnVmLCBuLCBmcCkJZmdldHMgKGJ1ZiwgbiwgZnApCisjZW5kaWYKKworLyogRm9yIHRob3NlIGxvc2luZyBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgYGFsbG9jYScgd2UgaGF2ZSB0byBhZGQKKyAgIHNvbWUgYWRkaXRpb25hbCBjb2RlIGVtdWxhdGluZyBpdC4gICovCisjaWZkZWYgSEFWRV9BTExPQ0EKKyMgZGVmaW5lIGZyZWVhKHApIC8qIG5vdGhpbmcgKi8KKyNlbHNlCisjIGRlZmluZSBhbGxvY2EobikgbWFsbG9jIChuKQorIyBkZWZpbmUgZnJlZWEocCkgZnJlZSAocCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfTElCQ19SRUVOVFJBTlQgfHwgSEFWRV9ERUNMX0ZHRVRTX1VOTE9DS0VECisjIHVuZGVmIGZnZXRzCisjIGRlZmluZSBmZ2V0cyhidWYsIGxlbiwgcykgZmdldHNfdW5sb2NrZWQgKGJ1ZiwgbGVuLCBzKQorI2VuZGlmCisjaWYgZGVmaW5lZCBfTElCQ19SRUVOVFJBTlQgfHwgSEFWRV9ERUNMX0ZFT0ZfVU5MT0NLRUQKKyMgdW5kZWYgZmVvZgorIyBkZWZpbmUgZmVvZihzKSBmZW9mX3VubG9ja2VkIChzKQorI2VuZGlmCisKKworc3RydWN0IGFsaWFzX21hcAoreworICBjb25zdCBjaGFyICphbGlhczsKKyAgY29uc3QgY2hhciAqdmFsdWU7Cit9OworCisKKyNpZm5kZWYgX0xJQkMKKyMgZGVmaW5lIGxpYmNfZnJlZXJlc19wdHIoZGVjbCkgZGVjbAorI2VuZGlmCisKK2xpYmNfZnJlZXJlc19wdHIgKHN0YXRpYyBjaGFyICpzdHJpbmdfc3BhY2UpOworc3RhdGljIHNpemVfdCBzdHJpbmdfc3BhY2VfYWN0Oworc3RhdGljIHNpemVfdCBzdHJpbmdfc3BhY2VfbWF4OworbGliY19mcmVlcmVzX3B0ciAoc3RhdGljIHN0cnVjdCBhbGlhc19tYXAgKm1hcCk7CitzdGF0aWMgc2l6ZV90IG5tYXA7CitzdGF0aWMgc2l6ZV90IG1heG1hcDsKKworCisvKiBQcm90b3R5cGVzIGZvciBsb2NhbCBmdW5jdGlvbnMuICAqLworc3RhdGljIHNpemVfdCByZWFkX2FsaWFzX2ZpbGUgKGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgZm5hbWVfbGVuKQorICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKK3N0YXRpYyBpbnQgZXh0ZW5kX2FsaWFzX3RhYmxlICh2b2lkKTsKK3N0YXRpYyBpbnQgYWxpYXNfY29tcGFyZSAoY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMSwKKwkJCSAgY29uc3Qgc3RydWN0IGFsaWFzX21hcCAqbWFwMik7CisKKworY29uc3QgY2hhciAqCitfbmxfZXhwYW5kX2FsaWFzIChjb25zdCBjaGFyICpuYW1lKQoreworICBzdGF0aWMgY29uc3QgY2hhciAqbG9jYWxlX2FsaWFzX3BhdGg7CisgIHN0cnVjdCBhbGlhc19tYXAgKnJldHZhbDsKKyAgY29uc3QgY2hhciAqcmVzdWx0ID0gTlVMTDsKKyAgc2l6ZV90IGFkZGVkOworCisjaWZkZWYgX0xJQkMKKyAgX19saWJjX2xvY2tfbG9jayAobG9jayk7CisjZW5kaWYKKworICBpZiAobG9jYWxlX2FsaWFzX3BhdGggPT0gTlVMTCkKKyAgICBsb2NhbGVfYWxpYXNfcGF0aCA9IExPQ0FMRV9BTElBU19QQVRIOworCisgIGRvCisgICAgeworICAgICAgc3RydWN0IGFsaWFzX21hcCBpdGVtOworCisgICAgICBpdGVtLmFsaWFzID0gbmFtZTsKKworICAgICAgaWYgKG5tYXAgPiAwKQorCXJldHZhbCA9IChzdHJ1Y3QgYWxpYXNfbWFwICopIGJzZWFyY2ggKCZpdGVtLCBtYXAsIG5tYXAsCisJCQkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApLAorCQkJCQkgICAgICAgKGludCAoKikgKGNvbnN0IHZvaWQgKiwKKwkJCQkJCQkgY29uc3Qgdm9pZCAqKQorCQkJCQkJKSBhbGlhc19jb21wYXJlKTsKKyAgICAgIGVsc2UKKwlyZXR2YWwgPSBOVUxMOworCisgICAgICAvKiBXZSByZWFsbHkgZm91bmQgYW4gYWxpYXMuICBSZXR1cm4gdGhlIHZhbHVlLiAgKi8KKyAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKKwl7CisJICByZXN1bHQgPSByZXR2YWwtPnZhbHVlOworCSAgYnJlYWs7CisJfQorCisgICAgICAvKiBQZXJoYXBzIHdlIGNhbiBmaW5kIGFub3RoZXIgYWxpYXMgZmlsZS4gICovCisgICAgICBhZGRlZCA9IDA7CisgICAgICB3aGlsZSAoYWRkZWQgPT0gMCAmJiBsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSAnXDAnKQorCXsKKwkgIGNvbnN0IGNoYXIgKnN0YXJ0OworCisJICB3aGlsZSAobG9jYWxlX2FsaWFzX3BhdGhbMF0gPT0gUEFUSF9TRVBBUkFUT1IpCisJICAgICsrbG9jYWxlX2FsaWFzX3BhdGg7CisJICBzdGFydCA9IGxvY2FsZV9hbGlhc19wYXRoOworCisJICB3aGlsZSAobG9jYWxlX2FsaWFzX3BhdGhbMF0gIT0gJ1wwJworCQkgJiYgbG9jYWxlX2FsaWFzX3BhdGhbMF0gIT0gUEFUSF9TRVBBUkFUT1IpCisJICAgICsrbG9jYWxlX2FsaWFzX3BhdGg7CisKKwkgIGlmIChzdGFydCA8IGxvY2FsZV9hbGlhc19wYXRoKQorCSAgICBhZGRlZCA9IHJlYWRfYWxpYXNfZmlsZSAoc3RhcnQsIGxvY2FsZV9hbGlhc19wYXRoIC0gc3RhcnQpOworCX0KKyAgICB9CisgIHdoaWxlIChhZGRlZCAhPSAwKTsKKworI2lmZGVmIF9MSUJDCisgIF9fbGliY19sb2NrX3VubG9jayAobG9jayk7CisjZW5kaWYKKworICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBzaXplX3QKK2ludGVybmFsX2Z1bmN0aW9uCityZWFkX2FsaWFzX2ZpbGUgKGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgZm5hbWVfbGVuKQoreworICBGSUxFICpmcDsKKyAgY2hhciAqZnVsbF9mbmFtZTsKKyAgc2l6ZV90IGFkZGVkOworICBzdGF0aWMgY29uc3QgY2hhciBhbGlhc2ZpbGVbXSA9ICIvbG9jYWxlLmFsaWFzIjsKKworICBmdWxsX2ZuYW1lID0gKGNoYXIgKikgYWxsb2NhIChmbmFtZV9sZW4gKyBzaXplb2YgYWxpYXNmaWxlKTsKKyNpZmRlZiBIQVZFX01FTVBDUFkKKyAgbWVtcGNweSAobWVtcGNweSAoZnVsbF9mbmFtZSwgZm5hbWUsIGZuYW1lX2xlbiksCisJICAgYWxpYXNmaWxlLCBzaXplb2YgYWxpYXNmaWxlKTsKKyNlbHNlCisgIG1lbWNweSAoZnVsbF9mbmFtZSwgZm5hbWUsIGZuYW1lX2xlbik7CisgIG1lbWNweSAoJmZ1bGxfZm5hbWVbZm5hbWVfbGVuXSwgYWxpYXNmaWxlLCBzaXplb2YgYWxpYXNmaWxlKTsKKyNlbmRpZgorCisgIGZwID0gZm9wZW4gKHJlbG9jYXRlIChmdWxsX2ZuYW1lKSwgInIiKTsKKyAgZnJlZWEgKGZ1bGxfZm5hbWUpOworICBpZiAoZnAgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworI2lmZGVmIEhBVkVfX19GU0VUTE9DS0lORworICAvKiBObyB0aHJlYWRzIHByZXNlbnQuICAqLworICBfX2ZzZXRsb2NraW5nIChmcCwgRlNFVExPQ0tJTkdfQllDQUxMRVIpOworI2VuZGlmCisKKyAgYWRkZWQgPSAwOworICB3aGlsZSAoIUZFT0YgKGZwKSkKKyAgICB7CisgICAgICAvKiBJdCBpcyBhIHJlYXNvbmFibGUgYXBwcm9hY2ggdG8gdXNlIGEgZml4IGJ1ZmZlciBoZXJlIGJlY2F1c2UKKwkgYSkgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgZmlyc3QgdHdvIGZpZWxkcworCSBiKSB0aGVzZSBmaWVsZHMgbXVzdCBiZSB1c2FibGUgYXMgZmlsZSBuYW1lcyBhbmQgc28gbXVzdCBub3QKKwkgICAgYmUgdGhhdCBsb25nCisJIFdlIGF2b2lkIGEgbXVsdGkta2lsb2J5dGUgYnVmZmVyIGhlcmUgc2luY2UgdGhpcyB3b3VsZCB1c2UgdXAKKwkgc3RhY2sgc3BhY2Ugd2hpY2ggd2UgbWlnaHQgbm90IGhhdmUgaWYgdGhlIHByb2dyYW0gcmFuIG91dCBvZgorCSBtZW1vcnkuICAqLworICAgICAgY2hhciBidWZbNDAwXTsKKyAgICAgIGNoYXIgKmFsaWFzOworICAgICAgY2hhciAqdmFsdWU7CisgICAgICBjaGFyICpjcDsKKworICAgICAgaWYgKEZHRVRTIChidWYsIHNpemVvZiBidWYsIGZwKSA9PSBOVUxMKQorCS8qIEVPRiByZWFjaGVkLiAgKi8KKwlicmVhazsKKworICAgICAgY3AgPSBidWY7CisgICAgICAvKiBJZ25vcmUgbGVhZGluZyB3aGl0ZSBzcGFjZS4gICovCisgICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGNwWzBdKSkKKwkrK2NwOworCisgICAgICAvKiBBIGxlYWRpbmcgJyMnIHNpZ25hbHMgYSBjb21tZW50IGxpbmUuICAqLworICAgICAgaWYgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJyMnKQorCXsKKwkgIGFsaWFzID0gY3ArKzsKKwkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmICFpc3NwYWNlICgodW5zaWduZWQgY2hhcikgY3BbMF0pKQorCSAgICArK2NwOworCSAgLyogVGVybWluYXRlIGFsaWFzIG5hbWUuICAqLworCSAgaWYgKGNwWzBdICE9ICdcMCcpCisJICAgICpjcCsrID0gJ1wwJzsKKworCSAgLyogTm93IGxvb2sgZm9yIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHZhbHVlLiAgKi8KKwkgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgY3BbMF0pKQorCSAgICArK2NwOworCisJICBpZiAoY3BbMF0gIT0gJ1wwJykKKwkgICAgeworCSAgICAgIHNpemVfdCBhbGlhc19sZW47CisJICAgICAgc2l6ZV90IHZhbHVlX2xlbjsKKworCSAgICAgIHZhbHVlID0gY3ArKzsKKwkgICAgICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiAhaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGNwWzBdKSkKKwkJKytjcDsKKwkgICAgICAvKiBUZXJtaW5hdGUgdmFsdWUuICAqLworCSAgICAgIGlmIChjcFswXSA9PSAnXG4nKQorCQl7CisJCSAgLyogVGhpcyBoYXMgdG8gYmUgZG9uZSB0byBtYWtlIHRoZSBmb2xsb3dpbmcgdGVzdAorCQkgICAgIGZvciB0aGUgZW5kIG9mIGxpbmUgcG9zc2libGUuICBXZSBhcmUgbG9va2luZyBmb3IKKwkJICAgICB0aGUgdGVybWluYXRpbmcgJ1xuJyB3aGljaCBkbyBub3Qgb3ZlcndyaXRlIGhlcmUuICAqLworCQkgICpjcCsrID0gJ1wwJzsKKwkJICAqY3AgPSAnXG4nOworCQl9CisJICAgICAgZWxzZSBpZiAoY3BbMF0gIT0gJ1wwJykKKwkJKmNwKysgPSAnXDAnOworCisJICAgICAgaWYgKG5tYXAgPj0gbWF4bWFwKQorCQlpZiAoX19idWlsdGluX2V4cGVjdCAoZXh0ZW5kX2FsaWFzX3RhYmxlICgpLCAwKSkKKwkJICByZXR1cm4gYWRkZWQ7CisKKwkgICAgICBhbGlhc19sZW4gPSBzdHJsZW4gKGFsaWFzKSArIDE7CisJICAgICAgdmFsdWVfbGVuID0gc3RybGVuICh2YWx1ZSkgKyAxOworCisJICAgICAgaWYgKHN0cmluZ19zcGFjZV9hY3QgKyBhbGlhc19sZW4gKyB2YWx1ZV9sZW4gPiBzdHJpbmdfc3BhY2VfbWF4KQorCQl7CisJCSAgLyogSW5jcmVhc2Ugc2l6ZSBvZiBtZW1vcnkgcG9vbC4gICovCisJCSAgc2l6ZV90IG5ld19zaXplID0gKHN0cmluZ19zcGFjZV9tYXgKKwkJCQkgICAgICsgKGFsaWFzX2xlbiArIHZhbHVlX2xlbiA+IDEwMjQKKwkJCQkJPyBhbGlhc19sZW4gKyB2YWx1ZV9sZW4gOiAxMDI0KSk7CisJCSAgY2hhciAqbmV3X3Bvb2wgPSAoY2hhciAqKSByZWFsbG9jIChzdHJpbmdfc3BhY2UsIG5ld19zaXplKTsKKwkJICBpZiAobmV3X3Bvb2wgPT0gTlVMTCkKKwkJICAgIHJldHVybiBhZGRlZDsKKworCQkgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChzdHJpbmdfc3BhY2UgIT0gbmV3X3Bvb2wsIDApKQorCQkgICAgeworCQkgICAgICBzaXplX3QgaTsKKworCQkgICAgICBmb3IgKGkgPSAwOyBpIDwgbm1hcDsgaSsrKQorCQkJeworCQkJICBtYXBbaV0uYWxpYXMgKz0gbmV3X3Bvb2wgLSBzdHJpbmdfc3BhY2U7CisJCQkgIG1hcFtpXS52YWx1ZSArPSBuZXdfcG9vbCAtIHN0cmluZ19zcGFjZTsKKwkJCX0KKwkJICAgIH0KKworCQkgIHN0cmluZ19zcGFjZSA9IG5ld19wb29sOworCQkgIHN0cmluZ19zcGFjZV9tYXggPSBuZXdfc2l6ZTsKKwkJfQorCisJICAgICAgbWFwW25tYXBdLmFsaWFzID0gbWVtY3B5ICgmc3RyaW5nX3NwYWNlW3N0cmluZ19zcGFjZV9hY3RdLAorCQkJCQlhbGlhcywgYWxpYXNfbGVuKTsKKwkgICAgICBzdHJpbmdfc3BhY2VfYWN0ICs9IGFsaWFzX2xlbjsKKworCSAgICAgIG1hcFtubWFwXS52YWx1ZSA9IG1lbWNweSAoJnN0cmluZ19zcGFjZVtzdHJpbmdfc3BhY2VfYWN0XSwKKwkJCQkJdmFsdWUsIHZhbHVlX2xlbik7CisJICAgICAgc3RyaW5nX3NwYWNlX2FjdCArPSB2YWx1ZV9sZW47CisKKwkgICAgICArK25tYXA7CisJICAgICAgKythZGRlZDsKKwkgICAgfQorCX0KKworICAgICAgLyogUG9zc2libHkgbm90IHRoZSB3aG9sZSBsaW5lIGZpdHMgaW50byB0aGUgYnVmZmVyLiAgSWdub3JlCisJIHRoZSByZXN0IG9mIHRoZSBsaW5lLiAgKi8KKyAgICAgIHdoaWxlIChzdHJjaHIgKGJ1ZiwgJ1xuJykgPT0gTlVMTCkKKwlpZiAoRkdFVFMgKGJ1Ziwgc2l6ZW9mIGJ1ZiwgZnApID09IE5VTEwpCisJICAvKiBNYWtlIHN1cmUgdGhlIGlubmVyIGxvb3Agd2lsbCBiZSBsZWZ0LiAgVGhlIG91dGVyIGxvb3AKKwkgICAgIHdpbGwgZXhpdCBhdCB0aGUgYGZlb2YnIHRlc3QuICAqLworCSAgYnJlYWs7CisgICAgfQorCisgIC8qIFNob3VsZCB3ZSB0ZXN0IGZvciBmZXJyb3IoKT8gIEkgdGhpbmsgd2UgaGF2ZSB0byBzaWxlbnRseSBpZ25vcmUKKyAgICAgZXJyb3JzLiAgLS1kcmVwcGVyICAqLworICBmY2xvc2UgKGZwKTsKKworICBpZiAoYWRkZWQgPiAwKQorICAgIHFzb3J0IChtYXAsIG5tYXAsIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCksCisJICAgKGludCAoKikgKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkgYWxpYXNfY29tcGFyZSk7CisKKyAgcmV0dXJuIGFkZGVkOworfQorCisKK3N0YXRpYyBpbnQKK2V4dGVuZF9hbGlhc190YWJsZSAoKQoreworICBzaXplX3QgbmV3X3NpemU7CisgIHN0cnVjdCBhbGlhc19tYXAgKm5ld19tYXA7CisKKyAgbmV3X3NpemUgPSBtYXhtYXAgPT0gMCA/IDEwMCA6IDIgKiBtYXhtYXA7CisgIG5ld19tYXAgPSAoc3RydWN0IGFsaWFzX21hcCAqKSByZWFsbG9jIChtYXAsIChuZXdfc2l6ZQorCQkJCQkJKiBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApKSk7CisgIGlmIChuZXdfbWFwID09IE5VTEwpCisgICAgLyogU2ltcGx5IGRvbid0IGV4dGVuZDogd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBjb3JlLiAgKi8KKyAgICByZXR1cm4gLTE7CisKKyAgbWFwID0gbmV3X21hcDsKKyAgbWF4bWFwID0gbmV3X3NpemU7CisgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2FsaWFzX2NvbXBhcmUgKGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDEsIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDIpCit7CisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSQ0FTRUNNUAorICByZXR1cm4gc3RyY2FzZWNtcCAobWFwMS0+YWxpYXMsIG1hcDItPmFsaWFzKTsKKyNlbHNlCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbWFwMS0+YWxpYXM7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbWFwMi0+YWxpYXM7CisgIHVuc2lnbmVkIGNoYXIgYzEsIGMyOworCisgIGlmIChwMSA9PSBwMikKKyAgICByZXR1cm4gMDsKKworICBkbworICAgIHsKKyAgICAgIC8qIEkga25vdyB0aGlzIHNlZW1zIHRvIGJlIG9kZCBidXQgdGhlIHRvbG93ZXIoKSBmdW5jdGlvbiBpbgorCSBzb21lIHN5c3RlbXMgbGliYyBjYW5ub3QgaGFuZGxlIG5vbmFscGhhIGNoYXJhY3RlcnMuICAqLworICAgICAgYzEgPSBpc3VwcGVyICgqcDEpID8gdG9sb3dlciAoKnAxKSA6ICpwMTsKKyAgICAgIGMyID0gaXN1cHBlciAoKnAyKSA/IHRvbG93ZXIgKCpwMikgOiAqcDI7CisgICAgICBpZiAoYzEgPT0gJ1wwJykKKwlicmVhazsKKyAgICAgICsrcDE7CisgICAgICArK3AyOworICAgIH0KKyAgd2hpbGUgKGMxID09IGMyKTsKKworICByZXR1cm4gYzEgLSBjMjsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL2xvY2FsZW5hbWUuYyBiL3VuaXgvaW50bC9sb2NhbGVuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2MmU1NAotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9sb2NhbGVuYW1lLmMKQEAgLTAsMCArMSwxMTQyIEBACisvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgbG9jYWxlLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDAtMjAwNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKy8qIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251Lm9yZz4sIDE5OTUuICAqLworLyogV2luMzIgY29kZSB3cml0dGVuIGJ5IFRvciBMaWxscXZpc3QgPHRtbEBpa2kuZmk+LiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorCisjaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18KKyMgdW5kZWYgV0lOMzIgICAvKiBhdm9pZCB3YXJuaW5nIG9uIG1pbmd3MzIgKi8KKyMgZGVmaW5lIFdJTjMyCisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKy8qIExpc3Qgb2YgbGFuZ3VhZ2UgY29kZXMsIHNvcnRlZCBieSB2YWx1ZToKKyAgIDB4MDEgTEFOR19BUkFCSUMKKyAgIDB4MDIgTEFOR19CVUxHQVJJQU4KKyAgIDB4MDMgTEFOR19DQVRBTEFOCisgICAweDA0IExBTkdfQ0hJTkVTRQorICAgMHgwNSBMQU5HX0NaRUNICisgICAweDA2IExBTkdfREFOSVNICisgICAweDA3IExBTkdfR0VSTUFOCisgICAweDA4IExBTkdfR1JFRUsKKyAgIDB4MDkgTEFOR19FTkdMSVNICisgICAweDBhIExBTkdfU1BBTklTSAorICAgMHgwYiBMQU5HX0ZJTk5JU0gKKyAgIDB4MGMgTEFOR19GUkVOQ0gKKyAgIDB4MGQgTEFOR19IRUJSRVcKKyAgIDB4MGUgTEFOR19IVU5HQVJJQU4KKyAgIDB4MGYgTEFOR19JQ0VMQU5ESUMKKyAgIDB4MTAgTEFOR19JVEFMSUFOCisgICAweDExIExBTkdfSkFQQU5FU0UKKyAgIDB4MTIgTEFOR19LT1JFQU4KKyAgIDB4MTMgTEFOR19EVVRDSAorICAgMHgxNCBMQU5HX05PUldFR0lBTgorICAgMHgxNSBMQU5HX1BPTElTSAorICAgMHgxNiBMQU5HX1BPUlRVR1VFU0UKKyAgIDB4MTcgTEFOR19SSEFFVE9fUk9NQU5DRQorICAgMHgxOCBMQU5HX1JPTUFOSUFOCisgICAweDE5IExBTkdfUlVTU0lBTgorICAgMHgxYSBMQU5HX0NST0FUSUFOID09IExBTkdfU0VSQklBTgorICAgMHgxYiBMQU5HX1NMT1ZBSworICAgMHgxYyBMQU5HX0FMQkFOSUFOCisgICAweDFkIExBTkdfU1dFRElTSAorICAgMHgxZSBMQU5HX1RIQUkKKyAgIDB4MWYgTEFOR19UVVJLSVNICisgICAweDIwIExBTkdfVVJEVQorICAgMHgyMSBMQU5HX0lORE9ORVNJQU4KKyAgIDB4MjIgTEFOR19VS1JBSU5JQU4KKyAgIDB4MjMgTEFOR19CRUxBUlVTSUFOCisgICAweDI0IExBTkdfU0xPVkVOSUFOCisgICAweDI1IExBTkdfRVNUT05JQU4KKyAgIDB4MjYgTEFOR19MQVRWSUFOCisgICAweDI3IExBTkdfTElUSFVBTklBTgorICAgMHgyOCBMQU5HX1RBSklLCisgICAweDI5IExBTkdfRkFSU0kKKyAgIDB4MmEgTEFOR19WSUVUTkFNRVNFCisgICAweDJiIExBTkdfQVJNRU5JQU4KKyAgIDB4MmMgTEFOR19BWkVSSQorICAgMHgyZCBMQU5HX0JBU1FVRQorICAgMHgyZSBMQU5HX1NPUkJJQU4KKyAgIDB4MmYgTEFOR19NQUNFRE9OSUFOCisgICAweDMwIExBTkdfU1VUVQorICAgMHgzMSBMQU5HX1RTT05HQQorICAgMHgzMiBMQU5HX1RTV0FOQQorICAgMHgzMyBMQU5HX1ZFTkRBCisgICAweDM0IExBTkdfWEhPU0EKKyAgIDB4MzUgTEFOR19aVUxVCisgICAweDM2IExBTkdfQUZSSUtBQU5TCisgICAweDM3IExBTkdfR0VPUkdJQU4KKyAgIDB4MzggTEFOR19GQUVST0VTRQorICAgMHgzOSBMQU5HX0hJTkRJCisgICAweDNhIExBTkdfTUFMVEVTRQorICAgMHgzYiBMQU5HX1NBQU1JCisgICAweDNjIExBTkdfR0FFTElDCisgICAweDNkIExBTkdfWUlERElTSAorICAgMHgzZSBMQU5HX01BTEFZCisgICAweDNmIExBTkdfS0FaQUsKKyAgIDB4NDAgTEFOR19LWVJHWVoKKyAgIDB4NDEgTEFOR19TV0FISUxJCisgICAweDQyIExBTkdfVFVSS01FTgorICAgMHg0MyBMQU5HX1VaQkVLCisgICAweDQ0IExBTkdfVEFUQVIKKyAgIDB4NDUgTEFOR19CRU5HQUxJCisgICAweDQ2IExBTkdfUFVOSkFCSQorICAgMHg0NyBMQU5HX0dVSkFSQVRJCisgICAweDQ4IExBTkdfT1JJWUEKKyAgIDB4NDkgTEFOR19UQU1JTAorICAgMHg0YSBMQU5HX1RFTFVHVQorICAgMHg0YiBMQU5HX0tBTk5BREEKKyAgIDB4NGMgTEFOR19NQUxBWUFMQU0KKyAgIDB4NGQgTEFOR19BU1NBTUVTRQorICAgMHg0ZSBMQU5HX01BUkFUSEkKKyAgIDB4NGYgTEFOR19TQU5TS1JJVAorICAgMHg1MCBMQU5HX01PTkdPTElBTgorICAgMHg1MSBMQU5HX1RJQkVUQU4KKyAgIDB4NTIgTEFOR19XRUxTSAorICAgMHg1MyBMQU5HX0NBTUJPRElBTgorICAgMHg1NCBMQU5HX0xBTworICAgMHg1NSBMQU5HX0JVUk1FU0UKKyAgIDB4NTYgTEFOR19HQUxJQ0lBTgorICAgMHg1NyBMQU5HX0tPTktBTkkKKyAgIDB4NTggTEFOR19NQU5JUFVSSQorICAgMHg1OSBMQU5HX1NJTkRISQorICAgMHg1YSBMQU5HX1NZUklBQworICAgMHg1YiBMQU5HX1NJTkhBTEVTRQorICAgMHg1YyBMQU5HX0NIRVJPS0VFCisgICAweDVkIExBTkdfSU5VS1RJVFVUCisgICAweDVlIExBTkdfQU1IQVJJQworICAgMHg1ZiBMQU5HX1RBTUFaSUdIVAorICAgMHg2MCBMQU5HX0tBU0hNSVJJCisgICAweDYxIExBTkdfTkVQQUxJCisgICAweDYyIExBTkdfRlJJU0lBTgorICAgMHg2MyBMQU5HX1BBU0hUTworICAgMHg2NCBMQU5HX1RBR0FMT0cKKyAgIDB4NjUgTEFOR19ESVZFSEkKKyAgIDB4NjYgTEFOR19FRE8KKyAgIDB4NjcgTEFOR19GVUxGVUxERQorICAgMHg2OCBMQU5HX0hBVVNBCisgICAweDY5IExBTkdfSUJJQklPCisgICAweDZhIExBTkdfWU9SVUJBCisgICAweDcwIExBTkdfSUdCTworICAgMHg3MSBMQU5HX0tBTlVSSQorICAgMHg3MiBMQU5HX09ST01PCisgICAweDczIExBTkdfVElHUklOWUEKKyAgIDB4NzQgTEFOR19HVUFSQU5JCisgICAweDc1IExBTkdfSEFXQUlJQU4KKyAgIDB4NzYgTEFOR19MQVRJTgorICAgMHg3NyBMQU5HX1NPTUFMSQorICAgMHg3OCBMQU5HX1lJCisgICAweDc5IExBTkdfUEFQSUFNRU5UVQorKi8KKy8qIE1pbmd3IGhlYWRlcnMgZG9uJ3QgaGF2ZSBsYXRlc3QgbGFuZ3VhZ2UgYW5kIHN1Ymxhbmd1YWdlIGNvZGVzLiAgKi8KKyMgaWZuZGVmIExBTkdfQUZSSUtBQU5TCisjIGRlZmluZSBMQU5HX0FGUklLQUFOUyAweDM2CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0FMQkFOSUFOCisjIGRlZmluZSBMQU5HX0FMQkFOSUFOIDB4MWMKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQU1IQVJJQworIyBkZWZpbmUgTEFOR19BTUhBUklDIDB4NWUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQVJBQklDCisjIGRlZmluZSBMQU5HX0FSQUJJQyAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0FSTUVOSUFOCisjIGRlZmluZSBMQU5HX0FSTUVOSUFOIDB4MmIKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQVNTQU1FU0UKKyMgZGVmaW5lIExBTkdfQVNTQU1FU0UgMHg0ZAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19BWkVSSQorIyBkZWZpbmUgTEFOR19BWkVSSSAweDJjCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0JBU1FVRQorIyBkZWZpbmUgTEFOR19CQVNRVUUgMHgyZAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19CRUxBUlVTSUFOCisjIGRlZmluZSBMQU5HX0JFTEFSVVNJQU4gMHgyMworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19CRU5HQUxJCisjIGRlZmluZSBMQU5HX0JFTkdBTEkgMHg0NQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19CVVJNRVNFCisjIGRlZmluZSBMQU5HX0JVUk1FU0UgMHg1NQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19DQU1CT0RJQU4KKyMgZGVmaW5lIExBTkdfQ0FNQk9ESUFOIDB4NTMKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQ0FUQUxBTgorIyBkZWZpbmUgTEFOR19DQVRBTEFOIDB4MDMKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfQ0hFUk9LRUUKKyMgZGVmaW5lIExBTkdfQ0hFUk9LRUUgMHg1YworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19ESVZFSEkKKyMgZGVmaW5lIExBTkdfRElWRUhJIDB4NjUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfRURPCisjIGRlZmluZSBMQU5HX0VETyAweDY2CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0VTVE9OSUFOCisjIGRlZmluZSBMQU5HX0VTVE9OSUFOIDB4MjUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfRkFFUk9FU0UKKyMgZGVmaW5lIExBTkdfRkFFUk9FU0UgMHgzOAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19GQVJTSQorIyBkZWZpbmUgTEFOR19GQVJTSSAweDI5CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0ZSSVNJQU4KKyMgZGVmaW5lIExBTkdfRlJJU0lBTiAweDYyCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0ZVTEZVTERFCisjIGRlZmluZSBMQU5HX0ZVTEZVTERFIDB4NjcKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfR0FFTElDCisjIGRlZmluZSBMQU5HX0dBRUxJQyAweDNjCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0dBTElDSUFOCisjIGRlZmluZSBMQU5HX0dBTElDSUFOIDB4NTYKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfR0VPUkdJQU4KKyMgZGVmaW5lIExBTkdfR0VPUkdJQU4gMHgzNworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19HVUFSQU5JCisjIGRlZmluZSBMQU5HX0dVQVJBTkkgMHg3NAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19HVUpBUkFUSQorIyBkZWZpbmUgTEFOR19HVUpBUkFUSSAweDQ3CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0hBVVNBCisjIGRlZmluZSBMQU5HX0hBVVNBIDB4NjgKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfSEFXQUlJQU4KKyMgZGVmaW5lIExBTkdfSEFXQUlJQU4gMHg3NQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19IRUJSRVcKKyMgZGVmaW5lIExBTkdfSEVCUkVXIDB4MGQKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfSElOREkKKyMgZGVmaW5lIExBTkdfSElOREkgMHgzOQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19JQklCSU8KKyMgZGVmaW5lIExBTkdfSUJJQklPIDB4NjkKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfSUdCTworIyBkZWZpbmUgTEFOR19JR0JPIDB4NzAKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfSU5ET05FU0lBTgorIyBkZWZpbmUgTEFOR19JTkRPTkVTSUFOIDB4MjEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfSU5VS1RJVFVUCisjIGRlZmluZSBMQU5HX0lOVUtUSVRVVCAweDVkCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0tBTk5BREEKKyMgZGVmaW5lIExBTkdfS0FOTkFEQSAweDRiCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0tBTlVSSQorIyBkZWZpbmUgTEFOR19LQU5VUkkgMHg3MQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19LQVNITUlSSQorIyBkZWZpbmUgTEFOR19LQVNITUlSSSAweDYwCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0tBWkFLCisjIGRlZmluZSBMQU5HX0tBWkFLIDB4M2YKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfS09OS0FOSQorIyBkZWZpbmUgTEFOR19LT05LQU5JIDB4NTcKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfS1lSR1laCisjIGRlZmluZSBMQU5HX0tZUkdZWiAweDQwCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0xBTworIyBkZWZpbmUgTEFOR19MQU8gMHg1NAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19MQVRJTgorIyBkZWZpbmUgTEFOR19MQVRJTiAweDc2CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0xBVFZJQU4KKyMgZGVmaW5lIExBTkdfTEFUVklBTiAweDI2CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX0xJVEhVQU5JQU4KKyMgZGVmaW5lIExBTkdfTElUSFVBTklBTiAweDI3CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX01BQ0VET05JQU4KKyMgZGVmaW5lIExBTkdfTUFDRURPTklBTiAweDJmCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX01BTEFZCisjIGRlZmluZSBMQU5HX01BTEFZIDB4M2UKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfTUFMQVlBTEFNCisjIGRlZmluZSBMQU5HX01BTEFZQUxBTSAweDRjCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX01BTFRFU0UKKyMgZGVmaW5lIExBTkdfTUFMVEVTRSAweDNhCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX01BTklQVVJJCisjIGRlZmluZSBMQU5HX01BTklQVVJJIDB4NTgKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfTUFSQVRISQorIyBkZWZpbmUgTEFOR19NQVJBVEhJIDB4NGUKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfTU9OR09MSUFOCisjIGRlZmluZSBMQU5HX01PTkdPTElBTiAweDUwCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX05FUEFMSQorIyBkZWZpbmUgTEFOR19ORVBBTEkgMHg2MQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19PUklZQQorIyBkZWZpbmUgTEFOR19PUklZQSAweDQ4CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX09ST01PCisjIGRlZmluZSBMQU5HX09ST01PIDB4NzIKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfUEFQSUFNRU5UVQorIyBkZWZpbmUgTEFOR19QQVBJQU1FTlRVIDB4NzkKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfUEFTSFRPCisjIGRlZmluZSBMQU5HX1BBU0hUTyAweDYzCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1BVTkpBQkkKKyMgZGVmaW5lIExBTkdfUFVOSkFCSSAweDQ2CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1JIQUVUT19ST01BTkNFCisjIGRlZmluZSBMQU5HX1JIQUVUT19ST01BTkNFIDB4MTcKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfU0FBTUkKKyMgZGVmaW5lIExBTkdfU0FBTUkgMHgzYgorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TQU5TS1JJVAorIyBkZWZpbmUgTEFOR19TQU5TS1JJVCAweDRmCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1NFUkJJQU4KKyMgZGVmaW5lIExBTkdfU0VSQklBTiAweDFhCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1NJTkRISQorIyBkZWZpbmUgTEFOR19TSU5ESEkgMHg1OQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TSU5IQUxFU0UKKyMgZGVmaW5lIExBTkdfU0lOSEFMRVNFIDB4NWIKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfU0xPVkFLCisjIGRlZmluZSBMQU5HX1NMT1ZBSyAweDFiCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1NPTUFMSQorIyBkZWZpbmUgTEFOR19TT01BTEkgMHg3NworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TT1JCSUFOCisjIGRlZmluZSBMQU5HX1NPUkJJQU4gMHgyZQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TVVRVCisjIGRlZmluZSBMQU5HX1NVVFUgMHgzMAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TV0FISUxJCisjIGRlZmluZSBMQU5HX1NXQUhJTEkgMHg0MQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19TWVJJQUMKKyMgZGVmaW5lIExBTkdfU1lSSUFDIDB4NWEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVEFHQUxPRworIyBkZWZpbmUgTEFOR19UQUdBTE9HIDB4NjQKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVEFKSUsKKyMgZGVmaW5lIExBTkdfVEFKSUsgMHgyOAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19UQU1BWklHSFQKKyMgZGVmaW5lIExBTkdfVEFNQVpJR0hUIDB4NWYKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVEFNSUwKKyMgZGVmaW5lIExBTkdfVEFNSUwgMHg0OQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19UQVRBUgorIyBkZWZpbmUgTEFOR19UQVRBUiAweDQ0CisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1RFTFVHVQorIyBkZWZpbmUgTEFOR19URUxVR1UgMHg0YQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19USEFJCisjIGRlZmluZSBMQU5HX1RIQUkgMHgxZQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19USUJFVEFOCisjIGRlZmluZSBMQU5HX1RJQkVUQU4gMHg1MQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19USUdSSU5ZQQorIyBkZWZpbmUgTEFOR19USUdSSU5ZQSAweDczCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1RTT05HQQorIyBkZWZpbmUgTEFOR19UU09OR0EgMHgzMQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19UU1dBTkEKKyMgZGVmaW5lIExBTkdfVFNXQU5BIDB4MzIKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVFVSS01FTgorIyBkZWZpbmUgTEFOR19UVVJLTUVOIDB4NDIKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVUtSQUlOSUFOCisjIGRlZmluZSBMQU5HX1VLUkFJTklBTiAweDIyCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1VSRFUKKyMgZGVmaW5lIExBTkdfVVJEVSAweDIwCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1VaQkVLCisjIGRlZmluZSBMQU5HX1VaQkVLIDB4NDMKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfVkVOREEKKyMgZGVmaW5lIExBTkdfVkVOREEgMHgzMworIyBlbmRpZgorIyBpZm5kZWYgTEFOR19WSUVUTkFNRVNFCisjIGRlZmluZSBMQU5HX1ZJRVROQU1FU0UgMHgyYQorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19XRUxTSAorIyBkZWZpbmUgTEFOR19XRUxTSCAweDUyCisjIGVuZGlmCisjIGlmbmRlZiBMQU5HX1hIT1NBCisjIGRlZmluZSBMQU5HX1hIT1NBIDB4MzQKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfWUkKKyMgZGVmaW5lIExBTkdfWUkgMHg3OAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19ZSURESVNICisjIGRlZmluZSBMQU5HX1lJRERJU0ggMHgzZAorIyBlbmRpZgorIyBpZm5kZWYgTEFOR19ZT1JVQkEKKyMgZGVmaW5lIExBTkdfWU9SVUJBIDB4NmEKKyMgZW5kaWYKKyMgaWZuZGVmIExBTkdfWlVMVQorIyBkZWZpbmUgTEFOR19aVUxVIDB4MzUKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1NBVURJX0FSQUJJQQorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfU0FVRElfQVJBQklBIDB4MDEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0lSQVEKKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0lSQVEgMHgwMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfRUdZUFQKKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0VHWVBUIDB4MDMKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX0xJQllBCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19MSUJZQSAweDA0CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19BTEdFUklBCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19BTEdFUklBIDB4MDUKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX01PUk9DQ08KKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX01PUk9DQ08gMHgwNgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfVFVOSVNJQQorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfVFVOSVNJQSAweDA3CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19PTUFOCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19PTUFOIDB4MDgKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1lFTUVOCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19ZRU1FTiAweDA5CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19TWVJJQQorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfU1lSSUEgMHgwYQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfSk9SREFOCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19KT1JEQU4gMHgwYgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19BUkFCSUNfTEVCQU5PTgorIyBkZWZpbmUgU1VCTEFOR19BUkFCSUNfTEVCQU5PTiAweDBjCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19LVVdBSVQKKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX0tVV0FJVCAweDBkCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19VQUUKKyMgZGVmaW5lIFNVQkxBTkdfQVJBQklDX1VBRSAweDBlCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FSQUJJQ19CQUhSQUlOCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19CQUhSQUlOIDB4MGYKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVJBQklDX1FBVEFSCisjIGRlZmluZSBTVUJMQU5HX0FSQUJJQ19RQVRBUiAweDEwCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0FaRVJJX0xBVElOCisjIGRlZmluZSBTVUJMQU5HX0FaRVJJX0xBVElOIDB4MDEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQVpFUklfQ1lSSUxMSUMKKyMgZGVmaW5lIFNVQkxBTkdfQVpFUklfQ1lSSUxMSUMgMHgwMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19CRU5HQUxJX0lORElBCisjIGRlZmluZSBTVUJMQU5HX0JFTkdBTElfSU5ESUEgMHgwMAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19CRU5HQUxJX0JBTkdMQURFU0gKKyMgZGVmaW5lIFNVQkxBTkdfQkVOR0FMSV9CQU5HTEFERVNIIDB4MDEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfQ0hJTkVTRV9NQUNBVQorIyBkZWZpbmUgU1VCTEFOR19DSElORVNFX01BQ0FVIDB4MDUKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9TT1VUSF9BRlJJQ0EKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9TT1VUSF9BRlJJQ0EgMHgwNworIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX0pBTUFJQ0EKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9KQU1BSUNBIDB4MDgKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9DQVJJQkJFQU4KKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9DQVJJQkJFQU4gMHgwOQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19FTkdMSVNIX0JFTElaRQorIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0JFTElaRSAweDBhCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfVFJJTklEQUQKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9UUklOSURBRCAweDBiCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfWklNQkFCV0UKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9aSU1CQUJXRSAweDBjCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfUEhJTElQUElORVMKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9QSElMSVBQSU5FUyAweDBkCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0VOR0xJU0hfSU5ET05FU0lBCisjIGRlZmluZSBTVUJMQU5HX0VOR0xJU0hfSU5ET05FU0lBIDB4MGUKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9IT05HS09ORworIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0hPTkdLT05HIDB4MGYKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9JTkRJQQorIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0lORElBIDB4MTAKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9NQUxBWVNJQQorIyBkZWZpbmUgU1VCTEFOR19FTkdMSVNIX01BTEFZU0lBIDB4MTEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRU5HTElTSF9TSU5HQVBPUkUKKyMgZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9TSU5HQVBPUkUgMHgxMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfTFVYRU1CT1VSRworIyBkZWZpbmUgU1VCTEFOR19GUkVOQ0hfTFVYRU1CT1VSRyAweDA1CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9NT05BQ08KKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX01PTkFDTyAweDA2CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9XRVNUSU5ESUVTCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9XRVNUSU5ESUVTIDB4MDcKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX1JFVU5JT04KKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX1JFVU5JT04gMHgwOAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfQ09OR08KKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0NPTkdPIDB4MDkKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX1NFTkVHQUwKKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX1NFTkVHQUwgMHgwYQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfQ0FNRVJPT04KKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0NBTUVST09OIDB4MGIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX0NPVEVESVZPSVJFCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9DT1RFRElWT0lSRSAweDBjCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0ZSRU5DSF9NQUxJCisjIGRlZmluZSBTVUJMQU5HX0ZSRU5DSF9NQUxJIDB4MGQKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfRlJFTkNIX01PUk9DQ08KKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX01PUk9DQ08gMHgwZQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19GUkVOQ0hfSEFJVEkKKyMgZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0hBSVRJIDB4MGYKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkcKKyMgZGVmaW5lIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkcgMHgwNAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTgorIyBkZWZpbmUgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTiAweDA1CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX0tBU0hNSVJJX0lORElBCisjIGRlZmluZSBTVUJMQU5HX0tBU0hNSVJJX0lORElBIDB4MDIKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfTUFMQVlfTUFMQVlTSUEKKyMgZGVmaW5lIFNVQkxBTkdfTUFMQVlfTUFMQVlTSUEgMHgwMQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19NQUxBWV9CUlVORUlfREFSVVNTQUxBTQorIyBkZWZpbmUgU1VCTEFOR19NQUxBWV9CUlVORUlfREFSVVNTQUxBTSAweDAyCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX05FUEFMSV9JTkRJQQorIyBkZWZpbmUgU1VCTEFOR19ORVBBTElfSU5ESUEgMHgwMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19QVU5KQUJJX0lORElBCisjIGRlZmluZSBTVUJMQU5HX1BVTkpBQklfSU5ESUEgMHgwMAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19QVU5KQUJJX1BBS0lTVEFOCisjIGRlZmluZSBTVUJMQU5HX1BVTkpBQklfUEFLSVNUQU4gMHgwMQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19ST01BTklBTl9ST01BTklBCisjIGRlZmluZSBTVUJMQU5HX1JPTUFOSUFOX1JPTUFOSUEgMHgwMAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19ST01BTklBTl9NT0xET1ZBCisjIGRlZmluZSBTVUJMQU5HX1JPTUFOSUFOX01PTERPVkEgMHgwMQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TRVJCSUFOX0xBVElOCisjIGRlZmluZSBTVUJMQU5HX1NFUkJJQU5fTEFUSU4gMHgwMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TRVJCSUFOX0NZUklMTElDCisjIGRlZmluZSBTVUJMQU5HX1NFUkJJQU5fQ1lSSUxMSUMgMHgwMworIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TSU5ESElfSU5ESUEKKyMgZGVmaW5lIFNVQkxBTkdfU0lOREhJX0lORElBIDB4MDAKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU0lOREhJX1BBS0lTVEFOCisjIGRlZmluZSBTVUJMQU5HX1NJTkRISV9QQUtJU1RBTiAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfR1VBVEVNQUxBCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfR1VBVEVNQUxBIDB4MDQKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9DT1NUQV9SSUNBCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQ09TVEFfUklDQSAweDA1CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfUEFOQU1BCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfUEFOQU1BIDB4MDYKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9ET01JTklDQU5fUkVQVUJMSUMKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9ET01JTklDQU5fUkVQVUJMSUMgMHgwNworIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1ZFTkVaVUVMQQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1ZFTkVaVUVMQSAweDA4CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfQ09MT01CSUEKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9DT0xPTUJJQSAweDA5CisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfUEVSVQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BFUlUgMHgwYQorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0FSR0VOVElOQQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0FSR0VOVElOQSAweDBiCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfRUNVQURPUgorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0VDVUFET1IgMHgwYworIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX0NISUxFCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQ0hJTEUgMHgwZAorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19TUEFOSVNIX1VSVUdVQVkKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZIDB4MGUKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9QQVJBR1VBWQorIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BBUkFHVUFZIDB4MGYKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9CT0xJVklBCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfQk9MSVZJQSAweDEwCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfRUxfU0FMVkFET1IKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9FTF9TQUxWQURPUiAweDExCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfSE9ORFVSQVMKKyMgZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9IT05EVVJBUyAweDEyCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1NQQU5JU0hfTklDQVJBR1VBCisjIGRlZmluZSBTVUJMQU5HX1NQQU5JU0hfTklDQVJBR1VBIDB4MTMKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1BBTklTSF9QVUVSVE9fUklDTworIyBkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BVRVJUT19SSUNPIDB4MTQKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfU1dFRElTSF9GSU5MQU5ECisjIGRlZmluZSBTVUJMQU5HX1NXRURJU0hfRklOTEFORCAweDAyCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1RBTUFaSUdIVF9BUkFCSUMKKyMgZGVmaW5lIFNVQkxBTkdfVEFNQVpJR0hUX0FSQUJJQyAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1RBTUFaSUdIVF9MQVRJTgorIyBkZWZpbmUgU1VCTEFOR19UQU1BWklHSFRfTEFUSU4gMHgwMgorIyBlbmRpZgorIyBpZm5kZWYgU1VCTEFOR19USUdSSU5ZQV9FVEhJT1BJQQorIyBkZWZpbmUgU1VCTEFOR19USUdSSU5ZQV9FVEhJT1BJQSAweDAwCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1RJR1JJTllBX0VSSVRSRUEKKyMgZGVmaW5lIFNVQkxBTkdfVElHUklOWUFfRVJJVFJFQSAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1VSRFVfUEFLSVNUQU4KKyMgZGVmaW5lIFNVQkxBTkdfVVJEVV9QQUtJU1RBTiAweDAxCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1VSRFVfSU5ESUEKKyMgZGVmaW5lIFNVQkxBTkdfVVJEVV9JTkRJQSAweDAyCisjIGVuZGlmCisjIGlmbmRlZiBTVUJMQU5HX1VaQkVLX0xBVElOCisjIGRlZmluZSBTVUJMQU5HX1VaQkVLX0xBVElOIDB4MDEKKyMgZW5kaWYKKyMgaWZuZGVmIFNVQkxBTkdfVVpCRUtfQ1lSSUxMSUMKKyMgZGVmaW5lIFNVQkxBTkdfVVpCRUtfQ1lSSUxMSUMgMHgwMgorIyBlbmRpZgorI2VuZGlmCisKKy8qIFhQRzMgZGVmaW5lcyB0aGUgcmVzdWx0IG9mICdzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKScgYXM6CisgICAiRGlyZWN0cyAnc2V0bG9jYWxlKCknIHRvIHF1ZXJ5ICdjYXRlZ29yeScgYW5kIHJldHVybiB0aGUgY3VycmVudAorICAgIHNldHRpbmcgb2YgJ2xvY2FsJy4iCisgICBIb3dldmVyIGl0IGRvZXMgbm90IHNwZWNpZnkgdGhlIGV4YWN0IGZvcm1hdC4gIE5laXRoZXIgZG8gU1VTVjIgYW5kCisgICBJU08gQyA5OS4gIFNvIHdlIGNhbiB1c2UgdGhpcyBmZWF0dXJlIG9ubHkgb24gc2VsZWN0ZWQgc3lzdGVtcyAoZS5nLgorICAgdGhvc2UgdXNpbmcgR05VIEMgTGlicmFyeSkuICAqLworI2lmIGRlZmluZWQgX0xJQkMgfHwgKGRlZmluZWQgX19HTlVfTElCUkFSWV9fICYmIF9fR05VX0xJQlJBUllfXyA+PSAyKQorIyBkZWZpbmUgSEFWRV9MT0NBTEVfTlVMTAorI2VuZGlmCisKKy8qIERldGVybWluZSB0aGUgY3VycmVudCBsb2NhbGUncyBuYW1lLCBhbmQgY2Fub25pY2FsaXplIGl0IGludG8gWFBHIHN5bnRheAorICAgICBsYW5ndWFnZVtfdGVycml0b3J5Wy5jb2Rlc2V0XV1bQG1vZGlmaWVyXQorICAgVGhlIGNvZGVzZXQgcGFydCBpbiB0aGUgcmVzdWx0IGlzIG5vdCByZWxpYWJsZTsgdGhlIGxvY2FsZV9jaGFyc2V0KCkKKyAgIHNob3VsZCBiZSB1c2VkIGZvciBjb2Rlc2V0IGluZm9ybWF0aW9uIGluc3RlYWQuCisgICBUaGUgcmVzdWx0IG11c3Qgbm90IGJlIGZyZWVkOyBpdCBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZC4gICovCisKK2NvbnN0IGNoYXIgKgorX25sX2xvY2FsZV9uYW1lIChpbnQgY2F0ZWdvcnksIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSkKK3sKKyAgY29uc3QgY2hhciAqcmV0dmFsOworCisjaWZuZGVmIFdJTjMyCisKKyAgLyogVXNlIHRoZSBQT1NJWCBtZXRob2RzIG9mIGxvb2tpbmcgdG8gJ0xDX0FMTCcsICdMQ194eHgnLCBhbmQgJ0xBTkcnLgorICAgICBPbiBzb21lIHN5c3RlbXMgdGhpcyBjYW4gYmUgZG9uZSBieSB0aGUgJ3NldGxvY2FsZScgZnVuY3Rpb24gaXRzZWxmLiAgKi8KKyMgaWYgZGVmaW5lZCBIQVZFX1NFVExPQ0FMRSAmJiBkZWZpbmVkIEhBVkVfTENfTUVTU0FHRVMgJiYgZGVmaW5lZCBIQVZFX0xPQ0FMRV9OVUxMCisgIHJldHZhbCA9IHNldGxvY2FsZSAoY2F0ZWdvcnksIE5VTEwpOworIyBlbHNlCisgIC8qIFNldHRpbmcgb2YgTENfQUxMIG92ZXJ3cml0ZXMgYWxsIG90aGVyLiAgKi8KKyAgcmV0dmFsID0gZ2V0ZW52ICgiTENfQUxMIik7CisgIGlmIChyZXR2YWwgPT0gTlVMTCB8fCByZXR2YWxbMF0gPT0gJ1wwJykKKyAgICB7CisgICAgICAvKiBOZXh0IGNvbWVzIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGNhdGVnb3J5LiAgKi8KKyAgICAgIHJldHZhbCA9IGdldGVudiAoY2F0ZWdvcnluYW1lKTsKKyAgICAgIGlmIChyZXR2YWwgPT0gTlVMTCB8fCByZXR2YWxbMF0gPT0gJ1wwJykKKwl7CisJICAvKiBMYXN0IHBvc3NpYmlsaXR5IGlzIHRoZSBMQU5HIGVudmlyb25tZW50IHZhcmlhYmxlLiAgKi8KKwkgIHJldHZhbCA9IGdldGVudiAoIkxBTkciKTsKKwkgIGlmIChyZXR2YWwgPT0gTlVMTCB8fCByZXR2YWxbMF0gPT0gJ1wwJykKKwkgICAgLyogV2UgdXNlIEMgYXMgdGhlIGRlZmF1bHQgZG9tYWluLiAgUE9TSVggc2F5cyB0aGlzIGlzCisJICAgICAgIGltcGxlbWVudGF0aW9uIGRlZmluZWQuICAqLworCSAgICByZXR2YWwgPSAiQyI7CisJfQorICAgIH0KKyMgZW5kaWYKKworICByZXR1cm4gcmV0dmFsOworCisjZWxzZSAvKiBXSU4zMiAqLworCisgIC8qIFJldHVybiBhbiBYUEcgc3R5bGUgbG9jYWxlIG5hbWUgbGFuZ3VhZ2VbX3RlcnJpdG9yeV1bQG1vZGlmaWVyXS4KKyAgICAgRG9uJ3QgZXZlbiBib3RoZXIgZGV0ZXJtaW5pbmcgdGhlIGNvZGVzZXQ7IGl0J3Mgbm90IHVzZWZ1bCBpbiB0aGlzCisgICAgIGNvbnRleHQsIGJlY2F1c2UgbWVzc2FnZSBjYXRhbG9ncyBhcmUgbm90IHNwZWNpZmljIHRvIGEgc2luZ2xlCisgICAgIGNvZGVzZXQuICAqLworCisgIExDSUQgbGNpZDsKKyAgTEFOR0lEIGxhbmdpZDsKKyAgaW50IHByaW1hcnksIHN1YjsKKworICAvKiBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHN5c3RlbSBzZXR0aW5ncyB0aHJvdWdoIGVudmlyb25tZW50CisgICAgIHZhcmlhYmxlcywgYXMgb24gUE9TSVggc3lzdGVtcy4gICovCisgIHJldHZhbCA9IGdldGVudiAoIkxDX0FMTCIpOworICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCisgICAgcmV0dXJuIHJldHZhbDsKKyAgcmV0dmFsID0gZ2V0ZW52IChjYXRlZ29yeW5hbWUpOworICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCisgICAgcmV0dXJuIHJldHZhbDsKKyAgcmV0dmFsID0gZ2V0ZW52ICgiTEFORyIpOworICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCisgICAgcmV0dXJuIHJldHZhbDsKKworICAvKiBVc2UgbmF0aXZlIFdpbjMyIEFQSSBsb2NhbGUgSUQuICAqLworICBsY2lkID0gR2V0VGhyZWFkTG9jYWxlICgpOworCisgIC8qIFN0cmlwIG9mZiB0aGUgc29ydGluZyBydWxlcywga2VlcCBvbmx5IHRoZSBsYW5ndWFnZSBwYXJ0LiAgKi8KKyAgbGFuZ2lkID0gTEFOR0lERlJPTUxDSUQgKGxjaWQpOworCisgIC8qIFNwbGl0IGludG8gbGFuZ3VhZ2UgYW5kIHRlcnJpdG9yeSBwYXJ0LiAgKi8KKyAgcHJpbWFyeSA9IFBSSU1BUllMQU5HSUQgKGxhbmdpZCk7CisgIHN1YiA9IFNVQkxBTkdJRCAobGFuZ2lkKTsKKworICAvKiBEaXNwYXRjaCBvbiBsYW5ndWFnZS4KKyAgICAgU2VlIGFsc28gaHR0cDovL3d3dy51bmljb2RlLm9yZy91bmljb2RlL29ubGluZWRhdC9sYW5ndWFnZXMuaHRtbCAuCisgICAgIEZvciBkZXRhaWxzIGFib3V0IGxhbmd1YWdlcywgc2VlIGh0dHA6Ly93d3cuZXRobm9sb2d1ZS5jb20vIC4gICovCisgIHN3aXRjaCAocHJpbWFyeSkKKyAgICB7CisgICAgY2FzZSBMQU5HX0FGUklLQUFOUzogcmV0dXJuICJhZl9aQSI7CisgICAgY2FzZSBMQU5HX0FMQkFOSUFOOiByZXR1cm4gInNxX0FMIjsKKyAgICBjYXNlIExBTkdfQU1IQVJJQzogcmV0dXJuICJhbV9FVCI7CisgICAgY2FzZSBMQU5HX0FSQUJJQzoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfQVJBQklDX1NBVURJX0FSQUJJQTogcmV0dXJuICJhcl9TQSI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19JUkFROiByZXR1cm4gImFyX0lRIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX0VHWVBUOiByZXR1cm4gImFyX0VHIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX0xJQllBOiByZXR1cm4gImFyX0xZIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX0FMR0VSSUE6IHJldHVybiAiYXJfRFoiOworCWNhc2UgU1VCTEFOR19BUkFCSUNfTU9ST0NDTzogcmV0dXJuICJhcl9NQSI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19UVU5JU0lBOiByZXR1cm4gImFyX1ROIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX09NQU46IHJldHVybiAiYXJfT00iOworCWNhc2UgU1VCTEFOR19BUkFCSUNfWUVNRU46IHJldHVybiAiYXJfWUUiOworCWNhc2UgU1VCTEFOR19BUkFCSUNfU1lSSUE6IHJldHVybiAiYXJfU1kiOworCWNhc2UgU1VCTEFOR19BUkFCSUNfSk9SREFOOiByZXR1cm4gImFyX0pPIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX0xFQkFOT046IHJldHVybiAiYXJfTEIiOworCWNhc2UgU1VCTEFOR19BUkFCSUNfS1VXQUlUOiByZXR1cm4gImFyX0tXIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX1VBRTogcmV0dXJuICJhcl9BRSI7CisJY2FzZSBTVUJMQU5HX0FSQUJJQ19CQUhSQUlOOiByZXR1cm4gImFyX0JIIjsKKwljYXNlIFNVQkxBTkdfQVJBQklDX1FBVEFSOiByZXR1cm4gImFyX1FBIjsKKwl9CisgICAgICByZXR1cm4gImFyIjsKKyAgICBjYXNlIExBTkdfQVJNRU5JQU46IHJldHVybiAiaHlfQU0iOworICAgIGNhc2UgTEFOR19BU1NBTUVTRTogcmV0dXJuICJhc19JTiI7CisgICAgY2FzZSBMQU5HX0FaRVJJOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCS8qIEZJWE1FOiBBZGp1c3QgdGhpcyB3aGVuIEF6ZXJiYWlqYW5pIGxvY2FsZXMgYXBwZWFyIG9uIFVuaXguICAqLworCWNhc2UgU1VCTEFOR19BWkVSSV9MQVRJTjogcmV0dXJuICJhel9BWkBsYXRpbiI7CisJY2FzZSBTVUJMQU5HX0FaRVJJX0NZUklMTElDOiByZXR1cm4gImF6X0FaQGN5cmlsbGljIjsKKwl9CisgICAgICByZXR1cm4gImF6IjsKKyAgICBjYXNlIExBTkdfQkFTUVVFOgorICAgICAgcmV0dXJuICJldSI7IC8qIEFtYmlndW91czogY291bGQgYmUgImV1X0VTIiBvciAiZXVfRlIiLiAgKi8KKyAgICBjYXNlIExBTkdfQkVMQVJVU0lBTjogcmV0dXJuICJiZV9CWSI7CisgICAgY2FzZSBMQU5HX0JFTkdBTEk6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0JFTkdBTElfSU5ESUE6IHJldHVybiAiYm5fSU4iOworCWNhc2UgU1VCTEFOR19CRU5HQUxJX0JBTkdMQURFU0g6IHJldHVybiAiYm5fQkQiOworCX0KKyAgICAgIHJldHVybiAiYm4iOworICAgIGNhc2UgTEFOR19CVUxHQVJJQU46IHJldHVybiAiYmdfQkciOworICAgIGNhc2UgTEFOR19CVVJNRVNFOiByZXR1cm4gIm15X01NIjsKKyAgICBjYXNlIExBTkdfQ0FNQk9ESUFOOiByZXR1cm4gImttX0tIIjsKKyAgICBjYXNlIExBTkdfQ0FUQUxBTjogcmV0dXJuICJjYV9FUyI7CisgICAgY2FzZSBMQU5HX0NIRVJPS0VFOiByZXR1cm4gImNocl9VUyI7CisgICAgY2FzZSBMQU5HX0NISU5FU0U6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0NISU5FU0VfVFJBRElUSU9OQUw6IHJldHVybiAiemhfVFciOworCWNhc2UgU1VCTEFOR19DSElORVNFX1NJTVBMSUZJRUQ6IHJldHVybiAiemhfQ04iOworCWNhc2UgU1VCTEFOR19DSElORVNFX0hPTkdLT05HOiByZXR1cm4gInpoX0hLIjsKKwljYXNlIFNVQkxBTkdfQ0hJTkVTRV9TSU5HQVBPUkU6IHJldHVybiAiemhfU0ciOworCWNhc2UgU1VCTEFOR19DSElORVNFX01BQ0FVOiByZXR1cm4gInpoX01PIjsKKwl9CisgICAgICByZXR1cm4gInpoIjsKKyAgICBjYXNlIExBTkdfQ1JPQVRJQU46CQkvKiBMQU5HX0NST0FUSUFOID09IExBTkdfU0VSQklBTgorCQkJCSAqIFdoYXQgdXNlZCB0byBiZSBjYWxsZWQgU2VyYm8tQ3JvYXRpYW4KKwkJCQkgKiBzaG91bGQgcmVhbGx5IG5vdyBiZSB0d28gc2VwYXJhdGUKKwkJCQkgKiBsYW5ndWFnZXMgYmVjYXVzZSBvZiBwb2xpdGljYWwgcmVhc29ucy4KKwkJCQkgKiAoU2F5cyB0bWwsIHdobyBrbm93cyBub3RoaW5nIGFib3V0IFNlcmJpYW4KKwkJCQkgKiBvciBDcm9hdGlhbi4pCisJCQkJICogKEkgY2FuIGZlZWwgdGhvc2UgZmxhbWVzIGNvbWluZyBhbHJlYWR5LikKKwkJCQkgKi8KKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJocl9IUiI7CisJY2FzZSBTVUJMQU5HX1NFUkJJQU5fTEFUSU46IHJldHVybiAic3JfQ1MiOworCWNhc2UgU1VCTEFOR19TRVJCSUFOX0NZUklMTElDOiByZXR1cm4gInNyX0NTQGN5cmlsbGljIjsKKwl9CisgICAgICByZXR1cm4gImhyIjsKKyAgICBjYXNlIExBTkdfQ1pFQ0g6IHJldHVybiAiY3NfQ1oiOworICAgIGNhc2UgTEFOR19EQU5JU0g6IHJldHVybiAiZGFfREsiOworICAgIGNhc2UgTEFOR19ESVZFSEk6IHJldHVybiAiZHZfTVYiOworICAgIGNhc2UgTEFOR19EVVRDSDoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfRFVUQ0g6IHJldHVybiAibmxfTkwiOworCWNhc2UgU1VCTEFOR19EVVRDSF9CRUxHSUFOOiAvKiBGTEVNSVNILCBWTEFBTVMgKi8gcmV0dXJuICJubF9CRSI7CisJfQorICAgICAgcmV0dXJuICJubCI7CisgICAgY2FzZSBMQU5HX0VETzogcmV0dXJuICJiaW5fTkciOworICAgIGNhc2UgTEFOR19FTkdMSVNIOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCS8qIFNVQkxBTkdfRU5HTElTSF9VUyA9PSBTVUJMQU5HX0RFRkFVTFQuIEhlaC4gSSB0aG91Z2h0CisJICogRW5nbGlzaCB3YXMgdGhlIGxhbmd1YWdlIHNwb2tlbiBpbiBFbmdsYW5kLgorCSAqIE9oIHdlbGwuCisJICovCisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfVVM6IHJldHVybiAiZW5fVVMiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX1VLOiByZXR1cm4gImVuX0dCIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9BVVM6IHJldHVybiAiZW5fQVUiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX0NBTjogcmV0dXJuICJlbl9DQSI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfTlo6IHJldHVybiAiZW5fTloiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX0VJUkU6IHJldHVybiAiZW5fSUUiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX1NPVVRIX0FGUklDQTogcmV0dXJuICJlbl9aQSI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfSkFNQUlDQTogcmV0dXJuICJlbl9KTSI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfQ0FSSUJCRUFOOiByZXR1cm4gImVuX0dEIjsgLyogR3JlbmFkYT8gKi8KKwljYXNlIFNVQkxBTkdfRU5HTElTSF9CRUxJWkU6IHJldHVybiAiZW5fQloiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX1RSSU5JREFEOiByZXR1cm4gImVuX1RUIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9aSU1CQUJXRTogcmV0dXJuICJlbl9aVyI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfUEhJTElQUElORVM6IHJldHVybiAiZW5fUEgiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX0lORE9ORVNJQTogcmV0dXJuICJlbl9JRCI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfSE9OR0tPTkc6IHJldHVybiAiZW5fSEsiOworCWNhc2UgU1VCTEFOR19FTkdMSVNIX0lORElBOiByZXR1cm4gImVuX0lOIjsKKwljYXNlIFNVQkxBTkdfRU5HTElTSF9NQUxBWVNJQTogcmV0dXJuICJlbl9NWSI7CisJY2FzZSBTVUJMQU5HX0VOR0xJU0hfU0lOR0FQT1JFOiByZXR1cm4gImVuX1NHIjsKKwl9CisgICAgICByZXR1cm4gImVuIjsKKyAgICBjYXNlIExBTkdfRVNUT05JQU46IHJldHVybiAiZXRfRUUiOworICAgIGNhc2UgTEFOR19GQUVST0VTRTogcmV0dXJuICJmb19GTyI7CisgICAgY2FzZSBMQU5HX0ZBUlNJOiByZXR1cm4gImZhX0lSIjsKKyAgICBjYXNlIExBTkdfRklOTklTSDogcmV0dXJuICJmaV9GSSI7CisgICAgY2FzZSBMQU5HX0ZSRU5DSDoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfRlJFTkNIOiByZXR1cm4gImZyX0ZSIjsKKwljYXNlIFNVQkxBTkdfRlJFTkNIX0JFTEdJQU46IC8qIFdBTExPT04gKi8gcmV0dXJuICJmcl9CRSI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9DQU5BRElBTjogcmV0dXJuICJmcl9DQSI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9TV0lTUzogcmV0dXJuICJmcl9DSCI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9MVVhFTUJPVVJHOiByZXR1cm4gImZyX0xVIjsKKwljYXNlIFNVQkxBTkdfRlJFTkNIX01PTkFDTzogcmV0dXJuICJmcl9NQyI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9XRVNUSU5ESUVTOiByZXR1cm4gImZyIjsgLyogQ2FyaWJiZWFuPyAqLworCWNhc2UgU1VCTEFOR19GUkVOQ0hfUkVVTklPTjogcmV0dXJuICJmcl9SRSI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9DT05HTzogcmV0dXJuICJmcl9DRyI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9TRU5FR0FMOiByZXR1cm4gImZyX1NOIjsKKwljYXNlIFNVQkxBTkdfRlJFTkNIX0NBTUVST09OOiByZXR1cm4gImZyX0NNIjsKKwljYXNlIFNVQkxBTkdfRlJFTkNIX0NPVEVESVZPSVJFOiByZXR1cm4gImZyX0NJIjsKKwljYXNlIFNVQkxBTkdfRlJFTkNIX01BTEk6IHJldHVybiAiZnJfTUwiOworCWNhc2UgU1VCTEFOR19GUkVOQ0hfTU9ST0NDTzogcmV0dXJuICJmcl9NQSI7CisJY2FzZSBTVUJMQU5HX0ZSRU5DSF9IQUlUSTogcmV0dXJuICJmcl9IVCI7CisJfQorICAgICAgcmV0dXJuICJmciI7CisgICAgY2FzZSBMQU5HX0ZSSVNJQU46IHJldHVybiAiZnlfTkwiOworICAgIGNhc2UgTEFOR19GVUxGVUxERToKKyAgICAgIC8qIFNwb2tlbiBpbiBOaWdlcmlhLCBHdWluZWEsIFNlbmVnYWwsIE1hbGksIE5pZ2VyLCBDYW1lcm9vbiwgQmVuaW4uICovCisgICAgICByZXR1cm4gImZmX05HIjsKKyAgICBjYXNlIExBTkdfR0FFTElDOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgMHgwMTogLyogU0NPVFRJU0ggKi8gcmV0dXJuICJnZF9HQiI7CisJY2FzZSAweDAyOiAvKiBJUklTSCAqLyByZXR1cm4gImdhX0lFIjsKKwl9CisgICAgICByZXR1cm4gIkMiOworICAgIGNhc2UgTEFOR19HQUxJQ0lBTjogcmV0dXJuICJnbF9FUyI7CisgICAgY2FzZSBMQU5HX0dFT1JHSUFOOiByZXR1cm4gImthX0dFIjsKKyAgICBjYXNlIExBTkdfR0VSTUFOOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19HRVJNQU46IHJldHVybiAiZGVfREUiOworCWNhc2UgU1VCTEFOR19HRVJNQU5fU1dJU1M6IHJldHVybiAiZGVfQ0giOworCWNhc2UgU1VCTEFOR19HRVJNQU5fQVVTVFJJQU46IHJldHVybiAiZGVfQVQiOworCWNhc2UgU1VCTEFOR19HRVJNQU5fTFVYRU1CT1VSRzogcmV0dXJuICJkZV9MVSI7CisJY2FzZSBTVUJMQU5HX0dFUk1BTl9MSUVDSFRFTlNURUlOOiByZXR1cm4gImRlX0xJIjsKKwl9CisgICAgICByZXR1cm4gImRlIjsKKyAgICBjYXNlIExBTkdfR1JFRUs6IHJldHVybiAiZWxfR1IiOworICAgIGNhc2UgTEFOR19HVUFSQU5JOiByZXR1cm4gImduX1BZIjsKKyAgICBjYXNlIExBTkdfR1VKQVJBVEk6IHJldHVybiAiZ3VfSU4iOworICAgIGNhc2UgTEFOR19IQVVTQTogcmV0dXJuICJoYV9ORyI7CisgICAgY2FzZSBMQU5HX0hBV0FJSUFOOgorICAgICAgLyogRklYTUU6IERvIHRoZXkgbWVhbiBIYXdhaWlhbiAoImhhd19VUyIsIDEwMDAgc3BlYWtlcnMpCisJIG9yIEhhd2FpaSBDcmVvbGUgRW5nbGlzaCAoImNwZV9VUyIsIDYwMDAwMCBzcGVha2Vycyk/ICAqLworICAgICAgcmV0dXJuICJjcGVfVVMiOworICAgIGNhc2UgTEFOR19IRUJSRVc6IHJldHVybiAiaGVfSUwiOworICAgIGNhc2UgTEFOR19ISU5ESTogcmV0dXJuICJoaV9JTiI7CisgICAgY2FzZSBMQU5HX0hVTkdBUklBTjogcmV0dXJuICJodV9IVSI7CisgICAgY2FzZSBMQU5HX0lCSUJJTzogcmV0dXJuICJuaWNfTkciOworICAgIGNhc2UgTEFOR19JQ0VMQU5ESUM6IHJldHVybiAiaXNfSVMiOworICAgIGNhc2UgTEFOR19JR0JPOiByZXR1cm4gImlnX05HIjsKKyAgICBjYXNlIExBTkdfSU5ET05FU0lBTjogcmV0dXJuICJpZF9JRCI7CisgICAgY2FzZSBMQU5HX0lOVUtUSVRVVDogcmV0dXJuICJpdV9DQSI7CisgICAgY2FzZSBMQU5HX0lUQUxJQU46CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0lUQUxJQU46IHJldHVybiAiaXRfSVQiOworCWNhc2UgU1VCTEFOR19JVEFMSUFOX1NXSVNTOiByZXR1cm4gIml0X0NIIjsKKwl9CisgICAgICByZXR1cm4gIml0IjsKKyAgICBjYXNlIExBTkdfSkFQQU5FU0U6IHJldHVybiAiamFfSlAiOworICAgIGNhc2UgTEFOR19LQU5OQURBOiByZXR1cm4gImtuX0lOIjsKKyAgICBjYXNlIExBTkdfS0FOVVJJOiByZXR1cm4gImtyX05HIjsKKyAgICBjYXNlIExBTkdfS0FTSE1JUkk6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX0RFRkFVTFQ6IHJldHVybiAia3NfUEsiOworCWNhc2UgU1VCTEFOR19LQVNITUlSSV9JTkRJQTogcmV0dXJuICJrc19JTiI7CisJfQorICAgICAgcmV0dXJuICJrcyI7CisgICAgY2FzZSBMQU5HX0tBWkFLOiByZXR1cm4gImtrX0taIjsKKyAgICBjYXNlIExBTkdfS09OS0FOSToKKyAgICAgIC8qIEZJWE1FOiBBZGp1c3QgdGhpcyB3aGVuIHN1Y2ggbG9jYWxlcyBhcHBlYXIgb24gVW5peC4gICovCisgICAgICByZXR1cm4gImtva19JTiI7CisgICAgY2FzZSBMQU5HX0tPUkVBTjogcmV0dXJuICJrb19LUiI7CisgICAgY2FzZSBMQU5HX0tZUkdZWjogcmV0dXJuICJreV9LRyI7CisgICAgY2FzZSBMQU5HX0xBTzogcmV0dXJuICJsb19MQSI7CisgICAgY2FzZSBMQU5HX0xBVElOOiByZXR1cm4gImxhX1ZBIjsKKyAgICBjYXNlIExBTkdfTEFUVklBTjogcmV0dXJuICJsdl9MViI7CisgICAgY2FzZSBMQU5HX0xJVEhVQU5JQU46IHJldHVybiAibHRfTFQiOworICAgIGNhc2UgTEFOR19NQUNFRE9OSUFOOiByZXR1cm4gIm1rX01LIjsKKyAgICBjYXNlIExBTkdfTUFMQVk6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX01BTEFZX01BTEFZU0lBOiByZXR1cm4gIm1zX01ZIjsKKwljYXNlIFNVQkxBTkdfTUFMQVlfQlJVTkVJX0RBUlVTU0FMQU06IHJldHVybiAibXNfQk4iOworCX0KKyAgICAgIHJldHVybiAibXMiOworICAgIGNhc2UgTEFOR19NQUxBWUFMQU06IHJldHVybiAibWxfSU4iOworICAgIGNhc2UgTEFOR19NQUxURVNFOiByZXR1cm4gIm10X01UIjsKKyAgICBjYXNlIExBTkdfTUFOSVBVUkk6CisgICAgICAvKiBGSVhNRTogQWRqdXN0IHRoaXMgd2hlbiBzdWNoIGxvY2FsZXMgYXBwZWFyIG9uIFVuaXguICAqLworICAgICAgcmV0dXJuICJtbmlfSU4iOworICAgIGNhc2UgTEFOR19NQVJBVEhJOiByZXR1cm4gIm1yX0lOIjsKKyAgICBjYXNlIExBTkdfTU9OR09MSUFOOgorICAgICAgcmV0dXJuICJtbiI7IC8qIEFtYmlndW91czogY291bGQgYmUgIm1uX0NOIiBvciAibW5fTU4iLiAgKi8KKyAgICBjYXNlIExBTkdfTkVQQUxJOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19ERUZBVUxUOiByZXR1cm4gIm5lX05QIjsKKwljYXNlIFNVQkxBTkdfTkVQQUxJX0lORElBOiByZXR1cm4gIm5lX0lOIjsKKwl9CisgICAgICByZXR1cm4gIm5lIjsKKyAgICBjYXNlIExBTkdfTk9SV0VHSUFOOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19OT1JXRUdJQU5fQk9LTUFMOiByZXR1cm4gIm5vX05PIjsKKwljYXNlIFNVQkxBTkdfTk9SV0VHSUFOX05ZTk9SU0s6IHJldHVybiAibm5fTk8iOworCX0KKyAgICAgIHJldHVybiAibm8iOworICAgIGNhc2UgTEFOR19PUklZQTogcmV0dXJuICJvcl9JTiI7CisgICAgY2FzZSBMQU5HX09ST01POiByZXR1cm4gIm9tX0VUIjsKKyAgICBjYXNlIExBTkdfUEFQSUFNRU5UVTogcmV0dXJuICJwYXBfQU4iOworICAgIGNhc2UgTEFOR19QQVNIVE86CisgICAgICByZXR1cm4gInBzIjsgLyogQW1iaWd1b3VzOiBjb3VsZCBiZSAicHNfUEsiIG9yICJwc19BRiIuICAqLworICAgIGNhc2UgTEFOR19QT0xJU0g6IHJldHVybiAicGxfUEwiOworICAgIGNhc2UgTEFOR19QT1JUVUdVRVNFOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19QT1JUVUdVRVNFOiByZXR1cm4gInB0X1BUIjsKKwkvKiBIbW0uIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4gPT0gU1VCTEFOR19ERUZBVUxULgorCSAgIFNhbWUgcGhlbm9tZW5vbiBhcyBTVUJMQU5HX0VOR0xJU0hfVVMgPT0gU1VCTEFOR19ERUZBVUxULiAqLworCWNhc2UgU1VCTEFOR19QT1JUVUdVRVNFX0JSQVpJTElBTjogcmV0dXJuICJwdF9CUiI7CisJfQorICAgICAgcmV0dXJuICJwdCI7CisgICAgY2FzZSBMQU5HX1BVTkpBQkk6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX1BVTkpBQklfSU5ESUE6IHJldHVybiAicGFfSU4iOyAvKiBHdXJtdWtoaSBzY3JpcHQgKi8KKwljYXNlIFNVQkxBTkdfUFVOSkFCSV9QQUtJU1RBTjogcmV0dXJuICJwYV9QSyI7IC8qIEFyYWJpYyBzY3JpcHQgKi8KKwl9CisgICAgICByZXR1cm4gInBhIjsKKyAgICBjYXNlIExBTkdfUkhBRVRPX1JPTUFOQ0U6IHJldHVybiAicm1fQ0giOworICAgIGNhc2UgTEFOR19ST01BTklBTjoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfUk9NQU5JQU5fUk9NQU5JQTogcmV0dXJuICJyb19STyI7CisJY2FzZSBTVUJMQU5HX1JPTUFOSUFOX01PTERPVkE6IHJldHVybiAicm9fTUQiOworCX0KKyAgICAgIHJldHVybiAicm8iOworICAgIGNhc2UgTEFOR19SVVNTSUFOOgorICAgICAgcmV0dXJuICJydSI7IC8qIEFtYmlndW91czogY291bGQgYmUgInJ1X1JVIiBvciAicnVfVUEiIG9yICJydV9NRCIuICAqLworICAgIGNhc2UgTEFOR19TQUFNSTogLyogYWN0dWFsbHkgTm9ydGhlcm4gU2FtaSAqLyByZXR1cm4gInNlX05PIjsKKyAgICBjYXNlIExBTkdfU0FOU0tSSVQ6IHJldHVybiAic2FfSU4iOworICAgIGNhc2UgTEFOR19TSU5ESEk6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX1NJTkRISV9JTkRJQTogcmV0dXJuICJzZF9JTiI7CisJY2FzZSBTVUJMQU5HX1NJTkRISV9QQUtJU1RBTjogcmV0dXJuICJzZF9QSyI7CisJfQorICAgICAgcmV0dXJuICJzZCI7CisgICAgY2FzZSBMQU5HX1NJTkhBTEVTRTogcmV0dXJuICJzaV9MSyI7CisgICAgY2FzZSBMQU5HX1NMT1ZBSzogcmV0dXJuICJza19TSyI7CisgICAgY2FzZSBMQU5HX1NMT1ZFTklBTjogcmV0dXJuICJzbF9TSSI7CisgICAgY2FzZSBMQU5HX1NPTUFMSTogcmV0dXJuICJzb19TTyI7CisgICAgY2FzZSBMQU5HX1NPUkJJQU46CisgICAgICAvKiBGSVhNRTogQWRqdXN0IHRoaXMgd2hlbiBzdWNoIGxvY2FsZXMgYXBwZWFyIG9uIFVuaXguICAqLworICAgICAgcmV0dXJuICJ3ZW5fREUiOworICAgIGNhc2UgTEFOR19TUEFOSVNIOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19TUEFOSVNIOiByZXR1cm4gImVzX0VTIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9NRVhJQ0FOOiByZXR1cm4gImVzX01YIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9NT0RFUk46CisJICByZXR1cm4gImVzX0VTQG1vZGVybiI7CS8qIG5vdCBzZWVuIG9uIFVuaXggKi8KKwljYXNlIFNVQkxBTkdfU1BBTklTSF9HVUFURU1BTEE6IHJldHVybiAiZXNfR1QiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX0NPU1RBX1JJQ0E6IHJldHVybiAiZXNfQ1IiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX1BBTkFNQTogcmV0dXJuICJlc19QQSI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfRE9NSU5JQ0FOX1JFUFVCTElDOiByZXR1cm4gImVzX0RPIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9WRU5FWlVFTEE6IHJldHVybiAiZXNfVkUiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX0NPTE9NQklBOiByZXR1cm4gImVzX0NPIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9QRVJVOiByZXR1cm4gImVzX1BFIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9BUkdFTlRJTkE6IHJldHVybiAiZXNfQVIiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX0VDVUFET1I6IHJldHVybiAiZXNfRUMiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX0NISUxFOiByZXR1cm4gImVzX0NMIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZOiByZXR1cm4gImVzX1VZIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9QQVJBR1VBWTogcmV0dXJuICJlc19QWSI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfQk9MSVZJQTogcmV0dXJuICJlc19CTyI7CisJY2FzZSBTVUJMQU5HX1NQQU5JU0hfRUxfU0FMVkFET1I6IHJldHVybiAiZXNfU1YiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX0hPTkRVUkFTOiByZXR1cm4gImVzX0hOIjsKKwljYXNlIFNVQkxBTkdfU1BBTklTSF9OSUNBUkFHVUE6IHJldHVybiAiZXNfTkkiOworCWNhc2UgU1VCTEFOR19TUEFOSVNIX1BVRVJUT19SSUNPOiByZXR1cm4gImVzX1BSIjsKKwl9CisgICAgICByZXR1cm4gImVzIjsKKyAgICBjYXNlIExBTkdfU1VUVTogcmV0dXJuICJibnRfVFoiOyAvKiBvciAic3RfTFMiIG9yICJuc29fWkEiPyAqLworICAgIGNhc2UgTEFOR19TV0FISUxJOiByZXR1cm4gInN3X0tFIjsKKyAgICBjYXNlIExBTkdfU1dFRElTSDoKKyAgICAgIHN3aXRjaCAoc3ViKQorCXsKKwljYXNlIFNVQkxBTkdfREVGQVVMVDogcmV0dXJuICJzdl9TRSI7CisJY2FzZSBTVUJMQU5HX1NXRURJU0hfRklOTEFORDogcmV0dXJuICJzdl9GSSI7CisJfQorICAgICAgcmV0dXJuICJzdiI7CisgICAgY2FzZSBMQU5HX1NZUklBQzogcmV0dXJuICJzeXJfVFIiOyAvKiBBbiBleHRpbmN0IGxhbmd1YWdlLiAgKi8KKyAgICBjYXNlIExBTkdfVEFHQUxPRzogcmV0dXJuICJ0bF9QSCI7CisgICAgY2FzZSBMQU5HX1RBSklLOiByZXR1cm4gInRnX1RKIjsKKyAgICBjYXNlIExBTkdfVEFNQVpJR0hUOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCS8qIEZJWE1FOiBBZGp1c3QgdGhpcyB3aGVuIFRhbWF6aWdodCBsb2NhbGVzIGFwcGVhciBvbiBVbml4LiAgKi8KKwljYXNlIFNVQkxBTkdfVEFNQVpJR0hUX0FSQUJJQzogcmV0dXJuICJiZXJfTUFAYXJhYmljIjsKKwljYXNlIFNVQkxBTkdfVEFNQVpJR0hUX0xBVElOOiByZXR1cm4gImJlcl9NQUBsYXRpbiI7CisJfQorICAgICAgcmV0dXJuICJiZXJfTUEiOworICAgIGNhc2UgTEFOR19UQU1JTDoKKyAgICAgIHJldHVybiAidGEiOyAvKiBBbWJpZ3VvdXM6IGNvdWxkIGJlICJ0YV9JTiIgb3IgInRhX0xLIiBvciAidGFfU0ciLiAgKi8KKyAgICBjYXNlIExBTkdfVEFUQVI6IHJldHVybiAidHRfUlUiOworICAgIGNhc2UgTEFOR19URUxVR1U6IHJldHVybiAidGVfSU4iOworICAgIGNhc2UgTEFOR19USEFJOiByZXR1cm4gInRoX1RIIjsKKyAgICBjYXNlIExBTkdfVElCRVRBTjogcmV0dXJuICJib19DTiI7CisgICAgY2FzZSBMQU5HX1RJR1JJTllBOgorICAgICAgc3dpdGNoIChzdWIpCisJeworCWNhc2UgU1VCTEFOR19USUdSSU5ZQV9FVEhJT1BJQTogcmV0dXJuICJ0aV9FVCI7CisJY2FzZSBTVUJMQU5HX1RJR1JJTllBX0VSSVRSRUE6IHJldHVybiAidGlfRVIiOworCX0KKyAgICAgIHJldHVybiAidGkiOworICAgIGNhc2UgTEFOR19UU09OR0E6IHJldHVybiAidHNfWkEiOworICAgIGNhc2UgTEFOR19UU1dBTkE6IHJldHVybiAidG5fQlciOworICAgIGNhc2UgTEFOR19UVVJLSVNIOiByZXR1cm4gInRyX1RSIjsKKyAgICBjYXNlIExBTkdfVFVSS01FTjogcmV0dXJuICJ0a19UTSI7CisgICAgY2FzZSBMQU5HX1VLUkFJTklBTjogcmV0dXJuICJ1a19VQSI7CisgICAgY2FzZSBMQU5HX1VSRFU6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX1VSRFVfUEFLSVNUQU46IHJldHVybiAidXJfUEsiOworCWNhc2UgU1VCTEFOR19VUkRVX0lORElBOiByZXR1cm4gInVyX0lOIjsKKwl9CisgICAgICByZXR1cm4gInVyIjsKKyAgICBjYXNlIExBTkdfVVpCRUs6CisgICAgICBzd2l0Y2ggKHN1YikKKwl7CisJY2FzZSBTVUJMQU5HX1VaQkVLX0xBVElOOiByZXR1cm4gInV6X1VaIjsKKwljYXNlIFNVQkxBTkdfVVpCRUtfQ1lSSUxMSUM6IHJldHVybiAidXpfVVpAY3lyaWxsaWMiOworCX0KKyAgICAgIHJldHVybiAidXoiOworICAgIGNhc2UgTEFOR19WRU5EQTogcmV0dXJuICJ2ZV9aQSI7CisgICAgY2FzZSBMQU5HX1ZJRVROQU1FU0U6IHJldHVybiAidmlfVk4iOworICAgIGNhc2UgTEFOR19XRUxTSDogcmV0dXJuICJjeV9HQiI7CisgICAgY2FzZSBMQU5HX1hIT1NBOiByZXR1cm4gInhoX1pBIjsKKyAgICBjYXNlIExBTkdfWUk6IHJldHVybiAic2l0X0NOIjsKKyAgICBjYXNlIExBTkdfWUlERElTSDogcmV0dXJuICJ5aV9JTCI7CisgICAgY2FzZSBMQU5HX1lPUlVCQTogcmV0dXJuICJ5b19ORyI7CisgICAgY2FzZSBMQU5HX1pVTFU6IHJldHVybiAienVfWkEiOworICAgIGRlZmF1bHQ6IHJldHVybiAiQyI7CisgICAgfQorCisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9sb2cuYyBiL3VuaXgvaW50bC9sb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjYwNzZlCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL2xvZy5jCkBAIC0wLDAgKzEsOTggQEAKKy8qIExvZyBmaWxlIG91dHB1dC4KKyAgIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKy8qIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIFByaW50IGFuIEFTQ0lJIHN0cmluZyB3aXRoIHF1b3RlcyBhbmQgZXNjYXBlIHNlcXVlbmNlcyB3aGVyZSBuZWVkZWQuICAqLworc3RhdGljIHZvaWQKK3ByaW50X2VzY2FwZWQgKEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqc3RyKQoreworICBwdXRjICgnIicsIHN0cmVhbSk7CisgIGZvciAoOyAqc3RyICE9ICdcMCc7IHN0cisrKQorICAgIGlmICgqc3RyID09ICdcbicpCisgICAgICB7CisJZnB1dHMgKCJcXG5cIiIsIHN0cmVhbSk7CisJaWYgKHN0clsxXSA9PSAnXDAnKQorCSAgcmV0dXJuOworCWZwdXRzICgiXG5cIiIsIHN0cmVhbSk7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCWlmICgqc3RyID09ICciJyB8fCAqc3RyID09ICdcXCcpCisJICBwdXRjICgnXFwnLCBzdHJlYW0pOworCXB1dGMgKCpzdHIsIHN0cmVhbSk7CisgICAgICB9CisgIHB1dGMgKCciJywgc3RyZWFtKTsKK30KKworLyogQWRkIHRvIHRoZSBsb2cgZmlsZSBhbiBlbnRyeSBkZW5vdGluZyBhIGZhaWxlZCB0cmFuc2xhdGlvbi4gICovCit2b2lkCitfbmxfbG9nX3VudHJhbnNsYXRlZCAoY29uc3QgY2hhciAqbG9nZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWUsCisJCSAgICAgIGNvbnN0IGNoYXIgKm1zZ2lkMSwgY29uc3QgY2hhciAqbXNnaWQyLCBpbnQgcGx1cmFsKQoreworICBzdGF0aWMgY2hhciAqbGFzdF9sb2dmaWxlbmFtZSA9IE5VTEw7CisgIHN0YXRpYyBGSUxFICpsYXN0X2xvZ2ZpbGUgPSBOVUxMOworICBGSUxFICpsb2dmaWxlOworCisgIC8qIENhbiB3ZSByZXVzZSB0aGUgbGFzdCBvcGVuZWQgbG9nZmlsZT8gICovCisgIGlmIChsYXN0X2xvZ2ZpbGVuYW1lID09IE5VTEwgfHwgc3RyY21wIChsb2dmaWxlbmFtZSwgbGFzdF9sb2dmaWxlbmFtZSkgIT0gMCkKKyAgICB7CisgICAgICAvKiBDbG9zZSB0aGUgbGFzdCB1c2VkIGxvZ2ZpbGUuICAqLworICAgICAgaWYgKGxhc3RfbG9nZmlsZW5hbWUgIT0gTlVMTCkKKwl7CisJICBpZiAobGFzdF9sb2dmaWxlICE9IE5VTEwpCisJICAgIHsKKwkgICAgICBmY2xvc2UgKGxhc3RfbG9nZmlsZSk7CisJICAgICAgbGFzdF9sb2dmaWxlID0gTlVMTDsKKwkgICAgfQorCSAgZnJlZSAobGFzdF9sb2dmaWxlbmFtZSk7CisJICBsYXN0X2xvZ2ZpbGVuYW1lID0gTlVMTDsKKwl9CisgICAgICAvKiBPcGVuIHRoZSBsb2dmaWxlLiAgKi8KKyAgICAgIGxhc3RfbG9nZmlsZW5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAobG9nZmlsZW5hbWUpICsgMSk7CisgICAgICBpZiAobGFzdF9sb2dmaWxlbmFtZSA9PSBOVUxMKQorCXJldHVybjsKKyAgICAgIHN0cmNweSAobGFzdF9sb2dmaWxlbmFtZSwgbG9nZmlsZW5hbWUpOworICAgICAgbGFzdF9sb2dmaWxlID0gZm9wZW4gKGxvZ2ZpbGVuYW1lLCAiYSIpOworICAgICAgaWYgKGxhc3RfbG9nZmlsZSA9PSBOVUxMKQorCXJldHVybjsKKyAgICB9CisgIGxvZ2ZpbGUgPSBsYXN0X2xvZ2ZpbGU7CisKKyAgZnByaW50ZiAobG9nZmlsZSwgImRvbWFpbiAiKTsKKyAgcHJpbnRfZXNjYXBlZCAobG9nZmlsZSwgZG9tYWlubmFtZSk7CisgIGZwcmludGYgKGxvZ2ZpbGUsICJcbm1zZ2lkICIpOworICBwcmludF9lc2NhcGVkIChsb2dmaWxlLCBtc2dpZDEpOworICBpZiAocGx1cmFsKQorICAgIHsKKyAgICAgIGZwcmludGYgKGxvZ2ZpbGUsICJcbm1zZ2lkX3BsdXJhbCAiKTsKKyAgICAgIHByaW50X2VzY2FwZWQgKGxvZ2ZpbGUsIG1zZ2lkMik7CisgICAgICBmcHJpbnRmIChsb2dmaWxlLCAiXG5tc2dzdHJbMF0gXCJcIlxuIik7CisgICAgfQorICBlbHNlCisgICAgZnByaW50ZiAobG9nZmlsZSwgIlxubXNnc3RyIFwiXCJcbiIpOworICBwdXRjICgnXG4nLCBsb2dmaWxlKTsKK30KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9uZ2V0dGV4dC5jIGIvdW5peC9pbnRsL25nZXR0ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTczZTAwYwotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9uZ2V0dGV4dC5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qIEltcGxlbWVudGF0aW9uIG9mIG5nZXR0ZXh0KDMpIGZ1bmN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIF9fbmVlZF9OVUxMCisjIGluY2x1ZGUgPHN0ZGRlZi5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8c3RkbGliLmg+CQkvKiBKdXN0IGZvciBOVUxMLiAgKi8KKyNlbmRpZgorCisjaW5jbHVkZSAiZ2V0dGV4dFAuaCIKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZWxzZQorIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGxvY2FsZS5oPgorCisvKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCisKKy8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKKyAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKKyAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXworICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KKyNpZmRlZiBfTElCQworIyBkZWZpbmUgTkdFVFRFWFQgX19uZ2V0dGV4dAorIyBkZWZpbmUgRENOR0VUVEVYVCBfX2RjbmdldHRleHQKKyNlbHNlCisjIGRlZmluZSBOR0VUVEVYVCBsaWJpbnRsX25nZXR0ZXh0CisjIGRlZmluZSBEQ05HRVRURVhUIGxpYmludGxfZGNuZ2V0dGV4dAorI2VuZGlmCisKKy8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50CisgICBMQ19NRVNTQUdFUyBsb2NhbGUuICBJZiBub3QgZm91bmQsIHJldHVybnMgTVNHSUQgaXRzZWxmICh0aGUgZGVmYXVsdAorICAgdGV4dCkuICAqLworY2hhciAqCitOR0VUVEVYVCAoY29uc3QgY2hhciAqbXNnaWQxLCBjb25zdCBjaGFyICptc2dpZDIsIHVuc2lnbmVkIGxvbmcgaW50IG4pCit7CisgIHJldHVybiBEQ05HRVRURVhUIChOVUxMLCBtc2dpZDEsIG1zZ2lkMiwgbiwgTENfTUVTU0FHRVMpOworfQorCisjaWZkZWYgX0xJQkMKKy8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLword2Vha19hbGlhcyAoX19uZ2V0dGV4dCwgbmdldHRleHQpOworI2VuZGlmCmRpZmYgLS1naXQgYS91bml4L2ludGwvb3MyY29tcGF0LmMgYi91bml4L2ludGwvb3MyY29tcGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkYzMzZQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9vczJjb21wYXQuYwpAQCAtMCwwICsxLDk4IEBACisvKiBPUy8yIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjZGVmaW5lIE9TMl9BV0FSRQorI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKy8qIEEgdmVyc2lvbiBvZiBnZXRlbnYoKSB0aGF0IHdvcmtzIGZyb20gRExMcyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgRG9zU2NhbkVudiAoY29uc3QgdW5zaWduZWQgY2hhciAqcHN6TmFtZSwgdW5zaWduZWQgY2hhciAqKnBwc3pWYWx1ZSk7CisKK2NoYXIgKgorX25sX2dldGVudiAoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgdW5zaWduZWQgY2hhciAqdmFsdWU7CisgIGlmIChEb3NTY2FuRW52IChuYW1lLCAmdmFsdWUpKQorICAgIHJldHVybiBOVUxMOworICBlbHNlCisgICAgcmV0dXJuIHZhbHVlOworfQorCisvKiBBIGZpeGVkIHNpemUgYnVmZmVyLiAgKi8KK2NoYXIgbGliaW50bF9ubF9kZWZhdWx0X2Rpcm5hbWVbTUFYUEFUSExFTisxXTsKKworY2hhciAqX25sb3MyX2xpYmRpciA9IE5VTEw7CitjaGFyICpfbmxvczJfbG9jYWxlYWxpYXNwYXRoID0gTlVMTDsKK2NoYXIgKl9ubG9zMl9sb2NhbGVkaXIgPSBOVUxMOworCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkCitubG9zMl9pbml0aWFsaXplICgpCit7CisgIGNoYXIgKnJvb3QgPSBnZXRlbnYgKCJVTklYUk9PVCIpOworICBjaGFyICpnbnVsb2NhbGVkaXIgPSBnZXRlbnYgKCJHTlVMT0NBTEVESVIiKTsKKworICBfbmxvczJfbGliZGlyID0gZ251bG9jYWxlZGlyOworICBpZiAoIV9ubG9zMl9saWJkaXIpCisgICAgeworICAgICAgaWYgKHJvb3QpCisgICAgICAgIHsKKyAgICAgICAgICBzaXplX3Qgc2wgPSBzdHJsZW4gKHJvb3QpOworICAgICAgICAgIF9ubG9zMl9saWJkaXIgPSAoY2hhciAqKSBtYWxsb2MgKHNsICsgc3RybGVuIChMSUJESVIpICsgMSk7CisgICAgICAgICAgbWVtY3B5IChfbmxvczJfbGliZGlyLCByb290LCBzbCk7CisgICAgICAgICAgbWVtY3B5IChfbmxvczJfbGliZGlyICsgc2wsIExJQkRJUiwgc3RybGVuIChMSUJESVIpICsgMSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgX25sb3MyX2xpYmRpciA9IExJQkRJUjsKKyAgICB9CisKKyAgX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IGdudWxvY2FsZWRpcjsKKyAgaWYgKCFfbmxvczJfbG9jYWxlYWxpYXNwYXRoKQorICAgIHsKKyAgICAgIGlmIChyb290KQorICAgICAgICB7CisgICAgICAgICAgc2l6ZV90IHNsID0gc3RybGVuIChyb290KTsKKyAgICAgICAgICBfbmxvczJfbG9jYWxlYWxpYXNwYXRoID0gKGNoYXIgKikgbWFsbG9jIChzbCArIHN0cmxlbiAoTE9DQUxFX0FMSUFTX1BBVEgpICsgMSk7CisgICAgICAgICAgbWVtY3B5IChfbmxvczJfbG9jYWxlYWxpYXNwYXRoLCByb290LCBzbCk7CisgICAgICAgICAgbWVtY3B5IChfbmxvczJfbG9jYWxlYWxpYXNwYXRoICsgc2wsIExPQ0FMRV9BTElBU19QQVRILCBzdHJsZW4gKExPQ0FMRV9BTElBU19QQVRIKSArIDEpOworICAgICAgICB9CisgICAgIGVsc2UKKyAgICAgICAgX25sb3MyX2xvY2FsZWFsaWFzcGF0aCA9IExPQ0FMRV9BTElBU19QQVRIOworICAgIH0KKworICBfbmxvczJfbG9jYWxlZGlyID0gZ251bG9jYWxlZGlyOworICBpZiAoIV9ubG9zMl9sb2NhbGVkaXIpCisgICAgeworICAgICAgaWYgKHJvb3QpCisgICAgICAgIHsKKyAgICAgICAgICBzaXplX3Qgc2wgPSBzdHJsZW4gKHJvb3QpOworICAgICAgICAgIF9ubG9zMl9sb2NhbGVkaXIgPSAoY2hhciAqKSBtYWxsb2MgKHNsICsgc3RybGVuIChMT0NBTEVESVIpICsgMSk7CisgICAgICAgICAgbWVtY3B5IChfbmxvczJfbG9jYWxlZGlyLCByb290LCBzbCk7CisgICAgICAgICAgbWVtY3B5IChfbmxvczJfbG9jYWxlZGlyICsgc2wsIExPQ0FMRURJUiwgc3RybGVuIChMT0NBTEVESVIpICsgMSk7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgX25sb3MyX2xvY2FsZWRpciA9IExPQ0FMRURJUjsKKyAgICB9CisKKyAgaWYgKHN0cmxlbiAoX25sb3MyX2xvY2FsZWRpcikgPD0gTUFYUEFUSExFTikKKyAgICBzdHJjcHkgKGxpYmludGxfbmxfZGVmYXVsdF9kaXJuYW1lLCBfbmxvczJfbG9jYWxlZGlyKTsKK30KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9vczJjb21wYXQuaCBiL3VuaXgvaW50bC9vczJjb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjc0ZThjCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL29zMmNvbXBhdC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIE9TLzIgY29tcGF0aWJpbGl0eSBkZWZpbmVzLgorICAgVGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIGluY2x1ZGVkIGZyb20gY29uZmlnLmgKKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworLyogV2hlbiBpbmNsdWRlZCBmcm9tIG9zMmNvbXBhdC5oIHdlIG5lZWQgYWxsIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9ucyAqLworI2lmbmRlZiBPUzJfQVdBUkUKKworI3VuZGVmIExJQkRJUgorI2RlZmluZSBMSUJESVIJCQlfbmxvczJfbGliZGlyCitleHRlcm4gY2hhciAqX25sb3MyX2xpYmRpcjsKKworI3VuZGVmIExPQ0FMRURJUgorI2RlZmluZSBMT0NBTEVESVIJCV9ubG9zMl9sb2NhbGVkaXIKK2V4dGVybiBjaGFyICpfbmxvczJfbG9jYWxlZGlyOworCisjdW5kZWYgTE9DQUxFX0FMSUFTX1BBVEgKKyNkZWZpbmUgTE9DQUxFX0FMSUFTX1BBVEgJX25sb3MyX2xvY2FsZWFsaWFzcGF0aAorZXh0ZXJuIGNoYXIgKl9ubG9zMl9sb2NhbGVhbGlhc3BhdGg7CisKKyNlbmRpZgorCisjdW5kZWYgSEFWRV9TVFJDQVNFQ01QCisjZGVmaW5lIEhBVkVfU1RSQ0FTRUNNUCAxCisjZGVmaW5lIHN0cmNhc2VjbXAgc3RyaWNtcAorI2RlZmluZSBzdHJuY2FzZWNtcCBzdHJuaWNtcAorCisvKiBXZSBoYXZlIG91ciBvd24gZ2V0ZW52KCkgd2hpY2ggd29ya3MgZXZlbiBpZiBsaWJyYXJ5IGlzIGNvbXBpbGVkIGFzIERMTCAqLworI2RlZmluZSBnZXRlbnYgX25sX2dldGVudgorCisvKiBPbGRlciB2ZXJzaW9ucyBvZiBnZXR0ZXh0IHVzZWQgLTEgYXMgdGhlIHZhbHVlIG9mIExDX01FU1NBR0VTICovCisjZGVmaW5lIExDX01FU1NBR0VTX0NPTVBBVCAoLTEpCmRpZmYgLS1naXQgYS91bml4L2ludGwvb3NkZXAuYyBiL3VuaXgvaW50bC9vc2RlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNzI1OTgKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvb3NkZXAuYwpAQCAtMCwwICsxLDI0IEBACisvKiBPUyBkZXBlbmRlbnQgcGFydHMgb2YgbGliaW50bC4KKyAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmIGRlZmluZWQgX19FTVhfXworIyBpbmNsdWRlICJvczJjb21wYXQuYyIKKyNlbHNlCisvKiBBdm9pZCBBSVggY29tcGlsZXIgd2FybmluZy4gICovCit0eXBlZGVmIGludCBkdW1teTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3BsdXJhbC1leHAuYyBiL3VuaXgvaW50bC9wbHVyYWwtZXhwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwNGU2NAotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9wbHVyYWwtZXhwLmMKQEAgLTAsMCArMSwxNTQgQEAKKy8qIEV4cHJlc3Npb24gcGFyc2luZyBmb3IgcGx1cmFsIGZvcm0gc2VsZWN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJwbHVyYWwtZXhwLmgiCisKKyNpZiAoZGVmaW5lZCBfX0dOVUNfXyAmJiAhZGVmaW5lZCBfX0FQUExFX0NDX18pIFwKKyAgICB8fCAoZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkKKworLyogVGhlc2Ugc3RydWN0cyBhcmUgdGhlIGNvbnN0YW50IGV4cHJlc3Npb24gZm9yIHRoZSBnZXJtYW5pYyBwbHVyYWwKKyAgIGZvcm0gZGV0ZXJtaW5hdGlvbi4gIEl0IHJlcHJlc2VudHMgdGhlIGV4cHJlc3Npb24gICJuICE9IDEiLiAgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwcmVzc2lvbiBwbHZhciA9Cit7CisgIC5uYXJncyA9IDAsCisgIC5vcGVyYXRpb24gPSB2YXIsCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBleHByZXNzaW9uIHBsb25lID0KK3sKKyAgLm5hcmdzID0gMCwKKyAgLm9wZXJhdGlvbiA9IG51bSwKKyAgLnZhbCA9CisgIHsKKyAgICAubnVtID0gMQorICB9Cit9Oworc3RydWN0IGV4cHJlc3Npb24gR0VSTUFOSUNfUExVUkFMID0KK3sKKyAgLm5hcmdzID0gMiwKKyAgLm9wZXJhdGlvbiA9IG5vdF9lcXVhbCwKKyAgLnZhbCA9CisgIHsKKyAgICAuYXJncyA9CisgICAgeworICAgICAgWzBdID0gKHN0cnVjdCBleHByZXNzaW9uICopICZwbHZhciwKKyAgICAgIFsxXSA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSAmcGxvbmUKKyAgICB9CisgIH0KK307CisKKyMgZGVmaW5lIElOSVRfR0VSTUFOSUNfUExVUkFMKCkKKworI2Vsc2UKKworLyogRm9yIGNvbXBpbGVycyB3aXRob3V0IHN1cHBvcnQgZm9yIElTTyBDIDk5IHN0cnVjdC91bmlvbiBpbml0aWFsaXplcnM6CisgICBJbml0aWFsaXphdGlvbiBhdCBydW4tdGltZS4gICovCisKK3N0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiBwbHZhcjsKK3N0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiBwbG9uZTsKK3N0cnVjdCBleHByZXNzaW9uIEdFUk1BTklDX1BMVVJBTDsKKworc3RhdGljIHZvaWQKK2luaXRfZ2VybWFuaWNfcGx1cmFsICgpCit7CisgIGlmIChwbG9uZS52YWwubnVtID09IDApCisgICAgeworICAgICAgcGx2YXIubmFyZ3MgPSAwOworICAgICAgcGx2YXIub3BlcmF0aW9uID0gdmFyOworCisgICAgICBwbG9uZS5uYXJncyA9IDA7CisgICAgICBwbG9uZS5vcGVyYXRpb24gPSBudW07CisgICAgICBwbG9uZS52YWwubnVtID0gMTsKKworICAgICAgR0VSTUFOSUNfUExVUkFMLm5hcmdzID0gMjsKKyAgICAgIEdFUk1BTklDX1BMVVJBTC5vcGVyYXRpb24gPSBub3RfZXF1YWw7CisgICAgICBHRVJNQU5JQ19QTFVSQUwudmFsLmFyZ3NbMF0gPSAmcGx2YXI7CisgICAgICBHRVJNQU5JQ19QTFVSQUwudmFsLmFyZ3NbMV0gPSAmcGxvbmU7CisgICAgfQorfQorCisjIGRlZmluZSBJTklUX0dFUk1BTklDX1BMVVJBTCgpIGluaXRfZ2VybWFuaWNfcGx1cmFsICgpCisKKyNlbmRpZgorCit2b2lkCitpbnRlcm5hbF9mdW5jdGlvbgorRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiAoY29uc3QgY2hhciAqbnVsbGVudHJ5LCBzdHJ1Y3QgZXhwcmVzc2lvbiAqKnBsdXJhbHAsCisJCQkgICB1bnNpZ25lZCBsb25nIGludCAqbnBsdXJhbHNwKQoreworICBpZiAobnVsbGVudHJ5ICE9IE5VTEwpCisgICAgeworICAgICAgY29uc3QgY2hhciAqcGx1cmFsOworICAgICAgY29uc3QgY2hhciAqbnBsdXJhbHM7CisKKyAgICAgIHBsdXJhbCA9IHN0cnN0ciAobnVsbGVudHJ5LCAicGx1cmFsPSIpOworICAgICAgbnBsdXJhbHMgPSBzdHJzdHIgKG51bGxlbnRyeSwgIm5wbHVyYWxzPSIpOworICAgICAgaWYgKHBsdXJhbCA9PSBOVUxMIHx8IG5wbHVyYWxzID09IE5VTEwpCisJZ290byBub19wbHVyYWw7CisgICAgICBlbHNlCisJeworCSAgY2hhciAqZW5kcDsKKwkgIHVuc2lnbmVkIGxvbmcgaW50IG47CisJICBzdHJ1Y3QgcGFyc2VfYXJncyBhcmdzOworCisJICAvKiBGaXJzdCBnZXQgdGhlIG51bWJlci4gICovCisJICBucGx1cmFscyArPSA5OworCSAgd2hpbGUgKCpucGx1cmFscyAhPSAnXDAnICYmIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqbnBsdXJhbHMpKQorCSAgICArK25wbHVyYWxzOworCSAgaWYgKCEoKm5wbHVyYWxzID49ICcwJyAmJiAqbnBsdXJhbHMgPD0gJzknKSkKKwkgICAgZ290byBub19wbHVyYWw7CisjaWYgZGVmaW5lZCBIQVZFX1NUUlRPVUwgfHwgZGVmaW5lZCBfTElCQworCSAgbiA9IHN0cnRvdWwgKG5wbHVyYWxzLCAmZW5kcCwgMTApOworI2Vsc2UKKwkgIGZvciAoZW5kcCA9IG5wbHVyYWxzLCBuID0gMDsgKmVuZHAgPj0gJzAnICYmICplbmRwIDw9ICc5JzsgZW5kcCsrKQorCSAgICBuID0gbiAqIDEwICsgKCplbmRwIC0gJzAnKTsKKyNlbmRpZgorCSAgaWYgKG5wbHVyYWxzID09IGVuZHApCisJICAgIGdvdG8gbm9fcGx1cmFsOworCSAgKm5wbHVyYWxzcCA9IG47CisKKwkgIC8qIER1ZSB0byB0aGUgcmVzdHJpY3Rpb25zIGJpc29uIGltcG9zZXMgb250byB0aGUgaW50ZXJmYWNlIG9mIHRoZQorCSAgICAgc2Nhbm5lciBmdW5jdGlvbiB3ZSBoYXZlIHRvIHB1dCB0aGUgaW5wdXQgc3RyaW5nIGFuZCB0aGUgcmVzdWx0CisJICAgICBwYXNzZWQgdXAgZnJvbSB0aGUgcGFyc2VyIGludG8gdGhlIHNhbWUgc3RydWN0dXJlIHdoaWNoIGFkZHJlc3MKKwkgICAgIGlzIHBhc3NlZCBkb3duIHRvIHRoZSBwYXJzZXIuICAqLworCSAgcGx1cmFsICs9IDc7CisJICBhcmdzLmNwID0gcGx1cmFsOworCSAgaWYgKFBMVVJBTF9QQVJTRSAoJmFyZ3MpICE9IDApCisJICAgIGdvdG8gbm9fcGx1cmFsOworCSAgKnBsdXJhbHAgPSBhcmdzLnJlczsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogQnkgZGVmYXVsdCB3ZSBhcmUgdXNpbmcgdGhlIEdlcm1hbmljIGZvcm06IHNpbmd1bGFyIGZvcm0gb25seQorICAgICAgICAgZm9yIGBvbmUnLCB0aGUgcGx1cmFsIGZvcm0gb3RoZXJ3aXNlLiAgWWVzLCB0aGlzIGlzIGFsc28gd2hhdAorICAgICAgICAgRW5nbGlzaCBpcyB1c2luZyBzaW5jZSBFbmdsaXNoIGlzIGEgR2VybWFuaWMgbGFuZ3VhZ2UuICAqLworICAgIG5vX3BsdXJhbDoKKyAgICAgIElOSVRfR0VSTUFOSUNfUExVUkFMICgpOworICAgICAgKnBsdXJhbHAgPSAmR0VSTUFOSUNfUExVUkFMOworICAgICAgKm5wbHVyYWxzcCA9IDI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3BsdXJhbC1leHAuaCBiL3VuaXgvaW50bC9wbHVyYWwtZXhwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllMmM1YgotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9wbHVyYWwtZXhwLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qIEV4cHJlc3Npb24gcGFyc2luZyBhbmQgZXZhbHVhdGlvbiBmb3IgcGx1cmFsIGZvcm0gc2VsZWN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfUExVUkFMX0VYUF9ICisjZGVmaW5lIF9QTFVSQUxfRVhQX0gKKworI2lmbmRlZiBpbnRlcm5hbF9mdW5jdGlvbgorIyBkZWZpbmUgaW50ZXJuYWxfZnVuY3Rpb24KKyNlbmRpZgorCisjaWZuZGVmIGF0dHJpYnV0ZV9oaWRkZW4KKyMgZGVmaW5lIGF0dHJpYnV0ZV9oaWRkZW4KKyNlbmRpZgorCisKKy8qIFRoaXMgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBleHByZXNzaW9ucyB0byBkZXRlcm1pbmUgdGhlCisgICBwbHVyYWwgZm9ybS4gICovCitzdHJ1Y3QgZXhwcmVzc2lvbgoreworICBpbnQgbmFyZ3M7CQkJLyogTnVtYmVyIG9mIGFyZ3VtZW50cy4gICovCisgIGVudW0gb3BlcmF0b3IKKyAgeworICAgIC8qIFdpdGhvdXQgYXJndW1lbnRzOiAgKi8KKyAgICB2YXIsCQkJLyogVGhlIHZhcmlhYmxlICJuIi4gICovCisgICAgbnVtLAkJCS8qIERlY2ltYWwgbnVtYmVyLiAgKi8KKyAgICAvKiBVbmFyeSBvcGVyYXRvcnM6ICAqLworICAgIGxub3QsCQkJLyogTG9naWNhbCBOT1QuICAqLworICAgIC8qIEJpbmFyeSBvcGVyYXRvcnM6ICAqLworICAgIG11bHQsCQkJLyogTXVsdGlwbGljYXRpb24uICAqLworICAgIGRpdmlkZSwJCQkvKiBEaXZpc2lvbi4gICovCisgICAgbW9kdWxlLAkJCS8qIE1vZHVsbyBvcGVyYXRpb24uICAqLworICAgIHBsdXMsCQkJLyogQWRkaXRpb24uICAqLworICAgIG1pbnVzLAkJCS8qIFN1YnRyYWN0aW9uLiAgKi8KKyAgICBsZXNzX3RoYW4sCQkJLyogQ29tcGFyaXNvbi4gICovCisgICAgZ3JlYXRlcl90aGFuLAkJLyogQ29tcGFyaXNvbi4gICovCisgICAgbGVzc19vcl9lcXVhbCwJCS8qIENvbXBhcmlzb24uICAqLworICAgIGdyZWF0ZXJfb3JfZXF1YWwsCQkvKiBDb21wYXJpc29uLiAgKi8KKyAgICBlcXVhbCwJCQkvKiBDb21wYXJpc29uIGZvciBlcXVhbGl0eS4gICovCisgICAgbm90X2VxdWFsLAkJCS8qIENvbXBhcmlzb24gZm9yIGluZXF1YWxpdHkuICAqLworICAgIGxhbmQsCQkJLyogTG9naWNhbCBBTkQuICAqLworICAgIGxvciwJCQkvKiBMb2dpY2FsIE9SLiAgKi8KKyAgICAvKiBUZXJuYXJ5IG9wZXJhdG9yczogICovCisgICAgcW1vcAkJCS8qIFF1ZXN0aW9uIG1hcmsgb3BlcmF0b3IuICAqLworICB9IG9wZXJhdGlvbjsKKyAgdW5pb24KKyAgeworICAgIHVuc2lnbmVkIGxvbmcgaW50IG51bTsJLyogTnVtYmVyIHZhbHVlIGZvciBgbnVtJy4gICovCisgICAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbM107CS8qIFVwIHRvIHRocmVlIGFyZ3VtZW50cy4gICovCisgIH0gdmFsOworfTsKKworLyogVGhpcyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgdG8gcGFzcyBpbmZvcm1hdGlvbiB0byB0aGUgcGFyc2VyIGFuZCBnZXQKKyAgIHRoZSByZXN1bHQgaW4gYSB0aHJlYWQtc2FmZSB3YXkuICAqLworc3RydWN0IHBhcnNlX2FyZ3MKK3sKKyAgY29uc3QgY2hhciAqY3A7CisgIHN0cnVjdCBleHByZXNzaW9uICpyZXM7Cit9OworCisKKy8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoaXMgc291cmNlIGNvZGUgaXMgdXNlZAorICAgMS4gaW4gdGhlIEdOVSBDIExpYnJhcnkgbGlicmFyeSwKKyAgIDIuIGluIHRoZSBHTlUgbGliaW50bCBsaWJyYXJ5LAorICAgMy4gaW4gdGhlIEdOVSBnZXR0ZXh0IHRvb2xzLgorICAgVGhlIGZ1bmN0aW9uIG5hbWVzIGluIGVhY2ggc2l0dWF0aW9uIG11c3QgYmUgZGlmZmVyZW50LCB0byBhbGxvdyBmb3IKKyAgIGJpbmFyeSBpbmNvbXBhdGlibGUgY2hhbmdlcyBpbiAnc3RydWN0IGV4cHJlc3Npb24nLiAgRnVydGhlcm1vcmUsCisgICAxLiBpbiB0aGUgR05VIEMgTGlicmFyeSBsaWJyYXJ5LCB0aGUgbmFtZXMgaGF2ZSBhIF9fIHByZWZpeCwKKyAgIDIuKzMuIGluIHRoZSBHTlUgbGliaW50bCBsaWJyYXJ5IGFuZCBpbiB0aGUgR05VIGdldHRleHQgdG9vbHMsIHRoZSBuYW1lcworICAgICAgICAgbXVzdCBmb2xsb3cgQU5TSSBDIGFuZCBub3Qgc3RhcnQgd2l0aCBfXy4KKyAgIFNvIHdlIGhhdmUgdG8gZGlzdGluZ3Vpc2ggdGhlIHRocmVlIGNhc2VzLiAgKi8KKyNpZmRlZiBfTElCQworIyBkZWZpbmUgRlJFRV9FWFBSRVNTSU9OIF9fZ2V0dGV4dF9mcmVlX2V4cAorIyBkZWZpbmUgUExVUkFMX1BBUlNFIF9fZ2V0dGV4dHBhcnNlCisjIGRlZmluZSBHRVJNQU5JQ19QTFVSQUwgX19nZXR0ZXh0X2dlcm1hbmljX3BsdXJhbAorIyBkZWZpbmUgRVhUUkFDVF9QTFVSQUxfRVhQUkVTU0lPTiBfX2dldHRleHRfZXh0cmFjdF9wbHVyYWwKKyNlbGlmIGRlZmluZWQgKElOX0xJQklOVEwpCisjIGRlZmluZSBGUkVFX0VYUFJFU1NJT04gbGliaW50bF9nZXR0ZXh0X2ZyZWVfZXhwCisjIGRlZmluZSBQTFVSQUxfUEFSU0UgbGliaW50bF9nZXR0ZXh0cGFyc2UKKyMgZGVmaW5lIEdFUk1BTklDX1BMVVJBTCBsaWJpbnRsX2dldHRleHRfZ2VybWFuaWNfcGx1cmFsCisjIGRlZmluZSBFWFRSQUNUX1BMVVJBTF9FWFBSRVNTSU9OIGxpYmludGxfZ2V0dGV4dF9leHRyYWN0X3BsdXJhbAorI2Vsc2UKKyMgZGVmaW5lIEZSRUVfRVhQUkVTU0lPTiBmcmVlX3BsdXJhbF9leHByZXNzaW9uCisjIGRlZmluZSBQTFVSQUxfUEFSU0UgcGFyc2VfcGx1cmFsX2V4cHJlc3Npb24KKyMgZGVmaW5lIEdFUk1BTklDX1BMVVJBTCBnZXJtYW5pY19wbHVyYWwKKyMgZGVmaW5lIEVYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gZXh0cmFjdF9wbHVyYWxfZXhwcmVzc2lvbgorI2VuZGlmCisKK2V4dGVybiB2b2lkIEZSRUVfRVhQUkVTU0lPTiAoc3RydWN0IGV4cHJlc3Npb24gKmV4cCkKKyAgICAgaW50ZXJuYWxfZnVuY3Rpb247CitleHRlcm4gaW50IFBMVVJBTF9QQVJTRSAodm9pZCAqYXJnKTsKK2V4dGVybiBzdHJ1Y3QgZXhwcmVzc2lvbiBHRVJNQU5JQ19QTFVSQUwgYXR0cmlidXRlX2hpZGRlbjsKK2V4dGVybiB2b2lkIEVYVFJBQ1RfUExVUkFMX0VYUFJFU1NJT04gKGNvbnN0IGNoYXIgKm51bGxlbnRyeSwKKwkJCQkgICAgICAgc3RydWN0IGV4cHJlc3Npb24gKipwbHVyYWxwLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGludCAqbnBsdXJhbHNwKQorICAgICBpbnRlcm5hbF9mdW5jdGlvbjsKKworI2lmICFkZWZpbmVkIChfTElCQykgJiYgIWRlZmluZWQgKElOX0xJQklOVEwpCitleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgcGx1cmFsX2V2YWwgKHN0cnVjdCBleHByZXNzaW9uICpwZXhwLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgaW50IG4pOworI2VuZGlmCisKKyNlbmRpZiAvKiBfUExVUkFMX0VYUF9IICovCmRpZmYgLS1naXQgYS91bml4L2ludGwvcGx1cmFsLmMgYi91bml4L2ludGwvcGx1cmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0OTRmOQotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9wbHVyYWwuYwpAQCAtMCwwICsxLDE0OTAgQEAKKy8qIEEgQmlzb24gcGFyc2VyLCBtYWRlIGZyb20gcGx1cmFsLnkKKyAgIGJ5IEdOVSBiaXNvbiAxLjM1LiAgKi8KKworI2RlZmluZSBZWUJJU09OIDEgIC8qIElkZW50aWZ5IEJpc29uIG91dHB1dC4gICovCisKKyNkZWZpbmUgeXlwYXJzZSBfX2dldHRleHRwYXJzZQorI2RlZmluZSB5eWxleCBfX2dldHRleHRsZXgKKyNkZWZpbmUgeXllcnJvciBfX2dldHRleHRlcnJvcgorI2RlZmluZSB5eWx2YWwgX19nZXR0ZXh0bHZhbAorI2RlZmluZSB5eWNoYXIgX19nZXR0ZXh0Y2hhcgorI2RlZmluZSB5eWRlYnVnIF9fZ2V0dGV4dGRlYnVnCisjZGVmaW5lIHl5bmVycnMgX19nZXR0ZXh0bmVycnMKKyMgZGVmaW5lCUVRVU9QMgkyNTcKKyMgZGVmaW5lCUNNUE9QMgkyNTgKKyMgZGVmaW5lCUFERE9QMgkyNTkKKyMgZGVmaW5lCU1VTE9QMgkyNjAKKyMgZGVmaW5lCU5VTUJFUgkyNjEKKworI2xpbmUgMSAicGx1cmFsLnkiCisKKy8qIEV4cHJlc3Npb24gcGFyc2luZyBmb3IgcGx1cmFsIGZvcm0gc2VsZWN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworLyogVGhlIGJpc29uIGdlbmVyYXRlZCBwYXJzZXIgdXNlcyBhbGxvY2EuICBBSVggMyBmb3JjZXMgdXMgdG8gcHV0IHRoaXMKKyAgIGRlY2xhcmF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuICBUaGUgZGVjbGFyYXRpb24gaW4gYmlzb24ncworICAgc2tlbGV0b24gZmlsZSBjb21lcyB0b28gbGF0ZS4gIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+CisgICBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUgYXJiaXRyYXJ5IHN5c3RlbSBoZWFkZXJzLiAgKi8KKyNpZiBkZWZpbmVkIF9BSVggJiYgIWRlZmluZWQgX19HTlVDX18KKyAjcHJhZ21hIGFsbG9jYQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJwbHVyYWwtZXhwLmgiCisKKy8qIFRoZSBtYWluIGZ1bmN0aW9uIGdlbmVyYXRlZCBieSB0aGUgcGFyc2VyIGlzIGNhbGxlZCBfX2dldHRleHRwYXJzZSwKKyAgIGJ1dCB3ZSB3YW50IGl0IHRvIGJlIGNhbGxlZCBQTFVSQUxfUEFSU0UuICAqLworI2lmbmRlZiBfTElCQworIyBkZWZpbmUgX19nZXR0ZXh0cGFyc2UgUExVUkFMX1BBUlNFCisjZW5kaWYKKworI2RlZmluZSBZWUxFWF9QQVJBTQkmKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5jcAorI2RlZmluZSBZWVBBUlNFX1BBUkFNCWFyZworCisjbGluZSA0OSAicGx1cmFsLnkiCisjaWZuZGVmIFlZU1RZUEUKK3R5cGVkZWYgdW5pb24geworICB1bnNpZ25lZCBsb25nIGludCBudW07CisgIGVudW0gb3BlcmF0b3Igb3A7CisgIHN0cnVjdCBleHByZXNzaW9uICpleHA7Cit9IHl5c3R5cGU7CisjIGRlZmluZSBZWVNUWVBFIHl5c3R5cGUKKyMgZGVmaW5lIFlZU1RZUEVfSVNfVFJJVklBTCAxCisjZW5kaWYKKyNsaW5lIDU1ICJwbHVyYWwueSIKKworLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KK3N0YXRpYyBpbnQgeXlsZXggKFlZU1RZUEUgKmx2YWwsIGNvbnN0IGNoYXIgKipwZXhwKTsKK3N0YXRpYyB2b2lkIHl5ZXJyb3IgKGNvbnN0IGNoYXIgKnN0cik7CisKKy8qIEFsbG9jYXRpb24gb2YgZXhwcmVzc2lvbnMuICAqLworCitzdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gKgorbmV3X2V4cCAoaW50IG5hcmdzLCBlbnVtIG9wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqIGNvbnN0ICphcmdzKQoreworICBpbnQgaTsKKyAgc3RydWN0IGV4cHJlc3Npb24gKm5ld3A7CisKKyAgLyogSWYgYW55IG9mIHRoZSBhcmd1bWVudCBjb3VsZCBub3QgYmUgbWFsbG9jJ2VkLCBqdXN0IHJldHVybiBOVUxMLiAgKi8KKyAgZm9yIChpID0gbmFyZ3MgLSAxOyBpID49IDA7IGktLSkKKyAgICBpZiAoYXJnc1tpXSA9PSBOVUxMKQorICAgICAgZ290byBmYWlsOworCisgIC8qIEFsbG9jYXRlIGEgbmV3IGV4cHJlc3Npb24uICAqLworICBuZXdwID0gKHN0cnVjdCBleHByZXNzaW9uICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3cCkpOworICBpZiAobmV3cCAhPSBOVUxMKQorICAgIHsKKyAgICAgIG5ld3AtPm5hcmdzID0gbmFyZ3M7CisgICAgICBuZXdwLT5vcGVyYXRpb24gPSBvcDsKKyAgICAgIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCisJbmV3cC0+dmFsLmFyZ3NbaV0gPSBhcmdzW2ldOworICAgICAgcmV0dXJuIG5ld3A7CisgICAgfQorCisgZmFpbDoKKyAgZm9yIChpID0gbmFyZ3MgLSAxOyBpID49IDA7IGktLSkKKyAgICBGUkVFX0VYUFJFU1NJT04gKGFyZ3NbaV0pOworCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBleHByZXNzaW9uICoKK25ld19leHBfMCAoZW51bSBvcGVyYXRvciBvcCkKK3sKKyAgcmV0dXJuIG5ld19leHAgKDAsIG9wLCBOVUxMKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCituZXdfZXhwXzEgKGVudW0gb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpyaWdodCkKK3sKKyAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbMV07CisKKyAgYXJnc1swXSA9IHJpZ2h0OworICByZXR1cm4gbmV3X2V4cCAoMSwgb3AsIGFyZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGV4cHJlc3Npb24gKgorbmV3X2V4cF8yIChlbnVtIG9wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqbGVmdCwgc3RydWN0IGV4cHJlc3Npb24gKnJpZ2h0KQoreworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1syXTsKKworICBhcmdzWzBdID0gbGVmdDsKKyAgYXJnc1sxXSA9IHJpZ2h0OworICByZXR1cm4gbmV3X2V4cCAoMiwgb3AsIGFyZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBleHByZXNzaW9uICoKK25ld19leHBfMyAoZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKmJleHAsCisJICAgc3RydWN0IGV4cHJlc3Npb24gKnRicmFuY2gsIHN0cnVjdCBleHByZXNzaW9uICpmYnJhbmNoKQoreworICBzdHJ1Y3QgZXhwcmVzc2lvbiAqYXJnc1szXTsKKworICBhcmdzWzBdID0gYmV4cDsKKyAgYXJnc1sxXSA9IHRicmFuY2g7CisgIGFyZ3NbMl0gPSBmYnJhbmNoOworICByZXR1cm4gbmV3X2V4cCAoMywgb3AsIGFyZ3MpOworfQorCisjaWZuZGVmIFlZREVCVUcKKyMgZGVmaW5lIFlZREVCVUcgMAorI2VuZGlmCisKKworCisjZGVmaW5lCVlZRklOQUwJCTI3CisjZGVmaW5lCVlZRkxBRwkJLTMyNzY4CisjZGVmaW5lCVlZTlRCQVNFCTE2CisKKy8qIFlZVFJBTlNMQVRFKFlZTEVYKSAtLSBCaXNvbiB0b2tlbiBudW1iZXIgY29ycmVzcG9uZGluZyB0byBZWUxFWC4gKi8KKyNkZWZpbmUgWVlUUkFOU0xBVEUoeCkgKCh1bnNpZ25lZCkoeCkgPD0gMjYxID8geXl0cmFuc2xhdGVbeF0gOiAxOCkKKworLyogWVlUUkFOU0xBVEVbWVlMRVhdIC0tIEJpc29uIHRva2VuIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAqLworc3RhdGljIGNvbnN0IGNoYXIgeXl0cmFuc2xhdGVbXSA9Cit7CisgICAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAxMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICA1LCAgICAgMiwKKyAgICAgIDE0LCAgICAxNSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAxMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgMTMsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDQsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgNiwgICAgIDcsICAgICA4LAorICAgICAgIDksICAgIDExCit9OworCisjaWYgWVlERUJVRworc3RhdGljIGNvbnN0IHNob3J0IHl5cHJoc1tdID0KK3sKKyAgICAgICAwLCAgICAgMCwgICAgIDIsICAgICA4LCAgICAxMiwgICAgMTYsICAgIDIwLCAgICAyNCwgICAgMjgsICAgIDMyLAorICAgICAgMzUsICAgIDM3LCAgICAzOQorfTsKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXJoc1tdID0KK3sKKyAgICAgIDE3LCAgICAgMCwgICAgMTcsICAgICAzLCAgICAxNywgICAgMTIsICAgIDE3LCAgICAgMCwgICAgMTcsICAgICA0LAorICAgICAgMTcsICAgICAwLCAgICAxNywgICAgIDUsICAgIDE3LCAgICAgMCwgICAgMTcsICAgICA2LCAgICAxNywgICAgIDAsCisgICAgICAxNywgICAgIDcsICAgIDE3LCAgICAgMCwgICAgMTcsICAgICA4LCAgICAxNywgICAgIDAsICAgIDE3LCAgICAgOSwKKyAgICAgIDE3LCAgICAgMCwgICAgMTAsICAgIDE3LCAgICAgMCwgICAgMTMsICAgICAwLCAgICAxMSwgICAgIDAsICAgIDE0LAorICAgICAgMTcsICAgIDE1LCAgICAgMAorfTsKKworI2VuZGlmCisKKyNpZiBZWURFQlVHCisvKiBZWVJMSU5FW1lZTl0gLS0gc291cmNlIGxpbmUgd2hlcmUgcnVsZSBudW1iZXIgWVlOIHdhcyBkZWZpbmVkLiAqLworc3RhdGljIGNvbnN0IHNob3J0IHl5cmxpbmVbXSA9Cit7CisgICAgICAgMCwgICAxNTAsICAgMTU4LCAgIDE2MiwgICAxNjYsICAgMTcwLCAgIDE3NCwgICAxNzgsICAgMTgyLCAgIDE4NiwKKyAgICAgMTkwLCAgIDE5NCwgICAxOTkKK307CisjZW5kaWYKKworCisjaWYgKFlZREVCVUcpIHx8IGRlZmluZWQgWVlFUlJPUl9WRVJCT1NFCisKKy8qIFlZVE5BTUVbVE9LRU5fTlVNXSAtLSBTdHJpbmcgbmFtZSBvZiB0aGUgdG9rZW4gVE9LRU5fTlVNLiAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHl5dG5hbWVbXSA9Cit7CisgICIkIiwgImVycm9yIiwgIiR1bmRlZmluZWQuIiwgIic/JyIsICInfCciLCAiJyYnIiwgIkVRVU9QMiIsICJDTVBPUDIiLCAKKyAgIkFERE9QMiIsICJNVUxPUDIiLCAiJyEnIiwgIk5VTUJFUiIsICInOiciLCAiJ24nIiwgIicoJyIsICInKSciLCAKKyAgInN0YXJ0IiwgImV4cCIsIDAKK307CisjZW5kaWYKKworLyogWVlSMVtZWU5dIC0tIFN5bWJvbCBudW1iZXIgb2Ygc3ltYm9sIHRoYXQgcnVsZSBZWU4gZGVyaXZlcy4gKi8KK3N0YXRpYyBjb25zdCBzaG9ydCB5eXIxW10gPQoreworICAgICAgIDAsICAgIDE2LCAgICAxNywgICAgMTcsICAgIDE3LCAgICAxNywgICAgMTcsICAgIDE3LCAgICAxNywgICAgMTcsCisgICAgICAxNywgICAgMTcsICAgIDE3Cit9OworCisvKiBZWVIyW1lZTl0gLS0gTnVtYmVyIG9mIHN5bWJvbHMgY29tcG9zaW5nIHJpZ2h0IGhhbmQgc2lkZSBvZiBydWxlIFlZTi4gKi8KK3N0YXRpYyBjb25zdCBzaG9ydCB5eXIyW10gPQoreworICAgICAgIDAsICAgICAxLCAgICAgNSwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDIsCisgICAgICAgMSwgICAgIDEsICAgICAzCit9OworCisvKiBZWURFRkFDVFtTXSAtLSBkZWZhdWx0IHJ1bGUgdG8gcmVkdWNlIHdpdGggaW4gc3RhdGUgUyB3aGVuIFlZVEFCTEUKKyAgIGRvZXNuJ3Qgc3BlY2lmeSBzb21ldGhpbmcgZWxzZSB0byBkby4gIFplcm8gbWVhbnMgdGhlIGRlZmF1bHQgaXMgYW4KKyAgIGVycm9yLiAqLworc3RhdGljIGNvbnN0IHNob3J0IHl5ZGVmYWN0W10gPQoreworICAgICAgIDAsICAgICAwLCAgICAxMSwgICAgMTAsICAgICAwLCAgICAgMSwgICAgIDksICAgICAwLCAgICAgMCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDEyLCAgICAgMCwgICAgIDMsICAgICA0LCAgICAgNSwKKyAgICAgICA2LCAgICAgNywgICAgIDgsICAgICAwLCAgICAgMiwgICAgIDAsICAgICAwLCAgICAgMAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHl5ZGVmZ290b1tdID0KK3sKKyAgICAgIDI1LCAgICAgNQorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHl5cGFjdFtdID0KK3sKKyAgICAgIC05LCAgICAtOSwtMzI3NjgsLTMyNzY4LCAgICAtOSwgICAgMzQsLTMyNzY4LCAgICAxMSwgICAgLTksICAgIC05LAorICAgICAgLTksICAgIC05LCAgICAtOSwgICAgLTksICAgIC05LC0zMjc2OCwgICAgMjQsICAgIDM5LCAgICA0MywgICAgMTYsCisgICAgICAyNiwgICAgLTMsLTMyNzY4LCAgICAtOSwgICAgMzQsICAgIDIxLCAgICA1MywtMzI3NjgKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXBnb3RvW10gPQoreworICAtMzI3NjgsICAgIC0xCit9OworCisKKyNkZWZpbmUJWVlMQVNUCQk1MworCisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXRhYmxlW10gPQoreworICAgICAgIDYsICAgICAxLCAgICAgMiwgICAgIDcsICAgICAzLCAgICAgNCwgICAgMTQsICAgIDE2LCAgICAxNywgICAgMTgsCisgICAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywKKyAgICAgIDE0LCAgICAyNiwgICAgMjQsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAgOCwgICAgIDksICAgIDEwLAorICAgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDEzLCAgICAxNCwgICAgMjMsICAgICA4LCAgICAgOSwgICAgMTAsCisgICAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxMSwKKyAgICAgIDEyLCAgICAxMywgICAgMTQsICAgIDI3Cit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgeXljaGVja1tdID0KK3sKKyAgICAgICAxLCAgICAxMCwgICAgMTEsICAgICA0LCAgICAxMywgICAgMTQsICAgICA5LCAgICAgOCwgICAgIDksICAgIDEwLAorICAgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsCisgICAgICAgOSwgICAgIDAsICAgIDIzLCAgICAgNywgICAgIDgsICAgICA5LCAgICAxNSwgICAgIDMsICAgICA0LCAgICAgNSwKKyAgICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAgOCwgICAgIDksICAgIDEyLCAgICAgMywgICAgIDQsICAgICA1LAorICAgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgIDYsCisgICAgICAgNywgICAgIDgsICAgICA5LCAgICAgMAorfTsKKyNkZWZpbmUgWVlQVVJFIDEKKworLyogLSotQy0qLSAgTm90ZSBzb21lIGNvbXBpbGVycyBjaG9rZSBvbiBjb21tZW50cyBvbiBgI2xpbmUnIGxpbmVzLiAgKi8KKyNsaW5lIDMgIi91c3IvbG9jYWwvc2hhcmUvYmlzb24vYmlzb24uc2ltcGxlIgorCisvKiBTa2VsZXRvbiBvdXRwdXQgcGFyc2VyIGZvciBiaXNvbiwKKworICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwLCAyMDAwLCAyMDAxLCAyMDAyIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKy8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHdoZW4gdGhpcyBmaWxlIGlzIGNvcGllZCBieSBCaXNvbiBpbnRvIGEKKyAgIEJpc29uIG91dHB1dCBmaWxlLCB5b3UgbWF5IHVzZSB0aGF0IG91dHB1dCBmaWxlIHdpdGhvdXQgcmVzdHJpY3Rpb24uCisgICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgICBpbiB2ZXJzaW9uIDEuMjQgb2YgQmlzb24uICAqLworCisvKiBUaGlzIGlzIHRoZSBwYXJzZXIgY29kZSB0aGF0IGlzIHdyaXR0ZW4gaW50byBlYWNoIGJpc29uIHBhcnNlciB3aGVuCisgICB0aGUgJXNlbWFudGljX3BhcnNlciBkZWNsYXJhdGlvbiBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBncmFtbWFyLgorICAgSXQgd2FzIHdyaXR0ZW4gYnkgUmljaGFyZCBTdGFsbG1hbiBieSBzaW1wbGlmeWluZyB0aGUgaGFpcnkgcGFyc2VyCisgICB1c2VkIHdoZW4gJXNlbWFudGljX3BhcnNlciBpcyBzcGVjaWZpZWQuICAqLworCisvKiBBbGwgc3ltYm9scyBkZWZpbmVkIGJlbG93IHNob3VsZCBiZWdpbiB3aXRoIHl5IG9yIFlZLCB0byBhdm9pZAorICAgaW5mcmluZ2luZyBvbiB1c2VyIG5hbWUgc3BhY2UuICBUaGlzIHNob3VsZCBiZSBkb25lIGV2ZW4gZm9yIGxvY2FsCisgICB2YXJpYWJsZXMsIGFzIHRoZXkgbWlnaHQgb3RoZXJ3aXNlIGJlIGV4cGFuZGVkIGJ5IHVzZXIgbWFjcm9zLgorICAgVGhlcmUgYXJlIHNvbWUgdW5hdm9pZGFibGUgZXhjZXB0aW9ucyB3aXRoaW4gaW5jbHVkZSBmaWxlcyB0bworICAgZGVmaW5lIG5lY2Vzc2FyeSBsaWJyYXJ5IHN5bWJvbHM7IHRoZXkgYXJlIG5vdGVkICJJTkZSSU5HRVMgT04KKyAgIFVTRVIgTkFNRSBTUEFDRSIgYmVsb3cuICAqLworCisjaWYgISBkZWZpbmVkICh5eW92ZXJmbG93KSB8fCBkZWZpbmVkIChZWUVSUk9SX1ZFUkJPU0UpCisKKy8qIFRoZSBwYXJzZXIgaW52b2tlcyBhbGxvY2Egb3IgbWFsbG9jOyBkZWZpbmUgdGhlIG5lY2Vzc2FyeSBzeW1ib2xzLiAgKi8KKworIyBpZiBZWVNUQUNLX1VTRV9BTExPQ0EKKyMgIGRlZmluZSBZWVNUQUNLX0FMTE9DIGFsbG9jYQorIyBlbHNlCisjICBpZm5kZWYgWVlTVEFDS19VU0VfQUxMT0NBCisjICAgaWYgZGVmaW5lZCAoYWxsb2NhKSB8fCBkZWZpbmVkIChfQUxMT0NBX0gpCisjICAgIGRlZmluZSBZWVNUQUNLX0FMTE9DIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZkZWYgX19HTlVDX18KKyMgICAgIGRlZmluZSBZWVNUQUNLX0FMTE9DIF9fYnVpbHRpbl9hbGxvY2EKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZmRlZiBZWVNUQUNLX0FMTE9DCisgICAvKiBQYWNpZnkgR0NDJ3MgYGVtcHR5IGlmLWJvZHknIHdhcm5pbmcuICovCisjICBkZWZpbmUgWVlTVEFDS19GUkVFKFB0cikgZG8geyAvKiBlbXB0eSAqLzsgfSB3aGlsZSAoMCkKKyMgZWxzZQorIyAgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICAgZGVmaW5lIFlZU0laRV9UIHNpemVfdAorIyAgZW5kaWYKKyMgIGRlZmluZSBZWVNUQUNLX0FMTE9DIG1hbGxvYworIyAgZGVmaW5lIFlZU1RBQ0tfRlJFRSBmcmVlCisjIGVuZGlmCisjZW5kaWYgLyogISBkZWZpbmVkICh5eW92ZXJmbG93KSB8fCBkZWZpbmVkIChZWUVSUk9SX1ZFUkJPU0UpICovCisKKworI2lmICghIGRlZmluZWQgKHl5b3ZlcmZsb3cpIFwKKyAgICAgJiYgKCEgZGVmaW5lZCAoX19jcGx1c3BsdXMpIFwKKwkgfHwgKFlZTFRZUEVfSVNfVFJJVklBTCAmJiBZWVNUWVBFX0lTX1RSSVZJQUwpKSkKKworLyogQSB0eXBlIHRoYXQgaXMgcHJvcGVybHkgYWxpZ25lZCBmb3IgYW55IHN0YWNrIG1lbWJlci4gICovCit1bmlvbiB5eWFsbG9jCit7CisgIHNob3J0IHl5c3M7CisgIFlZU1RZUEUgeXl2czsKKyMgaWYgWVlMU1BfTkVFREVECisgIFlZTFRZUEUgeXlsczsKKyMgZW5kaWYKK307CisKKy8qIFRoZSBzaXplIG9mIHRoZSBtYXhpbXVtIGdhcCBiZXR3ZWVuIG9uZSBhbGlnbmVkIHN0YWNrIGFuZCB0aGUgbmV4dC4gICovCisjIGRlZmluZSBZWVNUQUNLX0dBUF9NQVggKHNpemVvZiAodW5pb24geXlhbGxvYykgLSAxKQorCisvKiBUaGUgc2l6ZSBvZiBhbiBhcnJheSBsYXJnZSB0byBlbm91Z2ggdG8gaG9sZCBhbGwgc3RhY2tzLCBlYWNoIHdpdGgKKyAgIE4gZWxlbWVudHMuICAqLworIyBpZiBZWUxTUF9ORUVERUQKKyMgIGRlZmluZSBZWVNUQUNLX0JZVEVTKE4pIFwKKyAgICAgKChOKSAqIChzaXplb2YgKHNob3J0KSArIHNpemVvZiAoWVlTVFlQRSkgKyBzaXplb2YgKFlZTFRZUEUpKQlcCisgICAgICArIDIgKiBZWVNUQUNLX0dBUF9NQVgpCisjIGVsc2UKKyMgIGRlZmluZSBZWVNUQUNLX0JZVEVTKE4pIFwKKyAgICAgKChOKSAqIChzaXplb2YgKHNob3J0KSArIHNpemVvZiAoWVlTVFlQRSkpCQkJCVwKKyAgICAgICsgWVlTVEFDS19HQVBfTUFYKQorIyBlbmRpZgorCisvKiBDb3B5IENPVU5UIG9iamVjdHMgZnJvbSBGUk9NIHRvIFRPLiAgVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZG8KKyAgIG5vdCBvdmVybGFwLiAgKi8KKyMgaWZuZGVmIFlZQ09QWQorIyAgaWYgMSA8IF9fR05VQ19fCisjICAgZGVmaW5lIFlZQ09QWShUbywgRnJvbSwgQ291bnQpIFwKKyAgICAgIF9fYnVpbHRpbl9tZW1jcHkgKFRvLCBGcm9tLCAoQ291bnQpICogc2l6ZW9mICgqKEZyb20pKSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgWVlDT1BZKFRvLCBGcm9tLCBDb3VudCkJCVwKKyAgICAgIGRvCQkJCQlcCisJewkJCQkJXAorCSAgcmVnaXN0ZXIgWVlTSVpFX1QgeXlpOwkJXAorCSAgZm9yICh5eWkgPSAwOyB5eWkgPCAoQ291bnQpOyB5eWkrKykJXAorCSAgICAoVG8pW3l5aV0gPSAoRnJvbSlbeXlpXTsJCVwKKwl9CQkJCQlcCisgICAgICB3aGlsZSAoMCkKKyMgIGVuZGlmCisjIGVuZGlmCisKKy8qIFJlbG9jYXRlIFNUQUNLIGZyb20gaXRzIG9sZCBsb2NhdGlvbiB0byB0aGUgbmV3IG9uZS4gIFRoZQorICAgbG9jYWwgdmFyaWFibGVzIFlZU0laRSBhbmQgWVlTVEFDS1NJWkUgZ2l2ZSB0aGUgb2xkIGFuZCBuZXcgbnVtYmVyIG9mCisgICBlbGVtZW50cyBpbiB0aGUgc3RhY2ssIGFuZCBZWVBUUiBnaXZlcyB0aGUgbmV3IGxvY2F0aW9uIG9mIHRoZQorICAgc3RhY2suICBBZHZhbmNlIFlZUFRSIHRvIGEgcHJvcGVybHkgYWxpZ25lZCBsb2NhdGlvbiBmb3IgdGhlIG5leHQKKyAgIHN0YWNrLiAgKi8KKyMgZGVmaW5lIFlZU1RBQ0tfUkVMT0NBVEUoU3RhY2spCQkJCQlcCisgICAgZG8JCQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCVlZU0laRV9UIHl5bmV3Ynl0ZXM7CQkJCQkJXAorCVlZQ09QWSAoJnl5cHRyLT5TdGFjaywgU3RhY2ssIHl5c2l6ZSk7CQkJCVwKKwlTdGFjayA9ICZ5eXB0ci0+U3RhY2s7CQkJCQkJXAorCXl5bmV3Ynl0ZXMgPSB5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKlN0YWNrKSArIFlZU1RBQ0tfR0FQX01BWDsJXAorCXl5cHRyICs9IHl5bmV3Ynl0ZXMgLyBzaXplb2YgKCp5eXB0cik7CQkJCVwKKyAgICAgIH0JCQkJCQkJCQlcCisgICAgd2hpbGUgKDApCisKKyNlbmRpZgorCisKKyNpZiAhIGRlZmluZWQgKFlZU0laRV9UKSAmJiBkZWZpbmVkIChfX1NJWkVfVFlQRV9fKQorIyBkZWZpbmUgWVlTSVpFX1QgX19TSVpFX1RZUEVfXworI2VuZGlmCisjaWYgISBkZWZpbmVkIChZWVNJWkVfVCkgJiYgZGVmaW5lZCAoc2l6ZV90KQorIyBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90CisjZW5kaWYKKyNpZiAhIGRlZmluZWQgKFlZU0laRV9UKQorIyBpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCisjICBpbmNsdWRlIDxzdGRkZWYuaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgZGVmaW5lIFlZU0laRV9UIHNpemVfdAorIyBlbmRpZgorI2VuZGlmCisjaWYgISBkZWZpbmVkIChZWVNJWkVfVCkKKyMgZGVmaW5lIFlZU0laRV9UIHVuc2lnbmVkIGludAorI2VuZGlmCisKKyNkZWZpbmUgeXllcnJvawkJKHl5ZXJyc3RhdHVzID0gMCkKKyNkZWZpbmUgeXljbGVhcmluCSh5eWNoYXIgPSBZWUVNUFRZKQorI2RlZmluZSBZWUVNUFRZCQktMgorI2RlZmluZSBZWUVPRgkJMAorI2RlZmluZSBZWUFDQ0VQVAlnb3RvIHl5YWNjZXB0bGFiCisjZGVmaW5lIFlZQUJPUlQgCWdvdG8geXlhYm9ydGxhYgorI2RlZmluZSBZWUVSUk9SCQlnb3RvIHl5ZXJybGFiMQorLyogTGlrZSBZWUVSUk9SIGV4Y2VwdCBkbyBjYWxsIHl5ZXJyb3IuICBUaGlzIHJlbWFpbnMgaGVyZSB0ZW1wb3JhcmlseQorICAgdG8gZWFzZSB0aGUgdHJhbnNpdGlvbiB0byB0aGUgbmV3IG1lYW5pbmcgb2YgWVlFUlJPUiwgZm9yIEdDQy4KKyAgIE9uY2UgR0NDIHZlcnNpb24gMiBoYXMgc3VwcGxhbnRlZCB2ZXJzaW9uIDEsIHRoaXMgY2FuIGdvLiAgKi8KKyNkZWZpbmUgWVlGQUlMCQlnb3RvIHl5ZXJybGFiCisjZGVmaW5lIFlZUkVDT1ZFUklORygpICAoISF5eWVycnN0YXR1cykKKyNkZWZpbmUgWVlCQUNLVVAoVG9rZW4sIFZhbHVlKQkJCQkJXAorZG8JCQkJCQkJCVwKKyAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZICYmIHl5bGVuID09IDEpCQkJCVwKKyAgICB7CQkJCQkJCQlcCisgICAgICB5eWNoYXIgPSAoVG9rZW4pOwkJCQkJCVwKKyAgICAgIHl5bHZhbCA9IChWYWx1ZSk7CQkJCQkJXAorICAgICAgeXljaGFyMSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwkJCQlcCisgICAgICBZWVBPUFNUQUNLOwkJCQkJCVwKKyAgICAgIGdvdG8geXliYWNrdXA7CQkJCQkJXAorICAgIH0JCQkJCQkJCVwKKyAgZWxzZQkJCQkJCQkJXAorICAgIHsgCQkJCQkJCQlcCisgICAgICB5eWVycm9yICgic3ludGF4IGVycm9yOiBjYW5ub3QgYmFjayB1cCIpOwkJCVwKKyAgICAgIFlZRVJST1I7CQkJCQkJCVwKKyAgICB9CQkJCQkJCQlcCit3aGlsZSAoMCkKKworI2RlZmluZSBZWVRFUlJPUgkxCisjZGVmaW5lIFlZRVJSQ09ERQkyNTYKKworCisvKiBZWUxMT0NfREVGQVVMVCAtLSBDb21wdXRlIHRoZSBkZWZhdWx0IGxvY2F0aW9uIChiZWZvcmUgdGhlIGFjdGlvbnMKKyAgIGFyZSBydW4pLgorCisgICBXaGVuIFlZTExPQ19ERUZBVUxUIGlzIHJ1biwgQ1VSUkVOVCBpcyBzZXQgdGhlIGxvY2F0aW9uIG9mIHRoZQorICAgZmlyc3QgdG9rZW4uICBCeSBkZWZhdWx0LCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgcmFuZ2VzLCBleHRlbmQKKyAgIGl0cyByYW5nZSB0byB0aGUgbGFzdCBzeW1ib2wuICAqLworCisjaWZuZGVmIFlZTExPQ19ERUZBVUxUCisjIGRlZmluZSBZWUxMT0NfREVGQVVMVChDdXJyZW50LCBSaHMsIE4pICAgICAgIAlcCisgICBDdXJyZW50Lmxhc3RfbGluZSAgID0gUmhzW05dLmxhc3RfbGluZTsJXAorICAgQ3VycmVudC5sYXN0X2NvbHVtbiA9IFJoc1tOXS5sYXN0X2NvbHVtbjsKKyNlbmRpZgorCisKKy8qIFlZTEVYIC0tIGNhbGxpbmcgYHl5bGV4JyB3aXRoIHRoZSByaWdodCBhcmd1bWVudHMuICAqLworCisjaWYgWVlQVVJFCisjIGlmIFlZTFNQX05FRURFRAorIyAgaWZkZWYgWVlMRVhfUEFSQU0KKyMgICBkZWZpbmUgWVlMRVgJCXl5bGV4ICgmeXlsdmFsLCAmeXlsbG9jLCBZWUxFWF9QQVJBTSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgWVlMRVgJCXl5bGV4ICgmeXlsdmFsLCAmeXlsbG9jKQorIyAgZW5kaWYKKyMgZWxzZSAvKiAhWVlMU1BfTkVFREVEICovCisjICBpZmRlZiBZWUxFWF9QQVJBTQorIyAgIGRlZmluZSBZWUxFWAkJeXlsZXggKCZ5eWx2YWwsIFlZTEVYX1BBUkFNKQorIyAgZWxzZQorIyAgIGRlZmluZSBZWUxFWAkJeXlsZXggKCZ5eWx2YWwpCisjICBlbmRpZgorIyBlbmRpZiAvKiAhWVlMU1BfTkVFREVEICovCisjZWxzZSAvKiAhWVlQVVJFICovCisjIGRlZmluZSBZWUxFWAkJCXl5bGV4ICgpCisjZW5kaWYgLyogIVlZUFVSRSAqLworCisKKy8qIEVuYWJsZSBkZWJ1Z2dpbmcgaWYgcmVxdWVzdGVkLiAgKi8KKyNpZiBZWURFQlVHCisKKyMgaWZuZGVmIFlZRlBSSU5URgorIyAgaW5jbHVkZSA8c3RkaW8uaD4gLyogSU5GUklOR0VTIE9OIFVTRVIgTkFNRSBTUEFDRSAqLworIyAgZGVmaW5lIFlZRlBSSU5URiBmcHJpbnRmCisjIGVuZGlmCisKKyMgZGVmaW5lIFlZRFBSSU5URihBcmdzKQkJCVwKK2RvIHsJCQkJCQlcCisgIGlmICh5eWRlYnVnKQkJCQkJXAorICAgIFlZRlBSSU5URiBBcmdzOwkJCQlcCit9IHdoaWxlICgwKQorLyogTm9uemVybyBtZWFucyBwcmludCBwYXJzZSB0cmFjZS4gIEl0IGlzIGxlZnQgdW5pbml0aWFsaXplZCBzbyB0aGF0CisgICBtdWx0aXBsZSBwYXJzZXJzIGNhbiBjb2V4aXN0LiAgKi8KK2ludCB5eWRlYnVnOworI2Vsc2UgLyogIVlZREVCVUcgKi8KKyMgZGVmaW5lIFlZRFBSSU5URihBcmdzKQorI2VuZGlmIC8qICFZWURFQlVHICovCisKKy8qIFlZSU5JVERFUFRIIC0tIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGFyc2VyJ3Mgc3RhY2tzLiAgKi8KKyNpZm5kZWYJWVlJTklUREVQVEgKKyMgZGVmaW5lIFlZSU5JVERFUFRIIDIwMAorI2VuZGlmCisKKy8qIFlZTUFYREVQVEggLS0gbWF4aW11bSBzaXplIHRoZSBzdGFja3MgY2FuIGdyb3cgdG8gKGVmZmVjdGl2ZSBvbmx5CisgICBpZiB0aGUgYnVpbHQtaW4gc3RhY2sgZXh0ZW5zaW9uIG1ldGhvZCBpcyB1c2VkKS4KKworICAgRG8gbm90IG1ha2UgdGhpcyB2YWx1ZSB0b28gbGFyZ2U7IHRoZSByZXN1bHRzIGFyZSB1bmRlZmluZWQgaWYKKyAgIFNJWkVfTUFYIDwgWVlTVEFDS19CWVRFUyAoWVlNQVhERVBUSCkKKyAgIGV2YWx1YXRlZCB3aXRoIGluZmluaXRlLXByZWNpc2lvbiBpbnRlZ2VyIGFyaXRobWV0aWMuICAqLworCisjaWYgWVlNQVhERVBUSCA9PSAwCisjIHVuZGVmIFlZTUFYREVQVEgKKyNlbmRpZgorCisjaWZuZGVmIFlZTUFYREVQVEgKKyMgZGVmaW5lIFlZTUFYREVQVEggMTAwMDAKKyNlbmRpZgorDAorI2lmZGVmIFlZRVJST1JfVkVSQk9TRQorCisjIGlmbmRlZiB5eXN0cmxlbgorIyAgaWYgZGVmaW5lZCAoX19HTElCQ19fKSAmJiBkZWZpbmVkIChfU1RSSU5HX0gpCisjICAgZGVmaW5lIHl5c3RybGVuIHN0cmxlbgorIyAgZWxzZQorLyogUmV0dXJuIHRoZSBsZW5ndGggb2YgWVlTVFIuICAqLworc3RhdGljIFlZU0laRV9UCisjICAgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQoreXlzdHJsZW4gKGNvbnN0IGNoYXIgKnl5c3RyKQorIyAgIGVsc2UKK3l5c3RybGVuICh5eXN0cikKKyAgICAgY29uc3QgY2hhciAqeXlzdHI7CisjICAgZW5kaWYKK3sKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqeXlzID0geXlzdHI7CisKKyAgd2hpbGUgKCp5eXMrKyAhPSAnXDAnKQorICAgIGNvbnRpbnVlOworCisgIHJldHVybiB5eXMgLSB5eXN0ciAtIDE7Cit9CisjICBlbmRpZgorIyBlbmRpZgorCisjIGlmbmRlZiB5eXN0cGNweQorIyAgaWYgZGVmaW5lZCAoX19HTElCQ19fKSAmJiBkZWZpbmVkIChfU1RSSU5HX0gpICYmIGRlZmluZWQgKF9HTlVfU09VUkNFKQorIyAgIGRlZmluZSB5eXN0cGNweSBzdHBjcHkKKyMgIGVsc2UKKy8qIENvcHkgWVlTUkMgdG8gWVlERVNULCByZXR1cm5pbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIHRlcm1pbmF0aW5nICdcMCcgaW4KKyAgIFlZREVTVC4gICovCitzdGF0aWMgY2hhciAqCisjICAgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQoreXlzdHBjcHkgKGNoYXIgKnl5ZGVzdCwgY29uc3QgY2hhciAqeXlzcmMpCisjICAgZWxzZQoreXlzdHBjcHkgKHl5ZGVzdCwgeXlzcmMpCisgICAgIGNoYXIgKnl5ZGVzdDsKKyAgICAgY29uc3QgY2hhciAqeXlzcmM7CisjICAgZW5kaWYKK3sKKyAgcmVnaXN0ZXIgY2hhciAqeXlkID0geXlkZXN0OworICByZWdpc3RlciBjb25zdCBjaGFyICp5eXMgPSB5eXNyYzsKKworICB3aGlsZSAoKCp5eWQrKyA9ICp5eXMrKykgIT0gJ1wwJykKKyAgICBjb250aW51ZTsKKworICByZXR1cm4geXlkIC0gMTsKK30KKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKwwKKyNsaW5lIDMxNSAiL3Vzci9sb2NhbC9zaGFyZS9iaXNvbi9iaXNvbi5zaW1wbGUiCisKKworLyogVGhlIHVzZXIgY2FuIGRlZmluZSBZWVBBUlNFX1BBUkFNIGFzIHRoZSBuYW1lIG9mIGFuIGFyZ3VtZW50IHRvIGJlIHBhc3NlZAorICAgaW50byB5eXBhcnNlLiAgVGhlIGFyZ3VtZW50IHNob3VsZCBoYXZlIHR5cGUgdm9pZCAqLgorICAgSXQgc2hvdWxkIGFjdHVhbGx5IHBvaW50IHRvIGFuIG9iamVjdC4KKyAgIEdyYW1tYXIgYWN0aW9ucyBjYW4gYWNjZXNzIHRoZSB2YXJpYWJsZSBieSBjYXN0aW5nIGl0CisgICB0byB0aGUgcHJvcGVyIHBvaW50ZXIgdHlwZS4gICovCisKKyNpZmRlZiBZWVBBUlNFX1BBUkFNCisjIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyMgIGRlZmluZSBZWVBBUlNFX1BBUkFNX0FSRyB2b2lkICpZWVBBUlNFX1BBUkFNCisjICBkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCisjIGVsc2UKKyMgIGRlZmluZSBZWVBBUlNFX1BBUkFNX0FSRyBZWVBBUlNFX1BBUkFNCisjICBkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMIHZvaWQgKllZUEFSU0VfUEFSQU07CisjIGVuZGlmCisjZWxzZSAvKiAhWVlQQVJTRV9QQVJBTSAqLworIyBkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcKKyMgZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTAorI2VuZGlmIC8qICFZWVBBUlNFX1BBUkFNICovCisKKy8qIFByZXZlbnQgd2FybmluZyBpZiAtV3N0cmljdC1wcm90b3R5cGVzLiAgKi8KKyNpZmRlZiBfX0dOVUNfXworIyBpZmRlZiBZWVBBUlNFX1BBUkFNCitpbnQgeXlwYXJzZSAodm9pZCAqKTsKKyMgZWxzZQoraW50IHl5cGFyc2UgKHZvaWQpOworIyBlbmRpZgorI2VuZGlmCisKKy8qIFlZX0RFQ0xfVkFSSUFCTEVTIC0tIGRlcGVuZGluZyB3aGV0aGVyIHdlIHVzZSBhIHB1cmUgcGFyc2VyLAorICAgdmFyaWFibGVzIGFyZSBnbG9iYWwsIG9yIGxvY2FsIHRvIFlZUEFSU0UuICAqLworCisjZGVmaW5lIFlZX0RFQ0xfTk9OX0xTUF9WQVJJQUJMRVMJCQlcCisvKiBUaGUgbG9va2FoZWFkIHN5bWJvbC4gICovCQkJCVwKK2ludCB5eWNoYXI7CQkJCQkJXAorCQkJCQkJCVwKKy8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBvZiB0aGUgbG9va2FoZWFkIHN5bWJvbC4gKi8JXAorWVlTVFlQRSB5eWx2YWw7CQkJCQkJXAorCQkJCQkJCVwKKy8qIE51bWJlciBvZiBwYXJzZSBlcnJvcnMgc28gZmFyLiAgKi8JCQlcCitpbnQgeXluZXJyczsKKworI2lmIFlZTFNQX05FRURFRAorIyBkZWZpbmUgWVlfREVDTF9WQVJJQUJMRVMJCQlcCitZWV9ERUNMX05PTl9MU1BfVkFSSUFCTEVTCQkJXAorCQkJCQkJXAorLyogTG9jYXRpb24gZGF0YSBmb3IgdGhlIGxvb2thaGVhZCBzeW1ib2wuICAqLwlcCitZWUxUWVBFIHl5bGxvYzsKKyNlbHNlCisjIGRlZmluZSBZWV9ERUNMX1ZBUklBQkxFUwkJCVwKK1lZX0RFQ0xfTk9OX0xTUF9WQVJJQUJMRVMKKyNlbmRpZgorCisKKy8qIElmIG5vbnJlZW50cmFudCwgZ2VuZXJhdGUgdGhlIHZhcmlhYmxlcyBoZXJlLiAqLworCisjaWYgIVlZUFVSRQorWVlfREVDTF9WQVJJQUJMRVMKKyNlbmRpZiAgLyogIVlZUFVSRSAqLworCitpbnQKK3l5cGFyc2UgKFlZUEFSU0VfUEFSQU1fQVJHKQorICAgICBZWVBBUlNFX1BBUkFNX0RFQ0wKK3sKKyAgLyogSWYgcmVlbnRyYW50LCBnZW5lcmF0ZSB0aGUgdmFyaWFibGVzIGhlcmUuICovCisjaWYgWVlQVVJFCisgIFlZX0RFQ0xfVkFSSUFCTEVTCisjZW5kaWYgIC8qICFZWVBVUkUgKi8KKworICByZWdpc3RlciBpbnQgeXlzdGF0ZTsKKyAgcmVnaXN0ZXIgaW50IHl5bjsKKyAgaW50IHl5cmVzdWx0OworICAvKiBOdW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkLiAgKi8KKyAgaW50IHl5ZXJyc3RhdHVzOworICAvKiBMb29rYWhlYWQgdG9rZW4gYXMgYW4gaW50ZXJuYWwgKHRyYW5zbGF0ZWQpIHRva2VuIG51bWJlci4gICovCisgIGludCB5eWNoYXIxID0gMDsKKworICAvKiBUaHJlZSBzdGFja3MgYW5kIHRoZWlyIHRvb2xzOgorICAgICBgeXlzcyc6IHJlbGF0ZWQgdG8gc3RhdGVzLAorICAgICBgeXl2cyc6IHJlbGF0ZWQgdG8gc2VtYW50aWMgdmFsdWVzLAorICAgICBgeXlscyc6IHJlbGF0ZWQgdG8gbG9jYXRpb25zLgorCisgICAgIFJlZmVyIHRvIHRoZSBzdGFja3MgdGhydSBzZXBhcmF0ZSBwb2ludGVycywgdG8gYWxsb3cgeXlvdmVyZmxvdworICAgICB0byByZWFsbG9jYXRlIHRoZW0gZWxzZXdoZXJlLiAgKi8KKworICAvKiBUaGUgc3RhdGUgc3RhY2suICovCisgIHNob3J0CXl5c3NhW1lZSU5JVERFUFRIXTsKKyAgc2hvcnQgKnl5c3MgPSB5eXNzYTsKKyAgcmVnaXN0ZXIgc2hvcnQgKnl5c3NwOworCisgIC8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBzdGFjay4gICovCisgIFlZU1RZUEUgeXl2c2FbWVlJTklUREVQVEhdOworICBZWVNUWVBFICp5eXZzID0geXl2c2E7CisgIHJlZ2lzdGVyIFlZU1RZUEUgKnl5dnNwOworCisjaWYgWVlMU1BfTkVFREVECisgIC8qIFRoZSBsb2NhdGlvbiBzdGFjay4gICovCisgIFlZTFRZUEUgeXlsc2FbWVlJTklUREVQVEhdOworICBZWUxUWVBFICp5eWxzID0geXlsc2E7CisgIFlZTFRZUEUgKnl5bHNwOworI2VuZGlmCisKKyNpZiBZWUxTUF9ORUVERUQKKyMgZGVmaW5lIFlZUE9QU1RBQ0sgICAoeXl2c3AtLSwgeXlzc3AtLSwgeXlsc3AtLSkKKyNlbHNlCisjIGRlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0pCisjZW5kaWYKKworICBZWVNJWkVfVCB5eXN0YWNrc2l6ZSA9IFlZSU5JVERFUFRIOworCisKKyAgLyogVGhlIHZhcmlhYmxlcyB1c2VkIHRvIHJldHVybiBzZW1hbnRpYyB2YWx1ZSBhbmQgbG9jYXRpb24gZnJvbSB0aGUKKyAgICAgYWN0aW9uIHJvdXRpbmVzLiAgKi8KKyAgWVlTVFlQRSB5eXZhbDsKKyNpZiBZWUxTUF9ORUVERUQKKyAgWVlMVFlQRSB5eWxvYzsKKyNlbmRpZgorCisgIC8qIFdoZW4gcmVkdWNpbmcsIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBvbiB0aGUgUkhTIG9mIHRoZSByZWR1Y2VkCisgICAgIHJ1bGUuICovCisgIGludCB5eWxlbjsKKworICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFydGluZyBwYXJzZVxuIikpOworCisgIHl5c3RhdGUgPSAwOworICB5eWVycnN0YXR1cyA9IDA7CisgIHl5bmVycnMgPSAwOworICB5eWNoYXIgPSBZWUVNUFRZOwkJLyogQ2F1c2UgYSB0b2tlbiB0byBiZSByZWFkLiAgKi8KKworICAvKiBJbml0aWFsaXplIHN0YWNrIHBvaW50ZXJzLgorICAgICBXYXN0ZSBvbmUgZWxlbWVudCBvZiB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2sKKyAgICAgc28gdGhhdCB0aGV5IHN0YXkgb24gdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIHN0YXRlIHN0YWNrLgorICAgICBUaGUgd2FzdGVkIGVsZW1lbnRzIGFyZSBuZXZlciBpbml0aWFsaXplZC4gICovCisKKyAgeXlzc3AgPSB5eXNzOworICB5eXZzcCA9IHl5dnM7CisjaWYgWVlMU1BfTkVFREVECisgIHl5bHNwID0geXlsczsKKyNlbmRpZgorICBnb3RvIHl5c2V0c3RhdGU7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eW5ld3N0YXRlIC0tIFB1c2ggYSBuZXcgc3RhdGUsIHdoaWNoIGlzIGZvdW5kIGluIHl5c3RhdGUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyB5eW5ld3N0YXRlOgorICAvKiBJbiBhbGwgY2FzZXMsIHdoZW4geW91IGdldCBoZXJlLCB0aGUgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrcworICAgICBoYXZlIGp1c3QgYmVlbiBwdXNoZWQuIHNvIHB1c2hpbmcgYSBzdGF0ZSBoZXJlIGV2ZW5zIHRoZSBzdGFja3MuCisgICAgICovCisgIHl5c3NwKys7CisKKyB5eXNldHN0YXRlOgorICAqeXlzc3AgPSB5eXN0YXRlOworCisgIGlmICh5eXNzcCA+PSB5eXNzICsgeXlzdGFja3NpemUgLSAxKQorICAgIHsKKyAgICAgIC8qIEdldCB0aGUgY3VycmVudCB1c2VkIHNpemUgb2YgdGhlIHRocmVlIHN0YWNrcywgaW4gZWxlbWVudHMuICAqLworICAgICAgWVlTSVpFX1QgeXlzaXplID0geXlzc3AgLSB5eXNzICsgMTsKKworI2lmZGVmIHl5b3ZlcmZsb3cKKyAgICAgIHsKKwkvKiBHaXZlIHVzZXIgYSBjaGFuY2UgdG8gcmVhbGxvY2F0ZSB0aGUgc3RhY2suIFVzZSBjb3BpZXMgb2YKKwkgICB0aGVzZSBzbyB0aGF0IHRoZSAmJ3MgZG9uJ3QgZm9yY2UgdGhlIHJlYWwgb25lcyBpbnRvCisJICAgbWVtb3J5LiAgKi8KKwlZWVNUWVBFICp5eXZzMSA9IHl5dnM7CisJc2hvcnQgKnl5c3MxID0geXlzczsKKworCS8qIEVhY2ggc3RhY2sgcG9pbnRlciBhZGRyZXNzIGlzIGZvbGxvd2VkIGJ5IHRoZSBzaXplIG9mIHRoZQorCSAgIGRhdGEgaW4gdXNlIGluIHRoYXQgc3RhY2ssIGluIGJ5dGVzLiAgKi8KKyMgaWYgWVlMU1BfTkVFREVECisJWVlMVFlQRSAqeXlsczEgPSB5eWxzOworCS8qIFRoaXMgdXNlZCB0byBiZSBhIGNvbmRpdGlvbmFsIGFyb3VuZCBqdXN0IHRoZSB0d28gZXh0cmEgYXJncywKKwkgICBidXQgdGhhdCBtaWdodCBiZSB1bmRlZmluZWQgaWYgeXlvdmVyZmxvdyBpcyBhIG1hY3JvLiAgKi8KKwl5eW92ZXJmbG93ICgicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKKwkJICAgICZ5eXNzMSwgeXlzaXplICogc2l6ZW9mICgqeXlzc3ApLAorCQkgICAgJnl5dnMxLCB5eXNpemUgKiBzaXplb2YgKCp5eXZzcCksCisJCSAgICAmeXlsczEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5bHNwKSwKKwkJICAgICZ5eXN0YWNrc2l6ZSk7CisJeXlscyA9IHl5bHMxOworIyBlbHNlCisJeXlvdmVyZmxvdyAoInBhcnNlciBzdGFjayBvdmVyZmxvdyIsCisJCSAgICAmeXlzczEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKKwkJICAgICZ5eXZzMSwgeXlzaXplICogc2l6ZW9mICgqeXl2c3ApLAorCQkgICAgJnl5c3RhY2tzaXplKTsKKyMgZW5kaWYKKwl5eXNzID0geXlzczE7CisJeXl2cyA9IHl5dnMxOworICAgICAgfQorI2Vsc2UgLyogbm8geXlvdmVyZmxvdyAqLworIyBpZm5kZWYgWVlTVEFDS19SRUxPQ0FURQorICAgICAgZ290byB5eW92ZXJmbG93bGFiOworIyBlbHNlCisgICAgICAvKiBFeHRlbmQgdGhlIHN0YWNrIG91ciBvd24gd2F5LiAgKi8KKyAgICAgIGlmICh5eXN0YWNrc2l6ZSA+PSBZWU1BWERFUFRIKQorCWdvdG8geXlvdmVyZmxvd2xhYjsKKyAgICAgIHl5c3RhY2tzaXplICo9IDI7CisgICAgICBpZiAoeXlzdGFja3NpemUgPiBZWU1BWERFUFRIKQorCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKKworICAgICAgeworCXNob3J0ICp5eXNzMSA9IHl5c3M7CisJdW5pb24geXlhbGxvYyAqeXlwdHIgPQorCSAgKHVuaW9uIHl5YWxsb2MgKikgWVlTVEFDS19BTExPQyAoWVlTVEFDS19CWVRFUyAoeXlzdGFja3NpemUpKTsKKwlpZiAoISB5eXB0cikKKwkgIGdvdG8geXlvdmVyZmxvd2xhYjsKKwlZWVNUQUNLX1JFTE9DQVRFICh5eXNzKTsKKwlZWVNUQUNLX1JFTE9DQVRFICh5eXZzKTsKKyMgaWYgWVlMU1BfTkVFREVECisJWVlTVEFDS19SRUxPQ0FURSAoeXlscyk7CisjIGVuZGlmCisjIHVuZGVmIFlZU1RBQ0tfUkVMT0NBVEUKKwlpZiAoeXlzczEgIT0geXlzc2EpCisJICBZWVNUQUNLX0ZSRUUgKHl5c3MxKTsKKyAgICAgIH0KKyMgZW5kaWYKKyNlbmRpZiAvKiBubyB5eW92ZXJmbG93ICovCisKKyAgICAgIHl5c3NwID0geXlzcyArIHl5c2l6ZSAtIDE7CisgICAgICB5eXZzcCA9IHl5dnMgKyB5eXNpemUgLSAxOworI2lmIFlZTFNQX05FRURFRAorICAgICAgeXlsc3AgPSB5eWxzICsgeXlzaXplIC0gMTsKKyNlbmRpZgorCisgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFjayBzaXplIGluY3JlYXNlZCB0byAlbHVcbiIsCisJCSAgKHVuc2lnbmVkIGxvbmcgaW50KSB5eXN0YWNrc2l6ZSkpOworCisgICAgICBpZiAoeXlzc3AgPj0geXlzcyArIHl5c3RhY2tzaXplIC0gMSkKKwlZWUFCT1JUOworICAgIH0KKworICBZWURQUklOVEYgKChzdGRlcnIsICJFbnRlcmluZyBzdGF0ZSAlZFxuIiwgeXlzdGF0ZSkpOworCisgIGdvdG8geXliYWNrdXA7CisKKworLyotLS0tLS0tLS0tLS4KK3wgeXliYWNrdXAuICB8CitgLS0tLS0tLS0tLS0qLworeXliYWNrdXA6CisKKy8qIERvIGFwcHJvcHJpYXRlIHByb2Nlc3NpbmcgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUuICAqLworLyogUmVhZCBhIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisvKiB5eXJlc3VtZTogKi8KKworICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KKworICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gWVlGTEFHKQorICAgIGdvdG8geXlkZWZhdWx0OworCisgIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisKKyAgLyogeXljaGFyIGlzIGVpdGhlciBZWUVNUFRZIG9yIFlZRU9GCisgICAgIG9yIGEgdmFsaWQgdG9rZW4gaW4gZXh0ZXJuYWwgZm9ybS4gICovCisKKyAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZKQorICAgIHsKKyAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlJlYWRpbmcgYSB0b2tlbjogIikpOworICAgICAgeXljaGFyID0gWVlMRVg7CisgICAgfQorCisgIC8qIENvbnZlcnQgdG9rZW4gdG8gaW50ZXJuYWwgZm9ybSAoaW4geXljaGFyMSkgZm9yIGluZGV4aW5nIHRhYmxlcyB3aXRoICovCisKKyAgaWYgKHl5Y2hhciA8PSAwKQkJLyogVGhpcyBtZWFucyBlbmQgb2YgaW5wdXQuICovCisgICAgeworICAgICAgeXljaGFyMSA9IDA7CisgICAgICB5eWNoYXIgPSBZWUVPRjsJCS8qIERvbid0IGNhbGwgWVlMRVggYW55IG1vcmUgKi8KKworICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiTm93IGF0IGVuZCBvZiBpbnB1dC5cbiIpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CisKKyNpZiBZWURFQlVHCisgICAgIC8qIFdlIGhhdmUgdG8ga2VlcCB0aGlzIGAjaWYgWVlERUJVRycsIHNpbmNlIHdlIHVzZSB2YXJpYWJsZXMKKwl3aGljaCBhcmUgZGVmaW5lZCBvbmx5IGlmIGBZWURFQlVHJyBpcyBzZXQuICAqLworICAgICAgaWYgKHl5ZGVidWcpCisJeworCSAgWVlGUFJJTlRGIChzdGRlcnIsICJOZXh0IHRva2VuIGlzICVkICglcyIsCisJCSAgICAgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKKwkgIC8qIEdpdmUgdGhlIGluZGl2aWR1YWwgcGFyc2VyIGEgd2F5IHRvIHByaW50IHRoZSBwcmVjaXNlCisJICAgICBtZWFuaW5nIG9mIGEgdG9rZW4sIGZvciBmdXJ0aGVyIGRlYnVnZ2luZyBpbmZvLiAgKi8KKyMgaWZkZWYgWVlQUklOVAorCSAgWVlQUklOVCAoc3RkZXJyLCB5eWNoYXIsIHl5bHZhbCk7CisjIGVuZGlmCisJICBZWUZQUklOVEYgKHN0ZGVyciwgIilcbiIpOworCX0KKyNlbmRpZgorICAgIH0KKworICB5eW4gKz0geXljaGFyMTsKKyAgaWYgKHl5biA8IDAgfHwgeXluID4gWVlMQVNUIHx8IHl5Y2hlY2tbeXluXSAhPSB5eWNoYXIxKQorICAgIGdvdG8geXlkZWZhdWx0OworCisgIHl5biA9IHl5dGFibGVbeXluXTsKKworICAvKiB5eW4gaXMgd2hhdCB0byBkbyBmb3IgdGhpcyB0b2tlbiB0eXBlIGluIHRoaXMgc3RhdGUuCisgICAgIE5lZ2F0aXZlID0+IHJlZHVjZSwgLXl5biBpcyBydWxlIG51bWJlci4KKyAgICAgUG9zaXRpdmUgPT4gc2hpZnQsIHl5biBpcyBuZXcgc3RhdGUuCisgICAgICAgTmV3IHN0YXRlIGlzIGZpbmFsIHN0YXRlID0+IGRvbid0IGJvdGhlciB0byBzaGlmdCwKKyAgICAgICBqdXN0IHJldHVybiBzdWNjZXNzLgorICAgICAwLCBvciBtb3N0IG5lZ2F0aXZlIG51bWJlciA9PiBlcnJvci4gICovCisKKyAgaWYgKHl5biA8IDApCisgICAgeworICAgICAgaWYgKHl5biA9PSBZWUZMQUcpCisJZ290byB5eWVycmxhYjsKKyAgICAgIHl5biA9IC15eW47CisgICAgICBnb3RvIHl5cmVkdWNlOworICAgIH0KKyAgZWxzZSBpZiAoeXluID09IDApCisgICAgZ290byB5eWVycmxhYjsKKworICBpZiAoeXluID09IFlZRklOQUwpCisgICAgWVlBQ0NFUFQ7CisKKyAgLyogU2hpZnQgdGhlIGxvb2thaGVhZCB0b2tlbi4gICovCisgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlNoaWZ0aW5nIHRva2VuICVkICglcyksICIsCisJICAgICAgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKSk7CisKKyAgLyogRGlzY2FyZCB0aGUgdG9rZW4gYmVpbmcgc2hpZnRlZCB1bmxlc3MgaXQgaXMgZW9mLiAgKi8KKyAgaWYgKHl5Y2hhciAhPSBZWUVPRikKKyAgICB5eWNoYXIgPSBZWUVNUFRZOworCisgICorK3l5dnNwID0geXlsdmFsOworI2lmIFlZTFNQX05FRURFRAorICAqKyt5eWxzcCA9IHl5bGxvYzsKKyNlbmRpZgorCisgIC8qIENvdW50IHRva2VucyBzaGlmdGVkIHNpbmNlIGVycm9yOyBhZnRlciB0aHJlZSwgdHVybiBvZmYgZXJyb3IKKyAgICAgc3RhdHVzLiAgKi8KKyAgaWYgKHl5ZXJyc3RhdHVzKQorICAgIHl5ZXJyc3RhdHVzLS07CisKKyAgeXlzdGF0ZSA9IHl5bjsKKyAgZ290byB5eW5ld3N0YXRlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5ZGVmYXVsdCAtLSBkbyB0aGUgZGVmYXVsdCBhY3Rpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZGVmYXVsdDoKKyAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gMCkKKyAgICBnb3RvIHl5ZXJybGFiOworICBnb3RvIHl5cmVkdWNlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5cmVkdWNlIC0tIERvIGEgcmVkdWN0aW9uLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5cmVkdWNlOgorICAvKiB5eW4gaXMgdGhlIG51bWJlciBvZiBhIHJ1bGUgdG8gcmVkdWNlIHdpdGguICAqLworICB5eWxlbiA9IHl5cjJbeXluXTsKKworICAvKiBJZiBZWUxFTiBpcyBub256ZXJvLCBpbXBsZW1lbnQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFjdGlvbjoKKyAgICAgYCQkID0gJDEnLgorCisgICAgIE90aGVyd2lzZSwgdGhlIGZvbGxvd2luZyBsaW5lIHNldHMgWVlWQUwgdG8gdGhlIHNlbWFudGljIHZhbHVlIG9mCisgICAgIHRoZSBsb29rYWhlYWQgdG9rZW4uICBUaGlzIGJlaGF2aW9yIGlzIHVuZG9jdW1lbnRlZCBhbmQgQmlzb24KKyAgICAgdXNlcnMgc2hvdWxkIG5vdCByZWx5IHVwb24gaXQuICBBc3NpZ25pbmcgdG8gWVlWQUwKKyAgICAgdW5jb25kaXRpb25hbGx5IG1ha2VzIHRoZSBwYXJzZXIgYSBiaXQgc21hbGxlciwgYW5kIGl0IGF2b2lkcyBhCisgICAgIEdDQyB3YXJuaW5nIHRoYXQgWVlWQUwgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZC4gICovCisgIHl5dmFsID0geXl2c3BbMS15eWxlbl07CisKKyNpZiBZWUxTUF9ORUVERUQKKyAgLyogU2ltaWxhcmx5IGZvciB0aGUgZGVmYXVsdCBsb2NhdGlvbi4gIExldCB0aGUgdXNlciBydW4gYWRkaXRpb25hbAorICAgICBjb21tYW5kcyBpZiBmb3IgaW5zdGFuY2UgbG9jYXRpb25zIGFyZSByYW5nZXMuICAqLworICB5eWxvYyA9IHl5bHNwWzEteXlsZW5dOworICBZWUxMT0NfREVGQVVMVCAoeXlsb2MsICh5eWxzcCAtIHl5bGVuKSwgeXlsZW4pOworI2VuZGlmCisKKyNpZiBZWURFQlVHCisgIC8qIFdlIGhhdmUgdG8ga2VlcCB0aGlzIGAjaWYgWVlERUJVRycsIHNpbmNlIHdlIHVzZSB2YXJpYWJsZXMgd2hpY2gKKyAgICAgYXJlIGRlZmluZWQgb25seSBpZiBgWVlERUJVRycgaXMgc2V0LiAgKi8KKyAgaWYgKHl5ZGVidWcpCisgICAgeworICAgICAgaW50IHl5aTsKKworICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJSZWR1Y2luZyB2aWEgcnVsZSAlZCAobGluZSAlZCksICIsCisJCSB5eW4sIHl5cmxpbmVbeXluXSk7CisKKyAgICAgIC8qIFByaW50IHRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQsIGFuZCB0aGVpciByZXN1bHQuICAqLworICAgICAgZm9yICh5eWkgPSB5eXByaHNbeXluXTsgeXlyaHNbeXlpXSA+IDA7IHl5aSsrKQorCVlZRlBSSU5URiAoc3RkZXJyLCAiJXMgIiwgeXl0bmFtZVt5eXJoc1t5eWldXSk7CisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiAtPiAlc1xuIiwgeXl0bmFtZVt5eXIxW3l5bl1dKTsKKyAgICB9CisjZW5kaWYKKworICBzd2l0Y2ggKHl5bikgeworCitjYXNlIDE6CisjbGluZSAxNTEgInBsdXJhbC55IgoreworCSAgICBpZiAoeXl2c3BbMF0uZXhwID09IE5VTEwpCisJICAgICAgWVlBQk9SVDsKKwkgICAgKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5yZXMgPSB5eXZzcFswXS5leHA7CisJICB9CisgICAgYnJlYWs7CitjYXNlIDI6CisjbGluZSAxNTkgInBsdXJhbC55IgoreworCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzMgKHFtb3AsIHl5dnNwWy00XS5leHAsIHl5dnNwWy0yXS5leHAsIHl5dnNwWzBdLmV4cCk7CisJICB9CisgICAgYnJlYWs7CitjYXNlIDM6CisjbGluZSAxNjMgInBsdXJhbC55IgoreworCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzIgKGxvciwgeXl2c3BbLTJdLmV4cCwgeXl2c3BbMF0uZXhwKTsKKwkgIH0KKyAgICBicmVhazsKK2Nhc2UgNDoKKyNsaW5lIDE2NyAicGx1cmFsLnkiCit7CisJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMiAobGFuZCwgeXl2c3BbLTJdLmV4cCwgeXl2c3BbMF0uZXhwKTsKKwkgIH0KKyAgICBicmVhazsKK2Nhc2UgNToKKyNsaW5lIDE3MSAicGx1cmFsLnkiCit7CisJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMiAoeXl2c3BbLTFdLm9wLCB5eXZzcFstMl0uZXhwLCB5eXZzcFswXS5leHApOworCSAgfQorICAgIGJyZWFrOworY2FzZSA2OgorI2xpbmUgMTc1ICJwbHVyYWwueSIKK3sKKwkgICAgeXl2YWwuZXhwID0gbmV3X2V4cF8yICh5eXZzcFstMV0ub3AsIHl5dnNwWy0yXS5leHAsIHl5dnNwWzBdLmV4cCk7CisJICB9CisgICAgYnJlYWs7CitjYXNlIDc6CisjbGluZSAxNzkgInBsdXJhbC55IgoreworCSAgICB5eXZhbC5leHAgPSBuZXdfZXhwXzIgKHl5dnNwWy0xXS5vcCwgeXl2c3BbLTJdLmV4cCwgeXl2c3BbMF0uZXhwKTsKKwkgIH0KKyAgICBicmVhazsKK2Nhc2UgODoKKyNsaW5lIDE4MyAicGx1cmFsLnkiCit7CisJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMiAoeXl2c3BbLTFdLm9wLCB5eXZzcFstMl0uZXhwLCB5eXZzcFswXS5leHApOworCSAgfQorICAgIGJyZWFrOworY2FzZSA5OgorI2xpbmUgMTg3ICJwbHVyYWwueSIKK3sKKwkgICAgeXl2YWwuZXhwID0gbmV3X2V4cF8xIChsbm90LCB5eXZzcFswXS5leHApOworCSAgfQorICAgIGJyZWFrOworY2FzZSAxMDoKKyNsaW5lIDE5MSAicGx1cmFsLnkiCit7CisJICAgIHl5dmFsLmV4cCA9IG5ld19leHBfMCAodmFyKTsKKwkgIH0KKyAgICBicmVhazsKK2Nhc2UgMTE6CisjbGluZSAxOTUgInBsdXJhbC55IgoreworCSAgICBpZiAoKHl5dmFsLmV4cCA9IG5ld19leHBfMCAobnVtKSkgIT0gTlVMTCkKKwkgICAgICB5eXZhbC5leHAtPnZhbC5udW0gPSB5eXZzcFswXS5udW07CisJICB9CisgICAgYnJlYWs7CitjYXNlIDEyOgorI2xpbmUgMjAwICJwbHVyYWwueSIKK3sKKwkgICAgeXl2YWwuZXhwID0geXl2c3BbLTFdLmV4cDsKKwkgIH0KKyAgICBicmVhazsKK30KKworI2xpbmUgNzA1ICIvdXNyL2xvY2FsL3NoYXJlL2Jpc29uL2Jpc29uLnNpbXBsZSIKKworDAorICB5eXZzcCAtPSB5eWxlbjsKKyAgeXlzc3AgLT0geXlsZW47CisjaWYgWVlMU1BfTkVFREVECisgIHl5bHNwIC09IHl5bGVuOworI2VuZGlmCisKKyNpZiBZWURFQlVHCisgIGlmICh5eWRlYnVnKQorICAgIHsKKyAgICAgIHNob3J0ICp5eXNzcDEgPSB5eXNzIC0gMTsKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAic3RhdGUgc3RhY2sgbm93Iik7CisgICAgICB3aGlsZSAoeXlzc3AxICE9IHl5c3NwKQorCVlZRlBSSU5URiAoc3RkZXJyLCAiICVkIiwgKisreXlzc3AxKTsKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsKKyAgICB9CisjZW5kaWYKKworICAqKyt5eXZzcCA9IHl5dmFsOworI2lmIFlZTFNQX05FRURFRAorICAqKyt5eWxzcCA9IHl5bG9jOworI2VuZGlmCisKKyAgLyogTm93IGBzaGlmdCcgdGhlIHJlc3VsdCBvZiB0aGUgcmVkdWN0aW9uLiAgRGV0ZXJtaW5lIHdoYXQgc3RhdGUKKyAgICAgdGhhdCBnb2VzIHRvLCBiYXNlZCBvbiB0aGUgc3RhdGUgd2UgcG9wcGVkIGJhY2sgdG8gYW5kIHRoZSBydWxlCisgICAgIG51bWJlciByZWR1Y2VkIGJ5LiAgKi8KKworICB5eW4gPSB5eXIxW3l5bl07CisKKyAgeXlzdGF0ZSA9IHl5cGdvdG9beXluIC0gWVlOVEJBU0VdICsgKnl5c3NwOworICBpZiAoeXlzdGF0ZSA+PSAwICYmIHl5c3RhdGUgPD0gWVlMQVNUICYmIHl5Y2hlY2tbeXlzdGF0ZV0gPT0gKnl5c3NwKQorICAgIHl5c3RhdGUgPSB5eXRhYmxlW3l5c3RhdGVdOworICBlbHNlCisgICAgeXlzdGF0ZSA9IHl5ZGVmZ290b1t5eW4gLSBZWU5UQkFTRV07CisKKyAgZ290byB5eW5ld3N0YXRlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWVycmxhYiAtLSBoZXJlIG9uIGRldGVjdGluZyBlcnJvciB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZXJybGFiOgorICAvKiBJZiBub3QgYWxyZWFkeSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlcG9ydCB0aGlzIGVycm9yLiAgKi8KKyAgaWYgKCF5eWVycnN0YXR1cykKKyAgICB7CisgICAgICArK3l5bmVycnM7CisKKyNpZmRlZiBZWUVSUk9SX1ZFUkJPU0UKKyAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKworICAgICAgaWYgKHl5biA+IFlZRkxBRyAmJiB5eW4gPCBZWUxBU1QpCisJeworCSAgWVlTSVpFX1QgeXlzaXplID0gMDsKKwkgIGNoYXIgKnl5bXNnOworCSAgaW50IHl5eCwgeXljb3VudDsKKworCSAgeXljb3VudCA9IDA7CisJICAvKiBTdGFydCBZWVggYXQgLVlZTiBpZiBuZWdhdGl2ZSB0byBhdm9pZCBuZWdhdGl2ZSBpbmRleGVzIGluCisJICAgICBZWUNIRUNLLiAgKi8KKwkgIGZvciAoeXl4ID0geXluIDwgMCA/IC15eW4gOiAwOworCSAgICAgICB5eXggPCAoaW50KSAoc2l6ZW9mICh5eXRuYW1lKSAvIHNpemVvZiAoY2hhciAqKSk7IHl5eCsrKQorCSAgICBpZiAoeXljaGVja1t5eXggKyB5eW5dID09IHl5eCkKKwkgICAgICB5eXNpemUgKz0geXlzdHJsZW4gKHl5dG5hbWVbeXl4XSkgKyAxNSwgeXljb3VudCsrOworCSAgeXlzaXplICs9IHl5c3RybGVuICgicGFyc2UgZXJyb3IsIHVuZXhwZWN0ZWQgIikgKyAxOworCSAgeXlzaXplICs9IHl5c3RybGVuICh5eXRuYW1lW1lZVFJBTlNMQVRFICh5eWNoYXIpXSk7CisJICB5eW1zZyA9IChjaGFyICopIFlZU1RBQ0tfQUxMT0MgKHl5c2l6ZSk7CisJICBpZiAoeXltc2cgIT0gMCkKKwkgICAgeworCSAgICAgIGNoYXIgKnl5cCA9IHl5c3RwY3B5ICh5eW1zZywgInBhcnNlIGVycm9yLCB1bmV4cGVjdGVkICIpOworCSAgICAgIHl5cCA9IHl5c3RwY3B5ICh5eXAsIHl5dG5hbWVbWVlUUkFOU0xBVEUgKHl5Y2hhcildKTsKKworCSAgICAgIGlmICh5eWNvdW50IDwgNSkKKwkJeworCQkgIHl5Y291bnQgPSAwOworCQkgIGZvciAoeXl4ID0geXluIDwgMCA/IC15eW4gOiAwOworCQkgICAgICAgeXl4IDwgKGludCkgKHNpemVvZiAoeXl0bmFtZSkgLyBzaXplb2YgKGNoYXIgKikpOworCQkgICAgICAgeXl4KyspCisJCSAgICBpZiAoeXljaGVja1t5eXggKyB5eW5dID09IHl5eCkKKwkJICAgICAgeworCQkJY29uc3QgY2hhciAqeXlxID0gISB5eWNvdW50ID8gIiwgZXhwZWN0aW5nICIgOiAiIG9yICI7CisJCQl5eXAgPSB5eXN0cGNweSAoeXlwLCB5eXEpOworCQkJeXlwID0geXlzdHBjcHkgKHl5cCwgeXl0bmFtZVt5eXhdKTsKKwkJCXl5Y291bnQrKzsKKwkJICAgICAgfQorCQl9CisJICAgICAgeXllcnJvciAoeXltc2cpOworCSAgICAgIFlZU1RBQ0tfRlJFRSAoeXltc2cpOworCSAgICB9CisJICBlbHNlCisJICAgIHl5ZXJyb3IgKCJwYXJzZSBlcnJvcjsgYWxzbyB2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiKTsKKwl9CisgICAgICBlbHNlCisjZW5kaWYgLyogZGVmaW5lZCAoWVlFUlJPUl9WRVJCT1NFKSAqLworCXl5ZXJyb3IgKCJwYXJzZSBlcnJvciIpOworICAgIH0KKyAgZ290byB5eWVycmxhYjE7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXllcnJsYWIxIC0tIGVycm9yIHJhaXNlZCBleHBsaWNpdGx5IGJ5IGFuIGFjdGlvbiB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXllcnJsYWIxOgorICBpZiAoeXllcnJzdGF0dXMgPT0gMykKKyAgICB7CisgICAgICAvKiBJZiBqdXN0IHRyaWVkIGFuZCBmYWlsZWQgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIGFuCisJIGVycm9yLCBkaXNjYXJkIGl0LiAgKi8KKworICAgICAgLyogcmV0dXJuIGZhaWx1cmUgaWYgYXQgZW5kIG9mIGlucHV0ICovCisgICAgICBpZiAoeXljaGFyID09IFlZRU9GKQorCVlZQUJPUlQ7CisgICAgICBZWURQUklOVEYgKChzdGRlcnIsICJEaXNjYXJkaW5nIHRva2VuICVkICglcykuXG4iLAorCQkgIHl5Y2hhciwgeXl0bmFtZVt5eWNoYXIxXSkpOworICAgICAgeXljaGFyID0gWVlFTVBUWTsKKyAgICB9CisKKyAgLyogRWxzZSB3aWxsIHRyeSB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgc2hpZnRpbmcgdGhlIGVycm9yCisgICAgIHRva2VuLiAgKi8KKworICB5eWVycnN0YXR1cyA9IDM7CQkvKiBFYWNoIHJlYWwgdG9rZW4gc2hpZnRlZCBkZWNyZW1lbnRzIHRoaXMgKi8KKworICBnb3RvIHl5ZXJyaGFuZGxlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXllcnJkZWZhdWx0IC0tIGN1cnJlbnQgc3RhdGUgZG9lcyBub3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IgdGhlIHwKK3wgZXJyb3IgdG9rZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZXJyZGVmYXVsdDoKKyNpZiAwCisgIC8qIFRoaXMgaXMgd3Jvbmc7IG9ubHkgc3RhdGVzIHRoYXQgZXhwbGljaXRseSB3YW50IGVycm9yIHRva2VucworICAgICBzaG91bGQgc2hpZnQgdGhlbS4gICovCisKKyAgLyogSWYgaXRzIGRlZmF1bHQgaXMgdG8gYWNjZXB0IGFueSB0b2tlbiwgb2suICBPdGhlcndpc2UgcG9wIGl0LiAgKi8KKyAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4pCisgICAgZ290byB5eWRlZmF1bHQ7CisjZW5kaWYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXllcnJwb3AgLS0gcG9wIHRoZSBjdXJyZW50IHN0YXRlIGJlY2F1c2UgaXQgY2Fubm90IGhhbmRsZSB0aGUgfAorfCBlcnJvciB0b2tlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZXJycG9wOgorICBpZiAoeXlzc3AgPT0geXlzcykKKyAgICBZWUFCT1JUOworICB5eXZzcC0tOworICB5eXN0YXRlID0gKi0teXlzc3A7CisjaWYgWVlMU1BfTkVFREVECisgIHl5bHNwLS07CisjZW5kaWYKKworI2lmIFlZREVCVUcKKyAgaWYgKHl5ZGVidWcpCisgICAgeworICAgICAgc2hvcnQgKnl5c3NwMSA9IHl5c3MgLSAxOworICAgICAgWVlGUFJJTlRGIChzdGRlcnIsICJFcnJvcjogc3RhdGUgc3RhY2sgbm93Iik7CisgICAgICB3aGlsZSAoeXlzc3AxICE9IHl5c3NwKQorCVlZRlBSSU5URiAoc3RkZXJyLCAiICVkIiwgKisreXlzc3AxKTsKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsKKyAgICB9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS4KK3wgeXllcnJoYW5kbGUuICB8CitgLS0tLS0tLS0tLS0tLS0qLworeXllcnJoYW5kbGU6CisgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKyAgaWYgKHl5biA9PSBZWUZMQUcpCisgICAgZ290byB5eWVycmRlZmF1bHQ7CisKKyAgeXluICs9IFlZVEVSUk9SOworICBpZiAoeXluIDwgMCB8fCB5eW4gPiBZWUxBU1QgfHwgeXljaGVja1t5eW5dICE9IFlZVEVSUk9SKQorICAgIGdvdG8geXllcnJkZWZhdWx0OworCisgIHl5biA9IHl5dGFibGVbeXluXTsKKyAgaWYgKHl5biA8IDApCisgICAgeworICAgICAgaWYgKHl5biA9PSBZWUZMQUcpCisJZ290byB5eWVycnBvcDsKKyAgICAgIHl5biA9IC15eW47CisgICAgICBnb3RvIHl5cmVkdWNlOworICAgIH0KKyAgZWxzZSBpZiAoeXluID09IDApCisgICAgZ290byB5eWVycnBvcDsKKworICBpZiAoeXluID09IFlZRklOQUwpCisgICAgWVlBQ0NFUFQ7CisKKyAgWVlEUFJJTlRGICgoc3RkZXJyLCAiU2hpZnRpbmcgZXJyb3IgdG9rZW4sICIpKTsKKworICAqKyt5eXZzcCA9IHl5bHZhbDsKKyNpZiBZWUxTUF9ORUVERUQKKyAgKisreXlsc3AgPSB5eWxsb2M7CisjZW5kaWYKKworICB5eXN0YXRlID0geXluOworICBnb3RvIHl5bmV3c3RhdGU7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWFjY2VwdGxhYiAtLSBZWUFDQ0VQVCBjb21lcyBoZXJlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlhY2NlcHRsYWI6CisgIHl5cmVzdWx0ID0gMDsKKyAgZ290byB5eXJldHVybjsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlhYm9ydGxhYiAtLSBZWUFCT1JUIGNvbWVzIGhlcmUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXlhYm9ydGxhYjoKKyAgeXlyZXN1bHQgPSAxOworICBnb3RvIHl5cmV0dXJuOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlvdmVyZmxvd2FiIC0tIHBhcnNlciBvdmVyZmxvdyBjb21lcyBoZXJlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eW92ZXJmbG93bGFiOgorICB5eWVycm9yICgicGFyc2VyIHN0YWNrIG92ZXJmbG93Iik7CisgIHl5cmVzdWx0ID0gMjsKKyAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKworeXlyZXR1cm46CisjaWZuZGVmIHl5b3ZlcmZsb3cKKyAgaWYgKHl5c3MgIT0geXlzc2EpCisgICAgWVlTVEFDS19GUkVFICh5eXNzKTsKKyNlbmRpZgorICByZXR1cm4geXlyZXN1bHQ7Cit9CisjbGluZSAyMDUgInBsdXJhbC55IgorCisKK3ZvaWQKK2ludGVybmFsX2Z1bmN0aW9uCitGUkVFX0VYUFJFU1NJT04gKHN0cnVjdCBleHByZXNzaW9uICpleHApCit7CisgIGlmIChleHAgPT0gTlVMTCkKKyAgICByZXR1cm47CisKKyAgLyogSGFuZGxlIHRoZSByZWN1cnNpdmUgY2FzZS4gICovCisgIHN3aXRjaCAoZXhwLT5uYXJncykKKyAgICB7CisgICAgY2FzZSAzOgorICAgICAgRlJFRV9FWFBSRVNTSU9OIChleHAtPnZhbC5hcmdzWzJdKTsKKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSAyOgorICAgICAgRlJFRV9FWFBSRVNTSU9OIChleHAtPnZhbC5hcmdzWzFdKTsKKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgY2FzZSAxOgorICAgICAgRlJFRV9FWFBSRVNTSU9OIChleHAtPnZhbC5hcmdzWzBdKTsKKyAgICAgIC8qIEZBTExUSFJPVUdIICovCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICBmcmVlIChleHApOworfQorCisKK3N0YXRpYyBpbnQKK3l5bGV4IChZWVNUWVBFICpsdmFsLCBjb25zdCBjaGFyICoqcGV4cCkKK3sKKyAgY29uc3QgY2hhciAqZXhwID0gKnBleHA7CisgIGludCByZXN1bHQ7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaWYgKGV4cFswXSA9PSAnXDAnKQorCXsKKwkgICpwZXhwID0gZXhwOworCSAgcmV0dXJuIFlZRU9GOworCX0KKworICAgICAgaWYgKGV4cFswXSAhPSAnICcgJiYgZXhwWzBdICE9ICdcdCcpCisJYnJlYWs7CisKKyAgICAgICsrZXhwOworICAgIH0KKworICByZXN1bHQgPSAqZXhwKys7CisgIHN3aXRjaCAocmVzdWx0KQorICAgIHsKKyAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6CisgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorICAgICAgeworCXVuc2lnbmVkIGxvbmcgaW50IG4gPSByZXN1bHQgLSAnMCc7CisJd2hpbGUgKGV4cFswXSA+PSAnMCcgJiYgZXhwWzBdIDw9ICc5JykKKwkgIHsKKwkgICAgbiAqPSAxMDsKKwkgICAgbiArPSBleHBbMF0gLSAnMCc7CisJICAgICsrZXhwOworCSAgfQorCWx2YWwtPm51bSA9IG47CisJcmVzdWx0ID0gTlVNQkVSOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICc9JzoKKyAgICAgIGlmIChleHBbMF0gPT0gJz0nKQorCXsKKwkgICsrZXhwOworCSAgbHZhbC0+b3AgPSBlcXVhbDsKKwkgIHJlc3VsdCA9IEVRVU9QMjsKKwl9CisgICAgICBlbHNlCisJcmVzdWx0ID0gWVlFUlJDT0RFOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICchJzoKKyAgICAgIGlmIChleHBbMF0gPT0gJz0nKQorCXsKKwkgICsrZXhwOworCSAgbHZhbC0+b3AgPSBub3RfZXF1YWw7CisJICByZXN1bHQgPSBFUVVPUDI7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcmJzoKKyAgICBjYXNlICd8JzoKKyAgICAgIGlmIChleHBbMF0gPT0gcmVzdWx0KQorCSsrZXhwOworICAgICAgZWxzZQorCXJlc3VsdCA9IFlZRVJSQ09ERTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnPCc6CisgICAgICBpZiAoZXhwWzBdID09ICc9JykKKwl7CisJICArK2V4cDsKKwkgIGx2YWwtPm9wID0gbGVzc19vcl9lcXVhbDsKKwl9CisgICAgICBlbHNlCisJbHZhbC0+b3AgPSBsZXNzX3RoYW47CisgICAgICByZXN1bHQgPSBDTVBPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJz4nOgorICAgICAgaWYgKGV4cFswXSA9PSAnPScpCisJeworCSAgKytleHA7CisJICBsdmFsLT5vcCA9IGdyZWF0ZXJfb3JfZXF1YWw7CisJfQorICAgICAgZWxzZQorCWx2YWwtPm9wID0gZ3JlYXRlcl90aGFuOworICAgICAgcmVzdWx0ID0gQ01QT1AyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICcqJzoKKyAgICAgIGx2YWwtPm9wID0gbXVsdDsKKyAgICAgIHJlc3VsdCA9IE1VTE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnLyc6CisgICAgICBsdmFsLT5vcCA9IGRpdmlkZTsKKyAgICAgIHJlc3VsdCA9IE1VTE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnJSc6CisgICAgICBsdmFsLT5vcCA9IG1vZHVsZTsKKyAgICAgIHJlc3VsdCA9IE1VTE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnKyc6CisgICAgICBsdmFsLT5vcCA9IHBsdXM7CisgICAgICByZXN1bHQgPSBBRERPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJy0nOgorICAgICAgbHZhbC0+b3AgPSBtaW51czsKKyAgICAgIHJlc3VsdCA9IEFERE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnbic6CisgICAgY2FzZSAnPyc6CisgICAgY2FzZSAnOic6CisgICAgY2FzZSAnKCc6CisgICAgY2FzZSAnKSc6CisgICAgICAvKiBOb3RoaW5nLCBqdXN0IHJldHVybiB0aGUgY2hhcmFjdGVyLiAgKi8KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnOyc6CisgICAgY2FzZSAnXG4nOgorICAgIGNhc2UgJ1wwJzoKKyAgICAgIC8qIEJlIHNhZmUgYW5kIGxldCB0aGUgdXNlciBjYWxsIHRoaXMgZnVuY3Rpb24gYWdhaW4uICAqLworICAgICAgLS1leHA7CisgICAgICByZXN1bHQgPSBZWUVPRjsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJlc3VsdCA9IFlZRVJSQ09ERTsKKyNpZiBZWURFQlVHICE9IDAKKyAgICAgIC0tZXhwOworI2VuZGlmCisgICAgICBicmVhazsKKyAgICB9CisKKyAgKnBleHAgPSBleHA7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgdm9pZAoreXllcnJvciAoY29uc3QgY2hhciAqc3RyKQoreworICAvKiBEbyBub3RoaW5nLiAgV2UgZG9uJ3QgcHJpbnQgZXJyb3IgbWVzc2FnZXMgaGVyZS4gICovCit9CmRpZmYgLS1naXQgYS91bml4L2ludGwvcGx1cmFsLnkgYi91bml4L2ludGwvcGx1cmFsLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzM2JkNwotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9wbHVyYWwueQpAQCAtMCwwICsxLDM4MSBAQAorJXsKKy8qIEV4cHJlc3Npb24gcGFyc2luZyBmb3IgcGx1cmFsIGZvcm0gc2VsZWN0aW9uLgorICAgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAyMDAwLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworLyogVGhlIGJpc29uIGdlbmVyYXRlZCBwYXJzZXIgdXNlcyBhbGxvY2EuICBBSVggMyBmb3JjZXMgdXMgdG8gcHV0IHRoaXMKKyAgIGRlY2xhcmF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuICBUaGUgZGVjbGFyYXRpb24gaW4gYmlzb24ncworICAgc2tlbGV0b24gZmlsZSBjb21lcyB0b28gbGF0ZS4gIFRoaXMgbXVzdCBjb21lIGJlZm9yZSA8Y29uZmlnLmg+CisgICBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUgYXJiaXRyYXJ5IHN5c3RlbSBoZWFkZXJzLiAgKi8KKyNpZiBkZWZpbmVkIF9BSVggJiYgIWRlZmluZWQgX19HTlVDX18KKyAjcHJhZ21hIGFsbG9jYQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJwbHVyYWwtZXhwLmgiCisKKy8qIFRoZSBtYWluIGZ1bmN0aW9uIGdlbmVyYXRlZCBieSB0aGUgcGFyc2VyIGlzIGNhbGxlZCBfX2dldHRleHRwYXJzZSwKKyAgIGJ1dCB3ZSB3YW50IGl0IHRvIGJlIGNhbGxlZCBQTFVSQUxfUEFSU0UuICAqLworI2lmbmRlZiBfTElCQworIyBkZWZpbmUgX19nZXR0ZXh0cGFyc2UgUExVUkFMX1BBUlNFCisjZW5kaWYKKworI2RlZmluZSBZWUxFWF9QQVJBTQkmKChzdHJ1Y3QgcGFyc2VfYXJncyAqKSBhcmcpLT5jcAorI2RlZmluZSBZWVBBUlNFX1BBUkFNCWFyZworJX0KKyVwdXJlX3BhcnNlcgorJWV4cGVjdCA3CisKKyV1bmlvbiB7CisgIHVuc2lnbmVkIGxvbmcgaW50IG51bTsKKyAgZW51bSBvcGVyYXRvciBvcDsKKyAgc3RydWN0IGV4cHJlc3Npb24gKmV4cDsKK30KKworJXsKKy8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCitzdGF0aWMgaW50IHl5bGV4IChZWVNUWVBFICpsdmFsLCBjb25zdCBjaGFyICoqcGV4cCk7CitzdGF0aWMgdm9pZCB5eWVycm9yIChjb25zdCBjaGFyICpzdHIpOworCisvKiBBbGxvY2F0aW9uIG9mIGV4cHJlc3Npb25zLiAgKi8KKworc3RhdGljIHN0cnVjdCBleHByZXNzaW9uICoKK25ld19leHAgKGludCBuYXJncywgZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKiBjb25zdCAqYXJncykKK3sKKyAgaW50IGk7CisgIHN0cnVjdCBleHByZXNzaW9uICpuZXdwOworCisgIC8qIElmIGFueSBvZiB0aGUgYXJndW1lbnQgY291bGQgbm90IGJlIG1hbGxvYydlZCwganVzdCByZXR1cm4gTlVMTC4gICovCisgIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgaWYgKGFyZ3NbaV0gPT0gTlVMTCkKKyAgICAgIGdvdG8gZmFpbDsKKworICAvKiBBbGxvY2F0ZSBhIG5ldyBleHByZXNzaW9uLiAgKi8KKyAgbmV3cCA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld3ApKTsKKyAgaWYgKG5ld3AgIT0gTlVMTCkKKyAgICB7CisgICAgICBuZXdwLT5uYXJncyA9IG5hcmdzOworICAgICAgbmV3cC0+b3BlcmF0aW9uID0gb3A7CisgICAgICBmb3IgKGkgPSBuYXJncyAtIDE7IGkgPj0gMDsgaS0tKQorCW5ld3AtPnZhbC5hcmdzW2ldID0gYXJnc1tpXTsKKyAgICAgIHJldHVybiBuZXdwOworICAgIH0KKworIGZhaWw6CisgIGZvciAoaSA9IG5hcmdzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgRlJFRV9FWFBSRVNTSU9OIChhcmdzW2ldKTsKKworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCituZXdfZXhwXzAgKGVudW0gb3BlcmF0b3Igb3ApCit7CisgIHJldHVybiBuZXdfZXhwICgwLCBvcCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHJlc3Npb24gKgorbmV3X2V4cF8xIChlbnVtIG9wZXJhdG9yIG9wLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqcmlnaHQpCit7CisgIHN0cnVjdCBleHByZXNzaW9uICphcmdzWzFdOworCisgIGFyZ3NbMF0gPSByaWdodDsKKyAgcmV0dXJuIG5ld19leHAgKDEsIG9wLCBhcmdzKTsKK30KKworc3RhdGljIHN0cnVjdCBleHByZXNzaW9uICoKK25ld19leHBfMiAoZW51bSBvcGVyYXRvciBvcCwgc3RydWN0IGV4cHJlc3Npb24gKmxlZnQsIHN0cnVjdCBleHByZXNzaW9uICpyaWdodCkKK3sKKyAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbMl07CisKKyAgYXJnc1swXSA9IGxlZnQ7CisgIGFyZ3NbMV0gPSByaWdodDsKKyAgcmV0dXJuIG5ld19leHAgKDIsIG9wLCBhcmdzKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXhwcmVzc2lvbiAqCituZXdfZXhwXzMgKGVudW0gb3BlcmF0b3Igb3AsIHN0cnVjdCBleHByZXNzaW9uICpiZXhwLAorCSAgIHN0cnVjdCBleHByZXNzaW9uICp0YnJhbmNoLCBzdHJ1Y3QgZXhwcmVzc2lvbiAqZmJyYW5jaCkKK3sKKyAgc3RydWN0IGV4cHJlc3Npb24gKmFyZ3NbM107CisKKyAgYXJnc1swXSA9IGJleHA7CisgIGFyZ3NbMV0gPSB0YnJhbmNoOworICBhcmdzWzJdID0gZmJyYW5jaDsKKyAgcmV0dXJuIG5ld19leHAgKDMsIG9wLCBhcmdzKTsKK30KKworJX0KKworLyogVGhpcyBkZWNsYXJlcyB0aGF0IGFsbCBvcGVyYXRvcnMgaGF2ZSB0aGUgc2FtZSBhc3NvY2lhdGl2aXR5IGFuZCB0aGUKKyAgIHByZWNlZGVuY2Ugb3JkZXIgYXMgaW4gQy4gIFNlZSBbSGFyYmlzb24sIFN0ZWVsZTogQywgQSBSZWZlcmVuY2UgTWFudWFsXS4KKyAgIFRoZXJlIGlzIG5vIHVuYXJ5IG1pbnVzIGFuZCBubyBiaXR3aXNlIG9wZXJhdG9ycy4KKyAgIE9wZXJhdG9ycyB3aXRoIHRoZSBzYW1lIHN5bnRhY3RpYyBiZWhhdmlvdXIgaGF2ZSBiZWVuIG1lcmdlZCBpbnRvIGEgc2luZ2xlCisgICB0b2tlbiwgdG8gc2F2ZSBzcGFjZSBpbiB0aGUgYXJyYXkgZ2VuZXJhdGVkIGJ5IGJpc29uLiAgKi8KKyVyaWdodCAnPycJCS8qICAgPwkJKi8KKyVsZWZ0ICd8JwkJLyogICB8fAkJKi8KKyVsZWZ0ICcmJwkJLyogICAmJgkJKi8KKyVsZWZ0IEVRVU9QMgkJLyogICA9PSAhPQkqLworJWxlZnQgQ01QT1AyCQkvKiAgIDwgPiA8PSA+PQkqLworJWxlZnQgQURET1AyCQkvKiAgICsgLQkqLworJWxlZnQgTVVMT1AyCQkvKiAgICogLyAlCSovCislcmlnaHQgJyEnCQkvKiAgICEJCSovCisKKyV0b2tlbiA8b3A+IEVRVU9QMiBDTVBPUDIgQURET1AyIE1VTE9QMgorJXRva2VuIDxudW0+IE5VTUJFUgorJXR5cGUgPGV4cD4gZXhwCisKKyUlCisKK3N0YXJ0OgkgIGV4cAorCSAgeworCSAgICBpZiAoJDEgPT0gTlVMTCkKKwkgICAgICBZWUFCT1JUOworCSAgICAoKHN0cnVjdCBwYXJzZV9hcmdzICopIGFyZyktPnJlcyA9ICQxOworCSAgfQorCTsKKworZXhwOgkgIGV4cCAnPycgZXhwICc6JyBleHAKKwkgIHsKKwkgICAgJCQgPSBuZXdfZXhwXzMgKHFtb3AsICQxLCAkMywgJDUpOworCSAgfQorCXwgZXhwICd8JyBleHAKKwkgIHsKKwkgICAgJCQgPSBuZXdfZXhwXzIgKGxvciwgJDEsICQzKTsKKwkgIH0KKwl8IGV4cCAnJicgZXhwCisJICB7CisJICAgICQkID0gbmV3X2V4cF8yIChsYW5kLCAkMSwgJDMpOworCSAgfQorCXwgZXhwIEVRVU9QMiBleHAKKwkgIHsKKwkgICAgJCQgPSBuZXdfZXhwXzIgKCQyLCAkMSwgJDMpOworCSAgfQorCXwgZXhwIENNUE9QMiBleHAKKwkgIHsKKwkgICAgJCQgPSBuZXdfZXhwXzIgKCQyLCAkMSwgJDMpOworCSAgfQorCXwgZXhwIEFERE9QMiBleHAKKwkgIHsKKwkgICAgJCQgPSBuZXdfZXhwXzIgKCQyLCAkMSwgJDMpOworCSAgfQorCXwgZXhwIE1VTE9QMiBleHAKKwkgIHsKKwkgICAgJCQgPSBuZXdfZXhwXzIgKCQyLCAkMSwgJDMpOworCSAgfQorCXwgJyEnIGV4cAorCSAgeworCSAgICAkJCA9IG5ld19leHBfMSAobG5vdCwgJDIpOworCSAgfQorCXwgJ24nCisJICB7CisJICAgICQkID0gbmV3X2V4cF8wICh2YXIpOworCSAgfQorCXwgTlVNQkVSCisJICB7CisJICAgIGlmICgoJCQgPSBuZXdfZXhwXzAgKG51bSkpICE9IE5VTEwpCisJICAgICAgJCQtPnZhbC5udW0gPSAkMTsKKwkgIH0KKwl8ICcoJyBleHAgJyknCisJICB7CisJICAgICQkID0gJDI7CisJICB9CisJOworCislJQorCit2b2lkCitpbnRlcm5hbF9mdW5jdGlvbgorRlJFRV9FWFBSRVNTSU9OIChzdHJ1Y3QgZXhwcmVzc2lvbiAqZXhwKQoreworICBpZiAoZXhwID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIEhhbmRsZSB0aGUgcmVjdXJzaXZlIGNhc2UuICAqLworICBzd2l0Y2ggKGV4cC0+bmFyZ3MpCisgICAgeworICAgIGNhc2UgMzoKKyAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1syXSk7CisgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgIGNhc2UgMjoKKyAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1sxXSk7CisgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgIGNhc2UgMToKKyAgICAgIEZSRUVfRVhQUkVTU0lPTiAoZXhwLT52YWwuYXJnc1swXSk7CisgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisKKyAgZnJlZSAoZXhwKTsKK30KKworCitzdGF0aWMgaW50Cit5eWxleCAoWVlTVFlQRSAqbHZhbCwgY29uc3QgY2hhciAqKnBleHApCit7CisgIGNvbnN0IGNoYXIgKmV4cCA9ICpwZXhwOworICBpbnQgcmVzdWx0OworCisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGlmIChleHBbMF0gPT0gJ1wwJykKKwl7CisJICAqcGV4cCA9IGV4cDsKKwkgIHJldHVybiBZWUVPRjsKKwl9CisKKyAgICAgIGlmIChleHBbMF0gIT0gJyAnICYmIGV4cFswXSAhPSAnXHQnKQorCWJyZWFrOworCisgICAgICArK2V4cDsKKyAgICB9CisKKyAgcmVzdWx0ID0gKmV4cCsrOworICBzd2l0Y2ggKHJlc3VsdCkKKyAgICB7CisgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKKyAgICAgIHsKKwl1bnNpZ25lZCBsb25nIGludCBuID0gcmVzdWx0IC0gJzAnOworCXdoaWxlIChleHBbMF0gPj0gJzAnICYmIGV4cFswXSA8PSAnOScpCisJICB7CisJICAgIG4gKj0gMTA7CisJICAgIG4gKz0gZXhwWzBdIC0gJzAnOworCSAgICArK2V4cDsKKwkgIH0KKwlsdmFsLT5udW0gPSBuOworCXJlc3VsdCA9IE5VTUJFUjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnPSc6CisgICAgICBpZiAoZXhwWzBdID09ICc9JykKKwl7CisJICArK2V4cDsKKwkgIGx2YWwtPm9wID0gZXF1YWw7CisJICByZXN1bHQgPSBFUVVPUDI7CisJfQorICAgICAgZWxzZQorCXJlc3VsdCA9IFlZRVJSQ09ERTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnISc6CisgICAgICBpZiAoZXhwWzBdID09ICc9JykKKwl7CisJICArK2V4cDsKKwkgIGx2YWwtPm9wID0gbm90X2VxdWFsOworCSAgcmVzdWx0ID0gRVFVT1AyOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnJic6CisgICAgY2FzZSAnfCc6CisgICAgICBpZiAoZXhwWzBdID09IHJlc3VsdCkKKwkrK2V4cDsKKyAgICAgIGVsc2UKKwlyZXN1bHQgPSBZWUVSUkNPREU7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJzwnOgorICAgICAgaWYgKGV4cFswXSA9PSAnPScpCisJeworCSAgKytleHA7CisJICBsdmFsLT5vcCA9IGxlc3Nfb3JfZXF1YWw7CisJfQorICAgICAgZWxzZQorCWx2YWwtPm9wID0gbGVzc190aGFuOworICAgICAgcmVzdWx0ID0gQ01QT1AyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICc+JzoKKyAgICAgIGlmIChleHBbMF0gPT0gJz0nKQorCXsKKwkgICsrZXhwOworCSAgbHZhbC0+b3AgPSBncmVhdGVyX29yX2VxdWFsOworCX0KKyAgICAgIGVsc2UKKwlsdmFsLT5vcCA9IGdyZWF0ZXJfdGhhbjsKKyAgICAgIHJlc3VsdCA9IENNUE9QMjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnKic6CisgICAgICBsdmFsLT5vcCA9IG11bHQ7CisgICAgICByZXN1bHQgPSBNVUxPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJy8nOgorICAgICAgbHZhbC0+b3AgPSBkaXZpZGU7CisgICAgICByZXN1bHQgPSBNVUxPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJyUnOgorICAgICAgbHZhbC0+b3AgPSBtb2R1bGU7CisgICAgICByZXN1bHQgPSBNVUxPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJysnOgorICAgICAgbHZhbC0+b3AgPSBwbHVzOworICAgICAgcmVzdWx0ID0gQURET1AyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICctJzoKKyAgICAgIGx2YWwtPm9wID0gbWludXM7CisgICAgICByZXN1bHQgPSBBRERPUDI7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ24nOgorICAgIGNhc2UgJz8nOgorICAgIGNhc2UgJzonOgorICAgIGNhc2UgJygnOgorICAgIGNhc2UgJyknOgorICAgICAgLyogTm90aGluZywganVzdCByZXR1cm4gdGhlIGNoYXJhY3Rlci4gICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgJzsnOgorICAgIGNhc2UgJ1xuJzoKKyAgICBjYXNlICdcMCc6CisgICAgICAvKiBCZSBzYWZlIGFuZCBsZXQgdGhlIHVzZXIgY2FsbCB0aGlzIGZ1bmN0aW9uIGFnYWluLiAgKi8KKyAgICAgIC0tZXhwOworICAgICAgcmVzdWx0ID0gWVlFT0Y7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXN1bHQgPSBZWUVSUkNPREU7CisjaWYgWVlERUJVRyAhPSAwCisgICAgICAtLWV4cDsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgfQorCisgICpwZXhwID0gZXhwOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIHZvaWQKK3l5ZXJyb3IgKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgLyogRG8gbm90aGluZy4gIFdlIGRvbid0IHByaW50IGVycm9yIG1lc3NhZ2VzIGhlcmUuICAqLworfQpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3ByaW50Zi1hcmdzLmMgYi91bml4L2ludGwvcHJpbnRmLWFyZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmYzMjE5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL3ByaW50Zi1hcmdzLmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qIERlY29tcG9zZWQgcHJpbnRmIGFyZ3VtZW50IGxpc3QuCisgICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKy8qIFNwZWNpZmljYXRpb24uICAqLworI2luY2x1ZGUgInByaW50Zi1hcmdzLmgiCisKKyNpZmRlZiBTVEFUSUMKK1NUQVRJQworI2VuZGlmCitpbnQKK3ByaW50Zl9mZXRjaGFyZ3MgKHZhX2xpc3QgYXJncywgYXJndW1lbnRzICphKQoreworICBzaXplX3QgaTsKKyAgYXJndW1lbnQgKmFwOworCisgIGZvciAoaSA9IDAsIGFwID0gJmEtPmFyZ1swXTsgaSA8IGEtPmNvdW50OyBpKyssIGFwKyspCisgICAgc3dpdGNoIChhcC0+dHlwZSkKKyAgICAgIHsKKyAgICAgIGNhc2UgVFlQRV9TQ0hBUjoKKwlhcC0+YS5hX3NjaGFyID0gdmFfYXJnIChhcmdzLCAvKnNpZ25lZCBjaGFyKi8gaW50KTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9VQ0hBUjoKKwlhcC0+YS5hX3VjaGFyID0gdmFfYXJnIChhcmdzLCAvKnVuc2lnbmVkIGNoYXIqLyBpbnQpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX1NIT1JUOgorCWFwLT5hLmFfc2hvcnQgPSB2YV9hcmcgKGFyZ3MsIC8qc2hvcnQqLyBpbnQpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX1VTSE9SVDoKKwlhcC0+YS5hX3VzaG9ydCA9IHZhX2FyZyAoYXJncywgLyp1bnNpZ25lZCBzaG9ydCovIGludCk7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfSU5UOgorCWFwLT5hLmFfaW50ID0gdmFfYXJnIChhcmdzLCBpbnQpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX1VJTlQ6CisJYXAtPmEuYV91aW50ID0gdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBpbnQpOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX0xPTkdJTlQ6CisJYXAtPmEuYV9sb25naW50ID0gdmFfYXJnIChhcmdzLCBsb25nIGludCk7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfVUxPTkdJTlQ6CisJYXAtPmEuYV91bG9uZ2ludCA9IHZhX2FyZyAoYXJncywgdW5zaWduZWQgbG9uZyBpbnQpOworCWJyZWFrOworI2lmZGVmIEhBVkVfTE9OR19MT05HCisgICAgICBjYXNlIFRZUEVfTE9OR0xPTkdJTlQ6CisJYXAtPmEuYV9sb25nbG9uZ2ludCA9IHZhX2FyZyAoYXJncywgbG9uZyBsb25nIGludCk7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfVUxPTkdMT05HSU5UOgorCWFwLT5hLmFfdWxvbmdsb25naW50ID0gdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBsb25nIGxvbmcgaW50KTsKKwlicmVhazsKKyNlbmRpZgorICAgICAgY2FzZSBUWVBFX0RPVUJMRToKKwlhcC0+YS5hX2RvdWJsZSA9IHZhX2FyZyAoYXJncywgZG91YmxlKTsKKwlicmVhazsKKyNpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCisgICAgICBjYXNlIFRZUEVfTE9OR0RPVUJMRToKKwlhcC0+YS5hX2xvbmdkb3VibGUgPSB2YV9hcmcgKGFyZ3MsIGxvbmcgZG91YmxlKTsKKwlicmVhazsKKyNlbmRpZgorICAgICAgY2FzZSBUWVBFX0NIQVI6CisJYXAtPmEuYV9jaGFyID0gdmFfYXJnIChhcmdzLCBpbnQpOworCWJyZWFrOworI2lmZGVmIEhBVkVfV0lOVF9UCisgICAgICBjYXNlIFRZUEVfV0lERV9DSEFSOgorCWFwLT5hLmFfd2lkZV9jaGFyID0gdmFfYXJnIChhcmdzLCB3aW50X3QpOworCWJyZWFrOworI2VuZGlmCisgICAgICBjYXNlIFRZUEVfU1RSSU5HOgorCWFwLT5hLmFfc3RyaW5nID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopOworCWJyZWFrOworI2lmZGVmIEhBVkVfV0NIQVJfVAorICAgICAgY2FzZSBUWVBFX1dJREVfU1RSSU5HOgorCWFwLT5hLmFfd2lkZV9zdHJpbmcgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IHdjaGFyX3QgKik7CisJYnJlYWs7CisjZW5kaWYKKyAgICAgIGNhc2UgVFlQRV9QT0lOVEVSOgorCWFwLT5hLmFfcG9pbnRlciA9IHZhX2FyZyAoYXJncywgdm9pZCAqKTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT1VOVF9TQ0hBUl9QT0lOVEVSOgorCWFwLT5hLmFfY291bnRfc2NoYXJfcG9pbnRlciA9IHZhX2FyZyAoYXJncywgc2lnbmVkIGNoYXIgKik7CisJYnJlYWs7CisgICAgICBjYXNlIFRZUEVfQ09VTlRfU0hPUlRfUE9JTlRFUjoKKwlhcC0+YS5hX2NvdW50X3Nob3J0X3BvaW50ZXIgPSB2YV9hcmcgKGFyZ3MsIHNob3J0ICopOworCWJyZWFrOworICAgICAgY2FzZSBUWVBFX0NPVU5UX0lOVF9QT0lOVEVSOgorCWFwLT5hLmFfY291bnRfaW50X3BvaW50ZXIgPSB2YV9hcmcgKGFyZ3MsIGludCAqKTsKKwlicmVhazsKKyAgICAgIGNhc2UgVFlQRV9DT1VOVF9MT05HSU5UX1BPSU5URVI6CisJYXAtPmEuYV9jb3VudF9sb25naW50X3BvaW50ZXIgPSB2YV9hcmcgKGFyZ3MsIGxvbmcgaW50ICopOworCWJyZWFrOworI2lmZGVmIEhBVkVfTE9OR19MT05HCisgICAgICBjYXNlIFRZUEVfQ09VTlRfTE9OR0xPTkdJTlRfUE9JTlRFUjoKKwlhcC0+YS5hX2NvdW50X2xvbmdsb25naW50X3BvaW50ZXIgPSB2YV9hcmcgKGFyZ3MsIGxvbmcgbG9uZyBpbnQgKik7CisJYnJlYWs7CisjZW5kaWYKKyAgICAgIGRlZmF1bHQ6CisJLyogVW5rbm93biB0eXBlLiAgKi8KKwlyZXR1cm4gLTE7CisgICAgICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3ByaW50Zi1hcmdzLmggYi91bml4L2ludGwvcHJpbnRmLWFyZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTFlNjRjCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL3ByaW50Zi1hcmdzLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8qIERlY29tcG9zZWQgcHJpbnRmIGFyZ3VtZW50IGxpc3QuCisgICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX1BSSU5URl9BUkdTX0gKKyNkZWZpbmUgX1BSSU5URl9BUkdTX0gKKworLyogR2V0IHNpemVfdC4gICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIEdldCB3Y2hhcl90LiAgKi8KKyNpZmRlZiBIQVZFX1dDSEFSX1QKKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKKworLyogR2V0IHdpbnRfdC4gICovCisjaWZkZWYgSEFWRV9XSU5UX1QKKyMgaW5jbHVkZSA8d2NoYXIuaD4KKyNlbmRpZgorCisvKiBHZXQgdmFfbGlzdC4gICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKworLyogQXJndW1lbnQgdHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICBUWVBFX05PTkUsCisgIFRZUEVfU0NIQVIsCisgIFRZUEVfVUNIQVIsCisgIFRZUEVfU0hPUlQsCisgIFRZUEVfVVNIT1JULAorICBUWVBFX0lOVCwKKyAgVFlQRV9VSU5ULAorICBUWVBFX0xPTkdJTlQsCisgIFRZUEVfVUxPTkdJTlQsCisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKyAgVFlQRV9MT05HTE9OR0lOVCwKKyAgVFlQRV9VTE9OR0xPTkdJTlQsCisjZW5kaWYKKyAgVFlQRV9ET1VCTEUsCisjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQorICBUWVBFX0xPTkdET1VCTEUsCisjZW5kaWYKKyAgVFlQRV9DSEFSLAorI2lmZGVmIEhBVkVfV0lOVF9UCisgIFRZUEVfV0lERV9DSEFSLAorI2VuZGlmCisgIFRZUEVfU1RSSU5HLAorI2lmZGVmIEhBVkVfV0NIQVJfVAorICBUWVBFX1dJREVfU1RSSU5HLAorI2VuZGlmCisgIFRZUEVfUE9JTlRFUiwKKyAgVFlQRV9DT1VOVF9TQ0hBUl9QT0lOVEVSLAorICBUWVBFX0NPVU5UX1NIT1JUX1BPSU5URVIsCisgIFRZUEVfQ09VTlRfSU5UX1BPSU5URVIsCisgIFRZUEVfQ09VTlRfTE9OR0lOVF9QT0lOVEVSCisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKywgVFlQRV9DT1VOVF9MT05HTE9OR0lOVF9QT0lOVEVSCisjZW5kaWYKK30gYXJnX3R5cGU7CisKKy8qIFBvbHltb3JwaGljIGFyZ3VtZW50ICovCit0eXBlZGVmIHN0cnVjdAoreworICBhcmdfdHlwZSB0eXBlOworICB1bmlvbgorICB7CisgICAgc2lnbmVkIGNoYXIJCQlhX3NjaGFyOworICAgIHVuc2lnbmVkIGNoYXIJCWFfdWNoYXI7CisgICAgc2hvcnQJCQlhX3Nob3J0OworICAgIHVuc2lnbmVkIHNob3J0CQlhX3VzaG9ydDsKKyAgICBpbnQJCQkJYV9pbnQ7CisgICAgdW5zaWduZWQgaW50CQlhX3VpbnQ7CisgICAgbG9uZyBpbnQJCQlhX2xvbmdpbnQ7CisgICAgdW5zaWduZWQgbG9uZyBpbnQJCWFfdWxvbmdpbnQ7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKyAgICBsb25nIGxvbmcgaW50CQlhX2xvbmdsb25naW50OworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQJYV91bG9uZ2xvbmdpbnQ7CisjZW5kaWYKKyAgICBmbG9hdAkJCWFfZmxvYXQ7CisgICAgZG91YmxlCQkJYV9kb3VibGU7CisjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQorICAgIGxvbmcgZG91YmxlCQkJYV9sb25nZG91YmxlOworI2VuZGlmCisgICAgaW50CQkJCWFfY2hhcjsKKyNpZmRlZiBIQVZFX1dJTlRfVAorICAgIHdpbnRfdAkJCWFfd2lkZV9jaGFyOworI2VuZGlmCisgICAgY29uc3QgY2hhcioJCQlhX3N0cmluZzsKKyNpZmRlZiBIQVZFX1dDSEFSX1QKKyAgICBjb25zdCB3Y2hhcl90KgkJYV93aWRlX3N0cmluZzsKKyNlbmRpZgorICAgIHZvaWQqCQkJYV9wb2ludGVyOworICAgIHNpZ25lZCBjaGFyICoJCWFfY291bnRfc2NoYXJfcG9pbnRlcjsKKyAgICBzaG9ydCAqCQkJYV9jb3VudF9zaG9ydF9wb2ludGVyOworICAgIGludCAqCQkJYV9jb3VudF9pbnRfcG9pbnRlcjsKKyAgICBsb25nIGludCAqCQkJYV9jb3VudF9sb25naW50X3BvaW50ZXI7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKyAgICBsb25nIGxvbmcgaW50ICoJCWFfY291bnRfbG9uZ2xvbmdpbnRfcG9pbnRlcjsKKyNlbmRpZgorICB9CisgIGE7Cit9Cithcmd1bWVudDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgc2l6ZV90IGNvdW50OworICBhcmd1bWVudCAqYXJnOworfQorYXJndW1lbnRzOworCisKKy8qIEZldGNoIHRoZSBhcmd1bWVudHMsIHB1dHRpbmcgdGhlbSBpbnRvIGEuICovCisjaWZkZWYgU1RBVElDCitTVEFUSUMKKyNlbHNlCitleHRlcm4KKyNlbmRpZgoraW50IHByaW50Zl9mZXRjaGFyZ3MgKHZhX2xpc3QgYXJncywgYXJndW1lbnRzICphKTsKKworI2VuZGlmIC8qIF9QUklOVEZfQVJHU19IICovCmRpZmYgLS1naXQgYS91bml4L2ludGwvcHJpbnRmLXBhcnNlLmMgYi91bml4L2ludGwvcHJpbnRmLXBhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE5ZjkwMwotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9wcmludGYtcGFyc2UuYwpAQCAtMCwwICsxLDUzNyBAQAorLyogRm9ybWF0dGVkIG91dHB1dCB0byBzdHJpbmdzLgorICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDAsIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKy8qIFNwZWNpZmljYXRpb24uICAqLworI2lmIFdJREVfQ0hBUl9WRVJTSU9OCisjIGluY2x1ZGUgIndwcmludGYtcGFyc2UuaCIKKyNlbHNlCisjIGluY2x1ZGUgInByaW50Zi1wYXJzZS5oIgorI2VuZGlmCisKKy8qIEdldCBzaXplX3QsIE5VTEwuICAqLworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBHZXQgaW50bWF4X3QuICAqLworI2lmIEhBVkVfU1RESU5UX0hfV0lUSF9VSU5UTUFYCisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWYgSEFWRV9JTlRUWVBFU19IX1dJVEhfVUlOVE1BWAorIyBpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisKKy8qIG1hbGxvYygpLCByZWFsbG9jKCksIGZyZWUoKS4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qIENoZWNrZWQgc2l6ZV90IGNvbXB1dGF0aW9ucy4gICovCisjaW5jbHVkZSAieHNpemUuaCIKKworI2lmIFdJREVfQ0hBUl9WRVJTSU9OCisjIGRlZmluZSBQUklOVEZfUEFSU0Ugd3ByaW50Zl9wYXJzZQorIyBkZWZpbmUgQ0hBUl9UIHdjaGFyX3QKKyMgZGVmaW5lIERJUkVDVElWRSB3Y2hhcl90X2RpcmVjdGl2ZQorIyBkZWZpbmUgRElSRUNUSVZFUyB3Y2hhcl90X2RpcmVjdGl2ZXMKKyNlbHNlCisjIGRlZmluZSBQUklOVEZfUEFSU0UgcHJpbnRmX3BhcnNlCisjIGRlZmluZSBDSEFSX1QgY2hhcgorIyBkZWZpbmUgRElSRUNUSVZFIGNoYXJfZGlyZWN0aXZlCisjIGRlZmluZSBESVJFQ1RJVkVTIGNoYXJfZGlyZWN0aXZlcworI2VuZGlmCisKKyNpZmRlZiBTVEFUSUMKK1NUQVRJQworI2VuZGlmCitpbnQKK1BSSU5URl9QQVJTRSAoY29uc3QgQ0hBUl9UICpmb3JtYXQsIERJUkVDVElWRVMgKmQsIGFyZ3VtZW50cyAqYSkKK3sKKyAgY29uc3QgQ0hBUl9UICpjcCA9IGZvcm1hdDsJCS8qIHBvaW50ZXIgaW50byBmb3JtYXQgKi8KKyAgc2l6ZV90IGFyZ19wb3NuID0gMDsJCS8qIG51bWJlciBvZiByZWd1bGFyIGFyZ3VtZW50cyBjb25zdW1lZCAqLworICBzaXplX3QgZF9hbGxvY2F0ZWQ7CQkJLyogYWxsb2NhdGVkIGVsZW1lbnRzIG9mIGQtPmRpciAqLworICBzaXplX3QgYV9hbGxvY2F0ZWQ7CQkJLyogYWxsb2NhdGVkIGVsZW1lbnRzIG9mIGEtPmFyZyAqLworICBzaXplX3QgbWF4X3dpZHRoX2xlbmd0aCA9IDA7CisgIHNpemVfdCBtYXhfcHJlY2lzaW9uX2xlbmd0aCA9IDA7CisKKyAgZC0+Y291bnQgPSAwOworICBkX2FsbG9jYXRlZCA9IDE7CisgIGQtPmRpciA9IG1hbGxvYyAoZF9hbGxvY2F0ZWQgKiBzaXplb2YgKERJUkVDVElWRSkpOworICBpZiAoZC0+ZGlyID09IE5VTEwpCisgICAgLyogT3V0IG9mIG1lbW9yeS4gICovCisgICAgcmV0dXJuIC0xOworCisgIGEtPmNvdW50ID0gMDsKKyAgYV9hbGxvY2F0ZWQgPSAwOworICBhLT5hcmcgPSBOVUxMOworCisjZGVmaW5lIFJFR0lTVEVSX0FSRyhfaW5kZXhfLF90eXBlXykgXAorICB7CQkJCQkJCQkJXAorICAgIHNpemVfdCBuID0gKF9pbmRleF8pOwkJCQkJCVwKKyAgICBpZiAobiA+PSBhX2FsbG9jYXRlZCkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCXNpemVfdCBtZW1vcnlfc2l6ZTsJCQkJCQlcCisJYXJndW1lbnQgKm1lbW9yeTsJCQkJCQlcCisJCQkJCQkJCQlcCisJYV9hbGxvY2F0ZWQgPSB4dGltZXMgKGFfYWxsb2NhdGVkLCAyKTsJCQkJXAorCWlmIChhX2FsbG9jYXRlZCA8PSBuKQkJCQkJCVwKKwkgIGFfYWxsb2NhdGVkID0geHN1bSAobiwgMSk7CQkJCQlcCisJbWVtb3J5X3NpemUgPSB4dGltZXMgKGFfYWxsb2NhdGVkLCBzaXplb2YgKGFyZ3VtZW50KSk7CQlcCisJaWYgKHNpemVfb3ZlcmZsb3dfcCAobWVtb3J5X3NpemUpKQkJCQlcCisJICAvKiBPdmVyZmxvdywgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5LiAgKi8JCQlcCisJICBnb3RvIGVycm9yOwkJCQkJCQlcCisJbWVtb3J5ID0gKGEtPmFyZwkJCQkJCVwKKwkJICA/IHJlYWxsb2MgKGEtPmFyZywgbWVtb3J5X3NpemUpCQkJXAorCQkgIDogbWFsbG9jIChtZW1vcnlfc2l6ZSkpOwkJCQlcCisJaWYgKG1lbW9yeSA9PSBOVUxMKQkJCQkJCVwKKwkgIC8qIE91dCBvZiBtZW1vcnkuICAqLwkJCQkJCVwKKwkgIGdvdG8gZXJyb3I7CQkJCQkJCVwKKwlhLT5hcmcgPSBtZW1vcnk7CQkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICB3aGlsZSAoYS0+Y291bnQgPD0gbikJCQkJCQlcCisgICAgICBhLT5hcmdbYS0+Y291bnQrK10udHlwZSA9IFRZUEVfTk9ORTsJCQkJXAorICAgIGlmIChhLT5hcmdbbl0udHlwZSA9PSBUWVBFX05PTkUpCQkJCQlcCisgICAgICBhLT5hcmdbbl0udHlwZSA9IChfdHlwZV8pOwkJCQkJXAorICAgIGVsc2UgaWYgKGEtPmFyZ1tuXS50eXBlICE9IChfdHlwZV8pKQkJCQlcCisgICAgICAvKiBBbWJpZ3VvdXMgdHlwZSBmb3IgcG9zaXRpb25hbCBhcmd1bWVudC4gICovCQkJXAorICAgICAgZ290byBlcnJvcjsJCQkJCQkJXAorICB9CisKKyAgd2hpbGUgKCpjcCAhPSAnXDAnKQorICAgIHsKKyAgICAgIENIQVJfVCBjID0gKmNwKys7CisgICAgICBpZiAoYyA9PSAnJScpCisJeworCSAgc2l6ZV90IGFyZ19pbmRleCA9IEFSR19OT05FOworCSAgRElSRUNUSVZFICpkcCA9ICZkLT5kaXJbZC0+Y291bnRdOy8qIHBvaW50ZXIgdG8gbmV4dCBkaXJlY3RpdmUgKi8KKworCSAgLyogSW5pdGlhbGl6ZSB0aGUgbmV4dCBkaXJlY3RpdmUuICAqLworCSAgZHAtPmRpcl9zdGFydCA9IGNwIC0gMTsKKwkgIGRwLT5mbGFncyA9IDA7CisJICBkcC0+d2lkdGhfc3RhcnQgPSBOVUxMOworCSAgZHAtPndpZHRoX2VuZCA9IE5VTEw7CisJICBkcC0+d2lkdGhfYXJnX2luZGV4ID0gQVJHX05PTkU7CisJICBkcC0+cHJlY2lzaW9uX3N0YXJ0ID0gTlVMTDsKKwkgIGRwLT5wcmVjaXNpb25fZW5kID0gTlVMTDsKKwkgIGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ID0gQVJHX05PTkU7CisJICBkcC0+YXJnX2luZGV4ID0gQVJHX05PTkU7CisKKwkgIC8qIFRlc3QgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnQuICAqLworCSAgaWYgKCpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JykKKwkgICAgeworCSAgICAgIGNvbnN0IENIQVJfVCAqbnA7CisKKwkgICAgICBmb3IgKG5wID0gY3A7ICpucCA+PSAnMCcgJiYgKm5wIDw9ICc5JzsgbnArKykKKwkJOworCSAgICAgIGlmICgqbnAgPT0gJyQnKQorCQl7CisJCSAgc2l6ZV90IG4gPSAwOworCisJCSAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCisJCSAgICBuID0geHN1bSAoeHRpbWVzIChuLCAxMCksICpucCAtICcwJyk7CisJCSAgaWYgKG4gPT0gMCkKKwkJICAgIC8qIFBvc2l0aW9uYWwgYXJndW1lbnQgMC4gICovCisJCSAgICBnb3RvIGVycm9yOworCQkgIGlmIChzaXplX292ZXJmbG93X3AgKG4pKQorCQkgICAgLyogbiB0b28gbGFyZ2UsIHdvdWxkIGxlYWQgdG8gb3V0IG9mIG1lbW9yeSBsYXRlci4gICovCisJCSAgICBnb3RvIGVycm9yOworCQkgIGFyZ19pbmRleCA9IG4gLSAxOworCQkgIGNwID0gbnAgKyAxOworCQl9CisJICAgIH0KKworCSAgLyogUmVhZCB0aGUgZmxhZ3MuICAqLworCSAgZm9yICg7OykKKwkgICAgeworCSAgICAgIGlmICgqY3AgPT0gJ1wnJykKKwkJeworCQkgIGRwLT5mbGFncyB8PSBGTEFHX0dST1VQOworCQkgIGNwKys7CisJCX0KKwkgICAgICBlbHNlIGlmICgqY3AgPT0gJy0nKQorCQl7CisJCSAgZHAtPmZsYWdzIHw9IEZMQUdfTEVGVDsKKwkJICBjcCsrOworCQl9CisJICAgICAgZWxzZSBpZiAoKmNwID09ICcrJykKKwkJeworCQkgIGRwLT5mbGFncyB8PSBGTEFHX1NIT1dTSUdOOworCQkgIGNwKys7CisJCX0KKwkgICAgICBlbHNlIGlmICgqY3AgPT0gJyAnKQorCQl7CisJCSAgZHAtPmZsYWdzIHw9IEZMQUdfU1BBQ0U7CisJCSAgY3ArKzsKKwkJfQorCSAgICAgIGVsc2UgaWYgKCpjcCA9PSAnIycpCisJCXsKKwkJICBkcC0+ZmxhZ3MgfD0gRkxBR19BTFQ7CisJCSAgY3ArKzsKKwkJfQorCSAgICAgIGVsc2UgaWYgKCpjcCA9PSAnMCcpCisJCXsKKwkJICBkcC0+ZmxhZ3MgfD0gRkxBR19aRVJPOworCQkgIGNwKys7CisJCX0KKwkgICAgICBlbHNlCisJCWJyZWFrOworCSAgICB9CisKKwkgIC8qIFBhcnNlIHRoZSBmaWVsZCB3aWR0aC4gICovCisJICBpZiAoKmNwID09ICcqJykKKwkgICAgeworCSAgICAgIGRwLT53aWR0aF9zdGFydCA9IGNwOworCSAgICAgIGNwKys7CisJICAgICAgZHAtPndpZHRoX2VuZCA9IGNwOworCSAgICAgIGlmIChtYXhfd2lkdGhfbGVuZ3RoIDwgMSkKKwkJbWF4X3dpZHRoX2xlbmd0aCA9IDE7CisKKwkgICAgICAvKiBUZXN0IGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50LiAgKi8KKwkgICAgICBpZiAoKmNwID49ICcwJyAmJiAqY3AgPD0gJzknKQorCQl7CisJCSAgY29uc3QgQ0hBUl9UICpucDsKKworCQkgIGZvciAobnAgPSBjcDsgKm5wID49ICcwJyAmJiAqbnAgPD0gJzknOyBucCsrKQorCQkgICAgOworCQkgIGlmICgqbnAgPT0gJyQnKQorCQkgICAgeworCQkgICAgICBzaXplX3QgbiA9IDA7CisKKwkJICAgICAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCisJCQluID0geHN1bSAoeHRpbWVzIChuLCAxMCksICpucCAtICcwJyk7CisJCSAgICAgIGlmIChuID09IDApCisJCQkvKiBQb3NpdGlvbmFsIGFyZ3VtZW50IDAuICAqLworCQkJZ290byBlcnJvcjsKKwkJICAgICAgaWYgKHNpemVfb3ZlcmZsb3dfcCAobikpCisJCQkvKiBuIHRvbyBsYXJnZSwgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5IGxhdGVyLiAgKi8KKwkJCWdvdG8gZXJyb3I7CisJCSAgICAgIGRwLT53aWR0aF9hcmdfaW5kZXggPSBuIC0gMTsKKwkJICAgICAgY3AgPSBucCArIDE7CisJCSAgICB9CisJCX0KKwkgICAgICBpZiAoZHAtPndpZHRoX2FyZ19pbmRleCA9PSBBUkdfTk9ORSkKKwkJeworCQkgIGRwLT53aWR0aF9hcmdfaW5kZXggPSBhcmdfcG9zbisrOworCQkgIGlmIChkcC0+d2lkdGhfYXJnX2luZGV4ID09IEFSR19OT05FKQorCQkgICAgLyogYXJnX3Bvc24gd3JhcHBlZCBhcm91bmQuICAqLworCQkgICAgZ290byBlcnJvcjsKKwkJfQorCSAgICAgIFJFR0lTVEVSX0FSRyAoZHAtPndpZHRoX2FyZ19pbmRleCwgVFlQRV9JTlQpOworCSAgICB9CisJICBlbHNlIGlmICgqY3AgPj0gJzAnICYmICpjcCA8PSAnOScpCisJICAgIHsKKwkgICAgICBzaXplX3Qgd2lkdGhfbGVuZ3RoOworCisJICAgICAgZHAtPndpZHRoX3N0YXJ0ID0gY3A7CisJICAgICAgZm9yICg7ICpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JzsgY3ArKykKKwkJOworCSAgICAgIGRwLT53aWR0aF9lbmQgPSBjcDsKKwkgICAgICB3aWR0aF9sZW5ndGggPSBkcC0+d2lkdGhfZW5kIC0gZHAtPndpZHRoX3N0YXJ0OworCSAgICAgIGlmIChtYXhfd2lkdGhfbGVuZ3RoIDwgd2lkdGhfbGVuZ3RoKQorCQltYXhfd2lkdGhfbGVuZ3RoID0gd2lkdGhfbGVuZ3RoOworCSAgICB9CisKKwkgIC8qIFBhcnNlIHRoZSBwcmVjaXNpb24uICAqLworCSAgaWYgKCpjcCA9PSAnLicpCisJICAgIHsKKwkgICAgICBjcCsrOworCSAgICAgIGlmICgqY3AgPT0gJyonKQorCQl7CisJCSAgZHAtPnByZWNpc2lvbl9zdGFydCA9IGNwIC0gMTsKKwkJICBjcCsrOworCQkgIGRwLT5wcmVjaXNpb25fZW5kID0gY3A7CisJCSAgaWYgKG1heF9wcmVjaXNpb25fbGVuZ3RoIDwgMikKKwkJICAgIG1heF9wcmVjaXNpb25fbGVuZ3RoID0gMjsKKworCQkgIC8qIFRlc3QgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnQuICAqLworCQkgIGlmICgqY3AgPj0gJzAnICYmICpjcCA8PSAnOScpCisJCSAgICB7CisJCSAgICAgIGNvbnN0IENIQVJfVCAqbnA7CisKKwkJICAgICAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCisJCQk7CisJCSAgICAgIGlmICgqbnAgPT0gJyQnKQorCQkJeworCQkJICBzaXplX3QgbiA9IDA7CisKKwkJCSAgZm9yIChucCA9IGNwOyAqbnAgPj0gJzAnICYmICpucCA8PSAnOSc7IG5wKyspCisJCQkgICAgbiA9IHhzdW0gKHh0aW1lcyAobiwgMTApLCAqbnAgLSAnMCcpOworCQkJICBpZiAobiA9PSAwKQorCQkJICAgIC8qIFBvc2l0aW9uYWwgYXJndW1lbnQgMC4gICovCisJCQkgICAgZ290byBlcnJvcjsKKwkJCSAgaWYgKHNpemVfb3ZlcmZsb3dfcCAobikpCisJCQkgICAgLyogbiB0b28gbGFyZ2UsIHdvdWxkIGxlYWQgdG8gb3V0IG9mIG1lbW9yeQorCQkJICAgICAgIGxhdGVyLiAgKi8KKwkJCSAgICBnb3RvIGVycm9yOworCQkJICBkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCA9IG4gLSAxOworCQkJICBjcCA9IG5wICsgMTsKKwkJCX0KKwkJICAgIH0KKwkJICBpZiAoZHAtPnByZWNpc2lvbl9hcmdfaW5kZXggPT0gQVJHX05PTkUpCisJCSAgICB7CisJCSAgICAgIGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ID0gYXJnX3Bvc24rKzsKKwkJICAgICAgaWYgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ID09IEFSR19OT05FKQorCQkJLyogYXJnX3Bvc24gd3JhcHBlZCBhcm91bmQuICAqLworCQkJZ290byBlcnJvcjsKKwkJICAgIH0KKwkJICBSRUdJU1RFUl9BUkcgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4LCBUWVBFX0lOVCk7CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICBzaXplX3QgcHJlY2lzaW9uX2xlbmd0aDsKKworCQkgIGRwLT5wcmVjaXNpb25fc3RhcnQgPSBjcCAtIDE7CisJCSAgZm9yICg7ICpjcCA+PSAnMCcgJiYgKmNwIDw9ICc5JzsgY3ArKykKKwkJICAgIDsKKwkJICBkcC0+cHJlY2lzaW9uX2VuZCA9IGNwOworCQkgIHByZWNpc2lvbl9sZW5ndGggPSBkcC0+cHJlY2lzaW9uX2VuZCAtIGRwLT5wcmVjaXNpb25fc3RhcnQ7CisJCSAgaWYgKG1heF9wcmVjaXNpb25fbGVuZ3RoIDwgcHJlY2lzaW9uX2xlbmd0aCkKKwkJICAgIG1heF9wcmVjaXNpb25fbGVuZ3RoID0gcHJlY2lzaW9uX2xlbmd0aDsKKwkJfQorCSAgICB9CisKKwkgIHsKKwkgICAgYXJnX3R5cGUgdHlwZTsKKworCSAgICAvKiBQYXJzZSBhcmd1bWVudCB0eXBlL3NpemUgc3BlY2lmaWVycy4gICovCisJICAgIHsKKwkgICAgICBpbnQgZmxhZ3MgPSAwOworCisJICAgICAgZm9yICg7OykKKwkJeworCQkgIGlmICgqY3AgPT0gJ2gnKQorCQkgICAgeworCQkgICAgICBmbGFncyB8PSAoMSA8PCAoZmxhZ3MgJiAxKSk7CisJCSAgICAgIGNwKys7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoKmNwID09ICdMJykKKwkJICAgIHsKKwkJICAgICAgZmxhZ3MgfD0gNDsKKwkJICAgICAgY3ArKzsKKwkJICAgIH0KKwkJICBlbHNlIGlmICgqY3AgPT0gJ2wnKQorCQkgICAgeworCQkgICAgICBmbGFncyArPSA4OworCQkgICAgICBjcCsrOworCQkgICAgfQorI2lmZGVmIEhBVkVfSU5UTUFYX1QKKwkJICBlbHNlIGlmICgqY3AgPT0gJ2onKQorCQkgICAgeworCQkgICAgICBpZiAoc2l6ZW9mIChpbnRtYXhfdCkgPiBzaXplb2YgKGxvbmcpKQorCQkJeworCQkJICAvKiBpbnRtYXhfdCA9IGxvbmcgbG9uZyAqLworCQkJICBmbGFncyArPSAxNjsKKwkJCX0KKwkJICAgICAgZWxzZSBpZiAoc2l6ZW9mIChpbnRtYXhfdCkgPiBzaXplb2YgKGludCkpCisJCQl7CisJCQkgIC8qIGludG1heF90ID0gbG9uZyAqLworCQkJICBmbGFncyArPSA4OworCQkJfQorCQkgICAgICBjcCsrOworCQkgICAgfQorI2VuZGlmCisJCSAgZWxzZSBpZiAoKmNwID09ICd6JyB8fCAqY3AgPT0gJ1onKQorCQkgICAgeworCQkgICAgICAvKiAneicgaXMgc3RhbmRhcmRpemVkIGluIElTTyBDIDk5LCBidXQgZ2xpYmMgdXNlcyAnWicKKwkJCSBiZWNhdXNlIHRoZSB3YXJuaW5nIGZhY2lsaXR5IGluIGdjYy0yLjk1LjIgdW5kZXJzdGFuZHMKKwkJCSBvbmx5ICdaJyAoc2VlIGdjYy0yLjk1LjIvZ2NjL2MtY29tbW9uLmM6MTc4NCkuICAqLworCQkgICAgICBpZiAoc2l6ZW9mIChzaXplX3QpID4gc2l6ZW9mIChsb25nKSkKKwkJCXsKKwkJCSAgLyogc2l6ZV90ID0gbG9uZyBsb25nICovCisJCQkgIGZsYWdzICs9IDE2OworCQkJfQorCQkgICAgICBlbHNlIGlmIChzaXplb2YgKHNpemVfdCkgPiBzaXplb2YgKGludCkpCisJCQl7CisJCQkgIC8qIHNpemVfdCA9IGxvbmcgKi8KKwkJCSAgZmxhZ3MgKz0gODsKKwkJCX0KKwkJICAgICAgY3ArKzsKKwkJICAgIH0KKwkJICBlbHNlIGlmICgqY3AgPT0gJ3QnKQorCQkgICAgeworCQkgICAgICBpZiAoc2l6ZW9mIChwdHJkaWZmX3QpID4gc2l6ZW9mIChsb25nKSkKKwkJCXsKKwkJCSAgLyogcHRyZGlmZl90ID0gbG9uZyBsb25nICovCisJCQkgIGZsYWdzICs9IDE2OworCQkJfQorCQkgICAgICBlbHNlIGlmIChzaXplb2YgKHB0cmRpZmZfdCkgPiBzaXplb2YgKGludCkpCisJCQl7CisJCQkgIC8qIHB0cmRpZmZfdCA9IGxvbmcgKi8KKwkJCSAgZmxhZ3MgKz0gODsKKwkJCX0KKwkJICAgICAgY3ArKzsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICBicmVhazsKKwkJfQorCisJICAgICAgLyogUmVhZCB0aGUgY29udmVyc2lvbiBjaGFyYWN0ZXIuICAqLworCSAgICAgIGMgPSAqY3ArKzsKKwkgICAgICBzd2l0Y2ggKGMpCisJCXsKKwkJY2FzZSAnZCc6IGNhc2UgJ2knOgorI2lmZGVmIEhBVkVfTE9OR19MT05HCisJCSAgaWYgKGZsYWdzID49IDE2IHx8IChmbGFncyAmIDQpKQorCQkgICAgdHlwZSA9IFRZUEVfTE9OR0xPTkdJTlQ7CisJCSAgZWxzZQorI2VuZGlmCisJCSAgaWYgKGZsYWdzID49IDgpCisJCSAgICB0eXBlID0gVFlQRV9MT05HSU5UOworCQkgIGVsc2UgaWYgKGZsYWdzICYgMikKKwkJICAgIHR5cGUgPSBUWVBFX1NDSEFSOworCQkgIGVsc2UgaWYgKGZsYWdzICYgMSkKKwkJICAgIHR5cGUgPSBUWVBFX1NIT1JUOworCQkgIGVsc2UKKwkJICAgIHR5cGUgPSBUWVBFX0lOVDsKKwkJICBicmVhazsKKwkJY2FzZSAnbyc6IGNhc2UgJ3UnOiBjYXNlICd4JzogY2FzZSAnWCc6CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKwkJICBpZiAoZmxhZ3MgPj0gMTYgfHwgKGZsYWdzICYgNCkpCisJCSAgICB0eXBlID0gVFlQRV9VTE9OR0xPTkdJTlQ7CisJCSAgZWxzZQorI2VuZGlmCisJCSAgaWYgKGZsYWdzID49IDgpCisJCSAgICB0eXBlID0gVFlQRV9VTE9OR0lOVDsKKwkJICBlbHNlIGlmIChmbGFncyAmIDIpCisJCSAgICB0eXBlID0gVFlQRV9VQ0hBUjsKKwkJICBlbHNlIGlmIChmbGFncyAmIDEpCisJCSAgICB0eXBlID0gVFlQRV9VU0hPUlQ7CisJCSAgZWxzZQorCQkgICAgdHlwZSA9IFRZUEVfVUlOVDsKKwkJICBicmVhazsKKwkJY2FzZSAnZic6IGNhc2UgJ0YnOiBjYXNlICdlJzogY2FzZSAnRSc6IGNhc2UgJ2cnOiBjYXNlICdHJzoKKwkJY2FzZSAnYSc6IGNhc2UgJ0EnOgorI2lmZGVmIEhBVkVfTE9OR19ET1VCTEUKKwkJICBpZiAoZmxhZ3MgPj0gMTYgfHwgKGZsYWdzICYgNCkpCisJCSAgICB0eXBlID0gVFlQRV9MT05HRE9VQkxFOworCQkgIGVsc2UKKyNlbmRpZgorCQkgIHR5cGUgPSBUWVBFX0RPVUJMRTsKKwkJICBicmVhazsKKwkJY2FzZSAnYyc6CisJCSAgaWYgKGZsYWdzID49IDgpCisjaWZkZWYgSEFWRV9XSU5UX1QKKwkJICAgIHR5cGUgPSBUWVBFX1dJREVfQ0hBUjsKKyNlbHNlCisJCSAgICBnb3RvIGVycm9yOworI2VuZGlmCisJCSAgZWxzZQorCQkgICAgdHlwZSA9IFRZUEVfQ0hBUjsKKwkJICBicmVhazsKKyNpZmRlZiBIQVZFX1dJTlRfVAorCQljYXNlICdDJzoKKwkJICB0eXBlID0gVFlQRV9XSURFX0NIQVI7CisJCSAgYyA9ICdjJzsKKwkJICBicmVhazsKKyNlbmRpZgorCQljYXNlICdzJzoKKwkJICBpZiAoZmxhZ3MgPj0gOCkKKyNpZmRlZiBIQVZFX1dDSEFSX1QKKwkJICAgIHR5cGUgPSBUWVBFX1dJREVfU1RSSU5HOworI2Vsc2UKKwkJICAgIGdvdG8gZXJyb3I7CisjZW5kaWYKKwkJICBlbHNlCisJCSAgICB0eXBlID0gVFlQRV9TVFJJTkc7CisJCSAgYnJlYWs7CisjaWZkZWYgSEFWRV9XQ0hBUl9UCisJCWNhc2UgJ1MnOgorCQkgIHR5cGUgPSBUWVBFX1dJREVfU1RSSU5HOworCQkgIGMgPSAncyc7CisJCSAgYnJlYWs7CisjZW5kaWYKKwkJY2FzZSAncCc6CisJCSAgdHlwZSA9IFRZUEVfUE9JTlRFUjsKKwkJICBicmVhazsKKwkJY2FzZSAnbic6CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKwkJICBpZiAoZmxhZ3MgPj0gMTYgfHwgKGZsYWdzICYgNCkpCisJCSAgICB0eXBlID0gVFlQRV9DT1VOVF9MT05HTE9OR0lOVF9QT0lOVEVSOworCQkgIGVsc2UKKyNlbmRpZgorCQkgIGlmIChmbGFncyA+PSA4KQorCQkgICAgdHlwZSA9IFRZUEVfQ09VTlRfTE9OR0lOVF9QT0lOVEVSOworCQkgIGVsc2UgaWYgKGZsYWdzICYgMikKKwkJICAgIHR5cGUgPSBUWVBFX0NPVU5UX1NDSEFSX1BPSU5URVI7CisJCSAgZWxzZSBpZiAoZmxhZ3MgJiAxKQorCQkgICAgdHlwZSA9IFRZUEVfQ09VTlRfU0hPUlRfUE9JTlRFUjsKKwkJICBlbHNlCisJCSAgICB0eXBlID0gVFlQRV9DT1VOVF9JTlRfUE9JTlRFUjsKKwkJICBicmVhazsKKwkJY2FzZSAnJSc6CisJCSAgdHlwZSA9IFRZUEVfTk9ORTsKKwkJICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAvKiBVbmtub3duIGNvbnZlcnNpb24gY2hhcmFjdGVyLiAgKi8KKwkJICBnb3RvIGVycm9yOworCQl9CisJICAgIH0KKworCSAgICBpZiAodHlwZSAhPSBUWVBFX05PTkUpCisJICAgICAgeworCQlkcC0+YXJnX2luZGV4ID0gYXJnX2luZGV4OworCQlpZiAoZHAtPmFyZ19pbmRleCA9PSBBUkdfTk9ORSkKKwkJICB7CisJCSAgICBkcC0+YXJnX2luZGV4ID0gYXJnX3Bvc24rKzsKKwkJICAgIGlmIChkcC0+YXJnX2luZGV4ID09IEFSR19OT05FKQorCQkgICAgICAvKiBhcmdfcG9zbiB3cmFwcGVkIGFyb3VuZC4gICovCisJCSAgICAgIGdvdG8gZXJyb3I7CisJCSAgfQorCQlSRUdJU1RFUl9BUkcgKGRwLT5hcmdfaW5kZXgsIHR5cGUpOworCSAgICAgIH0KKwkgICAgZHAtPmNvbnZlcnNpb24gPSBjOworCSAgICBkcC0+ZGlyX2VuZCA9IGNwOworCSAgfQorCisJICBkLT5jb3VudCsrOworCSAgaWYgKGQtPmNvdW50ID49IGRfYWxsb2NhdGVkKQorCSAgICB7CisJICAgICAgc2l6ZV90IG1lbW9yeV9zaXplOworCSAgICAgIERJUkVDVElWRSAqbWVtb3J5OworCisJICAgICAgZF9hbGxvY2F0ZWQgPSB4dGltZXMgKGRfYWxsb2NhdGVkLCAyKTsKKwkgICAgICBtZW1vcnlfc2l6ZSA9IHh0aW1lcyAoZF9hbGxvY2F0ZWQsIHNpemVvZiAoRElSRUNUSVZFKSk7CisJICAgICAgaWYgKHNpemVfb3ZlcmZsb3dfcCAobWVtb3J5X3NpemUpKQorCQkvKiBPdmVyZmxvdywgd291bGQgbGVhZCB0byBvdXQgb2YgbWVtb3J5LiAgKi8KKwkJZ290byBlcnJvcjsKKwkgICAgICBtZW1vcnkgPSByZWFsbG9jIChkLT5kaXIsIG1lbW9yeV9zaXplKTsKKwkgICAgICBpZiAobWVtb3J5ID09IE5VTEwpCisJCS8qIE91dCBvZiBtZW1vcnkuICAqLworCQlnb3RvIGVycm9yOworCSAgICAgIGQtPmRpciA9IG1lbW9yeTsKKwkgICAgfQorCX0KKyAgICB9CisgIGQtPmRpcltkLT5jb3VudF0uZGlyX3N0YXJ0ID0gY3A7CisKKyAgZC0+bWF4X3dpZHRoX2xlbmd0aCA9IG1heF93aWR0aF9sZW5ndGg7CisgIGQtPm1heF9wcmVjaXNpb25fbGVuZ3RoID0gbWF4X3ByZWNpc2lvbl9sZW5ndGg7CisgIHJldHVybiAwOworCitlcnJvcjoKKyAgaWYgKGEtPmFyZykKKyAgICBmcmVlIChhLT5hcmcpOworICBpZiAoZC0+ZGlyKQorICAgIGZyZWUgKGQtPmRpcik7CisgIHJldHVybiAtMTsKK30KKworI3VuZGVmIERJUkVDVElWRVMKKyN1bmRlZiBESVJFQ1RJVkUKKyN1bmRlZiBDSEFSX1QKKyN1bmRlZiBQUklOVEZfUEFSU0UKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9wcmludGYtcGFyc2UuaCBiL3VuaXgvaW50bC9wcmludGYtcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWVjNTBlCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL3ByaW50Zi1wYXJzZS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIFBhcnNlIHByaW50ZiBmb3JtYXQgc3RyaW5nLgorICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZuZGVmIF9QUklOVEZfUEFSU0VfSAorI2RlZmluZSBfUFJJTlRGX1BBUlNFX0gKKworI2luY2x1ZGUgInByaW50Zi1hcmdzLmgiCisKKworLyogRmxhZ3MgKi8KKyNkZWZpbmUgRkxBR19HUk9VUAkgMQkvKiAnIGZsYWcgKi8KKyNkZWZpbmUgRkxBR19MRUZUCSAyCS8qIC0gZmxhZyAqLworI2RlZmluZSBGTEFHX1NIT1dTSUdOCSA0CS8qICsgZmxhZyAqLworI2RlZmluZSBGTEFHX1NQQUNFCSA4CS8qIHNwYWNlIGZsYWcgKi8KKyNkZWZpbmUgRkxBR19BTFQJMTYJLyogIyBmbGFnICovCisjZGVmaW5lIEZMQUdfWkVSTwkzMgorCisvKiBhcmdfaW5kZXggdmFsdWUgaW5kaWNhdGluZyB0aGF0IG5vIGFyZ3VtZW50IGlzIGNvbnN1bWVkLiAgKi8KKyNkZWZpbmUgQVJHX05PTkUJKH4oc2l6ZV90KTApCisKKy8qIEEgcGFyc2VkIGRpcmVjdGl2ZS4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyKiBkaXJfc3RhcnQ7CisgIGNvbnN0IGNoYXIqIGRpcl9lbmQ7CisgIGludCBmbGFnczsKKyAgY29uc3QgY2hhciogd2lkdGhfc3RhcnQ7CisgIGNvbnN0IGNoYXIqIHdpZHRoX2VuZDsKKyAgc2l6ZV90IHdpZHRoX2FyZ19pbmRleDsKKyAgY29uc3QgY2hhciogcHJlY2lzaW9uX3N0YXJ0OworICBjb25zdCBjaGFyKiBwcmVjaXNpb25fZW5kOworICBzaXplX3QgcHJlY2lzaW9uX2FyZ19pbmRleDsKKyAgY2hhciBjb252ZXJzaW9uOyAvKiBkIGkgbyB1IHggWCBmIGUgRSBnIEcgYyBzIHAgbiBVICUgYnV0IG5vdCBDIFMgKi8KKyAgc2l6ZV90IGFyZ19pbmRleDsKK30KK2NoYXJfZGlyZWN0aXZlOworCisvKiBBIHBhcnNlZCBmb3JtYXQgc3RyaW5nLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHNpemVfdCBjb3VudDsKKyAgY2hhcl9kaXJlY3RpdmUgKmRpcjsKKyAgc2l6ZV90IG1heF93aWR0aF9sZW5ndGg7CisgIHNpemVfdCBtYXhfcHJlY2lzaW9uX2xlbmd0aDsKK30KK2NoYXJfZGlyZWN0aXZlczsKKworCisvKiBQYXJzZXMgdGhlIGZvcm1hdCBzdHJpbmcuICBGaWxscyBpbiB0aGUgbnVtYmVyIE4gb2YgZGlyZWN0aXZlcywgYW5kIGZpbGxzCisgICBpbiBkaXJlY3RpdmVzWzBdLCAuLi4sIGRpcmVjdGl2ZXNbTi0xXSwgYW5kIHNldHMgZGlyZWN0aXZlc1tOXS5kaXJfc3RhcnQKKyAgIHRvIHRoZSBlbmQgb2YgdGhlIGZvcm1hdCBzdHJpbmcuICBBbHNvIGZpbGxzIGluIHRoZSBhcmdfdHlwZSBmaWVsZHMgb2YgdGhlCisgICBhcmd1bWVudHMgYW5kIHRoZSBuZWVkZWQgY291bnQgb2YgYXJndW1lbnRzLiAgKi8KKyNpZmRlZiBTVEFUSUMKK1NUQVRJQworI2Vsc2UKK2V4dGVybgorI2VuZGlmCitpbnQgcHJpbnRmX3BhcnNlIChjb25zdCBjaGFyICpmb3JtYXQsIGNoYXJfZGlyZWN0aXZlcyAqZCwgYXJndW1lbnRzICphKTsKKworI2VuZGlmIC8qIF9QUklOVEZfUEFSU0VfSCAqLwpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3ByaW50Zi5jIGIvdW5peC9pbnRsL3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ODY0NmMKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvcHJpbnRmLmMKQEAgLTAsMCArMSwzNzEgQEAKKy8qIEZvcm1hdHRlZCBvdXRwdXQgdG8gc3RyaW5ncywgdXNpbmcgUE9TSVgvWFNJIGZvcm1hdCBzdHJpbmdzIHdpdGggcG9zaXRpb25zLgorICAgQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjIGRlZmluZSBIQVZFX0FMTE9DQSAxCisjZWxzZQorIyBpZmRlZiBfTVNDX1ZFUgorIyAgaW5jbHVkZSA8bWFsbG9jLmg+CisjICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKKyMgZWxzZQorIyAgaWYgZGVmaW5lZCBIQVZFX0FMTE9DQV9IIHx8IGRlZmluZWQgX0xJQkMKKyMgICBpbmNsdWRlIDxhbGxvY2EuaD4KKyMgIGVsc2UKKyMgICBpZmRlZiBfQUlYCisgI3ByYWdtYSBhbGxvY2EKKyMgICBlbHNlCisjICAgIGlmbmRlZiBhbGxvY2EKK2NoYXIgKmFsbG9jYSAoKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmICFIQVZFX1BPU0lYX1BSSU5URgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIFdoZW4gYnVpbGRpbmcgYSBETEwsIHdlIG11c3QgZXhwb3J0IHNvbWUgZnVuY3Rpb25zLiAgTm90ZSB0aGF0IGJlY2F1c2UKKyAgIHRoZSBmdW5jdGlvbnMgYXJlIG9ubHkgZGVmaW5lZCBmb3IgYmluYXJ5IGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHdlCisgICBkb24ndCBuZWVkIHRvIHVzZSBfX2RlY2xzcGVjKGRsbGltcG9ydCkgaW4gYW55IGNhc2UuICAqLworI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgQlVJTERJTkdfRExMCisjIGRlZmluZSBETExfRVhQT1JURUQgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZWxzZQorIyBkZWZpbmUgRExMX0VYUE9SVEVECisjZW5kaWYKKworI2RlZmluZSBTVEFUSUMgc3RhdGljCisKKy8qIERlZmluZSBhdXhpbGlhcnkgZnVuY3Rpb25zIGRlY2xhcmVkIGluICJwcmludGYtYXJncy5oIi4gICovCisjaW5jbHVkZSAicHJpbnRmLWFyZ3MuYyIKKworLyogRGVmaW5lIGF1eGlsaWFyeSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gInByaW50Zi1wYXJzZS5oIi4gICovCisjaW5jbHVkZSAicHJpbnRmLXBhcnNlLmMiCisKKy8qIERlZmluZSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gInZhc25wcmludGYuaCIuICAqLworI2RlZmluZSB2YXNucHJpbnRmIGxpYmludGxfdmFzbnByaW50ZgorI2luY2x1ZGUgInZhc25wcmludGYuYyIKKyNpZiAwIC8qIG5vdCBuZWVkZWQgKi8KKyNkZWZpbmUgYXNucHJpbnRmIGxpYmludGxfYXNucHJpbnRmCisjaW5jbHVkZSAiYXNucHJpbnRmLmMiCisjZW5kaWYKKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfdmZwcmludGYgKEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgIGlmIChzdHJjaHIgKGZvcm1hdCwgJyQnKSA9PSBOVUxMKQorICAgIHJldHVybiB2ZnByaW50ZiAoc3RyZWFtLCBmb3JtYXQsIGFyZ3MpOworICBlbHNlCisgICAgeworICAgICAgc2l6ZV90IGxlbmd0aDsKKyAgICAgIGNoYXIgKnJlc3VsdCA9IGxpYmludGxfdmFzbnByaW50ZiAoTlVMTCwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKKyAgICAgIGludCByZXR2YWwgPSAtMTsKKyAgICAgIGlmIChyZXN1bHQgIT0gTlVMTCkKKwl7CisJICBpZiAoZndyaXRlIChyZXN1bHQsIDEsIGxlbmd0aCwgc3RyZWFtKSA9PSBsZW5ndGgpCisJICAgIHJldHZhbCA9IGxlbmd0aDsKKwkgIGZyZWUgKHJlc3VsdCk7CisJfQorICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9Cit9CisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX2ZwcmludGYgKEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHJldHZhbDsKKworICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKKyAgcmV0dmFsID0gbGliaW50bF92ZnByaW50ZiAoc3RyZWFtLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworICByZXR1cm4gcmV0dmFsOworfQorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF92cHJpbnRmIChjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKyAgcmV0dXJuIGxpYmludGxfdmZwcmludGYgKHN0ZG91dCwgZm9ybWF0LCBhcmdzKTsKK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfcHJpbnRmIChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBpbnQgcmV0dmFsOworCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICByZXR2YWwgPSBsaWJpbnRsX3ZwcmludGYgKGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX3ZzcHJpbnRmIChjaGFyICpyZXN1bHRidWYsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQoreworICBpZiAoc3RyY2hyIChmb3JtYXQsICckJykgPT0gTlVMTCkKKyAgICByZXR1cm4gdnNwcmludGYgKHJlc3VsdGJ1ZiwgZm9ybWF0LCBhcmdzKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHNpemVfdCBsZW5ndGggPSAoc2l6ZV90KSB+MCAvICg0ICogc2l6ZW9mIChjaGFyKSk7CisgICAgICBjaGFyICpyZXN1bHQgPSBsaWJpbnRsX3Zhc25wcmludGYgKHJlc3VsdGJ1ZiwgJmxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKKyAgICAgIGlmIChyZXN1bHQgIT0gcmVzdWx0YnVmKQorCXsKKwkgIGZyZWUgKHJlc3VsdCk7CisJICByZXR1cm4gLTE7CisJfQorICAgICAgZWxzZQorCXJldHVybiBsZW5ndGg7CisgICAgfQorfQorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF9zcHJpbnRmIChjaGFyICpyZXN1bHRidWYsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIGludCByZXR2YWw7CisKKyAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CisgIHJldHZhbCA9IGxpYmludGxfdnNwcmludGYgKHJlc3VsdGJ1ZiwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2lmIEhBVkVfU05QUklOVEYKKworIyBpZiBIQVZFX0RFQ0xfX1NOUFJJTlRGCisgICAvKiBXaW5kb3dzLiAgKi8KKyMgIGRlZmluZSBzeXN0ZW1fdnNucHJpbnRmIF92c25wcmludGYKKyMgZWxzZQorICAgLyogVW5peC4gICovCisjICBkZWZpbmUgc3lzdGVtX3ZzbnByaW50ZiB2c25wcmludGYKKyMgZW5kaWYKKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfdnNucHJpbnRmIChjaGFyICpyZXN1bHRidWYsIHNpemVfdCBsZW5ndGgsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQoreworICBpZiAoc3RyY2hyIChmb3JtYXQsICckJykgPT0gTlVMTCkKKyAgICByZXR1cm4gc3lzdGVtX3ZzbnByaW50ZiAocmVzdWx0YnVmLCBsZW5ndGgsIGZvcm1hdCwgYXJncyk7CisgIGVsc2UKKyAgICB7CisgICAgICBzaXplX3QgbWF4bGVuZ3RoID0gbGVuZ3RoOworICAgICAgY2hhciAqcmVzdWx0ID0gbGliaW50bF92YXNucHJpbnRmIChyZXN1bHRidWYsICZsZW5ndGgsIGZvcm1hdCwgYXJncyk7CisgICAgICBpZiAocmVzdWx0ICE9IHJlc3VsdGJ1ZikKKwl7CisJICBpZiAobWF4bGVuZ3RoID4gMCkKKwkgICAgeworCSAgICAgIGlmIChsZW5ndGggPCBtYXhsZW5ndGgpCisJCWFib3J0ICgpOworCSAgICAgIG1lbWNweSAocmVzdWx0YnVmLCByZXN1bHQsIG1heGxlbmd0aCAtIDEpOworCSAgICAgIHJlc3VsdGJ1ZlttYXhsZW5ndGggLSAxXSA9ICdcMCc7CisJICAgIH0KKwkgIGZyZWUgKHJlc3VsdCk7CisJICByZXR1cm4gLTE7CisJfQorICAgICAgZWxzZQorCXJldHVybiBsZW5ndGg7CisgICAgfQorfQorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF9zbnByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBzaXplX3QgbGVuZ3RoLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBpbnQgcmV0dmFsOworCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICByZXR2YWwgPSBsaWJpbnRsX3ZzbnByaW50ZiAocmVzdWx0YnVmLCBsZW5ndGgsIGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZgorCisjaWYgSEFWRV9BU1BSSU5URgorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF92YXNwcmludGYgKGNoYXIgKipyZXN1bHRwLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKyAgc2l6ZV90IGxlbmd0aDsKKyAgY2hhciAqcmVzdWx0ID0gbGliaW50bF92YXNucHJpbnRmIChOVUxMLCAmbGVuZ3RoLCBmb3JtYXQsIGFyZ3MpOworICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgcmV0dXJuIC0xOworICAqcmVzdWx0cCA9IHJlc3VsdDsKKyAgcmV0dXJuIGxlbmd0aDsKK30KKworRExMX0VYUE9SVEVECitpbnQKK2xpYmludGxfYXNwcmludGYgKGNoYXIgKipyZXN1bHRwLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBpbnQgcmV0dmFsOworCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICByZXR2YWwgPSBsaWJpbnRsX3Zhc3ByaW50ZiAocmVzdWx0cCwgZm9ybWF0LCBhcmdzKTsKKyAgdmFfZW5kIChhcmdzKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworI2VuZGlmCisKKyNpZiBIQVZFX0ZXUFJJTlRGCisKKyNpbmNsdWRlIDx3Y2hhci5oPgorCisjZGVmaW5lIFdJREVfQ0hBUl9WRVJTSU9OIDEKKworLyogRGVmaW5lIGF1eGlsaWFyeSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gIndwcmludGYtcGFyc2UuaCIuICAqLworI2luY2x1ZGUgInByaW50Zi1wYXJzZS5jIgorCisvKiBEZWZpbmUgZnVuY3Rpb25zIGRlY2xhcmVkIGluICJ2YXNucHJpbnRmLmgiLiAgKi8KKyNkZWZpbmUgdmFzbndwcmludGYgbGliaW50bF92YXNud3ByaW50ZgorI2luY2x1ZGUgInZhc25wcmludGYuYyIKKyNpZiAwIC8qIG5vdCBuZWVkZWQgKi8KKyNkZWZpbmUgYXNud3ByaW50ZiBsaWJpbnRsX2FzbndwcmludGYKKyNpbmNsdWRlICJhc25wcmludGYuYyIKKyNlbmRpZgorCisjIGlmIEhBVkVfREVDTF9fU05XUFJJTlRGCisgICAvKiBXaW5kb3dzLiAgKi8KKyMgIGRlZmluZSBzeXN0ZW1fdnN3cHJpbnRmIF92c253cHJpbnRmCisjIGVsc2UKKyAgIC8qIFVuaXguICAqLworIyAgZGVmaW5lIHN5c3RlbV92c3dwcmludGYgdnN3cHJpbnRmCisjIGVuZGlmCisKK0RMTF9FWFBPUlRFRAoraW50CitsaWJpbnRsX3Zmd3ByaW50ZiAoRklMRSAqc3RyZWFtLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKyAgaWYgKHdjc2NociAoZm9ybWF0LCAnJCcpID09IE5VTEwpCisgICAgcmV0dXJuIHZmd3ByaW50ZiAoc3RyZWFtLCBmb3JtYXQsIGFyZ3MpOworICBlbHNlCisgICAgeworICAgICAgc2l6ZV90IGxlbmd0aDsKKyAgICAgIHdjaGFyX3QgKnJlc3VsdCA9IGxpYmludGxfdmFzbndwcmludGYgKE5VTEwsICZsZW5ndGgsIGZvcm1hdCwgYXJncyk7CisgICAgICBpbnQgcmV0dmFsID0gLTE7CisgICAgICBpZiAocmVzdWx0ICE9IE5VTEwpCisJeworCSAgc2l6ZV90IGk7CisJICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJICAgIGlmIChmcHV0d2MgKHJlc3VsdFtpXSwgc3RyZWFtKSA9PSBXRU9GKQorCSAgICAgIGJyZWFrOworCSAgaWYgKGkgPT0gbGVuZ3RoKQorCSAgICByZXR2YWwgPSBsZW5ndGg7CisJICBmcmVlIChyZXN1bHQpOworCX0KKyAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorfQorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF9md3ByaW50ZiAoRklMRSAqc3RyZWFtLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBpbnQgcmV0dmFsOworCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICByZXR2YWwgPSBsaWJpbnRsX3Zmd3ByaW50ZiAoc3RyZWFtLCBmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworICByZXR1cm4gcmV0dmFsOworfQorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF92d3ByaW50ZiAoY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgIHJldHVybiBsaWJpbnRsX3Zmd3ByaW50ZiAoc3Rkb3V0LCBmb3JtYXQsIGFyZ3MpOworfQorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF93cHJpbnRmIChjb25zdCB3Y2hhcl90ICpmb3JtYXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBpbnQgcmV0dmFsOworCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICByZXR2YWwgPSBsaWJpbnRsX3Z3cHJpbnRmIChmb3JtYXQsIGFyZ3MpOworICB2YV9lbmQgKGFyZ3MpOworICByZXR1cm4gcmV0dmFsOworfQorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF92c3dwcmludGYgKHdjaGFyX3QgKnJlc3VsdGJ1Ziwgc2l6ZV90IGxlbmd0aCwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgIGlmICh3Y3NjaHIgKGZvcm1hdCwgJyQnKSA9PSBOVUxMKQorICAgIHJldHVybiBzeXN0ZW1fdnN3cHJpbnRmIChyZXN1bHRidWYsIGxlbmd0aCwgZm9ybWF0LCBhcmdzKTsKKyAgZWxzZQorICAgIHsKKyAgICAgIHNpemVfdCBtYXhsZW5ndGggPSBsZW5ndGg7CisgICAgICB3Y2hhcl90ICpyZXN1bHQgPSBsaWJpbnRsX3Zhc253cHJpbnRmIChyZXN1bHRidWYsICZsZW5ndGgsIGZvcm1hdCwgYXJncyk7CisgICAgICBpZiAocmVzdWx0ICE9IHJlc3VsdGJ1ZikKKwl7CisJICBpZiAobWF4bGVuZ3RoID4gMCkKKwkgICAgeworCSAgICAgIGlmIChsZW5ndGggPCBtYXhsZW5ndGgpCisJCWFib3J0ICgpOworCSAgICAgIG1lbWNweSAocmVzdWx0YnVmLCByZXN1bHQsIChtYXhsZW5ndGggLSAxKSAqIHNpemVvZiAod2NoYXJfdCkpOworCSAgICAgIHJlc3VsdGJ1ZlttYXhsZW5ndGggLSAxXSA9IDA7CisJICAgIH0KKwkgIGZyZWUgKHJlc3VsdCk7CisJICByZXR1cm4gLTE7CisJfQorICAgICAgZWxzZQorCXJldHVybiBsZW5ndGg7CisgICAgfQorfQorCitETExfRVhQT1JURUQKK2ludAorbGliaW50bF9zd3ByaW50ZiAod2NoYXJfdCAqcmVzdWx0YnVmLCBzaXplX3QgbGVuZ3RoLCBjb25zdCB3Y2hhcl90ICpmb3JtYXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworICBpbnQgcmV0dmFsOworCisgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOworICByZXR2YWwgPSBsaWJpbnRsX3Zzd3ByaW50ZiAocmVzdWx0YnVmLCBsZW5ndGgsIGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZCAoYXJncyk7CisgIHJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9yZWYtYWRkLnNpbiBiL3VuaXgvaW50bC9yZWYtYWRkLnNpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjczNzRlCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL3JlZi1hZGQuc2luCkBAIC0wLDAgKzEsMzEgQEAKKyMgQWRkIHRoaXMgcGFja2FnZSB0byBhIGxpc3Qgb2YgcmVmZXJlbmNlcyBzdG9yZWQgaW4gYSB0ZXh0IGZpbGUuCisjCisjICAgQ29weXJpZ2h0IChDKSAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorIyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyMgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisjICAgVVNBLgorIworIyBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8aGFpYmxlQGNsaXNwLmNvbnMub3JnPi4KKyMKKy9eIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6IC8geworICBzLyMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOi8vCisgIHRhCisgIDphCisgIHMvIEBQQUNLQUdFQCAvIEBQQUNLQUdFQCAvCisgIHRiCisgIHMvICQvIEBQQUNLQUdFQCAvCisgIDpiCisgIHMvXi8jIFBhY2thZ2VzIHVzaW5nIHRoaXMgZmlsZTovCit9CmRpZmYgLS1naXQgYS91bml4L2ludGwvcmVmLWRlbC5zaW4gYi91bml4L2ludGwvcmVmLWRlbC5zaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzY2YzNwotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9yZWYtZGVsLnNpbgpAQCAtMCwwICsxLDI2IEBACisjIFJlbW92ZSB0aGlzIHBhY2thZ2UgZnJvbSBhIGxpc3Qgb2YgcmVmZXJlbmNlcyBzdG9yZWQgaW4gYSB0ZXh0IGZpbGUuCisjCisjICAgQ29weXJpZ2h0IChDKSAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorIyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyMgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisjICAgVVNBLgorIworIyBXcml0dGVuIGJ5IEJydW5vIEhhaWJsZSA8aGFpYmxlQGNsaXNwLmNvbnMub3JnPi4KKyMKKy9eIyBQYWNrYWdlcyB1c2luZyB0aGlzIGZpbGU6IC8geworICBzLyMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOi8vCisgIHMvIEBQQUNLQUdFQCAvIC8KKyAgcy9eLyMgUGFja2FnZXMgdXNpbmcgdGhpcyBmaWxlOi8KK30KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC9yZWxvY2F0YWJsZS5jIGIvdW5peC9pbnRsL3JlbG9jYXRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY3YzcwOAotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC9yZWxvY2F0YWJsZS5jCkBAIC0wLDAgKzEsNDQ5IEBACisvKiBQcm92aWRlIHJlbG9jYXRhYmxlIHBhY2thZ2VzLgorICAgQ29weXJpZ2h0IChDKSAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBCcnVubyBIYWlibGUgPGJydW5vQGNsaXNwLm9yZz4sIDIwMDMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisKKy8qIFRlbGwgZ2xpYmMncyA8c3RkaW8uaD4gdG8gcHJvdmlkZSBhIHByb3RvdHlwZSBmb3IgZ2V0bGluZSgpLgorICAgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIDxjb25maWcuaD4gYmVjYXVzZSA8Y29uZmlnLmg+IG1heSBpbmNsdWRlCisgICA8ZmVhdHVyZXMuaD4sIGFuZCBvbmNlIDxmZWF0dXJlcy5oPiBoYXMgYmVlbiBpbmNsdWRlZCwgaXQncyB0b28gbGF0ZS4gICovCisjaWZuZGVmIF9HTlVfU09VUkNFCisjIGRlZmluZSBfR05VX1NPVVJDRQkxCisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyMgaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworLyogU3BlY2lmaWNhdGlvbi4gICovCisjaW5jbHVkZSAicmVsb2NhdGFibGUuaCIKKworI2lmIEVOQUJMRV9SRUxPQ0FUQUJMRQorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIE5PX1hNQUxMT0MKKyMgZGVmaW5lIHhtYWxsb2MgbWFsbG9jCisjZWxzZQorIyBpbmNsdWRlICJ4YWxsb2MuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18KKyMgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpZiBERVBFTkRTX09OX0xJQkNIQVJTRVQKKyMgaW5jbHVkZSA8bGliY2hhcnNldC5oPgorI2VuZGlmCisjaWYgREVQRU5EU19PTl9MSUJJQ09OViAmJiBIQVZFX0lDT05WCisjIGluY2x1ZGUgPGljb252Lmg+CisjZW5kaWYKKyNpZiBERVBFTkRTX09OX0xJQklOVEwgJiYgRU5BQkxFX05MUworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZW5kaWYKKworLyogRmFrZWQgY2hlYXAgJ2Jvb2wnLiAgKi8KKyN1bmRlZiBib29sCisjdW5kZWYgZmFsc2UKKyN1bmRlZiB0cnVlCisjZGVmaW5lIGJvb2wgaW50CisjZGVmaW5lIGZhbHNlIDAKKyNkZWZpbmUgdHJ1ZSAxCisKKy8qIFBhdGhuYW1lIHN1cHBvcnQuCisgICBJU1NMQVNIKEMpICAgICAgICAgICB0ZXN0cyB3aGV0aGVyIEMgaXMgYSBkaXJlY3Rvcnkgc2VwYXJhdG9yIGNoYXJhY3Rlci4KKyAgIElTX1BBVEhfV0lUSF9ESVIoUCkgIHRlc3RzIHdoZXRoZXIgUCBjb250YWlucyBhIGRpcmVjdG9yeSBzcGVjaWZpY2F0aW9uLgorICovCisjaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX0VNWF9fIHx8IGRlZmluZWQgX19ESkdQUF9fCisgIC8qIFdpbjMyLCBPUy8yLCBET1MgKi8KKyMgZGVmaW5lIElTU0xBU0goQykgKChDKSA9PSAnLycgfHwgKEMpID09ICdcXCcpCisjIGRlZmluZSBIQVNfREVWSUNFKFApIFwKKyAgICAoKCgoUClbMF0gPj0gJ0EnICYmIChQKVswXSA8PSAnWicpIHx8ICgoUClbMF0gPj0gJ2EnICYmIChQKVswXSA8PSAneicpKSBcCisgICAgICYmIChQKVsxXSA9PSAnOicpCisjIGRlZmluZSBJU19QQVRIX1dJVEhfRElSKFApIFwKKyAgICAoc3RyY2hyIChQLCAnLycpICE9IE5VTEwgfHwgc3RyY2hyIChQLCAnXFwnKSAhPSBOVUxMIHx8IEhBU19ERVZJQ0UgKFApKQorIyBkZWZpbmUgRklMRVNZU1RFTV9QUkVGSVhfTEVOKFApIChIQVNfREVWSUNFIChQKSA/IDIgOiAwKQorI2Vsc2UKKyAgLyogVW5peCAqLworIyBkZWZpbmUgSVNTTEFTSChDKSAoKEMpID09ICcvJykKKyMgZGVmaW5lIElTX1BBVEhfV0lUSF9ESVIoUCkgKHN0cmNociAoUCwgJy8nKSAhPSBOVUxMKQorIyBkZWZpbmUgRklMRVNZU1RFTV9QUkVGSVhfTEVOKFApIDAKKyNlbmRpZgorCisvKiBPcmlnaW5hbCBpbnN0YWxsYXRpb24gcHJlZml4LiAgKi8KK3N0YXRpYyBjaGFyICpvcmlnX3ByZWZpeDsKK3N0YXRpYyBzaXplX3Qgb3JpZ19wcmVmaXhfbGVuOworLyogQ3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4LiAgKi8KK3N0YXRpYyBjaGFyICpjdXJyX3ByZWZpeDsKK3N0YXRpYyBzaXplX3QgY3Vycl9wcmVmaXhfbGVuOworLyogVGhlc2UgcHJlZml4ZXMgZG8gbm90IGVuZCBpbiBhIHNsYXNoLiAgQW55dGhpbmcgdGhhdCB3aWxsIGJlIGNvbmNhdGVuYXRlZAorICAgdG8gdGhlbSBtdXN0IHN0YXJ0IHdpdGggYSBzbGFzaC4gICovCisKKy8qIFNldHMgdGhlIG9yaWdpbmFsIGFuZCB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gcHJlZml4IG9mIHRoaXMgbW9kdWxlLgorICAgUmVsb2NhdGlvbiBzaW1wbHkgcmVwbGFjZXMgYSBwYXRobmFtZSBzdGFydGluZyB3aXRoIHRoZSBvcmlnaW5hbCBwcmVmaXgKKyAgIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHBhdGhuYW1lIHdpdGggdGhlIGN1cnJlbnQgcHJlZml4IGluc3RlYWQuICBCb3RoCisgICBwcmVmaXhlcyBzaG91bGQgYmUgZGlyZWN0b3J5IG5hbWVzIHdpdGhvdXQgdHJhaWxpbmcgc2xhc2ggKGkuZS4gdXNlICIiCisgICBpbnN0ZWFkIG9mICIvIikuICAqLworc3RhdGljIHZvaWQKK3NldF90aGlzX3JlbG9jYXRpb25fcHJlZml4IChjb25zdCBjaGFyICpvcmlnX3ByZWZpeF9hcmcsCisJCQkgICAgY29uc3QgY2hhciAqY3Vycl9wcmVmaXhfYXJnKQoreworICBpZiAob3JpZ19wcmVmaXhfYXJnICE9IE5VTEwgJiYgY3Vycl9wcmVmaXhfYXJnICE9IE5VTEwKKyAgICAgIC8qIE9wdGltaXphdGlvbjogaWYgb3JpZ19wcmVmaXggYW5kIGN1cnJfcHJlZml4IGFyZSBlcXVhbCwgdGhlCisJIHJlbG9jYXRpb24gaXMgYSBub3AuICAqLworICAgICAgJiYgc3RyY21wIChvcmlnX3ByZWZpeF9hcmcsIGN1cnJfcHJlZml4X2FyZykgIT0gMCkKKyAgICB7CisgICAgICAvKiBEdXBsaWNhdGUgdGhlIGFyZ3VtZW50IHN0cmluZ3MuICAqLworICAgICAgY2hhciAqbWVtb3J5OworCisgICAgICBvcmlnX3ByZWZpeF9sZW4gPSBzdHJsZW4gKG9yaWdfcHJlZml4X2FyZyk7CisgICAgICBjdXJyX3ByZWZpeF9sZW4gPSBzdHJsZW4gKGN1cnJfcHJlZml4X2FyZyk7CisgICAgICBtZW1vcnkgPSAoY2hhciAqKSB4bWFsbG9jIChvcmlnX3ByZWZpeF9sZW4gKyAxICsgY3Vycl9wcmVmaXhfbGVuICsgMSk7CisjaWZkZWYgTk9fWE1BTExPQworICAgICAgaWYgKG1lbW9yeSAhPSBOVUxMKQorI2VuZGlmCisJeworCSAgbWVtY3B5IChtZW1vcnksIG9yaWdfcHJlZml4X2FyZywgb3JpZ19wcmVmaXhfbGVuICsgMSk7CisJICBvcmlnX3ByZWZpeCA9IG1lbW9yeTsKKwkgIG1lbW9yeSArPSBvcmlnX3ByZWZpeF9sZW4gKyAxOworCSAgbWVtY3B5IChtZW1vcnksIGN1cnJfcHJlZml4X2FyZywgY3Vycl9wcmVmaXhfbGVuICsgMSk7CisJICBjdXJyX3ByZWZpeCA9IG1lbW9yeTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorICBvcmlnX3ByZWZpeCA9IE5VTEw7CisgIGN1cnJfcHJlZml4ID0gTlVMTDsKKyAgLyogRG9uJ3Qgd29ycnkgYWJvdXQgd2FzdGVkIG1lbW9yeSBoZXJlIC0gdGhpcyBmdW5jdGlvbiBpcyB1c3VhbGx5IG9ubHkKKyAgICAgY2FsbGVkIG9uY2UuICAqLworfQorCisvKiBTZXRzIHRoZSBvcmlnaW5hbCBhbmQgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIHByZWZpeCBvZiB0aGUgcGFja2FnZS4KKyAgIFJlbG9jYXRpb24gc2ltcGx5IHJlcGxhY2VzIGEgcGF0aG5hbWUgc3RhcnRpbmcgd2l0aCB0aGUgb3JpZ2luYWwgcHJlZml4CisgICBieSB0aGUgY29ycmVzcG9uZGluZyBwYXRobmFtZSB3aXRoIHRoZSBjdXJyZW50IHByZWZpeCBpbnN0ZWFkLiAgQm90aAorICAgcHJlZml4ZXMgc2hvdWxkIGJlIGRpcmVjdG9yeSBuYW1lcyB3aXRob3V0IHRyYWlsaW5nIHNsYXNoIChpLmUuIHVzZSAiIgorICAgaW5zdGVhZCBvZiAiLyIpLiAgKi8KK3ZvaWQKK3NldF9yZWxvY2F0aW9uX3ByZWZpeCAoY29uc3QgY2hhciAqb3JpZ19wcmVmaXhfYXJnLCBjb25zdCBjaGFyICpjdXJyX3ByZWZpeF9hcmcpCit7CisgIHNldF90aGlzX3JlbG9jYXRpb25fcHJlZml4IChvcmlnX3ByZWZpeF9hcmcsIGN1cnJfcHJlZml4X2FyZyk7CisKKyAgLyogTm93IG5vdGlmeSBhbGwgZGVwZW5kZW50IGxpYnJhcmllcy4gICovCisjaWYgREVQRU5EU19PTl9MSUJDSEFSU0VUCisgIGxpYmNoYXJzZXRfc2V0X3JlbG9jYXRpb25fcHJlZml4IChvcmlnX3ByZWZpeF9hcmcsIGN1cnJfcHJlZml4X2FyZyk7CisjZW5kaWYKKyNpZiBERVBFTkRTX09OX0xJQklDT05WICYmIEhBVkVfSUNPTlYgJiYgX0xJQklDT05WX1ZFUlNJT04gPj0gMHgwMTA5CisgIGxpYmljb252X3NldF9yZWxvY2F0aW9uX3ByZWZpeCAob3JpZ19wcmVmaXhfYXJnLCBjdXJyX3ByZWZpeF9hcmcpOworI2VuZGlmCisjaWYgREVQRU5EU19PTl9MSUJJTlRMICYmIEVOQUJMRV9OTFMgJiYgZGVmaW5lZCBsaWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeAorICBsaWJpbnRsX3NldF9yZWxvY2F0aW9uX3ByZWZpeCAob3JpZ19wcmVmaXhfYXJnLCBjdXJyX3ByZWZpeF9hcmcpOworI2VuZGlmCit9CisKKyNpZiAhZGVmaW5lZCBJTl9MSUJSQVJZIHx8IChkZWZpbmVkIFBJQyAmJiBkZWZpbmVkIElOU1RBTExESVIpCisKKy8qIENvbnZlbmllbmNlIGZ1bmN0aW9uOgorICAgQ29tcHV0ZXMgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIHByZWZpeCwgYmFzZWQgb24gdGhlIG9yaWdpbmFsCisgICBpbnN0YWxsYXRpb24gcHJlZml4LCB0aGUgb3JpZ2luYWwgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvZiBhIHBhcnRpY3VsYXIKKyAgIGZpbGUsIGFuZCB0aGUgY3VycmVudCBwYXRobmFtZSBvZiB0aGlzIGZpbGUuICBSZXR1cm5zIE5VTEwgdXBvbiBmYWlsdXJlLiAgKi8KKyNpZmRlZiBJTl9MSUJSQVJZCisjZGVmaW5lIGNvbXB1dGVfY3Vycl9wcmVmaXggbG9jYWxfY29tcHV0ZV9jdXJyX3ByZWZpeAorc3RhdGljCisjZW5kaWYKK2NvbnN0IGNoYXIgKgorY29tcHV0ZV9jdXJyX3ByZWZpeCAoY29uc3QgY2hhciAqb3JpZ19pbnN0YWxscHJlZml4LAorCQkgICAgIGNvbnN0IGNoYXIgKm9yaWdfaW5zdGFsbGRpciwKKwkJICAgICBjb25zdCBjaGFyICpjdXJyX3BhdGhuYW1lKQoreworICBjb25zdCBjaGFyICpjdXJyX2luc3RhbGxkaXI7CisgIGNvbnN0IGNoYXIgKnJlbF9pbnN0YWxsZGlyOworCisgIGlmIChjdXJyX3BhdGhuYW1lID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgLyogRGV0ZXJtaW5lIHRoZSByZWxhdGl2ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LCByZWxhdGl2ZSB0byB0aGUgcHJlZml4LgorICAgICBUaGlzIGlzIHNpbXBseSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9yaWdfaW5zdGFsbHByZWZpeCBhbmQKKyAgICAgb3JpZ19pbnN0YWxsZGlyLiAgKi8KKyAgaWYgKHN0cm5jbXAgKG9yaWdfaW5zdGFsbHByZWZpeCwgb3JpZ19pbnN0YWxsZGlyLCBzdHJsZW4gKG9yaWdfaW5zdGFsbHByZWZpeCkpCisgICAgICAhPSAwKQorICAgIC8qIFNob3VsZG4ndCBoYXBwZW4gLSBub3RoaW5nIHNob3VsZCBiZSBpbnN0YWxsZWQgb3V0c2lkZSAkKHByZWZpeCkuICAqLworICAgIHJldHVybiBOVUxMOworICByZWxfaW5zdGFsbGRpciA9IG9yaWdfaW5zdGFsbGRpciArIHN0cmxlbiAob3JpZ19pbnN0YWxscHJlZml4KTsKKworICAvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4gICovCisgIHsKKyAgICBjb25zdCBjaGFyICpwX2Jhc2UgPSBjdXJyX3BhdGhuYW1lICsgRklMRVNZU1RFTV9QUkVGSVhfTEVOIChjdXJyX3BhdGhuYW1lKTsKKyAgICBjb25zdCBjaGFyICpwID0gY3Vycl9wYXRobmFtZSArIHN0cmxlbiAoY3Vycl9wYXRobmFtZSk7CisgICAgY2hhciAqcTsKKworICAgIHdoaWxlIChwID4gcF9iYXNlKQorICAgICAgeworCXAtLTsKKwlpZiAoSVNTTEFTSCAoKnApKQorCSAgYnJlYWs7CisgICAgICB9CisKKyAgICBxID0gKGNoYXIgKikgeG1hbGxvYyAocCAtIGN1cnJfcGF0aG5hbWUgKyAxKTsKKyNpZmRlZiBOT19YTUFMTE9DCisgICAgaWYgKHEgPT0gTlVMTCkKKyAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgICAgbWVtY3B5IChxLCBjdXJyX3BhdGhuYW1lLCBwIC0gY3Vycl9wYXRobmFtZSk7CisgICAgcVtwIC0gY3Vycl9wYXRobmFtZV0gPSAnXDAnOworICAgIGN1cnJfaW5zdGFsbGRpciA9IHE7CisgIH0KKworICAvKiBDb21wdXRlIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXggYnkgcmVtb3ZpbmcgdGhlIHRyYWlsaW5nCisgICAgIHJlbF9pbnN0YWxsZGlyIGZyb20gaXQuICAqLworICB7CisgICAgY29uc3QgY2hhciAqcnAgPSByZWxfaW5zdGFsbGRpciArIHN0cmxlbiAocmVsX2luc3RhbGxkaXIpOworICAgIGNvbnN0IGNoYXIgKmNwID0gY3Vycl9pbnN0YWxsZGlyICsgc3RybGVuIChjdXJyX2luc3RhbGxkaXIpOworICAgIGNvbnN0IGNoYXIgKmNwX2Jhc2UgPQorICAgICAgY3Vycl9pbnN0YWxsZGlyICsgRklMRVNZU1RFTV9QUkVGSVhfTEVOIChjdXJyX2luc3RhbGxkaXIpOworCisgICAgd2hpbGUgKHJwID4gcmVsX2luc3RhbGxkaXIgJiYgY3AgPiBjcF9iYXNlKQorICAgICAgeworCWJvb2wgc2FtZSA9IGZhbHNlOworCWNvbnN0IGNoYXIgKnJwaSA9IHJwOworCWNvbnN0IGNoYXIgKmNwaSA9IGNwOworCisJd2hpbGUgKHJwaSA+IHJlbF9pbnN0YWxsZGlyICYmIGNwaSA+IGNwX2Jhc2UpCisJICB7CisJICAgIHJwaS0tOworCSAgICBjcGktLTsKKwkgICAgaWYgKElTU0xBU0ggKCpycGkpIHx8IElTU0xBU0ggKCpjcGkpKQorCSAgICAgIHsKKwkJaWYgKElTU0xBU0ggKCpycGkpICYmIElTU0xBU0ggKCpjcGkpKQorCQkgIHNhbWUgPSB0cnVlOworCQlicmVhazsKKwkgICAgICB9CisjaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18gfHwgZGVmaW5lZCBfX0VNWF9fIHx8IGRlZmluZWQgX19ESkdQUF9fCisJICAgIC8qIFdpbjMyLCBPUy8yLCBET1MgLSBjYXNlIGluc2lnbmlmaWNhbnQgZmlsZXN5c3RlbSAqLworCSAgICBpZiAoKCpycGkgPj0gJ2EnICYmICpycGkgPD0gJ3onID8gKnJwaSAtICdhJyArICdBJyA6ICpycGkpCisJCSE9ICgqY3BpID49ICdhJyAmJiAqY3BpIDw9ICd6JyA/ICpjcGkgLSAnYScgKyAnQScgOiAqY3BpKSkKKwkgICAgICBicmVhazsKKyNlbHNlCisJICAgIGlmICgqcnBpICE9ICpjcGkpCisJICAgICAgYnJlYWs7CisjZW5kaWYKKwkgIH0KKwlpZiAoIXNhbWUpCisJICBicmVhazsKKwkvKiBUaGUgbGFzdCBwYXRobmFtZSBjb21wb25lbnQgd2FzIHRoZSBzYW1lLiAgb3BpIGFuZCBjcGkgbm93IHBvaW50CisJICAgdG8gdGhlIHNsYXNoIGJlZm9yZSBpdC4gICovCisJcnAgPSBycGk7CisJY3AgPSBjcGk7CisgICAgICB9CisKKyAgICBpZiAocnAgPiByZWxfaW5zdGFsbGRpcikKKyAgICAgIC8qIFVuZXhwZWN0ZWQ6IFRoZSBjdXJyX2luc3RhbGxkaXIgZG9lcyBub3QgZW5kIHdpdGggcmVsX2luc3RhbGxkaXIuICAqLworICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICB7CisgICAgICBzaXplX3QgY3Vycl9wcmVmaXhfbGVuID0gY3AgLSBjdXJyX2luc3RhbGxkaXI7CisgICAgICBjaGFyICpjdXJyX3ByZWZpeDsKKworICAgICAgY3Vycl9wcmVmaXggPSAoY2hhciAqKSB4bWFsbG9jIChjdXJyX3ByZWZpeF9sZW4gKyAxKTsKKyNpZmRlZiBOT19YTUFMTE9DCisgICAgICBpZiAoY3Vycl9wcmVmaXggPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgICAgbWVtY3B5IChjdXJyX3ByZWZpeCwgY3Vycl9pbnN0YWxsZGlyLCBjdXJyX3ByZWZpeF9sZW4pOworICAgICAgY3Vycl9wcmVmaXhbY3Vycl9wcmVmaXhfbGVuXSA9ICdcMCc7CisKKyAgICAgIHJldHVybiBjdXJyX3ByZWZpeDsKKyAgICB9CisgIH0KK30KKworI2VuZGlmIC8qICFJTl9MSUJSQVJZIHx8IFBJQyAqLworCisjaWYgZGVmaW5lZCBQSUMgJiYgZGVmaW5lZCBJTlNUQUxMRElSCisKKy8qIEZ1bGwgcGF0aG5hbWUgb2Ygc2hhcmVkIGxpYnJhcnksIG9yIE5VTEwuICAqLworc3RhdGljIGNoYXIgKnNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lOworCisjaWYgZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX1dJTjMyX18KKworLyogRGV0ZXJtaW5lIHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeSB3aGVuIGl0IGlzIGxvYWRlZC4gICovCisKK0JPT0wgV0lOQVBJCitEbGxNYWluIChISU5TVEFOQ0UgbW9kdWxlX2hhbmRsZSwgRFdPUkQgZXZlbnQsIExQVk9JRCByZXNlcnZlZCkKK3sKKyAgKHZvaWQpIHJlc2VydmVkOworCisgIGlmIChldmVudCA9PSBETExfUFJPQ0VTU19BVFRBQ0gpCisgICAgeworICAgICAgLyogVGhlIERMTCBpcyBiZWluZyBsb2FkZWQgaW50byBhbiBhcHBsaWNhdGlvbidzIGFkZHJlc3MgcmFuZ2UuICAqLworICAgICAgc3RhdGljIGNoYXIgbG9jYXRpb25bTUFYX1BBVEhdOworCisgICAgICBpZiAoIUdldE1vZHVsZUZpbGVOYW1lIChtb2R1bGVfaGFuZGxlLCBsb2NhdGlvbiwgc2l6ZW9mIChsb2NhdGlvbikpKQorCS8qIFNob3VsZG4ndCBoYXBwZW4uICAqLworCXJldHVybiBGQUxTRTsKKworICAgICAgaWYgKCFJU19QQVRIX1dJVEhfRElSIChsb2NhdGlvbikpCisJLyogU2hvdWxkbid0IGhhcHBlbi4gICovCisJcmV0dXJuIEZBTFNFOworCisgICAgICBzaGFyZWRfbGlicmFyeV9mdWxsbmFtZSA9IHN0cmR1cCAobG9jYXRpb24pOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworI2Vsc2UgLyogVW5peCAqLworCitzdGF0aWMgdm9pZAorZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSAoKQoreworI2lmIGRlZmluZWQgX19saW51eF9fICYmIF9fR0xJQkNfXyA+PSAyCisgIC8qIExpbnV4IGhhcyAvcHJvYy9zZWxmL21hcHMuIGdsaWJjIDIgaGFzIHRoZSBnZXRsaW5lKCkgZnVuY3Rpb24uICAqLworICBGSUxFICpmcDsKKworICAvKiBPcGVuIHRoZSBjdXJyZW50IHByb2Nlc3MnIG1hcHMgZmlsZS4gIEl0IGRlc2NyaWJlcyBvbmUgVk1BIHBlciBsaW5lLiAgKi8KKyAgZnAgPSBmb3BlbiAoIi9wcm9jL3NlbGYvbWFwcyIsICJyIik7CisgIGlmIChmcCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZykgJmZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWU7CisgICAgICBmb3IgKDs7KQorCXsKKwkgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKKwkgIGludCBjOworCisJICBpZiAoZnNjYW5mIChmcCwgIiVseC0lbHgiLCAmc3RhcnQsICZlbmQpICE9IDIpCisJICAgIGJyZWFrOworCSAgaWYgKGFkZHJlc3MgPj0gc3RhcnQgJiYgYWRkcmVzcyA8PSBlbmQgLSAxKQorCSAgICB7CisJICAgICAgLyogRm91bmQgaXQuICBOb3cgc2VlIGlmIHRoaXMgbGluZSBjb250YWlucyBhIGZpbGVuYW1lLiAgKi8KKwkgICAgICB3aGlsZSAoYyA9IGdldGMgKGZwKSwgYyAhPSBFT0YgJiYgYyAhPSAnXG4nICYmIGMgIT0gJy8nKQorCQljb250aW51ZTsKKwkgICAgICBpZiAoYyA9PSAnLycpCisJCXsKKwkJICBzaXplX3Qgc2l6ZTsKKwkJICBpbnQgbGVuOworCisJCSAgdW5nZXRjIChjLCBmcCk7CisJCSAgc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgPSBOVUxMOyBzaXplID0gMDsKKwkJICBsZW4gPSBnZXRsaW5lICgmc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUsICZzaXplLCBmcCk7CisJCSAgaWYgKGxlbiA+PSAwKQorCQkgICAgeworCQkgICAgICAvKiBTdWNjZXNzOiBmaWxsZWQgc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUuICAqLworCQkgICAgICBpZiAobGVuID4gMCAmJiBzaGFyZWRfbGlicmFyeV9mdWxsbmFtZVtsZW4gLSAxXSA9PSAnXG4nKQorCQkJc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWVbbGVuIC0gMV0gPSAnXDAnOworCQkgICAgfQorCQl9CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIHdoaWxlIChjID0gZ2V0YyAoZnApLCBjICE9IEVPRiAmJiBjICE9ICdcbicpCisJICAgIGNvbnRpbnVlOworCX0KKyAgICAgIGZjbG9zZSAoZnApOworICAgIH0KKyNlbmRpZgorfQorCisjZW5kaWYgLyogV0lOMzIgLyBVbml4ICovCisKKy8qIFJldHVybiB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgY3VycmVudCBzaGFyZWQgbGlicmFyeS4KKyAgIFJldHVybiBOVUxMIGlmIHVua25vd24uCisgICBHdWFyYW50ZWVkIHRvIHdvcmsgb25seSBvbiBMaW51eCBhbmQgV29lMzIuICAqLworc3RhdGljIGNoYXIgKgorZ2V0X3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lICgpCit7CisjaWYgIShkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9fV0lOMzJfXykKKyAgc3RhdGljIGJvb2wgdHJpZWRfZmluZF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZTsKKyAgaWYgKCF0cmllZF9maW5kX3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lKQorICAgIHsKKyAgICAgIGZpbmRfc2hhcmVkX2xpYnJhcnlfZnVsbG5hbWUgKCk7CisgICAgICB0cmllZF9maW5kX3NoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lID0gdHJ1ZTsKKyAgICB9CisjZW5kaWYKKyAgcmV0dXJuIHNoYXJlZF9saWJyYXJ5X2Z1bGxuYW1lOworfQorCisjZW5kaWYgLyogUElDICovCisKKy8qIFJldHVybnMgdGhlIHBhdGhuYW1lLCByZWxvY2F0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbgorICAgZGlyZWN0b3J5LiAgKi8KK2NvbnN0IGNoYXIgKgorcmVsb2NhdGUgKGNvbnN0IGNoYXIgKnBhdGhuYW1lKQoreworI2lmIGRlZmluZWQgUElDICYmIGRlZmluZWQgSU5TVEFMTERJUgorICBzdGF0aWMgaW50IGluaXRpYWxpemVkOworCisgIC8qIEluaXRpYWxpemF0aW9uIGNvZGUgZm9yIGEgc2hhcmVkIGxpYnJhcnkuICAqLworICBpZiAoIWluaXRpYWxpemVkKQorICAgIHsKKyAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIG9yaWdfcHJlZml4IGFuZCBjdXJyX3ByZWZpeCBsaWtlbHkgaGF2ZSBhbHJlYWR5IGJlZW4KKwkgc2V0IHRocm91Z2ggdGhlIG1haW4gcHJvZ3JhbSdzIHNldF9wcm9ncmFtX25hbWVfYW5kX2luc3RhbGxkaXIKKwkgZnVuY3Rpb24uICBUaGlzIGlzIHN1ZmZpY2llbnQgaW4gdGhlIGNhc2UgdGhhdCB0aGUgbGlicmFyeSBoYXMKKwkgaW5pdGlhbGx5IGJlZW4gaW5zdGFsbGVkIGluIHRoZSBzYW1lIG9yaWdfcHJlZml4LiAgQnV0IHdlIGNhbiBkbworCSBiZXR0ZXIsIHRvIGFsc28gY292ZXIgdGhlIGNhc2VzIHRoYXQgMS4gaXQgaGFzIGJlZW4gaW5zdGFsbGVkCisJIGluIGEgZGlmZmVyZW50IHByZWZpeCBiZWZvcmUgYmVpbmcgbW92ZWQgdG8gb3JpZ19wcmVmaXggYW5kIChsYXRlcikKKwkgdG8gY3Vycl9wcmVmaXgsIDIuIHVubGlrZSB0aGUgcHJvZ3JhbSwgaXQgaGFzIG5vdCBtb3ZlZCBhd2F5IGZyb20KKwkgb3JpZ19wcmVmaXguICAqLworICAgICAgY29uc3QgY2hhciAqb3JpZ19pbnN0YWxscHJlZml4ID0gSU5TVEFMTFBSRUZJWDsKKyAgICAgIGNvbnN0IGNoYXIgKm9yaWdfaW5zdGFsbGRpciA9IElOU1RBTExESVI7CisgICAgICBjb25zdCBjaGFyICpjdXJyX3ByZWZpeF9iZXR0ZXI7CisKKyAgICAgIGN1cnJfcHJlZml4X2JldHRlciA9CisJY29tcHV0ZV9jdXJyX3ByZWZpeCAob3JpZ19pbnN0YWxscHJlZml4LCBvcmlnX2luc3RhbGxkaXIsCisJCQkgICAgIGdldF9zaGFyZWRfbGlicmFyeV9mdWxsbmFtZSAoKSk7CisgICAgICBpZiAoY3Vycl9wcmVmaXhfYmV0dGVyID09IE5VTEwpCisJY3Vycl9wcmVmaXhfYmV0dGVyID0gY3Vycl9wcmVmaXg7CisKKyAgICAgIHNldF9yZWxvY2F0aW9uX3ByZWZpeCAob3JpZ19pbnN0YWxscHJlZml4LCBjdXJyX3ByZWZpeF9iZXR0ZXIpOworCisgICAgICBpbml0aWFsaXplZCA9IDE7CisgICAgfQorI2VuZGlmCisKKyAgLyogTm90ZTogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBwZXJmb3JtIGNhc2UgaW5zZW5zaXRpdmUgY29tcGFyaXNvbiBoZXJlLAorICAgICBldmVuIGZvciBET1MtbGlrZSBmaWxlc3lzdGVtcywgYmVjYXVzZSB0aGUgcGF0aG5hbWUgYXJndW1lbnQgd2FzCisgICAgIHR5cGljYWxseSBjcmVhdGVkIGZyb20gdGhlIHNhbWUgTWFrZWZpbGUgdmFyaWFibGUgYXMgb3JpZ19wcmVmaXggY2FtZQorICAgICBmcm9tLiAgKi8KKyAgaWYgKG9yaWdfcHJlZml4ICE9IE5VTEwgJiYgY3Vycl9wcmVmaXggIT0gTlVMTAorICAgICAgJiYgc3RybmNtcCAocGF0aG5hbWUsIG9yaWdfcHJlZml4LCBvcmlnX3ByZWZpeF9sZW4pID09IDApCisgICAgeworICAgICAgaWYgKHBhdGhuYW1lW29yaWdfcHJlZml4X2xlbl0gPT0gJ1wwJykKKwkvKiBwYXRobmFtZSBlcXVhbHMgb3JpZ19wcmVmaXguICAqLworCXJldHVybiBjdXJyX3ByZWZpeDsKKyAgICAgIGlmIChJU1NMQVNIIChwYXRobmFtZVtvcmlnX3ByZWZpeF9sZW5dKSkKKwl7CisJICAvKiBwYXRobmFtZSBzdGFydHMgd2l0aCBvcmlnX3ByZWZpeC4gICovCisJICBjb25zdCBjaGFyICpwYXRobmFtZV90YWlsID0gJnBhdGhuYW1lW29yaWdfcHJlZml4X2xlbl07CisJICBjaGFyICpyZXN1bHQgPQorCSAgICAoY2hhciAqKSB4bWFsbG9jIChjdXJyX3ByZWZpeF9sZW4gKyBzdHJsZW4gKHBhdGhuYW1lX3RhaWwpICsgMSk7CisKKyNpZmRlZiBOT19YTUFMTE9DCisJICBpZiAocmVzdWx0ICE9IE5VTEwpCisjZW5kaWYKKwkgICAgeworCSAgICAgIG1lbWNweSAocmVzdWx0LCBjdXJyX3ByZWZpeCwgY3Vycl9wcmVmaXhfbGVuKTsKKwkgICAgICBzdHJjcHkgKHJlc3VsdCArIGN1cnJfcHJlZml4X2xlbiwgcGF0aG5hbWVfdGFpbCk7CisJICAgICAgcmV0dXJuIHJlc3VsdDsKKwkgICAgfQorCX0KKyAgICB9CisgIC8qIE5vdGhpbmcgdG8gcmVsb2NhdGUuICAqLworICByZXR1cm4gcGF0aG5hbWU7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3JlbG9jYXRhYmxlLmggYi91bml4L2ludGwvcmVsb2NhdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGM1YjcxCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL3JlbG9jYXRhYmxlLmgKQEAgLTAsMCArMSw3NyBAQAorLyogUHJvdmlkZSByZWxvY2F0YWJsZSBwYWNrYWdlcy4KKyAgIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgQnJ1bm8gSGFpYmxlIDxicnVub0BjbGlzcC5vcmc+LCAyMDAzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfUkVMT0NBVEFCTEVfSAorI2RlZmluZSBfUkVMT0NBVEFCTEVfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogVGhpcyBjYW4gYmUgZW5hYmxlZCB0aHJvdWdoIHRoZSBjb25maWd1cmUgLS1lbmFibGUtcmVsb2NhdGFibGUgb3B0aW9uLiAgKi8KKyNpZiBFTkFCTEVfUkVMT0NBVEFCTEUKKworLyogV2hlbiBidWlsZGluZyBhIERMTCwgd2UgbXVzdCBleHBvcnQgc29tZSBmdW5jdGlvbnMuICBOb3RlIHRoYXQgYmVjYXVzZQorICAgdGhpcyBpcyBhIHByaXZhdGUgLmggZmlsZSwgd2UgZG9uJ3QgbmVlZCB0byB1c2UgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisgICBpbiBhbnkgY2FzZS4gICovCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBCVUlMRElOR19ETEwKKyMgZGVmaW5lIFJFTE9DQVRBQkxFX0RMTF9FWFBPUlRFRCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyNlbHNlCisjIGRlZmluZSBSRUxPQ0FUQUJMRV9ETExfRVhQT1JURUQKKyNlbmRpZgorCisvKiBTZXRzIHRoZSBvcmlnaW5hbCBhbmQgdGhlIGN1cnJlbnQgaW5zdGFsbGF0aW9uIHByZWZpeCBvZiB0aGUgcGFja2FnZS4KKyAgIFJlbG9jYXRpb24gc2ltcGx5IHJlcGxhY2VzIGEgcGF0aG5hbWUgc3RhcnRpbmcgd2l0aCB0aGUgb3JpZ2luYWwgcHJlZml4CisgICBieSB0aGUgY29ycmVzcG9uZGluZyBwYXRobmFtZSB3aXRoIHRoZSBjdXJyZW50IHByZWZpeCBpbnN0ZWFkLiAgQm90aAorICAgcHJlZml4ZXMgc2hvdWxkIGJlIGRpcmVjdG9yeSBuYW1lcyB3aXRob3V0IHRyYWlsaW5nIHNsYXNoIChpLmUuIHVzZSAiIgorICAgaW5zdGVhZCBvZiAiLyIpLiAgKi8KK2V4dGVybiBSRUxPQ0FUQUJMRV9ETExfRVhQT1JURUQgdm9pZAorICAgICAgIHNldF9yZWxvY2F0aW9uX3ByZWZpeCAoY29uc3QgY2hhciAqb3JpZ19wcmVmaXgsCisJCQkgICAgICBjb25zdCBjaGFyICpjdXJyX3ByZWZpeCk7CisKKy8qIFJldHVybnMgdGhlIHBhdGhuYW1lLCByZWxvY2F0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbgorICAgZGlyZWN0b3J5LiAgKi8KK2V4dGVybiBjb25zdCBjaGFyICogcmVsb2NhdGUgKGNvbnN0IGNoYXIgKnBhdGhuYW1lKTsKKworLyogTWVtb3J5IG1hbmFnZW1lbnQ6IHJlbG9jYXRlKCkgbGVha3MgbWVtb3J5LCBiZWNhdXNlIGl0IGhhcyB0byBjb25zdHJ1Y3QKKyAgIGEgZnJlc2ggcGF0aG5hbWUuICBJZiB0aGlzIGlzIGEgcHJvYmxlbSBiZWNhdXNlIHlvdXIgcHJvZ3JhbSBjYWxscworICAgcmVsb2NhdGUoKSBmcmVxdWVudGx5LCB0aGluayBhYm91dCBjYWNoaW5nIHRoZSByZXN1bHQuICAqLworCisvKiBDb252ZW5pZW5jZSBmdW5jdGlvbjoKKyAgIENvbXB1dGVzIHRoZSBjdXJyZW50IGluc3RhbGxhdGlvbiBwcmVmaXgsIGJhc2VkIG9uIHRoZSBvcmlnaW5hbAorICAgaW5zdGFsbGF0aW9uIHByZWZpeCwgdGhlIG9yaWdpbmFsIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb2YgYSBwYXJ0aWN1bGFyCisgICBmaWxlLCBhbmQgdGhlIGN1cnJlbnQgcGF0aG5hbWUgb2YgdGhpcyBmaWxlLiAgUmV0dXJucyBOVUxMIHVwb24gZmFpbHVyZS4gICovCitleHRlcm4gY29uc3QgY2hhciAqIGNvbXB1dGVfY3Vycl9wcmVmaXggKGNvbnN0IGNoYXIgKm9yaWdfaW5zdGFsbHByZWZpeCwKKwkJCQkJIGNvbnN0IGNoYXIgKm9yaWdfaW5zdGFsbGRpciwKKwkJCQkJIGNvbnN0IGNoYXIgKmN1cnJfcGF0aG5hbWUpOworCisjZWxzZQorCisvKiBCeSBkZWZhdWx0LCB3ZSB1c2UgdGhlIGhhcmR3aXJlZCBwYXRobmFtZXMuICAqLworI2RlZmluZSByZWxvY2F0ZShwYXRobmFtZSkgKHBhdGhuYW1lKQorCisjZW5kaWYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX1JFTE9DQVRBQkxFX0ggKi8KZGlmZiAtLWdpdCBhL3VuaXgvaW50bC90ZXh0ZG9tYWluLmMgYi91bml4L2ludGwvdGV4dGRvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NDVhODQKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvdGV4dGRvbWFpbi5jCkBAIC0wLDAgKzEsMTQxIEBACisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGV4dGRvbWFpbigzKSBmdW5jdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCAyMDAwLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBfTElCQworIyBpbmNsdWRlIDxsaWJpbnRsLmg+CisjZWxzZQorIyBpbmNsdWRlICJsaWJnbnVpbnRsLmgiCisjZW5kaWYKKyNpbmNsdWRlICJnZXR0ZXh0UC5oIgorCisjaWZkZWYgX0xJQkMKKy8qIFdlIGhhdmUgdG8gaGFuZGxlIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucy4gICovCisjIGluY2x1ZGUgPGJpdHMvbGliYy1sb2NrLmg+CisjZWxzZQorLyogUHJvdmlkZSBkdW1teSBpbXBsZW1lbnRhdGlvbiBpZiB0aGlzIGlzIG91dHNpZGUgZ2xpYmMuICAqLworIyBkZWZpbmUgX19saWJjX3J3bG9ja19kZWZpbmUoQ0xBU1MsIE5BTUUpCisjIGRlZmluZSBfX2xpYmNfcndsb2NrX3dybG9jayhOQU1FKQorIyBkZWZpbmUgX19saWJjX3J3bG9ja191bmxvY2soTkFNRSkKKyNlbmRpZgorCisvKiBUaGUgaW50ZXJuYWwgdmFyaWFibGVzIGluIHRoZSBzdGFuZGFsb25lIGxpYmludGwuYSBtdXN0IGhhdmUgZGlmZmVyZW50CisgICBuYW1lcyB0aGFuIHRoZSBpbnRlcm5hbCB2YXJpYWJsZXMgaW4gR05VIGxpYmMsIG90aGVyd2lzZSBwcm9ncmFtcworICAgdXNpbmcgbGliaW50bC5hIGNhbm5vdCBiZSBsaW5rZWQgc3RhdGljYWxseS4gICovCisjaWYgIWRlZmluZWQgX0xJQkMKKyMgZGVmaW5lIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluIGxpYmludGxfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbgorIyBkZWZpbmUgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gbGliaW50bF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluCisjZW5kaWYKKworLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLworCisvKiBOYW1lIG9mIHRoZSBkZWZhdWx0IHRleHQgZG9tYWluLiAgKi8KK2V4dGVybiBjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluW10gYXR0cmlidXRlX2hpZGRlbjsKKworLyogRGVmYXVsdCB0ZXh0IGRvbWFpbiBpbiB3aGljaCBlbnRyaWVzIGZvciBnZXR0ZXh0KDMpIGFyZSB0byBiZSBmb3VuZC4gICovCitleHRlcm4gY29uc3QgY2hhciAqX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gYXR0cmlidXRlX2hpZGRlbjsKKworCisvKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCisgICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCisgICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KKyAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCisjaWZkZWYgX0xJQkMKKyMgZGVmaW5lIFRFWFRET01BSU4gX190ZXh0ZG9tYWluCisjIGlmbmRlZiBzdHJkdXAKKyMgIGRlZmluZSBzdHJkdXAoc3RyKSBfX3N0cmR1cCAoc3RyKQorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIFRFWFRET01BSU4gbGliaW50bF90ZXh0ZG9tYWluCisjZW5kaWYKKworLyogTG9jayB2YXJpYWJsZSB0byBwcm90ZWN0IHRoZSBnbG9iYWwgZGF0YSBpbiB0aGUgZ2V0dGV4dCBpbXBsZW1lbnRhdGlvbi4gICovCitfX2xpYmNfcndsb2NrX2RlZmluZSAoZXh0ZXJuLCBfbmxfc3RhdGVfbG9jayBhdHRyaWJ1dGVfaGlkZGVuKQorCisvKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KKyAgIElmIERPTUFJTk5BTUUgaXMgbnVsbCwgcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQuCisgICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KK2NoYXIgKgorVEVYVERPTUFJTiAoY29uc3QgY2hhciAqZG9tYWlubmFtZSkKK3sKKyAgY2hhciAqbmV3X2RvbWFpbjsKKyAgY2hhciAqb2xkX2RvbWFpbjsKKworICAvKiBBIE5VTEwgcG9pbnRlciByZXF1ZXN0cyB0aGUgY3VycmVudCBzZXR0aW5nLiAgKi8KKyAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47CisKKyAgX19saWJjX3J3bG9ja193cmxvY2sgKF9ubF9zdGF0ZV9sb2NrKTsKKworICBvbGRfZG9tYWluID0gKGNoYXIgKikgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47CisKKyAgLyogSWYgZG9tYWluIG5hbWUgaXMgdGhlIG51bGwgc3RyaW5nIHNldCB0byBkZWZhdWx0IGRvbWFpbiAibWVzc2FnZXMiLiAgKi8KKyAgaWYgKGRvbWFpbm5hbWVbMF0gPT0gJ1wwJworICAgICAgfHwgc3RyY21wIChkb21haW5uYW1lLCBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikgPT0gMCkKKyAgICB7CisgICAgICBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluOworICAgICAgbmV3X2RvbWFpbiA9IChjaGFyICopIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOworICAgIH0KKyAgZWxzZSBpZiAoc3RyY21wIChkb21haW5uYW1lLCBvbGRfZG9tYWluKSA9PSAwKQorICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBhbmQgcGVvcGxlIHdpbGwgdXNlIGl0IHRvIHNpZ25hbCB0aGF0IHNvbWUKKyAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSBjaGFuZ2VkLiAgKi8KKyAgICBuZXdfZG9tYWluID0gb2xkX2RvbWFpbjsKKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIElmIHRoZSBmb2xsb3dpbmcgbWFsbG9jIGZhaWxzIGBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbicKKwkgd2lsbCBiZSBOVUxMLiAgVGhpcyB2YWx1ZSB3aWxsIGJlIHJldHVybmVkIGFuZCBzbyBzaWduYWxzIHdlCisJIGFyZSBvdXQgb2YgY29yZS4gICovCisjaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCisgICAgICBuZXdfZG9tYWluID0gc3RyZHVwIChkb21haW5uYW1lKTsKKyNlbHNlCisgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkb21haW5uYW1lKSArIDE7CisgICAgICBuZXdfZG9tYWluID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOworICAgICAgaWYgKG5ld19kb21haW4gIT0gTlVMTCkKKwltZW1jcHkgKG5ld19kb21haW4sIGRvbWFpbm5hbWUsIGxlbik7CisjZW5kaWYKKworICAgICAgaWYgKG5ld19kb21haW4gIT0gTlVMTCkKKwlfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IG5ld19kb21haW47CisgICAgfQorCisgIC8qIFdlIHVzZSB0aGlzIHBvc3NpYmlsaXR5IHRvIHNpZ25hbCBhIGNoYW5nZSBvZiB0aGUgbG9hZGVkIGNhdGFsb2dzCisgICAgIHNpbmNlIHRoaXMgaXMgbW9zdCBsaWtlbHkgdGhlIGNhc2UgYW5kIHRoZXJlIGlzIG5vIG90aGVyIGVhc3kgd2UKKyAgICAgdG8gZG8gaXQuICBEbyBpdCBvbmx5IHdoZW4gdGhlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuICAqLworICBpZiAobmV3X2RvbWFpbiAhPSBOVUxMKQorICAgIHsKKyAgICAgICsrX25sX21zZ19jYXRfY250cjsKKworICAgICAgaWYgKG9sZF9kb21haW4gIT0gbmV3X2RvbWFpbiAmJiBvbGRfZG9tYWluICE9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluKQorCWZyZWUgKG9sZF9kb21haW4pOworICAgIH0KKworICBfX2xpYmNfcndsb2NrX3VubG9jayAoX25sX3N0YXRlX2xvY2spOworCisgIHJldHVybiBuZXdfZG9tYWluOworfQorCisjaWZkZWYgX0xJQkMKKy8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLword2Vha19hbGlhcyAoX190ZXh0ZG9tYWluLCB0ZXh0ZG9tYWluKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdW5peC9pbnRsL3Zhc25wcmludGYuYyBiL3VuaXgvaW50bC92YXNucHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2MjI4MgotLS0gL2Rldi9udWxsCisrKyBiL3VuaXgvaW50bC92YXNucHJpbnRmLmMKQEAgLTAsMCArMSw4ODcgQEAKKy8qIHZzcHJpbnRmIHdpdGggYXV0b21hdGljIG1lbW9yeSBhbGxvY2F0aW9uLgorICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyLTIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgICBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCisgICBVU0EuICAqLworCisvKiBUZWxsIGdsaWJjJ3MgPHN0ZGlvLmg+IHRvIHByb3ZpZGUgYSBwcm90b3R5cGUgZm9yIHNucHJpbnRmKCkuCisgICBUaGlzIG11c3QgY29tZSBiZWZvcmUgPGNvbmZpZy5oPiBiZWNhdXNlIDxjb25maWcuaD4gbWF5IGluY2x1ZGUKKyAgIDxmZWF0dXJlcy5oPiwgYW5kIG9uY2UgPGZlYXR1cmVzLmg+IGhhcyBiZWVuIGluY2x1ZGVkLCBpdCdzIHRvbyBsYXRlLiAgKi8KKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgZGVmaW5lIF9HTlVfU09VUkNFICAgIDEKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorI2lmbmRlZiBJTl9MSUJJTlRMCisjIGluY2x1ZGUgPGFsbG9jYS5oPgorI2VuZGlmCisKKy8qIFNwZWNpZmljYXRpb24uICAqLworI2lmIFdJREVfQ0hBUl9WRVJTSU9OCisjIGluY2x1ZGUgInZhc253cHJpbnRmLmgiCisjZWxzZQorIyBpbmNsdWRlICJ2YXNucHJpbnRmLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CS8qIHNucHJpbnRmKCksIHNwcmludGYoKSAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgkvKiBhYm9ydCgpLCBtYWxsb2MoKSwgcmVhbGxvYygpLCBmcmVlKCkgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4JLyogbWVtY3B5KCksIHN0cmxlbigpICovCisjaW5jbHVkZSA8ZXJybm8uaD4JLyogZXJybm8gKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4JLyogQ0hBUl9CSVQgKi8KKyNpbmNsdWRlIDxmbG9hdC5oPgkvKiBEQkxfTUFYX0VYUCwgTERCTF9NQVhfRVhQICovCisjaWYgV0lERV9DSEFSX1ZFUlNJT04KKyMgaW5jbHVkZSAid3ByaW50Zi1wYXJzZS5oIgorI2Vsc2UKKyMgaW5jbHVkZSAicHJpbnRmLXBhcnNlLmgiCisjZW5kaWYKKworLyogQ2hlY2tlZCBzaXplX3QgY29tcHV0YXRpb25zLiAgKi8KKyNpbmNsdWRlICJ4c2l6ZS5oIgorCisjaWZkZWYgSEFWRV9XQ0hBUl9UCisjIGlmZGVmIEhBVkVfV0NTTEVOCisjICBkZWZpbmUgbG9jYWxfd2NzbGVuIHdjc2xlbgorIyBlbHNlCisgICAvKiBTb2xhcmlzIDIuNS4xIGhhcyB3Y3NsZW4oKSBpbiBhIHNlcGFyYXRlIGxpYnJhcnkgbGlidy5zby4gVG8gYXZvaWQKKyAgICAgIGEgZGVwZW5kZW5jeSB0b3dhcmRzIHRoaXMgbGlicmFyeSwgaGVyZSBpcyBhIGxvY2FsIHN1YnN0aXR1dGUuCisgICAgICBEZWZpbmUgdGhpcyBzdWJzdGl0dXRlIG9ubHkgb25jZSwgZXZlbiBpZiB0aGlzIGZpbGUgaXMgaW5jbHVkZWQKKyAgICAgIHR3aWNlIGluIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQuICAqLworIyAgaWZuZGVmIGxvY2FsX3djc2xlbl9kZWZpbmVkCisjICAgZGVmaW5lIGxvY2FsX3djc2xlbl9kZWZpbmVkIDEKK3N0YXRpYyBzaXplX3QKK2xvY2FsX3djc2xlbiAoY29uc3Qgd2NoYXJfdCAqcykKK3sKKyAgY29uc3Qgd2NoYXJfdCAqcHRyOworCisgIGZvciAocHRyID0gczsgKnB0ciAhPSAod2NoYXJfdCkgMDsgcHRyKyspCisgICAgOworICByZXR1cm4gcHRyIC0gczsKK30KKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmIFdJREVfQ0hBUl9WRVJTSU9OCisjIGRlZmluZSBWQVNOUFJJTlRGIHZhc253cHJpbnRmCisjIGRlZmluZSBDSEFSX1Qgd2NoYXJfdAorIyBkZWZpbmUgRElSRUNUSVZFIHdjaGFyX3RfZGlyZWN0aXZlCisjIGRlZmluZSBESVJFQ1RJVkVTIHdjaGFyX3RfZGlyZWN0aXZlcworIyBkZWZpbmUgUFJJTlRGX1BBUlNFIHdwcmludGZfcGFyc2UKKyMgZGVmaW5lIFVTRV9TTlBSSU5URiAxCisjIGlmIEhBVkVfREVDTF9fU05XUFJJTlRGCisgICAvKiBPbiBXaW5kb3dzLCB0aGUgZnVuY3Rpb24gc3dwcmludGYoKSBoYXMgYSBkaWZmZXJlbnQgc2lnbmF0dXJlIHRoYW4KKyAgICAgIG9uIFVuaXg7IHdlIHVzZSB0aGUgX3Nud3ByaW50ZigpIGZ1bmN0aW9uIGluc3RlYWQuICAqLworIyAgZGVmaW5lIFNOUFJJTlRGIF9zbndwcmludGYKKyMgZWxzZQorICAgLyogVW5peC4gICovCisjICBkZWZpbmUgU05QUklOVEYgc3dwcmludGYKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBWQVNOUFJJTlRGIHZhc25wcmludGYKKyMgZGVmaW5lIENIQVJfVCBjaGFyCisjIGRlZmluZSBESVJFQ1RJVkUgY2hhcl9kaXJlY3RpdmUKKyMgZGVmaW5lIERJUkVDVElWRVMgY2hhcl9kaXJlY3RpdmVzCisjIGRlZmluZSBQUklOVEZfUEFSU0UgcHJpbnRmX3BhcnNlCisjIGRlZmluZSBVU0VfU05QUklOVEYgKEhBVkVfREVDTF9fU05QUklOVEYgfHwgSEFWRV9TTlBSSU5URikKKyMgaWYgSEFWRV9ERUNMX19TTlBSSU5URgorICAgLyogV2luZG93cy4gICovCisjICBkZWZpbmUgU05QUklOVEYgX3NucHJpbnRmCisjIGVsc2UKKyAgIC8qIFVuaXguICAqLworIyAgZGVmaW5lIFNOUFJJTlRGIHNucHJpbnRmCisjIGVuZGlmCisjZW5kaWYKKworQ0hBUl9UICoKK1ZBU05QUklOVEYgKENIQVJfVCAqcmVzdWx0YnVmLCBzaXplX3QgKmxlbmd0aHAsIGNvbnN0IENIQVJfVCAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgIERJUkVDVElWRVMgZDsKKyAgYXJndW1lbnRzIGE7CisKKyAgaWYgKFBSSU5URl9QQVJTRSAoZm9ybWF0LCAmZCwgJmEpIDwgMCkKKyAgICB7CisgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworI2RlZmluZSBDTEVBTlVQKCkgXAorICBmcmVlIChkLmRpcik7CQkJCQkJCQlcCisgIGlmIChhLmFyZykJCQkJCQkJCVwKKyAgICBmcmVlIChhLmFyZyk7CisKKyAgaWYgKHByaW50Zl9mZXRjaGFyZ3MgKGFyZ3MsICZhKSA8IDApCisgICAgeworICAgICAgQ0xFQU5VUCAoKTsKKyAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIHsKKyAgICBzaXplX3QgYnVmX25lZWRlZGxlbmd0aDsKKyAgICBDSEFSX1QgKmJ1ZjsKKyAgICBDSEFSX1QgKmJ1Zl9tYWxsb2NlZDsKKyAgICBjb25zdCBDSEFSX1QgKmNwOworICAgIHNpemVfdCBpOworICAgIERJUkVDVElWRSAqZHA7CisgICAgLyogT3V0cHV0IHN0cmluZyBhY2N1bXVsYXRvci4gICovCisgICAgQ0hBUl9UICpyZXN1bHQ7CisgICAgc2l6ZV90IGFsbG9jYXRlZDsKKyAgICBzaXplX3QgbGVuZ3RoOworCisgICAgLyogQWxsb2NhdGUgYSBzbWFsbCBidWZmZXIgdGhhdCB3aWxsIGhvbGQgYSBkaXJlY3RpdmUgcGFzc2VkIHRvCisgICAgICAgc3ByaW50ZiBvciBzbnByaW50Zi4gICovCisgICAgYnVmX25lZWRlZGxlbmd0aCA9CisgICAgICB4c3VtNCAoNywgZC5tYXhfd2lkdGhfbGVuZ3RoLCBkLm1heF9wcmVjaXNpb25fbGVuZ3RoLCA2KTsKKyNpZiBIQVZFX0FMTE9DQQorICAgIGlmIChidWZfbmVlZGVkbGVuZ3RoIDwgNDAwMCAvIHNpemVvZiAoQ0hBUl9UKSkKKyAgICAgIHsKKwlidWYgPSAoQ0hBUl9UICopIGFsbG9jYSAoYnVmX25lZWRlZGxlbmd0aCAqIHNpemVvZiAoQ0hBUl9UKSk7CisJYnVmX21hbGxvY2VkID0gTlVMTDsKKyAgICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgIHsKKwlzaXplX3QgYnVmX21lbXNpemUgPSB4dGltZXMgKGJ1Zl9uZWVkZWRsZW5ndGgsIHNpemVvZiAoQ0hBUl9UKSk7CisJaWYgKHNpemVfb3ZlcmZsb3dfcCAoYnVmX21lbXNpemUpKQorCSAgZ290byBvdXRfb2ZfbWVtb3J5XzE7CisJYnVmID0gKENIQVJfVCAqKSBtYWxsb2MgKGJ1Zl9tZW1zaXplKTsKKwlpZiAoYnVmID09IE5VTEwpCisJICBnb3RvIG91dF9vZl9tZW1vcnlfMTsKKwlidWZfbWFsbG9jZWQgPSBidWY7CisgICAgICB9CisKKyAgICBpZiAocmVzdWx0YnVmICE9IE5VTEwpCisgICAgICB7CisJcmVzdWx0ID0gcmVzdWx0YnVmOworCWFsbG9jYXRlZCA9ICpsZW5ndGhwOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwlyZXN1bHQgPSBOVUxMOworCWFsbG9jYXRlZCA9IDA7CisgICAgICB9CisgICAgbGVuZ3RoID0gMDsKKyAgICAvKiBJbnZhcmlhbnRzOgorICAgICAgIHJlc3VsdCBpcyBlaXRoZXIgPT0gcmVzdWx0YnVmIG9yID09IE5VTEwgb3IgbWFsbG9jLWFsbG9jYXRlZC4KKyAgICAgICBJZiBsZW5ndGggPiAwLCB0aGVuIHJlc3VsdCAhPSBOVUxMLiAgKi8KKworICAgIC8qIEVuc3VyZXMgdGhhdCBhbGxvY2F0ZWQgPj0gbmVlZGVkLiAgQWJvcnRzIHRocm91Z2ggYSBqdW1wIHRvCisgICAgICAgb3V0X29mX21lbW9yeSBpZiBuZWVkZWQgaXMgU0laRV9NQVggb3Igb3RoZXJ3aXNlIHRvbyBiaWcuICAqLworI2RlZmluZSBFTlNVUkVfQUxMT0NBVElPTihuZWVkZWQpIFwKKyAgICBpZiAoKG5lZWRlZCkgPiBhbGxvY2F0ZWQpCQkJCQkJICAgICBcCisgICAgICB7CQkJCQkJCQkJICAgICBcCisJc2l6ZV90IG1lbW9yeV9zaXplOwkJCQkJCSAgICAgXAorCUNIQVJfVCAqbWVtb3J5OwkJCQkJCQkgICAgIFwKKwkJCQkJCQkJCSAgICAgXAorCWFsbG9jYXRlZCA9IChhbGxvY2F0ZWQgPiAwID8geHRpbWVzIChhbGxvY2F0ZWQsIDIpIDogMTIpOwkgICAgIFwKKwlpZiAoKG5lZWRlZCkgPiBhbGxvY2F0ZWQpCQkJCQkgICAgIFwKKwkgIGFsbG9jYXRlZCA9IChuZWVkZWQpOwkJCQkJCSAgICAgXAorCW1lbW9yeV9zaXplID0geHRpbWVzIChhbGxvY2F0ZWQsIHNpemVvZiAoQ0hBUl9UKSk7CQkgICAgIFwKKwlpZiAoc2l6ZV9vdmVyZmxvd19wIChtZW1vcnlfc2l6ZSkpCQkJCSAgICAgXAorCSAgZ290byBvdXRfb2ZfbWVtb3J5OwkJCQkJCSAgICAgXAorCWlmIChyZXN1bHQgPT0gcmVzdWx0YnVmIHx8IHJlc3VsdCA9PSBOVUxMKQkJCSAgICAgXAorCSAgbWVtb3J5ID0gKENIQVJfVCAqKSBtYWxsb2MgKG1lbW9yeV9zaXplKTsJCQkgICAgIFwKKwllbHNlCQkJCQkJCQkgICAgIFwKKwkgIG1lbW9yeSA9IChDSEFSX1QgKikgcmVhbGxvYyAocmVzdWx0LCBtZW1vcnlfc2l6ZSk7CQkgICAgIFwKKwlpZiAobWVtb3J5ID09IE5VTEwpCQkJCQkJICAgICBcCisJICBnb3RvIG91dF9vZl9tZW1vcnk7CQkJCQkJICAgICBcCisJaWYgKHJlc3VsdCA9PSByZXN1bHRidWYgJiYgbGVuZ3RoID4gMCkJCQkJICAgICBcCisJICBtZW1jcHkgKG1lbW9yeSwgcmVzdWx0LCBsZW5ndGggKiBzaXplb2YgKENIQVJfVCkpOwkJICAgICBcCisJcmVzdWx0ID0gbWVtb3J5OwkJCQkJCSAgICAgXAorICAgICAgfQorCisgICAgZm9yIChjcCA9IGZvcm1hdCwgaSA9IDAsIGRwID0gJmQuZGlyWzBdOyA7IGNwID0gZHAtPmRpcl9lbmQsIGkrKywgZHArKykKKyAgICAgIHsKKwlpZiAoY3AgIT0gZHAtPmRpcl9zdGFydCkKKwkgIHsKKwkgICAgc2l6ZV90IG4gPSBkcC0+ZGlyX3N0YXJ0IC0gY3A7CisJICAgIHNpemVfdCBhdWdtZW50ZWRfbGVuZ3RoID0geHN1bSAobGVuZ3RoLCBuKTsKKworCSAgICBFTlNVUkVfQUxMT0NBVElPTiAoYXVnbWVudGVkX2xlbmd0aCk7CisJICAgIG1lbWNweSAocmVzdWx0ICsgbGVuZ3RoLCBjcCwgbiAqIHNpemVvZiAoQ0hBUl9UKSk7CisJICAgIGxlbmd0aCA9IGF1Z21lbnRlZF9sZW5ndGg7CisJICB9CisJaWYgKGkgPT0gZC5jb3VudCkKKwkgIGJyZWFrOworCisJLyogRXhlY3V0ZSBhIHNpbmdsZSBkaXJlY3RpdmUuICAqLworCWlmIChkcC0+Y29udmVyc2lvbiA9PSAnJScpCisJICB7CisJICAgIHNpemVfdCBhdWdtZW50ZWRfbGVuZ3RoOworCisJICAgIGlmICghKGRwLT5hcmdfaW5kZXggPT0gQVJHX05PTkUpKQorCSAgICAgIGFib3J0ICgpOworCSAgICBhdWdtZW50ZWRfbGVuZ3RoID0geHN1bSAobGVuZ3RoLCAxKTsKKwkgICAgRU5TVVJFX0FMTE9DQVRJT04gKGF1Z21lbnRlZF9sZW5ndGgpOworCSAgICByZXN1bHRbbGVuZ3RoXSA9ICclJzsKKwkgICAgbGVuZ3RoID0gYXVnbWVudGVkX2xlbmd0aDsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIGlmICghKGRwLT5hcmdfaW5kZXggIT0gQVJHX05PTkUpKQorCSAgICAgIGFib3J0ICgpOworCisJICAgIGlmIChkcC0+Y29udmVyc2lvbiA9PSAnbicpCisJICAgICAgeworCQlzd2l0Y2ggKGEuYXJnW2RwLT5hcmdfaW5kZXhdLnR5cGUpCisJCSAgeworCQkgIGNhc2UgVFlQRV9DT1VOVF9TQ0hBUl9QT0lOVEVSOgorCQkgICAgKmEuYXJnW2RwLT5hcmdfaW5kZXhdLmEuYV9jb3VudF9zY2hhcl9wb2ludGVyID0gbGVuZ3RoOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBUWVBFX0NPVU5UX1NIT1JUX1BPSU5URVI6CisJCSAgICAqYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NvdW50X3Nob3J0X3BvaW50ZXIgPSBsZW5ndGg7CisJCSAgICBicmVhazsKKwkJICBjYXNlIFRZUEVfQ09VTlRfSU5UX1BPSU5URVI6CisJCSAgICAqYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NvdW50X2ludF9wb2ludGVyID0gbGVuZ3RoOworCQkgICAgYnJlYWs7CisJCSAgY2FzZSBUWVBFX0NPVU5UX0xPTkdJTlRfUE9JTlRFUjoKKwkJICAgICphLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY291bnRfbG9uZ2ludF9wb2ludGVyID0gbGVuZ3RoOworCQkgICAgYnJlYWs7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKwkJICBjYXNlIFRZUEVfQ09VTlRfTE9OR0xPTkdJTlRfUE9JTlRFUjoKKwkJICAgICphLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfY291bnRfbG9uZ2xvbmdpbnRfcG9pbnRlciA9IGxlbmd0aDsKKwkJICAgIGJyZWFrOworI2VuZGlmCisJCSAgZGVmYXVsdDoKKwkJICAgIGFib3J0ICgpOworCQkgIH0KKwkgICAgICB9CisJICAgIGVsc2UKKwkgICAgICB7CisJCWFyZ190eXBlIHR5cGUgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS50eXBlOworCQlDSEFSX1QgKnA7CisJCXVuc2lnbmVkIGludCBwcmVmaXhfY291bnQ7CisJCWludCBwcmVmaXhlc1syXTsKKyNpZiAhVVNFX1NOUFJJTlRGCisJCXNpemVfdCB0bXBfbGVuZ3RoOworCQlDSEFSX1QgdG1wYnVmWzcwMF07CisJCUNIQVJfVCAqdG1wOworCisJCS8qIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBvZiBzdWZmaWNpZW50IHNpemUgZm9yIGNhbGxpbmcKKwkJICAgc3ByaW50Zi4gICovCisJCXsKKwkJICBzaXplX3Qgd2lkdGg7CisJCSAgc2l6ZV90IHByZWNpc2lvbjsKKworCQkgIHdpZHRoID0gMDsKKwkJICBpZiAoZHAtPndpZHRoX3N0YXJ0ICE9IGRwLT53aWR0aF9lbmQpCisJCSAgICB7CisJCSAgICAgIGlmIChkcC0+d2lkdGhfYXJnX2luZGV4ICE9IEFSR19OT05FKQorCQkJeworCQkJICBpbnQgYXJnOworCisJCQkgIGlmICghKGEuYXJnW2RwLT53aWR0aF9hcmdfaW5kZXhdLnR5cGUgPT0gVFlQRV9JTlQpKQorCQkJICAgIGFib3J0ICgpOworCQkJICBhcmcgPSBhLmFyZ1tkcC0+d2lkdGhfYXJnX2luZGV4XS5hLmFfaW50OworCQkJICB3aWR0aCA9IChhcmcgPCAwID8gKHVuc2lnbmVkIGludCkgKC1hcmcpIDogYXJnKTsKKwkJCX0KKwkJICAgICAgZWxzZQorCQkJeworCQkJICBjb25zdCBDSEFSX1QgKmRpZ2l0cCA9IGRwLT53aWR0aF9zdGFydDsKKworCQkJICBkbworCQkJICAgIHdpZHRoID0geHN1bSAoeHRpbWVzICh3aWR0aCwgMTApLCAqZGlnaXRwKysgLSAnMCcpOworCQkJICB3aGlsZSAoZGlnaXRwICE9IGRwLT53aWR0aF9lbmQpOworCQkJfQorCQkgICAgfQorCisJCSAgcHJlY2lzaW9uID0gNjsKKwkJICBpZiAoZHAtPnByZWNpc2lvbl9zdGFydCAhPSBkcC0+cHJlY2lzaW9uX2VuZCkKKwkJICAgIHsKKwkJICAgICAgaWYgKGRwLT5wcmVjaXNpb25fYXJnX2luZGV4ICE9IEFSR19OT05FKQorCQkJeworCQkJICBpbnQgYXJnOworCisJCQkgIGlmICghKGEuYXJnW2RwLT5wcmVjaXNpb25fYXJnX2luZGV4XS50eXBlID09IFRZUEVfSU5UKSkKKwkJCSAgICBhYm9ydCAoKTsKKwkJCSAgYXJnID0gYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLmEuYV9pbnQ7CisJCQkgIHByZWNpc2lvbiA9IChhcmcgPCAwID8gMCA6IGFyZyk7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgY29uc3QgQ0hBUl9UICpkaWdpdHAgPSBkcC0+cHJlY2lzaW9uX3N0YXJ0ICsgMTsKKworCQkJICBwcmVjaXNpb24gPSAwOworCQkJICBkbworCQkJICAgIHByZWNpc2lvbiA9IHhzdW0gKHh0aW1lcyAocHJlY2lzaW9uLCAxMCksICpkaWdpdHArKyAtICcwJyk7CisJCQkgIHdoaWxlIChkaWdpdHAgIT0gZHAtPnByZWNpc2lvbl9lbmQpOworCQkJfQorCQkgICAgfQorCisJCSAgc3dpdGNoIChkcC0+Y29udmVyc2lvbikKKwkJICAgIHsKKworCQkgICAgY2FzZSAnZCc6IGNhc2UgJ2knOiBjYXNlICd1JzoKKyMgaWZkZWYgSEFWRV9MT05HX0xPTkcKKwkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdMT05HSU5UKQorCQkJdG1wX2xlbmd0aCA9CisJCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGxvbmcgbG9uZykgKiBDSEFSX0JJVAorCQkJCQkgICogMC4zMDEwMyAvKiBiaW5hcnkgLT4gZGVjaW1hbCAqLworCQkJCQkgICogMiAvKiBlc3RpbWF0ZSBmb3IgRkxBR19HUk9VUCAqLworCQkJCQkgKQorCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKwkJCSAgKyAxOyAvKiBhY2NvdW50IGZvciBsZWFkaW5nIHNpZ24gKi8KKwkJICAgICAgZWxzZQorIyBlbmRpZgorCQkgICAgICBpZiAodHlwZSA9PSBUWVBFX0xPTkdJTlQgfHwgdHlwZSA9PSBUWVBFX1VMT05HSU5UKQorCQkJdG1wX2xlbmd0aCA9CisJCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGxvbmcpICogQ0hBUl9CSVQKKwkJCQkJICAqIDAuMzAxMDMgLyogYmluYXJ5IC0+IGRlY2ltYWwgKi8KKwkJCQkJICAqIDIgLyogZXN0aW1hdGUgZm9yIEZMQUdfR1JPVVAgKi8KKwkJCQkJICkKKwkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCisJCQkgICsgMTsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduICovCisJCSAgICAgIGVsc2UKKwkJCXRtcF9sZW5ndGggPQorCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBpbnQpICogQ0hBUl9CSVQKKwkJCQkJICAqIDAuMzAxMDMgLyogYmluYXJ5IC0+IGRlY2ltYWwgKi8KKwkJCQkJICAqIDIgLyogZXN0aW1hdGUgZm9yIEZMQUdfR1JPVVAgKi8KKwkJCQkJICkKKwkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCisJCQkgICsgMTsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduICovCisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdvJzoKKyMgaWZkZWYgSEFWRV9MT05HX0xPTkcKKwkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9MT05HTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdMT05HSU5UKQorCQkJdG1wX2xlbmd0aCA9CisJCQkgICh1bnNpZ25lZCBpbnQpIChzaXplb2YgKHVuc2lnbmVkIGxvbmcgbG9uZykgKiBDSEFSX0JJVAorCQkJCQkgICogMC4zMzMzMzQgLyogYmluYXJ5IC0+IG9jdGFsICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDE7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiAqLworCQkgICAgICBlbHNlCisjIGVuZGlmCisJCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdJTlQpCisJCQl0bXBfbGVuZ3RoID0KKwkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZykgKiBDSEFSX0JJVAorCQkJCQkgICogMC4zMzMzMzQgLyogYmluYXJ5IC0+IG9jdGFsICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDE7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiAqLworCQkgICAgICBlbHNlCisJCQl0bXBfbGVuZ3RoID0KKwkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgaW50KSAqIENIQVJfQklUCisJCQkJCSAgKiAwLjMzMzMzNCAvKiBiaW5hcnkgLT4gb2N0YWwgKi8KKwkJCQkJICkKKwkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCisJCQkgICsgMTsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduICovCisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICd4JzogY2FzZSAnWCc6CisjIGlmZGVmIEhBVkVfTE9OR19MT05HCisJCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0xPTkdJTlQgfHwgdHlwZSA9PSBUWVBFX1VMT05HTE9OR0lOVCkKKwkJCXRtcF9sZW5ndGggPQorCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBsb25nIGxvbmcpICogQ0hBUl9CSVQKKwkJCQkJICAqIDAuMjUgLyogYmluYXJ5IC0+IGhleGFkZWNpbWFsICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDI7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiBvciBhbHRlcm5hdGUgZm9ybSAqLworCQkgICAgICBlbHNlCisjIGVuZGlmCisJCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0lOVCB8fCB0eXBlID09IFRZUEVfVUxPTkdJTlQpCisJCQl0bXBfbGVuZ3RoID0KKwkJCSAgKHVuc2lnbmVkIGludCkgKHNpemVvZiAodW5zaWduZWQgbG9uZykgKiBDSEFSX0JJVAorCQkJCQkgICogMC4yNSAvKiBiaW5hcnkgLT4gaGV4YWRlY2ltYWwgKi8KKwkJCQkJICkKKwkJCSAgKyAxIC8qIHR1cm4gZmxvb3IgaW50byBjZWlsICovCisJCQkgICsgMjsgLyogYWNjb3VudCBmb3IgbGVhZGluZyBzaWduIG9yIGFsdGVybmF0ZSBmb3JtICovCisJCSAgICAgIGVsc2UKKwkJCXRtcF9sZW5ndGggPQorCQkJICAodW5zaWduZWQgaW50KSAoc2l6ZW9mICh1bnNpZ25lZCBpbnQpICogQ0hBUl9CSVQKKwkJCQkJICAqIDAuMjUgLyogYmluYXJ5IC0+IGhleGFkZWNpbWFsICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDI7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgc2lnbiBvciBhbHRlcm5hdGUgZm9ybSAqLworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnZic6IGNhc2UgJ0YnOgorIyBpZmRlZiBIQVZFX0xPTkdfRE9VQkxFCisJCSAgICAgIGlmICh0eXBlID09IFRZUEVfTE9OR0RPVUJMRSkKKwkJCXRtcF9sZW5ndGggPQorCQkJICAodW5zaWduZWQgaW50KSAoTERCTF9NQVhfRVhQCisJCQkJCSAgKiAwLjMwMTAzIC8qIGJpbmFyeSAtPiBkZWNpbWFsICovCisJCQkJCSAgKiAyIC8qIGVzdGltYXRlIGZvciBGTEFHX0dST1VQICovCisJCQkJCSApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDEwOyAvKiBzaWduLCBkZWNpbWFsIHBvaW50IGV0Yy4gKi8KKwkJICAgICAgZWxzZQorIyBlbmRpZgorCQkJdG1wX2xlbmd0aCA9CisJCQkgICh1bnNpZ25lZCBpbnQpIChEQkxfTUFYX0VYUAorCQkJCQkgICogMC4zMDEwMyAvKiBiaW5hcnkgLT4gZGVjaW1hbCAqLworCQkJCQkgICogMiAvKiBlc3RpbWF0ZSBmb3IgRkxBR19HUk9VUCAqLworCQkJCQkgKQorCQkJICArIDEgLyogdHVybiBmbG9vciBpbnRvIGNlaWwgKi8KKwkJCSAgKyAxMDsgLyogc2lnbiwgZGVjaW1hbCBwb2ludCBldGMuICovCisJCSAgICAgIHRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCBwcmVjaXNpb24pOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnZSc6IGNhc2UgJ0UnOiBjYXNlICdnJzogY2FzZSAnRyc6CisJCSAgICBjYXNlICdhJzogY2FzZSAnQSc6CisJCSAgICAgIHRtcF9sZW5ndGggPQorCQkJMTI7IC8qIHNpZ24sIGRlY2ltYWwgcG9pbnQsIGV4cG9uZW50IGV0Yy4gKi8KKwkJICAgICAgdG1wX2xlbmd0aCA9IHhzdW0gKHRtcF9sZW5ndGgsIHByZWNpc2lvbik7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdjJzoKKyMgaWYgZGVmaW5lZCBIQVZFX1dJTlRfVCAmJiAhV0lERV9DSEFSX1ZFUlNJT04KKwkJICAgICAgaWYgKHR5cGUgPT0gVFlQRV9XSURFX0NIQVIpCisJCQl0bXBfbGVuZ3RoID0gTUJfQ1VSX01BWDsKKwkJICAgICAgZWxzZQorIyBlbmRpZgorCQkJdG1wX2xlbmd0aCA9IDE7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdzJzoKKyMgaWZkZWYgSEFWRV9XQ0hBUl9UCisJCSAgICAgIGlmICh0eXBlID09IFRZUEVfV0lERV9TVFJJTkcpCisJCQl7CisJCQkgIHRtcF9sZW5ndGggPQorCQkJICAgIGxvY2FsX3djc2xlbiAoYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3dpZGVfc3RyaW5nKTsKKworIyAgaWYgIVdJREVfQ0hBUl9WRVJTSU9OCisJCQkgIHRtcF9sZW5ndGggPSB4dGltZXMgKHRtcF9sZW5ndGgsIE1CX0NVUl9NQVgpOworIyAgZW5kaWYKKwkJCX0KKwkJICAgICAgZWxzZQorIyBlbmRpZgorCQkJdG1wX2xlbmd0aCA9IHN0cmxlbiAoYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3N0cmluZyk7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdwJzoKKwkJICAgICAgdG1wX2xlbmd0aCA9CisJCQkodW5zaWduZWQgaW50KSAoc2l6ZW9mICh2b2lkICopICogQ0hBUl9CSVQKKwkJCQkJKiAwLjI1IC8qIGJpbmFyeSAtPiBoZXhhZGVjaW1hbCAqLworCQkJCSAgICAgICApCisJCQkgICsgMSAvKiB0dXJuIGZsb29yIGludG8gY2VpbCAqLworCQkJICArIDI7IC8qIGFjY291bnQgZm9yIGxlYWRpbmcgMHggKi8KKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIGFib3J0ICgpOworCQkgICAgfQorCisJCSAgaWYgKHRtcF9sZW5ndGggPCB3aWR0aCkKKwkJICAgIHRtcF9sZW5ndGggPSB3aWR0aDsKKworCQkgIHRtcF9sZW5ndGggPSB4c3VtICh0bXBfbGVuZ3RoLCAxKTsgLyogYWNjb3VudCBmb3IgdHJhaWxpbmcgTlVMICovCisJCX0KKworCQlpZiAodG1wX2xlbmd0aCA8PSBzaXplb2YgKHRtcGJ1ZikgLyBzaXplb2YgKENIQVJfVCkpCisJCSAgdG1wID0gdG1wYnVmOworCQllbHNlCisJCSAgeworCQkgICAgc2l6ZV90IHRtcF9tZW1zaXplID0geHRpbWVzICh0bXBfbGVuZ3RoLCBzaXplb2YgKENIQVJfVCkpOworCisJCSAgICBpZiAoc2l6ZV9vdmVyZmxvd19wICh0bXBfbWVtc2l6ZSkpCisJCSAgICAgIC8qIE92ZXJmbG93LCB3b3VsZCBsZWFkIHRvIG91dCBvZiBtZW1vcnkuICAqLworCQkgICAgICBnb3RvIG91dF9vZl9tZW1vcnk7CisJCSAgICB0bXAgPSAoQ0hBUl9UICopIG1hbGxvYyAodG1wX21lbXNpemUpOworCQkgICAgaWYgKHRtcCA9PSBOVUxMKQorCQkgICAgICAvKiBPdXQgb2YgbWVtb3J5LiAgKi8KKwkJICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OworCQkgIH0KKyNlbmRpZgorCisJCS8qIENvbnN0cnVjdCB0aGUgZm9ybWF0IHN0cmluZyBmb3IgY2FsbGluZyBzbnByaW50ZiBvcgorCQkgICBzcHJpbnRmLiAgKi8KKwkJcCA9IGJ1ZjsKKwkJKnArKyA9ICclJzsKKwkJaWYgKGRwLT5mbGFncyAmIEZMQUdfR1JPVVApCisJCSAgKnArKyA9ICdcJyc7CisJCWlmIChkcC0+ZmxhZ3MgJiBGTEFHX0xFRlQpCisJCSAgKnArKyA9ICctJzsKKwkJaWYgKGRwLT5mbGFncyAmIEZMQUdfU0hPV1NJR04pCisJCSAgKnArKyA9ICcrJzsKKwkJaWYgKGRwLT5mbGFncyAmIEZMQUdfU1BBQ0UpCisJCSAgKnArKyA9ICcgJzsKKwkJaWYgKGRwLT5mbGFncyAmIEZMQUdfQUxUKQorCQkgICpwKysgPSAnIyc7CisJCWlmIChkcC0+ZmxhZ3MgJiBGTEFHX1pFUk8pCisJCSAgKnArKyA9ICcwJzsKKwkJaWYgKGRwLT53aWR0aF9zdGFydCAhPSBkcC0+d2lkdGhfZW5kKQorCQkgIHsKKwkJICAgIHNpemVfdCBuID0gZHAtPndpZHRoX2VuZCAtIGRwLT53aWR0aF9zdGFydDsKKwkJICAgIG1lbWNweSAocCwgZHAtPndpZHRoX3N0YXJ0LCBuICogc2l6ZW9mIChDSEFSX1QpKTsKKwkJICAgIHAgKz0gbjsKKwkJICB9CisJCWlmIChkcC0+cHJlY2lzaW9uX3N0YXJ0ICE9IGRwLT5wcmVjaXNpb25fZW5kKQorCQkgIHsKKwkJICAgIHNpemVfdCBuID0gZHAtPnByZWNpc2lvbl9lbmQgLSBkcC0+cHJlY2lzaW9uX3N0YXJ0OworCQkgICAgbWVtY3B5IChwLCBkcC0+cHJlY2lzaW9uX3N0YXJ0LCBuICogc2l6ZW9mIChDSEFSX1QpKTsKKwkJICAgIHAgKz0gbjsKKwkJICB9CisKKwkJc3dpdGNoICh0eXBlKQorCQkgIHsKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworCQkgIGNhc2UgVFlQRV9MT05HTE9OR0lOVDoKKwkJICBjYXNlIFRZUEVfVUxPTkdMT05HSU5UOgorCQkgICAgKnArKyA9ICdsJzsKKwkJICAgIC8qRkFMTFRIUk9VR0gqLworI2VuZGlmCisJCSAgY2FzZSBUWVBFX0xPTkdJTlQ6CisJCSAgY2FzZSBUWVBFX1VMT05HSU5UOgorI2lmZGVmIEhBVkVfV0lOVF9UCisJCSAgY2FzZSBUWVBFX1dJREVfQ0hBUjoKKyNlbmRpZgorI2lmZGVmIEhBVkVfV0NIQVJfVAorCQkgIGNhc2UgVFlQRV9XSURFX1NUUklORzoKKyNlbmRpZgorCQkgICAgKnArKyA9ICdsJzsKKwkJICAgIGJyZWFrOworI2lmZGVmIEhBVkVfTE9OR19ET1VCTEUKKwkJICBjYXNlIFRZUEVfTE9OR0RPVUJMRToKKwkJICAgICpwKysgPSAnTCc7CisJCSAgICBicmVhazsKKyNlbmRpZgorCQkgIGRlZmF1bHQ6CisJCSAgICBicmVhazsKKwkJICB9CisJCSpwID0gZHAtPmNvbnZlcnNpb247CisjaWYgVVNFX1NOUFJJTlRGCisJCXBbMV0gPSAnJSc7CisJCXBbMl0gPSAnbic7CisJCXBbM10gPSAnXDAnOworI2Vsc2UKKwkJcFsxXSA9ICdcMCc7CisjZW5kaWYKKworCQkvKiBDb25zdHJ1Y3QgdGhlIGFyZ3VtZW50cyBmb3IgY2FsbGluZyBzbnByaW50ZiBvciBzcHJpbnRmLiAgKi8KKwkJcHJlZml4X2NvdW50ID0gMDsKKwkJaWYgKGRwLT53aWR0aF9hcmdfaW5kZXggIT0gQVJHX05PTkUpCisJCSAgeworCQkgICAgaWYgKCEoYS5hcmdbZHAtPndpZHRoX2FyZ19pbmRleF0udHlwZSA9PSBUWVBFX0lOVCkpCisJCSAgICAgIGFib3J0ICgpOworCQkgICAgcHJlZml4ZXNbcHJlZml4X2NvdW50KytdID0gYS5hcmdbZHAtPndpZHRoX2FyZ19pbmRleF0uYS5hX2ludDsKKwkJICB9CisJCWlmIChkcC0+cHJlY2lzaW9uX2FyZ19pbmRleCAhPSBBUkdfTk9ORSkKKwkJICB7CisJCSAgICBpZiAoIShhLmFyZ1tkcC0+cHJlY2lzaW9uX2FyZ19pbmRleF0udHlwZSA9PSBUWVBFX0lOVCkpCisJCSAgICAgIGFib3J0ICgpOworCQkgICAgcHJlZml4ZXNbcHJlZml4X2NvdW50KytdID0gYS5hcmdbZHAtPnByZWNpc2lvbl9hcmdfaW5kZXhdLmEuYV9pbnQ7CisJCSAgfQorCisjaWYgVVNFX1NOUFJJTlRGCisJCS8qIFByZXBhcmUgY2hlY2tpbmcgd2hldGhlciBzbnByaW50ZiByZXR1cm5zIHRoZSBjb3VudAorCQkgICB2aWEgJW4uICAqLworCQlFTlNVUkVfQUxMT0NBVElPTiAoeHN1bSAobGVuZ3RoLCAxKSk7CisJCXJlc3VsdFtsZW5ndGhdID0gJ1wwJzsKKyNlbmRpZgorCisJCWZvciAoOzspCisJCSAgeworCQkgICAgc2l6ZV90IG1heGxlbjsKKwkJICAgIGludCBjb3VudDsKKwkJICAgIGludCByZXRjb3VudDsKKworCQkgICAgbWF4bGVuID0gYWxsb2NhdGVkIC0gbGVuZ3RoOworCQkgICAgY291bnQgPSAtMTsKKwkJICAgIHJldGNvdW50ID0gMDsKKworI2lmIFVTRV9TTlBSSU5URgorIyBkZWZpbmUgU05QUklOVEZfQlVGKGFyZykgXAorCQkgICAgc3dpdGNoIChwcmVmaXhfY291bnQpCQkJCSAgICBcCisJCSAgICAgIHsJCQkJCQkJICAgIFwKKwkJICAgICAgY2FzZSAwOgkJCQkJCSAgICBcCisJCQlyZXRjb3VudCA9IFNOUFJJTlRGIChyZXN1bHQgKyBsZW5ndGgsIG1heGxlbiwgYnVmLCAgXAorCQkJCQkgICAgIGFyZywgJmNvdW50KTsJCSAgICBcCisJCQlicmVhazsJCQkJCQkgICAgXAorCQkgICAgICBjYXNlIDE6CQkJCQkJICAgIFwKKwkJCXJldGNvdW50ID0gU05QUklOVEYgKHJlc3VsdCArIGxlbmd0aCwgbWF4bGVuLCBidWYsICBcCisJCQkJCSAgICAgcHJlZml4ZXNbMF0sIGFyZywgJmNvdW50KTsJICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICBcCisJCSAgICAgIGNhc2UgMjoJCQkJCQkgICAgXAorCQkJcmV0Y291bnQgPSBTTlBSSU5URiAocmVzdWx0ICsgbGVuZ3RoLCBtYXhsZW4sIGJ1ZiwgIFwKKwkJCQkJICAgICBwcmVmaXhlc1swXSwgcHJlZml4ZXNbMV0sIGFyZywgXAorCQkJCQkgICAgICZjb3VudCk7CQkJICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICBcCisJCSAgICAgIGRlZmF1bHQ6CQkJCQkJICAgIFwKKwkJCWFib3J0ICgpOwkJCQkJICAgIFwKKwkJICAgICAgfQorI2Vsc2UKKyMgZGVmaW5lIFNOUFJJTlRGX0JVRihhcmcpIFwKKwkJICAgIHN3aXRjaCAocHJlZml4X2NvdW50KQkJCQkgICAgXAorCQkgICAgICB7CQkJCQkJCSAgICBcCisJCSAgICAgIGNhc2UgMDoJCQkJCQkgICAgXAorCQkJY291bnQgPSBzcHJpbnRmICh0bXAsIGJ1ZiwgYXJnKTsJCSAgICBcCisJCQlicmVhazsJCQkJCQkgICAgXAorCQkgICAgICBjYXNlIDE6CQkJCQkJICAgIFwKKwkJCWNvdW50ID0gc3ByaW50ZiAodG1wLCBidWYsIHByZWZpeGVzWzBdLCBhcmcpOwkgICAgXAorCQkJYnJlYWs7CQkJCQkJICAgIFwKKwkJICAgICAgY2FzZSAyOgkJCQkJCSAgICBcCisJCQljb3VudCA9IHNwcmludGYgKHRtcCwgYnVmLCBwcmVmaXhlc1swXSwgcHJlZml4ZXNbMV0sXAorCQkJCQkgYXJnKTsJCQkJICAgIFwKKwkJCWJyZWFrOwkJCQkJCSAgICBcCisJCSAgICAgIGRlZmF1bHQ6CQkJCQkJICAgIFwKKwkJCWFib3J0ICgpOwkJCQkJICAgIFwKKwkJICAgICAgfQorI2VuZGlmCisKKwkJICAgIHN3aXRjaCAodHlwZSkKKwkJICAgICAgeworCQkgICAgICBjYXNlIFRZUEVfU0NIQVI6CisJCQl7CisJCQkgIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfc2NoYXI7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgICBjYXNlIFRZUEVfVUNIQVI6CisJCQl7CisJCQkgIHVuc2lnbmVkIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfdWNoYXI7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgICBjYXNlIFRZUEVfU0hPUlQ6CisJCQl7CisJCQkgIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfc2hvcnQ7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworCQkgICAgICBjYXNlIFRZUEVfVVNIT1JUOgorCQkJeworCQkJICB1bnNpZ25lZCBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3VzaG9ydDsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisJCSAgICAgIGNhc2UgVFlQRV9JTlQ6CisJCQl7CisJCQkgIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfaW50OworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKwkJICAgICAgY2FzZSBUWVBFX1VJTlQ6CisJCQl7CisJCQkgIHVuc2lnbmVkIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfdWludDsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisJCSAgICAgIGNhc2UgVFlQRV9MT05HSU5UOgorCQkJeworCQkJICBsb25nIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfbG9uZ2ludDsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisJCSAgICAgIGNhc2UgVFlQRV9VTE9OR0lOVDoKKwkJCXsKKwkJCSAgdW5zaWduZWQgbG9uZyBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX3Vsb25naW50OworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworCQkgICAgICBjYXNlIFRZUEVfTE9OR0xPTkdJTlQ6CisJCQl7CisJCQkgIGxvbmcgbG9uZyBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2xvbmdsb25naW50OworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKwkJICAgICAgY2FzZSBUWVBFX1VMT05HTE9OR0lOVDoKKwkJCXsKKwkJCSAgdW5zaWduZWQgbG9uZyBsb25nIGludCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfdWxvbmdsb25naW50OworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQkgICAgICBjYXNlIFRZUEVfRE9VQkxFOgorCQkJeworCQkJICBkb3VibGUgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2RvdWJsZTsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisjaWZkZWYgSEFWRV9MT05HX0RPVUJMRQorCQkgICAgICBjYXNlIFRZUEVfTE9OR0RPVUJMRToKKwkJCXsKKwkJCSAgbG9uZyBkb3VibGUgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2xvbmdkb3VibGU7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCSAgICAgIGNhc2UgVFlQRV9DSEFSOgorCQkJeworCQkJICBpbnQgYXJnID0gYS5hcmdbZHAtPmFyZ19pbmRleF0uYS5hX2NoYXI7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworI2lmZGVmIEhBVkVfV0lOVF9UCisJCSAgICAgIGNhc2UgVFlQRV9XSURFX0NIQVI6CisJCQl7CisJCQkgIHdpbnRfdCBhcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfd2lkZV9jaGFyOworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQkgICAgICBjYXNlIFRZUEVfU1RSSU5HOgorCQkJeworCQkJICBjb25zdCBjaGFyICphcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfc3RyaW5nOworCQkJICBTTlBSSU5URl9CVUYgKGFyZyk7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBIQVZFX1dDSEFSX1QKKwkJICAgICAgY2FzZSBUWVBFX1dJREVfU1RSSU5HOgorCQkJeworCQkJICBjb25zdCB3Y2hhcl90ICphcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfd2lkZV9zdHJpbmc7CisJCQkgIFNOUFJJTlRGX0JVRiAoYXJnKTsKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCSAgICAgIGNhc2UgVFlQRV9QT0lOVEVSOgorCQkJeworCQkJICB2b2lkICphcmcgPSBhLmFyZ1tkcC0+YXJnX2luZGV4XS5hLmFfcG9pbnRlcjsKKwkJCSAgU05QUklOVEZfQlVGIChhcmcpOworCQkJfQorCQkJYnJlYWs7CisJCSAgICAgIGRlZmF1bHQ6CisJCQlhYm9ydCAoKTsKKwkJICAgICAgfQorCisjaWYgVVNFX1NOUFJJTlRGCisJCSAgICAvKiBQb3J0YWJpbGl0eTogTm90IGFsbCBpbXBsZW1lbnRhdGlvbnMgb2Ygc25wcmludGYoKQorCQkgICAgICAgYXJlIElTTyBDIDk5IGNvbXBsaWFudC4gIERldGVybWluZSB0aGUgbnVtYmVyIG9mCisJCSAgICAgICBieXRlcyB0aGF0IHNucHJpbnRmKCkgaGFzIHByb2R1Y2VkIG9yIHdvdWxkIGhhdmUKKwkJICAgICAgIHByb2R1Y2VkLiAgKi8KKwkJICAgIGlmIChjb3VudCA+PSAwKQorCQkgICAgICB7CisJCQkvKiBWZXJpZnkgdGhhdCBzbnByaW50ZigpIGhhcyBOVUwtdGVybWluYXRlZCBpdHMKKwkJCSAgIHJlc3VsdC4gICovCisJCQlpZiAoY291bnQgPCBtYXhsZW4gJiYgcmVzdWx0W2xlbmd0aCArIGNvdW50XSAhPSAnXDAnKQorCQkJICBhYm9ydCAoKTsKKwkJCS8qIFBvcnRhYmlsaXR5IGhhY2suICAqLworCQkJaWYgKHJldGNvdW50ID4gY291bnQpCisJCQkgIGNvdW50ID0gcmV0Y291bnQ7CisJCSAgICAgIH0KKwkJICAgIGVsc2UKKwkJICAgICAgeworCQkJLyogc25wcmludGYoKSBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlICclbicKKwkJCSAgIGRpcmVjdGl2ZS4gICovCisJCQlpZiAocFsxXSAhPSAnXDAnKQorCQkJICB7CisJCQkgICAgLyogRG9uJ3QgdXNlIHRoZSAnJW4nIGRpcmVjdGl2ZTsgaW5zdGVhZCwgbG9vaworCQkJICAgICAgIGF0IHRoZSBzbnByaW50ZigpIHJldHVybiB2YWx1ZS4gICovCisJCQkgICAgcFsxXSA9ICdcMCc7CisJCQkgICAgY29udGludWU7CisJCQkgIH0KKwkJCWVsc2UKKwkJCSAgeworCQkJICAgIC8qIExvb2sgYXQgdGhlIHNucHJpbnRmKCkgcmV0dXJuIHZhbHVlLiAgKi8KKwkJCSAgICBpZiAocmV0Y291bnQgPCAwKQorCQkJICAgICAgeworCQkJCS8qIEhQLVVYIDEwLjIwIHNucHJpbnRmKCkgaXMgZG91Ymx5IGRlZmljaWVudDoKKwkJCQkgICBJdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlICclbicgZGlyZWN0aXZlLAorCQkJCSAgICphbmQqIGl0IHJldHVybnMgLTEgKHJhdGhlciB0aGFuIHRoZSBsZW5ndGgKKwkJCQkgICB0aGF0IHdvdWxkIGhhdmUgYmVlbiByZXF1aXJlZCkgd2hlbiB0aGUKKwkJCQkgICBidWZmZXIgaXMgdG9vIHNtYWxsLiAgKi8KKwkJCQlzaXplX3QgYmlnZ2VyX25lZWQgPQorCQkJCSAgeHN1bSAoeHRpbWVzIChhbGxvY2F0ZWQsIDIpLCAxMik7CisJCQkJRU5TVVJFX0FMTE9DQVRJT04gKGJpZ2dlcl9uZWVkKTsKKwkJCQljb250aW51ZTsKKwkJCSAgICAgIH0KKwkJCSAgICBlbHNlCisJCQkgICAgICBjb3VudCA9IHJldGNvdW50OworCQkJICB9CisJCSAgICAgIH0KKyNlbmRpZgorCisJCSAgICAvKiBBdHRlbXB0IHRvIGhhbmRsZSBmYWlsdXJlLiAgKi8KKwkJICAgIGlmIChjb3VudCA8IDApCisJCSAgICAgIHsKKwkJCWlmICghKHJlc3VsdCA9PSByZXN1bHRidWYgfHwgcmVzdWx0ID09IE5VTEwpKQorCQkJICBmcmVlIChyZXN1bHQpOworCQkJaWYgKGJ1Zl9tYWxsb2NlZCAhPSBOVUxMKQorCQkJICBmcmVlIChidWZfbWFsbG9jZWQpOworCQkJQ0xFQU5VUCAoKTsKKwkJCWVycm5vID0gRUlOVkFMOworCQkJcmV0dXJuIE5VTEw7CisJCSAgICAgIH0KKworI2lmICFVU0VfU05QUklOVEYKKwkJICAgIGlmIChjb3VudCA+PSB0bXBfbGVuZ3RoKQorCQkgICAgICAvKiB0bXBfbGVuZ3RoIHdhcyBpbmNvcnJlY3RseSBjYWxjdWxhdGVkIC0gZml4IHRoZQorCQkJIGNvZGUgYWJvdmUhICAqLworCQkgICAgICBhYm9ydCAoKTsKKyNlbmRpZgorCisJCSAgICAvKiBNYWtlIHJvb20gZm9yIHRoZSByZXN1bHQuICAqLworCQkgICAgaWYgKGNvdW50ID49IG1heGxlbikKKwkJICAgICAgeworCQkJLyogTmVlZCBhdCBsZWFzdCBjb3VudCBieXRlcy4gIEJ1dCBhbGxvY2F0ZQorCQkJICAgcHJvcG9ydGlvbmFsbHksIHRvIGF2b2lkIGxvb3BpbmcgZXRlcm5hbGx5IGlmCisJCQkgICBzbnByaW50ZigpIHJlcG9ydHMgYSB0b28gc21hbGwgY291bnQuICAqLworCQkJc2l6ZV90IG4gPQorCQkJICB4bWF4ICh4c3VtIChsZW5ndGgsIGNvdW50KSwgeHRpbWVzIChhbGxvY2F0ZWQsIDIpKTsKKworCQkJRU5TVVJFX0FMTE9DQVRJT04gKG4pOworI2lmIFVTRV9TTlBSSU5URgorCQkJY29udGludWU7CisjZW5kaWYKKwkJICAgICAgfQorCisjaWYgVVNFX1NOUFJJTlRGCisJCSAgICAvKiBUaGUgc25wcmludGYoKSByZXN1bHQgZGlkIGZpdC4gICovCisjZWxzZQorCQkgICAgLyogQXBwZW5kIHRoZSBzcHJpbnRmKCkgcmVzdWx0LiAgKi8KKwkJICAgIG1lbWNweSAocmVzdWx0ICsgbGVuZ3RoLCB0bXAsIGNvdW50ICogc2l6ZW9mIChDSEFSX1QpKTsKKwkJICAgIGlmICh0bXAgIT0gdG1wYnVmKQorCQkgICAgICBmcmVlICh0bXApOworI2VuZGlmCisKKwkJICAgIGxlbmd0aCArPSBjb3VudDsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkgICAgICB9CisJICB9CisgICAgICB9CisKKyAgICAvKiBBZGQgdGhlIGZpbmFsIE5VTC4gICovCisgICAgRU5TVVJFX0FMTE9DQVRJT04gKHhzdW0gKGxlbmd0aCwgMSkpOworICAgIHJlc3VsdFtsZW5ndGhdID0gJ1wwJzsKKworICAgIGlmIChyZXN1bHQgIT0gcmVzdWx0YnVmICYmIGxlbmd0aCArIDEgPCBhbGxvY2F0ZWQpCisgICAgICB7CisJLyogU2hyaW5rIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGlmIHBvc3NpYmxlLiAgKi8KKwlDSEFSX1QgKm1lbW9yeTsKKworCW1lbW9yeSA9IChDSEFSX1QgKikgcmVhbGxvYyAocmVzdWx0LCAobGVuZ3RoICsgMSkgKiBzaXplb2YgKENIQVJfVCkpOworCWlmIChtZW1vcnkgIT0gTlVMTCkKKwkgIHJlc3VsdCA9IG1lbW9yeTsKKyAgICAgIH0KKworICAgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKKyAgICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7CisgICAgQ0xFQU5VUCAoKTsKKyAgICAqbGVuZ3RocCA9IGxlbmd0aDsKKyAgICByZXR1cm4gcmVzdWx0OworCisgIG91dF9vZl9tZW1vcnk6CisgICAgaWYgKCEocmVzdWx0ID09IHJlc3VsdGJ1ZiB8fCByZXN1bHQgPT0gTlVMTCkpCisgICAgICBmcmVlIChyZXN1bHQpOworICAgIGlmIChidWZfbWFsbG9jZWQgIT0gTlVMTCkKKyAgICAgIGZyZWUgKGJ1Zl9tYWxsb2NlZCk7CisgIG91dF9vZl9tZW1vcnlfMToKKyAgICBDTEVBTlVQICgpOworICAgIGVycm5vID0gRU5PTUVNOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKKyN1bmRlZiBTTlBSSU5URgorI3VuZGVmIFVTRV9TTlBSSU5URgorI3VuZGVmIFBSSU5URl9QQVJTRQorI3VuZGVmIERJUkVDVElWRVMKKyN1bmRlZiBESVJFQ1RJVkUKKyN1bmRlZiBDSEFSX1QKKyN1bmRlZiBWQVNOUFJJTlRGCmRpZmYgLS1naXQgYS91bml4L2ludGwvdmFzbnByaW50Zi5oIGIvdW5peC9pbnRsL3Zhc25wcmludGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWYxYmMxCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL3Zhc25wcmludGYuaApAQCAtMCwwICsxLDYxIEBACisvKiB2c3ByaW50ZiB3aXRoIGF1dG9tYXRpYyBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfVkFTTlBSSU5URl9ICisjZGVmaW5lIF9WQVNOUFJJTlRGX0gKKworLyogR2V0IHZhX2xpc3QuICAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvKiBHZXQgc2l6ZV90LiAgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmbmRlZiBfX2F0dHJpYnV0ZV9fCisvKiBUaGlzIGZlYXR1cmUgaXMgYXZhaWxhYmxlIGluIGdjYyB2ZXJzaW9ucyAyLjUgYW5kIGxhdGVyLiAgKi8KKyMgaWYgX19HTlVDX18gPCAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgNSkgfHwgX19TVFJJQ1RfQU5TSV9fCisjICBkZWZpbmUgX19hdHRyaWJ1dGVfXyhTcGVjKSAvKiBlbXB0eSAqLworIyBlbmRpZgorLyogVGhlIF9fLXByb3RlY3RlZCB2YXJpYW50cyBvZiBgZm9ybWF0JyBhbmQgYHByaW50ZicgYXR0cmlidXRlcworICAgYXJlIGFjY2VwdGVkIGJ5IGdjYyB2ZXJzaW9ucyAyLjYuNCAoZWZmZWN0aXZlbHkgMi43KSBhbmQgbGF0ZXIuICAqLworIyBpZiBfX0dOVUNfXyA8IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA3KQorIyAgZGVmaW5lIF9fZm9ybWF0X18gZm9ybWF0CisjICBkZWZpbmUgX19wcmludGZfXyBwcmludGYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYJX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gYSBzdHJpbmcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHdpdGggbWFsbG9jKCkuCisgICBZb3UgY2FuIHBhc3MgYSBwcmVhbGxvY2F0ZWQgYnVmZmVyIGZvciB0aGUgcmVzdWx0IGluIFJFU1VMVEJVRiBhbmQgaXRzCisgICBzaXplIGluICpMRU5HVEhQOyBvdGhlcndpc2UgeW91IHBhc3MgUkVTVUxUQlVGID0gTlVMTC4KKyAgIElmIHN1Y2Nlc3NmdWwsIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgc3RyaW5nICh0aGlzIG1heSBiZSA9IFJFU1VMVEJVRgorICAgaWYgbm8gZHluYW1pYyBtZW1vcnkgYWxsb2NhdGlvbiB3YXMgbmVjZXNzYXJ5KSBhbmQgc2V0ICpMRU5HVEhQIHRvIHRoZQorICAgbnVtYmVyIG9mIHJlc3VsdGluZyBieXRlcywgZXhjbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuICBVcG9uIGVycm9yLCBzZXQKKyAgIGVycm5vIGFuZCByZXR1cm4gTlVMTC4gICovCitleHRlcm4gY2hhciAqIGFzbnByaW50ZiAoY2hhciAqcmVzdWx0YnVmLCBzaXplX3QgKmxlbmd0aHAsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorICAgICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpOworZXh0ZXJuIGNoYXIgKiB2YXNucHJpbnRmIChjaGFyICpyZXN1bHRidWYsIHNpemVfdCAqbGVuZ3RocCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCisgICAgICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDApKSk7CisKKyNpZmRlZglfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfVkFTTlBSSU5URl9IICovCmRpZmYgLS1naXQgYS91bml4L2ludGwvdmFzbndwcmludGYuaCBiL3VuaXgvaW50bC92YXNud3ByaW50Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzY2VmNGMKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwvdmFzbndwcmludGYuaApAQCAtMCwwICsxLDQ2IEBACisvKiB2c3dwcmludGYgd2l0aCBhdXRvbWF0aWMgbWVtb3J5IGFsbG9jYXRpb24uCisgICBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX1ZBU05XUFJJTlRGX0gKKyNkZWZpbmUgX1ZBU05XUFJJTlRGX0gKKworLyogR2V0IHZhX2xpc3QuICAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvKiBHZXQgd2NoYXJfdCwgc2l6ZV90LiAgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmZGVmCV9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBXcml0ZSBmb3JtYXR0ZWQgb3V0cHV0IHRvIGEgc3RyaW5nIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB3aXRoIG1hbGxvYygpLgorICAgWW91IGNhbiBwYXNzIGEgcHJlYWxsb2NhdGVkIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdCBpbiBSRVNVTFRCVUYgYW5kIGl0cworICAgc2l6ZSBpbiAqTEVOR1RIUDsgb3RoZXJ3aXNlIHlvdSBwYXNzIFJFU1VMVEJVRiA9IE5VTEwuCisgICBJZiBzdWNjZXNzZnVsLCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN0cmluZyAodGhpcyBtYXkgYmUgPSBSRVNVTFRCVUYKKyAgIGlmIG5vIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24gd2FzIG5lY2Vzc2FyeSkgYW5kIHNldCAqTEVOR1RIUCB0byB0aGUKKyAgIG51bWJlciBvZiByZXN1bHRpbmcgYnl0ZXMsIGV4Y2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMLiAgVXBvbiBlcnJvciwgc2V0CisgICBlcnJubyBhbmQgcmV0dXJuIE5VTEwuICAqLworZXh0ZXJuIHdjaGFyX3QgKiBhc253cHJpbnRmICh3Y2hhcl90ICpyZXN1bHRidWYsIHNpemVfdCAqbGVuZ3RocCwgY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCAuLi4pOworZXh0ZXJuIHdjaGFyX3QgKiB2YXNud3ByaW50ZiAod2NoYXJfdCAqcmVzdWx0YnVmLCBzaXplX3QgKmxlbmd0aHAsIGNvbnN0IHdjaGFyX3QgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKTsKKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9WQVNOV1BSSU5URl9IICovCmRpZmYgLS1naXQgYS91bml4L2ludGwvd3ByaW50Zi1wYXJzZS5oIGIvdW5peC9pbnRsL3dwcmludGYtcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGEyY2ZjCi0tLSAvZGV2L251bGwKKysrIGIvdW5peC9pbnRsL3dwcmludGYtcGFyc2UuaApAQCAtMCwwICsxLDc1IEBACisvKiBQYXJzZSBwcmludGYgZm9ybWF0IHN0cmluZy4KKyAgIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMi0yMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAorICAgVVNBLiAgKi8KKworI2lmbmRlZiBfV1BSSU5URl9QQVJTRV9ICisjZGVmaW5lIF9XUFJJTlRGX1BBUlNFX0gKKworI2luY2x1ZGUgInByaW50Zi1hcmdzLmgiCisKKworLyogRmxhZ3MgKi8KKyNkZWZpbmUgRkxBR19HUk9VUAkgMQkvKiAnIGZsYWcgKi8KKyNkZWZpbmUgRkxBR19MRUZUCSAyCS8qIC0gZmxhZyAqLworI2RlZmluZSBGTEFHX1NIT1dTSUdOCSA0CS8qICsgZmxhZyAqLworI2RlZmluZSBGTEFHX1NQQUNFCSA4CS8qIHNwYWNlIGZsYWcgKi8KKyNkZWZpbmUgRkxBR19BTFQJMTYJLyogIyBmbGFnICovCisjZGVmaW5lIEZMQUdfWkVSTwkzMgorCisvKiBhcmdfaW5kZXggdmFsdWUgaW5kaWNhdGluZyB0aGF0IG5vIGFyZ3VtZW50IGlzIGNvbnN1bWVkLiAgKi8KKyNkZWZpbmUgQVJHX05PTkUJKH4oc2l6ZV90KTApCisKKy8qIEEgcGFyc2VkIGRpcmVjdGl2ZS4gICovCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCB3Y2hhcl90KiBkaXJfc3RhcnQ7CisgIGNvbnN0IHdjaGFyX3QqIGRpcl9lbmQ7CisgIGludCBmbGFnczsKKyAgY29uc3Qgd2NoYXJfdCogd2lkdGhfc3RhcnQ7CisgIGNvbnN0IHdjaGFyX3QqIHdpZHRoX2VuZDsKKyAgc2l6ZV90IHdpZHRoX2FyZ19pbmRleDsKKyAgY29uc3Qgd2NoYXJfdCogcHJlY2lzaW9uX3N0YXJ0OworICBjb25zdCB3Y2hhcl90KiBwcmVjaXNpb25fZW5kOworICBzaXplX3QgcHJlY2lzaW9uX2FyZ19pbmRleDsKKyAgd2NoYXJfdCBjb252ZXJzaW9uOyAvKiBkIGkgbyB1IHggWCBmIGUgRSBnIEcgYyBzIHAgbiBVICUgYnV0IG5vdCBDIFMgKi8KKyAgc2l6ZV90IGFyZ19pbmRleDsKK30KK3djaGFyX3RfZGlyZWN0aXZlOworCisvKiBBIHBhcnNlZCBmb3JtYXQgc3RyaW5nLiAgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIHNpemVfdCBjb3VudDsKKyAgd2NoYXJfdF9kaXJlY3RpdmUgKmRpcjsKKyAgc2l6ZV90IG1heF93aWR0aF9sZW5ndGg7CisgIHNpemVfdCBtYXhfcHJlY2lzaW9uX2xlbmd0aDsKK30KK3djaGFyX3RfZGlyZWN0aXZlczsKKworCisvKiBQYXJzZXMgdGhlIGZvcm1hdCBzdHJpbmcuICBGaWxscyBpbiB0aGUgbnVtYmVyIE4gb2YgZGlyZWN0aXZlcywgYW5kIGZpbGxzCisgICBpbiBkaXJlY3RpdmVzWzBdLCAuLi4sIGRpcmVjdGl2ZXNbTi0xXSwgYW5kIHNldHMgZGlyZWN0aXZlc1tOXS5kaXJfc3RhcnQKKyAgIHRvIHRoZSBlbmQgb2YgdGhlIGZvcm1hdCBzdHJpbmcuICBBbHNvIGZpbGxzIGluIHRoZSBhcmdfdHlwZSBmaWVsZHMgb2YgdGhlCisgICBhcmd1bWVudHMgYW5kIHRoZSBuZWVkZWQgY291bnQgb2YgYXJndW1lbnRzLiAgKi8KKyNpZmRlZiBTVEFUSUMKK1NUQVRJQworI2Vsc2UKK2V4dGVybgorI2VuZGlmCitpbnQgd3ByaW50Zl9wYXJzZSAoY29uc3Qgd2NoYXJfdCAqZm9ybWF0LCB3Y2hhcl90X2RpcmVjdGl2ZXMgKmQsIGFyZ3VtZW50cyAqYSk7CisKKyNlbmRpZiAvKiBfV1BSSU5URl9QQVJTRV9IICovCmRpZmYgLS1naXQgYS91bml4L2ludGwveHNpemUuaCBiL3VuaXgvaW50bC94c2l6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MmUyNGIKLS0tIC9kZXYvbnVsbAorKysgYi91bml4L2ludGwveHNpemUuaApAQCAtMCwwICsxLDEwOSBAQAorLyogeHNpemUuaCAtLSBDaGVja2VkIHNpemVfdCBjb21wdXRhdGlvbnMuCisKKyAgIENvcHlyaWdodCAoQykgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKKyAgIFVTQS4gICovCisKKyNpZm5kZWYgX1hTSVpFX0gKKyNkZWZpbmUgX1hTSVpFX0gKKworLyogR2V0IHNpemVfdC4gICovCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qIEdldCBTSVpFX01BWC4gICovCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaWYgSEFWRV9TVERJTlRfSAorIyBpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisvKiBUaGUgc2l6ZSBvZiBtZW1vcnkgb2JqZWN0cyBpcyBvZnRlbiBjb21wdXRlZCB0aHJvdWdoIGV4cHJlc3Npb25zIG9mCisgICB0eXBlIHNpemVfdC4gRXhhbXBsZToKKyAgICAgIHZvaWQqIHAgPSBtYWxsb2MgKGhlYWRlcl9zaXplICsgbiAqIGVsZW1lbnRfc2l6ZSkuCisgICBUaGVzZSBjb21wdXRhdGlvbnMgY2FuIGxlYWQgdG8gb3ZlcmZsb3cuICBXaGVuIHRoaXMgaGFwcGVucywgbWFsbG9jKCkKKyAgIHJldHVybnMgYSBwaWVjZSBvZiBtZW1vcnkgdGhhdCBpcyB3YXkgdG9vIHNtYWxsLCBhbmQgdGhlIHByb2dyYW0gdGhlbgorICAgY3Jhc2hlcyB3aGlsZSBhdHRlbXB0aW5nIHRvIGZpbGwgdGhlIG1lbW9yeS4KKyAgIFRvIGF2b2lkIHRoaXMsIHRoZSBmdW5jdGlvbnMgYW5kIG1hY3JvcyBpbiB0aGlzIGZpbGUgY2hlY2sgZm9yIG92ZXJmbG93LgorICAgVGhlIGNvbnZlbnRpb24gaXMgdGhhdCBTSVpFX01BWCByZXByZXNlbnRzIG92ZXJmbG93LgorICAgbWFsbG9jIChTSVpFX01BWCkgaXMgbm90IGd1YXJhbnRlZWQgdG8gZmFpbCAtLSB0aGluayBvZiBhIG1hbGxvYworICAgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIG1tYXAgLS0sIGl0J3MgcmVjb21tZW5kZWQgdG8gdXNlIHNpemVfb3ZlcmZsb3dfcCgpCisgICBvciBzaXplX2luX2JvdW5kc19wKCkgYmVmb3JlIGludm9raW5nIG1hbGxvYygpLgorICAgVGhlIGV4YW1wbGUgdGh1cyBiZWNvbWVzOgorICAgICAgc2l6ZV90IHNpemUgPSB4c3VtIChoZWFkZXJfc2l6ZSwgeHRpbWVzIChuLCBlbGVtZW50X3NpemUpKTsKKyAgICAgIHZvaWQgKnAgPSAoc2l6ZV9pbl9ib3VuZHNfcCAoc2l6ZSkgPyBtYWxsb2MgKHNpemUpIDogTlVMTCk7CisqLworCisvKiBDb252ZXJ0IGFuIGFyYml0cmFyeSB2YWx1ZSA+PSAwIHRvIHR5cGUgc2l6ZV90LiAgKi8KKyNkZWZpbmUgeGNhc3Rfc2l6ZV90KE4pIFwKKyAgKChOKSA8PSBTSVpFX01BWCA/IChzaXplX3QpIChOKSA6IFNJWkVfTUFYKQorCisvKiBTdW0gb2YgdHdvIHNpemVzLCB3aXRoIG92ZXJmbG93IGNoZWNrLiAgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90CisjaWYgX19HTlVDX18gPj0gMworX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSkKKyNlbmRpZgoreHN1bSAoc2l6ZV90IHNpemUxLCBzaXplX3Qgc2l6ZTIpCit7CisgIHNpemVfdCBzdW0gPSBzaXplMSArIHNpemUyOworICByZXR1cm4gKHN1bSA+PSBzaXplMSA/IHN1bSA6IFNJWkVfTUFYKTsKK30KKworLyogU3VtIG9mIHRocmVlIHNpemVzLCB3aXRoIG92ZXJmbG93IGNoZWNrLiAgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90CisjaWYgX19HTlVDX18gPj0gMworX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSkKKyNlbmRpZgoreHN1bTMgKHNpemVfdCBzaXplMSwgc2l6ZV90IHNpemUyLCBzaXplX3Qgc2l6ZTMpCit7CisgIHJldHVybiB4c3VtICh4c3VtIChzaXplMSwgc2l6ZTIpLCBzaXplMyk7Cit9CisKKy8qIFN1bSBvZiBmb3VyIHNpemVzLCB3aXRoIG92ZXJmbG93IGNoZWNrLiAgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90CisjaWYgX19HTlVDX18gPj0gMworX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSkKKyNlbmRpZgoreHN1bTQgKHNpemVfdCBzaXplMSwgc2l6ZV90IHNpemUyLCBzaXplX3Qgc2l6ZTMsIHNpemVfdCBzaXplNCkKK3sKKyAgcmV0dXJuIHhzdW0gKHhzdW0gKHhzdW0gKHNpemUxLCBzaXplMiksIHNpemUzKSwgc2l6ZTQpOworfQorCisvKiBNYXhpbXVtIG9mIHR3byBzaXplcywgd2l0aCBvdmVyZmxvdyBjaGVjay4gICovCitzdGF0aWMgaW5saW5lIHNpemVfdAorI2lmIF9fR05VQ19fID49IDMKK19fYXR0cmlidXRlX18gKChfX3B1cmVfXykpCisjZW5kaWYKK3htYXggKHNpemVfdCBzaXplMSwgc2l6ZV90IHNpemUyKQoreworICAvKiBObyBleHBsaWNpdCBjaGVjayBpcyBuZWVkZWQgaGVyZSwgYmVjYXVzZSBmb3IgYW55IG46CisgICAgIG1heCAoU0laRV9NQVgsIG4pID09IFNJWkVfTUFYIGFuZCBtYXggKG4sIFNJWkVfTUFYKSA9PSBTSVpFX01BWC4gICovCisgIHJldHVybiAoc2l6ZTEgPj0gc2l6ZTIgPyBzaXplMSA6IHNpemUyKTsKK30KKworLyogTXVsdGlwbGljYXRpb24gb2YgYSBjb3VudCB3aXRoIGFuIGVsZW1lbnQgc2l6ZSwgd2l0aCBvdmVyZmxvdyBjaGVjay4KKyAgIFRoZSBjb3VudCBtdXN0IGJlID49IDAgYW5kIHRoZSBlbGVtZW50IHNpemUgbXVzdCBiZSA+IDAuCisgICBUaGlzIGlzIGEgbWFjcm8sIG5vdCBhbiBpbmxpbmUgZnVuY3Rpb24sIHNvIHRoYXQgaXQgd29ya3MgY29ycmVjdGx5IGV2ZW4KKyAgIHdoZW4gTiBpcyBvZiBhIHdpZGVyIHR1cGUgYW5kIE4gPiBTSVpFX01BWC4gICovCisjZGVmaW5lIHh0aW1lcyhOLCBFTFNJWkUpIFwKKyAgKChOKSA8PSBTSVpFX01BWCAvIChFTFNJWkUpID8gKHNpemVfdCkgKE4pICogKEVMU0laRSkgOiBTSVpFX01BWCkKKworLyogQ2hlY2sgZm9yIG92ZXJmbG93LiAgKi8KKyNkZWZpbmUgc2l6ZV9vdmVyZmxvd19wKFNJWkUpIFwKKyAgKChTSVpFKSA9PSBTSVpFX01BWCkKKy8qIENoZWNrIGFnYWluc3Qgb3ZlcmZsb3cuICAqLworI2RlZmluZSBzaXplX2luX2JvdW5kc19wKFNJWkUpIFwKKyAgKChTSVpFKSAhPSBTSVpFX01BWCkKKworI2VuZGlmIC8qIF9YU0laRV9IICovCg==