ZGlmZiAtLWdpdCBhL2F1dG8vc291cmNlcyBiL2F1dG8vc291cmNlcwppbmRleCBiZDkyNTlhLi5jNGFlYzcwIDEwMDY0NAotLS0gYS9hdXRvL3NvdXJjZXMKKysrIGIvYXV0by9zb3VyY2VzCkBAIC0yNjIsNyArMjYyLDcgQEAKICAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfc2NyaXB0LmggXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5oIFwKICAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfYnVzeV9sb2NrLmggXAotICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9sb2dfbW9kdWxlLmgiCisgICAgICAgICAgIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfbG9nX21vZHVsZS5oIgogCiBIVFRQX1NSQ1M9InNyYy9odHRwL25neF9odHRwLmMgXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5jIFwKQEAgLTI3Miw3ICsyNzIsNyBAQAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9oZWFkZXJfZmlsdGVyX21vZHVsZS5jIFwKICAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfd3JpdGVfZmlsdGVyX21vZHVsZS5jIFwKICAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfY29weV9maWx0ZXJfbW9kdWxlLmMgXAotICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9sb2dfbW9kdWxlLmMgXAorICAgICAgICAgICBzcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2xvZ19tb2R1bGUuYyBcCiAgICAgICAgICAgIHNyYy9odHRwL25neF9odHRwX3JlcXVlc3RfYm9keS5jIFwKICAgICAgICAgICAgc3JjL2h0dHAvbmd4X2h0dHBfdmFyaWFibGVzLmMgXAogICAgICAgICAgICBzcmMvaHR0cC9uZ3hfaHR0cF9zY3JpcHQuYyBcCmRpZmYgLS1naXQgYS9hdXRvL3RocmVhZHMgYi9hdXRvL3RocmVhZHMKaW5kZXggZDcyNjE0Yi4uMmJmODViNiAxMDA2NDQKLS0tIGEvYXV0by90aHJlYWRzCisrKyBiL2F1dG8vdGhyZWFkcwpAQCAtNTAsNyArNTAsNyBAQAogICAgICAgICAgICAgICAgIENPUkVfTElCUz0iJENPUkVfTElCUyAtcHRocmVhZCIKICAgICAgICAgICAgIDs7CiAKLSAgICAgICAgICAgIEZyZWVCU0Q6NSopCisgICAgICAgICAgICBGcmVlQlNEOls1NjddKikKICAgICAgICAgICAgICAgICBoYXZlPU5HWF9USFJFQURTIC4gYXV0by9oYXZlCiAgICAgICAgICAgICAgICAgQ09SRV9TUkNTPSIkQ09SRV9TUkNTICRQVEhSRUFEX1NSQ1MiCiAgICAgICAgICAgICAgICAgQ09SRV9MSUJTPSIkQ09SRV9MSUJTIC1sY19yIgpkaWZmIC0tZ2l0IGEvY29uZi9uZ2lueC5jb25mIGIvY29uZi9uZ2lueC5jb25mCmluZGV4IDU0MmZkYTIuLjhkNjU0NDUgMTAwNjQ0Ci0tLSBhL2NvbmYvbmdpbnguY29uZgorKysgYi9jb25mL25naW54LmNvbmYKQEAgLTM0LDYgKzM0LDEyIEBACiAgICAgICAgICAgICBpbmRleCAgaW5kZXguaHRtbCBpbmRleC5odG07CiAgICAgICAgIH0KIAorICAgICAgICAjIHByb3h5IHRoZSBQSFAgc2NyaXB0cyB0byBBcGFjaGUgbGlzdGVuaW5nIG9uIDEyNy4wLjAuMTo4MAorICAgICAgICAjCisgICAgICAgICNsb2NhdGlvbiB+IFwucGhwJCB7CisgICAgICAgICMgICAgcHJveHlfcGFzcyAgIGh0dHA6Ly8xMjcuMC4wLjE7CisgICAgICAgICN9CisKICAgICAgICAgIyBkZW55IGFjY2VzcyB0byAuaHRhY2Nlc3MgZmlsZXMKICAgICAgICAgIwogICAgICAgICAjbG9jYXRpb24gfiAvXC5odCB7CmRpZmYgLS1naXQgYS9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbCBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCmluZGV4IDhmMGFiZDYuLjk5MTM0ZWYgMTAwNjQ0Ci0tLSBhL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCisrKyBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCkBAIC05LDYgKzksNTIgQEAKIDx0aXRsZSBsYW5nPSJlbiI+bmdpbnggY2hhbmdlbG9nPC90aXRsZT4KIAogCis8Y2hhbmdlcyB2ZXI9IjAuMy42IiBkYXRlPSIyNC4xMC4yMDA1Ij4KKworPGNoYW5nZSB0eXBlPSJjaGFuZ2UiPgorPHBhcmEgbGFuZz0icnUiPgorSU1BUC9QT1AzINDSz8vTySDUxdDF0tggzsUg0MXSxcTBo9Qg08XS18XS1SDB19TP0snawcPJySDQ1dPUz8ogzM/Hyc4uCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Citub3cgdGhlIElNQVAvUE9QMyBwcm94eSBkbyBub3Qgc2VuZCB0aGUgZW1wdHkgbG9naW4gdG8gYXV0aG9yaXphdGlvbiBzZXJ2ZXIuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK8TJ0sXL1MnXwSBsb2dfZm9ybWF0INDPxMTF0tbJ18HF1CDQxdLFzcXOztnFINcg18nExSAkbmFtZS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAibG9nX2Zvcm1hdCIgc3VwcG9ydHMgdGhlIHZhcmlhYmxlcyBpbiB0aGUgJG5hbWUgZm9ybS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CivF08zJIMjP1NEgwtkg1yDPxM7PzSDTxdLXxdLFIM7FIMLZzM8gz9DJ08HOzyDOySDPxM7PyiDEydLFy9TJ19kgbGlzdGVuLCDUzworbmdpbnggzsUg08zV28HMIM7BIDgwINDP0tTVOworz9vJwsvBINDP0dfJzMHT2CDXIDAuMy4zLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgoraWYgYXQgbGVhc3QgaW4gb25lIHNlcnZlciB3YXMgbm8gdGhlICJsaXN0ZW4iIGRpcmVjdGl2ZSwgdGhlbiBuZ2lueCBkaWQgbm90CitsaXN0ZW4gb24gdGhlIDgwIHBvcnQ7CitidWcgYXBwZWFyZWQgaW4gMC4zLjMuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgorxdPMySDXIMTJ0sXL1MnXxSBwcm94eV9wYXNzIM/U09XU09TXz9fBzCBVUkksINTPINfTxcfEwSDJ09DPzNjaz9fBzNPRINDP0tQgODAuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+CitpZiB0aGUgVVJJIHBhcnQgaXMgb21pdHRlZCBpbiAicHJveHlfcGFzcyIgZGlyZWN0aXZlLCB0aGUgdGhlIDgwIHBvcnQgd2FzCithbHdheXMgdXNlZC4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8L2NoYW5nZXM+CisKKwogPGNoYW5nZXMgdmVyPSIwLjMuNSIgZGF0ZT0iMjEuMTAuMjAwNSI+CiAKIDxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KQEAgLTQ0OSw3ICs0OTUsNyBAQAogCiA8Y2hhbmdlIHR5cGU9ImZlYXR1cmUiPgogPHBhcmEgbGFuZz0icnUiPgoty8/Nwc7EwSBjb25maWcgZXJybXNnINcgzc/E1czFIG5neF9odHRwX3Nzc2lfbW9kdWxlLgory8/Nwc7EwSBjb25maWcgZXJybXNnINcgzc/E1czFIG5neF9odHRwX3NzaV9tb2R1bGUuCiA8L3BhcmE+CiA8cGFyYSBsYW5nPSJlbiI+CiB0aGUgImNvbmZpZyBlcnJtc2ciIGNvbW1hbmQgb2YgdGhlIG5neF9odHRwX3NzaV9tb2R1bGUuCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ2lueC5oIGIvc3JjL2NvcmUvbmdpbnguaAppbmRleCA4NzljMjVmLi41YTM1OTNkIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ2lueC5oCisrKyBiL3NyYy9jb3JlL25naW54LmgKQEAgLTgsNyArOCw3IEBACiAjZGVmaW5lIF9OR0lOWF9IX0lOQ0xVREVEXwogCiAKLSNkZWZpbmUgTkdJTlhfVkVSICAgICAgICAgICJuZ2lueC8wLjMuNSIKKyNkZWZpbmUgTkdJTlhfVkVSICAgICAgICAgICJuZ2lueC8wLjMuNiIKIAogI2RlZmluZSBOR0lOWF9WQVIgICAgICAgICAgIk5HSU5YIgogI2RlZmluZSBOR1hfT0xEUElEX0VYVCAgICAgIi5vbGRiaW4iCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfY29ubmVjdGlvbi5jIGIvc3JjL2NvcmUvbmd4X2Nvbm5lY3Rpb24uYwppbmRleCA5NGY4MTZiLi4yZTM0NjY5IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfY29ubmVjdGlvbi5jCisrKyBiL3NyYy9jb3JlL25neF9jb25uZWN0aW9uLmMKQEAgLTM2Nyw5ICszNjcsOCBAQAogICAgICAgICAgICAgICAgID09IC0xKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgY3ljbGUtPmxvZywgbmd4X3NvY2tldF9lcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRzb2Nrb3B0KFNPX1JDVkJVRikgJVYgZmFpbGVkLCBpZ25vcmVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsc1tpXS5hZGRyX3RleHQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRzb2Nrb3B0KFNPX1JDVkJVRiwgJWQpICVWIGZhaWxlZCwgaWdub3JlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc1tpXS5yY3ZidWYsICZsc1tpXS5hZGRyX3RleHQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTM3OSw5ICszNzgsOCBAQAogICAgICAgICAgICAgICAgID09IC0xKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgY3ljbGUtPmxvZywgbmd4X3NvY2tldF9lcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRzb2Nrb3B0KFNPX1NOREJVRikgJVYgZmFpbGVkLCBpZ25vcmVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsc1tpXS5hZGRyX3RleHQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRzb2Nrb3B0KFNPX1NOREJVRiwgJWQpICVWIGZhaWxlZCwgaWdub3JlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc1tpXS5zbmRidWYsICZsc1tpXS5hZGRyX3RleHQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9pbmV0LmMgYi9zcmMvY29yZS9uZ3hfaW5ldC5jCmluZGV4IDYwYTQwZWMuLjRiZTU1ZmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9pbmV0LmMKKysrIGIvc3JjL2NvcmUvbmd4X2luZXQuYwpAQCAtNDUyLDcgKzQ1MiwyMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHUtPnBvcnRfdGV4dC5kYXRhID09IE5VTEwpIHsKKyAgICBpZiAodS0+cG9ydF90ZXh0LmRhdGEpIHsKKworICAgICAgICBpZiAodS0+cG9ydF90ZXh0LmxlbiA9PSAwKSB7CisgICAgICAgICAgICB1LT5wb3J0X3RleHQubGVuID0gJnVybC0+ZGF0YVtpXSAtIHUtPnBvcnRfdGV4dC5kYXRhOworCisgICAgICAgICAgICBpZiAodS0+cG9ydF90ZXh0LmxlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkIHBvcnQiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcG9ydCA9IG5neF9hdG9pKHUtPnBvcnRfdGV4dC5kYXRhLCB1LT5wb3J0X3RleHQubGVuKTsKKworICAgICAgICBpZiAocG9ydCA9PSBOR1hfRVJST1IgfHwgcG9ydCA8IDEgfHwgcG9ydCA+IDY1NTM2KSB7CisgICAgICAgICAgICByZXR1cm4gImludmFsaWQgcG9ydCI7CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CiAgICAgICAgIHBvcnQgPSBuZ3hfYXRvaSh1cmwtPmRhdGEsIHVybC0+bGVuKTsKIAogICAgICAgICBpZiAocG9ydCA9PSBOR1hfRVJST1IpIHsKQEAgLTQ2NCwxOCArNDgwLDYgQEAKIAogICAgICAgICB1LT5wb3J0X3RleHQgPSAqdXJsOwogICAgICAgICB1LT53aWxkY2FyZCA9IDE7Ci0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAodS0+cG9ydF90ZXh0LmxlbiA9PSAwKSB7Ci0gICAgICAgICAgICB1LT5kZWZhdWx0X3BvcnQgPSAxOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBwb3J0ID0gbmd4X2F0b2kodS0+cG9ydF90ZXh0LmRhdGEsIHUtPnBvcnRfdGV4dC5sZW4pOwotCi0gICAgICAgIGlmIChwb3J0ID09IE5HWF9FUlJPUiB8fCBwb3J0IDwgMSB8fCBwb3J0ID4gNjU1MzYpIHsKLSAgICAgICAgICAgIHJldHVybiAiaW52YWxpZCBwb3J0IjsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHUtPnBvcnQgPSAoaW5fcG9ydF90KSBwb3J0OwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X291dHB1dF9jaGFpbi5jIGIvc3JjL2NvcmUvbmd4X291dHB1dF9jaGFpbi5jCmluZGV4IDFlNzIyOTEuLjAzZDk1NmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9vdXRwdXRfY2hhaW4uYworKysgYi9zcmMvY29yZS9uZ3hfb3V0cHV0X2NoYWluLmMKQEAgLTIxMiwxMiArMjEyLDEyIEBACiAKICAgICAgICAgbGFzdCA9IGN0eC0+b3V0cHV0X2ZpbHRlcihjdHgtPmZpbHRlcl9jdHgsIG91dCk7CiAKLSAgICAgICAgbmd4X2NoYWluX3VwZGF0ZV9jaGFpbnMoJmN0eC0+ZnJlZSwgJmN0eC0+YnVzeSwgJm91dCwgY3R4LT50YWcpOwotICAgICAgICBsYXN0X291dCA9ICZvdXQ7Ci0KLSAgICAgICAgaWYgKGxhc3QgPT0gTkdYX0VSUk9SKSB7CisgICAgICAgIGlmIChsYXN0ID09IE5HWF9FUlJPUiB8fCBsYXN0ID09IE5HWF9ET05FKSB7CiAgICAgICAgICAgICByZXR1cm4gbGFzdDsKICAgICAgICAgfQorCisgICAgICAgIG5neF9jaGFpbl91cGRhdGVfY2hhaW5zKCZjdHgtPmZyZWUsICZjdHgtPmJ1c3ksICZvdXQsIGN0eC0+dGFnKTsKKyAgICAgICAgbGFzdF9vdXQgPSAmb3V0OwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfbG9nX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9sb2dfbW9kdWxlLmMKc2ltaWxhcml0eSBpbmRleCA5MCUKcmVuYW1lIGZyb20gc3JjL2h0dHAvbmd4X2h0dHBfbG9nX21vZHVsZS5jCnJlbmFtZSB0byBzcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2xvZ19tb2R1bGUuYwppbmRleCA2MTdkNDZhLi42ZTc3NzJlIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9sb2dfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9sb2dfbW9kdWxlLmMKQEAgLTgzLDYgKzgzLDcgQEAKICAgICB2b2lkICpjb25mKTsKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9sb2dfc2V0X2Zvcm1hdChuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAogICAgIHZvaWQgKmNvbmYpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9sb2dfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpOwogCiAKIHN0YXRpYyBuZ3hfY29tbWFuZF90ICBuZ3hfaHR0cF9sb2dfY29tbWFuZHNbXSA9IHsKQEAgLTEyNiw3ICsxMjcsNyBAQAogICAgIG5neF9odHRwX2xvZ19jb21tYW5kcywgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0hUVFBfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1hc3RlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbW9kdWxlICovCisgICAgbmd4X2h0dHBfbG9nX2luaXQsICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtb2R1bGUgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IHByb2Nlc3MgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IHRocmVhZCAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4aXQgdGhyZWFkICovCkBAIC0xNDAsOCArMTQxLDE0IEBACiAKIAogc3RhdGljIG5neF9zdHJfdCBuZ3hfaHR0cF9jb21iaW5lZF9mbXQgPQotICAgIG5neF9zdHJpbmcoIiVhZGRyIC0gLSBbJXRpbWVdIFwiJXJlcXVlc3RcIiAlc3RhdHVzICVhcGFjaGVfbGVuZ3RoICIKLSAgICAgICAgICAgICAgICJcIiV7UmVmZXJlcn1pXCIgXCIle1VzZXItQWdlbnR9aVwiIik7CisjaWYgMAorICAgIG5neF9zdHJpbmcoIiRyZW1vdGVfYWRkciAtICRyZW1vdGVfdXNlciBbJXRpbWVdICIKKyAgICAgICAgICAgICAgICJcIiRyZXF1ZXN0XCIgJXN0YXR1cyAlYXBhY2hlX2xlbmd0aCAiCisgICAgICAgICAgICAgICAiXCIkaHR0cF9yZWZlcmVyXCIgXCIkaHR0cF91c2VyX2FnZW50XCIiKTsKKyNlbmRpZgorICAgIG5neF9zdHJpbmcoIiVhZGRyIC0gLSBbJXRpbWVdICIKKyAgICAgICAgICAgICAgICJcIiVyZXF1ZXN0XCIgJXN0YXR1cyAlYXBhY2hlX2xlbmd0aCAiCisgICAgICAgICAgICAgICAiXCIle3JlZmVyZXJ9aVwiIFwiJXt1c2VyLWFnZW50fWlcIiIpOwogCiAKIG5neF9odHRwX2xvZ19vcF9uYW1lX3Qgbmd4X2h0dHBfbG9nX2ZtdF9vcHNbXSA9IHsKQEAgLTgyNCw3ICs4MzEsNyBAQAogICAgIH0KIAogICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmY29uZi0+Zm9ybWF0cywgY2YtPnBvb2wsIDQsIHNpemVvZihuZ3hfaHR0cF9sb2dfZm10X3QpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTkdYX0VSUk9SKQorICAgICAgICA9PSBOR1hfRVJST1IpCiAgICAgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQpAQCAtODM2LDYgKzg0Myw5IEBACiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKKyAgICB2YWx1ZS0+bGVuID0gMDsKKyAgICB2YWx1ZS0+ZGF0YSA9IE5VTEw7CisKICAgICB2YWx1ZSA9IG5neF9hcnJheV9wdXNoKGNmLT5hcmdzKTsKICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CkBAIC04NTMsNyArODYzLDcgQEAKIAogICAgIHJjID0gbmd4X2h0dHBfbG9nX3NldF9mb3JtYXQoY2YsIE5VTEwsIGNvbmYpOwogICAgIGlmIChyYyAhPSBOR1hfQ09ORl9PSykgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAogICAgIHJldHVybiBjb25mOwpAQCAtOTkzLDEwICsxMDAzLDEwIEBACiB7CiAgICAgbmd4X2h0dHBfbG9nX21haW5fY29uZl90ICpsbWNmID0gY29uZjsKIAotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBzLCBmLCBpbnZhbGlkOwotICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICpkYXRhLCAqcCwgKmZuYW1lOworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICpkYXRhLCAqcCwgKmZuYW1lLCBjaDsKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgaSwgbGVuLCBmbmFtZV9sZW47Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgKnZhbHVlLCBhcmcsICphOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICp2YWx1ZSwgdmFyLCBhcmcsICphOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBzLCBmLCBicmFja2V0OwogICAgIG5neF9odHRwX2xvZ19vcF90ICAgICAgICAgICpvcDsKICAgICBuZ3hfaHR0cF9sb2dfZm10X3QgICAgICAgICAqZm10OwogICAgIG5neF9odHRwX2xvZ19vcF9uYW1lX3QgICAgICpuYW1lOwpAQCAtMTAyNCwxMSArMTAzNCw5IEBACiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKLSAgICBpbnZhbGlkID0gMDsKLSAgICBkYXRhID0gTlVMTDsKICAgICBhcmcuZGF0YSA9IE5VTEw7CiAKLSAgICBmb3IgKHMgPSAyOyBzIDwgY2YtPmFyZ3MtPm5lbHRzICYmICFpbnZhbGlkOyBzKyspIHsKKyAgICBmb3IgKHMgPSAyOyBzIDwgY2YtPmFyZ3MtPm5lbHRzOyBzKyspIHsKIAogICAgICAgICBpID0gMDsKIApAQCAtMTA0NSw4ICsxMDUzLDcgQEAKICAgICAgICAgICAgICAgICBpKys7CiAKICAgICAgICAgICAgICAgICBpZiAoaSA9PSB2YWx1ZVtzXS5sZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBnb3RvIGludmFsaWQ7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHZhbHVlW3NdLmRhdGFbaV0gPT0gJ3snKSB7CkBAIC0xMDYxLDggKzEwNjgsNyBAQAogICAgICAgICAgICAgICAgICAgICBhcmcubGVuID0gJnZhbHVlW3NdLmRhdGFbaV0gLSBhcmcuZGF0YTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSB2YWx1ZVtzXS5sZW4gfHwgYXJnLmxlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpbnZhbGlkOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaSsrOwpAQCAtMTA4Myw4ICsxMDg5LDcgQEAKICAgICAgICAgICAgICAgICBmbmFtZV9sZW4gPSAmdmFsdWVbc10uZGF0YVtpXSAtIGZuYW1lOwogCiAgICAgICAgICAgICAgICAgaWYgKGZuYW1lX2xlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWQgPSAxOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZ290byBpbnZhbGlkOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZvciAobmFtZSA9IG5neF9odHRwX2xvZ19mbXRfb3BzOyBuYW1lLT5ydW47IG5hbWUrKykgewpAQCAtMTEzNSwxNCArMTE0MCw3MSBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChuYW1lLT5uYW1lLmxlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWQgPSAxOworICAgICAgICAgICAgICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlW3NdLmRhdGFbaV0gPT0gJyQnKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoKytpID09IHZhbHVlW3NdLmxlbikgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlW3NdLmRhdGFbaV0gPT0gJ3snKSB7CisgICAgICAgICAgICAgICAgICAgIGJyYWNrZXQgPSAxOworCisgICAgICAgICAgICAgICAgICAgIGlmICgrK2kgPT0gdmFsdWVbc10ubGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2YXIuZGF0YSA9ICZ2YWx1ZVtzXS5kYXRhW2ldOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJhY2tldCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHZhci5kYXRhID0gJnZhbHVlW3NdLmRhdGFbaV07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yICh2YXIubGVuID0gMDsgaSA8IHZhbHVlW3NdLmxlbjsgaSsrLCB2YXIubGVuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2ggPSB2YWx1ZVtzXS5kYXRhW2ldOworCisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnfScgJiYgYnJhY2tldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgYnJhY2tldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICgoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBjaCA9PSAnXycpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgaWYgKGJyYWNrZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBjbG9zaW5nIGJyYWNrZXQgaW4gXCIlVlwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZSBpcyBtaXNzaW5nIiwgJnZhcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodmFyLmxlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobmd4X2h0dHBfbG9nX3ZhcmlhYmxlX2NvbXBpbGUoY2YsIG9wLCAmdmFyKSAhPSBOR1hfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpKys7CiAKLSAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IHZhbHVlW3NdLmxlbiAmJiB2YWx1ZVtzXS5kYXRhW2ldICE9ICclJykgeworICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgdmFsdWVbc10ubGVuCisgICAgICAgICAgICAgICAgICAgICAgICYmIHZhbHVlW3NdLmRhdGFbaV0gIT0gJyQnCisgICAgICAgICAgICAgICAgICAgICAgICYmIHZhbHVlW3NdLmRhdGFbaV0gIT0gJyUnKQorICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMTE3OCwxMSArMTI0MCwyNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGludmFsaWQpIHsKLSAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcGFyYW1ldGVyIFwiJXNcIiIsIGRhdGEpOwotICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgfQotCiAgICAgcmV0dXJuIE5HWF9DT05GX09LOworCitpbnZhbGlkOgorCisgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLCAiaW52YWxpZCBwYXJhbWV0ZXIgXCIlc1wiIiwgZGF0YSk7CisKKyAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Cit9CisKKworc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfbG9nX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKQoreworICAgIG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgICpjbWNmOworCisgICAgY21jZiA9IG5neF9odHRwX2N5Y2xlX2dldF9tb2R1bGVfbWFpbl9jb25mKGN5Y2xlLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CisKKyAgICBjbWNmLT5sb2dfaGFuZGxlciA9IG5neF9odHRwX2xvZ19oYW5kbGVyOworCisgICAgcmV0dXJuIE5HWF9PSzsKIH0KZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2xvZ19tb2R1bGUuaCBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfbG9nX21vZHVsZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvaHR0cC9uZ3hfaHR0cF9sb2dfbW9kdWxlLmgKcmVuYW1lIHRvIHNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfbG9nX21vZHVsZS5oCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLmMKaW5kZXggYWY4MmIwZS4uODBkZTY5MSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUuYwpAQCAtMjI5LDkgKzIyOSw4IEBACiB9OwogCiAKLXN0YXRpYyBuZ3hfaW50X3QgKCpuZ3hfaHR0cF9uZXh0X2hlYWRlcl9maWx0ZXIpIChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwotc3RhdGljIG5neF9pbnRfdCAoKm5neF9odHRwX25leHRfYm9keV9maWx0ZXIpIChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgbmd4X2NoYWluX3QgKmluKTsKK3N0YXRpYyBuZ3hfaHR0cF9vdXRwdXRfaGVhZGVyX2ZpbHRlcl9wdCAgbmd4X2h0dHBfbmV4dF9oZWFkZXJfZmlsdGVyOworc3RhdGljIG5neF9odHRwX291dHB1dF9ib2R5X2ZpbHRlcl9wdCAgICBuZ3hfaHR0cF9uZXh0X2JvZHlfZmlsdGVyOwogCiAKIHN0YXRpYyB1X2NoYXIgbmd4X2h0dHBfc3NpX3N0cmluZ1tdID0gIjwhLS0iOwpAQCAtNDA3LDYgKzQwNiw3IEBACiAgICAgbmd4X2J1Zl90ICAgICAgICAgICAgICAgKmI7CiAgICAgbmd4X2NoYWluX3QgICAgICAgICAgICAgKmNsOwogICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICpwYXJhbTsKKyAgICBuZ3hfY29ubmVjdGlvbl90ICAgICAgICAqYzsKICAgICBuZ3hfaHR0cF9zc2lfY3R4X3QgICAgICAqY3R4OwogICAgIG5neF9odHRwX3NzaV9jb25mX3QgICAgICpjb25mOwogICAgIG5neF9odHRwX3NzaV9wYXJhbV90ICAgICpwcm07CkBAIC02NTAsNyArNjUwLDE1IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoY21kLT5oYW5kbGVyKHIsIGN0eCwgcGFyYW1zKSA9PSBOR1hfT0spIHsKKyAgICAgICAgICAgICAgICBjID0gci0+Y29ubmVjdGlvbjsKKworICAgICAgICAgICAgICAgIHJjID0gY21kLT5oYW5kbGVyKHIsIGN0eCwgcGFyYW1zKTsKKworICAgICAgICAgICAgICAgIGlmIChjLT5jbG9zZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9ET05FOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyYyA9PSBOR1hfT0spIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfY29weV9maWx0ZXJfbW9kdWxlLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3B5X2ZpbHRlcl9tb2R1bGUuYwppbmRleCAyYWZkY2Y2Li5jMjUxMjczIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9jb3B5X2ZpbHRlcl9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3B5X2ZpbHRlcl9tb2R1bGUuYwpAQCAtNzAsMjEgKzcwLDEyIEBACiBzdGF0aWMgbmd4X2ludF90CiBuZ3hfaHR0cF9jb3B5X2ZpbHRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9jaGFpbl90ICppbikKIHsKLSAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgICByYzsKICAgICBuZ3hfb3V0cHV0X2NoYWluX2N0eF90ICAgICAgICpjdHg7CiAgICAgbmd4X2h0dHBfY29weV9maWx0ZXJfY29uZl90ICAqY29uZjsKIAogICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICJjb3B5IGZpbHRlcjogXCIlVlwiIiwgJnItPnVyaSk7CiAKLSAgICBpZiAoci0+Y29ubmVjdGlvbi0+Y2xvc2VkKSB7Ci0gICAgICAgIHJjID0gbmd4X2h0dHBfbmV4dF9maWx0ZXIociwgaW4pOwotCi0gICAgICAgIG5neF9sb2dfZGVidWcyKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAiY29weSBjbG9zZWQgZmlsdGVyOiAlaSBcIiVWXCIiLCByYywgJnItPnVyaSk7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0KICAgICBjdHggPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2N0eChyLCBuZ3hfaHR0cF9jb3B5X2ZpbHRlcl9tb2R1bGUpOwogCiAgICAgaWYgKGN0eCA9PSBOVUxMKSB7CkBAIC0xMTEsMTIgKzEwMiw5IEBACiAKICAgICB9CiAKLSAgICByYyA9IG5neF9vdXRwdXRfY2hhaW4oY3R4LCBpbik7CisgICAgLyogdGhlIHJlcXVlc3QgcG9vbCBtYXkgYmUgYWxyZWFkeSBkZXN0cm95ZWQgYWZ0ZXIgbmd4X291dHB1dF9jaGFpbigpKi8KIAotICAgIG5neF9sb2dfZGVidWcyKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJjb3B5IGZpbHRlcjogJWkgXCIlVlwiIiwgcmMsICZyLT51cmkpOwotCi0gICAgcmV0dXJuIHJjOworICAgIHJldHVybiBuZ3hfb3V0cHV0X2NoYWluKGN0eCwgaW4pOwogfQogCiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5jCmluZGV4IDIxMjI0ZDMuLmExMmExMzQgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuYwpAQCAtMTE3Miw4ICsxMTcyLDcgQEAKIAogICAgIG5neF9odHRwX2hhbmRsZXIoc3IpOwogCi0gICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgImh0dHAgc3VicmVxdWVzdCBcIiVWXCIgZG9uZSIsIHVyaSk7CisgICAgLyogdGhlIHJlcXVlc3QgcG9vbCBtYXkgYmUgYWxyZWFkeSBkZXN0cm95ZWQgKi8KIAogICAgIHJldHVybiBOR1hfT0s7CiB9CkBAIC0xMjMxLDI3ICsxMjMwLDM4IEBACiB9CiAKIAotI2lmIDAgICAgICAgLyogU1RVQjogdGVzdCB0aGUgZGVsYXkgaHR0cCBoYW5kbGVyICovCi0KLW5neF9pbnRfdAotbmd4X2h0dHBfZGVsYXlfaGFuZGxlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCituZ3hfaHR0cF9jbGVhbnVwX3QgKgorbmd4X2h0dHBfY2xlYW51cF9hZGQobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBzdGF0aWMgaW50ICBvbjsKKyAgICBuZ3hfaHR0cF9jbGVhbnVwX3QgICpjbG47CiAKLSAgICBpZiAob24rKyA9PSAwKSB7Ci0gICAgICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBzZXQgZGVsYXkiKTsKLSAgICAgICAgbmd4X2FkZF90aW1lcihyLT5jb25uZWN0aW9uLT53cml0ZSwgMTAwMDApOwotICAgICAgICByZXR1cm4gTkdYX0FHQUlOOworICAgIHIgPSByLT5tYWluOworCisgICAgY2xuID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfY2xlYW51cF90KSk7CisgICAgaWYgKGNsbiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHItPmNvbm5lY3Rpb24tPndyaXRlLT50aW1lZG91dCA9IDA7Ci0gICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgImh0dHAgcmVzZXQgZGVsYXkiKTsKLSAgICByZXR1cm4gTkdYX0RFQ0xJTkVEOwotfQorICAgIGlmIChzaXplKSB7CisgICAgICAgIGNsbi0+ZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZSk7CisgICAgICAgIGlmIChjbG4tPmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgY2xuLT5kYXRhID0gTlVMTDsKKyAgICB9CisKKyAgICBjbG4tPmhhbmRsZXIgPSBOVUxMOworICAgIGNsbi0+bmV4dCA9IHItPmNsZWFudXA7CisKKyAgICByLT5jbGVhbnVwID0gY2xuOworCisgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgY2xlYW51cCBhZGQ6ICVwIiwgY2xuKTsKKworICAgIHJldHVybiBjbG47Cit9CiAKIAogc3RhdGljIGNoYXIgKgpAQCAtMTY2NSw3ICsxNjc1LDggQEAKICAgICB9CiAKICAgICBpZiAobmd4X2FycmF5X2luaXQoJmNtY2YtPnNlcnZlcnMsIGNmLT5wb29sLCA0LAotICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfY29yZV9zcnZfY29uZl90ICopKSA9PSBOR1hfRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9jb3JlX3Nydl9jb25mX3QgKikpCisgICAgICAgID09IE5HWF9FUlJPUikKICAgICB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CkBAIC0xNzY3LDYgKzE3NzgsMTAgQEAKICAgICAgICAgbHMtPnBvcnQgPSAoZ2V0dWlkKCkgPT0gMCkgPyA4MCA6IDgwMDA7CiAjZW5kaWYKICAgICAgICAgbHMtPmZhbWlseSA9IEFGX0lORVQ7CisKKyAgICAgICAgbHMtPmNvbmYuYmFja2xvZyA9IC0xOworICAgICAgICBscy0+Y29uZi5yY3ZidWYgPSAtMTsKKyAgICAgICAgbHMtPmNvbmYuc25kYnVmID0gLTE7CiAgICAgfQogCiAgICAgaWYgKGNvbmYtPnNlcnZlcl9uYW1lcy5uZWx0cyA9PSAwKSB7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5oIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuaAppbmRleCBjZjQxNWVmLi41OTg5NjU1IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5oCisrKyBiL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmgKQEAgLTY1LDcgKzY1LDcgQEAKICAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICBzZXJ2ZXJzOyAgICAgICAgIC8qIG5neF9odHRwX2NvcmVfc3J2X2NvbmZfdCAqLwogCiAgICAgbmd4X2h0dHBfcGhhc2VfdCAgICAgICAgICAgcGhhc2VzW05HWF9IVFRQX0xBU1RfUEhBU0VdOwotICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgIGluZGV4X2hhbmRsZXJzOworICAgIG5neF9odHRwX2hhbmRsZXJfcHQgICAgICAgIGxvZ19oYW5kbGVyOwogCiAgICAgbmd4X2hhc2hfdCAgICAgICAgICAgICAgICAgaGVhZGVyc19pbl9oYXNoOwogICAgIG5neF9oYXNoX3QgICAgICAgICAgICAgICAgIHZhcmlhYmxlc19oYXNoOwpAQCAtMjY0LDYgKzI2NCw4IEBACiBuZ3hfaW50X3Qgbmd4X2h0dHBfaW50ZXJuYWxfcmVkaXJlY3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLAogICAgIG5neF9zdHJfdCAqdXJpLCBuZ3hfc3RyX3QgKmFyZ3MpOwogCituZ3hfaHR0cF9jbGVhbnVwX3QgKm5neF9odHRwX2NsZWFudXBfYWRkKG5neF9odHRwX3JlcXVlc3RfdCAqciwgc2l6ZV90IHNpemUpOworCiAKIHR5cGVkZWYgbmd4X2ludF90ICgqbmd4X2h0dHBfb3V0cHV0X2hlYWRlcl9maWx0ZXJfcHQpKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CiB0eXBlZGVmIG5neF9pbnRfdCAoKm5neF9odHRwX291dHB1dF9ib2R5X2ZpbHRlcl9wdCkKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2hlYWRlcl9maWx0ZXJfbW9kdWxlLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9oZWFkZXJfZmlsdGVyX21vZHVsZS5jCmluZGV4IGRiNDE3OTAuLjI1M2ZjMDYgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX2hlYWRlcl9maWx0ZXJfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfaGVhZGVyX2ZpbHRlcl9tb2R1bGUuYwpAQCAtMTIyLDcgKzEyMiw3IEBACiB9OwogCiAKLW5neF9odHRwX2hlYWRlcjBfdCAgbmd4X2h0dHBfaGVhZGVyc19vdXRbXSA9IHsKK25neF9odHRwX2hlYWRlcl9vdXRfdCAgbmd4X2h0dHBfaGVhZGVyc19vdXRbXSA9IHsKICAgICB7IG5neF9zdHJpbmcoIlNlcnZlciIpLCBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX291dF90LCBzZXJ2ZXIpIH0sCiAgICAgeyBuZ3hfc3RyaW5nKCJEYXRlIiksIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfb3V0X3QsIGRhdGUpIH0sCiAjaWYgMApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfcG9zdHBvbmVfZmlsdGVyX21vZHVsZS5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfcG9zdHBvbmVfZmlsdGVyX21vZHVsZS5jCmluZGV4IGU3NWU3NGYuLjljNTZmNDYgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3Bvc3Rwb25lX2ZpbHRlcl9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9wb3N0cG9uZV9maWx0ZXJfbW9kdWxlLmMKQEAgLTU2LDE1ICs1Niw2IEBACiAgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgImh0dHAgcG9zdHBvbmUgZmlsdGVyIFwiJVZcIiAlcCIsICZyLT51cmksIGluKTsKIAotICAgIGlmIChyLT5jb25uZWN0aW9uLT5jbG9zZWQpIHsKLQotICAgICAgICBpZiAoci0+cG9zdHBvbmVkKSB7Ci0gICAgICAgICAgICByLT5wb3N0cG9uZWQgPSByLT5wb3N0cG9uZWQtPm5leHQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgIH0KLQogICAgIGlmIChyICE9IHItPmNvbm5lY3Rpb24tPmRhdGEgfHwgKHItPnBvc3Rwb25lZCAmJiBpbikpIHsKIAogICAgICAgICBpZiAoci0+cG9zdHBvbmVkKSB7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMKaW5kZXggNThmMTNjNC4uODJmNjljOCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYwpAQCAtNDEsNiArNDEsNyBAQAogc3RhdGljIHZvaWQgbmd4X2h0dHBfc2V0X2xpbmdlcmluZ19jbG9zZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwogc3RhdGljIHZvaWQgbmd4X2h0dHBfbGluZ2VyaW5nX2Nsb3NlX2hhbmRsZXIobmd4X2V2ZW50X3QgKmV2KTsKIHN0YXRpYyB2b2lkIG5neF9odHRwX2Nsb3NlX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfaW50X3QgZXJyb3IpOworc3RhdGljIHZvaWQgbmd4X2h0dHBfcmVxdWVzdF9kb25lKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2ludF90IGVycm9yKTsKIHN0YXRpYyB2b2lkIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24obmd4X2Nvbm5lY3Rpb25fdCAqYyk7CiAKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19lcnJvcihuZ3hfbG9nX3QgKmxvZywgdV9jaGFyICpidWYsIHNpemVfdCBsZW4pOwpAQCAtMTU2LDggKzE1Nyw3IEBACiAKICAgICByZXYgPSBjLT5yZWFkOwogICAgIHJldi0+aGFuZGxlciA9IG5neF9odHRwX2luaXRfcmVxdWVzdDsKLQotICAgIC8qIFNUVUI6IGVwb2xsIGVkZ2UgKi8gYy0+d3JpdGUtPmhhbmRsZXIgPSBuZ3hfaHR0cF9lbXB0eV9oYW5kbGVyOworICAgIGMtPndyaXRlLT5oYW5kbGVyID0gbmd4X2h0dHBfZW1wdHlfaGFuZGxlcjsKIAogI2lmIChOR1hfU1RBVF9TVFVCKQogICAgIG5neF9hdG9taWNfZmV0Y2hfYWRkKG5neF9zdGF0X3JlYWRpbmcsIDEpOwpAQCAtMzc0LDcgKzM3NCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF90YWJsZV9lbHRfdCkpID09IE5HWF9FUlJPUikKICAgICB7CiAgICAgICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKLSAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihjKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMzgyLDcgKzM4MSw2IEBACiAgICAgci0+Y3R4ID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKHZvaWQgKikgKiBuZ3hfaHR0cF9tYXhfbW9kdWxlKTsKICAgICBpZiAoci0+Y3R4ID09IE5VTEwpIHsKICAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKGMpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC00MzUsNyArNDMzLDYgQEAKICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0lORk8sIGMtPmxvZywgTkdYX0VUSU1FRE9VVCwgImNsaWVudCB0aW1lZCBvdXQiKTsKICAgICAgICAgYy0+dGltZWRvdXQgPSAxOwogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX1JFUVVFU1RfVElNRV9PVVQpOwotICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKGMpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC01MDIsNyArNDk5LDYgQEAKICAgICByID0gYy0+ZGF0YTsKIAogICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgTkdYX0hUVFBfQkFEX1JFUVVFU1QpOwotICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oci0+Y29ubmVjdGlvbik7CiAKICAgICByZXR1cm47CiB9CkBAIC01MzAsNyArNTI2LDYgQEAKICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0lORk8sIGMtPmxvZywgTkdYX0VUSU1FRE9VVCwgImNsaWVudCB0aW1lZCBvdXQiKTsKICAgICAgICAgYy0+dGltZWRvdXQgPSAxOwogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX1JFUVVFU1RfVElNRV9PVVQpOwotICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKGMpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC01NjgsNyArNTYzLDYgQEAKICAgICAgICAgICAgICAgICByLT51cmkuZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgci0+dXJpLmxlbiArIDEpOwogICAgICAgICAgICAgICAgIGlmIChyLT51cmkuZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihjKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNjU1LDcgKzY0OSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfdGFibGVfZWx0X3QpKSA9PSBOR1hfRVJST1IpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCkBAIC02NjQsNyArNjU3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfdGFibGVfZWx0X3QgKikpID09IE5HWF9FUlJPUikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihjKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKQEAgLTY5NCw3ICs2ODYsNiBAQAogCiAgICAgICAgICAgICBpZiAocnYgPT0gTkdYX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCkBAIC03MzksNyArNzMwLDYgQEAKICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0lORk8sIGMtPmxvZywgTkdYX0VUSU1FRE9VVCwgImNsaWVudCB0aW1lZCBvdXQiKTsKICAgICAgICAgYy0+dGltZWRvdXQgPSAxOwogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX1JFUVVFU1RfVElNRV9PVVQpOwotICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKGMpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC03NTksNyArNzQ5LDYgQEAKIAogICAgICAgICAgICAgICAgIGlmIChydiA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKGMpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogCkBAIC03NzgsNyArNzY3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50IHNlbnQgdG9vIGxvbmcgaGVhZGVyIGxpbmU6IFwiJVZcIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlcik7CiAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgTkdYX0hUVFBfQkFEX1JFUVVFU1QpOwotICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKGMpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtODEyLDcgKzgwMCw2IEBACiAgICAgICAgICAgICBoID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19pbi5oZWFkZXJzKTsKICAgICAgICAgICAgIGlmIChoID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihjKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKQEAgLTg5NSw3ICs4ODIsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICJjbGllbnQgc2VudCBpbnZhbGlkIGhlYWRlciBsaW5lOiBcIiVWXFxyLi4uXCIiLAogICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXIpOwogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX0JBRF9SRVFVRVNUKTsKLSAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihjKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIH0KQEAgLTkzMiw3ICs5MTgsNiBAQAogCiAgICAgICAgIGlmIChuZ3hfaGFuZGxlX3JlYWRfZXZlbnQocmV2LCAwKSA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKLSAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oci0+Y29ubmVjdGlvbik7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTk0Niw3ICs5MzEsNiBAQAogCiAgICAgaWYgKG4gPT0gMCB8fCBuID09IE5HWF9FUlJPUikgewogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX0JBRF9SRVFVRVNUKTsKLSAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihyLT5jb25uZWN0aW9uKTsKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKQEAgLTExNTIsNyArMTEzNiw2IEBACiAgICAgfQogCiAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oci0+Y29ubmVjdGlvbik7CiAKICAgICByZXR1cm4gTkdYX0VSUk9SOwogfQpAQCAtMTE5MCw3ICsxMTczLDYgQEAKIAogICAgICAgICAgICAgaWYgKGNzY2YtPnJlc3RyaWN0X2hvc3RfbmFtZXMgPT0gTkdYX0hUVFBfUkVTVFJJQ1RfSE9TVF9DTE9TRSkgewogICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgTkdYX0hUVFBfQkFEX1JFUVVFU1QpOwotICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oci0+Y29ubmVjdGlvbik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgICAgIH0KIApAQCAtMTQzMiwyMSArMTQxNCwzNiBAQAogICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgKmNsY2Y7CiAKICAgICBpZiAocmMgPT0gTkdYX0RPTkUpIHsKLSAgICAgICAgLyogciBtYXkgYmUgYWxyZWFkeSBkZXN0cm95ZWQgd2hlbiByYyA9PSBOR1hfRE9ORSAqLworICAgICAgICAvKiB0aGUgcmVxdWVzdCBwb29sIG1heSBiZSBhbHJlYWR5IGRlc3Ryb3llZCAqLwogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgImh0dHAgZmluYWxpemUgcmVxdWVzdDogJWQsIFwiJVZcIiIsIHJjLCAmci0+dXJpKTsKIAotICAgIGlmIChyLT5wYXJlbnQKLSAgICAgICAgJiYgKHJjID49IE5HWF9IVFRQX1NQRUNJQUxfUkVTUE9OU0UgfHwgcmMgPT0gTkdYX0hUVFBfTk9fQ09OVEVOVCkpCi0gICAgewotICAgICAgICBuZ3hfaHR0cF9maW5hbGl6ZV9yZXF1ZXN0KHIsIG5neF9odHRwX3NwZWNpYWxfcmVzcG9uc2VfaGFuZGxlcihyLCByYykpOworICAgIGlmIChyYyA9PSBOR1hfRVJST1IgfHwgci0+Y29ubmVjdGlvbi0+Y2xvc2VkKSB7CisgICAgICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgMCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoci0+cGFyZW50IHx8IHJjID09IE5HWF9BR0FJTikgeworICAgIGlmIChyYyA+PSBOR1hfSFRUUF9TUEVDSUFMX1JFU1BPTlNFIHx8IHJjID09IE5HWF9IVFRQX05PX0NPTlRFTlQpIHsKKworICAgICAgICBpZiAoci0+bWFpbiA9PSByKSB7CisgICAgICAgICAgICBpZiAoci0+Y29ubmVjdGlvbi0+cmVhZC0+dGltZXJfc2V0KSB7CisgICAgICAgICAgICAgICAgbmd4X2RlbF90aW1lcihyLT5jb25uZWN0aW9uLT5yZWFkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHItPmNvbm5lY3Rpb24tPndyaXRlLT50aW1lcl9zZXQpIHsKKyAgICAgICAgICAgICAgICBuZ3hfZGVsX3RpbWVyKHItPmNvbm5lY3Rpb24tPndyaXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG5neF9odHRwX2ZpbmFsaXplX3JlcXVlc3Qociwgbmd4X2h0dHBfc3BlY2lhbF9yZXNwb25zZV9oYW5kbGVyKHIsIHJjKSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChyLT5tYWluICE9IHIgfHwgcmMgPT0gTkdYX0FHQUlOKSB7CiAgICAgICAgIGlmIChuZ3hfaHR0cF9zZXRfd3JpdGVfaGFuZGxlcihyKSAhPSBOR1hfT0spIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMTQ2MCw3ICsxNDU3LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChyLT5wYXJlbnQpIHsKKyAgICBpZiAoci0+bWFpbiAhPSByKSB7CiAKICAgICAgICAgcHIgPSByLT5wYXJlbnQ7CiAKQEAgLTE0OTksMzQgKzE0OTYsMTEgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChyYyA+PSBOR1hfSFRUUF9TUEVDSUFMX1JFU1BPTlNFIHx8IHJjID09IE5HWF9IVFRQX05PX0NPTlRFTlQpIHsKLQotICAgICAgICBpZiAoci0+Y29ubmVjdGlvbi0+cmVhZC0+dGltZXJfc2V0KSB7Ci0gICAgICAgICAgICBuZ3hfZGVsX3RpbWVyKHItPmNvbm5lY3Rpb24tPnJlYWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHItPmNvbm5lY3Rpb24tPndyaXRlLT50aW1lcl9zZXQpIHsKLSAgICAgICAgICAgIG5neF9kZWxfdGltZXIoci0+Y29ubmVjdGlvbi0+d3JpdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHItPmNvbm5lY3Rpb24tPmNsb3NlZCkgewotICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLCAwKTsKLSAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oci0+Y29ubmVjdGlvbik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBuZ3hfaHR0cF9maW5hbGl6ZV9yZXF1ZXN0KHIsIG5neF9odHRwX3NwZWNpYWxfcmVzcG9uc2VfaGFuZGxlcihyLCByYykpOwotCisgICAgaWYgKHJjID09IE5HWF9BR0FJTikgewogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKHJjID09IE5HWF9FUlJPUiB8fCByLT5jb25uZWN0aW9uLT5jbG9zZWQpIHsKLSAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLCAwKTsKLSAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihyLT5jb25uZWN0aW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChyYyA9PSBOR1hfQUdBSU4gfHwgci0+b3V0KSB7CisgICAgaWYgKHItPm91dCkgewogICAgICAgICAodm9pZCkgbmd4X2h0dHBfc2V0X3dyaXRlX2hhbmRsZXIocik7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xNTQ3LDcgKzE1MjEsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAia2V2ZW50KCkgcmVwb3J0ZWQgYWJvdXQgYW4gY2xvc2VkIGNvbm5lY3Rpb24iKTsKICNlbmRpZgogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIDApOwotICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKHItPmNvbm5lY3Rpb24pOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xNTY3LDcgKzE1NDAsNiBAQAogICAgIH0KIAogICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgMCk7Ci0gICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihyLT5jb25uZWN0aW9uKTsKIH0KIAogCkBAIC0xNTgxLDEwICsxNTUzLDYgQEAKIAogICAgIHItPndyaXRlX2V2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF93cml0ZXI7CiAKLSAgICBpZiAoci0+Y29ubmVjdGlvbi0+Y2xvc2VkKSB7Ci0gICAgICAgIHJldHVybiBOR1hfT0s7Ci0gICAgfQotCiAgICAgd2V2ID0gci0+Y29ubmVjdGlvbi0+d3JpdGU7CiAKICAgICBpZiAod2V2LT5yZWFkeSAmJiB3ZXYtPmRlbGF5ZWQpIHsKQEAgLTE1OTgsNyArMTU2Niw2IEBACiAKICAgICBpZiAobmd4X2hhbmRsZV93cml0ZV9ldmVudCh3ZXYsIGNsY2YtPnNlbmRfbG93YXQpID09IE5HWF9FUlJPUikgewogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIDApOwotICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKHItPmNvbm5lY3Rpb24pOwogICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KIApAQCAtMTYyNiwxNCArMTU5Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGllbnQgdGltZWQgb3V0Iik7CiAgICAgICAgICAgICBjLT50aW1lZG91dCA9IDE7CiAKLSNpZiAwCi0gICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHItPm1haW4sIE5HWF9IVFRQX1JFUVVFU1RfVElNRV9PVVQpOwotICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihjKTsKLSNlbmRpZgotCi0gICAgICAgICAgICBjLT5jbG9zZWQgPSAxOwotICAgICAgICAgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCAwKTsKLQorICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLCBOR1hfSFRUUF9SRVFVRVNUX1RJTUVfT1VUKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0xNjQ1LDggKzE2MDUsNyBAQAogICAgICAgICAgICAgbmd4X2FkZF90aW1lcih3ZXYsIGNsY2YtPnNlbmRfdGltZW91dCk7CiAKICAgICAgICAgICAgIGlmIChuZ3hfaGFuZGxlX3dyaXRlX2V2ZW50KHdldiwgY2xjZi0+c2VuZF9sb3dhdCkgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLT5tYWluLCAwKTsKLSAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKHItPmNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgMCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybjsKQEAgLTE2NjAsOCArMTYxOSw3IEBACiAgICAgICAgICAgICBjbGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLT5tYWluLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CiAKICAgICAgICAgICAgIGlmIChuZ3hfaGFuZGxlX3dyaXRlX2V2ZW50KHdldiwgY2xjZi0+c2VuZF9sb3dhdCkgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLT5tYWluLCAwKTsKLSAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKHItPmNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgMCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybjsKQEAgLTE2NzIsNyArMTYzMCw3IEBACiAgICAgICAgIHJjID0gbmd4X2h0dHBfcG9zdHBvbmVkX2hhbmRsZXIocik7CiAKICAgICAgICAgaWYgKHJjID09IE5HWF9ET05FKSB7Ci0gICAgICAgICAgICAvKiByIG1heSBiZSBhbHJlYWR5IGRlc3Ryb3llZCB3aGVuIHJjID09IE5HWF9ET05FICovCisgICAgICAgICAgICAvKiB0aGUgcmVxdWVzdCBwb29sIG1heSBiZSBhbHJlYWR5IGRlc3Ryb3llZCAqLwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTE2OTEsOCArMTY0OSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobmd4X2hhbmRsZV93cml0ZV9ldmVudCh3ZXYsIGNsY2YtPnNlbmRfbG93YXQpID09IE5HWF9FUlJPUikgewotICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLT5tYWluLCAwKTsKLSAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oci0+Y29ubmVjdGlvbik7CisgICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIDApOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuOwpAQCAtMTcyMiwxMyArMTY3OSwxOCBAQAogCiAgICAgICAgIHJjID0gbmd4X2h0dHBfb3V0cHV0X2ZpbHRlcihyLCBOVUxMKTsKIAorICAgICAgICBpZiAocmMgPT0gTkdYX0RPTkUpIHsKKyAgICAgICAgICAgIC8qIHRoZSByZXF1ZXN0IHBvb2wgaXMgYWxyZWFkeSBkZXN0cm95ZWQgKi8KKyAgICAgICAgICAgIHJldHVybiBOR1hfRE9ORTsKKyAgICAgICAgfQorCiAgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBwb3N0cG9uZWQgb3V0cHV0IGZpbHRlcjogJWQiLCByYyk7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogd2UgdHJlYXQgTkdYX0VSUk9SIGFzIE5HWF9PSywgYmVjYXVzZSB3ZSBuZWVkIHRvIGNvbXBsZXRlCi0gICAgICAgICAqIGFsbCBwb3N0cG9uZWQgcmVxdWVzdHMKLSAgICAgICAgICovCisgICAgICAgIGlmIChyYyA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgMCk7CisgICAgICAgICAgICByZXR1cm4gTkdYX0RPTkU7CisgICAgICAgIH0KIAogICAgICAgICBwciA9IHItPnBvc3Rwb25lZDsKIApAQCAtMTc2OSw3ICsxNzMxLDYgQEAKICAgICAgICAgICAgID09IE5HWF9FUlJPUikKICAgICAgICAgewogICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLCAwKTsKLSAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oci0+Y29ubmVjdGlvbik7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xODMyLDE0ICsxNzkzLDEyIEBACiAgICAgaWYgKHJjID09IE5HWF9BR0FJTikgewogICAgICAgICBpZiAobmd4X2hhbmRsZV9yZWFkX2V2ZW50KHItPmNvbm5lY3Rpb24tPnJlYWQsIDApID09IE5HWF9FUlJPUikgewogICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLCByYyk7Ci0gICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKHItPmNvbm5lY3Rpb24pOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKHJjICE9IE5HWF9PSykgewogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIHJjKTsKLSAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihyLT5jb25uZWN0aW9uKTsKICAgICB9CiB9CiAKQEAgLTE5MzIsNyArMTg5MSw2IEBACiAKICAgICAgICAgICAgICAgICBpZiAoaGMtPmZyZWUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIDApOwotICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKGMpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTk1MSw3ICsxOTA5LDggQEAKIAogICAgIGNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKIAotICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgMCk7CisgICAgbmd4X2h0dHBfcmVxdWVzdF9kb25lKHIsIDApOworCiAgICAgYy0+ZGF0YSA9IGhjOwogCiAgICAgbmd4X2FkZF90aW1lcihyZXYsIGNsY2YtPmtlZXBhbGl2ZV90aW1lb3V0KTsKQEAgLTIyMjEsNyArMjE4MCw2IEBACiAKICAgICBpZiAobmd4X2hhbmRsZV9yZWFkX2V2ZW50KHJldiwgMCkgPT0gTkdYX0VSUk9SKSB7CiAgICAgICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgMCk7Ci0gICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTIyMzQsMTQgKzIxOTIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE5HWF9FUlJPUikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIDApOwotICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCiAgICAgICAgIH0gZWxzZSBpZiAobmd4X2V2ZW50X2ZsYWdzICYgTkdYX1VTRV9MRVZFTF9FVkVOVCkgewogICAgICAgICAgICAgaWYgKG5neF9kZWxfZXZlbnQod2V2LCBOR1hfV1JJVEVfRVZFTlQsIDApID09IE5HWF9FUlJPUikgewogICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgMCk7Ci0gICAgICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihjKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIyNTEsNyArMjIwNyw2IEBACiAgICAgICAgIG5neF9jb25uZWN0aW9uX2Vycm9yKGMsIG5neF9zb2NrZXRfZXJybm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9zaHV0ZG93bl9zb2NrZXRfbiAiIGZhaWxlZCIpOwogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIDApOwotICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKGMpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0yMjc5LDE0ICsyMjM0LDEyIEBACiAKICAgICBpZiAocmV2LT50aW1lZG91dCkgewogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIDApOwotICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKGMpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgdGltZXIgPSByLT5saW5nZXJpbmdfdGltZSAtIG5neF90aW1lKCk7CiAgICAgaWYgKHRpbWVyIDw9IDApIHsKICAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLCAwKTsKLSAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihjKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMjI5Nyw3ICsyMjUwLDYgQEAKIAogICAgICAgICBpZiAobiA9PSBOR1hfRVJST1IgfHwgbiA9PSAwKSB7CiAgICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIDApOwotICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihjKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0yMzA1LDcgKzIyNTcsNiBAQAogCiAgICAgaWYgKG5neF9oYW5kbGVfcmVhZF9ldmVudChyZXYsIDApID09IE5HWF9FUlJPUikgewogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIDApOwotICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKGMpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0yMzYyLDEwICsyMzEzLDMxIEBACiB2b2lkCiBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2ludF90IGVycm9yKQogewotICAgIG5neF9sb2dfdCAgICAgICAgICAgICAgICAgKmxvZzsKLSAgICBzdHJ1Y3QgbGluZ2VyICAgICAgICAgICAgICBsaW5nZXI7Ci0gICAgbmd4X2h0dHBfbG9nX2N0eF90ICAgICAgICAqY3R4OwotICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgKmNsY2Y7CisgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAqYzsKKyAgICBuZ3hfaHR0cF9jbGVhbnVwX3QgICpjbG47CisKKyAgICBjID0gci0+Y29ubmVjdGlvbjsKKyAgICByID0gci0+bWFpbjsKKworICAgIGZvciAoY2xuID0gci0+Y2xlYW51cDsgY2xuOyBjbG4gPSBjbG4tPm5leHQpIHsKKyAgICAgICAgaWYgKGNsbi0+aGFuZGxlcikgeworICAgICAgICAgICAgY2xuLT5oYW5kbGVyKGNsbi0+ZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuZ3hfaHR0cF9yZXF1ZXN0X2RvbmUociwgZXJyb3IpOworICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7Cit9CisKKwordm9pZAorbmd4X2h0dHBfcmVxdWVzdF9kb25lKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2ludF90IGVycm9yKQoreworICAgIG5neF9sb2dfdCAgICAgICAgICAgICAgICAgICpsb2c7CisgICAgc3RydWN0IGxpbmdlciAgICAgICAgICAgICAgIGxpbmdlcjsKKyAgICBuZ3hfaHR0cF9sb2dfY3R4X3QgICAgICAgICAqY3R4OworICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgICpjbGNmOworICAgIG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgICpjbWNmOwogCiAgICAgbG9nID0gci0+Y29ubmVjdGlvbi0+bG9nOwogCkBAIC0yMzkyLDcgKzIzNjQsMTEgQEAKICAgICAgICAgci0+aGVhZGVyc19vdXQuc3RhdHVzID0gZXJyb3I7CiAgICAgfQogCi0gICAgbmd4X2h0dHBfbG9nX2hhbmRsZXIocik7CisgICAgY21jZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbWFpbl9jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKKworICAgIGlmIChjbWNmLT5sb2dfaGFuZGxlcikgeworICAgICAgICBjbWNmLT5sb2dfaGFuZGxlcihyKTsKKyAgICB9CiAKICAgICBpZiAoci0+Y29ubmVjdGlvbi0+dGltZWRvdXQpIHsKICAgICAgICAgY2xjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5oIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5oCmluZGV4IDhkYmYwYmEuLjQwYTMyOGMgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuaAorKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmgKQEAgLTEyNSw3ICsxMjUsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOwogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ7Ci19IG5neF9odHRwX2hlYWRlcjBfdDsKK30gbmd4X2h0dHBfaGVhZGVyX291dF90OwogCiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTIzOCw2ICsyMzgsMTcgQEAKIH0gbmd4X2h0dHBfY29ubmVjdGlvbl90OwogCiAKK3R5cGVkZWYgdm9pZCAoKm5neF9odHRwX2NsZWFudXBfcHQpKHZvaWQgKmRhdGEpOworCit0eXBlZGVmIHN0cnVjdCBuZ3hfaHR0cF9jbGVhbnVwX3MgIG5neF9odHRwX2NsZWFudXBfdDsKKworc3RydWN0IG5neF9odHRwX2NsZWFudXBfcyB7CisgICAgbmd4X2h0dHBfY2xlYW51cF9wdCAgIGhhbmRsZXI7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgKmRhdGE7CisgICAgbmd4X2h0dHBfY2xlYW51cF90ICAgKm5leHQ7Cit9OworCisKIHR5cGVkZWYgc3RydWN0IG5neF9odHRwX3Bvc3Rwb25lZF9yZXF1ZXN0X3MgIG5neF9odHRwX3Bvc3Rwb25lZF9yZXF1ZXN0X3Q7CiAKIHN0cnVjdCBuZ3hfaHR0cF9wb3N0cG9uZWRfcmVxdWVzdF9zIHsKQEAgLTMyNSw2ICszMzYsOCBAQAogCiAgICAgbmd4X2h0dHBfbG9nX2hhbmRsZXJfcHQgICAgICAgICAgIGxvZ19oYW5kbGVyOwogCisgICAgbmd4X2h0dHBfY2xlYW51cF90ICAgICAgICAgICAgICAgKmNsZWFudXA7CisKICAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9zdGF0ZTo0OwogCiAgICAgLyogVVJJIHdpdGggIi8uIiBhbmQgb24gV2luMzIgd2l0aCAiLy8iICovCkBAIC00MDEsOCArNDE0LDggQEAKIH07CiAKIAotZXh0ZXJuIG5neF9odHRwX2hlYWRlcl90ICAgbmd4X2h0dHBfaGVhZGVyc19pbltdOwotZXh0ZXJuIG5neF9odHRwX2hlYWRlcjBfdCAgIG5neF9odHRwX2hlYWRlcnNfb3V0W107CitleHRlcm4gbmd4X2h0dHBfaGVhZGVyX3QgICAgICAgbmd4X2h0dHBfaGVhZGVyc19pbltdOworZXh0ZXJuIG5neF9odHRwX2hlYWRlcl9vdXRfdCAgIG5neF9odHRwX2hlYWRlcnNfb3V0W107CiAKIAogI2VuZGlmIC8qIF9OR1hfSFRUUF9SRVFVRVNUX0hfSU5DTFVERURfICovCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uYwppbmRleCA2ZDFiZDQ5Li42ZWM5OTMzIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMKQEAgLTI5LDYgKzI5LDcgQEAKIHN0YXRpYyB2b2lkIG5neF9odHRwX3Vwc3RyZWFtX2R1bW15X2hhbmRsZXIobmd4X2V2ZW50X3QgKndldik7CiBzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9uZXh0KG5neF9odHRwX3JlcXVlc3RfdCAqciwKICAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICp1LCBuZ3hfdWludF90IGZ0X3R5cGUpOworc3RhdGljIHZvaWQgbmd4X2h0dHBfdXBzdHJlYW1fY2xlYW51cCh2b2lkICpkYXRhKTsKIHN0YXRpYyB2b2lkIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLAogICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgKnUsIG5neF9pbnRfdCByYyk7CiAKQEAgLTIyMyw2ICsyMjQsNyBAQAogewogICAgIG5neF90aW1lX3QgICAgICAgICAgICAgICAgKnRwOwogICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAgICAgKmM7CisgICAgbmd4X2h0dHBfY2xlYW51cF90ICAgICAgICAqY2xuOwogICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgICAgICAgKnU7CiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAqY2xjZjsKIApAQCAtMjc3LDcgKzI3OSw4IEBACiAgICAgdS0+d3JpdGVyLnBvb2wgPSByLT5wb29sOwogCiAgICAgaWYgKG5neF9hcnJheV9pbml0KCZ1LT5zdGF0ZXMsIHItPnBvb2wsIHUtPnBlZXIucGVlcnMtPm51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3Vwc3RyZWFtX3N0YXRlX3QpKSAhPSBOR1hfT0spCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF91cHN0cmVhbV9zdGF0ZV90KSkKKyAgICAgICAgIT0gTkdYX09LKQogICAgIHsKICAgICAgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwogICAgICAgICByZXR1cm47CkBAIC0yOTUsNiArMjk4LDE2IEBACiAKICAgICB1LT5zdGF0ZS0+cmVzcG9uc2VfdGltZSA9IHRwLT5zZWMgKiAxMDAwICsgdHAtPm1zZWM7CiAKKyAgICBjbG4gPSBuZ3hfaHR0cF9jbGVhbnVwX2FkZChyLCBzaXplb2Yodm9pZCAqKSk7CisgICAgaWYgKGNsbiA9PSBOVUxMKSB7CisgICAgICAgIG5neF9odHRwX2ZpbmFsaXplX3JlcXVlc3QociwgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNsbi0+aGFuZGxlciA9IG5neF9odHRwX3Vwc3RyZWFtX2NsZWFudXA7CisgICAgY2xuLT5kYXRhID0gcjsKKyAgICB1LT5jbGVhbnVwID0gJmNsbi0+aGFuZGxlcjsKKwogICAgIG5neF9odHRwX3Vwc3RyZWFtX2Nvbm5lY3QociwgdSk7CiB9CiAKQEAgLTEzNzksOCArMTM5Miw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoci0+Y29ubmVjdGlvbi0+d3JpdGUtPmVvZikgewotICAgICAgICByLT5jb25uZWN0aW9uLT5jbG9zZWQgPSAxOworICAgIGlmIChyLT5jb25uZWN0aW9uLT5jbG9zZWQpIHsKICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0NMSUVOVF9DTE9TRURfUkVRVUVTVCk7CiAgICAgICAgIHJldHVybjsKQEAgLTE0MjYsNiArMTQzOCwxOCBAQAogCiAKIHN0YXRpYyB2b2lkCituZ3hfaHR0cF91cHN0cmVhbV9jbGVhbnVwKHZvaWQgKmRhdGEpCit7CisgICAgbmd4X2h0dHBfcmVxdWVzdF90ICpyID0gZGF0YTsKKworICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJjbGVhbnVwIGh0dHAgdXBzdHJlYW0gcmVxdWVzdDogXCIlVlwiIiwgJnItPnVyaSk7CisKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHItPnVwc3RyZWFtLCBOR1hfRE9ORSk7Cit9CisKKworc3RhdGljIHZvaWQKIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLAogICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgKnUsIG5neF9pbnRfdCByYykKIHsKQEAgLTE0MzQsNiArMTQ1OCw4IEBACiAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgImZpbmFsaXplIGh0dHAgdXBzdHJlYW0gcmVxdWVzdDogJWkiLCByYyk7CiAKKyAgICAqdS0+Y2xlYW51cCA9IE5VTEw7CisKICAgICBpZiAodS0+c3RhdGUtPnJlc3BvbnNlX3RpbWUpIHsKICAgICAgICAgdHAgPSBuZ3hfdGltZW9mZGF5KCk7CiAgICAgICAgIHUtPnN0YXRlLT5yZXNwb25zZV90aW1lID0gdHAtPnNlYyAqIDEwMDAgKyB0cC0+bXNlYwpAQCAtMTg2NCw3ICsxODkwLDcgQEAKIAogICAgIHAgPSBuZ3hfc25wcmludGYoYnVmLCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAiLCBzZXJ2ZXI6ICVWLCBVUkw6IFwiJVZcIiwiCi0gICAgICAgICAgICAgICAgICAgICAiIHVwc3RyZWFtOiAlViVWJXMlViIsCisgICAgICAgICAgICAgICAgICAgICAiIHVwc3RyZWFtOiBcIiVWJVYlcyVWXCIiLAogICAgICAgICAgICAgICAgICAgICAgJnItPnNlcnZlcl9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgJnItPnVucGFyc2VkX3VyaSwKICAgICAgICAgICAgICAgICAgICAgICZ1LT5jb25mLT5zY2hlbWEsCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5oIGIvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uaAppbmRleCA2MzdhMzhkLi5kNmI0YTYyIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5oCisrKyBiL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmgKQEAgLTE2Nyw2ICsxNjcsOCBAQAogCiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICB1cmk7CiAKKyAgICBuZ3hfaHR0cF9jbGVhbnVwX3B0ICAgICAgICAgICAgKmNsZWFudXA7CisKICAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hhYmxlOjE7CiAgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICBhY2NlbDoxOwogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuYyBiL3NyYy9odHRwL25neF9odHRwX3ZhcmlhYmxlcy5jCmluZGV4IDdlNGE3OWYuLjNjYjNiZGYgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3ZhcmlhYmxlcy5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3ZhcmlhYmxlcy5jCkBAIC05Nyw2ICs5Nyw5IEBACiAgICAgeyBuZ3hfc3RyaW5nKCJkb2N1bWVudF91cmkiKSwgbmd4X2h0dHBfdmFyaWFibGVfcmVxdWVzdCwKICAgICAgIG9mZnNldG9mKG5neF9odHRwX3JlcXVlc3RfdCwgdXJpKSwgMCwgMCB9LAogCisgICAgeyBuZ3hfc3RyaW5nKCJyZXF1ZXN0IiksIG5neF9odHRwX3ZhcmlhYmxlX3JlcXVlc3QsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9yZXF1ZXN0X3QsIHJlcXVlc3RfbGluZSksIDAsIDAgfSwKKwogICAgIHsgbmd4X3N0cmluZygiZG9jdW1lbnRfcm9vdCIpLCBuZ3hfaHR0cF92YXJpYWJsZV9kb2N1bWVudF9yb290LCAwLCAwLCAwIH0sCiAKICAgICB7IG5neF9zdHJpbmcoInF1ZXJ5X3N0cmluZyIpLCBuZ3hfaHR0cF92YXJpYWJsZV9yZXF1ZXN0LApAQCAtNzA1LDcgKzcwOCw4IEBACiAgICAgY21jZiA9IG5neF9odHRwX2NvbmZfZ2V0X21vZHVsZV9tYWluX2NvbmYoY2YsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKIAogICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmY21jZi0+YWxsX3ZhcmlhYmxlcywgY2YtPnBvb2wsIDMyLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdCkpID09IE5HWF9FUlJPUikKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3QpKQorICAgICAgICA9PSBOR1hfRVJST1IpCiAgICAgewogICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9pbWFwL25neF9pbWFwX2hhbmRsZXIuYyBiL3NyYy9pbWFwL25neF9pbWFwX2hhbmRsZXIuYwppbmRleCBiOGM1YmZjLi5hYzVkYjczIDEwMDY0NAotLS0gYS9zcmMvaW1hcC9uZ3hfaW1hcF9oYW5kbGVyLmMKKysrIGIvc3JjL2ltYXAvbmd4X2ltYXBfaGFuZGxlci5jCkBAIC0zNTUsOSArMzU1LDkgQEAKICAgICAgICAgc3dpdGNoIChzLT5jb21tYW5kKSB7CiAKICAgICAgICAgY2FzZSBOR1hfSU1BUF9MT0dJTjoKLSAgICAgICAgICAgIGlmIChzLT5hcmdzLm5lbHRzID09IDIpIHsKKyAgICAgICAgICAgIGFyZyA9IHMtPmFyZ3MuZWx0czsKIAotICAgICAgICAgICAgICAgIGFyZyA9IHMtPmFyZ3MuZWx0czsKKyAgICAgICAgICAgIGlmIChzLT5hcmdzLm5lbHRzID09IDIgJiYgYXJnWzBdLmxlbikgewogCiAgICAgICAgICAgICAgICAgcy0+bG9naW4ubGVuID0gYXJnWzBdLmxlbjsKICAgICAgICAgICAgICAgICBzLT5sb2dpbi5kYXRhID0gbmd4X3BhbGxvYyhjLT5wb29sLCBzLT5sb2dpbi5sZW4pOwo=