ZGlmZiAtLWdpdCBhL2F1dG8vY2MvZ2NjIGIvYXV0by9jYy9nY2MKaW5kZXggNDZiMGFhYi4uMmU1OTA2YSAxMDA2NDQKLS0tIGEvYXV0by9jYy9nY2MKKysrIGIvYXV0by9jYy9nY2MKQEAgLTU3LDYgKzU3LDExIEBACiAgICAgICAgIENQVV9PUFQ9Ii1tYXJjaD1wZW50aXVtNCIKICAgICA7OwogCisgICAgb3B0ZXJvbikKKyAgICAgICAgIyBvcHRpbWl6ZSBmb3IgT3B0ZXJvbiwgZ2NjIDMueAorICAgICAgICBDUFVfT1BUPSItbWFyY2g9b3B0ZXJvbiIKKyAgICA7OworCiAgICAgc3BhcmM2NCkKICAgICAgICAgIyBidWlsZCA2NC1iaXQgVWx0cmFTcGFyYyBiaW5hcnkKICAgICAgICAgQ1BVX09QVD0iLW02NCIKZGlmZiAtLWdpdCBhL2F1dG8vY2MvbXN2YyBiL2F1dG8vY2MvbXN2YwppbmRleCBkOTIwZWQwLi4wZmE1ZGY5IDEwMDY0NAotLS0gYS9hdXRvL2NjL21zdmMKKysrIGIvYXV0by9jYy9tc3ZjCkBAIC02LDE4ICs2LDMxIEBACiAKICMgb3B0aW1pemF0aW9ucwogCi0jIG1heGltaXplIHNwZWVkCisjIG1heGltaXplIHNwZWVkLCBlcXVpdmFsZW50IHRvIC1PZyAtT2kgLU90IC1PeSAtT2IyIC1HcyAtR0YgLUd5CiBDRkxBR1M9IiRDRkxBR1MgLU8yIgorCiAjIGVuYWJsZSBnbG9iYWwgb3B0aW1pemF0aW9uCi1DRkxBR1M9IiRDRkxBR1MgLU9nIgorI0NGTEFHUz0iJENGTEFHUyAtT2ciCiAjIGVuYWJsZSBpbnRyaW5zaWMgZnVuY3Rpb25zCi1DRkxBR1M9IiRDRkxBR1MgLU9pIgotIyBpbmxpbmUgZXhwYW5zaW9uCi1DRkxBR1M9IiRDRkxBR1MgLU9iMSIKKyNDRkxBR1M9IiRDRkxBR1MgLU9pIgorCisjIGRpc2FibGUgaW5saW5lIGV4cGFuc2lvbgorI0NGTEFHUz0iJENGTEFHUyAtT2IwIgorIyBleHBsaWNpdCBpbmxpbmUgZXhwYW5zaW9uCisjQ0ZMQUdTPSIkQ0ZMQUdTIC1PYjEiCisjIGV4cGxpY2l0IGFuZCBpbXBsaWNpdCBpbmxpbmUgZXhwYW5zaW9uCisjQ0ZMQUdTPSIkQ0ZMQUdTIC1PYjIiCisKICMgZW5hYmxlIGZyYW1lIHBvaW50ZXIgb21pc3Npb24KLUNGTEFHUz0iJENGTEFHUyAtT3kiCisjQ0ZMQUdTPSIkQ0ZMQUdTIC1PeSIKICMgZGlzYWJsZSBzdGFjayBjaGVja2luZyBjYWxscwotQ0ZMQUdTPSIkQ0ZMQUdTIC1HcyIKKyNDRkxBR1M9IiRDRkxBR1MgLUdzIgorCisjIHBvb2xzIHN0cmluZ3MgYXMgcmVhZC93cml0ZQorI0NGTEFHUz0iJENGTEFHUyAtR2YiCisjIHBvb2xzIHN0cmluZ3MgYXMgcmVhZC1vbmx5CisjQ0ZMQUdTPSIkQ0ZMQUdTIC1HRiIKKwogCiBjYXNlICRDUFUgaW4KICAgICBwZW50aXVtKQpkaWZmIC0tZ2l0IGEvYXV0by9oYXZlX2hlYWRlcnMgYi9hdXRvL2hhdmVfaGVhZGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjZhYzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXV0by9oYXZlX2hlYWRlcnMKQEAgLTAsMCArMSwxMSBAQAorCisjIENvcHlyaWdodCAoQykgSWdvciBTeXNvZXYKKworCitjYXQgPDwgRU5EID4+ICROR1hfQVVUT19IRUFERVJTX0gKKworI2lmbmRlZiAkaGF2ZQorI2RlZmluZSAkaGF2ZSAgMQorI2VuZGlmCisKK0VORApkaWZmIC0tZ2l0IGEvYXV0by9pbmNsdWRlIGIvYXV0by9pbmNsdWRlCmluZGV4IGIzNjkxNjkuLjdlZDMwODYgMTAwNjQ0Ci0tLSBhL2F1dG8vaW5jbHVkZQorKysgYi9hdXRvL2luY2x1ZGUKQEAgLTM5LDE0ICszOSw3IEBACiAgICAgICAgICAgICAgICAgICB8ICB0ciAnW2Etel0nICdbQS1aXSdgCiAKIAotICAgIGNhdCA8PCBFTkQgPj4gJE5HWF9BVVRPX0hFQURFUlNfSAotCi0jaWZuZGVmIE5HWF9IQVZFXyRuZ3hfbmFtZQotI2RlZmluZSBOR1hfSEFWRV8kbmd4X25hbWUgIDEKLSNlbmRpZgotCi1FTkQKLQorICAgIGhhdmU9TkdYX0hBVkVfJG5neF9uYW1lIC4gYXV0by9oYXZlX2hlYWRlcnMKIAogICAgIGV2YWwgIk5HWF9JTkNMVURFXyRuZ3hfbmFtZT0nI2luY2x1ZGUgPCRuZ3hfaW5jbHVkZT4nIgogCmRpZmYgLS1naXQgYS9hdXRvL21vZHVsZXMgYi9hdXRvL21vZHVsZXMKaW5kZXggNGFiMjcyZS4uYjAzMmYwNSAxMDA2NDQKLS0tIGEvYXV0by9tb2R1bGVzCisrKyBiL2F1dG8vbW9kdWxlcwpAQCAtNTEsNiArNTEsMTAgQEAKIGZpCiAKIAoraWYgWyAkSFRUUF9TU0kgPSBZRVMgXTsgdGhlbgorICAgIEhUVFBfUE9TVFBPTkU9WUVTCitmaQorCiAjIHRoZSBmaWx0ZXIgb3JkZXIgaXMgaW1wb3J0YW50CiAjICAgICBuZ3hfaHR0cF93cml0ZV9maWx0ZXIKICMgICAgIG5neF9odHRwX2hlYWRlcl9maWx0ZXIKQEAgLTU4LDYgKzYyLDcgQEAKICMgICAgIG5neF9odHRwX3JhbmdlX2hlYWRlcl9maWx0ZXIKICMgICAgIG5neF9odHRwX3NzbF9maWx0ZXIKICMgICAgIG5neF9odHRwX2d6aXBfZmlsdGVyCisjICAgICBuZ3hfaHR0cF9wb3N0cG9uZV9maWx0ZXIKICMgICAgIG5neF9odHRwX2NoYXJzZXRfZmlsdGVyCiAjICAgICBuZ3hfaHR0cF9zc2lfZmlsdGVyCiAjICAgICBuZ3hfaHR0cF9oZWFkZXJzX2ZpbHRlcgpAQCAtNzcsNiArODIsMTEgQEAKICAgICBIVFRQX1NSQ1M9IiRIVFRQX1NSQ1MgJEhUVFBfR1pJUF9TUkNTIgogZmkKIAoraWYgWyAkSFRUUF9QT1NUUE9ORSA9IFlFUyBdOyB0aGVuCisgICAgSFRUUF9GSUxURVJfTU9EVUxFUz0iJEhUVFBfRklMVEVSX01PRFVMRVMgJEhUVFBfUE9TVFBPTkVfRklMVEVSX01PRFVMRSIKKyAgICBIVFRQX1NSQ1M9IiRIVFRQX1NSQ1MgJEhUUFBfUE9TVFBPTkVfRklMVEVSX1NSQ1MiCitmaQorCiBpZiBbICRIVFRQX0NIQVJTRVQgPSBZRVMgXTsgdGhlbgogICAgIGhhdmU9TkdYX0hUVFBfQ0hBUlNFVCAuIGF1dG8vaGF2ZQogICAgIEhUVFBfRklMVEVSX01PRFVMRVM9IiRIVFRQX0ZJTFRFUl9NT0RVTEVTICRIVFRQX0NIQVJTRVRfRklMVEVSX01PRFVMRSIKZGlmZiAtLWdpdCBhL2F1dG8vb3B0aW9ucyBiL2F1dG8vb3B0aW9ucwppbmRleCAyYmRiNWRmLi5hNTZiYzQyIDEwMDY0NAotLS0gYS9hdXRvL29wdGlvbnMKKysrIGIvYXV0by9vcHRpb25zCkBAIC00OSw2ICs0OSw3IEBACiBIVFRQX0daSVA9WUVTCiBIVFRQX1NTTD1OTwogSFRUUF9TU0k9WUVTCitIVFRQX1BPU1RQT05FPU5PCiBIVFRQX0FDQ0VTUz1ZRVMKIEhUVFBfQVVUSF9CQVNJQz1ZRVMKIEhUVFBfVVNFUklEPVlFUwpkaWZmIC0tZ2l0IGEvYXV0by9vcy9jb25mIGIvYXV0by9vcy9jb25mCmluZGV4IGI0OGI2NDAuLmYyYTQ5Y2UgMTAwNjQ0Ci0tLSBhL2F1dG8vb3MvY29uZgorKysgYi9hdXRvL29zL2NvbmYKQEAgLTIzLDYgKzIzLDE1IEBACiAgICAgICAgIC4gYXV0by9vcy9mcmVlYnNkCiAgICAgOzsKIAorICAgIERhcndpbjoqKQorICAgICAgICBoYXZlPU5HWF9EQVJXSU4gLiBhdXRvL2hhdmVfaGVhZGVycworICAgICAgICBoYXZlPU5HWF9IQVZFX0lOSEVSSVRFRF9OT05CTE9DSyAuIGF1dG8vaGF2ZQorICAgICAgICBDT1JFX0lOQ1M9IiRVTklYX0lOQ1MiCisgICAgICAgIENPUkVfREVQUz0iJFVOSVhfREVQUyAkUE9TSVhfREVQUyIKKyAgICAgICAgQ09SRV9TUkNTPSIkVU5JWF9TUkNTIgorICAgICAgICBDUllQVF9MSUI9CisgICAgOzsKKwogICAgIExpbnV4OiopCiAgICAgICAgIC4gYXV0by9vcy9saW51eAogICAgIDs7CkBAIC00NywxNiArNTYsMTYgQEAKIAogY2FzZSAiJE5HWF9NQUNISU5FIiBpbgogCi0gICAgIGkzODZ8aTY4NnxpODZwY3xhbWQ2NCkKLSAgICAgICAgIGhhdmU9TkdYX0hBVkVfTk9OQUxJR05FRCAuIGF1dG8vaGF2ZQotICAgICA7OworICAgIGkzODZ8aTY4NnxpODZwY3xhbWQ2NCkKKyAgICAgICAgaGF2ZT1OR1hfSEFWRV9OT05BTElHTkVEIC4gYXV0by9oYXZlCisgICAgOzsKIAogZXNhYwogCiAKIGlmIFsgIiROR1hfUExBVEZPUk0iICE9IHdpbjMyIF07IHRoZW4KIAotICAgICBOR1hfVVNFUj0ke05HWF9VU0VSOi1ub2JvZHl9CisgICAgTkdYX1VTRVI9JHtOR1hfVVNFUjotbm9ib2R5fQogCiAgICAgaWYgWyAteiAiJE5HWF9HUk9VUCIgLWEgJE5HWF9VU0VSID0gbm9ib2R5IF0gOyB0aGVuCiAgICAgICAgaWYgZ3JlcCBub2JvZHkgL2V0Yy9ncm91cCAyPiYxID4vZGV2L251bGw7IHRoZW4KZGlmZiAtLWdpdCBhL2F1dG8vb3MvZnJlZWJzZCBiL2F1dG8vb3MvZnJlZWJzZAppbmRleCAxMzNmNWY1Li5mOTE2ODYwIDEwMDY0NAotLS0gYS9hdXRvL29zL2ZyZWVic2QKKysrIGIvYXV0by9vcy9mcmVlYnNkCkBAIC0yLDE0ICsyLDcgQEAKICMgQ29weXJpZ2h0IChDKSBJZ29yIFN5c29ldgogCiAKLWNhdCA8PCBFTkQgPj4gJE5HWF9BVVRPX0hFQURFUlNfSAotCi0jaWZuZGVmIE5HWF9GUkVFQlNECi0jZGVmaW5lIE5HWF9GUkVFQlNEICAxCi0jZW5kaWYKLQotRU5ECi0KK2hhdmU9TkdYX0ZSRUVCU0QgLiBhdXRvL2hhdmVfaGVhZGVycwogCiBDT1JFX0lOQ1M9IiRVTklYX0lOQ1MiCiBDT1JFX0RFUFM9IiRVTklYX0RFUFMgJEZSRUVCU0RfREVQUyIKQEAgLTM5LDYgKzMyLDcgQEAKICAgICBlY2hvICIgKyBzZXRwcm9jdGl0bGUoKSBpbiBsaWJ1dGlsIgogCiAgICAgQ09SRV9MSUJTPSIkQ09SRV9MSUJTIC1sdXRpbCIKKyAgICBOR1hfU0VUUFJPQ1RJVExFX0xJQj0iLWx1dGlsIgogZmkKIAogIyBzZW5kZmlsZQpkaWZmIC0tZ2l0IGEvYXV0by9vcy9saW51eCBiL2F1dG8vb3MvbGludXgKaW5kZXggODRlNGY2Ni4uNTkyNjIxMSAxMDA2NDQKLS0tIGEvYXV0by9vcy9saW51eAorKysgYi9hdXRvL29zL2xpbnV4CkBAIC0yLDEzICsyLDcgQEAKICMgQ29weXJpZ2h0IChDKSBJZ29yIFN5c29ldgogCiAKLWNhdCA8PCBFTkQgPj4gJE5HWF9BVVRPX0hFQURFUlNfSAotCi0jaWZuZGVmIE5HWF9MSU5VWAotI2RlZmluZSBOR1hfTElOVVggIDEKLSNlbmRpZgotCi1FTkQKK2hhdmU9TkdYX0xJTlVYIC4gYXV0by9oYXZlX2hlYWRlcnMKIAogQ09SRV9JTkNTPSIkVU5JWF9JTkNTIgogQ09SRV9ERVBTPSIkVU5JWF9ERVBTICRMSU5VWF9ERVBTIgpkaWZmIC0tZ2l0IGEvYXV0by9vcy9zb2xhcmlzIGIvYXV0by9vcy9zb2xhcmlzCmluZGV4IDY3ZTBhOGUuLmNmN2ZjNmMgMTAwNjQ0Ci0tLSBhL2F1dG8vb3Mvc29sYXJpcworKysgYi9hdXRvL29zL3NvbGFyaXMKQEAgLTIsMTMgKzIsNyBAQAogIyBDb3B5cmlnaHQgKEMpIElnb3IgU3lzb2V2CiAKIAotY2F0IDw8IEVORCA+PiAkTkdYX0FVVE9fSEVBREVSU19ICi0KLSNpZm5kZWYgTkdYX1NPTEFSSVMKLSNkZWZpbmUgTkdYX1NPTEFSSVMgIDEKLSNlbmRpZgotCi1FTkQKK2hhdmU9TkdYX1NPTEFSSVMgLiBhdXRvL2hhdmVfaGVhZGVycwogCiBDT1JFX0lOQ1M9IiRVTklYX0lOQ1MiCiBDT1JFX0RFUFM9IiRVTklYX0RFUFMgJFNPTEFSSVNfREVQUyIKZGlmZiAtLWdpdCBhL2F1dG8vb3Mvd2luMzIgYi9hdXRvL29zL3dpbjMyCmluZGV4IDU1Njc1MzUuLmY2NWYyYzkgMTAwNjQ0Ci0tLSBhL2F1dG8vb3Mvd2luMzIKKysrIGIvYXV0by9vcy93aW4zMgpAQCAtMiwxNCArMiw3IEBACiAjIENvcHlyaWdodCAoQykgSWdvciBTeXNvZXYKIAogCi1jYXQgPDwgRU5EID4+ICROR1hfQVVUT19IRUFERVJTX0gKLQotI2lmbmRlZiBOR1hfV0lOMzIKLSNkZWZpbmUgTkdYX1dJTjMyICAxCi0jZW5kaWYKLQotRU5ECi0KK2hhdmU9TkdYX1dJTjMyIC4gYXV0by9oYXZlX2hlYWRlcnMKIAogQ09SRV9JTkNTPSIkV0lOMzJfSU5DUyIKIENPUkVfREVQUz0iJFdJTjMyX0RFUFMiCmRpZmYgLS1naXQgYS9hdXRvL3NvdXJjZXMgYi9hdXRvL3NvdXJjZXMKaW5kZXggMWEyYWJhZC4uZTU5N2Y5NyAxMDA2NDQKLS0tIGEvYXV0by9zb3VyY2VzCisrKyBiL2F1dG8vc291cmNlcwpAQCAtMTIwLDYgKzEyMCw3IEBACiAgICAgICAgICAgICBzcmMvb3MvdW5peC9uZ3hfY2hhbm5lbC5oIFwKICAgICAgICAgICAgIHNyYy9vcy91bml4L25neF9zaGFyZWQuaCBcCiAgICAgICAgICAgICBzcmMvb3MvdW5peC9uZ3hfcHJvY2Vzcy5oIFwKKyAgICAgICAgICAgIHNyYy9vcy91bml4L25neF9zZXRwcm9jdGl0bGUuaCBcCiAgICAgICAgICAgICBzcmMvb3MvdW5peC9uZ3hfYXRvbWljLmggXAogICAgICAgICAgICAgc3JjL29zL3VuaXgvbmd4X3RocmVhZC5oIFwKICAgICAgICAgICAgIHNyYy9vcy91bml4L25neF9zb2NrZXQuaCBcCkBAIC0yMjQsOSArMjI1LDExIEBACiBIVFRQX1dSSVRFX0ZJTFRFUl9NT0RVTEU9Im5neF9odHRwX3dyaXRlX2ZpbHRlcl9tb2R1bGUiCiBIVFRQX0hFQURFUl9GSUxURVJfTU9EVUxFPSJuZ3hfaHR0cF9oZWFkZXJfZmlsdGVyX21vZHVsZSIKIAorSFRUUF9QT1NUUE9ORV9GSUxURVJfTU9EVUxFPW5neF9odHRwX3Bvc3Rwb25lX2ZpbHRlcl9tb2R1bGUKK0hUVFBfQ09QWV9GSUxURVJfTU9EVUxFPW5neF9odHRwX2NvcHlfZmlsdGVyX21vZHVsZQorCiBIVFRQX0NIVU5LRURfRklMVEVSX01PRFVMRT1uZ3hfaHR0cF9jaHVua2VkX2ZpbHRlcl9tb2R1bGUKIEhUVFBfSEVBREVSU19GSUxURVJfTU9EVUxFPW5neF9odHRwX2hlYWRlcnNfZmlsdGVyX21vZHVsZQotSFRUUF9DT1BZX0ZJTFRFUl9NT0RVTEU9bmd4X2h0dHBfY29weV9maWx0ZXJfbW9kdWxlCiAKIEhUVFBfUkFOR0VfSEVBREVSX0ZJTFRFUl9NT0RVTEU9bmd4X2h0dHBfcmFuZ2VfaGVhZGVyX2ZpbHRlcl9tb2R1bGUKIEhUVFBfUkFOR0VfQk9EWV9GSUxURVJfTU9EVUxFPW5neF9odHRwX3JhbmdlX2JvZHlfZmlsdGVyX21vZHVsZQpAQCAtMjczLDYgKzI3Niw4IEBACiAjIFNUVUIKIEhUVFBfU1JDUz0iJEhUVFBfU1JDUyBzcmMvaHR0cC9uZ3hfaHR0cF9idXN5X2xvY2suYyIKIAorSFRQUF9QT1NUUE9ORV9GSUxURVJfU1JDUz1zcmMvaHR0cC9uZ3hfaHR0cF9wb3N0cG9uZV9maWx0ZXJfbW9kdWxlLmMKKwogSFRQUF9DQUNIRV9TUkNTPXNyYy9odHRwL25neF9odHRwX2NhY2hlLmMKIEhUUFBfRklMRV9DQUNIRV9TUkNTPXNyYy9odHRwL25neF9odHRwX2ZpbGVfY2FjaGUuYwogCkBAIC0zMjMsMTcgKzMyOCw3IEBACiAKIAogSFRUUF9QUk9YWV9NT0RVTEU9bmd4X2h0dHBfcHJveHlfbW9kdWxlCi0jSFRUUF9QUk9YWV9TUkNTPXNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcHJveHlfbW9kdWxlLmMKLQotSFRUUF9QUk9YWV9JTkNTPSJzcmMvaHR0cC9tb2R1bGVzL3Byb3h5IgotSFRUUF9QUk9YWV9ERVBTPXNyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfaGFuZGxlci5oCi1IVFRQX1BST1hZX1NSQ1M9InNyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfaGFuZGxlci5jIFwKLSAgICAgICAgICAgICAgICAgc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV91cHN0cmVhbS5jIFwKLSAgICAgICAgICAgICAgICAgc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9wYXJzZS5jIFwKLSAgICAgICAgICAgICAgICAgc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oZWFkZXIuYyIKLQotIyBTVFVCCi0jICAgICAgICAgICAgICAgICBzcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2NhY2hlLmMgXAorSFRUUF9QUk9YWV9TUkNTPXNyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcHJveHlfbW9kdWxlLmMKIAogCiBIVFRQX0ZBU1RDR0lfTU9EVUxFPW5neF9odHRwX2Zhc3RjZ2lfbW9kdWxlCmRpZmYgLS1naXQgYS9hdXRvL3VuaXggYi9hdXRvL3VuaXgKaW5kZXggMTEyNjI2ZC4uZTllMGM3YSAxMDA3NTUKLS0tIGEvYXV0by91bml4CisrKyBiL2F1dG8vdW5peApAQCAtNjQsNyArNjQsNyBAQAogbmd4X2ZlYXR1cmVfbmFtZT0iTkdYX0hBVkVfU0VUUFJPQ1RJVExFIgogbmd4X2ZlYXR1cmVfcnVuPW5vCiBuZ3hfZmVhdHVyZV9pbmNzPQotbmd4X2ZlYXR1cmVfbGlicz0KK25neF9mZWF0dXJlX2xpYnM9JE5HWF9TRVRQUk9DVElUTEVfTElCCiBuZ3hfZmVhdHVyZV90ZXN0PSJzZXRwcm9jdGl0bGUoXCJ0ZXN0XCIpOyIKIC4gYXV0by9mZWF0dXJlCiAKZGlmZiAtLWdpdCBhL2NvbmYvbWltZS50eXBlcyBiL2NvbmYvbWltZS50eXBlcwppbmRleCAzNzg1ZTUzLi42ZWYyNzc3IDEwMDY0NAotLS0gYS9jb25mL21pbWUudHlwZXMKKysrIGIvY29uZi9taW1lLnR5cGVzCkBAIC0xNyw2ICsxNyw3IEBACiAgICAgYXBwbGljYXRpb24veC1qYXZhc2NyaXB0ICAgICAgIGpzOwogICAgIGFwcGxpY2F0aW9uL3gtcmFyLWNvbXByZXNzZWQgICByYXI7CiAgICAgYXBwbGljYXRpb24veC14cGluc3RhbGwgICAgICAgIHhwaTsKKyAgICBhcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydCAgICAgZGVyIHBlbSBjcnQ7CiAKICAgICBhdWRpby9tcGVnICAgICAgICAgICAgICAgICAgICAgbXAzOwogICAgIGF1ZGlvL3gtcmVhbGF1ZGlvICAgICAgICAgICAgICByYTsKZGlmZiAtLWdpdCBhL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sIGIvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwKaW5kZXggOTQ0NGJhYy4uOTA5YjRjYiAxMDA2NDQKLS0tIGEvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwKKysrIGIvZG9jcy94bWwvbmdpbngvY2hhbmdlcy54bWwKQEAgLTksNiArOSwzMTkgQEAKIDx0aXRsZSBsYW5nPSJlbiI+bmdpbnggY2hhbmdlbG9nPC90aXRsZT4KIAogCis8Y2hhbmdlcyB2ZXI9IjAuMS4yOSIgZGF0ZT0iMTIuMDUuMjAwNSI+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivNz8TVzNggbmd4X2h0dHBfc3NpX21vZHVsZSDQz8TExdLWydfBxdQgy8/Nwc7E1SBpbmNsdWRlIHZpcnR1YWwuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgbmd4X2h0dHBfc3NpX21vZHVsZSBzdXBwb3J0cyAiaW5jbHVkZSB2aXJ0dWFsIiBjb21tYW5kLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivNz8TVzNggbmd4X2h0dHBfc3NpX21vZHVsZSDQz8TExdLWydfBxdQg1dPMz9fO1cAgy8/Nwc7E1SDXycTBCisnaWYgZXhwcj0iJE5BTUUiJyDJIMvPzcHOxNkgZWxzZSDJIGVuZGlmLgor5M/Q1dPLwcXU09Eg1M/M2MvPIM/Eyc4g1dLP18XO2CDXzM/Wxc7Oz9PUyS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSBuZ3hfaHR0cF9zc2lfbW9kdWxlIHN1cHBvcnRzIHRoZSBjb25kaXRpb24gY29tbWFuZCBsaWtlCisnaWYgZXhwcj0iJE5BTUUiJyBhbmQgImVsc2UiIGFuZCAiZW5kaWYiIGNvbW1hbmRzLgorT25seSBvbmUgbmVzdGVkIGxldmVsIGlzIHN1cHBvcnRlZC4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImZlYXR1cmUiPgorPHBhcmEgbGFuZz0icnUiPgorzc/E1czYIG5neF9odHRwX3NzaV9tb2R1bGUg0M/ExMXS1snXwcXUIMTXxSDQxdLFzcXOztnFIERBVEVfTE9DQUwgySBEQVRFX0dNVAorySDLz83BzsTVIGNvbmZpZyB0aW1lZm10LgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIG5neF9odHRwX3NzaV9tb2R1bGUgc3VwcG9ydHMgdGhlIERBVEVfTE9DQUwgYW5kIERBVEVfR01UIHZhcmlhYmxlcworYW5kICJjb25maWcgdGltZWZtdCIgY29tbWFuZC4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImZlYXR1cmUiPgorPHBhcmEgbGFuZz0icnUiPgorxMnSxcvUydfBIHNzaV9pZ25vcmVfcmVjeWNsZWRfYnVmZmVycy4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAic3NpX2lnbm9yZV9yZWN5Y2xlZF9idWZmZXJzIiBkaXJlY3RpdmUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgorxdPMySDQxdLFzcXOzsHRIFFVRVJZX1NUUklORyDOxSDC2czBIM/Q0sXExczFzsEsINTPINcgy8/Nwc7ExSBlY2hvCivOxSDT1MHXyczP09gg2s7B3sXOycUg0M8g1c3PzN7BzsnALgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICJlY2hvIiBjb21tYW5kIGRpZCBub3Qgc2hvdyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGVtcHR5IFFVRVJZX1NUUklORwordmFyaWFibGUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJjaGFuZ2UiPgorPHBhcmEgbGFuZz0icnUiPgorzc/E1czYIG5neF9odHRwX3Byb3h5X21vZHVsZSDQz8zOz9PU2MAg0MXSxdDJ08HOLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIG5neF9odHRwX3Byb3h5X21vZHVsZSB3YXMgcmV3cml0dGVuLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ19kgcHJveHlfcmVkaXJlY3QsIHByb3h5X3Bhc3NfcmVxdWVzdF9oZWFkZXJzLAorcHJveHlfcGFzc19yZXF1ZXN0X2JvZHkgySBwcm94eV9tZXRob2QuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgInByb3h5X3JlZGlyZWN0IiwgInByb3h5X3Bhc3NfcmVxdWVzdF9oZWFkZXJzIiwKKyJwcm94eV9wYXNzX3JlcXVlc3RfYm9keSIsIGFuZCAicHJveHlfbWV0aG9kIiBkaXJlY3RpdmVzLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ18EgcHJveHlfc2V0X2hlYWRlci4KK+TJ0sXL1MnXwSBwcm94eV94X3ZhciDV0NLB2sTOxc7BIMkgxM/M1s7BIMLZ1Ngg2sHNxc7FzsEgxMnSxcvUydfPygorcHJveHlfc2V0X2hlYWRlci4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAicHJveHlfc2V0X2hlYWRlciIgZGlyZWN0aXZlLgorVGhlICJwcm94eV94X3ZhciIgaXMgY2FuY2VsZWQgYW5kIG11c3QgYmUgcmVwbGFjZWQgd2l0aCB0aGUgcHJveHlfc2V0X2hlYWRlcgorZGlyZWN0aXZlLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iY2hhbmdlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK8TJ0sXL1MnXwSBwcm94eV9wcmVzZXJ2ZV9ob3N0INXQ0sHaxM7FzsEgySDEz8zWzsEgwtnU2CDawc3FzsXOwSDEydLFy9TJ18HNyQorInByb3h5X3NldF9oZWFkZXIgSG9zdCAkaG9zdCIgySAicHJveHlfcmVkaXJlY3Qgb2ZmIgoryczJIMTJ0sXL1MnXz8ogPG5vYnI+InByb3h5X3NldF9oZWFkZXIgSG9zdCAkaG9zdDokcHJveHlfcG9ydCI8L25vYnI+CivJINPPz9TXxdTT1NfVwN3JzckgxcogxMnSxcvUydfBzckgcHJveHlfcmVkaXJlY3QuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgInByb3h5X3ByZXNlcnZlX2hvc3QiIGlzIGNhbmNlbGVkIGFuZCBtdXN0IGJlIHJlcGxhY2VkIHdpdGgKK3RoZSAicHJveHlfc2V0X2hlYWRlciBIb3N0ICRob3N0IiBhbmQgdGhlICJwcm94eV9yZWRpcmVjdCBvZmYiIGRpcmVjdGl2ZXMsCit0aGUgPG5vYnI+InByb3h5X3NldF9oZWFkZXIgSG9zdCAkaG9zdDokcHJveHlfcG9ydCIgZGlyZWN0aXZlPC9ub2JyPgorYW5kIHRoZSBhcHByb3ByaWF0ZSBwcm94eV9yZWRpcmVjdCBkaXJlY3RpdmVzLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iY2hhbmdlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK8TJ0sXL1MnXwSBwcm94eV9zZXRfeF9yZWFsX2lwINXQ0sHaxM7FzsEgySDEz8zWzsEgwtnU2CDawc3FzsXOwSDEydLFy9TJ18/KCisicHJveHlfc2V0X2hlYWRlciBYLVJlYWwtSVAgJHJlbW90ZV9hZGRyIi4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAicHJveHlfc2V0X3hfcmVhbF9pcCIgaXMgY2FuY2VsZWQgYW5kIG11c3QgYmUgcmVwbGFjZWQgd2l0aAordGhlICJwcm94eV9zZXRfaGVhZGVyIFgtUmVhbC1JUCAkcmVtb3RlX2FkZHIiIGRpcmVjdGl2ZS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImNoYW5nZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ18EgcHJveHlfYWRkX3hfZm9yd2FyZGVkX2ZvciDV0NLB2sTOxc7BIMkgxM/M1s7BIMLZ1Ngg2sHNxc7FzsEKK8TJ0sXL1MnXz8oKKzxub2JyPiJwcm94eV9zZXRfaGVhZGVyIFgtRm9yd2FyZGVkLUZvciAkcHJveHlfYWRkX3hfZm9yd2FyZGVkX2ZvciIuPC9ub2JyPgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICJwcm94eV9hZGRfeF9mb3J3YXJkZWRfZm9yIiBpcyBjYW5jZWxlZCBhbmQgbXVzdCBiZSByZXBsYWNlZCB3aXRoCis8bm9icj50aGUgInByb3h5X3NldF9oZWFkZXIgWC1Gb3J3YXJkZWQtRm9yICRwcm94eV9hZGRfeF9mb3J3YXJkZWRfZm9yIjwvbm9icj4KK2RpcmVjdGl2ZS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImNoYW5nZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ18EgcHJveHlfc2V0X3hfdXJsINXQ0sHaxM7FzsEgySDEz8zWzsEgwtnU2CDawc3FzsXOwSDEydLFy9TJ18/KCis8bm9icj4icHJveHlfc2V0X2hlYWRlciBYLVVSTCBodHRwOi8vJGhvc3Q6JHNlcnZlcl9wb3J0JHJlcXVlc3RfdXJpIi48L25vYnI+Cis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgInByb3h5X3NldF94X3VybCIgaXMgY2FuY2VsZWQgYW5kIG11c3QgYmUgcmVwbGFjZWQgd2l0aAordGhlICJwcm94eV9zZXRfaGVhZGVyIFgtVVJMIGh0dHA6Ly8kaG9zdDokc2VydmVyX3BvcnQkcmVxdWVzdF91cmkiCitkaXJlY3RpdmUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK8TJ0sXL1MnXwSBmYXN0Y2dpX3BhcmFtLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICJmYXN0Y2dpX3BhcmFtIiBkaXJlY3RpdmUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJjaGFuZ2UiPgorPHBhcmEgbGFuZz0icnUiPgorxMnSxcvUydfZIGZhc3RjZ2lfc2V0X3ZhciDJIGZhc3RjZ2lfcGFyYW1zINXQ0sHaxM7FztkgySDEz8zWztkgwtnU2Aor2sHNxc7ZIMTJ0sXL1MnXwc3JIGZhc3RjZ2lfcGFyYW0uCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgImZhc3RjZ2lfc2V0X3ZhciIgYW5kICJmYXN0Y2dpX3BhcmFtcyIgZGlyZWN0aXZlIGFyZSBjYW5jZWxlZCBhbmQKK211c3QgYmUgcmVwbGFjZWQgd2l0aCB0aGUgZmFzdGNnaV9wYXJhbSBkaXJlY3RpdmVzLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ18EgaW5kZXggzc/WxdQgydPQz8zY2s/XwdTYINDF0sXNxc7O2cUuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgImluZGV4IiBkaXJlY3RpdmUgY2FuIHVzZSB0aGUgdmFyaWFibGVzLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivEydLFy9TJ18EgaW5kZXggzc/WxdQgwtnU2CDVy8Hawc7BIM7BINXSz9fOxSBodHRwIMkgc2VydmVyLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICJpbmRleCIgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIGF0IGh0dHAgYW5kIHNlcnZlciBsZXZlbHMuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJjaGFuZ2UiPgorPHBhcmEgbGFuZz0icnUiPgor1M/M2MvPINDP08zFxM7JyiDQwdLBzcXU0iDXIMTJ0sXL1MnXxSBpbmRleCDNz9bF1CDC2dTYIMHC08/MwNTO2c0uCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgbGFzdCBpbmRleCBvbmx5IGluIHRoZSAiaW5kZXgiIGRpcmVjdGl2ZSBjYW4gYmUgYWJzb2x1dGUuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJmZWF0dXJlIj4KKzxwYXJhIGxhbmc9InJ1Ij4KK9cgxMnSxcvUydfFIHJld3JpdGUgzc/H1dQgydPQz8zY2s/XwdTY09Eg0MXSxc3Fzs7ZxS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAicmV3cml0ZSIgZGlyZWN0aXZlIGNhbiB1c2UgdGhlIHZhcmlhYmxlcy4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImZlYXR1cmUiPgorPHBhcmEgbGFuZz0icnUiPgorxMnSxcvUydfBIGludGVybmFsLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICJpbnRlcm5hbCIgZGlyZWN0aXZlLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivQxdLFzcXOztnFIENPTlRFTlRfTEVOR1RILCBDT05URU5UX1RZUEUsIFJFTU9URV9QT1JULCBTRVJWRVJfQUREUiwKK1NFUlZFUl9QT1JULCBTRVJWRVJfUFJPVE9DT0wsIERPQ1VNRU5UX1JPT1QsIFNFUlZFUl9OQU1FLAorUkVRVUVTVF9NRVRIT0QsIFJFUVVFU1RfVVJJIMkgUkVNT1RFX1VTRVIuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgQ09OVEVOVF9MRU5HVEgsIENPTlRFTlRfVFlQRSwgUkVNT1RFX1BPUlQsIFNFUlZFUl9BRERSLAorU0VSVkVSX1BPUlQsIFNFUlZFUl9QUk9UT0NPTCwgRE9DVU1FTlRfUk9PVCwgU0VSVkVSX05BTUUsCitSRVFVRVNUX01FVEhPRCwgUkVRVUVTVF9VUkksIGFuZCBSRU1PVEVfVVNFUiB2YXJpYWJsZXMuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJjaGFuZ2UiPgorPHBhcmEgbGFuZz0icnUiPgorbmdpbngg1MXQxdLYINDF0sXEwaPUIM7F18XSztnFINPU0s/LySDXINrBx8/Mz9fLwcgg2sHQ0s/TwSDLzMnFztTBIMkKK8/U18XUwSDC3MvFzsTBLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgorbmdpbnggbm93IHBhc3NlcyB0aGUgaW52YWxpZCBsaW5lcyBpbiBhIGNsaWVudCByZXF1ZXN0IGhlYWRlcnMKK29yIGEgYmFja2VuZCByZXNwb25zZSBoZWFkZXIuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgorxdPMySDC3MvFzsQgxM/Mx88gzsUg0MXSxcTB18HMIM/U18XUIMkgc2VuZF90aW1lb3V0IMLZzCDNxc7Y28UsIN7FzQorcHJveHlfcmVhZF90aW1lb3V0LCDUzyDLzMnFztTVINfP2tfSwd3BzNPRIM/U18XUIDQwOC4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK2lmIHRoZSBiYWNrZW5kIGRpZCBub3QgdHJhbnNmZXIgcmVzcG9uc2UgZm9yIGEgbG9uZyB0aW1lIGFuZAordGhlICJzZW5kX3RpbWVvdXQiIHdhcyBsZXNzIHRoYW4gInByb3h5X3JlYWRfdGltZW91dCIsIHRoZW4gbmdpbngKK3JldHVybmVkIHRoZSA0MDggcmVzcG9uc2UuCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgorxdPMySDC3MvFzsQg0MXSxcTB18HMIM7F18XSztXAINPU0s/L1SDXINrBx8/Mz9fLxSDP1NfF1MEsINTPINDSz8nTyM/EycwKK3NlZ21lbnRhdGlvbiBmYXVsdDsKK8/bycLLwSDQz9HXyczB09gg1yAwLjEuMjYuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgc2VnbWVudGF0aW9uIGZhdWx0IHdhcyBvY2N1cnJlZCBpZiB0aGUgYmFja2VuZCBzZW50IGFuIGludmFsaWQgbGluZQoraW4gcmVzcG9uc2UgaGVhZGVyOworYnVnIGFwcGVhcmVkIGluIDAuMS4yNi4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CivQ0skgydPQz8zY2s/Xwc7JySDP1MvB2s/V09TPyt7J18/KIMvPzsbJx9XSwcPJySDXIEZhc3RDR0kgzc/HCivQ0s/J08jPxMnU2CBzZWdtZW50YXRpb24gZmF1bHQuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+Cit0aGUgc2VnbWVudGF0aW9uIGZhdWx0IG1heSBvY2N1cnJlZCBpbiBGYXN0Q0dJIGZhdWx0IHRvbGVyYW5jZSBjb25maWd1cmF0aW9uLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK8TJ0sXL1MnXwSBleHBpcmVzIM7FINXEwczRzMEg1dbFINXT1MHOz9fMxc7O2cUg09TSz8vJINrBx8/Mz9fLwQorIkV4cGlyZXMiIMkgIkNhY2hlLUNvbnRyb2wiLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICJleHBpcmVzIiBkaXJlY3RpdmUgZGlkIG5vdCByZW1vdmUgdGhlIHByZXZpb3VzICJFeHBpcmVzIiBhbmQKKyJDYWNoZS1Db250cm9sIiBoZWFkZXJzLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK25naW54IM7FINXeydTZ18HMINrB18XS28HA3dXAINTP3svVINcg09TSz8vFINrBx8/Mz9fLwSDawdDSz9PBICJIb3N0Ii4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK25naW54IGRpZCBub3QgdGFrZSBpbnRvIGFjY291bnQgdHJhaWxpbmcgZG90IGluICJIb3N0IiBoZWFkZXIgbGluZS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CivNz8TVzNggbmd4X2h0dHBfYXV0aF9tb2R1bGUgzsUg0sHCz9TBzCDOwSBMaW51eC4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSBuZ3hfaHR0cF9hdXRoX21vZHVsZSBkaWQgbm90IHdvcmsgdW5kZXIgTGludXguCis8L3BhcmE+Cis8L2NoYW5nZT4KKworPGNoYW5nZSB0eXBlPSJidWdmaXgiPgorPHBhcmEgbGFuZz0icnUiPgorxMnSxcvUydfBIHJld3JpdGUgzsXXxdLOzyDSwcLP1MHMwSwgxdPMySDXINrB0NLP08Ug0NLJ09XU09TXz9fBzMkgwdLH1c3FztTZLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIHJld3JpdGUgZGlyZWN0aXZlIHdvcmtlZCBpbmNvcnJlY3RseSwgaWYgdGhlIGFyZ3VtZW50cyB3ZXJlIGluIGEgcmVxdWVzdC4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CituZ2lueCDOxSDTz8LJ0sHM09EgzsEgTWFjT1MgWC4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK25naW54IGNvdWxkIG5vdCBiZSBidWlsdCBvbiBNYWNPUyBYLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzwvY2hhbmdlcz4KKworCiA8Y2hhbmdlcyB2ZXI9IjAuMS4yOCIgZGF0ZT0iMDguMDQuMjAwNSI+CiAKIDxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KQEAgLTU4Niw3ICs4OTksNyBAQAogCiA8Y2hhbmdlcyB2ZXI9IjAuMS4xNyIgZGF0ZT0iMDMuMDIuMjAwNSI+CiAKLTxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8Y2hhbmdlIHR5cGU9ImNoYW5nZSI+CiA8cGFyYSBsYW5nPSJydSI+CiDNz8TVzNggbmd4X2h0dHBfcmV3cml0ZV9tb2R1bGUg0M/Mzs/T1NjAINDF0sXQydPBzi4KIPTF0MXS2CDNz9bOzyDExczB1Ngg0sXEydLFy9TZLCDXz9rX0sHdwdTYIMvPxNkgz9vJws/LCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ2lueC5jIGIvc3JjL2NvcmUvbmdpbnguYwppbmRleCA5ZjIyMTEyLi5iYjZmMDkzIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ2lueC5jCisrKyBiL3NyYy9jb3JlL25naW54LmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogCiAKIG5neF9tb2R1bGVfdCAgbmd4X2NvcmVfbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X2NvcmVfbW9kdWxlX2N0eCwgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLwogICAgIG5neF9jb3JlX2NvbW1hbmRzLCAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0NPUkVfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25naW54LmggYi9zcmMvY29yZS9uZ2lueC5oCmluZGV4IDlmYTE0MWEuLjRkMjdhODcgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25naW54LmgKKysrIGIvc3JjL2NvcmUvbmdpbnguaApAQCAtOCw3ICs4LDcgQEAKICNkZWZpbmUgX05HSU5YX0hfSU5DTFVERURfCiAKIAotI2RlZmluZSBOR0lOWF9WRVIgICAgICAgICAgIm5naW54LzAuMS4yOCIKKyNkZWZpbmUgTkdJTlhfVkVSICAgICAgICAgICJuZ2lueC8wLjEuMjkiCiAKICNkZWZpbmUgTkdJTlhfVkFSICAgICAgICAgICJOR0lOWCIKICNkZWZpbmUgTkdYX05FV1BJRF9FWFQgICAgICIubmV3YmluIgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2FycmF5LmggYi9zcmMvY29yZS9uZ3hfYXJyYXkuaAppbmRleCA1Zjk3NDUxLi4wMDIwNmNiIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfYXJyYXkuaAorKysgYi9zcmMvY29yZS9uZ3hfYXJyYXkuaApAQCAtMzAsMTYgKzMwLDIxIEBACiBzdGF0aWMgbmd4X2lubGluZSBuZ3hfaW50X3QKIG5neF9hcnJheV9pbml0KG5neF9hcnJheV90ICphcnJheSwgbmd4X3Bvb2xfdCAqcG9vbCwgbmd4X3VpbnRfdCBuLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBhcnJheS0+ZWx0cyA9IG5neF9wYWxsb2MocG9vbCwgbiAqIHNpemUpOwotICAgIGlmIChhcnJheS0+ZWx0cyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgfQorICAgIC8qCisgICAgICogc2V0ICJhcnJheS0+bmVsdHMiIGJlZm9yZSAiYXJyYXktPmVsdHMiLCBvdGhlcndpc2UgTVNWQyB0aGlua3MKKyAgICAgKiB0aGF0ICJhcnJheS0+bmVsdHMiIG1heSBiZSB1c2VkIHdpdGhvdXQgaGF2aW5nIGJlZW4gaW5pdGlhbGl6ZWQKKyAgICAgKi8KIAogICAgIGFycmF5LT5uZWx0cyA9IDA7CiAgICAgYXJyYXktPnNpemUgPSBzaXplOwogICAgIGFycmF5LT5uYWxsb2MgPSBuOwogICAgIGFycmF5LT5wb29sID0gcG9vbDsKIAorICAgIGFycmF5LT5lbHRzID0gbmd4X3BhbGxvYyhwb29sLCBuICogc2l6ZSk7CisgICAgaWYgKGFycmF5LT5lbHRzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKICAgICByZXR1cm4gTkdYX09LOwogfQogCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfYnVmLmMgYi9zcmMvY29yZS9uZ3hfYnVmLmMKaW5kZXggNGMxYjFkNS4uYjdmNTk3ZCAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2J1Zi5jCisrKyBiL3NyYy9jb3JlL25neF9idWYuYwpAQCAtMzEsNyArMzEsNyBAQAogICAgICAqICAgICBiLT5maWxlID0gTlVMTDsKICAgICAgKiAgICAgYi0+c2hhZG93ID0gTlVMTDsKICAgICAgKiAgICAgYi0+dGFnID0gMDsKLSAgICAgKgorICAgICAqICAgICBhbmQgZmxhZ3MKICAgICAgKi8KIAogICAgIGItPnBvcyA9IGItPnN0YXJ0OwpAQCAtOTQsNiArOTQsNyBAQAogICAgICAgICAgKiAgICAgYi0+ZmlsZSA9IE5VTEw7CiAgICAgICAgICAqICAgICBiLT5zaGFkb3cgPSBOVUxMOwogICAgICAgICAgKiAgICAgYi0+dGFnID0gMDsKKyAgICAgICAgICogICAgIGFuZCBmbGFncwogICAgICAgICAgKgogICAgICAgICAgKi8KIApkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2J1Zi5oIGIvc3JjL2NvcmUvbmd4X2J1Zi5oCmluZGV4IDk2Mzk0ZjkuLjQ3MWFiMTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9idWYuaAorKysgYi9zcmMvY29yZS9uZ3hfYnVmLmgKQEAgLTQ0LDcgKzQ0LDkgQEAKICAgICB1bnNpZ25lZCAgICAgICAgIHJlY3ljbGVkOjE7CiAgICAgdW5zaWduZWQgICAgICAgICBpbl9maWxlOjE7CiAgICAgdW5zaWduZWQgICAgICAgICBmbHVzaDoxOworICAgIHVuc2lnbmVkICAgICAgICAgc3luYzoxOwogICAgIHVuc2lnbmVkICAgICAgICAgbGFzdF9idWY6MTsKKyAgICB1bnNpZ25lZCAgICAgICAgIGxhc3RfaW5fY2hhaW46MTsKIAogICAgIHVuc2lnbmVkICAgICAgICAgbGFzdF9zaGFkb3c6MTsKICAgICB1bnNpZ25lZCAgICAgICAgIHRlbXBfZmlsZToxOwpAQCAtMTA0LDcgKzEwNiw4IEBACiAjZGVmaW5lIG5neF9idWZfaW5fbWVtb3J5KGIpICAgICAgICAoYi0+dGVtcG9yYXJ5IHx8IGItPm1lbW9yeSB8fCBiLT5tbWFwKQogI2RlZmluZSBuZ3hfYnVmX2luX21lbW9yeV9vbmx5KGIpICAgKG5neF9idWZfaW5fbWVtb3J5KGIpICYmICFiLT5pbl9maWxlKQogI2RlZmluZSBuZ3hfYnVmX3NwZWNpYWwoYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKChiLT5mbHVzaCB8fCBiLT5sYXN0X2J1ZikgJiYgIW5neF9idWZfaW5fbWVtb3J5KGIpICYmICFiLT5pbl9maWxlKQorICAgICgoYi0+Zmx1c2ggfHwgYi0+bGFzdF9idWYgfHwgYi0+c3luYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICYmICFuZ3hfYnVmX2luX21lbW9yeShiKSAmJiAhYi0+aW5fZmlsZSkKIAogI2RlZmluZSBuZ3hfYnVmX3NpemUoYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgKG5neF9idWZfaW5fbWVtb3J5KGIpID8gKG9mZl90KSAoYi0+bGFzdCAtIGItPnBvcyk6ICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9jb25mX2ZpbGUuYyBiL3NyYy9jb3JlL25neF9jb25mX2ZpbGUuYwppbmRleCAzNWVlOGI4Li5iOWIyMjAwIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfY29uZl9maWxlLmMKKysrIGIvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5jCkBAIC0yNyw3ICsyNyw3IEBACiAKIAogbmd4X21vZHVsZV90ICBuZ3hfY29uZl9tb2R1bGUgPSB7Ci0gICAgTkdYX01PRFVMRSwKKyAgICBOR1hfTU9EVUxFX1YxLAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBjb250ZXh0ICovCiAgICAgbmd4X2NvbmZfY29tbWFuZHMsICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KICAgICBOR1hfQ09ORl9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgdHlwZSAqLwpAQCAtMzM2LDcgKzMzNiw3IEBACiB7CiAgICAgdV9jaGFyICAgICAgKnN0YXJ0LCBjaCwgKnNyYywgKmRzdDsKICAgICBpbnQgICAgICAgICAgbGVuOwotICAgIGludCAgICAgICAgICBmb3VuZCwgbmVlZF9zcGFjZSwgbGFzdF9zcGFjZSwgc2hhcnBfY29tbWVudDsKKyAgICBpbnQgICAgICAgICAgZm91bmQsIG5lZWRfc3BhY2UsIGxhc3Rfc3BhY2UsIHNoYXJwX2NvbW1lbnQsIHZhcmlhYmxlOwogICAgIGludCAgICAgICAgICBxdW90ZWQsIHNfcXVvdGVkLCBkX3F1b3RlZDsKICAgICBzc2l6ZV90ICAgICAgbjsKICAgICBuZ3hfc3RyX3QgICAqd29yZDsKQEAgLTM0Niw2ICszNDYsNyBAQAogICAgIG5lZWRfc3BhY2UgPSAwOwogICAgIGxhc3Rfc3BhY2UgPSAxOwogICAgIHNoYXJwX2NvbW1lbnQgPSAwOworICAgIHZhcmlhYmxlID0gMDsKICAgICBxdW90ZWQgPSBzX3F1b3RlZCA9IGRfcXVvdGVkID0gMDsKIAogICAgIGNmLT5hcmdzLT5uZWx0cyA9IDA7CkBAIC00OTIsMTEgKzQ5MywyMiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoY2ggPT0gJ3snICYmIHZhcmlhYmxlKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhcmlhYmxlID0gMDsKKwogICAgICAgICAgICAgaWYgKGNoID09ICdcXCcpIHsKICAgICAgICAgICAgICAgICBxdW90ZWQgPSAxOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoY2ggPT0gJyQnKSB7CisgICAgICAgICAgICAgICAgdmFyaWFibGUgPSAxOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoZF9xdW90ZWQpIHsKICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJyInKSB7CiAgICAgICAgICAgICAgICAgICAgIGRfcXVvdGVkID0gMDsKQEAgLTgwMiw2ICs4MTQsNDUgQEAKIAogCiBjaGFyICoKK25neF9jb25mX3NldF90YWJsZV9lbHRfc2xvdChuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQoreworICAgIGNoYXIgICpwID0gY29uZjsKKworICAgIG5neF9zdHJfdCAgICAgICAgICp2YWx1ZTsKKyAgICBuZ3hfYXJyYXlfdCAgICAgICoqYTsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAqZWx0OworICAgIG5neF9jb25mX3Bvc3RfdCAgICpwb3N0OworCisgICAgYSA9IChuZ3hfYXJyYXlfdCAqKikgKHAgKyBjbWQtPm9mZnNldCk7CisKKyAgICBpZiAoKmEgPT0gTlVMTCkgeworICAgICAgICAqYSA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDQsIHNpemVvZihuZ3hfdGFibGVfZWx0X3QpKTsKKyAgICAgICAgaWYgKCphID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVsdCA9IG5neF9hcnJheV9wdXNoKCphKTsKKyAgICBpZiAoZWx0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7CisKKyAgICBlbHQtPmhhc2ggPSAwOworICAgIGVsdC0+a2V5ID0gdmFsdWVbMV07CisgICAgZWx0LT52YWx1ZSA9IHZhbHVlWzJdOworCisgICAgaWYgKGNtZC0+cG9zdCkgeworICAgICAgICBwb3N0ID0gY21kLT5wb3N0OworICAgICAgICByZXR1cm4gcG9zdC0+cG9zdF9oYW5kbGVyKGNmLCBwb3N0LCBlbHQpOworICAgIH0KKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KKworCitjaGFyICoKIG5neF9jb25mX3NldF9udW1fc2xvdChuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQogewogICAgIGNoYXIgICpwID0gY29uZjsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9jb25mX2ZpbGUuaCBiL3NyYy9jb3JlL25neF9jb25mX2ZpbGUuaAppbmRleCA0ZmFiOGMxLi44OTlmMDQ2IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfY29uZl9maWxlLmgKKysrIGIvc3JjL2NvcmUvbmd4X2NvbmZfZmlsZS5oCkBAIC02Myw3ICs2Myw3IEBACiAjZGVmaW5lIE5HWF9DT05GX0JMT0NLX0RPTkUgIDIKICNkZWZpbmUgTkdYX0NPTkZfRklMRV9ET05FICAgMwogCi0jZGVmaW5lIE5HWF9NT0RVTEUgICAgICAgICAgIDAsIDAKKyNkZWZpbmUgTkdYX01PRFVMRV9WMSAgICAgICAgMCwgMCwgMSwgMCwgMAogCiAjZGVmaW5lIE5HWF9DT1JFX01PRFVMRSAgICAgIDB4NDU1MjRGNDMgIC8qICJDT1JFIiAqLwogI2RlZmluZSBOR1hfQ09ORl9NT0RVTEUgICAgICAweDQ2NEU0RjQzICAvKiAiQ09ORiIgKi8KQEAgLTEwMCw2ICsxMDAsMTAgQEAKIHN0cnVjdCBuZ3hfbW9kdWxlX3MgewogICAgIG5neF91aW50X3QgICAgICAgICAgICBjdHhfaW5kZXg7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgIGluZGV4OworICAgIG5neF91aW50X3QgICAgICAgICAgICB2ZXJzaW9uOworICAgIG5neF91aW50X3QgICAgICAgICAgICBzcGFyZTA7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgIHNwYXJlMTsKKwogICAgIHZvaWQgICAgICAgICAgICAgICAgICpjdHg7CiAgICAgbmd4X2NvbW1hbmRfdCAgICAgICAgKmNvbW1hbmRzOwogICAgIG5neF91aW50X3QgICAgICAgICAgICB0eXBlOwpAQCAtMjgwLDYgKzI4NCw4IEBACiAKIGNoYXIgKm5neF9jb25mX3NldF9mbGFnX3Nsb3Qobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZik7CiBjaGFyICpuZ3hfY29uZl9zZXRfc3RyX3Nsb3Qobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZik7CitjaGFyICpuZ3hfY29uZl9zZXRfdGFibGVfZWx0X3Nsb3Qobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKKyAgICB2b2lkICpjb25mKTsKIGNoYXIgKm5neF9jb25mX3NldF9udW1fc2xvdChuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKTsKIGNoYXIgKm5neF9jb25mX3NldF9zaXplX3Nsb3Qobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZik7CiBjaGFyICpuZ3hfY29uZl9zZXRfbXNlY19zbG90KG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2N5Y2xlLmMgYi9zcmMvY29yZS9uZ3hfY3ljbGUuYwppbmRleCA1MTA0MjA1Li5lYWViZGIwIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfY3ljbGUuYworKysgYi9zcmMvY29yZS9uZ3hfY3ljbGUuYwpAQCAtNTE3LDcgKzUxNyw3IEBACiAgICAgICAgIG5neF9vbGRfY3ljbGVzLm5hbGxvYyA9IG47CiAgICAgICAgIG5neF9vbGRfY3ljbGVzLnBvb2wgPSBuZ3hfdGVtcF9wb29sOwogCi0gICAgICAgIG5neF9jbGVhbmVyX2V2ZW50LmV2ZW50X2hhbmRsZXIgPSBuZ3hfY2xlYW5fb2xkX2N5Y2xlczsKKyAgICAgICAgbmd4X2NsZWFuZXJfZXZlbnQuaGFuZGxlciA9IG5neF9jbGVhbl9vbGRfY3ljbGVzOwogICAgICAgICBuZ3hfY2xlYW5lcl9ldmVudC5sb2cgPSBjeWNsZS0+bG9nOwogICAgICAgICBuZ3hfY2xlYW5lcl9ldmVudC5kYXRhID0gJmR1bWI7CiAgICAgICAgIGR1bWIuZmQgPSAobmd4X3NvY2tldF90KSAtMTsKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9maWxlLmMgYi9zcmMvY29yZS9uZ3hfZmlsZS5jCmluZGV4IDZmZTA0ZTcuLjQ2ZDJlMGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9maWxlLmMKKysrIGIvc3JjL2NvcmUvbmd4X2ZpbGUuYwpAQCAtMzgsOCArMzgsMTAgQEAKIG5neF9jcmVhdGVfdGVtcF9maWxlKG5neF9maWxlX3QgKmZpbGUsIG5neF9wYXRoX3QgKnBhdGgsIG5neF9wb29sX3QgKnBvb2wsCiAgICAgaW50IHBlcnNpc3RlbnQpCiB7Ci0gICAgbmd4X2Vycl90ICAgICAgICAgICBlcnI7Ci0gICAgbmd4X2F0b21pY191aW50X3QgICBuOworICAgIG5neF9lcnJfdCAgICAgICAgICAgICAgICAgZXJyOworICAgIG5neF9hdG9taWNfdWludF90ICAgICAgICAgbjsKKyAgICBuZ3hfcG9vbF9jbGVhbnVwX2ZpbGVfdCAgKmNsbjsKKwogCiAgICAgZmlsZS0+bmFtZS5sZW4gPSBwYXRoLT5uYW1lLmxlbiArIDEgKyBwYXRoLT5sZW4gKyBOR1hfQVRPTUlDX1RfTEVOOwogCkBAIC03NCw2ICs3NiwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAidGVtcCBmZDolZCIsIGZpbGUtPmZkKTsKIAogICAgICAgICBpZiAoZmlsZS0+ZmQgIT0gTkdYX0lOVkFMSURfRklMRSkgeworICAgICAgICAgICAgY2xuID0gbmd4X3BhbGxvYyhwb29sLCBzaXplb2Yobmd4X3Bvb2xfY2xlYW51cF9maWxlX3QpKTsKKyAgICAgICAgICAgIGlmIChjbG4gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbG4tPmZkID0gZmlsZS0+ZmQ7CisgICAgICAgICAgICBjbG4tPm5hbWUgPSBmaWxlLT5uYW1lLmRhdGE7CisgICAgICAgICAgICBjbG4tPmxvZyA9IHBvb2wtPmxvZzsKKworICAgICAgICAgICAgaWYgKG5neF9wb29sX2NsZWFudXBfYWRkKHBvb2wsIG5neF9wb29sX2NsZWFudXBfZmlsZSwgY2xuKSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHJldHVybiBOR1hfT0s7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2hhc2guYyBiL3NyYy9jb3JlL25neF9oYXNoLmMKaW5kZXggMmMwNjJiNy4uNmI3NWZhNSAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2hhc2guYworKysgYi9zcmMvY29yZS9uZ3hfaGFzaC5jCkBAIC05LDExICs5LDIwIEBACiAKIAogbmd4X2ludF90Ci1uZ3hfaGFzaF9pbml0KG5neF9oYXNoX3QgKmhhc2gsIG5neF9wb29sX3QgKnBvb2wsIHZvaWQgKm5hbWVzKQorbmd4X2hhc2hfaW5pdChuZ3hfaGFzaF90ICpoYXNoLCBuZ3hfcG9vbF90ICpwb29sLCB2b2lkICpuYW1lcywgbmd4X3VpbnRfdCBuZWx0cykKIHsKICAgICB1X2NoYXIgICAgICAqcDsKLSAgICBuZ3hfc3RyX3QgICAqbiwgKmJ1Y2tldDsKLSAgICBuZ3hfdWludF90ICAgaSwga2V5LCBzaXplLCBiZXN0LCAqdGVzdCwgYnVja2V0cywgbWluX2J1Y2tldHM7CisgICAgbmd4X3N0cl90ICAgKm5hbWUsICpidWNrZXQ7CisgICAgbmd4X3VpbnRfdCAgIGksIG4sIGtleSwgc2l6ZSwgYmVzdCwgKnRlc3QsIGJ1Y2tldHMsIG1pbl9idWNrZXRzOworCisgICAgaWYgKG5lbHRzID09IDApIHsKKyAgICAgICAgZm9yIChuYW1lID0gKG5neF9zdHJfdCAqKSBuYW1lczsKKyAgICAgICAgICAgICBuYW1lLT5sZW47CisgICAgICAgICAgICAgbmFtZSA9IChuZ3hfc3RyX3QgKikgKChjaGFyICopIG5hbWUgKyBoYXNoLT5idWNrZXRfc2l6ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5lbHRzKys7CisgICAgICAgIH0KKyAgICB9CiAKICAgICB0ZXN0ID0gbmd4X2FsbG9jKGhhc2gtPm1heF9zaXplICogc2l6ZW9mKG5neF91aW50X3QpLCBwb29sLT5sb2cpOwogICAgIGlmICh0ZXN0ID09IE5VTEwpIHsKQEAgLTM0LDE0ICs0MywxNCBAQAogICAgICAgICAgICAgdGVzdFtpXSA9IDA7CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKG4gPSAobmd4X3N0cl90ICopIG5hbWVzOwotICAgICAgICAgICAgIG4tPmxlbjsKLSAgICAgICAgICAgICBuID0gKG5neF9zdHJfdCAqKSAoKGNoYXIgKikgbiArIGhhc2gtPmJ1Y2tldF9zaXplKSkKKyAgICAgICAgZm9yIChuID0gMCwgbmFtZSA9IChuZ3hfc3RyX3QgKikgbmFtZXM7CisgICAgICAgICAgICAgbiA8IG5lbHRzOworICAgICAgICAgICAgIG4rKywgbmFtZSA9IChuZ3hfc3RyX3QgKikgKChjaGFyICopIG5hbWUgKyBoYXNoLT5idWNrZXRfc2l6ZSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGtleSA9IDA7CiAKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuLT5sZW47IGkrKykgewotICAgICAgICAgICAgICAgIGtleSArPSBuZ3hfdG9sb3dlcihuLT5kYXRhW2ldKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYW1lLT5sZW47IGkrKykgeworICAgICAgICAgICAgICAgIGtleSArPSBuZ3hfdG9sb3dlcihuYW1lLT5kYXRhW2ldKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAga2V5ICU9IHNpemU7CkBAIC01Nyw3ICs2Niw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobi0+bGVuID09IDApIHsKKyAgICAgICAgaWYgKG4gPT0gbmVsdHMpIHsKICAgICAgICAgICAgIGlmIChtaW5fYnVja2V0cyA+IGJ1Y2tldHMpIHsKICAgICAgICAgICAgICAgICBtaW5fYnVja2V0cyA9IGJ1Y2tldHM7CiAgICAgICAgICAgICAgICAgYmVzdCA9IHNpemU7CkBAIC05MSwxNCArMTAwLDE0IEBACiAgICAgICAgICAgICB0ZXN0W2ldID0gMDsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAobiA9IChuZ3hfc3RyX3QgKikgbmFtZXM7Ci0gICAgICAgICAgICAgbi0+bGVuOwotICAgICAgICAgICAgIG4gPSAobmd4X3N0cl90ICopICgoY2hhciAqKSBuICsgaGFzaC0+YnVja2V0X3NpemUpKQorICAgICAgICBmb3IgKG4gPSAwLCBuYW1lID0gKG5neF9zdHJfdCAqKSBuYW1lczsKKyAgICAgICAgICAgICBuIDwgbmVsdHM7CisgICAgICAgICAgICAgbisrLCBuYW1lID0gKG5neF9zdHJfdCAqKSAoKGNoYXIgKikgbmFtZSArIGhhc2gtPmJ1Y2tldF9zaXplKSkKICAgICAgICAgewogICAgICAgICAgICAga2V5ID0gMDsKIAotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG4tPmxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAga2V5ICs9IG5neF90b2xvd2VyKG4tPmRhdGFbaV0pOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5hbWUtPmxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAga2V5ICs9IG5neF90b2xvd2VyKG5hbWUtPmRhdGFbaV0pOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBrZXkgJT0gYmVzdDsKQEAgLTEyMiwyMSArMTMxLDIxIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBmb3IgKG4gPSAobmd4X3N0cl90ICopIG5hbWVzOwotICAgICAgICAgbi0+bGVuOwotICAgICAgICAgbiA9IChuZ3hfc3RyX3QgKikgKChjaGFyICopIG4gKyBoYXNoLT5idWNrZXRfc2l6ZSkpCisgICAgZm9yIChuID0gMCwgbmFtZSA9IChuZ3hfc3RyX3QgKikgbmFtZXM7CisgICAgICAgICBuIDwgbmVsdHM7CisgICAgICAgICBuKyssIG5hbWUgPSAobmd4X3N0cl90ICopICgoY2hhciAqKSBuYW1lICsgaGFzaC0+YnVja2V0X3NpemUpKQogICAgIHsKICAgICAgICAga2V5ID0gMDsKIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbi0+bGVuOyBpKyspIHsKLSAgICAgICAgICAgIGtleSArPSBuZ3hfdG9sb3dlcihuLT5kYXRhW2ldKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5hbWUtPmxlbjsgaSsrKSB7CisgICAgICAgICAgICBrZXkgKz0gbmd4X3RvbG93ZXIobmFtZS0+ZGF0YVtpXSk7CiAgICAgICAgIH0KIAogICAgICAgICBrZXkgJT0gYmVzdDsKIAogICAgICAgICBpZiAoaGFzaC0+YnVja2V0X2xpbWl0ID09IDEpIHsKICAgICAgICAgICAgIHAgPSAodV9jaGFyICopIGhhc2gtPmJ1Y2tldHMgKyBrZXkgKiBoYXNoLT5idWNrZXRfc2l6ZTsKLSAgICAgICAgICAgIG5neF9tZW1jcHkocCwgbiwgaGFzaC0+YnVja2V0X3NpemUpOworICAgICAgICAgICAgbmd4X21lbWNweShwLCBuYW1lLCBoYXNoLT5idWNrZXRfc2l6ZSk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCkBAIC0xNDcsNyArMTU2LDcgQEAKICAgICAgICAgICAgIGJ1Y2tldC0+bGVuICY9IDB4N2ZmZmZmZmY7CiAgICAgICAgIH0KIAotICAgICAgICBuZ3hfbWVtY3B5KGJ1Y2tldCwgbiwgaGFzaC0+YnVja2V0X3NpemUpOworICAgICAgICBuZ3hfbWVtY3B5KGJ1Y2tldCwgbmFtZSwgaGFzaC0+YnVja2V0X3NpemUpOwogICAgICAgICBidWNrZXQtPmxlbiB8PSAweDgwMDAwMDAwOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2hhc2guaCBiL3NyYy9jb3JlL25neF9oYXNoLmgKaW5kZXggNWE0YmY1Zi4uZTk5MTI1NyAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X2hhc2guaAorKysgYi9zcmMvY29yZS9uZ3hfaGFzaC5oCkBAIC0zMSw3ICszMSw4IEBACiB9IG5neF90YWJsZV9lbHRfdDsKIAogCi1uZ3hfaW50X3Qgbmd4X2hhc2hfaW5pdChuZ3hfaGFzaF90ICpoYXNoLCBuZ3hfcG9vbF90ICpwb29sLCB2b2lkICpuYW1lcyk7CituZ3hfaW50X3Qgbmd4X2hhc2hfaW5pdChuZ3hfaGFzaF90ICpoYXNoLCBuZ3hfcG9vbF90ICpwb29sLCB2b2lkICpuYW1lcywKKyAgICBuZ3hfdWludF90IG5lbHRzKTsKIAogCiAjZW5kaWYgLyogX05HWF9IQVNIX0hfSU5DTFVERURfICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfaW5ldC5jIGIvc3JjL2NvcmUvbmd4X2luZXQuYwppbmRleCA2Y2FkMDUzLi4xYWU3ODI5IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfaW5ldC5jCisrKyBiL3NyYy9jb3JlL25neF9pbmV0LmMKQEAgLTIxLDcgKzIxLDggQEAKICAqLwogCiAKLXN0YXRpYyBuZ3hfaW5saW5lIHNpemVfdCBuZ3hfc3ByaW50X3VjaGFyKHVfY2hhciAqdGV4dCwgdV9jaGFyIGMsIHNpemVfdCBsZW4pCitzdGF0aWMKK25neF9pbmxpbmUgc2l6ZV90IG5neF9zcHJpbnRfdWNoYXIodV9jaGFyICp0ZXh0LCB1X2NoYXIgYywgc2l6ZV90IGxlbikKIHsKICAgICBzaXplX3QgICAgICBuOwogICAgIG5neF91aW50X3QgIGMxLCBjMjsKQEAgLTY1LDggKzY2LDggQEAKIAogLyogQUZfSU5FVCBvbmx5ICovCiAKLXNpemVfdCBuZ3hfc29ja19udG9wKGludCBmYW1pbHksIHN0cnVjdCBzb2NrYWRkciAqc2EsIHVfY2hhciAqdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pCitzaXplX3QKK25neF9zb2NrX250b3AoaW50IGZhbWlseSwgc3RydWN0IHNvY2thZGRyICpzYSwgdV9jaGFyICp0ZXh0LCBzaXplX3QgbGVuKQogewogICAgIHVfY2hhciAgICAgICAgICAgICAgKnA7CiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgbjsKQEAgLTExOSw3ICsxMjAsOCBAQAogICAgIHJldHVybiBuOwogfQogCi1zaXplX3Qgbmd4X2luZXRfbnRvcChpbnQgZmFtaWx5LCB2b2lkICphZGRyLCB1X2NoYXIgKnRleHQsIHNpemVfdCBsZW4pCitzaXplX3QKK25neF9pbmV0X250b3AoaW50IGZhbWlseSwgdm9pZCAqYWRkciwgdV9jaGFyICp0ZXh0LCBzaXplX3QgbGVuKQogewogICAgIHVfY2hhciAgICAgICpwOwogICAgIHNpemVfdCAgICAgICBuOwpAQCAtMTczLDcgKzE3NSw4IEBACiAKIC8qIEFGX0lORVQgb25seSAqLwogCi1uZ3hfaW50X3Qgbmd4X3B0b2NpZHIobmd4X3N0cl90ICp0ZXh0LCB2b2lkICpjaWRyKQorbmd4X2ludF90CituZ3hfcHRvY2lkcihuZ3hfc3RyX3QgKnRleHQsIHZvaWQgKmNpZHIpCiB7CiAgICAgbmd4X2ludF90ICAgICAgICAgbTsKICAgICBuZ3hfdWludF90ICAgICAgICBpOwpAQCAtMjE3LDcgKzIyMCw4IEBACiB9CiAKIAotbmd4X3BlZXJzX3QgKm5neF9pbmV0X3Vwc3RyZWFtX3BhcnNlKG5neF9jb25mX3QgKmNmLCBuZ3hfaW5ldF91cHN0cmVhbV90ICp1KQorbmd4X3BlZXJzX3QgKgorbmd4X2luZXRfdXBzdHJlYW1fcGFyc2Uobmd4X2NvbmZfdCAqY2YsIG5neF9pbmV0X3Vwc3RyZWFtX3QgKnUpCiB7CiAgICAgY2hhciAgICAgICAgICAgICAgICAqZXJyOwogICAgIHVfY2hhciAgICAgICAgICAgICAgKmhvc3Q7CkBAIC0zOTIsNyArMzk2LDggQEAKIH0KIAogCi1jaGFyICpuZ3hfaW5ldF9wYXJzZV9ob3N0X3BvcnQobmd4X2luZXRfdXBzdHJlYW1fdCAqdSkKK2NoYXIgKgorbmd4X2luZXRfcGFyc2VfaG9zdF9wb3J0KG5neF9pbmV0X3Vwc3RyZWFtX3QgKnUpCiB7CiAgICAgc2l6ZV90ICAgICAgaTsKICAgICBuZ3hfaW50X3QgICBwb3J0OwpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X2xvZy5jIGIvc3JjL2NvcmUvbmd4X2xvZy5jCmluZGV4IDE4MWQwNTkuLjI3ODI1ODIgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF9sb2cuYworKysgYi9zcmMvY29yZS9uZ3hfbG9nLmMKQEAgLTMzLDcgKzMzLDcgQEAKIAogCiBuZ3hfbW9kdWxlX3QgIG5neF9lcnJsb2dfbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X2VycmxvZ19tb2R1bGVfY3R4LCAgICAgICAgICAgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLwogICAgIG5neF9lcnJsb2dfY29tbWFuZHMsICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0NPUkVfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9vdXRwdXRfY2hhaW4uYyBiL3NyYy9jb3JlL25neF9vdXRwdXRfY2hhaW4uYwppbmRleCBmYzhhMGJmLi5lNGE4NzIzIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfb3V0cHV0X2NoYWluLmMKKysrIGIvc3JjL2NvcmUvbmd4X291dHB1dF9jaGFpbi5jCkBAIC00OSw3ICs0OSw3IEBACiAjaWYgKE5HWF9TRU5ERklMRV9MSU1JVCkKICAgICAgICAgICAgICYmICEoaW4tPmJ1Zi0+aW5fZmlsZSAmJiBpbi0+YnVmLT5maWxlX2xhc3QgPiBOR1hfU0VOREZJTEVfTElNSVQpCiAjZW5kaWYKLSAgICAgICAgICAgICYmICghbmd4X291dHB1dF9jaGFpbl9uZWVkX3RvX2NvcHkoY3R4LCBpbi0+YnVmKSkpCisgICAgICAgICAgICAmJiAhbmd4X291dHB1dF9jaGFpbl9uZWVkX3RvX2NvcHkoY3R4LCBpbi0+YnVmKSkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGN0eC0+b3V0cHV0X2ZpbHRlcihjdHgtPmZpbHRlcl9jdHgsIGluKTsKICAgICAgICAgfQpAQCAtMTMyLDcgKzEzMiw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGN0eC0+YnVmcy5zaXplOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChjdHgtPmluLT5idWYtPmxhc3RfYnVmKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdHgtPmluLT5idWYtPmxhc3RfaW5fY2hhaW4pIHsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJzaXplIDwgKG9mZl90KSBjdHgtPmJ1ZnMuc2l6ZSkgewogCkBAIC0yMDIsNiArMjAyLDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAob3V0ID09IE5VTEwgJiYgbGFzdCAhPSBOR1hfTk9ORSkgeworCisgICAgICAgICAgICBpZiAoY3R4LT5pbikgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQUdBSU47CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHJldHVybiBsYXN0OwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb3JlL25neF9wYWxsb2MuYyBiL3NyYy9jb3JlL25neF9wYWxsb2MuYwppbmRleCAyODA0ZGQwLi5lN2M4ODgyIDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfcGFsbG9jLmMKKysrIGIvc3JjL2NvcmUvbmd4X3BhbGxvYy5jCkBAIC0yMyw2ICsyMyw3IEBACiAgICAgcC0+bmV4dCA9IE5VTEw7CiAgICAgcC0+bGFyZ2UgPSBOVUxMOwogICAgIHAtPmNoYWluID0gTlVMTDsKKyAgICBwLT5jbGVhbnVwID0gTlVMTDsKICAgICBwLT5sb2cgPSBsb2c7CiAKICAgICByZXR1cm4gcDsKQEAgLTMyLDggKzMzLDE1IEBACiB2b2lkCiBuZ3hfZGVzdHJveV9wb29sKG5neF9wb29sX3QgKnBvb2wpCiB7Ci0gICAgbmd4X3Bvb2xfdCAgICAgICAgKnAsICpuOwotICAgIG5neF9wb29sX2xhcmdlX3QgICpsOworICAgIG5neF9wb29sX3QgICAgICAgICAgKnAsICpuOworICAgIG5neF9wb29sX2xhcmdlX3QgICAgKmw7CisgICAgbmd4X3Bvb2xfY2xlYW51cF90ICAqYzsKKworICAgIGZvciAoYyA9IHBvb2wtPmNsZWFudXA7IGM7IGMgPSBjLT5uZXh0KSB7CisgICAgICAgIGlmIChjLT5oYW5kbGVyKSB7CisgICAgICAgICAgICBjLT5oYW5kbGVyKGMtPmRhdGEpOworICAgICAgICB9CisgICAgfQogCiAgICAgZm9yIChsID0gcG9vbC0+bGFyZ2U7IGw7IGwgPSBsLT5uZXh0KSB7CiAKQEAgLTE5Nyw2ICsyMDUsMzkgQEAKICAgICByZXR1cm4gcDsKIH0KIAorCituZ3hfcG9vbF9jbGVhbnVwX3QgKgorbmd4X3Bvb2xfY2xlYW51cF9hZGQobmd4X3Bvb2xfdCAqcCwgbmd4X3Bvb2xfY2xlYW51cF9wdCBoYW5kbGVyLCB2b2lkICpkYXRhKQoreworICAgIG5neF9wb29sX2NsZWFudXBfdCAgKmM7CisKKyAgICBjID0gbmd4X3BhbGxvYyhwLCBzaXplb2Yobmd4X3Bvb2xfY2xlYW51cF90KSk7CisgICAgaWYgKGMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjLT5oYW5kbGVyID0gaGFuZGxlcjsKKyAgICBjLT5kYXRhID0gZGF0YTsKKyAgICBjLT5uZXh0ID0gcC0+Y2xlYW51cDsKKworICAgIHAtPmNsZWFudXAgPSBjOworCisgICAgcmV0dXJuIGM7Cit9CisKKwordm9pZAorbmd4X3Bvb2xfY2xlYW51cF9maWxlKHZvaWQgKmRhdGEpCit7CisgICAgbmd4X3Bvb2xfY2xlYW51cF9maWxlX3QgICpjID0gZGF0YTsKKworICAgIGlmIChuZ3hfY2xvc2VfZmlsZShjLT5mZCkgPT0gTkdYX0ZJTEVfRVJST1IpIHsKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCBjLT5sb2csIG5neF9lcnJubywKKyAgICAgICAgICAgICAgICAgICAgICBuZ3hfY2xvc2VfZmlsZV9uICIgXCIlc1wiIGZhaWxlZCIsIGMtPm5hbWUpOworICAgIH0KK30KKworCiAjaWYgMAogCiBzdGF0aWMgdm9pZCAqCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfcGFsbG9jLmggYi9zcmMvY29yZS9uZ3hfcGFsbG9jLmgKaW5kZXggYmQyNTZlOC4uNjJhNTcxOCAxMDA2NDQKLS0tIGEvc3JjL2NvcmUvbmd4X3BhbGxvYy5oCisrKyBiL3NyYy9jb3JlL25neF9wYWxsb2MuaApAQCAtMjIsMjQgKzIyLDQ0IEBACiAjZGVmaW5lIE5HWF9ERUZBVUxUX1BPT0xfU0laRSAgICgxNiAqIDEwMjQpCiAKIAordHlwZWRlZiB2b2lkICgqbmd4X3Bvb2xfY2xlYW51cF9wdCkodm9pZCAqZGF0YSk7CisKK3R5cGVkZWYgc3RydWN0IG5neF9wb29sX2NsZWFudXBfcyAgbmd4X3Bvb2xfY2xlYW51cF90OworCitzdHJ1Y3Qgbmd4X3Bvb2xfY2xlYW51cF9zIHsKKyAgICBuZ3hfcG9vbF9jbGVhbnVwX3B0ICAgaGFuZGxlcjsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAqZGF0YTsKKyAgICBuZ3hfcG9vbF9jbGVhbnVwX3QgICAqbmV4dDsKK307CisKKwogdHlwZWRlZiBzdHJ1Y3Qgbmd4X3Bvb2xfbGFyZ2VfcyAgbmd4X3Bvb2xfbGFyZ2VfdDsKIAogc3RydWN0IG5neF9wb29sX2xhcmdlX3MgewotICAgIG5neF9wb29sX2xhcmdlX3QgICpuZXh0OwotICAgIHZvaWQgICAgICAgICAgICAgICphbGxvYzsKKyAgICBuZ3hfcG9vbF9sYXJnZV90ICAgICAqbmV4dDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAqYWxsb2M7CiB9OwogCiAKIHN0cnVjdCBuZ3hfcG9vbF9zIHsKLSAgICB1X2NoYXIgICAgICAgICAgICAqbGFzdDsKLSAgICB1X2NoYXIgICAgICAgICAgICAqZW5kOwotICAgIG5neF9jaGFpbl90ICAgICAgICpjaGFpbjsKLSAgICBuZ3hfcG9vbF90ICAgICAgICAqbmV4dDsKLSAgICBuZ3hfcG9vbF9sYXJnZV90ICAqbGFyZ2U7Ci0gICAgbmd4X2xvZ190ICAgICAgICAgKmxvZzsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAqbGFzdDsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAqZW5kOworICAgIG5neF9jaGFpbl90ICAgICAgICAgICpjaGFpbjsKKyAgICBuZ3hfcG9vbF90ICAgICAgICAgICAqbmV4dDsKKyAgICBuZ3hfcG9vbF9sYXJnZV90ICAgICAqbGFyZ2U7CisgICAgbmd4X3Bvb2xfY2xlYW51cF90ICAgKmNsZWFudXA7CisgICAgbmd4X2xvZ190ICAgICAgICAgICAgKmxvZzsKIH07CiAKIAordHlwZWRlZiBzdHJ1Y3QgeworICAgIG5neF9mZF90ICAgICAgICAgICAgICBmZDsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAqbmFtZTsKKyAgICBuZ3hfbG9nX3QgICAgICAgICAgICAqbG9nOworfSBuZ3hfcG9vbF9jbGVhbnVwX2ZpbGVfdDsKKworCisKIHZvaWQgKm5neF9hbGxvYyhzaXplX3Qgc2l6ZSwgbmd4X2xvZ190ICpsb2cpOwogdm9pZCAqbmd4X2NhbGxvYyhzaXplX3Qgc2l6ZSwgbmd4X2xvZ190ICpsb2cpOwogCkBAIC01MSw0ICs3MSw5IEBACiBuZ3hfaW50X3Qgbmd4X3BmcmVlKG5neF9wb29sX3QgKnBvb2wsIHZvaWQgKnApOwogCiAKK25neF9wb29sX2NsZWFudXBfdCAqbmd4X3Bvb2xfY2xlYW51cF9hZGQobmd4X3Bvb2xfdCAqcCwKKyAgICBuZ3hfcG9vbF9jbGVhbnVwX3B0IGhhbmRsZXIsIHZvaWQgKmRhdGEpOwordm9pZCBuZ3hfcG9vbF9jbGVhbnVwX2ZpbGUodm9pZCAqZGF0YSk7CisKKwogI2VuZGlmIC8qIF9OR1hfUEFMTE9DX0hfSU5DTFVERURfICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfdGltZXMuYyBiL3NyYy9jb3JlL25neF90aW1lcy5jCmluZGV4IGU0ZmE2OWQuLjMwOTM4YTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF90aW1lcy5jCisrKyBiL3NyYy9jb3JlL25neF90aW1lcy5jCkBAIC0xMiw4ICsxMiw5IEBACiBuZ3hfZXBvY2hfbXNlY190ICBuZ3hfb2xkX2VsYXBzZWRfbXNlYzsKIG5neF9lcG9jaF9tc2VjX3QgIG5neF9zdGFydF9tc2VjOwogCituZ3hfaW50X3QgIG5neF9nbXRvZmY7CisKIHN0YXRpYyBuZ3hfdG1fdCAgIG5neF9jYWNoZWRfZ210aW1lOwotc3RhdGljIG5neF9pbnRfdCAgbmd4X2dtdG9mZjsKIAogCiAvKgpkaWZmIC0tZ2l0IGEvc3JjL2NvcmUvbmd4X3RpbWVzLmggYi9zcmMvY29yZS9uZ3hfdGltZXMuaAppbmRleCBmOWM0ZDNlLi4yOTU5Y2M0IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ3hfdGltZXMuaAorKysgYi9zcmMvY29yZS9uZ3hfdGltZXMuaApAQCAtNTMsNiArNTMsNyBAQAogICovCiBleHRlcm4gbmd4X2Vwb2NoX21zZWNfdCAgbmd4X29sZF9lbGFwc2VkX21zZWM7CiAKK2V4dGVybiBuZ3hfaW50X3QgICAgICAgICBuZ3hfZ210b2ZmOwogCiAKICNlbmRpZiAvKiBfTkdYX1RJTUVTX0hfSU5DTFVERURfICovCmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ3hfdW5peF9kb21haW4uYyBiL3NyYy9jb3JlL25neF91bml4X2RvbWFpbi5jCmluZGV4IDNkZjgzYmIuLmE3ZmRkNjMgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL25neF91bml4X2RvbWFpbi5jCisrKyBiL3NyYy9jb3JlL25neF91bml4X2RvbWFpbi5jCkBAIC0xNCw4ICsxNCw4IEBACiAjdW5kZWYgc3VuCiAKIAotbmd4X3BlZXJzX3QgKm5neF91bml4X3Vwc3RyZWFtX3BhcnNlKG5neF9jb25mX3QgKmNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF91bml4X2RvbWFpbl91cHN0cmVhbV90ICp1KQorbmd4X3BlZXJzX3QgKgorbmd4X3VuaXhfdXBzdHJlYW1fcGFyc2Uobmd4X2NvbmZfdCAqY2YsIG5neF91bml4X2RvbWFpbl91cHN0cmVhbV90ICp1KQogewogICAgIHNpemVfdCAgICAgICAgICAgICAgIGxlbjsKICAgICBuZ3hfdWludF90ICAgICAgICAgICBpOwpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L21vZHVsZXMvbmd4X2Fpb19tb2R1bGUuYyBiL3NyYy9ldmVudC9tb2R1bGVzL25neF9haW9fbW9kdWxlLmMKaW5kZXggMzdhM2E0NC4uMzdkNTIwYSAxMDA2NDQKLS0tIGEvc3JjL2V2ZW50L21vZHVsZXMvbmd4X2Fpb19tb2R1bGUuYworKysgYi9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfYWlvX21vZHVsZS5jCkBAIC01NCw3ICs1NCw3IEBACiB9OwogCiBuZ3hfbW9kdWxlX3QgIG5neF9haW9fbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X2Fpb19tb2R1bGVfY3R4LCAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0VWRU5UX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KZGlmZiAtLWdpdCBhL3NyYy9ldmVudC9tb2R1bGVzL25neF9kZXZwb2xsX21vZHVsZS5jIGIvc3JjL2V2ZW50L21vZHVsZXMvbmd4X2RldnBvbGxfbW9kdWxlLmMKaW5kZXggNTdiNmIxMi4uY2FiNWFmMCAxMDA2NDQKLS0tIGEvc3JjL2V2ZW50L21vZHVsZXMvbmd4X2RldnBvbGxfbW9kdWxlLmMKKysrIGIvc3JjL2V2ZW50L21vZHVsZXMvbmd4X2RldnBvbGxfbW9kdWxlLmMKQEAgLTkxLDcgKzkxLDcgQEAKIH07CiAKIG5neF9tb2R1bGVfdCAgbmd4X2RldnBvbGxfbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X2RldnBvbGxfbW9kdWxlX2N0eCwgICAgICAgICAgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLwogICAgIG5neF9kZXZwb2xsX2NvbW1hbmRzLCAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0VWRU5UX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KQEAgLTUxMSw3ICs1MTEsNyBAQAogICAgICAgICAgICAgd2V2LT5yZWFkeSA9IDE7CiAKICAgICAgICAgICAgIGlmICghbmd4X3RocmVhZGVkICYmICFuZ3hfYWNjZXB0X211dGV4X2hlbGQpIHsKLSAgICAgICAgICAgICAgICB3ZXYtPmV2ZW50X2hhbmRsZXIod2V2KTsKKyAgICAgICAgICAgICAgICB3ZXYtPmhhbmRsZXIod2V2KTsKIAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBuZ3hfcG9zdF9ldmVudCh3ZXYpOwpAQCAtNTMwLDcgKzUzMCw3IEBACiAgICAgICAgICAgICByZXYtPnJlYWR5ID0gMTsKIAogICAgICAgICAgICAgaWYgKCFuZ3hfdGhyZWFkZWQgJiYgIW5neF9hY2NlcHRfbXV0ZXhfaGVsZCkgewotICAgICAgICAgICAgICAgIHJldi0+ZXZlbnRfaGFuZGxlcihyZXYpOworICAgICAgICAgICAgICAgIHJldi0+aGFuZGxlcihyZXYpOwogCiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFyZXYtPmFjY2VwdCkgewogICAgICAgICAgICAgICAgIG5neF9wb3N0X2V2ZW50KHJldik7CkBAIC01MzgsNyArNTM4LDcgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAobmd4X2FjY2VwdF9kaXNhYmxlZCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgbmd4X211dGV4X3VubG9jayhuZ3hfcG9zdGVkX2V2ZW50c19tdXRleCk7CiAKLSAgICAgICAgICAgICAgICBjLT5yZWFkLT5ldmVudF9oYW5kbGVyKHJldik7CisgICAgICAgICAgICAgICAgYy0+cmVhZC0+aGFuZGxlcihyZXYpOwogCiAgICAgICAgICAgICAgICAgaWYgKG5neF9hY2NlcHRfZGlzYWJsZWQgPiAwKSB7IAogICAgICAgICAgICAgICAgICAgICBuZ3hfYWNjZXB0X211dGV4X3VubG9jaygpOwpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L21vZHVsZXMvbmd4X2Vwb2xsX21vZHVsZS5jIGIvc3JjL2V2ZW50L21vZHVsZXMvbmd4X2Vwb2xsX21vZHVsZS5jCmluZGV4IDE0Yjc3NTAuLjk4NDdlMGYgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9tb2R1bGVzL25neF9lcG9sbF9tb2R1bGUuYworKysgYi9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfZXBvbGxfbW9kdWxlLmMKQEAgLTEyMSw3ICsxMjEsNyBAQAogfTsKIAogbmd4X21vZHVsZV90ICBuZ3hfZXBvbGxfbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X2Vwb2xsX21vZHVsZV9jdHgsICAgICAgICAgICAgICAgLyogbW9kdWxlIGNvbnRleHQgKi8KICAgICBuZ3hfZXBvbGxfY29tbWFuZHMsICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KICAgICBOR1hfRVZFTlRfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KQEAgLTU3Myw3ICs1NzMsNyBAQAogICAgICAgICAgICAgICAgIHdldi0+cmVhZHkgPSAxOwogCiAgICAgICAgICAgICAgICAgaWYgKCFuZ3hfYWNjZXB0X211dGV4X2hlbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgd2V2LT5ldmVudF9oYW5kbGVyKHdldik7CisgICAgICAgICAgICAgICAgICAgIHdldi0+aGFuZGxlcih3ZXYpOwogCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbmd4X3Bvc3RfZXZlbnQod2V2KTsKQEAgLTYwMCw3ICs2MDAsNyBAQAogICAgICAgICAgICAgcmV2LT5yZWFkeSA9IDE7CiAKICAgICAgICAgICAgIGlmICghbmd4X3RocmVhZGVkICYmICFuZ3hfYWNjZXB0X211dGV4X2hlbGQpIHsKLSAgICAgICAgICAgICAgICByZXYtPmV2ZW50X2hhbmRsZXIocmV2KTsKKyAgICAgICAgICAgICAgICByZXYtPmhhbmRsZXIocmV2KTsKIAogICAgICAgICAgICAgfSBlbHNlIGlmICghcmV2LT5hY2NlcHQpIHsKICAgICAgICAgICAgICAgICBuZ3hfcG9zdF9ldmVudChyZXYpOwpAQCAtNjA5LDcgKzYwOSw3IEBACiAKICAgICAgICAgICAgICAgICBuZ3hfbXV0ZXhfdW5sb2NrKG5neF9wb3N0ZWRfZXZlbnRzX211dGV4KTsKIAotICAgICAgICAgICAgICAgIHJldi0+ZXZlbnRfaGFuZGxlcihyZXYpOworICAgICAgICAgICAgICAgIHJldi0+aGFuZGxlcihyZXYpOwogCiAgICAgICAgICAgICAgICAgaWYgKG5neF9hY2NlcHRfZGlzYWJsZWQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG5neF9hY2NlcHRfbXV0ZXhfdW5sb2NrKCk7CmRpZmYgLS1naXQgYS9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfaW9jcF9tb2R1bGUuYyBiL3NyYy9ldmVudC9tb2R1bGVzL25neF9pb2NwX21vZHVsZS5jCmluZGV4IDBhMDRhMjAuLjFiYjY3N2MgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9tb2R1bGVzL25neF9pb2NwX21vZHVsZS5jCisrKyBiL3NyYy9ldmVudC9tb2R1bGVzL25neF9pb2NwX21vZHVsZS5jCkBAIC02OSw3ICs2OSw3IEBACiB9OwogCiBuZ3hfbW9kdWxlX3QgIG5neF9pb2NwX21vZHVsZSA9IHsKLSAgICBOR1hfTU9EVUxFLAorICAgIE5HWF9NT0RVTEVfVjEsCiAgICAgJm5neF9pb2NwX21vZHVsZV9jdHgsICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIGNvbnRleHQgKi8KICAgICBuZ3hfaW9jcF9jb21tYW5kcywgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgZGlyZWN0aXZlcyAqLwogICAgIE5HWF9FVkVOVF9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSB0eXBlICovCkBAIC0yOTQsOSArMjk0LDkgQEAKICAgICBldi0+YXZhaWxhYmxlID0gYnl0ZXM7CiAKICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0VWRU5ULCBjeWNsZS0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJpb2NwIGV2ZW50IGhhbmRsZXI6ICVwIiwgZXYtPmV2ZW50X2hhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICJpb2NwIGV2ZW50IGhhbmRsZXI6ICVwIiwgZXYtPmhhbmRsZXIpOwogCi0gICAgZXYtPmV2ZW50X2hhbmRsZXIoZXYpOworICAgIGV2LT5oYW5kbGVyKGV2KTsKIAogICAgIGlmICh0aW1lciAhPSBJTkZJTklURSAmJiBkZWx0YSkgewogICAgICAgICBuZ3hfZXZlbnRfZXhwaXJlX3RpbWVycygobmd4X21zZWNfdCkgZGVsdGEpOwpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L21vZHVsZXMvbmd4X2txdWV1ZV9tb2R1bGUuYyBiL3NyYy9ldmVudC9tb2R1bGVzL25neF9rcXVldWVfbW9kdWxlLmMKaW5kZXggMTRiYmZhZi4uNzEzZWExYSAxMDA2NDQKLS0tIGEvc3JjL2V2ZW50L21vZHVsZXMvbmd4X2txdWV1ZV9tb2R1bGUuYworKysgYi9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfa3F1ZXVlX21vZHVsZS5jCkBAIC05NCw3ICs5NCw3IEBACiB9OwogCiBuZ3hfbW9kdWxlX3QgIG5neF9rcXVldWVfbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X2txdWV1ZV9tb2R1bGVfY3R4LCAgICAgICAgICAgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLwogICAgIG5neF9rcXVldWVfY29tbWFuZHMsICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0VWRU5UX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KQEAgLTE5MiwxMSArMTkyLDEzIEBACiAgICAgbmd4X2V2ZW50X2FjdGlvbnMgPSBuZ3hfa3F1ZXVlX21vZHVsZV9jdHguYWN0aW9uczsKIAogICAgIG5neF9ldmVudF9mbGFncyA9IE5HWF9VU0VfT05FU0hPVF9FVkVOVAorI2lmIDEKICNpZiAoTkdYX0hBVkVfQ0xFQVJfRVZFTlQpCiAgICAgICAgICAgICAgICAgICAgICB8TkdYX1VTRV9DTEVBUl9FVkVOVAogI2Vsc2UKICAgICAgICAgICAgICAgICAgICAgIHxOR1hfVVNFX0xFVkVMX0VWRU5UCiAjZW5kaWYKKyNlbmRpZgogI2lmIChOR1hfSEFWRV9MT1dBVF9FVkVOVCkKICAgICAgICAgICAgICAgICAgICAgIHxOR1hfVVNFX0xPV0FUX0VWRU5UCiAjZW5kaWYKQEAgLTYxNSw2ICs2MTcsMTAgQEAKICAgICAgICAgICAgICAgICBuZ3hfa3F1ZXVlX2R1bXBfZXZlbnQoZXYtPmxvZywgJmV2ZW50X2xpc3RbaV0pOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoZXYtPm9uZXNob3QpIHsKKyAgICAgICAgICAgICAgICBldi0+YWN0aXZlID0gMDsKKyAgICAgICAgICAgIH0KKwogI2lmIChOR1hfVEhSRUFEUykKIAogICAgICAgICAgICAgaWYgKG5neF90aHJlYWRlZCAmJiAhZXYtPmFjY2VwdCkgewpAQCAtNjYzLDcgKzY2OSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW5neF90aHJlYWRlZCAmJiAhbmd4X2FjY2VwdF9tdXRleF9oZWxkKSB7Ci0gICAgICAgICAgICBldi0+ZXZlbnRfaGFuZGxlcihldik7CisgICAgICAgICAgICBldi0+aGFuZGxlcihldik7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCkBAIC02NzgsNyArNjg0LDcgQEAKIAogICAgICAgICBuZ3hfbXV0ZXhfdW5sb2NrKG5neF9wb3N0ZWRfZXZlbnRzX211dGV4KTsKIAotICAgICAgICBldi0+ZXZlbnRfaGFuZGxlcihldik7CisgICAgICAgIGV2LT5oYW5kbGVyKGV2KTsKIAogICAgICAgICBpZiAobmd4X2FjY2VwdF9kaXNhYmxlZCA+IDApIHsKICAgICAgICAgICAgIG5neF9hY2NlcHRfbXV0ZXhfdW5sb2NrKCk7CmRpZmYgLS1naXQgYS9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfcG9sbF9tb2R1bGUuYyBiL3NyYy9ldmVudC9tb2R1bGVzL25neF9wb2xsX21vZHVsZS5jCmluZGV4IGMyNWE1NjEuLjk3YWM3Y2MgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9tb2R1bGVzL25neF9wb2xsX21vZHVsZS5jCisrKyBiL3NyYy9ldmVudC9tb2R1bGVzL25neF9wb2xsX21vZHVsZS5jCkBAIC01MCw3ICs1MCw3IEBACiB9OwogCiBuZ3hfbW9kdWxlX3QgIG5neF9wb2xsX21vZHVsZSA9IHsKLSAgICBOR1hfTU9EVUxFLAorICAgIE5HWF9NT0RVTEVfVjEsCiAgICAgJm5neF9wb2xsX21vZHVsZV9jdHgsICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIGNvbnRleHQgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgZGlyZWN0aXZlcyAqLwogICAgIE5HWF9FVkVOVF9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSB0eXBlICovCkBAIC01MzYsNyArNTM2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGV2LT5ldmVudF9oYW5kbGVyKGV2KTsKKyAgICAgICAgZXYtPmhhbmRsZXIoZXYpOwogICAgIH0KICNlbmRpZgogCkBAIC01NTMsNyArNTUzLDcgQEAKIAogICAgICAgICBuZ3hfbXV0ZXhfdW5sb2NrKG5neF9wb3N0ZWRfZXZlbnRzX211dGV4KTsKIAotICAgICAgICBldi0+ZXZlbnRfaGFuZGxlcihldik7CisgICAgICAgIGV2LT5oYW5kbGVyKGV2KTsKIAogICAgICAgICBpZiAobmd4X2FjY2VwdF9kaXNhYmxlZCA+IDApIHsKICAgICAgICAgICAgIGxvY2sgPSAwOwpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L21vZHVsZXMvbmd4X3J0c2lnX21vZHVsZS5jIGIvc3JjL2V2ZW50L21vZHVsZXMvbmd4X3J0c2lnX21vZHVsZS5jCmluZGV4IDZjOTQ5NzcuLjEyMmIwOTEgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9tb2R1bGVzL25neF9ydHNpZ19tb2R1bGUuYworKysgYi9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfcnRzaWdfbW9kdWxlLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogfTsKIAogbmd4X21vZHVsZV90ICBuZ3hfcnRzaWdfbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X3J0c2lnX21vZHVsZV9jdHgsICAgICAgICAgICAgICAgLyogbW9kdWxlIGNvbnRleHQgKi8KICAgICBuZ3hfcnRzaWdfY29tbWFuZHMsICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KICAgICBOR1hfRVZFTlRfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KQEAgLTQ2MSwxMSArNDYxLDExIEBACiAgICAgICAgICAgICAgICAgICAgIHJldi0+cmVhZHkgPSAxOwogCiAgICAgICAgICAgICAgICAgICAgIGlmICghbmd4X3RocmVhZGVkICYmICFuZ3hfYWNjZXB0X211dGV4X2hlbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldi0+ZXZlbnRfaGFuZGxlcihyZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV2LT5oYW5kbGVyKHJldik7CiAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXYtPmFjY2VwdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5neF9hY2NlcHRfZGlzYWJsZWQgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldi0+ZXZlbnRfaGFuZGxlcihyZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldi0+aGFuZGxlcihyZXYpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC00OTUsNyArNDk1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgd2V2LT5yZWFkeSA9IDE7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZ3hfdGhyZWFkZWQgJiYgIW5neF9hY2NlcHRfbXV0ZXhfaGVsZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgd2V2LT5ldmVudF9oYW5kbGVyKHdldik7CisgICAgICAgICAgICAgICAgICAgICAgICB3ZXYtPmhhbmRsZXIod2V2KTsKIAogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3Bvc3RfZXZlbnQod2V2KTsKQEAgLTU5OCwxMSArNTk4LDExIEBACiAKICAgICAgICAgICAgIGV2ZW50cyA9IDA7CiAKLSAgICAgICAgICAgIGlmIChjLT5yZWFkLT5hY3RpdmUgJiYgYy0+cmVhZC0+ZXZlbnRfaGFuZGxlcikgeworICAgICAgICAgICAgaWYgKGMtPnJlYWQtPmFjdGl2ZSAmJiBjLT5yZWFkLT5oYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgZXZlbnRzIHw9IFBPTExJTjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGMtPndyaXRlLT5hY3RpdmUgJiYgYy0+d3JpdGUtPmV2ZW50X2hhbmRsZXIpIHsKKyAgICAgICAgICAgIGlmIChjLT53cml0ZS0+YWN0aXZlICYmIGMtPndyaXRlLT5oYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgZXZlbnRzIHw9IFBPTExPVVQ7CiAgICAgICAgICAgICB9CiAKQEAgLTY1Miw3ICs2NTIsNyBAQAogCiAgICAgICAgICAgICBpZiAocmV2LT5hY3RpdmUKICAgICAgICAgICAgICAgICAmJiAhcmV2LT5jbG9zZWQKLSAgICAgICAgICAgICAgICAmJiByZXYtPmV2ZW50X2hhbmRsZXIKKyAgICAgICAgICAgICAgICAmJiByZXYtPmhhbmRsZXIKICAgICAgICAgICAgICAgICAmJiAob3ZlcmZsb3dfbGlzdFtpXS5yZXZlbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIChQT0xMSU58UE9MTEVSUnxQT0xMSFVQfFBPTExOVkFMKSkpCiAgICAgICAgICAgICB7CkBAIC02NjQsNyArNjY0LDcgQEAKIAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHJldi0+cmVhZHkgPSAxOwotICAgICAgICAgICAgICAgICAgICByZXYtPmV2ZW50X2hhbmRsZXIocmV2KTsgCisgICAgICAgICAgICAgICAgICAgIHJldi0+aGFuZGxlcihyZXYpOyAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTY3Miw3ICs2NzIsNyBAQAogCiAgICAgICAgICAgICBpZiAod2V2LT5hY3RpdmUKICAgICAgICAgICAgICAgICAmJiAhd2V2LT5jbG9zZWQKLSAgICAgICAgICAgICAgICAmJiB3ZXYtPmV2ZW50X2hhbmRsZXIKKyAgICAgICAgICAgICAgICAmJiB3ZXYtPmhhbmRsZXIKICAgICAgICAgICAgICAgICAmJiAob3ZlcmZsb3dfbGlzdFtpXS5yZXZlbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgKFBPTExPVVR8UE9MTEVSUnxQT0xMSFVQfFBPTExOVkFMKSkpCiAgICAgICAgICAgICB7CkBAIC02ODQsNyArNjg0LDcgQEAKIAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHdldi0+cmVhZHkgPSAxOwotICAgICAgICAgICAgICAgICAgICB3ZXYtPmV2ZW50X2hhbmRsZXIod2V2KTsgCisgICAgICAgICAgICAgICAgICAgIHdldi0+aGFuZGxlcih3ZXYpOyAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9ldmVudC9tb2R1bGVzL25neF9zZWxlY3RfbW9kdWxlLmMgYi9zcmMvZXZlbnQvbW9kdWxlcy9uZ3hfc2VsZWN0X21vZHVsZS5jCmluZGV4IDZlZGMyODQuLjRjZjg4NDAgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9tb2R1bGVzL25neF9zZWxlY3RfbW9kdWxlLmMKKysrIGIvc3JjL2V2ZW50L21vZHVsZXMvbmd4X3NlbGVjdF9tb2R1bGUuYwpAQCAtNjMsNyArNjMsNyBAQAogfTsKIAogbmd4X21vZHVsZV90ICBuZ3hfc2VsZWN0X21vZHVsZSA9IHsKLSAgICBOR1hfTU9EVUxFLAorICAgIE5HWF9NT0RVTEVfVjEsCiAgICAgJm5neF9zZWxlY3RfbW9kdWxlX2N0eCwgICAgICAgICAgICAgICAgLyogbW9kdWxlIGNvbnRleHQgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgZGlyZWN0aXZlcyAqLwogICAgIE5HWF9FVkVOVF9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSB0eXBlICovCkBAIC01NDAsNyArNTQwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGV2LT5ldmVudF9oYW5kbGVyKGV2KTsKKyAgICAgICAgZXYtPmhhbmRsZXIoZXYpOwogICAgIH0KICNlbmRpZgogCkBAIC01NTcsNyArNTU3LDcgQEAKIAogICAgICAgICBuZ3hfbXV0ZXhfdW5sb2NrKG5neF9wb3N0ZWRfZXZlbnRzX211dGV4KTsKIAotICAgICAgICBldi0+ZXZlbnRfaGFuZGxlcihldik7CisgICAgICAgIGV2LT5oYW5kbGVyKGV2KTsKIAogICAgICAgICBpZiAobmd4X2FjY2VwdF9kaXNhYmxlZCA+IDApIHsKICAgICAgICAgICAgIGxvY2sgPSAwOwpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudC5jIGIvc3JjL2V2ZW50L25neF9ldmVudC5jCmluZGV4IDBkMTBjNGIuLjI3NGJlNmMgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9uZ3hfZXZlbnQuYworKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50LmMKQEAgLTI0LDEwICsyNCwxMCBAQAogc3RhdGljIGNoYXIgKm5neF9ldmVudHNfYmxvY2sobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZik7CiAKIHN0YXRpYyBjaGFyICpuZ3hfZXZlbnRfY29ubmVjdGlvbnMobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZik7CisgICAgdm9pZCAqY29uZik7CiBzdGF0aWMgY2hhciAqbmd4X2V2ZW50X3VzZShuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKTsKIHN0YXRpYyBjaGFyICpuZ3hfZXZlbnRfZGVidWdfY29ubmVjdGlvbihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbmYpOworICAgIHZvaWQgKmNvbmYpOwogCiBzdGF0aWMgdm9pZCAqbmd4X2V2ZW50X2NyZWF0ZV9jb25mKG5neF9jeWNsZV90ICpjeWNsZSk7CiBzdGF0aWMgY2hhciAqbmd4X2V2ZW50X2luaXRfY29uZihuZ3hfY3ljbGVfdCAqY3ljbGUsIHZvaWQgKmNvbmYpOwpAQCAtOTEsNyArOTEsNyBAQAogCiAKIG5neF9tb2R1bGVfdCAgbmd4X2V2ZW50c19tb2R1bGUgPSB7Ci0gICAgTkdYX01PRFVMRSwKKyAgICBOR1hfTU9EVUxFX1YxLAogICAgICZuZ3hfZXZlbnRzX21vZHVsZV9jdHgsICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBjb250ZXh0ICovCiAgICAgbmd4X2V2ZW50c19jb21tYW5kcywgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KICAgICBOR1hfQ09SRV9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgdHlwZSAqLwpAQCAtMTYzLDcgKzE2Myw3IEBACiAKIAogbmd4X21vZHVsZV90ICBuZ3hfZXZlbnRfY29yZV9tb2R1bGUgPSB7Ci0gICAgTkdYX01PRFVMRSwKKyAgICBOR1hfTU9EVUxFX1YxLAogICAgICZuZ3hfZXZlbnRfY29yZV9tb2R1bGVfY3R4LCAgICAgICAgICAgIC8qIG1vZHVsZSBjb250ZXh0ICovCiAgICAgbmd4X2V2ZW50X2NvcmVfY29tbWFuZHMsICAgICAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KICAgICBOR1hfRVZFTlRfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgdHlwZSAqLwpAQCAtMTcyLDcgKzE3MiwxNDMgQEAKIH07CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfZXZlbnRfbW9kdWxlX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKQorbmd4X2ludF90CituZ3hfaGFuZGxlX3JlYWRfZXZlbnQobmd4X2V2ZW50X3QgKnJldiwgdV9pbnQgZmxhZ3MpCit7CisgICAgaWYgKG5neF9ldmVudF9mbGFncyAmIE5HWF9VU0VfQ0xFQVJfRVZFTlQpIHsKKyAgICAKKyAgICAgICAgLyoga3F1ZXVlLCBlcG9sbCAqLworCisgICAgICAgIGlmICghcmV2LT5hY3RpdmUgJiYgIXJldi0+cmVhZHkpIHsKKyAgICAgICAgICAgIGlmIChuZ3hfYWRkX2V2ZW50KHJldiwgTkdYX1JFQURfRVZFTlQsIE5HWF9DTEVBUl9FVkVOVCkKKyAgICAgICAgICAgICAgICA9PSBOR1hfRVJST1IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIAorICAgICAgICByZXR1cm4gTkdYX09LOworCisgICAgfSBlbHNlIGlmIChuZ3hfZXZlbnRfZmxhZ3MgJiBOR1hfVVNFX0xFVkVMX0VWRU5UKSB7CisKKyAgICAgICAgLyogc2VsZWN0LCBwb2xsLCAvZGV2L3BvbGwgKi8KKworICAgICAgICBpZiAoIXJldi0+YWN0aXZlICYmICFyZXYtPnJlYWR5KSB7CisgICAgICAgICAgICBpZiAobmd4X2FkZF9ldmVudChyZXYsIE5HWF9SRUFEX0VWRU5ULCBOR1hfTEVWRUxfRVZFTlQpCisgICAgICAgICAgICAgICAgPT0gTkdYX0VSUk9SKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV2LT5hY3RpdmUgJiYgKHJldi0+cmVhZHkgfHwgKGZsYWdzICYgTkdYX0NMT1NFX0VWRU5UKSkpIHsKKyAgICAgICAgICAgIGlmIChuZ3hfZGVsX2V2ZW50KHJldiwgTkdYX1JFQURfRVZFTlQsIE5HWF9MRVZFTF9FVkVOVCB8IGZsYWdzKQorICAgICAgICAgICAgICAgID09IE5HWF9FUlJPUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gTkdYX09LOworICAgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKG5neF9ldmVudF9mbGFncyAmIE5HWF9VU0VfT05FU0hPVF9FVkVOVCkgeworCisgICAgICAgIC8qIGV2ZW50IHBvcnRzICovCisKKyAgICAgICAgaWYgKCFyZXYtPmFjdGl2ZSkgeworICAgICAgICAgICAgaWYgKG5neF9hZGRfZXZlbnQocmV2LCBOR1hfUkVBRF9FVkVOVCwgTkdYX09ORVNIT1RfRVZFTlQpCisgICAgICAgICAgICAgICAgPT0gTkdYX0VSUk9SKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKKyAgICB9CisKKyAgICAvKiBhaW8sIGlvY3AsIHJ0c2lnICovCisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK25neF9pbnRfdAorbmd4X2hhbmRsZV93cml0ZV9ldmVudChuZ3hfZXZlbnRfdCAqd2V2LCBzaXplX3QgbG93YXQpCit7CisgICAgbmd4X2Nvbm5lY3Rpb25fdCAgKmM7CisKKyAgICBpZiAobG93YXQpIHsKKyAgICAgICAgYyA9IChuZ3hfY29ubmVjdGlvbl90ICopIHdldi0+ZGF0YTsKKworICAgICAgICBpZiAobmd4X3NlbmRfbG93YXQoYywgbG93YXQpID09IE5HWF9FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuZ3hfZXZlbnRfZmxhZ3MgJiBOR1hfVVNFX0NMRUFSX0VWRU5UKSB7CisKKyAgICAgICAgLyoga3F1ZXVlLCBlcG9sbCAqLworCisgICAgICAgIGlmICghd2V2LT5hY3RpdmUgJiYgIXdldi0+cmVhZHkpIHsKKyAgICAgICAgICAgIGlmIChuZ3hfYWRkX2V2ZW50KHdldiwgTkdYX1dSSVRFX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0NMRUFSX0VWRU5UIHwgKGxvd2F0ID8gTkdYX0xPV0FUX0VWRU5UIDogMCkpCisgICAgICAgICAgICAgICAgPT0gTkdYX0VSUk9SKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTkdYX09LOworCisgICAgfSBlbHNlIGlmIChuZ3hfZXZlbnRfZmxhZ3MgJiBOR1hfVVNFX0xFVkVMX0VWRU5UKSB7CisKKyAgICAgICAgLyogc2VsZWN0LCBwb2xsLCAvZGV2L3BvbGwgKi8KKworICAgICAgICBpZiAoIXdldi0+YWN0aXZlICYmICF3ZXYtPnJlYWR5KSB7CisgICAgICAgICAgICBpZiAobmd4X2FkZF9ldmVudCh3ZXYsIE5HWF9XUklURV9FVkVOVCwgTkdYX0xFVkVMX0VWRU5UKQorICAgICAgICAgICAgICAgID09IE5HWF9FUlJPUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gTkdYX09LOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdldi0+YWN0aXZlICYmIHdldi0+cmVhZHkpIHsKKyAgICAgICAgICAgIGlmIChuZ3hfZGVsX2V2ZW50KHdldiwgTkdYX1dSSVRFX0VWRU5ULCBOR1hfTEVWRUxfRVZFTlQpCisgICAgICAgICAgICAgICAgPT0gTkdYX0VSUk9SKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgICAgIH0KKworICAgIH0gZWxzZSBpZiAobmd4X2V2ZW50X2ZsYWdzICYgTkdYX1VTRV9PTkVTSE9UX0VWRU5UKSB7CisKKyAgICAgICAgLyogZXZlbnQgcG9ydHMgKi8KKworICAgICAgICBpZiAoIXdldi0+YWN0aXZlKSB7CisgICAgICAgICAgICBpZiAobmd4X2FkZF9ldmVudCh3ZXYsIE5HWF9XUklURV9FVkVOVCwgTkdYX09ORVNIT1RfRVZFTlQpCisgICAgICAgICAgICAgICAgPT0gTkdYX0VSUk9SKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKKyAgICB9CisKKyAgICAvKiBhaW8sIGlvY3AsIHJ0c2lnICovCisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9ldmVudF9tb2R1bGVfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCiB7CiAjaWYgIShOR1hfV0lOMzIpCiAKQEAgLTI0OCw3ICszODQsOCBAQAogfQogCiAKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2V2ZW50X3Byb2Nlc3NfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCitzdGF0aWMgbmd4X2ludF90CituZ3hfZXZlbnRfcHJvY2Vzc19pbml0KG5neF9jeWNsZV90ICpjeWNsZSkKIHsKICAgICBuZ3hfdWludF90ICAgICAgICAgICBtLCBpOwogICAgIG5neF9zb2NrZXRfdCAgICAgICAgIGZkOwpAQCAtNDE3LDcgKzU1NCw3IEBACiAjaWYgKE5HWF9XSU4zMikKIAogICAgICAgICBpZiAobmd4X2V2ZW50X2ZsYWdzICYgTkdYX1VTRV9JT0NQX0VWRU5UKSB7Ci0gICAgICAgICAgICByZXYtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfZXZlbnRfYWNjZXB0ZXg7CisgICAgICAgICAgICByZXYtPmhhbmRsZXIgPSBuZ3hfZXZlbnRfYWNjZXB0ZXg7CiAKICAgICAgICAgICAgIGlmIChuZ3hfYWRkX2V2ZW50KHJldiwgMCwgTkdYX0lPQ1BfQUNDRVBUKSA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwpAQCAtNDMxLDcgKzU2OCw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldi0+ZXZlbnRfaGFuZGxlciA9IG5neF9ldmVudF9hY2NlcHQ7CisgICAgICAgICAgICByZXYtPmhhbmRsZXIgPSBuZ3hfZXZlbnRfYWNjZXB0OwogCiAgICAgICAgICAgICBpZiAobmd4X2FkZF9ldmVudChyZXYsIE5HWF9SRUFEX0VWRU5ULCAwKSA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwpAQCAtNDQwLDcgKzU3Nyw3IEBACiAKICNlbHNlCiAKLSAgICAgICAgcmV2LT5ldmVudF9oYW5kbGVyID0gbmd4X2V2ZW50X2FjY2VwdDsKKyAgICAgICAgcmV2LT5oYW5kbGVyID0gbmd4X2V2ZW50X2FjY2VwdDsKIAogICAgICAgICBpZiAobmd4X2FjY2VwdF9tdXRleCkgewogICAgICAgICAgICAgY29udGludWU7CkBAIC00NjQsNyArNjAxLDggQEAKIH0KIAogCi1uZ3hfaW50X3Qgbmd4X3NlbmRfbG93YXQobmd4X2Nvbm5lY3Rpb25fdCAqYywgc2l6ZV90IGxvd2F0KQorbmd4X2ludF90CituZ3hfc2VuZF9sb3dhdChuZ3hfY29ubmVjdGlvbl90ICpjLCBzaXplX3QgbG93YXQpCiB7CiAgICAgaW50ICBzbmRsb3dhdDsKIApAQCAtNDk3LDcgKzYzNSw4IEBACiB9CiAKIAotc3RhdGljIGNoYXIgKm5neF9ldmVudHNfYmxvY2sobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKK3N0YXRpYyBjaGFyICoKK25neF9ldmVudHNfYmxvY2sobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKIHsKICAgICBjaGFyICAgICAgICAgICAgICAgICAqcnY7CiAgICAgdm9pZCAgICAgICAgICAgICAgICoqKmN0eDsKQEAgLTU3NCw4ICs3MTMsOCBAQAogfQogCiAKLXN0YXRpYyBjaGFyICpuZ3hfZXZlbnRfY29ubmVjdGlvbnMobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZikKK3N0YXRpYyBjaGFyICoKK25neF9ldmVudF9jb25uZWN0aW9ucyhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQogewogICAgIG5neF9ldmVudF9jb25mX3QgICplY2YgPSBjb25mOwogCkBAIC02MDAsNyArNzM5LDggQEAKIH0KIAogCi1zdGF0aWMgY2hhciAqbmd4X2V2ZW50X3VzZShuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQorc3RhdGljIGNoYXIgKgorbmd4X2V2ZW50X3VzZShuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQogewogICAgIG5neF9ldmVudF9jb25mX3QgICplY2YgPSBjb25mOwogCkBAIC02NjIsOCArODAyLDggQEAKIH0KIAogCi1zdGF0aWMgY2hhciAqbmd4X2V2ZW50X2RlYnVnX2Nvbm5lY3Rpb24obmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKQorc3RhdGljIGNoYXIgKgorbmd4X2V2ZW50X2RlYnVnX2Nvbm5lY3Rpb24obmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKIHsKICNpZiAoTkdYX0RFQlVHKQogICAgIG5neF9ldmVudF9jb25mX3QgICplY2YgPSBjb25mOwpAQCAtNzA5LDcgKzg0OSw4IEBACiB9CiAKIAotc3RhdGljIHZvaWQgKm5neF9ldmVudF9jcmVhdGVfY29uZihuZ3hfY3ljbGVfdCAqY3ljbGUpCitzdGF0aWMgdm9pZCAqCituZ3hfZXZlbnRfY3JlYXRlX2NvbmYobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIG5neF9ldmVudF9jb25mX3QgICplY2Y7CiAKQEAgLTczOSw3ICs4ODAsOCBAQAogfQogCiAKLXN0YXRpYyBjaGFyICpuZ3hfZXZlbnRfaW5pdF9jb25mKG5neF9jeWNsZV90ICpjeWNsZSwgdm9pZCAqY29uZikKK3N0YXRpYyBjaGFyICoKK25neF9ldmVudF9pbml0X2NvbmYobmd4X2N5Y2xlX3QgKmN5Y2xlLCB2b2lkICpjb25mKQogewogICAgIG5neF9ldmVudF9jb25mX3QgICplY2YgPSBjb25mOwogCkBAIC04NzQsNyArMTAxNiw4IEBACiB9CiAKIAotc3RhdGljIGNoYXIgKm5neF9hY2NlcHRfbXV0ZXhfY2hlY2sobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBvc3QsIHZvaWQgKmRhdGEpCitzdGF0aWMgY2hhciAqCituZ3hfYWNjZXB0X211dGV4X2NoZWNrKG5neF9jb25mX3QgKmNmLCB2b2lkICpwb3N0LCB2b2lkICpkYXRhKQogewogI2lmICEoTkdYX0hBVkVfQVRPTUlDX09QUykKIApkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudC5oIGIvc3JjL2V2ZW50L25neF9ldmVudC5oCmluZGV4IDZkZmQ3MDkuLjNlOTNiZjcgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9uZ3hfZXZlbnQuaAorKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50LmgKQEAgLTExMyw4ICsxMTMsNyBAQAogICAgIHVuc2lnbmVkICAgICAgICAgYXZhaWxhYmxlOjE7CiAjZW5kaWYKIAotICAgIC8qIFRPRE8gcmVuYW1lIHRvIGhhbmRsZXIgKi8KLSAgICBuZ3hfZXZlbnRfaGFuZGxlcl9wdCAgZXZlbnRfaGFuZGxlcjsKKyAgICBuZ3hfZXZlbnRfaGFuZGxlcl9wdCAgaGFuZGxlcjsKIAogCiAjaWYgKE5HWF9IQVZFX0FJTykKQEAgLTQ3NCw2ICs0NzMsMTAgQEAKIG5neF9pbnRfdCBuZ3hfZW5hYmxlX2FjY2VwdF9ldmVudHMobmd4X2N5Y2xlX3QgKmN5Y2xlKTsKIAogCituZ3hfaW50X3Qgbmd4X2hhbmRsZV9yZWFkX2V2ZW50KG5neF9ldmVudF90ICpyZXYsIHVfaW50IGZsYWdzKTsKK25neF9pbnRfdCBuZ3hfaGFuZGxlX3dyaXRlX2V2ZW50KG5neF9ldmVudF90ICp3ZXYsIHNpemVfdCBsb3dhdCk7CisKKwogI2lmIChOR1hfV0lOMzIpCiB2b2lkIG5neF9ldmVudF9hY2NlcHRleChuZ3hfZXZlbnRfdCAqZXYpOwogaW50IG5neF9ldmVudF9wb3N0X2FjY2VwdGV4KG5neF9saXN0ZW5pbmdfdCAqbHMsIGludCBuKTsKQEAgLTQ5NiwxNTggKzQ5OSw0IEBACiAjZW5kaWYKIAogCi0KLXN0YXRpYyBuZ3hfaW5saW5lIG5neF9pbnRfdCBuZ3hfaGFuZGxlX3JlYWRfZXZlbnQobmd4X2V2ZW50X3QgKnJldiwgdV9pbnQgZmxhZ3MpCi17Ci0gICAgaWYgKG5neF9ldmVudF9mbGFncyAmIE5HWF9VU0VfQ0xFQVJfRVZFTlQpIHsKLQotICAgICAgICAvKiBrcXVldWUsIGVwb2xsICovCi0KLSAgICAgICAgaWYgKCFyZXYtPmFjdGl2ZSAmJiAhcmV2LT5yZWFkeSkgewotICAgICAgICAgICAgaWYgKG5neF9hZGRfZXZlbnQocmV2LCBOR1hfUkVBRF9FVkVOVCwgTkdYX0NMRUFSX0VWRU5UKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE5HWF9FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gTkdYX09LOwotCi0gICAgfSBlbHNlIGlmIChuZ3hfZXZlbnRfZmxhZ3MgJiBOR1hfVVNFX0xFVkVMX0VWRU5UKSB7Ci0KLSAgICAgICAgLyogc2VsZWN0LCBwb2xsLCAvZGV2L3BvbGwgKi8KLQotICAgICAgICBpZiAoIXJldi0+YWN0aXZlICYmICFyZXYtPnJlYWR5KSB7Ci0gICAgICAgICAgICBpZiAobmd4X2FkZF9ldmVudChyZXYsIE5HWF9SRUFEX0VWRU5ULCBOR1hfTEVWRUxfRVZFTlQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBOR1hfRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIE5HWF9PSzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXYtPmFjdGl2ZSAmJiAocmV2LT5yZWFkeSB8fCAoZmxhZ3MgJiBOR1hfQ0xPU0VfRVZFTlQpKSkgewotICAgICAgICAgICAgaWYgKG5neF9kZWxfZXZlbnQocmV2LCBOR1hfUkVBRF9FVkVOVCwgZmxhZ3MpID09IE5HWF9FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBOR1hfT0s7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBhaW8sIGlvY3AsIHJ0c2lnICovCi0KLSAgICByZXR1cm4gTkdYX09LOwotfQotCi0KLXN0YXRpYyBuZ3hfaW5saW5lIG5neF9pbnRfdCBuZ3hfaGFuZGxlX2xldmVsX3JlYWRfZXZlbnQobmd4X2V2ZW50X3QgKnJldikKLXsKLSAgICBpZiAobmd4X2V2ZW50X2ZsYWdzICYgTkdYX1VTRV9MRVZFTF9FVkVOVCkgewotICAgICAgICBpZiAoIXJldi0+YWN0aXZlICYmICFyZXYtPnJlYWR5KSB7Ci0gICAgICAgICAgICBpZiAobmd4X2FkZF9ldmVudChyZXYsIE5HWF9SRUFEX0VWRU5ULCBOR1hfTEVWRUxfRVZFTlQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBOR1hfRVJST1IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIE5HWF9PSzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXYtPmFjdGl2ZSAmJiByZXYtPnJlYWR5KSB7Ci0gICAgICAgICAgICBpZiAobmd4X2RlbF9ldmVudChyZXYsIE5HWF9SRUFEX0VWRU5ULCAwKSA9PSBOR1hfRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gTkdYX09LOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5HWF9PSzsKLX0KLQotCi1zdGF0aWMgbmd4X2lubGluZSBuZ3hfaW50X3Qgbmd4X2hhbmRsZV93cml0ZV9ldmVudChuZ3hfZXZlbnRfdCAqd2V2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxvd2F0KQotewotICAgIG5neF9jb25uZWN0aW9uX3QgICpjOwotCi0gICAgaWYgKGxvd2F0KSB7Ci0gICAgICAgIGMgPSAobmd4X2Nvbm5lY3Rpb25fdCAqKSB3ZXYtPmRhdGE7Ci0KLSAgICAgICAgaWYgKG5neF9zZW5kX2xvd2F0KGMsIGxvd2F0KSA9PSBOR1hfRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobmd4X2V2ZW50X2ZsYWdzICYgTkdYX1VTRV9DTEVBUl9FVkVOVCkgewotCi0gICAgICAgIC8qIGtxdWV1ZSwgZXBvbGwgKi8KLQotICAgICAgICBpZiAoIXdldi0+YWN0aXZlICYmICF3ZXYtPnJlYWR5KSB7Ci0gICAgICAgICAgICBpZiAobmd4X2FkZF9ldmVudCh3ZXYsIE5HWF9XUklURV9FVkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9DTEVBUl9FVkVOVCB8IChsb3dhdCA/IE5HWF9MT1dBVF9FVkVOVCA6IDApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTkdYX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gTkdYX09LOwotCi0gICAgfSBlbHNlIGlmIChuZ3hfZXZlbnRfZmxhZ3MgJiBOR1hfVVNFX0xFVkVMX0VWRU5UKSB7Ci0KLSAgICAgICAgLyogc2VsZWN0LCBwb2xsLCAvZGV2L3BvbGwgKi8KLQotICAgICAgICBpZiAoIXdldi0+YWN0aXZlICYmICF3ZXYtPnJlYWR5KSB7Ci0gICAgICAgICAgICBpZiAobmd4X2FkZF9ldmVudCh3ZXYsIE5HWF9XUklURV9FVkVOVCwgTkdYX0xFVkVMX0VWRU5UKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTkdYX0VSUk9SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBOR1hfT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAod2V2LT5hY3RpdmUgJiYgd2V2LT5yZWFkeSkgewotICAgICAgICAgICAgaWYgKG5neF9kZWxfZXZlbnQod2V2LCBOR1hfV1JJVEVfRVZFTlQsIDApID09IE5HWF9FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBOR1hfT0s7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBhaW8sIGlvY3AsIHJ0c2lnICovCi0KLSAgICByZXR1cm4gTkdYX09LOwotfQotCi0KLXN0YXRpYyBuZ3hfaW5saW5lIG5neF9pbnRfdCBuZ3hfaGFuZGxlX2xldmVsX3dyaXRlX2V2ZW50KG5neF9ldmVudF90ICp3ZXYpCi17Ci0gICAgaWYgKG5neF9ldmVudF9mbGFncyAmIE5HWF9VU0VfTEVWRUxfRVZFTlQpIHsKLSAgICAgICAgaWYgKCF3ZXYtPmFjdGl2ZSAmJiAhd2V2LT5yZWFkeSkgewotICAgICAgICAgICAgaWYgKG5neF9hZGRfZXZlbnQod2V2LCBOR1hfV1JJVEVfRVZFTlQsIE5HWF9MRVZFTF9FVkVOVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE5HWF9FUlJPUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gTkdYX09LOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdldi0+YWN0aXZlICYmIHdldi0+cmVhZHkpIHsKLSAgICAgICAgICAgIGlmIChuZ3hfZGVsX2V2ZW50KHdldiwgTkdYX1dSSVRFX0VWRU5ULCAwKSA9PSBOR1hfRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gTkdYX09LOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5HWF9PSzsKLX0KLQotCiAjZW5kaWYgLyogX05HWF9FVkVOVF9IX0lOQ0xVREVEXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudF9hY2NlcHQuYyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfYWNjZXB0LmMKaW5kZXggOTQ0MWM4Mi4uZTMxMjUzMyAxMDA2NDQKLS0tIGEvc3JjL2V2ZW50L25neF9ldmVudF9hY2NlcHQuYworKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X2FjY2VwdC5jCkBAIC0xMDYsNyArMTA2LDkgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgZXYtPmxvZywgZXJyLAorICAgICAgICAgICAgbmd4X2xvZ19lcnJvcigoZXJyID09IE5HWF9FQ09OTkFCT1JURUQpID8gTkdYX0xPR19DUklUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0xPR19BTEVSVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXYtPmxvZywgZXJyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXB0KCkgb24gJVYgZmFpbGVkIiwgJmxzLT5saXN0ZW5pbmctPmFkZHJfdGV4dCk7CiAKICAgICAgICAgICAgIGlmIChlcnIgPT0gTkdYX0VDT05OQUJPUlRFRCkgewpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudF9hY2NlcHRleC5jIGIvc3JjL2V2ZW50L25neF9ldmVudF9hY2NlcHRleC5jCmluZGV4IGIwMmRmZDAuLjUwY2QyMWQgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfYWNjZXB0ZXguYworKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X2FjY2VwdGV4LmMKQEAgLTEzMiw3ICsxMzIsNyBAQAogCiAgICAgICAgIHJldi0+b3ZscC5ldmVudCA9IHJldjsKICAgICAgICAgd2V2LT5vdmxwLmV2ZW50ID0gd2V2OwotICAgICAgICByZXYtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfZXZlbnRfYWNjZXB0ZXg7CisgICAgICAgIHJldi0+aGFuZGxlciA9IG5neF9ldmVudF9hY2NlcHRleDsKIAogICAgICAgICByZXYtPmRhdGEgPSBjOwogICAgICAgICB3ZXYtPmRhdGEgPSBjOwpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudF9idXN5X2xvY2suYyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfYnVzeV9sb2NrLmMKaW5kZXggNTZhOGQ5Mi4uNGQ0OTlhMyAxMDA2NDQKLS0tIGEvc3JjL2V2ZW50L25neF9ldmVudF9idXN5X2xvY2suYworKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X2J1c3lfbG9jay5jCkBAIC00Myw3ICs0Myw3IEBACiAgICAgfSBlbHNlIGlmIChjdHgtPnRpbWVyICYmIGJsLT53YWl0aW5nIDwgYmwtPm1heF93YWl0aW5nKSB7CiAgICAgICAgIGJsLT53YWl0aW5nKys7CiAgICAgICAgIG5neF9hZGRfdGltZXIoY3R4LT5ldmVudCwgY3R4LT50aW1lcik7Ci0gICAgICAgIGN0eC0+ZXZlbnQtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfZXZlbnRfYnVzeV9sb2NrX2hhbmRsZXI7CisgICAgICAgIGN0eC0+ZXZlbnQtPmhhbmRsZXIgPSBuZ3hfZXZlbnRfYnVzeV9sb2NrX2hhbmRsZXI7CiAKICAgICAgICAgaWYgKGJsLT5ldmVudHMpIHsKICAgICAgICAgICAgIGJsLT5sYXN0LT5uZXh0ID0gY3R4OwpAQCAtOTIsNyArOTIsNyBAQAogICAgICAgICBpZiAoY3R4LT50aW1lciAmJiBibC0+d2FpdGluZyA8IGJsLT5tYXhfd2FpdGluZykgewogICAgICAgICAgICAgYmwtPndhaXRpbmcrKzsKICAgICAgICAgICAgIG5neF9hZGRfdGltZXIoY3R4LT5ldmVudCwgY3R4LT50aW1lcik7Ci0gICAgICAgICAgICBjdHgtPmV2ZW50LT5ldmVudF9oYW5kbGVyID0gbmd4X2V2ZW50X2J1c3lfbG9ja19oYW5kbGVyOworICAgICAgICAgICAgY3R4LT5ldmVudC0+aGFuZGxlciA9IG5neF9ldmVudF9idXN5X2xvY2tfaGFuZGxlcjsKIAogICAgICAgICAgICAgaWYgKGJsLT5ldmVudHMgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGJsLT5ldmVudHMgPSBjdHg7CkBAIC0yOTYsNyArMjk2LDcgQEAKIAogICAgIG5neF9tdXRleF91bmxvY2sobmd4X3Bvc3RlZF9ldmVudHNfbXV0ZXgpOwogCi0gICAgZXYtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfZXZlbnRfYnVzeV9sb2NrX3Bvc3RlZF9oYW5kbGVyOworICAgIGV2LT5oYW5kbGVyID0gbmd4X2V2ZW50X2J1c3lfbG9ja19wb3N0ZWRfaGFuZGxlcjsKIH0KIAogCmRpZmYgLS1naXQgYS9zcmMvZXZlbnQvbmd4X2V2ZW50X2Nvbm5lY3QuYyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfY29ubmVjdC5jCmluZGV4IDgxNzk4ZDMuLjJmNTU5YTMgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfY29ubmVjdC5jCisrKyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfY29ubmVjdC5jCkBAIC0xMTQsNiArMTE0LDkgQEAKIAogICAgIHMgPSBuZ3hfc29ja2V0KHBlZXItPnNvY2thZGRyLT5zYV9mYW1pbHksIFNPQ0tfU1RSRUFNLCAwKTsKIAorICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfRVZFTlQsIHBjLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgInNvY2tldCAlZCIsIHMpOworCiAgICAgaWYgKHMgPT0gLTEpIHsKICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCBwYy0+bG9nLCBuZ3hfc29ja2V0X2Vycm5vLAogICAgICAgICAgICAgICAgICAgICAgIG5neF9zb2NrZXRfbiAiIGZhaWxlZCIpOwpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudF9vcGVuc3NsLmMgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X29wZW5zc2wuYwppbmRleCBkMjEzZWIxLi5hZmRmNDYzIDEwMDY0NAotLS0gYS9zcmMvZXZlbnQvbmd4X2V2ZW50X29wZW5zc2wuYworKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X29wZW5zc2wuYwpAQCAtMTcwLDcgKzE3MCw3IEBACiAKICAgICAgICAgaWYgKGMtPnNzbC0+c2F2ZWRfd3JpdGVfaGFuZGxlcikgewogCi0gICAgICAgICAgICBjLT53cml0ZS0+ZXZlbnRfaGFuZGxlciA9IGMtPnNzbC0+c2F2ZWRfd3JpdGVfaGFuZGxlcjsKKyAgICAgICAgICAgIGMtPndyaXRlLT5oYW5kbGVyID0gYy0+c3NsLT5zYXZlZF93cml0ZV9oYW5kbGVyOwogICAgICAgICAgICAgYy0+c3NsLT5zYXZlZF93cml0ZV9oYW5kbGVyID0gTlVMTDsKICAgICAgICAgICAgIGMtPndyaXRlLT5yZWFkeSA9IDE7CiAKQEAgLTIyMyw4ICsyMjMsOCBAQAogICAgICAgICAgKi8KIAogICAgICAgICBpZiAoYy0+c3NsLT5zYXZlZF93cml0ZV9oYW5kbGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGMtPnNzbC0+c2F2ZWRfd3JpdGVfaGFuZGxlciA9IGMtPndyaXRlLT5ldmVudF9oYW5kbGVyOwotICAgICAgICAgICAgYy0+d3JpdGUtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfc3NsX3dyaXRlX2hhbmRsZXI7CisgICAgICAgICAgICBjLT5zc2wtPnNhdmVkX3dyaXRlX2hhbmRsZXIgPSBjLT53cml0ZS0+aGFuZGxlcjsKKyAgICAgICAgICAgIGMtPndyaXRlLT5oYW5kbGVyID0gbmd4X3NzbF93cml0ZV9oYW5kbGVyOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIE5HWF9BR0FJTjsKQEAgLTI1Myw3ICsyNTMsNyBAQAogICAgIG5neF9jb25uZWN0aW9uX3QgICpjOwogCiAgICAgYyA9IHdldi0+ZGF0YTsKLSAgICBjLT5yZWFkLT5ldmVudF9oYW5kbGVyKGMtPnJlYWQpOworICAgIGMtPnJlYWQtPmhhbmRsZXIoYy0+cmVhZCk7CiB9CiAKIApAQCAtNDA1LDcgKzQwNSw3IEBACiAgICAgaWYgKG4gPiAwKSB7CiAgICAgICAgIGlmIChjLT5zc2wtPnNhdmVkX3JlYWRfaGFuZGxlcikgewogCi0gICAgICAgICAgICBjLT5yZWFkLT5ldmVudF9oYW5kbGVyID0gYy0+c3NsLT5zYXZlZF9yZWFkX2hhbmRsZXI7CisgICAgICAgICAgICBjLT5yZWFkLT5oYW5kbGVyID0gYy0+c3NsLT5zYXZlZF9yZWFkX2hhbmRsZXI7CiAgICAgICAgICAgICBjLT5zc2wtPnNhdmVkX3JlYWRfaGFuZGxlciA9IE5VTEw7CiAgICAgICAgICAgICBjLT5yZWFkLT5yZWFkeSA9IDE7CiAKQEAgLTQ2MCw4ICs0NjAsOCBAQAogICAgICAgICAgKi8KIAogICAgICAgICBpZiAoYy0+c3NsLT5zYXZlZF9yZWFkX2hhbmRsZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgYy0+c3NsLT5zYXZlZF9yZWFkX2hhbmRsZXIgPSBjLT5yZWFkLT5ldmVudF9oYW5kbGVyOwotICAgICAgICAgICAgYy0+cmVhZC0+ZXZlbnRfaGFuZGxlciA9IG5neF9zc2xfcmVhZF9oYW5kbGVyOworICAgICAgICAgICAgYy0+c3NsLT5zYXZlZF9yZWFkX2hhbmRsZXIgPSBjLT5yZWFkLT5oYW5kbGVyOworICAgICAgICAgICAgYy0+cmVhZC0+aGFuZGxlciA9IG5neF9zc2xfcmVhZF9oYW5kbGVyOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIE5HWF9BR0FJTjsKQEAgLTQ4Miw3ICs0ODIsNyBAQAogICAgIG5neF9jb25uZWN0aW9uX3QgICpjOwogCiAgICAgYyA9IHJldi0+ZGF0YTsKLSAgICBjLT53cml0ZS0+ZXZlbnRfaGFuZGxlcihjLT53cml0ZSk7CisgICAgYy0+d3JpdGUtPmhhbmRsZXIoYy0+d3JpdGUpOwogfQogCiAKQEAgLTU5MiwzICs1OTIsMTIgQEAKIAogICAgIG5neF9sb2dfZXJyb3IobGV2ZWwsIGxvZywgZXJyLCAiJXMpIiwgZXJyc3RyKTsKIH0KKworCit2b2lkCituZ3hfc3NsX2NsZWFudXBfY3R4KHZvaWQgKmRhdGEpCit7CisgICBTU0xfQ1RYICAqY3R4ID0gZGF0YTsKKworICAgU1NMX0NUWF9mcmVlKGN0eCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvZXZlbnQvbmd4X2V2ZW50X29wZW5zc2wuaCBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5oCmluZGV4IGFmZWJkZTYuLjg3OTdmY2QgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5oCisrKyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfb3BlbnNzbC5oCkBAIC01NCw2ICs1NCw3IEBACiBuZ3hfaW50X3Qgbmd4X3NzbF9zaHV0ZG93bihuZ3hfY29ubmVjdGlvbl90ICpjKTsKIHZvaWQgbmd4X3NzbF9lcnJvcihuZ3hfdWludF90IGxldmVsLCBuZ3hfbG9nX3QgKmxvZywgbmd4X2Vycl90IGVyciwKICAgICBjaGFyICpmbXQsIC4uLik7Cit2b2lkIG5neF9zc2xfY2xlYW51cF9jdHgodm9pZCAqZGF0YSk7CiAKIAogI2VuZGlmIC8qIF9OR1hfRVZFTlRfT1BFTlNTTF9IX0lOQ0xVREVEXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudF9waXBlLmMgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X3BpcGUuYwppbmRleCA1ZjlkN2MwLi41ZDI2NDA1IDEwMDY0NAotLS0gYS9zcmMvZXZlbnQvbmd4X2V2ZW50X3BpcGUuYworKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X3BpcGUuYwpAQCAtNjQsMTMgKzY0LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAocC0+ZG93bnN0cmVhbS0+ZmQgIT0gLTEpIHsKKyAgICBpZiAocC0+ZG93bnN0cmVhbS0+ZmQgIT0gLTEgJiYgcC0+ZG93bnN0cmVhbS0+ZGF0YSA9PSBwLT5vdXRwdXRfY3R4KSB7CiAgICAgICAgIHdldiA9IHAtPmRvd25zdHJlYW0tPndyaXRlOwogICAgICAgICBpZiAobmd4X2hhbmRsZV93cml0ZV9ldmVudCh3ZXYsIHAtPnNlbmRfbG93YXQpID09IE5HWF9FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9BQk9SVDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh3ZXYtPmFjdGl2ZSkgeworICAgICAgICBpZiAod2V2LT5hY3RpdmUgJiYgIXdldi0+cmVhZHkgJiYgIXdldi0+ZGVsYXllZCkgewogICAgICAgICAgICAgbmd4X2FkZF90aW1lcih3ZXYsIHAtPnNlbmRfdGltZW91dCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xODAsOCArMTgwLDEwIEBACiAgICAgICAgICAgICAgICAgY2hhaW4tPmJ1ZiA9IGI7CiAgICAgICAgICAgICAgICAgY2hhaW4tPm5leHQgPSBOVUxMOwogCi0gICAgICAgICAgICB9IGVsc2UgaWYgKCFwLT5jYWNoYWJsZSAmJiBwLT5kb3duc3RyZWFtLT53cml0ZS0+cmVhZHkpIHsKLQorICAgICAgICAgICAgfSBlbHNlIGlmICghcC0+Y2FjaGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgcC0+ZG93bnN0cmVhbS0+ZGF0YSA9PSBwLT5vdXRwdXRfY3R4CisgICAgICAgICAgICAgICAgICAgICAgICYmIHAtPmRvd25zdHJlYW0tPndyaXRlLT5yZWFkeSkKKyAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIGlmIHRoZSBidWZzIGFyZSBub3QgbmVlZGVkIHRvIGJlIHNhdmVkIGluIGEgY2FjaGUgYW5kCiAgICAgICAgICAgICAgICAgICogYSBkb3duc3RyZWFtIGlzIHJlYWR5IHRoZW4gd3JpdGUgdGhlIGJ1ZnMgdG8gYSBkb3duc3RyZWFtCkBAIC00MDksMTAgKzQxMSwxOCBAQAogCiAgICAgICAgICAgICAvKiBwYXNzIHRoZSBwLT5vdXQgYW5kIHAtPmluIGNoYWlucyB0byB0aGUgb3V0cHV0IGZpbHRlciAqLwogCisgICAgICAgICAgICBmb3IgKGNsID0gcC0+YnVzeTsgY2w7IGNsID0gY2wtPm5leHQpIHsKKyAgICAgICAgICAgICAgICBjbC0+YnVmLT5yZWN5Y2xlZCA9IDA7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChwLT5vdXQpIHsKICAgICAgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0VWRU5ULCBwLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpcGUgd3JpdGUgZG93bnN0cmVhbSBmbHVzaCBvdXQiKTsKIAorICAgICAgICAgICAgICAgIGZvciAoY2wgPSBwLT5vdXQ7IGNsOyBjbCA9IGNsLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGNsLT5idWYtPnJlY3ljbGVkID0gMDsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBpZiAocC0+b3V0cHV0X2ZpbHRlcihwLT5vdXRwdXRfY3R4LCBwLT5vdXQpID09IE5HWF9FUlJPUikgewogICAgICAgICAgICAgICAgICAgICBwLT5kb3duc3RyZWFtX2Vycm9yID0gMTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5neF9ldmVudF9waXBlX2RyYWluX2NoYWlucyhwKTsKQEAgLTQyNSw2ICs0MzUsMTAgQEAKICAgICAgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0VWRU5ULCBwLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpcGUgd3JpdGUgZG93bnN0cmVhbSBmbHVzaCBpbiIpOwogCisgICAgICAgICAgICAgICAgZm9yIChjbCA9IHAtPmluOyBjbDsgY2wgPSBjbC0+bmV4dCkgeworICAgICAgICAgICAgICAgICAgICBjbC0+YnVmLT5yZWN5Y2xlZCA9IDA7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgaWYgKHAtPm91dHB1dF9maWx0ZXIocC0+b3V0cHV0X2N0eCwgcC0+aW4pID09IE5HWF9FUlJPUikgewogICAgICAgICAgICAgICAgICAgICBwLT5kb3duc3RyZWFtX2Vycm9yID0gMTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5neF9ldmVudF9waXBlX2RyYWluX2NoYWlucyhwKTsKQEAgLTQ0Miw3ICs0NTYsOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIXAtPmRvd25zdHJlYW0tPndyaXRlLT5yZWFkeSkgeworICAgICAgICBpZiAocC0+ZG93bnN0cmVhbS0+ZGF0YSAhPSBwLT5vdXRwdXRfY3R4CisgICAgICAgICAgICB8fCAhcC0+ZG93bnN0cmVhbS0+d3JpdGUtPnJlYWR5KQorICAgICAgICB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvZXZlbnQvbmd4X2V2ZW50X3Bvc3RlZC5jIGIvc3JjL2V2ZW50L25neF9ldmVudF9wb3N0ZWQuYwppbmRleCA4MDUwYzMyLi4xODFhYjRjIDEwMDY0NAotLS0gYS9zcmMvZXZlbnQvbmd4X2V2ZW50X3Bvc3RlZC5jCisrKyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfcG9zdGVkLmMKQEAgLTMzLDcgKzMzLDcgQEAKIAogICAgICAgICBuZ3hfZGVsZXRlX3Bvc3RlZF9ldmVudChldik7CiAKLSAgICAgICAgZXYtPmV2ZW50X2hhbmRsZXIoZXYpOworICAgICAgICBldi0+aGFuZGxlcihldik7CiAgICAgfQogfQogCkBAIC0xMzcsNyArMTM3LDcgQEAKIAogICAgICAgICAgICAgbmd4X211dGV4X3VubG9jayhuZ3hfcG9zdGVkX2V2ZW50c19tdXRleCk7CiAKLSAgICAgICAgICAgIGV2LT5ldmVudF9oYW5kbGVyKGV2KTsKKyAgICAgICAgICAgIGV2LT5oYW5kbGVyKGV2KTsKIAogICAgICAgICAgICAgaWYgKG5neF9tdXRleF9sb2NrKG5neF9wb3N0ZWRfZXZlbnRzX211dGV4KSA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwpkaWZmIC0tZ2l0IGEvc3JjL2V2ZW50L25neF9ldmVudF90aW1lci5jIGIvc3JjL2V2ZW50L25neF9ldmVudF90aW1lci5jCmluZGV4IDc2NTVjNGYuLmZkZWM0NDYgMTAwNjQ0Ci0tLSBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfdGltZXIuYworKysgYi9zcmMvZXZlbnQvbmd4X2V2ZW50X3RpbWVyLmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogCiAgICAgICAgICAgICBldi0+dGltZWRvdXQgPSAxOwogCi0gICAgICAgICAgICBldi0+ZXZlbnRfaGFuZGxlcihldik7CisgICAgICAgICAgICBldi0+aGFuZGxlcihldik7CiAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2FjY2Vzc19tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYWNjZXNzX21vZHVsZS5jCmluZGV4IDY4NWQxNWQuLjQ3Zjk5NDQgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYWNjZXNzX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYWNjZXNzX21vZHVsZS5jCkBAIC01NCw3ICs1NCw4IEBACiAKIAogbmd4X2h0dHBfbW9kdWxlX3QgIG5neF9odHRwX2FjY2Vzc19tb2R1bGVfY3R4ID0gewotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZSBjb25mICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3Rjb25maWd1cmF0aW9uICovCiAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtYWluIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTY4LDcgKzY5LDcgQEAKIAogCiBuZ3hfbW9kdWxlX3QgIG5neF9odHRwX2FjY2Vzc19tb2R1bGUgPSB7Ci0gICAgTkdYX01PRFVMRSwKKyAgICBOR1hfTU9EVUxFX1YxLAogICAgICZuZ3hfaHR0cF9hY2Nlc3NfbW9kdWxlX2N0eCwgICAgICAgICAgIC8qIG1vZHVsZSBjb250ZXh0ICovCiAgICAgbmd4X2h0dHBfYWNjZXNzX2NvbW1hbmRzLCAgICAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KICAgICBOR1hfSFRUUF9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgdHlwZSAqLwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9hdXRoX2Jhc2ljX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9hdXRoX2Jhc2ljX21vZHVsZS5jCmluZGV4IDAzMzE0YjUuLjk4YzQ3YmQgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYXV0aF9iYXNpY19tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2F1dGhfYmFzaWNfbW9kdWxlLmMKQEAgLTYwLDcgKzYwLDggQEAKIAogCiBuZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfYXV0aF9iYXNpY19tb2R1bGVfY3R4ID0gewotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZSBjb25mICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3Rjb25maWd1cmF0aW9uICovCiAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtYWluIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTc0LDcgKzc1LDcgQEAKIAogCiBuZ3hfbW9kdWxlX3QgIG5neF9odHRwX2F1dGhfYmFzaWNfbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X2h0dHBfYXV0aF9iYXNpY19tb2R1bGVfY3R4LCAgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLwogICAgIG5neF9odHRwX2F1dGhfYmFzaWNfY29tbWFuZHMsICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0hUVFBfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KQEAgLTMyNyw2ICszMjgsNyBAQAogICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgIH0KIAorICAgIHItPmhlYWRlcnNfb3V0Lnd3d19hdXRoZW50aWNhdGUtPmhhc2ggPSAxOwogICAgIHItPmhlYWRlcnNfb3V0Lnd3d19hdXRoZW50aWNhdGUtPmtleS5sZW4gPSBzaXplb2YoIldXVy1BdXRoZW50aWNhdGUiKSAtIDE7CiAgICAgci0+aGVhZGVyc19vdXQud3d3X2F1dGhlbnRpY2F0ZS0+a2V5LmRhdGEgPSAodV9jaGFyICopICJXV1ctQXV0aGVudGljYXRlIjsKICAgICByLT5oZWFkZXJzX291dC53d3dfYXV0aGVudGljYXRlLT52YWx1ZSA9ICpyZWFsbTsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYXV0b2luZGV4X21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9hdXRvaW5kZXhfbW9kdWxlLmMKaW5kZXggZmYxNjNlZC4uNzZjNWIwMyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9hdXRvaW5kZXhfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9hdXRvaW5kZXhfbW9kdWxlLmMKQEAgLTYzLDcgKzYzLDggQEAKIAogCiBuZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfYXV0b2luZGV4X21vZHVsZV9jdHggPSB7Ci0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlIGNvbmYgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmVjb25maWd1cmF0aW9uICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdGNvbmZpZ3VyYXRpb24gKi8KIAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLwpAQCAtNzcsNyArNzgsNyBAQAogCiAKIG5neF9tb2R1bGVfdCAgbmd4X2h0dHBfYXV0b2luZGV4X21vZHVsZSA9IHsKLSAgICBOR1hfTU9EVUxFLAorICAgIE5HWF9NT0RVTEVfVjEsCiAgICAgJm5neF9odHRwX2F1dG9pbmRleF9tb2R1bGVfY3R4LCAgICAgICAgLyogbW9kdWxlIGNvbnRleHQgKi8gCiAgICAgbmd4X2h0dHBfYXV0b2luZGV4X2NvbW1hbmRzLCAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KICAgICBOR1hfSFRUUF9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgdHlwZSAqLwpAQCAtNDE5LDE2ICs0MjAsOCBAQAogCiAgICAgci0+aGVhZGVyc19vdXQuc3RhdHVzID0gTkdYX0hUVFBfT0s7CiAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGhfbiA9IGItPmxhc3QgLSBiLT5wb3M7Ci0KLSAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUgPSBuZ3hfbGlzdF9wdXNoKCZyLT5oZWFkZXJzX291dC5oZWFkZXJzKTsKLSAgICBpZiAoci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0KLSAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUtPmtleS5sZW4gPSAwOwotICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS0+a2V5LmRhdGEgPSBOVUxMOwotICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS0+dmFsdWUubGVuID0gc2l6ZW9mKCJ0ZXh0L2h0bWwiKSAtIDE7Ci0gICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLT52YWx1ZS5kYXRhID0gKHVfY2hhciAqKSAidGV4dC9odG1sIjsKKyAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUubGVuID0gc2l6ZW9mKCJ0ZXh0L2h0bWwiKSAtIDE7CisgICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmRhdGEgPSAodV9jaGFyICopICJ0ZXh0L2h0bWwiOwogCiAgICAgcmMgPSBuZ3hfaHR0cF9zZW5kX2hlYWRlcihyKTsKIApAQCAtNDM2LDEwICs0MjksMTIgQEAKICAgICAgICAgcmV0dXJuIHJjOwogICAgIH0KIAotICAgIGlmICghci0+bWFpbikgeworICAgIGlmIChyLT5tYWluID09IE5VTEwpIHsKICAgICAgICAgYi0+bGFzdF9idWYgPSAxOwogICAgIH0KIAorICAgIGItPmxhc3RfaW5fY2hhaW4gPSAxOworCiAgICAgb3V0LmJ1ZiA9IGI7CiAgICAgb3V0Lm5leHQgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2NoYXJzZXRfZmlsdGVyX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9jaGFyc2V0X2ZpbHRlcl9tb2R1bGUuYwppbmRleCBkYWQyNmJhLi4wYzc2YTVmIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2NoYXJzZXRfZmlsdGVyX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfY2hhcnNldF9maWx0ZXJfbW9kdWxlLmMKQEAgLTEwNiw3ICsxMDYsOCBAQAogCiAKIHN0YXRpYyBuZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfY2hhcnNldF9maWx0ZXJfbW9kdWxlX2N0eCA9IHsKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmUgY29uZiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZWNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3N0Y29uZmlndXJhdGlvbiAqLwogCiAgICAgbmd4X2h0dHBfY2hhcnNldF9jcmVhdGVfbWFpbl9jb25mLCAgICAgLyogY3JlYXRlIG1haW4gY29uZmlndXJhdGlvbiAqLwogICAgIG5neF9odHRwX2NoYXJzZXRfaW5pdF9tYWluX2NvbmYsICAgICAgIC8qIGluaXQgbWFpbiBjb25maWd1cmF0aW9uICovCkBAIC0xMjAsNyArMTIxLDcgQEAKIAogCiBuZ3hfbW9kdWxlX3QgIG5neF9odHRwX2NoYXJzZXRfZmlsdGVyX21vZHVsZSA9IHsKLSAgICBOR1hfTU9EVUxFLAorICAgIE5HWF9NT0RVTEVfVjEsCiAgICAgJm5neF9odHRwX2NoYXJzZXRfZmlsdGVyX21vZHVsZV9jdHgsICAgLyogbW9kdWxlIGNvbnRleHQgKi8KICAgICBuZ3hfaHR0cF9jaGFyc2V0X2ZpbHRlcl9jb21tYW5kcywgICAgICAvKiBtb2R1bGUgZGlyZWN0aXZlcyAqLwogICAgIE5HWF9IVFRQX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSB0eXBlICovCkBAIC0xNDgsMTkgKzE0OSwxOCBAQAogICAgICAgICByZXR1cm4gbmd4X2h0dHBfbmV4dF9oZWFkZXJfZmlsdGVyKHIpOwogICAgIH0KIAotICAgIGlmIChyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUgPT0gTlVMTCkgeworICAgIGlmIChyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUubGVuID09IDApIHsKICAgICAgICAgcmV0dXJuIG5neF9odHRwX25leHRfaGVhZGVyX2ZpbHRlcihyKTsKICAgICB9CiAKLSAgICBpZiAobmd4X3N0cm5jYXNlY21wKHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS0+dmFsdWUuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQvIiwgNSkgIT0gMAotICAgICAgICAmJiBuZ3hfc3RybmNhc2VjbXAoci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLT52YWx1ZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsIDI0KSAhPSAwKQorICAgIGlmIChuZ3hfc3RybmNhc2VjbXAoci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmRhdGEsICJ0ZXh0LyIsIDUpICE9IDAKKyAgICAgICAgJiYgbmd4X3N0cm5jYXNlY21wKHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsIDI0KSAhPSAwKQogICAgIHsKICAgICAgICAgcmV0dXJuIG5neF9odHRwX25leHRfaGVhZGVyX2ZpbHRlcihyKTsKICAgICB9CiAKLSAgICBpZiAobmd4X3N0cnN0cihyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUtPnZhbHVlLmRhdGEsICJjaGFyc2V0IikgIT0gTlVMTCkKKyAgICBpZiAobmd4X3N0cnN0cihyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUuZGF0YSwgImNoYXJzZXQiKSAhPSBOVUxMKQogICAgIHsKICAgICAgICAgcmV0dXJuIG5neF9odHRwX25leHRfaGVhZGVyX2ZpbHRlcihyKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2NodW5rZWRfZmlsdGVyX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9jaHVua2VkX2ZpbHRlcl9tb2R1bGUuYwppbmRleCBiNzQyZGJiLi40MTM2NjEzIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2NodW5rZWRfZmlsdGVyX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfY2h1bmtlZF9maWx0ZXJfbW9kdWxlLmMKQEAgLTEzLDcgKzEzLDggQEAKIAogCiBzdGF0aWMgbmd4X2h0dHBfbW9kdWxlX3QgIG5neF9odHRwX2NodW5rZWRfZmlsdGVyX21vZHVsZV9jdHggPSB7Ci0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlIGNvbmYgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmVjb25maWd1cmF0aW9uICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdGNvbmZpZ3VyYXRpb24gKi8KIAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLwpAQCAtMjcsNyArMjgsNyBAQAogCiAKIG5neF9tb2R1bGVfdCAgbmd4X2h0dHBfY2h1bmtlZF9maWx0ZXJfbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X2h0dHBfY2h1bmtlZF9maWx0ZXJfbW9kdWxlX2N0eCwgICAvKiBtb2R1bGUgY29udGV4dCAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0hUVFBfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KQEAgLTQzLDcgKzQ0LDcgQEAKIHN0YXRpYyBuZ3hfaW50X3QKIG5neF9odHRwX2NodW5rZWRfaGVhZGVyX2ZpbHRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7Ci0gICAgaWYgKHItPmhlYWRlcnNfb3V0LnN0YXR1cyA9PSBOR1hfSFRUUF9OT1RfTU9ESUZJRUQpIHsKKyAgICBpZiAoci0+aGVhZGVyc19vdXQuc3RhdHVzID09IE5HWF9IVFRQX05PVF9NT0RJRklFRCB8fCByLT5tYWluKSB7CiAgICAgICAgIHJldHVybiBuZ3hfaHR0cF9uZXh0X2hlYWRlcl9maWx0ZXIocik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2Zhc3RjZ2lfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2Zhc3RjZ2lfbW9kdWxlLmMKaW5kZXggNGI5MmNkNC4uY2Y5ZDAwOCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUuYwpAQCAtMTUsMzcgKzE1LDE0IEBACiAKICAgICBuZ3hfcGVlcnNfdCAgICAgICAgICAgICAgICAgICAgKnBlZXJzOwogCi0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM7Ci0KLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgIHJvb3Q7CiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKIAotICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAgICAqdmFyczsKLQotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAqbG9jYXRpb247CisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgICAgICpwYXJhbXNfbGVuOworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAgICAqcGFyYW1zOworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAgICAqcGFyYW1zX3NvdXJjZTsKIH0gbmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90OwogCiAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfbGlzdF90ICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM7Ci0KLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgKnN0YXR1czsKLQotICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqY29udGVudF90eXBlOwotICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqY29udGVudF9sZW5ndGg7Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICp4X3Bvd2VyZWRfYnk7Ci0KLSNpZiAoTkdYX0hUVFBfR1pJUCkKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgKmNvbnRlbnRfZW5jb2Rpbmc7Ci0jZW5kaWYKLX0gbmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJzX2luX3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyc19pbl90ICAgaGVhZGVyc19pbjsKLX0gbmd4X2h0dHBfZmFzdGNnaV91cHN0cmVhbV90OwotCi0KIHR5cGVkZWYgZW51bSB7CiAgICAgbmd4X2h0dHBfZmFzdGNnaV9zdF92ZXJzaW9uID0gMCwKICAgICBuZ3hfaHR0cF9mYXN0Y2dpX3N0X3R5cGUsCkBAIC02OSwyOCArNDYsOSBAQAogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc7CiAKICAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICBoZWFkZXI7Ci0KLSAgICBuZ3hfaHR0cF9mYXN0Y2dpX3Vwc3RyZWFtX3QgICp1cHN0cmVhbTsKIH0gbmd4X2h0dHBfZmFzdGNnaV9jdHhfdDsKIAogCi0jZGVmaW5lIE5HWF9IVFRQX0ZBU1RDR0lfUkVNT1RFX0FERFIgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBOR1hfSFRUUF9GQVNUQ0dJX1JFTU9URV9VU0VSICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfTkFNRSAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIE5HWF9IVFRQX0ZBU1RDR0lfU0VSVkVSX0FERFIgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9QT1JUICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9TQ1JJUFRfTkFNRSAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIE5HWF9IVFRQX0ZBU1RDR0lfQVVUSF9UWVBFICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9QUk9UT0NPTCAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfU09GVFdBUkUgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIE5HWF9IVFRQX0ZBU1RDR0lfR0FURVdBWV9JTlRFUkZBQ0UgICAgMHgwMDAwMDQwMAotI2RlZmluZSBOR1hfSFRUUF9GQVNUQ0dJX1JFUVVFU1RfVVJJICAgICAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9SRURJUkVDVF9TVEFUVVMgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIE5HWF9IVFRQX0ZBU1RDR0lfRE9DVU1FTlRfUk9PVCAgICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBOR1hfSFRUUF9GQVNUQ0dJX1NDUklQVF9GSUxFTkFNRSAgICAgIDB4MDAwMDQwMDAKLSNkZWZpbmUgTkdYX0hUVFBfRkFTVENHSV9SRU1PVEVfUE9SVCAgICAgICAgICAweDAwMDA4MDAwCi0KLQogI2RlZmluZSBOR1hfSFRUUF9GQVNUQ0dJX1JFU1BPTkRFUiAgICAgIDEKIAogI2RlZmluZSBOR1hfSFRUUF9GQVNUQ0dJX0JFR0lOX1JFUVVFU1QgIDEKQEAgLTEyMywxMCArODEsMjQgQEAKIH0gbmd4X2h0dHBfZmFzdGNnaV9iZWdpbl9yZXF1ZXN0X3Q7CiAKIAordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVfY2hhciAgdmVyc2lvbjsKKyAgICB1X2NoYXIgIHR5cGU7CisgICAgdV9jaGFyICByZXF1ZXN0X2lkX2hpOworICAgIHVfY2hhciAgcmVxdWVzdF9pZF9sbzsKK30gbmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfc21hbGxfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfdCAgICAgICAgIGgwOworICAgIG5neF9odHRwX2Zhc3RjZ2lfYmVnaW5fcmVxdWVzdF90ICBicjsKKyAgICBuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcl9zbWFsbF90ICAgaDE7Cit9IG5neF9odHRwX2Zhc3RjZ2lfcmVxdWVzdF9zdGFydF90OworCisKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZmFzdGNnaV9jcmVhdGVfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwogc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9mYXN0Y2dpX3JlaW5pdF9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqcik7CiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2Zhc3RjZ2lfcHJvY2Vzc19oZWFkZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZmFzdGNnaV9zZW5kX2hlYWRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwogc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9mYXN0Y2dpX2lucHV0X2ZpbHRlcihuZ3hfZXZlbnRfcGlwZV90ICpwLAogICAgIG5neF9idWZfdCAqYnVmKTsKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZmFzdGNnaV9wcm9jZXNzX3JlY29yZChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCkBAIC0xMzUsMjIgKzEwNyw1NCBAQAogc3RhdGljIHZvaWQgbmd4X2h0dHBfZmFzdGNnaV9maW5hbGl6ZV9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqciwKICAgICBuZ3hfaW50X3QgcmMpOwogCi1zdGF0aWMgY2hhciAqbmd4X2h0dHBfZmFzdGNnaV9wYXNzKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCi0gICAgdm9pZCAqY29uZik7Ci1zdGF0aWMgY2hhciAqbmd4X2h0dHBfZmFzdGNnaV9zZXRfdmFyKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCi0gICAgdm9pZCAqY29uZik7Ci1zdGF0aWMgY2hhciAqbmd4X2h0dHBfZmFzdGNnaV9sb3dhdF9jaGVjayhuZ3hfY29uZl90ICpjZiwgdm9pZCAqcG9zdCwKLSAgICB2b2lkICpkYXRhKTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZmFzdGNnaV9hZGRfdmFyaWFibGVzKG5neF9jb25mX3QgKmNmKTsKIHN0YXRpYyB2b2lkICpuZ3hfaHR0cF9mYXN0Y2dpX2NyZWF0ZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZik7CiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfZmFzdGNnaV9tZXJnZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZiwKICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKTsKK3N0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKKyAgICBuZ3hfaHR0cF9mYXN0Y2dpX3NjcmlwdF9uYW1lX3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICB1aW50cHRyX3QgZGF0YSk7CisKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9mYXN0Y2dpX3Bhc3Mobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKKyAgICB2b2lkICpjb25mKTsKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9mYXN0Y2dpX2xvd2F0X2NoZWNrKG5neF9jb25mX3QgKmNmLCB2b2lkICpwb3N0LAorICAgIHZvaWQgKmRhdGEpOwogCiAKK3N0YXRpYyBuZ3hfaHR0cF9mYXN0Y2dpX3JlcXVlc3Rfc3RhcnRfdCAgbmd4X2h0dHBfZmFzdGNnaV9yZXF1ZXN0X3N0YXJ0ID0geworICAgIHsgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZlcnNpb24gKi8KKyAgICAgIE5HWF9IVFRQX0ZBU1RDR0lfQkVHSU5fUkVRVUVTVCwgICAgICAgICAgICAgICAgICAvKiB0eXBlICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVxdWVzdF9pZF9oaSAqLworICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlcXVlc3RfaWRfbG8gKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb250ZW50X2xlbmd0aF9oaSAqLworICAgICAgc2l6ZW9mKG5neF9odHRwX2Zhc3RjZ2lfYmVnaW5fcmVxdWVzdF90KSwgICAgICAgIC8qIGNvbnRlbnRfbGVuZ3RoX2xvICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFkZGluZ19sZW5ndGggKi8KKyAgICAgIDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNlcnZlZCAqLworCisgICAgeyAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcm9sZV9oaSAqLworICAgICAgTkdYX0hUVFBfRkFTVENHSV9SRVNQT05ERVIsICAgICAgICAgICAgICAgICAgICAgIC8qIHJvbGVfbG8gKi8KKyAgICAgIDAsIC8qIE5HWF9IVFRQX0ZBU1RDR0lfS0VFUF9DT05OICovICAgICAgICAgICAgICAvKiBmbGFncyAqLworICAgICAgeyAwLCAwLCAwLCAwLCAwIH0gfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlc2VydmVkWzVdICovCisKKyAgICB7IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZXJzaW9uICovCisgICAgICBOR1hfSFRUUF9GQVNUQ0dJX1BBUkFNUywgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZSAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlcXVlc3RfaWRfaGkgKi8KKyAgICAgIDEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXF1ZXN0X2lkX2xvICovCisKK307CisKKworI2lmIDAKIHN0YXRpYyBuZ3hfc3RyX3Qgbmd4X2h0dHBfZmFzdGNnaV9tZXRob2RzW10gPSB7CiAgICAgbmd4X3N0cmluZygiR0VUIiksCiAgICAgbmd4X3N0cmluZygiSEVBRCIpLAogICAgIG5neF9zdHJpbmcoIlBPU1QiKQogfTsKKyNlbmRpZgorCisKK3N0YXRpYyBuZ3hfc3RyX3QgIG5neF9odHRwX2Zhc3RjZ2lfc2NyaXB0X25hbWUgPQorICAgIG5neF9zdHJpbmcoImZhc3RjZ2lfc2NyaXB0X25hbWUiKTsKIAogCiAjaWYgKE5HWF9QQ1JFKQpAQCAtMTU4LDMwICsxNjIsMTQgQEAKICNlbmRpZgogCiAKLXN0YXRpYyBuZ3hfaHR0cF9oZWFkZXJfdCBuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcnNfaW5bXSA9IHsKLSAgICB7IG5neF9zdHJpbmcoIlN0YXR1cyIpLCBvZmZzZXRvZihuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcnNfaW5fdCwgc3RhdHVzKSB9LAorc3RhdGljIG5neF9jb25mX3Bvc3RfdCAgbmd4X2h0dHBfZmFzdGNnaV9sb3dhdF9wb3N0ID0KKyAgICB7IG5neF9odHRwX2Zhc3RjZ2lfbG93YXRfY2hlY2sgfTsKIAotICAgIHsgbmd4X3N0cmluZygiQ29udGVudC1UeXBlIiksCi0gICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyc19pbl90LCBjb250ZW50X3R5cGUpIH0sCi0KLSAgICB7IG5neF9zdHJpbmcoIkNvbnRlbnQtTGVuZ3RoIiksCi0gICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyc19pbl90LCBjb250ZW50X2xlbmd0aCkgfSwKLQotICAgIHsgbmd4X3N0cmluZygiWC1Qb3dlcmVkLUJ5IiksCi0gICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyc19pbl90LCB4X3Bvd2VyZWRfYnkpIH0sCi0KLSNpZiAoTkdYX0hUVFBfR1pJUCkKLSAgICB7IG5neF9zdHJpbmcoIkNvbnRlbnQtRW5jb2RpbmciKSwKLSAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJzX2luX3QsIGNvbnRlbnRfZW5jb2RpbmcpIH0sCi0jZW5kaWYKLQorc3RhdGljIG5neF9jb25mX2VudW1fdCAgbmd4X2h0dHBfZmFzdGNnaV9zZXRfbWV0aG9kc1tdID0geworICAgIHsgbmd4X3N0cmluZygiZ2V0IiksIE5HWF9IVFRQX0dFVCB9LAogICAgIHsgbmd4X251bGxfc3RyaW5nLCAwIH0KIH07CiAKLQotc3RhdGljIG5neF9jb25mX3Bvc3RfdCAgbmd4X2h0dHBfZmFzdGNnaV9sb3dhdF9wb3N0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG5neF9odHRwX2Zhc3RjZ2lfbG93YXRfY2hlY2sgfTsKLQogc3RhdGljIG5neF9jb25mX2JpdG1hc2tfdCAgbmd4X2h0dHBfZmFzdGNnaV9uZXh0X3Vwc3RyZWFtX21hc2tzW10gPSB7CiAgICAgeyBuZ3hfc3RyaW5nKCJlcnJvciIpLCBOR1hfSFRUUF9VUFNUUkVBTV9GVF9FUlJPUiB9LAogICAgIHsgbmd4X3N0cmluZygidGltZW91dCIpLCBOR1hfSFRUUF9VUFNUUkVBTV9GVF9USU1FT1VUIH0sCkBAIC0xOTIsMjggKzE4MCw2IEBACiB9OwogCiAKLXN0YXRpYyBuZ3hfY29uZl9iaXRtYXNrX3QgIG5neF9odHRwX2Zhc3RjZ2lfcGFyYW1zX21hc2tzW10gPSB7Ci0gICAgeyBuZ3hfc3RyaW5nKCJyZW1vdGVfYWRkciIpLCBOR1hfSFRUUF9GQVNUQ0dJX1JFTU9URV9BRERSIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJzZXJ2ZXJfcG9ydCIpLCBOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9QT1JUIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJzZXJ2ZXJfYWRkciIpLCBOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9BRERSIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJzZXJ2ZXJfbmFtZSIpLCBOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9OQU1FIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJzY3JpcHRfbmFtZSIpLCBOR1hfSFRUUF9GQVNUQ0dJX1NDUklQVF9OQU1FIH0sCi0KLSAgICB7IG5neF9zdHJpbmcoInNlcnZlcl9wcm90b2NvbCIpLCBOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9QUk9UT0NPTCB9LAotICAgIHsgbmd4X3N0cmluZygic2VydmVyX3NvZnR3YXJlIiksIE5HWF9IVFRQX0ZBU1RDR0lfU0VSVkVSX1NPRlRXQVJFIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJnYXRld2F5X2ludGVyZmFjZSIpLCBOR1hfSFRUUF9GQVNUQ0dJX0dBVEVXQVlfSU5URVJGQUNFIH0sCi0KLSAgICB7IG5neF9zdHJpbmcoInJlZGlyZWN0X3N0YXR1cyIpLCBOR1hfSFRUUF9GQVNUQ0dJX1JFRElSRUNUX1NUQVRVUyB9LAotICAgIHsgbmd4X3N0cmluZygicmVxdWVzdF91cmkiKSwgTkdYX0hUVFBfRkFTVENHSV9SRVFVRVNUX1VSSSB9LAotCi0gICAgeyBuZ3hfc3RyaW5nKCJkb2N1bWVudF9yb290IiksIE5HWF9IVFRQX0ZBU1RDR0lfRE9DVU1FTlRfUk9PVCB9LAotICAgIHsgbmd4X3N0cmluZygic2NyaXB0X2ZpbGVuYW1lIiksIE5HWF9IVFRQX0ZBU1RDR0lfU0NSSVBUX0ZJTEVOQU1FIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJyZW1vdGVfcG9ydCIpLCBOR1hfSFRUUF9GQVNUQ0dJX1JFTU9URV9QT1JUIH0sCi0KLSAgICB7IG5neF9udWxsX3N0cmluZywgMCB9Ci19OwotCi0KIHN0YXRpYyBuZ3hfY29tbWFuZF90ICBuZ3hfaHR0cF9mYXN0Y2dpX2NvbW1hbmRzW10gPSB7CiAKICAgICB7IG5neF9zdHJpbmcoImZhc3RjZ2lfcGFzcyIpLApAQCAtMjIzLDEzICsxODksNiBAQAogICAgICAgMCwKICAgICAgIE5VTEwgfSwKIAotICAgIHsgbmd4X3N0cmluZygiZmFzdGNnaV9yb290IiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCi0gICAgICBuZ3hfY29uZl9zZXRfc3RyX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9mYXN0Y2dpX2xvY19jb25mX3QsIHJvb3QpLAotICAgICAgTlVMTCB9LAotCiAgICAgeyBuZ3hfc3RyaW5nKCJmYXN0Y2dpX2luZGV4IiksCiAgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCiAgICAgICBuZ3hfY29uZl9zZXRfc3RyX3Nsb3QsCkBAIC0yNjUsNiArMjI0LDI3IEBACiAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9mYXN0Y2dpX2xvY19jb25mX3QsIHVwc3RyZWFtLmhlYWRlcl9idWZmZXJfc2l6ZSksCiAgICAgICBOVUxMIH0sCiAKKyAgICB7IG5neF9zdHJpbmcoImZhc3RjZ2lfbWV0aG9kIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCisgICAgICBuZ3hfY29uZl9zZXRfZW51bV9zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90LCB1cHN0cmVhbS5tZXRob2QpLAorICAgICAgbmd4X2h0dHBfZmFzdGNnaV9zZXRfbWV0aG9kcyB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJmYXN0Y2dpX3Bhc3NfcmVxdWVzdF9oZWFkZXJzIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKKyAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9mYXN0Y2dpX2xvY19jb25mX3QsIHVwc3RyZWFtLnBhc3NfcmVxdWVzdF9oZWFkZXJzKSwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygiZmFzdGNnaV9wYXNzX3JlcXVlc3RfYm9keSIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX0ZMQUcsCisgICAgICBuZ3hfY29uZl9zZXRfZmxhZ19zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90LCB1cHN0cmVhbS5wYXNzX3JlcXVlc3RfYm9keSksCisgICAgICBOVUxMIH0sCisKICAgICB7IG5neF9zdHJpbmcoImZhc3RjZ2lfcmVkaXJlY3RfZXJyb3JzIiksCiAgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKICAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCkBAIC0yNzYsNyArMjU2LDcgQEAKICAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9GTEFHLAogICAgICAgbmd4X2NvbmZfc2V0X2ZsYWdfc2xvdCwKICAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKLSAgICAgIG9mZnNldG9mKG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCwgdXBzdHJlYW0ueF9wb3dlcmVkX2J5KSwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCwgdXBzdHJlYW0ucGFzc194X3Bvd2VyZWRfYnkpLAogICAgICAgTlVMTCB9LAogCiAgICAgeyBuZ3hfc3RyaW5nKCJmYXN0Y2dpX3JlYWRfdGltZW91dCIpLApAQCAtMzI4LDI2ICszMDgsMjAgQEAKICAgICAgIG9mZnNldG9mKG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCwgdXBzdHJlYW0ubmV4dF91cHN0cmVhbSksCiAgICAgICAmbmd4X2h0dHBfZmFzdGNnaV9uZXh0X3Vwc3RyZWFtX21hc2tzIH0sCiAKLSAgICB7IG5neF9zdHJpbmcoImZhc3RjZ2lfc2V0X3ZhciIpLAotICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAotICAgICAgbmd4X2h0dHBfZmFzdGNnaV9zZXRfdmFyLAorICAgIHsgbmd4X3N0cmluZygiZmFzdGNnaV9wYXJhbSIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UyLAorICAgICAgbmd4X2NvbmZfc2V0X3RhYmxlX2VsdF9zbG90LAogICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAotICAgICAgMCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCwgcGFyYW1zX3NvdXJjZSksCiAgICAgICBOVUxMIH0sCiAKLSAgICB7IG5neF9zdHJpbmcoImZhc3RjZ2lfcGFyYW1zIiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfQU5ZLAotICAgICAgbmd4X2NvbmZfc2V0X2JpdG1hc2tfc2xvdCwKLSAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKLSAgICAgIG9mZnNldG9mKG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCwgcGFyYW1zKSwKLSAgICAgICZuZ3hfaHR0cF9mYXN0Y2dpX3BhcmFtc19tYXNrcyB9LAotCiAgICAgICBuZ3hfbnVsbF9jb21tYW5kCiB9OwogCiAKIG5neF9odHRwX21vZHVsZV90ICBuZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZV9jdHggPSB7Ci0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlIGNvbmYgKi8KKyAgICBuZ3hfaHR0cF9mYXN0Y2dpX2FkZF92YXJpYWJsZXMsICAgICAgICAvKiBwcmVjb25maWd1cmF0aW9uICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdGNvbmZpZ3VyYXRpb24gKi8KIAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLwpAQCAtMzYxLDcgKzMzNSw3IEBACiAKIAogbmd4X21vZHVsZV90ICBuZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZSA9IHsKLSAgICBOR1hfTU9EVUxFLAorICAgIE5HWF9NT0RVTEVfVjEsCiAgICAgJm5neF9odHRwX2Zhc3RjZ2lfbW9kdWxlX2N0eCwgICAgICAgICAgLyogbW9kdWxlIGNvbnRleHQgKi8KICAgICBuZ3hfaHR0cF9mYXN0Y2dpX2NvbW1hbmRzLCAgICAgICAgICAgICAvKiBtb2R1bGUgZGlyZWN0aXZlcyAqLwogICAgIE5HWF9IVFRQX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSB0eXBlICovCkBAIC0zOTYsMjYgKzM3MCwxNSBAQAogCiAgICAgdS0+Y29uZiA9ICZmbGNmLT51cHN0cmVhbTsKIAotICAgIHUtPmxvY2F0aW9uMCA9IGZsY2YtPmxvY2F0aW9uOwotCiAgICAgdS0+Y3JlYXRlX3JlcXVlc3QgPSBuZ3hfaHR0cF9mYXN0Y2dpX2NyZWF0ZV9yZXF1ZXN0OwogICAgIHUtPnJlaW5pdF9yZXF1ZXN0ID0gbmd4X2h0dHBfZmFzdGNnaV9yZWluaXRfcmVxdWVzdDsKICAgICB1LT5wcm9jZXNzX2hlYWRlciA9IG5neF9odHRwX2Zhc3RjZ2lfcHJvY2Vzc19oZWFkZXI7Ci0gICAgdS0+c2VuZF9oZWFkZXIgPSBuZ3hfaHR0cF9mYXN0Y2dpX3NlbmRfaGVhZGVyOwogICAgIHUtPmFib3J0X3JlcXVlc3QgPSBuZ3hfaHR0cF9mYXN0Y2dpX2Fib3J0X3JlcXVlc3Q7CiAgICAgdS0+ZmluYWxpemVfcmVxdWVzdCA9IG5neF9odHRwX2Zhc3RjZ2lfZmluYWxpemVfcmVxdWVzdDsKIAogICAgIHUtPnBpcGUuaW5wdXRfZmlsdGVyID0gbmd4X2h0dHBfZmFzdGNnaV9pbnB1dF9maWx0ZXI7CiAgICAgdS0+cGlwZS5pbnB1dF9jdHggPSByOwogCi0gICAgdS0+bG9nX2N0eCA9IHItPmNvbm5lY3Rpb24tPmxvZy0+ZGF0YTsKLSAgICB1LT5sb2dfaGFuZGxlciA9IG5neF9odHRwX3Vwc3RyZWFtX2xvZ19lcnJvcjsKLQotICAgIHUtPnNjaGVtYTAubGVuID0gc2l6ZW9mKCJmYXN0Y2dpOi8vIikgLSAxOwotICAgIHUtPnNjaGVtYTAuZGF0YSA9ICh1X2NoYXIgKikgImZhc3RjZ2k6Ly8iOwotICAgIHUtPnVyaTAubGVuID0gc2l6ZW9mKCIvIikgLSAxOwotICAgIHUtPnVyaTAuZGF0YSA9ICh1X2NoYXIgKikgIi8iOwotCiAgICAgci0+dXBzdHJlYW0gPSB1OwogCiAgICAgcmMgPSBuZ3hfaHR0cF9yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHkociwgbmd4X2h0dHBfdXBzdHJlYW1faW5pdCk7CkBAIC00MzEsMjA2ICszOTQsNjcgQEAKIHN0YXRpYyBuZ3hfaW50X3QKIG5neF9odHRwX2Zhc3RjZ2lfY3JlYXRlX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyKQogewotICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2gsICpwb3MsIGFkZHJfdGV4dFtJTkVUX0FERFJTVFJMRU5dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydF90ZXh0W3NpemVvZigiNjU1MzUiKSAtIDFdOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgbGVuLCBpbmRleCwgcGFkZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJfbGVuLCBwb3J0X2xlbjsKLSAgICBvZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcG9zOwotICAgIG5neF9idWZfdCAgICAgICAgICAgICAgICAgICAgICAgICAqYjsKLSAgICBzb2NrbGVuX3QgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZW47Ci0gICAgbmd4X2NoYWluX3QgICAgICAgICAgICAgICAgICAgICAgICpjbCwgKmJvZHk7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICAgICBpLCBuLCBuZXh0LCAqdmluZGV4LCBwb3J0OwotICAgIG5neF9saXN0X3BhcnRfdCAgICAgICAgICAgICAgICAgICAqcGFydDsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICAgKmhlYWRlcjsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gICAgICAgICAgICAgICAgIHNpbiwgKnNpbnA7Ci0gICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgICAgICAgICAgICAgICp2YXI7Ci0gICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgICAgICAgICp2YWx1ZTsKLSAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICAgICAgICAgKmNsY2Y7Ci0gICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgICAgICAgICpjbWNmOwotICAgIG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyX3QgICAgICAgICAqaDsKLSAgICBuZ3hfaHR0cF9mYXN0Y2dpX2xvY19jb25mX3QgICAgICAgKmZsY2Y7Ci0gICAgbmd4X2h0dHBfZmFzdGNnaV9iZWdpbl9yZXF1ZXN0X3QgICpicjsKKyAgICBvZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3BvczsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICBjaCwgKnBvczsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBsZW4sIGtleV9sZW4sIHZhbF9sZW4sIHBhZGRpbmc7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgaSwgbiwgbmV4dDsKKyAgICBuZ3hfYnVmX3QgICAgICAgICAgICAgICAgICAgICpiOworICAgIG5neF9jaGFpbl90ICAgICAgICAgICAgICAgICAgKmNsLCAqYm9keTsKKyAgICBuZ3hfbGlzdF9wYXJ0X3QgICAgICAgICAgICAgICpwYXJ0OworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgKmhlYWRlcjsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfY29kZV9wdCAgICAgICBjb2RlOworICAgIG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAgICAgIGUsIGxlOworICAgIG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyX3QgICAgKmg7CisgICAgbmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90ICAqZmxjZjsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfbGVuX2NvZGVfcHQgICBsY29kZTsKIAorICAgIGxlbiA9IDA7CiAKICAgICBmbGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZSk7CiAKLSAgICBpZiAoKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfU0VSVkVSX0FERFIpICYmIHItPmluX2FkZHIgPT0gMCkgeworICAgIGlmIChmbGNmLT5wYXJhbXNfbGVuKSB7CisgICAgICAgIG5neF9tZW16ZXJvKCZsZSwgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCkpOwogCi0gICAgICAgIHNsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKLSAgICAgICAgaWYgKGdldHNvY2tuYW1lKHItPmNvbm5lY3Rpb24tPmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2luLCAmc2xlbikgPT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19DUklULCByLT5jb25uZWN0aW9uLT5sb2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9zb2NrZXRfZXJybm8sICJnZXRzb2NrbmFtZSgpIGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICAgICAgfQorICAgICAgICBsZS5pcCA9IGZsY2YtPnBhcmFtc19sZW4tPmVsdHM7CisgICAgICAgIGxlLnJlcXVlc3QgPSByOwogCi0gICAgICAgIHItPmluX2FkZHIgPSBzaW4uc2luX2FkZHIuc19hZGRyOwotICAgIH0KKyAgICAgICAgd2hpbGUgKCoodWludHB0cl90ICopIGxlLmlwKSB7CiAKLSAgICBhZGRyX2xlbiA9IG5neF9pbmV0X250b3Aoci0+Y29ubmVjdGlvbi0+bGlzdGVuaW5nLT5mYW1pbHksICZyLT5pbl9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyX3RleHQsIElORVRfQUREUlNUUkxFTik7Ci0gICAgaWYgKGFkZHJfbGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICB9CisgICAgICAgICAgICBsY29kZSA9ICoobmd4X2h0dHBfc2NyaXB0X2xlbl9jb2RlX3B0ICopIGxlLmlwOworICAgICAgICAgICAga2V5X2xlbiA9IGxjb2RlKCZsZSk7CiAKLSNpZiAoTkdYX1NVUFBSRVNTX1dBUk4pCi0gICAgY2xjZiA9IE5VTEw7Ci0gICAgdmFyID0gTlVMTDsKLSAgICB2aW5kZXggPSBOVUxMOwotI2VuZGlmCi0KLQotICAgIGlmIChyLT51cHN0cmVhbS0+bWV0aG9kKSB7Ci0gICAgICAgIGxlbiA9IDEgKyAxICsgc2l6ZW9mKCJSRVFVRVNUX01FVEhPRCIpIC0gMQotICAgICAgICAgICAgICAgICsgbmd4X2h0dHBfZmFzdGNnaV9tZXRob2RzW3ItPnVwc3RyZWFtLT5tZXRob2QgLSAxXS5sZW47Ci0gICAgCi0gICAgfSBlbHNlIHsKLSAgICAgICAgbGVuID0gMSArICgoci0+bWV0aG9kX25hbWUubGVuIC0gMSA+IDEyNykgPyA0IDogMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YoIlJFUVVFU1RfTUVUSE9EIikgLSAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgci0+bWV0aG9kX25hbWUubGVuIC0gMTsKLSAgICB9Ci0KLQotICAgIGluZGV4ID0gKHItPnVyaS5kYXRhW3ItPnVyaS5sZW4gLSAxXSA9PSAnLycpID8gZmxjZi0+aW5kZXgubGVuIDogMDsKLQotICAgIGxlbiArPSAxICsgKChmbGNmLT5yb290LmxlbiArIHItPnVyaS5sZW4gKyBpbmRleCA+IDEyNykgPyA0IDogMSkKLSAgICAgICAgKyBzaXplb2YoIlBBVEhfVFJBTlNMQVRFRCIpIC0gMSArIGZsY2YtPnJvb3QubGVuICsgci0+dXJpLmxlbiArIGluZGV4OwotCi0gICAgaWYgKHItPmFyZ3MubGVuKSB7Ci0gICAgICAgIGxlbiArPSAxICsgKChyLT5hcmdzLmxlbiA+IDEyNykgPyA0IDogMSkgKyBzaXplb2YoIlFVRVJZX1NUUklORyIpIC0gMQotICAgICAgICAgICAgKyByLT5hcmdzLmxlbjsKLSAgICB9Ci0KLSAgICBpZiAoci0+aGVhZGVyc19pbi5jb250ZW50X2xlbmd0aF9uID4gMCkgewotICAgICAgICBsZW4gKz0gMSArICgoci0+aGVhZGVyc19pbi5jb250ZW50X2xlbmd0aC0+dmFsdWUubGVuID4gMTI3KSA/IDQgOiAxKQotICAgICAgICAgICAgKyBzaXplb2YoIkNPTlRFTlRfTEVOR1RIIikgLSAxCi0gICAgICAgICAgICArIHItPmhlYWRlcnNfaW4uY29udGVudF9sZW5ndGgtPnZhbHVlLmxlbjsKLSAgICB9Ci0KLQotICAgIGlmIChyLT5oZWFkZXJzX2luLmNvbnRlbnRfdHlwZSkgewotICAgICAgICBsZW4gKz0gMSArICgoci0+aGVhZGVyc19pbi5jb250ZW50X3R5cGUtPnZhbHVlLmxlbiA+IDEyNykgPyA0IDogMSkKLSAgICAgICAgICAgICsgc2l6ZW9mKCJDT05URU5UX1RZUEUiKSAtIDEKLSAgICAgICAgICAgICsgci0+aGVhZGVyc19pbi5jb250ZW50X3R5cGUtPnZhbHVlLmxlbjsKLSAgICB9Ci0KLQotICAgIGlmIChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX1JFRElSRUNUX1NUQVRVUykgewotICAgICAgICBsZW4gKz0gMSArIDEgKyBzaXplb2YoIlJFRElSRUNUX1NUQVRVUzIwMCIpIC0gMTsKLSAgICB9Ci0KLSAgICBpZiAoZmxjZi0+cGFyYW1zICYgTkdYX0hUVFBfRkFTVENHSV9SRVFVRVNUX1VSSSkgewotICAgICAgICBsZW4gKz0gMSArICgoci0+dW5wYXJzZWRfdXJpLmxlbiA+IDEyNykgPyA0IDogMSkKLSAgICAgICAgICAgICsgc2l6ZW9mKCJSRVFVRVNUX1VSSSIpIC0gMSArIHItPnVucGFyc2VkX3VyaS5sZW47Ci0gICAgfQotCi0gICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfRE9DVU1FTlRfUk9PVCkgewotICAgICAgICBjbGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7Ci0gICAgICAgIGxlbiArPSAxICsgKChjbGNmLT5yb290LmxlbiA+IDEyNykgPyA0IDogMSkKLSAgICAgICAgICAgICsgc2l6ZW9mKCJET0NVTUVOVF9ST09UIikgLSAxICsgY2xjZi0+cm9vdC5sZW47Ci0gICAgfQotCi0gICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfU0NSSVBUX0ZJTEVOQU1FKSB7Ci0gICAgICAgIGxlbiArPSAxICsgKChmbGNmLT5yb290LmxlbiArIHItPnVyaS5sZW4gKyBpbmRleCA+IDEyNykgPyA0IDogMSkKLSAgICAgICAgICAgICsgc2l6ZW9mKCJTQ1JJUFRfRklMRU5BTUUiKSAtIDEKLSAgICAgICAgICAgICsgZmxjZi0+cm9vdC5sZW4gKyByLT51cmkubGVuICsgaW5kZXg7Ci0gICAgfQotCi0gICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfU0NSSVBUX05BTUUpIHsKLSAgICAgICAgbGVuICs9IDEgKyAoKHItPnVyaS5sZW4gKyBpbmRleCA+IDEyNykgPyA0IDogMSkKLSAgICAgICAgICAgICsgc2l6ZW9mKCJTQ1JJUFRfTkFNRSIpIC0gMSArIHItPnVyaS5sZW4gKyBpbmRleCA7Ci0gICAgfQotCi0gICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfUkVNT1RFX0FERFIpIHsKLSAgICAgICAgbGVuICs9IDEgKyAxICsgc2l6ZW9mKCJSRU1PVEVfQUREUiIpIC0gMSArIHItPmNvbm5lY3Rpb24tPmFkZHJfdGV4dC5sZW47Ci0gICAgfQotCi0gICAgcG9ydF9sZW4gPSAwOwotCi0gICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfUkVNT1RFX1BPUlQpIHsKLQotICAgICAgICAvKiBBRl9JTkVUIG9ubHkgKi8KLQotICAgICAgICBpZiAoci0+Y29ubmVjdGlvbi0+c29ja2FkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7Ci0gICAgICAgICAgICBzaW5wID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSByLT5jb25uZWN0aW9uLT5zb2NrYWRkcjsKLQotICAgICAgICAgICAgcG9ydCA9IG50b2hzKHNpbnAtPnNpbl9wb3J0KTsKLQotICAgICAgICAgICAgaWYgKHBvcnQgPiAwICYmIHBvcnQgPCA2NTUzNikgewotICAgICAgICAgICAgICAgIHBvcnRfbGVuID0gbmd4X3NwcmludGYocG9ydF90ZXh0LCAiJXVpIiwgcG9ydCkgLSBwb3J0X3RleHQ7CisgICAgICAgICAgICBmb3IgKHZhbF9sZW4gPSAwOyAqKHVpbnRwdHJfdCAqKSBsZS5pcDsgdmFsX2xlbiArPSBsY29kZSgmbGUpKSB7CisgICAgICAgICAgICAgICAgbGNvZGUgPSAqKG5neF9odHRwX3NjcmlwdF9sZW5fY29kZV9wdCAqKSBsZS5pcDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlLmlwICs9IHNpemVvZih1aW50cHRyX3QpOwogCi0gICAgICAgICAgICBsZW4gKz0gMSArIDEgKyBzaXplb2YoIlJFTU9URV9QT1JUIikgLSAxICsgcG9ydF9sZW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZmxjZi0+cGFyYW1zICYgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfTkFNRSkgewotICAgICAgICBsZW4gKz0gMSArIDEgKyBzaXplb2YoIlNFUlZFUl9OQU1FIikgLSAxICsgci0+c2VydmVyX25hbWUubGVuOwotICAgIH0KLQotICAgIGlmIChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9QT1JUKSB7Ci0gICAgICAgIGxlbiArPSAxICsgMSArIHNpemVvZigiU0VSVkVSX1BPUlQiKSAtIDEgKyByLT5wb3J0X3RleHQtPmxlbiAtIDE7Ci0gICAgfQotCi0gICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfU0VSVkVSX0FERFIpIHsKLSAgICAgICAgbGVuICs9IDEgKyAxICsgc2l6ZW9mKCJTRVJWRVJfQUREUiIpIC0gMSArIGFkZHJfbGVuOwotICAgIH0KLQotICAgIGlmIChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9QUk9UT0NPTAotICAgICAgICAmJiByLT5odHRwX3Byb3RvY29sLmxlbikKLSAgICB7Ci0gICAgICAgIGxlbiArPSAxICsgKChyLT5odHRwX3Byb3RvY29sLmxlbiA+IDEyNykgPyA0IDogMSkKLSAgICAgICAgICAgICsgc2l6ZW9mKCJTRVJWRVJfUFJPVE9DT0wiKSAtIDEgKyByLT5odHRwX3Byb3RvY29sLmxlbjsKLSAgICB9Ci0KLSAgICBpZiAoZmxjZi0+cGFyYW1zICYgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfU09GVFdBUkUpIHsKLSAgICAgICAgbGVuICs9IDEgKyAxICsgc2l6ZW9mKCJTRVJWRVJfU09GVFdBUkUiKSAtIDEgKyBzaXplb2YoTkdJTlhfVkVSKSAtIDE7Ci0gICAgfQotCi0gICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfR0FURVdBWV9JTlRFUkZBQ0UpIHsKLSAgICAgICAgbGVuICs9IDEgKyAxICsgc2l6ZW9mKCJHQVRFV0FZX0lOVEVSRkFDRSIpIC0gMSArIHNpemVvZigiQ0dJLzEuMSIpIC0gMTsKLSAgICB9Ci0KLQotICAgIGlmIChmbGNmLT52YXJzKSB7Ci0gICAgICAgIGNtY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX21haW5fY29uZihyLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7Ci0KLSAgICAgICAgdmFyID0gY21jZi0+dmFyaWFibGVzLmVsdHM7Ci0gICAgICAgIHZpbmRleCA9IGZsY2YtPnZhcnMtPmVsdHM7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGZsY2YtPnZhcnMtPm5lbHRzOyBpKyspIHsKLQotICAgICAgICAgICAgdmFsdWUgPSBuZ3hfaHR0cF9nZXRfaW5kZXhlZF92YXJpYWJsZShyLCB2aW5kZXhbaV0pOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHZhbHVlLT50ZXh0LmxlbikgewotICAgICAgICAgICAgICAgIGxlbiArPSAxICsgMSArIHZhclt2aW5kZXhbaV1dLm5hbWUubGVuICsgdmFsdWUtPnRleHQubGVuOworICAgICAgICAgICAgaWYgKHZhbF9sZW4pIHsKKyAgICAgICAgICAgICAgICBsZW4gKz0gMSArIGtleV9sZW4gKyAoKHZhbF9sZW4gPiAxMjcpID8gNCA6IDEpICsgdmFsX2xlbjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChmbGNmLT51cHN0cmVhbS5wYXNzX3JlcXVlc3RfaGVhZGVycykgewogCi0gICAgcGFydCA9ICZyLT5oZWFkZXJzX2luLmhlYWRlcnMucGFydDsKLSAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOworICAgICAgICBwYXJ0ID0gJnItPmhlYWRlcnNfaW4uaGVhZGVycy5wYXJ0OworICAgICAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOwogCi0gICAgZm9yIChpID0gMDsgLyogdm9pZCAqLzsgaSsrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IC8qIHZvaWQgKi87IGkrKykgewogCi0gICAgICAgIGlmIChpID49IHBhcnQtPm5lbHRzKSB7Ci0gICAgICAgICAgICBpZiAocGFydC0+bmV4dCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoaSA+PSBwYXJ0LT5uZWx0cykgeworICAgICAgICAgICAgICAgIGlmIChwYXJ0LT5uZXh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcGFydCA9IHBhcnQtPm5leHQ7CisgICAgICAgICAgICAgICAgaGVhZGVyID0gcGFydC0+ZWx0czsKKyAgICAgICAgICAgICAgICBpID0gMDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcGFydCA9IHBhcnQtPm5leHQ7Ci0gICAgICAgICAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOwotICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICBsZW4gKz0gKChzaXplb2YoIkhUVFBfIikgLSAxICsgaGVhZGVyW2ldLmtleS5sZW4gPiAxMjcpID8gNCA6IDEpCisgICAgICAgICAgICAgICAgKyAoKGhlYWRlcltpXS52YWx1ZS5sZW4gPiAxMjcpID8gNCA6IDEpCisgICAgICAgICAgICAgICAgKyBzaXplb2YoIkhUVFBfIikgLSAxICsgaGVhZGVyW2ldLmtleS5sZW4gKyBoZWFkZXJbaV0udmFsdWUubGVuOwogICAgICAgICB9Ci0KLSAgICAgICAgbGVuICs9ICgoaGVhZGVyW2ldLmtleS5sZW4gPiAxMjcpID8gNCA6IDEpCi0gICAgICAgICAgICArICgoaGVhZGVyW2ldLnZhbHVlLmxlbiA+IDEyNykgPyA0IDogMSkKLSAgICAgICAgICAgICsgNSArIGhlYWRlcltpXS5rZXkubGVuICsgaGVhZGVyW2ldLnZhbHVlLmxlbjsKICAgICB9CiAKIApAQCAtNjY3LDM2ICs0OTEsMTMgQEAKIAogICAgIGNsLT5idWYgPSBiOwogCi0gICAgaCA9IChuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcl90ICopIGItPnBvczsKLQotICAgIGgtPnZlcnNpb24gPSAxOwotICAgIGgtPnR5cGUgPSBOR1hfSFRUUF9GQVNUQ0dJX0JFR0lOX1JFUVVFU1Q7Ci0gICAgaC0+cmVxdWVzdF9pZF9oaSA9IDA7Ci0gICAgaC0+cmVxdWVzdF9pZF9sbyA9IDE7Ci0gICAgaC0+Y29udGVudF9sZW5ndGhfaGkgPSAwOwotICAgIGgtPmNvbnRlbnRfbGVuZ3RoX2xvID0gc2l6ZW9mKG5neF9odHRwX2Zhc3RjZ2lfYmVnaW5fcmVxdWVzdF90KTsKLSAgICBoLT5wYWRkaW5nX2xlbmd0aCA9IDA7Ci0gICAgaC0+cmVzZXJ2ZWQgPSAwOwotCi0gICAgYnIgPSAobmd4X2h0dHBfZmFzdGNnaV9iZWdpbl9yZXF1ZXN0X3QgKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYi0+cG9zICsgc2l6ZW9mKG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyX3QpKTsKLSAgICBici0+cm9sZV9oaSA9IDA7Ci0gICAgYnItPnJvbGVfbG8gPSBOR1hfSFRUUF9GQVNUQ0dJX1JFU1BPTkRFUjsKLSAgICBici0+ZmxhZ3MgPSAwOyAvKiBOR1hfSFRUUF9GQVNUQ0dJX0tFRVBfQ09OTiAqLwotICAgIGJyLT5yZXNlcnZlZFswXSA9IDA7Ci0gICAgYnItPnJlc2VydmVkWzFdID0gMDsKLSAgICBici0+cmVzZXJ2ZWRbMl0gPSAwOwotICAgIGJyLT5yZXNlcnZlZFszXSA9IDA7Ci0gICAgYnItPnJlc2VydmVkWzRdID0gMDsKKyAgICBuZ3hfbWVtY3B5KGItPnBvcywgJm5neF9odHRwX2Zhc3RjZ2lfcmVxdWVzdF9zdGFydCwKKyAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9mYXN0Y2dpX3JlcXVlc3Rfc3RhcnRfdCkpOwogCiAgICAgaCA9IChuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcl90ICopCiAgICAgICAgICAgICAgKGItPnBvcyArIHNpemVvZihuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcl90KQogICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2Yobmd4X2h0dHBfZmFzdGNnaV9iZWdpbl9yZXF1ZXN0X3QpKTsKIAotICAgIGgtPnZlcnNpb24gPSAxOwotICAgIGgtPnR5cGUgPSBOR1hfSFRUUF9GQVNUQ0dJX1BBUkFNUzsKLSAgICBoLT5yZXF1ZXN0X2lkX2hpID0gMDsKLSAgICBoLT5yZXF1ZXN0X2lkX2xvID0gMTsKICAgICBoLT5jb250ZW50X2xlbmd0aF9oaSA9ICh1X2NoYXIpICgobGVuID4+IDgpICYgMHhmZik7CiAgICAgaC0+Y29udGVudF9sZW5ndGhfbG8gPSAodV9jaGFyKSAobGVuICYgMHhmZik7CiAgICAgaC0+cGFkZGluZ19sZW5ndGggPSAodV9jaGFyKSBwYWRkaW5nOwpAQCAtNzA3LDM3NiArNTA4LDEwOSBAQAogICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2Yobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfdCk7CiAKIAotICAgICpiLT5sYXN0KysgPSBzaXplb2YoIlBBVEhfVFJBTlNMQVRFRCIpIC0gMTsKKyAgICBpZiAoZmxjZi0+cGFyYW1zX2xlbikgeworICAgICAgICBuZ3hfbWVtemVybygmZSwgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCkpOwogCi0gICAgbGVuID0gZmxjZi0+cm9vdC5sZW4gKyByLT51cmkubGVuICsgaW5kZXg7Ci0gICAgaWYgKGxlbiA+IDEyNykgewotICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKCgobGVuID4+IDI0KSAmIDB4N2YpIHwgMHg4MCk7Ci0gICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgobGVuID4+IDgpICYgMHhmZik7Ci0gICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAobGVuICYgMHhmZik7CisgICAgICAgIGUuaXAgPSBmbGNmLT5wYXJhbXMtPmVsdHM7CisgICAgICAgIGUucG9zID0gYi0+bGFzdDsKKyAgICAgICAgZS5yZXF1ZXN0ID0gcjsKIAotICAgIH0gZWxzZSB7Ci0gICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSBsZW47Ci0gICAgfQorICAgICAgICBsZS5pcCA9IGZsY2YtPnBhcmFtc19sZW4tPmVsdHM7CiAKLSAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiUEFUSF9UUkFOU0xBVEVEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIlBBVEhfVFJBTlNMQVRFRCIpIC0gMSk7Ci0gICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgZmxjZi0+cm9vdC5kYXRhLCBmbGNmLT5yb290Lmxlbik7Ci0gICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+dXJpLmRhdGEsIHItPnVyaS5sZW4pOworICAgICAgICB3aGlsZSAoKih1aW50cHRyX3QgKikgbGUuaXApIHsKIAotICAgIGlmIChpbmRleCkgewotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCBmbGNmLT5pbmRleC5kYXRhLCBpbmRleCk7Ci0gICAgfQorICAgICAgICAgICAgbGNvZGUgPSAqKG5neF9odHRwX3NjcmlwdF9sZW5fY29kZV9wdCAqKSBsZS5pcDsKKyAgICAgICAgICAgIGtleV9sZW4gPSAodV9jaGFyKSBsY29kZSgmbGUpOwogCisgICAgICAgICAgICBmb3IgKHZhbF9sZW4gPSAwOyAqKHVpbnRwdHJfdCAqKSBsZS5pcDsgdmFsX2xlbiArPSBsY29kZSgmbGUpKSB7CisgICAgICAgICAgICAgICAgbGNvZGUgPSAqKG5neF9odHRwX3NjcmlwdF9sZW5fY29kZV9wdCAqKSBsZS5pcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlLmlwICs9IHNpemVvZih1aW50cHRyX3QpOwogCi0gICAgKmItPmxhc3QrKyA9IHNpemVvZigiUkVRVUVTVF9NRVRIT0QiKSAtIDE7CisgICAgICAgICAgICBpZiAodmFsX2xlbikgeworICAgICAgICAgICAgICAgICplLnBvcysrID0gKHVfY2hhcikga2V5X2xlbjsKIAotICAgIGlmIChyLT51cHN0cmVhbS0+bWV0aG9kKSB7Ci0gICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKQotICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2Zhc3RjZ2lfbWV0aG9kc1tyLT51cHN0cmVhbS0+bWV0aG9kIC0gMV0ubGVuOworICAgICAgICAgICAgICAgIGlmICh2YWxfbGVuID4gMTI3KSB7CisgICAgICAgICAgICAgICAgICAgICplLnBvcysrID0gKHVfY2hhcikgKCgodmFsX2xlbiA+PiAyNCkgJiAweDdmKSB8IDB4ODApOworICAgICAgICAgICAgICAgICAgICAqZS5wb3MrKyA9ICh1X2NoYXIpICgodmFsX2xlbiA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgKmUucG9zKysgPSAodV9jaGFyKSAoKHZhbF9sZW4gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgKmUucG9zKysgPSAodV9jaGFyKSAodmFsX2xlbiAmIDB4ZmYpOwogCi0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJSRVFVRVNUX01FVEhPRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiUkVRVUVTVF9NRVRIT0QiKSAtIDEpOwotCi0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9mYXN0Y2dpX21ldGhvZHNbci0+dXBzdHJlYW0tPm1ldGhvZCAtIDFdLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9mYXN0Y2dpX21ldGhvZHNbci0+dXBzdHJlYW0tPm1ldGhvZCAtIDFdLmxlbik7Ci0KLSAgICB9IGVsc2UgewotICAgICAgICBsZW4gPSByLT5tZXRob2RfbmFtZS5sZW4gLSAxOwotICAgICAgICBpZiAobGVuID4gMTI3KSB7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKCgobGVuID4+IDI0KSAmIDB4N2YpIHwgMHg4MCk7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKChsZW4gPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKChsZW4gPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAobGVuICYgMHhmZik7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSBsZW47Ci0gICAgICAgIH0KLQotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiUkVRVUVTVF9NRVRIT0QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIlJFUVVFU1RfTUVUSE9EIikgLSAxKTsKLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+bWV0aG9kX25hbWUuZGF0YSwgbGVuKTsKLSAgICB9Ci0KLQotICAgIGlmIChyLT5hcmdzLmxlbikgewotICAgICAgICAqYi0+bGFzdCsrID0gc2l6ZW9mKCJRVUVSWV9TVFJJTkciKSAtIDE7Ci0KLSAgICAgICAgbGVuID0gci0+YXJncy5sZW47Ci0gICAgICAgIGlmIChsZW4gPiAxMjcpIHsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKChsZW4gPj4gMjQpICYgMHg3ZikgfCAweDgwKTsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIChsZW4gJiAweGZmKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIGxlbjsKLSAgICAgICAgfQotCi0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJRVUVSWV9TVFJJTkciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIlFVRVJZX1NUUklORyIpIC0gMSk7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPmFyZ3MuZGF0YSwgbGVuKTsKLSAgICB9Ci0KLQotICAgIGlmIChyLT5oZWFkZXJzX2luLmNvbnRlbnRfbGVuZ3RoX24gPiAwKSB7Ci0gICAgICAgICpiLT5sYXN0KysgPSBzaXplb2YoIkNPTlRFTlRfTEVOR1RIIikgLSAxOwotCi0gICAgICAgIGxlbiA9IHItPmhlYWRlcnNfaW4uY29udGVudF9sZW5ndGgtPnZhbHVlLmxlbjsKLSAgICAgICAgaWYgKGxlbiA+IDEyNykgewotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgoKGxlbiA+PiAyNCkgJiAweDdmKSB8IDB4ODApOwotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgobGVuID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgobGVuID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKGxlbiAmIDB4ZmYpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgbGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIkNPTlRFTlRfTEVOR1RIIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCJDT05URU5UX0xFTkdUSCIpIC0gMSk7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPmhlYWRlcnNfaW4uY29udGVudF9sZW5ndGgtPnZhbHVlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbik7Ci0gICAgfQotCi0KLSAgICBpZiAoci0+aGVhZGVyc19pbi5jb250ZW50X3R5cGUpIHsKLSAgICAgICAgKmItPmxhc3QrKyA9IHNpemVvZigiQ09OVEVOVF9UWVBFIikgLSAxOwotCi0gICAgICAgIGxlbiA9IHItPmhlYWRlcnNfaW4uY29udGVudF90eXBlLT52YWx1ZS5sZW47Ci0gICAgICAgIGlmIChsZW4gPiAxMjcpIHsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKChsZW4gPj4gMjQpICYgMHg3ZikgfCAweDgwKTsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIChsZW4gJiAweGZmKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIGxlbjsKLSAgICAgICAgfQotCi0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJDT05URU5UX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIkNPTlRFTlRfVFlQRSIpIC0gMSk7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPmhlYWRlcnNfaW4uY29udGVudF90eXBlLT52YWx1ZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4pOwotICAgIH0KLQotCi0gICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfUkVESVJFQ1RfU1RBVFVTKSB7Ci0gICAgICAgICpiLT5sYXN0KysgPSBzaXplb2YoIlJFRElSRUNUX1NUQVRVUyIpIC0gMTsKLSAgICAgICAgKmItPmxhc3QrKyA9IHNpemVvZigiMjAwIikgLSAxOwotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiUkVESVJFQ1RfU1RBVFVTMjAwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCJSRURJUkVDVF9TVEFUVVMyMDAiKSAtIDEpOwotICAgIH0KLQotCi0gICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfUkVRVUVTVF9VUkkpIHsKLSAgICAgICAgKmItPmxhc3QrKyA9IHNpemVvZigiUkVRVUVTVF9VUkkiKSAtIDE7Ci0KLSAgICAgICAgbGVuID0gci0+dW5wYXJzZWRfdXJpLmxlbjsKLSAgICAgICAgaWYgKGxlbiA+IDEyNykgewotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgoKGxlbiA+PiAyNCkgJiAweDdmKSB8IDB4ODApOwotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgobGVuID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgobGVuID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKGxlbiAmIDB4ZmYpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgbGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIlJFUVVFU1RfVVJJIiwgc2l6ZW9mKCJSRVFVRVNUX1VSSSIpIC0gMSk7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPnVucGFyc2VkX3VyaS5kYXRhLCBsZW4pOwotICAgIH0KLQotCi0gICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfRE9DVU1FTlRfUk9PVCkgewotICAgICAgICAqYi0+bGFzdCsrID0gc2l6ZW9mKCJET0NVTUVOVF9ST09UIikgLSAxOwotCi0gICAgICAgIGxlbiA9IGNsY2YtPnJvb3QubGVuOwotICAgICAgICBpZiAobGVuID4gMTI3KSB7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKCgobGVuID4+IDI0KSAmIDB4N2YpIHwgMHg4MCk7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKChsZW4gPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKChsZW4gPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAobGVuICYgMHhmZik7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSBsZW47Ci0gICAgICAgIH0KLQotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiRE9DVU1FTlRfUk9PVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiRE9DVU1FTlRfUk9PVCIpIC0gMSk7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIGNsY2YtPnJvb3QuZGF0YSwgbGVuKTsKLSAgICB9Ci0KLQotICAgIGlmIChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX1NDUklQVF9GSUxFTkFNRSkgewotICAgICAgICAqYi0+bGFzdCsrID0gc2l6ZW9mKCJTQ1JJUFRfRklMRU5BTUUiKSAtIDE7Ci0KLSAgICAgICAgbGVuID0gZmxjZi0+cm9vdC5sZW4gKyByLT51cmkubGVuICsgaW5kZXg7Ci0gICAgICAgIGlmIChsZW4gPiAxMjcpIHsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKChsZW4gPj4gMjQpICYgMHg3ZikgfCAweDgwKTsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIChsZW4gJiAweGZmKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIGxlbjsKLSAgICAgICAgfQotCi0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJTQ1JJUFRfRklMRU5BTUUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIlNDUklQVF9GSUxFTkFNRSIpIC0gMSk7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIGZsY2YtPnJvb3QuZGF0YSwgZmxjZi0+cm9vdC5sZW4pOwotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT51cmkuZGF0YSwgci0+dXJpLmxlbik7Ci0KLSAgICAgICAgaWYgKGluZGV4KSB7Ci0gICAgICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCBmbGNmLT5pbmRleC5kYXRhLCBpbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIGlmIChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX1NDUklQVF9OQU1FKSB7Ci0gICAgICAgICpiLT5sYXN0KysgPSBzaXplb2YoIlNDUklQVF9OQU1FIikgLSAxOwotCi0gICAgICAgIGxlbiA9IHItPnVyaS5sZW4gKyBpbmRleDsKLSAgICAgICAgaWYgKGxlbiA+IDEyNykgewotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgoKGxlbiA+PiAyNCkgJiAweDdmKSB8IDB4ODApOwotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgobGVuID4+IDE2KSAmIDB4ZmYpOwotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgobGVuID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKGxlbiAmIDB4ZmYpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgbGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIlNDUklQVF9OQU1FIiwgc2l6ZW9mKCJTQ1JJUFRfTkFNRSIpIC0gMSk7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPnVyaS5kYXRhLCByLT51cmkubGVuKTsKLQotICAgICAgICBpZiAoaW5kZXgpIHsKLSAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIGZsY2YtPmluZGV4LmRhdGEsIGluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfUkVNT1RFX0FERFIpIHsKLSAgICAgICAgKmItPmxhc3QrKyA9IHNpemVvZigiUkVNT1RFX0FERFIiKSAtIDE7Ci0gICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0Lmxlbik7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJSRU1PVEVfQUREUiIsIHNpemVvZigiUkVNT1RFX0FERFIiKSAtIDEpOwotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT5jb25uZWN0aW9uLT5hZGRyX3RleHQuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0Lmxlbik7Ci0gICAgfQotCi0KLSAgICBpZiAocG9ydF9sZW4pIHsKLSAgICAgICAgKmItPmxhc3QrKyA9IHNpemVvZigiUkVNT1RFX1BPUlQiKSAtIDE7Ci0gICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSBwb3J0X2xlbjsKLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIlJFTU9URV9QT1JUIiwgc2l6ZW9mKCJSRU1PVEVfUE9SVCIpIC0gMSk7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHBvcnRfdGV4dCwgcG9ydF9sZW4pOwotICAgIH0KLQotCi0gICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfU0VSVkVSX05BTUUpIHsKLSAgICAgICAgKmItPmxhc3QrKyA9IHNpemVvZigiU0VSVkVSX05BTUUiKSAtIDE7Ci0gICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSByLT5zZXJ2ZXJfbmFtZS5sZW47Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJTRVJWRVJfTkFNRSIsIHNpemVvZigiU0VSVkVSX05BTUUiKSAtIDEpOwotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT5zZXJ2ZXJfbmFtZS5kYXRhLCByLT5zZXJ2ZXJfbmFtZS5sZW4pOwotICAgIH0KLQotCi0gICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfU0VSVkVSX1BPUlQpIHsKLSAgICAgICAgKmItPmxhc3QrKyA9IHNpemVvZigiU0VSVkVSX1BPUlQiKSAtIDE7Ci0gICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoci0+cG9ydF90ZXh0LT5sZW4gLSAxKTsKLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIlNFUlZFUl9QT1JUIiwgc2l6ZW9mKCJTRVJWRVJfUE9SVCIpIC0gMSk7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPnBvcnRfdGV4dC0+ZGF0YSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnBvcnRfdGV4dC0+bGVuIC0gMSk7Ci0gICAgfQotCi0KLSAgICBpZiAoZmxjZi0+cGFyYW1zICYgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfQUREUikgewotICAgICAgICAqYi0+bGFzdCsrID0gc2l6ZW9mKCJTRVJWRVJfQUREUiIpIC0gMTsKLSAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIGFkZHJfbGVuOwotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiU0VSVkVSX0FERFIiLCBzaXplb2YoIlNFUlZFUl9BRERSIikgLSAxKTsKLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgYWRkcl90ZXh0LCBhZGRyX2xlbik7Ci0gICAgfQotCi0KLSAgICBpZiAoZmxjZi0+cGFyYW1zICYgTkdYX0hUVFBfRkFTVENHSV9TRVJWRVJfUFJPVE9DT0wKLSAgICAgICAgJiYgci0+aHR0cF9wcm90b2NvbC5sZW4pCi0gICAgewotICAgICAgICAqYi0+bGFzdCsrID0gc2l6ZW9mKCJTRVJWRVJfUFJPVE9DT0wiKSAtIDE7Ci0KLSAgICAgICAgbGVuID0gci0+aHR0cF9wcm90b2NvbC5sZW47Ci0gICAgICAgIGlmIChsZW4gPiAxMjcpIHsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKChsZW4gPj4gMjQpICYgMHg3ZikgfCAweDgwKTsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiAxNikgJiAweGZmKTsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiA4KSAmIDB4ZmYpOwotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIChsZW4gJiAweGZmKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIGxlbjsKLSAgICAgICAgfQotCi0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJTRVJWRVJfUFJPVE9DT0wiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIlNFUlZFUl9QUk9UT0NPTCIpIC0gMSk7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPmh0dHBfcHJvdG9jb2wuZGF0YSwgbGVuKTsKLSAgICB9Ci0KLQotICAgIGlmIChmbGNmLT5wYXJhbXMgJiBOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9TT0ZUV0FSRSkgewotICAgICAgICAqYi0+bGFzdCsrID0gc2l6ZW9mKCJTRVJWRVJfU09GVFdBUkUiKSAtIDE7Ci0gICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoc2l6ZW9mKE5HSU5YX1ZFUikgLSAxKTsKLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIlNFUlZFUl9TT0ZUV0FSRSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiU0VSVkVSX1NPRlRXQVJFIikgLSAxKTsKLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgTkdJTlhfVkVSLCBzaXplb2YoTkdJTlhfVkVSKSAtIDEpOwotICAgIH0KLQotCi0gICAgaWYgKGZsY2YtPnBhcmFtcyAmIE5HWF9IVFRQX0ZBU1RDR0lfR0FURVdBWV9JTlRFUkZBQ0UpIHsKLSAgICAgICAgKmItPmxhc3QrKyA9IHNpemVvZigiR0FURVdBWV9JTlRFUkZBQ0UiKSAtIDE7Ci0gICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoc2l6ZW9mKCJDR0kvMS4xIikgLSAxKTsKLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIkdBVEVXQVlfSU5URVJGQUNFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCJHQVRFV0FZX0lOVEVSRkFDRSIpIC0gMSk7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJDR0kvMS4xIiwgc2l6ZW9mKCJDR0kvMS4xIikgLSAxKTsKLSAgICB9Ci0KLQotICAgIGlmIChmbGNmLT52YXJzKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBmbGNmLT52YXJzLT5uZWx0czsgaSsrKSB7Ci0KLSAgICAgICAgICAgIHZhbHVlID0gbmd4X2h0dHBfZ2V0X2luZGV4ZWRfdmFyaWFibGUociwgdmluZGV4W2ldKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKmUucG9zKysgPSAodV9jaGFyKSB2YWxfbGVuOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHZhbHVlLT50ZXh0LmxlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBlLnNraXAgPSB2YWxfbGVuID8gMCA6IDE7CisKKyAgICAgICAgICAgIHdoaWxlICgqKHVpbnRwdHJfdCAqKSBlLmlwKSB7CisgICAgICAgICAgICAgICAgY29kZSA9ICoobmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQgKikgZS5pcDsKKyAgICAgICAgICAgICAgICBjb2RlKChuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKikgJmUpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgdmFyW3ZpbmRleFtpXV0ubmFtZS5sZW47Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgdmFsdWUtPnRleHQubGVuOwotCi0gICAgICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCB2YXJbdmluZGV4W2ldXS5uYW1lLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJbdmluZGV4W2ldXS5uYW1lLmxlbik7Ci0KLSAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHZhbHVlLT50ZXh0LmRhdGEsIHZhbHVlLT50ZXh0Lmxlbik7CisgICAgICAgICAgICBlLmlwICs9IHNpemVvZih1aW50cHRyX3QpOwogICAgICAgICB9CisKKyAgICAgICAgYi0+bGFzdCA9IGUucG9zOwogICAgIH0KIAogCi0gICAgcGFydCA9ICZyLT5oZWFkZXJzX2luLmhlYWRlcnMucGFydDsKLSAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOworICAgIGlmIChmbGNmLT51cHN0cmVhbS5wYXNzX3JlcXVlc3RfaGVhZGVycykgewogCi0gICAgZm9yIChpID0gMDsgLyogdm9pZCAqLzsgaSsrKSB7CisgICAgICAgIHBhcnQgPSAmci0+aGVhZGVyc19pbi5oZWFkZXJzLnBhcnQ7CisgICAgICAgIGhlYWRlciA9IHBhcnQtPmVsdHM7CiAKLSAgICAgICAgaWYgKGkgPj0gcGFydC0+bmVsdHMpIHsKLSAgICAgICAgICAgIGlmIChwYXJ0LT5uZXh0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZm9yIChpID0gMDsgLyogdm9pZCAqLzsgaSsrKSB7CisKKyAgICAgICAgICAgIGlmIChpID49IHBhcnQtPm5lbHRzKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcnQtPm5leHQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsgCisgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgIHBhcnQgPSBwYXJ0LT5uZXh0OworICAgICAgICAgICAgICAgIGhlYWRlciA9IHBhcnQtPmVsdHM7CisgICAgICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHBhcnQgPSBwYXJ0LT5uZXh0OwotICAgICAgICAgICAgaGVhZGVyID0gcGFydC0+ZWx0czsKLSAgICAgICAgICAgIGkgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgbGVuID0gNSArIGhlYWRlcltpXS5rZXkubGVuOwotICAgICAgICBpZiAobGVuID4gMTI3KSB7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKCgobGVuID4+IDI0KSAmIDB4N2YpIHwgMHg4MCk7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKChsZW4gPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKChsZW4gPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAobGVuICYgMHhmZik7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSBsZW47Ci0gICAgICAgIH0KLQotICAgICAgICBsZW4gPSBoZWFkZXJbaV0udmFsdWUubGVuOwotICAgICAgICBpZiAobGVuID4gMTI3KSB7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKCgobGVuID4+IDI0KSAmIDB4N2YpIHwgMHg4MCk7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKChsZW4gPj4gMTYpICYgMHhmZik7Ci0gICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKChsZW4gPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAobGVuICYgMHhmZik7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSBsZW47Ci0gICAgICAgIH0KLQotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiSFRUUF8iLCBzaXplb2YoIkhUVFBfIikgLSAxKTsKLQotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgaGVhZGVyW2ldLmtleS5sZW47IG4rKykgewotICAgICAgICAgICAgY2ggPSBoZWFkZXJbaV0ua2V5LmRhdGFbbl07Ci0KLSAgICAgICAgICAgIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSB7Ci0gICAgICAgICAgICAgICAgY2ggJj0gfjB4MjA7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy0nKSB7Ci0gICAgICAgICAgICAgICAgY2ggPSAnXyc7CisgICAgICAgICAgICBsZW4gPSBzaXplb2YoIkhUVFBfIikgLSAxICsgaGVhZGVyW2ldLmtleS5sZW47CisgICAgICAgICAgICBpZiAobGVuID4gMTI3KSB7CisgICAgICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgoKGxlbiA+PiAyNCkgJiAweDdmKSB8IDB4ODApOworICAgICAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKChsZW4gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKGxlbiAmIDB4ZmYpOworICAgIAorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgbGVuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAqYi0+bGFzdCsrID0gY2g7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIGxlbiA9IGhlYWRlcltpXS52YWx1ZS5sZW47CisgICAgICAgICAgICBpZiAobGVuID4gMTI3KSB7CisgICAgICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpICgoKGxlbiA+PiAyNCkgJiAweDdmKSB8IDB4ODApOworICAgICAgICAgICAgICAgICpiLT5sYXN0KysgPSAodV9jaGFyKSAoKGxlbiA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKChsZW4gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAqYi0+bGFzdCsrID0gKHVfY2hhcikgKGxlbiAmIDB4ZmYpOwogCi0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIGhlYWRlcltpXS52YWx1ZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaV0udmFsdWUubGVuKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmItPmxhc3QrKyA9ICh1X2NoYXIpIGxlbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIkhUVFBfIiwgc2l6ZW9mKCJIVFRQXyIpIC0gMSk7CisKKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBoZWFkZXJbaV0ua2V5LmxlbjsgbisrKSB7CisgICAgICAgICAgICAgICAgY2ggPSBoZWFkZXJbaV0ua2V5LmRhdGFbbl07CisKKyAgICAgICAgICAgICAgICBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykgeworICAgICAgICAgICAgICAgICAgICBjaCAmPSB+MHgyMDsKKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gJ18nOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpiLT5sYXN0KysgPSBjaDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgaGVhZGVyW2ldLnZhbHVlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaV0udmFsdWUubGVuKTsKKyAgICAgICAgfQogICAgIH0KIAogCkBAIC0xMTAxLDEwMyArNjM1LDEwOSBAQAogICAgIGggPSAobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfdCAqKSBiLT5sYXN0OwogICAgIGItPmxhc3QgKz0gc2l6ZW9mKG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyX3QpOwogCi0gICAgYm9keSA9IHItPnJlcXVlc3RfYm9keS0+YnVmczsKLSAgICByLT5yZXF1ZXN0X2JvZHktPmJ1ZnMgPSBjbDsKKyAgICBpZiAoZmxjZi0+dXBzdHJlYW0ucGFzc19yZXF1ZXN0X2JvZHkpIHsKKyAgICAgICAgYm9keSA9IHItPnVwc3RyZWFtLT5yZXF1ZXN0X2J1ZnM7CisgICAgICAgIHItPnVwc3RyZWFtLT5yZXF1ZXN0X2J1ZnMgPSBjbDsKIAogI2lmIChOR1hfU1VQUFJFU1NfV0FSTikKLSAgICBmaWxlX3BvcyA9IDA7Ci0gICAgcG9zID0gTlVMTDsKKyAgICAgICAgZmlsZV9wb3MgPSAwOworICAgICAgICBwb3MgPSBOVUxMOwogI2VuZGlmCiAKLSAgICB3aGlsZSAoYm9keSkgewotCi0gICAgICAgIGlmIChib2R5LT5idWYtPmluX2ZpbGUpIHsKLSAgICAgICAgICAgIGZpbGVfcG9zID0gYm9keS0+YnVmLT5maWxlX3BvczsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcG9zID0gYm9keS0+YnVmLT5wb3M7Ci0gICAgICAgIH0KLQotICAgICAgICBuZXh0ID0gMDsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBiID0gbmd4X2FsbG9jX2J1ZihyLT5wb29sKTsKLSAgICAgICAgICAgIGlmIChiID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBuZ3hfbWVtY3B5KGIsIGJvZHktPmJ1Ziwgc2l6ZW9mKG5neF9idWZfdCkpOworICAgICAgICB3aGlsZSAoYm9keSkgewogCiAgICAgICAgICAgICBpZiAoYm9keS0+YnVmLT5pbl9maWxlKSB7Ci0gICAgICAgICAgICAgICAgYi0+ZmlsZV9wb3MgPSBmaWxlX3BvczsKLSAgICAgICAgICAgICAgICBmaWxlX3BvcyArPSAzMiAqIDEwMjQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZmlsZV9wb3MgPiBib2R5LT5idWYtPmZpbGVfbGFzdCkgewotICAgICAgICAgICAgICAgICAgICBmaWxlX3BvcyA9IGJvZHktPmJ1Zi0+ZmlsZV9sYXN0OwotICAgICAgICAgICAgICAgICAgICBuZXh0ID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBiLT5maWxlX2xhc3QgPSBmaWxlX3BvczsKLSAgICAgICAgICAgICAgICBsZW4gPSAobmd4X3VpbnRfdCkgKGZpbGVfcG9zIC0gYi0+ZmlsZV9wb3MpOworICAgICAgICAgICAgICAgIGZpbGVfcG9zID0gYm9keS0+YnVmLT5maWxlX3BvczsKIAogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiLT5wb3MgPSBwb3M7Ci0gICAgICAgICAgICAgICAgcG9zICs9IDMyICogMTAyNDsKKyAgICAgICAgICAgICAgICBwb3MgPSBib2R5LT5idWYtPnBvczsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChwb3MgPiBib2R5LT5idWYtPmxhc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zID0gYm9keS0+YnVmLT5sYXN0OwotICAgICAgICAgICAgICAgICAgICBuZXh0ID0gMTsKKyAgICAgICAgICAgIG5leHQgPSAwOworCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgYiA9IG5neF9hbGxvY19idWYoci0+cG9vbCk7CisgICAgICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGItPmxhc3QgPSBwb3M7Ci0gICAgICAgICAgICAgICAgbGVuID0gKG5neF91aW50X3QpIChwb3MgLSBiLT5wb3MpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5neF9tZW1jcHkoYiwgYm9keS0+YnVmLCBzaXplb2Yobmd4X2J1Zl90KSk7CiAKLSAgICAgICAgICAgIHBhZGRpbmcgPSA4IC0gbGVuICUgODsKLSAgICAgICAgICAgIHBhZGRpbmcgPSAocGFkZGluZyA9PSA4KSA/IDAgOiBwYWRkaW5nOworICAgICAgICAgICAgICAgIGlmIChib2R5LT5idWYtPmluX2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYi0+ZmlsZV9wb3MgPSBmaWxlX3BvczsKKyAgICAgICAgICAgICAgICAgICAgZmlsZV9wb3MgKz0gMzIgKiAxMDI0OwogCi0gICAgICAgICAgICBoLT52ZXJzaW9uID0gMTsKLSAgICAgICAgICAgIGgtPnR5cGUgPSBOR1hfSFRUUF9GQVNUQ0dJX1NURElOOwotICAgICAgICAgICAgaC0+cmVxdWVzdF9pZF9oaSA9IDA7Ci0gICAgICAgICAgICBoLT5yZXF1ZXN0X2lkX2xvID0gMTsKLSAgICAgICAgICAgIGgtPmNvbnRlbnRfbGVuZ3RoX2hpID0gKHVfY2hhcikgKChsZW4gPj4gOCkgJiAweGZmKTsKLSAgICAgICAgICAgIGgtPmNvbnRlbnRfbGVuZ3RoX2xvID0gKHVfY2hhcikgKGxlbiAmIDB4ZmYpOwotICAgICAgICAgICAgaC0+cGFkZGluZ19sZW5ndGggPSAodV9jaGFyKSBwYWRkaW5nOwotICAgICAgICAgICAgaC0+cmVzZXJ2ZWQgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9wb3MgPiBib2R5LT5idWYtPmZpbGVfbGFzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wb3MgPSBib2R5LT5idWYtPmZpbGVfbGFzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSAxOworICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNsLT5uZXh0ID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCk7Ci0gICAgICAgICAgICBpZiAoY2wtPm5leHQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGItPmZpbGVfbGFzdCA9IGZpbGVfcG9zOworICAgICAgICAgICAgICAgICAgICBsZW4gPSAobmd4X3VpbnRfdCkgKGZpbGVfcG9zIC0gYi0+ZmlsZV9wb3MpOwogCi0gICAgICAgICAgICBjbCA9IGNsLT5uZXh0OwotICAgICAgICAgICAgY2wtPmJ1ZiA9IGI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYi0+cG9zID0gcG9zOworICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMzIgKiAxMDI0OwogCi0gICAgICAgICAgICBiID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFkZGluZyk7Ci0gICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA+IGJvZHktPmJ1Zi0+bGFzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gYm9keS0+YnVmLT5sYXN0OworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHBhZGRpbmcpIHsKLSAgICAgICAgICAgICAgICBuZ3hfbWVtemVybyhiLT5sYXN0LCBwYWRkaW5nKTsKLSAgICAgICAgICAgICAgICBiLT5sYXN0ICs9IHBhZGRpbmc7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGItPmxhc3QgPSBwb3M7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IChuZ3hfdWludF90KSAocG9zIC0gYi0+cG9zKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGggPSAobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfdCAqKSBiLT5sYXN0OwotICAgICAgICAgICAgYi0+bGFzdCArPSBzaXplb2Yobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfdCk7CisgICAgICAgICAgICAgICAgcGFkZGluZyA9IDggLSBsZW4gJSA4OworICAgICAgICAgICAgICAgIHBhZGRpbmcgPSAocGFkZGluZyA9PSA4KSA/IDAgOiBwYWRkaW5nOwogCi0gICAgICAgICAgICBjbC0+bmV4dCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpOwotICAgICAgICAgICAgaWYgKGNsLT5uZXh0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGgtPnZlcnNpb24gPSAxOworICAgICAgICAgICAgICAgIGgtPnR5cGUgPSBOR1hfSFRUUF9GQVNUQ0dJX1NURElOOworICAgICAgICAgICAgICAgIGgtPnJlcXVlc3RfaWRfaGkgPSAwOworICAgICAgICAgICAgICAgIGgtPnJlcXVlc3RfaWRfbG8gPSAxOworICAgICAgICAgICAgICAgIGgtPmNvbnRlbnRfbGVuZ3RoX2hpID0gKHVfY2hhcikgKChsZW4gPj4gOCkgJiAweGZmKTsKKyAgICAgICAgICAgICAgICBoLT5jb250ZW50X2xlbmd0aF9sbyA9ICh1X2NoYXIpIChsZW4gJiAweGZmKTsKKyAgICAgICAgICAgICAgICBoLT5wYWRkaW5nX2xlbmd0aCA9ICh1X2NoYXIpIHBhZGRpbmc7CisgICAgICAgICAgICAgICAgaC0+cmVzZXJ2ZWQgPSAwOwogCi0gICAgICAgICAgICBjbCA9IGNsLT5uZXh0OwotICAgICAgICAgICAgY2wtPmJ1ZiA9IGI7CisgICAgICAgICAgICAgICAgY2wtPm5leHQgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKTsKKyAgICAgICAgICAgICAgICBpZiAoY2wtPm5leHQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICB9IHdoaWxlICghbmV4dCk7CisgICAgICAgICAgICAgICAgY2wgPSBjbC0+bmV4dDsKKyAgICAgICAgICAgICAgICBjbC0+YnVmID0gYjsKIAotICAgICAgICBib2R5ID0gYm9keS0+bmV4dDsKKyAgICAgICAgICAgICAgICBiID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihyLT5wb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcl90KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwYWRkaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG5neF9tZW16ZXJvKGItPmxhc3QsIHBhZGRpbmcpOworICAgICAgICAgICAgICAgICAgICBiLT5sYXN0ICs9IHBhZGRpbmc7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaCA9IChuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcl90ICopIGItPmxhc3Q7CisgICAgICAgICAgICAgICAgYi0+bGFzdCArPSBzaXplb2Yobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJfdCk7CisKKyAgICAgICAgICAgICAgICBjbC0+bmV4dCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpOworICAgICAgICAgICAgICAgIGlmIChjbC0+bmV4dCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2wgPSBjbC0+bmV4dDsKKyAgICAgICAgICAgICAgICBjbC0+YnVmID0gYjsKKworICAgICAgICAgICAgfSB3aGlsZSAoIW5leHQpOworCisgICAgICAgICAgICBib2R5ID0gYm9keS0+bmV4dDsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgci0+dXBzdHJlYW0tPnJlcXVlc3RfYnVmcyA9IGNsOwogICAgIH0KIAogICAgIGgtPnZlcnNpb24gPSAxOwpAQCAtMTIyOSwxNyArNzY5LDYgQEAKICAgICBmLT5zdGF0ZSA9IG5neF9odHRwX2Zhc3RjZ2lfc3RfdmVyc2lvbjsKICAgICBmLT5oZWFkZXIgPSAwOwogCi0gICAgbmd4X21lbXplcm8oJmYtPnVwc3RyZWFtLT5oZWFkZXJzX2luLAotICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcnNfaW5fdCkpOwotCi0gICAgaWYgKGYtPnVwc3RyZWFtLT5oZWFkZXJzX2luLmhlYWRlcnMucGFydC5lbHRzKSB7Ci0gICAgICAgIGlmIChuZ3hfbGlzdF9pbml0KCZmLT51cHN0cmVhbS0+aGVhZGVyc19pbi5oZWFkZXJzLCByLT5wb29sLCA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X3RhYmxlX2VsdF90KSkgPT0gTkdYX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcmV0dXJuIE5HWF9PSzsKIH0KIApAQCAtMTI0NywxNiArNzc2LDIxIEBACiBzdGF0aWMgbmd4X2ludF90CiBuZ3hfaHR0cF9mYXN0Y2dpX3Byb2Nlc3NfaGVhZGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAqc3RhcnQsICpsYXN0OwotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICpzdGF0dXNfbGluZSwgbGluZTsKLSAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgcmMsIHN0YXR1czsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgaTsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAqaDsKLSAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICAgICAqdTsKLSAgICBuZ3hfaHR0cF9mYXN0Y2dpX2N0eF90ICAqZjsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXJ0LCAqbGFzdDsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgKnN0YXR1c19saW5lLCBsaW5lOworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICAgICAgcmMsIHN0YXR1czsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgIGtleTsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgKmg7CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAgICAgICAgICAgICp1OworICAgIG5neF9odHRwX2Zhc3RjZ2lfY3R4X3QgICAgICAgICAqZjsKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV9oZWFkZXJfdCAgICAgKmhoOworICAgIG5neF9odHRwX3Vwc3RyZWFtX21haW5fY29uZl90ICAqdW1jZjsKIAogICAgIGYgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2N0eChyLCBuZ3hfaHR0cF9mYXN0Y2dpX21vZHVsZSk7CiAKKyAgICB1bWNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9tYWluX2NvbmYociwgbmd4X2h0dHBfdXBzdHJlYW1fbW9kdWxlKTsKKyAgICBoaCA9IChuZ3hfaHR0cF91cHN0cmVhbV9oZWFkZXJfdCAqKSB1bWNmLT5oZWFkZXJzX2luX2hhc2guYnVja2V0czsKKwogICAgIGlmIChmID09IE5VTEwpIHsKICAgICAgICAgZiA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9mYXN0Y2dpX2N0eF90KSk7CiAgICAgICAgIGlmIChmID09IE5VTEwpIHsKQEAgLTEyNjQsMTcgKzc5OCw2IEBACiAgICAgICAgIH0KIAogICAgICAgICBuZ3hfaHR0cF9zZXRfY3R4KHIsIGYsIG5neF9odHRwX2Zhc3RjZ2lfbW9kdWxlKTsKLQotICAgICAgICBmLT51cHN0cmVhbSA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9mYXN0Y2dpX3Vwc3RyZWFtX3QpKTsKLSAgICAgICAgaWYgKGYtPnVwc3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmd4X2xpc3RfaW5pdCgmZi0+dXBzdHJlYW0tPmhlYWRlcnNfaW4uaGVhZGVycywgci0+cG9vbCwgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF90YWJsZV9lbHRfdCkpID09IE5HWF9FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHUgPSByLT51cHN0cmVhbTsKQEAgLTE0MjQsMTEgKzk0NywxMyBAQAogCiAgICAgICAgICAgICAgICAgLyogYSBoZWFkZXIgbGluZSBoYXMgYmVlbiBwYXJzZWQgc3VjY2Vzc2Z1bGx5ICovCiAKLSAgICAgICAgICAgICAgICBoID0gbmd4X2xpc3RfcHVzaCgmZi0+dXBzdHJlYW0tPmhlYWRlcnNfaW4uaGVhZGVycyk7CisgICAgICAgICAgICAgICAgaCA9IG5neF9saXN0X3B1c2goJnUtPmhlYWRlcnNfaW4uaGVhZGVycyk7CiAgICAgICAgICAgICAgICAgaWYgKGggPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGgtPmhhc2ggPSByLT5oZWFkZXJfaGFzaDsKKwogICAgICAgICAgICAgICAgIGgtPmtleS5sZW4gPSByLT5oZWFkZXJfbmFtZV9lbmQgLSByLT5oZWFkZXJfbmFtZV9zdGFydDsKICAgICAgICAgICAgICAgICBoLT52YWx1ZS5sZW4gPSByLT5oZWFkZXJfZW5kIC0gci0+aGVhZGVyX3N0YXJ0OwogCkBAIC0xNDQzLDE4ICs5NjgsMTMgQEAKICAgICAgICAgICAgICAgICBuZ3hfY3B5c3RybihoLT5rZXkuZGF0YSwgci0+aGVhZGVyX25hbWVfc3RhcnQsIGgtPmtleS5sZW4gKyAxKTsKICAgICAgICAgICAgICAgICBuZ3hfY3B5c3RybihoLT52YWx1ZS5kYXRhLCByLT5oZWFkZXJfc3RhcnQsIGgtPnZhbHVlLmxlbiArIDEpOwogCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgbmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJzX2luW2ldLm5hbWUubGVuICE9IDA7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAobmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJzX2luW2ldLm5hbWUubGVuICE9IGgtPmtleS5sZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAga2V5ID0gaC0+aGFzaCAlIHVtY2YtPmhlYWRlcnNfaW5faGFzaC5oYXNoX3NpemU7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5neF9zdHJjYXNlY21wKG5neF9odHRwX2Zhc3RjZ2lfaGVhZGVyc19pbltpXS5uYW1lLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+a2V5LmRhdGEpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICooKG5neF90YWJsZV9lbHRfdCAqKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhciAqKSAmZi0+dXBzdHJlYW0tPmhlYWRlcnNfaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmd4X2h0dHBfZmFzdGNnaV9oZWFkZXJzX2luW2ldLm9mZnNldCkpID0gaDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChoaFtrZXldLm5hbWUubGVuID09IGgtPmtleS5sZW4KKyAgICAgICAgICAgICAgICAgICAgJiYgbmd4X3N0cmNhc2VjbXAoaGhba2V5XS5uYW1lLmRhdGEsIGgtPmtleS5kYXRhKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhoW2tleV0uaGFuZGxlcihyLCBoLCBoaFtrZXldLm9mZnNldCkgIT0gTkdYX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC0xNDcyLDggKzk5Miw4IEBACiAgICAgICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgZmFzdGNnaSBoZWFkZXIgZG9uZSIpOwogCi0gICAgICAgICAgICAgICAgaWYgKGYtPnVwc3RyZWFtLT5oZWFkZXJzX2luLnN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfbGluZSA9ICZmLT51cHN0cmVhbS0+aGVhZGVyc19pbi5zdGF0dXMtPnZhbHVlOworICAgICAgICAgICAgICAgIGlmICh1LT5oZWFkZXJzX2luLnN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfbGluZSA9ICZ1LT5oZWFkZXJzX2luLnN0YXR1cy0+dmFsdWU7CiAKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbmd4X2F0b2koc3RhdHVzX2xpbmUtPmRhdGEsIDMpOwogCkBAIC0xNTQxLDg0ICsxMDYxLDYgQEAKIAogCiBzdGF0aWMgbmd4X2ludF90Ci1uZ3hfaHR0cF9mYXN0Y2dpX3NlbmRfaGVhZGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKLXsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgIGk7Ci0gICAgbmd4X2xpc3RfcGFydF90ICAgICAgICAgICAgICAgICpwYXJ0OwotICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqaG8sICpoOwotICAgIG5neF9odHRwX2Zhc3RjZ2lfY3R4X3QgICAgICAgICAqZjsKLSAgICBuZ3hfaHR0cF9mYXN0Y2dpX2hlYWRlcnNfaW5fdCAgKmhlYWRlcnNfaW47Ci0KLSAgICBmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUpOwotCi0gICAgaGVhZGVyc19pbiA9ICZmLT51cHN0cmVhbS0+aGVhZGVyc19pbjsKLSAgICBwYXJ0ID0gJmhlYWRlcnNfaW4tPmhlYWRlcnMucGFydDsKLSAgICBoID0gcGFydC0+ZWx0czsKLQotICAgIGZvciAoaSA9IDA7IC8qIHZvaWQgKi87IGkrKykgewotCi0gICAgICAgIGlmIChpID49IHBhcnQtPm5lbHRzKSB7Ci0gICAgICAgICAgICBpZiAocGFydC0+bmV4dCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBhcnQgPSBwYXJ0LT5uZXh0OwotICAgICAgICAgICAgaCA9IHBhcnQtPmVsdHM7Ci0gICAgICAgICAgICBpID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGlnbm9yZSBzb21lIGhlYWRlcnMgKi8KLQotICAgICAgICBpZiAoJmhbaV0gPT0gaGVhZGVyc19pbi0+c3RhdHVzKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKCZoW2ldID09IGhlYWRlcnNfaW4tPnhfcG93ZXJlZF9ieQotICAgICAgICAgICAgJiYgIXItPnVwc3RyZWFtLT5jb25mLT54X3Bvd2VyZWRfYnkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKiAiQ29udGVudC1UeXBlIiBpcyBoYW5kbGVkIHNwZWNpYWxseSAqLwotCi0gICAgICAgIGlmICgmaFtpXSA9PSBoZWFkZXJzX2luLT5jb250ZW50X3R5cGUpIHsKLSAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZSA9ICZoW2ldOwotICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLT5rZXkubGVuID0gMDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKiBjb3B5IHNvbWUgaGVhZGVyIHBvaW50ZXJzIGFuZCBzZXQgdXAgci0+aGVhZGVyc19vdXQgKi8KLQotICAgICAgICBobyA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpOwotICAgICAgICBpZiAoaG8gPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgICpobyA9IGhbaV07Ci0KLSNpZiAoTkdYX0hUVFBfR1pJUCkKLSAgICAgICAgaWYgKCZoW2ldID09IGhlYWRlcnNfaW4tPmNvbnRlbnRfZW5jb2RpbmcpIHsKLSAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfZW5jb2RpbmcgPSBobzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICBpZiAoJmhbaV0gPT0gaGVhZGVyc19pbi0+Y29udGVudF9sZW5ndGgpIHsKLSAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfbGVuZ3RoID0gaG87Ci0gICAgICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aF9uID0gbmd4X2F0b2koaG8tPnZhbHVlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG8tPnZhbHVlLmxlbik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBuZ3hfaHR0cF9zZW5kX2hlYWRlcihyKTsKLX0KLQotCi1zdGF0aWMgbmd4X2ludF90CiBuZ3hfaHR0cF9mYXN0Y2dpX2lucHV0X2ZpbHRlcihuZ3hfZXZlbnRfcGlwZV90ICpwLCBuZ3hfYnVmX3QgKmJ1ZikKIHsKICAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgcmM7CkBAIC0xOTM3LDcgKzEzNzksNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZi0+cG9zID0gcCArIDE7CiAgICAgZi0+c3RhdGUgPSBzdGF0ZTsKIAogICAgIHJldHVybiBOR1hfQUdBSU47CkBAIC0xOTY0LDE0MCArMTQwNSwxOSBAQAogfQogCiAKLXN0YXRpYyBjaGFyICoKLW5neF9odHRwX2Zhc3RjZ2lfcGFzcyhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfZmFzdGNnaV9hZGRfdmFyaWFibGVzKG5neF9jb25mX3QgKmNmKQogewotICAgIG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCAqbGNmID0gY29uZjsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAqdmFyOwogCi0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICp2YWx1ZTsKLSAgICBuZ3hfaW5ldF91cHN0cmVhbV90ICAgICAgICAgIGluZXRfdXBzdHJlYW07Ci0gICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAgICpjbGNmOwotI2lmIChOR1hfSEFWRV9VTklYX0RPTUFJTikKLSAgICBuZ3hfdW5peF9kb21haW5fdXBzdHJlYW1fdCAgIHVuaXhfdXBzdHJlYW07Ci0jZW5kaWYKLQotICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7Ci0KLSAgICBpZiAobmd4X3N0cm5jYXNlY21wKHZhbHVlWzFdLmRhdGEsICJ1bml4OiIsIDUpID09IDApIHsKLQotI2lmIChOR1hfSEFWRV9VTklYX0RPTUFJTikKLQotICAgICAgICBuZ3hfbWVtemVybygmdW5peF91cHN0cmVhbSwgc2l6ZW9mKG5neF91bml4X2RvbWFpbl91cHN0cmVhbV90KSk7Ci0KLSAgICAgICAgdW5peF91cHN0cmVhbS5uYW1lID0gdmFsdWVbMV07Ci0gICAgICAgIHVuaXhfdXBzdHJlYW0udXJsID0gdmFsdWVbMV07Ci0KLSAgICAgICAgbGNmLT5wZWVycyA9IG5neF91bml4X3Vwc3RyZWFtX3BhcnNlKGNmLCAmdW5peF91cHN0cmVhbSk7Ci0gICAgICAgIGlmIChsY2YtPnBlZXJzID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgfQotCi0jZWxzZQotICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHVuaXggZG9tYWluIHNvY2tldHMgYXJlIG5vdCBzdXBwb3J0ZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgcGxhdGZvcm0iKTsKLSAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotCi0jZW5kaWYKLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG5neF9tZW16ZXJvKCZpbmV0X3Vwc3RyZWFtLCBzaXplb2Yobmd4X2luZXRfdXBzdHJlYW1fdCkpOwotCi0gICAgICAgIGluZXRfdXBzdHJlYW0ubmFtZSA9IHZhbHVlWzFdOwotICAgICAgICBpbmV0X3Vwc3RyZWFtLnVybCA9IHZhbHVlWzFdOwotICAgIAotICAgICAgICBsY2YtPnBlZXJzID0gbmd4X2luZXRfdXBzdHJlYW1fcGFyc2UoY2YsICZpbmV0X3Vwc3RyZWFtKTsKLSAgICAgICAgaWYgKGxjZi0+cGVlcnMgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICB9CisgICAgdmFyID0gbmd4X2h0dHBfYWRkX3ZhcmlhYmxlKGNmLCAmbmd4X2h0dHBfZmFzdGNnaV9zY3JpcHRfbmFtZSwgMCk7CisgICAgaWYgKHZhciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCi0gICAgY2xjZiA9IG5neF9odHRwX2NvbmZfZ2V0X21vZHVsZV9sb2NfY29uZihjZiwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOworICAgIHZhci0+aGFuZGxlciA9IG5neF9odHRwX2Zhc3RjZ2lfc2NyaXB0X25hbWVfdmFyaWFibGU7CiAKLSAgICBjbGNmLT5oYW5kbGVyID0gbmd4X2h0dHBfZmFzdGNnaV9oYW5kbGVyOwotCi0jaWYgKE5HWF9QQ1JFKQotICAgIGxjZi0+bG9jYXRpb24gPSBjbGNmLT5yZWdleCA/ICZuZ3hfaHR0cF9mYXN0Y2dpX3VyaSA6ICZjbGNmLT5uYW1lOwotI2Vsc2UKLSAgICBsY2YtPmxvY2F0aW9uID0gJmNsY2YtPm5hbWU7Ci0jZW5kaWYKLQotICAgIGlmIChjbGNmLT5uYW1lLmRhdGFbY2xjZi0+bmFtZS5sZW4gLSAxXSA9PSAnLycpIHsKLSAgICAgICAgY2xjZi0+YXV0b19yZWRpcmVjdCA9IDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5HWF9DT05GX09LOwotfQotCi0KLXN0YXRpYyBjaGFyICoKLW5neF9odHRwX2Zhc3RjZ2lfc2V0X3ZhcihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQotewotICAgIG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCAqbGNmID0gY29uZjsKLQotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBpLCAqaW5kZXg7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgKnZhbHVlOwotICAgIG5neF9odHRwX3ZhcmlhYmxlX3QgICAgICAgICp2YXI7Ci0gICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7Ci0KLSAgICBpZiAobGNmLT52YXJzID09IE5VTEwpIHsKLSAgICAgICAgbGNmLT52YXJzID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdCAqKSk7Ci0gICAgICAgIGlmIChsY2YtPnZhcnMgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY21jZiA9IG5neF9odHRwX2NvbmZfZ2V0X21vZHVsZV9tYWluX2NvbmYoY2YsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKLQotICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7Ci0KLSAgICB2YXIgPSBjbWNmLT52YXJpYWJsZXMuZWx0czsKLSAgICBmb3IgKGkgPSAwOyBpIDwgY21jZi0+dmFyaWFibGVzLm5lbHRzOyBpKyspIHsKLSAgICAgICAgaWYgKG5neF9zdHJjYXNlY21wKHZhcltpXS5uYW1lLmRhdGEsIHZhbHVlWzFdLmRhdGEpID09IDApIHsKLQotICAgICAgICAgICAgaW5kZXggPSBuZ3hfYXJyYXlfcHVzaChsY2YtPnZhcnMpOwotICAgICAgICAgICAgaWYgKGluZGV4ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICppbmRleCA9IHZhcltpXS5pbmRleDsKLSAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9PSzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gdmFyaWFibGUgbmFtZSBcIiVWXCIiLCAmdmFsdWVbMV0pOwotICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLX0KLQotCi1zdGF0aWMgY2hhciAqCi1uZ3hfaHR0cF9mYXN0Y2dpX2xvd2F0X2NoZWNrKG5neF9jb25mX3QgKmNmLCB2b2lkICpwb3N0LCB2b2lkICpkYXRhKQotewotI2lmIChOR1hfRlJFRUJTRCkKLSAgICBzc2l6ZV90ICpucCA9IGRhdGE7Ci0KLSAgICBpZiAoKm5wID49IG5neF9mcmVlYnNkX25ldF9pbmV0X3RjcF9zZW5kc3BhY2UpIHsKLSAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiZmFzdGNnaV9zZW5kX2xvd2F0XCIgbXVzdCBiZSBsZXNzIHRoYW4gJWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzeXNjdGwgbmV0LmluZXQudGNwLnNlbmRzcGFjZSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2ZyZWVic2RfbmV0X2luZXRfdGNwX3NlbmRzcGFjZSk7Ci0KLSAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgIH0KLQotI2VsaWYgIShOR1hfSEFWRV9TT19TTkRMT1dBVCkKLSAgICBzc2l6ZV90ICpucCA9IGRhdGE7Ci0KLSAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19XQVJOLCBjZiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIlwiZmFzdGNnaV9zZW5kX2xvd2F0XCIgaXMgbm90IHN1cHBvcnRlZCwgaWdub3JlZCIpOwotCi0gICAgKm5wID0gMDsKLQotI2VuZGlmCi0KLSAgICByZXR1cm4gTkdYX0NPTkZfT0s7CisgICAgcmV0dXJuIE5HWF9PSzsKIH0KIAogCkBAIC0yMTE4LDEyICsxNDM4LDEyIEBACiAgICAgICogICAgIGNvbmYtPnVwc3RyZWFtLnBhdGggPSBOVUxMOwogICAgICAqICAgICBjb25mLT51cHN0cmVhbS5uZXh0X3Vwc3RyZWFtID0gMDsKICAgICAgKiAgICAgY29uZi0+dXBzdHJlYW0udGVtcF9wYXRoID0gTlVMTDsKLSAgICAgKiAgICAgY29uZi0+cGFyYW1zID0gMDsKLSAgICAgKiAgICAgY29uZi0+cm9vdC5sZW4gPSAwOwotICAgICAqICAgICBjb25mLT5yb290LmRhdGEgPSBOVUxMOworICAgICAqICAgICBjb25mLT51cHN0cmVhbS5zY2hlbWEgPSB7IDAsIE5VTEwgfTsKKyAgICAgKiAgICAgY29uZi0+dXBzdHJlYW0udXJpID0geyAwLCBOVUxMIH07CisgICAgICogICAgIGNvbmYtPnVwc3RyZWFtLmxvY2F0aW9uID0gTlVMTDsKKyAgICAgKgogICAgICAqICAgICBjb25mLT5pbmRleC5sZW4gPSAwOwogICAgICAqICAgICBjb25mLT5pbmRleC5kYXRhID0gTlVMTDsKLSAgICAgKiAgICAgY29uZi0+bG9jYXRpb24gPSBOVUxMOwogICAgICAqLwogCiAgICAgY29uZi0+dXBzdHJlYW0uY29ubmVjdF90aW1lb3V0ID0gTkdYX0NPTkZfVU5TRVRfTVNFQzsKQEAgLTIxMzUsMTQgKzE0NTUsMjMgQEAKICAgICBjb25mLT51cHN0cmVhbS5idXN5X2J1ZmZlcnNfc2l6ZSA9IE5HWF9DT05GX1VOU0VUX1NJWkU7CiAgICAgY29uZi0+dXBzdHJlYW0ubWF4X3RlbXBfZmlsZV9zaXplID0gTkdYX0NPTkZfVU5TRVRfU0laRTsgCiAgICAgY29uZi0+dXBzdHJlYW0udGVtcF9maWxlX3dyaXRlX3NpemUgPSBOR1hfQ09ORl9VTlNFVF9TSVpFOwotICAgIAotICAgIGNvbmYtPnVwc3RyZWFtLnJlZGlyZWN0X2Vycm9ycyA9IE5HWF9DT05GX1VOU0VUOworCiAgICAgY29uZi0+dXBzdHJlYW0ucGFzc191bnBhcnNlZF91cmkgPSBOR1hfQ09ORl9VTlNFVDsKLSAgICBjb25mLT51cHN0cmVhbS54X3Bvd2VyZWRfYnkgPSBOR1hfQ09ORl9VTlNFVDsKKyAgICBjb25mLT51cHN0cmVhbS5tZXRob2QgPSBOR1hfQ09ORl9VTlNFVF9VSU5UOworICAgIGNvbmYtPnVwc3RyZWFtLnBhc3NfcmVxdWVzdF9oZWFkZXJzID0gTkdYX0NPTkZfVU5TRVQ7CisgICAgY29uZi0+dXBzdHJlYW0ucGFzc19yZXF1ZXN0X2JvZHkgPSBOR1hfQ09ORl9VTlNFVDsKKworICAgIGNvbmYtPnVwc3RyZWFtLnJlZGlyZWN0X2Vycm9ycyA9IE5HWF9DT05GX1VOU0VUOwogCiAgICAgLyogImZhc3RjZ2lfY3ljbGljX3RlbXBfZmlsZSIgaXMgZGlzYWJsZWQgKi8KICAgICBjb25mLT51cHN0cmVhbS5jeWNsaWNfdGVtcF9maWxlID0gMDsKIAorICAgIGNvbmYtPnVwc3RyZWFtLnBhc3NfeF9wb3dlcmVkX2J5ID0gTkdYX0NPTkZfVU5TRVQ7CisKKyAgICAvKiB0aGUgaGFyZGNvZGVkIHZhbHVlcyAqLworICAgIGNvbmYtPnVwc3RyZWFtLnBhc3Nfc2VydmVyID0gMTsKKyAgICBjb25mLT51cHN0cmVhbS5wYXNzX2RhdGUgPSAxOworCiAgICAgcmV0dXJuIGNvbmY7CiB9CiAKQEAgLTIxNTMsNyArMTQ4MiwxMyBAQAogICAgIG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCAqcHJldiA9IHBhcmVudDsKICAgICBuZ3hfaHR0cF9mYXN0Y2dpX2xvY19jb25mX3QgKmNvbmYgPSBjaGlsZDsKIAotICAgIHNpemVfdCAgc2l6ZTsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICpwOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgIHNpemU7CisgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAqY29kZTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICBpOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgKnNyYzsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfY29tcGlsZV90ICAgICBzYzsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfY29weV9jb2RlX3QgICpjb3B5OwogCiAgICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT51cHN0cmVhbS5jb25uZWN0X3RpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS5jb25uZWN0X3RpbWVvdXQsIDYwMDAwKTsKQEAgLTIyNjMsNTEgKzE1OTgsMzAwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9GQVNUQ0dJX1RFTVBfUEFUSCwgMSwgMiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9nYXJiYWdlX2NvbGxlY3Rvcl90ZW1wX2hhbmRsZXIsIGNmKTsKIAotCi0gICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT51cHN0cmVhbS5yZWRpcmVjdF9lcnJvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS5yZWRpcmVjdF9lcnJvcnMsIDApOwotCiAgICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT51cHN0cmVhbS5wYXNzX3VucGFyc2VkX3VyaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnVwc3RyZWFtLnBhc3NfdW5wYXJzZWRfdXJpLCAwKTsKIAotICAgIGlmIChjb25mLT51cHN0cmVhbS5wYXNzX3VucGFyc2VkX3VyaSAmJiBjb25mLT5sb2NhdGlvbi0+bGVuID4gMSkgeworICAgIGlmIChjb25mLT51cHN0cmVhbS5wYXNzX3VucGFyc2VkX3VyaSAmJiBjb25mLT51cHN0cmVhbS5sb2NhdGlvbi0+bGVuID4gMSkgewogICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIlwiZmFzdGNnaV9wYXNzX3VucGFyc2VkX3VyaVwiIGNhbiBiZSBzZXQgZm9yICIKICAgICAgICAgICAgICAgICAgICAgICAibG9jYXRpb24gXCIvXCIgb3IgZ2l2ZW4gYnkgcmVndWxhciBleHByZXNzaW9uLiIpOwogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCi0gICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT51cHN0cmVhbS54X3Bvd2VyZWRfYnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS54X3Bvd2VyZWRfYnksIDEpOwotCi0KLSAgICBuZ3hfY29uZl9tZXJnZV9iaXRtYXNrX3ZhbHVlKGNvbmYtPnBhcmFtcywgcHJldi0+cGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5HWF9DT05GX0JJVE1BU0tfU0VUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE5HWF9IVFRQX0ZBU1RDR0lfUkVNT1RFX0FERFIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8TkdYX0hUVFBfRkFTVENHSV9SRU1PVEVfVVNFUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfSFRUUF9GQVNUQ0dJX1NFUlZFUl9OQU1FCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE5HWF9IVFRQX0ZBU1RDR0lfU0VSVkVSX1BPUlQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8TkdYX0hUVFBfRkFTVENHSV9TQ1JJUFRfTkFNRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfSFRUUF9GQVNUQ0dJX0FVVEhfVFlQRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfSFRUUF9GQVNUQ0dJX1JFUVVFU1RfVVJJCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE5HWF9IVFRQX0ZBU1RDR0lfUkVESVJFQ1RfU1RBVFVTKSk7Ci0KLSAgICBuZ3hfY29uZl9tZXJnZV9zdHJfdmFsdWUoY29uZi0+cm9vdCwgcHJldi0+cm9vdCwgIiIpOwotCi0gICAgaWYgKGNvbmYtPnJvb3QubGVuICYmIGNvbmYtPnJvb3QuZGF0YVtjb25mLT5yb290LmxlbiAtIDFdID09ICcvJykgewotICAgICAgICBjb25mLT5yb290Lmxlbi0tOworICAgIGlmIChjb25mLT51cHN0cmVhbS5tZXRob2QgPT0gTkdYX0NPTkZfVU5TRVRfVUlOVCkgeworICAgICAgICBjb25mLT51cHN0cmVhbS5tZXRob2QgPSBwcmV2LT51cHN0cmVhbS5tZXRob2Q7IAogICAgIH0KIAorICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLnBhc3NfcmVxdWVzdF9oZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0ucGFzc19yZXF1ZXN0X2hlYWRlcnMsIDEpOworICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLnBhc3NfcmVxdWVzdF9ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0ucGFzc19yZXF1ZXN0X2JvZHksIDEpOworCisgICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT51cHN0cmVhbS5yZWRpcmVjdF9lcnJvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS5yZWRpcmVjdF9lcnJvcnMsIDApOworCisgICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT51cHN0cmVhbS5wYXNzX3hfcG93ZXJlZF9ieSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnVwc3RyZWFtLnBhc3NfeF9wb3dlcmVkX2J5LCAxKTsKKworCiAgICAgbmd4X2NvbmZfbWVyZ2Vfc3RyX3ZhbHVlKGNvbmYtPmluZGV4LCBwcmV2LT5pbmRleCwgIiIpOwogCi0gICAgaWYgKGNvbmYtPnZhcnMgPT0gTlVMTCkgewotICAgICAgICBjb25mLT52YXJzID0gcHJldi0+dmFyczsKLSAgICB9Ci0KICAgICBpZiAoY29uZi0+cGVlcnMgPT0gTlVMTCkgewogICAgICAgICBjb25mLT5wZWVycyA9IHByZXYtPnBlZXJzOwogICAgICAgICBjb25mLT51cHN0cmVhbSA9IHByZXYtPnVwc3RyZWFtOwogICAgIH0KIAorICAgIGlmIChjb25mLT5wYXJhbXNfc291cmNlID09IE5VTEwpIHsKKyAgICAgICAgY29uZi0+cGFyYW1zX3NvdXJjZSA9IHByZXYtPnBhcmFtc19zb3VyY2U7CisgICAgICAgIGNvbmYtPnBhcmFtc19sZW4gPSBwcmV2LT5wYXJhbXNfbGVuOworICAgICAgICBjb25mLT5wYXJhbXMgPSBwcmV2LT5wYXJhbXM7CisKKyAgICAgICAgaWYgKGNvbmYtPnBhcmFtc19zb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOworICAgICAgICB9CisgICAgfQorCisgICAgY29uZi0+cGFyYW1zX2xlbiA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDY0LCAxKTsKKyAgICBpZiAoY29uZi0+cGFyYW1zX2xlbiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisgICAgCisgICAgY29uZi0+cGFyYW1zID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgNTEyLCAxKTsKKyAgICBpZiAoY29uZi0+cGFyYW1zID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIHNyYyA9IGNvbmYtPnBhcmFtc19zb3VyY2UtPmVsdHM7CisgICAgZm9yIChpID0gMDsgaSA8IGNvbmYtPnBhcmFtc19zb3VyY2UtPm5lbHRzOyBpKyspIHsKKworICAgICAgICBpZiAobmd4X2h0dHBfc2NyaXB0X3ZhcmlhYmxlc19jb3VudCgmc3JjW2ldLnZhbHVlKSA9PSAwKSB7CisgICAgICAgICAgICBjb3B5ID0gbmd4X2FycmF5X3B1c2hfbihjb25mLT5wYXJhbXNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCkpOworICAgICAgICAgICAgaWYgKGNvcHkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29weS0+Y29kZSA9IChuZ3hfaHR0cF9zY3JpcHRfY29kZV9wdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfc2NyaXB0X2NvcHlfbGVuX2NvZGU7CisgICAgICAgICAgICBjb3B5LT5sZW4gPSBzcmNbaV0ua2V5LmxlbjsKKworCisgICAgICAgICAgICBjb3B5ID0gbmd4X2FycmF5X3B1c2hfbihjb25mLT5wYXJhbXNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCkpOworICAgICAgICAgICAgaWYgKGNvcHkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29weS0+Y29kZSA9IChuZ3hfaHR0cF9zY3JpcHRfY29kZV9wdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9zY3JpcHRfY29weV9sZW5fY29kZTsKKyAgICAgICAgICAgIGNvcHktPmxlbiA9IHNyY1tpXS52YWx1ZS5sZW47CisKKworICAgICAgICAgICAgc2l6ZSA9IChzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KQorICAgICAgICAgICAgICAgICAgICAgICArIHNyY1tpXS5rZXkubGVuICsgc3JjW2ldLnZhbHVlLmxlbgorICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih1aW50cHRyX3QpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgJiB+KHNpemVvZih1aW50cHRyX3QpIC0gMSk7CisKKyAgICAgICAgICAgIGNvcHkgPSBuZ3hfYXJyYXlfcHVzaF9uKGNvbmYtPnBhcmFtcywgc2l6ZSk7CisgICAgICAgICAgICBpZiAoY29weSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgY29weS0+Y29kZSA9IG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGU7CisgICAgICAgICAgICBjb3B5LT5sZW4gPSBzcmNbaV0ua2V5LmxlbiArIHNyY1tpXS52YWx1ZS5sZW47CisKKyAgICAgICAgICAgIHAgPSAodV9jaGFyICopIGNvcHkgKyBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KTsKKworICAgICAgICAgICAgcCA9IG5neF9jcHltZW0ocCwgc3JjW2ldLmtleS5kYXRhLCBzcmNbaV0ua2V5Lmxlbik7CisgICAgICAgICAgICBuZ3hfbWVtY3B5KHAsIHNyY1tpXS52YWx1ZS5kYXRhLCBzcmNbaV0udmFsdWUubGVuKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29weSA9IG5neF9hcnJheV9wdXNoX24oY29uZi0+cGFyYW1zX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfY29weV9jb2RlX3QpKTsKKyAgICAgICAgICAgIGlmIChjb3B5ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvcHktPmNvZGUgPSAobmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfc2NyaXB0X2NvcHlfbGVuX2NvZGU7CisgICAgICAgICAgICBjb3B5LT5sZW4gPSBzcmNbaV0ua2V5LmxlbjsKKworCisgICAgICAgICAgICBzaXplID0gKHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfY29weV9jb2RlX3QpCisgICAgICAgICAgICAgICAgICAgICsgc3JjW2ldLmtleS5sZW4gKyBzaXplb2YodWludHB0cl90KSAtIDEpCisgICAgICAgICAgICAgICAgICAgICYgfihzaXplb2YodWludHB0cl90KSAtIDEpOworCisgICAgICAgICAgICBjb3B5ID0gbmd4X2FycmF5X3B1c2hfbihjb25mLT5wYXJhbXMsIHNpemUpOworICAgICAgICAgICAgaWYgKGNvcHkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIGNvcHktPmNvZGUgPSBuZ3hfaHR0cF9zY3JpcHRfY29weV9jb2RlOworICAgICAgICAgICAgY29weS0+bGVuID0gc3JjW2ldLmtleS5sZW47CisKKyAgICAgICAgICAgIHAgPSAodV9jaGFyICopIGNvcHkgKyBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KTsKKyAgICAgICAgICAgIG5neF9tZW1jcHkocCwgc3JjW2ldLmtleS5kYXRhLCBzcmNbaV0ua2V5Lmxlbik7CisKKworICAgICAgICAgICAgbmd4X21lbXplcm8oJnNjLCBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvbXBpbGVfdCkpOworCisgICAgICAgICAgICBzYy5jZiA9IGNmOworICAgICAgICAgICAgc2Muc291cmNlID0gJnNyY1tpXS52YWx1ZTsKKyAgICAgICAgICAgIHNjLmxlbmd0aHMgPSAmY29uZi0+cGFyYW1zX2xlbjsKKyAgICAgICAgICAgIHNjLnZhbHVlcyA9ICZjb25mLT5wYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChuZ3hfaHR0cF9zY3JpcHRfY29tcGlsZSgmc2MpICE9IE5HWF9PSykgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNvZGUgPSBuZ3hfYXJyYXlfcHVzaF9uKGNvbmYtPnBhcmFtc19sZW4sIHNpemVvZih1aW50cHRyX3QpKTsKKyAgICAgICAgaWYgKGNvZGUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgKmNvZGUgPSAodWludHB0cl90KSBOVUxMOworCisKKyAgICAgICAgY29kZSA9IG5neF9hcnJheV9wdXNoX24oY29uZi0+cGFyYW1zLCBzaXplb2YodWludHB0cl90KSk7CisgICAgICAgIGlmIChjb2RlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgICpjb2RlID0gKHVpbnRwdHJfdCkgTlVMTDsKKyAgICB9CisKKyAgICBjb2RlID0gbmd4X2FycmF5X3B1c2hfbihjb25mLT5wYXJhbXNfbGVuLCBzaXplb2YodWludHB0cl90KSk7CisgICAgaWYgKGNvZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgKmNvZGUgPSAodWludHB0cl90KSBOVUxMOworCisgICAgcmV0dXJuIE5HWF9DT05GX09LOworfQorCisKK3N0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKK25neF9odHRwX2Zhc3RjZ2lfc2NyaXB0X25hbWVfdmFyaWFibGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSkKK3sKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICpwOworICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICAgKnZ2OworICAgIG5neF9odHRwX2Zhc3RjZ2lfbG9jX2NvbmZfdCAgKmZsY2Y7CisKKyAgICB2diA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKKyAgICBpZiAodnYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB2di0+dmFsdWUgPSAwOworCisgICAgZmxjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfZmFzdGNnaV9tb2R1bGUpOworCisgICAgaWYgKHItPnVyaS5kYXRhW3ItPnVyaS5sZW4gLSAxXSAhPSAnLycpIHsKKyAgICAgICAgdnYtPnRleHQgPSByLT51cmk7CisgICAgICAgIHJldHVybiB2djsKKyAgICB9CisKKyAgICB2di0+dGV4dC5sZW4gPSByLT51cmkubGVuICsgZmxjZi0+aW5kZXgubGVuOworCisgICAgdnYtPnRleHQuZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgdnYtPnRleHQubGVuKTsKKyAgICBpZiAodnYtPnRleHQuZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHAgPSBuZ3hfY3B5bWVtKHZ2LT50ZXh0LmRhdGEsIHItPnVyaS5kYXRhLCByLT51cmkubGVuKTsKKyAgICBuZ3hfbWVtY3B5KHAsIGZsY2YtPmluZGV4LmRhdGEsIGZsY2YtPmluZGV4Lmxlbik7CisKKyAgICByZXR1cm4gdnY7Cit9CisKKworc3RhdGljIGNoYXIgKgorbmd4X2h0dHBfZmFzdGNnaV9wYXNzKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCit7CisgICAgbmd4X2h0dHBfZmFzdGNnaV9sb2NfY29uZl90ICpsY2YgPSBjb25mOworCisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICp2YWx1ZTsKKyAgICBuZ3hfaW5ldF91cHN0cmVhbV90ICAgICAgICAgIGluZXRfdXBzdHJlYW07CisgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAgICpjbGNmOworI2lmIChOR1hfSEFWRV9VTklYX0RPTUFJTikKKyAgICBuZ3hfdW5peF9kb21haW5fdXBzdHJlYW1fdCAgIHVuaXhfdXBzdHJlYW07CisjZW5kaWYKKworICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7CisKKyAgICBpZiAobmd4X3N0cm5jYXNlY21wKHZhbHVlWzFdLmRhdGEsICJ1bml4OiIsIDUpID09IDApIHsKKworI2lmIChOR1hfSEFWRV9VTklYX0RPTUFJTikKKworICAgICAgICBuZ3hfbWVtemVybygmdW5peF91cHN0cmVhbSwgc2l6ZW9mKG5neF91bml4X2RvbWFpbl91cHN0cmVhbV90KSk7CisKKyAgICAgICAgdW5peF91cHN0cmVhbS5uYW1lID0gdmFsdWVbMV07CisgICAgICAgIHVuaXhfdXBzdHJlYW0udXJsID0gdmFsdWVbMV07CisKKyAgICAgICAgbGNmLT5wZWVycyA9IG5neF91bml4X3Vwc3RyZWFtX3BhcnNlKGNmLCAmdW5peF91cHN0cmVhbSk7CisgICAgICAgIGlmIChsY2YtPnBlZXJzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCisjZWxzZQorICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHVuaXggZG9tYWluIHNvY2tldHMgYXJlIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgcGxhdGZvcm0iKTsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworCisjZW5kaWYKKworICAgIH0gZWxzZSB7CisgICAgICAgIG5neF9tZW16ZXJvKCZpbmV0X3Vwc3RyZWFtLCBzaXplb2Yobmd4X2luZXRfdXBzdHJlYW1fdCkpOworCisgICAgICAgIGluZXRfdXBzdHJlYW0ubmFtZSA9IHZhbHVlWzFdOworICAgICAgICBpbmV0X3Vwc3RyZWFtLnVybCA9IHZhbHVlWzFdOworICAgIAorICAgICAgICBsY2YtPnBlZXJzID0gbmd4X2luZXRfdXBzdHJlYW1fcGFyc2UoY2YsICZpbmV0X3Vwc3RyZWFtKTsKKyAgICAgICAgaWYgKGxjZi0+cGVlcnMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgbGNmLT51cHN0cmVhbS5zY2hlbWEubGVuID0gc2l6ZW9mKCJmYXN0Y2dpOi8vIikgLSAxOworICAgIGxjZi0+dXBzdHJlYW0uc2NoZW1hLmRhdGEgPSAodV9jaGFyICopICJmYXN0Y2dpOi8vIjsKKyAgICBsY2YtPnVwc3RyZWFtLnVyaS5sZW4gPSBzaXplb2YoIi8iKSAtIDE7CisgICAgbGNmLT51cHN0cmVhbS51cmkuZGF0YSA9ICh1X2NoYXIgKikgIi8iOworCisgICAgY2xjZiA9IG5neF9odHRwX2NvbmZfZ2V0X21vZHVsZV9sb2NfY29uZihjZiwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOworCisgICAgY2xjZi0+aGFuZGxlciA9IG5neF9odHRwX2Zhc3RjZ2lfaGFuZGxlcjsKKworI2lmIChOR1hfUENSRSkKKyAgICBsY2YtPnVwc3RyZWFtLmxvY2F0aW9uID0gY2xjZi0+cmVnZXggPyAmbmd4X2h0dHBfZmFzdGNnaV91cmkgOiAmY2xjZi0+bmFtZTsKKyNlbHNlCisgICAgbGNmLT51cHN0cmVhbS5sb2NhdGlvbiA9ICZjbGNmLT5uYW1lOworI2VuZGlmCisKKyAgICBpZiAoY2xjZi0+bmFtZS5kYXRhW2NsY2YtPm5hbWUubGVuIC0gMV0gPT0gJy8nKSB7CisgICAgICAgIGNsY2YtPmF1dG9fcmVkaXJlY3QgPSAxOworICAgIH0KKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KKworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9mYXN0Y2dpX2xvd2F0X2NoZWNrKG5neF9jb25mX3QgKmNmLCB2b2lkICpwb3N0LCB2b2lkICpkYXRhKQoreworI2lmIChOR1hfRlJFRUJTRCkKKyAgICBzc2l6ZV90ICpucCA9IGRhdGE7CisKKyAgICBpZiAoKm5wID49IG5neF9mcmVlYnNkX25ldF9pbmV0X3RjcF9zZW5kc3BhY2UpIHsKKyAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiZmFzdGNnaV9zZW5kX2xvd2F0XCIgbXVzdCBiZSBsZXNzIHRoYW4gJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzeXNjdGwgbmV0LmluZXQudGNwLnNlbmRzcGFjZSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2ZyZWVic2RfbmV0X2luZXRfdGNwX3NlbmRzcGFjZSk7CisKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworI2VsaWYgIShOR1hfSEFWRV9TT19TTkRMT1dBVCkKKyAgICBzc2l6ZV90ICpucCA9IGRhdGE7CisKKyAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19XQVJOLCBjZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIlwiZmFzdGNnaV9zZW5kX2xvd2F0XCIgaXMgbm90IHN1cHBvcnRlZCwgaWdub3JlZCIpOworCisgICAgKm5wID0gMDsKKworI2VuZGlmCisKICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CiB9CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2dlb19tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ2VvX21vZHVsZS5jCmluZGV4IDg2NWY4MjUuLjcyM2VmZjkgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ2VvX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ2VvX21vZHVsZS5jCkBAIC0zNCw3ICszNCw4IEBACiAKIAogc3RhdGljIG5neF9odHRwX21vZHVsZV90ICBuZ3hfaHR0cF9nZW9fbW9kdWxlX2N0eCA9IHsKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmUgY29uZiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZWNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3N0Y29uZmlndXJhdGlvbiAqLwogCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIG1haW4gY29uZmlndXJhdGlvbiAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbWFpbiBjb25maWd1cmF0aW9uICovCkBAIC00OCw3ICs0OSw3IEBACiAKIAogbmd4X21vZHVsZV90ICBuZ3hfaHR0cF9nZW9fbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X2h0dHBfZ2VvX21vZHVsZV9jdHgsICAgICAgICAgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLwogICAgIG5neF9odHRwX2dlb19jb21tYW5kcywgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0hUVFBfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KQEAgLTExMCw3ICsxMTEsNyBAQAogICAgICAgICBuYW1lLmRhdGErKzsKICAgICB9CiAKLSAgICB2YXIgPSBuZ3hfaHR0cF9hZGRfdmFyaWFibGUoY2YsICZuYW1lLCAxKTsKKyAgICB2YXIgPSBuZ3hfaHR0cF9hZGRfdmFyaWFibGUoY2YsICZuYW1lLCAwKTsKICAgICBpZiAodmFyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2d6aXBfZmlsdGVyX21vZHVsZS5jCmluZGV4IDRhNGRhN2YuLjFmN2MyMzIgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nemlwX2ZpbHRlcl9tb2R1bGUuYwpAQCAtMjA3LDcgKzIwNyw4IEBACiAKIAogc3RhdGljIG5neF9odHRwX21vZHVsZV90ICBuZ3hfaHR0cF9nemlwX2ZpbHRlcl9tb2R1bGVfY3R4ID0gewotICAgIG5neF9odHRwX2d6aXBfYWRkX2xvZ19mb3JtYXRzLCAgICAgICAgIC8qIHByZSBjb25mICovCisgICAgbmd4X2h0dHBfZ3ppcF9hZGRfbG9nX2Zvcm1hdHMsICAgICAgICAgLyogcHJlY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3Rjb25maWd1cmF0aW9uICovCiAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtYWluIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTIyMSw3ICsyMjIsNyBAQAogCiAKIG5neF9tb2R1bGVfdCAgbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X2h0dHBfZ3ppcF9maWx0ZXJfbW9kdWxlX2N0eCwgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLwogICAgIG5neF9odHRwX2d6aXBfZmlsdGVyX2NvbW1hbmRzLCAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0hUVFBfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KQEAgLTI1Nyw2ICsyNTgsMTEgQEAKICNlbmRpZgogCiAKK3N0YXRpYyBuZ3hfc3RyX3QgIG5neF9odHRwX2d6aXBfbm9fY2FjaGUgPSBuZ3hfc3RyaW5nKCJuby1jYWNoZSIpOworc3RhdGljIG5neF9zdHJfdCAgbmd4X2h0dHBfZ3ppcF9ub19zdG9yZSA9IG5neF9zdHJpbmcoIm5vLXN0b3JlIik7CitzdGF0aWMgbmd4X3N0cl90ICBuZ3hfaHR0cF9nemlwX3ByaXZhdGUgPSBuZ3hfc3RyaW5nKCJwcml2YXRlIik7CisKKwogc3RhdGljIG5neF9odHRwX291dHB1dF9oZWFkZXJfZmlsdGVyX3B0ICBuZ3hfaHR0cF9uZXh0X2hlYWRlcl9maWx0ZXI7CiBzdGF0aWMgbmd4X2h0dHBfb3V0cHV0X2JvZHlfZmlsdGVyX3B0ICAgIG5neF9odHRwX25leHRfYm9keV9maWx0ZXI7CiAKQEAgLTI3Niw4ICsyODIsOSBAQAogICAgICAgICAgICAgJiYgci0+aGVhZGVyc19vdXQuc3RhdHVzICE9IE5HWF9IVFRQX0ZPUkJJRERFTgogICAgICAgICAgICAgJiYgci0+aGVhZGVyc19vdXQuc3RhdHVzICE9IE5HWF9IVFRQX05PVF9GT1VORCkKICAgICAgICAgfHwgci0+aGVhZGVyX29ubHkKKyAgICAgICAgfHwgci0+bWFpbgogICAgICAgICB8fCByLT5odHRwX3ZlcnNpb24gPCBjb25mLT5odHRwX3ZlcnNpb24KLSAgICAgICAgfHwgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlID09IE5VTEwKKyAgICAgICAgfHwgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmxlbiA9PSAwCiAgICAgICAgIHx8IChyLT5oZWFkZXJzX291dC5jb250ZW50X2VuY29kaW5nCiAgICAgICAgICAgICAmJiByLT5oZWFkZXJzX291dC5jb250ZW50X2VuY29kaW5nLT52YWx1ZS5sZW4pCiAgICAgICAgIHx8IHItPmhlYWRlcnNfaW4uYWNjZXB0X2VuY29kaW5nID09IE5VTEwKQEAgLTI5NCw4ICszMDEsOCBAQAogICAgIHR5cGUgPSBjb25mLT50eXBlcy0+ZWx0czsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBjb25mLT50eXBlcy0+bmVsdHM7IGkrKykgewotICAgICAgICBpZiAoci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLT52YWx1ZS5sZW4gPj0gdHlwZVtpXS5uYW1lLmxlbgotICAgICAgICAgICAgJiYgbmd4X3N0cm5jYXNlY21wKHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS0+dmFsdWUuZGF0YSwgCisgICAgICAgIGlmIChyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUubGVuID49IHR5cGVbaV0ubmFtZS5sZW4KKyAgICAgICAgICAgICYmIG5neF9zdHJuY2FzZWNtcChyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUuZGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVtpXS5uYW1lLmRhdGEsIHR5cGVbaV0ubmFtZS5sZW4pID09IDApCiAgICAgICAgIHsKICAgICAgICAgICAgIGZvdW5kID0gMTsKQEAgLTM0Niw2ICszNTMsNyBAQAogICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KIAorICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfZW5jb2RpbmctPmhhc2ggPSAxOwogICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfZW5jb2RpbmctPmtleS5sZW4gPSBzaXplb2YoIkNvbnRlbnQtRW5jb2RpbmciKSAtIDE7CiAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF9lbmNvZGluZy0+a2V5LmRhdGEgPSAodV9jaGFyICopICJDb250ZW50LUVuY29kaW5nIjsKICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X2VuY29kaW5nLT52YWx1ZS5sZW4gPSBzaXplb2YoImd6aXAiKSAtIDE7CkBAIC0zNTMsMTAgKzM2MSwxMiBAQAogCiAgICAgY3R4LT5sZW5ndGggPSByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aF9uOwogICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfbGVuZ3RoX24gPSAtMTsKKwogICAgIGlmIChyLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aCkgewotICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aC0+a2V5LmxlbiA9IDA7CisgICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfbGVuZ3RoLT5oYXNoID0gMDsKICAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGggPSBOVUxMOwogICAgIH0KKwogICAgIHItPmZpbHRlcl9uZWVkX2luX21lbW9yeSA9IDE7CiAKICAgICByZXR1cm4gbmd4X2h0dHBfbmV4dF9oZWFkZXJfZmlsdGVyKHIpOwpAQCAtNDA0LDIyICs0MTQsMjUgQEAKICAgICAgICAgcmV0dXJuIE5HWF9ERUNMSU5FRDsKICAgICB9CiAKLSAgICBpZiAoci0+aGVhZGVyc19vdXQuY2FjaGVfY29udHJvbCkgeworICAgIGlmIChyLT5oZWFkZXJzX291dC5jYWNoZV9jb250cm9sLmVsdHMpIHsKIAogICAgICAgICBpZiAoKGNvbmYtPnByb3hpZWQgJiBOR1hfSFRUUF9HWklQX1BST1hJRURfTk9fQ0FDSEUpCi0gICAgICAgICAgICAmJiBuZ3hfc3Ryc3RyKHItPmhlYWRlcnNfb3V0LmNhY2hlX2NvbnRyb2wtPnZhbHVlLmRhdGEsICJuby1jYWNoZSIpKQorICAgICAgICAgICAgJiYgbmd4X2h0dHBfcGFyc2VfbXVsdGlfaGVhZGVyX2xpbmVzKCZyLT5oZWFkZXJzX291dC5jYWNoZV9jb250cm9sLAorICAgICAgICAgICAgICAgICAgICZuZ3hfaHR0cF9nemlwX25vX2NhY2hlLCBOVUxMKSA+PSAwKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX09LOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKChjb25mLT5wcm94aWVkICYgTkdYX0hUVFBfR1pJUF9QUk9YSUVEX05PX1NUT1JFKQotICAgICAgICAgICAgJiYgbmd4X3N0cnN0cihyLT5oZWFkZXJzX291dC5jYWNoZV9jb250cm9sLT52YWx1ZS5kYXRhLCAibm8tc3RvcmUiKSkKKyAgICAgICAgICAgICYmIG5neF9odHRwX3BhcnNlX211bHRpX2hlYWRlcl9saW5lcygmci0+aGVhZGVyc19vdXQuY2FjaGVfY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAmbmd4X2h0dHBfZ3ppcF9ub19zdG9yZSwgTlVMTCkgPj0gMCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9PSzsKICAgICAgICAgfQogCiAgICAgICAgIGlmICgoY29uZi0+cHJveGllZCAmIE5HWF9IVFRQX0daSVBfUFJPWElFRF9QUklWQVRFKQotICAgICAgICAgICAgJiYgbmd4X3N0cnN0cihyLT5oZWFkZXJzX291dC5jYWNoZV9jb250cm9sLT52YWx1ZS5kYXRhLCAicHJpdmF0ZSIpKQorICAgICAgICAgICAgJiYgbmd4X2h0dHBfcGFyc2VfbXVsdGlfaGVhZGVyX2xpbmVzKCZyLT5oZWFkZXJzX291dC5jYWNoZV9jb250cm9sLAorICAgICAgICAgICAgICAgICAgICZuZ3hfaHR0cF9nemlwX3ByaXZhdGUsIE5VTEwpID49IDApCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBOR1hfT0s7CiAgICAgICAgIH0KQEAgLTQ4NCw4ICs0OTcsOCBAQAogICAgICAgICAgKiBhbmQgZG8gbm90IHdhaXQgd2hpbGUgYSB3aG9sZSByZXNwb25zZSB3aWxsIGJlIHNlbnQgdG8gYSBjbGllbnQuCiAgICAgICAgICAqCiAgICAgICAgICAqIDhLIGlzIGZvciB6bGliIGRlZmxhdGVfc3RhdGUsIGl0IHRha2VzCi0gICAgICAgICAqICAqIDU4MTYgYnl0ZXMgb24geDg2IGFuZCBzcGFyYzY0ICgzMi1iaXQgbW9kZSkKLSAgICAgICAgICogICogNTkyMCBieXRlcyBvbiBhbWQ2NCBhbmQgc3BhcmM2NAorICAgICAgICAgKiAgKikgNTgxNiBieXRlcyBvbiBpMzg2IGFuZCBzcGFyYzY0ICgzMi1iaXQgbW9kZSkKKyAgICAgICAgICogICopIDU5MjAgYnl0ZXMgb24gYW1kNjQgYW5kIHNwYXJjNjQKICAgICAgICAgICovCiAKICAgICAgICAgY3R4LT5hbGxvY2F0ZWQgPSA4MTkyICsgKDEgPDwgKHdiaXRzICsgMikpICsgKDEgPDwgKG1lbWxldmVsICsgOSkpOwpAQCAtNjk2LDcgKzcwOSw4IEBACiAKICAgICAgICAgICAgIGlmIChjdHgtPmZsdXNoID09IFpfU1lOQ19GTFVTSCkgewogCi0gICAgICAgICAgICAgICAgY3R4LT5vdXRfYnVmLT5mbHVzaCA9IDA7CisgICAgICAgICAgICAgICAgY3R4LT56c3RyZWFtLmF2YWlsX291dCA9IDA7CisgICAgICAgICAgICAgICAgY3R4LT5vdXRfYnVmLT5mbHVzaCA9IDE7CiAgICAgICAgICAgICAgICAgY3R4LT5mbHVzaCA9IFpfTk9fRkxVU0g7CiAKICAgICAgICAgICAgICAgICBjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9oZWFkZXJzX2ZpbHRlcl9tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfaGVhZGVyc19maWx0ZXJfbW9kdWxlLmMKaW5kZXggNzkzY2VmZC4uZjI3YWI0NyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9oZWFkZXJzX2ZpbHRlcl9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2hlYWRlcnNfZmlsdGVyX21vZHVsZS5jCkBAIC00MSw3ICs0MSw4IEBACiAKIAogc3RhdGljIG5neF9odHRwX21vZHVsZV90ICBuZ3hfaHR0cF9oZWFkZXJzX2ZpbHRlcl9tb2R1bGVfY3R4ID0gewotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZSBjb25mICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3Rjb25maWd1cmF0aW9uICovCiAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtYWluIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTU1LDcgKzU2LDcgQEAKIAogCiBuZ3hfbW9kdWxlX3QgIG5neF9odHRwX2hlYWRlcnNfZmlsdGVyX21vZHVsZSA9IHsKLSAgICBOR1hfTU9EVUxFLAorICAgIE5HWF9NT0RVTEVfVjEsCiAgICAgJm5neF9odHRwX2hlYWRlcnNfZmlsdGVyX21vZHVsZV9jdHgsICAgLyogbW9kdWxlIGNvbnRleHQgKi8KICAgICBuZ3hfaHR0cF9oZWFkZXJzX2ZpbHRlcl9jb21tYW5kcywgICAgICAvKiBtb2R1bGUgZGlyZWN0aXZlcyAqLwogICAgIE5HWF9IVFRQX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSB0eXBlICovCkBAIC03MSwxMCArNzIsMTEgQEAKIG5neF9odHRwX2hlYWRlcnNfZmlsdGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgIGk7CiAgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICpleHBpcmVzLCAqY2M7CiAgICAgbmd4X2h0dHBfaGVhZGVyc19jb25mX3QgICpjb25mOwogCi0gICAgaWYgKHItPmhlYWRlcnNfb3V0LnN0YXR1cyAhPSBOR1hfSFRUUF9PSykgeworICAgIGlmIChyLT5oZWFkZXJzX291dC5zdGF0dXMgIT0gTkdYX0hUVFBfT0sgfHwgci0+bWFpbikgewogICAgICAgICByZXR1cm4gbmd4X2h0dHBfbmV4dF9oZWFkZXJfZmlsdGVyKHIpOwogICAgIH0KIApAQCAtODIsMjggKzg0LDQzIEBACiAKICAgICBpZiAoY29uZi0+ZXhwaXJlcyAhPSBOR1hfSFRUUF9FWFBJUkVTX09GRikgewogCi0gICAgICAgIGV4cGlyZXMgPSBuZ3hfbGlzdF9wdXNoKCZyLT5oZWFkZXJzX291dC5oZWFkZXJzKTsKKyAgICAgICAgZXhwaXJlcyA9IHItPmhlYWRlcnNfb3V0LmV4cGlyZXM7CisKICAgICAgICAgaWYgKGV4cGlyZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKworICAgICAgICAgICAgZXhwaXJlcyA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpOworICAgICAgICAgICAgaWYgKGV4cGlyZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmV4cGlyZXMgPSBleHBpcmVzOworCisgICAgICAgICAgICBleHBpcmVzLT5oYXNoID0gMTsKKyAgICAgICAgICAgIGV4cGlyZXMtPmtleS5sZW4gPSBzaXplb2YoIkV4cGlyZXMiKSAtIDE7CisgICAgICAgICAgICBleHBpcmVzLT5rZXkuZGF0YSA9ICh1X2NoYXIgKikgIkV4cGlyZXMiOwogICAgICAgICB9CiAKLSAgICAgICAgci0+aGVhZGVyc19vdXQuZXhwaXJlcyA9IGV4cGlyZXM7Ci0KLSAgICAgICAgY2MgPSBuZ3hfbGlzdF9wdXNoKCZyLT5oZWFkZXJzX291dC5oZWFkZXJzKTsKLSAgICAgICAgaWYgKGNjID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICByLT5oZWFkZXJzX291dC5jYWNoZV9jb250cm9sID0gY2M7Ci0KICAgICAgICAgbGVuID0gc2l6ZW9mKCJNb24sIDI4IFNlcCAxOTcwIDA2OjAwOjAwIEdNVCIpOwotCi0gICAgICAgIGV4cGlyZXMtPmtleS5sZW4gPSBzaXplb2YoIkV4cGlyZXMiKSAtIDE7Ci0gICAgICAgIGV4cGlyZXMtPmtleS5kYXRhID0gKHVfY2hhciAqKSAiRXhwaXJlcyI7CiAgICAgICAgIGV4cGlyZXMtPnZhbHVlLmxlbiA9IGxlbiAtIDE7CiAKLSAgICAgICAgY2MtPmtleS5sZW4gPSBzaXplb2YoIkNhY2hlLUNvbnRyb2wiKSAtIDE7Ci0gICAgICAgIGNjLT5rZXkuZGF0YSA9ICh1X2NoYXIgKikgIkNhY2hlLUNvbnRyb2wiOworICAgICAgICBjYyA9IHItPmhlYWRlcnNfb3V0LmNhY2hlX2NvbnRyb2wuZWx0czsKKworICAgICAgICBpZiAoY2MgPT0gTlVMTCkgeworCisgICAgICAgICAgICBjYyA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpOworICAgICAgICAgICAgaWYgKGNjID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYy0+aGFzaCA9IDE7CisgICAgICAgICAgICBjYy0+a2V5LmxlbiA9IHNpemVvZigiQ2FjaGUtQ29udHJvbCIpIC0gMTsKKyAgICAgICAgICAgIGNjLT5rZXkuZGF0YSA9ICh1X2NoYXIgKikgIkNhY2hlLUNvbnRyb2wiOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgci0+aGVhZGVyc19vdXQuY2FjaGVfY29udHJvbC5uZWx0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2NbaV0uaGFzaCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBpZiAoY29uZi0+ZXhwaXJlcyA9PSBOR1hfSFRUUF9FWFBJUkVTX0VQT0NIKSB7CiAgICAgICAgICAgICBleHBpcmVzLT52YWx1ZS5kYXRhID0gKHVfY2hhciAqKSAiVGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMSBHTVQiOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9pbmRleF9tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfaW5kZXhfbW9kdWxlLmMKaW5kZXggMzczYzMxNS4uNTMxNTcwNCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9pbmRleF9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2luZGV4X21vZHVsZS5jCkBAIC0xMCw0MiArMTAsNTIgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgIGluZGljZXM7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgIG5hbWU7CisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgKmxlbmd0aHM7CisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgKnZhbHVlczsKK30gbmd4X2h0dHBfaW5kZXhfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgKmluZGljZXM7ICAgIC8qIGFycmF5IG9mIG5neF9odHRwX2luZGV4X3QgKi8KICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgbWF4X2luZGV4X2xlbjsKLSAgICBuZ3hfaHR0cF9jYWNoZV9oYXNoX3QgICAqaW5kZXhfY2FjaGU7CiB9IG5neF9odHRwX2luZGV4X2xvY19jb25mX3Q7CiAKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICBpbmRleDsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAqbGFzdDsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgcGF0aDsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgcmVkaXJlY3Q7Ci0gICAgbmd4X2h0dHBfY2FjaGVfZW50cnlfdCAgKmNhY2hlOwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICB0ZXN0ZWQ7IC8qIHVuc2lnbmVkICB0ZXN0ZWQ6MSAqLworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICBjdXJyZW50OworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQ7CisKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAqcGF0aDsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgdXJpOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICBpbmRleDsKKworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICB0ZXN0ZWQ7ICAgICAvKiB1bnNpZ25lZCAgdGVzdGVkOjEgKi8KIH0gbmd4X2h0dHBfaW5kZXhfY3R4X3Q7CiAKIAogI2RlZmluZSBOR1hfSFRUUF9ERUZBVUxUX0lOREVYICAgImluZGV4Lmh0bWwiCiAKIAorc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9pbmRleF9hbGxvYyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHNpemVfdCBzaXplLAorICAgIG5neF9odHRwX2luZGV4X2N0eF90ICpjdHgsIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAqY2xjZik7CiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2luZGV4X3Rlc3RfZGlyKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfaW5kZXhfY3R4X3QgKmN0eCk7CisgICAgbmd4X2h0dHBfaW5kZXhfY3R4X3QgKmN0eCk7CiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2luZGV4X2Vycm9yKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfaW5kZXhfY3R4X3QgKmN0eCwgbmd4X2Vycl90IGVycik7CisgICAgbmd4X2h0dHBfaW5kZXhfY3R4X3QgKmN0eCwgbmd4X2Vycl90IGVycik7CiAKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfaW5kZXhfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpOwogc3RhdGljIHZvaWQgKm5neF9odHRwX2luZGV4X2NyZWF0ZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZik7CiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfaW5kZXhfbWVyZ2VfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKTsKKyAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKTsKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9pbmRleF9zZXRfaW5kZXgobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZik7CisgICAgdm9pZCAqY29uZik7CiAKIAogc3RhdGljIG5neF9jb21tYW5kX3QgIG5neF9odHRwX2luZGV4X2NvbW1hbmRzW10gPSB7CiAKICAgICB7IG5neF9zdHJpbmcoImluZGV4IiksCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl8xTU9SRSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl8xTU9SRSwKICAgICAgIG5neF9odHRwX2luZGV4X3NldF9pbmRleCwKICAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKICAgICAgIDAsCkBAIC02Nyw3ICs3Nyw4IEBACiAKIAogbmd4X2h0dHBfbW9kdWxlX3QgIG5neF9odHRwX2luZGV4X21vZHVsZV9jdHggPSB7Ci0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlIGNvbmYgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmVjb25maWd1cmF0aW9uICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdGNvbmZpZ3VyYXRpb24gKi8KIAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLwpAQCAtODEsNyArOTIsNyBAQAogCiAKIG5neF9tb2R1bGVfdCAgbmd4X2h0dHBfaW5kZXhfbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X2h0dHBfaW5kZXhfbW9kdWxlX2N0eCwgICAgICAgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLwogICAgIG5neF9odHRwX2luZGV4X2NvbW1hbmRzLCAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0hUVFBfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KQEAgLTEwMCwyMSArMTExLDI0IEBACiAgKiB0aGF0IHBhdGggY29udGFpbnMgdGhlIHVzdWFsIGZpbGUgaW4gcGxhY2Ugb2YgdGhlIGRpcmVjdG9yeS4KICAqLwogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2luZGV4X2hhbmRsZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfaW5kZXhfaGFuZGxlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7Ci0gICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgKm5hbWU7Ci0gICAgbmd4X2ZkX3QgICAgICAgICAgICAgICAgICAgIGZkOwotICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICByYzsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAqaW5kZXg7Ci0gICAgbmd4X2Vycl90ICAgICAgICAgICAgICAgICAgIGVycjsKLSAgICBuZ3hfbG9nX3QgICAgICAgICAgICAgICAgICAqbG9nOwotICAgIG5neF9odHRwX2luZGV4X2N0eF90ICAgICAgICpjdHg7Ci0gICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAgKmNsY2Y7Ci0gICAgbmd4X2h0dHBfaW5kZXhfbG9jX2NvbmZfdCAgKmlsY2Y7Ci0jaWYgKE5HWF9IVFRQX0NBQ0hFMCkKLSAgICAvKiBjcmMgbXVzdCBiZSBpbiBjdHggISEgKi8KLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgY3JjOwotI2VuZGlmCisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAqbmFtZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICBsZW47CisgICAgbmd4X2ZkX3QgICAgICAgICAgICAgICAgICAgICAgZmQ7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgICAgcmM7CisgICAgbmd4X2Vycl90ICAgICAgICAgICAgICAgICAgICAgZXJyOworICAgIG5neF9sb2dfdCAgICAgICAgICAgICAgICAgICAgKmxvZzsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICBpOworICAgIG5neF9odHRwX2luZGV4X3QgICAgICAgICAgICAgKmluZGV4OworICAgIG5neF9odHRwX2luZGV4X2N0eF90ICAgICAgICAgKmN0eDsKKyAgICBuZ3hfcG9vbF9jbGVhbnVwX2ZpbGVfdCAgICAgICpjbG47CisgICAgbmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQgICAgICAgY29kZTsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgICAgICBlOworICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgICAgKmNsY2Y7CisgICAgbmd4X2h0dHBfaW5kZXhfbG9jX2NvbmZfdCAgICAqaWxjZjsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfbGVuX2NvZGVfcHQgICBsY29kZTsKIAogICAgIGlmIChyLT51cmkuZGF0YVtyLT51cmkubGVuIC0gMV0gIT0gJy8nKSB7CiAgICAgICAgIHJldHVybiBOR1hfREVDTElORUQ7CkBAIC0xMjgsOCArMTQyLDggQEAKICAgICBsb2cgPSByLT5jb25uZWN0aW9uLT5sb2c7CiAKICAgICAvKgotICAgICAqIHdlIHVzZSBjb250ZXh0IGJlY2F1c2UgdGhlIGhhbmRsZXIgc3VwcG9ydHMgYW4gYXN5bmMgZmlsZSBvcGVuaW5nCi0gICAgICogYW5kIHRodXMgY2FuIGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzCisgICAgICogd2UgdXNlIGNvbnRleHQgYmVjYXVzZSB0aGUgaGFuZGxlciBzdXBwb3J0cyBhbiBhc3luYyBmaWxlIG9wZW5pbmcsCisgICAgICogYW5kIG1heSBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcwogICAgICAqLwogCiAgICAgY2xjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwpAQCAtMTQ0LDExNSArMTU4LDcxIEBACiAgICAgICAgIH0KIAogICAgICAgICBuZ3hfaHR0cF9zZXRfY3R4KHIsIGN0eCwgbmd4X2h0dHBfaW5kZXhfbW9kdWxlKTsKLQotI2lmIChOR1hfSFRUUF9DQUNIRSkKLQotICAgICAgICBpZiAoaWxjZi0+aW5kZXhfY2FjaGUpIHsKLSAgICAgICAgICAgIGN0eC0+Y2FjaGUgPSBuZ3hfaHR0cF9jYWNoZV9nZXQoaWxjZi0+aW5kZXhfY2FjaGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyLT51cmksICZjcmMpOwotCi0gICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIGxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwIGluZGV4IGNhY2hlIGdldDogJXAiLCBjdHgtPmNhY2hlKTsKLQotICAgICAgICAgICAgaWYgKGN0eC0+Y2FjaGUgJiYgIWN0eC0+Y2FjaGUtPmV4cGlyZWQpIHsKLQotICAgICAgICAgICAgICAgIGN0eC0+Y2FjaGUtPmFjY2Vzc2VkID0gbmd4X2NhY2hlZF90aW1lOwotCi0gICAgICAgICAgICAgICAgY3R4LT5yZWRpcmVjdC5sZW4gPSBjdHgtPmNhY2hlLT5kYXRhLnZhbHVlLmxlbjsKLSAgICAgICAgICAgICAgICBjdHgtPnJlZGlyZWN0LmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIGN0eC0+cmVkaXJlY3QubGVuICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN0eC0+cmVkaXJlY3QuZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2NhY2hlX3VubG9jayhpbGNmLT5pbmRleF9jYWNoZSwgY3R4LT5jYWNoZSwgbG9nKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBuZ3hfbWVtY3B5KGN0eC0+cmVkaXJlY3QuZGF0YSwgY3R4LT5jYWNoZS0+ZGF0YS52YWx1ZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5yZWRpcmVjdC5sZW4gKyAxKTsKLSAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jYWNoZV91bmxvY2soaWxjZi0+aW5kZXhfY2FjaGUsIGN0eC0+Y2FjaGUsIGxvZyk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmd4X2h0dHBfaW50ZXJuYWxfcmVkaXJlY3QociwgJmN0eC0+cmVkaXJlY3QsIE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSNlbmRpZgotCi0jaWYgMAotICAgICAgICBjdHgtPnBhdGguZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgY2xjZi0+cm9vdC5sZW4gKyByLT51cmkubGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGlsY2YtPm1heF9pbmRleF9sZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gY2xjZi0+YWxpYXMgKiBjbGNmLT5uYW1lLmxlbik7Ci0gICAgICAgIGlmIChjdHgtPnBhdGguZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY3R4LT5yZWRpcmVjdC5kYXRhID0gbmd4X2NweW1lbShjdHgtPnBhdGguZGF0YSwgY2xjZi0+cm9vdC5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsY2YtPnJvb3QubGVuKTsKLSNlbmRpZgotCi0gICAgICAgIGlmIChjbGNmLT5hbGlhcykgewotICAgICAgICAgICAgY3R4LT5wYXRoLmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIGNsY2YtPnJvb3QubGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByLT51cmkubGVuICsgMSAtIGNsY2YtPm5hbWUubGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbGNmLT5tYXhfaW5kZXhfbGVuKTsKLSAgICAgICAgICAgIGlmIChjdHgtPnBhdGguZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3R4LT5yZWRpcmVjdC5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLCByLT51cmkubGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaWxjZi0+bWF4X2luZGV4X2xlbik7Ci0gICAgICAgICAgICBpZiAoY3R4LT5yZWRpcmVjdC5kYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBuZ3hfbWVtY3B5KGN0eC0+cGF0aC5kYXRhLCBjbGNmLT5yb290LmRhdGEsIGNsY2YtPnJvb3QubGVuKTsKLQotICAgICAgICAgICAgY3R4LT5sYXN0ID0gbmd4X2NweXN0cm4oY3R4LT5wYXRoLmRhdGEgKyBjbGNmLT5yb290LmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnVyaS5kYXRhICsgY2xjZi0+bmFtZS5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT51cmkubGVuICsgMSAtIGNsY2YtPm5hbWUubGVuKTsKLQotI2lmIDAKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBhbGlhc2VzIHVzdWFsbHkgaGF2ZSB0cmFpbGxpbmcgIi8iLAotICAgICAgICAgICAgICogc2V0IGl0IGluIHRoZSBzdGFydCBvZiB0aGUgcG9zc2libGUgcmVkaXJlY3QKLSAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICBpZiAoKmN0eC0+cmVkaXJlY3QuZGF0YSAhPSAnLycpIHsKLSAgICAgICAgICAgICAgICBjdHgtPnJlZGlyZWN0LmRhdGEtLTsgCi0gICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3R4LT5wYXRoLmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIGNsY2YtPnJvb3QubGVuICsgci0+dXJpLmxlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaWxjZi0+bWF4X2luZGV4X2xlbik7Ci0gICAgICAgICAgICBpZiAoY3R4LT5wYXRoLmRhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGN0eC0+cmVkaXJlY3QuZGF0YSA9IG5neF9jcHltZW0oY3R4LT5wYXRoLmRhdGEsIGNsY2YtPnJvb3QuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xjZi0+cm9vdC5sZW4pOwotCi0gICAgICAgICAgICBjdHgtPmxhc3QgPSBuZ3hfY3B5c3RybihjdHgtPnJlZGlyZWN0LmRhdGEsIHItPnVyaS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiArIDEpOwotICAgICAgICB9CiAgICAgfQogCi0gICAgY3R4LT5wYXRoLmxlbiA9IGN0eC0+bGFzdCAtIGN0eC0+cGF0aC5kYXRhOworICAgIGluZGV4ID0gaWxjZi0+aW5kaWNlcy0+ZWx0czsKKyAgICBmb3IgKGkgPSBjdHgtPmN1cnJlbnQ7IGkgPCBpbGNmLT5pbmRpY2VzLT5uZWx0czsgaSsrKSB7CiAKLSAgICBpbmRleCA9IGlsY2YtPmluZGljZXMuZWx0czsKLSAgICBmb3IgKC8qIHZvaWQgKi87IGN0eC0+aW5kZXggPCBpbGNmLT5pbmRpY2VzLm5lbHRzOyBjdHgtPmluZGV4KyspIHsKKyAgICAgICAgaWYgKGluZGV4W2ldLmxlbmd0aHMgPT0gTlVMTCkgewogCi0gICAgICAgIGlmIChpbmRleFtjdHgtPmluZGV4XS5kYXRhWzBdID09ICcvJykgewotICAgICAgICAgICAgbmFtZSA9IGluZGV4W2N0eC0+aW5kZXhdLmRhdGE7CisgICAgICAgICAgICBpZiAoaW5kZXhbaV0ubmFtZS5kYXRhWzBdID09ICcvJykgeworICAgICAgICAgICAgICAgIHJldHVybiBuZ3hfaHR0cF9pbnRlcm5hbF9yZWRpcmVjdChyLCAmaW5kZXhbaV0ubmFtZSwgJnItPmFyZ3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZW4gPSBpbGNmLT5tYXhfaW5kZXhfbGVuOworICAgICAgICAgICAgY3R4LT5pbmRleC5sZW4gPSBpbmRleFtpXS5uYW1lLmxlbjsKIAogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmd4X21lbWNweShjdHgtPmxhc3QsIGluZGV4W2N0eC0+aW5kZXhdLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIGluZGV4W2N0eC0+aW5kZXhdLmxlbiArIDEpOwotICAgICAgICAgICAgbmFtZSA9IGN0eC0+cGF0aC5kYXRhOworICAgICAgICAgICAgbmd4X21lbXplcm8oJmUsIHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QpKTsKKworICAgICAgICAgICAgZS5pcCA9IGluZGV4W2ldLmxlbmd0aHMtPmVsdHM7CisgICAgICAgICAgICBlLnJlcXVlc3QgPSByOworCisgICAgICAgICAgICBsZW4gPSAxOworCisgICAgICAgICAgICB3aGlsZSAoKih1aW50cHRyX3QgKikgZS5pcCkgeworICAgICAgICAgICAgICAgIGxjb2RlID0gKihuZ3hfaHR0cF9zY3JpcHRfbGVuX2NvZGVfcHQgKikgZS5pcDsKKyAgICAgICAgICAgICAgICBsZW4gKz0gbGNvZGUoJmUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdHgtPmluZGV4LmxlbiA9IGxlbjsKICAgICAgICAgfQogCisgICAgICAgIGlmIChsZW4gPiBjdHgtPmFsbG9jYXRlZCkgeworICAgICAgICAgICAgaWYgKG5neF9odHRwX2luZGV4X2FsbG9jKHIsIGxlbiwgY3R4LCBjbGNmKSAhPSBOR1hfT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGluZGV4W2ldLnZhbHVlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBuZ3hfbWVtY3B5KGN0eC0+aW5kZXguZGF0YSwgaW5kZXhbaV0ubmFtZS5kYXRhLCBjdHgtPmluZGV4Lmxlbik7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGUuaXAgPSBpbmRleFtpXS52YWx1ZXMtPmVsdHM7CisgICAgICAgICAgICBlLnBvcyA9IGN0eC0+aW5kZXguZGF0YTsKKworICAgICAgICAgICAgd2hpbGUgKCoodWludHB0cl90ICopIGUuaXApIHsKKyAgICAgICAgICAgICAgICBjb2RlID0gKihuZ3hfaHR0cF9zY3JpcHRfY29kZV9wdCAqKSBlLmlwOworICAgICAgICAgICAgICAgIGNvZGUoKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAqKSAmZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgqY3R4LT5pbmRleC5kYXRhID09ICcvJykgeworICAgICAgICAgICAgICAgIGN0eC0+aW5kZXgubGVuLS07CisgICAgICAgICAgICAgICAgcmV0dXJuIG5neF9odHRwX2ludGVybmFsX3JlZGlyZWN0KHIsICZjdHgtPmluZGV4LCAmci0+YXJncyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICplLnBvcysrID0gJ1wwJzsKKyAgICAgICAgfQorCisgICAgICAgIG5hbWUgPSBjdHgtPnBhdGg7CisKICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCBsb2csIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICJvcGVuIGluZGV4IFwiJXNcIiIsIG5hbWUpOwogCiAgICAgICAgIGZkID0gbmd4X29wZW5fZmlsZShuYW1lLCBOR1hfRklMRV9SRE9OTFksIE5HWF9GSUxFX09QRU4pOwogCiAgICAgICAgIGlmIChmZCA9PSAobmd4X2ZkX3QpIE5HWF9BR0FJTikgeworICAgICAgICAgICAgY3R4LT5jdXJyZW50ID0gaTsKICAgICAgICAgICAgIHJldHVybiBOR1hfQUdBSU47CiAgICAgICAgIH0KIApAQCAtMjkwLDEzMSArMjYwLDI2OCBAQAogICAgICAgICB9CiAKIAotICAgICAgICAvKiBTVFVCOiBvcGVuIGZpbGUgY2FjaGUgKi8KLQotICAgICAgICByLT5maWxlLm5hbWUuZGF0YSA9IG5hbWU7Ci0gICAgICAgIHItPmZpbGUuZmQgPSBmZDsKLQotICAgICAgICBpZiAoaW5kZXhbY3R4LT5pbmRleF0uZGF0YVswXSA9PSAnLycpIHsKLSAgICAgICAgICAgIHItPmZpbGUubmFtZS5sZW4gPSBpbmRleFtjdHgtPmluZGV4XS5sZW47Ci0gICAgICAgICAgICBjdHgtPnJlZGlyZWN0LmxlbiA9IGluZGV4W2N0eC0+aW5kZXhdLmxlbjsKLSAgICAgICAgICAgIGN0eC0+cmVkaXJlY3QuZGF0YSA9IGluZGV4W2N0eC0+aW5kZXhdLmRhdGE7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChjbGNmLT5hbGlhcykgewotICAgICAgICAgICAgICAgIG5hbWUgPSBuZ3hfY3B5bWVtKGN0eC0+cmVkaXJlY3QuZGF0YSwgci0+dXJpLmRhdGEsIHItPnVyaS5sZW4pOwotICAgICAgICAgICAgICAgIG5neF9tZW1jcHkobmFtZSwgaW5kZXhbY3R4LT5pbmRleF0uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4W2N0eC0+aW5kZXhdLmxlbiArIDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjdHgtPnJlZGlyZWN0LmxlbiA9IHItPnVyaS5sZW4gKyBpbmRleFtjdHgtPmluZGV4XS5sZW47Ci0gICAgICAgICAgICByLT5maWxlLm5hbWUubGVuID0gY2xjZi0+cm9vdC5sZW4gKyByLT51cmkubGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGNsY2YtPmFsaWFzICogY2xjZi0+bmFtZS5sZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGluZGV4W2N0eC0+aW5kZXhdLmxlbjsKKyAgICAgICAgY2xuID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X3Bvb2xfY2xlYW51cF9maWxlX3QpKTsKKyAgICAgICAgaWYgKGNsbiA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOyAKICAgICAgICAgfQogCi0gICAgICAgIC8qKi8KKyAgICAgICAgY2xuLT5mZCA9IGZkOworICAgICAgICBjbG4tPm5hbWUgPSBuYW1lOworICAgICAgICBjbG4tPmxvZyA9IHItPnBvb2wtPmxvZzsKIAotCi0jaWYgKE5HWF9IVFRQX0NBQ0hFKQotCi0gICAgICAgIGlmIChpbGNmLT5pbmRleF9jYWNoZSkgewotCi0gICAgICAgICAgICBpZiAoY3R4LT5jYWNoZSkgewotICAgICAgICAgICAgICAgIGlmIChjdHgtPnJlZGlyZWN0LmxlbiA9PSBjdHgtPmNhY2hlLT5kYXRhLnZhbHVlLmxlbgotICAgICAgICAgICAgICAgICAgICAmJiBuZ3hfbWVtY21wKGN0eC0+Y2FjaGUtPmRhdGEudmFsdWUuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnJlZGlyZWN0LmRhdGEsIGN0eC0+cmVkaXJlY3QubGVuKSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY3R4LT5jYWNoZS0+YWNjZXNzZWQgPSBuZ3hfY2FjaGVkX3RpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGN0eC0+Y2FjaGUtPnVwZGF0ZWQgPSBuZ3hfY2FjaGVkX3RpbWU7Ci0gICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2NhY2hlX3VubG9jayhpbGNmLT5pbmRleF9jYWNoZSwgY3R4LT5jYWNoZSwgbG9nKTsKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmd4X2h0dHBfaW50ZXJuYWxfcmVkaXJlY3QociwgJmN0eC0+cmVkaXJlY3QsIE5VTEwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3R4LT5yZWRpcmVjdC5sZW4rKzsKLSAgICAgICAgICAgIGN0eC0+Y2FjaGUgPSBuZ3hfaHR0cF9jYWNoZV9hbGxvYyhpbGNmLT5pbmRleF9jYWNoZSwgY3R4LT5jYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmci0+dXJpLCBjcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+cmVkaXJlY3QsIGxvZyk7Ci0gICAgICAgICAgICBjdHgtPnJlZGlyZWN0Lmxlbi0tOwotCi0gICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIGxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwIGluZGV4IGNhY2hlIGFsbG9jOiAlcCIsIGN0eC0+Y2FjaGUpOwotCi0gICAgICAgICAgICBpZiAoY3R4LT5jYWNoZSkgewotICAgICAgICAgICAgICAgIGN0eC0+Y2FjaGUtPmZkID0gTkdYX0lOVkFMSURfRklMRTsKLSAgICAgICAgICAgICAgICBjdHgtPmNhY2hlLT5hY2Nlc3NlZCA9IG5neF9jYWNoZWRfdGltZTsKLSAgICAgICAgICAgICAgICBjdHgtPmNhY2hlLT5sYXN0X21vZGlmaWVkID0gMDsKLSAgICAgICAgICAgICAgICBjdHgtPmNhY2hlLT51cGRhdGVkID0gbmd4X2NhY2hlZF90aW1lOwotICAgICAgICAgICAgICAgIGN0eC0+Y2FjaGUtPm1lbW9yeSA9IDE7Ci0gICAgICAgICAgICAgICAgbmd4X2h0dHBfY2FjaGVfdW5sb2NrKGlsY2YtPmluZGV4X2NhY2hlLCBjdHgtPmNhY2hlLCBsb2cpOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAobmd4X3Bvb2xfY2xlYW51cF9hZGQoci0+cG9vbCwgbmd4X3Bvb2xfY2xlYW51cF9maWxlLCBjbG4pID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiAgICAgICAgIH0KIAotI2VuZGlmCiAKLSAgICAgICAgcmV0dXJuIG5neF9odHRwX2ludGVybmFsX3JlZGlyZWN0KHIsICZjdHgtPnJlZGlyZWN0LCBOVUxMKTsKKyAgICAgICAgaWYgKGNsY2YtPmFsaWFzKSB7CisgICAgICAgICAgICBuYW1lID0gbmd4X2NweW1lbShjdHgtPnVyaS5kYXRhLCByLT51cmkuZGF0YSwgci0+dXJpLmxlbik7CisgICAgICAgICAgICBuZ3hfbWVtY3B5KG5hbWUsIGN0eC0+aW5kZXguZGF0YSwgY3R4LT5pbmRleC5sZW4gLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+dXJpLmxlbiA9IHItPnVyaS5sZW4gKyBjdHgtPmluZGV4LmxlbiAtIDE7CisKKyAgICAgICAgcmV0dXJuIG5neF9odHRwX2ludGVybmFsX3JlZGlyZWN0KHIsICZjdHgtPnVyaSwgJnItPmFyZ3MpOwogICAgIH0KIAogICAgIHJldHVybiBOR1hfREVDTElORUQ7CiB9CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9pbmRleF90ZXN0X2RpcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2luZGV4X2N0eF90ICpjdHgpCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9pbmRleF9hbGxvYyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHNpemVfdCBzaXplLAorICAgIG5neF9odHRwX2luZGV4X2N0eF90ICpjdHgsIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAqY2xjZikKIHsKLSAgICBuZ3hfZXJyX3QgIGVycjsKKyAgICBjdHgtPmFsbG9jYXRlZCA9IHNpemU7CiAKLSAgICBjdHgtPnBhdGguZGF0YVtjdHgtPnBhdGgubGVuIC0gMV0gPSAnXDAnOwotICAgIGN0eC0+cGF0aC5kYXRhW2N0eC0+cGF0aC5sZW5dID0gJ1wwJzsKKyAgICBpZiAoIWNsY2YtPmFsaWFzKSB7CisgICAgICAgIGN0eC0+cGF0aCA9IG5neF9wYWxsb2Moci0+cG9vbCwgY2xjZi0+cm9vdC5sZW4gKyByLT51cmkubGVuICsgc2l6ZSk7CisgICAgICAgIGlmIChjdHgtPnBhdGggPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+dXJpLmRhdGEgPSBuZ3hfY3B5bWVtKGN0eC0+cGF0aCwgY2xjZi0+cm9vdC5kYXRhLCBjbGNmLT5yb290Lmxlbik7CisKKyAgICAgICAgY3R4LT5pbmRleC5kYXRhID0gbmd4X2NweW1lbShjdHgtPnVyaS5kYXRhLCByLT51cmkuZGF0YSwgci0+dXJpLmxlbik7CisKKyAgICB9IGVsc2UgeworICAgICAgICBjdHgtPnBhdGggPSBuZ3hfcGFsbG9jKHItPnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNsY2YtPnJvb3QubGVuICsgci0+dXJpLmxlbiAtIGNsY2YtPm5hbWUubGVuICsgc2l6ZSk7CisgICAgICAgIGlmIChjdHgtPnBhdGggPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+dXJpLmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHItPnVyaS5sZW4gKyBzaXplKTsKKyAgICAgICAgaWYgKGN0eC0+dXJpLmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIG5neF9tZW1jcHkoY3R4LT5wYXRoLCBjbGNmLT5yb290LmRhdGEsIGNsY2YtPnJvb3QubGVuKTsKKworICAgICAgICBjdHgtPmluZGV4LmRhdGEgPSBuZ3hfY3B5bWVtKGN0eC0+cGF0aCArIGNsY2YtPnJvb3QubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnVyaS5kYXRhICsgY2xjZi0+bmFtZS5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIGNsY2YtPm5hbWUubGVuKTsKKyAgICB9CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX2luZGV4X3Rlc3RfZGlyKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2h0dHBfaW5kZXhfY3R4X3QgKmN0eCkKK3sKKyAgICBuZ3hfZXJyX3QgICAgICAgIGVycjsKKyAgICBuZ3hfZmlsZV9pbmZvX3QgIGZpOworCisgICAgKihjdHgtPmluZGV4LmRhdGEgLSAxKSA9ICdcMCc7CiAKICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAiaHR0cCBjaGVjayBkaXI6IFwiJXNcIiIsIGN0eC0+cGF0aC5kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAiaHR0cCBpbmRleCBjaGVjayBkaXI6IFwiJXNcIiIsIGN0eC0+cGF0aCk7CiAKLSAgICBpZiAobmd4X2ZpbGVfaW5mbyhjdHgtPnBhdGguZGF0YSwgJnItPmZpbGUuaW5mbykgPT0gLTEpIHsKKyAgICBpZiAobmd4X2ZpbGVfaW5mbyhjdHgtPnBhdGgsICZmaSkgPT0gLTEpIHsKIAogICAgICAgICBlcnIgPSBuZ3hfZXJybm87CiAKICAgICAgICAgaWYgKGVyciA9PSBOR1hfRU5PRU5UKSB7Ci0gICAgICAgICAgICBjdHgtPnBhdGguZGF0YVtjdHgtPnBhdGgubGVuIC0gMV0gPSAnLyc7CisgICAgICAgICAgICAqKGN0eC0+aW5kZXguZGF0YSAtIDEpID0gJy8nOwogICAgICAgICAgICAgcmV0dXJuIG5neF9odHRwX2luZGV4X2Vycm9yKHIsIGN0eCwgZXJyKTsKICAgICAgICAgfQogCiAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19DUklULCByLT5jb25uZWN0aW9uLT5sb2csIGVyciwKLSAgICAgICAgICAgICAgICAgICAgICBuZ3hfZmlsZV9pbmZvX24gIiBcIiVzXCIgZmFpbGVkIiwgY3R4LT5wYXRoLmRhdGEpOworICAgICAgICAgICAgICAgICAgICAgIG5neF9maWxlX2luZm9fbiAiIFwiJXNcIiBmYWlsZWQiLCBjdHgtPnBhdGgpOwogCiAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiAgICAgfQogCi0gICAgY3R4LT5wYXRoLmRhdGFbY3R4LT5wYXRoLmxlbiAtIDFdID0gJy8nOworICAgICooY3R4LT5pbmRleC5kYXRhIC0gMSkgPSAnLyc7CiAKLSAgICBpZiAobmd4X2lzX2Rpcigmci0+ZmlsZS5pbmZvKSkgeworICAgIGlmIChuZ3hfaXNfZGlyKCZmaSkpIHsKICAgICAgICAgcmV0dXJuIE5HWF9PSzsKICAgICB9CiAKLSAgICAvKiBUSElOSzogbm90IHJlYWNoZWQgPz8/ICovCi0gICAgcmV0dXJuIG5neF9odHRwX2luZGV4X2Vycm9yKHIsIGN0eCwgMCk7CisgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAiXCIlc1wiIGlzIG5vdCBhIGRpcmVjdG9yeSIsIGN0eC0+cGF0aCk7CisKKyAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogfQogCiAKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfaW5kZXhfZXJyb3Iobmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9pbmRleF9jdHhfdCAqY3R4LCBuZ3hfZXJyX3QgZXJyKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfaW5kZXhfZXJyb3Iobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfaHR0cF9pbmRleF9jdHhfdCAqY3R4LAorICAgIG5neF9lcnJfdCBlcnIpCiB7CiAgICAgaWYgKGVyciA9PSBOR1hfRUFDQ0VTKSB7CiAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHItPmNvbm5lY3Rpb24tPmxvZywgZXJyLAotICAgICAgICAgICAgICAgICAgICAgICJcIiVzXCIgaXMgZm9yYmlkZGVuIiwgY3R4LT5wYXRoLmRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICJcIiVzXCIgaXMgZm9yYmlkZGVuIiwgY3R4LT5wYXRoKTsKICAgICAKICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0ZPUkJJRERFTjsKICAgICB9CiAKICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIGVyciwKLSAgICAgICAgICAgICAgICAgICJcIiVzXCIgaXMgbm90IGZvdW5kIiwgY3R4LT5wYXRoLmRhdGEpOworICAgICAgICAgICAgICAgICAgIlwiJXNcIiBpcyBub3QgZm91bmQiLCBjdHgtPnBhdGgpOworCiAgICAgcmV0dXJuIE5HWF9IVFRQX05PVF9GT1VORDsKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2luZGV4X2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKQorc3RhdGljIHZvaWQgKgorbmd4X2h0dHBfaW5kZXhfY3JlYXRlX2xvY19jb25mKG5neF9jb25mX3QgKmNmKQoreworICAgIG5neF9odHRwX2luZGV4X2xvY19jb25mX3QgICpjb25mOworCisgICAgY29uZiA9IG5neF9wYWxsb2MoY2YtPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9pbmRleF9sb2NfY29uZl90KSk7CisgICAgaWYgKGNvbmYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgY29uZi0+aW5kaWNlcyA9IE5VTEw7CisgICAgY29uZi0+bWF4X2luZGV4X2xlbiA9IDE7CisKKyAgICByZXR1cm4gY29uZjsKK30KKworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9pbmRleF9tZXJnZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZiwgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCkKK3sKKyAgICBuZ3hfaHR0cF9pbmRleF9sb2NfY29uZl90ICAqcHJldiA9IHBhcmVudDsKKyAgICBuZ3hfaHR0cF9pbmRleF9sb2NfY29uZl90ICAqY29uZiA9IGNoaWxkOworCisgICAgbmd4X2h0dHBfaW5kZXhfdCAgKmluZGV4OworCisgICAgaWYgKGNvbmYtPmluZGljZXMgPT0gTlVMTCkgeworICAgICAgICBjb25mLT5pbmRpY2VzID0gcHJldi0+aW5kaWNlczsKKyAgICAgICAgY29uZi0+bWF4X2luZGV4X2xlbiA9IHByZXYtPm1heF9pbmRleF9sZW47CisgICAgfQorCisgICAgaWYgKGNvbmYtPmluZGljZXMgPT0gTlVMTCkgeworICAgICAgICBjb25mLT5pbmRpY2VzID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgMSwgc2l6ZW9mKG5neF9odHRwX2luZGV4X3QpKTsKKyAgICAgICAgaWYgKGNvbmYtPmluZGljZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaW5kZXggPSBuZ3hfYXJyYXlfcHVzaChjb25mLT5pbmRpY2VzKTsKKyAgICAgICAgaWYgKGluZGV4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGluZGV4LT5uYW1lLmxlbiA9IHNpemVvZihOR1hfSFRUUF9ERUZBVUxUX0lOREVYKTsKKyAgICAgICAgaW5kZXgtPm5hbWUuZGF0YSA9ICh1X2NoYXIgKikgTkdYX0hUVFBfREVGQVVMVF9JTkRFWDsKKyAgICAgICAgaW5kZXgtPmxlbmd0aHMgPSBOVUxMOworICAgICAgICBpbmRleC0+dmFsdWVzID0gTlVMTDsKKworICAgICAgICBjb25mLT5tYXhfaW5kZXhfbGVuID0gc2l6ZW9mKE5HWF9IVFRQX0RFRkFVTFRfSU5ERVgpOworCisgICAgICAgIHJldHVybiBOR1hfQ09ORl9PSzsKKyAgICB9CisKKyAgICByZXR1cm4gTkdYX0NPTkZfT0s7Cit9CisKKworLyogVE9ETzogd2FybiBhYm91dCBkdXBsaWNhdGUgaW5kaWNlcyAqLworCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9pbmRleF9zZXRfaW5kZXgobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKK3sKKyAgICBuZ3hfaHR0cF9pbmRleF9sb2NfY29uZl90ICppbGNmID0gY29uZjsKKworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBpLCBuOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICp2YWx1ZTsKKyAgICBuZ3hfaHR0cF9pbmRleF90ICAgICAgICAgICAqaW5kZXg7CisgICAgbmd4X2h0dHBfc2NyaXB0X2NvbXBpbGVfdCAgIHNjOworCisgICAgaWYgKGlsY2YtPmluZGljZXMgPT0gTlVMTCkgeworICAgICAgICBpbGNmLT5pbmRpY2VzID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgMiwgc2l6ZW9mKG5neF9odHRwX2luZGV4X3QpKTsKKyAgICAgICAgaWYgKGlsY2YtPmluZGljZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgdmFsdWUgPSBjZi0+YXJncy0+ZWx0czsKKworICAgIGZvciAoaSA9IDE7IGkgPCBjZi0+YXJncy0+bmVsdHM7IGkrKykgeworICAgICAgICBpZiAodmFsdWVbaV0uZGF0YVswXSA9PSAnLycgJiYgaSAhPSBjZi0+YXJncy0+bmVsdHMgLSAxKSB7CisgICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9ubHkgdGhlIGxhc3QgaW5kZXggaW4gXCJpbmRleFwiIGRpcmVjdGl2ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heSBiZSBhYnNvbHV0ZSIpOworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZhbHVlW2ldLmxlbiA9PSAwKSB7CisgICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZGV4IFwiJVZcIiBpbiBcImluZGV4XCIgZGlyZWN0aXZlIGlzIGludmFsaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZVsxXSk7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpbmRleCA9IG5neF9hcnJheV9wdXNoKGlsY2YtPmluZGljZXMpOworICAgICAgICBpZiAoaW5kZXggPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaW5kZXgtPm5hbWUubGVuID0gdmFsdWVbaV0ubGVuOworICAgICAgICBpbmRleC0+bmFtZS5kYXRhID0gdmFsdWVbaV0uZGF0YTsKKyAgICAgICAgaW5kZXgtPmxlbmd0aHMgPSBOVUxMOworICAgICAgICBpbmRleC0+dmFsdWVzID0gTlVMTDsKKworICAgICAgICBuID0gbmd4X2h0dHBfc2NyaXB0X3ZhcmlhYmxlc19jb3VudCgmdmFsdWVbaV0pOworCisgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgIGluZGV4LT5uYW1lLmxlbisrOworCisgICAgICAgICAgICBpZiAoaWxjZi0+bWF4X2luZGV4X2xlbiAhPSAwCisgICAgICAgICAgICAgICAgJiYgaWxjZi0+bWF4X2luZGV4X2xlbiA8IGluZGV4LT5uYW1lLmxlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbGNmLT5tYXhfaW5kZXhfbGVuID0gaW5kZXgtPm5hbWUubGVuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG5neF9tZW16ZXJvKCZzYywgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb21waWxlX3QpKTsKKworICAgICAgICBzYy5jZiA9IGNmOworICAgICAgICBzYy5zb3VyY2UgPSAmdmFsdWVbaV07CisgICAgICAgIHNjLmxlbmd0aHMgPSAmaW5kZXgtPmxlbmd0aHM7CisgICAgICAgIHNjLnZhbHVlcyA9ICZpbmRleC0+dmFsdWVzOworICAgICAgICBzYy52YXJpYWJsZXMgPSBuOworICAgICAgICBzYy5jb21wbGV0ZV9sZW5ndGhzID0gMTsKKyAgICAgICAgc2MuY29tcGxldGVfdmFsdWVzID0gMTsKKworICAgICAgICBpZiAobmd4X2h0dHBfc2NyaXB0X2NvbXBpbGUoJnNjKSAhPSBOR1hfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGlsY2YtPm1heF9pbmRleF9sZW4gPSAwOworICAgIH0KKworICAgIHJldHVybiBOR1hfQ09ORl9PSzsKK30KKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9pbmRleF9pbml0KG5neF9jeWNsZV90ICpjeWNsZSkKIHsKICAgICBuZ3hfaHR0cF9oYW5kbGVyX3B0ICAgICAgICAqaDsKICAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAqY21jZjsKQEAgLTQzMCwxMjkgKzUzNywzIEBACiAKICAgICByZXR1cm4gTkdYX09LOwogfQotCi0KLXN0YXRpYyB2b2lkICpuZ3hfaHR0cF9pbmRleF9jcmVhdGVfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YpCi17Ci0gICAgbmd4X2h0dHBfaW5kZXhfbG9jX2NvbmZfdCAgKmNvbmY7Ci0KLSAgICBjb25mID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2luZGV4X2xvY19jb25mX3QpKTsKLSAgICBpZiAoY29uZiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAobmd4X2FycmF5X2luaXQoJmNvbmYtPmluZGljZXMsIGNmLT5wb29sLCAyLCBzaXplb2Yobmd4X3N0cl90KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE5HWF9FUlJPUikKLSAgICB7Ci0gICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICB9Ci0KLSAgICBjb25mLT5tYXhfaW5kZXhfbGVuID0gMDsKLQotICAgIGNvbmYtPmluZGV4X2NhY2hlID0gTlVMTDsKLQotICAgIHJldHVybiBjb25mOwotfQotCi0KLS8qIFRPRE86IHJlbW92ZSBkdXBsaWNhdGUgaW5kaWNlcyAqLwotCi1zdGF0aWMgY2hhciAqbmd4X2h0dHBfaW5kZXhfbWVyZ2VfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCkKLXsKLSAgICBuZ3hfaHR0cF9pbmRleF9sb2NfY29uZl90ICAqcHJldiA9IHBhcmVudDsKLSAgICBuZ3hfaHR0cF9pbmRleF9sb2NfY29uZl90ICAqY29uZiA9IGNoaWxkOwotCi0gICAgbmd4X3N0cl90ICAqaW5kZXg7Ci0KLSAgICBpZiAoY29uZi0+bWF4X2luZGV4X2xlbiA9PSAwKSB7Ci0gICAgICAgIGlmIChwcmV2LT5tYXhfaW5kZXhfbGVuICE9IDApIHsKLSAgICAgICAgICAgIG5neF9tZW1jcHkoY29uZiwgcHJldiwgc2l6ZW9mKG5neF9odHRwX2luZGV4X2xvY19jb25mX3QpKTsKLSAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9PSzsKLSAgICAgICAgfQotCi0gICAgICAgIGluZGV4ID0gbmd4X2FycmF5X3B1c2goJmNvbmYtPmluZGljZXMpOwotICAgICAgICBpZiAoaW5kZXggPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZXgtPmxlbiA9IHNpemVvZihOR1hfSFRUUF9ERUZBVUxUX0lOREVYKSAtIDE7Ci0gICAgICAgIGluZGV4LT5kYXRhID0gKHVfY2hhciAqKSBOR1hfSFRUUF9ERUZBVUxUX0lOREVYOwotICAgICAgICBjb25mLT5tYXhfaW5kZXhfbGVuID0gc2l6ZW9mKE5HWF9IVFRQX0RFRkFVTFRfSU5ERVgpOwotCi0gICAgICAgIHJldHVybiBOR1hfQ09ORl9PSzsKLSAgICB9Ci0KLSNpZiAwCi0KLSAgICBpZiAocHJldi0+bWF4X2luZGV4X2xlbiAhPSAwKSB7Ci0KLSAgICAgICAgcHJldl9pbmRleCA9IHByZXYtPmluZGljZXMuZWx0czsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHByZXYtPmluZGljZXMubmVsdHM7IGkrKykgewotICAgICAgICAgICAgaW5kZXggPSBuZ3hfYXJyYXlfcHVzaCgmY29uZi0+aW5kaWNlcyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW5kZXgtPmxlbiA9IHByZXZfaW5kZXhbaV0ubGVuOwotICAgICAgICAgICAgaW5kZXgtPmRhdGEgPSBwcmV2X2luZGV4W2ldLmRhdGE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoY29uZi0+bWF4X2luZGV4X2xlbiA8IHByZXYtPm1heF9pbmRleF9sZW4pIHsKLSAgICAgICAgY29uZi0+bWF4X2luZGV4X2xlbiA9IHByZXYtPm1heF9pbmRleF9sZW47Ci0gICAgfQotCi0jZW5kaWYKLQotICAgIGlmIChjb25mLT5pbmRleF9jYWNoZSA9PSBOVUxMKSB7Ci0gICAgICAgIGNvbmYtPmluZGV4X2NhY2hlID0gcHJldi0+aW5kZXhfY2FjaGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5HWF9DT05GX09LOwotfQotCi0KLS8qIFRPRE86IHdhcm4gYWJvdXQgZHVwbGljYXRlIGluZGljZXMgKi8KLQotc3RhdGljIGNoYXIgKm5neF9odHRwX2luZGV4X3NldF9pbmRleChuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKQotewotICAgIG5neF9odHRwX2luZGV4X2xvY19jb25mX3QgKmlsY2YgPSBjb25mOwotCi0gICAgbmd4X3VpbnRfdCAgaTsKLSAgICBuZ3hfc3RyX3QgICppbmRleCwgKnZhbHVlOwotCi0gICAgdmFsdWUgPSBjZi0+YXJncy0+ZWx0czsKLQotICAgIGlmICh2YWx1ZVsxXS5kYXRhWzBdID09ICcvJyAmJiBpbGNmLT5pbmRpY2VzLm5lbHRzID09IDApIHsKLSAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpcnN0IGluZGV4IFwiJVZcIiBpbiBcIiVWXCIgZGlyZWN0aXZlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IG5vdCBiZSBhYnNvbHV0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVbMV0sICZjbWQtPm5hbWUpOwotICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMTsgaSA8IGNmLT5hcmdzLT5uZWx0czsgaSsrKSB7Ci0gICAgICAgIGlmICh2YWx1ZVtpXS5sZW4gPT0gMCkgewotICAgICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRleCBcIiVWXCIgaW4gXCIlVlwiIGRpcmVjdGl2ZSBpcyBpbnZhbGlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVbMV0sICZjbWQtPm5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZXggPSBuZ3hfYXJyYXlfcHVzaCgmaWxjZi0+aW5kaWNlcyk7Ci0gICAgICAgIGlmIChpbmRleCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmRleC0+bGVuID0gdmFsdWVbaV0ubGVuOwotICAgICAgICBpbmRleC0+ZGF0YSA9IHZhbHVlW2ldLmRhdGE7Ci0KLSAgICAgICAgaWYgKGlsY2YtPm1heF9pbmRleF9sZW4gPCBpbmRleC0+bGVuICsgMSkgewotICAgICAgICAgICAgaWxjZi0+bWF4X2luZGV4X2xlbiA9IGluZGV4LT5sZW4gKyAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5HWF9DT05GX09LOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9ub3RfbW9kaWZpZWRfZmlsdGVyX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9ub3RfbW9kaWZpZWRfZmlsdGVyX21vZHVsZS5jCmluZGV4IDI0ZWE1OGQuLjIzZWE1NzIgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfbm90X21vZGlmaWVkX2ZpbHRlcl9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX25vdF9tb2RpZmllZF9maWx0ZXJfbW9kdWxlLmMKQEAgLTE0LDcgKzE0LDggQEAKIAogCiBzdGF0aWMgbmd4X2h0dHBfbW9kdWxlX3QgIG5neF9odHRwX25vdF9tb2RpZmllZF9maWx0ZXJfbW9kdWxlX2N0eCA9IHsKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmUgY29uZiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZWNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3N0Y29uZmlndXJhdGlvbiAqLwogCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIG1haW4gY29uZmlndXJhdGlvbiAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbWFpbiBjb25maWd1cmF0aW9uICovCkBAIC0yOCw3ICsyOSw3IEBACiAKIAogbmd4X21vZHVsZV90ICBuZ3hfaHR0cF9ub3RfbW9kaWZpZWRfZmlsdGVyX21vZHVsZSA9IHsKLSAgICBOR1hfTU9EVUxFLAorICAgIE5HWF9NT0RVTEVfVjEsCiAgICAgJm5neF9odHRwX25vdF9tb2RpZmllZF9maWx0ZXJfbW9kdWxlX2N0eCwgLyogbW9kdWxlIGNvbnRleHQgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgZGlyZWN0aXZlcyAqLwogICAgIE5HWF9IVFRQX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSB0eXBlICovCkBAIC00NSw2ICs0Niw3IEBACiAgICAgdGltZV90ICBpbXM7CiAKICAgICBpZiAoci0+aGVhZGVyc19vdXQuc3RhdHVzICE9IE5HWF9IVFRQX09LCisgICAgICAgIHx8IHItPm1haW4KICAgICAgICAgfHwgci0+aGVhZGVyc19pbi5pZl9tb2RpZmllZF9zaW5jZSA9PSBOVUxMCiAgICAgICAgIHx8IHItPmhlYWRlcnNfb3V0Lmxhc3RfbW9kaWZpZWRfdGltZSA9PSAtMSkKICAgICB7CkBAIC02MywxMiArNjUsMTEgQEAKIAogICAgIGlmIChpbXMgIT0gTkdYX0VSUk9SICYmIGltcyA9PSByLT5oZWFkZXJzX291dC5sYXN0X21vZGlmaWVkX3RpbWUpIHsKICAgICAgICAgci0+aGVhZGVyc19vdXQuc3RhdHVzID0gTkdYX0hUVFBfTk9UX01PRElGSUVEOwotICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUtPmtleS5sZW4gPSAwOwotICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUgPSBOVUxMOworICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUubGVuID0gMDsKICAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGhfbiA9IC0xOwogICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aCA9IE5VTEw7CiAjaWYgMAotICAgICAgICByLT5oZWFkZXJzX291dC5hY2NlcHRfcmFuZ2VzLT5rZXkubGVuID0gMDsKKyAgICAgICAgci0+aGVhZGVyc19vdXQuYWNjZXB0X3Jhbmdlcy0+aGFzaCA9IDA7CiAjZW5kaWYKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcHJveHlfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Byb3h5X21vZHVsZS5jCmluZGV4IDgwMjA4NTYuLjU1MDQ2MTAgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcHJveHlfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9wcm94eV9tb2R1bGUuYwpAQCAtMTAsODkgKzEwLDEwMCBAQAogI2luY2x1ZGUgPG5neF9odHRwLmg+CiAKIAordHlwZWRlZiBzdHJ1Y3Qgbmd4X2h0dHBfcHJveHlfcmVkaXJlY3RfcyAgbmd4X2h0dHBfcHJveHlfcmVkaXJlY3RfdDsKKwordHlwZWRlZiBuZ3hfaW50X3QgKCpuZ3hfaHR0cF9wcm94eV9yZWRpcmVjdF9wdCkobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF90YWJsZV9lbHRfdCAqaCwgc2l6ZV90IHByZWZpeCwgbmd4X2h0dHBfcHJveHlfcmVkaXJlY3RfdCAqcHIpOworCitzdHJ1Y3Qgbmd4X2h0dHBfcHJveHlfcmVkaXJlY3RfcyB7CisgICAgbmd4X2h0dHBfcHJveHlfcmVkaXJlY3RfcHQgICBoYW5kbGVyOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Q7CisKKyAgICB1bmlvbiB7CisgICAgICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICB0ZXh0OworCisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICpsZW5ndGhzOworICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqdmFsdWVzOworICAgICAgICB9IHZhcnM7CisKKyAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnJlZ2V4OworICAgIH0gcmVwbGFjZW1lbnQ7Cit9OworCisKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfaHR0cF91cHN0cmVhbV9jb25mX3QgICB1cHN0cmVhbTsKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV9jb25mX3QgICAgIHVwc3RyZWFtOwogCi0gICAgbmd4X3BlZXJzX3QgICAgICAgICAgICAgICAqcGVlcnM7CisgICAgbmd4X3BlZXJzX3QgICAgICAgICAgICAgICAgICpwZWVyczsKIAotICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgKmhlYWRlcnNfc2V0X2xlbjsKLSAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICpoZWFkZXJzX3NldDsKLSAgICBuZ3hfaGFzaF90ICAgICAgICAgICAgICAgICpoZWFkZXJzX3NldF9oYXNoOworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAqaGVhZGVyc19zZXRfbGVuOworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAqaGVhZGVyc19zZXQ7CisgICAgbmd4X2hhc2hfdCAgICAgICAgICAgICAgICAgICpoZWFkZXJzX3NldF9oYXNoOwogCi0gICAgbmd4X2ZsYWdfdCAgICAgICAgICAgICAgICAgcHJlc2VydmVfaG9zdDsKLSAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICBzZXRfeF91cmw7Ci0gICAgbmd4X2ZsYWdfdCAgICAgICAgICAgICAgICAgc2V0X3hfcmVhbF9pcDsKLSAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICBhZGRfeF9mb3J3YXJkZWRfZm9yOwotICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgIHBhc3Nfc2VydmVyOwotICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgIHBhc3NfeF9hY2NlbF9leHBpcmVzOworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAqaGVhZGVyc19zb3VyY2U7CisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgICpoZWFkZXJzX25hbWVzOwogCi0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAqbG9jYXRpb24wOworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAqcmVkaXJlY3RzOwogCi0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgaG9zdF9oZWFkZXI7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgdXJpMDsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgIGhvc3RfaGVhZGVyOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgcG9ydF90ZXh0OwogCi0gICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAqaGVhZGVyc19zb3VyY2VzOwotICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgKmhlYWRlcnNfbmFtZXM7CisgICAgbmd4X2ZsYWdfdCAgICAgICAgICAgICAgICAgICByZWRpcmVjdDsKIH0gbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdDsKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X2xpc3RfdCAgICAgICAgICAgICAgICAgaGVhZGVyczsKLSAgICAKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICpkYXRlOwotICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgKnNlcnZlcjsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgIHN0YXR1c19jb3VudDsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgKnN0YXR1c19zdGFydDsKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgKnN0YXR1c19lbmQ7Cit9IG5neF9odHRwX3Byb3h5X2N0eF90OwogCi0gICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAqZXhwaXJlczsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICpjYWNoZV9jb250cm9sOwotICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgKmV0YWc7Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAqeF9hY2NlbF9leHBpcmVzOwogCi0gICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAqY29ubmVjdGlvbjsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICpjb250ZW50X3R5cGU7Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAqY29udGVudF9sZW5ndGg7Ci0gICAgCi0jaWYgKE5HWF9IVFRQX0daSVApCi0gICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAqY29udGVudF9lbmNvZGluZzsKLSNlbmRpZgotICAgIAotICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgKmxhc3RfbW9kaWZpZWQ7Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAqbG9jYXRpb247Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAqYWNjZXB0X3JhbmdlczsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICp4X3BhZDsKLQotICAgIG9mZl90ICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfbGVuZ3RoX247Ci19IG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdDsKKyNkZWZpbmUgTkdYX0hUVFBfUFJPWFlfUEFSU0VfTk9fSEVBREVSICAyMAogCiAKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJveHlfY3JlYXRlX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJveHlfcmVpbml0X3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJveHlfcHJvY2Vzc19zdGF0dXNfbGluZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9wcm94eV9wYXJzZV9zdGF0dXNfbGluZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfcHJveHlfY3R4X3QgKnApOwogc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX2hlYWRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9wcm94eV9zZW5kX2hlYWRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwogc3RhdGljIHZvaWQgbmd4X2h0dHBfcHJveHlfYWJvcnRfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwogc3RhdGljIHZvaWQgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgbmd4X2ludF90IHJjKTsKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9wcm94eV9jb21waWxlX2hlYWRlcl9zdGFydChuZ3hfdGFibGVfZWx0X3QgKmgsCi0gICAgbmd4X2FycmF5X3QgKmxlbmd0aHMsIG5neF9hcnJheV90ICp2YWx1ZXMsIG5neF91aW50X3QgdmFsdWUpOwotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9wcm94eV9jb21waWxlX2hlYWRlcl9lbmQobmd4X2FycmF5X3QgKmxlbmd0aHMsCi0gICAgbmd4X2FycmF5X3QgKnZhbHVlcyk7CitzdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCisgICAgbmd4X2h0dHBfcHJveHlfaG9zdF92YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKTsKK3N0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKKyAgICBuZ3hfaHR0cF9wcm94eV9wb3J0X3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpOworc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgorICAgIG5neF9odHRwX3Byb3h5X2FkZF94X2ZvcndhcmRlZF9mb3JfdmFyaWFibGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIHVpbnRwdHJfdCBkYXRhKTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJveHlfcmV3cml0ZV9yZWRpcmVjdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X3RhYmxlX2VsdF90ICpoLCBzaXplX3QgcHJlZml4KTsKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9wcm94eV9pbml0KG5neF9jeWNsZV90ICpjeWNsZSk7Ci1zdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqbmd4X2h0dHBfcHJveHlfaG9zdF92YXJpYWJsZQotICAgIChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJveHlfYWRkX3ZhcmlhYmxlcyhuZ3hfY29uZl90ICpjZik7CiBzdGF0aWMgdm9pZCAqbmd4X2h0dHBfcHJveHlfY3JlYXRlX2xvY19jb25mKG5neF9jb25mX3QgKmNmKTsKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9wcm94eV9tZXJnZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZiwKICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKTsKIAogc3RhdGljIGNoYXIgKm5neF9odHRwX3Byb3h5X3Bhc3Mobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKICAgICB2b2lkICpjb25mKTsKLQotc3RhdGljIGNoYXIgKm5neF9odHRwX3Byb3h5X3NldF94X3ZhcihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAorc3RhdGljIGNoYXIgKm5neF9odHRwX3Byb3h5X3JlZGlyZWN0KG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCiAgICAgdm9pZCAqY29uZik7CisKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9wcm94eV9sb3dhdF9jaGVjayhuZ3hfY29uZl90ICpjZiwgdm9pZCAqcG9zdCwgdm9pZCAqZGF0YSk7CiAKKwogc3RhdGljIG5neF9jb25mX3Bvc3RfdCAgbmd4X2h0dHBfcHJveHlfbG93YXRfcG9zdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG5neF9odHRwX3Byb3h5X2xvd2F0X2NoZWNrIH07CisgICAgeyBuZ3hfaHR0cF9wcm94eV9sb3dhdF9jaGVjayB9OworCitzdGF0aWMgbmd4X2NvbmZfZW51bV90ICBuZ3hfaHR0cF9wcm94eV9zZXRfbWV0aG9kc1tdID0geworICAgIHsgbmd4X3N0cmluZygiZ2V0IiksIE5HWF9IVFRQX0dFVCB9LAorICAgIHsgbmd4X251bGxfc3RyaW5nLCAwIH0KK307CiAKIHN0YXRpYyBuZ3hfY29uZl9iaXRtYXNrX3QgIG5neF9odHRwX3Byb3h5X25leHRfdXBzdHJlYW1fbWFza3NbXSA9IHsKICAgICB7IG5neF9zdHJpbmcoImVycm9yIiksIE5HWF9IVFRQX1VQU1RSRUFNX0ZUX0VSUk9SIH0sCkBAIC0xMTMsNiArMTI0LDEzIEBACiAgICAgICAwLAogICAgICAgTlVMTCB9LAogCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9yZWRpcmVjdCIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxMiwKKyAgICAgIG5neF9odHRwX3Byb3h5X3JlZGlyZWN0LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgMCwKKyAgICAgIE5VTEwgfSwKKwogICAgIHsgbmd4X3N0cmluZygicHJveHlfY29ubmVjdF90aW1lb3V0IiksCiAgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEsCiAgICAgICBuZ3hfY29uZl9zZXRfbXNlY19zbG90LApAQCAtMTM0LDYgKzE1MiwxMyBAQAogICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgdXBzdHJlYW0uc2VuZF9sb3dhdCksCiAgICAgICAmbmd4X2h0dHBfcHJveHlfbG93YXRfcG9zdCB9LAogCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9yZWRpcmVjdF9lcnJvcnMiKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9GTEFHLAorICAgICAgbmd4X2NvbmZfc2V0X2ZsYWdfc2xvdCwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QsIHVwc3RyZWFtLnJlZGlyZWN0X2Vycm9ycyksCisgICAgICBOVUxMIH0sCisKICAgICB7IG5neF9zdHJpbmcoInByb3h5X3Bhc3NfdW5wYXJzZWRfdXJpIiksCiAgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKICAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCkBAIC0xNDEsMzkgKzE2NiwzMiBAQAogICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgdXBzdHJlYW0ucGFzc191bnBhcnNlZF91cmkpLAogICAgICAgTlVMTCB9LAogCi0gICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9wcmVzZXJ2ZV9ob3N0IiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKLSAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9zZXRfaGVhZGVyIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTIsCisgICAgICBuZ3hfY29uZl9zZXRfdGFibGVfZWx0X3Nsb3QsCiAgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBwcmVzZXJ2ZV9ob3N0KSwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QsIGhlYWRlcnNfc291cmNlKSwKICAgICAgIE5VTEwgfSwKIAotICAgIHsgbmd4X3N0cmluZygicHJveHlfc2V0X3hfdXJsIiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKLSAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBzZXRfeF91cmwpLAotICAgICAgTlVMTCB9LAotCi0gICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9zZXRfeF9yZWFsX2lwIiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKLSAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCi0gICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBzZXRfeF9yZWFsX2lwKSwKLSAgICAgIE5VTEwgfSwKLQotICAgIHsgbmd4X3N0cmluZygicHJveHlfc2V0X3hfdmFyIiksCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9tZXRob2QiKSwKICAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9UQUtFMSwKLSAgICAgIG5neF9odHRwX3Byb3h5X3NldF94X3ZhciwKKyAgICAgIG5neF9jb25mX3NldF9lbnVtX3Nsb3QsCiAgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICAwLAotICAgICAgTlVMTCB9LAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgdXBzdHJlYW0ubWV0aG9kKSwKKyAgICAgIG5neF9odHRwX3Byb3h5X3NldF9tZXRob2RzIH0sCiAKLSAgICB7IG5neF9zdHJpbmcoInByb3h5X2FkZF94X2ZvcndhcmRlZF9mb3IiKSwKKyAgICB7IG5neF9zdHJpbmcoInByb3h5X3Bhc3NfcmVxdWVzdF9oZWFkZXJzIiksCiAgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKICAgICAgIG5neF9jb25mX3NldF9mbGFnX3Nsb3QsCiAgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90LCBhZGRfeF9mb3J3YXJkZWRfZm9yKSwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QsIHVwc3RyZWFtLnBhc3NfcmVxdWVzdF9oZWFkZXJzKSwKKyAgICAgIE5VTEwgfSwKKworICAgIHsgbmd4X3N0cmluZygicHJveHlfcGFzc19yZXF1ZXN0X2JvZHkiKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9GTEFHLAorICAgICAgbmd4X2NvbmZfc2V0X2ZsYWdfc2xvdCwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QsIHVwc3RyZWFtLnBhc3NfcmVxdWVzdF9ib2R5KSwKICAgICAgIE5VTEwgfSwKIAogICAgIHsgbmd4X3N0cmluZygicHJveHlfaGVhZGVyX2J1ZmZlcl9zaXplIiksCkBAIC0yMzIsMTggKzI1MCwyNSBAQAogICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgdXBzdHJlYW0ubmV4dF91cHN0cmVhbSksCiAgICAgICAmbmd4X2h0dHBfcHJveHlfbmV4dF91cHN0cmVhbV9tYXNrcyB9LAogCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9wYXNzX3hfcG93ZXJlZF9ieSIpLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX0ZMQUcsCisgICAgICBuZ3hfY29uZl9zZXRfZmxhZ19zbG90LAorICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgdXBzdHJlYW0ucGFzc194X3Bvd2VyZWRfYnkpLAorICAgICAgTlVMTCB9LAorCiAgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9wYXNzX3NlcnZlciIpLAogICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX0ZMQUcsCiAgICAgICBuZ3hfY29uZl9zZXRfZmxhZ19zbG90LAogICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAotICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgcGFzc19zZXJ2ZXIpLAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgdXBzdHJlYW0ucGFzc19zZXJ2ZXIpLAogICAgICAgTlVMTCB9LAogCiAgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9wYXNzX3hfYWNjZWxfZXhwaXJlcyIpLAogICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX0ZMQUcsCiAgICAgICBuZ3hfY29uZl9zZXRfZmxhZ19zbG90LAogICAgICAgTkdYX0hUVFBfTE9DX0NPTkZfT0ZGU0VULAotICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgcGFzc194X2FjY2VsX2V4cGlyZXMpLAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCwgdXBzdHJlYW0ucGFzc194X2FjY2VsX2V4cGlyZXMpLAogICAgICAgTlVMTCB9LAogCiAgICAgICBuZ3hfbnVsbF9jb21tYW5kCkBAIC0yNTEsNyArMjc2LDggQEAKIAogCiBuZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfcHJveHlfbW9kdWxlX2N0eCA9IHsKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmUgY29uZiAqLworICAgIG5neF9odHRwX3Byb3h5X2FkZF92YXJpYWJsZXMsICAgICAgICAgIC8qIHByZWNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3N0Y29uZmlndXJhdGlvbiAqLwogCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIG1haW4gY29uZmlndXJhdGlvbiAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbWFpbiBjb25maWd1cmF0aW9uICovCkBAIC0yNjUsMjUgKzI5MSw0OSBAQAogCiAKIG5neF9tb2R1bGVfdCAgbmd4X2h0dHBfcHJveHlfbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X2h0dHBfcHJveHlfbW9kdWxlX2N0eCwgICAgICAgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLwogICAgIG5neF9odHRwX3Byb3h5X2NvbW1hbmRzLCAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0hUVFBfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KLSAgICBuZ3hfaHR0cF9wcm94eV9pbml0LCAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1vZHVsZSAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbW9kdWxlICovCiAgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBwcm9jZXNzICovCiB9OwogCiAKIHN0YXRpYyBuZ3hfc3RyX3Qgbmd4X2h0dHBfcHJveHlfbWV0aG9kc1tdID0gewotICAgIG5neF9zdHJpbmcoIkdFVCIpLAotICAgIG5neF9zdHJpbmcoIkhFQUQiKSwKLSAgICBuZ3hfc3RyaW5nKCJQT1NUIikKKyAgICBuZ3hfc3RyaW5nKCJHRVQgIiksCisgICAgbmd4X3N0cmluZygiSEVBRCAiKSwKKyAgICBuZ3hfc3RyaW5nKCJQT1NUICIpCiB9OwogCiAKIHN0YXRpYyBjaGFyICBuZ3hfaHR0cF9wcm94eV92ZXJzaW9uW10gPSAiIEhUVFAvMS4wIiBDUkxGOwogCi1zdGF0aWMgbmd4X3N0cl90ICBuZ3hfaHR0cF9wcm94eV9ob3N0ID0gbmd4X3N0cmluZygiUFJPWFlfSE9TVCIpOworCitzdGF0aWMgbmd4X3RhYmxlX2VsdF90ICBuZ3hfaHR0cF9wcm94eV9oZWFkZXJzW10gPSB7CisgICAgeyAwLCBuZ3hfc3RyaW5nKCJIb3N0IiksIG5neF9zdHJpbmcoIiRwcm94eV9ob3N0IiksIH0sCisgICAgeyAwLCBuZ3hfc3RyaW5nKCJDb25uZWN0aW9uIiksIG5neF9zdHJpbmcoImNsb3NlIiksIH0sCisgICAgeyAwLCBuZ3hfbnVsbF9zdHJpbmcsIG5neF9udWxsX3N0cmluZyB9Cit9OworCisKK3N0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV90ICBuZ3hfaHR0cF9wcm94eV92YXJzW10gPSB7CisKKyAgICB7IG5neF9zdHJpbmcoInByb3h5X2hvc3QiKSwgbmd4X2h0dHBfcHJveHlfaG9zdF92YXJpYWJsZSwgMCwKKyAgICAgIE5HWF9IVFRQX1ZBUl9DSEFOR0FCTEUgfSwKKworICAgIHsgbmd4X3N0cmluZygicHJveHlfcG9ydCIpLCBuZ3hfaHR0cF9wcm94eV9wb3J0X3ZhcmlhYmxlLCAwLAorICAgICAgTkdYX0hUVFBfVkFSX0NIQU5HQUJMRSB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9hZGRfeF9mb3J3YXJkZWRfZm9yIiksCisgICAgICBuZ3hfaHR0cF9wcm94eV9hZGRfeF9mb3J3YXJkZWRfZm9yX3ZhcmlhYmxlLCAwLCAwIH0sCisKKyNpZiAwCisgICAgeyBuZ3hfc3RyaW5nKCJwcm94eV9hZGRfdmlhIiksIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorCisgICAgeyBuZ3hfbnVsbF9zdHJpbmcsIE5VTEwsIDAsIDAgfQorfTsKIAogCiAjaWYgKE5HWF9QQ1JFKQpAQCAtMjkxLDQ1ICszNDEsNiBAQAogI2VuZGlmCiAKIAotI2lmIDAKLQotbmd4X2h0dHBfaGVhZGVyX3Qgbmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbltdID0gewotICAgIHsgbmd4X3N0cmluZygiRGF0ZSIpLCBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIGRhdGUpIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJTZXJ2ZXIiKSwgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbl90LCBzZXJ2ZXIpIH0sCi0KLSAgICB7IG5neF9zdHJpbmcoIkV4cGlyZXMiKSwgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbl90LCBleHBpcmVzKSB9LAotICAgIHsgbmd4X3N0cmluZygiQ2FjaGUtQ29udHJvbCIpLAotICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIGNhY2hlX2NvbnRyb2wpIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJFVGFnIiksIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgZXRhZykgfSwKLSAgICB7IG5neF9zdHJpbmcoIlgtQWNjZWwtRXhwaXJlcyIpLAotICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIHhfYWNjZWxfZXhwaXJlcykgfSwKLQotICAgIHsgbmd4X3N0cmluZygiQ29ubmVjdGlvbiIpLAotICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIGNvbm5lY3Rpb24pIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJDb250ZW50LVR5cGUiKSwKLSAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbl90LCBjb250ZW50X3R5cGUpIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJDb250ZW50LUxlbmd0aCIpLAotICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIGNvbnRlbnRfbGVuZ3RoKSB9LAotCi0jaWYgKE5HWF9IVFRQX0daSVApCi0gICAgeyBuZ3hfc3RyaW5nKCJDb250ZW50LUVuY29kaW5nIiksCi0gICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgY29udGVudF9lbmNvZGluZykgfSwKLSNlbmRpZgotCi0gICAgeyBuZ3hfc3RyaW5nKCJMYXN0LU1vZGlmaWVkIiksCi0gICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgbGFzdF9tb2RpZmllZCkgfSwKLSAgICB7IG5neF9zdHJpbmcoIkxvY2F0aW9uIiksCi0gICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgbG9jYXRpb24pIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJBY2NlcHQtUmFuZ2VzIiksCi0gICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgYWNjZXB0X3JhbmdlcykgfSwKLSAgICB7IG5neF9zdHJpbmcoIlgtUGFkIiksIG9mZnNldG9mKG5neF9odHRwX3Byb3h5X2hlYWRlcnNfaW5fdCwgeF9wYWQpIH0sCi0KLSAgICB7IG5neF9udWxsX3N0cmluZywgMCB9Ci19OwotCi0jZW5kaWYKLQotCiBzdGF0aWMgbmd4X2ludF90CiBuZ3hfaHR0cF9wcm94eV9oYW5kbGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsgICAKQEAgLTM1OCwyMCArMzY5LDE3IEBACiAKICAgICB1LT5jcmVhdGVfcmVxdWVzdCA9IG5neF9odHRwX3Byb3h5X2NyZWF0ZV9yZXF1ZXN0OwogICAgIHUtPnJlaW5pdF9yZXF1ZXN0ID0gbmd4X2h0dHBfcHJveHlfcmVpbml0X3JlcXVlc3Q7Ci0gICAgdS0+cHJvY2Vzc19oZWFkZXIgPSBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX2hlYWRlcjsKLSAgICB1LT5zZW5kX2hlYWRlciA9IG5neF9odHRwX3Byb3h5X3NlbmRfaGVhZGVyOworICAgIHUtPnByb2Nlc3NfaGVhZGVyID0gbmd4X2h0dHBfcHJveHlfcHJvY2Vzc19zdGF0dXNfbGluZTsKICAgICB1LT5hYm9ydF9yZXF1ZXN0ID0gbmd4X2h0dHBfcHJveHlfYWJvcnRfcmVxdWVzdDsKICAgICB1LT5maW5hbGl6ZV9yZXF1ZXN0ID0gbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdDsKIAorICAgIGlmIChwbGNmLT5yZWRpcmVjdHMpIHsKKyAgICAgICAgdS0+cmV3cml0ZV9yZWRpcmVjdCA9IG5neF9odHRwX3Byb3h5X3Jld3JpdGVfcmVkaXJlY3Q7CisgICAgfQorCiAgICAgdS0+cGlwZS5pbnB1dF9maWx0ZXIgPSBuZ3hfZXZlbnRfcGlwZV9jb3B5X2lucHV0X2ZpbHRlcjsKIAotICAgIHUtPmxvZ19jdHggPSByLT5jb25uZWN0aW9uLT5sb2ctPmRhdGE7Ci0gICAgdS0+bG9nX2hhbmRsZXIgPSBuZ3hfaHR0cF91cHN0cmVhbV9sb2dfZXJyb3I7Ci0KLSAgICB1LT5zY2hlbWEwLmxlbiA9IHNpemVvZigiaHR0cDovLyIpIC0gMTsKLSAgICB1LT5zY2hlbWEwLmRhdGEgPSAodV9jaGFyICopICJodHRwOi8vIjsKLSAgICB1LT51cmkwID0gcGxjZi0+dXJpMDsKLSAgICB1LT5sb2NhdGlvbjAgPSBwbGNmLT5sb2NhdGlvbjA7CisgICAgdS0+YWNjZWwgPSAxOwogICAgIAogICAgIHItPnVwc3RyZWFtID0gdTsKIApAQCAtMzg4LDE5ICszOTYsMTkgQEAKIHN0YXRpYyBuZ3hfaW50X3QKIG5neF9odHRwX3Byb3h5X2NyZWF0ZV9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgIGksIGtleTsKLSAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZTsKLSAgICBuZ3hfYnVmX3QgICAgICAgICAgICAgICAgICAgICAgKmI7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICpoaDsKLSAgICBuZ3hfY2hhaW5fdCAgICAgICAgICAgICAgICAgICAgKmNsOwotICAgIG5neF9saXN0X3BhcnRfdCAgICAgICAgICAgICAgICAqcGFydDsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgKmhlYWRlcjsKLSAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICAgICAgICAgICAgKnU7Ci0gICAgbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCAgICAgICpwbGNmOwotICAgIG5neF9odHRwX3NjcmlwdF9jb2RlX3B0ICAgICAgICAgY29kZTsKLSAgICBuZ3hfaHR0cF9zY3JpcHRfbGVuX2NvZGVfcHQgICAgIGxjb2RlOwotICAgIG5neF9odHRwX3NjcmlwdF9saXRlX2VuZ2luZV90ICAgZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGxvY19sZW47CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgaSwga2V5OworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgIGVzY2FwZTsKKyAgICBuZ3hfYnVmX3QgICAgICAgICAgICAgICAgICAgICpiOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgKmhoOworICAgIG5neF9jaGFpbl90ICAgICAgICAgICAgICAgICAgKmNsLCAqYm9keTsKKyAgICBuZ3hfbGlzdF9wYXJ0X3QgICAgICAgICAgICAgICpwYXJ0OworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgKmhlYWRlcjsKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICAgICAgICAgICp1OworICAgIG5neF9odHRwX3NjcmlwdF9jb2RlX3B0ICAgICAgIGNvZGU7CisgICAgbmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICAgICAgZSwgbGU7CisgICAgbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCAgICAqcGxjZjsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfbGVuX2NvZGVfcHQgICBsY29kZTsKIAogICAgIHUgPSByLT51cHN0cmVhbTsKIApAQCAtNDA5LDY1ICs0MTcsNzMgQEAKICAgICBsZW4gPSBzaXplb2Yobmd4X2h0dHBfcHJveHlfdmVyc2lvbikgLSAxICsgc2l6ZW9mKENSTEYpIC0gMTsKIAogICAgIGlmICh1LT5tZXRob2QpIHsKLSAgICAgICAgbGVuICs9IG5neF9odHRwX3Byb3h5X21ldGhvZHNbdS0+bWV0aG9kIC0gMV0ubGVuICsgdS0+dXJpMC5sZW47CisgICAgICAgIGxlbiArPSBuZ3hfaHR0cF9wcm94eV9tZXRob2RzW3UtPm1ldGhvZCAtIDFdLmxlbiArIHUtPmNvbmYtPnVyaS5sZW47CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbGVuICs9IHItPm1ldGhvZF9uYW1lLmxlbiArIHUtPnVyaTAubGVuOworICAgICAgICBsZW4gKz0gci0+bWV0aG9kX25hbWUubGVuICsgMSArIHUtPmNvbmYtPnVyaS5sZW47CiAgICAgfQogCiAgICAgZXNjYXBlID0gMDsKLSAgICAKKworICAgIGxvY19sZW4gPSByLT52YWxpZF9sb2NhdGlvbiA/IHUtPmNvbmYtPmxvY2F0aW9uLT5sZW4gOiAxOworCiAgICAgaWYgKHBsY2YtPnVwc3RyZWFtLnBhc3NfdW5wYXJzZWRfdXJpICYmIHItPnZhbGlkX3VucGFyc2VkX3VyaSkgewogICAgICAgICBsZW4gKz0gci0+dW5wYXJzZWRfdXJpLmxlbiAtIDE7CiAKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoci0+cXVvdGVkX3VyaSkgewotICAgICAgICAgICAgZXNjYXBlID0gMiAqIG5neF9lc2NhcGVfdXJpKE5VTEwsIHItPnVyaS5kYXRhICsgdS0+bG9jYXRpb24wLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uMC0+bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9FU0NBUEVfVVJJKTsKKyAgICAgICAgICAgIGVzY2FwZSA9IDIgKiBuZ3hfZXNjYXBlX3VyaShOVUxMLCByLT51cmkuZGF0YSArIGxvY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIGxvY19sZW4sIE5HWF9FU0NBUEVfVVJJKTsKICAgICAgICAgfQogCi0gICAgICAgIGxlbiArPSByLT51cmkubGVuIC0gdS0+bG9jYXRpb24wLT5sZW4gKyBlc2NhcGUKLSAgICAgICAgICAgICsgc2l6ZW9mKCI/IikgLSAxICsgci0+YXJncy5sZW47CisgICAgICAgIGxlbiArPSByLT51cmkubGVuIC0gbG9jX2xlbiArIGVzY2FwZSArIHNpemVvZigiPyIpIC0gMSArIHItPmFyZ3MubGVuOworICAgIH0KKworICAgIG5neF9tZW16ZXJvKCZlLCBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90KSk7CisKKyAgICBsZS5pcCA9IHBsY2YtPmhlYWRlcnNfc2V0X2xlbi0+ZWx0czsKKyAgICBsZS5yZXF1ZXN0ID0gcjsKKworICAgIHdoaWxlICgqKHVpbnRwdHJfdCAqKSBsZS5pcCkgeworICAgICAgICB3aGlsZSAoKih1aW50cHRyX3QgKikgbGUuaXApIHsKKyAgICAgICAgICAgIGxjb2RlID0gKihuZ3hfaHR0cF9zY3JpcHRfbGVuX2NvZGVfcHQgKikgbGUuaXA7CisgICAgICAgICAgICBsZW4gKz0gbGNvZGUoJmxlKTsKKyAgICAgICAgfQorICAgICAgICBsZS5pcCArPSBzaXplb2YodWludHB0cl90KTsKICAgICB9CiAKIAotICAgIGUuaXAgPSBwbGNmLT5oZWFkZXJzX3NldF9sZW4tPmVsdHM7Ci0gICAgZS5yZXF1ZXN0ID0gcjsKLQotICAgIHdoaWxlICgqKHVpbnRwdHJfdCAqKSBlLmlwKSB7Ci0gICAgICAgIGxjb2RlID0gKihuZ3hfaHR0cF9zY3JpcHRfbGVuX2NvZGVfcHQgKikgZS5pcDsKLSAgICAgICAgbGVuICs9IGxjb2RlKCZlKTsKLSAgICB9Ci0KLQotICAgIHBhcnQgPSAmci0+aGVhZGVyc19pbi5oZWFkZXJzLnBhcnQ7Ci0gICAgaGVhZGVyID0gcGFydC0+ZWx0czsKICAgICBoaCA9IChuZ3hfc3RyX3QgKikgcGxjZi0+aGVhZGVyc19zZXRfaGFzaC0+YnVja2V0czsKIAotICAgIGZvciAoaSA9IDA7IC8qIHZvaWQgKi87IGkrKykgeworICAgIGlmIChwbGNmLT51cHN0cmVhbS5wYXNzX3JlcXVlc3RfaGVhZGVycykgeworICAgICAgICBwYXJ0ID0gJnItPmhlYWRlcnNfaW4uaGVhZGVycy5wYXJ0OworICAgICAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOwogCi0gICAgICAgIGlmIChpID49IHBhcnQtPm5lbHRzKSB7Ci0gICAgICAgICAgICBpZiAocGFydC0+bmV4dCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGZvciAoaSA9IDA7IC8qIHZvaWQgKi87IGkrKykgeworCisgICAgICAgICAgICBpZiAoaSA+PSBwYXJ0LT5uZWx0cykgeworICAgICAgICAgICAgICAgIGlmIChwYXJ0LT5uZXh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcGFydCA9IHBhcnQtPm5leHQ7CisgICAgICAgICAgICAgICAgaGVhZGVyID0gcGFydC0+ZWx0czsKKyAgICAgICAgICAgICAgICBpID0gMDsgCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHBhcnQgPSBwYXJ0LT5uZXh0OwotICAgICAgICAgICAgaGVhZGVyID0gcGFydC0+ZWx0czsKLSAgICAgICAgICAgIGkgPSAwOyAKKyAgICAgICAgICAgIGtleSA9IGhlYWRlcltpXS5oYXNoICUgcGxjZi0+aGVhZGVyc19zZXRfaGFzaC0+aGFzaF9zaXplOworCisgICAgICAgICAgICBpZiAoaGhba2V5XS5sZW4gPT0gaGVhZGVyW2ldLmtleS5sZW4KKyAgICAgICAgICAgICAgICAmJiBuZ3hfc3RyY2FzZWNtcChoaFtrZXldLmRhdGEsIGhlYWRlcltpXS5rZXkuZGF0YSkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGVuICs9IGhlYWRlcltpXS5rZXkubGVuICsgc2l6ZW9mKCI6ICIpIC0gMQorICAgICAgICAgICAgICAgICsgaGVhZGVyW2ldLnZhbHVlLmxlbiArIHNpemVvZihDUkxGKSAtIDE7CiAgICAgICAgIH0KLQotICAgICAgICBrZXkgPSBoZWFkZXJbaV0uaGFzaCAlIHBsY2YtPmhlYWRlcnNfc2V0X2hhc2gtPmhhc2hfc2l6ZTsKLQotICAgICAgICBpZiAoaGhba2V5XS5sZW4gPT0gaGVhZGVyW2ldLmtleS5sZW4KLSAgICAgICAgICAgICYmIG5neF9zdHJjYXNlY21wKGhoW2tleV0uZGF0YSwgaGVhZGVyW2ldLmtleS5kYXRhKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxlbiArPSBoZWFkZXJbaV0ua2V5LmxlbiArIHNpemVvZigiOiAiKSAtIDEKLSAgICAgICAgICAgICsgaGVhZGVyW2ldLnZhbHVlLmxlbiArIHNpemVvZihDUkxGKSAtIDE7CiAgICAgfQogCisKICAgICBiID0gbmd4X2NyZWF0ZV90ZW1wX2J1ZihyLT5wb29sLCBsZW4pOwogICAgIGlmIChiID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKQEAgLTQ3OSw5ICs0OTUsNiBAQAogICAgIH0KIAogICAgIGNsLT5idWYgPSBiOwotICAgIGNsLT5uZXh0ID0gTlVMTDsKLQotICAgIHItPnJlcXVlc3RfYm9keS0+YnVmcyA9IGNsOwogCiAKICAgICAvKiB0aGUgcmVxdWVzdCBsaW5lICovCkBAIC00OTEsMjMgKzUwNCwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9tZXRob2RzW3UtPm1ldGhvZCAtIDFdLmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X21ldGhvZHNbdS0+bWV0aG9kIC0gMV0ubGVuKTsKICAgICB9IGVsc2UgewotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT5tZXRob2RfbmFtZS5kYXRhLCByLT5tZXRob2RfbmFtZS5sZW4pOworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT5tZXRob2RfbmFtZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5tZXRob2RfbmFtZS5sZW4gKyAxKTsKICAgICB9CiAKLSAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCB1LT51cmkwLmRhdGEsIHUtPnVyaTAubGVuKTsKKyAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCB1LT5jb25mLT51cmkuZGF0YSwgdS0+Y29uZi0+dXJpLmxlbik7CiAKICAgICBpZiAocGxjZi0+dXBzdHJlYW0ucGFzc191bnBhcnNlZF91cmkgJiYgci0+dmFsaWRfdW5wYXJzZWRfdXJpKSB7CiAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPnVucGFyc2VkX3VyaS5kYXRhICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dW5wYXJzZWRfdXJpLmxlbiAtIDEpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChlc2NhcGUpIHsKLSAgICAgICAgICAgIG5neF9lc2NhcGVfdXJpKGItPmxhc3QsIHItPnVyaS5kYXRhICsgdS0+bG9jYXRpb24wLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByLT51cmkubGVuIC0gdS0+bG9jYXRpb24wLT5sZW4sIE5HWF9FU0NBUEVfVVJJKTsKLSAgICAgICAgICAgIGItPmxhc3QgKz0gci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uMC0+bGVuICsgZXNjYXBlOworICAgICAgICAgICAgbmd4X2VzY2FwZV91cmkoYi0+bGFzdCwgci0+dXJpLmRhdGEgKyBsb2NfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIGxvY19sZW4sIE5HWF9FU0NBUEVfVVJJKTsKKyAgICAgICAgICAgIGItPmxhc3QgKz0gci0+dXJpLmxlbiAtIGxvY19sZW4gKyBlc2NhcGU7CiAKICAgICAgICAgfSBlbHNlIHsgCi0gICAgICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT51cmkuZGF0YSArIHUtPmxvY2F0aW9uMC0+bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uMC0+bGVuKTsKKyAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPnVyaS5kYXRhICsgbG9jX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnVyaS5sZW4gLSBsb2NfbGVuKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChyLT5hcmdzLmxlbiA+IDApIHsKQEAgLTUyMiw1MCArNTM2LDc2IEBACiAKICAgICBlLmlwID0gcGxjZi0+aGVhZGVyc19zZXQtPmVsdHM7CiAgICAgZS5wb3MgPSBiLT5sYXN0OworICAgIGUucmVxdWVzdCA9IHI7CiAKLSAgICB3aGlsZSAoKih1aW50cHRyX3QgKikgZS5pcCkgewotICAgICAgICBjb2RlID0gKihuZ3hfaHR0cF9zY3JpcHRfY29kZV9wdCAqKSBlLmlwOwotICAgICAgICBjb2RlKChuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKikgJmUpOworICAgIGxlLmlwID0gcGxjZi0+aGVhZGVyc19zZXRfbGVuLT5lbHRzOworCisgICAgd2hpbGUgKCoodWludHB0cl90ICopIGxlLmlwKSB7CisgICAgICAgIGxjb2RlID0gKihuZ3hfaHR0cF9zY3JpcHRfbGVuX2NvZGVfcHQgKikgbGUuaXA7CisgICAgICAgIGxjb2RlKCZsZSk7CisKKyAgICAgICAgaWYgKCoobmd4X2h0dHBfc2NyaXB0X2xlbl9jb2RlX3B0ICopIGxlLmlwKSB7CisKKyAgICAgICAgICAgIGZvciAobGVuID0gMDsgKih1aW50cHRyX3QgKikgbGUuaXA7IGxlbiArPSBsY29kZSgmbGUpKSB7CisgICAgICAgICAgICAgICAgbGNvZGUgPSAqKG5neF9odHRwX3NjcmlwdF9sZW5fY29kZV9wdCAqKSBsZS5pcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZS5za2lwID0gKGxlbiA9PSBzaXplb2YoQ1JMRikgLSAxKSA/IDEgOiAwOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlLnNraXAgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbGUuaXAgKz0gc2l6ZW9mKHVpbnRwdHJfdCk7CisKKyAgICAgICAgd2hpbGUgKCoodWludHB0cl90ICopIGUuaXApIHsKKyAgICAgICAgICAgIGNvZGUgPSAqKG5neF9odHRwX3NjcmlwdF9jb2RlX3B0ICopIGUuaXA7CisgICAgICAgICAgICBjb2RlKChuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKikgJmUpOworICAgICAgICB9IAorICAgICAgICBlLmlwICs9IHNpemVvZih1aW50cHRyX3QpOwogICAgIH0KIAogICAgIGItPmxhc3QgPSBlLnBvczsKIAogCi0gICAgcGFydCA9ICZyLT5oZWFkZXJzX2luLmhlYWRlcnMucGFydDsKLSAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOworICAgIGlmIChwbGNmLT51cHN0cmVhbS5wYXNzX3JlcXVlc3RfaGVhZGVycykgeworICAgICAgICBwYXJ0ID0gJnItPmhlYWRlcnNfaW4uaGVhZGVycy5wYXJ0OworICAgICAgICBoZWFkZXIgPSBwYXJ0LT5lbHRzOwogICAgIAotICAgIGZvciAoaSA9IDA7IC8qIHZvaWQgKi87IGkrKykgeworICAgICAgICBmb3IgKGkgPSAwOyAvKiB2b2lkICovOyBpKyspIHsKIAotICAgICAgICBpZiAoaSA+PSBwYXJ0LT5uZWx0cykgewotICAgICAgICAgICAgaWYgKHBhcnQtPm5leHQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKGkgPj0gcGFydC0+bmVsdHMpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFydC0+bmV4dCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBhcnQgPSBwYXJ0LT5uZXh0OworICAgICAgICAgICAgICAgIGhlYWRlciA9IHBhcnQtPmVsdHM7CisgICAgICAgICAgICAgICAgaSA9IDA7IAogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBwYXJ0ID0gcGFydC0+bmV4dDsKLSAgICAgICAgICAgIGhlYWRlciA9IHBhcnQtPmVsdHM7Ci0gICAgICAgICAgICBpID0gMDsgCisgICAgICAgICAgICBrZXkgPSBoZWFkZXJbaV0uaGFzaCAlIHBsY2YtPmhlYWRlcnNfc2V0X2hhc2gtPmhhc2hfc2l6ZTsKKworICAgICAgICAgICAgaWYgKGhoW2tleV0ubGVuID09IGhlYWRlcltpXS5rZXkubGVuCisgICAgICAgICAgICAgICAgJiYgbmd4X3N0cmNhc2VjbXAoaGhba2V5XS5kYXRhLCBoZWFkZXJbaV0ua2V5LmRhdGEpID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIGhlYWRlcltpXS5rZXkuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcltpXS5rZXkubGVuKTsKKworICAgICAgICAgICAgKmItPmxhc3QrKyA9ICc6JzsgKmItPmxhc3QrKyA9ICcgJzsKKworICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgaGVhZGVyW2ldLnZhbHVlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJbaV0udmFsdWUubGVuKTsKKworICAgICAgICAgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7CisKKyAgICAgICAgICAgIG5neF9sb2dfZGVidWcyKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgcHJveHkgaGVhZGVyOiBcIiVWOiAlVlwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXJbaV0ua2V5LCAmaGVhZGVyW2ldLnZhbHVlKTsKICAgICAgICAgfQotCi0gICAgICAgIGtleSA9IGhlYWRlcltpXS5oYXNoICUgcGxjZi0+aGVhZGVyc19zZXRfaGFzaC0+aGFzaF9zaXplOwotCi0gICAgICAgIGlmIChoaFtrZXldLmxlbiA9PSBoZWFkZXJbaV0ua2V5LmxlbgotICAgICAgICAgICAgJiYgbmd4X3N0cmNhc2VjbXAoaGhba2V5XS5kYXRhLCBoZWFkZXJbaV0ua2V5LmRhdGEpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgaGVhZGVyW2ldLmtleS5kYXRhLCBoZWFkZXJbaV0ua2V5Lmxlbik7Ci0KLSAgICAgICAgKmItPmxhc3QrKyA9ICc6JzsgKmItPmxhc3QrKyA9ICcgJzsKLQotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCBoZWFkZXJbaV0udmFsdWUuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyW2ldLnZhbHVlLmxlbik7Ci0KLSAgICAgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7Ci0KLSAgICAgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICJodHRwIHByb3h5IGhlYWRlcjogXCIlVjogJVZcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXJbaV0ua2V5LCAmaGVhZGVyW2ldLnZhbHVlKTsKICAgICB9CiAKICAgICAvKiBhZGQgIlxyXG4iIGF0IHRoZSBoZWFkZXIgZW5kICovCkBAIC01ODIsNiArNjIyLDM2IEBACiAgICAgfQogI2VuZGlmCiAKKyAgICBpZiAocGxjZi0+dXBzdHJlYW0ucGFzc19yZXF1ZXN0X2JvZHkpIHsKKworICAgICAgICBib2R5ID0gdS0+cmVxdWVzdF9idWZzOworICAgICAgICB1LT5yZXF1ZXN0X2J1ZnMgPSBjbDsKKworICAgICAgICB3aGlsZSAoYm9keSkgeworICAgICAgICAgICAgYiA9IG5neF9hbGxvY19idWYoci0+cG9vbCk7CisgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmd4X21lbWNweShiLCBib2R5LT5idWYsIHNpemVvZihuZ3hfYnVmX3QpKTsKKworICAgICAgICAgICAgY2wtPm5leHQgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKTsKKyAgICAgICAgICAgIGlmIChjbC0+bmV4dCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2wgPSBjbC0+bmV4dDsKKyAgICAgICAgICAgIGNsLT5idWYgPSBiOworCisgICAgICAgICAgICBib2R5ID0gYm9keS0+bmV4dDsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgdS0+cmVxdWVzdF9idWZzID0gY2w7CisgICAgfQorCisgICAgY2wtPm5leHQgPSBOVUxMOworCiAgICAgcmV0dXJuIE5HWF9PSzsKIH0KIApAQCAtNTg5LDYgKzY1OSwyODYgQEAKIHN0YXRpYyBuZ3hfaW50X3QKIG5neF9odHRwX3Byb3h5X3JlaW5pdF9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKKyAgICBuZ3hfaHR0cF9wcm94eV9jdHhfdCAgKnA7CisKKyAgICBwID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfcHJveHlfbW9kdWxlKTsKKworICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKKyAgICB9CisKKyAgICBwLT5zdGF0dXMgPSAwOworICAgIHAtPnN0YXR1c19jb3VudCA9IDA7CisgICAgcC0+c3RhdHVzX3N0YXJ0ID0gTlVMTDsKKyAgICBwLT5zdGF0dXNfZW5kID0gTlVMTDsKKworICAgIHItPnVwc3RyZWFtLT5wcm9jZXNzX2hlYWRlciA9IG5neF9odHRwX3Byb3h5X3Byb2Nlc3Nfc3RhdHVzX2xpbmU7CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Byb3h5X3Byb2Nlc3Nfc3RhdHVzX2xpbmUobmd4X2h0dHBfcmVxdWVzdF90ICpyKQoreworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgcmM7CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAgICp1OworICAgIG5neF9odHRwX3Byb3h5X2N0eF90ICAqcDsKKworICAgIHAgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2N0eChyLCBuZ3hfaHR0cF9wcm94eV9tb2R1bGUpOworCisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICBwID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3Byb3h5X2N0eF90KSk7CisgICAgICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBuZ3hfaHR0cF9zZXRfY3R4KHIsIHAsIG5neF9odHRwX3Byb3h5X21vZHVsZSk7CisgICAgfQorCisgICAgcmMgPSBuZ3hfaHR0cF9wcm94eV9wYXJzZV9zdGF0dXNfbGluZShyLCBwKTsKKworICAgIGlmIChyYyA9PSBOR1hfQUdBSU4pIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHUgPSByLT51cHN0cmVhbTsKKworICAgIGlmIChyYyA9PSBOR1hfSFRUUF9QUk9YWV9QQVJTRV9OT19IRUFERVIpIHsKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICJ1cHN0cmVhbSBzZW50IG5vIHZhbGlkIEhUVFAvMS4wIGhlYWRlciIpOyAKKworICAgICAgICBpZiAodS0+YWNjZWwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9VUFNUUkVBTV9JTlZBTElEX0hFQURFUjsKKyAgICAgICAgfQorCisgICAgICAgIHItPmh0dHBfdmVyc2lvbiA9IE5HWF9IVFRQX1ZFUlNJT05fOTsKKyAgICAgICAgcC0+c3RhdHVzID0gTkdYX0hUVFBfT0s7CisgICAgCisgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgfQorCisgICAgci0+aGVhZGVyc19vdXQuc3RhdHVzID0gcC0+c3RhdHVzOworICAgIHUtPnN0YXRlLT5zdGF0dXMgPSBwLT5zdGF0dXM7CisKKyAgICByLT5oZWFkZXJzX291dC5zdGF0dXNfbGluZS5sZW4gPSBwLT5zdGF0dXNfZW5kIC0gcC0+c3RhdHVzX3N0YXJ0OworICAgIHItPmhlYWRlcnNfb3V0LnN0YXR1c19saW5lLmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5oZWFkZXJzX291dC5zdGF0dXNfbGluZS5sZW4pOworICAgIGlmIChyLT5oZWFkZXJzX291dC5zdGF0dXNfbGluZS5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICB9CisgICAgbmd4X21lbWNweShyLT5oZWFkZXJzX291dC5zdGF0dXNfbGluZS5kYXRhLCBwLT5zdGF0dXNfc3RhcnQsCisgICAgICAgICAgICAgICByLT5oZWFkZXJzX291dC5zdGF0dXNfbGluZS5sZW4pOworCisgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgcHJveHkgc3RhdHVzICV1aSBcIiVWXCIiLAorICAgICAgICAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LnN0YXR1cywgJnItPmhlYWRlcnNfb3V0LnN0YXR1c19saW5lKTsKKworICAgIHUtPnByb2Nlc3NfaGVhZGVyID0gbmd4X2h0dHBfcHJveHlfcHJvY2Vzc19oZWFkZXI7CisKKyAgICByZXR1cm4gbmd4X2h0dHBfcHJveHlfcHJvY2Vzc19oZWFkZXIocik7Cit9CisKKworc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfcHJveHlfcGFyc2Vfc3RhdHVzX2xpbmUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCkKK3sKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgY2g7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgKnBvczsKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICAqdTsKKyAgICBlbnVtICB7CisgICAgICAgIHN3X3N0YXJ0ID0gMCwKKyAgICAgICAgc3dfSCwKKyAgICAgICAgc3dfSFQsCisgICAgICAgIHN3X0hUVCwKKyAgICAgICAgc3dfSFRUUCwKKyAgICAgICAgc3dfZmlyc3RfbWFqb3JfZGlnaXQsCisgICAgICAgIHN3X21ham9yX2RpZ2l0LAorICAgICAgICBzd19maXJzdF9taW5vcl9kaWdpdCwKKyAgICAgICAgc3dfbWlub3JfZGlnaXQsCisgICAgICAgIHN3X3N0YXR1cywKKyAgICAgICAgc3dfc3BhY2VfYWZ0ZXJfc3RhdHVzLAorICAgICAgICBzd19zdGF0dXNfdGV4dCwKKyAgICAgICAgc3dfYWxtb3N0X2RvbmUKKyAgICB9IHN0YXRlOyAKKworICAgIHUgPSByLT51cHN0cmVhbTsKKworICAgIHN0YXRlID0gci0+c3RhdGU7CisKKyAgICBmb3IgKHBvcyA9IHUtPmhlYWRlcl9pbi5wb3M7IHBvcyA8IHUtPmhlYWRlcl9pbi5sYXN0OyBwb3MrKykgeworICAgICAgICBjaCA9ICpwb3M7CisKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworCisgICAgICAgIC8qICJIVFRQLyIgKi8KKyAgICAgICAgY2FzZSBzd19zdGFydDoKKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgIGNhc2UgJ0gnOiAKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X0g7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9QUk9YWV9QQVJTRV9OT19IRUFERVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHN3X0g6IAorICAgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgY2FzZSAnVCc6IAorICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfSFQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9QUk9YWV9QQVJTRV9OT19IRUFERVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHN3X0hUOgorICAgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgY2FzZSAnVCc6IAorICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfSFRUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUFJPWFlfUEFSU0VfTk9fSEVBREVSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBzd19IVFQ6CisgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgICBjYXNlICdQJzogCisgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19IVFRQOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUFJPWFlfUEFSU0VfTk9fSEVBREVSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBzd19IVFRQOgorICAgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgY2FzZSAnLyc6IAorICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfZmlyc3RfbWFqb3JfZGlnaXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9QUk9YWV9QQVJTRV9OT19IRUFERVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiB0aGUgZmlyc3QgZGlnaXQgb2YgbWFqb3IgSFRUUCB2ZXJzaW9uICovCisgICAgICAgIGNhc2Ugc3dfZmlyc3RfbWFqb3JfZGlnaXQ6CisgICAgICAgICAgICBpZiAoY2ggPCAnMScgfHwgY2ggPiAnOScpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUFJPWFlfUEFSU0VfTk9fSEVBREVSOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZSA9IHN3X21ham9yX2RpZ2l0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogdGhlIG1ham9yIEhUVFAgdmVyc2lvbiBvciBkb3QgKi8KKyAgICAgICAgY2FzZSBzd19tYWpvcl9kaWdpdDoKKyAgICAgICAgICAgIGlmIChjaCA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2ZpcnN0X21pbm9yX2RpZ2l0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUFJPWFlfUEFSU0VfTk9fSEVBREVSOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiB0aGUgZmlyc3QgZGlnaXQgb2YgbWlub3IgSFRUUCB2ZXJzaW9uICovCisgICAgICAgIGNhc2Ugc3dfZmlyc3RfbWlub3JfZGlnaXQ6CisgICAgICAgICAgICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfUFJPWFlfUEFSU0VfTk9fSEVBREVSOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZSA9IHN3X21pbm9yX2RpZ2l0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogdGhlIG1pbm9yIEhUVFAgdmVyc2lvbiBvciB0aGUgZW5kIG9mIHRoZSByZXF1ZXN0IGxpbmUgKi8KKyAgICAgICAgY2FzZSBzd19taW5vcl9kaWdpdDoKKyAgICAgICAgICAgIGlmIChjaCA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X3N0YXR1czsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1BST1hZX1BBUlNFX05PX0hFQURFUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogSFRUUCBzdGF0dXMgY29kZSAqLworICAgICAgICBjYXNlIHN3X3N0YXR1czoKKyAgICAgICAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9QUk9YWV9QQVJTRV9OT19IRUFERVI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHAtPnN0YXR1cyA9IHAtPnN0YXR1cyAqIDEwICsgY2ggLSAnMCc7CisKKyAgICAgICAgICAgIGlmICgrK3AtPnN0YXR1c19jb3VudCA9PSAzKSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19zcGFjZV9hZnRlcl9zdGF0dXM7CisgICAgICAgICAgICAgICAgcC0+c3RhdHVzX3N0YXJ0ID0gcG9zIC0gMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIC8qIHNwYWNlIG9yIGVuZCBvZiBsaW5lICovCisgICAgICAgICBjYXNlIHN3X3NwYWNlX2FmdGVyX3N0YXR1czoKKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgIGNhc2UgJyAnOiAKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X3N0YXR1c190ZXh0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnLic6ICAgICAgICAgICAgICAgICAgICAvKiBJSVMgbWF5IHNlbmQgNDAzLjEsIDQwMy4yLCBldGMgKi8KKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X3N0YXR1c190ZXh0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDUjoKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2FsbW9zdF9kb25lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMRjoKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9QUk9YWV9QQVJTRV9OT19IRUFERVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBhbnkgdGV4dCB1bnRpbCBlbmQgb2YgbGluZSAqLworICAgICAgICBjYXNlIHN3X3N0YXR1c190ZXh0OgorICAgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgY2FzZSBDUjoKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2FsbW9zdF9kb25lOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExGOgorICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIGVuZCBvZiByZXF1ZXN0IGxpbmUgKi8KKyAgICAgICAgY2FzZSBzd19hbG1vc3RfZG9uZToKKyAgICAgICAgICAgIHAtPnN0YXR1c19lbmQgPSBwb3MgLSAxOworICAgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgY2FzZSBMRjoKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9QUk9YWV9QQVJTRV9OT19IRUFERVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1LT5oZWFkZXJfaW4ucG9zID0gcG9zICsgMTsKKyAgICByLT5zdGF0ZSA9IHN0YXRlOworCisgICAgcmV0dXJuIE5HWF9BR0FJTjsKKworZG9uZToKKworICAgIHUtPmhlYWRlcl9pbi5wb3MgPSBwb3MgKyAxOworCisgICAgaWYgKHAtPnN0YXR1c19lbmQgPT0gTlVMTCkgeworICAgICAgICBwLT5zdGF0dXNfZW5kID0gcG9zOworICAgIH0KKworICAgIHItPnN0YXRlID0gc3dfc3RhcnQ7CisKICAgICByZXR1cm4gTkdYX09LOwogfQogCkBAIC01OTYsMTQgKzk0Niw3OSBAQAogc3RhdGljIG5neF9pbnRfdAogbmd4X2h0dHBfcHJveHlfcHJvY2Vzc19oZWFkZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQogewotICAgIHJldHVybiBOR1hfT0s7Ci19CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgICAgICByYzsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgIGtleTsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgKmg7CisgICAgbmd4X2h0dHBfdXBzdHJlYW1faGVhZGVyX3QgICAgICpoaDsKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV9tYWluX2NvbmZfdCAgKnVtY2Y7CiAKKyAgICB1bWNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9tYWluX2NvbmYociwgbmd4X2h0dHBfdXBzdHJlYW1fbW9kdWxlKTsKKyAgICBoaCA9IChuZ3hfaHR0cF91cHN0cmVhbV9oZWFkZXJfdCAqKSB1bWNmLT5oZWFkZXJzX2luX2hhc2guYnVja2V0czsKIAotc3RhdGljIG5neF9pbnRfdAotbmd4X2h0dHBfcHJveHlfc2VuZF9oZWFkZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQotewotICAgIHJldHVybiBOR1hfT0s7CisgICAgZm9yICggOzsgICkgeworCisgICAgICAgIHJjID0gbmd4X2h0dHBfcGFyc2VfaGVhZGVyX2xpbmUociwgJnItPnVwc3RyZWFtLT5oZWFkZXJfaW4pOworCisgICAgICAgIGlmIChyYyA9PSBOR1hfT0spIHsKKworICAgICAgICAgICAgLyogYSBoZWFkZXIgbGluZSBoYXMgYmVlbiBwYXJzZWQgc3VjY2Vzc2Z1bGx5ICovCisKKyAgICAgICAgICAgIGggPSBuZ3hfbGlzdF9wdXNoKCZyLT51cHN0cmVhbS0+aGVhZGVyc19pbi5oZWFkZXJzKTsKKyAgICAgICAgICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoLT5oYXNoID0gci0+aGVhZGVyX2hhc2g7CisKKyAgICAgICAgICAgIGgtPmtleS5sZW4gPSByLT5oZWFkZXJfbmFtZV9lbmQgLSByLT5oZWFkZXJfbmFtZV9zdGFydDsKKyAgICAgICAgICAgIGgtPnZhbHVlLmxlbiA9IHItPmhlYWRlcl9lbmQgLSByLT5oZWFkZXJfc3RhcnQ7CisKKyAgICAgICAgICAgIGgtPmtleS5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmtleS5sZW4gKyAxICsgaC0+dmFsdWUubGVuICsgMSk7CisgICAgICAgICAgICBpZiAoaC0+a2V5LmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGgtPnZhbHVlLmRhdGEgPSBoLT5rZXkuZGF0YSArIGgtPmtleS5sZW4gKyAxOworCisgICAgICAgICAgICBuZ3hfY3B5c3RybihoLT5rZXkuZGF0YSwgci0+aGVhZGVyX25hbWVfc3RhcnQsIGgtPmtleS5sZW4gKyAxKTsKKyAgICAgICAgICAgIG5neF9jcHlzdHJuKGgtPnZhbHVlLmRhdGEsIHItPmhlYWRlcl9zdGFydCwgaC0+dmFsdWUubGVuICsgMSk7CisKKyAgICAgICAgICAgIGtleSA9IGgtPmhhc2ggJSB1bWNmLT5oZWFkZXJzX2luX2hhc2guaGFzaF9zaXplOworCisgICAgICAgICAgICBpZiAoaGhba2V5XS5uYW1lLmxlbiA9PSBoLT5rZXkubGVuCisgICAgICAgICAgICAgICAgJiYgbmd4X3N0cmNhc2VjbXAoaGhba2V5XS5uYW1lLmRhdGEsIGgtPmtleS5kYXRhKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChoaFtrZXldLmhhbmRsZXIociwgaCwgaGhba2V5XS5vZmZzZXQpICE9IE5HWF9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBwcm94eSBoZWFkZXI6IFwiJVY6ICVWXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmgtPmtleSwgJmgtPnZhbHVlKTsKKworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmMgPT0gTkdYX0hUVFBfUEFSU0VfSEVBREVSX0RPTkUpIHsKKworICAgICAgICAgICAgLyogYSB3aG9sZSBoZWFkZXIgaGFzIGJlZW4gcGFyc2VkIHN1Y2Nlc3NmdWxseSAqLworCisgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwIHByb3h5IGhlYWRlciBkb25lIik7CisKKyAgICAgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgICAgIH0KKworICAgICAgICAvKiB0aGVyZSB3YXMgZXJyb3Igd2hpbGUgYSBoZWFkZXIgbGluZSBwYXJzaW5nICovCisKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2hlYWRlcl9lcnJvcnNbcmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBOR1hfSFRUUF9QQVJTRV9IRUFERVJfRVJST1JdKTsKKworICAgICAgICByZXR1cm4gTkdYX0hUVFBfVVBTVFJFQU1fSU5WQUxJRF9IRUFERVI7CisgICAgfQogfQogCiAKQEAgLTYyNyw1NyArMTA0MiwyMjIgQEAKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90Ci1uZ3hfaHR0cF9wcm94eV9pbml0KG5neF9jeWNsZV90ICpjeWNsZSkKLXsKLSNpZiAwCi0gICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgKnZhcjsKLQotICAgIHZhciA9IG5neF9odHRwX2FkZF92YXJpYWJsZShjZiwgJm5neF9odHRwX3Byb3h5X2hvc3QsIDEpOwotICAgIGlmICh2YXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgIH0KLQotICAgIHZhci0+aGFuZGxlciA9IG5neF9odHRwX3Byb3h5X2hvc3RfdmFyaWFibGU7Ci0jZW5kaWYKLQotICAgIHJldHVybiBOR1hfT0s7Ci0KLSNpZiAwCi0gICAgbmd4X2h0dHBfbG9nX29wX25hbWVfdCAgKm9wOwotCi0gICAgZm9yIChvcCA9IG5neF9odHRwX3Byb3h5X2xvZ19mbXRfb3BzOyBvcC0+bmFtZS5sZW47IG9wKyspIHsgLyogdm9pZCAqLyB9Ci0gICAgb3AtPnJ1biA9IE5VTEw7Ci0KLSAgICBmb3IgKG9wID0gbmd4X2h0dHBfbG9nX2ZtdF9vcHM7IG9wLT5ydW47IG9wKyspIHsKLSAgICAgICAgaWYgKG9wLT5uYW1lLmxlbiA9PSAwKSB7Ci0gICAgICAgICAgICBvcCA9IChuZ3hfaHR0cF9sb2dfb3BfbmFtZV90ICopIG9wLT5ydW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBvcC0+cnVuID0gKG5neF9odHRwX2xvZ19vcF9ydW5fcHQpIG5neF9odHRwX3Byb3h5X2xvZ19mbXRfb3BzOwotCi0jZW5kaWYKLX0KLQotCiBzdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCiBuZ3hfaHR0cF9wcm94eV9ob3N0X3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpCiB7Ci0gICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnZhcjsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CiAgICAgbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCAgKnBsY2Y7CiAKLSAgICB2YXIgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7Ci0gICAgaWYgKHZhciA9PSBOVUxMKSB7CisgICAgdnYgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7CisgICAgaWYgKHZ2ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgcGxjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfcHJveHlfbW9kdWxlKTsKIAotICAgIHZhci0+dmFsdWUgPSAwOwotICAgIHZhci0+dGV4dCA9IHBsY2YtPmhvc3RfaGVhZGVyOworICAgIHZ2LT52YWx1ZSA9IDA7CisgICAgdnYtPnRleHQgPSBwbGNmLT5ob3N0X2hlYWRlcjsKIAotICAgIHJldHVybiB2YXI7CisgICAgcmV0dXJuIHZ2OworfQorCisKK3N0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKK25neF9odHRwX3Byb3h5X3BvcnRfdmFyaWFibGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSkKK3sKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CisgICAgbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCAgKnBsY2Y7CisKKyAgICB2diA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKKyAgICBpZiAodnYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwbGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9wcm94eV9tb2R1bGUpOworCisgICAgdnYtPnZhbHVlID0gMDsKKyAgICB2di0+dGV4dCA9IHBsY2YtPnBvcnRfdGV4dDsKKworICAgIHJldHVybiB2djsKK30KKworCitzdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCituZ3hfaHR0cF9wcm94eV9hZGRfeF9mb3J3YXJkZWRfZm9yX3ZhcmlhYmxlKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICB1aW50cHRyX3QgZGF0YSkKK3sKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAqcDsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CisKKyAgICB2diA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKKyAgICBpZiAodnYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB2di0+dmFsdWUgPSAwOworCisgICAgaWYgKHItPmhlYWRlcnNfaW4ueF9mb3J3YXJkZWRfZm9yID09IE5VTEwpIHsKKyAgICAgICAgdnYtPnRleHQgPSByLT5jb25uZWN0aW9uLT5hZGRyX3RleHQ7CisgICAgICAgIHJldHVybiB2djsKKyAgICB9CisKKyAgICB2di0+dGV4dC5sZW4gPSByLT5oZWFkZXJzX2luLnhfZm9yd2FyZGVkX2Zvci0+dmFsdWUubGVuCisgICAgICAgICAgICAgICAgICAgKyBzaXplb2YoIiwgIikgLSAxICsgci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0LmxlbjsKKworICAgIHAgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHZ2LT50ZXh0Lmxlbik7CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB2di0+dGV4dC5kYXRhID0gcDsKKworICAgIHAgPSBuZ3hfY3B5bWVtKHAsIHItPmhlYWRlcnNfaW4ueF9mb3J3YXJkZWRfZm9yLT52YWx1ZS5kYXRhLAorICAgICAgICAgICAgICAgICAgIHItPmhlYWRlcnNfaW4ueF9mb3J3YXJkZWRfZm9yLT52YWx1ZS5sZW4pOworCisgICAgKnArKyA9ICcsJzsgKnArKyA9ICcgJzsKKworICAgIG5neF9tZW1jcHkocCwgci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0LmRhdGEsIHItPmNvbm5lY3Rpb24tPmFkZHJfdGV4dC5sZW4pOworCisgICAgcmV0dXJuIHZ2OworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Byb3h5X3Jld3JpdGVfcmVkaXJlY3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfdGFibGVfZWx0X3QgKmgsCisgICAgc2l6ZV90IHByZWZpeCkKK3sKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgcmM7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIGk7CisgICAgbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCAgKnBsY2Y7CisgICAgbmd4X2h0dHBfcHJveHlfcmVkaXJlY3RfdCAgKnByOworCisgICAgcGxjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfcHJveHlfbW9kdWxlKTsKKworICAgIHByID0gcGxjZi0+cmVkaXJlY3RzLT5lbHRzOworCisgICAgaWYgKHByID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9ERUNMSU5FRDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGxjZi0+cmVkaXJlY3RzLT5uZWx0czsgaSsrKSB7CisgICAgICAgIHJjID0gcHItPmhhbmRsZXIociwgaCwgcHJlZml4LCBwcik7CisKKyAgICAgICAgaWYgKHJjICE9IE5HWF9ERUNMSU5FRCkgeworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5HWF9ERUNMSU5FRDsKK30KKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9wcm94eV9yZXdyaXRlX3JlZGlyZWN0X3RleHQobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfdGFibGVfZWx0X3QgKmgsCisgICAgc2l6ZV90IHByZWZpeCwgbmd4X2h0dHBfcHJveHlfcmVkaXJlY3RfdCAqcHIpCit7CisgICAgc2l6ZV90ICAgbGVuOworICAgIHVfY2hhciAgKmRhdGEsICpwOworCisgICAgaWYgKHByLT5yZWRpcmVjdC5sZW4gPiBoLT52YWx1ZS5sZW4gLSBwcmVmaXgKKyAgICAgICAgfHwgbmd4X3JzdHJuY21wKGgtPnZhbHVlLmRhdGEgKyBwcmVmaXgsIHByLT5yZWRpcmVjdC5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgcHItPnJlZGlyZWN0LmxlbikgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBOR1hfREVDTElORUQ7CisgICAgfQorCisgICAgbGVuID0gcHJlZml4ICsgcHItPnJlcGxhY2VtZW50LnRleHQubGVuICsgaC0+dmFsdWUubGVuIC0gcHItPnJlZGlyZWN0LmxlbjsKKworICAgIGRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIGxlbik7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIHAgPSBkYXRhOworCisgICAgaWYgKHByZWZpeCkgeworICAgICAgICBwID0gbmd4X2NweW1lbShwLCBoLT52YWx1ZS5kYXRhLCBwcmVmaXgpOworICAgIH0KKworICAgIHAgPSBuZ3hfY3B5bWVtKHAsIHByLT5yZXBsYWNlbWVudC50ZXh0LmRhdGEsIHByLT5yZXBsYWNlbWVudC50ZXh0Lmxlbik7CisKKyAgICBuZ3hfbWVtY3B5KHAsIGgtPnZhbHVlLmRhdGEgKyBwcmVmaXggKyBwci0+cmVkaXJlY3QubGVuLAorICAgICAgICAgICAgICAgaC0+dmFsdWUubGVuIC0gcHItPnJlZGlyZWN0LmxlbiAtIHByZWZpeCk7CisKKyAgICBoLT52YWx1ZS5sZW4gPSBsZW47CisgICAgaC0+dmFsdWUuZGF0YSA9IGRhdGE7CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Byb3h5X3Jld3JpdGVfcmVkaXJlY3RfdmFycyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF90YWJsZV9lbHRfdCAqaCwKKyAgICBzaXplX3QgcHJlZml4LCBuZ3hfaHR0cF9wcm94eV9yZWRpcmVjdF90ICpwcikKK3sKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICBsZW47CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSwgKnA7CisgICAgbmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQgICAgICAgY29kZTsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgICAgICBlOworICAgIG5neF9odHRwX3NjcmlwdF9sZW5fY29kZV9wdCAgIGxjb2RlOworCisgICAgaWYgKHByLT5yZWRpcmVjdC5sZW4gPiBoLT52YWx1ZS5sZW4gLSBwcmVmaXgKKyAgICAgICAgfHwgbmd4X3JzdHJuY21wKGgtPnZhbHVlLmRhdGEgKyBwcmVmaXgsIHByLT5yZWRpcmVjdC5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgcHItPnJlZGlyZWN0LmxlbikgIT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBOR1hfREVDTElORUQ7CisgICAgfQorCisgICAgbmd4X21lbXplcm8oJmUsIHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QpKTsKKworICAgIGUuaXAgPSBwci0+cmVwbGFjZW1lbnQudmFycy5sZW5ndGhzOworICAgIGUucmVxdWVzdCA9IHI7CisKKyAgICBmb3IgKGxlbiA9IHByZWZpeDsgKih1aW50cHRyX3QgKikgZS5pcDsgbGVuICs9IGxjb2RlKCZlKSkgeworICAgICAgICBsY29kZSA9ICoobmd4X2h0dHBfc2NyaXB0X2xlbl9jb2RlX3B0ICopIGUuaXA7CisgICAgfQorCisgICAgZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgbGVuKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgcCA9IGRhdGE7CisKKyAgICBpZiAocHJlZml4KSB7CisgICAgICAgIHAgPSBuZ3hfY3B5bWVtKHAsIGgtPnZhbHVlLmRhdGEsIHByZWZpeCk7CisgICAgfQorCisgICAgZS5pcCA9IHByLT5yZXBsYWNlbWVudC52YXJzLnZhbHVlczsKKyAgICBlLnBvcyA9IHA7CisKKyAgICB3aGlsZSAoKih1aW50cHRyX3QgKikgZS5pcCkgeworICAgICAgICBjb2RlID0gKihuZ3hfaHR0cF9zY3JpcHRfY29kZV9wdCAqKSBlLmlwOworICAgICAgICBjb2RlKCZlKTsKKyAgICB9CisKKyAgICBoLT52YWx1ZS5sZW4gPSBsZW47CisgICAgaC0+dmFsdWUuZGF0YSA9IGRhdGE7CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Byb3h5X2FkZF92YXJpYWJsZXMobmd4X2NvbmZfdCAqY2YpCit7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgKnZhciwgKnY7CisKKyAgICBmb3IgKHYgPSBuZ3hfaHR0cF9wcm94eV92YXJzOyB2LT5uYW1lLmxlbjsgdisrKSB7CisgICAgICAgIHZhciA9IG5neF9odHRwX2FkZF92YXJpYWJsZShjZiwgJnYtPm5hbWUsIHYtPmZsYWdzKTsKKyAgICAgICAgaWYgKHZhciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgdmFyLT5oYW5kbGVyID0gdi0+aGFuZGxlcjsKKyAgICAgICAgdmFyLT5kYXRhID0gdi0+ZGF0YTsKKyAgICB9CisKKyAgICByZXR1cm4gTkdYX09LOwogfQogCiAKQEAgLTY5OCw2ICsxMjc4LDE1IEBACiAgICAgICogICAgIGNvbmYtPnVwc3RyZWFtLnBhdGggPSBOVUxMOwogICAgICAqICAgICBjb25mLT51cHN0cmVhbS5uZXh0X3Vwc3RyZWFtID0gMDsKICAgICAgKiAgICAgY29uZi0+dXBzdHJlYW0udGVtcF9wYXRoID0gTlVMTDsKKyAgICAgKiAgICAgY29uZi0+dXBzdHJlYW0uc2NoZW1hID0geyAwLCBOVUxMIH07CisgICAgICogICAgIGNvbmYtPnVwc3RyZWFtLnVyaSA9IHsgMCwgTlVMTCB9OworICAgICAqICAgICBjb25mLT51cHN0cmVhbS5sb2NhdGlvbiA9IE5VTEw7CisgICAgICoKKyAgICAgKiAgICAgY29uZi0+aGVhZGVyc19zb3VyY2UgPSBOVUxMOworICAgICAqICAgICBjb25mLT5oZWFkZXJzX3NldF9sZW4gPSBOVUxMOworICAgICAqICAgICBjb25mLT5oZWFkZXJzX3NldCA9IE5VTEw7CisgICAgICogICAgIGNvbmYtPmhlYWRlcnNfc2V0X2hhc2ggPSBOVUxMOworICAgICAqICAgICBjb25mLT5yZXdyaXRlX2xvY2F0aW9ucyA9IE5VTEw7CiAgICAgICovCiAgICAgCiAgICAgY29uZi0+dXBzdHJlYW0uY29ubmVjdF90aW1lb3V0ID0gTkdYX0NPTkZfVU5TRVRfTVNFQzsKQEAgLTcwOSwyMSArMTI5OCwyMyBAQAogICAgIGNvbmYtPnVwc3RyZWFtLmJ1c3lfYnVmZmVyc19zaXplID0gTkdYX0NPTkZfVU5TRVRfU0laRTsKICAgICBjb25mLT51cHN0cmVhbS5tYXhfdGVtcF9maWxlX3NpemUgPSBOR1hfQ09ORl9VTlNFVF9TSVpFOyAgCiAgICAgY29uZi0+dXBzdHJlYW0udGVtcF9maWxlX3dyaXRlX3NpemUgPSBOR1hfQ09ORl9VTlNFVF9TSVpFOworCisgICAgY29uZi0+dXBzdHJlYW0ucGFzc191bnBhcnNlZF91cmkgPSBOR1hfQ09ORl9VTlNFVDsKKyAgICBjb25mLT51cHN0cmVhbS5tZXRob2QgPSBOR1hfQ09ORl9VTlNFVF9VSU5UOworICAgIGNvbmYtPnVwc3RyZWFtLnBhc3NfcmVxdWVzdF9oZWFkZXJzID0gTkdYX0NPTkZfVU5TRVQ7CisgICAgY29uZi0+dXBzdHJlYW0ucGFzc19yZXF1ZXN0X2JvZHkgPSBOR1hfQ09ORl9VTlNFVDsKICAgICAKICAgICBjb25mLT51cHN0cmVhbS5yZWRpcmVjdF9lcnJvcnMgPSBOR1hfQ09ORl9VTlNFVDsKLSAgICBjb25mLT51cHN0cmVhbS5wYXNzX3VucGFyc2VkX3VyaSA9IE5HWF9DT05GX1VOU0VUOwotICAgIGNvbmYtPnVwc3RyZWFtLnhfcG93ZXJlZF9ieSA9IE5HWF9DT05GX1VOU0VUOwogCiAgICAgLyogInByb3h5X2N5Y2xpY190ZW1wX2ZpbGUiIGlzIGRpc2FibGVkICovCiAgICAgY29uZi0+dXBzdHJlYW0uY3ljbGljX3RlbXBfZmlsZSA9IDA7CiAKLSAgICBjb25mLT5wcmVzZXJ2ZV9ob3N0ID0gTkdYX0NPTkZfVU5TRVQ7Ci0gICAgY29uZi0+c2V0X3hfdXJsID0gTkdYX0NPTkZfVU5TRVQ7Ci0gICAgY29uZi0+c2V0X3hfcmVhbF9pcCA9IE5HWF9DT05GX1VOU0VUOwotICAgIGNvbmYtPmFkZF94X2ZvcndhcmRlZF9mb3IgPSBOR1hfQ09ORl9VTlNFVDsKKyAgICBjb25mLT51cHN0cmVhbS5wYXNzX3hfcG93ZXJlZF9ieSA9IE5HWF9DT05GX1VOU0VUOworICAgIGNvbmYtPnVwc3RyZWFtLnBhc3Nfc2VydmVyID0gTkdYX0NPTkZfVU5TRVQ7CisgICAgY29uZi0+dXBzdHJlYW0ucGFzc19kYXRlID0gMDsKKyAgICBjb25mLT51cHN0cmVhbS5wYXNzX3hfYWNjZWxfZXhwaXJlcyA9IE5HWF9DT05GX1VOU0VUOwogCi0gICAgY29uZi0+cGFzc19zZXJ2ZXIgPSBOR1hfQ09ORl9VTlNFVDsKLSAgICBjb25mLT5wYXNzX3hfYWNjZWxfZXhwaXJlcyA9IE5HWF9DT05GX1VOU0VUOworICAgIGNvbmYtPnJlZGlyZWN0ID0gTkdYX0NPTkZfVU5TRVQ7CiAKICAgICByZXR1cm4gY29uZjsKIH0KQEAgLTczNSwxMSArMTMyNiwxNiBAQAogICAgIG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QgKnByZXYgPSBwYXJlbnQ7CiAgICAgbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCAqY29uZiA9IGNoaWxkOwogCi0gICAgc2l6ZV90ICAgICAgICAgICAgc2l6ZTsKLSAgICBuZ3hfc3RyX3QgICAgICAgICpuYW1lOwotICAgIG5neF90YWJsZV9lbHRfdCAgKnNyYzsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAqdmFyOwotICAgIAorICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgKnA7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTsKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICpjb2RlOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgKm5hbWU7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgaTsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICpzcmMsICpzLCAqaDsKKyAgICBuZ3hfaHR0cF9wcm94eV9yZWRpcmVjdF90ICAgICpwcjsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfY29tcGlsZV90ICAgICBzYzsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfY29weV9jb2RlX3QgICpjb3B5OworCiAgICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT51cHN0cmVhbS5jb25uZWN0X3RpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS5jb25uZWN0X3RpbWVvdXQsIDYwMDAwKTsKIApAQCAtODQxLDI0MSArMTQzNywyOTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8TkdYX0hUVFBfVVBTVFJFQU1fRlRfRVJST1IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8TkdYX0hUVFBfVVBTVFJFQU1fRlRfVElNRU9VVCkpOwogCi0gICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT51cHN0cmVhbS5yZWRpcmVjdF9lcnJvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS5yZWRpcmVjdF9lcnJvcnMsIDApOworICAgIG5neF9jb25mX21lcmdlX3BhdGhfdmFsdWUoY29uZi0+dXBzdHJlYW0udGVtcF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0udGVtcF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfUFJPWFlfVEVNUF9QQVRILCAxLCAyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2dhcmJhZ2VfY29sbGVjdG9yX3RlbXBfaGFuZGxlciwgY2YpOwogCiAgICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT51cHN0cmVhbS5wYXNzX3VucGFyc2VkX3VyaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnVwc3RyZWFtLnBhc3NfdW5wYXJzZWRfdXJpLCAwKTsKIAotICAgIGlmIChjb25mLT51cHN0cmVhbS5wYXNzX3VucGFyc2VkX3VyaSAmJiBjb25mLT5sb2NhdGlvbjAtPmxlbiA+IDEpIHsKKyAgICBpZiAoY29uZi0+dXBzdHJlYW0ucGFzc191bnBhcnNlZF91cmkgJiYgY29uZi0+dXBzdHJlYW0ubG9jYXRpb24tPmxlbiA+IDEpIHsKICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICAgICJcInByb3h5X3Bhc3NfdW5wYXJzZWRfdXJpXCIgY2FuIGJlIHNldCBmb3IgIgogICAgICAgICAgICAgICAgICAgICAgICJsb2NhdGlvbiBcIi9cIiBvciBnaXZlbiBieSByZWd1bGFyIGV4cHJlc3Npb24uIik7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKLSAgICBuZ3hfY29uZl9tZXJnZV9tc2VjX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLnhfcG93ZXJlZF9ieSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnVwc3RyZWFtLnhfcG93ZXJlZF9ieSwgMSk7CisgICAgaWYgKGNvbmYtPnVwc3RyZWFtLm1ldGhvZCA9PSBOR1hfQ09ORl9VTlNFVF9VSU5UKSB7CisgICAgICAgIGNvbmYtPnVwc3RyZWFtLm1ldGhvZCA9IHByZXYtPnVwc3RyZWFtLm1ldGhvZDsKKyAgICB9CiAKLSAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5wcmVzZXJ2ZV9ob3N0LCBwcmV2LT5wcmVzZXJ2ZV9ob3N0LCAwKTsKLSAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5zZXRfeF91cmwsIHByZXYtPnNldF94X3VybCwgMCk7Ci0gICAgbmd4X2NvbmZfbWVyZ2VfdmFsdWUoY29uZi0+c2V0X3hfcmVhbF9pcCwgcHJldi0+c2V0X3hfcmVhbF9pcCwgMCk7Ci0gICAgbmd4X2NvbmZfbWVyZ2VfdmFsdWUoY29uZi0+YWRkX3hfZm9yd2FyZGVkX2ZvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPmFkZF94X2ZvcndhcmRlZF9mb3IsIDApOworICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLnBhc3NfcmVxdWVzdF9oZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0ucGFzc19yZXF1ZXN0X2hlYWRlcnMsIDEpOworICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLnBhc3NfcmVxdWVzdF9ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0ucGFzc19yZXF1ZXN0X2JvZHksIDEpOworCisgICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT51cHN0cmVhbS5yZWRpcmVjdF9lcnJvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS5yZWRpcmVjdF9lcnJvcnMsIDApOworCisgICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT51cHN0cmVhbS5wYXNzX3hfcG93ZXJlZF9ieSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPnVwc3RyZWFtLnBhc3NfeF9wb3dlcmVkX2J5LCAxKTsKKyAgICBuZ3hfY29uZl9tZXJnZV9tc2VjX3ZhbHVlKGNvbmYtPnVwc3RyZWFtLnBhc3Nfc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+dXBzdHJlYW0ucGFzc19zZXJ2ZXIsIDApOworICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+dXBzdHJlYW0ucGFzc194X2FjY2VsX2V4cGlyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT51cHN0cmVhbS5wYXNzX3hfYWNjZWxfZXhwaXJlcywgMCk7CisKKworICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPnJlZGlyZWN0LCBwcmV2LT5yZWRpcmVjdCwgMSk7CisKKyAgICBpZiAoY29uZi0+cmVkaXJlY3QpIHsKKworICAgICAgICBpZiAoY29uZi0+cmVkaXJlY3RzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbmYtPnJlZGlyZWN0cyA9IHByZXYtPnJlZGlyZWN0czsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25mLT5yZWRpcmVjdHMgPT0gTlVMTCAmJiBjb25mLT51cHN0cmVhbS51cmwuZGF0YSkgeworCisgICAgICAgICAgICBjb25mLT5yZWRpcmVjdHMgPSBuZ3hfYXJyYXlfY3JlYXRlKGNmLT5wb29sLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfcHJveHlfcmVkaXJlY3RfdCkpOworICAgICAgICAgICAgaWYgKGNvbmYtPnJlZGlyZWN0cyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwciA9IG5neF9hcnJheV9wdXNoKGNvbmYtPnJlZGlyZWN0cyk7CisgICAgICAgICAgICBpZiAocHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHItPmhhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV9yZXdyaXRlX3JlZGlyZWN0X3RleHQ7CisgICAgICAgICAgICBwci0+cmVkaXJlY3QgPSBjb25mLT51cHN0cmVhbS51cmw7CisgICAgICAgICAgICBwci0+cmVwbGFjZW1lbnQudGV4dCA9ICpjb25mLT51cHN0cmVhbS5sb2NhdGlvbjsKKyAgICAgICAgfQorICAgIH0KKwogCiAgICAgaWYgKGNvbmYtPnBlZXJzID09IE5VTEwpIHsKICAgICAgICAgY29uZi0+cGVlcnMgPSBwcmV2LT5wZWVyczsKICAgICAgICAgY29uZi0+dXBzdHJlYW0gPSBwcmV2LT51cHN0cmVhbTsKICAgICB9CiAKLSAgICBpZiAoY29uZi0+aGVhZGVyc19zZXRfaGFzaCA9PSBOVUxMKSB7CisgICAgaWYgKGNvbmYtPmhlYWRlcnNfc291cmNlID09IE5VTEwpIHsKKyAgICAgICAgY29uZi0+aGVhZGVyc19zb3VyY2UgPSBwcmV2LT5oZWFkZXJzX3NvdXJjZTsKICAgICAgICAgY29uZi0+aGVhZGVyc19zZXRfbGVuID0gcHJldi0+aGVhZGVyc19zZXRfbGVuOwogICAgICAgICBjb25mLT5oZWFkZXJzX3NldCA9IHByZXYtPmhlYWRlcnNfc2V0OwogICAgICAgICBjb25mLT5oZWFkZXJzX3NldF9oYXNoID0gcHJldi0+aGVhZGVyc19zZXRfaGFzaDsKICAgICB9CiAKLSAgICBpZiAoY29uZi0+aGVhZGVyc19zZXRfaGFzaCA9PSBOVUxMKSB7Ci0KLSAgICAgICAgaWYgKGNvbmYtPmhlYWRlcnNfbmFtZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgY29uZi0+aGVhZGVyc19uYW1lcyA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X3N0cl90KSk7Ci0gICAgICAgICAgICBpZiAoY29uZi0+aGVhZGVyc19uYW1lcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbmYtPmhlYWRlcnNfc291cmNlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjb25mLT5oZWFkZXJzX3NvdXJjZXMgPSBuZ3hfYXJyYXlfY3JlYXRlKGNmLT5wb29sLCA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X3RhYmxlX2VsdF90KSk7Ci0gICAgICAgICAgICBpZiAoY29uZi0+aGVhZGVyc19zb3VyY2VzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBTVFVCICovCi0gICAgICAgIHZhciA9IG5neF9odHRwX2FkZF92YXJpYWJsZShjZiwgJm5neF9odHRwX3Byb3h5X2hvc3QsIDApOwotICAgICAgICBpZiAodmFyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHZhci0+aGFuZGxlciA9IG5neF9odHRwX3Byb3h5X2hvc3RfdmFyaWFibGU7Ci0gICAgICAgIC8qKi8KLQotCi0gICAgICAgIG5hbWUgPSBuZ3hfYXJyYXlfcHVzaChjb25mLT5oZWFkZXJzX25hbWVzKTsKLSAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgbmFtZS0+bGVuID0gc2l6ZW9mKCJIb3N0IikgLSAxOwotICAgICAgICBuYW1lLT5kYXRhID0gKHVfY2hhciAqKSAiSG9zdCI7Ci0KLSAgICAgICAgc3JjID0gbmd4X2FycmF5X3B1c2goY29uZi0+aGVhZGVyc19zb3VyY2VzKTsKLSAgICAgICAgaWYgKHNyYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBzcmMtPmhhc2ggPSAwOwotICAgICAgICBzcmMtPmtleS5sZW4gPSBzaXplb2YoIkhvc3QiKSAtIDE7Ci0gICAgICAgIHNyYy0+a2V5LmRhdGEgPSAodV9jaGFyICopICJIb3N0IjsKLSAgICAgICAgc3JjLT52YWx1ZS5sZW4gPSBzaXplb2YoIiRQUk9YWV9IT1NUIikgLSAxOwotICAgICAgICBzcmMtPnZhbHVlLmRhdGEgPSAodV9jaGFyICopICIkUFJPWFlfSE9TVCI7Ci0KLQotICAgICAgICBuYW1lID0gbmd4X2FycmF5X3B1c2goY29uZi0+aGVhZGVyc19uYW1lcyk7Ci0gICAgICAgIGlmIChuYW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIG5hbWUtPmxlbiA9IHNpemVvZigiQ29ubmVjdGlvbiIpIC0gMTsKLSAgICAgICAgbmFtZS0+ZGF0YSA9ICh1X2NoYXIgKikgIkNvbm5lY3Rpb24iOwotCi0gICAgICAgIHNyYyA9IG5neF9hcnJheV9wdXNoKGNvbmYtPmhlYWRlcnNfc291cmNlcyk7Ci0gICAgICAgIGlmIChzcmMgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgc3JjLT5oYXNoID0gMDsKLSAgICAgICAgc3JjLT5rZXkubGVuID0gc2l6ZW9mKCJDb25uZWN0aW9uIikgLSAxOwotICAgICAgICBzcmMtPmtleS5kYXRhID0gKHVfY2hhciAqKSAiQ29ubmVjdGlvbiI7Ci0gICAgICAgIHNyYy0+dmFsdWUubGVuID0gc2l6ZW9mKCJjbG9zZSIpIC0gMTsKLSAgICAgICAgc3JjLT52YWx1ZS5kYXRhID0gKHVfY2hhciAqKSAiY2xvc2UiOwotCi0KLSAgICAgICAgbmFtZSA9IG5neF9hcnJheV9wdXNoKGNvbmYtPmhlYWRlcnNfbmFtZXMpOwotICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBuYW1lLT5sZW4gPSAwOwotICAgICAgICBuYW1lLT5kYXRhID0gTlVMTDsKLQotCi0gICAgICAgIGlmIChuZ3hfaHR0cF9zY3JpcHRfY29tcGlsZV9saXRlKGNmLCBjb25mLT5oZWFkZXJzX3NvdXJjZXMsCi0gICAgICAgICAgICAgICAgJmNvbmYtPmhlYWRlcnNfc2V0X2xlbiwgJmNvbmYtPmhlYWRlcnNfc2V0LAotICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X2NvbXBpbGVfaGVhZGVyX3N0YXJ0LAotICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X2NvbXBpbGVfaGVhZGVyX2VuZCkgIT0gTkdYX09LKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGNvbmYtPmhlYWRlcnNfc2V0X2hhc2ggPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9oYXNoX3QpKTsKLSAgICAgICAgaWYgKGNvbmYtPmhlYWRlcnNfc2V0X2hhc2ggPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uZi0+aGVhZGVyc19zZXRfaGFzaC0+bWF4X3NpemUgPSAxMDA7Ci0gICAgICAgIGNvbmYtPmhlYWRlcnNfc2V0X2hhc2gtPmJ1Y2tldF9saW1pdCA9IDE7Ci0gICAgICAgIGNvbmYtPmhlYWRlcnNfc2V0X2hhc2gtPmJ1Y2tldF9zaXplID0gc2l6ZW9mKG5neF9zdHJfdCk7Ci0gICAgICAgIGNvbmYtPmhlYWRlcnNfc2V0X2hhc2gtPm5hbWUgPSAicHJveHlfaGVhZGVycyI7Ci0KLSAgICAgICAgaWYgKG5neF9oYXNoX2luaXQoY29uZi0+aGVhZGVyc19zZXRfaGFzaCwgY2YtPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYtPmhlYWRlcnNfbmFtZXMtPmVsdHMpICE9IE5HWF9PSykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwotICAgICAgICB9Ci0KLSNpZiAwCi0gICAgICAgIG5neF9sb2dfZGVidWcyKE5HWF9MT0dfREVCVUdfSFRUUCwgY2YtPmxvZywgMCwKLSNlbmRpZgotICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfTk9USUNFLCBjZi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAicHJveHlfaGVhZGVycyBoYXNoIHNpemU6ICV1aSwgIgotICAgICAgICAgICAgICAgICAgICAgICAibWF4IGJ1Y2tldHMgcGVyIGVudHJ5OiAldWkiLAotICAgICAgICAgICAgICAgICAgICAgICBjb25mLT5oZWFkZXJzX3NldF9oYXNoLT5oYXNoX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbmYtPmhlYWRlcnNfc2V0X2hhc2gtPm1pbl9idWNrZXRzKTsKKyAgICBpZiAoY29uZi0+aGVhZGVyc19zZXRfaGFzaCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CiAgICAgfQogCisKKyAgICBjb25mLT5oZWFkZXJzX25hbWVzID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgNCwgc2l6ZW9mKG5neF9zdHJfdCkpOworICAgIGlmIChjb25mLT5oZWFkZXJzX25hbWVzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIGlmIChjb25mLT5oZWFkZXJzX3NvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIGNvbmYtPmhlYWRlcnNfc291cmNlID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfdGFibGVfZWx0X3QpKTsKKyAgICAgICAgaWYgKGNvbmYtPmhlYWRlcnNfc291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbmYtPmhlYWRlcnNfc2V0X2xlbiA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDY0LCAxKTsKKyAgICBpZiAoY29uZi0+aGVhZGVyc19zZXRfbGVuID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIGNvbmYtPmhlYWRlcnNfc2V0ID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgNTEyLCAxKTsKKyAgICBpZiAoY29uZi0+aGVhZGVyc19zZXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisKKyAgICBzcmMgPSBjb25mLT5oZWFkZXJzX3NvdXJjZS0+ZWx0czsKKworICAgIGZvciAoaCA9IG5neF9odHRwX3Byb3h5X2hlYWRlcnM7IGgtPmtleS5sZW47IGgrKykgeworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb25mLT5oZWFkZXJzX3NvdXJjZS0+bmVsdHM7IGkrKykgeworICAgICAgICAgICAgaWYgKG5neF9zdHJjYXNlY21wKGgtPmtleS5kYXRhLCBzcmNbaV0ua2V5LmRhdGEpID09IDApIHsKKyAgICAgICAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzID0gbmd4X2FycmF5X3B1c2goY29uZi0+aGVhZGVyc19zb3VyY2UpOworICAgICAgICBpZiAocyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAqcyA9ICpoOworCisgICAgbmV4dDoKKworICAgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY29uZi0+aGVhZGVyc19zb3VyY2UtPm5lbHRzOyBpKyspIHsKKworICAgICAgICBuYW1lID0gbmd4X2FycmF5X3B1c2goY29uZi0+aGVhZGVyc19uYW1lcyk7CisgICAgICAgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgICpuYW1lID0gc3JjW2ldLmtleTsKKworICAgICAgICBpZiAobmd4X2h0dHBfc2NyaXB0X3ZhcmlhYmxlc19jb3VudCgmc3JjW2ldLnZhbHVlKSA9PSAwKSB7CisgICAgICAgICAgICBjb3B5ID0gbmd4X2FycmF5X3B1c2hfbihjb25mLT5oZWFkZXJzX3NldF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KSk7CisgICAgICAgICAgICBpZiAoY29weSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb3B5LT5jb2RlID0gKG5neF9odHRwX3NjcmlwdF9jb2RlX3B0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3NjcmlwdF9jb3B5X2xlbl9jb2RlOworICAgICAgICAgICAgY29weS0+bGVuID0gc3JjW2ldLmtleS5sZW4gKyBzaXplb2YoIjogIikgLSAxCisgICAgICAgICAgICAgICAgICAgICAgICArIHNyY1tpXS52YWx1ZS5sZW4gKyBzaXplb2YoQ1JMRikgLSAxOworCisKKyAgICAgICAgICAgIHNpemUgPSAoc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCkKKyAgICAgICAgICAgICAgICAgICAgICAgKyBzcmNbaV0ua2V5LmxlbiArIHNpemVvZigiOiAiKSAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgKyBzcmNbaV0udmFsdWUubGVuICsgc2l6ZW9mKENSTEYpIC0gMQorICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZih1aW50cHRyX3QpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgJiB+KHNpemVvZih1aW50cHRyX3QpIC0gMSk7CisKKyAgICAgICAgICAgIGNvcHkgPSBuZ3hfYXJyYXlfcHVzaF9uKGNvbmYtPmhlYWRlcnNfc2V0LCBzaXplKTsKKyAgICAgICAgICAgIGlmIChjb3B5ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvcHktPmNvZGUgPSBuZ3hfaHR0cF9zY3JpcHRfY29weV9jb2RlOworICAgICAgICAgICAgY29weS0+bGVuID0gc3JjW2ldLmtleS5sZW4gKyBzaXplb2YoIjogIikgLSAxCisgICAgICAgICAgICAgICAgICAgICAgICArIHNyY1tpXS52YWx1ZS5sZW4gKyBzaXplb2YoQ1JMRikgLSAxOworCisgICAgICAgICAgICBwID0gKHVfY2hhciAqKSBjb3B5ICsgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCk7CisKKyAgICAgICAgICAgIHAgPSBuZ3hfY3B5bWVtKHAsIHNyY1tpXS5rZXkuZGF0YSwgc3JjW2ldLmtleS5sZW4pOworICAgICAgICAgICAgKnArKyA9ICc6JzsgKnArKyA9ICcgJzsKKyAgICAgICAgICAgIHAgPSBuZ3hfY3B5bWVtKHAsIHNyY1tpXS52YWx1ZS5kYXRhLCBzcmNbaV0udmFsdWUubGVuKTsKKyAgICAgICAgICAgICpwKysgPSBDUjsgKnAgPSBMRjsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29weSA9IG5neF9hcnJheV9wdXNoX24oY29uZi0+aGVhZGVyc19zZXRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCkpOworICAgICAgICAgICAgaWYgKGNvcHkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29weS0+Y29kZSA9IChuZ3hfaHR0cF9zY3JpcHRfY29kZV9wdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9zY3JpcHRfY29weV9sZW5fY29kZTsKKyAgICAgICAgICAgIGNvcHktPmxlbiA9IHNyY1tpXS5rZXkubGVuICsgc2l6ZW9mKCI6ICIpIC0gMTsKKworCisgICAgICAgICAgICBzaXplID0gKHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfY29weV9jb2RlX3QpCisgICAgICAgICAgICAgICAgICAgICsgc3JjW2ldLmtleS5sZW4gKyBzaXplb2YoIjogIikgLSAxICsgc2l6ZW9mKHVpbnRwdHJfdCkgLSAxKQorICAgICAgICAgICAgICAgICAgICAmIH4oc2l6ZW9mKHVpbnRwdHJfdCkgLSAxKTsKKworICAgICAgICAgICAgY29weSA9IG5neF9hcnJheV9wdXNoX24oY29uZi0+aGVhZGVyc19zZXQsIHNpemUpOworICAgICAgICAgICAgaWYgKGNvcHkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29weS0+Y29kZSA9IG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGU7CisgICAgICAgICAgICBjb3B5LT5sZW4gPSBzcmNbaV0ua2V5LmxlbiArIHNpemVvZigiOiAiKSAtIDE7CisKKyAgICAgICAgICAgIHAgPSAodV9jaGFyICopIGNvcHkgKyBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KTsKKyAgICAgICAgICAgIHAgPSBuZ3hfY3B5bWVtKHAsIHNyY1tpXS5rZXkuZGF0YSwgc3JjW2ldLmtleS5sZW4pOworICAgICAgICAgICAgKnArKyA9ICc6JzsgKnAgPSAnICc7CisKKworICAgICAgICAgICAgbmd4X21lbXplcm8oJnNjLCBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvbXBpbGVfdCkpOworCisgICAgICAgICAgICBzYy5jZiA9IGNmOworICAgICAgICAgICAgc2Muc291cmNlID0gJnNyY1tpXS52YWx1ZTsKKyAgICAgICAgICAgIHNjLmxlbmd0aHMgPSAmY29uZi0+aGVhZGVyc19zZXRfbGVuOworICAgICAgICAgICAgc2MudmFsdWVzID0gJmNvbmYtPmhlYWRlcnNfc2V0OworCisgICAgICAgICAgICBpZiAobmd4X2h0dHBfc2NyaXB0X2NvbXBpbGUoJnNjKSAhPSBOR1hfT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgY29weSA9IG5neF9hcnJheV9wdXNoX24oY29uZi0+aGVhZGVyc19zZXRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCkpOworICAgICAgICAgICAgaWYgKGNvcHkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29weS0+Y29kZSA9IChuZ3hfaHR0cF9zY3JpcHRfY29kZV9wdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9zY3JpcHRfY29weV9sZW5fY29kZTsKKyAgICAgICAgICAgIGNvcHktPmxlbiA9IHNpemVvZihDUkxGKSAtIDE7CisKKworICAgICAgICAgICAgc2l6ZSA9IChzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KQorICAgICAgICAgICAgICAgICAgICArIHNpemVvZihDUkxGKSAtIDEgKyBzaXplb2YodWludHB0cl90KSAtIDEpCisgICAgICAgICAgICAgICAgICAgICYgfihzaXplb2YodWludHB0cl90KSAtIDEpOworCisgICAgICAgICAgICBjb3B5ID0gbmd4X2FycmF5X3B1c2hfbihjb25mLT5oZWFkZXJzX3NldCwgc2l6ZSk7CisgICAgICAgICAgICBpZiAoY29weSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb3B5LT5jb2RlID0gbmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZTsKKyAgICAgICAgICAgIGNvcHktPmxlbiA9IHNpemVvZihDUkxGKSAtIDE7CisKKyAgICAgICAgICAgIHAgPSAodV9jaGFyICopIGNvcHkgKyBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KTsKKyAgICAgICAgICAgICpwKysgPSBDUjsgKnAgPSBMRjsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGUgPSBuZ3hfYXJyYXlfcHVzaF9uKGNvbmYtPmhlYWRlcnNfc2V0X2xlbiwgc2l6ZW9mKHVpbnRwdHJfdCkpOworICAgICAgICBpZiAoY29kZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAqY29kZSA9ICh1aW50cHRyX3QpIE5VTEw7CisKKyAgICAgICAgY29kZSA9IG5neF9hcnJheV9wdXNoX24oY29uZi0+aGVhZGVyc19zZXQsIHNpemVvZih1aW50cHRyX3QpKTsKKyAgICAgICAgaWYgKGNvZGUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgKmNvZGUgPSAodWludHB0cl90KSBOVUxMOworICAgIH0KKworICAgIGNvZGUgPSBuZ3hfYXJyYXlfcHVzaF9uKGNvbmYtPmhlYWRlcnNfc2V0X2xlbiwgc2l6ZW9mKHVpbnRwdHJfdCkpOworICAgIGlmIChjb2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgICpjb2RlID0gKHVpbnRwdHJfdCkgTlVMTDsKKworCisgICAgY29uZi0+aGVhZGVyc19zZXRfaGFzaCA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2hhc2hfdCkpOworICAgIGlmIChjb25mLT5oZWFkZXJzX3NldF9oYXNoID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworICAgIGNvbmYtPmhlYWRlcnNfc2V0X2hhc2gtPm1heF9zaXplID0gMTAwOworICAgIGNvbmYtPmhlYWRlcnNfc2V0X2hhc2gtPmJ1Y2tldF9saW1pdCA9IDE7CisgICAgY29uZi0+aGVhZGVyc19zZXRfaGFzaC0+YnVja2V0X3NpemUgPSBzaXplb2Yobmd4X3N0cl90KTsKKyAgICBjb25mLT5oZWFkZXJzX3NldF9oYXNoLT5uYW1lID0gInByb3h5X2hlYWRlcnMiOworCisgICAgaWYgKG5neF9oYXNoX2luaXQoY29uZi0+aGVhZGVyc19zZXRfaGFzaCwgY2YtPnBvb2wsCisgICAgICAgICAgICAgIGNvbmYtPmhlYWRlcnNfbmFtZXMtPmVsdHMsIGNvbmYtPmhlYWRlcnNfbmFtZXMtPm5lbHRzKSAhPSBOR1hfT0spCisgICAgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCBjZi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJwcm94eV9oZWFkZXJzIGhhc2ggc2l6ZTogJXVpLCAiCisgICAgICAgICAgICAgICAgICAgIm1heCBidWNrZXRzIHBlciBlbnRyeTogJXVpIiwKKyAgICAgICAgICAgICAgICAgICBjb25mLT5oZWFkZXJzX3NldF9oYXNoLT5oYXNoX3NpemUsCisgICAgICAgICAgICAgICAgICAgY29uZi0+aGVhZGVyc19zZXRfaGFzaC0+bWluX2J1Y2tldHMpOworCiAgICAgcmV0dXJuIE5HWF9DT05GX09LOwogfQogCiAKLXN0YXRpYyBuZ3hfaW50X3QKLW5neF9odHRwX3Byb3h5X2NvbXBpbGVfaGVhZGVyX3N0YXJ0KG5neF90YWJsZV9lbHRfdCAqaCwKLSAgICBuZ3hfYXJyYXlfdCAqbGVuZ3Rocywgbmd4X2FycmF5X3QgKnZhbHVlcywgbmd4X3VpbnRfdCB2YWx1ZSkKLXsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICpwOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgIHNpemU7Ci0gICAgbmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90ICAqY29weTsKLQotICAgIGNvcHkgPSBuZ3hfYXJyYXlfcHVzaF9uKGxlbmd0aHMsIHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfY29weV9jb2RlX3QpKTsKLSAgICBpZiAoY29weSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgfQotCi0gICAgY29weS0+Y29kZSA9IChuZ3hfaHR0cF9zY3JpcHRfY29kZV9wdCkgbmd4X2h0dHBfc2NyaXB0X2NvcHlfbGVuOwotICAgIGNvcHktPmxlbiA9IGgtPmtleS5sZW4gKyBzaXplb2YoIjogIikgLSAxOwotCi0gICAgaWYgKHZhbHVlKSB7Ci0gICAgICAgIGNvcHktPmxlbiArPSBoLT52YWx1ZS5sZW4gKyBzaXplb2YoQ1JMRikgLSAxOwotICAgIH0KLQotICAgIHNpemUgPSAoY29weS0+bGVuICsgc2l6ZW9mKHVpbnRwdHJfdCkgLSAxKSAmIH4oc2l6ZW9mKHVpbnRwdHJfdCkgLSAxKTsKLQotICAgIGNvcHkgPSBuZ3hfYXJyYXlfcHVzaF9uKHZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KSArIHNpemUpOwotICAgIGlmIChjb3B5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICB9Ci0KLSAgICBjb3B5LT5jb2RlID0gbmd4X2h0dHBfc2NyaXB0X2NvcHk7Ci0gICAgY29weS0+bGVuID0gaC0+a2V5LmxlbiArIHNpemVvZigiOiAiKSAtIDE7Ci0KLSAgICBpZiAodmFsdWUpIHsKLSAgICAgICAgY29weS0+bGVuICs9IGgtPnZhbHVlLmxlbiArIHNpemVvZihDUkxGKSAtIDE7Ci0gICAgfQotCi0gICAgcCA9ICh1X2NoYXIgKikgY29weSArIHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfY29weV9jb2RlX3QpOwotCi0gICAgcCA9IG5neF9jcHltZW0ocCwgaC0+a2V5LmRhdGEsIGgtPmtleS5sZW4pOwotICAgIHAgPSBuZ3hfY3B5bWVtKHAsICI6ICIsIHNpemVvZigiOiAiKSAtIDEpOwotCi0gICAgaWYgKHZhbHVlKSB7Ci0gICAgICAgIHAgPSBuZ3hfY3B5bWVtKHAsIGgtPnZhbHVlLmRhdGEsIGgtPnZhbHVlLmxlbik7Ci0gICAgICAgIG5neF9tZW1jcHkocCwgQ1JMRiwgc2l6ZW9mKENSTEYpIC0gMSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5HWF9PSzsKLX0KLQotCi1zdGF0aWMgbmd4X2ludF90Ci1uZ3hfaHR0cF9wcm94eV9jb21waWxlX2hlYWRlcl9lbmQobmd4X2FycmF5X3QgKmxlbmd0aHMsIG5neF9hcnJheV90ICp2YWx1ZXMpCi17Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTsKLSAgICBuZ3hfaHR0cF9zY3JpcHRfY29weV9jb2RlX3QgICpjb3B5OwotCi0gICAgY29weSA9IG5neF9hcnJheV9wdXNoX24obGVuZ3Rocywgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCkpOwotICAgIGlmIChjb3B5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICB9Ci0KLSAgICBjb3B5LT5jb2RlID0gKG5neF9odHRwX3NjcmlwdF9jb2RlX3B0KSBuZ3hfaHR0cF9zY3JpcHRfY29weV9sZW47Ci0gICAgY29weS0+bGVuID0gc2l6ZW9mKENSTEYpIC0gMTsKLQotICAgIHNpemUgPSAoc2l6ZW9mKENSTEYpIC0gMSArIHNpemVvZih1aW50cHRyX3QpIC0gMSkKLSAgICAgICAgICAgICYgfihzaXplb2YodWludHB0cl90KSAtIDEpOwotCi0gICAgY29weSA9IG5neF9hcnJheV9wdXNoX24odmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfY29weV9jb2RlX3QpICsgc2l6ZSk7Ci0gICAgaWYgKGNvcHkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgIH0KLQotICAgIGNvcHktPmNvZGUgPSBuZ3hfaHR0cF9zY3JpcHRfY29weTsKLSAgICBjb3B5LT5sZW4gPSBzaXplb2YoQ1JMRikgLSAxOwotCi0gICAgbmd4X21lbWNweSgodV9jaGFyICopIGNvcHkgKyBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KSwKLSAgICAgICAgICAgICAgIENSTEYsIHNpemVvZihDUkxGKSAtIDEpOwotCi0gICAgcmV0dXJuIE5HWF9PSzsKLX0KLQotCiBzdGF0aWMgY2hhciAqCiBuZ3hfaHR0cF9wcm94eV9wYXNzKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCiB7Ci0gICAgbmd4X2h0dHBfcHJveHlfbG9jX2NvbmZfdCAqbGNmID0gY29uZjsKKyAgICBuZ3hfaHR0cF9wcm94eV9sb2NfY29uZl90ICpwbGNmID0gY29uZjsKIAogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgaTsKICAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgKnZhbHVlLCAqdXJsOwpAQCAtMTEwNSwyMCArMTc1NywxNiBAQAogICAgICAgICB1bml4X3Vwc3RyZWFtLnVybC5kYXRhID0gdXJsLT5kYXRhICsgNzsKICAgICAgICAgdW5peF91cHN0cmVhbS51cmlfcGFydCA9IDE7CiAKLSAgICAgICAgbGNmLT5wZWVycyA9IG5neF91bml4X3Vwc3RyZWFtX3BhcnNlKGNmLCAmdW5peF91cHN0cmVhbSk7Ci0gICAgICAgIGlmIChsY2YtPnBlZXJzID09IE5VTEwpIHsKKyAgICAgICAgcGxjZi0+cGVlcnMgPSBuZ3hfdW5peF91cHN0cmVhbV9wYXJzZShjZiwgJnVuaXhfdXBzdHJlYW0pOworICAgICAgICBpZiAocGxjZi0+cGVlcnMgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgbGNmLT5wZWVycy0+cGVlclswXS51cmlfc2VwYXJhdG9yID0gIjoiOworICAgICAgICBwbGNmLT5wZWVycy0+cGVlclswXS51cmlfc2VwYXJhdG9yID0gIjoiOwogCi0gICAgICAgIGxjZi0+aG9zdF9oZWFkZXIubGVuID0gc2l6ZW9mKCJsb2NhbGhvc3QiKSAtIDE7Ci0gICAgICAgIGxjZi0+aG9zdF9oZWFkZXIuZGF0YSA9ICh1X2NoYXIgKikgImxvY2FsaG9zdCI7Ci0gICAgICAgIGxjZi0+dXJpMCA9IHVuaXhfdXBzdHJlYW0udXJpOwotI2lmIDAKLQlTVFVCCi0gICAgICAgIGxjZi0+dXBzdHJlYW0tPmRlZmF1bHRfcG9ydCA9IDE7Ci0jZW5kaWYKKyAgICAgICAgcGxjZi0+aG9zdF9oZWFkZXIubGVuID0gc2l6ZW9mKCJsb2NhbGhvc3QiKSAtIDE7CisgICAgICAgIHBsY2YtPmhvc3RfaGVhZGVyLmRhdGEgPSAodV9jaGFyICopICJsb2NhbGhvc3QiOworICAgICAgICBwbGNmLT51cHN0cmVhbS51cmkgPSB1bml4X3Vwc3RyZWFtLnVyaTsKIAogI2Vsc2UKICAgICAgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGNmLCAwLApAQCAtMTEzNywzNCArMTc4NSwzNSBAQAogICAgICAgICBpbmV0X3Vwc3RyZWFtLmRlZmF1bHRfcG9ydF92YWx1ZSA9IDgwOwogICAgICAgICBpbmV0X3Vwc3RyZWFtLnVyaV9wYXJ0ID0gMTsKIAotICAgICAgICBsY2YtPnBlZXJzID0gbmd4X2luZXRfdXBzdHJlYW1fcGFyc2UoY2YsICZpbmV0X3Vwc3RyZWFtKTsKLSAgICAgICAgaWYgKGxjZi0+cGVlcnMgPT0gTlVMTCkgeworICAgICAgICBwbGNmLT5wZWVycyA9IG5neF9pbmV0X3Vwc3RyZWFtX3BhcnNlKGNmLCAmaW5ldF91cHN0cmVhbSk7CisgICAgICAgIGlmIChwbGNmLT5wZWVycyA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGNmLT5wZWVycy0+bnVtYmVyOyBpKyspIHsKLSAgICAgICAgICAgIGxjZi0+cGVlcnMtPnBlZXJbaV0udXJpX3NlcGFyYXRvciA9ICI6IjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsY2YtPnBlZXJzLT5udW1iZXI7IGkrKykgeworICAgICAgICAgICAgcGxjZi0+cGVlcnMtPnBlZXJbaV0udXJpX3NlcGFyYXRvciA9ICI6IjsKICAgICAgICAgfQogCi0gICAgICAgIGxjZi0+aG9zdF9oZWFkZXIgPSBpbmV0X3Vwc3RyZWFtLmhvc3RfaGVhZGVyOwotICAgICAgICBsY2YtPnVyaTAgPSBpbmV0X3Vwc3RyZWFtLnVyaTsKLSNpZiAwCi0JU1RVQgotICAgICAgICBsY2YtPnBvcnRfdGV4dCA9IGluZXRfdXBzdHJlYW0ucG9ydF90ZXh0OwotICAgICAgICBsY2YtPnVwc3RyZWFtLT5kZWZhdWx0X3BvcnQgPSBpbmV0X3Vwc3RyZWFtLmRlZmF1bHRfcG9ydDsKLSNlbmRpZgorICAgICAgICBwbGNmLT5ob3N0X2hlYWRlciA9IGluZXRfdXBzdHJlYW0uaG9zdF9oZWFkZXI7CisgICAgICAgIHBsY2YtPnBvcnRfdGV4dCA9IGluZXRfdXBzdHJlYW0ucG9ydF90ZXh0OworICAgICAgICBwbGNmLT51cHN0cmVhbS51cmkgPSBpbmV0X3Vwc3RyZWFtLnVyaTsKICAgICB9CiAKKyAgICBwbGNmLT51cHN0cmVhbS5zY2hlbWEubGVuID0gc2l6ZW9mKCJodHRwOi8vIikgLSAxOworICAgIHBsY2YtPnVwc3RyZWFtLnNjaGVtYS5kYXRhID0gKHVfY2hhciAqKSAiaHR0cDovLyI7CisKICAgICBjbGNmID0gbmd4X2h0dHBfY29uZl9nZXRfbW9kdWxlX2xvY19jb25mKGNmLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CiAKICAgICBjbGNmLT5oYW5kbGVyID0gbmd4X2h0dHBfcHJveHlfaGFuZGxlcjsKIAogI2lmIChOR1hfUENSRSkKLSAgICBsY2YtPmxvY2F0aW9uMCA9IGNsY2YtPnJlZ2V4ID8gJm5neF9odHRwX3Byb3h5X3VyaSA6ICZjbGNmLT5uYW1lOworICAgIHBsY2YtPnVwc3RyZWFtLmxvY2F0aW9uID0gY2xjZi0+cmVnZXggPyAmbmd4X2h0dHBfcHJveHlfdXJpIDogJmNsY2YtPm5hbWU7CiAjZWxzZQotICAgIGxjZi0+bG9jYXRpb24wID0gJmNsY2YtPm5hbWU7CisgICAgcGxjZi0+dXBzdHJlYW0ubG9jYXRpb24gPSAmY2xjZi0+bmFtZTsKICNlbmRpZgogCisgICAgcGxjZi0+dXBzdHJlYW0udXJsID0gKnVybDsKKwogICAgIGlmIChjbGNmLT5uYW1lLmRhdGFbY2xjZi0+bmFtZS5sZW4gLSAxXSA9PSAnLycpIHsKICAgICAgICAgY2xjZi0+YXV0b19yZWRpcmVjdCA9IDE7CiAgICAgfQpAQCAtMTE3NCw4ICsxODIzLDg0IEBACiAKIAogc3RhdGljIGNoYXIgKgotbmd4X2h0dHBfcHJveHlfc2V0X3hfdmFyKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCituZ3hfaHR0cF9wcm94eV9yZWRpcmVjdChuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQogeworICAgIG5neF9odHRwX3Byb3h5X2xvY19jb25mX3QgKnBsY2YgPSBjb25mOworCisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgKnZhbHVlOworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICp2YXJzX2xlbmd0aHMsICp2YXJzX3ZhbHVlczsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfY29tcGlsZV90ICAgc2M7CisgICAgbmd4X2h0dHBfcHJveHlfcmVkaXJlY3RfdCAgKnByOworCisgICAgaWYgKHBsY2YtPnJlZGlyZWN0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX09LOworICAgIH0KKworICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7CisKKyAgICBpZiAobmd4X3N0cmNtcCh2YWx1ZVsxXS5kYXRhLCAib2ZmIikgPT0gMCkgeworICAgICAgICBwbGNmLT5yZWRpcmVjdCA9IDA7CisgICAgICAgIHBsY2YtPnJlZGlyZWN0cyA9IE5VTEw7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9PSzsKKyAgICB9CisKKyAgICBpZiAocGxjZi0+cmVkaXJlY3RzID09IE5VTEwpIHsKKyAgICAgICAgcGxjZi0+cmVkaXJlY3RzID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfcHJveHlfcmVkaXJlY3RfdCkpOworICAgICAgICBpZiAocGxjZi0+cmVkaXJlY3RzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByID0gbmd4X2FycmF5X3B1c2gocGxjZi0+cmVkaXJlY3RzKTsKKyAgICBpZiAocHIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgaWYgKGNmLT5hcmdzLT5uZWx0cyA9PSAyICYmIG5neF9zdHJjbXAodmFsdWVbMV0uZGF0YSwgImRlZmF1bHQiKSA9PSAwKSB7CisgICAgICAgIGlmIChwbGNmLT51cHN0cmVhbS51cmwuZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICBuZ3hfY29uZl9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwicHJveHlfcmV3cml0ZV9sb2NhdGlvbiBkZWZhdWx0XCIgbXVzdCBnbyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyIHRoZSBcInByb3h5X3Bhc3NcIiBkaXJlY3RpdmUiKTsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHByLT5oYW5kbGVyID0gbmd4X2h0dHBfcHJveHlfcmV3cml0ZV9yZWRpcmVjdF90ZXh0OworICAgICAgICBwci0+cmVkaXJlY3QgPSBwbGNmLT51cHN0cmVhbS51cmw7CisgICAgICAgIHByLT5yZXBsYWNlbWVudC50ZXh0ID0gKnBsY2YtPnVwc3RyZWFtLmxvY2F0aW9uOworCisgICAgICAgIHJldHVybiBOR1hfQ09ORl9PSzsKKyAgICB9CisKKyAgICBpZiAobmd4X2h0dHBfc2NyaXB0X3ZhcmlhYmxlc19jb3VudCgmdmFsdWVbMl0pID09IDApIHsKKyAgICAgICAgcHItPmhhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV9yZXdyaXRlX3JlZGlyZWN0X3RleHQ7CisgICAgICAgIHByLT5yZWRpcmVjdCA9IHZhbHVlWzFdOworICAgICAgICBwci0+cmVwbGFjZW1lbnQudGV4dCA9IHZhbHVlWzJdOworCisgICAgICAgIHJldHVybiBOR1hfQ09ORl9PSzsKKyAgICB9CisKKyAgICBuZ3hfbWVtemVybygmc2MsIHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfY29tcGlsZV90KSk7CisKKyAgICB2YXJzX2xlbmd0aHMgPSBOVUxMOworICAgIHZhcnNfdmFsdWVzID0gTlVMTDsKKworICAgIHNjLmNmID0gY2Y7CisgICAgc2Muc291cmNlID0gJnZhbHVlWzJdOworICAgIHNjLmxlbmd0aHMgPSAmdmFyc19sZW5ndGhzOworICAgIHNjLnZhbHVlcyA9ICZ2YXJzX3ZhbHVlczsKKyAgICBzYy5jb21wbGV0ZV9sZW5ndGhzID0gMTsKKyAgICBzYy5jb21wbGV0ZV92YWx1ZXMgPSAxOworCisgICAgaWYgKG5neF9odHRwX3NjcmlwdF9jb21waWxlKCZzYykgIT0gTkdYX09LKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBwci0+aGFuZGxlciA9IG5neF9odHRwX3Byb3h5X3Jld3JpdGVfcmVkaXJlY3RfdmFyczsKKyAgICBwci0+cmVkaXJlY3QgPSB2YWx1ZVsxXTsKKyAgICBwci0+cmVwbGFjZW1lbnQudmFycy5sZW5ndGhzID0gdmFyc19sZW5ndGhzLT5lbHRzOworICAgIHByLT5yZXBsYWNlbWVudC52YXJzLnZhbHVlcyA9IHZhcnNfdmFsdWVzLT5lbHRzOworCiAgICAgcmV0dXJuIE5HWF9DT05GX09LOwogfQogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3JhbmdlX2ZpbHRlcl9tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmFuZ2VfZmlsdGVyX21vZHVsZS5jCmluZGV4IDg0MzgxYzkuLmNmYzIzZjYgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmFuZ2VfZmlsdGVyX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmFuZ2VfZmlsdGVyX21vZHVsZS5jCkBAIC01NCw3ICs1NCw4IEBACiAKIAogc3RhdGljIG5neF9odHRwX21vZHVsZV90ICBuZ3hfaHR0cF9yYW5nZV9oZWFkZXJfZmlsdGVyX21vZHVsZV9jdHggPSB7Ci0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlIGNvbmYgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmVjb25maWd1cmF0aW9uICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdGNvbmZpZ3VyYXRpb24gKi8KIAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLwpAQCAtNjgsNyArNjksNyBAQAogCiAKIG5neF9tb2R1bGVfdCAgbmd4X2h0dHBfcmFuZ2VfaGVhZGVyX2ZpbHRlcl9tb2R1bGUgPSB7Ci0gICAgTkdYX01PRFVMRSwKKyAgICBOR1hfTU9EVUxFX1YxLAogICAgICZuZ3hfaHR0cF9yYW5nZV9oZWFkZXJfZmlsdGVyX21vZHVsZV9jdHgsIC8qIG1vZHVsZSBjb250ZXh0ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KICAgICBOR1hfSFRUUF9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgdHlwZSAqLwpAQCAtNzgsNyArNzksOCBAQAogCiAKIHN0YXRpYyBuZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfcmFuZ2VfYm9keV9maWx0ZXJfbW9kdWxlX2N0eCA9IHsKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmUgY29uZiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZWNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3N0Y29uZmlndXJhdGlvbiAqLwogCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIG1haW4gY29uZmlndXJhdGlvbiAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbWFpbiBjb25maWd1cmF0aW9uICovCkBAIC05Miw3ICs5NCw3IEBACiAKIAogbmd4X21vZHVsZV90ICBuZ3hfaHR0cF9yYW5nZV9ib2R5X2ZpbHRlcl9tb2R1bGUgPSB7Ci0gICAgTkdYX01PRFVMRSwKKyAgICBOR1hfTU9EVUxFX1YxLAogICAgICZuZ3hfaHR0cF9yYW5nZV9ib2R5X2ZpbHRlcl9tb2R1bGVfY3R4LCAvKiBtb2R1bGUgY29udGV4dCAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0hUVFBfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KQEAgLTEyMCw2ICsxMjIsNyBAQAogCiAgICAgaWYgKHItPmh0dHBfdmVyc2lvbiA8IE5HWF9IVFRQX1ZFUlNJT05fMTAKICAgICAgICAgfHwgci0+aGVhZGVyc19vdXQuc3RhdHVzICE9IE5HWF9IVFRQX09LCisgICAgICAgIHx8IHItPm1haW4KICAgICAgICAgfHwgci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGhfbiA9PSAtMQogICAgICAgICB8fCAhci0+ZmlsdGVyX2FsbG93X3JhbmdlcykKICAgICB7CkBAIC0xMzYsNiArMTM5LDcgQEAKICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICByLT5oZWFkZXJzX291dC5hY2NlcHRfcmFuZ2VzLT5oYXNoID0gMTsKICAgICAgICAgci0+aGVhZGVyc19vdXQuYWNjZXB0X3Jhbmdlcy0+a2V5LmxlbiA9IHNpemVvZigiQWNjZXB0LVJhbmdlcyIpIC0gMTsKICAgICAgICAgci0+aGVhZGVyc19vdXQuYWNjZXB0X3Jhbmdlcy0+a2V5LmRhdGEgPSAodV9jaGFyICopICJBY2NlcHQtUmFuZ2VzIjsKICAgICAgICAgci0+aGVhZGVyc19vdXQuYWNjZXB0X3Jhbmdlcy0+dmFsdWUubGVuID0gc2l6ZW9mKCJieXRlcyIpIC0gMTsKQEAgLTI2OSw2ICsyNzMsNyBAQAogCiAgICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfcmFuZ2UgPSBjb250ZW50X3JhbmdlOwogCisgICAgICAgIGNvbnRlbnRfcmFuZ2UtPmhhc2ggPSAxOwogICAgICAgICBjb250ZW50X3JhbmdlLT5rZXkubGVuID0gc2l6ZW9mKCJDb250ZW50LVJhbmdlIikgLSAxOwogICAgICAgICBjb250ZW50X3JhbmdlLT5rZXkuZGF0YSA9ICh1X2NoYXIgKikgIkNvbnRlbnQtUmFuZ2UiOwogCkBAIC0zMDMsNiArMzA4LDcgQEAKIAogICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3JhbmdlID0gY29udGVudF9yYW5nZTsKIAorICAgICAgICBjb250ZW50X3JhbmdlLT5oYXNoID0gMTsKICAgICAgICAgY29udGVudF9yYW5nZS0+a2V5LmxlbiA9IHNpemVvZigiQ29udGVudC1SYW5nZSIpIC0gMTsKICAgICAgICAgY29udGVudF9yYW5nZS0+a2V5LmRhdGEgPSAodV9jaGFyICopICJDb250ZW50LVJhbmdlIjsKIApAQCAtMzM4LDcgKzM0NCw3IEBACiAKICAgICBsZW4gPSBzaXplb2YoQ1JMRiAiLS0iKSAtIDEgKyBOR1hfQVRPTUlDX1RfTEVOCiAgICAgICAgICAgKyBzaXplb2YoQ1JMRiAiQ29udGVudC1UeXBlOiAiKSAtIDEKLSAgICAgICAgICArIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS0+dmFsdWUubGVuCisgICAgICAgICAgKyByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUubGVuCiAgICAgICAgICAgKyBzaXplb2YoQ1JMRiAiQ29udGVudC1SYW5nZTogYnl0ZXMgIikgLSAxOwogCiAgICAgaWYgKHItPmhlYWRlcnNfb3V0LmNoYXJzZXQubGVuKSB7CkBAIC0zNjYsNyArMzcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlOiAlVjsgY2hhcnNldD0lViIgQ1JMRgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50LVJhbmdlOiBieXRlcyAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUtPnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnItPmhlYWRlcnNfb3V0LmNoYXJzZXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gY3R4LT5ib3VuZGFyeV9oZWFkZXIuZGF0YTsKIApAQCAtMzc4LDI2ICszODQsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlOiAlViIgQ1JMRgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50LVJhbmdlOiBieXRlcyAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUtPnZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gY3R4LT5ib3VuZGFyeV9oZWFkZXIuZGF0YTsKICAgICB9CiAKLSAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUtPnZhbHVlLmRhdGEgPQotICAgICAgICAgbmd4X3BhbGxvYyhyLT5wb29sLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2J5dGVyYW5nZXM7IGJvdW5kYXJ5PSIpIC0gMQotICAgICAgICAgICAgICAgICAgICArIE5HWF9BVE9NSUNfVF9MRU4pOworICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS5kYXRhID0KKyAgICAgICAgbmd4X3BhbGxvYyhyLT5wb29sLAorICAgICAgICAgICAgICAgICAgIHNpemVvZigiQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYnl0ZXJhbmdlczsgYm91bmRhcnk9IikgLSAxCisgICAgICAgICAgICAgICAgICAgKyBOR1hfQVRPTUlDX1RfTEVOKTsKIAotICAgIGlmIChyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUtPnZhbHVlLmRhdGEgPT0gTlVMTCkgeworICAgIGlmIChyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUuZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCiAgICAgLyogIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2J5dGVyYW5nZXM7IGJvdW5kYXJ5PTAxMjM0NTY3ODkiICovCiAKLSAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUtPnZhbHVlLmxlbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfc3ByaW50ZihyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUtPnZhbHVlLmRhdGEsCisgICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmxlbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfc3ByaW50ZihyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aXBhcnQvYnl0ZXJhbmdlczsgYm91bmRhcnk9JTBtdUEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAtIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS0+dmFsdWUuZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmRhdGE7CiAKIAogICAgIC8qIHRoZSBzaXplIG9mIHRoZSBsYXN0IGJvdW5kYXJ5IENSTEYgIi0tMDEyMzQ1Njc4OS0tIiBDUkxGICovCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Jld3JpdGVfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3Jld3JpdGVfbW9kdWxlLmMKaW5kZXggMWRhNDc1Yy4uMmRjN2E3ZiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9yZXdyaXRlX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfcmV3cml0ZV9tb2R1bGUuYwpAQCAtOSwxMzYgKzksMzYgQEAKICNpbmNsdWRlIDxuZ3hfaHR0cC5oPgogCiAKLXR5cGVkZWYgc3RydWN0IG5neF9odHRwX3Jld3JpdGVfZW5naW5lX3MgIG5neF9odHRwX3Jld3JpdGVfZW5naW5lX3Q7Ci0KLXR5cGVkZWYgdm9pZCAoKm5neF9odHRwX3Jld3JpdGVfY29kZV9wdCkgKG5neF9odHRwX3Jld3JpdGVfZW5naW5lX3QgKmUpOwotCi0KIHR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICBuYW1lOwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgIHdpbGRjYXJkOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICBuYW1lOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICB3aWxkY2FyZDsKIH0gbmd4X2h0dHBfcmV3cml0ZV9yZWZlcmVyX3Q7CiAKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgKm5hbWU7Ci0gICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgICAqdmFsdWU7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgKm5hbWU7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnZhbHVlOwogfSBuZ3hfaHR0cF9yZXdyaXRlX3ZhcmlhYmxlX3Q7CiAKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAgKmNvZGVzOyAgICAgICAgLyogdWludHB0cl90ICovCi0gICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgICAqcmVmZXJlcnM7ICAgICAvKiBuZ3hfaHR0cF9yZXdyaXRlX3JlZmVyZXJfdCAqLworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICpjb2RlczsgICAgICAgIC8qIHVpbnRwdHJfdCAqLworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICpyZWZlcmVyczsgICAgIC8qIG5neF9odHRwX3Jld3JpdGVfcmVmZXJlcl90ICovCiAKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICBtYXhfY2FwdHVyZXM7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgc3RhY2tfc2l6ZTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgbWF4X2NhcHR1cmVzOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBzdGFja19zaXplOwogCi0gICAgbmd4X2ZsYWdfdCAgICAgICAgICAgICAgICAgICAgbG9nOworICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgICBsb2c7CiAKLSAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICAgICBub19yZWZlcmVyOwotICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgICAgIGJsb2NrZWRfcmVmZXJlcjsKKyAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICAgbm9fcmVmZXJlcjsKKyAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICAgYmxvY2tlZF9yZWZlcmVyOwogfSBuZ3hfaHR0cF9yZXdyaXRlX2xvY19jb25mX3Q7CiAKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9odHRwX3Jld3JpdGVfY29kZV9wdCAgICAgIGNvZGU7Ci0gICAgbmd4X3JlZ2V4X3QgICAgICAgICAgICAgICAgICAqcmVnZXg7Ci0gICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgc2l6ZTsKLSAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICBuY2FwdHVyZXM7Ci0gICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgIG5leHQ7Ci0KLSAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICB0ZXN0OjE7Ci0gICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgdXJpOjE7Ci0KLSAgICAvKiBhZGQgdGhlIHItPmFyZ3MgdG8gdGhlIG5ldyBhcmd1bWVudHMgKi8KLSAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICBhcmdzOjE7Ci0KLSAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdDoxOwotICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgIGJyZWFrX2N5Y2xlOjE7Ci0KLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICBuYW1lOwotfSBuZ3hfaHR0cF9yZXdyaXRlX3JlZ2V4X2NvZGVfdDsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X2h0dHBfcmV3cml0ZV9jb2RlX3B0ICAgICAgY29kZTsKLQotICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgIHVyaToxOwotCi0gICAgLyogYWRkIHRoZSByLT5hcmdzIHRvIHRoZSBuZXcgYXJndW1lbnRzICovCi0gICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgYXJnczoxOwotCi0gICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Q6MTsKLX0gbmd4X2h0dHBfcmV3cml0ZV9yZWdleF9lbmRfY29kZV90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X2h0dHBfcmV3cml0ZV9jb2RlX3B0ICAgICAgY29kZTsKLSAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICBuOwotfSBuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY2FwdHVyZV9jb2RlX3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9odHRwX3Jld3JpdGVfY29kZV9wdCAgICAgIGNvZGU7Ci0gICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgbGVuOwotfSBuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY29kZV90OwotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBuZ3hfaHR0cF9yZXdyaXRlX2NvZGVfcHQgICAgICBjb2RlOwotICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKLSAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICBudWxsOwotfSBuZ3hfaHR0cF9yZXdyaXRlX3JldHVybl9jb2RlX3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9odHRwX3Jld3JpdGVfY29kZV9wdCAgICAgIGNvZGU7Ci0gICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgbmV4dDsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKipsb2NfY29uZjsKLX0gbmd4X2h0dHBfcmV3cml0ZV9pZl9jb2RlX3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9odHRwX3Jld3JpdGVfY29kZV9wdCAgICAgIGNvZGU7Ci0gICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgdmFsdWU7Ci0gICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgdGV4dF9sZW47Ci0gICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgdGV4dF9kYXRhOwotfSBuZ3hfaHR0cF9yZXdyaXRlX3ZhbHVlX2NvZGVfdDsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X2h0dHBfcmV3cml0ZV9jb2RlX3B0ICAgICAgY29kZTsKLSAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICBpbmRleDsKLX0gbmd4X2h0dHBfcmV3cml0ZV92YXJfY29kZV90OwotCi0KLXN0cnVjdCBuZ3hfaHR0cF9yZXdyaXRlX2VuZ2luZV9zIHsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICppcDsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAgICpzcDsKLQotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgIGJ1ZjsKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICpsaW5lOwotCi0gICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAqcG9zOwotCi0gICAgLyogdGhlIHN0YXJ0IG9mIHRoZSByZXdyaXR0ZW4gYXJndW1lbnRzICovCi0gICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAqYXJnczsKLQotICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgIHF1b3RlOjE7Ci0KLSAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICpjYXB0dXJlczsKLQotICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAgKnJlcXVlc3Q7Ci0gICAgbmd4X2h0dHBfcmV3cml0ZV9sb2NfY29uZl90ICAqY29uZjsKLX07Ci0KLQotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9yZXdyaXRlX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKTsKIHN0YXRpYyB2b2lkICpuZ3hfaHR0cF9yZXdyaXRlX2NyZWF0ZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZik7CiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfcmV3cml0ZV9tZXJnZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZiwKICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcmV3cml0ZV9pbml0KG5neF9jeWNsZV90ICpjeWNsZSk7CiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfcmV3cml0ZShuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKTsKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9yZXdyaXRlX3JldHVybihuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAogICAgIHZvaWQgKmNvbmYpOwpAQCAtMTUwLDEyICs1MCw4IEBACiAgICAgbmd4X2h0dHBfcmV3cml0ZV9sb2NfY29uZl90ICpsY2YsIG5neF9zdHJfdCAqdmFsdWUpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX3Jld3JpdGVfdmFsaWRfcmVmZXJlcnMobmd4X2NvbmZfdCAqY2YsCiAgICAgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKTsKLXN0YXRpYyBjaGFyICogbmd4X2h0dHBfcmV3cml0ZV9zZXQobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9yZXdyaXRlX3NldChuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAogICAgIHZvaWQgKmNvbmYpOwotc3RhdGljIHZvaWQgKm5neF9odHRwX3Jld3JpdGVfc3RhcnRfY29kZShuZ3hfcG9vbF90ICpwb29sLAotICAgIG5neF9hcnJheV90ICoqY29kZXMsIHNpemVfdCBzaXplKTsKLXN0YXRpYyB2b2lkICpuZ3hfaHR0cF9yZXdyaXRlX2FkZF9jb2RlKG5neF9hcnJheV90ICpjb2Rlcywgc2l6ZV90IHNpemUsCi0gICAgdm9pZCAqY29kZSk7CiAKIAogc3RhdGljIG5neF9jb21tYW5kX3QgIG5neF9odHRwX3Jld3JpdGVfY29tbWFuZHNbXSA9IHsKQEAgLTIxMSw3ICsxMDcsOCBAQAogCiAKIG5neF9odHRwX21vZHVsZV90ICBuZ3hfaHR0cF9yZXdyaXRlX21vZHVsZV9jdHggPSB7Ci0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlIGNvbmYgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmVjb25maWd1cmF0aW9uICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdGNvbmZpZ3VyYXRpb24gKi8KIAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLwpAQCAtMjI1LDcgKzEyMiw3IEBACiAKIAogbmd4X21vZHVsZV90ICBuZ3hfaHR0cF9yZXdyaXRlX21vZHVsZSA9IHsKLSAgICBOR1hfTU9EVUxFLAorICAgIE5HWF9NT0RVTEVfVjEsCiAgICAgJm5neF9odHRwX3Jld3JpdGVfbW9kdWxlX2N0eCwgICAgICAgICAgLyogbW9kdWxlIGNvbnRleHQgKi8gCiAgICAgbmd4X2h0dHBfcmV3cml0ZV9jb21tYW5kcywgICAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KICAgICBOR1hfSFRUUF9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgdHlwZSAqLwpAQCAtMjM0LDE5ICsxMzEsMTUgQEAKIH07CiAKIAotI2RlZmluZSBuZ3hfaHR0cF9yZXdyaXRlX2V4aXQgICh1X2NoYXIgKikgJm5neF9odHRwX3Jld3JpdGVfZXhpdF9jb2RlCi0KLXVpbnRwdHJfdCBuZ3hfaHR0cF9yZXdyaXRlX2V4aXRfY29kZSA9ICh1aW50cHRyX3QpIE5VTEw7Ci0KIHN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICBuZ3hfaHR0cF9yZXdyaXRlX251bGxfdmFsdWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDAsIG5neF9zdHJpbmcoIiIpIH07CisgICAgeyAwLCBuZ3hfc3RyaW5nKCIiKSB9OwogCiAKIHN0YXRpYyBuZ3hfaW50X3QKIG5neF9odHRwX3Jld3JpdGVfaGFuZGxlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7Ci0gICAgbmd4X2h0dHBfcmV3cml0ZV9jb2RlX3B0ICAgICAgY29kZTsKLSAgICBuZ3hfaHR0cF9yZXdyaXRlX2VuZ2luZV90ICAgICplOworICAgIG5neF9odHRwX3NjcmlwdF9jb2RlX3B0ICAgICAgIGNvZGU7CisgICAgbmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICAgICAqZTsKICAgICBuZ3hfaHR0cF9yZXdyaXRlX2xvY19jb25mX3QgICpjZjsKIAogICAgIGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9yZXdyaXRlX21vZHVsZSk7CkBAIC0yNTUsMTMgKzE0OCwxMyBAQAogICAgICAgICByZXR1cm4gTkdYX0RFQ0xJTkVEOwogICAgIH0KIAotICAgIGUgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX2VuZ2luZV90KSk7CisgICAgZSA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QpKTsKICAgICBpZiAoZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiAgICAgfQogCi0gICAgZS0+c3AgPSBuZ3hfcGFsbG9jKHItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgIGNmLT5zdGFja19zaXplICogc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKKyAgICBlLT5zcCA9IG5neF9wY2FsbG9jKHItPnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICBjZi0+c3RhY2tfc2l6ZSAqIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7CiAgICAgaWYgKGUtPnNwID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKICAgICB9CkBAIC0yNzcsMTggKzE3MCwxMyBAQAogICAgIH0KIAogICAgIGUtPmlwID0gY2YtPmNvZGVzLT5lbHRzOwotICAgIGUtPmJ1Zi5sZW4gPSAwOwotICAgIGUtPmJ1Zi5kYXRhID0gTlVMTDsKLSAgICBlLT5saW5lID0gTlVMTDsKLSAgICBlLT5wb3MgPSBOVUxMOwotICAgIGUtPmFyZ3MgPSBOVUxMOwotICAgIGUtPnF1b3RlID0gMTsKLSAgICBlLT5zdGF0dXMgPSBOR1hfREVDTElORUQ7CiAgICAgZS0+cmVxdWVzdCA9IHI7Ci0gICAgZS0+Y29uZiA9IGNmOworICAgIGUtPnF1b3RlID0gMTsKKyAgICBlLT5sb2cgPSBjZi0+bG9nOworICAgIGUtPnN0YXR1cyA9IE5HWF9ERUNMSU5FRDsKIAogICAgIHdoaWxlICgqKHVpbnRwdHJfdCAqKSBlLT5pcCkgewotICAgICAgICBjb2RlID0gKihuZ3hfaHR0cF9yZXdyaXRlX2NvZGVfcHQgKikgZS0+aXA7CisgICAgICAgIGNvZGUgPSAqKG5neF9odHRwX3NjcmlwdF9jb2RlX3B0ICopIGUtPmlwOwogICAgICAgICBjb2RlKGUpOwogICAgIH0KIApAQCAtMjk3LDM5MiArMTg1LDcgQEAKIAogCiBzdGF0aWMgdm9pZAotbmd4X2h0dHBfcmV3cml0ZV9yZWdleF9zdGFydF9jb2RlKG5neF9odHRwX3Jld3JpdGVfZW5naW5lX3QgKmUpCi17Ci0gICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgICAgICByYzsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgIG47Ci0gICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICAgICAgICAgICpyOwotICAgIG5neF9odHRwX3Jld3JpdGVfcmVnZXhfY29kZV90ICAqY29kZTsKLQotICAgIGNvZGUgPSAobmd4X2h0dHBfcmV3cml0ZV9yZWdleF9jb2RlX3QgKikgZS0+aXA7Ci0KLSAgICByID0gZS0+cmVxdWVzdDsKLQotICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJodHRwIHJld3JpdGUgcmVnZXg6IFwiJVZcIiIsICZjb2RlLT5uYW1lKTsKLQotICAgIGlmIChjb2RlLT51cmkpIHsKLSAgICAgICAgZS0+bGluZSA9ICZyLT51cmk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZS0+c3AtLTsKLSAgICAgICAgZS0+bGluZSA9ICZlLT5zcC0+dGV4dDsKLSAgICB9Ci0KLSAgICByYyA9IG5neF9yZWdleF9leGVjKGNvZGUtPnJlZ2V4LCBlLT5saW5lLCBlLT5jYXB0dXJlcywgY29kZS0+bmNhcHR1cmVzKTsKLQotICAgIGlmIChyYyA9PSBOR1hfUkVHRVhfTk9fTUFUQ0hFRCkgewotICAgICAgICBpZiAoZS0+Y29uZi0+bG9nKSB7Ci0gICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfTk9USUNFLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJcIiVWXCIgZG9lcyBub3QgbWF0Y2ggXCIlVlwiIiwgJmNvZGUtPm5hbWUsIGUtPmxpbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvZGUtPnRlc3QpIHsKLSAgICAgICAgICAgIGUtPnNwLT52YWx1ZSA9IDA7Ci0gICAgICAgICAgICBlLT5zcC0+dGV4dC5sZW4gPSAwOwotICAgICAgICAgICAgZS0+c3AtPnRleHQuZGF0YSA9ICh1X2NoYXIgKikgIiI7Ci0gICAgICAgICAgICBlLT5zcCsrOwotCi0gICAgICAgICAgICBlLT5pcCArPSBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV9yZWdleF9jb2RlX3QpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZS0+aXAgKz0gY29kZS0+bmV4dDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgbmd4X3JlZ2V4X2V4ZWNfbiAiIGZhaWxlZDogJWQgb24gXCIlVlwiIHVzaW5nIFwiJVZcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgcmMsIGUtPmxpbmUsICZjb2RlLT5uYW1lKTsKLQotICAgICAgICBlLT5pcCA9IG5neF9odHRwX3Jld3JpdGVfZXhpdDsKLSAgICAgICAgZS0+c3RhdHVzID0gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGUtPmNvbmYtPmxvZykgewotICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfTk9USUNFLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIlwiJVZcIiBtYXRjaGVzIFwiJVZcIiIsICZjb2RlLT5uYW1lLCBlLT5saW5lKTsKLSAgICB9Ci0KLSAgICBpZiAoY29kZS0+dGVzdCkgewotICAgICAgICBlLT5zcC0+dmFsdWUgPSAxOwotICAgICAgICBlLT5zcC0+dGV4dC5sZW4gPSAxOwotICAgICAgICBlLT5zcC0+dGV4dC5kYXRhID0gKHVfY2hhciAqKSAiMSI7Ci0gICAgICAgIGUtPnNwKys7Ci0KLSAgICAgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfcmVnZXhfY29kZV90KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChjb2RlLT5zdGF0dXMpIHsKLSAgICAgICAgZS0+c3RhdHVzID0gY29kZS0+c3RhdHVzOwotCi0gICAgICAgIGlmICghY29kZS0+cmVkaXJlY3QpIHsKLSAgICAgICAgICAgIGUtPmlwID0gbmd4X2h0dHBfcmV3cml0ZV9leGl0OwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZS0+YnVmLmxlbiA9IGNvZGUtPnNpemU7Ci0KLSAgICBpZiAoY29kZS0+dXJpKSB7Ci0gICAgICAgIGlmICghY29kZS0+YnJlYWtfY3ljbGUpIHsKLSAgICAgICAgICAgIHItPnVyaV9jaGFuZ2VkID0gMTsKLSAgICAgICAgICAgIHItPnZhbGlkX3VucGFyc2VkX3VyaSA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmMgJiYgKHItPnF1b3RlZF91cmkgfHwgci0+cGx1c19pbl91cmkpKSB7Ci0gICAgICAgICAgICBlLT5idWYubGVuICs9IDIgKiBuZ3hfZXNjYXBlX3VyaShOVUxMLCByLT51cmkuZGF0YSwgci0+dXJpLmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9FU0NBUEVfQVJHUyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKG4gPSAxOyBuIDwgKG5neF91aW50X3QpIHJjOyBuKyspIHsKLSAgICAgICAgZS0+YnVmLmxlbiArPSBlLT5jYXB0dXJlc1syICogbiArIDFdIC0gZS0+Y2FwdHVyZXNbMiAqIG5dOwotICAgIH0KLQotICAgIGlmIChjb2RlLT5hcmdzICYmIHItPmFyZ3MubGVuKSB7Ci0gICAgICAgIGUtPmJ1Zi5sZW4gKz0gci0+YXJncy5sZW4gKyAxOwotICAgIH0KLQotICAgIGUtPmJ1Zi5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLCBlLT5idWYubGVuKTsKLSAgICBpZiAoZS0+YnVmLmRhdGEgPT0gTlVMTCkgewotICAgICAgICBlLT5pcCA9IG5neF9odHRwX3Jld3JpdGVfZXhpdDsKLSAgICAgICAgZS0+c3RhdHVzID0gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZS0+cXVvdGUgPSBjb2RlLT5yZWRpcmVjdDsKLQotICAgIGUtPnBvcyA9IGUtPmJ1Zi5kYXRhOwotCi0gICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfcmVnZXhfY29kZV90KTsKLX0KLQotCi1zdGF0aWMgdm9pZAotbmd4X2h0dHBfcmV3cml0ZV9yZWdleF9lbmRfY29kZShuZ3hfaHR0cF9yZXdyaXRlX2VuZ2luZV90ICplKQotewotICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAgICAgICAgKnI7Ci0gICAgbmd4X2h0dHBfcmV3cml0ZV9yZWdleF9lbmRfY29kZV90ICAqY29kZTsKLQotICAgIGNvZGUgPSAobmd4X2h0dHBfcmV3cml0ZV9yZWdleF9lbmRfY29kZV90ICopIGUtPmlwOwotCi0gICAgciA9IGUtPnJlcXVlc3Q7Ci0KLSAgICBlLT5xdW90ZSA9IDA7Ci0KLSAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAiaHR0cCByZXdyaXRlIHJlZ2V4IGVuZCIpOwotCi0gICAgaWYgKGUtPmFyZ3MpIHsKLSAgICAgICAgZS0+YnVmLmxlbiA9IGUtPmFyZ3MgLSBlLT5idWYuZGF0YTsKLQotICAgICAgICBpZiAoY29kZS0+YXJncyAmJiByLT5hcmdzLmxlbikgewotICAgICAgICAgICAgKmUtPnBvcysrID0gJyYnOwotICAgICAgICAgICAgZS0+cG9zID0gbmd4X2NweW1lbShlLT5wb3MsIHItPmFyZ3MuZGF0YSwgci0+YXJncy5sZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgci0+YXJncy5sZW4gPSBlLT5wb3MgLSBlLT5hcmdzOwotICAgICAgICByLT5hcmdzLmRhdGEgPSBlLT5hcmdzOwotCi0gICAgICAgIGUtPmFyZ3MgPSBOVUxMOwotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGNvZGUtPmFyZ3MgJiYgci0+YXJncy5sZW4pIHsKLSAgICAgICAgICAgICplLT5wb3MrKyA9ICc/JzsKLSAgICAgICAgICAgIGUtPnBvcyA9IG5neF9jcHltZW0oZS0+cG9zLCByLT5hcmdzLmRhdGEsIHItPmFyZ3MubGVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIGUtPmJ1Zi5sZW4gPSBlLT5wb3MgLSBlLT5idWYuZGF0YTsKLSAgICB9Ci0KLSAgICBpZiAoIWNvZGUtPnJlZGlyZWN0KSB7Ci0gICAgICAgIGlmIChlLT5jb25mLT5sb2cpIHsKLSAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19OT1RJQ0UsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInJld3JpdHRlbiBkYXRhOiBcIiVWXCIsIGFyZ3M6IFwiJVZcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZlLT5idWYsICZyLT5hcmdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb2RlLT51cmkpIHsKLSAgICAgICAgICAgIHItPnVyaSA9IGUtPmJ1ZjsKLQotICAgICAgICAgICAgaWYgKG5neF9odHRwX3NldF9leHRlbihyKSAhPSBOR1hfT0spIHsKLSAgICAgICAgICAgICAgICBlLT5pcCA9IG5neF9odHRwX3Jld3JpdGVfZXhpdDsKLSAgICAgICAgICAgICAgICBlLT5zdGF0dXMgPSBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfcmVnZXhfZW5kX2NvZGVfdCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfTk9USUNFLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAicmV3cml0dGVuIHJlZGlyZWN0OiBcIiVWXCIiLCAmZS0+YnVmKTsKLQotICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19vdXQuaGVhZGVycyk7Ci0gICAgaWYgKHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uID09IE5VTEwpIHsKLSAgICAgICAgZS0+aXAgPSBuZ3hfaHR0cF9yZXdyaXRlX2V4aXQ7Ci0gICAgICAgIGUtPnN0YXR1cyA9IE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChlLT5idWYuZGF0YVswXSAhPSAnLycpIHsKLSAgICAgICAgci0+aGVhZGVyc19vdXQubG9jYXRpb24tPmtleS5sZW4gPSBzaXplb2YoIkxvY2F0aW9uIikgLSAxOwotICAgICAgICByLT5oZWFkZXJzX291dC5sb2NhdGlvbi0+a2V5LmRhdGEgPSAodV9jaGFyICopICJMb2NhdGlvbiI7Ci0gICAgfQotCi0gICAgci0+aGVhZGVyc19vdXQubG9jYXRpb24tPnZhbHVlID0gZS0+YnVmOwotCi0gICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfcmVnZXhfZW5kX2NvZGVfdCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW5neF9odHRwX3Jld3JpdGVfY29weV9jYXB0dXJlX2NvZGUobmd4X2h0dHBfcmV3cml0ZV9lbmdpbmVfdCAqZSkKLXsKLSAgICBuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY2FwdHVyZV9jb2RlX3QgICpjb2RlOwotCi0gICAgY29kZSA9IChuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY2FwdHVyZV9jb2RlX3QgKikgZS0+aXA7Ci0KLSAgICBlLT5pcCArPSBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV9jb3B5X2NhcHR1cmVfY29kZV90KTsKLQotICAgIGlmICgoZS0+YXJncyB8fCBlLT5xdW90ZSkKLSAgICAgICAgJiYgKGUtPnJlcXVlc3QtPnF1b3RlZF91cmkgfHwgZS0+cmVxdWVzdC0+cGx1c19pbl91cmkpKQotICAgIHsKLSAgICAgICAgZS0+cG9zID0gKHVfY2hhciAqKSBuZ3hfZXNjYXBlX3VyaShlLT5wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlLT5saW5lLT5kYXRhW2UtPmNhcHR1cmVzW2NvZGUtPm5dXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+Y2FwdHVyZXNbY29kZS0+biArIDFdIC0gZS0+Y2FwdHVyZXNbY29kZS0+bl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9FU0NBUEVfQVJHUyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZS0+cG9zID0gbmd4X2NweW1lbShlLT5wb3MsICZlLT5saW5lLT5kYXRhW2UtPmNhcHR1cmVzW2NvZGUtPm5dXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGUtPmNhcHR1cmVzW2NvZGUtPm4gKyAxXSAtIGUtPmNhcHR1cmVzW2NvZGUtPm5dKTsKLSAgICB9Ci0KLSAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIGUtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAiaHR0cCByZXdyaXRlIGNhcHR1cmU6IFwiJVZcIiIsICZlLT5idWYpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1uZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY29kZShuZ3hfaHR0cF9yZXdyaXRlX2VuZ2luZV90ICplKQotewotICAgIG5neF9odHRwX3Jld3JpdGVfY29weV9jb2RlX3QgICpjb2RlOwotCi0gICAgY29kZSA9IChuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY29kZV90ICopIGUtPmlwOwotCi0gICAgZS0+cG9zID0gbmd4X2NweW1lbShlLT5wb3MsIGUtPmlwICsgc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfY29weV9jb2RlX3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29kZS0+bGVuKTsKLQotICAgIGUtPmlwICs9IHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY29kZV90KQotICAgICAgICAgICsgKChjb2RlLT5sZW4gKyBzaXplb2YodWludHB0cl90KSAtIDEpICYgfihzaXplb2YodWludHB0cl90KSAtIDEpKTsKLQotICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgZS0+cmVxdWVzdC0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJodHRwIHJld3JpdGUgY29weTogXCIlVlwiIiwgJmUtPmJ1Zik7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW5neF9odHRwX3Jld3JpdGVfc3RhcnRfYXJnc19jb2RlKG5neF9odHRwX3Jld3JpdGVfZW5naW5lX3QgKmUpCi17Ci0gICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCBlLT5yZXF1ZXN0LT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgImh0dHAgcmV3cml0ZSBhcmdzIik7Ci0KLSAgICBlLT5hcmdzID0gZS0+cG9zOwotICAgIGUtPmlwICs9IHNpemVvZih1aW50cHRyX3QpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1uZ3hfaHR0cF9yZXdyaXRlX3JldHVybl9jb2RlKG5neF9odHRwX3Jld3JpdGVfZW5naW5lX3QgKmUpCi17Ci0gICAgbmd4X2h0dHBfcmV3cml0ZV9yZXR1cm5fY29kZV90ICAqY29kZTsKLQotICAgIGNvZGUgPSAobmd4X2h0dHBfcmV3cml0ZV9yZXR1cm5fY29kZV90ICopIGUtPmlwOwotCi0gICAgZS0+c3RhdHVzID0gY29kZS0+c3RhdHVzOwotCi0gICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfcmV0dXJuX2NvZGVfdCkgLSBzaXplb2YodWludHB0cl90KTsKLX0KLQotCi1zdGF0aWMgdm9pZAotbmd4X2h0dHBfcmV3cml0ZV9pZl9jb2RlKG5neF9odHRwX3Jld3JpdGVfZW5naW5lX3QgKmUpCi17Ci0gICAgbmd4X2h0dHBfcmV3cml0ZV9pZl9jb2RlX3QgICpjb2RlOwotCi0gICAgY29kZSA9IChuZ3hfaHR0cF9yZXdyaXRlX2lmX2NvZGVfdCAqKSBlLT5pcDsKLQotICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgZS0+cmVxdWVzdC0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJodHRwIHJld3JpdGUgaWYiKTsKLQotICAgIGUtPnNwLS07Ci0KLSAgICBpZiAoZS0+c3AtPnZhbHVlKSB7Ci0gICAgICAgIGlmIChjb2RlLT5sb2NfY29uZikgewotICAgICAgICAgICAgZS0+cmVxdWVzdC0+bG9jX2NvbmYgPSBjb2RlLT5sb2NfY29uZjsKLSAgICAgICAgfQotCi0gICAgICAgIGUtPmlwICs9IHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX2lmX2NvZGVfdCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIGUtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAiaHR0cCByZXdyaXRlIGlmIGZhbHNlIik7Ci0KLSAgICBlLT5pcCArPSBjb2RlLT5uZXh0OwotfQotCi0KLXN0YXRpYyB2b2lkCi1uZ3hfaHR0cF9yZXdyaXRlX3ZhbHVlX2NvZGUobmd4X2h0dHBfcmV3cml0ZV9lbmdpbmVfdCAqZSkKLXsKLSAgICBuZ3hfaHR0cF9yZXdyaXRlX3ZhbHVlX2NvZGVfdCAgKmNvZGU7Ci0KLSAgICBjb2RlID0gKG5neF9odHRwX3Jld3JpdGVfdmFsdWVfY29kZV90ICopIGUtPmlwOwotCi0gICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfdmFsdWVfY29kZV90KTsKLQotICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgZS0+cmVxdWVzdC0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJodHRwIHJld3JpdGUgdmFsdWUiKTsKLQotICAgIGUtPnNwLT52YWx1ZSA9IChuZ3hfdWludF90KSBjb2RlLT52YWx1ZTsKLSAgICBlLT5zcC0+dGV4dC5sZW4gPSAoc2l6ZV90KSBjb2RlLT50ZXh0X2xlbjsKLSAgICBlLT5zcC0+dGV4dC5kYXRhID0gKHVfY2hhciAqKSBjb2RlLT50ZXh0X2RhdGE7Ci0gICAgZS0+c3ArKzsKLX0KLQotCi1zdGF0aWMgdm9pZAotbmd4X2h0dHBfcmV3cml0ZV9zZXRfdmFyX2NvZGUobmd4X2h0dHBfcmV3cml0ZV9lbmdpbmVfdCAqZSkKLXsKLSAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAgICAgICpyOwotICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICAgKnZhbHVlOwotICAgIG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgICAgKmNtY2Y7Ci0gICAgbmd4X2h0dHBfcmV3cml0ZV92YXJfY29kZV90ICAqY29kZTsKLQotICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgZS0+cmVxdWVzdC0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICJodHRwIHJld3JpdGUgc2V0IHZhciIpOwotCi0gICAgY29kZSA9IChuZ3hfaHR0cF9yZXdyaXRlX3Zhcl9jb2RlX3QgKikgZS0+aXA7Ci0KLSAgICBlLT5pcCArPSBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV92YXJfY29kZV90KTsKLQotICAgIHIgPSBlLT5yZXF1ZXN0OwotCi0gICAgaWYgKHItPnZhcmlhYmxlcyA9PSBOVUxMKSB7Ci0gICAgICAgIGNtY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX21haW5fY29uZihyLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7Ci0KLSAgICAgICAgci0+dmFyaWFibGVzID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgY21jZi0+dmFyaWFibGVzLm5lbHRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqKSk7Ci0gICAgICAgIGlmIChyLT52YXJpYWJsZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgZS0+aXAgPSBuZ3hfaHR0cF9yZXdyaXRlX2V4aXQ7Ci0gICAgICAgICAgICBlLT5zdGF0dXMgPSBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2YWx1ZSA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKLSAgICBpZiAodmFsdWUgPT0gTlVMTCkgewotICAgICAgICBlLT5pcCA9IG5neF9odHRwX3Jld3JpdGVfZXhpdDsKLSAgICAgICAgZS0+c3RhdHVzID0gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZS0+c3AtLTsKLQotICAgICp2YWx1ZSA9ICplLT5zcDsKLQotICAgIHItPnZhcmlhYmxlc1tjb2RlLT5pbmRleF0gPSB2YWx1ZTsKLX0KLQotCi1zdGF0aWMgdm9pZAotbmd4X2h0dHBfcmV3cml0ZV92YXJfY29kZShuZ3hfaHR0cF9yZXdyaXRlX2VuZ2luZV90ICplKQotewotICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICAgKnZhbHVlOwotICAgIG5neF9odHRwX3Jld3JpdGVfdmFyX2NvZGVfdCAgKmNvZGU7Ci0KLSAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIGUtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAiaHR0cCByZXdyaXRlIHZhciIpOwotCi0gICAgY29kZSA9IChuZ3hfaHR0cF9yZXdyaXRlX3Zhcl9jb2RlX3QgKikgZS0+aXA7Ci0KLSAgICBlLT5pcCArPSBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV92YXJfY29kZV90KTsKLQotICAgIHZhbHVlID0gbmd4X2h0dHBfZ2V0X2luZGV4ZWRfdmFyaWFibGUoZS0+cmVxdWVzdCwgY29kZS0+aW5kZXgpOwotCi0gICAgaWYgKHZhbHVlID09IE5VTEwgfHwgdmFsdWUgPT0gTkdYX0hUVFBfVkFSSUFCTEVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgIGUtPnNwLT52YWx1ZSA9IDA7Ci0gICAgICAgIGUtPnNwLT50ZXh0LmxlbiA9IDA7Ci0gICAgICAgIGUtPnNwLT50ZXh0LmRhdGEgPSAodV9jaGFyICopICIiOwotICAgICAgICBlLT5zcCsrOwotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0hUVFAsIGUtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAiaHR0cCByZXdyaXRlIHZhcjogJXVpLCBcIiVWXCIiLCB2YWx1ZS0+dmFsdWUsICZ2YWx1ZS0+dGV4dCk7Ci0KLSAgICAqZS0+c3AgPSAqdmFsdWU7Ci0gICAgZS0+c3ArKzsKLX0KLQotCi1zdGF0aWMgdm9pZAotbmd4X2h0dHBfcmV3cml0ZV9pbnZhbGlkX3JlZmVyZXJfY29kZShuZ3hfaHR0cF9yZXdyaXRlX2VuZ2luZV90ICplKQorbmd4X2h0dHBfcmV3cml0ZV9pbnZhbGlkX3JlZmVyZXJfY29kZShuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKmUpCiB7CiAgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAqcmVmOwogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgIGxlbjsKQEAgLTgwNCwxMyArMzA3LDYgQEAKIH0KIAogCi1zdGF0aWMgdm9pZAotbmd4X2h0dHBfcmV3cml0ZV9ub3BfY29kZShuZ3hfaHR0cF9yZXdyaXRlX2VuZ2luZV90ICplKQotewotICAgIGUtPmlwICs9IHNpemVvZih1aW50cHRyX3QpOwotfQotCi0KIHN0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKIG5neF9odHRwX3Jld3JpdGVfdmFyKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpCiB7CkBAIC04MzQsMjUgKzMzMCw2IEBACiB9CiAKIAotc3RhdGljIG5neF9pbnRfdAotbmd4X2h0dHBfcmV3cml0ZV9pbml0KG5neF9jeWNsZV90ICpjeWNsZSkKLXsgICAKLSAgICBuZ3hfaHR0cF9oYW5kbGVyX3B0ICAgICAgICAqaDsKLSAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAqY21jZjsKLSAgICAKLSAgICBjbWNmID0gbmd4X2h0dHBfY3ljbGVfZ2V0X21vZHVsZV9tYWluX2NvbmYoY3ljbGUsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKLQotICAgIGggPSBuZ3hfYXJyYXlfcHVzaCgmY21jZi0+cGhhc2VzW05HWF9IVFRQX1JFV1JJVEVfUEhBU0VdLmhhbmRsZXJzKTsKLSAgICBpZiAoaCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgfQotICAgIAotICAgICpoID0gbmd4X2h0dHBfcmV3cml0ZV9oYW5kbGVyOwotICAgIAotICAgIHJldHVybiBOR1hfT0s7Ci19ICAgCi0KLQogc3RhdGljIHZvaWQgKgogbmd4X2h0dHBfcmV3cml0ZV9jcmVhdGVfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YpCiB7CkBAIC04NzgsOCArMzU1LDcgQEAKICAgICBuZ3hfaHR0cF9yZXdyaXRlX2xvY19jb25mX3QgKnByZXYgPSBwYXJlbnQ7CiAgICAgbmd4X2h0dHBfcmV3cml0ZV9sb2NfY29uZl90ICpjb25mID0gY2hpbGQ7CiAKLSAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICAgKmNvZGUsICpsYXN0OwotICAgIG5neF9odHRwX3Jld3JpdGVfcmVnZXhfY29kZV90ICAqcmVnZXg7CisgICAgdWludHB0cl90ICAqY29kZTsKIAogICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPmxvZywgcHJldi0+bG9nLCAwKTsKICAgICBuZ3hfY29uZl9tZXJnZV91bnNpZ25lZF92YWx1ZShjb25mLT5zdGFja19zaXplLCBwcmV2LT5zdGFja19zaXplLCAxMCk7CkBAIC05MDYsNjUgKzM4Miw2IEBACiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9PSzsKICAgICB9CiAKLSAgICBjb2RlID0gY29uZi0+Y29kZXMtPmVsdHM7Ci0gICAgbGFzdCA9ICh1aW50cHRyX3QgKikgKCh1X2NoYXIgKikgY29kZSArIGNvbmYtPmNvZGVzLT5uZWx0cyk7Ci0KLSAgICB3aGlsZSAoY29kZSA8IGxhc3QpIHsKLSAgICAgICAgaWYgKCpjb2RlID09ICh1aW50cHRyX3QpIE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9PSzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgqY29kZSA9PSAodWludHB0cl90KSAmbmd4X2h0dHBfcmV3cml0ZV9yZWdleF9zdGFydF9jb2RlKSB7Ci0gICAgICAgICAgICByZWdleCA9IChuZ3hfaHR0cF9yZXdyaXRlX3JlZ2V4X2NvZGVfdCAqKSBjb2RlOwotICAgICAgICAgICAgaWYgKGNvbmYtPm1heF9jYXB0dXJlcyA8IHJlZ2V4LT5uY2FwdHVyZXMpIHsKLSAgICAgICAgICAgICAgICBjb25mLT5tYXhfY2FwdHVyZXMgPSByZWdleC0+bmNhcHR1cmVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29kZSA9ICh1aW50cHRyX3QgKikgKCh1X2NoYXIgKikgY29kZSArIHJlZ2V4LT5uZXh0KTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCpjb2RlID09ICh1aW50cHRyX3QpICZuZ3hfaHR0cF9yZXdyaXRlX2lmX2NvZGUpIHsKLSAgICAgICAgICAgIGNvZGUgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfaWZfY29kZV90KSAvIHNpemVvZih1aW50cHRyX3QpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKmNvZGUgPT0gKHVpbnRwdHJfdCkgJm5neF9odHRwX3Jld3JpdGVfcmV0dXJuX2NvZGUpIHsKLSAgICAgICAgICAgIGNvZGUgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfcmV0dXJuX2NvZGVfdCkgLyBzaXplb2YodWludHB0cl90KTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCpjb2RlID09ICh1aW50cHRyX3QpICZuZ3hfaHR0cF9yZXdyaXRlX3NldF92YXJfY29kZSkgewotICAgICAgICAgICAgY29kZSArPSBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV92YXJfY29kZV90KSAvIHNpemVvZih1aW50cHRyX3QpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKmNvZGUgPT0gKHVpbnRwdHJfdCkgJm5neF9odHRwX3Jld3JpdGVfdmFyX2NvZGUpIHsKLSAgICAgICAgICAgIGNvZGUgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfdmFyX2NvZGVfdCkgLyBzaXplb2YodWludHB0cl90KTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCpjb2RlID09ICh1aW50cHRyX3QpICZuZ3hfaHR0cF9yZXdyaXRlX3ZhbHVlX2NvZGUpIHsKLSAgICAgICAgICAgIGNvZGUgKz0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfdmFsdWVfY29kZV90KSAvIHNpemVvZih1aW50cHRyX3QpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKmNvZGUgPT0gKHVpbnRwdHJfdCkgJm5neF9odHRwX3Jld3JpdGVfaW52YWxpZF9yZWZlcmVyX2NvZGUpIHsKLSAgICAgICAgICAgIGNvZGUrKzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCpjb2RlID09ICh1aW50cHRyX3QpICZuZ3hfaHR0cF9yZXdyaXRlX25vcF9jb2RlKSB7Ci0gICAgICAgICAgICBjb2RlKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0jaWYgKE5HWF9ERUJVRykKLSAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHJld3JpdGUgY29kZTogJXAiLCAqY29kZSk7Ci0gICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSNlbmRpZgotICAgIH0KLQogICAgIGNvZGUgPSBuZ3hfYXJyYXlfcHVzaF9uKGNvbmYtPmNvZGVzLCBzaXplb2YodWludHB0cl90KSk7CiAgICAgaWYgKGNvZGUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CkBAIC05NzYsMjkgKzM5Myw0NyBAQAogfQogCiAKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Jld3JpdGVfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCit7ICAgCisgICAgbmd4X2h0dHBfaGFuZGxlcl9wdCAgICAgICAgKmg7CisgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7CisKKyAgICBjbWNmID0gbmd4X2h0dHBfY3ljbGVfZ2V0X21vZHVsZV9tYWluX2NvbmYoY3ljbGUsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKKworICAgIGggPSBuZ3hfYXJyYXlfcHVzaCgmY21jZi0+cGhhc2VzW05HWF9IVFRQX1JFV1JJVEVfUEhBU0VdLmhhbmRsZXJzKTsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgKmggPSBuZ3hfaHR0cF9yZXdyaXRlX2hhbmRsZXI7CisKKyAgICByZXR1cm4gTkdYX09LOworfSAgIAorCisKIHN0YXRpYyBjaGFyICoKIG5neF9odHRwX3Jld3JpdGUobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwgdm9pZCAqY29uZikKIHsKICAgICBuZ3hfaHR0cF9yZXdyaXRlX2xvY19jb25mX3QgKmxjZiA9IGNvbmY7CiAgICAgCi0gICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YTsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIHNpemU7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWUsIGVycjsKLSAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuOwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGxhc3Q7Ci0gICAgbmd4X2h0dHBfcmV3cml0ZV9jb2RlX3B0ICAgICAgICAgICAgICAqY29kZTsKLSAgICBuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY29kZV90ICAgICAgICAgICpjb3B5OwotICAgIG5neF9odHRwX3Jld3JpdGVfcmVnZXhfY29kZV90ICAgICAgICAgKnJlZ2V4OwotICAgIG5neF9odHRwX3Jld3JpdGVfcmVnZXhfZW5kX2NvZGVfdCAgICAgKnJlZ2V4X2VuZDsKLSAgICBuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY2FwdHVyZV9jb2RlX3QgICpjb3B5X2NhcHR1cmU7Ci0gICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyc3RyW05HWF9NQVhfQ09ORl9FUlJTVFJdOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsdWUsIGVycjsKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgIG47CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0OworICAgIG5neF9odHRwX3NjcmlwdF9jb2RlX3B0ICAgICAgICAgICAqY29kZTsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfY29tcGlsZV90ICAgICAgICAgIHNjOworICAgIG5neF9odHRwX3NjcmlwdF9yZWdleF9jb2RlX3QgICAgICAqcmVnZXg7CisgICAgbmd4X2h0dHBfc2NyaXB0X3JlZ2V4X2VuZF9jb2RlX3QgICpyZWdleF9lbmQ7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJzdHJbTkdYX01BWF9DT05GX0VSUlNUUl07CiAKLSAgICByZWdleCA9IG5neF9odHRwX3Jld3JpdGVfc3RhcnRfY29kZShjZi0+cG9vbCwgJmxjZi0+Y29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfcmVnZXhfY29kZV90KSk7CisgICAgcmVnZXggPSBuZ3hfaHR0cF9zY3JpcHRfc3RhcnRfY29kZShjZi0+cG9vbCwgJmxjZi0+Y29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X3JlZ2V4X2NvZGVfdCkpOwogICAgIGlmIChyZWdleCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKKyAgICBuZ3hfbWVtemVybyhyZWdleCwgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9yZWdleF9jb2RlX3QpKTsKKwogICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7CiAKICAgICBlcnIubGVuID0gTkdYX01BWF9DT05GX0VSUlNUUjsKQEAgLTEwMTMsMTcgKzQ0OCwxOSBAQAogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCi0gICAgcmVnZXgtPmNvZGUgPSBuZ3hfaHR0cF9yZXdyaXRlX3JlZ2V4X3N0YXJ0X2NvZGU7Ci0gICAgcmVnZXgtPnNpemUgPSAwOwotICAgIHJlZ2V4LT5uY2FwdHVyZXMgPSAwOwotICAgIHJlZ2V4LT5zdGF0dXMgPSAwOwotICAgIHJlZ2V4LT50ZXN0ID0gMDsKKyAgICByZWdleC0+Y29kZSA9IG5neF9odHRwX3NjcmlwdF9yZWdleF9zdGFydF9jb2RlOwogICAgIHJlZ2V4LT51cmkgPSAxOwotICAgIHJlZ2V4LT5hcmdzID0gMTsKLSAgICByZWdleC0+cmVkaXJlY3QgPSAwOwotICAgIHJlZ2V4LT5icmVha19jeWNsZSA9IDA7CiAgICAgcmVnZXgtPm5hbWUgPSB2YWx1ZVsxXTsKIAorICAgIGlmICh2YWx1ZVsyXS5kYXRhW3ZhbHVlWzJdLmxlbiAtIDFdID09ICc/JykgeworCisgICAgICAgIC8qIHRoZSBsYXN0ICI/IiBkcm9wcyB0aGUgb3JpZ2luYWwgYXJndW1lbnRzICovCisgICAgICAgIHZhbHVlWzJdLmxlbi0tOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVnZXgtPmFkZF9hcmdzID0gMTsKKyAgICB9CisKICAgICBsYXN0ID0gMDsKIAogICAgIGlmIChuZ3hfc3RybmNtcCh2YWx1ZVsyXS5kYXRhLCAiaHR0cDovLyIsIHNpemVvZigiaHR0cDovLyIpIC0gMSkgPT0gMCkgewpAQCAtMTA1NywxMTMgKzQ5NCwyOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaSA9IDA7CisgICAgbmd4X21lbXplcm8oJnNjLCBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvbXBpbGVfdCkpOwogCi0gICAgd2hpbGUgKGkgPCB2YWx1ZVsyXS5sZW4pIHsKKyAgICBzYy5jZiA9IGNmOworICAgIHNjLnNvdXJjZSA9ICZ2YWx1ZVsyXTsKKyAgICBzYy5sZW5ndGhzID0gJnJlZ2V4LT5sZW5ndGhzOworICAgIHNjLnZhbHVlcyA9ICZsY2YtPmNvZGVzOworICAgIHNjLnZhcmlhYmxlcyA9IG5neF9odHRwX3NjcmlwdF92YXJpYWJsZXNfY291bnQoJnZhbHVlWzJdKTsKKyAgICBzYy5tYWluID0gcmVnZXg7CisgICAgc2MuY29tcGxldGVfbGVuZ3RocyA9IDE7CisgICAgc2MuY29tcGlsZV9hcmdzID0gIXJlZ2V4LT5yZWRpcmVjdDsKIAotICAgICAgICBkYXRhID0gJnZhbHVlWzJdLmRhdGFbaV07CisgICAgaWYgKG5neF9odHRwX3NjcmlwdF9jb21waWxlKCZzYykgIT0gTkdYX09LKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CiAKLSAgICAgICAgaWYgKHZhbHVlWzJdLmRhdGFbaV0gPT0gJyQnICYmIGkgPCB2YWx1ZVsyXS5sZW4KLSAgICAgICAgICAgICYmIHZhbHVlWzJdLmRhdGFbaSArIDFdID49ICcxJyAmJiB2YWx1ZVsyXS5kYXRhW2kgKyAxXSA8PSAnOScpCi0gICAgICAgIHsKKyAgICByZWdleCA9IHNjLm1haW47CiAKLSAgICAgICAgICAgIC8qIHRoZSAiJDEiIC0gIiQ5IiBjYXB0dXJlcyAqLworICAgIHJlZ2V4LT5uY2FwdHVyZXMgPSBzYy5uY2FwdHVyZXM7CisgICAgcmVnZXgtPnNpemUgPSBzYy5zaXplOworICAgIHJlZ2V4LT5hcmdzID0gc2MuYXJnczsKIAotICAgICAgICAgICAgY29weV9jYXB0dXJlID0gbmd4X2h0dHBfcmV3cml0ZV9hZGRfY29kZShsY2YtPmNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY2FwdHVyZV9jb2RlX3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdleCk7Ci0gICAgICAgICAgICBpZiAoY29weV9jYXB0dXJlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGkrKzsKLQotICAgICAgICAgICAgY29weV9jYXB0dXJlLT5jb2RlID0gbmd4X2h0dHBfcmV3cml0ZV9jb3B5X2NhcHR1cmVfY29kZTsKLSAgICAgICAgICAgIGNvcHlfY2FwdHVyZS0+biA9IHZhbHVlWzJdLmRhdGFbaV0gLSAnMCc7Ci0KLSAgICAgICAgICAgIGlmIChyZWdleC0+bmNhcHR1cmVzIDwgY29weV9jYXB0dXJlLT5uKSB7Ci0gICAgICAgICAgICAgICAgcmVnZXgtPm5jYXB0dXJlcyA9IGNvcHlfY2FwdHVyZS0+bjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29weV9jYXB0dXJlLT5uICo9IDI7Ci0KLSAgICAgICAgICAgIGkrKzsKLQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmFsdWVbMl0uZGF0YVtpXSA9PSAnPycpIHsKLQotICAgICAgICAgICAgLyogdGhlIGFyZ3VtZW50cyAqLwotCi0gICAgICAgICAgICBpZiAoaSA9PSB2YWx1ZVsyXS5sZW4gLSAxKSB7Ci0gICAgICAgICAgICAgICAgLyogdGhlIGxhc3QgIj8iIGRyb3BzIHRoZSBvcmlnaW5hbCBhcmd1bWVudHMgKi8KLSAgICAgICAgICAgICAgICByZWdleC0+YXJncyA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghcmVnZXgtPnJlZGlyZWN0KSB7Ci0gICAgICAgICAgICAgICAgY29kZSA9IG5neF9odHRwX3Jld3JpdGVfYWRkX2NvZGUobGNmLT5jb2Rlcywgc2l6ZW9mKHVpbnRwdHJfdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2V4KTsKLSAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAqY29kZSA9IG5neF9odHRwX3Jld3JpdGVfc3RhcnRfYXJnc19jb2RlOwotCi0gICAgICAgICAgICAgICAgaSsrOwotCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpKys7Ci0KLSAgICAgICAgLyogdGhlIHN1YnN0aXR1aW9uIHN0cmluZ3MgKi8KLQotICAgICAgICB3aGlsZSAoaSA8IHZhbHVlWzJdLmxlbiAmJiB2YWx1ZVsyXS5kYXRhW2ldICE9ICckJykgewotCi0gICAgICAgICAgICBpZiAodmFsdWVbMl0uZGF0YVtpXSA9PSAnPycpIHsKLQotICAgICAgICAgICAgICAgIGlmIChpID09IHZhbHVlWzJdLmxlbiAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogdGhlIGxhc3QgIj8iIGRyb3BzIHRoZSBvcmlnaW5hbCBhcmd1bWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAqIGFuZCBpdCBzaG91bGQgbm90IGJlIGNvcGllZCB0byBhIHN1YnN0aXR1aW9uCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICByZWdleC0+YXJncyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghcmVnZXgtPnJlZGlyZWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgbGVuID0gJnZhbHVlWzJdLmRhdGFbaV0gLSBkYXRhOwotCi0gICAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZWdleC0+c2l6ZSArPSBsZW47Ci0KLSAgICAgICAgc2l6ZSA9IChsZW4gKyBzaXplb2YodWludHB0cl90KSAtIDEpICYgfihzaXplb2YodWludHB0cl90KSAtIDEpOwotCi0gICAgICAgIGNvcHkgPSBuZ3hfaHR0cF9yZXdyaXRlX2FkZF9jb2RlKGxjZi0+Y29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY29kZV90KSArIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdleCk7Ci0gICAgICAgIGlmIChjb3B5ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNvcHktPmNvZGUgPSBuZ3hfaHR0cF9yZXdyaXRlX2NvcHlfY29kZTsKLSAgICAgICAgY29weS0+bGVuID0gbGVuOwotCi0gICAgICAgIG5neF9tZW1jcHkoKHVfY2hhciAqKSBjb3B5ICsgc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfY29weV9jb2RlX3QpLAotICAgICAgICAgICAgICAgICAgIGRhdGEsIGxlbik7CisgICAgaWYgKHNjLnZhcmlhYmxlcyA9PSAwKSB7CisgICAgICAgIHJlZ2V4LT5sZW5ndGhzID0gTlVMTDsKICAgICB9CiAKICAgICBuID0gbmd4X3JlZ2V4X2NhcHR1cmVfY291bnQocmVnZXgtPnJlZ2V4KTsKQEAgLTExOTEsMjEgKzU0NCwyNiBAQAogICAgICAgICByZWdleC0+bmNhcHR1cmVzID0gKHJlZ2V4LT5uY2FwdHVyZXMgKyAxKSAqIDM7CiAgICAgfQogCi0gICAgcmVnZXhfZW5kID0gbmd4X2h0dHBfcmV3cml0ZV9hZGRfY29kZShsY2YtPmNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX3JlZ2V4X2VuZF9jb2RlX3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdleCk7CisgICAgaWYgKGxjZi0+bWF4X2NhcHR1cmVzIDwgcmVnZXgtPm5jYXB0dXJlcykgeworICAgICAgICBsY2YtPm1heF9jYXB0dXJlcyA9IHJlZ2V4LT5uY2FwdHVyZXM7CisgICAgfQorCisgICAgcmVnZXhfZW5kID0gbmd4X2h0dHBfc2NyaXB0X2FkZF9jb2RlKGxjZi0+Y29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfcmVnZXhfZW5kX2NvZGVfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdleCk7CiAgICAgaWYgKHJlZ2V4X2VuZCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKLSAgICByZWdleF9lbmQtPmNvZGUgPSBuZ3hfaHR0cF9yZXdyaXRlX3JlZ2V4X2VuZF9jb2RlOworICAgIHJlZ2V4X2VuZC0+Y29kZSA9IG5neF9odHRwX3NjcmlwdF9yZWdleF9lbmRfY29kZTsKICAgICByZWdleF9lbmQtPnVyaSA9IHJlZ2V4LT51cmk7CiAgICAgcmVnZXhfZW5kLT5hcmdzID0gcmVnZXgtPmFyZ3M7CisgICAgcmVnZXhfZW5kLT5hZGRfYXJncyA9IHJlZ2V4LT5hZGRfYXJnczsKICAgICByZWdleF9lbmQtPnJlZGlyZWN0ID0gcmVnZXgtPnJlZGlyZWN0OwogCiAgICAgaWYgKGxhc3QpIHsKLSAgICAgICAgY29kZSA9IG5neF9odHRwX3Jld3JpdGVfYWRkX2NvZGUobGNmLT5jb2Rlcywgc2l6ZW9mKHVpbnRwdHJfdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdleCk7CisgICAgICAgIGNvZGUgPSBuZ3hfaHR0cF9zY3JpcHRfYWRkX2NvZGUobGNmLT5jb2Rlcywgc2l6ZW9mKHVpbnRwdHJfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2V4KTsKICAgICAgICAgaWYgKGNvZGUgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICB9CkBAIC0xMjI1LDE4ICs1ODMsMTggQEAKIHsKICAgICBuZ3hfaHR0cF9yZXdyaXRlX2xvY19jb25mX3QgKmxjZiA9IGNvbmY7CiAKLSAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZTsKLSAgICBuZ3hfaHR0cF9yZXdyaXRlX3JldHVybl9jb2RlX3QgICpyZXQ7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZTsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfcmV0dXJuX2NvZGVfdCAgKnJldDsKIAotICAgIHJldCA9IG5neF9odHRwX3Jld3JpdGVfc3RhcnRfY29kZShjZi0+cG9vbCwgJmxjZi0+Y29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX3JldHVybl9jb2RlX3QpKTsKKyAgICByZXQgPSBuZ3hfaHR0cF9zY3JpcHRfc3RhcnRfY29kZShjZi0+cG9vbCwgJmxjZi0+Y29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9yZXR1cm5fY29kZV90KSk7CiAgICAgaWYgKHJldCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKICAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOwogCi0gICAgcmV0LT5jb2RlID0gbmd4X2h0dHBfcmV3cml0ZV9yZXR1cm5fY29kZTsKKyAgICByZXQtPmNvZGUgPSBuZ3hfaHR0cF9zY3JpcHRfcmV0dXJuX2NvZGU7CiAgICAgcmV0LT5udWxsID0gKHVpbnRwdHJfdCkgTlVMTDsKIAogICAgIHJldC0+c3RhdHVzID0gbmd4X2F0b2kodmFsdWVbMV0uZGF0YSwgdmFsdWVbMV0ubGVuKTsKQEAgLTEyNjIsNyArNjIwLDcgQEAKICAgICBuZ3hfaHR0cF9tb2R1bGVfdCAgICAgICAgICAgICptb2R1bGU7CiAgICAgbmd4X2h0dHBfY29uZl9jdHhfdCAgICAgICAgICAqY3R4LCAqcGN0eDsKICAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICAgICpjbGNmLCAqcGNsY2YsICoqY2xjZnA7Ci0gICAgbmd4X2h0dHBfcmV3cml0ZV9pZl9jb2RlX3QgICAqaWZfY29kZTsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfaWZfY29kZV90ICAgICppZl9jb2RlOwogICAgIG5neF9odHRwX3Jld3JpdGVfbG9jX2NvbmZfdCAgKm5sY2Y7CiAKICAgICBjdHggPSBuZ3hfcGNhbGxvYyhjZi0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX2NvbmZfY3R4X3QpKTsKQEAgLTEzMjQsMTIgKzY4MiwxMiBAQAogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCi0gICAgaWZfY29kZSA9IG5neF9hcnJheV9wdXNoX24obGNmLT5jb2Rlcywgc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfaWZfY29kZV90KSk7CisgICAgaWZfY29kZSA9IG5neF9hcnJheV9wdXNoX24obGNmLT5jb2Rlcywgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9pZl9jb2RlX3QpKTsKICAgICBpZiAoaWZfY29kZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGlmX2NvZGUtPmNvZGUgPSBuZ3hfaHR0cF9yZXdyaXRlX2lmX2NvZGU7CisgICAgaWZfY29kZS0+Y29kZSA9IG5neF9odHRwX3NjcmlwdF9pZl9jb2RlOwogCiAgICAgZWx0cyA9IGxjZi0+Y29kZXMtPmVsdHM7CiAKQEAgLTEzNjIsNyArNzIwLDcgQEAKIAogCiAgICAgaWYgKGVsdHMgIT0gbGNmLT5jb2Rlcy0+ZWx0cykgewotICAgICAgICBpZl9jb2RlID0gKG5neF9odHRwX3Jld3JpdGVfaWZfY29kZV90ICopCisgICAgICAgIGlmX2NvZGUgPSAobmd4X2h0dHBfc2NyaXB0X2lmX2NvZGVfdCAqKQogICAgICAgICAgICAgICAgICAgICgodV9jaGFyICopIGlmX2NvZGUgKyAoKHVfY2hhciAqKSBsY2YtPmNvZGVzLT5lbHRzIC0gZWx0cykpOwogICAgIH0KIApAQCAtMTM3NiwxMCArNzM0LDEwIEBACiBzdGF0aWMgY2hhciAqCiBuZ3hfaHR0cF9yZXdyaXRlX2lmX2NvbmRpdGlvbihuZ3hfY29uZl90ICpjZiwgbmd4X2h0dHBfcmV3cml0ZV9sb2NfY29uZl90ICpsY2YpCiB7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSwgZXJyOwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgY3VyLCBsYXN0OwotICAgIG5neF9odHRwX3Jld3JpdGVfcmVnZXhfY29kZV90ICAqcmVnZXg7Ci0gICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJzdHJbTkdYX01BWF9DT05GX0VSUlNUUl07CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgKnZhbHVlLCBlcnI7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgIGN1ciwgbGFzdDsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfcmVnZXhfY29kZV90ICAqcmVnZXg7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgIGVycnN0cltOR1hfTUFYX0NPTkZfRVJSU1RSXTsKIAogICAgIHZhbHVlID0gY2YtPmFyZ3MtPmVsdHM7CiAgICAgbGFzdCA9IGNmLT5hcmdzLT5uZWx0cyAtIDE7CkBAIC0xNDQwLDEyICs3OTgsMTQgQEAKICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIHJlZ2V4ID0gbmd4X2h0dHBfcmV3cml0ZV9zdGFydF9jb2RlKGNmLT5wb29sLCAmbGNmLT5jb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV9yZWdleF9jb2RlX3QpKTsKKyAgICAgICAgcmVnZXggPSBuZ3hfaHR0cF9zY3JpcHRfc3RhcnRfY29kZShjZi0+cG9vbCwgJmxjZi0+Y29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfcmVnZXhfY29kZV90KSk7CiAgICAgICAgIGlmIChyZWdleCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBuZ3hfbWVtemVybyhyZWdleCwgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9yZWdleF9jb2RlX3QpKTsKKwogICAgICAgICBlcnIubGVuID0gTkdYX01BWF9DT05GX0VSUlNUUjsKICAgICAgICAgZXJyLmRhdGEgPSBlcnJzdHI7CiAKQEAgLTE0NTgsMTYgKzgxOCw5IEBACiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICByZWdleC0+Y29kZSA9IG5neF9odHRwX3Jld3JpdGVfcmVnZXhfc3RhcnRfY29kZTsKLSAgICAgICAgcmVnZXgtPnNpemUgPSAwOwotICAgICAgICByZWdleC0+bmNhcHR1cmVzID0gMDsKLSAgICAgICAgcmVnZXgtPnN0YXR1cyA9IDA7Ci0gICAgICAgIHJlZ2V4LT5uZXh0ID0gc2l6ZW9mKG5neF9odHRwX3Jld3JpdGVfcmVnZXhfY29kZV90KTsKKyAgICAgICAgcmVnZXgtPmNvZGUgPSBuZ3hfaHR0cF9zY3JpcHRfcmVnZXhfc3RhcnRfY29kZTsKKyAgICAgICAgcmVnZXgtPm5leHQgPSBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X3JlZ2V4X2NvZGVfdCk7CiAgICAgICAgIHJlZ2V4LT50ZXN0ID0gMTsKLSAgICAgICAgcmVnZXgtPnVyaSA9IDA7Ci0gICAgICAgIHJlZ2V4LT5hcmdzID0gMDsKLSAgICAgICAgcmVnZXgtPnJlZGlyZWN0ID0gMDsKLSAgICAgICAgcmVnZXgtPmJyZWFrX2N5Y2xlID0gMDsKICAgICAgICAgcmVnZXgtPm5hbWUgPSB2YWx1ZVtsYXN0XTsKIAogICAgICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CkBAIC0xNDg0LDkgKzgzNyw5IEBACiBuZ3hfaHR0cF9yZXdyaXRlX3ZhcmlhYmxlKG5neF9jb25mX3QgKmNmLCBuZ3hfaHR0cF9yZXdyaXRlX2xvY19jb25mX3QgKmxjZiwKICAgICBuZ3hfc3RyX3QgKnZhbHVlKQogewotICAgIG5neF9odHRwX3ZhcmlhYmxlX3QgICAgICAgICAgKnZhcjsKLSAgICBuZ3hfaHR0cF9yZXdyaXRlX2NvZGVfcHQgICAgICpjb2RlOwotICAgIG5neF9odHRwX3Jld3JpdGVfdmFyX2NvZGVfdCAgKnZhcl9jb2RlOworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICAgaW5kZXg7CisgICAgbmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQgICAgICpjb2RlOworICAgIG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90ICAqdmFyX2NvZGU7CiAKICAgICB2YWx1ZS0+bGVuLS07CiAgICAgdmFsdWUtPmRhdGErKzsKQEAgLTE0OTUsOCArODQ4LDggQEAKICAgICAgICAgJiYgbmd4X3N0cm5jbXAodmFsdWUtPmRhdGEsICJpbnZhbGlkX3JlZmVyZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoImludmFsaWRfcmVmZXJlciIpIC0gMSkgPT0gMCkKICAgICB7Ci0gICAgICAgIGNvZGUgPSBuZ3hfaHR0cF9yZXdyaXRlX3N0YXJ0X2NvZGUoY2YtPnBvb2wsICZsY2YtPmNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX2NvZGVfcHQpKTsKKyAgICAgICAgY29kZSA9IG5neF9odHRwX3NjcmlwdF9zdGFydF9jb2RlKGNmLT5wb29sLCAmbGNmLT5jb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfY29kZV9wdCkpOwogICAgICAgICBpZiAoY29kZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KQEAgLTE1MDQsMjAgKzg1NywyMCBAQAogICAgICAgICAqY29kZSA9IG5neF9odHRwX3Jld3JpdGVfaW52YWxpZF9yZWZlcmVyX2NvZGU7CiAKICAgICB9IGVsc2UgewotICAgICAgICB2YXIgPSBuZ3hfaHR0cF9hZGRfdmFyaWFibGUoY2YsIHZhbHVlLCAwKTsKKyAgICAgICAgaW5kZXggPSBuZ3hfaHR0cF9nZXRfdmFyaWFibGVfaW5kZXgoY2YsIHZhbHVlKTsKIAotICAgICAgICBpZiAodmFyID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGluZGV4ID09IE5HWF9FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgdmFyX2NvZGUgPSBuZ3hfaHR0cF9yZXdyaXRlX3N0YXJ0X2NvZGUoY2YtPnBvb2wsICZsY2YtPmNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX3Zhcl9jb2RlX3QpKTsKKyAgICAgICAgdmFyX2NvZGUgPSBuZ3hfaHR0cF9zY3JpcHRfc3RhcnRfY29kZShjZi0+cG9vbCwgJmxjZi0+Y29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90KSk7CiAgICAgICAgIGlmICh2YXJfY29kZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICB2YXJfY29kZS0+Y29kZSA9IG5neF9odHRwX3Jld3JpdGVfdmFyX2NvZGU7Ci0gICAgICAgIHZhcl9jb2RlLT5pbmRleCA9IHZhci0+aW5kZXg7CisgICAgICAgIHZhcl9jb2RlLT5jb2RlID0gbmd4X2h0dHBfc2NyaXB0X3Zhcl9jb2RlOworICAgICAgICB2YXJfY29kZS0+aW5kZXggPSBpbmRleDsKICAgICB9CiAKICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CkBAIC0xNjI0LDExICs5NzcsMTEgQEAKIHsKICAgICBuZ3hfaHR0cF9yZXdyaXRlX2xvY19jb25mX3QgKmxjZiA9IGNvbmY7CiAKLSAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgICAgIG47Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZTsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAgICAgICAgICAgKnY7Ci0gICAgbmd4X2h0dHBfcmV3cml0ZV92YXJfY29kZV90ICAgICp2YXI7Ci0gICAgbmd4X2h0dHBfcmV3cml0ZV92YWx1ZV9jb2RlX3QgICp2YWw7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgICAgIG4sIGluZGV4OworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICp2YWx1ZTsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAgICAgICAgICAqdjsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfdmFyX2NvZGVfdCAgICAqdmFyOworICAgIG5neF9odHRwX3NjcmlwdF92YWx1ZV9jb2RlX3QgICp2YWw7CiAKICAgICB2YWx1ZSA9IGNmLT5hcmdzLT5lbHRzOwogCkBAIC0xNjQxLDE2ICs5OTQsMjEgQEAKICAgICB2YWx1ZVsxXS5sZW4tLTsKICAgICB2YWx1ZVsxXS5kYXRhKys7CiAKLSAgICB2ID0gbmd4X2h0dHBfYWRkX3ZhcmlhYmxlKGNmLCAmdmFsdWVbMV0sIDEpOworICAgIHYgPSBuZ3hfaHR0cF9hZGRfdmFyaWFibGUoY2YsICZ2YWx1ZVsxXSwgTkdYX0hUVFBfVkFSX0NIQU5HQUJMRSk7CiAgICAgaWYgKHYgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCi0gICAgdi0+aGFuZGxlciA9IG5neF9odHRwX3Jld3JpdGVfdmFyOwotICAgIHYtPmRhdGEgPSB2LT5pbmRleDsKKyAgICBpbmRleCA9IG5neF9odHRwX2dldF92YXJpYWJsZV9pbmRleChjZiwgJnZhbHVlWzFdKTsKKyAgICBpZiAoaW5kZXggPT0gTkdYX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CiAKLSAgICB2YWwgPSBuZ3hfaHR0cF9yZXdyaXRlX3N0YXJ0X2NvZGUoY2YtPnBvb2wsICZsY2YtPmNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfcmV3cml0ZV92YWx1ZV9jb2RlX3QpKTsKKyAgICB2LT5oYW5kbGVyID0gbmd4X2h0dHBfcmV3cml0ZV92YXI7CisgICAgdi0+ZGF0YSA9IGluZGV4OworCisgICAgdmFsID0gbmd4X2h0dHBfc2NyaXB0X3N0YXJ0X2NvZGUoY2YtPnBvb2wsICZsY2YtPmNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfdmFsdWVfY29kZV90KSk7CiAgICAgaWYgKHZhbCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CkBAIC0xNjYxLDU1ICsxMDE5LDE5IEBACiAgICAgICAgIG4gPSAwOwogICAgIH0KIAotICAgIHZhbC0+Y29kZSA9IG5neF9odHRwX3Jld3JpdGVfdmFsdWVfY29kZTsKKyAgICB2YWwtPmNvZGUgPSBuZ3hfaHR0cF9zY3JpcHRfdmFsdWVfY29kZTsKICAgICB2YWwtPnZhbHVlID0gKHVpbnRwdHJfdCkgbjsKICAgICB2YWwtPnRleHRfbGVuID0gKHVpbnRwdHJfdCkgdmFsdWVbMl0ubGVuOwogICAgIHZhbC0+dGV4dF9kYXRhID0gKHVpbnRwdHJfdCkgdmFsdWVbMl0uZGF0YTsKIAotICAgIHZhciA9IG5neF9odHRwX3Jld3JpdGVfc3RhcnRfY29kZShjZi0+cG9vbCwgJmxjZi0+Y29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9yZXdyaXRlX3Zhcl9jb2RlX3QpKTsKKyAgICB2YXIgPSBuZ3hfaHR0cF9zY3JpcHRfc3RhcnRfY29kZShjZi0+cG9vbCwgJmxjZi0+Y29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90KSk7CiAgICAgaWYgKHZhciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKLSAgICB2YXItPmNvZGUgPSBuZ3hfaHR0cF9yZXdyaXRlX3NldF92YXJfY29kZTsKLSAgICB2YXItPmluZGV4ID0gKHVpbnRwdHJfdCkgdi0+aW5kZXg7CisgICAgdmFyLT5jb2RlID0gbmd4X2h0dHBfc2NyaXB0X3NldF92YXJfY29kZTsKKyAgICB2YXItPmluZGV4ID0gKHVpbnRwdHJfdCkgaW5kZXg7CiAKICAgICByZXR1cm4gTkdYX0NPTkZfT0s7CiB9Ci0KLQotc3RhdGljIHZvaWQgKgotbmd4X2h0dHBfcmV3cml0ZV9zdGFydF9jb2RlKG5neF9wb29sX3QgKnBvb2wsIG5neF9hcnJheV90ICoqY29kZXMsIHNpemVfdCBzaXplKQotewotICAgIGlmICgqY29kZXMgPT0gTlVMTCkgewotICAgICAgICAqY29kZXMgPSBuZ3hfYXJyYXlfY3JlYXRlKHBvb2wsIDI1NiwgMSk7Ci0gICAgICAgIGlmICgqY29kZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbmd4X2FycmF5X3B1c2hfbigqY29kZXMsIHNpemUpOwotfQotCi0KLXN0YXRpYyB2b2lkICoKLW5neF9odHRwX3Jld3JpdGVfYWRkX2NvZGUobmd4X2FycmF5X3QgKmNvZGVzLCBzaXplX3Qgc2l6ZSwgdm9pZCAqY29kZSkKLXsKLSAgICB1X2NoYXIgICplbHRzLCAqKnA7Ci0gICAgdm9pZCAgICAqbmV3OwotCi0gICAgZWx0cyA9IGNvZGVzLT5lbHRzOwotCi0gICAgbmV3ID0gbmd4X2FycmF5X3B1c2hfbihjb2Rlcywgc2l6ZSk7Ci0gICAgaWYgKG5ldyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAoZWx0cyAhPSBjb2Rlcy0+ZWx0cykgewotICAgICAgICBwID0gY29kZTsKLSAgICAgICAgKnAgKz0gKHVfY2hhciAqKSBjb2Rlcy0+ZWx0cyAtIGVsdHM7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldzsKLX0KZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUuYwppbmRleCBhMzUxNzQ3Li5hY2FlZWVkIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZS5jCkBAIC0xNiwxMCArMTYsMTMgQEAKIAogI2RlZmluZSBOR1hfSFRUUF9TU0lfRVJST1IgICAgICAgIDEKIAorI2RlZmluZSBOR1hfSFRUUF9TU0lfREFURV9MRU4gICAgIDIwNDgKKwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgbmd4X2ZsYWdfdCAgICAgICAgZW5hYmxlOwogICAgIG5neF9mbGFnX3QgICAgICAgIHNpbGVudF9lcnJvcnM7CisgICAgbmd4X2ZsYWdfdCAgICAgICAgaWdub3JlX3JlY3ljbGVkX2J1ZmZlcnM7CiAKICAgICBzaXplX3QgICAgICAgICAgICBtaW5fZmlsZV9jaHVuazsKICAgICBzaXplX3QgICAgICAgICAgICB2YWx1ZV9sZW47CkBAIC01MCw2ICs1MywxMCBAQAogICAgIHNpemVfdCAgICAgICAgICAgICBsb29rZWQ7CiAKICAgICBzaXplX3QgICAgICAgICAgICAgdmFsdWVfbGVuOworCisgICAgbmd4X3VpbnRfdCAgICAgICAgIG91dHB1dDsgICAgICAgIC8qIHVuc2lnbmVkICBvdXRwdXQ6MTsgKi8KKworICAgIG5neF9zdHJfdCAgICAgICAgICB0aW1lZm10OwogfSBuZ3hfaHR0cF9zc2lfY3R4X3Q7CiAKIApAQCAtNzAsNyArNzcsOCBAQAogICAgIG5neF9odHRwX3NzaV9jb21tYW5kX3B0ICAgaGFuZGxlcjsKICAgICBuZ3hfaHR0cF9zc2lfcGFyYW1fdCAgICAgKnBhcmFtczsKIAotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgZmx1c2g7ICAgIC8qIHVuc2lnbmVkICBmbHVzaDoxOyAqLworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWw6MTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgIGZsdXNoOjE7CiB9IG5neF9odHRwX3NzaV9jb21tYW5kX3Q7CiAKIApAQCAtOTgsMTIgKzEwNiwyOCBAQAogfSBuZ3hfaHR0cF9zc2lfc3RhdGVfZTsKIAogCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3NzaV9vdXRwdXQobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9odHRwX3NzaV9jdHhfdCAqY3R4KTsKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfc3NpX3BhcnNlKG5neF9odHRwX3JlcXVlc3RfdCAqciwKICAgICBuZ3hfaHR0cF9zc2lfY3R4X3QgKmN0eCk7CiAKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfc3NpX2VjaG8obmd4X2h0dHBfcmVxdWVzdF90ICpyLAogICAgIG5neF9odHRwX3NzaV9jdHhfdCAqY3R4LCBuZ3hfc3RyX3QgKipwYXJhbXMpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9zc2lfY29uZmlnKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfaHR0cF9zc2lfY3R4X3QgKmN0eCwgbmd4X3N0cl90ICoqcGFyYW1zKTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfc3NpX2luY2x1ZGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9odHRwX3NzaV9jdHhfdCAqY3R4LCBuZ3hfc3RyX3QgKipwYXJhbXMpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9zc2lfaWYobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9odHRwX3NzaV9jdHhfdCAqY3R4LCBuZ3hfc3RyX3QgKipwYXJhbXMpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9zc2lfZWxzZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfc3NpX2N0eF90ICpjdHgsIG5neF9zdHJfdCAqKnBhcmFtcyk7CitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3NzaV9lbmRpZihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfc3NpX2N0eF90ICpjdHgsIG5neF9zdHJfdCAqKnBhcmFtcyk7CiAKK3N0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKKyAgICBuZ3hfaHR0cF9zc2lfZGF0ZV9nbXRfbG9jYWxfdmFyaWFibGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZ210KTsKKworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9zc2lfYWRkX3ZhcmlhYmxlcyhuZ3hfY29uZl90ICpjZik7CiBzdGF0aWMgdm9pZCAqbmd4X2h0dHBfc3NpX2NyZWF0ZV9jb25mKG5neF9jb25mX3QgKmNmKTsKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9zc2lfbWVyZ2VfY29uZihuZ3hfY29uZl90ICpjZiwKICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKTsKQEAgLTEyNiw2ICsxNTAsMTMgQEAKICAgICAgIG9mZnNldG9mKG5neF9odHRwX3NzaV9jb25mX3QsIHNpbGVudF9lcnJvcnMpLAogICAgICAgTlVMTCB9LAogCisgICAgeyBuZ3hfc3RyaW5nKCJzc2lfaWdub3JlX3JlY3ljbGVkX2J1ZmZlcnMiKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9GTEFHLAorICAgICAgbmd4X2NvbmZfc2V0X2ZsYWdfc2xvdCwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX3NzaV9jb25mX3QsIGlnbm9yZV9yZWN5Y2xlZF9idWZmZXJzKSwKKyAgICAgIE5VTEwgfSwKKwogICAgIHsgbmd4X3N0cmluZygic3NpX21pbl9maWxlX2NodW5rIiksCiAgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfRkxBRywKICAgICAgIG5neF9jb25mX3NldF9zaXplX3Nsb3QsCkBAIC0xMzksNyArMTcwLDggQEAKIAogICAgIAogc3RhdGljIG5neF9odHRwX21vZHVsZV90ICBuZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZV9jdHggPSB7Ci0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlIGNvbmYgKi8KKyAgICBuZ3hfaHR0cF9zc2lfYWRkX3ZhcmlhYmxlcywgICAgICAgICAgICAvKiBwcmVjb25maWd1cmF0aW9uICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdGNvbmZpZ3VyYXRpb24gKi8KIAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLwpAQCAtMTUzLDcgKzE4NSw3IEBACiAKIAogbmd4X21vZHVsZV90ICBuZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZSA9IHsKLSAgICBOR1hfTU9EVUxFLAorICAgIE5HWF9NT0RVTEVfVjEsCiAgICAgJm5neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlX2N0eCwgICAgICAgLyogbW9kdWxlIGNvbnRleHQgKi8KICAgICBuZ3hfaHR0cF9zc2lfZmlsdGVyX2NvbW1hbmRzLCAgICAgICAgICAvKiBtb2R1bGUgZGlyZWN0aXZlcyAqLwogICAgIE5HWF9IVFRQX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSB0eXBlICovCkBAIC0xNzQsOCArMjA2LDE2IEBACiBzdGF0aWMgbmd4X3N0cl90IG5neF9odHRwX3NzaV9ub25lID0gbmd4X3N0cmluZygiKG5vbmUpIik7CiAKIAotI2RlZmluZSAgTkdYX0hUVFBfU1NJX0VDSE9fVkFSICAgICAgMAotI2RlZmluZSAgTkdYX0hUVFBfU1NJX0VDSE9fREVGQVVMVCAgMQorI2RlZmluZSAgTkdYX0hUVFBfU1NJX0VDSE9fVkFSICAgICAgICAgMAorI2RlZmluZSAgTkdYX0hUVFBfU1NJX0VDSE9fREVGQVVMVCAgICAgMQorCisjZGVmaW5lICBOR1hfSFRUUF9TU0lfQ09ORklHX1RJTUVGTVQgICAwCisKKyNkZWZpbmUgIE5HWF9IVFRQX1NTSV9JTkNMVURFX1ZJUlRVQUwgIDAKKyNkZWZpbmUgIE5HWF9IVFRQX1NTSV9JTkNMVURFX0ZJTEUgICAgIDEKKworI2RlZmluZSAgTkdYX0hUVFBfU1NJX0lGX0VYUFIgICAgICAgICAgMAorCiAKIHN0YXRpYyBuZ3hfaHR0cF9zc2lfcGFyYW1fdCAgbmd4X2h0dHBfc3NpX2VjaG9fcGFyYW1zW10gPSB7CiAgICAgeyBuZ3hfc3RyaW5nKCJ2YXIiKSwgTkdYX0hUVFBfU1NJX0VDSE9fVkFSLCAxIH0sCkBAIC0xODMsMTMgKzIyMyw2MCBAQAogICAgIHsgbmd4X251bGxfc3RyaW5nLCAwLCAwIH0KIH07CiAKK3N0YXRpYyBuZ3hfaHR0cF9zc2lfcGFyYW1fdCAgbmd4X2h0dHBfc3NpX2luY2x1ZGVfcGFyYW1zW10gPSB7CisgICAgeyBuZ3hfc3RyaW5nKCJ2aXJ0dWFsIiksIE5HWF9IVFRQX1NTSV9JTkNMVURFX1ZJUlRVQUwsIDAgfSwKKyNpZiAwCisgICAgeyBuZ3hfc3RyaW5nKCJmaWxlIiksIE5HWF9IVFRQX1NTSV9JTkNMVURFX0ZJTEUsIDAgfSwKKyNlbmRpZgorICAgIHsgbmd4X251bGxfc3RyaW5nLCAwLCAwIH0KK307CisKKworc3RhdGljIG5neF9odHRwX3NzaV9wYXJhbV90ICBuZ3hfaHR0cF9zc2lfY29uZmlnX3BhcmFtc1tdID0geworICAgIHsgbmd4X3N0cmluZygidGltZWZtdCIpLCBOR1hfSFRUUF9TU0lfQ09ORklHX1RJTUVGTVQsIDAgfSwKKyAgICB7IG5neF9udWxsX3N0cmluZywgMCwgMCB9Cit9OworCisKK3N0YXRpYyBuZ3hfaHR0cF9zc2lfcGFyYW1fdCAgbmd4X2h0dHBfc3NpX2lmX3BhcmFtc1tdID0geworICAgIHsgbmd4X3N0cmluZygiZXhwciIpLCBOR1hfSFRUUF9TU0lfSUZfRVhQUiwgMCB9LAorICAgIHsgbmd4X251bGxfc3RyaW5nLCAwLCAwIH0KK307CisKKworc3RhdGljIG5neF9odHRwX3NzaV9wYXJhbV90ICBuZ3hfaHR0cF9zc2lfbm9fcGFyYW1zW10gPSB7CisgICAgeyBuZ3hfbnVsbF9zdHJpbmcsIDAsIDAgfQorfTsKKwogCiBzdGF0aWMgbmd4X2h0dHBfc3NpX2NvbW1hbmRfdCAgbmd4X2h0dHBfc3NpX2NvbW1hbmRzW10gPSB7Ci0gICAgeyBuZ3hfc3RyaW5nKCJlY2hvIiksIG5neF9odHRwX3NzaV9lY2hvLCBuZ3hfaHR0cF9zc2lfZWNob19wYXJhbXMsIDAgfSwKLSAgICB7IG5neF9udWxsX3N0cmluZywgTlVMTCwgTlVMTCwgMCB9CisgICAgeyBuZ3hfc3RyaW5nKCJlY2hvIiksIG5neF9odHRwX3NzaV9lY2hvLCBuZ3hfaHR0cF9zc2lfZWNob19wYXJhbXMsIDAsIDAgfSwKKyAgICB7IG5neF9zdHJpbmcoImNvbmZpZyIpLCBuZ3hfaHR0cF9zc2lfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9zc2lfY29uZmlnX3BhcmFtcywgMCwgMCB9LAorICAgIHsgbmd4X3N0cmluZygiaW5jbHVkZSIpLCBuZ3hfaHR0cF9zc2lfaW5jbHVkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfc3NpX2luY2x1ZGVfcGFyYW1zLCAwLCAxIH0sCisKKyAgICB7IG5neF9zdHJpbmcoImlmIiksIG5neF9odHRwX3NzaV9pZiwgbmd4X2h0dHBfc3NpX2lmX3BhcmFtcywgMCwgMCB9LAorICAgIHsgbmd4X3N0cmluZygiZWxzZSIpLCBuZ3hfaHR0cF9zc2lfZWxzZSwgbmd4X2h0dHBfc3NpX25vX3BhcmFtcywgMSwgMCB9LAorICAgIHsgbmd4X3N0cmluZygiZW5kaWYiKSwgbmd4X2h0dHBfc3NpX2VuZGlmLCBuZ3hfaHR0cF9zc2lfbm9fcGFyYW1zLCAxLCAwIH0sCisKKyAgICB7IG5neF9udWxsX3N0cmluZywgTlVMTCwgTlVMTCwgMCwgMCB9CiB9OwogCiAKK3N0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV90ICBuZ3hfaHR0cF9zc2lfdmFyc1tdID0geworCisgICAgeyBuZ3hfc3RyaW5nKCJkYXRlX2xvY2FsIiksIG5neF9odHRwX3NzaV9kYXRlX2dtdF9sb2NhbF92YXJpYWJsZSwgMCwKKyAgICAgIE5HWF9IVFRQX1ZBUl9OT0NBQ0hBQkxFIH0sCisKKyAgICB7IG5neF9zdHJpbmcoImRhdGVfZ210IiksIG5neF9odHRwX3NzaV9kYXRlX2dtdF9sb2NhbF92YXJpYWJsZSwgMSwKKyAgICAgIE5HWF9IVFRQX1ZBUl9OT0NBQ0hBQkxFIH0sCisKKyAgICB7IG5neF9udWxsX3N0cmluZywgTlVMTCwgMCwgMCB9Cit9OworCisKKwogc3RhdGljIG5neF9pbnRfdAogbmd4X2h0dHBfc3NpX2hlYWRlcl9maWx0ZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQogewpAQCAtMjA0LDkgKzI5MSw5IEBACiAKICAgICAvKiBUT0RPOiAidGV4dC9odG1sIiAtPiBjdXN0b20gdHlwZXMgKi8KIAotICAgIGlmIChyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUKLSAgICAgICAgJiYgbmd4X3N0cm5jYXNlY21wKHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS0+dmFsdWUuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dC9odG1sIiwgNSkgIT0gMCkKKyAgICBpZiAoci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmxlbiA9PSAwCisgICAgICAgIHx8IG5neF9zdHJuY2FzZWNtcChyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUuZGF0YSwgInRleHQvaHRtbCIsIDUpCisgICAgICAgICAgICE9IDApCiAgICAgewogICAgICAgICByZXR1cm4gbmd4X2h0dHBfbmV4dF9oZWFkZXJfZmlsdGVyKHIpOwogICAgIH0KQEAgLTIyMywyNiArMzEwLDMzIEBACiAgICAgY3R4LT52YWx1ZV9sZW4gPSBjb25mLT52YWx1ZV9sZW47CiAgICAgY3R4LT5sYXN0X291dCA9ICZjdHgtPm91dDsKIAorICAgIGN0eC0+b3V0cHV0ID0gMTsKKwogICAgIGN0eC0+cGFyYW1zLmVsdHMgPSBjdHgtPnBhcmFtc19hcnJheTsKICAgICBjdHgtPnBhcmFtcy5zaXplID0gc2l6ZW9mKG5neF90YWJsZV9lbHRfdCk7CiAgICAgY3R4LT5wYXJhbXMubmFsbG9jID0gTkdYX0hUVFBfU1NJX1BBUkFNU19OOwogICAgIGN0eC0+cGFyYW1zLnBvb2wgPSByLT5wb29sOwogCi0gICAgci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGhfbiA9IC0xOwotICAgIGlmIChyLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aCkgewotICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aC0+a2V5LmxlbiA9IDA7Ci0gICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfbGVuZ3RoID0gTlVMTDsKLSAgICB9Ci0KLSAgICByLT5oZWFkZXJzX291dC5sYXN0X21vZGlmaWVkX3RpbWUgPSAtMTsKLSAgICBpZiAoci0+aGVhZGVyc19vdXQubGFzdF9tb2RpZmllZCkgewotICAgICAgICByLT5oZWFkZXJzX291dC5sYXN0X21vZGlmaWVkLT5rZXkubGVuID0gMDsKLSAgICAgICAgci0+aGVhZGVyc19vdXQubGFzdF9tb2RpZmllZCA9IE5VTEw7Ci0gICAgfQorICAgIGN0eC0+dGltZWZtdC5sZW4gPSBzaXplb2YoIiVBLCAlZC0lYi0lWSAlSDolTTolUyAlWiIpIC0gMTsKKyAgICBjdHgtPnRpbWVmbXQuZGF0YSA9ICh1X2NoYXIgKikgIiVBLCAlZC0lYi0lWSAlSDolTTolUyAlWiI7CiAKICAgICByLT5maWx0ZXJfbmVlZF9pbl9tZW1vcnkgPSAxOwogICAgIHItPmZpbHRlcl9zc2lfbmVlZF9pbl9tZW1vcnkgPSAxOwogCisgICAgaWYgKHItPm1haW4gPT0gTlVMTCkgeworICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aF9uID0gLTE7CisgICAgICAgIGlmIChyLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aCkgeworICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGgtPmhhc2ggPSAwOworICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGggPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgci0+aGVhZGVyc19vdXQubGFzdF9tb2RpZmllZF90aW1lID0gLTE7CisgICAgICAgIGlmIChyLT5oZWFkZXJzX291dC5sYXN0X21vZGlmaWVkKSB7CisgICAgICAgICAgICByLT5oZWFkZXJzX291dC5sYXN0X21vZGlmaWVkLT5oYXNoID0gMDsKKyAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0Lmxhc3RfbW9kaWZpZWQgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIG5neF9odHRwX25leHRfaGVhZGVyX2ZpbHRlcihyKTsKIH0KIApAQCAtMjc3LDggKzM3MSw4IEBACiAKICAgICBjb25mID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZSk7CiAKLSAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAiaHR0cCBzc2kgZmlsdGVyIik7CisgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgc3NpIGZpbHRlciBcIiVWXCIiLCAmci0+dXJpKTsKIAogICAgIHdoaWxlIChjdHgtPmluIHx8IGN0eC0+YnVmKSB7CiAKQEAgLTMxMiwxOSArNDA2LDUwIEBACiAKICAgICAgICAgICAgIGlmIChjdHgtPmNvcHlfc3RhcnQgIT0gY3R4LT5jb3B5X2VuZCkgewogCi0gICAgICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhdmVkOiAlZCIsIGN0eC0+c2F2ZWQpOworICAgICAgICAgICAgICAgIGlmIChjdHgtPm91dHB1dCkgewogCi0gICAgICAgICAgICAgICAgaWYgKGN0eC0+c2F2ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXZlZDogJWQiLCBjdHgtPnNhdmVkKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY3R4LT5zYXZlZCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3R4LT5mcmVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2wgPSBjdHgtPmZyZWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5mcmVlID0gY3R4LT5mcmVlLT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBjbC0+YnVmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9tZW16ZXJvKGIsIHNpemVvZihuZ3hfYnVmX3QpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gbmd4X2NhbGxvY19idWYoci0+cG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbC0+YnVmID0gYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYi0+bWVtb3J5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGItPnBvcyA9IG5neF9odHRwX3NzaV9zdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBiLT5sYXN0ID0gbmd4X2h0dHBfc3NpX3N0cmluZyArIGN0eC0+c2F2ZWQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICpjdHgtPmxhc3Rfb3V0ID0gY2w7CisgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmxhc3Rfb3V0ID0gJmNsLT5uZXh0OworCisgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnNhdmVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmIChjdHgtPmZyZWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNsID0gY3R4LT5mcmVlOwogICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5mcmVlID0gY3R4LT5mcmVlLT5uZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGNsLT5idWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZ3hfbWVtemVybyhiLCBzaXplb2Yobmd4X2J1Zl90KSk7CiAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBuZ3hfY2FsbG9jX2J1ZihyLT5wb29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBuZ3hfYWxsb2NfYnVmKHItPnBvb2wpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0zMzcsNTYgKzQ2MiwzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2wtPmJ1ZiA9IGI7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBiLT5tZW1vcnkgPSAxOwotICAgICAgICAgICAgICAgICAgICBiLT5wb3MgPSBuZ3hfaHR0cF9zc2lfc3RyaW5nOwotICAgICAgICAgICAgICAgICAgICBiLT5sYXN0ID0gbmd4X2h0dHBfc3NpX3N0cmluZyArIGN0eC0+c2F2ZWQ7CisgICAgICAgICAgICAgICAgICAgIG5neF9tZW1jcHkoYiwgY3R4LT5idWYsIHNpemVvZihuZ3hfYnVmX3QpKTsKIAorICAgICAgICAgICAgICAgICAgICBiLT5sYXN0X2J1ZiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGItPnJlY3ljbGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYi0+cG9zID0gY3R4LT5jb3B5X3N0YXJ0OworICAgICAgICAgICAgICAgICAgICBiLT5sYXN0ID0gY3R4LT5jb3B5X2VuZDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYi0+aW5fZmlsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmYtPm1pbl9maWxlX2NodW5rIDwgKHNpemVfdCkgKGItPmxhc3QgLSBiLT5wb3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGItPmZpbGVfbGFzdCA9IGItPmZpbGVfcG9zICsgKGItPmxhc3QgLSBiLT5zdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi0+ZmlsZV9wb3MgKz0gYi0+cG9zIC0gYi0+c3RhcnQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi0+aW5fZmlsZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbC0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgICpjdHgtPmxhc3Rfb3V0ID0gY2w7CiAgICAgICAgICAgICAgICAgICAgIGN0eC0+bGFzdF9vdXQgPSAmY2wtPm5leHQ7CiAKKyAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBjdHgtPnNhdmVkID0gMDsKICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3R4LT5mcmVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsID0gY3R4LT5mcmVlOwotICAgICAgICAgICAgICAgICAgICBjdHgtPmZyZWUgPSBjdHgtPmZyZWUtPm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIGIgPSBjbC0+YnVmOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYiA9IG5neF9hbGxvY19idWYoci0+cG9vbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChiID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2wgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNsLT5idWYgPSBiOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG5neF9tZW1jcHkoYiwgY3R4LT5idWYsIHNpemVvZihuZ3hfYnVmX3QpKTsKLQotICAgICAgICAgICAgICAgIGItPmxhc3RfYnVmID0gMDsKLSAgICAgICAgICAgICAgICBiLT5yZWN5Y2xlZCA9IDA7Ci0gICAgICAgICAgICAgICAgYi0+cG9zID0gY3R4LT5jb3B5X3N0YXJ0OwotICAgICAgICAgICAgICAgIGItPmxhc3QgPSBjdHgtPmNvcHlfZW5kOwotCi0gICAgICAgICAgICAgICAgaWYgKGItPmluX2ZpbGUpIHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY29uZi0+bWluX2ZpbGVfY2h1bmsgPCAoc2l6ZV90KSAoYi0+bGFzdCAtIGItPnBvcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGItPmZpbGVfbGFzdCA9IGItPmZpbGVfcG9zICsgKGItPmxhc3QgLSBiLT5zdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiLT5maWxlX3BvcyArPSBiLT5wb3MgLSBiLT5zdGFydDsKLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYi0+aW5fZmlsZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjbC0+bmV4dCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgKmN0eC0+bGFzdF9vdXQgPSBjbDsKLSAgICAgICAgICAgICAgICBjdHgtPmxhc3Rfb3V0ID0gJmNsLT5uZXh0OwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoY3R4LT5zdGF0ZSA9PSBzc2lfc3RhcnRfc3RhdGUpIHsKQEAgLTQyMCwxMiArNTIwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChjbWQtPm5hbWUubGVuID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoY21kLT5uYW1lLmxlbiA9PSAwICYmIGN0eC0+b3V0cHV0KSB7CiAgICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBTU0kgY29tbWFuZDogXCIlVlwiIiwgJmN0eC0+Y29tbWFuZCk7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gc3NpX2Vycm9yOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGlmICghY3R4LT5vdXRwdXQgJiYgIWNtZC0+Y29uZGl0aW9uYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgbmd4X21lbXplcm8ocGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX1NTSV9NQVhfUEFSQU1TICogc2l6ZW9mKG5neF9zdHJfdCAqKSk7CiAKQEAgLTQ3OSw2ICs1ODMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGlmIChjbWQtPmZsdXNoICYmIGN0eC0+b3V0KSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gbmd4X2h0dHBfc3NpX291dHB1dChyLCBjdHgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyYyA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBpZiAoY21kLT5oYW5kbGVyKHIsIGN0eCwgcGFyYW1zKSA9PSBOR1hfT0spIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTI1LDkgKzYzNyw5IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChjdHgtPmJ1Zi0+cmVjeWNsZWQgfHwgY3R4LT5idWYtPmxhc3RfYnVmKSB7Ci0gICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgIGlmIChjdHgtPmJ1Zi0+bGFzdF9idWYgfHwgY3R4LT5idWYtPnJlY3ljbGVkKSB7CiAKKyAgICAgICAgICAgIGlmIChiID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAoY3R4LT5mcmVlKSB7CiAgICAgICAgICAgICAgICAgICAgIGNsID0gY3R4LT5mcmVlOwogICAgICAgICAgICAgICAgICAgICBjdHgtPmZyZWUgPSBjdHgtPmZyZWUtPm5leHQ7CkBAIC01NDgsMTQgKzY2MCwxOSBAQAogICAgICAgICAgICAgICAgICAgICBjbC0+YnVmID0gYjsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBiLT5zeW5jID0gMTsKKwogICAgICAgICAgICAgICAgIGNsLT5uZXh0ID0gTlVMTDsKICAgICAgICAgICAgICAgICAqY3R4LT5sYXN0X291dCA9IGNsOwogICAgICAgICAgICAgICAgIGN0eC0+bGFzdF9vdXQgPSAmY2wtPm5leHQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGItPmxhc3RfYnVmID0gY3R4LT5idWYtPmxhc3RfYnVmOwotICAgICAgICAgICAgYi0+Zmx1c2ggPSBjdHgtPmJ1Zi0+cmVjeWNsZWQ7CiAgICAgICAgICAgICBiLT5zaGFkb3cgPSBjdHgtPmJ1ZjsKKworICAgICAgICAgICAgaWYgKGNvbmYtPmlnbm9yZV9yZWN5Y2xlZF9idWZmZXJzID09IDApICB7CisgICAgICAgICAgICAgICAgYi0+cmVjeWNsZWQgPSBjdHgtPmJ1Zi0+cmVjeWNsZWQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBjdHgtPmJ1ZiA9IE5VTEw7CkBAIC01NjcsNiArNjg0LDE3IEBACiAgICAgICAgIHJldHVybiBOR1hfT0s7CiAgICAgfQogCisgICAgcmV0dXJuIG5neF9odHRwX3NzaV9vdXRwdXQociwgY3R4KTsKK30KKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9zc2lfb3V0cHV0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2h0dHBfc3NpX2N0eF90ICpjdHgpCit7CisgICAgbmd4X2ludF90ICAgICByYzsKKyAgICBuZ3hfYnVmX3QgICAgKmI7CisgICAgbmd4X2NoYWluX3QgICpjbDsKKwogICAgIHJjID0gbmd4X2h0dHBfbmV4dF9ib2R5X2ZpbHRlcihyLCBjdHgtPm91dCk7CiAKICAgICBpZiAoY3R4LT5idXN5ID09IE5VTEwpIHsKQEAgLTExNTQsNyArMTI4Miw3IEBACiAgICAgdmFyID0gcGFyYW1zW05HWF9IVFRQX1NTSV9FQ0hPX1ZBUl07CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgdmFyLT5sZW47IGkrKykgewotICAgICAgICB2YXItPmRhdGFbaV0gPSBuZ3hfdG91cHBlcih2YXItPmRhdGFbaV0pOworICAgICAgICB2YXItPmRhdGFbaV0gPSBuZ3hfdG9sb3dlcih2YXItPmRhdGFbaV0pOwogICAgIH0KIAogICAgIHZ2ID0gbmd4X2h0dHBfZ2V0X3ZhcmlhYmxlKHIsIHZhcik7CkBAIC0xMTYzLDcgKzEyOTEsNyBAQAogICAgICAgICByZXR1cm4gTkdYX0hUVFBfU1NJX0VSUk9SOwogICAgIH0KIAotICAgIGlmICh2diA9PSBOR1hfSFRUUF9WQVJJQUJMRV9OT1RfRk9VTkQpIHsKKyAgICBpZiAodnYgPT0gTkdYX0hUVFBfVkFSX05PVF9GT1VORCkgewogICAgICAgICB2YWx1ZSA9IHBhcmFtc1tOR1hfSFRUUF9TU0lfRUNIT19ERUZBVUxUXTsKIAogICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewpAQCAtMTIwNCw2ICsxMzMyLDMyNSBAQAogfQogCiAKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3NzaV9jb25maWcobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfaHR0cF9zc2lfY3R4X3QgKmN0eCwKKyAgICBuZ3hfc3RyX3QgKipwYXJhbXMpCit7CisgICAgbmd4X3N0cl90ICAqdmFsdWU7CisKKyAgICB2YWx1ZSA9IHBhcmFtc1tOR1hfSFRUUF9TU0lfQ09ORklHX1RJTUVGTVRdOworCisgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIGN0eC0+dGltZWZtdCA9ICp2YWx1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3NzaV9pbmNsdWRlKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2h0dHBfc3NpX2N0eF90ICpjdHgsCisgICAgbmd4X3N0cl90ICoqcGFyYW1zKQoreworICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICBjaCwgKnAsICoqdmFsdWU7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgKnNpemUsIGxlbjsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgaSwgaiwgbiwgYnJhY2tldDsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgdXJpLCBhcmdzLCBuYW1lOworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICBsZW5ndGhzLCB2YWx1ZXM7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnZ2OworCisgICAgLyogVE9ETzogZmlsZSwgdmlydHVhbCB2cyBmaWxlICovCisKKyAgICB1cmkgPSAqcGFyYW1zW05HWF9IVFRQX1NTSV9JTkNMVURFX1ZJUlRVQUxdOworICAgIGFyZ3MubGVuID0gMDsKKyAgICBhcmdzLmRhdGEgPSBOVUxMOworCisgICAgbiA9IG5neF9odHRwX3NjcmlwdF92YXJpYWJsZXNfY291bnQoJnVyaSk7CisKKyAgICBpZiAobiA+IDApIHsKKworICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJmxlbmd0aHMsIHItPnBvb2wsIDgsIHNpemVvZihzaXplX3QgKikpICE9IE5HWF9PSykgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1NTSV9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmdmFsdWVzLCByLT5wb29sLCA4LCBzaXplb2YodV9jaGFyICopKSAhPSBOR1hfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9TU0lfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB1cmkubGVuOyAvKiB2b2lkICovICkgeworCisgICAgICAgICAgICBuYW1lLmxlbiA9IDA7CisKKyAgICAgICAgICAgIGlmICh1cmkuZGF0YVtpXSA9PSAnJCcpIHsKKworICAgICAgICAgICAgICAgIGlmICgrK2kgPT0gdXJpLmxlbikgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGludmFsaWRfdmFyaWFibGU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHVyaS5kYXRhW2ldID09ICd7JykgeworICAgICAgICAgICAgICAgICAgICBicmFja2V0ID0gMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKytpID09IHVyaS5sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaW52YWxpZF92YXJpYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG5hbWUuZGF0YSA9ICZ1cmkuZGF0YVtpXTsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyYWNrZXQgPSAwOworICAgICAgICAgICAgICAgICAgICBuYW1lLmRhdGEgPSAmdXJpLmRhdGFbaV07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yICggLyogdm9pZCAqLyA7IGkgPCB1cmkubGVuOyBpKyssIG5hbWUubGVuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2ggPSB1cmkuZGF0YVtpXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ30nICYmIGJyYWNrZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyYWNrZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoKGNoID49ICdBJyAmJiBjaCA8PSAnWicpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgY2ggPT0gJ18nKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChicmFja2V0KSB7CisgICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGNsb3NpbmcgYnJhY2tldCBpbiBcIiVWXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZSBpcyBtaXNzaW5nIiwgJm5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfU1NJX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChuYW1lLmxlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gaW52YWxpZF92YXJpYWJsZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmFtZS5sZW47IGorKykgeworICAgICAgICAgICAgICAgICAgICBuYW1lLmRhdGFbal0gPSBuZ3hfdG9sb3dlcihuYW1lLmRhdGFbal0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZ2ID0gbmd4X2h0dHBfZ2V0X3ZhcmlhYmxlKHIsICZuYW1lKTsKKworICAgICAgICAgICAgICAgIGlmICh2diA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9TU0lfRVJST1I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHZ2ID09IE5HWF9IVFRQX1ZBUl9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbmFtZSA9IHZ2LT50ZXh0OworCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5hbWUuZGF0YSA9ICZ1cmkuZGF0YVtpXTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgdXJpLmxlbiAmJiB1cmkuZGF0YVtpXSAhPSAnJCcpIHsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICBuYW1lLmxlbisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGVuICs9IG5hbWUubGVuOworCisgICAgICAgICAgICBzaXplID0gbmd4X2FycmF5X3B1c2goJmxlbmd0aHMpOworICAgICAgICAgICAgaWYgKHNpemUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9TU0lfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpzaXplID0gbmFtZS5sZW47CisKKyAgICAgICAgICAgIHZhbHVlID0gbmd4X2FycmF5X3B1c2goJnZhbHVlcyk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9TU0lfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICp2YWx1ZSA9IG5hbWUuZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIGxlbik7CisgICAgICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9TU0lfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICB1cmkubGVuID0gbGVuOworICAgICAgICB1cmkuZGF0YSA9IHA7CisKKyAgICAgICAgc2l6ZSA9IGxlbmd0aHMuZWx0czsKKyAgICAgICAgdmFsdWUgPSB2YWx1ZXMuZWx0czsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmFsdWVzLm5lbHRzOyBpKyspIHsKKyAgICAgICAgICAgIHAgPSBuZ3hfY3B5bWVtKHAsIHZhbHVlW2ldLCBzaXplW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCB1cmkubGVuOyBpKyspIHsKKyAgICAgICAgaWYgKHVyaS5kYXRhW2ldID09ICc/JykgeworICAgICAgICAgICAgYXJncy5sZW4gPSB1cmkubGVuIC0gaSAtIDE7CisgICAgICAgICAgICBhcmdzLmRhdGEgPSAmdXJpLmRhdGFbaSArIDFdOworICAgICAgICAgICAgdXJpLmxlbiAtPSBhcmdzLmxlbiArIDE7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5neF9odHRwX3N1YnJlcXVlc3QociwgJnVyaSwgJmFyZ3MpICE9IE5HWF9PSykgeworICAgICAgICByZXR1cm4gTkdYX0hUVFBfU1NJX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBOR1hfT0s7CisKK2ludmFsaWRfdmFyaWFibGU6CisKKyAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAiaW52YWxpZCB2YXJpYWJsZSBuYW1lIGluIFwiJVZcIiIsICZ1cmkpOworCisgICAgcmV0dXJuIE5HWF9FUlJPUjsKK30KKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9zc2lfaWYobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfaHR0cF9zc2lfY3R4X3QgKmN0eCwKKyAgICBuZ3hfc3RyX3QgKipwYXJhbXMpCit7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgKmV4cHIsIHZhcjsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgaTsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CisKKyAgICBleHByID0gcGFyYW1zW05HWF9IVFRQX1NTSV9JRl9FWFBSXTsKKworICAgIGlmIChleHByLT5kYXRhWzBdICE9ICckJykgeworICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgdmFyaWFibGUgbmFtZSBpbiBcIiVWXCIiLCBleHByKTsKKyAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1NTSV9FUlJPUjsKKyAgICB9CisKKyAgICB2YXIubGVuID0gZXhwci0+bGVuIC0gMTsKKyAgICB2YXIuZGF0YSA9IGV4cHItPmRhdGEgKyAxOworCisgICAgZm9yIChpID0gMDsgaSA8IHZhci5sZW47IGkrKykgeworICAgICAgICB2YXIuZGF0YVtpXSA9IG5neF90b2xvd2VyKHZhci5kYXRhW2ldKTsKKyAgICB9CisKKyAgICB2diA9IG5neF9odHRwX2dldF92YXJpYWJsZShyLCAmdmFyKTsKKworICAgIGlmICh2diA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfSFRUUF9TU0lfRVJST1I7CisgICAgfQorCisgICAgaWYgKHZ2ICE9IE5HWF9IVFRQX1ZBUl9OT1RfRk9VTkQgJiYgdnYtPnRleHQubGVuICE9IDApIHsKKyAgICAgICAgY3R4LT5vdXRwdXQgPSAxOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4LT5vdXRwdXQgPSAwOworICAgIH0KKworICAgIHJldHVybiBOR1hfT0s7Cit9CisKKworc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfc3NpX2Vsc2Uobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfaHR0cF9zc2lfY3R4X3QgKmN0eCwKKyAgICBuZ3hfc3RyX3QgKipwYXJhbXMpCit7CisgICAgY3R4LT5vdXRwdXQgPSAhY3R4LT5vdXRwdXQ7CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3NzaV9lbmRpZihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9odHRwX3NzaV9jdHhfdCAqY3R4LAorICAgIG5neF9zdHJfdCAqKnBhcmFtcykKK3sKKyAgICBjdHgtPm91dHB1dCA9IDE7CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKK25neF9odHRwX3NzaV9kYXRlX2dtdF9sb2NhbF92YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBnbXQpCit7CisgICAgbmd4X2h0dHBfc3NpX2N0eF90ICAgICAgICAgKmN0eDsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CisgICAgc3RydWN0IHRtICAgICAgICAgICAgICAgICAgIHRtOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICBidWZbTkdYX0hUVFBfU1NJX0RBVEVfTEVOXTsKKworICAgIHZ2ID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCkpOworICAgIGlmICh2diA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGN0eCA9IG5neF9odHRwX2dldF9tb2R1bGVfY3R4KHIsIG5neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlKTsKKworICAgIGlmIChjdHgtPnRpbWVmbXQubGVuID09IHNpemVvZigiJXMiKSAtIDEKKyAgICAgICAgJiYgY3R4LT50aW1lZm10LmRhdGFbMF0gPT0gJyUnICYmIGN0eC0+dGltZWZtdC5kYXRhWzFdID09ICdzJykKKyAgICB7CisgICAgICAgIHZ2LT52YWx1ZSA9IG5neF90aW1lKCkgKyAoZ210ID8gMCA6IG5neF9nbXRvZmYpOworCisgICAgICAgIHZ2LT50ZXh0LmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIE5HWF9USU1FX1RfTEVOKTsKKyAgICAgICAgaWYgKHZ2LT50ZXh0LmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICB2di0+dGV4dC5sZW4gPSBuZ3hfc3ByaW50Zih2di0+dGV4dC5kYXRhLCAiJVQiLCB2di0+dmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgIC0gdnYtPnRleHQuZGF0YTsKKyAgICAgICAgcmV0dXJuIHZ2OworICAgIH0KKworICAgIGlmIChnbXQpIHsKKyAgICAgICAgbmd4X2xpYmNfZ210aW1lKCZ0bSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbmd4X2xpYmNfbG9jYWx0aW1lKCZ0bSk7CisgICAgfQorCisgICAgdnYtPnZhbHVlID0gbmd4X3RpbWUoKSArIChnbXQgPyAwIDogbmd4X2dtdG9mZik7CisKKyAgICB2di0+dGV4dC5sZW4gPSBzdHJmdGltZShidWYsIE5HWF9IVFRQX1NTSV9EQVRFX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBjdHgtPnRpbWVmbXQuZGF0YSwgJnRtKTsKKyAgICBpZiAodnYtPnRleHQubGVuID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdnYtPnRleHQuZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgdnYtPnRleHQubGVuKTsKKyAgICBpZiAodnYtPnRleHQuZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG5neF9tZW1jcHkodnYtPnRleHQuZGF0YSwgYnVmLCB2di0+dGV4dC5sZW4pOworCisgICAgcmV0dXJuIHZ2OworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3NzaV9hZGRfdmFyaWFibGVzKG5neF9jb25mX3QgKmNmKQoreworICAgIG5neF9odHRwX3ZhcmlhYmxlX3QgICp2YXIsICp2OworCisgICAgZm9yICh2ID0gbmd4X2h0dHBfc3NpX3ZhcnM7IHYtPm5hbWUubGVuOyB2KyspIHsKKyAgICAgICAgdmFyID0gbmd4X2h0dHBfYWRkX3ZhcmlhYmxlKGNmLCAmdi0+bmFtZSwgdi0+ZmxhZ3MpOworICAgICAgICBpZiAodmFyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICB2YXItPmhhbmRsZXIgPSB2LT5oYW5kbGVyOworICAgICAgICB2YXItPmRhdGEgPSB2LT5kYXRhOworICAgIH0KKworICAgIHJldHVybiBOR1hfT0s7IAorfQorCisKIHN0YXRpYyB2b2lkICoKIG5neF9odHRwX3NzaV9jcmVhdGVfY29uZihuZ3hfY29uZl90ICpjZikKIHsKQEAgLTEyMTYsNiArMTY2Myw3IEBACiAKICAgICBjb25mLT5lbmFibGUgPSBOR1hfQ09ORl9VTlNFVDsKICAgICBjb25mLT5zaWxlbnRfZXJyb3JzID0gTkdYX0NPTkZfVU5TRVQ7CisgICAgY29uZi0+aWdub3JlX3JlY3ljbGVkX2J1ZmZlcnMgPSBOR1hfQ09ORl9VTlNFVDsKIAogICAgIGNvbmYtPm1pbl9maWxlX2NodW5rID0gTkdYX0NPTkZfVU5TRVRfU0laRTsKICAgICBjb25mLT52YWx1ZV9sZW4gPSBOR1hfQ09ORl9VTlNFVF9TSVpFOwpAQCAtMTIzMiw2ICsxNjgwLDggQEAKIAogICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPmVuYWJsZSwgcHJldi0+ZW5hYmxlLCAwKTsKICAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5zaWxlbnRfZXJyb3JzLCBwcmV2LT5zaWxlbnRfZXJyb3JzLCAwKTsKKyAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5pZ25vcmVfcmVjeWNsZWRfYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT5pZ25vcmVfcmVjeWNsZWRfYnVmZmVycywgMCk7CiAKICAgICBuZ3hfY29uZl9tZXJnZV9zaXplX3ZhbHVlKGNvbmYtPm1pbl9maWxlX2NodW5rLCBwcmV2LT5taW5fZmlsZV9jaHVuaywgMTAyNCk7CiAgICAgbmd4X2NvbmZfbWVyZ2Vfc2l6ZV92YWx1ZShjb25mLT52YWx1ZV9sZW4sIHByZXYtPnZhbHVlX2xlbiwgMjU2KTsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3NsX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmMKaW5kZXggYzE4YzQ5My4uMDRkNGM5MSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2xfbW9kdWxlLmMKQEAgLTY0LDcgKzY0LDggQEAKIAogCiBzdGF0aWMgbmd4X2h0dHBfbW9kdWxlX3QgIG5neF9odHRwX3NzbF9tb2R1bGVfY3R4ID0gewotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZSBjb25mICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3Rjb25maWd1cmF0aW9uICovCiAKICAgICBuZ3hfaHR0cF9zc2xfY3JlYXRlX21haW5fY29uZiwgICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCiAgICAgbmd4X2h0dHBfc3NsX2luaXRfbWFpbl9jb25mLCAgICAgICAgICAgLyogaW5pdCBtYWluIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTc4LDcgKzc5LDcgQEAKIAogCiBuZ3hfbW9kdWxlX3QgIG5neF9odHRwX3NzbF9tb2R1bGUgPSB7Ci0gICAgTkdYX01PRFVMRSwKKyAgICBOR1hfTU9EVUxFX1YxLAogICAgICZuZ3hfaHR0cF9zc2xfbW9kdWxlX2N0eCwgICAgICAgICAgICAgIC8qIG1vZHVsZSBjb250ZXh0ICovCiAgICAgbmd4X2h0dHBfc3NsX2NvbW1hbmRzLCAgICAgICAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KICAgICBOR1hfSFRUUF9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgdHlwZSAqLwpAQCAtMTk3LDYgKzE5OCwxMyBAQAogICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CiAgICAgfQogCisgICAgaWYgKG5neF9wb29sX2NsZWFudXBfYWRkKGNmLT5wb29sLCBuZ3hfc3NsX2NsZWFudXBfY3R4LCBjb25mLT5zc2xfY3R4KQorICAgICAgICA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIH0KKworCiAjaWYgMAogICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY29uZi0+c3NsX2N0eCwgU1NMX09QX0FMTCk7CiAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjb25mLT5zc2xfY3R4LCBTU0xfT1BfTk9fU1NMdjMpOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zdGF0aWNfbW9kdWxlLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0YXRpY19tb2R1bGUuYwppbmRleCBjMmM0NTgyLi5hODRhNzBlIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0YXRpY19tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0YXRpY19tb2R1bGUuYwpAQCAtMTcsNyArMTcsNyBAQAogc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9zdGF0aWNfaGFuZGxlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwogc3RhdGljIHZvaWQgKm5neF9odHRwX3N0YXRpY19jcmVhdGVfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX3N0YXRpY19tZXJnZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCk7CisgICAgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCk7CiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3N0YXRpY19pbml0KG5neF9jeWNsZV90ICpjeWNsZSk7CiAKIApAQCAtMzgsOSArMzgsOSBAQAogfTsKIAogCi0KIG5neF9odHRwX21vZHVsZV90ICBuZ3hfaHR0cF9zdGF0aWNfbW9kdWxlX2N0eCA9IHsKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmUgY29uZiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZWNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3N0Y29uZmlndXJhdGlvbiAqLwogCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIG1haW4gY29uZmlndXJhdGlvbiAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbWFpbiBjb25maWd1cmF0aW9uICovCkBAIC01NCw3ICs1NCw3IEBACiAKIAogbmd4X21vZHVsZV90ICBuZ3hfaHR0cF9zdGF0aWNfbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X2h0dHBfc3RhdGljX21vZHVsZV9jdHgsICAgICAgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLwogICAgIG5neF9odHRwX3N0YXRpY19jb21tYW5kcywgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0hUVFBfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KQEAgLTYzLDcgKzYzLDggQEAKIH07CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9zdGF0aWNfaGFuZGxlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9zdGF0aWNfaGFuZGxlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7CiAgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICpsYXN0OwogICAgIG5neF9mZF90ICAgICAgICAgICAgICAgICAgICAgZmQ7CkBAIC03NSwxNiArNzYsOCBAQAogICAgIG5neF9idWZfdCAgICAgICAgICAgICAgICAgICAqYjsKICAgICBuZ3hfY2hhaW5fdCAgICAgICAgICAgICAgICAgIG91dDsKICAgICBuZ3hfZmlsZV9pbmZvX3QgICAgICAgICAgICAgIGZpOwotICAgIG5neF9odHRwX2NsZWFudXBfdCAgICAgICAgICAqZmlsZV9jbGVhbnVwOwotI2lmIChOR1hfSFRUUF9DQUNIRSkKLSAgICBuZ3hfaHR0cF9jbGVhbnVwX3QgICAgICAgICAgKnJlZGlyZWN0X2NsZWFudXA7Ci0jZW5kaWYKKyAgICBuZ3hfcG9vbF9jbGVhbnVwX2ZpbGVfdCAgICAgKmNsbjsKICAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICAgKmNsY2Y7Ci0jaWYgKE5HWF9IVFRQX0NBQ0hFKQotICAgIG5neF9odHRwX3N0YXRpY19sb2NfY29uZl90ICAqc2xjZjsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgIGZpbGVfY3JjLCByZWRpcmVjdF9jcmM7Ci0gICAgbmd4X2h0dHBfY2FjaGVfdCAgICAgICAgICAgICpmaWxlLCAqcmVkaXJlY3Q7Ci0jZW5kaWYKIAogICAgIGlmIChyLT51cmkuZGF0YVtyLT51cmkubGVuIC0gMV0gPT0gJy8nKSB7CiAgICAgICAgIHJldHVybiBOR1hfREVDTElORUQ7CkBAIC0xMDUsMTkgKzk4LDYgQEAKICAgICAgICAgcmV0dXJuIHJjOwogICAgIH0KIAotI2lmIChOR1hfSFRUUF9DQUNIRSkKLQotICAgIC8qCi0gICAgICogdGhlcmUgaXMgYSB2YWxpZCBjYWNoZWQgb3BlbiBmaWxlLCBpLmUgYnkgdGhlIGluZGV4IGhhbmRsZXIsCi0gICAgICogYW5kIGl0IHNob3VsZCBiZSBhbHJlYWR5IHJlZ2lzdGVyZWQgaW4gci0+Y2xlYW51cAotICAgICAqLwotCi0gICAgaWYgKHItPmNhY2hlICYmICFyLT5jYWNoZS0+ZXhwaXJlZCkgewotICAgICAgICByZXR1cm4gbmd4X2h0dHBfc2VuZF9jYWNoZWQocik7Ci0gICAgfQotCi0jZW5kaWYKLQogICAgIGxvZyA9IHItPmNvbm5lY3Rpb24tPmxvZzsKIAogICAgIGNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKQEAgLTEyNyw3ICsxMDcsMTkgQEAKICAgICAgKiBpbiBhIHBvc3NpYmxlIHJlZGlyZWN0IGFuZCBmb3IgdGhlIGxhc3QgJ1wwJwogICAgICAqLwogCi0gICAgaWYgKGNsY2YtPmFsaWFzKSB7CisgICAgaWYgKCFjbGNmLT5hbGlhcykgeworICAgICAgICBuYW1lLmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIGNsY2YtPnJvb3QubGVuICsgci0+dXJpLmxlbiArIDIpOworICAgICAgICBpZiAobmFtZS5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBsb2NhdGlvbi5kYXRhID0gbmd4X2NweW1lbShuYW1lLmRhdGEsIGNsY2YtPnJvb3QuZGF0YSwgY2xjZi0+cm9vdC5sZW4pOworICAgICAgICBsYXN0ID0gbmd4X2NweXN0cm4obG9jYXRpb24uZGF0YSwgci0+dXJpLmRhdGEsIHItPnVyaS5sZW4gKyAxKTsKKworICAgICAgICBuYW1lLmxlbiA9IGxhc3QgLSBuYW1lLmRhdGE7CisgICAgICAgIGxvY2F0aW9uLmxlbiA9IGxhc3QgLSBsb2NhdGlvbi5kYXRhICsgMTsKKworICAgIH0gZWxzZSB7CiAgICAgICAgIG5hbWUuZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgY2xjZi0+cm9vdC5sZW4gKyByLT51cmkubGVuICsgMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gY2xjZi0+bmFtZS5sZW4pOwogICAgICAgICBpZiAobmFtZS5kYXRhID09IE5VTEwpIHsKQEAgLTE0NywxMTkgKzEzOSwxNiBAQAogCiAgICAgICAgIGxhc3QgPSBuZ3hfY3B5c3Rybihsb2NhdGlvbi5kYXRhLCByLT51cmkuZGF0YSwgci0+dXJpLmxlbiArIDEpOwogCi0jaWYgMAotICAgICAgICAvKgotICAgICAgICAgKiBhbGlhc2VzIHVzdWFsbHkgaGF2ZSB0cmFpbGxpbmcgIi8iLAotICAgICAgICAgKiBzZXQgaXQgaW4gdGhlIHN0YXJ0IG9mIHRoZSBwb3NzaWJsZSByZWRpcmVjdAotICAgICAgICAgKi8KLQotICAgICAgICBpZiAoKmxvY2F0aW9uLmRhdGEgIT0gJy8nKSB7Ci0gICAgICAgICAgICBsb2NhdGlvbi5kYXRhLS07Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIGxvY2F0aW9uLmxlbiA9IGxhc3QgLSBsb2NhdGlvbi5kYXRhICsgMTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG5hbWUuZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgY2xjZi0+cm9vdC5sZW4gKyByLT51cmkubGVuICsgMik7Ci0gICAgICAgIGlmIChuYW1lLmRhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGxvY2F0aW9uLmRhdGEgPSBuZ3hfY3B5bWVtKG5hbWUuZGF0YSwgY2xjZi0+cm9vdC5kYXRhLCBjbGNmLT5yb290Lmxlbik7Ci0gICAgICAgIGxhc3QgPSBuZ3hfY3B5c3Rybihsb2NhdGlvbi5kYXRhLCByLT51cmkuZGF0YSwgci0+dXJpLmxlbiArIDEpOwotCi0gICAgICAgIG5hbWUubGVuID0gbGFzdCAtIG5hbWUuZGF0YTsKICAgICAgICAgbG9jYXRpb24ubGVuID0gbGFzdCAtIGxvY2F0aW9uLmRhdGEgKyAxOwogICAgIH0KIAogICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgbG9nLCAwLAogICAgICAgICAgICAgICAgICAgICJodHRwIGZpbGVuYW1lOiBcIiVzXCIiLCBuYW1lLmRhdGEpOwogCi0KLSAgICAvKiBhbGxvY2F0ZSBjbGVhbnVwcyAqLwotCi0gICAgZmlsZV9jbGVhbnVwID0gbmd4X2FycmF5X3B1c2goJnItPmNsZWFudXApOwotICAgIGlmIChmaWxlX2NsZWFudXAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgIH0KLSAgICBmaWxlX2NsZWFudXAtPnZhbGlkID0gMDsKLQotI2lmIChOR1hfSFRUUF9DQUNIRSkKLQotICAgIHNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX3N0YXRpY19tb2R1bGUpOwotICAgIGlmIChzbGNmLT5yZWRpcmVjdF9jYWNoZSkgewotICAgICAgICByZWRpcmVjdF9jbGVhbnVwID0gbmd4X2FycmF5X3B1c2goJnItPmNsZWFudXApOwotICAgICAgICBpZiAocmVkaXJlY3RfY2xlYW51cCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIHJlZGlyZWN0X2NsZWFudXAtPnZhbGlkID0gMDsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlZGlyZWN0X2NsZWFudXAgPSBOVUxMOwotICAgIH0KLQotICAgIC8qIGxvb2sgdXAgYW4gb3BlbiBmaWxlcyBjYWNoZSAqLwotCi0gICAgaWYgKGNsY2YtPm9wZW5fZmlsZXMpIHsKLSAgICAgICAgZmlsZSA9IG5neF9odHRwX2NhY2hlX2dldChjbGNmLT5vcGVuX2ZpbGVzLCBmaWxlX2NsZWFudXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsICZmaWxlX2NyYyk7Ci0KLSAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCBsb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICJodHRwIG9wZW4gZmlsZSBjYWNoZSBnZXQ6ICVwIiwgZmlsZSk7Ci0KLSAgICAgICAgaWYgKGZpbGUgJiYgIWZpbGUtPmV4cGlyZWQpIHsKLSAgICAgICAgICAgIHItPmNhY2hlID0gZmlsZTsKLSAgICAgICAgICAgIHJldHVybiBuZ3hfaHR0cF9zZW5kX2NhY2hlZChyKTsKLSAgICAgICAgfQotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgZmlsZSA9IE5VTEw7Ci0gICAgfQotCi0KLSAgICAvKiBsb29rIHVwIGFuIHJlZGlyZWN0IGNhY2hlICovCi0KLSAgICBpZiAoc2xjZi0+cmVkaXJlY3RfY2FjaGUpIHsKLSAgICAgICAgcmVkaXJlY3QgPSBuZ3hfaHR0cF9jYWNoZV9nZXQoc2xjZi0+cmVkaXJlY3RfY2FjaGUsIHJlZGlyZWN0X2NsZWFudXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLCAmcmVkaXJlY3RfY3JjKTsKLQotICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIGxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgcmVkaXJlY3QgY2FjaGUgZ2V0OiAlcCIsIHJlZGlyZWN0KTsKLQotICAgICAgICBpZiAocmVkaXJlY3QgJiYgIXJlZGlyZWN0LT5leHBpcmVkKSB7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBXZSBkbyBub3QgY29weSBhIGNhY2hlZCB2YWx1ZSBzbyB0aGUgY2FjaGUgZW50cnkgaXMgbG9ja2VkCi0gICAgICAgICAgICAgKiB1bnRpbCB0aGUgZW5kIG9mIHRoZSByZXF1ZXN0LiAgSW4gYSBzaW5nbGUgdGhyZWFkZWQgbW9kZWwKLSAgICAgICAgICAgICAqIHRoZSByZWRpcmVjdGVkIHJlcXVlc3Qgc2hvdWxkIGNvbXBsZXRlIGJlZm9yZSBvdGhlciBldmVudAotICAgICAgICAgICAgICogd2lsbCBiZSBwcm9jZXNzZWQuICBJbiBhIG11bHRpdGhyZWFkZWQgbW9kZWwgdGhpcyBsb2NraW5nCi0gICAgICAgICAgICAgKiBzaG91bGQga2VlcCBtb3JlIHBvcHVsYXIgcmVkaXJlY3RzIGluIGNhY2hlLgotICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uID0gbmd4X2h0dHBfYWRkX2hlYWRlcigmci0+aGVhZGVyc19vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfaGVhZGVyc19vdXQpOwotICAgICAgICAgICAgaWYgKHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByLT5oZWFkZXJzX291dC5sb2NhdGlvbi0+dmFsdWUgPSByZWRpcmVjdC0+ZGF0YS52YWx1ZTsKLQotICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX01PVkVEX1BFUk1BTkVOVExZOwotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgewotICAgICAgICByZWRpcmVjdCA9IE5VTEw7Ci0gICAgfQotCi0jZW5kaWYKLQogICAgIC8qIG9wZW4gZmlsZSAqLwogCiAjaWYgKE5HWF9XSU45WCkKIAotICAgIC8qIFRPRE86IHJlZGlyZWN0IGNhY2hlICovCi0KICAgICBpZiAobmd4X3dpbjMyX3ZlcnNpb24gPCBOR1hfV0lOX05UKSB7CiAKICAgICAgICAgLyoKQEAgLTI4NSw5ICsxNzQsNiBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG5neF9pc19kaXIoJmZpKSkgewotICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCBsb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiSFRUUCBESVI6IFwiJXNcIiIsIG5hbWUuZGF0YSk7Ci0KICAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uID0gbmd4X2h0dHBfYWRkX2hlYWRlcigmci0+aGVhZGVyc19vdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfaGVhZGVyc19vdXQpOwogICAgICAgICAgICAgaWYgKHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uID09IE5VTEwpIHsKQEAgLTM1Niw2MCArMjQyLDE4IEBACiAgICAgICAgICpsYXN0KysgPSAnLyc7CiAgICAgICAgICpsYXN0ID0gJ1wwJzsKIAotICAgICAgICByLT5oZWFkZXJzX291dC5sb2NhdGlvbiA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpOworICAgICAgICByLT5oZWFkZXJzX291dC5sb2NhdGlvbiA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF90YWJsZV9lbHRfdCkpOwogICAgICAgICBpZiAoci0+aGVhZGVyc19vdXQubG9jYXRpb24gPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIC8qCisgICAgICAgICAqIHdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgci0+aGVhZGVyc19vdXQubG9jYXRpb24tPmhhc2ggYW5kCisgICAgICAgICAqIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uLT5rZXkgZmllbGRzCisgICAgICAgICAqLworCiAgICAgICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uLT52YWx1ZSA9IGxvY2F0aW9uOwogCi0jaWYgKE5HWF9IVFRQX0NBQ0hFKQotCi0gICAgICAgIGlmIChzbGNmLT5yZWRpcmVjdF9jYWNoZSkgewotICAgICAgICAgICAgaWYgKHJlZGlyZWN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uLmxlbiA9PSByZWRpcmVjdC0+ZGF0YS52YWx1ZS5sZW4KLSAgICAgICAgICAgICAgICAgICAgJiYgbmd4X21lbWNtcChyZWRpcmVjdC0+ZGF0YS52YWx1ZS5kYXRhLCBsb2NhdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ubGVuKSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3QtPmFjY2Vzc2VkID0gbmd4X2NhY2hlZF90aW1lOwotICAgICAgICAgICAgICAgICAgICByZWRpcmVjdC0+dXBkYXRlZCA9IG5neF9jYWNoZWRfdGltZTsKLQotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiB3ZSBjYW4gdW5sb2NrIHRoZSBjYWNoZSBlbnRyeSBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgICAqIHdlIGhhdmUgdGhlIGxvY2FsIGNvcHkgYW55d2F5Ci0gICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2NhY2hlX3VubG9jayhzbGNmLT5yZWRpcmVjdF9jYWNoZSwgcmVkaXJlY3QsIGxvZyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0X2NsZWFudXAtPnZhbGlkID0gMDsKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfTU9WRURfUEVSTUFORU5UTFk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb2NhdGlvbi5sZW4rKzsKLSAgICAgICAgICAgIHJlZGlyZWN0ID0gbmd4X2h0dHBfY2FjaGVfYWxsb2Moc2xjZi0+cmVkaXJlY3RfY2FjaGUsIHJlZGlyZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdF9jbGVhbnVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZSwgcmVkaXJlY3RfY3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9jYXRpb24sIGxvZyk7Ci0gICAgICAgICAgICBsb2NhdGlvbi5sZW4tLTsKLQotICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCBsb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCByZWRpcmVjdCBjYWNoZSBhbGxvYzogJXAiLCByZWRpcmVjdCk7Ci0KLSAgICAgICAgICAgIGlmIChyZWRpcmVjdCkgewotICAgICAgICAgICAgICAgIHJlZGlyZWN0LT5mZCA9IE5HWF9JTlZBTElEX0ZJTEU7Ci0gICAgICAgICAgICAgICAgcmVkaXJlY3QtPmFjY2Vzc2VkID0gbmd4X2NhY2hlZF90aW1lOwotICAgICAgICAgICAgICAgIHJlZGlyZWN0LT5sYXN0X21vZGlmaWVkID0gMDsKLSAgICAgICAgICAgICAgICByZWRpcmVjdC0+dXBkYXRlZCA9IG5neF9jYWNoZWRfdGltZTsKLSAgICAgICAgICAgICAgICByZWRpcmVjdC0+bWVtb3J5ID0gMTsKLSAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jYWNoZV91bmxvY2soc2xjZi0+cmVkaXJlY3RfY2FjaGUsIHJlZGlyZWN0LCBsb2cpOwotICAgICAgICAgICAgICAgIHJlZGlyZWN0X2NsZWFudXAtPnZhbGlkID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSNlbmRpZgotCiAgICAgICAgIHJldHVybiBOR1hfSFRUUF9NT1ZFRF9QRVJNQU5FTlRMWTsKICAgICB9CiAKQEAgLTQyOSw2OCArMjczLDIwIEBACiAKICNlbmRpZgogCi0KLSNpZiAoTkdYX0hUVFBfQ0FDSEUpCi0KLSAgICBpZiAoY2xjZi0+b3Blbl9maWxlcykgewotCi0jaWYgKE5HWF9VU0VfSFRUUF9GSUxFX0NBQ0hFX1VOSVEpCi0KLSAgICAgICAgaWYgKGZpbGUgJiYgZmlsZS0+dW5pcSA9PSBuZ3hfZmlsZV91bmlxKCZmaSkpIHsKLSAgICAgICAgICAgIGlmIChuZ3hfY2xvc2VfZmlsZShmZCkgPT0gTkdYX0ZJTEVfRVJST1IpIHsKLSAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIGxvZywgbmd4X2Vycm5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2Nsb3NlX2ZpbGVfbiAiIFwiJXNcIiBmYWlsZWQiLCBuYW1lLmRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlsZS0+YWNjZXNzZWQgPSBuZ3hfY2FjaGVkX3RpbWU7Ci0gICAgICAgICAgICBmaWxlLT51cGRhdGVkID0gbmd4X2NhY2hlZF90aW1lOwotICAgICAgICAgICAgZmlsZS0+ZXhwaXJlZCA9IDA7Ci0gICAgICAgICAgICByLT5jYWNoZSA9IGZpbGU7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZ3hfaHR0cF9zZW5kX2NhY2hlZChyKTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZpbGUpIHsKLSAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jYWNoZV91bmxvY2soY2xjZi0+b3Blbl9maWxlcywgZmlsZSwgbG9nKTsKLSAgICAgICAgICAgICAgICBmaWxlID0gTlVMTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmlsZSA9IG5neF9odHRwX2NhY2hlX2FsbG9jKGNsY2YtPm9wZW5fZmlsZXMsIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9jbGVhbnVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLCBmaWxlX2NyYywgTlVMTCwgbG9nKTsKLSAgICAgICAgICAgIGlmIChmaWxlKSB7Ci0gICAgICAgICAgICAgICAgZmlsZS0+dW5pcSA9IG5neF9maWxlX3VuaXEoJmZpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0jZWxzZQotICAgICAgICBmaWxlID0gbmd4X2h0dHBfY2FjaGVfYWxsb2MoY2xjZi0+b3Blbl9maWxlcywgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY2xlYW51cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLCBmaWxlX2NyYywgTlVMTCwgbG9nKTsKLSNlbmRpZgotCi0gICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgbG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBvcGVuIGZpbGUgY2FjaGUgYWxsb2M6ICVwIiwgZmlsZSk7Ci0KLSAgICAgICAgaWYgKGZpbGUpIHsKLSAgICAgICAgICAgIGZpbGUtPmZkID0gZmQ7Ci0gICAgICAgICAgICBmaWxlLT5kYXRhLnNpemUgPSBuZ3hfZmlsZV9zaXplKCZmaSk7Ci0gICAgICAgICAgICBmaWxlLT5hY2Nlc3NlZCA9IG5neF9jYWNoZWRfdGltZTsKLSAgICAgICAgICAgIGZpbGUtPmxhc3RfbW9kaWZpZWQgPSBuZ3hfZmlsZV9tdGltZSgmZmkpOwotICAgICAgICAgICAgZmlsZS0+dXBkYXRlZCA9IG5neF9jYWNoZWRfdGltZTsKLSAgICAgICAgICAgIHItPmNhY2hlID0gZmlsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZ3hfaHR0cF9zZW5kX2NhY2hlZChyKTsKLSAgICB9Ci0KLSNlbmRpZgotCiAgICAgbG9nLT5hY3Rpb24gPSAic2VuZGluZyByZXNwb25zZSB0byBjbGllbnQiOwogCi0gICAgZmlsZV9jbGVhbnVwLT5kYXRhLmZpbGUuZmQgPSBmZDsKLSAgICBmaWxlX2NsZWFudXAtPmRhdGEuZmlsZS5uYW1lID0gbmFtZS5kYXRhOwotICAgIGZpbGVfY2xlYW51cC0+dmFsaWQgPSAxOwotICAgIGZpbGVfY2xlYW51cC0+Y2FjaGUgPSAwOworICAgIGNsbiA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9wb29sX2NsZWFudXBfZmlsZV90KSk7CisgICAgaWYgKGNsbiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgfQorCisgICAgY2xuLT5mZCA9IGZkOworICAgIGNsbi0+bmFtZSA9IG5hbWUuZGF0YTsKKyAgICBjbG4tPmxvZyA9IHItPnBvb2wtPmxvZzsKKworICAgIGlmIChuZ3hfcG9vbF9jbGVhbnVwX2FkZChyLT5wb29sLCBuZ3hfcG9vbF9jbGVhbnVwX2ZpbGUsIGNsbikgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgIH0KIAogICAgIHItPmhlYWRlcnNfb3V0LnN0YXR1cyA9IE5HWF9IVFRQX09LOwogICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfbGVuZ3RoX24gPSBuZ3hfZmlsZV9zaXplKCZmaSk7CkBAIC01MzIsMTAgKzMyOCwxMiBAQAogCiAgICAgYi0+aW5fZmlsZSA9IDE7CiAKLSAgICBpZiAoIXItPm1haW4pIHsKKyAgICBpZiAoci0+bWFpbiA9PSBOVUxMKSB7CiAgICAgICAgIGItPmxhc3RfYnVmID0gMTsKICAgICB9CiAKKyAgICBiLT5sYXN0X2luX2NoYWluID0gMTsKKwogICAgIGItPmZpbGVfcG9zID0gMDsKICAgICBiLT5maWxlX2xhc3QgPSBuZ3hfZmlsZV9zaXplKCZmaSk7CiAKQEAgLTU1MCw3ICszNDgsOCBAQAogfQogCiAKLXN0YXRpYyB2b2lkICpuZ3hfaHR0cF9zdGF0aWNfY3JlYXRlX2xvY19jb25mKG5neF9jb25mX3QgKmNmKQorc3RhdGljIHZvaWQgKgorbmd4X2h0dHBfc3RhdGljX2NyZWF0ZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZikKIHsKICAgICBuZ3hfaHR0cF9zdGF0aWNfbG9jX2NvbmZfdCAgKmNvbmY7CiAKQEAgLTU2NSw4ICszNjQsOCBAQAogfQogCiAKLXN0YXRpYyBjaGFyICpuZ3hfaHR0cF9zdGF0aWNfbWVyZ2VfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBhcmVudCwgdm9pZCAqY2hpbGQpCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9zdGF0aWNfbWVyZ2VfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBhcmVudCwgdm9pZCAqY2hpbGQpCiB7CiAgICAgbmd4X2h0dHBfc3RhdGljX2xvY19jb25mX3QgICpwcmV2ID0gcGFyZW50OwogICAgIG5neF9odHRwX3N0YXRpY19sb2NfY29uZl90ICAqY29uZiA9IGNoaWxkOwpAQCAtNTc5LDcgKzM3OCw4IEBACiB9CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9zdGF0aWNfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9zdGF0aWNfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCiB7CiAgICAgbmd4X2h0dHBfaGFuZGxlcl9wdCAgICAgICAgKmg7CiAgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0dWJfc3RhdHVzX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zdHViX3N0YXR1c19tb2R1bGUuYwppbmRleCAxYTAxYmNlLi4wZjFhMjUyIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3N0dWJfc3RhdHVzX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfc3R1Yl9zdGF0dXNfbW9kdWxlLmMKQEAgLTIyLDcgKzIyLDggQEAKIAogICAgIAogbmd4X2h0dHBfbW9kdWxlX3QgIG5neF9odHRwX3N0dWJfc3RhdHVzX21vZHVsZV9jdHggPSB7Ci0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlIGNvbmYgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmVjb25maWd1cmF0aW9uICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdGNvbmZpZ3VyYXRpb24gKi8KIAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLwpAQCAtMzYsNyArMzcsNyBAQAogCiAKIG5neF9tb2R1bGVfdCAgbmd4X2h0dHBfc3R1Yl9zdGF0dXNfbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X2h0dHBfc3R1Yl9zdGF0dXNfbW9kdWxlX2N0eCwgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLwogICAgIG5neF9odHRwX3N0YXR1c19jb21tYW5kcywgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0hUVFBfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KQEAgLTYzLDE1ICs2NCw4IEBACiAgICAgICAgIHJldHVybiByYzsKICAgICB9CiAKLSAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUgPSBuZ3hfbGlzdF9wdXNoKCZyLT5oZWFkZXJzX291dC5oZWFkZXJzKTsKLSAgICBpZiAoci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0KLSAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUtPmtleS5sZW4gPSAwOwotICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS0+a2V5LmRhdGEgPSBOVUxMOwotICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS0+dmFsdWUubGVuID0gc2l6ZW9mKCJ0ZXh0L3BsYWluIikgLSAxOwotICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS0+dmFsdWUuZGF0YSA9ICh1X2NoYXIgKikgInRleHQvcGxhaW4iOworICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS5sZW4gPSBzaXplb2YoInRleHQvcGxhaW4iKSAtIDE7CisgICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmRhdGEgPSAodV9jaGFyICopICJ0ZXh0L3BsYWluIjsKIAogICAgIGlmIChyLT5tZXRob2QgPT0gTkdYX0hUVFBfSEVBRCkgewogICAgICAgICByLT5oZWFkZXJzX291dC5zdGF0dXMgPSBOR1hfSFRUUF9PSzsKQEAgLTEwMywxNCArOTcsMTQgQEAKICAgICByZCA9ICpuZ3hfc3RhdF9yZWFkaW5nOwogICAgIHdyID0gKm5neF9zdGF0X3dyaXRpbmc7CiAKLSAgICBiLT5sYXN0ID0gbmd4X3NwcmludGYoYi0+bGFzdCwgIkFjdGl2ZSBjb25uZWN0aW9uczogJUEgXG4iLCBhYyk7CisgICAgYi0+bGFzdCA9IG5neF9zcHJpbnRmKGItPmxhc3QsICJBY3RpdmUgY29ubmVjdGlvbnM6ICV1QSBcbiIsIGFjKTsKIAogICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJzZXJ2ZXIgYWNjZXB0cyBoYW5kbGVkIHJlcXVlc3RzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigic2VydmVyIGFjY2VwdHMgaGFuZGxlZCByZXF1ZXN0c1xuIikgLSAxKTsKIAotICAgIGItPmxhc3QgPSBuZ3hfc3ByaW50ZihiLT5sYXN0LCAiICVBICVBICVBIFxuIiwgYXAsIGhuLCBycSk7CisgICAgYi0+bGFzdCA9IG5neF9zcHJpbnRmKGItPmxhc3QsICIgJXVBICV1QSAldUEgXG4iLCBhcCwgaG4sIHJxKTsKIAotICAgIGItPmxhc3QgPSBuZ3hfc3ByaW50ZihiLT5sYXN0LCAiUmVhZGluZzogJUEgV3JpdGluZzogJUEgV2FpdGluZzogJUEgXG4iLAorICAgIGItPmxhc3QgPSBuZ3hfc3ByaW50ZihiLT5sYXN0LCAiUmVhZGluZzogJXVBIFdyaXRpbmc6ICV1QSBXYWl0aW5nOiAldUEgXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZCwgd3IsIGFjIC0gKHJkICsgd3IpKTsKIAogICAgIHItPmhlYWRlcnNfb3V0LnN0YXR1cyA9IE5HWF9IVFRQX09LOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF91c2VyaWRfZmlsdGVyX21vZHVsZS5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF91c2VyaWRfZmlsdGVyX21vZHVsZS5jCmluZGV4IDQ4ODlmYmYuLmFmNjBkODAgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfdXNlcmlkX2ZpbHRlcl9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3VzZXJpZF9maWx0ZXJfbW9kdWxlLmMKQEAgLTE5LDcgKzE5LDcgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X2ZsYWdfdCAgZW5hYmxlOworICAgIG5neF91aW50X3QgIGVuYWJsZTsKIAogICAgIG5neF9pbnRfdCAgIHNlcnZpY2U7CiAKQEAgLTgzLDcgKzgzLDcgQEAKIAogCiBzdGF0aWMgbmd4X2NvbmZfcG9zdF9oYW5kbGVyX3B0ICBuZ3hfaHR0cF91c2VyaWRfZG9tYWluX3AgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91c2VyaWRfZG9tYWluOworICAgIG5neF9odHRwX3VzZXJpZF9kb21haW47CiAKIHN0YXRpYyBuZ3hfY29uZl9wb3N0X2hhbmRsZXJfcHQgIG5neF9odHRwX3VzZXJpZF9wYXRoX3AgPSBuZ3hfaHR0cF91c2VyaWRfcGF0aDsKIHN0YXRpYyBuZ3hfY29uZl9wb3N0X2hhbmRsZXJfcHQgIG5neF9odHRwX3VzZXJpZF9wM3BfcCA9IG5neF9odHRwX3VzZXJpZF9wM3A7CkBAIC0xNDUsNyArMTQ1LDggQEAKIAogCiBuZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfdXNlcmlkX2ZpbHRlcl9tb2R1bGVfY3R4ID0gewotICAgIG5neF9odHRwX3VzZXJpZF9hZGRfbG9nX2Zvcm1hdHMsICAgICAgIC8qIHByZSBjb25mICovCisgICAgbmd4X2h0dHBfdXNlcmlkX2FkZF9sb2dfZm9ybWF0cywgICAgICAgLyogcHJlY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3Rjb25maWd1cmF0aW9uICovCiAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtYWluIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTE1OSw3ICsxNjAsNyBAQAogCiAKIG5neF9tb2R1bGVfdCAgbmd4X2h0dHBfdXNlcmlkX2ZpbHRlcl9tb2R1bGUgPSB7Ci0gICAgTkdYX01PRFVMRSwKKyAgICBOR1hfTU9EVUxFX1YxLAogICAgICZuZ3hfaHR0cF91c2VyaWRfZmlsdGVyX21vZHVsZV9jdHgsICAgIC8qIG1vZHVsZSBjb250ZXh0ICovCiAgICAgbmd4X2h0dHBfdXNlcmlkX2NvbW1hbmRzLCAgICAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KICAgICBOR1hfSFRUUF9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgdHlwZSAqLwpAQCAtMTg2LDYgKzE4NywxMCBAQAogICAgIG5neF9odHRwX3VzZXJpZF9jdHhfdCAgICpjdHg7CiAgICAgbmd4X2h0dHBfdXNlcmlkX2NvbmZfdCAgKmNvbmY7CiAKKyAgICBpZiAoci0+bWFpbikgeworICAgICAgICByZXR1cm4gbmd4X2h0dHBfbmV4dF9oZWFkZXJfZmlsdGVyKHIpOworICAgIH0KKwogICAgIGNvbmYgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX3VzZXJpZF9maWx0ZXJfbW9kdWxlKTsKIAogICAgIGlmIChjb25mLT5lbmFibGUgPT0gTkdYX0hUVFBfVVNFUklEX09GRikgewpAQCAtMjI1LDgyICsyMzAsNDcgQEAKIG5neF9odHRwX3VzZXJpZF9nZXRfdWlkKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2h0dHBfdXNlcmlkX2N0eF90ICpjdHgsCiAgICAgbmd4X2h0dHBfdXNlcmlkX2NvbmZfdCAqY29uZikKIHsKLSAgICB1X2NoYXIgICAgICAgICAgICAqc3RhcnQsICpsYXN0LCAqZW5kOwotICAgIG5neF91aW50X3QgICAgICAgICBpOworICAgIG5neF9pbnRfdCAgICAgICAgICBuOwogICAgIG5neF9zdHJfdCAgICAgICAgICBzcmMsIGRzdDsKICAgICBuZ3hfdGFibGVfZWx0X3QgICoqY29va2llczsKIAotICAgIGNvb2tpZXMgPSByLT5oZWFkZXJzX2luLmNvb2tpZXMuZWx0czsKLQotICAgIGZvciAoaSA9IDA7IGkgPCByLT5oZWFkZXJzX2luLmNvb2tpZXMubmVsdHM7IGkrKykgewotICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgImNvb2tpZTogXCIlVlwiIiwgJmNvb2tpZXNbaV0tPnZhbHVlKTsKLQotICAgICAgICBpZiAoY29uZi0+bmFtZS5sZW4gPj0gY29va2llc1tpXS0+dmFsdWUubGVuKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXJ0ID0gY29va2llc1tpXS0+dmFsdWUuZGF0YTsKLSAgICAgICAgZW5kID0gY29va2llc1tpXS0+dmFsdWUuZGF0YSArIGNvb2tpZXNbaV0tPnZhbHVlLmxlbjsKLQotICAgICAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHsKLQotICAgICAgICAgICAgaWYgKG5neF9zdHJuY21wKHN0YXJ0LCBjb25mLT5uYW1lLmRhdGEsIGNvbmYtPm5hbWUubGVuKSAhPSAwKSB7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoc3RhcnQgPCBlbmQgJiYgKnN0YXJ0KysgIT0gJzsnKSB7IC8qIHZvaWQgKi8gfQotICAgICAgICAgICAgICAgIHdoaWxlIChzdGFydCA8IGVuZCAmJiAqc3RhcnQgPT0gJyAnKSB7IHN0YXJ0Kys7IH0KLQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGFydCArPSBjb25mLT5uYW1lLmxlbjsKLQotICAgICAgICAgICAgd2hpbGUgKHN0YXJ0IDwgZW5kICYmICpzdGFydCA9PSAnICcpIHsgc3RhcnQrKzsgfQotCi0gICAgICAgICAgICBpZiAoc3RhcnQgPT0gZW5kIHx8ICpzdGFydCsrICE9ICc9JykgewotICAgICAgICAgICAgICAgIC8qIHRoZSBpbnZhbGlkICJDb29raWUiIGhlYWRlciAqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3aGlsZSAoc3RhcnQgPCBlbmQgJiYgKnN0YXJ0ID09ICcgJykgeyBzdGFydCsrOyB9Ci0KLSAgICAgICAgICAgIGxhc3QgPSBzdGFydDsKLQotICAgICAgICAgICAgd2hpbGUgKGxhc3QgPCBlbmQgJiYgKmxhc3QrKyAhPSAnOycpIHsgLyogdm9pZCAqLyB9Ci0KLSAgICAgICAgICAgIGlmIChsYXN0IC0gc3RhcnQgPCAyMikgewotICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGllbnQgc2VudCB0b28gc2hvcnQgdXNlcmlkIGNvb2tpZSBcIiVWXCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvb2tpZXNbaV0tPnZhbHVlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIHdlIGhhdmUgdG8gbGltaXQgZW5jb2RlZCBzdHJpbmcgdG8gMjIgY2hhcmFjdGVycwotICAgICAgICAgICAgICogYmVjYXVzZSB0aGVyZSBhcmUgYWxyZWFkeSB0aGUgbWlsbGlvbnMgY29va2llcyB3aXRoIGEgZ2FyYmFnZQotICAgICAgICAgICAgICogaW5zdGVhZCBvZiB0aGUgY29ycmVjdCBiYXNlNjQgdHJhaWwgIj09IgotICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIHNyYy5sZW4gPSAyMjsKLSAgICAgICAgICAgIHNyYy5kYXRhID0gc3RhcnQ7Ci0gICAgICAgICAgICBkc3QuZGF0YSA9ICh1X2NoYXIgKikgY3R4LT51aWRfZ290OwotCi0gICAgICAgICAgICBpZiAobmd4X2RlY29kZV9iYXNlNjQoJmRzdCwgJnNyYykgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudCBzZW50IGludmFsaWQgdXNlcmlkIGNvb2tpZSBcIiVWXCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvb2tpZXNbaV0tPnZhbHVlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzQoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidWlkOiAlMDhYRCUwOFhEJTA4WEQlMDhYRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnVpZF9nb3RbMF0sIGN0eC0+dWlkX2dvdFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dWlkX2dvdFsyXSwgY3R4LT51aWRfZ290WzNdKTsKLQotICAgICAgICAgICAgcmV0dXJuIE5HWF9PSzsKLSAgICAgICAgfQorICAgIG4gPSBuZ3hfaHR0cF9wYXJzZV9tdWx0aV9oZWFkZXJfbGluZXMoJnItPmhlYWRlcnNfaW4uY29va2llcywgJmNvbmYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjKTsKKyAgICBpZiAobiA9PSBOR1hfREVDTElORUQpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKICAgICB9CiAKKyAgICBpZiAoc3JjLmxlbiA8IDIyKSB7CisgICAgICAgIGNvb2tpZXMgPSByLT5oZWFkZXJzX2luLmNvb2tpZXMuZWx0czsKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICJjbGllbnQgc2VudCB0b28gc2hvcnQgdXNlcmlkIGNvb2tpZSBcIiVWXCIiLAorICAgICAgICAgICAgICAgICAgICAgICZjb29raWVzW25dLT52YWx1ZSk7CisgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgfQorCisgICAgLyoKKyAgICAgKiB3ZSBoYXZlIHRvIGxpbWl0IGVuY29kZWQgc3RyaW5nIHRvIDIyIGNoYXJhY3RlcnMKKyAgICAgKiBiZWNhdXNlIHRoZXJlIGFyZSBhbHJlYWR5IHRoZSBtaWxsaW9ucyBjb29raWVzIHdpdGggYSBnYXJiYWdlCisgICAgICogaW5zdGVhZCBvZiB0aGUgY29ycmVjdCBiYXNlNjQgdHJhaWwgIj09IgorICAgICAqLworCisgICAgc3JjLmxlbiA9IDIyOworCisgICAgZHN0LmRhdGEgPSAodV9jaGFyICopIGN0eC0+dWlkX2dvdDsKKworICAgIGlmIChuZ3hfZGVjb2RlX2Jhc2U2NCgmZHN0LCAmc3JjKSA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgY29va2llcyA9IHItPmhlYWRlcnNfaW4uY29va2llcy5lbHRzOworICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgImNsaWVudCBzZW50IGludmFsaWQgdXNlcmlkIGNvb2tpZSBcIiVWXCIiLAorICAgICAgICAgICAgICAgICAgICAgICZjb29raWVzW25dLT52YWx1ZSk7CisgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgfQorCisgICAgbmd4X2xvZ19kZWJ1ZzQoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgInVpZDogJTA4WEQlMDhYRCUwOFhEJTA4WEQiLAorICAgICAgICAgICAgICAgICAgIGN0eC0+dWlkX2dvdFswXSwgY3R4LT51aWRfZ290WzFdLAorICAgICAgICAgICAgICAgICAgIGN0eC0+dWlkX2dvdFsyXSwgY3R4LT51aWRfZ290WzNdKTsKKwogICAgIHJldHVybiBOR1hfT0s7CiB9CiAKQEAgLTQwNCw2ICszNzQsNyBAQAogICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KIAorICAgIHNldF9jb29raWUtPmhhc2ggPSAxOwogICAgIHNldF9jb29raWUtPmtleS5sZW4gPSBzaXplb2YoIlNldC1Db29raWUiKSAtIDE7CiAgICAgc2V0X2Nvb2tpZS0+a2V5LmRhdGEgPSAodV9jaGFyICopICJTZXQtQ29va2llIjsKICAgICBzZXRfY29va2llLT52YWx1ZS5sZW4gPSBwIC0gY29va2llOwpAQCAtNDIxLDYgKzM5Miw3IEBACiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCisgICAgcDNwLT5oYXNoID0gMTsKICAgICBwM3AtPmtleS5sZW4gPSBzaXplb2YoIlAzUCIpIC0gMTsKICAgICBwM3AtPmtleS5kYXRhID0gKHVfY2hhciAqKSAiUDNQIjsKICAgICBwM3AtPnZhbHVlID0gY29uZi0+cDNwOwpAQCAtNTcwLDcgKzU0Miw3IEBACiAgICAgICogICAgIGNvbmYtPnAzcC5kYXRlID0gTlVMTDsKICAgICAgKi8KIAotICAgIGNvbmYtPmVuYWJsZSA9IE5HWF9DT05GX1VOU0VUOworICAgIGNvbmYtPmVuYWJsZSA9IE5HWF9DT05GX1VOU0VUX1VJTlQ7CiAgICAgY29uZi0+c2VydmljZSA9IE5HWF9DT05GX1VOU0VUOwogICAgIGNvbmYtPmV4cGlyZXMgPSBOR1hfQ09ORl9VTlNFVDsKIApAQCAtNTg0LDcgKzU1Niw4IEBACiAgICAgbmd4X2h0dHBfdXNlcmlkX2NvbmZfdCAqcHJldiA9IHBhcmVudDsKICAgICBuZ3hfaHR0cF91c2VyaWRfY29uZl90ICpjb25mID0gY2hpbGQ7CiAKLSAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5lbmFibGUsIHByZXYtPmVuYWJsZSwgTkdYX0hUVFBfVVNFUklEX09GRik7CisgICAgbmd4X2NvbmZfbWVyZ2VfdW5zaWduZWRfdmFsdWUoY29uZi0+ZW5hYmxlLCBwcmV2LT5lbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfVVNFUklEX09GRik7CiAKICAgICBuZ3hfY29uZl9tZXJnZV9zdHJfdmFsdWUoY29uZi0+bmFtZSwgcHJldi0+bmFtZSwgInVpZCIpOwogICAgIG5neF9jb25mX21lcmdlX3N0cl92YWx1ZShjb25mLT5kb21haW4sIHByZXYtPmRvbWFpbiwgIiIpOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmMgYi9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hhbmRsZXIuYwppbmRleCAxMmQ0MTcxLi5iYzkxZGY5IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hhbmRsZXIuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X2hhbmRsZXIuYwpAQCAtMzExLDcgKzMxMSw3IEBACiAKIAogCi1uZ3hfaHR0cF9oZWFkZXJfdCBuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luW10gPSB7CituZ3hfaHR0cF9oZWFkZXIwX3Qgbmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbltdID0gewogICAgIHsgbmd4X3N0cmluZygiRGF0ZSIpLCBvZmZzZXRvZihuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luX3QsIGRhdGUpIH0sCiAgICAgeyBuZ3hfc3RyaW5nKCJTZXJ2ZXIiKSwgb2Zmc2V0b2Yobmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbl90LCBzZXJ2ZXIpIH0sCiAKQEAgLTQ5MCwxMyArNDkwLDI1IEBACiAjZW5kaWYKIAogCi12b2lkIG5neF9odHRwX3Byb3h5X2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uKG5neF9ldmVudF90ICpldikKK3ZvaWQgbmd4X2h0dHBfcHJveHlfcmRfY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb24obmd4X2h0dHBfcmVxdWVzdF90ICpyKQoreworICAgIG5neF9odHRwX3Byb3h5X2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uKHIsIHItPmNvbm5lY3Rpb24tPnJlYWQpOworfQorCisKK3ZvaWQgbmd4X2h0dHBfcHJveHlfd3JfY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb24obmd4X2h0dHBfcmVxdWVzdF90ICpyKQoreworICAgIG5neF9odHRwX3Byb3h5X2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uKHIsIHItPmNvbm5lY3Rpb24tPnJlYWQpOworfQorCisKK3ZvaWQgbmd4X2h0dHBfcHJveHlfY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb24obmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9ldmVudF90ICpldikKIHsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgIG47CiAgICAgY2hhciAgICAgICAgICAgICAgICAgICBidWZbMV07CiAgICAgbmd4X2Vycl90ICAgICAgICAgICAgICBlcnI7CiAgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICpjOwotICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAqcjsKICAgICBuZ3hfaHR0cF9wcm94eV9jdHhfdCAgKnA7CiAKICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIGV2LT5sb2csIDAsCkBAIC01MTAsOCArNTIyLDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGMgPSBldi0+ZGF0YTsKLSAgICAgICAgciA9IGMtPmRhdGE7CisgICAgICAgIGMgPSByLT5jb25uZWN0aW9uOwogICAgICAgICBwID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfcHJveHlfbW9kdWxlKTsKIAogICAgICAgICBldi0+ZW9mID0gMTsKQEAgLTU0Miw4ICs1NTMsNyBAQAogCiAjZW5kaWYKIAotICAgIGMgPSBldi0+ZGF0YTsKLSAgICByID0gYy0+ZGF0YTsKKyAgICBjID0gci0+Y29ubmVjdGlvbjsKICAgICBwID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgociwgbmd4X2h0dHBfcHJveHlfbW9kdWxlKTsKIAogICAgIG4gPSByZWN2KGMtPmZkLCBidWYsIDEsIE1TR19QRUVLKTsKQEAgLTcxMiwxMyArNzIyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgcC0+Y2FjaGUtPmN0eC5maWxlLmZkKTsKICAgICB9CiAKLSAgICBpZiAocC0+dXBzdHJlYW0gJiYgcC0+dXBzdHJlYW0tPmV2ZW50X3BpcGUpIHsKLSAgICAgICAgci0+ZmlsZS5mZCA9IHAtPnVwc3RyZWFtLT5ldmVudF9waXBlLT50ZW1wX2ZpbGUtPmZpbGUuZmQ7Ci0KLSAgICB9IGVsc2UgaWYgKHAtPmNhY2hlKSB7Ci0gICAgICAgIHItPmZpbGUuZmQgPSBwLT5jYWNoZS0+Y3R4LmZpbGUuZmQ7Ci0gICAgfQotCiAgICAgaWYgKHJjID09IDAgJiYgci0+bWFpbiA9PSBOVUxMKSB7CiAgICAgICAgIHJjID0gbmd4X2h0dHBfc2VuZF9sYXN0KHIpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfaGFuZGxlci5oIGIvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmgKaW5kZXggMmM5MjEwZi4uMTFjMjRiMSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmgKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV9oYW5kbGVyLmgKQEAgLTI0OSw3ICsyNDksMTAgQEAKIAogI2VuZGlmCiAKLXZvaWQgbmd4X2h0dHBfcHJveHlfY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb24obmd4X2V2ZW50X3QgKmV2KTsKK3ZvaWQgbmd4X2h0dHBfcHJveHlfcmRfY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb24obmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKK3ZvaWQgbmd4X2h0dHBfcHJveHlfd3JfY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb24obmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKK3ZvaWQgbmd4X2h0dHBfcHJveHlfY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb24obmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9ldmVudF90ICpldik7CiAKIHZvaWQgbmd4X2h0dHBfcHJveHlfYnVzeV9sb2NrX2hhbmRsZXIobmd4X2V2ZW50X3QgKnJldik7CiB2b2lkIG5neF9odHRwX3Byb3h5X3Vwc3RyZWFtX2J1c3lfbG9jayhuZ3hfaHR0cF9wcm94eV9jdHhfdCAqcCk7CkBAIC0yNjUsNyArMjY4LDcgQEAKIAogCiBleHRlcm4gbmd4X21vZHVsZV90ICBuZ3hfaHR0cF9wcm94eV9tb2R1bGU7Ci1leHRlcm4gbmd4X2h0dHBfaGVhZGVyX3Qgbmd4X2h0dHBfcHJveHlfaGVhZGVyc19pbltdOworZXh0ZXJuIG5neF9odHRwX2hlYWRlcjBfdCBuZ3hfaHR0cF9wcm94eV9oZWFkZXJzX2luW107CiAKIAogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X3Vwc3RyZWFtLmMgYi9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X3Vwc3RyZWFtLmMKaW5kZXggMTA3YWJhMy4uMGYxN2I5NSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV91cHN0cmVhbS5jCisrKyBiL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfdXBzdHJlYW0uYwpAQCAtMjQsNiArMjQsNyBAQAogc3RhdGljIHZvaWQgbmd4X2h0dHBfcHJveHlfcHJvY2Vzc191cHN0cmVhbV9oZWFkZXJzKG5neF9ldmVudF90ICpyZXYpOwogc3RhdGljIHNzaXplX3Qgbmd4X2h0dHBfcHJveHlfcmVhZF91cHN0cmVhbV9oZWFkZXIobmd4X2h0dHBfcHJveHlfY3R4X3QgKik7CiBzdGF0aWMgdm9pZCBuZ3hfaHR0cF9wcm94eV9zZW5kX3Jlc3BvbnNlKG5neF9odHRwX3Byb3h5X2N0eF90ICpwKTsKK3N0YXRpYyB2b2lkIG5neF9odHRwX3Byb3h5X3Byb2Nlc3NfZG93bnN0cmVhbShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwogc3RhdGljIHZvaWQgbmd4X2h0dHBfcHJveHlfcHJvY2Vzc19ib2R5KG5neF9ldmVudF90ICpldik7CiBzdGF0aWMgdm9pZCBuZ3hfaHR0cF9wcm94eV9uZXh0X3Vwc3RyZWFtKG5neF9odHRwX3Byb3h5X2N0eF90ICpwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfdWludF90IGZ0X3R5cGUpOwpAQCAtMTEyLDcgKzExMyw3IEBACiAgICAgICAgIGxlbiA9IGh0dHBfbWV0aG9kc1twLT51cHN0cmVhbS0+bWV0aG9kIC0gMV0ubGVuICsgdWMtPnVyaS5sZW47CiAKICAgICB9IGVsc2UgewotICAgICAgICBsZW4gPSByLT5tZXRob2RfbmFtZS5sZW4gKyB1Yy0+dXJpLmxlbjsKKyAgICAgICAgbGVuID0gci0+bWV0aG9kX25hbWUubGVuICsgMSArIHVjLT51cmkubGVuOwogICAgIH0KIAogICAgIGlmIChwLT5sY2YtPnBhc3NfdW5wYXJzZWRfdXJpICYmIHItPnZhbGlkX3VucGFyc2VkX3VyaSkgewpAQCAtMjYxLDcgKzI2Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBfbWV0aG9kc1twLT51cHN0cmVhbS0+bWV0aG9kIC0gMV0uZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9tZXRob2RzW3AtPnVwc3RyZWFtLT5tZXRob2QgLSAxXS5sZW4pOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPm1ldGhvZF9uYW1lLmRhdGEsIHItPm1ldGhvZF9uYW1lLmxlbik7CisgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPm1ldGhvZF9uYW1lLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPm1ldGhvZF9uYW1lLmxlbiArIDEpOwogICAgIH0KIAogICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHVjLT51cmkuZGF0YSwgdWMtPnVyaS5sZW4pOwpAQCAtNTAyLDEyICs1MDQsMTEgQEAKICAgICAgICAgbmd4X2RlbF90aW1lcihyLT5jb25uZWN0aW9uLT5yZWFkKTsKICAgICB9CiAKLSAgICByLT5jb25uZWN0aW9uLT5yZWFkLT5ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfcHJveHlfY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb247CisgICAgci0+cmVhZF9ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfcHJveHlfcmRfY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb247CiAKICAgICBpZiAobmd4X2V2ZW50X2ZsYWdzICYgTkdYX1VTRV9DTEVBUl9FVkVOVCkgewogCi0gICAgICAgIHItPmNvbm5lY3Rpb24tPndyaXRlLT5ldmVudF9oYW5kbGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm94eV9jaGVja19icm9rZW5fY29ubmVjdGlvbjsKKyAgICAgICAgci0+d3JpdGVfZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX3Byb3h5X3dyX2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uOwogCiAgICAgICAgIGlmICghci0+Y29ubmVjdGlvbi0+d3JpdGUtPmFjdGl2ZSkgewogICAgICAgICAgICAgaWYgKG5neF9hZGRfZXZlbnQoci0+Y29ubmVjdGlvbi0+d3JpdGUsIE5HWF9XUklURV9FVkVOVCwKQEAgLTc3MCw4ICs3NzEsOCBAQAogICAgIGMgPSBwLT51cHN0cmVhbS0+cGVlci5jb25uZWN0aW9uOwogCiAgICAgYy0+ZGF0YSA9IHA7Ci0gICAgYy0+d3JpdGUtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV9zZW5kX3JlcXVlc3RfaGFuZGxlcjsKLSAgICBjLT5yZWFkLT5ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfcHJveHlfcHJvY2Vzc191cHN0cmVhbV9zdGF0dXNfbGluZTsKKyAgICBjLT53cml0ZS0+aGFuZGxlciA9IG5neF9odHRwX3Byb3h5X3NlbmRfcmVxdWVzdF9oYW5kbGVyOworICAgIGMtPnJlYWQtPmhhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX3Vwc3RyZWFtX3N0YXR1c19saW5lOwogCiAgICAgYy0+c2VuZGZpbGUgPSByLT5jb25uZWN0aW9uLT5zZW5kZmlsZTsKIApAQCAtOTI1LDkgKzkyNiw5IEBACiAgICAgfQogI2VuZGlmCiAKLSAgICBjLT53cml0ZS0+ZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX3Byb3h5X2R1bW15X2hhbmRsZXI7CisgICAgYy0+d3JpdGUtPmhhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV9kdW1teV9oYW5kbGVyOwogCi0gICAgaWYgKG5neF9oYW5kbGVfbGV2ZWxfd3JpdGVfZXZlbnQoYy0+d3JpdGUpID09IE5HWF9FUlJPUikgeworICAgIGlmIChuZ3hfaGFuZGxlX3dyaXRlX2V2ZW50KGMtPndyaXRlLCAwKSA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgbmd4X2h0dHBfcHJveHlfZmluYWxpemVfcmVxdWVzdChwLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTEyNCw3ICsxMTI1LDcgQEAKICAgICB9CiAKIAotICAgIGMtPnJlYWQtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX3Vwc3RyZWFtX2hlYWRlcnM7CisgICAgYy0+cmVhZC0+aGFuZGxlciA9IG5neF9odHRwX3Byb3h5X3Byb2Nlc3NfdXBzdHJlYW1faGVhZGVyczsKICAgICBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX3Vwc3RyZWFtX2hlYWRlcnMocmV2KTsKIH0KIApAQCAtMTE3NCw3ICsxMTc1LDcgQEAKIAogICAgICAgICByYyA9IG5neF9odHRwX3BhcnNlX2hlYWRlcl9saW5lKHAtPnJlcXVlc3QsIHAtPmhlYWRlcl9pbik7CiAKLSAgICAgICAgaWYgKHJjID09IE5HWF9PSykgeworICAgICAgICBpZiAocmMgPT0gTkdYX09LICYmICFyLT5pbnZhbGlkX2hlYWRlcikgewogCiAgICAgICAgICAgICAvKiBhIGhlYWRlciBsaW5lIGhhcyBiZWVuIHBhcnNlZCBzdWNjZXNzZnVsbHkgKi8KIApAQCAtMTI0MSw2ICsxMjQyLDEwIEBACiAKICAgICAgICAgfSBlbHNlIGlmIChyYyAhPSBOR1hfQUdBSU4pIHsKIAorICAgICAgICAgICAgaWYgKHItPmludmFsaWRfaGVhZGVyKSB7CisgICAgICAgICAgICAgICAgcmMgPSBOR1hfSFRUUF9QQVJTRV9JTlZBTElEX0hFQURFUjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLyogdGhlcmUgd2FzIGVycm9yIHdoaWxlIGEgaGVhZGVyIGxpbmUgcGFyc2luZyAqLwogCiAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByZXYtPmxvZywgMCwKQEAgLTE0NjUsOSArMTQ3MCw4IEBACiAgICAgZXAtPnNlbmRfdGltZW91dCA9IGNsY2YtPnNlbmRfdGltZW91dDsKICAgICBlcC0+c2VuZF9sb3dhdCA9IGNsY2YtPnNlbmRfbG93YXQ7CiAKLSAgICBwLT51cHN0cmVhbS0+cGVlci5jb25uZWN0aW9uLT5yZWFkLT5ldmVudF9oYW5kbGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb3h5X3Byb2Nlc3NfYm9keTsKLSAgICByLT5jb25uZWN0aW9uLT53cml0ZS0+ZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX3Byb3h5X3Byb2Nlc3NfYm9keTsKKyAgICBwLT51cHN0cmVhbS0+cGVlci5jb25uZWN0aW9uLT5yZWFkLT5oYW5kbGVyID0gbmd4X2h0dHBfcHJveHlfcHJvY2Vzc19ib2R5OworICAgIHItPndyaXRlX2V2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX2Rvd25zdHJlYW07CiAKICAgICBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX2JvZHkocC0+dXBzdHJlYW0tPnBlZXIuY29ubmVjdGlvbi0+cmVhZCk7CiAKQEAgLTE0NzUsNiArMTQ3OSwxMiBAQAogfQogCiAKK3N0YXRpYyB2b2lkIG5neF9odHRwX3Byb3h5X3Byb2Nlc3NfZG93bnN0cmVhbShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCit7CisgICAgbmd4X2h0dHBfcHJveHlfcHJvY2Vzc19ib2R5KHItPmNvbm5lY3Rpb24tPndyaXRlKTsKK30KKworCiBzdGF0aWMgdm9pZCBuZ3hfaHR0cF9wcm94eV9wcm9jZXNzX2JvZHkobmd4X2V2ZW50X3QgKmV2KQogewogICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAqYzsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cC5jCmluZGV4IGUyZDVmZTQuLjk0ZjcxOGQgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHAuYwpAQCAtNTMsNyArNTMsNyBAQAogCiAKIG5neF9tb2R1bGVfdCAgbmd4X2h0dHBfbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X2h0dHBfbW9kdWxlX2N0eCwgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLwogICAgIG5neF9odHRwX2NvbW1hbmRzLCAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0NPUkVfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KQEAgLTg1LDExICs4NSw2IEBACiAgICAgbmd4X2lvY3BfY29uZl90ICAgICAgICAgICAgICppb2NwY2Y7CiAjZW5kaWYKIAotI2lmIChOR1hfU1VQUFJFU1NfV0FSTikKLSAgICAvKiBNU1ZDIHRoaW5rcyAiaW5fcG9ydHMiIG1heSBiZSB1c2VkIHdpdGhvdXQgaGF2aW5nIGJlZW4gaW5pdGlhbGl6ZWQgKi8KLSAgICBuZ3hfbWVtemVybygmaW5fcG9ydHMsIHNpemVvZihuZ3hfYXJyYXlfdCkpOwotI2VuZGlmCi0KICAgICAvKiB0aGUgbWFpbiBodHRwIGNvbnRleHQgKi8KIAogICAgIGN0eCA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfY29uZl9jdHhfdCkpOwpAQCAtMTU2LDEyICsxNTEsNiBAQAogICAgICAgICBtb2R1bGUgPSBuZ3hfbW9kdWxlc1ttXS0+Y3R4OwogICAgICAgICBtaSA9IG5neF9tb2R1bGVzW21dLT5jdHhfaW5kZXg7CiAKLSAgICAgICAgaWYgKG1vZHVsZS0+cHJlX2NvbmYpIHsKLSAgICAgICAgICAgIGlmIChtb2R1bGUtPnByZV9jb25mKGNmKSAhPSBOR1hfT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICBpZiAobW9kdWxlLT5jcmVhdGVfbWFpbl9jb25mKSB7CiAgICAgICAgICAgICBjdHgtPm1haW5fY29uZlttaV0gPSBtb2R1bGUtPmNyZWF0ZV9tYWluX2NvbmYoY2YpOwogICAgICAgICAgICAgaWYgKGN0eC0+bWFpbl9jb25mW21pXSA9PSBOVUxMKSB7CkBAIC0xODQsMTEgKzE3MywyNiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcGNmID0gKmNmOworICAgIGNmLT5jdHggPSBjdHg7CisKKyAgICBmb3IgKG0gPSAwOyBuZ3hfbW9kdWxlc1ttXTsgbSsrKSB7CisgICAgICAgIGlmIChuZ3hfbW9kdWxlc1ttXS0+dHlwZSAhPSBOR1hfSFRUUF9NT0RVTEUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbW9kdWxlID0gbmd4X21vZHVsZXNbbV0tPmN0eDsKKyAgICAgICAgbWkgPSBuZ3hfbW9kdWxlc1ttXS0+Y3R4X2luZGV4OworCisgICAgICAgIGlmIChtb2R1bGUtPnByZWNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChtb2R1bGUtPnByZWNvbmZpZ3VyYXRpb24oY2YpICE9IE5HWF9PSykgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAogICAgIC8qIHBhcnNlIGluc2lkZSB0aGUgaHR0cHt9IGJsb2NrICovCiAKLSAgICBwY2YgPSAqY2Y7Ci0gICAgY2YtPmN0eCA9IGN0eDsKICAgICBjZi0+bW9kdWxlX3R5cGUgPSBOR1hfSFRUUF9NT0RVTEU7CiAgICAgY2YtPmNtZF90eXBlID0gTkdYX0hUVFBfTUFJTl9DT05GOwogICAgIHJ2ID0gbmd4X2NvbmZfcGFyc2UoY2YsIE5VTEwpOwpAQCAtMjY0LDExICsyNjgsNiBAQAogICAgIH0KIAogCi0gICAgLyogd2UgbmVlZGVkIGh0dHB7fSdzIGNmLT5jdHggd2hpbGUgdGhlIG1lcmdpbmcgY29uZmlndXJhdGlvbiAqLwotCi0gICAgKmNmID0gcGNmOwotCi0KICAgICAvKiBpbml0IGxpc3RzIG9mIHRoZSBoYW5kbGVycyAqLwogCiAgICAgaWYgKG5neF9hcnJheV9pbml0KCZjbWNmLT5waGFzZXNbTkdYX0hUVFBfUkVXUklURV9QSEFTRV0uaGFuZGxlcnMsCkBAIC0zMjEsNyArMzIwLDcgQEAKICAgICBjbWNmLT5oZWFkZXJzX2luX2hhc2guYnVja2V0X3NpemUgPSBzaXplb2Yobmd4X2h0dHBfaGVhZGVyX3QpOwogICAgIGNtY2YtPmhlYWRlcnNfaW5faGFzaC5uYW1lID0gImh0dHAgaGVhZGVyc19pbiI7CiAKLSAgICBpZiAobmd4X2hhc2hfaW5pdCgmY21jZi0+aGVhZGVyc19pbl9oYXNoLCBjZi0+cG9vbCwgbmd4X2h0dHBfaGVhZGVyc19pbikKKyAgICBpZiAobmd4X2hhc2hfaW5pdCgmY21jZi0+aGVhZGVyc19pbl9oYXNoLCBjZi0+cG9vbCwgbmd4X2h0dHBfaGVhZGVyc19pbiwgMCkKICAgICAgICAgIT0gTkdYX09LKQogICAgIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwpAQCAtMzI5LDggKzMyOCwzMiBAQAogCiAgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCBjZi0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICJodHRwIGhlYWRlcnNfaW4gaGFzaCBzaXplOiAldWksIG1heCBidWNrZXRzIHBlciBlbnRyeTogJXVpIiwKLSAgICAgICAgICAgICAgICAgICAgY21jZi0+aGVhZGVyc19pbl9oYXNoLmhhc2hfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgY21jZi0+aGVhZGVyc19pbl9oYXNoLm1pbl9idWNrZXRzKTsKKyAgICAgICAgICAgICAgICAgICBjbWNmLT5oZWFkZXJzX2luX2hhc2guaGFzaF9zaXplLAorICAgICAgICAgICAgICAgICAgIGNtY2YtPmhlYWRlcnNfaW5faGFzaC5taW5fYnVja2V0cyk7CisKKyAgICBmb3IgKG0gPSAwOyBuZ3hfbW9kdWxlc1ttXTsgbSsrKSB7CisgICAgICAgIGlmIChuZ3hfbW9kdWxlc1ttXS0+dHlwZSAhPSBOR1hfSFRUUF9NT0RVTEUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbW9kdWxlID0gbmd4X21vZHVsZXNbbV0tPmN0eDsKKyAgICAgICAgbWkgPSBuZ3hfbW9kdWxlc1ttXS0+Y3R4X2luZGV4OworCisgICAgICAgIGlmIChtb2R1bGUtPnBvc3Rjb25maWd1cmF0aW9uKSB7CisgICAgICAgICAgICBpZiAobW9kdWxlLT5wb3N0Y29uZmlndXJhdGlvbihjZikgIT0gTkdYX09LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIGh0dHB7fSdzIGNmLT5jdHggd2FzIG5lZWRlZCB3aGlsZSB0aGUgY29uZmlndXJhdGlvbiBtZXJnaW5nCisgICAgICogYW5kIGluIHBvc3Rjb25maWd1cmF0aW9uIHByb2Nlc3MKKyAgICAgKi8KKworICAgICpjZiA9IHBjZjsKKwogCiAgICAgLyoKICAgICAgKiBjcmVhdGUgdGhlIGxpc3RzIG9mIHBvcnRzLCBhZGRyZXNzZXMgYW5kIHNlcnZlciBuYW1lcwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHAuaCBiL3NyYy9odHRwL25neF9odHRwLmgKaW5kZXggZGVkOTRlMi4uOGFmMDZkMiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHAuaAorKysgYi9zcmMvaHR0cC9uZ3hfaHR0cC5oCkBAIC0xMiwxMSArMTIsMTYgQEAKICNpbmNsdWRlIDxuZ3hfY29yZS5oPgogI2luY2x1ZGUgPG5neF9nYXJiYWdlX2NvbGxlY3Rvci5oPgogCi10eXBlZGVmIHN0cnVjdCBuZ3hfaHR0cF9yZXF1ZXN0X3MgIG5neF9odHRwX3JlcXVlc3RfdDsKLXR5cGVkZWYgc3RydWN0IG5neF9odHRwX2xvZ19jdHhfcyAgbmd4X2h0dHBfbG9nX2N0eF90OwotdHlwZWRlZiBzdHJ1Y3Qgbmd4X2h0dHBfY2xlYW51cF9zICBuZ3hfaHR0cF9jbGVhbnVwX3Q7Ci10eXBlZGVmIHN0cnVjdCBuZ3hfaHR0cF9pbl9hZGRyX3MgIG5neF9odHRwX2luX2FkZHJfdDsKLXR5cGVkZWYgc3RydWN0IG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3MgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3Q7CisKK3R5cGVkZWYgc3RydWN0IG5neF9odHRwX3JlcXVlc3RfcyAgIG5neF9odHRwX3JlcXVlc3RfdDsKK3R5cGVkZWYgc3RydWN0IG5neF9odHRwX3Vwc3RyZWFtX3MgIG5neF9odHRwX3Vwc3RyZWFtX3Q7Cit0eXBlZGVmIHN0cnVjdCBuZ3hfaHR0cF9sb2dfY3R4X3MgICBuZ3hfaHR0cF9sb2dfY3R4X3Q7Cit0eXBlZGVmIHN0cnVjdCBuZ3hfaHR0cF9pbl9hZGRyX3MgICBuZ3hfaHR0cF9pbl9hZGRyX3Q7CisKK3R5cGVkZWYgbmd4X2ludF90ICgqbmd4X2h0dHBfaGVhZGVyX2hhbmRsZXJfcHQpKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfdGFibGVfZWx0X3QgKmgsIG5neF91aW50X3Qgb2Zmc2V0KTsKK3R5cGVkZWYgdV9jaGFyICooKm5neF9odHRwX2xvZ19oYW5kbGVyX3B0KShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAorICAgIHNpemVfdCBsZW4pOwogCiAKICNpZiAoTkdYX0hUVFBfQ0FDSEUpCkBAIC0yNSwxMyArMzAsMTMgQEAKIC8qIFNUVUIgKi8KICNpbmNsdWRlIDxuZ3hfaHR0cF9jYWNoZS5oPgogCi0jaW5jbHVkZSA8bmd4X2h0dHBfdXBzdHJlYW0uaD4KKyNpbmNsdWRlIDxuZ3hfaHR0cF92YXJpYWJsZXMuaD4KICNpbmNsdWRlIDxuZ3hfaHR0cF9yZXF1ZXN0Lmg+CisjaW5jbHVkZSA8bmd4X2h0dHBfdXBzdHJlYW0uaD4KICNpbmNsdWRlIDxuZ3hfaHR0cF9jb25maWcuaD4KICNpbmNsdWRlIDxuZ3hfaHR0cF9idXN5X2xvY2suaD4KICNpbmNsdWRlIDxuZ3hfaHR0cF9sb2dfbW9kdWxlLmg+CiAjaW5jbHVkZSA8bmd4X2h0dHBfY29yZV9tb2R1bGUuaD4KLSNpbmNsdWRlIDxuZ3hfaHR0cF92YXJpYWJsZXMuaD4KICNpbmNsdWRlIDxuZ3hfaHR0cF9zY3JpcHQuaD4KIAogI2lmIChOR1hfSFRUUF9TU0wpCkBAIC01OCwxNiArNjMsMTggQEAKIG5neF9pbnRfdCBuZ3hfaHR0cF9wYXJzZV9yZXF1ZXN0X2xpbmUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfYnVmX3QgKmIpOwogbmd4X2ludF90IG5neF9odHRwX3BhcnNlX2NvbXBsZXhfdXJpKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CiBuZ3hfaW50X3Qgbmd4X2h0dHBfcGFyc2VfaGVhZGVyX2xpbmUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfYnVmX3QgKmIpOworbmd4X2ludF90IG5neF9odHRwX3BhcnNlX211bHRpX2hlYWRlcl9saW5lcyhuZ3hfYXJyYXlfdCAqaGVhZGVycywKKyAgICBuZ3hfc3RyX3QgKm5hbWUsIG5neF9zdHJfdCAqdmFsdWUpOwogCiBuZ3hfaW50X3Qgbmd4X2h0dHBfZmluZF9zZXJ2ZXJfY29uZihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwogdm9pZCBuZ3hfaHR0cF9oYW5kbGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcik7Ci12b2lkIG5neF9odHRwX2ZpbmFsaXplX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBpbnQgZXJyb3IpOwotdm9pZCBuZ3hfaHR0cF93cml0ZXIobmd4X2V2ZW50X3QgKndldik7Cit2b2lkIG5neF9odHRwX2ZpbmFsaXplX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfaW50X3QgcmMpOwogCiB2b2lkIG5neF9odHRwX2VtcHR5X2hhbmRsZXIobmd4X2V2ZW50X3QgKndldik7Cit2b2lkIG5neF9odHRwX3JlcXVlc3RfZW1wdHlfaGFuZGxlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwogCiBuZ3hfaW50X3Qgbmd4X2h0dHBfc2VuZF9sYXN0KG5neF9odHRwX3JlcXVlc3RfdCAqcik7Ci12b2lkIG5neF9odHRwX2Nsb3NlX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBpbnQgZXJyb3IpOwordm9pZCBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2ludF90IGVycm9yKTsKIHZvaWQgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihuZ3hfY29ubmVjdGlvbl90ICpjKTsKIHVfY2hhciAqIG5neF9odHRwX2xvZ19lcnJvcl9pbmZvKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCiAgICAgc2l6ZV90IGxlbik7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9idXN5X2xvY2suYyBiL3NyYy9odHRwL25neF9odHRwX2J1c3lfbG9jay5jCmluZGV4IGZlMDQzOTAuLjJiYzIxMTAgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX2J1c3lfbG9jay5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX2J1c3lfbG9jay5jCkBAIC00Niw4ICs0NiwxMCBAQAogICAgIGlmIChibC0+d2FpdGluZyA8IGJsLT5tYXhfd2FpdGluZykgewogICAgICAgICBibC0+d2FpdGluZysrOwogCisjaWYgMAogICAgICAgICBuZ3hfYWRkX3RpbWVyKGJjLT5ldmVudCwgMTAwMCk7CiAgICAgICAgIGJjLT5ldmVudC0+ZXZlbnRfaGFuZGxlciA9IGJjLT5ldmVudF9oYW5kbGVyOworI2VuZGlmCiAKICAgICAgICAgLyogVE9ETzogbmd4X2hhbmRsZV9sZXZlbF9yZWFkX2V2ZW50KCkgKi8KIApAQCAtOTUsOSArOTcsMTEgQEAKICAgICB9CiAKICAgICBpZiAoYmwtPndhaXRpbmcgPCBibC0+bWF4X3dhaXRpbmcpIHsKKyNpZiAwCiAgICAgICAgIGJsLT53YWl0aW5nKys7CiAgICAgICAgIG5neF9hZGRfdGltZXIoYmMtPmV2ZW50LCAxMDAwKTsKICAgICAgICAgYmMtPmV2ZW50LT5ldmVudF9oYW5kbGVyID0gYmMtPmV2ZW50X2hhbmRsZXI7CisjZW5kaWYKIAogICAgICAgICAvKiBUT0RPOiBuZ3hfaGFuZGxlX2xldmVsX3JlYWRfZXZlbnQoKSAqLwogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9jb25maWcuaCBiL3NyYy9odHRwL25neF9odHRwX2NvbmZpZy5oCmluZGV4IDU4MTU1NmYuLjg5MTEwYzAgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX2NvbmZpZy5oCisrKyBiL3NyYy9odHRwL25neF9odHRwX2NvbmZpZy5oCkBAIC0yMCw3ICsyMCw4IEBACiAKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9pbnRfdCAgICgqcHJlX2NvbmYpKG5neF9jb25mX3QgKmNmKTsKKyAgICBuZ3hfaW50X3QgICAoKnByZWNvbmZpZ3VyYXRpb24pKG5neF9jb25mX3QgKmNmKTsKKyAgICBuZ3hfaW50X3QgICAoKnBvc3Rjb25maWd1cmF0aW9uKShuZ3hfY29uZl90ICpjZik7CiAKICAgICB2b2lkICAgICAgICooKmNyZWF0ZV9tYWluX2NvbmYpKG5neF9jb25mX3QgKmNmKTsKICAgICBjaGFyICAgICAgICooKmluaXRfbWFpbl9jb25mKShuZ3hfY29uZl90ICpjZiwgdm9pZCAqY29uZik7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9jb3B5X2ZpbHRlcl9tb2R1bGUuYyBiL3NyYy9odHRwL25neF9odHRwX2NvcHlfZmlsdGVyX21vZHVsZS5jCmluZGV4IDRlODk0MzguLjk4NTc5YTIgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX2NvcHlfZmlsdGVyX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX2NvcHlfZmlsdGVyX21vZHVsZS5jCkBAIC0zNCw3ICszNCw4IEBACiAKIAogc3RhdGljIG5neF9odHRwX21vZHVsZV90ICBuZ3hfaHR0cF9jb3B5X2ZpbHRlcl9tb2R1bGVfY3R4ID0gewotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZSBjb25mICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3Rjb25maWd1cmF0aW9uICovCiAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtYWluIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTQ4LDcgKzQ5LDcgQEAKIAogCiBuZ3hfbW9kdWxlX3QgIG5neF9odHRwX2NvcHlfZmlsdGVyX21vZHVsZSA9IHsKLSAgICBOR1hfTU9EVUxFLAorICAgIE5HWF9NT0RVTEVfVjEsCiAgICAgJm5neF9odHRwX2NvcHlfZmlsdGVyX21vZHVsZV9jdHgsICAgICAgLyogbW9kdWxlIGNvbnRleHQgKi8KICAgICBuZ3hfaHR0cF9jb3B5X2ZpbHRlcl9jb21tYW5kcywgICAgICAgICAvKiBtb2R1bGUgZGlyZWN0aXZlcyAqLwogICAgIE5HWF9IVFRQX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSB0eXBlICovCkBAIC02Myw2ICs2NCw3IEBACiBzdGF0aWMgbmd4X2ludF90CiBuZ3hfaHR0cF9jb3B5X2ZpbHRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9jaGFpbl90ICppbikKIHsKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgICByYzsKICAgICBuZ3hfb3V0cHV0X2NoYWluX2N0eF90ICAgICAgICpjdHg7CiAgICAgbmd4X2h0dHBfY29weV9maWx0ZXJfY29uZl90ICAqY29uZjsKIApAQCAtNzAsMTIgKzcyLDEzIEBACiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCi0gICAgY3R4ID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9jdHgoci0+bWFpbiA/IHItPm1haW4gOiByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jb3B5X2ZpbHRlcl9tb2R1bGUpOworICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJjb3B5IGZpbHRlcjogXCIlVlwiIiwgJnItPnVyaSk7CisKKyAgICBjdHggPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2N0eChyLCBuZ3hfaHR0cF9jb3B5X2ZpbHRlcl9tb2R1bGUpOwogCiAgICAgaWYgKGN0eCA9PSBOVUxMKSB7Ci0gICAgICAgIGNvbmYgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHItPm1haW4gPyByLT5tYWluIDogciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfY29weV9maWx0ZXJfbW9kdWxlKTsKKyAgICAgICAgY29uZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfY29weV9maWx0ZXJfbW9kdWxlKTsKIAogICAgICAgICBjdHggPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X291dHB1dF9jaGFpbl9jdHhfdCkpOwogICAgICAgICBpZiAoY3R4ID09IE5VTEwpIHsKQEAgLTk3LDcgKzEwMCwxMiBAQAogCiAgICAgfQogCi0gICAgcmV0dXJuIG5neF9vdXRwdXRfY2hhaW4oY3R4LCBpbik7CisgICAgcmMgPSBuZ3hfb3V0cHV0X2NoYWluKGN0eCwgaW4pOworCisgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImNvcHkgZmlsdGVyOiAlaSBcIiVWXCIiLCByYywgJnItPnVyaSk7CisKKyAgICByZXR1cm4gcmM7CiB9CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuYyBiL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmMKaW5kZXggMGFkMDhkNS4uMTNhYTQ0MCAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5jCkBAIC0xNywxMSArMTcsMTIgQEAKICNkZWZpbmUgTkdYX0hUVFBfTE9DQVRJT05fUkVHRVggICAgICAgICAgIDQKIAogCi1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9jb3JlX3BoYXNlX2V2ZW50X2hhbmRsZXIobmd4X2V2ZW50X3QgKnJldik7CiBzdGF0aWMgdm9pZCBuZ3hfaHR0cF9jb3JlX3J1bl9waGFzZXMobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfY29yZV9maW5kX2xvY2F0aW9uKG5neF9odHRwX3JlcXVlc3RfdCAqciwKICAgICBuZ3hfYXJyYXlfdCAqbG9jYXRpb25zLCBzaXplX3QgbGVuKTsKIAorc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9jb3JlX3ByZWNvbmZpZ3VyYXRpb24obmd4X2NvbmZfdCAqY2YpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9jb3JlX3Bvc3Rjb25maWd1cmF0aW9uKG5neF9jb25mX3QgKmNmKTsKIHN0YXRpYyB2b2lkICpuZ3hfaHR0cF9jb3JlX2NyZWF0ZV9tYWluX2NvbmYobmd4X2NvbmZfdCAqY2YpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX2NvcmVfaW5pdF9tYWluX2NvbmYobmd4X2NvbmZfdCAqY2YsIHZvaWQgKmNvbmYpOwogc3RhdGljIHZvaWQgKm5neF9odHRwX2NvcmVfY3JlYXRlX3Nydl9jb25mKG5neF9jb25mX3QgKmNmKTsKQEAgLTU0LDkgKzU1LDEwIEBACiAgICAgdm9pZCAqY29uZik7CiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfY29yZV9rZWVwYWxpdmUobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKICAgICB2b2lkICpjb25mKTsKK3N0YXRpYyBjaGFyICpuZ3hfaHR0cF9jb3JlX2ludGVybmFsKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCisgICAgdm9pZCAqY29uZik7CiAKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9jb3JlX2xvd2F0X2NoZWNrKG5neF9jb25mX3QgKmNmLCB2b2lkICpwb3N0LCB2b2lkICpkYXRhKTsKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfY29yZV9pbml0KG5neF9jeWNsZV90ICpjeWNsZSk7CiAKIHN0YXRpYyBuZ3hfY29uZl9wb3N0X3QgIG5neF9odHRwX2NvcmVfbG93YXRfcG9zdCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuZ3hfaHR0cF9jb3JlX2xvd2F0X2NoZWNrIH07CkBAIC0xODMsNyArMTg1LDggQEAKICAgICAgIE5VTEwgfSwKIAogICAgIHsgbmd4X3N0cmluZygicm9vdCIpLAotICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAorICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9IVFRQX0xJRl9DT05GCisgICAgICAgICAgICAgICAgICAgICAgICB8TkdYX0NPTkZfVEFLRTEsCiAgICAgICBuZ3hfaHR0cF9jb3JlX3Jvb3QsCiAgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCiAgICAgICAwLApAQCAtMjgxLDYgKzI4NCwxMyBAQAogICAgICAgMCwKICAgICAgIE5VTEwgfSwKIAorICAgIHsgbmd4X3N0cmluZygiaW50ZXJuYWwiKSwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX05PQVJHUywKKyAgICAgIG5neF9odHRwX2NvcmVfaW50ZXJuYWwsCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICAwLAorICAgICAgTlVMTCB9LAorCiAgICAgeyBuZ3hfc3RyaW5nKCJsaW5nZXJpbmdfdGltZSIpLAogICAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxLAogICAgICAgbmd4X2NvbmZfc2V0X21zZWNfc2xvdCwKQEAgLTMxMCw3ICszMjAsOCBAQAogICAgICAgTlVMTCB9LAogCiAgICAgeyBuZ3hfc3RyaW5nKCJlcnJvcl9wYWdlIiksCi0gICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfMk1PUkUsCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0hUVFBfTElGX0NPTkYKKyAgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfQ09ORl8yTU9SRSwKICAgICAgIG5neF9odHRwX2NvcmVfZXJyb3JfcGFnZSwKICAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKICAgICAgIDAsCkBAIC0zMzksNyArMzUwLDggQEAKIAogCiBuZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfY29yZV9tb2R1bGVfY3R4ID0gewotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZSBjb25mICovCisgICAgbmd4X2h0dHBfY29yZV9wcmVjb25maWd1cmF0aW9uLCAgICAgICAgLyogcHJlY29uZmlndXJhdGlvbiAqLworICAgIG5neF9odHRwX2NvcmVfcG9zdGNvbmZpZ3VyYXRpb24sICAgICAgIC8qIHBvc3Rjb25maWd1cmF0aW9uICovCiAKICAgICBuZ3hfaHR0cF9jb3JlX2NyZWF0ZV9tYWluX2NvbmYsICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCiAgICAgbmd4X2h0dHBfY29yZV9pbml0X21haW5fY29uZiwgICAgICAgICAgLyogaW5pdCBtYWluIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTM1MywxMSArMzY1LDExIEBACiAKIAogbmd4X21vZHVsZV90ICBuZ3hfaHR0cF9jb3JlX21vZHVsZSA9IHsKLSAgICBOR1hfTU9EVUxFLAorICAgIE5HWF9NT0RVTEVfVjEsCiAgICAgJm5neF9odHRwX2NvcmVfbW9kdWxlX2N0eCwgICAgICAgICAgICAgLyogbW9kdWxlIGNvbnRleHQgKi8KICAgICBuZ3hfaHR0cF9jb3JlX2NvbW1hbmRzLCAgICAgICAgICAgICAgICAvKiBtb2R1bGUgZGlyZWN0aXZlcyAqLwogICAgIE5HWF9IVFRQX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSB0eXBlICovCi0gICAgbmd4X2h0dHBfY29yZV9pbml0LCAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtb2R1bGUgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1vZHVsZSAqLwogICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgcHJvY2VzcyAqLwogfTsKIApAQCAtNDEzLDExICs0MjUsMTIgQEAKICAgICAvKiBURVNUIFNUVUIgKi8gci0+bGluZ2VyaW5nX2Nsb3NlID0gMTsKICNlbmRpZgogCi0gICAgci0+Y29ubmVjdGlvbi0+d3JpdGUtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF9jb3JlX3BoYXNlX2V2ZW50X2hhbmRsZXI7CisgICAgci0+d3JpdGVfZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX2NvcmVfcnVuX3BoYXNlczsKIAogICAgIHItPnZhbGlkX3VucGFyc2VkX3VyaSA9IDE7CisgICAgci0+dmFsaWRfbG9jYXRpb24gPSAxOwogICAgIHItPnVyaV9jaGFuZ2VkID0gMTsKLSAgICByLT51cmlfY2hhbmdlcyA9IDExOworICAgIHItPnVyaV9jaGFuZ2VzID0gTkdYX0hUVFBfTUFYX1JFV1JJVEVfQ1lDTEVTICsgMTsKIAogICAgIHItPnBoYXNlID0gTkdYX0hUVFBfUkVXUklURV9QSEFTRTsKICAgICByLT5waGFzZV9oYW5kbGVyID0gMDsKQEAgLTQyNywyMSArNDQwLDYgQEAKIAogCiBzdGF0aWMgdm9pZAotbmd4X2h0dHBfY29yZV9waGFzZV9ldmVudF9oYW5kbGVyKG5neF9ldmVudF90ICpldikKLXsKLSAgICBuZ3hfY29ubmVjdGlvbl90ICAgICpjOwotICAgIG5neF9odHRwX3JlcXVlc3RfdCAgKnI7Ci0KLSAgICBjID0gZXYtPmRhdGE7Ci0gICAgciA9IGMtPmRhdGE7Ci0KLSAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIGV2LT5sb2csIDAsICJwaGFzZSBldmVudCBoYW5kbGVyIik7Ci0KLSAgICBuZ3hfaHR0cF9jb3JlX3J1bl9waGFzZXMocik7Ci19Ci0KLQotc3RhdGljIHZvaWQKIG5neF9odHRwX2NvcmVfcnVuX3BoYXNlcyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7CiAgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgIHJjOwpAQCAtNDQ5LDYgKzQ0Nyw5IEBACiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAgKmNsY2Y7CiAgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7CiAKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCBwaGFzZSBoYW5kbGVyIik7CisKICAgICBjbWNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9tYWluX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwogCiAgICAgZm9yICgvKiB2b2lkICovOyByLT5waGFzZSA8IE5HWF9IVFRQX0xBU1RfUEhBU0U7IHItPnBoYXNlKyspIHsKQEAgLTQ3OCw3ICs0NzksNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKHItPnBoYXNlID09IE5HWF9IVFRQX0NPTlRFTlRfUEhBU0UgJiYgci0+Y29udGVudF9oYW5kbGVyKSB7Ci0gICAgICAgICAgICByLT5jb25uZWN0aW9uLT53cml0ZS0+ZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX2VtcHR5X2hhbmRsZXI7CisgICAgICAgICAgICByLT53cml0ZV9ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfcmVxdWVzdF9lbXB0eV9oYW5kbGVyOwogICAgICAgICAgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCByLT5jb250ZW50X2hhbmRsZXIocikpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC01NjQsNiArNTY1LDEwIEBACiAKICAgICBjbGNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CiAKKyAgICBpZiAoIXItPmludGVybmFsICYmIGNsY2YtPmludGVybmFsKSB7CisgICAgICAgIHJldHVybiBOR1hfSFRUUF9OT1RfRk9VTkQ7CisgICAgfQorCiAgICAgci0+Y29ubmVjdGlvbi0+bG9nLT5maWxlID0gY2xjZi0+ZXJyX2xvZy0+ZmlsZTsKICAgICBpZiAoIShyLT5jb25uZWN0aW9uLT5sb2ctPmxvZ19sZXZlbCAmIE5HWF9MT0dfREVCVUdfQ09OTkVDVElPTikpIHsKICAgICAgICAgci0+Y29ubmVjdGlvbi0+bG9nLT5sb2dfbGV2ZWwgPSBjbGNmLT5lcnJfbG9nLT5sb2dfbGV2ZWw7CkBAIC02MDgsNiArNjEzLDExIEBACiAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgLyoKKyAgICAgICAgICogd2UgZG8gbm90IG5lZWQgdG8gc2V0IHRoZSByLT5oZWFkZXJzX291dC5sb2NhdGlvbi0+aGFzaCBhbmQKKyAgICAgICAgICogci0+aGVhZGVyc19vdXQubG9jYXRpb24tPmtleSBmaWVsZHMKKyAgICAgICAgICovCisKICAgICAgICAgci0+aGVhZGVyc19vdXQubG9jYXRpb24tPnZhbHVlID0gY2xjZi0+bmFtZTsKIAogICAgICAgICByZXR1cm4gTkdYX0hUVFBfTU9WRURfUEVSTUFORU5UTFk7CkBAIC03NjUsMTYgKzc3NSw2IEBACiAgICAgbmd4X2h0dHBfdHlwZV90ICAgICAgICAgICAqdHlwZTsKICAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICpjbGNmOwogCi0gICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19vdXQuaGVhZGVycyk7Ci0gICAgaWYgKHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLT5rZXkubGVuID0gMDsKLSAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUtPmtleS5kYXRhID0gTlVMTDsKLSAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUtPnZhbHVlLmxlbiA9IDA7Ci0gICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLT52YWx1ZS5kYXRhID0gTlVMTDsKLQogICAgIGNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKIAogICAgIGlmIChyLT5leHRlbi5sZW4pIHsKQEAgLTgxMCw5ICs4MTAsNiBAQAogICAgICAgICAgICAgci0+bG93X2Nhc2VfZXh0ZW4gPSAxOwogICAgICAgICB9CiAKLSNpZiAwCi0gICAgICAgIGtleSA9IG5neF9jcmMoci0+ZXh0ZW4uZGF0YSwgci0+ZXh0ZW4ua2V5KTsKLSNlbmRpZgogICAgICAgICBuZ3hfaHR0cF90eXBlc19oYXNoX2tleShrZXksIHItPmV4dGVuKTsKIAogICAgICAgICB0eXBlID0gY2xjZi0+dHlwZXNba2V5XS5lbHRzOwpAQCAtODI0LDE0ICs4MjEsMTQgQEAKICAgICAgICAgICAgIGlmIChuZ3hfbWVtY21wKHItPmV4dGVuLmRhdGEsIHR5cGVbaV0uZXh0ZW4uZGF0YSwgci0+ZXh0ZW4ubGVuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gMCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUtPnZhbHVlID0gdHlwZVtpXS50eXBlOworICAgICAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZSA9IHR5cGVbaV0udHlwZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUtPnZhbHVlLmxlbiA9PSAwKSB7Ci0gICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS0+dmFsdWUgPSBjbGNmLT5kZWZhdWx0X3R5cGU7CisgICAgaWYgKHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS5sZW4gPT0gMCkgeworICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGU9IGNsY2YtPmRlZmF1bHRfdHlwZTsKICAgICB9CiAKICAgICByZXR1cm4gTkdYX09LOwpAQCAtODQxLDEwICs4MzgsNiBAQAogbmd4X2ludF90CiBuZ3hfaHR0cF9zZW5kX2hlYWRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7Ci0gICAgaWYgKHItPm1haW4pIHsKLSAgICAgICAgcmV0dXJuIE5HWF9PSzsKLSAgICB9Ci0KICAgICBpZiAoci0+ZXJyX2N0eCkgewogICAgICAgICByLT5oZWFkZXJzX291dC5zdGF0dXMgPSByLT5lcnJfc3RhdHVzOwogICAgICAgICByLT5oZWFkZXJzX291dC5zdGF0dXNfbGluZS5sZW4gPSAwOwpAQCAtODYzLDEyICs4NTYsMTMgQEAKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKKyAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCBvdXRwdXQgZmlsdGVyIFwiJVZcIiIsICZyLT51cmkpOworCiAgICAgcmMgPSBuZ3hfaHR0cF90b3BfYm9keV9maWx0ZXIociwgaW4pOwogCiAgICAgaWYgKHJjID09IE5HWF9FUlJPUikgewotCiAgICAgICAgIC8qIE5HWF9FUlJPUiBtYXkgYmUgcmV0dXJuZWQgYnkgYW55IGZpbHRlciAqLwotCiAgICAgICAgIHItPmNvbm5lY3Rpb24tPndyaXRlLT5lcnJvciA9IDE7CiAgICAgfQogCkBAIC05MjQsNiArOTE4LDExNCBAQAogCiAKIG5neF9pbnRfdAorbmd4X2h0dHBfc3VicmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X3N0cl90ICp1cmksIG5neF9zdHJfdCAqYXJncykKK3sKKyAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAgICAgICAqc3I7CisgICAgbmd4X2h0dHBfY29yZV9zcnZfY29uZl90ICAgICAgKmNzY2Y7CisgICAgbmd4X2h0dHBfcG9zdHBvbmVkX3JlcXVlc3RfdCAgKnByLCAqcDsKKworICAgIHNyID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3JlcXVlc3RfdCkpOworICAgIGlmIChzciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgfQorCisgICAgc3ItPnNpZ25hdHVyZSA9IE5HWF9IVFRQX01PRFVMRTsKKyAgICBzci0+Y29ubmVjdGlvbiA9IHItPmNvbm5lY3Rpb247CisKKyAgICBzci0+Y3R4ID0gbmd4X3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKHZvaWQgKikgKiBuZ3hfaHR0cF9tYXhfbW9kdWxlKTsKKyAgICBpZiAoc3ItPmN0eCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgfQorCisgICAgaWYgKG5neF9saXN0X2luaXQoJnNyLT5oZWFkZXJzX291dC5oZWFkZXJzLCByLT5wb29sLCAyMCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X3RhYmxlX2VsdF90KSkgPT0gTkdYX0VSUk9SKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICB9CisKKyAgICBjc2NmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9zcnZfY29uZihyLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CisgICAgc3ItPm1haW5fY29uZiA9IGNzY2YtPmN0eC0+bWFpbl9jb25mOworICAgIHNyLT5zcnZfY29uZiA9IGNzY2YtPmN0eC0+c3J2X2NvbmY7CisgICAgc3ItPmxvY19jb25mID0gY3NjZi0+Y3R4LT5sb2NfY29uZjsKKworICAgIHNyLT5wb29sID0gci0+cG9vbDsKKworICAgIHNyLT5oZWFkZXJzX2luID0gci0+aGVhZGVyc19pbjsKKworICAgIHNyLT5zdGFydF90aW1lID0gbmd4X3RpbWUoKTsKKyAgICBzci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGhfbiA9IC0xOworICAgIHNyLT5oZWFkZXJzX291dC5sYXN0X21vZGlmaWVkX3RpbWUgPSAtMTsKKworICAgIHNyLT5yZXF1ZXN0X2JvZHkgPSByLT5yZXF1ZXN0X2JvZHk7CisKKyAgICBzci0+bWV0aG9kID0gTkdYX0hUVFBfR0VUOworICAgIHNyLT5odHRwX3ZlcnNpb24gPSByLT5odHRwX3ZlcnNpb247CisgICAgc3ItPmh0dHBfbWFqb3IgPSByLT5odHRwX21pbm9yOworCisgICAgc3ItPnJlcXVlc3RfbGluZSA9IHItPnJlcXVlc3RfbGluZTsKKyAgICBzci0+dXJpID0gKnVyaTsKKyAgICBpZiAoYXJncykgeworICAgICAgICBzci0+YXJncyA9ICphcmdzOworICAgIH0KKyAgICBzci0+dW5wYXJzZWRfdXJpID0gci0+dW5wYXJzZWRfdXJpOworICAgIHNyLT5tZXRob2RfbmFtZSA9IHItPm1ldGhvZF9uYW1lOworICAgIHNyLT5odHRwX3Byb3RvY29sID0gci0+aHR0cF9wcm90b2NvbDsKKworICAgIGlmIChuZ3hfaHR0cF9zZXRfZXh0ZW4oc3IpICE9IE5HWF9PSykgeworICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgIH0KKworICAgIHNyLT5tYWluID0gci0+bWFpbiA/IHItPm1haW4gOiByOworICAgIHNyLT5wYXJlbnQgPSByOworICAgIHNyLT5yZWFkX2V2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF9yZXF1ZXN0X2VtcHR5X2hhbmRsZXI7CisgICAgc3ItPndyaXRlX2V2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF9yZXF1ZXN0X2VtcHR5X2hhbmRsZXI7CisKKyAgICBpZiAoci0+Y29ubmVjdGlvbi0+ZGF0YSA9PSByKSB7CisgICAgICAgIHNyLT5jb25uZWN0aW9uLT5kYXRhID0gc3I7CisgICAgfQorCisgICAgc3ItPmluX2FkZHIgPSByLT5pbl9hZGRyOworICAgIHNyLT5wb3J0ID0gci0+cG9ydDsKKyAgICBzci0+cG9ydF90ZXh0ID0gci0+cG9ydF90ZXh0OworICAgIHNyLT5zZXJ2ZXJfbmFtZSA9IHItPnNlcnZlcl9uYW1lOworCisgICAgc3ItPnZhcmlhYmxlcyA9IHItPnZhcmlhYmxlczsKKworICAgIHNyLT5sb2dfaGFuZGxlciA9IHItPmxvZ19oYW5kbGVyOworCisgICAgcHIgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9wb3N0cG9uZWRfcmVxdWVzdF90KSk7CisgICAgaWYgKHByID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICB9CisKKyAgICBwci0+cmVxdWVzdCA9IHNyOworICAgIHByLT5vdXQgPSBOVUxMOworICAgIHByLT5uZXh0ID0gTlVMTDsKKworICAgIGlmIChyLT5wb3N0cG9uZWQpIHsKKyAgICAgICAgZm9yIChwID0gci0+cG9zdHBvbmVkOyBwLT5uZXh0OyBwID0gcC0+bmV4dCkgeyAvKiB2b2lkICovIH0KKyAgICAgICAgcC0+bmV4dCA9IHByOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgci0+cG9zdHBvbmVkID0gcHI7CisgICAgfQorCisgICAgc3ItPmludGVybmFsID0gMTsKKworICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIHN1YnJlcXVlc3QgXCIlVlwiIiwgdXJpKTsKKworICAgIG5neF9odHRwX2hhbmRsZXIoc3IpOworCisgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgc3VicmVxdWVzdCBcIiVWXCIgZG9uZSIsIHVyaSk7CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK25neF9pbnRfdAogbmd4X2h0dHBfaW50ZXJuYWxfcmVkaXJlY3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLAogICAgIG5neF9zdHJfdCAqdXJpLCBuZ3hfc3RyX3QgKmFyZ3MpCiB7CkBAIC05MzYsNiArMTAzOCwxMCBAQAogCiAgICAgaWYgKGFyZ3MpIHsKICAgICAgICAgci0+YXJncyA9ICphcmdzOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgci0+YXJncy5sZW4gPSAwOworICAgICAgICByLT5hcmdzLmRhdGEgPSBOVUxMOwogICAgIH0KIAogICAgIGlmIChuZ3hfaHR0cF9zZXRfZXh0ZW4ocikgIT0gTkdYX09LKSB7CkBAIC05NjEsNiArMTA2Nyw4IEBACiAgICAgY3NjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfc3J2X2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwogICAgIHItPmxvY19jb25mID0gY3NjZi0+Y3R4LT5sb2NfY29uZjsKIAorICAgIHItPmludGVybmFsID0gMTsKKwogICAgIG5neF9odHRwX2hhbmRsZXIocik7CiAKICAgICByZXR1cm4gTkdYX0RPTkU7CkBAIC0xMzc2LDYgKzE0ODQsMjAgQEAKIH0KIAogCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9jb3JlX3ByZWNvbmZpZ3VyYXRpb24obmd4X2NvbmZfdCAqY2YpCit7CisgICAgcmV0dXJuIG5neF9odHRwX3ZhcmlhYmxlc19hZGRfY29yZV92YXJzKGNmKTsKK30KKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9jb3JlX3Bvc3Rjb25maWd1cmF0aW9uKG5neF9jb25mX3QgKmNmKQoreworICAgIHJldHVybiBuZ3hfaHR0cF92YXJpYWJsZXNfaW5pdF92YXJzKGNmKTsKK30KKworCiBzdGF0aWMgdm9pZCAqCiBuZ3hfaHR0cF9jb3JlX2NyZWF0ZV9tYWluX2NvbmYobmd4X2NvbmZfdCAqY2YpCiB7CkBAIC0xNTc1LDYgKzE2OTcsNyBAQAogICAgIGxjZi0+Y2xpZW50X21heF9ib2R5X3NpemUgPSBOR1hfQ09ORl9VTlNFVF9TSVpFOwogICAgIGxjZi0+Y2xpZW50X2JvZHlfYnVmZmVyX3NpemUgPSBOR1hfQ09ORl9VTlNFVF9TSVpFOwogICAgIGxjZi0+Y2xpZW50X2JvZHlfdGltZW91dCA9IE5HWF9DT05GX1VOU0VUX01TRUM7CisgICAgbGNmLT5pbnRlcm5hbCA9IE5HWF9DT05GX1VOU0VUOwogICAgIGxjZi0+c2VuZGZpbGUgPSBOR1hfQ09ORl9VTlNFVDsKICAgICBsY2YtPnRjcF9ub3B1c2ggPSBOR1hfQ09ORl9VTlNFVDsKICAgICBsY2YtPnRjcF9ub2RlbGF5ID0gTkdYX0NPTkZfVU5TRVQ7CkBAIC0xNjczLDkgKzE3OTYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpIDIgKiBuZ3hfcGFnZXNpemUpOwogICAgIG5neF9jb25mX21lcmdlX21zZWNfdmFsdWUoY29uZi0+Y2xpZW50X2JvZHlfdGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPmNsaWVudF9ib2R5X3RpbWVvdXQsIDYwMDAwKTsKKworICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPmludGVybmFsLCBwcmV2LT5pbnRlcm5hbCwgMCk7CiAgICAgbmd4X2NvbmZfbWVyZ2VfdmFsdWUoY29uZi0+c2VuZGZpbGUsIHByZXYtPnNlbmRmaWxlLCAwKTsKICAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT50Y3Bfbm9wdXNoLCBwcmV2LT50Y3Bfbm9wdXNoLCAwKTsKICAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT50Y3Bfbm9kZWxheSwgcHJldi0+dGNwX25vZGVsYXksIDApOworCiAgICAgbmd4X2NvbmZfbWVyZ2VfbXNlY192YWx1ZShjb25mLT5zZW5kX3RpbWVvdXQsIHByZXYtPnNlbmRfdGltZW91dCwgNjAwMDApOwogICAgIG5neF9jb25mX21lcmdlX3NpemVfdmFsdWUoY29uZi0+c2VuZF9sb3dhdCwgcHJldi0+c2VuZF9sb3dhdCwgMCk7CiAgICAgbmd4X2NvbmZfbWVyZ2Vfc2l6ZV92YWx1ZShjb25mLT5wb3N0cG9uZV9vdXRwdXQsIHByZXYtPnBvc3Rwb25lX291dHB1dCwKQEAgLTE5NjMsNiArMjA4OSwyMCBAQAogCiAKIHN0YXRpYyBjaGFyICoKK25neF9odHRwX2NvcmVfZXJyb3JfbG9nKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCit7CisgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICpsY2YgPSBjb25mOworCisgICAgbGNmLT5lcnJfbG9nID0gbmd4X2xvZ19jcmVhdGVfZXJybG9nKGNmLT5jeWNsZSwgY2YtPmFyZ3MpOworICAgIGlmIChsY2YtPmVycl9sb2cgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0NPTkZfRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIG5neF9zZXRfZXJyb3JfbG9nX2xldmVscyhjZiwgbGNmLT5lcnJfbG9nKTsKK30KKworCitzdGF0aWMgY2hhciAqCiBuZ3hfaHR0cF9jb3JlX2tlZXBhbGl2ZShuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQogewogICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAqbGNmID0gY29uZjsKQEAgLTIwMDQsMTYgKzIxNDQsMTcgQEAKIAogCiBzdGF0aWMgY2hhciAqCi1uZ3hfaHR0cF9jb3JlX2Vycm9yX2xvZyhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQorbmd4X2h0dHBfY29yZV9pbnRlcm5hbChuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQogewogICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAqbGNmID0gY29uZjsKIAotICAgIGxjZi0+ZXJyX2xvZyA9IG5neF9sb2dfY3JlYXRlX2VycmxvZyhjZi0+Y3ljbGUsIGNmLT5hcmdzKTsKLSAgICBpZiAobGNmLT5lcnJfbG9nID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOworICAgIGlmIChsY2YtPmludGVybmFsICE9IE5HWF9DT05GX1VOU0VUKSB7CisgICAgICAgIHJldHVybiAiaXMgZHVwbGljYXRlIjsKICAgICB9CiAKLSAgICByZXR1cm4gbmd4X3NldF9lcnJvcl9sb2dfbGV2ZWxzKGNmLCBsY2YtPmVycl9sb2cpOworICAgIGxjZi0+aW50ZXJuYWwgPSAxOworCisgICAgcmV0dXJuIE5HWF9DT05GX09LOwogfQogCiAKQEAgLTIwNDQsMTAgKzIxODUsMyBAQAogCiAgICAgcmV0dXJuIE5HWF9DT05GX09LOwogfQotCi0KLXN0YXRpYyBuZ3hfaW50X3QKLW5neF9odHRwX2NvcmVfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCi17Ci0gICAgcmV0dXJuIG5neF9odHRwX3ZhcmlhYmxlc19pbml0KGN5Y2xlKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmggYi9zcmMvaHR0cC9uZ3hfaHR0cF9jb3JlX21vZHVsZS5oCmluZGV4IGFjNTcyZDYuLjJiMmExZDAgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX2NvcmVfbW9kdWxlLmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfY29yZV9tb2R1bGUuaApAQCAtNDksNiArNDksNyBAQAogICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgIGluZGV4X2hhbmRsZXJzOwogCiAgICAgbmd4X2hhc2hfdCAgICAgICAgICAgICAgICAgaGVhZGVyc19pbl9oYXNoOworICAgIG5neF9oYXNoX3QgICAgICAgICAgICAgICAgIHZhcmlhYmxlc19oYXNoOwogCiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgc2VydmVyX25hbWVzX2hhc2g7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgc2VydmVyX25hbWVzX2hhc2hfdGhyZXNob2xkOwpAQCAtNTYsNiArNTcsNyBAQAogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgIG1heF9zZXJ2ZXJfbmFtZV9sZW47CiAKICAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICB2YXJpYWJsZXM7ICAgICAgICAvKiBuZ3hfaHR0cF92YXJpYWJsZV90ICovCisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgYWxsX3ZhcmlhYmxlczsgICAgLyogbmd4X2h0dHBfdmFyaWFibGVfdCAqLwogfSBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90OwogCiAKQEAgLTE5Nyw2ICsxOTksNyBAQAogCiAgICAgdGltZV90ICAgICAgICBrZWVwYWxpdmVfaGVhZGVyOyAgICAgICAgLyoga2VlcGFsaXZlX3RpbWVvdXQgKi8KIAorICAgIG5neF9mbGFnX3QgICAgaW50ZXJuYWw7ICAgICAgICAgICAgICAgIC8qIGludGVybmFsICovCiAgICAgbmd4X2ZsYWdfdCAgICBzZW5kZmlsZTsgICAgICAgICAgICAgICAgLyogc2VuZGZpbGUgKi8KICAgICBuZ3hfZmxhZ190ICAgIHRjcF9ub3B1c2g7ICAgICAgICAgICAgICAvKiB0Y3Bfbm9wdXNoICovCiAgICAgbmd4X2ZsYWdfdCAgICB0Y3Bfbm9kZWxheTsgICAgICAgICAgICAgLyogdGNwX25vZGVsYXkgKi8KQEAgLTIzMCw2ICsyMzMsOCBAQAogbmd4X2ludF90IG5neF9odHRwX3NldF9jb250ZW50X3R5cGUobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKIG5neF9pbnRfdCBuZ3hfaHR0cF9zZXRfZXh0ZW4obmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKIAorbmd4X2ludF90IG5neF9odHRwX3N1YnJlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9zdHJfdCAqdXJpLCBuZ3hfc3RyX3QgKmFyZ3MpOwogbmd4X2ludF90IG5neF9odHRwX2ludGVybmFsX3JlZGlyZWN0KG5neF9odHRwX3JlcXVlc3RfdCAqciwKICAgICBuZ3hfc3RyX3QgKnVyaSwgbmd4X3N0cl90ICphcmdzKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfaGVhZGVyX2ZpbHRlcl9tb2R1bGUuYyBiL3NyYy9odHRwL25neF9odHRwX2hlYWRlcl9maWx0ZXJfbW9kdWxlLmMKaW5kZXggYjlkZDg4ZC4uYzFkMjZmYSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfaGVhZGVyX2ZpbHRlcl9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9oZWFkZXJfZmlsdGVyX21vZHVsZS5jCkBAIC0xNSw3ICsxNSw4IEBACiAKIAogc3RhdGljIG5neF9odHRwX21vZHVsZV90ICBuZ3hfaHR0cF9oZWFkZXJfZmlsdGVyX21vZHVsZV9jdHggPSB7Ci0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlIGNvbmYgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmVjb25maWd1cmF0aW9uICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdGNvbmZpZ3VyYXRpb24gKi8KIAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLwpAQCAtMjksNyArMzAsNyBAQAogCiAKIG5neF9tb2R1bGVfdCAgbmd4X2h0dHBfaGVhZGVyX2ZpbHRlcl9tb2R1bGUgPSB7Ci0gICAgTkdYX01PRFVMRSwKKyAgICBOR1hfTU9EVUxFX1YxLAogICAgICZuZ3hfaHR0cF9oZWFkZXJfZmlsdGVyX21vZHVsZV9jdHgsICAgIC8qIG1vZHVsZSBjb250ZXh0ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KICAgICBOR1hfSFRUUF9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgdHlwZSAqLwpAQCAtMzgsMTAgKzM5LDEwIEBACiB9OwogCiAKLXN0YXRpYyBjaGFyIHNlcnZlcl9zdHJpbmdbXSA9ICJTZXJ2ZXI6ICIgTkdJTlhfVkVSIENSTEY7CitzdGF0aWMgY2hhciBuZ3hfaHR0cF9zZXJ2ZXJfc3RyaW5nW10gPSAiU2VydmVyOiAiIE5HSU5YX1ZFUiBDUkxGOwogCiAKLXN0YXRpYyBuZ3hfc3RyX3QgaHR0cF9jb2Rlc1tdID0geworc3RhdGljIG5neF9zdHJfdCBuZ3hfaHR0cF9zdGF0dXNfbGluZXNbXSA9IHsKIAogICAgIG5neF9zdHJpbmcoIjIwMCBPSyIpLAogICAgIG5neF9udWxsX3N0cmluZywgIC8qICIyMDEgQ3JlYXRlZCIgKi8KQEAgLTExNSwxMSArMTE2LDEzIEBACiB9OwogCiAKLW5neF9odHRwX2hlYWRlcl90ICBuZ3hfaHR0cF9oZWFkZXJzX291dFtdID0geworbmd4X2h0dHBfaGVhZGVyMF90ICBuZ3hfaHR0cF9oZWFkZXJzX291dFtdID0gewogICAgIHsgbmd4X3N0cmluZygiU2VydmVyIiksIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfb3V0X3QsIHNlcnZlcikgfSwKICAgICB7IG5neF9zdHJpbmcoIkRhdGUiKSwgb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19vdXRfdCwgZGF0ZSkgfSwKKyNpZiAwCiAgICAgeyBuZ3hfc3RyaW5nKCJDb250ZW50LVR5cGUiKSwKICAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19vdXRfdCwgY29udGVudF90eXBlKSB9LAorI2VuZGlmCiAgICAgeyBuZ3hfc3RyaW5nKCJDb250ZW50LUxlbmd0aCIpLAogICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX291dF90LCBjb250ZW50X2xlbmd0aCkgfSwKICAgICB7IG5neF9zdHJpbmcoIkNvbnRlbnQtRW5jb2RpbmciKSwKQEAgLTE1MCw2ICsxNTMsMTAgQEAKICAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICpoZWFkZXI7CiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAqY2xjZjsKIAorICAgIGlmIChyLT5tYWluKSB7CisgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgfQorCiAgICAgaWYgKHItPmh0dHBfdmVyc2lvbiA8IE5HWF9IVFRQX1ZFUlNJT05fMTApIHsKICAgICAgICAgcmV0dXJuIE5HWF9PSzsKICAgICB9CkBAIC0yMDksNDQgKzIxNiw0NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTkdYX0hUVFBfTEVWRUxfNDAwOwogICAgICAgICB9CiAKLSAgICAgICAgbGVuICs9IGh0dHBfY29kZXNbc3RhdHVzXS5sZW47CisgICAgICAgIGxlbiArPSBuZ3hfaHR0cF9zdGF0dXNfbGluZXNbc3RhdHVzXS5sZW47CiAgICAgfQogCi0gICAgaWYgKHItPmhlYWRlcnNfb3V0LnNlcnZlciAmJiByLT5oZWFkZXJzX291dC5zZXJ2ZXItPmtleS5sZW4pIHsKLSAgICAgICAgbGVuICs9IHItPmhlYWRlcnNfb3V0LnNlcnZlci0+a2V5LmxlbgotICAgICAgICAgICAgICAgKyByLT5oZWFkZXJzX291dC5zZXJ2ZXItPnZhbHVlLmxlbiArIDI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbGVuICs9IHNpemVvZihzZXJ2ZXJfc3RyaW5nKSAtIDE7CisgICAgaWYgKHItPmhlYWRlcnNfb3V0LnNlcnZlciA9PSBOVUxMKSB7CisgICAgICAgIGxlbiArPSBzaXplb2Yobmd4X2h0dHBfc2VydmVyX3N0cmluZykgLSAxOwogICAgIH0KIAotICAgIGlmIChyLT5oZWFkZXJzX291dC5kYXRlICYmIHItPmhlYWRlcnNfb3V0LmRhdGUtPmtleS5sZW4pIHsKLSAgICAgICAgbGVuICs9IHItPmhlYWRlcnNfb3V0LmRhdGUtPmtleS5sZW4KLSAgICAgICAgICAgICAgICsgci0+aGVhZGVyc19vdXQuZGF0ZS0+dmFsdWUubGVuICsgMjsKLSAgICB9IGVsc2UgeworICAgIGlmIChyLT5oZWFkZXJzX291dC5kYXRlID09IE5VTEwpIHsKICAgICAgICAgbGVuICs9IHNpemVvZigiRGF0ZTogTW9uLCAyOCBTZXAgMTk3MCAwNjowMDowMCBHTVQiIENSTEYpIC0gMTsKICAgICB9CiAKLSAgICBpZiAoci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGggPT0gTlVMTCkgewotICAgICAgICBpZiAoci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGhfbiA+PSAwKSB7Ci0gICAgICAgICAgICBsZW4gKz0gc2l6ZW9mKCJDb250ZW50LUxlbmd0aDogIikgLSAxICsgTkdYX09GRl9UX0xFTiArIDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlICYmIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS0+dmFsdWUubGVuKSB7Ci0gICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS0+a2V5LmxlbiA9IDA7CisgICAgaWYgKHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS5sZW4pIHsKICAgICAgICAgbGVuICs9IHNpemVvZigiQ29udGVudC1UeXBlOiAiKSAtIDEKLSAgICAgICAgICAgICAgICsgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLT52YWx1ZS5sZW4gKyAyOworICAgICAgICAgICAgICAgKyByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUubGVuICsgMjsKIAogICAgICAgICBpZiAoci0+aGVhZGVyc19vdXQuY2hhcnNldC5sZW4pIHsKICAgICAgICAgICAgIGxlbiArPSBzaXplb2YoIjsgY2hhcnNldD0iKSAtIDEgKyByLT5oZWFkZXJzX291dC5jaGFyc2V0LmxlbjsKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChyLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aCA9PSBOVUxMCisgICAgICAgICYmIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfbGVuZ3RoX24gPj0gMCkKKyAgICB7CisgICAgICAgIGxlbiArPSBzaXplb2YoIkNvbnRlbnQtTGVuZ3RoOiAiKSAtIDEgKyBOR1hfT0ZGX1RfTEVOICsgMjsKKyAgICB9CisKKyAgICBpZiAoci0+aGVhZGVyc19vdXQubGFzdF9tb2RpZmllZCA9PSBOVUxMCisgICAgICAgICYmIHItPmhlYWRlcnNfb3V0Lmxhc3RfbW9kaWZpZWRfdGltZSAhPSAtMSkKKyAgICB7CisgICAgICAgIGxlbiArPSBzaXplb2YoIkxhc3QtTW9kaWZpZWQ6IE1vbiwgMjggU2VwIDE5NzAgMDY6MDA6MDAgR01UIiBDUkxGKSAtIDE7CisgICAgfQorCiAgICAgaWYgKHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uCiAgICAgICAgICYmIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uLT52YWx1ZS5sZW4KICAgICAgICAgJiYgci0+aGVhZGVyc19vdXQubG9jYXRpb24tPnZhbHVlLmRhdGFbMF0gPT0gJy8nKQogICAgIHsKLSAgICAgICAgci0+aGVhZGVyc19vdXQubG9jYXRpb24tPmtleS5sZW4gPSAwOworICAgICAgICByLT5oZWFkZXJzX291dC5sb2NhdGlvbi0+aGFzaCA9IDA7CisKICAgICAgICAgbGVuICs9IHNpemVvZigiTG9jYXRpb246IGh0dHA6Ly8iKSAtIDEKICAgICAgICAgICAgICAgICsgci0+c2VydmVyX25hbWUubGVuICsgci0+aGVhZGVyc19vdXQubG9jYXRpb24tPnZhbHVlLmxlbiArIDI7CiAKQEAgLTI1NSwxNCArMjYyLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChyLT5oZWFkZXJzX291dC5sYXN0X21vZGlmaWVkICYmIHItPmhlYWRlcnNfb3V0Lmxhc3RfbW9kaWZpZWQtPmtleS5sZW4pIHsKLSAgICAgICAgbGVuICs9IHItPmhlYWRlcnNfb3V0Lmxhc3RfbW9kaWZpZWQtPmtleS5sZW4KLSAgICAgICAgICAgICAgICsgci0+aGVhZGVyc19vdXQubGFzdF9tb2RpZmllZC0+dmFsdWUubGVuICsgMjsKLQotICAgIH0gZWxzZSBpZiAoci0+aGVhZGVyc19vdXQubGFzdF9tb2RpZmllZF90aW1lICE9IC0xKSB7Ci0gICAgICAgIGxlbiArPSBzaXplb2YoIkxhc3QtTW9kaWZpZWQ6IE1vbiwgMjggU2VwIDE5NzAgMDY6MDA6MDAgR01UIiBDUkxGKSAtIDE7Ci0gICAgfQotCiAgICAgaWYgKHItPmNodW5rZWQpIHsKICAgICAgICAgbGVuICs9IHNpemVvZigiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiIENSTEYpIC0gMTsKICAgICB9CkBAIC0zMDMsNyArMzAyLDcgQEAKICAgICAgICAgICAgIGkgPSAwOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGhlYWRlcltpXS5rZXkubGVuID09IDApIHsKKyAgICAgICAgaWYgKGhlYWRlcltpXS5oYXNoID09IDApIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKQEAgLTMyNSwxNiArMzI0LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LnN0YXR1c19saW5lLmxlbik7CiAKICAgICB9IGVsc2UgewotICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCBodHRwX2NvZGVzW3N0YXR1c10uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9jb2Rlc1tzdGF0dXNdLmxlbik7CisgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIG5neF9odHRwX3N0YXR1c19saW5lc1tzdGF0dXNdLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3N0YXR1c19saW5lc1tzdGF0dXNdLmxlbik7CiAgICAgfQogICAgICpiLT5sYXN0KysgPSBDUjsgKmItPmxhc3QrKyA9IExGOwogCi0gICAgaWYgKCEoci0+aGVhZGVyc19vdXQuc2VydmVyICYmIHItPmhlYWRlcnNfb3V0LnNlcnZlci0+a2V5LmxlbikpIHsKLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgc2VydmVyX3N0cmluZywgc2l6ZW9mKHNlcnZlcl9zdHJpbmcpIC0gMSk7CisgICAgaWYgKHItPmhlYWRlcnNfb3V0LnNlcnZlciA9PSBOVUxMKSB7CisgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIG5neF9odHRwX3NlcnZlcl9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF9zZXJ2ZXJfc3RyaW5nKSAtIDEpOwogICAgIH0KIAotICAgIGlmICghKHItPmhlYWRlcnNfb3V0LmRhdGUgJiYgci0+aGVhZGVyc19vdXQuZGF0ZS0+a2V5LmxlbikpIHsKKyAgICBpZiAoci0+aGVhZGVyc19vdXQuZGF0ZSA9PSBOVUxMKSB7CiAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJEYXRlOiAiLCBzaXplb2YoIkRhdGU6ICIpIC0gMSk7CiAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIG5neF9jYWNoZWRfaHR0cF90aW1lLmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9jYWNoZWRfaHR0cF90aW1lLmxlbik7CkBAIC0zNDIsMTkgKzM0MiwxMiBAQAogICAgICAgICAqYi0+bGFzdCsrID0gQ1I7ICpiLT5sYXN0KysgPSBMRjsKICAgICB9CiAKLSAgICBpZiAoci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGggPT0gTlVMTCkgewotICAgICAgICBpZiAoci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGhfbiA+PSAwKSB7Ci0gICAgICAgICAgICBiLT5sYXN0ID0gbmd4X3NwcmludGYoYi0+bGFzdCwgIkNvbnRlbnQtTGVuZ3RoOiAlTyIgQ1JMRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aF9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUgJiYgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLT52YWx1ZS5sZW4pIHsKKyAgICBpZiAoci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmxlbikgewogICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiQ29udGVudC1UeXBlOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIkNvbnRlbnQtVHlwZTogIikgLSAxKTsKICAgICAgICAgcCA9IGItPmxhc3Q7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS0+dmFsdWUuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLT52YWx1ZS5sZW4pOworICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmxlbik7CiAKICAgICAgICAgaWYgKHItPmhlYWRlcnNfb3V0LmNoYXJzZXQubGVuKSB7CiAgICAgICAgICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCAiOyBjaGFyc2V0PSIsCkBAIC0zNjIsMTMgKzM1NSwzMiBAQAogICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+aGVhZGVyc19vdXQuY2hhcnNldC5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuY2hhcnNldC5sZW4pOwogCi0gICAgICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUtPnZhbHVlLmxlbiA9IGItPmxhc3QgLSBwOwotICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLT52YWx1ZS5kYXRhID0gcDsKKyAgICAgICAgICAgIC8qIHVwZGF0ZSByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUgZm9yIHBvc3NpYmxlIGxvZ2dpbmcgKi8KKworICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmxlbiA9IGItPmxhc3QgLSBwOworICAgICAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmRhdGEgPSBwOwogICAgICAgICB9CiAKICAgICAgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7CiAgICAgfQogCisgICAgaWYgKHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfbGVuZ3RoID09IE5VTEwKKyAgICAgICAgJiYgci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGhfbiA+PSAwKQorICAgIHsKKyAgICAgICAgYi0+bGFzdCA9IG5neF9zcHJpbnRmKGItPmxhc3QsICJDb250ZW50LUxlbmd0aDogJU8iIENSTEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aF9uKTsKKyAgICB9CisKKyAgICBpZiAoci0+aGVhZGVyc19vdXQubGFzdF9tb2RpZmllZCA9PSBOVUxMCisgICAgICAgICYmIHItPmhlYWRlcnNfb3V0Lmxhc3RfbW9kaWZpZWRfdGltZSAhPSAtMSkKKyAgICB7CisgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJMYXN0LU1vZGlmaWVkOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIkxhc3QtTW9kaWZpZWQ6ICIpIC0gMSk7CisgICAgICAgIGItPmxhc3QgPSBuZ3hfaHR0cF90aW1lKGItPmxhc3QsIHItPmhlYWRlcnNfb3V0Lmxhc3RfbW9kaWZpZWRfdGltZSk7CisKKyAgICAgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7CisgICAgfQorCiAgICAgaWYgKHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uCiAgICAgICAgICYmIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uLT52YWx1ZS5sZW4KICAgICAgICAgJiYgci0+aGVhZGVyc19vdXQubG9jYXRpb24tPnZhbHVlLmRhdGFbMF0gPT0gJy8nKQpAQCAtMzg2LDIyICszOTgsMTQgQEAKICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+aGVhZGVyc19vdXQubG9jYXRpb24tPnZhbHVlLmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uLT52YWx1ZS5sZW4pOwogCisgICAgICAgIC8qIHVwZGF0ZSByLT5oZWFkZXJzX291dC5sb2NhdGlvbi0+dmFsdWUgZm9yIHBvc3NpYmxlIGxvZ2dpbmcgKi8KKwogICAgICAgICByLT5oZWFkZXJzX291dC5sb2NhdGlvbi0+dmFsdWUubGVuID0gYi0+bGFzdCAtIHA7CiAgICAgICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uLT52YWx1ZS5kYXRhID0gcDsKIAogICAgICAgICAqYi0+bGFzdCsrID0gQ1I7ICpiLT5sYXN0KysgPSBMRjsKICAgICB9CiAKLSAgICBpZiAoIShyLT5oZWFkZXJzX291dC5sYXN0X21vZGlmaWVkICYmIHItPmhlYWRlcnNfb3V0Lmxhc3RfbW9kaWZpZWQtPmtleS5sZW4pCi0gICAgICAgICYmIHItPmhlYWRlcnNfb3V0Lmxhc3RfbW9kaWZpZWRfdGltZSAhPSAtMSkKLSAgICB7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsICJMYXN0LU1vZGlmaWVkOiAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIkxhc3QtTW9kaWZpZWQ6ICIpIC0gMSk7Ci0gICAgICAgIGItPmxhc3QgPSBuZ3hfaHR0cF90aW1lKGItPmxhc3QsIHItPmhlYWRlcnNfb3V0Lmxhc3RfbW9kaWZpZWRfdGltZSk7Ci0KLSAgICAgICAgKmItPmxhc3QrKyA9IENSOyAqYi0+bGFzdCsrID0gTEY7Ci0gICAgfQotCiAgICAgaWYgKHItPmNodW5rZWQpIHsKICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIiBDUkxGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIiBDUkxGKSAtIDEpOwpAQCAtNDM2LDcgKzQ0MCw3IEBACiAgICAgICAgICAgICBpID0gMDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChoZWFkZXJbaV0ua2V5LmxlbiA9PSAwKSB7CisgICAgICAgIGlmIChoZWFkZXJbaV0uaGFzaCA9PSAwKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9sb2dfbW9kdWxlLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF9sb2dfbW9kdWxlLmMKaW5kZXggMzZhOThkZC4uMzMzNDcyZSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfbG9nX21vZHVsZS5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX2xvZ19tb2R1bGUuYwpAQCAtMTA2LDcgKzEwNiw4IEBACiAKIAogbmd4X2h0dHBfbW9kdWxlX3QgIG5neF9odHRwX2xvZ19tb2R1bGVfY3R4ID0gewotICAgIG5neF9odHRwX2xvZ19zZXRfZm9ybWF0cywgICAgICAgICAgICAgIC8qIHByZSBjb25mICovCisgICAgbmd4X2h0dHBfbG9nX3NldF9mb3JtYXRzLCAgICAgICAgICAgICAgLyogcHJlY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3Rjb25maWd1cmF0aW9uICovCiAKICAgICBuZ3hfaHR0cF9sb2dfY3JlYXRlX21haW5fY29uZiwgICAgICAgICAvKiBjcmVhdGUgbWFpbiBjb25maWd1cmF0aW9uICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBtYWluIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTEyMCw3ICsxMjEsNyBAQAogCiAKIG5neF9tb2R1bGVfdCAgbmd4X2h0dHBfbG9nX21vZHVsZSA9IHsKLSAgICBOR1hfTU9EVUxFLAorICAgIE5HWF9NT0RVTEVfVjEsCiAgICAgJm5neF9odHRwX2xvZ19tb2R1bGVfY3R4LCAgICAgICAgICAgICAgLyogbW9kdWxlIGNvbnRleHQgKi8KICAgICBuZ3hfaHR0cF9sb2dfY29tbWFuZHMsICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgZGlyZWN0aXZlcyAqLwogICAgIE5HWF9IVFRQX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSB0eXBlICovCkBAIC0zOTEsNiArMzkyLDExIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCisgICAgICAgIC8qIFNUVUI6ICJDb29raWUiIHNwZWFjaWFsIGhhbmRsaW5nICovCisgICAgICAgIGlmIChuZ3hfaHR0cF9oZWFkZXJzX2luW2ldLm9mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChuZ3hfc3RybmNhc2VjbXAobmd4X2h0dHBfaGVhZGVyc19pbltpXS5uYW1lLmRhdGEsIHZhbHVlLT5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5sZW4pID09IDApCiAgICAgICAgIHsKQEAgLTczMywyMiArNzM5LDE3IEBACiBuZ3hfaHR0cF9sb2dfdmFyaWFibGVfY29tcGlsZShuZ3hfY29uZl90ICpjZiwgbmd4X2h0dHBfbG9nX29wX3QgKm9wLAogICAgIG5neF9zdHJfdCAqdmFsdWUpCiB7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgIGk7Ci0gICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgKnZhcjsKKyAgICBuZ3hfaW50X3QgIGluZGV4OwogCi0gICAgZm9yIChpID0gMDsgaSA8IHZhbHVlLT5sZW47IGkrKykgewotICAgICAgICB2YWx1ZS0+ZGF0YVtpXSA9IG5neF90b3VwcGVyKHZhbHVlLT5kYXRhW2ldKTsKLSAgICB9Ci0KLSAgICB2YXIgPSBuZ3hfaHR0cF9hZGRfdmFyaWFibGUoY2YsIHZhbHVlLCAwKTsKLSAgICBpZiAodmFyID09IE5VTEwpIHsKKyAgICBpbmRleCA9IG5neF9odHRwX2dldF92YXJpYWJsZV9pbmRleChjZiwgdmFsdWUpOworICAgIGlmIChpbmRleCA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKICAgICBvcC0+bGVuID0gMDsKICAgICBvcC0+Z2V0bGVuID0gbmd4X2h0dHBfbG9nX3ZhcmlhYmxlX2dldGxlbjsKICAgICBvcC0+cnVuID0gbmd4X2h0dHBfbG9nX3ZhcmlhYmxlOwotICAgIG9wLT5kYXRhID0gdmFyLT5pbmRleDsKKyAgICBvcC0+ZGF0YSA9IGluZGV4OwogCiAgICAgcmV0dXJuIE5HWF9PSzsKIH0KQEAgLTc2Miw3ICs3NjMsNyBAQAogICAgIHZhbHVlID0gbmd4X2h0dHBfZ2V0X2luZGV4ZWRfdmFyaWFibGUociwgZGF0YSk7CiAKICAgICBpZiAodmFsdWUgPT0gTlVMTAotICAgICAgICB8fCB2YWx1ZSA9PSBOR1hfSFRUUF9WQVJJQUJMRV9OT1RfRk9VTkQKKyAgICAgICAgfHwgdmFsdWUgPT0gTkdYX0hUVFBfVkFSX05PVF9GT1VORAogICAgICAgICB8fCB2YWx1ZS0+dGV4dC5sZW4gPT0gMCkKICAgICB7CiAgICAgICAgIHJldHVybiAxOwpAQCAtNzgwLDcgKzc4MSw3IEBACiAgICAgdmFsdWUgPSBuZ3hfaHR0cF9nZXRfaW5kZXhlZF92YXJpYWJsZShyLCBvcC0+ZGF0YSk7CiAKICAgICBpZiAodmFsdWUgPT0gTlVMTAotICAgICAgICB8fCB2YWx1ZSA9PSBOR1hfSFRUUF9WQVJJQUJMRV9OT1RfRk9VTkQKKyAgICAgICAgfHwgdmFsdWUgPT0gTkdYX0hUVFBfVkFSX05PVF9GT1VORAogICAgICAgICB8fCB2YWx1ZS0+dGV4dC5sZW4gPT0gMCkKICAgICB7CiAgICAgICAgICpidWYgPSAnLSc7CmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZS5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfcGFyc2UuYwppbmRleCA1YTk2ODVjLi43NTJiNmExIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9wYXJzZS5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3BhcnNlLmMKQEAgLTksNyArOSw4IEBACiAjaW5jbHVkZSA8bmd4X2h0dHAuaD4KIAogCi1uZ3hfaW50X3Qgbmd4X2h0dHBfcGFyc2VfcmVxdWVzdF9saW5lKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2J1Zl90ICpiKQorbmd4X2ludF90CituZ3hfaHR0cF9wYXJzZV9yZXF1ZXN0X2xpbmUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfYnVmX3QgKmIpCiB7CiAgICAgdV9jaGFyICBjLCBjaCwgKnAsICptOwogICAgIGVudW0gewpAQCAtNjMsNyArNjQsNyBAQAogCiAgICAgICAgIGNhc2Ugc3dfbWV0aG9kOgogICAgICAgICAgICAgaWYgKGNoID09ICcgJykgewotICAgICAgICAgICAgICAgIHItPm1ldGhvZF9lbmQgPSBwOworICAgICAgICAgICAgICAgIHItPm1ldGhvZF9lbmQgPSBwIC0gMTsKICAgICAgICAgICAgICAgICBtID0gci0+cmVxdWVzdF9zdGFydDsKIAogICAgICAgICAgICAgICAgIGlmIChwIC0gbSA9PSAzKSB7CkBAIC01MDIsNyArNTAzLDggQEAKIH0KIAogCi1uZ3hfaW50X3Qgbmd4X2h0dHBfcGFyc2VfaGVhZGVyX2xpbmUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfYnVmX3QgKmIpCituZ3hfaW50X3QKK25neF9odHRwX3BhcnNlX2hlYWRlcl9saW5lKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2J1Zl90ICpiKQogewogICAgIHVfY2hhciAgICAgIGMsIGNoLCAqcDsKICAgICBuZ3hfdWludF90ICBoYXNoOwpAQCAtNTEzLDcgKzUxNSw2IEBACiAgICAgICAgIHN3X3ZhbHVlLAogICAgICAgICBzd19zcGFjZV9hZnRlcl92YWx1ZSwKICAgICAgICAgc3dfaWdub3JlX2xpbmUsCi0gICAgICAgIHN3X3NraXBfbGluZSwKICAgICAgICAgc3dfYWxtb3N0X2RvbmUsCiAgICAgICAgIHN3X2hlYWRlcl9hbG1vc3RfZG9uZQogICAgIH0gc3RhdGU7CkBAIC01MjgsOCArNTI5LDYgQEAKIAogICAgICAgICAvKiBmaXJzdCBjaGFyICovCiAgICAgICAgIGNhc2Ugc3dfc3RhcnQ6Ci0gICAgICAgICAgICByLT5pbnZhbGlkX2hlYWRlciA9IDA7Ci0KICAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKICAgICAgICAgICAgIGNhc2UgQ1I6CiAgICAgICAgICAgICAgICAgci0+aGVhZGVyX2VuZCA9IHA7CkBAIC01NDgsMTggKzU0NywxMSBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJy0nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhc2ggPSBjaDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKICAgICAgICAgICAgICAgICAgICAgaGFzaCA9IGNoOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICByLT5pbnZhbGlkX2hlYWRlciA9IDE7Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19za2lwX2xpbmU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIH0KQEAgLTU4OSwxOCArNTgxLDMxIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChjaCA9PSBDUikgeworICAgICAgICAgICAgICAgIHItPmhlYWRlcl9uYW1lX2VuZCA9IHA7CisgICAgICAgICAgICAgICAgci0+aGVhZGVyX3N0YXJ0ID0gcDsKKyAgICAgICAgICAgICAgICByLT5oZWFkZXJfZW5kID0gcDsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHN3X2FsbW9zdF9kb25lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2ggPT0gTEYpIHsKKyAgICAgICAgICAgICAgICByLT5oZWFkZXJfbmFtZV9lbmQgPSBwOworICAgICAgICAgICAgICAgIHItPmhlYWRlcl9zdGFydCA9IHA7CisgICAgICAgICAgICAgICAgci0+aGVhZGVyX2VuZCA9IHA7CisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvKiBJSVMgbWF5IHNlbmQgdGhlIGR1cGxpY2F0ZSAiSFRUUC8xLjEgLi4uIiBsaW5lcyAqLwogICAgICAgICAgICAgaWYgKGNoID09ICcvJwotICAgICAgICAgICAgICAgICYmIHItPnByb3h5Ci0gICAgICAgICAgICAgICAgJiYgcCAtIHItPmhlYWRlcl9zdGFydCA9PSA0Ci0gICAgICAgICAgICAgICAgJiYgbmd4X3N0cm5jbXAoci0+aGVhZGVyX3N0YXJ0LCAiSFRUUCIsIDQpID09IDApCisgICAgICAgICAgICAgICAgJiYgci0+dXBzdHJlYW0KKyAgICAgICAgICAgICAgICAmJiBwIC0gci0+aGVhZGVyX25hbWVfc3RhcnQgPT0gNAorICAgICAgICAgICAgICAgICYmIG5neF9zdHJuY21wKHItPmhlYWRlcl9uYW1lX3N0YXJ0LCAiSFRUUCIsIDQpID09IDApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzd19pZ25vcmVfbGluZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgci0+aW52YWxpZF9oZWFkZXIgPSAxOwotICAgICAgICAgICAgc3RhdGUgPSBzd19za2lwX2xpbmU7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAvKiBzcGFjZSogYmVmb3JlIGhlYWRlciB2YWx1ZSAqLwpAQCAtNjA5LDExICs2MTQsMTMgQEAKICAgICAgICAgICAgIGNhc2UgJyAnOgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDUjoKLSAgICAgICAgICAgICAgICByLT5oZWFkZXJfc3RhcnQgPSByLT5oZWFkZXJfZW5kID0gcDsKKyAgICAgICAgICAgICAgICByLT5oZWFkZXJfc3RhcnQgPSBwOworICAgICAgICAgICAgICAgIHItPmhlYWRlcl9lbmQgPSBwOwogICAgICAgICAgICAgICAgIHN0YXRlID0gc3dfYWxtb3N0X2RvbmU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIExGOgotICAgICAgICAgICAgICAgIHItPmhlYWRlcl9zdGFydCA9IHItPmhlYWRlcl9lbmQgPSBwOworICAgICAgICAgICAgICAgIHItPmhlYWRlcl9zdGFydCA9IHA7CisgICAgICAgICAgICAgICAgci0+aGVhZGVyX2VuZCA9IHA7CiAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICByLT5oZWFkZXJfc3RhcnQgPSBwOwpAQCAtNjY2LDIxICs2NzMsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgLyogc2tpcCBoZWFkZXIgbGluZSAqLwotICAgICAgICBjYXNlIHN3X3NraXBfbGluZToKLSAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICAgIGNhc2UgQ1I6Ci0gICAgICAgICAgICAgICAgci0+aGVhZGVyX2VuZCA9IHA7Ci0gICAgICAgICAgICAgICAgc3RhdGUgPSBzd19hbG1vc3RfZG9uZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTEY6Ci0gICAgICAgICAgICAgICAgci0+aGVhZGVyX2VuZCA9IHA7Ci0gICAgICAgICAgICAgICAgZ290byBkb25lOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCiAgICAgICAgIC8qIGVuZCBvZiBoZWFkZXIgbGluZSAqLwogICAgICAgICBjYXNlIHN3X2FsbW9zdF9kb25lOgogICAgICAgICAgICAgc3dpdGNoIChjaCkgewpAQCAtNzI0LDcgKzcxNiw4IEBACiB9CiAKIAotbmd4X2ludF90IG5neF9odHRwX3BhcnNlX2NvbXBsZXhfdXJpKG5neF9odHRwX3JlcXVlc3RfdCAqcikKK25neF9pbnRfdAorbmd4X2h0dHBfcGFyc2VfY29tcGxleF91cmkobmd4X2h0dHBfcmVxdWVzdF90ICpyKQogewogICAgIHVfY2hhciAgYywgY2gsIGRlY29kZWQsICpwLCAqdTsKICAgICBlbnVtIHsKQEAgLTEwMDEsMyArOTk0LDc1IEBACiAKICAgICByZXR1cm4gTkdYX09LOwogfQorCisKK25neF9pbnRfdAorbmd4X2h0dHBfcGFyc2VfbXVsdGlfaGVhZGVyX2xpbmVzKG5neF9hcnJheV90ICpoZWFkZXJzLCBuZ3hfc3RyX3QgKm5hbWUsCisgICAgbmd4X3N0cl90ICp2YWx1ZSkKK3sKKyAgICBuZ3hfdWludF90ICAgICAgICAgaTsKKyAgICB1X2NoYXIgICAgICAgICAgICAqc3RhcnQsICpsYXN0LCAqZW5kLCBjaDsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICoqaDsKKworICAgIGggPSBoZWFkZXJzLT5lbHRzOworCisgICAgZm9yIChpID0gMDsgaSA8IGhlYWRlcnMtPm5lbHRzOyBpKyspIHsKKworICAgICAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0hUVFAsIGhlYWRlcnMtPnBvb2wtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgInBhcnNlIGhlYWRlcjogXCIlVjogJVZcIiIsICZoW2ldLT5rZXksICZoW2ldLT52YWx1ZSk7CisKKyAgICAgICAgaWYgKG5hbWUtPmxlbiA+IGhbaV0tPnZhbHVlLmxlbikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgc3RhcnQgPSBoW2ldLT52YWx1ZS5kYXRhOworICAgICAgICBlbmQgPSBoW2ldLT52YWx1ZS5kYXRhICsgaFtpXS0+dmFsdWUubGVuOworCisgICAgICAgIHdoaWxlIChzdGFydCA8IGVuZCkgeworCisgICAgICAgICAgICBpZiAobmd4X3N0cm5jYXNlY21wKHN0YXJ0LCBuYW1lLT5kYXRhLCBuYW1lLT5sZW4pICE9IDApIHsKKyAgICAgICAgICAgICAgICBnb3RvIHNraXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoc3RhcnQgKz0gbmFtZS0+bGVuOyBzdGFydCA8IGVuZCAmJiAqc3RhcnQgPT0gJyAnOyBzdGFydCsrKSB7CisgICAgICAgICAgICAgICAgLyogdm9pZCAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PSBlbmQgfHwgKnN0YXJ0ID09ICcsJykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBnb3RvIHNraXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdGFydCA9PSBlbmQgfHwgKnN0YXJ0KysgIT0gJz0nKSB7CisgICAgICAgICAgICAgICAgLyogdGhlIGludmFsaWQgaGVhZGVyIHZhbHVlICovCisgICAgICAgICAgICAgICAgZ290byBza2lwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoc3RhcnQgPCBlbmQgJiYgKnN0YXJ0ID09ICcgJykgeyBzdGFydCsrOyB9CisKKyAgICAgICAgICAgIGZvciAobGFzdCA9IHN0YXJ0OyBsYXN0IDwgZW5kICYmICpsYXN0ICE9ICc7JzsgbGFzdCsrKSB7CisgICAgICAgICAgICAgICAgLyogdm9pZCAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YWx1ZS0+bGVuID0gbGFzdCAtIHN0YXJ0OworICAgICAgICAgICAgdmFsdWUtPmRhdGEgPSBzdGFydDsKKworICAgICAgICAgICAgcmV0dXJuIGk7CisKKyAgICAgICAgc2tpcDoKKyAgICAgICAgICAgIHdoaWxlIChzdGFydCA8IGVuZCkgeworICAgICAgICAgICAgICAgIGNoID0gKnN0YXJ0Kys7CisgICAgICAgICAgICAgICAgaWYgKGNoID09ICc7JyB8fCBjaCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoc3RhcnQgPCBlbmQgJiYgKnN0YXJ0ID09ICcgJykgeyBzdGFydCsrOyB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTkdYX0RFQ0xJTkVEOworfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfcG9zdHBvbmVfZmlsdGVyX21vZHVsZS5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfcG9zdHBvbmVfZmlsdGVyX21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOTliYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9wb3N0cG9uZV9maWx0ZXJfbW9kdWxlLmMKQEAgLTAsMCArMSwxMjYgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgSWdvciBTeXNvZXYKKyAqLworCisKKyNpbmNsdWRlIDxuZ3hfY29uZmlnLmg+CisjaW5jbHVkZSA8bmd4X2NvcmUuaD4KKyNpbmNsdWRlIDxuZ3hfaHR0cC5oPgorCisKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcG9zdHBvbmVfZmlsdGVyX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKTsKKworCitzdGF0aWMgbmd4X2h0dHBfbW9kdWxlX3QgIG5neF9odHRwX3Bvc3Rwb25lX2ZpbHRlcl9tb2R1bGVfY3R4ID0geworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZWNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3N0Y29uZmlndXJhdGlvbiAqLworCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIG1haW4gY29uZmlndXJhdGlvbiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbWFpbiBjb25maWd1cmF0aW9uICovCisKKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiAqLworCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIGxvY2F0aW9uIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBsb2NhdGlvbiBjb25maWd1cmF0aW9uICovCit9OworCisKK25neF9tb2R1bGVfdCAgbmd4X2h0dHBfcG9zdHBvbmVfZmlsdGVyX21vZHVsZSA9IHsKKyAgICBOR1hfTU9EVUxFX1YxLAorICAgICZuZ3hfaHR0cF9wb3N0cG9uZV9maWx0ZXJfbW9kdWxlX2N0eCwgIC8qIG1vZHVsZSBjb250ZXh0ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KKyAgICBOR1hfSFRUUF9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgdHlwZSAqLworICAgIG5neF9odHRwX3Bvc3Rwb25lX2ZpbHRlcl9pbml0LCAgICAgICAgIC8qIGluaXQgbW9kdWxlICovCisgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCBwcm9jZXNzICovCit9OworCisKK3N0YXRpYyBuZ3hfaHR0cF9vdXRwdXRfYm9keV9maWx0ZXJfcHQgICAgbmd4X2h0dHBfbmV4dF9maWx0ZXI7CisKKworc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfcG9zdHBvbmVfZmlsdGVyKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2NoYWluX3QgKmluKQoreworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICAgICByYzsKKyAgICBuZ3hfY2hhaW5fdCAgICAgICAgICAgICAgICAgICAqb3V0OworICAgIG5neF9odHRwX3Bvc3Rwb25lZF9yZXF1ZXN0X3QgICpwciwgKipwcHI7CisKKyAgICBpZiAoci0+Y29ubmVjdGlvbi0+d3JpdGUtPmVycm9yKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgcG9zdHBvbmUgZmlsdGVyIFwiJVZcIiAlcCIsICZyLT51cmksIGluKTsKKworICAgIGlmIChyICE9IHItPmNvbm5lY3Rpb24tPmRhdGEgfHwgKHItPnBvc3Rwb25lZCAmJiBpbikpIHsKKworICAgICAgICBpZiAoci0+cG9zdHBvbmVkKSB7CisgICAgICAgICAgICBmb3IgKHByID0gci0+cG9zdHBvbmVkOyBwci0+bmV4dDsgcHIgPSBwci0+bmV4dCkgeyAvKiB2b2lkICovIH0KKworICAgICAgICAgICAgcHByID0gcHItPnJlcXVlc3QgPyAmcHItPm5leHQgOiBOVUxMOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcHIgPSAmci0+cG9zdHBvbmVkOworI2lmIChOR1hfU1VQUFJFU1NfV0FSTikKKyAgICAgICAgICAgIHByID0gTlVMTDsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBwcikgeworICAgICAgICAgICAgcHIgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF9wb3N0cG9uZWRfcmVxdWVzdF90KSk7CisgICAgICAgICAgICBpZiAocHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpwcHIgPSBwcjsKKworICAgICAgICAgICAgcHItPnJlcXVlc3QgPSBOVUxMOworICAgICAgICAgICAgcHItPm91dCA9IE5VTEw7CisgICAgICAgICAgICBwci0+bmV4dCA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmd4X2NoYWluX2FkZF9jb3B5KHItPnBvb2wsICZwci0+b3V0LCBpbikgPT0gTkdYX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHIgIT0gci0+Y29ubmVjdGlvbi0+ZGF0YSB8fCByLT5wb3N0cG9uZWQtPnJlcXVlc3QpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfQUdBSU47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoci0+cG9zdHBvbmVkKSB7CisgICAgICAgIG91dCA9IHItPnBvc3Rwb25lZC0+b3V0OworICAgICAgICByLT5wb3N0cG9uZWQgPSByLT5wb3N0cG9uZWQtPm5leHQ7CisKKyAgICB9IGVsc2UgeworICAgICAgICBvdXQgPSBpbjsKKyAgICB9CisKKyAgICBpZiAob3V0ID09IE5VTEwgJiYgci0+b3V0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKKyAgICB9CisKKyAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCBwb3N0cG9uZSBmaWx0ZXIgb3V0IFwiJVZcIiIsICZyLT51cmkpOworCisgICAgcmMgPSBuZ3hfaHR0cF9uZXh0X2ZpbHRlcihyLT5tYWluID8gci0+bWFpbiA6IHIsIG91dCk7CisKKyAgICBpZiAocmMgPT0gTkdYX0VSUk9SKSB7CisgICAgICAgIC8qIE5HWF9FUlJPUiBtYXkgYmUgcmV0dXJuZWQgYnkgYW55IGZpbHRlciAqLworICAgICAgICByLT5jb25uZWN0aW9uLT53cml0ZS0+ZXJyb3IgPSAxOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9wb3N0cG9uZV9maWx0ZXJfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCit7CisgICAgbmd4X2h0dHBfbmV4dF9maWx0ZXIgPSBuZ3hfaHR0cF90b3BfYm9keV9maWx0ZXI7CisgICAgbmd4X2h0dHBfdG9wX2JvZHlfZmlsdGVyID0gbmd4X2h0dHBfcG9zdHBvbmVfZmlsdGVyOworCisgICAgcmV0dXJuIE5HWF9PSzsKK30KZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYyBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYwppbmRleCA0OGI3MzU3Li4yODQxMmI2IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jCkBAIC0xOSwxMyArMTksMjIgQEAKIHN0YXRpYyBzc2l6ZV90IG5neF9odHRwX3JlYWRfcmVxdWVzdF9oZWFkZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfYWxsb2NfbGFyZ2VfaGVhZGVyX2J1ZmZlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgbmd4X3VpbnRfdCByZXF1ZXN0X2xpbmUpOworCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3Byb2Nlc3NfaGVhZGVyX2xpbmUobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF90YWJsZV9lbHRfdCAqaCwgbmd4X3VpbnRfdCBvZmZzZXQpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9wcm9jZXNzX2Nvb2tpZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X3RhYmxlX2VsdF90ICpoLCBuZ3hfdWludF90IG9mZnNldCk7CisKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfcHJvY2Vzc19yZXF1ZXN0X2hlYWRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwogc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9maW5kX3ZpcnR1YWxfc2VydmVyKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CiAKK3N0YXRpYyB2b2lkIG5neF9odHRwX3JlcXVlc3RfaGFuZGxlcihuZ3hfZXZlbnRfdCAqZXYpOwogc3RhdGljIHZvaWQgbmd4X2h0dHBfc2V0X3dyaXRlX2hhbmRsZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKK3N0YXRpYyB2b2lkIG5neF9odHRwX3dyaXRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9wb3N0cG9uZWRfaGFuZGxlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwogCi1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9ibG9ja19yZWFkKG5neF9ldmVudF90ICpldik7Ci1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9yZWFkX2Rpc2NhcmRlZF9ib2R5X2V2ZW50KG5neF9ldmVudF90ICpyZXYpOworc3RhdGljIHZvaWQgbmd4X2h0dHBfYmxvY2tfcmVhZChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOworc3RhdGljIHZvaWQgbmd4X2h0dHBfcmVhZF9kaXNjYXJkZWRfYm9keV9oYW5kbGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3JlYWRfZGlzY2FyZGVkX2JvZHkobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKIAogc3RhdGljIHZvaWQgbmd4X2h0dHBfc2V0X2tlZXBhbGl2ZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwpAQCAtMzQsNiArNDMsOCBAQAogc3RhdGljIHZvaWQgbmd4X2h0dHBfbGluZ2VyaW5nX2Nsb3NlX2hhbmRsZXIobmd4X2V2ZW50X3QgKmV2KTsKIAogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2Vycm9yKG5neF9sb2dfdCAqbG9nLCB1X2NoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CitzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfZXJyb3JfaGFuZGxlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAorICAgIHNpemVfdCBsZW4pOwogCiAKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9jbGllbnRfZXJyb3JzW10gPSB7CkBAIC01MCw1OSArNjEsODEgQEAKIAogCiBuZ3hfaHR0cF9oZWFkZXJfdCAgbmd4X2h0dHBfaGVhZGVyc19pbltdID0gewotICAgIHsgbmd4X3N0cmluZygiSG9zdCIpLCBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIGhvc3QpIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJDb25uZWN0aW9uIiksIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgY29ubmVjdGlvbikgfSwKLSAgICB7IG5neF9zdHJpbmcoIklmLU1vZGlmaWVkLVNpbmNlIiksCi0gICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgaWZfbW9kaWZpZWRfc2luY2UpIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJVc2VyLUFnZW50IiksIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgdXNlcl9hZ2VudCkgfSwKLSAgICB7IG5neF9zdHJpbmcoIlJlZmVyZXIiKSwgb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19pbl90LCByZWZlcmVyKSB9LAotICAgIHsgbmd4X3N0cmluZygiQ29udGVudC1MZW5ndGgiKSwKLSAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19pbl90LCBjb250ZW50X2xlbmd0aCkgfSwKLSAgICB7IG5neF9zdHJpbmcoIkNvbnRlbnQtVHlwZSIpLAotICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIGNvbnRlbnRfdHlwZSkgfSwKKyAgICB7IG5neF9zdHJpbmcoIkhvc3QiKSwgb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19pbl90LCBob3N0KSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJvY2Vzc19oZWFkZXJfbGluZSB9LAogCi0gICAgeyBuZ3hfc3RyaW5nKCJSYW5nZSIpLCBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIHJhbmdlKSB9LAorICAgIHsgbmd4X3N0cmluZygiQ29ubmVjdGlvbiIpLCBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIGNvbm5lY3Rpb24pLAorICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm9jZXNzX2hlYWRlcl9saW5lIH0sCisKKyAgICB7IG5neF9zdHJpbmcoIklmLU1vZGlmaWVkLVNpbmNlIiksCisgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgaWZfbW9kaWZpZWRfc2luY2UpLAorICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm9jZXNzX2hlYWRlcl9saW5lIH0sCisKKyAgICB7IG5neF9zdHJpbmcoIlVzZXItQWdlbnQiKSwgb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19pbl90LCB1c2VyX2FnZW50KSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJvY2Vzc19oZWFkZXJfbGluZSB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJSZWZlcmVyIiksIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgcmVmZXJlciksCisgICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb2Nlc3NfaGVhZGVyX2xpbmUgfSwKKworICAgIHsgbmd4X3N0cmluZygiQ29udGVudC1MZW5ndGgiKSwKKyAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19pbl90LCBjb250ZW50X2xlbmd0aCksCisgICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb2Nlc3NfaGVhZGVyX2xpbmUgfSwKKworICAgIHsgbmd4X3N0cmluZygiQ29udGVudC1UeXBlIiksCisgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgY29udGVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJvY2Vzc19oZWFkZXJfbGluZSB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJSYW5nZSIpLCBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIHJhbmdlKSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJvY2Vzc19oZWFkZXJfbGluZSB9LAorCiAjaWYgMAotICAgIHsgbmd4X3N0cmluZygiSWYtUmFuZ2UiKSwgb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19pbl90LCBpZl9yYW5nZSkgfSwKKyAgICB7IG5neF9zdHJpbmcoIklmLVJhbmdlIiksIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgaWZfcmFuZ2UpLAorICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm9jZXNzX2hlYWRlcl9saW5lIH0sCiAjZW5kaWYKIAogI2lmIChOR1hfSFRUUF9HWklQKQogICAgIHsgbmd4X3N0cmluZygiQWNjZXB0LUVuY29kaW5nIiksCi0gICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgYWNjZXB0X2VuY29kaW5nKSB9LAotICAgIHsgbmd4X3N0cmluZygiVmlhIiksIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgdmlhKSB9LAorICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIGFjY2VwdF9lbmNvZGluZyksCisgICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb2Nlc3NfaGVhZGVyX2xpbmUgfSwKKworICAgIHsgbmd4X3N0cmluZygiVmlhIiksIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgdmlhKSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJvY2Vzc19oZWFkZXJfbGluZSB9LAogI2VuZGlmCiAKICAgICB7IG5neF9zdHJpbmcoIkF1dGhvcml6YXRpb24iKSwKLSAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19pbl90LCBhdXRob3JpemF0aW9uKSB9LAorICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIGF1dGhvcml6YXRpb24pLAorICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm9jZXNzX2hlYWRlcl9saW5lIH0sCiAKLSAgICB7IG5neF9zdHJpbmcoIktlZXAtQWxpdmUiKSwgb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19pbl90LCBrZWVwX2FsaXZlKSB9LAorICAgIHsgbmd4X3N0cmluZygiS2VlcC1BbGl2ZSIpLCBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIGtlZXBfYWxpdmUpLAorICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9wcm9jZXNzX2hlYWRlcl9saW5lIH0sCiAKICNpZiAoTkdYX0hUVFBfUFJPWFkpCiAgICAgeyBuZ3hfc3RyaW5nKCJYLUZvcndhcmRlZC1Gb3IiKSwKLSAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19pbl90LCB4X2ZvcndhcmRlZF9mb3IpIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJYLVJlYWwtSVAiKSwgb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19pbl90LCB4X3JlYWxfaXApIH0sCi0gICAgeyBuZ3hfc3RyaW5nKCJYLVVSTCIpLCBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIHhfdXJsKSB9LAorICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIHhfZm9yd2FyZGVkX2ZvciksCisgICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb2Nlc3NfaGVhZGVyX2xpbmUgfSwKKworICAgIHsgbmd4X3N0cmluZygiWC1SZWFsLUlQIiksIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgeF9yZWFsX2lwKSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJvY2Vzc19oZWFkZXJfbGluZSB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJYLVVSTCIpLCBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIHhfdXJsKSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfcHJvY2Vzc19oZWFkZXJfbGluZSB9LAogI2VuZGlmCiAKICNpZiAoTkdYX0hUVFBfSEVBREVSUykKLSAgICB7IG5neF9zdHJpbmcoIkFjY2VwdCIpLCBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIGFjY2VwdCkgfSwKKyAgICB7IG5neF9zdHJpbmcoIkFjY2VwdCIpLCBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIGFjY2VwdCksCisgICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb2Nlc3NfaGVhZGVyX2xpbmUgfSwKKwogICAgIHsgbmd4X3N0cmluZygiQWNjZXB0LUxhbmd1YWdlIiksCi0gICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgYWNjZXB0X2xhbmd1YWdlKSB9LAorICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIGFjY2VwdF9sYW5ndWFnZSksCisgICAgICAgICAgICAgICAgIG5neF9odHRwX3Byb2Nlc3NfaGVhZGVyX2xpbmUgfSwKICNlbmRpZgogCi0gICAgeyBuZ3hfbnVsbF9zdHJpbmcsIDAgfQorICAgIHsgbmd4X3N0cmluZygiQ29va2llIiksIDAsIG5neF9odHRwX3Byb2Nlc3NfY29va2llIH0sCisKKyAgICB7IG5neF9udWxsX3N0cmluZywgMCwgTlVMTCB9CiB9OwogCiAKLSNpZiAwCi1zdGF0aWMgdm9pZAotbmd4X2h0dHBfZHVtbXkobmd4X2V2ZW50X3QgKndldikKLXsKLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKLQotCiB2b2lkCiBuZ3hfaHR0cF9pbml0X2Nvbm5lY3Rpb24obmd4X2Nvbm5lY3Rpb25fdCAqYykKIHsKQEAgLTEyNiw5ICsxNTksOSBAQAogICAgIGMtPmxvZ19lcnJvciA9IE5HWF9FUlJPUl9JTkZPOwogCiAgICAgcmV2ID0gYy0+cmVhZDsKLSAgICByZXYtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF9pbml0X3JlcXVlc3Q7CisgICAgcmV2LT5oYW5kbGVyID0gbmd4X2h0dHBfaW5pdF9yZXF1ZXN0OwogCi0gICAgLyogU1RVQjogZXBvbGwgZWRnZSAqLyBjLT53cml0ZS0+ZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX2VtcHR5X2hhbmRsZXI7CisgICAgLyogU1RVQjogZXBvbGwgZWRnZSAqLyBjLT53cml0ZS0+aGFuZGxlciA9IG5neF9odHRwX2VtcHR5X2hhbmRsZXI7CiAKICAgICBpZiAocmV2LT5yZWFkeSkgewogICAgICAgICAvKiB0aGUgZGVmZXJyZWQgYWNjZXB0KCksIHJ0c2lnLCBhaW8sIGlvY3AgKi8KQEAgLTE2NSwxOCArMTk4LDYgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotI2lmIDAKLSAgICAvKiBUT0RPOiBsZWFybiBTT19TTkRCVUYgKHRvIHVzZSBpbiB6ZXJvY29weSkgdmlhIGtxdWV1ZSdzIEVWX0NMRUFSIGV2ZW50ICovCi0KLSAgICBjLT53cml0ZS0+cmVhZHkgPSAwOwotICAgIGMtPndyaXRlLT5ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfZHVtbXk7Ci0KLSAgICBpZiAobmd4X2hhbmRsZV93cml0ZV9ldmVudChjLT53cml0ZSwgMCkgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLQogI2lmIChOR1hfU1RBVF9TVFVCKQogICAgIG5neF9hdG9taWNfaW5jKG5neF9zdGF0X3JlYWRpbmcpOwogI2VuZGlmCkBAIC0zMzUsNyArMzU2LDcgQEAKICAgICByLT5zcnZfY29uZiA9IGNzY2YtPmN0eC0+c3J2X2NvbmY7CiAgICAgci0+bG9jX2NvbmYgPSBjc2NmLT5jdHgtPmxvY19jb25mOwogCi0gICAgcmV2LT5ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfcHJvY2Vzc19yZXF1ZXN0X2xpbmU7CisgICAgcmV2LT5oYW5kbGVyID0gbmd4X2h0dHBfcHJvY2Vzc19yZXF1ZXN0X2xpbmU7CiAKICNpZiAoTkdYX0hUVFBfU1NMKQogCkBAIC0zNTAsNyArMzcxLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHJldi0+ZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX3NzbF9oYW5kc2hha2U7CisgICAgICAgICAgICByZXYtPmhhbmRsZXIgPSBuZ3hfaHR0cF9zc2xfaGFuZHNoYWtlOwogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVGhlIG1ham9yaXR5IG9mIGJyb3dzZXJzIGRvIG5vdCBzZW5kIHRoZSAiY2xvc2Ugbm90aWZ5IiBhbGVydC4KQEAgLTM5NiwxNyArNDE3LDkgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmci0+Y2xlYW51cCwgci0+cG9vbCwgNCwgc2l6ZW9mKG5neF9odHRwX2NsZWFudXBfdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBOR1hfRVJST1IpCi0gICAgeyAKLSAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKGMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCiAKICAgICBpZiAobmd4X2xpc3RfaW5pdCgmci0+aGVhZGVyc19vdXQuaGVhZGVycywgci0+cG9vbCwgMjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfdGFibGVfZWx0X3QpKSA9PSBOR1hfRVJST1IpCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF90YWJsZV9lbHRfdCkpID09IE5HWF9FUlJPUikKICAgICB7CiAgICAgICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKICAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihjKTsKQEAgLTQyNiw4ICs0MzksNiBAQAogCiAgICAgci0+c3RhcnRfdGltZSA9IG5neF90aW1lKCk7CiAKLSAgICByLT5maWxlLmZkID0gTkdYX0lOVkFMSURfRklMRTsKLQogICAgIHItPmhlYWRlcnNfaW4uY29udGVudF9sZW5ndGhfbiA9IC0xOwogICAgIHItPmhlYWRlcnNfaW4ua2VlcF9hbGl2ZV9uID0gLTE7CiAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGhfbiA9IC0xOwpAQCAtNDM3LDYgKzQ0OCw3IEBACiAKICAgICBjdHggPSBjLT5sb2ctPmRhdGE7CiAgICAgY3R4LT5yZXF1ZXN0ID0gcjsKKyAgICByLT5sb2dfaGFuZGxlciA9IG5neF9odHRwX2xvZ19lcnJvcl9oYW5kbGVyOwogCiAjaWYgKE5HWF9TVEFUX1NUVUIpCiAgICAgbmd4X2F0b21pY19pbmMobmd4X3N0YXRfcmVhZGluZyk7CkBAIC00NDQsNyArNDU2LDcgQEAKICAgICBuZ3hfYXRvbWljX2luYyhuZ3hfc3RhdF9yZXF1ZXN0cyk7CiAjZW5kaWYKIAotICAgIHJldi0+ZXZlbnRfaGFuZGxlcihyZXYpOworICAgIHJldi0+aGFuZGxlcihyZXYpOwogfQogCiAKQEAgLTUwNyw3ICs1MTksNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV2LT5ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfcHJvY2Vzc19yZXF1ZXN0X2xpbmU7CisgICAgcmV2LT5oYW5kbGVyID0gbmd4X2h0dHBfcHJvY2Vzc19yZXF1ZXN0X2xpbmU7CiAgICAgbmd4X2h0dHBfcHJvY2Vzc19yZXF1ZXN0X2xpbmUocmV2KTsKIH0KIApAQCAtNTkzLDEwICs2MDUsOCBAQAogICAgICAgICAgICAgci0+dW5wYXJzZWRfdXJpLmRhdGEgPSByLT51cmlfc3RhcnQ7CiAKIAotICAgICAgICAgICAgaWYgKHItPm1ldGhvZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgci0+bWV0aG9kX25hbWUubGVuID0gci0+bWV0aG9kX2VuZCAtIHItPnJlcXVlc3Rfc3RhcnQgKyAxOwotICAgICAgICAgICAgICAgIHItPm1ldGhvZF9uYW1lLmRhdGEgPSByLT5yZXF1ZXN0X2xpbmUuZGF0YTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHItPm1ldGhvZF9uYW1lLmxlbiA9IHItPm1ldGhvZF9lbmQgLSByLT5yZXF1ZXN0X3N0YXJ0ICsgMTsKKyAgICAgICAgICAgIHItPm1ldGhvZF9uYW1lLmRhdGEgPSByLT5yZXF1ZXN0X2xpbmUuZGF0YTsKIAogCiAgICAgICAgICAgICBpZiAoci0+aHR0cF9wcm90b2NvbC5kYXRhKSB7CkBAIC02MzQsNyArNjQ0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwIGV4dGVuOiBcIiVWXCIiLCAmci0+ZXh0ZW4pOwogCiAgICAgICAgICAgICBpZiAoci0+aHR0cF92ZXJzaW9uIDwgTkdYX0hUVFBfVkVSU0lPTl8xMCkgewotICAgICAgICAgICAgICAgIHJldi0+ZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX2Jsb2NrX3JlYWQ7CisgICAgICAgICAgICAgICAgci0+cmVhZF9ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfYmxvY2tfcmVhZDsKICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9oYW5kbGVyKHIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTY1OSw3ICs2NjksNyBAQAogCiAgICAgICAgICAgICBjLT5sb2ctPmFjdGlvbiA9ICJyZWFkaW5nIGNsaWVudCByZXF1ZXN0IGhlYWRlcnMiOwogCi0gICAgICAgICAgICByZXYtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF9wcm9jZXNzX3JlcXVlc3RfaGVhZGVyczsKKyAgICAgICAgICAgIHJldi0+aGFuZGxlciA9IG5neF9odHRwX3Byb2Nlc3NfcmVxdWVzdF9oZWFkZXJzOwogICAgICAgICAgICAgbmd4X2h0dHBfcHJvY2Vzc19yZXF1ZXN0X2hlYWRlcnMocmV2KTsKIAogICAgICAgICAgICAgcmV0dXJuOwpAQCAtNzExLDcgKzcyMSw3IEBACiAgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgIHJjLCBydjsKICAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAga2V5OwogICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICBoZWFkZXI7Ci0gICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgKmgsICoqY29va2llOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICpoOwogICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAgICAgICpjOwogICAgIG5neF9odHRwX2hlYWRlcl90ICAgICAgICAgICpoaDsKICAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAgICAqcjsKQEAgLTc3Myw2ICs3ODMsNyBAQAogCiAgICAgICAgIGlmIChyYyA9PSBOR1hfT0spIHsKIAorI2lmIDAKICAgICAgICAgICAgIGlmIChyLT5pbnZhbGlkX2hlYWRlcikgewogCiAgICAgICAgICAgICAgICAgLyogdGhlcmUgd2FzIGVycm9yIHdoaWxlIGEgaGVhZGVyIGxpbmUgcGFyc2luZyAqLwpAQCAtNzg1LDExICs3OTYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXIpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQorI2VuZGlmCiAKICAgICAgICAgICAgIC8qIGEgaGVhZGVyIGxpbmUgaGFzIGJlZW4gcGFyc2VkIHN1Y2Nlc3NmdWxseSAqLwogCi0gICAgICAgICAgICByLT5oZWFkZXJzX24rKzsKLQogICAgICAgICAgICAgaCA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfaW4uaGVhZGVycyk7CiAgICAgICAgICAgICBpZiAoaCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwpAQCAtODA3LDI3ICs4MTcsMTQgQEAKICAgICAgICAgICAgIGgtPnZhbHVlLmRhdGEgPSByLT5oZWFkZXJfc3RhcnQ7CiAgICAgICAgICAgICBoLT52YWx1ZS5kYXRhW2gtPnZhbHVlLmxlbl0gPSAnXDAnOwogCi0gICAgICAgICAgICBpZiAoaC0+a2V5LmxlbiA9PSBzaXplb2YoIkNvb2tpZSIpIC0gMQotICAgICAgICAgICAgICAgICYmIG5neF9zdHJjYXNlY21wKGgtPmtleS5kYXRhLCAiQ29va2llIikgPT0gMCkKKyAgICAgICAgICAgIGtleSA9IGgtPmhhc2ggJSBjbWNmLT5oZWFkZXJzX2luX2hhc2guaGFzaF9zaXplOworCisgICAgICAgICAgICBpZiAoaGhba2V5XS5uYW1lLmxlbiA9PSBoLT5rZXkubGVuCisgICAgICAgICAgICAgICAgJiYgbmd4X3N0cmNhc2VjbXAoaGhba2V5XS5uYW1lLmRhdGEsIGgtPmtleS5kYXRhKSA9PSAwKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvb2tpZSA9IG5neF9hcnJheV9wdXNoKCZyLT5oZWFkZXJzX2luLmNvb2tpZXMpOwotICAgICAgICAgICAgICAgIGlmIChjb29raWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CisgICAgICAgICAgICAgICAgaWYgKGhoW2tleV0uaGFuZGxlcihyLCBoLCBoaFtrZXldLm9mZnNldCkgIT0gTkdYX09LKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAqY29va2llID0gaDsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBrZXkgPSBoLT5oYXNoICUgY21jZi0+aGVhZGVyc19pbl9oYXNoLmhhc2hfc2l6ZTsKLQotICAgICAgICAgICAgICAgIGlmIChoaFtrZXldLm5hbWUubGVuID09IGgtPmtleS5sZW4KLSAgICAgICAgICAgICAgICAgICAgJiYgbmd4X3N0cmNhc2VjbXAoaGhba2V5XS5uYW1lLmRhdGEsIGgtPmtleS5kYXRhKSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKigobmd4X3RhYmxlX2VsdF90ICoqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyICopICZyLT5oZWFkZXJzX2luICsgaGhba2V5XS5vZmZzZXQpKSA9IGg7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKQEAgLTg2NSw3ICs4NjIsMTAgQEAKICAgICAgICAgICAgIHItPnN0YXRfd3JpdGluZyA9IDE7CiAjZW5kaWYKIAotICAgICAgICAgICAgcmV2LT5ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfYmxvY2tfcmVhZDsKKyAgICAgICAgICAgIHJldi0+aGFuZGxlciA9IG5neF9odHRwX3JlcXVlc3RfaGFuZGxlcjsKKyAgICAgICAgICAgIGMtPndyaXRlLT5oYW5kbGVyID0gbmd4X2h0dHBfcmVxdWVzdF9oYW5kbGVyOworICAgICAgICAgICAgci0+cmVhZF9ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfYmxvY2tfcmVhZDsKKwogICAgICAgICAgICAgbmd4X2h0dHBfaGFuZGxlcihyKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMTA5MSw2ICsxMDkxLDQxIEBACiAKIAogc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfcHJvY2Vzc19oZWFkZXJfbGluZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF90YWJsZV9lbHRfdCAqaCwKKyAgICBuZ3hfdWludF90IG9mZnNldCkKK3sKKyAgICBuZ3hfdGFibGVfZWx0X3QgICoqcGg7CisKKyAgICBwaCA9IChuZ3hfdGFibGVfZWx0X3QgKiopICgoY2hhciAqKSAmci0+aGVhZGVyc19pbiArIG9mZnNldCk7CisKKyAgICBpZiAoKnBoID09IE5VTEwpIHsKKyAgICAgICAgKnBoID0gaDsKKyAgICB9CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Byb2Nlc3NfY29va2llKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X3RhYmxlX2VsdF90ICpoLAorICAgIG5neF91aW50X3Qgb2Zmc2V0KQoreworICAgIG5neF90YWJsZV9lbHRfdCAgKipjb29raWU7CisKKyAgICBjb29raWUgPSBuZ3hfYXJyYXlfcHVzaCgmci0+aGVhZGVyc19pbi5jb29raWVzKTsKKyAgICBpZiAoY29va2llID09IE5VTEwpIHsKKyAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKHItPmNvbm5lY3Rpb24pOworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgICpjb29raWUgPSBoOworCisgICAgcmV0dXJuIE5HWF9PSzsKK30KKworCitzdGF0aWMgbmd4X2ludF90CiBuZ3hfaHR0cF9wcm9jZXNzX3JlcXVlc3RfaGVhZGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgbGVuOwpAQCAtMTEwOCw2ICsxMTQzLDEwIEBACiAgICAgICAgICAgICByLT5oZWFkZXJzX2luLmhvc3QtPnZhbHVlLmRhdGFbbGVuXSA9IG5neF90b2xvd2VyKGNoKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChyLT5oZWFkZXJzX2luLmhvc3QtPnZhbHVlLmRhdGFbbGVuIC0gMV0gPT0gJy4nKSB7CisgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgfQorCiAgICAgICAgIHItPmhlYWRlcnNfaW4uaG9zdF9uYW1lX2xlbiA9IGxlbjsKIAogICAgICAgICBpZiAobmd4X2h0dHBfZmluZF92aXJ0dWFsX3NlcnZlcihyKSAhPSBOR1hfT0spIHsKQEAgLTExNjcsMTMgKzEyMDYsMTMgQEAKICAgICBpZiAoci0+aGVhZGVyc19pbi5jb25uZWN0aW9uKSB7CiAgICAgICAgIGlmIChyLT5oZWFkZXJzX2luLmNvbm5lY3Rpb24tPnZhbHVlLmxlbiA9PSA1CiAgICAgICAgICAgICAmJiBuZ3hfc3RyY2FzZWNtcChyLT5oZWFkZXJzX2luLmNvbm5lY3Rpb24tPnZhbHVlLmRhdGEsICJjbG9zZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IDApCisgICAgICAgICAgICAgICA9PSAwKQogICAgICAgICB7CiAgICAgICAgICAgICByLT5oZWFkZXJzX2luLmNvbm5lY3Rpb25fdHlwZSA9IE5HWF9IVFRQX0NPTk5FQ1RJT05fQ0xPU0U7CiAKICAgICAgICAgfSBlbHNlIGlmIChyLT5oZWFkZXJzX2luLmNvbm5lY3Rpb24tPnZhbHVlLmxlbiA9PSAxMAogICAgICAgICAgICAgICAgICAgICYmIG5neF9zdHJjYXNlY21wKHItPmhlYWRlcnNfaW4uY29ubmVjdGlvbi0+dmFsdWUuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZWVwLWFsaXZlIikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2VlcC1hbGl2ZSIpID09IDApCiAgICAgICAgIHsKICAgICAgICAgICAgIHItPmhlYWRlcnNfaW4uY29ubmVjdGlvbl90eXBlID0gTkdYX0hUVFBfQ09OTkVDVElPTl9LRUVQX0FMSVZFOwogCkBAIC0xMjM3LDcgKzEyNzYsNyBAQAogbmd4X2h0dHBfZmluZF92aXJ0dWFsX3NlcnZlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7CiAgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgIHJjOwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBpLCBuLCBrZXksIGZvdW5kOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBpLCBuLCBrZXk7CiAgICAgbmd4X2h0dHBfc2VydmVyX25hbWVfdCAgICAgKm5hbWU7CiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAgKmNsY2Y7CiAgICAgbmd4X2h0dHBfY29yZV9zcnZfY29uZl90ICAgKmNzY2Y7CkBAIC0xMjU5LDggKzEyOTgsNiBAQAogICAgICAgICBuID0gci0+dmlydHVhbF9uYW1lcy0+bmFtZXMubmVsdHM7CiAgICAgfQogCi0gICAgZm91bmQgPSAwOwotCiAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogCiAgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLApAQCAtMTI3NSw5ICsxMzEyLDcgQEAKIAogICAgICAgICBpZiAocmMgPT0gMCkgewogICAgICAgICAgICAgci0+c2VydmVyX25hbWUgPSBuYW1lW2ldLm5hbWU7Ci0KLSAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChyYyA8IDApIHsKQEAgLTEyODYsNyArMTMyMSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIWZvdW5kICYmIHItPnZpcnR1YWxfbmFtZXMtPndpbGRjYXJkcy5uZWx0cykgeworICAgIGlmIChyLT52aXJ0dWFsX25hbWVzLT53aWxkY2FyZHMubmVsdHMpIHsKIAogICAgICAgICBuYW1lID0gci0+dmlydHVhbF9uYW1lcy0+d2lsZGNhcmRzLmVsdHM7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByLT52aXJ0dWFsX25hbWVzLT53aWxkY2FyZHMubmVsdHM7IGkrKykgewpAQCAtMTMxMCw0OSArMTM0NSwxMTAgQEAKICAgICAgICAgICAgICAgICByLT5zZXJ2ZXJfbmFtZS5sZW4gPSByLT5oZWFkZXJzX2luLmhvc3RfbmFtZV9sZW47CiAgICAgICAgICAgICAgICAgci0+c2VydmVyX25hbWUuZGF0YSA9IHItPmhlYWRlcnNfaW4uaG9zdC0+dmFsdWUuZGF0YTsKIAotICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGZvdW5kKSB7Ci0gICAgICAgIHItPnNydl9jb25mID0gbmFtZVtpXS5jb3JlX3Nydl9jb25mLT5jdHgtPnNydl9jb25mOwotICAgICAgICByLT5sb2NfY29uZiA9IG5hbWVbaV0uY29yZV9zcnZfY29uZi0+Y3R4LT5sb2NfY29uZjsKKyAgICBjc2NmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9zcnZfY29uZihyLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CiAKLSAgICAgICAgY2xjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwotICAgICAgICByLT5jb25uZWN0aW9uLT5sb2ctPmZpbGUgPSBjbGNmLT5lcnJfbG9nLT5maWxlOwotCi0gICAgICAgIGlmICghKHItPmNvbm5lY3Rpb24tPmxvZy0+bG9nX2xldmVsICYgTkdYX0xPR19ERUJVR19DT05ORUNUSU9OKSkgewotICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+bG9nLT5sb2dfbGV2ZWwgPSBjbGNmLT5lcnJfbG9nLT5sb2dfbGV2ZWw7Ci0gICAgICAgIH0KLQorICAgIGlmIChjc2NmLT5yZXN0cmljdF9ob3N0X25hbWVzID09IE5HWF9IVFRQX1JFU1RSSUNUX0hPU1RfT0ZGKSB7CiAgICAgICAgIHJldHVybiBOR1hfT0s7CiAgICAgfQogCi0gICAgY3NjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfc3J2X2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOworICAgIHJldHVybiBOR1hfRVJST1I7CiAKLSAgICBpZiAoY3NjZi0+cmVzdHJpY3RfaG9zdF9uYW1lcyAhPSBOR1hfSFRUUF9SRVNUUklDVF9IT1NUX09GRikgewotICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworZm91bmQ6CisKKyAgICByLT5zcnZfY29uZiA9IG5hbWVbaV0uY29yZV9zcnZfY29uZi0+Y3R4LT5zcnZfY29uZjsKKyAgICByLT5sb2NfY29uZiA9IG5hbWVbaV0uY29yZV9zcnZfY29uZi0+Y3R4LT5sb2NfY29uZjsKKworICAgIGNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKKyAgICByLT5jb25uZWN0aW9uLT5sb2ctPmZpbGUgPSBjbGNmLT5lcnJfbG9nLT5maWxlOworCisgICAgaWYgKCEoci0+Y29ubmVjdGlvbi0+bG9nLT5sb2dfbGV2ZWwgJiBOR1hfTE9HX0RFQlVHX0NPTk5FQ1RJT04pKSB7CisgICAgICAgIHItPmNvbm5lY3Rpb24tPmxvZy0+bG9nX2xldmVsID0gY2xjZi0+ZXJyX2xvZy0+bG9nX2xldmVsOwogICAgIH0KIAogICAgIHJldHVybiBOR1hfT0s7CiB9CiAKIAotdm9pZAotbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIGludCByYykKK3N0YXRpYyB2b2lkCituZ3hfaHR0cF9yZXF1ZXN0X2hhbmRsZXIobmd4X2V2ZW50X3QgKmV2KQogeworICAgIG5neF9jb25uZWN0aW9uX3QgICAgKmM7CisgICAgbmd4X2h0dHBfcmVxdWVzdF90ICAqcjsKKworICAgIGMgPSBldi0+ZGF0YTsKKyAgICByID0gYy0+ZGF0YTsKKworICAgIGlmIChldi0+d3JpdGUpIHsKKyAgICAgICAgci0+d3JpdGVfZXZlbnRfaGFuZGxlcihyKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIHItPnJlYWRfZXZlbnRfaGFuZGxlcihyKTsKKyAgICB9Cit9CisKKwordm9pZAorbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9pbnRfdCByYykKK3sKKyAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAgICpwcjsKICAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICpjbGNmOwogCi0gICAgLyogciBtYXkgYmUgYWxyZWFkeSBkZXN0cm95ZWQgd2hlbiByYyA9PSBOR1hfRE9ORSAqLwotCi0gICAgaWYgKHJjID09IE5HWF9ET05FIHx8IHItPm1haW4pIHsKKyAgICBpZiAocmMgPT0gTkdYX0RPTkUpIHsKKyAgICAgICAgLyogciBtYXkgYmUgYWxyZWFkeSBkZXN0cm95ZWQgd2hlbiByYyA9PSBOR1hfRE9ORSAqLwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgImh0dHAgZmluYWxpemUgcmVxdWVzdDogJWQiLCByYyk7CisgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgZmluYWxpemUgcmVxdWVzdDogJWQsIFwiJVZcIiIsIHJjLCAmci0+dXJpKTsKKworICAgIGlmIChyLT5wYXJlbnQgJiYgcmMgPj0gTkdYX0hUVFBfU1BFQ0lBTF9SRVNQT05TRSkgeworICAgICAgICBuZ3hfaHR0cF9maW5hbGl6ZV9yZXF1ZXN0KHIsIG5neF9odHRwX3NwZWNpYWxfcmVzcG9uc2VfaGFuZGxlcihyLCByYykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHItPnBhcmVudCB8fCByYyA9PSBOR1hfQUdBSU4pIHsKKyAgICAgICAgci0+d3JpdGVfZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX3dyaXRlcjsKKyAgICB9CisKKyAgICByLT5kb25lID0gMTsKKworICAgIGlmIChyICE9IHItPmNvbm5lY3Rpb24tPmRhdGEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChyLT5wYXJlbnQpIHsKKworICAgICAgICBwciA9IHItPnBhcmVudDsKKworICAgICAgICBpZiAocmMgIT0gTkdYX0FHQUlOKSB7CisgICAgICAgICAgICBwci0+Y29ubmVjdGlvbi0+ZGF0YSA9IHByOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHByLT5wb3N0cG9uZWQpIHsKKworICAgICAgICAgICAgaWYgKHJjICE9IE5HWF9BR0FJTiAmJiBwci0+cG9zdHBvbmVkLT5yZXF1ZXN0ID09IHIpIHsKKyAgICAgICAgICAgICAgICBwci0+cG9zdHBvbmVkID0gcHItPnBvc3Rwb25lZC0+bmV4dDsKKworICAgICAgICAgICAgICAgIGlmIChwci0+cG9zdHBvbmVkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHByLT5kb25lKSB7CisgICAgICAgICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgd2FrZSByZXF1ZXN0OiBcIiVWXCIiLCAmcHItPnVyaSk7CisKKyAgICAgICAgICAgICAgICBwci0+d3JpdGVfZXZlbnRfaGFuZGxlcihwcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm47CisgICAgfQogCiAgICAgaWYgKHJjID49IE5HWF9IVFRQX1NQRUNJQUxfUkVTUE9OU0UpIHsKIApAQCAtMTM3OSw3ICsxNDc1LDcgQEAKICAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihyLT5jb25uZWN0aW9uKTsKICAgICAgICAgcmV0dXJuOwogCi0gICAgfSBlbHNlIGlmIChyYyA9PSBOR1hfQUdBSU4pIHsKKyAgICB9IGVsc2UgaWYgKHJjID09IE5HWF9BR0FJTiB8fCByLT5vdXQpIHsKICAgICAgICAgbmd4X2h0dHBfc2V0X3dyaXRlX2hhbmRsZXIocik7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xNDMwLDE3ICsxNTI2LDE1IEBACiAgICAgbmd4X2V2ZW50X3QgICAgICAgICAgICAgICAqd2V2OwogICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgKmNsY2Y7CiAKLSAgICB3ZXYgPSByLT5jb25uZWN0aW9uLT53cml0ZTsKLSAgICB3ZXYtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF93cml0ZXI7Ci0KICAgICByLT5odHRwX3N0YXRlID0gTkdYX0hUVFBfV1JJVElOR19SRVFVRVNUX1NUQVRFOwogCisgICAgd2V2ID0gci0+Y29ubmVjdGlvbi0+d3JpdGU7CisKICAgICBpZiAod2V2LT5yZWFkeSAmJiB3ZXYtPmRlbGF5ZWQpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHItPm1haW4gPyByLT5tYWluIDogciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CisgICAgY2xjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwogICAgIGlmICghd2V2LT5kZWxheWVkKSB7CiAgICAgICAgIG5neF9hZGRfdGltZXIod2V2LCBjbGNmLT5zZW5kX3RpbWVvdXQpOwogICAgIH0KQEAgLTE0NDksMjMgKzE1NDMsMjIgQEAKICAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLCAwKTsKICAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihyLT5jb25uZWN0aW9uKTsKICAgICB9Ci0KLSAgICByZXR1cm47CiB9CiAKIAotdm9pZAotbmd4X2h0dHBfd3JpdGVyKG5neF9ldmVudF90ICp3ZXYpCitzdGF0aWMgdm9pZAorbmd4X2h0dHBfd3JpdGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICByYzsKKyAgICBuZ3hfZXZlbnRfdCAgICAgICAgICAgICAgICp3ZXY7CiAgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICAgICAqYzsKLSAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAgICAgICpyOwogICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgKmNsY2Y7CiAKLSAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHdldi0+bG9nLCAwLCAiaHR0cCB3cml0ZXIgaGFuZGxlciIpOworICAgIGMgPSByLT5jb25uZWN0aW9uOworICAgIHdldiA9IGMtPndyaXRlOwogCi0gICAgYyA9IHdldi0+ZGF0YTsKLSAgICByID0gYy0+ZGF0YTsKKyAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHdldi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIHdyaXRlciBoYW5kbGVyOiBcIiVWXCIiLCAmci0+dXJpKTsKIAogICAgIGlmICh3ZXYtPnRpbWVkb3V0KSB7CiAgICAgICAgIGlmICghd2V2LT5kZWxheWVkKSB7CkBAIC0xNTEwLDEwICsxNjAzLDIxIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByYyA9IG5neF9odHRwX291dHB1dF9maWx0ZXIociwgTlVMTCk7CisgICAgaWYgKHItPnBvc3Rwb25lZCkgeworICAgICAgICByYyA9IG5neF9odHRwX3Bvc3Rwb25lZF9oYW5kbGVyKHIpOwogCi0gICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCBjLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAiaHR0cCB3cml0ZXIgb3V0cHV0IGZpbHRlcjogJWQiLCByYyk7CisgICAgICAgIGlmIChyYyA9PSBOR1hfRE9ORSkgeworICAgICAgICAgICAgLyogciBtYXkgYmUgYWxyZWFkeSBkZXN0cm95ZWQgd2hlbiByYyA9PSBOR1hfRE9ORSAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICByYyA9IG5neF9odHRwX291dHB1dF9maWx0ZXIociwgTlVMTCk7CisKKyAgICB9CisKKyAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0hUVFAsIGMtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCB3cml0ZXIgb3V0cHV0IGZpbHRlcjogJWQsIFwiJVZcIiIsIHJjLCAmci0+dXJpKTsKIAogICAgIGlmIChyYyA9PSBOR1hfQUdBSU4pIHsKICAgICAgICAgY2xjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYoci0+bWFpbiA/IHItPm1haW4gOiByLApAQCAtMTUzMCwyOCArMTYzNCw4MSBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCBjLT5sb2csIDAsICJodHRwIHdyaXRlciBkb25lIik7CisgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCB3ZXYtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCB3cml0ZXIgZG9uZTogXCIlVlwiIiwgJnItPnVyaSk7CiAKICAgICBuZ3hfaHR0cF9maW5hbGl6ZV9yZXF1ZXN0KHIsIHJjKTsKIH0KIAogCi1zdGF0aWMgdm9pZAotbmd4X2h0dHBfYmxvY2tfcmVhZChuZ3hfZXZlbnRfdCAqcmV2KQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfcG9zdHBvbmVkX2hhbmRsZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQogewotICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAgICAgKmM7Ci0gICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICAgICAqcjsKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgICAgcmM7CisgICAgbmd4X2h0dHBfcG9zdHBvbmVkX3JlcXVlc3RfdCAgKnByOwogCi0gICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCByZXYtPmxvZywgMCwgImh0dHAgcmVhZCBibG9ja2VkIik7CisgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgcG9zdHBvbmUgaGFuZGxlciBcIiVWXCIiLCAmci0+dXJpKTsKKworICAgIHByID0gci0+cG9zdHBvbmVkOworCisgICAgaWYgKHByLT5yZXF1ZXN0ID09IE5VTEwpIHsKKyAgICAgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICJodHRwIHBvc3Rwb25lZCBkYXRhIFwiJVZcIiAlcCIsICZyLT51cmksIHByLT5vdXQpOworCisgICAgICAgIHJjID0gbmd4X2h0dHBfb3V0cHV0X2ZpbHRlcihyLCBOVUxMKTsKKworICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwIHBvc3Rwb25lZCBvdXRwdXQgZmlsdGVyOiAlZCIsIHJjKTsKKworICAgICAgICBpZiAocmMgPT0gTkdYX0FHQUlOKSB7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmMgPT0gTkdYX0VSUk9SKSB7CisgICAgICAgICAgICAvKiBOR1hfRVJST1IgbWF5IGJlIHJldHVybmVkIGJ5IGFueSBmaWx0ZXIgKi8KKyAgICAgICAgICAgIHItPmNvbm5lY3Rpb24tPndyaXRlLT5lcnJvciA9IDE7CisKKyAgICAgICAgICAgIG5neF9odHRwX2ZpbmFsaXplX3JlcXVlc3QociwgcmMpOworCisgICAgICAgICAgICByZXR1cm4gTkdYX0RPTkU7CisgICAgICAgIH0KKworICAgICAgICBwciA9IHItPnBvc3Rwb25lZDsKKworICAgICAgICBpZiAocHIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9PSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHIgPSBwci0+cmVxdWVzdDsKKyAgICByLT5jb25uZWN0aW9uLT5kYXRhID0gcjsKKworICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIHBvc3Rwb25lZCByZXF1ZXN0IFwiJVZcIiIsICZyLT51cmkpOworCisgICAgci0+d3JpdGVfZXZlbnRfaGFuZGxlcihyKTsKKworICAgIHJldHVybiBOR1hfRE9ORTsKK30KKworCitzdGF0aWMgdm9pZAorbmd4X2h0dHBfYmxvY2tfcmVhZChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCit7CisgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgcmVhZCBibG9ja2VkIik7CiAKICAgICAvKiBhaW8gZG9lcyBub3QgY2FsbCB0aGlzIGhhbmRsZXIgKi8KIAotICAgIGlmICgobmd4X2V2ZW50X2ZsYWdzICYgTkdYX1VTRV9MRVZFTF9FVkVOVCkgJiYgcmV2LT5hY3RpdmUpIHsKLSAgICAgICAgaWYgKG5neF9kZWxfZXZlbnQocmV2LCBOR1hfUkVBRF9FVkVOVCwgMCkgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgICAgICBjID0gcmV2LT5kYXRhOwotICAgICAgICAgICAgciA9IGMtPmRhdGE7CisgICAgaWYgKChuZ3hfZXZlbnRfZmxhZ3MgJiBOR1hfVVNFX0xFVkVMX0VWRU5UKQorICAgICAgICAmJiByLT5jb25uZWN0aW9uLT5yZWFkLT5hY3RpdmUpCisgICAgeworICAgICAgICBpZiAobmd4X2RlbF9ldmVudChyLT5jb25uZWN0aW9uLT5yZWFkLCBOR1hfUkVBRF9FVkVOVCwgMCkKKyAgICAgICAgICAgID09IE5HWF9FUlJPUikKKyAgICAgICAgewogICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChyLCAwKTsKLSAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CisgICAgICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKHItPmNvbm5lY3Rpb24pOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTU4OCw5ICsxNzQ1LDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldi0+ZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX3JlYWRfZGlzY2FyZGVkX2JvZHlfZXZlbnQ7CisgICAgci0+cmVhZF9ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfcmVhZF9kaXNjYXJkZWRfYm9keV9oYW5kbGVyOwogCi0gICAgaWYgKG5neF9oYW5kbGVfbGV2ZWxfcmVhZF9ldmVudChyZXYpID09IE5HWF9FUlJPUikgeworICAgIGlmIChuZ3hfaGFuZGxlX3JlYWRfZXZlbnQocmV2LCAwKSA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKICAgICB9CiAKQEAgLTE1OTksMjggKzE3NTYsMjMgQEAKIAogCiBzdGF0aWMgdm9pZAotbmd4X2h0dHBfcmVhZF9kaXNjYXJkZWRfYm9keV9ldmVudChuZ3hfZXZlbnRfdCAqcmV2KQorbmd4X2h0dHBfcmVhZF9kaXNjYXJkZWRfYm9keV9oYW5kbGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKLSAgICBuZ3hfaW50X3QgICAgICAgICAgICByYzsKLSAgICBuZ3hfY29ubmVjdGlvbl90ICAgICpjOwotICAgIG5neF9odHRwX3JlcXVlc3RfdCAgKnI7Ci0KLSAgICBjID0gcmV2LT5kYXRhOwotICAgIHIgPSBjLT5kYXRhOworICAgIG5neF9pbnRfdCAgcmM7CiAKICAgICByYyA9IG5neF9odHRwX3JlYWRfZGlzY2FyZGVkX2JvZHkocik7CiAKICAgICBpZiAocmMgPT0gTkdYX0FHQUlOKSB7Ci0gICAgICAgIGlmIChuZ3hfaGFuZGxlX2xldmVsX3JlYWRfZXZlbnQocmV2KSA9PSBOR1hfRVJST1IpIHsKKyAgICAgICAgaWYgKG5neF9oYW5kbGVfcmVhZF9ldmVudChyLT5jb25uZWN0aW9uLT5yZWFkLCAwKSA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgcmMpOwotICAgICAgICAgICAgbmd4X2h0dHBfY2xvc2VfY29ubmVjdGlvbihjKTsKKyAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oci0+Y29ubmVjdGlvbik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAocmMgIT0gTkdYX09LKSB7CiAgICAgICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgcmMpOwotICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKGMpOworICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKHItPmNvbm5lY3Rpb24pOwogICAgIH0KIH0KIApAQCAtMTczNywxMyArMTg4OSwxMyBAQAogCiAgICAgbmd4X2FkZF90aW1lcihyZXYsIGNsY2YtPmtlZXBhbGl2ZV90aW1lb3V0KTsKIAotICAgIGlmIChuZ3hfaGFuZGxlX2xldmVsX3JlYWRfZXZlbnQocmV2KSA9PSBOR1hfRVJST1IpIHsKKyAgICBpZiAobmd4X2hhbmRsZV9yZWFkX2V2ZW50KHJldiwgMCkgPT0gTkdYX0VSUk9SKSB7CiAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICB3ZXYgPSBjLT53cml0ZTsKLSAgICB3ZXYtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF9lbXB0eV9oYW5kbGVyOworICAgIHdldi0+aGFuZGxlciA9IG5neF9odHRwX2VtcHR5X2hhbmRsZXI7CiAKICAgICBpZiAoYi0+cG9zIDwgYi0+bGFzdCkgewogCkBAIC0xODA5LDcgKzE5NjEsNyBAQAogICAgICAgICBoYy0+bmJ1c3kgPSAwOwogICAgIH0KIAotICAgIHJldi0+ZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX2tlZXBhbGl2ZV9oYW5kbGVyOworICAgIHJldi0+aGFuZGxlciA9IG5neF9odHRwX2tlZXBhbGl2ZV9oYW5kbGVyOwogCiAgICAgaWYgKHdldi0+YWN0aXZlKSB7CiAgICAgICAgIGlmIChuZ3hfZXZlbnRfZmxhZ3MgJiBOR1hfVVNFX0tRVUVVRV9FVkVOVCkgewpAQCAtMTk0NCw3ICsyMDk2LDcgQEAKICAgICBjLT5sb2dfZXJyb3IgPSBOR1hfRVJST1JfSU5GTzsKIAogICAgIGlmIChuID09IE5HWF9BR0FJTikgewotICAgICAgICBpZiAobmd4X2hhbmRsZV9sZXZlbF9yZWFkX2V2ZW50KHJldikgPT0gTkdYX0VSUk9SKSB7CisgICAgICAgIGlmIChuZ3hfaGFuZGxlX3JlYWRfZXZlbnQocmV2LCAwKSA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CiAgICAgICAgIH0KIApAQCAtMTk4NiwxOSArMjEzOCwxOSBAQAogICAgIGNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKIAogICAgIHJldiA9IGMtPnJlYWQ7Ci0gICAgcmV2LT5ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfbGluZ2VyaW5nX2Nsb3NlX2hhbmRsZXI7CisgICAgcmV2LT5oYW5kbGVyID0gbmd4X2h0dHBfbGluZ2VyaW5nX2Nsb3NlX2hhbmRsZXI7CiAKICAgICByLT5saW5nZXJpbmdfdGltZSA9IG5neF90aW1lKCkgKyBjbGNmLT5saW5nZXJpbmdfdGltZSAvIDEwMDA7CiAgICAgbmd4X2FkZF90aW1lcihyZXYsIGNsY2YtPmxpbmdlcmluZ190aW1lb3V0KTsKIAotICAgIGlmIChuZ3hfaGFuZGxlX2xldmVsX3JlYWRfZXZlbnQocmV2KSA9PSBOR1hfRVJST1IpIHsKKyAgICBpZiAobmd4X2hhbmRsZV9yZWFkX2V2ZW50KHJldiwgMCkgPT0gTkdYX0VSUk9SKSB7CiAgICAgICAgIG5neF9odHRwX2Nsb3NlX3JlcXVlc3QociwgMCk7CiAgICAgICAgIG5neF9odHRwX2Nsb3NlX2Nvbm5lY3Rpb24oYyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICB3ZXYgPSBjLT53cml0ZTsKLSAgICB3ZXYtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF9lbXB0eV9oYW5kbGVyOworICAgIHdldi0+aGFuZGxlciA9IG5neF9odHRwX2VtcHR5X2hhbmRsZXI7CiAKICAgICBpZiAod2V2LT5hY3RpdmUpIHsKICAgICAgICAgaWYgKG5neF9ldmVudF9mbGFncyAmIE5HWF9VU0VfS1FVRVVFX0VWRU5UKSB7CkBAIC0yMDc1LDcgKzIyMjcsNyBAQAogCiAgICAgfSB3aGlsZSAocmV2LT5yZWFkeSk7CiAKLSAgICBpZiAobmd4X2hhbmRsZV9sZXZlbF9yZWFkX2V2ZW50KHJldikgPT0gTkdYX0VSUk9SKSB7CisgICAgaWYgKG5neF9oYW5kbGVfcmVhZF9ldmVudChyZXYsIDApID09IE5HWF9FUlJPUikgewogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KHIsIDApOwogICAgICAgICBuZ3hfaHR0cF9jbG9zZV9jb25uZWN0aW9uKGMpOwogICAgICAgICByZXR1cm47CkBAIC0yMTAyLDYgKzIyNTQsMTYgQEAKIH0KIAogCit2b2lkCituZ3hfaHR0cF9yZXF1ZXN0X2VtcHR5X2hhbmRsZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQoreworICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIHJlcXVldHMgZW1wdHkgaGFuZGxlciIpOworCisgICAgcmV0dXJuOworfQorCisKIG5neF9pbnRfdAogbmd4X2h0dHBfc2VuZF9sYXN0KG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKQEAgLTIxMjIsMTQgKzIyODQsMTIgQEAKIAogCiB2b2lkCi1uZ3hfaHR0cF9jbG9zZV9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgaW50IGVycm9yKQorbmd4X2h0dHBfY2xvc2VfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9pbnRfdCBlcnJvcikKIHsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICBpOwogICAgIG5neF9sb2dfdCAgICAgICAgICAgICAgICAgKmxvZzsKKyAgICBzdHJ1Y3QgbGluZ2VyICAgICAgICAgICAgICBsaW5nZXI7CiAgICAgbmd4X2h0dHBfbG9nX2N0eF90ICAgICAgICAqY3R4OwotICAgIG5neF9odHRwX2NsZWFudXBfdCAgICAgICAgKmNsZWFudXA7CiAgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAqY2xjZjsKLSAgICBzdHJ1Y3QgbGluZ2VyICAgICAgICAgICAgICBsOwogCiAgICAgbG9nID0gci0+Y29ubmVjdGlvbi0+bG9nOwogCkBAIC0yMTU3LDYyICsyMzE3LDE1IEBACiAKICAgICBuZ3hfaHR0cF9sb2dfaGFuZGxlcihyKTsKIAotICAgIGNsZWFudXAgPSByLT5jbGVhbnVwLmVsdHM7Ci0gICAgZm9yIChpID0gMDsgaSA8IHItPmNsZWFudXAubmVsdHM7IGkrKykgewotICAgICAgICBpZiAoIWNsZWFudXBbaV0udmFsaWQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSNpZiAoTkdYX0hUVFBfQ0FDSEUpCi0KLSAgICAgICAgaWYgKGNsZWFudXBbaV0uY2FjaGUpIHsKLSAgICAgICAgICAgIG5neF9odHRwX2NhY2hlX3VubG9jayhjbGVhbnVwW2ldLmRhdGEuY2FjaGUuaGFzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwW2ldLmRhdGEuY2FjaGUuY2FjaGUsIGxvZyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0jZW5kaWYKLQotICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIGxvZywgMCwgImh0dHAgY2xlYW51cCBmZDogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwW2ldLmRhdGEuZmlsZS5mZCk7Ci0KLSAgICAgICAgaWYgKG5neF9jbG9zZV9maWxlKGNsZWFudXBbaV0uZGF0YS5maWxlLmZkKSA9PSBOR1hfRklMRV9FUlJPUikgewotICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCBsb2csIG5neF9lcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2Nsb3NlX2ZpbGVfbiAiIFwiJXNcIiBmYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwW2ldLmRhdGEuZmlsZS5uYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFNUVUIgKi8KLSAgICBpZiAoci0+ZmlsZS5mZCAhPSBOR1hfSU5WQUxJRF9GSUxFKSB7Ci0gICAgICAgIGlmIChuZ3hfY2xvc2VfZmlsZShyLT5maWxlLmZkKSA9PSBOR1hfRklMRV9FUlJPUikgewotICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCBsb2csIG5neF9lcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2Nsb3NlX2ZpbGVfbiAiIFwiJVZcIiBmYWlsZWQiLCAmci0+ZmlsZS5uYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyLT5yZXF1ZXN0X2JvZHkKLSAgICAgICAgJiYgci0+cmVxdWVzdF9ib2R5LT50ZW1wX2ZpbGUKLSAgICAgICAgJiYgci0+cmVxdWVzdF9ib2R5LT50ZW1wX2ZpbGUtPmZpbGUuZmQgIT0gTkdYX0lOVkFMSURfRklMRSkKLSAgICB7Ci0gICAgICAgIGlmIChuZ3hfY2xvc2VfZmlsZShyLT5yZXF1ZXN0X2JvZHktPnRlbXBfZmlsZS0+ZmlsZS5mZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBOR1hfRklMRV9FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCBsb2csIG5neF9lcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2Nsb3NlX2ZpbGVfbiAiIGRlbGV0ZWQgZmlsZSBcIiVWXCIgZmFpbGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJnItPnJlcXVlc3RfYm9keS0+dGVtcF9maWxlLT5maWxlLm5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgaWYgKHItPmNvbm5lY3Rpb24tPnRpbWVkb3V0KSB7CiAgICAgICAgIGNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKIAogICAgICAgICBpZiAoY2xjZi0+cmVzZXRfdGltZWRvdXRfY29ubmVjdGlvbikgewotICAgICAgICAgICAgbC5sX29ub2ZmID0gMTsKLSAgICAgICAgICAgIGwubF9saW5nZXIgPSAwOworICAgICAgICAgICAgbGluZ2VyLmxfb25vZmYgPSAxOworICAgICAgICAgICAgbGluZ2VyLmxfbGluZ2VyID0gMDsKIAogICAgICAgICAgICAgaWYgKHNldHNvY2tvcHQoci0+Y29ubmVjdGlvbi0+ZmQsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB2b2lkICopICZsLCBzaXplb2Yoc3RydWN0IGxpbmdlcikpID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgKikgJmxpbmdlciwgc2l6ZW9mKHN0cnVjdCBsaW5nZXIpKSA9PSAtMSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIGxvZywgbmd4X3NvY2tldF9lcnJubywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRzb2Nrb3B0KFNPX0xJTkdFUikgZmFpbGVkIik7CkBAIC0yMjIwLDcgKzIzMzMsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyogdGhlIHZhcml1b3MgcmVxdWVzdCBzdHJpbmdzIHdlcmUgYWxsb2NhdGVkIGZyb20gci0+cG9vbCAqLworICAgIC8qIHRoZSB2YXJpb3VzIHJlcXVlc3Qgc3RyaW5ncyB3ZXJlIGFsbG9jYXRlZCBmcm9tIHItPnBvb2wgKi8KICAgICBjdHggPSBsb2ctPmRhdGE7CiAgICAgY3R4LT5yZXF1ZXN0ID0gTlVMTDsKIApAQCAtMjI2Myw4ICsyMzc2LDggQEAKIAogICAgIGlmIChjLT5zc2wpIHsKICAgICAgICAgaWYgKG5neF9zc2xfc2h1dGRvd24oYykgPT0gTkdYX0FHQUlOKSB7Ci0gICAgICAgICAgICBjLT5yZWFkLT5ldmVudF9oYW5kbGVyID0gbmd4X3NzbF9jbG9zZV9oYW5kbGVyOwotICAgICAgICAgICAgYy0+d3JpdGUtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfc3NsX2Nsb3NlX2hhbmRsZXI7CisgICAgICAgICAgICBjLT5yZWFkLT5oYW5kbGVyID0gbmd4X3NzbF9jbG9zZV9oYW5kbGVyOworICAgICAgICAgICAgYy0+d3JpdGUtPmhhbmRsZXIgPSBuZ3hfc3NsX2Nsb3NlX2hhbmRsZXI7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CkBAIC0yMjkwLDI2ICsyNDAzLDMxIEBACiAgICAgbmd4X2h0dHBfcmVxdWVzdF90ICAqcjsKICAgICBuZ3hfaHR0cF9sb2dfY3R4X3QgICpjdHg7CiAKLSAgICBwID0gYnVmOwotCi0gICAgY3R4ID0gbG9nLT5kYXRhOwotCiAgICAgaWYgKGxvZy0+YWN0aW9uKSB7Ci0gICAgICAgIHAgPSBuZ3hfc25wcmludGYocCwgbGVuLCAiIHdoaWxlICVzIiwgbG9nLT5hY3Rpb24pOworICAgICAgICBwID0gbmd4X3NucHJpbnRmKGJ1ZiwgbGVuLCAiIHdoaWxlICVzIiwgbG9nLT5hY3Rpb24pOwogICAgICAgICBsZW4gLT0gcCAtIGJ1ZjsKICAgICAgICAgYnVmID0gcDsKICAgICB9CiAKKyAgICBjdHggPSBsb2ctPmRhdGE7CisKICAgICBwID0gbmd4X3NucHJpbnRmKGJ1ZiwgbGVuLCAiLCBjbGllbnQ6ICVWIiwgY3R4LT5jbGllbnQpOworICAgIGxlbiAtPSBwIC0gYnVmOwogCiAgICAgciA9IGN0eC0+cmVxdWVzdDsKIAotICAgIGlmIChyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIHA7CisgICAgaWYgKHIpIHsKKyAgICAgICAgcmV0dXJuIHItPmxvZ19oYW5kbGVyKHIsIHAsIGxlbik7CiAgICAgfQogCi0gICAgbGVuIC09IHAgLSBidWY7Ci0gICAgYnVmID0gcDsKKyAgICByZXR1cm4gcDsKK30KKworCitzdGF0aWMgdV9jaGFyICoKK25neF9odHRwX2xvZ19lcnJvcl9oYW5kbGVyKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgdV9jaGFyICAqcDsKIAogICAgIGlmIChyLT5zZXJ2ZXJfbmFtZS5kYXRhKSB7CiAgICAgICAgIHAgPSBuZ3hfc25wcmludGYoYnVmLCBsZW4sICIsIHNlcnZlcjogJVYiLCAmci0+c2VydmVyX25hbWUpOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5oIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5oCmluZGV4IGQ5ODg5YzguLjViMjYxNTEgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuaAorKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmgKQEAgLTgsNiArOCw5IEBACiAjZGVmaW5lIF9OR1hfSFRUUF9SRVFVRVNUX0hfSU5DTFVERURfCiAKIAorI2RlZmluZSBOR1hfSFRUUF9NQVhfUkVXUklURV9DWUNMRVMgICAgICAgIDEwCisKKwogI2RlZmluZSBOR1hfSFRUUF9ESVNDQVJEX0JVRkZFUl9TSVpFICAgICAgIDQwOTYKICNkZWZpbmUgTkdYX0hUVFBfTElOR0VSSU5HX0JVRkZFUl9TSVpFICAgICA0MDk2CiAKQEAgLTExNCwxMCArMTE3LDE3IEBACiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDsKKyAgICBuZ3hfaHR0cF9oZWFkZXJfaGFuZGxlcl9wdCAgICAgICAgaGFuZGxlcjsKIH0gbmd4X2h0dHBfaGVhZGVyX3Q7CiAKIAogdHlwZWRlZiBzdHJ1Y3QgeworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ7Cit9IG5neF9odHRwX2hlYWRlcjBfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CiAgICAgbmd4X2xpc3RfdCAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM7CiAKICAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICAqaG9zdDsKQEAgLTE4Myw3ICsxOTMsNiBAQAogCiAgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICAgKnNlcnZlcjsKICAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICAqZGF0ZTsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICAqY29udGVudF90eXBlOwogICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICpjb250ZW50X2xlbmd0aDsKICAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICAqY29udGVudF9lbmNvZGluZzsKICAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgICAqbG9jYXRpb247CkBAIC0xOTIsMTIgKzIwMSwxNCBAQAogICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICphY2NlcHRfcmFuZ2VzOwogICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICp3d3dfYXV0aGVudGljYXRlOwogICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICpleHBpcmVzOwotICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICpjYWNoZV9jb250cm9sOwogICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAgICpldGFnOwogCisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZTsKICAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldDsKICAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VzOwogCisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlX2NvbnRyb2w7CisKICAgICBvZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF9sZW5ndGhfbjsKICAgICB0aW1lX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV90aW1lOwogICAgIHRpbWVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X21vZGlmaWVkX3RpbWU7CkBAIC0yMTUsMjQgKzIyNiw2IEBACiB9IG5neF9odHRwX3JlcXVlc3RfYm9keV90OwogCiAKLXN0cnVjdCBuZ3hfaHR0cF9jbGVhbnVwX3MgewotICAgIHVuaW9uIHsKLSAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgIG5neF9mZF90ICAgICAgICAgICAgICAgICAgZmQ7Ci0gICAgICAgICAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgKm5hbWU7Ci0gICAgICAgIH0gZmlsZTsKLQotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgbmd4X2h0dHBfY2FjaGVfaGFzaF90ICAgICpoYXNoOwotICAgICAgICAgICAgbmd4X2h0dHBfY2FjaGVfZW50cnlfdCAgICpjYWNoZTsKLSAgICAgICAgfSBjYWNoZTsKLSAgICB9IGRhdGE7Ci0KLSAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQ6MTsKLSAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGU6MTsKLX07Ci0KLQogdHlwZWRlZiBzdHJ1Y3QgewogICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAgICAgICpyZXF1ZXN0OwogCkBAIC0yNDYsNyArMjM5LDE4IEBACiB9IG5neF9odHRwX2Nvbm5lY3Rpb25fdDsKIAogCit0eXBlZGVmIHN0cnVjdCBuZ3hfaHR0cF9wb3N0cG9uZWRfcmVxdWVzdF9zICBuZ3hfaHR0cF9wb3N0cG9uZWRfcmVxdWVzdF90OworCitzdHJ1Y3Qgbmd4X2h0dHBfcG9zdHBvbmVkX3JlcXVlc3RfcyB7CisgICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICAgICAgICAgKnJlcXVlc3Q7CisgICAgbmd4X2NoYWluX3QgICAgICAgICAgICAgICAgICAgKm91dDsKKyAgICBuZ3hfaHR0cF9wb3N0cG9uZWRfcmVxdWVzdF90ICAqbmV4dDsKK307CisKKwogdHlwZWRlZiBuZ3hfaW50X3QgKCpuZ3hfaHR0cF9oYW5kbGVyX3B0KShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwordHlwZWRlZiB2b2lkICgqbmd4X2h0dHBfZXZlbnRfaGFuZGxlcl9wdCkobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKKwogCiBzdHJ1Y3Qgbmd4X2h0dHBfcmVxdWVzdF9zIHsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlOyAgICAgICAgIC8qICJIVFRQIiAqLwpAQCAtMjU4LDEyICsyNjIsMTMgQEAKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqc3J2X2NvbmY7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmxvY19jb25mOwogCisgICAgbmd4X2h0dHBfZXZlbnRfaGFuZGxlcl9wdCAgICAgICAgIHJlYWRfZXZlbnRfaGFuZGxlcjsKKyAgICBuZ3hfaHR0cF9ldmVudF9oYW5kbGVyX3B0ICAgICAgICAgd3JpdGVfZXZlbnRfaGFuZGxlcjsKKwogICAgIG5neF9odHRwX2NhY2hlX3QgICAgICAgICAgICAgICAgICpjYWNoZTsKIAogICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgICAgICAgICAgICAgICp1cHN0cmVhbTsKIAotICAgIG5neF9maWxlX3QgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOwotCiAgICAgbmd4X3Bvb2xfdCAgICAgICAgICAgICAgICAgICAgICAgKnBvb2w7CiAgICAgbmd4X2J1Zl90ICAgICAgICAgICAgICAgICAgICAgICAgKmhlYWRlcl9pbjsKIApAQCAtMjg5LDcgKzI5NCwxMCBAQAogICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RfbmFtZTsKICAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9wcm90b2NvbDsKICAKKyAgICBuZ3hfY2hhaW5fdCAgICAgICAgICAgICAgICAgICAgICAqb3V0OwogICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAgICAgICptYWluOworICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAgICAgICpwYXJlbnQ7CisgICAgbmd4X2h0dHBfcG9zdHBvbmVkX3JlcXVlc3RfdCAgICAgKnBvc3Rwb25lZDsKIAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9hZGRyOwogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgICBwb3J0OwpAQCAtMzAzLDE5ICszMTEsMTggQEAKIAogICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICAgICAgKip2YXJpYWJsZXM7CiAKLSAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAgICAgICAgY2xlYW51cDsKLQogICAgIC8qIHVzZWQgdG8gbGVhcm4gdGhlIEFwYWNoZSBjb21wYXRpYmxlIHJlc3BvbnNlIGxlbmd0aCB3aXRob3V0IGEgaGVhZGVyICovCiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9zaXplOwogCiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfbGVuZ3RoOwogCi0gICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRpc2NhcmRlZF9idWZmZXI7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmVycl9jdHg7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICAgIGVycl9zdGF0dXM7CiAKICAgICBuZ3hfaHR0cF9jb25uZWN0aW9uX3QgICAgICAgICAgICAqaHR0cF9jb25uZWN0aW9uOwogCisgICAgbmd4X2h0dHBfbG9nX2hhbmRsZXJfcHQgICAgICAgICAgIGxvZ19oYW5kbGVyOworCiAgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBfc3RhdGU6NDsKIAogICAgIC8qIFVSSSB3aXRoICIvLiIgYW5kIG9uIFdpbjMyIHdpdGggIi8vIiAqLwpAQCAtMzMwLDEyICszMzcsMTEgQEAKICAgICAvKiBVUkkgd2l0aCAiXDAiIG9yICIlMDAiICovCiAgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm9faW5fdXJpOjE7CiAKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRfbG9jYXRpb246MTsKICAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRfdW5wYXJzZWRfdXJpOjE7CiAgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaV9jaGFuZ2VkOjE7CiAgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIHVyaV9jaGFuZ2VzOjQ7CiAKLSAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZF9oZWFkZXI6MTsKLQogICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfY2FzZV9leHRlbjoxOwogICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfdGltZW91dF9zZXQ6MTsKIApAQCAtMzQ2LDE0ICszNTIsMTYgQEAKICNpZiAwCiAgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hhYmxlOjE7CiAjZW5kaWYKLSAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmU6MTsKIAorICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZToxOwogICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFpbl9odHRwOjE7CiAgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rZWQ6MTsKICAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX29ubHk6MTsKICAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcGFsaXZlOjE7CiAgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmdlcmluZ19jbG9zZToxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDoxOwogICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZWQ6MTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZToxOwogCiAgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9uZWVkX2luX21lbW9yeToxOwogICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfc3NpX25lZWRfaW5fbWVtb3J5OjE7CkBAIC0zNjUsOCArMzczLDYgQEAKICAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdF93cml0aW5nOjE7CiAjZW5kaWYKIAotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzX247Ci0KICAgICAvKiB1c2VkIHRvIHBhcnNlIEhUVFAgaGVhZGVycyAqLwogICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTsKICAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAqdXJpX3N0YXJ0OwpAQCAtMzkxLDggKzM5Nyw3IEBACiAKIAogZXh0ZXJuIG5neF9odHRwX2hlYWRlcl90ICAgbmd4X2h0dHBfaGVhZGVyc19pbltdOwotZXh0ZXJuIG5neF9odHRwX2hlYWRlcl90ICAgbmd4X2h0dHBfaGVhZGVyc19vdXRbXTsKLQorZXh0ZXJuIG5neF9odHRwX2hlYWRlcjBfdCAgIG5neF9odHRwX2hlYWRlcnNfb3V0W107CiAKIAogI2VuZGlmIC8qIF9OR1hfSFRUUF9SRVFVRVNUX0hfSU5DTFVERURfICovCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0X2JvZHkuYyBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3RfYm9keS5jCmluZGV4IGVlZmZkOGEuLjQyZWRmZWYgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3RfYm9keS5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3RfYm9keS5jCkBAIC0xMCw5ICsxMCw4IEBACiAjaW5jbHVkZSA8bmd4X2h0dHAuaD4KIAogCi1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHlfaGFuZGxlcihuZ3hfZXZlbnRfdCAqcmV2KTsKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZG9fcmVhZF9jbGllbnRfcmVxdWVzdF9ib2R5KG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICBuZ3hfY29ubmVjdGlvbl90ICpjKTsKK3N0YXRpYyB2b2lkIG5neF9odHRwX3JlYWRfY2xpZW50X3JlcXVlc3RfYm9keV9oYW5kbGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2RvX3JlYWRfY2xpZW50X3JlcXVlc3RfYm9keShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwogCiAvKgogICogb24gY29tcGxldGlvbiBuZ3hfaHR0cF9yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHkoKSBhZGRzIHRvCkBAIC0yOSwxMCArMjgsMTQgQEAKICAgICBzc2l6ZV90ICAgICAgICAgICAgICAgICAgICBzaXplOwogICAgIG5neF9idWZfdCAgICAgICAgICAgICAgICAgKmI7CiAgICAgbmd4X2NoYWluX3QgICAgICAgICAgICAgICAqY2w7Ci0gICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICAgICAqYzsKICAgICBuZ3hfaHR0cF9yZXF1ZXN0X2JvZHlfdCAgICpyYjsKICAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICpjbGNmOwogCisgICAgaWYgKHItPnJlcXVlc3RfYm9keSkgeworICAgICAgICBwb3N0X2hhbmRsZXIocik7CisgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgfQorCiAgICAgcmIgPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfcmVxdWVzdF9ib2R5X3QpKTsKICAgICBpZiAocmIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwpAQCAtNDAsMTYgKzQzLDYgQEAKIAogICAgIHItPnJlcXVlc3RfYm9keSA9IHJiOwogCi0gICAgLyogU1RVQiAqLwotICAgIGlmIChyLT5maWxlLmZkICE9IE5HWF9JTlZBTElEX0ZJTEUpIHsKLSAgICAgICAgaWYgKG5neF9jbG9zZV9maWxlKHItPmZpbGUuZmQpID09IE5HWF9GSUxFX0VSUk9SKSB7Ci0gICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQUxFUlQsIHItPmNvbm5lY3Rpb24tPmxvZywgbmd4X2Vycm5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfY2xvc2VfZmlsZV9uICIgXCIlVlwiIGZhaWxlZCIsICZyLT5maWxlLm5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHItPmZpbGUuZmQgPSBOR1hfSU5WQUxJRF9GSUxFOwotICAgIH0KLSAgICAvKiovCi0KICAgICBpZiAoci0+aGVhZGVyc19pbi5jb250ZW50X2xlbmd0aF9uIDw9IDApIHsKICAgICAgICAgcG9zdF9oYW5kbGVyKHIpOwogICAgICAgICByZXR1cm4gTkdYX09LOwpAQCAtMTM4LDMwICsxMzEsMjMgQEAKICAgICAgICAgcmItPmJ1ZnMgPSBjbDsKICAgICB9CiAKLSAgICBjID0gci0+Y29ubmVjdGlvbjsKKyAgICByLT5yZWFkX2V2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF9yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHlfaGFuZGxlcjsKIAotICAgIGMtPnJlYWQtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF9yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHlfaGFuZGxlcjsKLQotICAgIHJldHVybiBuZ3hfaHR0cF9kb19yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHkociwgYyk7CisgICAgcmV0dXJuIG5neF9odHRwX2RvX3JlYWRfY2xpZW50X3JlcXVlc3RfYm9keShyKTsKIH0KIAogCiBzdGF0aWMgdm9pZAotbmd4X2h0dHBfcmVhZF9jbGllbnRfcmVxdWVzdF9ib2R5X2hhbmRsZXIobmd4X2V2ZW50X3QgKnJldikKK25neF9odHRwX3JlYWRfY2xpZW50X3JlcXVlc3RfYm9keV9oYW5kbGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKLSAgICBuZ3hfaW50X3QgICAgICAgICAgICByYzsKLSAgICBuZ3hfY29ubmVjdGlvbl90ICAgICpjOwotICAgIG5neF9odHRwX3JlcXVlc3RfdCAgKnI7CisgICAgbmd4X2ludF90ICByYzsKIAotICAgIGMgPSByZXYtPmRhdGE7Ci0gICAgciA9IGMtPmRhdGE7Ci0KLSAgICBpZiAocmV2LT50aW1lZG91dCkgeworICAgIGlmIChyLT5jb25uZWN0aW9uLT5yZWFkLT50aW1lZG91dCkgewogICAgICAgICBuZ3hfaHR0cF9maW5hbGl6ZV9yZXF1ZXN0KHIsIE5HWF9IVFRQX1JFUVVFU1RfVElNRV9PVVQpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgcmMgPSBuZ3hfaHR0cF9kb19yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHkociwgYyk7CisgICAgcmMgPSBuZ3hfaHR0cF9kb19yZWFkX2NsaWVudF9yZXF1ZXN0X2JvZHkocik7CiAKICAgICBpZiAocmMgPj0gTkdYX0hUVFBfU1BFQ0lBTF9SRVNQT05TRSkgewogICAgICAgICBuZ3hfaHR0cF9maW5hbGl6ZV9yZXF1ZXN0KHIsIHJjKTsKQEAgLTE3MCwxNiArMTU2LDE3IEBACiAKIAogc3RhdGljIG5neF9pbnRfdAotbmd4X2h0dHBfZG9fcmVhZF9jbGllbnRfcmVxdWVzdF9ib2R5KG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICBuZ3hfY29ubmVjdGlvbl90ICpjKQorbmd4X2h0dHBfZG9fcmVhZF9jbGllbnRfcmVxdWVzdF9ib2R5KG5neF9odHRwX3JlcXVlc3RfdCAqcikKIHsKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICBzaXplOwogICAgIHNzaXplX3QgICAgICAgICAgICAgICAgICAgIG47CiAgICAgbmd4X2J1Zl90ICAgICAgICAgICAgICAgICAqYjsKICAgICBuZ3hfdGVtcF9maWxlX3QgICAgICAgICAgICp0ZjsKKyAgICBuZ3hfY29ubmVjdGlvbl90ICAgICAgICAgICpjOwogICAgIG5neF9odHRwX3JlcXVlc3RfYm9keV90ICAgKnJiOwogICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgKmNsY2Y7CiAKKyAgICBjID0gci0+Y29ubmVjdGlvbjsKICAgICByYiA9IHItPnJlcXVlc3RfYm9keTsKIAogICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgYy0+bG9nLCAwLApAQCAtMjE4LDggKzIwNSw2IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJiLT50ZW1wX2ZpbGUtPm9mZnNldCArPSBuOwotCi0gICAgICAgICAgICByYi0+YnVmLT5wb3MgPSByYi0+YnVmLT5zdGFydDsKICAgICAgICAgICAgIHJiLT5idWYtPmxhc3QgPSByYi0+YnVmLT5zdGFydDsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvaHR0cC9uZ3hfaHR0cF9zY3JpcHQuYyBiL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5jCmluZGV4IGM3ZWIwNzQuLjM2MjgwN2EgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5jCisrKyBiL3NyYy9odHRwL25neF9odHRwX3NjcmlwdC5jCkBAIC05LDEwNyArOSwyNzQgQEAKICNpbmNsdWRlIDxuZ3hfaHR0cC5oPgogCiAKLW5neF9pbnRfdAotbmd4X2h0dHBfc2NyaXB0X2NvbXBpbGVfbGl0ZShuZ3hfY29uZl90ICpjZiwgbmd4X2FycmF5X3QgKnNvdXJjZXMsCi0gICAgbmd4X2FycmF5X3QgKipsZW5ndGhzLCBuZ3hfYXJyYXlfdCAqKnZhbHVlcywKLSAgICBuZ3hfaHR0cF9zY3JpcHRfY29tcGlsZV9saXRlX3N0YXJ0X3B0IHN0YXJ0LAotICAgIG5neF9odHRwX3NjcmlwdF9jb21waWxlX2xpdGVfZW5kX3B0IGVuZCkKKyNkZWZpbmUgbmd4X2h0dHBfc2NyaXB0X2V4aXQgICh1X2NoYXIgKikgJm5neF9odHRwX3NjcmlwdF9leGl0X2NvZGUKKworc3RhdGljIHVpbnRwdHJfdCBuZ3hfaHR0cF9zY3JpcHRfZXhpdF9jb2RlID0gKHVpbnRwdHJfdCkgTlVMTDsKKworCituZ3hfdWludF90CituZ3hfaHR0cF9zY3JpcHRfdmFyaWFibGVzX2NvdW50KG5neF9zdHJfdCAqdmFsdWUpCiB7Ci0gICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICpjb2RlOwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgaTsKLSAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgKnNyYzsKLSAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAgICAgICAgKnZhcjsKLSAgICBuZ3hfaHR0cF9zY3JpcHRfdmFyX2NvZGVfdCAgKnZhcl9jb2RlOworICAgIG5neF91aW50X3QgIGksIG47CiAKLSAgICBpZiAoc291cmNlcy0+bmVsdHMgPT0gMCkgewotICAgICAgICByZXR1cm4gTkdYX09LOworICAgIGZvciAobiA9IDAsIGkgPSAwOyBpIDwgdmFsdWUtPmxlbjsgaSsrKSB7CisgICAgICAgIGlmICh2YWx1ZS0+ZGF0YVtpXSA9PSAnJCcpIHsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgfQogICAgIH0KIAotICAgIGlmICgqbGVuZ3RocyA9PSBOVUxMKSB7Ci0gICAgICAgICpsZW5ndGhzID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgNjQsIDEpOwotICAgICAgICBpZiAoKmxlbmd0aHMgPT0gTlVMTCkgeworICAgIHJldHVybiBuOworfQorCisKK25neF9pbnRfdAorbmd4X2h0dHBfc2NyaXB0X2NvbXBpbGUobmd4X2h0dHBfc2NyaXB0X2NvbXBpbGVfdCAqc2MpCit7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaDsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU7CisgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb2RlOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgbiwgYnJhY2tldDsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfdmFyX2NvZGVfdCAgICAgICAgICAgKnZhcl9jb2RlOworICAgIG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCAgICAgICAgICAqY29weTsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfY29weV9jYXB0dXJlX2NvZGVfdCAgKmNvcHlfY2FwdHVyZTsKKworICAgIGlmICgqc2MtPmxlbmd0aHMgPT0gTlVMTCkgeworICAgICAgICBuID0gc2MtPnZhcmlhYmxlcyAqICgyICogc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X3Zhcl9jb2RlX3QpKQorICAgICAgICAgICAgKyBzaXplb2YodWludHB0cl90KTsKKworICAgICAgICAqc2MtPmxlbmd0aHMgPSBuZ3hfYXJyYXlfY3JlYXRlKHNjLT5jZi0+cG9vbCwgbiwgMSk7CisgICAgICAgIGlmICgqc2MtPmxlbmd0aHMgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICgqdmFsdWVzID09IE5VTEwpIHsKLSAgICAgICAgKnZhbHVlcyA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDI1NiwgMSk7Ci0gICAgICAgIGlmICgqdmFsdWVzID09IE5VTEwpIHsKKworICAgIGlmICgqc2MtPnZhbHVlcyA9PSBOVUxMKSB7CisgICAgICAgIG4gPSAoc2MtPnZhcmlhYmxlcyAqICgyICogc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90KSkKKyAgICAgICAgICAgICAgICArIHNpemVvZih1aW50cHRyX3QpCisgICAgICAgICAgICAgICAgKyBzYy0+c291cmNlLT5sZW4KKyAgICAgICAgICAgICAgICArIHNpemVvZih1aW50cHRyX3QpIC0gMSkKKyAgICAgICAgICAgICYgfihzaXplb2YodWludHB0cl90KSAtIDEpOworCisgICAgICAgICpzYy0+dmFsdWVzID0gbmd4X2FycmF5X2NyZWF0ZShzYy0+Y2YtPnBvb2wsIG4sIDEpOworICAgICAgICBpZiAoKnNjLT52YWx1ZXMgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogICAgIH0KIAotICAgIHNyYyA9IHNvdXJjZXMtPmVsdHM7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZXMtPm5lbHRzOyBpKyspIHsKKyAgICBzYy0+dmFyaWFibGVzID0gMDsKIAotICAgICAgICBpZiAoc3JjW2ldLnZhbHVlLmRhdGFbMF0gPT0gJyQnKSB7Ci0gICAgICAgICAgICBpZiAoc3RhcnQoJnNyY1tpXSwgKmxlbmd0aHMsICp2YWx1ZXMsIDApICE9IE5HWF9PSykgeworICAgIGZvciAoaSA9IDA7IGkgPCBzYy0+c291cmNlLT5sZW47IC8qIHZvaWQgKi8gKSB7CisKKyAgICAgICAgbmFtZS5sZW4gPSAwOworCisgICAgICAgIGlmIChzYy0+c291cmNlLT5kYXRhW2ldID09ICckJykgeworCisgICAgICAgICAgICBpZiAoKytpID09IHNjLT5zb3VyY2UtPmxlbikgeworICAgICAgICAgICAgICAgIGdvdG8gaW52YWxpZF92YXJpYWJsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNjLT5zb3VyY2UtPmRhdGFbaV0gPj0gJzEnICYmIHNjLT5zb3VyY2UtPmRhdGFbaV0gPD0gJzknKSB7CisKKyAgICAgICAgICAgICAgICBjb3B5X2NhcHR1cmUgPSBuZ3hfaHR0cF9zY3JpcHRfYWRkX2NvZGUoKnNjLT5sZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY2FwdHVyZV9jb2RlX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weV9jYXB0dXJlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb3B5X2NhcHR1cmUtPmNvZGUgPSAobmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3NjcmlwdF9jb3B5X2NhcHR1cmVfbGVuX2NvZGU7CisgICAgICAgICAgICAgICAgY29weV9jYXB0dXJlLT5uID0gMiAqIChzYy0+c291cmNlLT5kYXRhW2ldIC0gJzAnKTsKKworICAgICAgICAgICAgICAgIGNvcHlfY2FwdHVyZSA9IG5neF9odHRwX3NjcmlwdF9hZGRfY29kZSgqc2MtPnZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NhcHR1cmVfY29kZV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjLT5tYWluKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weV9jYXB0dXJlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb3B5X2NhcHR1cmUtPmNvZGUgPSBuZ3hfaHR0cF9zY3JpcHRfY29weV9jYXB0dXJlX2NvZGU7CisgICAgICAgICAgICAgICAgY29weV9jYXB0dXJlLT5uID0gc2MtPnNvdXJjZS0+ZGF0YVtpXSAtICcwJzsKKworICAgICAgICAgICAgICAgIGlmIChzYy0+bmNhcHR1cmVzIDwgY29weV9jYXB0dXJlLT5uKSB7CisgICAgICAgICAgICAgICAgICAgIHNjLT5uY2FwdHVyZXMgPSBjb3B5X2NhcHR1cmUtPm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29weV9jYXB0dXJlLT5uICo9IDI7CisKKyAgICAgICAgICAgICAgICBpKys7CisKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNjLT5zb3VyY2UtPmRhdGFbaV0gPT0gJ3snKSB7CisgICAgICAgICAgICAgICAgYnJhY2tldCA9IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoKytpID09IHNjLT5zb3VyY2UtPmxlbikgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGludmFsaWRfdmFyaWFibGU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbmFtZS5kYXRhID0gJnNjLT5zb3VyY2UtPmRhdGFbaV07CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJhY2tldCA9IDA7CisgICAgICAgICAgICAgICAgbmFtZS5kYXRhID0gJnNjLT5zb3VyY2UtPmRhdGFbaV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoIC8qIHZvaWQgKi8gOyBpIDwgc2MtPnNvdXJjZS0+bGVuOyBpKyssIG5hbWUubGVuKyspIHsKKyAgICAgICAgICAgICAgICBjaCA9IHNjLT5zb3VyY2UtPmRhdGFbaV07CisKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ30nICYmIGJyYWNrZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICBicmFja2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKQorICAgICAgICAgICAgICAgICAgICB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykKKyAgICAgICAgICAgICAgICAgICAgfHwgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCisgICAgICAgICAgICAgICAgICAgIHx8IGNoID09ICdfJykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnJhY2tldCkgeworICAgICAgICAgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBzYy0+Y2YsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgY2xvc2luZyBicmFja2V0IGluIFwiJVZcIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZSBpcyBtaXNzaW5nIiwgJm5hbWUpOwogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHNyY1tpXS52YWx1ZS5sZW4tLTsKLSAgICAgICAgICAgIHNyY1tpXS52YWx1ZS5kYXRhKys7CisgICAgICAgICAgICBpZiAobmFtZS5sZW4gPT0gMCkgeworICAgICAgICAgICAgICAgIGdvdG8gaW52YWxpZF92YXJpYWJsZTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdmFyID0gbmd4X2h0dHBfYWRkX3ZhcmlhYmxlKGNmLCAmc3JjW2ldLnZhbHVlLCAwKTsKKyAgICAgICAgICAgIHNjLT52YXJpYWJsZXMrKzsKIAotICAgICAgICAgICAgaWYgKHZhciA9PSBOVUxMKSB7CisgICAgICAgICAgICBpbmRleCA9IG5neF9odHRwX2dldF92YXJpYWJsZV9pbmRleChzYy0+Y2YsICZuYW1lKTsKKworICAgICAgICAgICAgaWYgKGluZGV4ID09IE5HWF9FUlJPUikgewogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHZhcl9jb2RlID0gbmd4X2FycmF5X3B1c2hfbigqbGVuZ3RocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X3Zhcl9jb2RlX3QpKTsKKyAgICAgICAgICAgIHZhcl9jb2RlID0gbmd4X2h0dHBfc2NyaXB0X2FkZF9jb2RlKCpzYy0+bGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgICAgICAgICBpZiAodmFyX2NvZGUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHZhcl9jb2RlLT5jb2RlID0gKG5neF9odHRwX3NjcmlwdF9jb2RlX3B0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9zY3JpcHRfY29weV92YXJfbGVuOwotICAgICAgICAgICAgdmFyX2NvZGUtPmluZGV4ID0gdmFyLT5pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfc2NyaXB0X2NvcHlfdmFyX2xlbl9jb2RlOworICAgICAgICAgICAgdmFyX2NvZGUtPmluZGV4ID0gKHVpbnRwdHJfdCkgaW5kZXg7CiAKIAotICAgICAgICAgICAgdmFyX2NvZGUgPSBuZ3hfYXJyYXlfcHVzaF9uKCp2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90KSk7CisgICAgICAgICAgICB2YXJfY29kZSA9IG5neF9odHRwX3NjcmlwdF9hZGRfY29kZSgqc2MtPnZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjLT5tYWluKTsKICAgICAgICAgICAgIGlmICh2YXJfY29kZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdmFyX2NvZGUtPmNvZGUgPSBuZ3hfaHR0cF9zY3JpcHRfY29weV92YXI7Ci0gICAgICAgICAgICB2YXJfY29kZS0+aW5kZXggPSB2YXItPmluZGV4OwotCi0KLSAgICAgICAgICAgIGlmIChlbmQoKmxlbmd0aHMsICp2YWx1ZXMpICE9IE5HWF9PSykgewotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB2YXJfY29kZS0+Y29kZSA9IG5neF9odHRwX3NjcmlwdF9jb3B5X3Zhcl9jb2RlOworICAgICAgICAgICAgdmFyX2NvZGUtPmluZGV4ID0gKHVpbnRwdHJfdCkgaW5kZXg7CiAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHN0YXJ0KCZzcmNbaV0sICpsZW5ndGhzLCAqdmFsdWVzLCAxKSAhPSBOR1hfT0spIHsKKyAgICAgICAgaWYgKHNjLT5zb3VyY2UtPmRhdGFbaV0gPT0gJz8nICYmIHNjLT5jb21waWxlX2FyZ3MpIHsKKyAgICAgICAgICAgIHNjLT5hcmdzID0gMTsKKyAgICAgICAgICAgIHNjLT5jb21waWxlX2FyZ3MgPSAwOworCisgICAgICAgICAgICBjb2RlID0gbmd4X2h0dHBfc2NyaXB0X2FkZF9jb2RlKCpzYy0+dmFsdWVzLCBzaXplb2YodWludHB0cl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjLT5tYWluKTsKKyAgICAgICAgICAgIGlmIChjb2RlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqY29kZSA9ICh1aW50cHRyX3QpIG5neF9odHRwX3NjcmlwdF9zdGFydF9hcmdzX2NvZGU7CisKKyAgICAgICAgICAgIGkrKzsKKworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBuYW1lLmRhdGEgPSAmc2MtPnNvdXJjZS0+ZGF0YVtpXTsKKworICAgICAgICB3aGlsZSAoaSA8IHNjLT5zb3VyY2UtPmxlbgorICAgICAgICAgICAgICAgJiYgc2MtPnNvdXJjZS0+ZGF0YVtpXSAhPSAnJCcKKyAgICAgICAgICAgICAgICYmICEoc2MtPnNvdXJjZS0+ZGF0YVtpXSA9PSAnPycgJiYgc2MtPmNvbXBpbGVfYXJncykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIG5hbWUubGVuKys7CisgICAgICAgIH0KKworICAgICAgICBzYy0+c2l6ZSArPSBuYW1lLmxlbjsKKworICAgICAgICBjb3B5ID0gbmd4X2h0dHBfc2NyaXB0X2FkZF9jb2RlKCpzYy0+bGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgaWYgKGNvcHkgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQorCisgICAgICAgIGNvcHktPmNvZGUgPSAobmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQpIG5neF9odHRwX3NjcmlwdF9jb3B5X2xlbl9jb2RlOworICAgICAgICBjb3B5LT5sZW4gPSBuYW1lLmxlbjsKKworICAgICAgICBzaXplID0gKHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfY29weV9jb2RlX3QpICsgbmFtZS5sZW4KKyAgICAgICAgICAgICAgICAgICArIHNpemVvZih1aW50cHRyX3QpIC0gMSkKKyAgICAgICAgICAgICAgICAmIH4oc2l6ZW9mKHVpbnRwdHJfdCkgLSAxKTsKKworICAgICAgICBjb3B5ID0gbmd4X2h0dHBfc2NyaXB0X2FkZF9jb2RlKCpzYy0+dmFsdWVzLCBzaXplLCAmc2MtPm1haW4pOworICAgICAgICBpZiAoY29weSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY29weS0+Y29kZSA9IG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGU7CisgICAgICAgIGNvcHktPmxlbiA9IG5hbWUubGVuOworCisgICAgICAgIG5neF9tZW1jcHkoKHVfY2hhciAqKSBjb3B5ICsgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCksCisgICAgICAgICAgICAgICAgICAgbmFtZS5kYXRhLCBuYW1lLmxlbik7CiAgICAgfQogCi0gICAgY29kZSA9IG5neF9hcnJheV9wdXNoX24oKmxlbmd0aHMsIHNpemVvZih1aW50cHRyX3QpKTsKLSAgICBpZiAoY29kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgaWYgKHNjLT5jb21wbGV0ZV9sZW5ndGhzKSB7CisgICAgICAgIGNvZGUgPSBuZ3hfaHR0cF9zY3JpcHRfYWRkX2NvZGUoKnNjLT5sZW5ndGhzLCBzaXplb2YodWludHB0cl90KSwgTlVMTCk7CisgICAgICAgIGlmIChjb2RlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAqY29kZSA9ICh1aW50cHRyX3QpIE5VTEw7CiAgICAgfQogCi0gICAgKmNvZGUgPSAodWludHB0cl90KSBOVUxMOworICAgIGlmIChzYy0+Y29tcGxldGVfdmFsdWVzKSB7CisgICAgICAgIGNvZGUgPSBuZ3hfaHR0cF9zY3JpcHRfYWRkX2NvZGUoKnNjLT52YWx1ZXMsIHNpemVvZih1aW50cHRyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYy0+bWFpbik7CisgICAgICAgIGlmIChjb2RlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgIH0KIAotICAgIGNvZGUgPSBuZ3hfYXJyYXlfcHVzaF9uKCp2YWx1ZXMsIHNpemVvZih1aW50cHRyX3QpKTsKLSAgICBpZiAoY29kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICpjb2RlID0gKHVpbnRwdHJfdCkgTlVMTDsKICAgICB9CiAKLSAgICAqY29kZSA9ICh1aW50cHRyX3QpIE5VTEw7Ci0KICAgICByZXR1cm4gTkdYX09LOworCitpbnZhbGlkX3ZhcmlhYmxlOgorCisgICAgbmd4X2NvbmZfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIHNjLT5jZiwgMCwgImludmFsaWQgdmFyaWFibGUgbmFtZSIpOworCisgICAgcmV0dXJuIE5HWF9FUlJPUjsKIH0KIAogCi0jaWYgMAotCi1zdGF0aWMgdm9pZCAqCit2b2lkICoKIG5neF9odHRwX3NjcmlwdF9zdGFydF9jb2RlKG5neF9wb29sX3QgKnBvb2wsIG5neF9hcnJheV90ICoqY29kZXMsIHNpemVfdCBzaXplKQogewogICAgIGlmICgqY29kZXMgPT0gTlVMTCkgewpAQCAtMTIyLDUxICsyODksNzkgQEAKICAgICByZXR1cm4gbmd4X2FycmF5X3B1c2hfbigqY29kZXMsIHNpemUpOwogfQogCi0jZW5kaWYKKwordm9pZCAqCituZ3hfaHR0cF9zY3JpcHRfYWRkX2NvZGUobmd4X2FycmF5X3QgKmNvZGVzLCBzaXplX3Qgc2l6ZSwgdm9pZCAqY29kZSkKK3sKKyAgICB1X2NoYXIgICplbHRzLCAqKnA7CisgICAgdm9pZCAgICAqbmV3OworCisgICAgZWx0cyA9IGNvZGVzLT5lbHRzOworCisgICAgbmV3ID0gbmd4X2FycmF5X3B1c2hfbihjb2Rlcywgc2l6ZSk7CisgICAgaWYgKG5ldyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoY29kZSkgeworICAgICAgICBpZiAoZWx0cyAhPSBjb2Rlcy0+ZWx0cykgeworICAgICAgICAgICAgcCA9IGNvZGU7CisgICAgICAgICAgICAqcCArPSAodV9jaGFyICopIGNvZGVzLT5lbHRzIC0gZWx0czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZXc7Cit9CiAKIAogc2l6ZV90Ci1uZ3hfaHR0cF9zY3JpcHRfY29weV9sZW4obmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKQorbmd4X2h0dHBfc2NyaXB0X2NvcHlfbGVuX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKQogewogICAgIG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCAgKmNvZGU7CiAKLSAgICBjb2RlID0gKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCAqKSBlLT5saXRlLmlwOworICAgIGNvZGUgPSAobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90ICopIGUtPmlwOwogCi0gICAgZS0+bGl0ZS5pcCArPSBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KTsKKyAgICBlLT5pcCArPSBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KTsKIAogICAgIHJldHVybiBjb2RlLT5sZW47CiB9CiAKIAogdm9pZAotbmd4X2h0dHBfc2NyaXB0X2NvcHkobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKQorbmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZShuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKmUpCiB7CiAgICAgbmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90ICAqY29kZTsKIAotICAgIGNvZGUgPSAobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90ICopIGUtPmxpdGUuaXA7CisgICAgY29kZSA9IChuZ3hfaHR0cF9zY3JpcHRfY29weV9jb2RlX3QgKikgZS0+aXA7CiAKLSAgICBlLT5saXRlLnBvcyA9IG5neF9jcHltZW0oZS0+bGl0ZS5wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPmxpdGUuaXAgKyBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZV90KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZS0+bGVuKTsKKyAgICBpZiAoIWUtPnNraXApIHsKKyAgICAgICAgZS0+cG9zID0gbmd4X2NweW1lbShlLT5wb3MsIGUtPmlwICsgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZS0+bGVuKTsKKyAgICB9CiAKLSAgICBlLT5saXRlLmlwICs9IHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfY29weV9jb2RlX3QpCi0gICAgICAgICAgICArICgoY29kZS0+bGVuICsgc2l6ZW9mKHVpbnRwdHJfdCkgLSAxKSAmIH4oc2l6ZW9mKHVpbnRwdHJfdCkgLSAxKSk7CisgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NvZGVfdCkKKyAgICAgICAgICArICgoY29kZS0+bGVuICsgc2l6ZW9mKHVpbnRwdHJfdCkgLSAxKSAmIH4oc2l6ZW9mKHVpbnRwdHJfdCkgLSAxKSk7CisKKyAgICBpZiAoZS0+bG9nKSB7CisgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgZS0+cmVxdWVzdC0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAiaHR0cCBzY3JpcHQgY29weTogXCIlVlwiIiwgJmUtPmJ1Zik7CisgICAgfQogfQogCiAKIHNpemVfdAotbmd4X2h0dHBfc2NyaXB0X2NvcHlfdmFyX2xlbihuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKmUpCituZ3hfaHR0cF9zY3JpcHRfY29weV92YXJfbGVuX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKQogewogICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICAqdmFsdWU7CiAgICAgbmd4X2h0dHBfc2NyaXB0X3Zhcl9jb2RlX3QgICpjb2RlOwogCi0gICAgY29kZSA9IChuZ3hfaHR0cF9zY3JpcHRfdmFyX2NvZGVfdCAqKSBlLT5saXRlLmlwOworICAgIGNvZGUgPSAobmd4X2h0dHBfc2NyaXB0X3Zhcl9jb2RlX3QgKikgZS0+aXA7CiAKLSAgICBlLT5saXRlLmlwICs9IHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfdmFyX2NvZGVfdCk7CisgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90KTsKIAotICAgIHZhbHVlID0gbmd4X2h0dHBfZ2V0X2luZGV4ZWRfdmFyaWFibGUoZS0+bGl0ZS5yZXF1ZXN0LCBjb2RlLT5pbmRleCk7CisgICAgdmFsdWUgPSBuZ3hfaHR0cF9nZXRfaW5kZXhlZF92YXJpYWJsZShlLT5yZXF1ZXN0LCBjb2RlLT5pbmRleCk7CiAKLSAgICBpZiAodmFsdWUgPT0gTlVMTCB8fCB2YWx1ZSA9PSBOR1hfSFRUUF9WQVJJQUJMRV9OT1RfRk9VTkQpIHsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCB8fCB2YWx1ZSA9PSBOR1hfSFRUUF9WQVJfTk9UX0ZPVU5EKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtMTc1LDIwICszNzAsNDU2IEBACiAKIAogdm9pZAotbmd4X2h0dHBfc2NyaXB0X2NvcHlfdmFyKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAqZSkKK25neF9odHRwX3NjcmlwdF9jb3B5X3Zhcl9jb2RlKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAqZSkKIHsKICAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAgKnZhbHVlOwogICAgIG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90ICAqY29kZTsKIAotICAgIGNvZGUgPSAobmd4X2h0dHBfc2NyaXB0X3Zhcl9jb2RlX3QgKikgZS0+bGl0ZS5pcDsKKyAgICBjb2RlID0gKG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90ICopIGUtPmlwOwogCi0gICAgZS0+bGl0ZS5pcCArPSBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X3Zhcl9jb2RlX3QpOworICAgIGUtPmlwICs9IHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfdmFyX2NvZGVfdCk7CiAKLSAgICB2YWx1ZSA9IG5neF9odHRwX2dldF9pbmRleGVkX3ZhcmlhYmxlKGUtPmxpdGUucmVxdWVzdCwgY29kZS0+aW5kZXgpOworICAgIGlmICghZS0+c2tpcCkgeworICAgICAgICB2YWx1ZSA9IG5neF9odHRwX2dldF9pbmRleGVkX3ZhcmlhYmxlKGUtPnJlcXVlc3QsIGNvZGUtPmluZGV4KTsKIAotICAgIGlmICh2YWx1ZSA9PSBOVUxMIHx8IHZhbHVlID09IE5HWF9IVFRQX1ZBUklBQkxFX05PVF9GT1VORCkgeworICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCB8fCB2YWx1ZSA9PSBOR1hfSFRUUF9WQVJfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBlLT5wb3MgPSBuZ3hfY3B5bWVtKGUtPnBvcywgdmFsdWUtPnRleHQuZGF0YSwgdmFsdWUtPnRleHQubGVuKTsKKworICAgICAgICBpZiAoZS0+bG9nKSB7CisgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIGUtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgImh0dHAgc2NyaXB0IHZhcjogXCIlVlwiIiwgJmUtPmJ1Zik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworc2l6ZV90CituZ3hfaHR0cF9zY3JpcHRfY29weV9jYXB0dXJlX2xlbl9jb2RlKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAqZSkKK3sKKyAgICBuZ3hfaHR0cF9zY3JpcHRfY29weV9jYXB0dXJlX2NvZGVfdCAgKmNvZGU7CisKKyAgICBjb2RlID0gKG5neF9odHRwX3NjcmlwdF9jb3B5X2NhcHR1cmVfY29kZV90ICopIGUtPmlwOworCisgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9jb3B5X2NhcHR1cmVfY29kZV90KTsKKworICAgIGlmICgoZS0+YXJncyB8fCBlLT5xdW90ZSkKKyAgICAgICAgJiYgKGUtPnJlcXVlc3QtPnF1b3RlZF91cmkgfHwgZS0+cmVxdWVzdC0+cGx1c19pbl91cmkpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGUtPmNhcHR1cmVzW2NvZGUtPm4gKyAxXSAtIGUtPmNhcHR1cmVzW2NvZGUtPm5dCisgICAgICAgICAgICAgICArIG5neF9lc2NhcGVfdXJpKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlLT5saW5lLT5kYXRhW2UtPmNhcHR1cmVzW2NvZGUtPm5dXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+Y2FwdHVyZXNbY29kZS0+biArIDFdIC0gZS0+Y2FwdHVyZXNbY29kZS0+bl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9FU0NBUEVfQVJHUyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGUtPmNhcHR1cmVzW2NvZGUtPm4gKyAxXSAtIGUtPmNhcHR1cmVzW2NvZGUtPm5dOworICAgIH0KK30KKworCit2b2lkCituZ3hfaHR0cF9zY3JpcHRfY29weV9jYXB0dXJlX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKQoreworICAgIG5neF9odHRwX3NjcmlwdF9jb3B5X2NhcHR1cmVfY29kZV90ICAqY29kZTsKKworICAgIGNvZGUgPSAobmd4X2h0dHBfc2NyaXB0X2NvcHlfY2FwdHVyZV9jb2RlX3QgKikgZS0+aXA7CisKKyAgICBlLT5pcCArPSBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X2NvcHlfY2FwdHVyZV9jb2RlX3QpOworCisgICAgaWYgKChlLT5hcmdzIHx8IGUtPnF1b3RlKQorICAgICAgICAmJiAoZS0+cmVxdWVzdC0+cXVvdGVkX3VyaSB8fCBlLT5yZXF1ZXN0LT5wbHVzX2luX3VyaSkpCisgICAgeworICAgICAgICBlLT5wb3MgPSAodV9jaGFyICopIG5neF9lc2NhcGVfdXJpKGUtPnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmUtPmxpbmUtPmRhdGFbZS0+Y2FwdHVyZXNbY29kZS0+bl1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT5jYXB0dXJlc1tjb2RlLT5uICsgMV0gLSBlLT5jYXB0dXJlc1tjb2RlLT5uXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0VTQ0FQRV9BUkdTKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlLT5wb3MgPSBuZ3hfY3B5bWVtKGUtPnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZS0+bGluZS0+ZGF0YVtlLT5jYXB0dXJlc1tjb2RlLT5uXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+Y2FwdHVyZXNbY29kZS0+biArIDFdIC0gZS0+Y2FwdHVyZXNbY29kZS0+bl0pOworICAgIH0KKworICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgZS0+cmVxdWVzdC0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIHNjcmlwdCBjYXB0dXJlOiBcIiVWXCIiLCAmZS0+YnVmKTsKK30KKworCit2b2lkCituZ3hfaHR0cF9zY3JpcHRfc3RhcnRfYXJnc19jb2RlKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAqZSkKK3sKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIGUtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCBzY3JpcHQgYXJncyIpOworICAgIAorICAgIGUtPmFyZ3MgPSBlLT5wb3M7CisgICAgZS0+aXAgKz0gc2l6ZW9mKHVpbnRwdHJfdCk7Cit9CisKKwordm9pZAorbmd4X2h0dHBfc2NyaXB0X3JlZ2V4X3N0YXJ0X2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKQoreworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICBsZW47CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgICAgIHJjOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICBuOworICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAgICpyOworICAgIG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAgICAgICBsZTsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfbGVuX2NvZGVfcHQgICAgbGNvZGU7CisgICAgbmd4X2h0dHBfc2NyaXB0X3JlZ2V4X2NvZGVfdCAgKmNvZGU7CisKKyAgICBjb2RlID0gKG5neF9odHRwX3NjcmlwdF9yZWdleF9jb2RlX3QgKikgZS0+aXA7CisKKyAgICByID0gZS0+cmVxdWVzdDsKKworICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIHNjcmlwdCByZWdleDogXCIlVlwiIiwgJmNvZGUtPm5hbWUpOworCisgICAgaWYgKGNvZGUtPnVyaSkgeworICAgICAgICBlLT5saW5lID0gJnItPnVyaTsKKyAgICB9IGVsc2UgeworICAgICAgICBlLT5zcC0tOworICAgICAgICBlLT5saW5lID0gJmUtPnNwLT50ZXh0OworICAgIH0KKworICAgIHJjID0gbmd4X3JlZ2V4X2V4ZWMoY29kZS0+cmVnZXgsIGUtPmxpbmUsIGUtPmNhcHR1cmVzLCBjb2RlLT5uY2FwdHVyZXMpOworCisgICAgaWYgKHJjID09IE5HWF9SRUdFWF9OT19NQVRDSEVEKSB7CisgICAgICAgIGlmIChlLT5sb2cpIHsKKyAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19OT1RJQ0UsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiJVZcIiBkb2VzIG5vdCBtYXRjaCBcIiVWXCIiLCAmY29kZS0+bmFtZSwgZS0+bGluZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29kZS0+dGVzdCkgeworICAgICAgICAgICAgZS0+c3AtPnZhbHVlID0gMDsgCisgICAgICAgICAgICBlLT5zcC0+dGV4dC5sZW4gPSAwOworICAgICAgICAgICAgZS0+c3AtPnRleHQuZGF0YSA9ICh1X2NoYXIgKikgIiI7CisgICAgICAgICAgICBlLT5zcCsrOworCisgICAgICAgICAgICBlLT5pcCArPSBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X3JlZ2V4X2NvZGVfdCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBlLT5pcCArPSBjb2RlLT5uZXh0OwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgZS0+bGl0ZS5wb3MgPSBuZ3hfY3B5bWVtKGUtPmxpdGUucG9zLCB2YWx1ZS0+dGV4dC5kYXRhLCB2YWx1ZS0+dGV4dC5sZW4pOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgbmd4X3JlZ2V4X2V4ZWNfbiAiIGZhaWxlZDogJWQgb24gXCIlVlwiIHVzaW5nIFwiJVZcIiIsCisgICAgICAgICAgICAgICAgICAgICAgcmMsIGUtPmxpbmUsICZjb2RlLT5uYW1lKTsKKworICAgICAgICBlLT5pcCA9IG5neF9odHRwX3NjcmlwdF9leGl0OworICAgICAgICBlLT5zdGF0dXMgPSBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZS0+bG9nKSB7CisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19OT1RJQ0UsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAiXCIlVlwiIG1hdGNoZXMgXCIlVlwiIiwgJmNvZGUtPm5hbWUsIGUtPmxpbmUpOworICAgIH0KKworICAgIGlmIChjb2RlLT50ZXN0KSB7CisgICAgICAgIGUtPnNwLT52YWx1ZSA9IDE7IAorICAgICAgICBlLT5zcC0+dGV4dC5sZW4gPSAxOworICAgICAgICBlLT5zcC0+dGV4dC5kYXRhID0gKHVfY2hhciAqKSAiMSI7CisgICAgICAgIGUtPnNwKys7CisKKyAgICAgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9yZWdleF9jb2RlX3QpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGNvZGUtPnN0YXR1cykgeworICAgICAgICBlLT5zdGF0dXMgPSBjb2RlLT5zdGF0dXM7CisKKyAgICAgICAgaWYgKCFjb2RlLT5yZWRpcmVjdCkgeworICAgICAgICAgICAgZS0+aXAgPSBuZ3hfaHR0cF9zY3JpcHRfZXhpdDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjb2RlLT51cmkpIHsKKyAgICAgICAgci0+aW50ZXJuYWwgPSAxOworICAgICAgICByLT52YWxpZF91bnBhcnNlZF91cmkgPSAwOworCisgICAgICAgIGlmIChjb2RlLT5icmVha19jeWNsZSkgeworICAgICAgICAgICAgci0+dmFsaWRfbG9jYXRpb24gPSAwOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByLT51cmlfY2hhbmdlZCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29kZS0+bGVuZ3RocyA9PSBOVUxMKSB7CisgICAgICAgIGUtPmJ1Zi5sZW4gPSBjb2RlLT5zaXplOworCisgICAgICAgIGlmIChjb2RlLT51cmkpIHsKKyAgICAgICAgICAgIGlmIChyYyAmJiAoci0+cXVvdGVkX3VyaSB8fCByLT5wbHVzX2luX3VyaSkpIHsKKyAgICAgICAgICAgICAgICBlLT5idWYubGVuICs9IDIgKiBuZ3hfZXNjYXBlX3VyaShOVUxMLCByLT51cmkuZGF0YSwgci0+dXJpLmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfRVNDQVBFX0FSR1MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChuID0gMTsgbiA8IChuZ3hfdWludF90KSByYzsgbisrKSB7CisgICAgICAgICAgICBlLT5idWYubGVuICs9IGUtPmNhcHR1cmVzWzIgKiBuICsgMV0gLSBlLT5jYXB0dXJlc1syICogbl07CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIG5neF9tZW16ZXJvKCZsZSwgc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCkpOworCisgICAgICAgIGxlLmlwID0gY29kZS0+bGVuZ3Rocy0+ZWx0czsKKyAgICAgICAgbGUucmVxdWVzdCA9IHI7CisgICAgICAgIGxlLmNhcHR1cmVzID0gZS0+Y2FwdHVyZXM7CisKKyAgICAgICAgbGVuID0gMTsgIC8qIHJlc2VydmUgMSBieXRlIGZvciBwb3NzaWJsZSAiPyIgKi8KKworICAgICAgICB3aGlsZSAoKih1aW50cHRyX3QgKikgbGUuaXApIHsKKyAgICAgICAgICAgIGxjb2RlID0gKihuZ3hfaHR0cF9zY3JpcHRfbGVuX2NvZGVfcHQgKikgbGUuaXA7CisgICAgICAgICAgICBsZW4gKz0gbGNvZGUoJmxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGUtPmJ1Zi5sZW4gPSBsZW47CisgICAgfQorCisgICAgaWYgKGNvZGUtPmFyZ3MgJiYgY29kZS0+YWRkX2FyZ3MgJiYgci0+YXJncy5sZW4pIHsKKyAgICAgICAgZS0+YnVmLmxlbiArPSByLT5hcmdzLmxlbiArIDE7CisgICAgfQorCisgICAgZS0+YnVmLmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIGUtPmJ1Zi5sZW4pOworICAgIGlmIChlLT5idWYuZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIGUtPmlwID0gbmd4X2h0dHBfc2NyaXB0X2V4aXQ7CisgICAgICAgIGUtPnN0YXR1cyA9IE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGUtPnF1b3RlID0gY29kZS0+cmVkaXJlY3Q7CisKKyAgICBlLT5wb3MgPSBlLT5idWYuZGF0YTsKKworICAgIGUtPmlwICs9IHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfcmVnZXhfY29kZV90KTsKK30KKworCit2b2lkCituZ3hfaHR0cF9zY3JpcHRfcmVnZXhfZW5kX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKQoreworICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAgICAgICAqcjsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfcmVnZXhfZW5kX2NvZGVfdCAgKmNvZGU7CisKKyAgICBjb2RlID0gKG5neF9odHRwX3NjcmlwdF9yZWdleF9lbmRfY29kZV90ICopIGUtPmlwOworCisgICAgciA9IGUtPnJlcXVlc3Q7CisKKyAgICBlLT5xdW90ZSA9IDA7CisKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCBzY3JpcHQgcmVnZXggZW5kIik7CisKKyAgICBpZiAoY29kZS0+cmVkaXJlY3QpIHsKKworICAgICAgICBpZiAoY29kZS0+YWRkX2FyZ3MgJiYgci0+YXJncy5sZW4pIHsgCisgICAgICAgICAgICAqZS0+cG9zKysgPSAodV9jaGFyKSAoY29kZS0+YXJncyA/ICcmJyA6ICc/Jyk7CisgICAgICAgICAgICBlLT5wb3MgPSBuZ3hfY3B5bWVtKGUtPnBvcywgci0+YXJncy5kYXRhLCByLT5hcmdzLmxlbik7CisgICAgICAgIH0KKworICAgICAgICBlLT5idWYubGVuID0gZS0+cG9zIC0gZS0+YnVmLmRhdGE7CisKKyAgICAgICAgaWYgKGUtPmxvZykgeworICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX05PVElDRSwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicmV3cml0dGVuIHJlZGlyZWN0OiBcIiVWXCIiLCAmZS0+YnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19vdXQuaGVhZGVycyk7CisgICAgICAgIGlmIChyLT5oZWFkZXJzX291dC5sb2NhdGlvbiA9PSBOVUxMKSB7CisgICAgICAgICAgICBlLT5pcCA9IG5neF9odHRwX3NjcmlwdF9leGl0OworICAgICAgICAgICAgZS0+c3RhdHVzID0gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgci0+aGVhZGVyc19vdXQubG9jYXRpb24tPmhhc2ggPSAxOyAKKyAgICAgICAgci0+aGVhZGVyc19vdXQubG9jYXRpb24tPmtleS5sZW4gPSBzaXplb2YoIkxvY2F0aW9uIikgLSAxOworICAgICAgICByLT5oZWFkZXJzX291dC5sb2NhdGlvbi0+a2V5LmRhdGEgPSAodV9jaGFyICopICJMb2NhdGlvbiI7CisgICAgICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uLT52YWx1ZSA9IGUtPmJ1ZjsKKworICAgICAgICBlLT5pcCArPSBzaXplb2Yobmd4X2h0dHBfc2NyaXB0X3JlZ2V4X2VuZF9jb2RlX3QpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGUtPmFyZ3MpIHsgCisgICAgICAgIGUtPmJ1Zi5sZW4gPSBlLT5hcmdzIC0gZS0+YnVmLmRhdGE7CisKKyAgICAgICAgaWYgKGNvZGUtPmFkZF9hcmdzICYmIHItPmFyZ3MubGVuKSB7CisgICAgICAgICAgICAqZS0+cG9zKysgPSAnJic7CisgICAgICAgICAgICBlLT5wb3MgPSBuZ3hfY3B5bWVtKGUtPnBvcywgci0+YXJncy5kYXRhLCByLT5hcmdzLmxlbik7CisgICAgICAgIH0KKworICAgICAgICByLT5hcmdzLmxlbiA9IGUtPnBvcyAtIGUtPmFyZ3M7CisgICAgICAgIHItPmFyZ3MuZGF0YSA9IGUtPmFyZ3M7CisKKyAgICAgICAgZS0+YXJncyA9IE5VTEw7CisKKyAgICB9IGVsc2UgeworICAgICAgICBlLT5idWYubGVuID0gZS0+cG9zIC0gZS0+YnVmLmRhdGE7CisgICAgfQorCisgICAgaWYgKGUtPmxvZykgeworICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfTk9USUNFLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgInJld3JpdHRlbiBkYXRhOiBcIiVWXCIsIGFyZ3M6IFwiJVZcIiIsCisgICAgICAgICAgICAgICAgICAgICAgJmUtPmJ1ZiwgJnItPmFyZ3MpOworICAgIH0KKworICAgIGlmIChjb2RlLT51cmkpIHsKKyAgICAgICAgci0+dXJpID0gZS0+YnVmOworCisgICAgICAgIGlmIChuZ3hfaHR0cF9zZXRfZXh0ZW4ocikgIT0gTkdYX09LKSB7CisgICAgICAgICAgICBlLT5pcCA9IG5neF9odHRwX3NjcmlwdF9leGl0OworICAgICAgICAgICAgZS0+c3RhdHVzID0gTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9yZWdleF9lbmRfY29kZV90KTsKK30KKworCit2b2lkCituZ3hfaHR0cF9zY3JpcHRfcmV0dXJuX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKQoreyAgIAorICAgIG5neF9odHRwX3NjcmlwdF9yZXR1cm5fY29kZV90ICAqY29kZTsKKyAgICAKKyAgICBjb2RlID0gKG5neF9odHRwX3NjcmlwdF9yZXR1cm5fY29kZV90ICopIGUtPmlwOworCisgICAgZS0+c3RhdHVzID0gY29kZS0+c3RhdHVzOworCisgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9yZXR1cm5fY29kZV90KSAtIHNpemVvZih1aW50cHRyX3QpOworfQorCisKK3ZvaWQKK25neF9odHRwX3NjcmlwdF9pZl9jb2RlKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAqZSkKK3sKKyAgICBuZ3hfaHR0cF9zY3JpcHRfaWZfY29kZV90ICAqY29kZTsKKworICAgIGNvZGUgPSAobmd4X2h0dHBfc2NyaXB0X2lmX2NvZGVfdCAqKSBlLT5pcDsKKworICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgZS0+cmVxdWVzdC0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIHNjcmlwdCBpZiIpOworCisgICAgZS0+c3AtLTsKKworICAgIGlmIChlLT5zcC0+dmFsdWUpIHsKKyAgICAgICAgaWYgKGNvZGUtPmxvY19jb25mKSB7CisgICAgICAgICAgICBlLT5yZXF1ZXN0LT5sb2NfY29uZiA9IGNvZGUtPmxvY19jb25mOworICAgICAgICB9CisKKyAgICAgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3NjcmlwdF9pZl9jb2RlX3QpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbmd4X2xvZ19kZWJ1ZzAoTkdYX0xPR19ERUJVR19IVFRQLCBlLT5yZXF1ZXN0LT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgc2NyaXB0IGlmIGZhbHNlIik7CisKKyAgICBlLT5pcCArPSBjb2RlLT5uZXh0OworfQorCisKK3ZvaWQKK25neF9odHRwX3NjcmlwdF92YWx1ZV9jb2RlKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAqZSkKK3sKKyAgICBuZ3hfaHR0cF9zY3JpcHRfdmFsdWVfY29kZV90ICAqY29kZTsKKworICAgIGNvZGUgPSAobmd4X2h0dHBfc2NyaXB0X3ZhbHVlX2NvZGVfdCAqKSBlLT5pcDsKKworICAgIGUtPmlwICs9IHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfdmFsdWVfY29kZV90KTsKKworICAgIG5neF9sb2dfZGVidWcwKE5HWF9MT0dfREVCVUdfSFRUUCwgZS0+cmVxdWVzdC0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIHNjcmlwdCB2YWx1ZSIpOworCisgICAgZS0+c3AtPnZhbHVlID0gKG5neF91aW50X3QpIGNvZGUtPnZhbHVlOworICAgIGUtPnNwLT50ZXh0LmxlbiA9IChzaXplX3QpIGNvZGUtPnRleHRfbGVuOworICAgIGUtPnNwLT50ZXh0LmRhdGEgPSAodV9jaGFyICopIGNvZGUtPnRleHRfZGF0YTsKKyAgICBlLT5zcCsrOworfQorCisKK3ZvaWQKK25neF9odHRwX3NjcmlwdF9zZXRfdmFyX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKQoreworICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAqcjsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAgKnZhbHVlOworICAgIG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgICAqY21jZjsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfdmFyX2NvZGVfdCAgKmNvZGU7CisKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIGUtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCBzY3JpcHQgc2V0IHZhciIpOworCisgICAgY29kZSA9IChuZ3hfaHR0cF9zY3JpcHRfdmFyX2NvZGVfdCAqKSBlLT5pcDsKKworICAgIGUtPmlwICs9IHNpemVvZihuZ3hfaHR0cF9zY3JpcHRfdmFyX2NvZGVfdCk7CisKKyAgICByID0gZS0+cmVxdWVzdDsKKworICAgIGlmIChyLT52YXJpYWJsZXMgPT0gTlVMTCkgeworICAgICAgICBjbWNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9tYWluX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOworCisgICAgICAgIHItPnZhcmlhYmxlcyA9IG5neF9wY2FsbG9jKHItPnBvb2wsIGNtY2YtPnZhcmlhYmxlcy5uZWx0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKikpOworICAgICAgICBpZiAoci0+dmFyaWFibGVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGUtPmlwID0gbmd4X2h0dHBfc2NyaXB0X2V4aXQ7CisgICAgICAgICAgICBlLT5zdGF0dXMgPSBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2YWx1ZSA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBlLT5pcCA9IG5neF9odHRwX3NjcmlwdF9leGl0OworICAgICAgICBlLT5zdGF0dXMgPSBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlLT5zcC0tOworCisgICAgKnZhbHVlID0gKmUtPnNwOworCisgICAgci0+dmFyaWFibGVzW2NvZGUtPmluZGV4XSA9IHZhbHVlOworfQorCisKK3ZvaWQKK25neF9odHRwX3NjcmlwdF92YXJfY29kZShuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKmUpCit7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgICp2YWx1ZTsKKyAgICBuZ3hfaHR0cF9zY3JpcHRfdmFyX2NvZGVfdCAgKmNvZGU7CisKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIGUtPnJlcXVlc3QtPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCBzY3JpcHQgdmFyIik7CisKKyAgICBjb2RlID0gKG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90ICopIGUtPmlwOworCisgICAgZS0+aXAgKz0gc2l6ZW9mKG5neF9odHRwX3NjcmlwdF92YXJfY29kZV90KTsKKworICAgIHZhbHVlID0gbmd4X2h0dHBfZ2V0X2luZGV4ZWRfdmFyaWFibGUoZS0+cmVxdWVzdCwgY29kZS0+aW5kZXgpOworCisgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgdmFsdWUgPT0gTkdYX0hUVFBfVkFSX05PVF9GT1VORCkgeworICAgICAgICBlLT5zcC0+dmFsdWUgPSAwOworICAgICAgICBlLT5zcC0+dGV4dC5sZW4gPSAwOworICAgICAgICBlLT5zcC0+dGV4dC5kYXRhID0gKHVfY2hhciAqKSAiIjsKKyAgICAgICAgZS0+c3ArKzsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbmd4X2xvZ19kZWJ1ZzIoTkdYX0xPR19ERUJVR19IVFRQLCBlLT5yZXF1ZXN0LT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgc2NyaXB0IHZhcjogJXVpLCBcIiVWXCIiLCB2YWx1ZS0+dmFsdWUsICZ2YWx1ZS0+dGV4dCk7CisKKyAgICAqZS0+c3AgPSAqdmFsdWU7CisgICAgZS0+c3ArKzsKK30KKworCit2b2lkCituZ3hfaHR0cF9zY3JpcHRfbm9wX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKQoreworICAgIGUtPmlwICs9IHNpemVvZih1aW50cHRyX3QpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfc2NyaXB0LmggYi9zcmMvaHR0cC9uZ3hfaHR0cF9zY3JpcHQuaAppbmRleCBmYWUyYjdiLi4yMTkyN2MxIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9zY3JpcHQuaAorKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9zY3JpcHQuaApAQCAtMTYsMjMgKzE2LDQ4IEBACiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICppcDsKICAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgKnBvczsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAgICAgKnNwOworCisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICBidWY7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICpsaW5lOworCisgICAgLyogdGhlIHN0YXJ0IG9mIHRoZSByZXdyaXR0ZW4gYXJndW1lbnRzICovCisgICAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICphcmdzOworCisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICBza2lwOjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZToxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgbG9nOjE7CisKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNhcHR1cmVzOworCisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CiAgICAgbmd4X2h0dHBfcmVxdWVzdF90ICAgICAgICAgICAgICpyZXF1ZXN0OwotfSBuZ3hfaHR0cF9zY3JpcHRfbGl0ZV9lbmdpbmVfdDsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X2h0dHBfc2NyaXB0X2xpdGVfZW5naW5lX3QgICBsaXRlOwogfSBuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3Q7CiAKIAotdHlwZWRlZiB2b2lkICgqbmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQpIChuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKmUpOwotdHlwZWRlZiBzaXplX3QgKCpuZ3hfaHR0cF9zY3JpcHRfbGVuX2NvZGVfcHQpCi0gICAgKG5neF9odHRwX3NjcmlwdF9saXRlX2VuZ2luZV90ICplKTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfY29uZl90ICAgICAgICAgICAgICAgICAgICAgKmNmOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAqc291cmNlOworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAgICoqbGVuZ3RoczsKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAgICAqKnZhbHVlczsKIAotdHlwZWRlZiBuZ3hfaW50X3QgKCpuZ3hfaHR0cF9zY3JpcHRfY29tcGlsZV9saXRlX3N0YXJ0X3B0KSAobmd4X3RhYmxlX2VsdF90ICpoLAotICAgIG5neF9hcnJheV90ICpsZW5ndGhzLCBuZ3hfYXJyYXlfdCAqdmFsdWVzLCBuZ3hfdWludF90IHZhbHVlKTsKLXR5cGVkZWYgbmd4X2ludF90ICgqbmd4X2h0dHBfc2NyaXB0X2NvbXBpbGVfbGl0ZV9lbmRfcHQpIChuZ3hfYXJyYXlfdCAqbGVuZ3RocywKLSAgICBuZ3hfYXJyYXlfdCAqdmFsdWVzKTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlczsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgIG5jYXB0dXJlczsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgIHNpemU7CisKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1haW47CisKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVfYXJnczoxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZV9udWxsOjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZV9sZW5ndGhzOjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZV92YWx1ZXM6MTsKKworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgYXJnczoxOworfSBuZ3hfaHR0cF9zY3JpcHRfY29tcGlsZV90OworCisKK3R5cGVkZWYgdm9pZCAoKm5neF9odHRwX3NjcmlwdF9jb2RlX3B0KSAobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKTsKK3R5cGVkZWYgc2l6ZV90ICgqbmd4X2h0dHBfc2NyaXB0X2xlbl9jb2RlX3B0KSAobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKTsKIAogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC00NywyMCArNzIsOTMgQEAKIH0gbmd4X2h0dHBfc2NyaXB0X3Zhcl9jb2RlX3Q7CiAKIAotbmd4X2ludF90IG5neF9odHRwX3NjcmlwdF9jb21waWxlX2xpdGUobmd4X2NvbmZfdCAqY2YsIG5neF9hcnJheV90ICpzb3VyY2VzLAotICAgIG5neF9hcnJheV90ICoqbGVuZ3Rocywgbmd4X2FycmF5X3QgKip2YWx1ZXMsCi0gICAgbmd4X2h0dHBfc2NyaXB0X2NvbXBpbGVfbGl0ZV9zdGFydF9wdCBzdGFydCwKLSAgICBuZ3hfaHR0cF9zY3JpcHRfY29tcGlsZV9saXRlX2VuZF9wdCBlbmQpOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG5neF9odHRwX3NjcmlwdF9jb2RlX3B0ICAgICAgICAgIGNvZGU7CisgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgICAgbjsKK30gbmd4X2h0dHBfc2NyaXB0X2NvcHlfY2FwdHVyZV9jb2RlX3Q7CiAKIAotc3RhdGljIHZvaWQgKm5neF9odHRwX3NjcmlwdF9zdGFydF9jb2RlKG5neF9wb29sX3QgKnBvb2wsIG5neF9hcnJheV90ICoqY29kZXMsCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQgICAgICAgICAgY29kZTsKKyAgICBuZ3hfcmVnZXhfdCAgICAgICAgICAgICAgICAgICAgICpyZWdleDsKKyAgICBuZ3hfYXJyYXlfdCAgICAgICAgICAgICAgICAgICAgICpsZW5ndGhzOworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgICAgIHNpemU7CisgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgICAgbmNhcHR1cmVzOworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICAgICBuZXh0OworCisgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgICAgdGVzdDoxOworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgICAgIHVyaToxOworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6MTsKKworICAgIC8qIGFkZCB0aGUgci0+YXJncyB0byB0aGUgbmV3IGFyZ3VtZW50cyAqLworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9hcmdzOjE7CisgICAgCisgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Q6MTsKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICAgICBicmVha19jeWNsZToxOworCisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTsKK30gbmd4X2h0dHBfc2NyaXB0X3JlZ2V4X2NvZGVfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQgICAgICAgICAgY29kZTsKKworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgICAgIHVyaToxOworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6MTsKKworICAgIC8qIGFkZCB0aGUgci0+YXJncyB0byB0aGUgbmV3IGFyZ3VtZW50cyAqLworICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9hcmdzOjE7CisKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdDoxOworfSBuZ3hfaHR0cF9zY3JpcHRfcmVnZXhfZW5kX2NvZGVfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQgICAgICAgICAgY29kZTsKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgICAgbnVsbDsKK30gbmd4X2h0dHBfc2NyaXB0X3JldHVybl9jb2RlX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG5neF9odHRwX3NjcmlwdF9jb2RlX3B0ICAgICAgICAgIGNvZGU7CisgICAgdWludHB0cl90ICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgKipsb2NfY29uZjsKK30gbmd4X2h0dHBfc2NyaXB0X2lmX2NvZGVfdDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbmd4X2h0dHBfc2NyaXB0X2NvZGVfcHQgICAgICAgICAgY29kZTsKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTsKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2xlbjsKKyAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2RhdGE7Cit9IG5neF9odHRwX3NjcmlwdF92YWx1ZV9jb2RlX3Q7CisKKworbmd4X3VpbnRfdCBuZ3hfaHR0cF9zY3JpcHRfdmFyaWFibGVzX2NvdW50KG5neF9zdHJfdCAqdmFsdWUpOworbmd4X2ludF90IG5neF9odHRwX3NjcmlwdF9jb21waWxlKG5neF9odHRwX3NjcmlwdF9jb21waWxlX3QgKnNjKTsKKwordm9pZCAqbmd4X2h0dHBfc2NyaXB0X3N0YXJ0X2NvZGUobmd4X3Bvb2xfdCAqcG9vbCwgbmd4X2FycmF5X3QgKipjb2RlcywKICAgICBzaXplX3Qgc2l6ZSk7Cit2b2lkICpuZ3hfaHR0cF9zY3JpcHRfYWRkX2NvZGUobmd4X2FycmF5X3QgKmNvZGVzLCBzaXplX3Qgc2l6ZSwgdm9pZCAqY29kZSk7CiAKLXNpemVfdCBuZ3hfaHR0cF9zY3JpcHRfY29weV9sZW4obmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKTsKLXZvaWQgbmd4X2h0dHBfc2NyaXB0X2NvcHkobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKTsKLXNpemVfdCBuZ3hfaHR0cF9zY3JpcHRfY29weV92YXJfbGVuKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAqZSk7Ci12b2lkIG5neF9odHRwX3NjcmlwdF9jb3B5X3ZhcihuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKmUpOwotCitzaXplX3Qgbmd4X2h0dHBfc2NyaXB0X2NvcHlfbGVuX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKTsKK3ZvaWQgbmd4X2h0dHBfc2NyaXB0X2NvcHlfY29kZShuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKmUpOworc2l6ZV90IG5neF9odHRwX3NjcmlwdF9jb3B5X3Zhcl9sZW5fY29kZShuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKmUpOwordm9pZCBuZ3hfaHR0cF9zY3JpcHRfY29weV92YXJfY29kZShuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKmUpOworc2l6ZV90IG5neF9odHRwX3NjcmlwdF9jb3B5X2NhcHR1cmVfbGVuX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKTsKK3ZvaWQgbmd4X2h0dHBfc2NyaXB0X2NvcHlfY2FwdHVyZV9jb2RlKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAqZSk7Cit2b2lkIG5neF9odHRwX3NjcmlwdF9yZWdleF9zdGFydF9jb2RlKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAqZSk7Cit2b2lkIG5neF9odHRwX3NjcmlwdF9yZWdleF9lbmRfY29kZShuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKmUpOwordm9pZCBuZ3hfaHR0cF9zY3JpcHRfY29weV9jYXB0dXJlX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKTsKK3ZvaWQgbmd4X2h0dHBfc2NyaXB0X3N0YXJ0X2FyZ3NfY29kZShuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKmUpOwordm9pZCBuZ3hfaHR0cF9zY3JpcHRfcmV0dXJuX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKTsKK3ZvaWQgbmd4X2h0dHBfc2NyaXB0X2lmX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKTsKK3ZvaWQgbmd4X2h0dHBfc2NyaXB0X3ZhbHVlX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKTsKK3ZvaWQgbmd4X2h0dHBfc2NyaXB0X3NldF92YXJfY29kZShuZ3hfaHR0cF9zY3JpcHRfZW5naW5lX3QgKmUpOwordm9pZCBuZ3hfaHR0cF9zY3JpcHRfdmFyX2NvZGUobmd4X2h0dHBfc2NyaXB0X2VuZ2luZV90ICplKTsKK3ZvaWQgbmd4X2h0dHBfc2NyaXB0X25vcF9jb2RlKG5neF9odHRwX3NjcmlwdF9lbmdpbmVfdCAqZSk7CiAKIAogI2VuZGlmIC8qIF9OR1hfSFRUUF9TQ1JJUFRfSF9JTkNMVURFRF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3NwZWNpYWxfcmVzcG9uc2UuYyBiL3NyYy9odHRwL25neF9odHRwX3NwZWNpYWxfcmVzcG9uc2UuYwppbmRleCAyY2NmNTFjLi41MzYwNjhiIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9zcGVjaWFsX3Jlc3BvbnNlLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfc3BlY2lhbF9yZXNwb25zZS5jCkBAIC0zMzEsMjIgKzMzMSwxNSBAQAogICAgICAgICAgICAgbXNpZV9wYWRkaW5nID0gMTsKICAgICAgICAgfQogCi0gICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZSA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpOwotICAgICAgICBpZiAoci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUtPmtleS5sZW4gPSBzaXplb2YoIkNvbnRlbnQtVHlwZSIpIC0gMTsKLSAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLT5rZXkuZGF0YSA9ICh1X2NoYXIgKikgIkNvbnRlbnQtVHlwZSI7Ci0gICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS0+dmFsdWUubGVuID0gc2l6ZW9mKCJ0ZXh0L2h0bWwiKSAtIDE7Ci0gICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS0+dmFsdWUuZGF0YSA9ICh1X2NoYXIgKikgInRleHQvaHRtbCI7CisgICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfdHlwZS5sZW4gPSBzaXplb2YoInRleHQvaHRtbCIpIC0gMTsKKyAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF90eXBlLmRhdGEgPSAodV9jaGFyICopICJ0ZXh0L2h0bWwiOwogCiAgICAgfSBlbHNlIHsKICAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGhfbiA9IC0xOwogICAgIH0KIAogICAgIGlmIChyLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aCkgewotICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aC0+a2V5LmxlbiA9IDA7CisgICAgICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfbGVuZ3RoLT5oYXNoID0gMDsKICAgICAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGggPSBOVUxMOwogICAgIH0KIApAQCAtNDE1LDcgKzQwOCwxMSBAQAogICAgICAgICBjbC0+YnVmID0gYjsKICAgICB9CiAKLSAgICBiLT5sYXN0X2J1ZiA9IDE7CisgICAgaWYgKHItPm1haW4gPT0gTlVMTCkgeworICAgICAgICBiLT5sYXN0X2J1ZiA9IDE7CisgICAgfQorCisgICAgYi0+bGFzdF9pbl9jaGFpbiA9IDE7CiAKICAgICBjbC0+bmV4dCA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMgYi9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5jCmluZGV4IDNkYWI1YzMuLmY3NjZkN2QgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uYwpAQCAtNiwxNCArNiwxNyBAQAogCiAjaW5jbHVkZSA8bmd4X2NvbmZpZy5oPgogI2luY2x1ZGUgPG5neF9jb3JlLmg+Ci0jaW5jbHVkZSA8bmd4X2h0dHAuaD4KICNpbmNsdWRlIDxuZ3hfZXZlbnRfY29ubmVjdC5oPgorI2luY2x1ZGUgPG5neF9odHRwLmg+CiAKIAotc3RhdGljIHZvaWQgbmd4X2h0dHBfdXBzdHJlYW1fY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb24obmd4X2V2ZW50X3QgKmV2KTsKK3N0YXRpYyB2b2lkIG5neF9odHRwX3Vwc3RyZWFtX3JkX2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CitzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV93cl9jaGVja19icm9rZW5fY29ubmVjdGlvbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOworc3RhdGljIHZvaWQgbmd4X2h0dHBfdXBzdHJlYW1fY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb24obmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF9ldmVudF90ICpldik7CiBzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9jb25uZWN0KG5neF9odHRwX3JlcXVlc3RfdCAqciwKICAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICp1KTsKLXN0YXRpYyB2b2lkIG5neF9odHRwX3Vwc3RyZWFtX3JlaW5pdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3Vwc3RyZWFtX3JlaW5pdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAqdSk7CiBzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9zZW5kX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLAogICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgKnUpOwpAQCAtMjEsNiArMjQsNyBAQAogc3RhdGljIHZvaWQgbmd4X2h0dHBfdXBzdHJlYW1fcHJvY2Vzc19oZWFkZXIobmd4X2V2ZW50X3QgKnJldik7CiBzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9zZW5kX3Jlc3BvbnNlKG5neF9odHRwX3JlcXVlc3RfdCAqciwKICAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICp1KTsKK3N0YXRpYyB2b2lkIG5neF9odHRwX3Vwc3RyZWFtX3Byb2Nlc3NfZG93bnN0cmVhbShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwogc3RhdGljIHZvaWQgbmd4X2h0dHBfdXBzdHJlYW1fcHJvY2Vzc19ib2R5KG5neF9ldmVudF90ICpldik7CiBzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9kdW1teV9oYW5kbGVyKG5neF9ldmVudF90ICp3ZXYpOwogc3RhdGljIHZvaWQgbmd4X2h0dHBfdXBzdHJlYW1fbmV4dChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCkBAIC0yOCwxOSArMzIsMTI1IEBACiBzdGF0aWMgdm9pZCBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqciwKICAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICp1LCBuZ3hfaW50X3QgcmMpOwogCitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3Vwc3RyZWFtX3Byb2Nlc3NfaGVhZGVyX2xpbmUobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF90YWJsZV9lbHRfdCAqaCwgbmd4X3VpbnRfdCBvZmZzZXQpOworc3RhdGljIG5neF9pbnRfdAorICAgIG5neF9odHRwX3Vwc3RyZWFtX3Byb2Nlc3NfbXVsdGlfaGVhZGVyX2xpbmVzKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfdGFibGVfZWx0X3QgKmgsIG5neF91aW50X3Qgb2Zmc2V0KTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfdXBzdHJlYW1faWdub3JlX2hlYWRlcl9saW5lKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfdGFibGVfZWx0X3QgKmgsIG5neF91aW50X3Qgb2Zmc2V0KTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfdXBzdHJlYW1fY29weV9oZWFkZXJfbGluZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X3RhYmxlX2VsdF90ICpoLCBuZ3hfdWludF90IG9mZnNldCk7CitzdGF0aWMgbmd4X2ludF90CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fY29uZGl0aW9uYWxfY29weV9oZWFkZXJfbGluZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X3RhYmxlX2VsdF90ICpoLCBuZ3hfdWludF90IG9mZnNldCk7CitzdGF0aWMgbmd4X2ludF90CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fY29weV9tdWx0aV9oZWFkZXJfbGluZXMobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF90YWJsZV9lbHRfdCAqaCwgbmd4X3VpbnRfdCBvZmZzZXQpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF91cHN0cmVhbV9jb3B5X2NvbnRlbnRfdHlwZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X3RhYmxlX2VsdF90ICpoLCBuZ3hfdWludF90IG9mZnNldCk7CitzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3Vwc3RyZWFtX2NvcHlfY29udGVudF9sZW5ndGgobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF90YWJsZV9lbHRfdCAqaCwgbmd4X3VpbnRfdCBvZmZzZXQpOworc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF91cHN0cmVhbV9yZXdyaXRlX2xvY2F0aW9uKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfdGFibGVfZWx0X3QgKmgsIG5neF91aW50X3Qgb2Zmc2V0KTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfdXBzdHJlYW1fcmV3cml0ZV9yZWZyZXNoKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfdGFibGVfZWx0X3QgKmgsIG5neF91aW50X3Qgb2Zmc2V0KTsKKyNpZiAoTkdYX0hUVFBfR1pJUCkKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfdXBzdHJlYW1fY29weV9jb250ZW50X2VuY29kaW5nKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfdGFibGVfZWx0X3QgKmgsIG5neF91aW50X3Qgb2Zmc2V0KTsKKyNlbmRpZgorCiBzdGF0aWMgc2l6ZV90IG5neF9odHRwX3Vwc3RyZWFtX2xvZ19zdGF0dXNfZ2V0bGVuKG5neF9odHRwX3JlcXVlc3RfdCAqciwKICAgICB1aW50cHRyX3QgZGF0YSk7CiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF91cHN0cmVhbV9sb2dfc3RhdHVzKG5neF9odHRwX3JlcXVlc3RfdCAqciwKICAgICB1X2NoYXIgKmJ1Ziwgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKIAorc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfdXBzdHJlYW1fbG9nX2Vycm9yKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCisgICAgc2l6ZV90IGxlbik7CiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3Vwc3RyZWFtX2FkZF9sb2dfZm9ybWF0cyhuZ3hfY29uZl90ICpjZik7CitzdGF0aWMgdm9pZCAqbmd4X2h0dHBfdXBzdHJlYW1fY3JlYXRlX21haW5fY29uZihuZ3hfY29uZl90ICpjZik7CitzdGF0aWMgY2hhciAqbmd4X2h0dHBfY29yZV9pbml0X21haW5fY29uZihuZ3hfY29uZl90ICpjZiwgdm9pZCAqY29uZik7CisKKworbmd4X2h0dHBfdXBzdHJlYW1faGVhZGVyX3QgIG5neF9odHRwX3Vwc3RyZWFtX2hlYWRlcnNfaW5bXSA9IHsKKworICAgIHsgbmd4X3N0cmluZygiU3RhdHVzIiksCisgICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX3Byb2Nlc3NfaGVhZGVyX2xpbmUsCisgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Vwc3RyZWFtX2hlYWRlcnNfaW5fdCwgc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgLyogU1RVQiAqLyBuZ3hfaHR0cF91cHN0cmVhbV9pZ25vcmVfaGVhZGVyX2xpbmUsIDAgfSwKKworICAgIHsgbmd4X3N0cmluZygiQ29udGVudC1UeXBlIiksCisgICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX3Byb2Nlc3NfaGVhZGVyX2xpbmUsCisgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Vwc3RyZWFtX2hlYWRlcnNfaW5fdCwgY29udGVudF90eXBlKSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fY29weV9jb250ZW50X3R5cGUsIDAgfSwKKworICAgIHsgbmd4X3N0cmluZygiQ29udGVudC1MZW5ndGgiKSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fcHJvY2Vzc19oZWFkZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfdXBzdHJlYW1faGVhZGVyc19pbl90LCBjb250ZW50X2xlbmd0aCksCisgICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2NvcHlfY29udGVudF9sZW5ndGgsIDAgfSwKKworICAgIHsgbmd4X3N0cmluZygiRGF0ZSIpLAorICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2hlYWRlcl9saW5lLAorICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF91cHN0cmVhbV9oZWFkZXJzX2luX3QsIGRhdGUpLAorICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9jb25kaXRpb25hbF9jb3B5X2hlYWRlcl9saW5lLAorICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF91cHN0cmVhbV9jb25mX3QsIHBhc3NfZGF0ZSkgfSwKKworICAgIHsgbmd4X3N0cmluZygiU2VydmVyIiksCisgICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX3Byb2Nlc3NfaGVhZGVyX2xpbmUsCisgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Vwc3RyZWFtX2hlYWRlcnNfaW5fdCwgc2VydmVyKSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fY29uZGl0aW9uYWxfY29weV9oZWFkZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfdXBzdHJlYW1fY29uZl90LCBwYXNzX3NlcnZlcikgfSwKKworICAgIHsgbmd4X3N0cmluZygiTG9jYXRpb24iKSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1faWdub3JlX2hlYWRlcl9saW5lLCAwLAorICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9yZXdyaXRlX2xvY2F0aW9uLCAwIH0sCisKKyAgICB7IG5neF9zdHJpbmcoIlJlZnJlc2giKSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1faWdub3JlX2hlYWRlcl9saW5lLCAwLAorICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9yZXdyaXRlX3JlZnJlc2gsIDAgfSwKKworICAgIHsgbmd4X3N0cmluZygiQ2FjaGUtQ29udHJvbCIpLAorICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX211bHRpX2hlYWRlcl9saW5lcywKKyAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfdXBzdHJlYW1faGVhZGVyc19pbl90LCBjYWNoZV9jb250cm9sKSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fY29weV9tdWx0aV9oZWFkZXJfbGluZXMsCisgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfb3V0X3QsIGNhY2hlX2NvbnRyb2wpIH0sCisKKyAgICB7IG5neF9zdHJpbmcoIkNvbm5lY3Rpb24iKSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1faWdub3JlX2hlYWRlcl9saW5lLCAwLAorICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9pZ25vcmVfaGVhZGVyX2xpbmUsIDAgfSwKKworICAgIHsgbmd4X3N0cmluZygiWC1QYWQiKSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1faWdub3JlX2hlYWRlcl9saW5lLCAwLAorICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9pZ25vcmVfaGVhZGVyX2xpbmUsIDAgfSwKKworICAgIHsgbmd4X3N0cmluZygiWC1Qb3dlcmVkLUJ5IiksCisgICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2lnbm9yZV9oZWFkZXJfbGluZSwgMCwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fY29uZGl0aW9uYWxfY29weV9oZWFkZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfdXBzdHJlYW1fY29uZl90LCBwYXNzX3hfcG93ZXJlZF9ieSkgfSwKKworICAgIHsgbmd4X3N0cmluZygiWC1BY2NlbC1FeHBpcmVzIiksCisgICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX3Byb2Nlc3NfaGVhZGVyX2xpbmUsCisgICAgICAgICAgICAgICAgIG9mZnNldG9mKG5neF9odHRwX3Vwc3RyZWFtX2hlYWRlcnNfaW5fdCwgeF9hY2NlbF9leHBpcmVzKSwKKyAgICAgICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fY29uZGl0aW9uYWxfY29weV9oZWFkZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfdXBzdHJlYW1fY29uZl90LCBwYXNzX3hfYWNjZWxfZXhwaXJlcykgfSwKKworI2lmIChOR1hfSFRUUF9HWklQKQorICAgIHsgbmd4X3N0cmluZygiQ29udGVudC1FbmNvZGluZyIpLAorICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2hlYWRlcl9saW5lLAorICAgICAgICAgICAgICAgICBvZmZzZXRvZihuZ3hfaHR0cF91cHN0cmVhbV9oZWFkZXJzX2luX3QsIGNvbnRlbnRfZW5jb2RpbmcpLAorICAgICAgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9jb3B5X2NvbnRlbnRfZW5jb2RpbmcsIDAgfSwKKyNlbmRpZgorCisgICAgeyBuZ3hfbnVsbF9zdHJpbmcsIE5VTEwsIDAsIE5VTEwsIDAgfQorfTsKIAogCiBuZ3hfaHR0cF9tb2R1bGVfdCAgbmd4X2h0dHBfdXBzdHJlYW1fbW9kdWxlX2N0eCA9IHsKLSAgICBuZ3hfaHR0cF91cHN0cmVhbV9hZGRfbG9nX2Zvcm1hdHMsICAgICAvKiBwcmUgY29uZiAqLwotICAgIAotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBtYWluIGNvbmZpZ3VyYXRpb24gKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IG1haW4gY29uZmlndXJhdGlvbiAqLworICAgIG5neF9odHRwX3Vwc3RyZWFtX2FkZF9sb2dfZm9ybWF0cywgICAgIC8qIHByZWNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3N0Y29uZmlndXJhdGlvbiAqLworCisgICAgbmd4X2h0dHBfdXBzdHJlYW1fY3JlYXRlX21haW5fY29uZiwgICAgLyogY3JlYXRlIG1haW4gY29uZmlndXJhdGlvbiAqLworICAgIG5neF9odHRwX2NvcmVfaW5pdF9tYWluX2NvbmYsICAgICAgICAgIC8qIGluaXQgbWFpbiBjb25maWd1cmF0aW9uICovCiAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiAqLwpAQCAtNTEsNyArMTYxLDcgQEAKICAgICAKIAogbmd4X21vZHVsZV90ICBuZ3hfaHR0cF91cHN0cmVhbV9tb2R1bGUgPSB7Ci0gICAgTkdYX01PRFVMRSwKKyAgICBOR1hfTU9EVUxFX1YxLAogICAgICZuZ3hfaHR0cF91cHN0cmVhbV9tb2R1bGVfY3R4LCAgICAgICAgIC8qIG1vZHVsZSBjb250ZXh0ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIGRpcmVjdGl2ZXMgKi8KICAgICBOR1hfSFRUUF9NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgdHlwZSAqLwpAQCAtNzcsOCArMTg3LDkgQEAKIHZvaWQKIG5neF9odHRwX3Vwc3RyZWFtX2luaXQobmd4X2h0dHBfcmVxdWVzdF90ICpyKQogewotICAgIG5neF9jb25uZWN0aW9uX3QgICAgICpjOwotICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgICp1OworICAgIG5neF9jb25uZWN0aW9uX3QgICAgICAgICAgKmM7CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAgICAgICAqdTsKKyAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICpjbGNmOwogCiAgICAgYyA9IHItPmNvbm5lY3Rpb247CiAKQEAgLTg5LDExICsyMDAsMTEgQEAKICAgICAgICAgbmd4X2RlbF90aW1lcihjLT5yZWFkKTsKICAgICB9CiAKLSAgICBjLT5yZWFkLT5ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfdXBzdHJlYW1fY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb247CisgICAgci0+cmVhZF9ldmVudF9oYW5kbGVyID0gbmd4X2h0dHBfdXBzdHJlYW1fcmRfY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb247CiAgICAgCiAgICAgaWYgKG5neF9ldmVudF9mbGFncyAmIE5HWF9VU0VfQ0xFQVJfRVZFTlQpIHsKICAgICAKLSAgICAgICAgYy0+d3JpdGUtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF91cHN0cmVhbV9jaGVja19icm9rZW5fY29ubmVjdGlvbjsKKyAgICAgICAgci0+d3JpdGVfZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX3Vwc3RyZWFtX3dyX2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uOwogCiAgICAgICAgIGlmICghYy0+d3JpdGUtPmFjdGl2ZSkgewogICAgICAgICAgICAgaWYgKG5neF9hZGRfZXZlbnQoYy0+d3JpdGUsIE5HWF9XUklURV9FVkVOVCwKQEAgLTEwNyw3ICsyMTgsMTQgQEAKIAogICAgIHUgPSByLT51cHN0cmVhbTsKIAotICAgIHUtPm1ldGhvZCA9IHItPm1ldGhvZDsKKyAgICB1LT5yZXF1ZXN0X2J1ZnMgPSByLT5yZXF1ZXN0X2JvZHktPmJ1ZnM7CisKKyAgICBpZiAodS0+Y29uZi0+bWV0aG9kID09IE5HWF9DT05GX1VOU0VUX1VJTlQpIHsKKyAgICAgICAgdS0+bWV0aG9kID0gci0+bWV0aG9kOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgdS0+bWV0aG9kID0gdS0+Y29uZi0+bWV0aG9kOworICAgIH0KIAogICAgIGlmICh1LT5jcmVhdGVfcmVxdWVzdChyKSA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgbmd4X2h0dHBfZmluYWxpemVfcmVxdWVzdChyLCBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwpAQCAtMTE1LDE0ICsyMzMsMTUgQEAKICAgICB9CiAKICAgICB1LT5wZWVyLmxvZyA9IHItPmNvbm5lY3Rpb24tPmxvZzsKLSAgICB1LT5zYXZlZF9sb2dfY3R4ID0gci0+Y29ubmVjdGlvbi0+bG9nLT5kYXRhOwotICAgIHUtPnNhdmVkX2xvZ19oYW5kbGVyID0gci0+Y29ubmVjdGlvbi0+bG9nLT5oYW5kbGVyOwotICAgIHItPmNvbm5lY3Rpb24tPmxvZy0+ZGF0YSA9IHUtPmxvZ19jdHg7Ci0gICAgci0+Y29ubmVjdGlvbi0+bG9nLT5oYW5kbGVyID0gdS0+bG9nX2hhbmRsZXI7CisgICAgdS0+c2F2ZWRfbG9nX2hhbmRsZXIgPSByLT5sb2dfaGFuZGxlcjsKKyAgICByLT5sb2dfaGFuZGxlciA9IG5neF9odHRwX3Vwc3RyZWFtX2xvZ19lcnJvcjsKKworICAgIGNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKIAogICAgIHUtPm91dHB1dC5zZW5kZmlsZSA9IHItPmNvbm5lY3Rpb24tPnNlbmRmaWxlOwogICAgIHUtPm91dHB1dC5wb29sID0gci0+cG9vbDsKICAgICB1LT5vdXRwdXQuYnVmcy5udW0gPSAxOworICAgIHUtPm91dHB1dC5idWZzLnNpemUgPSBjbGNmLT5jbGllbnRfYm9keV9idWZmZXJfc2l6ZTsKICAgICB1LT5vdXRwdXQub3V0cHV0X2ZpbHRlciA9IG5neF9jaGFpbl93cml0ZXI7CiAgICAgdS0+b3V0cHV0LmZpbHRlcl9jdHggPSAmdS0+d3JpdGVyOwogCkBAIC0xNDgsMjAgKzI2NywzMyBAQAogCiAKIHN0YXRpYyB2b2lkCi1uZ3hfaHR0cF91cHN0cmVhbV9jaGVja19icm9rZW5fY29ubmVjdGlvbihuZ3hfZXZlbnRfdCAqZXYpCituZ3hfaHR0cF91cHN0cmVhbV9yZF9jaGVja19icm9rZW5fY29ubmVjdGlvbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCit7CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fY2hlY2tfYnJva2VuX2Nvbm5lY3Rpb24ociwgci0+Y29ubmVjdGlvbi0+cmVhZCk7Cit9CisKKworc3RhdGljIHZvaWQKK25neF9odHRwX3Vwc3RyZWFtX3dyX2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uKG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3sKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV9jaGVja19icm9rZW5fY29ubmVjdGlvbihyLCByLT5jb25uZWN0aW9uLT53cml0ZSk7Cit9CisKKworc3RhdGljIHZvaWQKK25neF9odHRwX3Vwc3RyZWFtX2NoZWNrX2Jyb2tlbl9jb25uZWN0aW9uKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfZXZlbnRfdCAqZXYpCiB7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgbjsKICAgICBjaGFyICAgICAgICAgICAgICAgICBidWZbMV07CiAgICAgbmd4X2Vycl90ICAgICAgICAgICAgZXJyOyAKICAgICBuZ3hfY29ubmVjdGlvbl90ICAgICAqYzsKLSAgICBuZ3hfaHR0cF9yZXF1ZXN0X3QgICAqcjsKICAgICBuZ3hfaHR0cF91cHN0cmVhbV90ICAqdTsKIAogICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgZXYtPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAiaHR0cCB1cHN0cmVhbSBjaGVjayBjbGllbnQsIHdyaXRlIGV2ZW50OiVkIiwgZXYtPndyaXRlKTsKIAotICAgIGMgPSBldi0+ZGF0YTsKLSAgICByID0gYy0+ZGF0YTsKKyAgICBjID0gci0+Y29ubmVjdGlvbjsKICAgICB1ID0gci0+dXBzdHJlYW07CiAKICAgICBpZiAodS0+cGVlci5jb25uZWN0aW9uID09IE5VTEwpIHsKQEAgLTI5Niw4ICs0MjgsOCBAQAogICAgIGMgPSB1LT5wZWVyLmNvbm5lY3Rpb247CiAKICAgICBjLT5kYXRhID0gcjsKLSAgICBjLT53cml0ZS0+ZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX3Vwc3RyZWFtX3NlbmRfcmVxdWVzdF9oYW5kbGVyOwotICAgIGMtPnJlYWQtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2hlYWRlcjsKKyAgICBjLT53cml0ZS0+aGFuZGxlciA9IG5neF9odHRwX3Vwc3RyZWFtX3NlbmRfcmVxdWVzdF9oYW5kbGVyOworICAgIGMtPnJlYWQtPmhhbmRsZXIgPSBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2hlYWRlcjsKIAogICAgIGMtPnNlbmRmaWxlID0gci0+Y29ubmVjdGlvbi0+c2VuZGZpbGU7CiAKQEAgLTMxMiwxMSArNDQ0LDIwIEBACiAgICAgdS0+d3JpdGVyLmxpbWl0ID0gMDsKIAogICAgIGlmICh1LT5yZXF1ZXN0X3NlbnQpIHsKLSAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fcmVpbml0KHIsIHUpOworICAgICAgICBpZiAobmd4X2h0dHBfdXBzdHJlYW1fcmVpbml0KHIsIHUpICE9IE5HWF9PSykgeworICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHItPnJlcXVlc3RfYm9keS0+YnVmKSB7Ci0gICAgICAgIGlmIChyLT5yZXF1ZXN0X2JvZHktPnRlbXBfZmlsZSkgeworICAgIGlmIChyLT5yZXF1ZXN0X2JvZHkpIHsKKyAgICAgICAgaWYgKHItPnJlcXVlc3RfYm9keS0+dGVtcF9maWxlICYmIHItPm1haW4gPT0gTlVMTCkgeworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogdGhlIHItPnJlcXVlc3RfYm9keS0+YnVmIGNhbiBiZSByZXVzZWQgZm9yIG9uZSByZXF1ZXN0IG9ubHksCisgICAgICAgICAgICAgKiB0aGUgc3VicmVxdWVzdHMgc2hvdWxkIGFsbG9jYXRlIHRoZWlyIG93biB0ZW1wb3JheSBidWZzCisgICAgICAgICAgICAgKi8KIAogICAgICAgICAgICAgdS0+b3V0cHV0LmZyZWUgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKTsKICAgICAgICAgICAgIGlmICh1LT5vdXRwdXQuZnJlZSA9PSBOVUxMKSB7CkBAIC0zMzIsOSArNDczLDYgQEAKICAgICAgICAgICAgIHItPnJlcXVlc3RfYm9keS0+YnVmLT5wb3MgPSByLT5yZXF1ZXN0X2JvZHktPmJ1Zi0+c3RhcnQ7CiAgICAgICAgICAgICByLT5yZXF1ZXN0X2JvZHktPmJ1Zi0+bGFzdCA9IHItPnJlcXVlc3RfYm9keS0+YnVmLT5zdGFydDsKICAgICAgICAgICAgIHItPnJlcXVlc3RfYm9keS0+YnVmLT50YWcgPSB1LT5vdXRwdXQudGFnOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByLT5yZXF1ZXN0X2JvZHktPmJ1Zi0+cG9zID0gci0+cmVxdWVzdF9ib2R5LT5idWYtPnN0YXJ0OwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNTEsMjkgKzQ4OSw1MSBAQAogfQogCiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgbmd4X2ludF90CiBuZ3hfaHR0cF91cHN0cmVhbV9yZWluaXQobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfaHR0cF91cHN0cmVhbV90ICp1KQogewogICAgIG5neF9jaGFpbl90ICAqY2w7CiAKLSAgICBpZiAodS0+cmVpbml0X3JlcXVlc3QocikgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3QociwgdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOwotICAgICAgICByZXR1cm47CisgICAgaWYgKHUtPnJlaW5pdF9yZXF1ZXN0KHIpICE9IE5HWF9PSykgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIG5neF9tZW16ZXJvKCZyLT51cHN0cmVhbS0+aGVhZGVyc19pbiwKKyAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfdXBzdHJlYW1faGVhZGVyc19pbl90KSk7CisKKyAgICBpZiAobmd4X2xpc3RfaW5pdCgmci0+dXBzdHJlYW0tPmhlYWRlcnNfaW4uaGVhZGVycywgci0+cG9vbCwgOCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X3RhYmxlX2VsdF90KSkgIT0gTkdYX09LKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKICAgICAvKiByZWluaXQgdGhlIHJlcXVlc3QgY2hhaW4gKi8KICAgICAKLSAgICBmb3IgKGNsID0gci0+cmVxdWVzdF9ib2R5LT5idWZzOyBjbDsgY2wgPSBjbC0+bmV4dCkgeworICAgIGZvciAoY2wgPSB1LT5yZXF1ZXN0X2J1ZnM7IGNsOyBjbCA9IGNsLT5uZXh0KSB7CiAgICAgICAgIGNsLT5idWYtPnBvcyA9IGNsLT5idWYtPnN0YXJ0OwogICAgICAgICBjbC0+YnVmLT5maWxlX3BvcyA9IDA7CiAgICAgfQogCi0gICAgLyogcmVpbml0IHRoZSBuZ3hfb3V0cHV0X2NoYWluKCkgY29udGV4dCAqLworICAgIC8qIHJlaW5pdCB0aGUgc3VicmVxdWVzdCdzIG5neF9vdXRwdXRfY2hhaW4oKSBjb250ZXh0ICovCisKKyAgICBpZiAoci0+cmVxdWVzdF9ib2R5KSB7CisgICAgICAgIGlmIChyLT5yZXF1ZXN0X2JvZHktPnRlbXBfZmlsZSAmJiByLT5tYWluICYmIHUtPm91dHB1dC5idWYpIHsKKworICAgICAgICAgICAgdS0+b3V0cHV0LmZyZWUgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKTsKKyAgICAgICAgICAgIGlmICh1LT5vdXRwdXQuZnJlZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdS0+b3V0cHV0LmZyZWUtPmJ1ZiA9IHUtPm91dHB1dC5idWY7CisgICAgICAgICAgICB1LT5vdXRwdXQuZnJlZS0+bmV4dCA9IE5VTEw7CisKKyAgICAgICAgICAgIHUtPm91dHB1dC5idWYtPnBvcyA9IHUtPm91dHB1dC5idWYtPnN0YXJ0OworICAgICAgICAgICAgdS0+b3V0cHV0LmJ1Zi0+bGFzdCA9IHUtPm91dHB1dC5idWYtPnN0YXJ0OworICAgICAgICB9CisgICAgfQogCiAgICAgdS0+b3V0cHV0LmJ1ZiA9IE5VTEw7CiAgICAgdS0+b3V0cHV0LmluID0gTlVMTDsKLSAgICB1LT5vdXRwdXQuZnJlZSA9IE5VTEw7CiAgICAgdS0+b3V0cHV0LmJ1c3kgPSBOVUxMOwogICAgIAogICAgIC8qIHJlaW5pdCB1LT5oZWFkZXJfaW4gYnVmZmVyICovCkBAIC0zODgsMjAgKzU0OCwyMiBAQAogICAgICAgICB1LT5oZWFkZXJfaW4ubGFzdCA9IHUtPmhlYWRlcl9pbi5zdGFydDsKICAgICB9CiAjZWxzZQorCiAgICAgICAgIHUtPmhlYWRlcl9pbi5wb3MgPSB1LT5oZWFkZXJfaW4uc3RhcnQ7CiAgICAgICAgIHUtPmhlYWRlcl9pbi5sYXN0ID0gdS0+aGVhZGVyX2luLnN0YXJ0OworCiAjZW5kaWYKIAogICAgIC8qIGFkZCBvbmUgbW9yZSBzdGF0ZSAqLwogCiAgICAgdS0+c3RhdGUgPSBuZ3hfYXJyYXlfcHVzaCgmdS0+c3RhdGVzKTsKICAgICBpZiAodS0+c3RhdGUgPT0gTlVMTCkgewotICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgIH0KIAogICAgIG5neF9tZW16ZXJvKHUtPnN0YXRlLCBzaXplb2Yobmd4X2h0dHBfdXBzdHJlYW1fc3RhdGVfdCkpOworCisgICAgcmV0dXJuIE5HWF9PSzsKIH0KIAogCkBAIC00MzMsOCArNTk1LDcgQEAKIAogICAgIGMtPmxvZy0+YWN0aW9uID0gInNlbmRpbmcgcmVxdWVzdCB0byB1cHN0cmVhbSI7CiAKLSAgICByYyA9IG5neF9vdXRwdXRfY2hhaW4oJnUtPm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdS0+cmVxdWVzdF9zZW50ID8gTlVMTCA6IHItPnJlcXVlc3RfYm9keS0+YnVmcyk7CisgICAgcmMgPSBuZ3hfb3V0cHV0X2NoYWluKCZ1LT5vdXRwdXQsIHUtPnJlcXVlc3Rfc2VudCA/IE5VTEwgOiB1LT5yZXF1ZXN0X2J1ZnMpOwogCiAgICAgdS0+cmVxdWVzdF9zZW50ID0gMTsKIApAQCAtNDk0LDkgKzY1NSw5IEBACiAgICAgfQogI2VuZGlmCiAKLSAgICBjLT53cml0ZS0+ZXZlbnRfaGFuZGxlciA9IG5neF9odHRwX3Vwc3RyZWFtX2R1bW15X2hhbmRsZXI7CisgICAgYy0+d3JpdGUtPmhhbmRsZXIgPSBuZ3hfaHR0cF91cHN0cmVhbV9kdW1teV9oYW5kbGVyOwogCi0gICAgaWYgKG5neF9oYW5kbGVfbGV2ZWxfd3JpdGVfZXZlbnQoYy0+d3JpdGUpID09IE5HWF9FUlJPUikgeworICAgIGlmIChuZ3hfaGFuZGxlX3dyaXRlX2V2ZW50KGMtPndyaXRlLCAwKSA9PSBOR1hfRVJST1IpIHsKICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7CiAgICAgICAgIHJldHVybjsKQEAgLTU3NSw2ICs3MzYsMTQgQEAKIAogICAgICAgICB1LT5oZWFkZXJfaW4udGFnID0gdS0+b3V0cHV0LnRhZzsKIAorICAgICAgICBpZiAobmd4X2xpc3RfaW5pdCgmci0+dXBzdHJlYW0tPmhlYWRlcnNfaW4uaGVhZGVycywgci0+cG9vbCwgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF90YWJsZV9lbHRfdCkpID09IE5HWF9FUlJPUikKKyAgICAgICAgeworICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICNpZiAwCiAgICAgICAgIGlmICh1LT5jYWNoZSkgewogICAgICAgICAgICAgdS0+aGVhZGVyX2luLnBvcyArPSB1LT5jYWNoZS0+Y3R4LmhlYWRlcl9zaXplOwpAQCAtNjMxLDcgKzgwMCw3IEBACiAgICAgICAgIG5neF9hZGRfdGltZXIocmV2LCB1LT5yZWFkX3RpbWVvdXQpOwogI2VuZGlmCiAKLSAgICAgICAgaWYgKHUtPmhlYWRlcl9pbi5sYXN0ID09IHUtPmhlYWRlcl9pbi5lbmQpIHsKKyAgICAgICAgaWYgKHUtPmhlYWRlcl9pbi5wb3MgPT0gdS0+aGVhZGVyX2luLmVuZCkgewogICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgcmV2LT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cHN0cmVhbSBzZW50IHRvbyBiaWcgaGVhZGVyIik7CiAKQEAgLTY2MSw2ICs4MzAsMzggQEAKIAogICAgIC8qIHJjID09IE5HWF9PSyAqLwogCisgICAgaWYgKHItPmhlYWRlcnNfb3V0LnN0YXR1cyA9PSBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpIHsKKworICAgICAgICBpZiAodS0+cGVlci50cmllcyA+IDEKKyAgICAgICAgICAgICYmICh1LT5jb25mLT5uZXh0X3Vwc3RyZWFtICYgTkdYX0hUVFBfVVBTVFJFQU1fRlRfSFRUUF81MDApKQorICAgICAgICB7CisgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9uZXh0KHIsIHUsIE5HWF9IVFRQX1VQU1RSRUFNX0ZUX0hUVFBfNTAwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisjaWYgKE5HWF9IVFRQX0NBQ0hFKQorCisgICAgICAgIGlmICh1LT5wZWVyLnRyaWVzID09IDAKKyAgICAgICAgICAgICYmIHUtPnN0YWxlCisgICAgICAgICAgICAmJiAodS0+Y29uZi0+dXNlX3N0YWxlICYgTkdYX0hUVFBfVVBTVFJFQU1fRlRfSFRUUF81MDApKQorICAgICAgICB7CisgICAgICAgICAgICBuZ3hfaHR0cF91cHN0cmVhbV9maW5hbGl6ZV9yZXF1ZXN0KHIsIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9zZW5kX2NhY2hlZF9yZXNwb25zZShyKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworI2VuZGlmCisgICAgfQorCisgICAgaWYgKHItPmhlYWRlcnNfb3V0LnN0YXR1cyA9PSBOR1hfSFRUUF9OT1RfRk9VTkQKKyAgICAgICAgJiYgdS0+cGVlci50cmllcyA+IDEKKyAgICAgICAgJiYgdS0+Y29uZi0+bmV4dF91cHN0cmVhbSAmIE5HWF9IVFRQX1VQU1RSRUFNX0ZUX0hUVFBfNDA0KQorICAgIHsKKyAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fbmV4dChyLCB1LCBOR1hfSFRUUF9VUFNUUkVBTV9GVF9IVFRQXzQwNCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKwogICAgIGlmIChyLT5oZWFkZXJzX291dC5zdGF0dXMgPj0gTkdYX0hUVFBfQkFEX1JFUVVFU1QKICAgICAgICAgJiYgdS0+Y29uZi0+cmVkaXJlY3RfZXJyb3JzCiAgICAgICAgICYmIHItPmVycl9jdHggPT0gTlVMTCkKQEAgLTY4NywxMSArODg4LDU1IEBACiBzdGF0aWMgdm9pZAogbmd4X2h0dHBfdXBzdHJlYW1fc2VuZF9yZXNwb25zZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9odHRwX3Vwc3RyZWFtX3QgKnUpCiB7Ci0gICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgcmM7Ci0gICAgbmd4X2V2ZW50X3BpcGVfdCAgICAgICAgICAqcDsKLSAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICpjbGNmOworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICAgICAgcmM7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICBpLCBrZXk7CisgICAgbmd4X2xpc3RfcGFydF90ICAgICAgICAgICAgICAgICpwYXJ0OworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqaDsKKyAgICBuZ3hfZXZlbnRfcGlwZV90ICAgICAgICAgICAgICAgKnA7CisgICAgbmd4X2h0dHBfY29yZV9sb2NfY29uZl90ICAgICAgICpjbGNmOworICAgIG5neF9odHRwX3Vwc3RyZWFtX2hlYWRlcl90ICAgICAqaGg7CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fbWFpbl9jb25mX3QgICp1bWNmOwogCi0gICAgcmMgPSB1LT5zZW5kX2hlYWRlcihyKTsKKyAgICB1bWNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9tYWluX2NvbmYociwgbmd4X2h0dHBfdXBzdHJlYW1fbW9kdWxlKTsKKyAgICBoaCA9IChuZ3hfaHR0cF91cHN0cmVhbV9oZWFkZXJfdCAqKSB1bWNmLT5oZWFkZXJzX2luX2hhc2guYnVja2V0czsKKworICAgIHBhcnQgPSAmci0+dXBzdHJlYW0tPmhlYWRlcnNfaW4uaGVhZGVycy5wYXJ0OworICAgIGggPSBwYXJ0LT5lbHRzOworCisgICAgZm9yIChpID0gMDsgLyogdm9pZCAqLzsgaSsrKSB7CisKKyAgICAgICAgaWYgKGkgPj0gcGFydC0+bmVsdHMpIHsKKyAgICAgICAgICAgIGlmIChwYXJ0LT5uZXh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIHBhcnQgPSBwYXJ0LT5uZXh0OworICAgICAgICAgICAgaCA9IHBhcnQtPmVsdHM7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGtleSA9IGhbaV0uaGFzaCAlIHVtY2YtPmhlYWRlcnNfaW5faGFzaC5oYXNoX3NpemU7CisKKyAgICAgICAgaWYgKGhoW2tleV0ubmFtZS5sZW4gPT0gaFtpXS5rZXkubGVuCisgICAgICAgICAgICAmJiBuZ3hfc3RyY2FzZWNtcChoaFtrZXldLm5hbWUuZGF0YSwgaFtpXS5rZXkuZGF0YSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhoW2tleV0uY29weV9oYW5kbGVyKHIsICZoW2ldLCBoaFtrZXldLmNvbmYpICE9IE5HWF9PSykgeworICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2ZpbmFsaXplX3JlcXVlc3QociwgdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5neF9odHRwX3Vwc3RyZWFtX2NvcHlfaGVhZGVyX2xpbmUociwgJmhbaV0sIDApICE9IE5HWF9PSykgeworICAgICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgcmMgPSBuZ3hfaHR0cF9zZW5kX2hlYWRlcihyKTsKIAogICAgIGlmIChyYyA9PSBOR1hfRVJST1IgfHwgcmMgPiBOR1hfT0spIHsKICAgICAgICAgbmd4X2h0dHBfdXBzdHJlYW1fZmluYWxpemVfcmVxdWVzdChyLCB1LCByYyk7CkBAIC04MjAsMjAgKzEwNjUsMjcgQEAKICAgICBwLT5zZW5kX3RpbWVvdXQgPSBjbGNmLT5zZW5kX3RpbWVvdXQ7CiAgICAgcC0+c2VuZF9sb3dhdCA9IGNsY2YtPnNlbmRfbG93YXQ7CiAKLSAgICB1LT5wZWVyLmNvbm5lY3Rpb24tPnJlYWQtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2JvZHk7Ci0gICAgci0+Y29ubmVjdGlvbi0+d3JpdGUtPmV2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2JvZHk7CisgICAgdS0+cGVlci5jb25uZWN0aW9uLT5yZWFkLT5oYW5kbGVyID0gbmd4X2h0dHBfdXBzdHJlYW1fcHJvY2Vzc19ib2R5OworICAgIHItPndyaXRlX2V2ZW50X2hhbmRsZXIgPSBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2Rvd25zdHJlYW07CiAKICAgICBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2JvZHkodS0+cGVlci5jb25uZWN0aW9uLT5yZWFkKTsKIH0KIAogCiBzdGF0aWMgdm9pZAorbmd4X2h0dHBfdXBzdHJlYW1fcHJvY2Vzc19kb3duc3RyZWFtKG5neF9odHRwX3JlcXVlc3RfdCAqcikKK3sKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2JvZHkoci0+Y29ubmVjdGlvbi0+d3JpdGUpOworfQorCisKK3N0YXRpYyB2b2lkCiBuZ3hfaHR0cF91cHN0cmVhbV9wcm9jZXNzX2JvZHkobmd4X2V2ZW50X3QgKmV2KQogeworICAgIG5neF9ldmVudF9waXBlX3QgICAgICpwOwogICAgIG5neF9jb25uZWN0aW9uX3QgICAgICpjOwogICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICpyOwogICAgIG5neF9odHRwX3Vwc3RyZWFtX3QgICp1OwotICAgIG5neF9ldmVudF9waXBlX3QgICAgICpwOwogCiAgICAgYyA9IGV2LT5kYXRhOwogICAgIHIgPSBjLT5kYXRhOwpAQCAtMTA0NiwxMSArMTI5OCw2IEBACiAgICAgICAgIHJjID0gMDsKICAgICB9CiAKLSAgICBpZiAodS0+c2F2ZWRfbG9nX2N0eCkgewotICAgICAgICByLT5jb25uZWN0aW9uLT5sb2ctPmRhdGEgPSB1LT5zYXZlZF9sb2dfY3R4OwotICAgICAgICByLT5jb25uZWN0aW9uLT5sb2ctPmhhbmRsZXIgPSB1LT5zYXZlZF9sb2dfaGFuZGxlcjsKLSAgICB9Ci0KICAgICBpZiAodS0+cGlwZS50ZW1wX2ZpbGUpIHsKICAgICAgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICJodHRwIHVwc3RyZWFtIHRlbXAgZmQ6ICVkIiwKQEAgLTEwNjUsMTUgKzEzMTIsNyBAQAogICAgIH0KICNlbmRpZgogCi0gICAgaWYgKHUtPnBpcGUudGVtcF9maWxlKSB7Ci0gICAgICAgIHItPmZpbGUuZmQgPSB1LT5waXBlLnRlbXBfZmlsZS0+ZmlsZS5mZDsKLQotI2lmIDAKLSAgICB9IGVsc2UgaWYgKHUtPmNhY2hlKSB7Ci0gICAgICAgIHItPmZpbGUuZmQgPSB1LT5jYWNoZS0+Y3R4LmZpbGUuZmQ7Ci0jZW5kaWYKLSAgICB9Ci0KKyAgICByLT5sb2dfaGFuZGxlciA9IHUtPnNhdmVkX2xvZ19oYW5kbGVyOwogICAgIHItPmNvbm5lY3Rpb24tPmxvZy0+YWN0aW9uID0gInNlbmRpbmcgdG8gY2xpZW50IjsKIAogICAgIGlmIChyYyA9PSAwICYmIHItPm1haW4gPT0gTlVMTCkgewpAQCAtMTA4NCw2ICsxMzIzLDI2MCBAQAogfQogCiAKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Vwc3RyZWFtX3Byb2Nlc3NfaGVhZGVyX2xpbmUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfdGFibGVfZWx0X3QgKmgsCisgICAgbmd4X3VpbnRfdCBvZmZzZXQpCit7ICAgCisgICAgbmd4X3RhYmxlX2VsdF90ICAqKnBoOworICAgIAorICAgIHBoID0gKG5neF90YWJsZV9lbHRfdCAqKikgKChjaGFyICopICZyLT51cHN0cmVhbS0+aGVhZGVyc19pbiArIG9mZnNldCk7CisKKyAgICBpZiAoKnBoID09IE5VTEwpIHsKKyAgICAgICAgKnBoID0gaDsKKyAgICB9CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Vwc3RyZWFtX3Byb2Nlc3NfbXVsdGlfaGVhZGVyX2xpbmVzKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfdGFibGVfZWx0X3QgKmgsIG5neF91aW50X3Qgb2Zmc2V0KQoreworICAgIG5neF9hcnJheV90ICAgICAgICpwYTsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICoqcGg7CisKKyAgICBwYSA9IChuZ3hfYXJyYXlfdCAqKSAoKGNoYXIgKikgJnItPnVwc3RyZWFtLT5oZWFkZXJzX2luICsgb2Zmc2V0KTsKKworICAgIGlmIChwYS0+ZWx0cyA9PSBOVUxMKSB7CisgICAgICAgaWYgKG5neF9hcnJheV9pbml0KHBhLCByLT5wb29sLCAyLCBzaXplb2Yobmd4X3RhYmxlX2VsdF90ICopKSAhPSBOR1hfT0spCisgICAgICAgeworICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgICAgIH0KKyAgICB9CisKKyAgICBwaCA9IG5neF9hcnJheV9wdXNoKHBhKTsKKyAgICBpZiAocGggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgICpwaCA9IGg7CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Vwc3RyZWFtX2lnbm9yZV9oZWFkZXJfbGluZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF90YWJsZV9lbHRfdCAqaCwKKyAgICBuZ3hfdWludF90IG9mZnNldCkKK3sKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Vwc3RyZWFtX2NvcHlfaGVhZGVyX2xpbmUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfdGFibGVfZWx0X3QgKmgsCisgICAgbmd4X3VpbnRfdCBvZmZzZXQpCit7CisgICAgbmd4X3RhYmxlX2VsdF90ICAqaG87CisKKyAgICBobyA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpOworICAgIGlmIChobyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgKmhvID0gKmg7CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Vwc3RyZWFtX2NvbmRpdGlvbmFsX2NvcHlfaGVhZGVyX2xpbmUobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgIG5neF90YWJsZV9lbHRfdCAqaCwgbmd4X3VpbnRfdCBvZmZzZXQpCit7CisgICAgbmd4X2ZsYWdfdCAgICAgICAqZjsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICpobzsKKworICAgIGYgPSAobmd4X2ZsYWdfdCAqKSAoKGNoYXIgKikgci0+dXBzdHJlYW0tPmNvbmYgKyBvZmZzZXQpOworCisgICAgaWYgKCpmID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKKyAgICB9CisKKyAgICBobyA9IG5neF9saXN0X3B1c2goJnItPmhlYWRlcnNfb3V0LmhlYWRlcnMpOworICAgIGlmIChobyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgKmhvID0gKmg7CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3Vwc3RyZWFtX2NvcHlfbXVsdGlfaGVhZGVyX2xpbmVzKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfdGFibGVfZWx0X3QgKmgsIG5neF91aW50X3Qgb2Zmc2V0KQoreworICAgIG5neF9hcnJheV90ICAgICAgKnBhOworICAgIG5neF90YWJsZV9lbHRfdCAgKmhvLCAqKnBoOworCisgICAgcGEgPSAobmd4X2FycmF5X3QgKikgKChjaGFyICopICZyLT5oZWFkZXJzX291dCArIG9mZnNldCk7CisKKyAgICBpZiAocGEtPmVsdHMgPT0gTlVMTCkgeworICAgICAgICBpZiAobmd4X2FycmF5X2luaXQocGEsIHItPnBvb2wsIDIsIHNpemVvZihuZ3hfdGFibGVfZWx0X3QgKikpICE9IE5HWF9PSykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBoID0gbmd4X2FycmF5X3B1c2gocGEpOworICAgIGlmIChwaCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgaG8gPSBuZ3hfbGlzdF9wdXNoKCZyLT5oZWFkZXJzX291dC5oZWFkZXJzKTsKKyAgICBpZiAoaG8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgICpobyA9ICpoOworICAgICpwaCA9IGhvOworCisgICAgcmV0dXJuIE5HWF9PSzsKK30KKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF91cHN0cmVhbV9jb3B5X2NvbnRlbnRfdHlwZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF90YWJsZV9lbHRfdCAqaCwKKyAgICBuZ3hfdWludF90IG9mZnNldCkKK3sKKyAgICByLT5oZWFkZXJzX291dC5jb250ZW50X3R5cGUgPSBoLT52YWx1ZTsKKworICAgIHJldHVybiBOR1hfT0s7Cit9CisKKworc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfdXBzdHJlYW1fY29weV9jb250ZW50X2xlbmd0aChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF90YWJsZV9lbHRfdCAqaCwKKyAgICBuZ3hfdWludF90IG9mZnNldCkKK3sKKyAgICBuZ3hfdGFibGVfZWx0X3QgICpobzsKKworICAgIGhvID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19vdXQuaGVhZGVycyk7CisgICAgaWYgKGhvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKyAgICAqaG8gPSAqaDsKKworICAgIHItPmhlYWRlcnNfb3V0LmNvbnRlbnRfbGVuZ3RoID0gaG87CisgICAgci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGhfbiA9IG5neF9hdG9vZihoLT52YWx1ZS5kYXRhLCBoLT52YWx1ZS5sZW4pOworCisgICAgcmV0dXJuIE5HWF9PSzsKK30KKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF91cHN0cmVhbV9yZXdyaXRlX2xvY2F0aW9uKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X3RhYmxlX2VsdF90ICpoLAorICAgIG5neF91aW50X3Qgb2Zmc2V0KQoreworICAgIG5neF9pbnRfdCAgICAgICAgIHJjOworICAgIG5neF90YWJsZV9lbHRfdCAgKmhvOworCisgICAgaG8gPSBuZ3hfbGlzdF9wdXNoKCZyLT5oZWFkZXJzX291dC5oZWFkZXJzKTsKKyAgICBpZiAoaG8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgICpobyA9ICpoOworCisgICAgaWYgKHItPnVwc3RyZWFtLT5yZXdyaXRlX3JlZGlyZWN0KSB7CisgICAgICAgIHJjID0gci0+dXBzdHJlYW0tPnJld3JpdGVfcmVkaXJlY3QociwgaG8sIDApOworCisgICAgICAgIGlmIChyYyA9PSBOR1hfT0spIHsKKyAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uID0gaG87CisKKyAgICAgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInJld3JpdHRlbiBsb2NhdGlvbjogXCIlVlwiIiwgJmhvLT52YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyoKKyAgICAgKiB3ZSBkbyBub3Qgc2V0IHItPmhlYWRlcnNfb3V0LmxvY2F0aW9uIGhlcmUgdG8gYXZvaWQgdGhlIGhhbmRsaW5nCisgICAgICogdGhlIGxvY2FsIHJlZGlyZWN0cyB3aXRob3V0IGEgaG9zdCBuYW1lIGJ5IG5neF9odHRwX2hlYWRlcl9maWx0ZXIoKQorICAgICAqLworCisgICAgcmV0dXJuIE5HWF9PSzsKK30KKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF91cHN0cmVhbV9yZXdyaXRlX3JlZnJlc2gobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfdGFibGVfZWx0X3QgKmgsCisgICAgbmd4X3VpbnRfdCBvZmZzZXQpCit7CisgICAgdV9jaGFyICAgICAgICAgICAqcDsKKyAgICBuZ3hfaW50X3QgICAgICAgICByYzsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICpobzsKKworICAgIGhvID0gbmd4X2xpc3RfcHVzaCgmci0+aGVhZGVyc19vdXQuaGVhZGVycyk7CisgICAgaWYgKGhvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICB9CisKKyAgICAqaG8gPSAqaDsKKworICAgIGlmIChyLT51cHN0cmVhbS0+cmV3cml0ZV9yZWRpcmVjdCkgeworCisgICAgICAgIHAgPSAodV9jaGFyICopIG5neF9zdHJzdHIoaG8tPnZhbHVlLmRhdGEsICJ1cmw9Iik7CisKKyAgICAgICAgaWYgKHApIHsKKyAgICAgICAgICAgIHJjID0gci0+dXBzdHJlYW0tPnJld3JpdGVfcmVkaXJlY3QociwgaG8sIHAgKyA0IC0gaG8tPnZhbHVlLmRhdGEpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gTkdYX09LOworICAgICAgICB9CisKKyNpZiAoTkdYX0RFQlVHKQorICAgICAgICBpZiAocmMgPT0gTkdYX09LKSB7CisgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXdyaXR0ZW4gcmVmcmVzaDogXCIlVlwiIiwgJmhvLT52YWx1ZSk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gTkdYX09LOworfQorCisKKyNpZiAoTkdYX0hUVFBfR1pJUCkKKworc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfdXBzdHJlYW1fY29weV9jb250ZW50X2VuY29kaW5nKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfdGFibGVfZWx0X3QgKmgsIG5neF91aW50X3Qgb2Zmc2V0KQoreworICAgIG5neF90YWJsZV9lbHRfdCAgKmhvOworCisgICAgaG8gPSBuZ3hfbGlzdF9wdXNoKCZyLT5oZWFkZXJzX291dC5oZWFkZXJzKTsKKyAgICBpZiAoaG8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgICpobyA9ICpoOworCisgICAgci0+aGVhZGVyc19vdXQuY29udGVudF9lbmNvZGluZyA9IGhvOworCisgICAgcmV0dXJuIE5HWF9PSzsKK30KKworI2VuZGlmCisKKwogc3RhdGljIHNpemVfdAogbmd4X2h0dHBfdXBzdHJlYW1fbG9nX3N0YXR1c19nZXRsZW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSkKIHsKQEAgLTExMzEsNTEgKzE2MjQsNDUgQEAKIH0KIAogCi11X2NoYXIgKgotbmd4X2h0dHBfdXBzdHJlYW1fbG9nX2Vycm9yKG5neF9sb2dfdCAqbG9nLCB1X2NoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3N0YXRpYyB1X2NoYXIgKgorbmd4X2h0dHBfdXBzdHJlYW1fbG9nX2Vycm9yKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsIHNpemVfdCBsZW4pCiB7CiAgICAgdV9jaGFyICAgICAgICAgICAgICAgICAqcDsKICAgICB1aW50cHRyX3QgICAgICAgICAgICAgICBlc2NhcGU7Ci0gICAgbmd4X2h0dHBfbG9nX2N0eF90ICAgICAqY3R4OwotICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgKnI7CiAgICAgbmd4X2h0dHBfdXBzdHJlYW1fdCAgICAqdTsKICAgICBuZ3hfcGVlcl9jb25uZWN0aW9uX3QgICpwZWVyOwogCi0gICAgY3R4ID0gbG9nLT5kYXRhOwotICAgIHIgPSBjdHgtPnJlcXVlc3Q7CiAgICAgdSA9IHItPnVwc3RyZWFtOwogICAgIHBlZXIgPSAmdS0+cGVlcjsKIAogICAgIHAgPSBuZ3hfc25wcmludGYoYnVmLCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAiIHdoaWxlICVzLCBjbGllbnQ6ICVWLCBzZXJ2ZXI6ICVWLCBVUkw6IFwiJVZcIiwiCisgICAgICAgICAgICAgICAgICAgICAiLCBzZXJ2ZXI6ICVWLCBVUkw6IFwiJVZcIiwiCiAgICAgICAgICAgICAgICAgICAgICAiIHVwc3RyZWFtOiAlViVWJXMlViIsCi0gICAgICAgICAgICAgICAgICAgICBsb2ctPmFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICZyLT5jb25uZWN0aW9uLT5hZGRyX3RleHQsCiAgICAgICAgICAgICAgICAgICAgICAmci0+c2VydmVyX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAmci0+dW5wYXJzZWRfdXJpLAotICAgICAgICAgICAgICAgICAgICAgJnUtPnNjaGVtYTAsCisgICAgICAgICAgICAgICAgICAgICAmdS0+Y29uZi0+c2NoZW1hLAogICAgICAgICAgICAgICAgICAgICAgJnBlZXItPnBlZXJzLT5wZWVyW3BlZXItPmN1cl9wZWVyXS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgcGVlci0+cGVlcnMtPnBlZXJbcGVlci0+Y3VyX3BlZXJdLnVyaV9zZXBhcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAmdS0+dXJpMCk7CisgICAgICAgICAgICAgICAgICAgICAmdS0+Y29uZi0+dXJpKTsKICAgICBsZW4gLT0gcCAtIGJ1ZjsKICAgICBidWYgPSBwOwogCiAgICAgaWYgKHItPnF1b3RlZF91cmkpIHsKLSAgICAgICAgZXNjYXBlID0gMiAqIG5neF9lc2NhcGVfdXJpKE5VTEwsIHItPnVyaS5kYXRhICsgdS0+bG9jYXRpb24wLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT51cmkubGVuIC0gdS0+bG9jYXRpb24wLT5sZW4sCisgICAgICAgIGVzY2FwZSA9IDIgKiBuZ3hfZXNjYXBlX3VyaShOVUxMLCByLT51cmkuZGF0YSArIHUtPmNvbmYtPmxvY2F0aW9uLT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT51cmkubGVuIC0gdS0+Y29uZi0+bG9jYXRpb24tPmxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9FU0NBUEVfVVJJKTsKICAgICB9IGVsc2UgewogICAgICAgICBlc2NhcGUgPSAwOwogICAgIH0KIAogICAgIGlmIChlc2NhcGUpIHsKLSAgICAgICAgaWYgKGxlbiA+PSByLT51cmkubGVuIC0gdS0+bG9jYXRpb24wLT5sZW4gKyBlc2NhcGUpIHsKKyAgICAgICAgaWYgKGxlbiA+PSByLT51cmkubGVuIC0gdS0+Y29uZi0+bG9jYXRpb24tPmxlbiArIGVzY2FwZSkgewogCi0gICAgICAgICAgICBuZ3hfZXNjYXBlX3VyaShidWYsIHItPnVyaS5kYXRhICsgdS0+bG9jYXRpb24wLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByLT51cmkubGVuIC0gdS0+bG9jYXRpb24wLT5sZW4sIE5HWF9FU0NBUEVfVVJJKTsKKyAgICAgICAgICAgIG5neF9lc2NhcGVfdXJpKGJ1Ziwgci0+dXJpLmRhdGEgKyB1LT5jb25mLT5sb2NhdGlvbi0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHUtPmNvbmYtPmxvY2F0aW9uLT5sZW4sIE5HWF9FU0NBUEVfVVJJKTsKIAotICAgICAgICAgICAgYnVmICs9IHItPnVyaS5sZW4gLSB1LT5sb2NhdGlvbjAtPmxlbiArIGVzY2FwZTsKLSAgICAgICAgICAgIGxlbiAtPSByLT51cmkubGVuIC0gdS0+bG9jYXRpb24wLT5sZW4gKyBlc2NhcGU7CisgICAgICAgICAgICBidWYgKz0gci0+dXJpLmxlbiAtIHUtPmNvbmYtPmxvY2F0aW9uLT5sZW4gKyBlc2NhcGU7CisgICAgICAgICAgICBsZW4gLT0gci0+dXJpLmxlbiAtIHUtPmNvbmYtPmxvY2F0aW9uLT5sZW4gKyBlc2NhcGU7CiAKICAgICAgICAgICAgIGlmIChyLT5hcmdzLmxlbikgewogICAgICAgICAgICAgICAgIHAgPSBuZ3hfc25wcmludGYoYnVmLCBsZW4sICI/JVYiLCAmci0+YXJncyk7CkBAIC0xMTg2LDE5ICsxNjczLDE5IEBACiAgICAgICAgICAgICByZXR1cm4gbmd4X2h0dHBfbG9nX2Vycm9yX2luZm8ociwgYnVmLCBsZW4pOwogICAgICAgICB9CiAKLSAgICAgICAgcCA9IG5neF9wYWxsb2Moci0+cG9vbCwgci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uMC0+bGVuICsgZXNjYXBlKTsKKyAgICAgICAgcCA9IG5neF9wYWxsb2Moci0+cG9vbCwgci0+dXJpLmxlbiAtIHUtPmNvbmYtPmxvY2F0aW9uLT5sZW4gKyBlc2NhcGUpOwogICAgICAgICBpZiAocCA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gYnVmOwogICAgICAgICB9CiAKLSAgICAgICAgbmd4X2VzY2FwZV91cmkocCwgci0+dXJpLmRhdGEgKyB1LT5sb2NhdGlvbjAtPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHUtPmxvY2F0aW9uMC0+bGVuLCBOR1hfRVNDQVBFX1VSSSk7CisgICAgICAgIG5neF9lc2NhcGVfdXJpKHAsIHItPnVyaS5kYXRhICsgdS0+Y29uZi0+bG9jYXRpb24tPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHUtPmNvbmYtPmxvY2F0aW9uLT5sZW4sIE5HWF9FU0NBUEVfVVJJKTsKIAotICAgICAgICBwID0gbmd4X2NweW1lbShidWYsIHAsIHItPnVyaS5sZW4gLSB1LT5sb2NhdGlvbjAtPmxlbiArIGVzY2FwZSk7CisgICAgICAgIHAgPSBuZ3hfY3B5bWVtKGJ1ZiwgcCwgci0+dXJpLmxlbiAtIHUtPmNvbmYtPmxvY2F0aW9uLT5sZW4gKyBlc2NhcGUpOwogCiAgICAgfSBlbHNlIHsKLSAgICAgICAgcCA9IG5neF9jcHltZW0oYnVmLCByLT51cmkuZGF0YSArIHUtPmxvY2F0aW9uMC0+bGVuLAotICAgICAgICAgICAgICAgICAgICAgICByLT51cmkubGVuIC0gdS0+bG9jYXRpb24wLT5sZW4pOworICAgICAgICBwID0gbmd4X2NweW1lbShidWYsIHItPnVyaS5kYXRhICsgdS0+Y29uZi0+bG9jYXRpb24tPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgci0+dXJpLmxlbiAtIHUtPmNvbmYtPmxvY2F0aW9uLT5sZW4pOwogICAgIH0KIAogICAgIGxlbiAtPSBwIC0gYnVmOwpAQCAtMTIzMiwzICsxNzE5LDQzIEBACiAKICAgICByZXR1cm4gTkdYX09LOwogfQorCisKK3N0YXRpYyB2b2lkICoKK25neF9odHRwX3Vwc3RyZWFtX2NyZWF0ZV9tYWluX2NvbmYobmd4X2NvbmZfdCAqY2YpCit7CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fbWFpbl9jb25mX3QgICp1bWNmOworCisgICAgdW1jZiA9IG5neF9wY2FsbG9jKGNmLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfdXBzdHJlYW1fbWFpbl9jb25mX3QpKTsKKyAgICBpZiAodW1jZiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiB1bWNmOworfQorCisKK3N0YXRpYyBjaGFyICoKK25neF9odHRwX2NvcmVfaW5pdF9tYWluX2NvbmYobmd4X2NvbmZfdCAqY2YsIHZvaWQgKmNvbmYpCit7CisgICAgbmd4X2h0dHBfdXBzdHJlYW1fbWFpbl9jb25mX3QgICp1bWNmID0gY29uZjsKKworICAgIHVtY2YtPmhlYWRlcnNfaW5faGFzaC5tYXhfc2l6ZSA9IDEwMDsgCisgICAgdW1jZi0+aGVhZGVyc19pbl9oYXNoLmJ1Y2tldF9saW1pdCA9IDE7CisgICAgdW1jZi0+aGVhZGVyc19pbl9oYXNoLmJ1Y2tldF9zaXplID0gc2l6ZW9mKG5neF9odHRwX3Vwc3RyZWFtX2hlYWRlcl90KTsKKyAgICB1bWNmLT5oZWFkZXJzX2luX2hhc2gubmFtZSA9ICJ1cHN0cmVhbV9oZWFkZXJzX2luIjsKKworICAgIGlmIChuZ3hfaGFzaF9pbml0KCZ1bWNmLT5oZWFkZXJzX2luX2hhc2gsIGNmLT5wb29sLAorICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3Vwc3RyZWFtX2hlYWRlcnNfaW4sIDApICE9IE5HWF9PSykKKyAgICB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBuZ3hfbG9nX2RlYnVnMihOR1hfTE9HX0RFQlVHX0hUVFAsIGNmLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgImh0dHAgdXBzdHJlYW0gaGVhZGVyc19pbiBoYXNoIHNpemU6ICV1aSwgIgorICAgICAgICAgICAgICAgICAgICJtYXggYnVja2V0cyBwZXIgZW50cnk6ICV1aSIsCisgICAgICAgICAgICAgICAgICAgdW1jZi0+aGVhZGVyc19pbl9oYXNoLmhhc2hfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICB1bWNmLT5oZWFkZXJzX2luX2hhc2gubWluX2J1Y2tldHMpOworCisgICAgcmV0dXJuIE5HWF9DT05GX09LOworfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uaCBiL3NyYy9odHRwL25neF9odHRwX3Vwc3RyZWFtLmgKaW5kZXggYzFiYzBkOS4uY2YyYWVhYSAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfdXBzdHJlYW0uaAorKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF91cHN0cmVhbS5oCkBAIC0yOSw4OCArMjksMTQxIEBACiAKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIHRpbWVfdCAgICAgICAgICAgICAgICAgICAgICBibF90aW1lOwotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBibF9zdGF0ZTsKKyAgICB0aW1lX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGJsX3RpbWU7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICBibF9zdGF0ZTsKIAotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0gICAgdGltZV90ICAgICAgICAgICAgICAgICAgICAgIHRpbWU7CisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisgICAgdGltZV90ICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lOwogICAgIAotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICpwZWVyOworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICAqcGVlcjsKIH0gbmd4X2h0dHBfdXBzdHJlYW1fc3RhdGVfdDsKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X21zZWNfdCAgICAgICAgICAgICAgICAgIGNvbm5lY3RfdGltZW91dDsKLSAgICBuZ3hfbXNlY190ICAgICAgICAgICAgICAgICAgc2VuZF90aW1lb3V0OwotICAgIG5neF9tc2VjX3QgICAgICAgICAgICAgICAgICByZWFkX3RpbWVvdXQ7CisgICAgbmd4X2hhc2hfdCAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzX2luX2hhc2g7Cit9IG5neF9odHRwX3Vwc3RyZWFtX21haW5fY29uZl90OwogCi0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgIHNlbmRfbG93YXQ7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9idWZmZXJfc2l6ZTsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgYnVzeV9idWZmZXJzX3NpemU7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgIG1heF90ZW1wX2ZpbGVfc2l6ZTsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgdGVtcF9maWxlX3dyaXRlX3NpemU7CiAKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgbmV4dF91cHN0cmVhbTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfbXNlY190ICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfdGltZW91dDsKKyAgICBuZ3hfbXNlY190ICAgICAgICAgICAgICAgICAgICAgIHNlbmRfdGltZW91dDsKKyAgICBuZ3hfbXNlY190ICAgICAgICAgICAgICAgICAgICAgIHJlYWRfdGltZW91dDsKIAotICAgIG5neF9idWZzX3QgICAgICAgICAgICAgICAgICBidWZzOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9sb3dhdDsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9idWZmZXJfc2l6ZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c3lfYnVmZmVyc19zaXplOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RlbXBfZmlsZV9zaXplOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9maWxlX3dyaXRlX3NpemU7CiAKLSAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICAgcmVkaXJlY3RfZXJyb3JzOwotICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgICBwYXNzX3VucGFyc2VkX3VyaTsKLSAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICAgeF9wb3dlcmVkX2J5OwotICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgICBjeWNsaWNfdGVtcF9maWxlOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgbmV4dF91cHN0cmVhbTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDsKIAotICAgIG5neF9wYXRoX3QgICAgICAgICAgICAgICAgICp0ZW1wX3BhdGg7CisgICAgbmd4X2J1ZnNfdCAgICAgICAgICAgICAgICAgICAgICBidWZzOworCisgICAgbmd4X2ZsYWdfdCAgICAgICAgICAgICAgICAgICAgICBwYXNzX3JlcXVlc3RfaGVhZGVyczsKKyAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICAgICAgIHBhc3NfcmVxdWVzdF9ib2R5OworCisgICAgbmd4X2ZsYWdfdCAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdF9lcnJvcnM7CisgICAgbmd4X2ZsYWdfdCAgICAgICAgICAgICAgICAgICAgICBwYXNzX3VucGFyc2VkX3VyaTsKKyAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICAgICAgIGN5Y2xpY190ZW1wX2ZpbGU7CisKKyAgICBuZ3hfZmxhZ190ICAgICAgICAgICAgICAgICAgICAgIHBhc3NfeF9wb3dlcmVkX2J5OworICAgIG5neF9mbGFnX3QgICAgICAgICAgICAgICAgICAgICAgcGFzc19zZXJ2ZXI7CisgICAgbmd4X2ZsYWdfdCAgICAgICAgICAgICAgICAgICAgICBwYXNzX2RhdGU7CisgICAgbmd4X2ZsYWdfdCAgICAgICAgICAgICAgICAgICAgICBwYXNzX3hfYWNjZWxfZXhwaXJlczsKKworICAgIG5neF9wYXRoX3QgICAgICAgICAgICAgICAgICAgICAqdGVtcF9wYXRoOworCisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICB1cmk7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgICAgICpsb2NhdGlvbjsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgIHVybDsgIC8qIHVzZWQgaW4gcHJveHlfcmV3cml0ZV9sb2NhdGlvbiAqLwogfSBuZ3hfaHR0cF91cHN0cmVhbV9jb25mX3Q7CiAKIAotdHlwZWRlZiBzdHJ1Y3Qgbmd4X2h0dHBfdXBzdHJlYW1fcyAgbmd4X2h0dHBfdXBzdHJlYW1fdDsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgICAgICAgIG5hbWU7CisgICAgbmd4X2h0dHBfaGVhZGVyX2hhbmRsZXJfcHQgICAgICBoYW5kbGVyOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OworICAgIG5neF9odHRwX2hlYWRlcl9oYW5kbGVyX3B0ICAgICAgY29weV9oYW5kbGVyOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgY29uZjsKK30gbmd4X2h0dHBfdXBzdHJlYW1faGVhZGVyX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG5neF9saXN0X3QgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczsKKworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqc3RhdHVzOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqZGF0ZTsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgKnNlcnZlcjsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgKmNvbm5lY3Rpb247CisKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgKmV4cGlyZXM7CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICpldGFnOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqeF9hY2NlbF9leHBpcmVzOworCisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICpjb250ZW50X3R5cGU7CisgICAgbmd4X3RhYmxlX2VsdF90ICAgICAgICAgICAgICAgICpjb250ZW50X2xlbmd0aDsKKworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqbGFzdF9tb2RpZmllZDsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAgICAgICAgKmxvY2F0aW9uOworICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqYWNjZXB0X3JhbmdlczsKKworI2lmIChOR1hfSFRUUF9HWklQKQorICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICAgICAqY29udGVudF9lbmNvZGluZzsKKyNlbmRpZgorCisgICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgICAgICBjYWNoZV9jb250cm9sOworfSBuZ3hfaHR0cF91cHN0cmVhbV9oZWFkZXJzX2luX3Q7CisKIAogc3RydWN0IG5neF9odHRwX3Vwc3RyZWFtX3MgewotICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICpyZXF1ZXN0OworICAgIG5neF9odHRwX3JlcXVlc3RfdCAgICAgICAgICAgICAqcmVxdWVzdDsKIAotICAgIG5neF9wZWVyX2Nvbm5lY3Rpb25fdCAgICAgICBwZWVyOworICAgIG5neF9wZWVyX2Nvbm5lY3Rpb25fdCAgICAgICAgICAgcGVlcjsKIAotICAgIG5neF9ldmVudF9waXBlX3QgICAgICAgICAgICBwaXBlOworICAgIG5neF9ldmVudF9waXBlX3QgICAgICAgICAgICAgICAgcGlwZTsKIAotICAgIG5neF9vdXRwdXRfY2hhaW5fY3R4X3QgICAgICBvdXRwdXQ7Ci0gICAgbmd4X2NoYWluX3dyaXRlcl9jdHhfdCAgICAgIHdyaXRlcjsKKyAgICBuZ3hfY2hhaW5fdCAgICAgICAgICAgICAgICAgICAgKnJlcXVlc3RfYnVmczsKIAotICAgIG5neF9odHRwX3Vwc3RyZWFtX2NvbmZfdCAgICpjb25mOworICAgIG5neF9vdXRwdXRfY2hhaW5fY3R4X3QgICAgICAgICAgb3V0cHV0OworICAgIG5neF9jaGFpbl93cml0ZXJfY3R4X3QgICAgICAgICAgd3JpdGVyOwogCi0gICAgbmd4X2J1Zl90ICAgICAgICAgICAgICAgICAgIGhlYWRlcl9pbjsKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV9jb25mX3QgICAgICAgKmNvbmY7CiAKLSAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICgqY3JlYXRlX3JlcXVlc3QpKG5neF9odHRwX3JlcXVlc3RfdCAqcik7Ci0gICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAoKnJlaW5pdF9yZXF1ZXN0KShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOwotICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgKCpwcm9jZXNzX2hlYWRlcikobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKLSAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICgqc2VuZF9oZWFkZXIpKG5neF9odHRwX3JlcXVlc3RfdCAqcik7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAoKmFib3J0X3JlcXVlc3QpKG5neF9odHRwX3JlcXVlc3RfdCAqcik7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAoKmZpbmFsaXplX3JlcXVlc3QpKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2ludF90IHJjKTsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgbWV0aG9kOworICAgIG5neF9odHRwX3Vwc3RyZWFtX2hlYWRlcnNfaW5fdCAgaGVhZGVyc19pbjsKIAotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICBzY2hlbWEwOwotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICB1cmkwOwotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICpsb2NhdGlvbjA7CisgICAgbmd4X2J1Zl90ICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfaW47CiAKLSAgICBuZ3hfaHR0cF9sb2dfY3R4X3QgICAgICAgICAqbG9nX2N0eDsKLSAgICBuZ3hfbG9nX2hhbmRsZXJfcHQgICAgICAgICAgbG9nX2hhbmRsZXI7Ci0gICAgbmd4X2h0dHBfbG9nX2N0eF90ICAgICAgICAgKnNhdmVkX2xvZ19jdHg7Ci0gICAgbmd4X2xvZ19oYW5kbGVyX3B0ICAgICAgICAgIHNhdmVkX2xvZ19oYW5kbGVyOworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICAgICgqY3JlYXRlX3JlcXVlc3QpKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgICAgICAgKCpyZWluaXRfcmVxdWVzdCkobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKKyAgICBuZ3hfaW50X3QgICAgICAgICAgICAgICAgICAgICAoKnByb2Nlc3NfaGVhZGVyKShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICgqYWJvcnRfcmVxdWVzdCkobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZpbmFsaXplX3JlcXVlc3QpKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaW50X3QgcmMpOworICAgIG5neF9pbnRfdCAgICAgICAgICAgICAgICAgICAgICgqcmV3cml0ZV9yZWRpcmVjdCkobmd4X2h0dHBfcmVxdWVzdF90ICpyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF90YWJsZV9lbHRfdCAqaCwgc2l6ZV90IHByZWZpeCk7CiAKLSAgICBuZ3hfaHR0cF91cHN0cmVhbV9zdGF0ZV90ICAqc3RhdGU7Ci0gICAgbmd4X2FycmF5X3QgICAgICAgICAgICAgICAgIHN0YXRlczsgICAgLyogb2Ygbmd4X2h0dHBfdXBzdHJlYW1fc3RhdGVfdCAqLworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOwogCi0gICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgIGNhY2hhYmxlOjE7CisgICAgbmd4X2h0dHBfbG9nX2hhbmRsZXJfcHQgICAgICAgICBzYXZlZF9sb2dfaGFuZGxlcjsKIAotICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3NlbnQ6MTsKLSAgICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgICAgaGVhZGVyX3NlbnQ6MTsKKyAgICBuZ3hfaHR0cF91cHN0cmVhbV9zdGF0ZV90ICAgICAgKnN0YXRlOworICAgIG5neF9hcnJheV90ICAgICAgICAgICAgICAgICAgICAgc3RhdGVzOyAgLyogb2Ygbmd4X2h0dHBfdXBzdHJlYW1fc3RhdGVfdCAqLworCisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICBjYWNoYWJsZToxOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgYWNjZWw6MTsKKworICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9zZW50OjE7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfc2VudDoxOwogfTsKIAogCiB2b2lkIG5neF9odHRwX3Vwc3RyZWFtX2luaXQobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKLXVfY2hhciAqbmd4X2h0dHBfdXBzdHJlYW1fbG9nX2Vycm9yKG5neF9sb2dfdCAqbG9nLCB1X2NoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CiAKIAorZXh0ZXJuIG5neF9tb2R1bGVfdCAgbmd4X2h0dHBfdXBzdHJlYW1fbW9kdWxlOworCiBleHRlcm4gY2hhciAqbmd4X2h0dHBfdXBzdHJlYW1faGVhZGVyX2Vycm9yc1tdOwogCiAKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3ZhcmlhYmxlcy5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfdmFyaWFibGVzLmMKaW5kZXggMTU0ZWUxMy4uNDg4ZWZjYyAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfdmFyaWFibGVzLmMKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfdmFyaWFibGVzLmMKQEAgLTEwLDY2ICsxMCwxNTcgQEAKICNpbmNsdWRlIDxuZ3hfaHR0cC5oPgogCiAKLSNkZWZpbmUgTkdYX0hUVFBfVkFSU19IQVNIX1BSSU1FICAyOQotCi0jZGVmaW5lIG5neF9odHRwX3ZhcnNfaGFzaF9rZXkoa2V5LCB2bikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBuZ3hfdWludF90ICBuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGZvciAoa2V5ID0gMCwgbiA9IDA7IG4gPCAodm4pLT5sZW47IG4rKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGtleSArPSAodm4pLT5kYXRhW25dOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGtleSAlPSBOR1hfSFRUUF9WQVJTX0hBU0hfUFJJTUU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0KLQorc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgorICAgIG5neF9odHRwX3ZhcmlhYmxlX3JlcXVlc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSk7CiBzdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCiAgICAgbmd4X2h0dHBfdmFyaWFibGVfaGVhZGVyKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpOwogc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgogICAgIG5neF9odHRwX3ZhcmlhYmxlX3Vua25vd25faGVhZGVyKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpOwogc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgorICAgIG5neF9odHRwX3ZhcmlhYmxlX2hvc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSk7CitzdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCiAgICAgbmd4X2h0dHBfdmFyaWFibGVfcmVtb3RlX2FkZHIobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSk7CiBzdGF0aWMgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAqCi0gICAgbmd4X2h0dHBfdmFyaWFibGVfdXJpKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpOworICAgIG5neF9odHRwX3ZhcmlhYmxlX3JlbW90ZV9wb3J0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpOwogc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgotICAgIG5neF9odHRwX3ZhcmlhYmxlX3F1ZXJ5X3N0cmluZyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKTsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV9zZXJ2ZXJfYWRkcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKTsKK3N0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV9zZXJ2ZXJfcG9ydChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKTsKK3N0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV9kb2N1bWVudF9yb290KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpOworc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgorICAgIG5neF9odHRwX3ZhcmlhYmxlX3JlcXVlc3RfZmlsZW5hbWUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSk7CiAKIAotc3RhdGljIG5neF9hcnJheV90ICAqbmd4X2h0dHBfY29yZV92YXJpYWJsZXNfaGFzaDsKKy8qCisgKiBUT0RPOgorICogICAgIEFwYWNoZSBDR0k6IEFVVEhfVFlQRSwgUEFUSF9JTkZPIChudWxsKSwgUEFUSF9UUkFOU0xBVEVECisgKiAgICAgICAgICAgICAgICAgUkVNT1RFX0hPU1QgKG51bGwpLCBSRU1PVEVfSURFTlQgKG51bGwpLAorICogICAgICAgICAgICAgICAgIFNFUlZFUl9TT0ZUV0FSRQorICoKKyAqICAgICBBcGFjaGUgU1NJOiBEQVRFX0dNVCwgRE9DVU1FTlRfTkFNRSwgTEFTVF9NT0RJRklFRCwKKyAqICAgICAgICAgICAgICAgICBVU0VSX05BTUUgKGZpbGUgb3duZXIpCisgKi8KIAorc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3QgIG5neF9odHRwX2NvcmVfdmFyaWFibGVzW10gPSB7CiAKLXN0YXRpYyBuZ3hfaHR0cF9jb3JlX3ZhcmlhYmxlX3QgIG5neF9odHRwX2NvcmVfdmFyaWFibGVzW10gPSB7CisgICAgeyBuZ3hfc3RyaW5nKCJodHRwX2hvc3QiKSwgbmd4X2h0dHBfdmFyaWFibGVfaGVhZGVyLAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcmVxdWVzdF90LCBoZWFkZXJzX2luLmhvc3QpLCAwIH0sCiAKLSAgICB7IG5neF9zdHJpbmcoIkhUVFBfSE9TVCIpLCBuZ3hfaHR0cF92YXJpYWJsZV9oZWFkZXIsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIGhvc3QpIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJodHRwX3VzZXJfYWdlbnQiKSwgbmd4X2h0dHBfdmFyaWFibGVfaGVhZGVyLAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcmVxdWVzdF90LCBoZWFkZXJzX2luLnVzZXJfYWdlbnQpLCAwIH0sCiAKLSAgICB7IG5neF9zdHJpbmcoIkhUVFBfVVNFUl9BR0VOVCIpLCBuZ3hfaHR0cF92YXJpYWJsZV9oZWFkZXIsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIHVzZXJfYWdlbnQpIH0sCi0KLSAgICB7IG5neF9zdHJpbmcoIkhUVFBfUkVGRVJFUiIpLCBuZ3hfaHR0cF92YXJpYWJsZV9oZWFkZXIsCi0gICAgICBvZmZzZXRvZihuZ3hfaHR0cF9oZWFkZXJzX2luX3QsIHJlZmVyZXIpIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJodHRwX3JlZmVyZXIiKSwgbmd4X2h0dHBfdmFyaWFibGVfaGVhZGVyLAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcmVxdWVzdF90LCBoZWFkZXJzX2luLnJlZmVyZXIpLCAwIH0sCiAKICNpZiAoTkdYX0hUVFBfR1pJUCkKLSAgICB7IG5neF9zdHJpbmcoIkhUVFBfVklBIiksIG5neF9odHRwX3ZhcmlhYmxlX2hlYWRlciwKLSAgICAgIG9mZnNldG9mKG5neF9odHRwX2hlYWRlcnNfaW5fdCwgdmlhKSB9LAorICAgIHsgbmd4X3N0cmluZygiaHR0cF92aWEiKSwgbmd4X2h0dHBfdmFyaWFibGVfaGVhZGVyLAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcmVxdWVzdF90LCBoZWFkZXJzX2luLnZpYSksIDAgfSwKICNlbmRpZgogCiAjaWYgKE5HWF9IVFRQX1BST1hZKQotICAgIHsgbmd4X3N0cmluZygiSFRUUF9YX0ZPUldBUkRFRF9GT1IiKSwgbmd4X2h0dHBfdmFyaWFibGVfaGVhZGVyLAotICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfaGVhZGVyc19pbl90LCB4X2ZvcndhcmRlZF9mb3IpIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJodHRwX3hfZm9yd2FyZGVkX2ZvciIpLCBuZ3hfaHR0cF92YXJpYWJsZV9oZWFkZXIsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9yZXF1ZXN0X3QsIGhlYWRlcnNfaW4ueF9mb3J3YXJkZWRfZm9yKSwgMCB9LAogI2VuZGlmCiAKLSAgICB7IG5neF9zdHJpbmcoIlJFTU9URV9BRERSIiksIG5neF9odHRwX3ZhcmlhYmxlX3JlbW90ZV9hZGRyLCAwIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJjb250ZW50X2xlbmd0aCIpLCBuZ3hfaHR0cF92YXJpYWJsZV9oZWFkZXIsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9yZXF1ZXN0X3QsIGhlYWRlcnNfaW4uY29udGVudF9sZW5ndGgpLCAwIH0sCiAKLSAgICB7IG5neF9zdHJpbmcoIkRPQ1VNRU5UX1VSSSIpLCBuZ3hfaHR0cF92YXJpYWJsZV91cmksIDAgfSwKKyAgICB7IG5neF9zdHJpbmcoImNvbnRlbnRfdHlwZSIpLCBuZ3hfaHR0cF92YXJpYWJsZV9oZWFkZXIsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9yZXF1ZXN0X3QsIGhlYWRlcnNfaW4uY29udGVudF90eXBlKSwgMCB9LAogCi0gICAgeyBuZ3hfc3RyaW5nKCJRVUVSWV9TVFJJTkciKSwgbmd4X2h0dHBfdmFyaWFibGVfcXVlcnlfc3RyaW5nLCAwIH0sCisgICAgeyBuZ3hfc3RyaW5nKCJob3N0IiksIG5neF9odHRwX3ZhcmlhYmxlX2hvc3QsIDAsIDAgfSwKIAotICAgIHsgbmd4X251bGxfc3RyaW5nLCBOVUxMLCAwIH0KKyAgICB7IG5neF9zdHJpbmcoInJlbW90ZV9hZGRyIiksIG5neF9odHRwX3ZhcmlhYmxlX3JlbW90ZV9hZGRyLCAwLCAwIH0sCisKKyAgICB7IG5neF9zdHJpbmcoInJlbW90ZV9wb3J0IiksIG5neF9odHRwX3ZhcmlhYmxlX3JlbW90ZV9wb3J0LCAwLCAwIH0sCisKKyAgICB7IG5neF9zdHJpbmcoInNlcnZlcl9hZGRyIiksIG5neF9odHRwX3ZhcmlhYmxlX3NlcnZlcl9hZGRyLCAwLCAwIH0sCisKKyAgICB7IG5neF9zdHJpbmcoInNlcnZlcl9wb3J0IiksIG5neF9odHRwX3ZhcmlhYmxlX3NlcnZlcl9wb3J0LCAwLCAwIH0sCisKKyAgICB7IG5neF9zdHJpbmcoInNlcnZlcl9wcm90b2NvbCIpLCBuZ3hfaHR0cF92YXJpYWJsZV9yZXF1ZXN0LAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcmVxdWVzdF90LCBodHRwX3Byb3RvY29sKSwgMCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJyZXF1ZXN0X3VyaSIpLCBuZ3hfaHR0cF92YXJpYWJsZV9yZXF1ZXN0LAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcmVxdWVzdF90LCB1bnBhcnNlZF91cmkpLCAwIH0sCisKKyAgICB7IG5neF9zdHJpbmcoImRvY3VtZW50X3VyaSIpLCBuZ3hfaHR0cF92YXJpYWJsZV9yZXF1ZXN0LAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcmVxdWVzdF90LCB1cmkpLCAwIH0sCisKKyAgICB7IG5neF9zdHJpbmcoImRvY3VtZW50X3Jvb3QiKSwgbmd4X2h0dHBfdmFyaWFibGVfZG9jdW1lbnRfcm9vdCwgMCwgMCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJxdWVyeV9zdHJpbmciKSwgbmd4X2h0dHBfdmFyaWFibGVfcmVxdWVzdCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX3JlcXVlc3RfdCwgYXJncyksCisgICAgICBOR1hfSFRUUF9WQVJfTk9DQUNIQUJMRSB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJyZXF1ZXN0X2ZpbGVuYW1lIiksIG5neF9odHRwX3ZhcmlhYmxlX3JlcXVlc3RfZmlsZW5hbWUsIDAsCisgICAgICBOR1hfSFRUUF9WQVJfTk9DQUNIQUJMRSB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJzZXJ2ZXJfbmFtZSIpLCBuZ3hfaHR0cF92YXJpYWJsZV9yZXF1ZXN0LAorICAgICAgb2Zmc2V0b2Yobmd4X2h0dHBfcmVxdWVzdF90LCBzZXJ2ZXJfbmFtZSksIDAgfSwKKworICAgIHsgbmd4X3N0cmluZygicmVxdWVzdF9tZXRob2QiKSwgbmd4X2h0dHBfdmFyaWFibGVfcmVxdWVzdCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX3JlcXVlc3RfdCwgbWV0aG9kX25hbWUpLCAwIH0sCisKKyAgICB7IG5neF9zdHJpbmcoInJlbW90ZV91c2VyIiksIG5neF9odHRwX3ZhcmlhYmxlX3JlcXVlc3QsCisgICAgICBvZmZzZXRvZihuZ3hfaHR0cF9yZXF1ZXN0X3QsIGhlYWRlcnNfaW4udXNlciksIDAgfSwKKworICAgIHsgbmd4X251bGxfc3RyaW5nLCBOVUxMLCAwLCAwIH0KIH07CiAKIAogbmd4X2h0dHBfdmFyaWFibGVfdCAqCi1uZ3hfaHR0cF9hZGRfdmFyaWFibGUobmd4X2NvbmZfdCAqY2YsIG5neF9zdHJfdCAqbmFtZSwgbmd4X3VpbnRfdCBzZXQpCituZ3hfaHR0cF9hZGRfdmFyaWFibGUobmd4X2NvbmZfdCAqY2YsIG5neF9zdHJfdCAqbmFtZSwgbmd4X3VpbnRfdCBmbGFncykKK3sKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgaTsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAgICAgICAqdjsKKyAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAqY21jZjsKKworICAgIGNtY2YgPSBuZ3hfaHR0cF9jb25mX2dldF9tb2R1bGVfbWFpbl9jb25mKGNmLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CisKKyAgICB2ID0gY21jZi0+YWxsX3ZhcmlhYmxlcy5lbHRzOworICAgIGZvciAoaSA9IDA7IGkgPCBjbWNmLT5hbGxfdmFyaWFibGVzLm5lbHRzOyBpKyspIHsKKyAgICAgICAgaWYgKG5hbWUtPmxlbiAhPSB2W2ldLm5hbWUubGVuCisgICAgICAgICAgICB8fCBuZ3hfc3RybmNhc2VjbXAobmFtZS0+ZGF0YSwgdltpXS5uYW1lLmRhdGEsIG5hbWUtPmxlbikgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoISh2W2ldLmZsYWdzICYgTkdYX0hUVFBfVkFSX0NIQU5HQUJMRSkpIHsKKyAgICAgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGR1cGxpY2F0ZSBcIiVWXCIgdmFyaWFibGUiLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICZ2W2ldOworICAgIH0KKworICAgIHYgPSBuZ3hfYXJyYXlfcHVzaCgmY21jZi0+YWxsX3ZhcmlhYmxlcyk7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB2LT5uYW1lLmxlbiA9IG5hbWUtPmxlbjsKKyAgICB2LT5uYW1lLmRhdGEgPSBuZ3hfcGFsbG9jKGNmLT5wb29sLCBuYW1lLT5sZW4pOworICAgIGlmICh2LT5uYW1lLmRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmFtZS0+bGVuOyBpKyspIHsKKyAgICAgICAgdi0+bmFtZS5kYXRhW2ldID0gbmd4X3RvbG93ZXIobmFtZS0+ZGF0YVtpXSk7CisgICAgfQorCisgICAgdi0+aGFuZGxlciA9IE5VTEw7CisgICAgdi0+ZGF0YSA9IDA7CisgICAgdi0+ZmxhZ3MgPSBmbGFnczsKKworICAgIHJldHVybiB2OworfQorCisKK25neF9pbnRfdAorbmd4X2h0dHBfZ2V0X3ZhcmlhYmxlX2luZGV4KG5neF9jb25mX3QgKmNmLCBuZ3hfc3RyX3QgKm5hbWUpCiB7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIGk7CiAgICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgICAgICAgKnY7CkBAIC04Myw3ICsxNzQsNyBAQAogICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJmNtY2YtPnZhcmlhYmxlcywgY2YtPnBvb2wsIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdCkpID09IE5HWF9FUlJPUikKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAKICAgICB9IGVsc2UgewpAQCAtOTQsMzYgKzE4NSwzMCBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoc2V0ICYmIHZbaV0uaGFuZGxlcikgewotICAgICAgICAgICAgICAgIG5neF9jb25mX2xvZ19lcnJvcihOR1hfTE9HX0VNRVJHLCBjZiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBkdXBsaWNhdGUgXCIlVlwiIHZhcmlhYmxlIiwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiAmdltpXTsKKyAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgdiA9IG5neF9hcnJheV9wdXNoKCZjbWNmLT52YXJpYWJsZXMpOwogICAgIGlmICh2ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCiAgICAgdi0+bmFtZS5sZW4gPSBuYW1lLT5sZW47CiAgICAgdi0+bmFtZS5kYXRhID0gbmd4X3BhbGxvYyhjZi0+cG9vbCwgbmFtZS0+bGVuKTsKICAgICBpZiAodi0+bmFtZS5kYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8IG5hbWUtPmxlbjsgaSsrKSB7Ci0gICAgICAgIHYtPm5hbWUuZGF0YVtpXSA9IG5neF90b3VwcGVyKG5hbWUtPmRhdGFbaV0pOworICAgICAgICB2LT5uYW1lLmRhdGFbaV0gPSBuZ3hfdG9sb3dlcihuYW1lLT5kYXRhW2ldKTsKICAgICB9CiAKLSAgICB2LT5pbmRleCA9IGNtY2YtPnZhcmlhYmxlcy5uZWx0cyAtIDE7CiAgICAgdi0+aGFuZGxlciA9IE5VTEw7CiAgICAgdi0+ZGF0YSA9IDA7CisgICAgdi0+ZmxhZ3MgPSAwOwogCi0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNtY2YtPnZhcmlhYmxlcy5uZWx0cyAtIDE7CiB9CiAKIApAQCAtMTU4LDcgKzI0Myw5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByLT52YXJpYWJsZXNbaW5kZXhdID0gdnY7CisgICAgaWYgKCEodltpbmRleF0uZmxhZ3MgJiBOR1hfSFRUUF9WQVJfTk9DQUNIQUJMRSkpIHsKKyAgICAgICAgci0+dmFyaWFibGVzW2luZGV4XSA9IHZ2OworICAgIH0KIAogICAgIHJldHVybiB2djsKIH0KQEAgLTE2OSw0MyArMjU2LDU2IEBACiB7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgIGksIGtleTsKICAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAgICAgICAqdjsKLSAgICBuZ3hfaHR0cF9jb3JlX3ZhcmlhYmxlX3QgICAqY3Y7CiAgICAgbmd4X2h0dHBfY29yZV9tYWluX2NvbmZfdCAgKmNtY2Y7CiAKICAgICBjbWNmID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9tYWluX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwogCi0gICAgdiA9IGNtY2YtPnZhcmlhYmxlcy5lbHRzOwotICAgIGZvciAoaSA9IDA7IGkgPCBjbWNmLT52YXJpYWJsZXMubmVsdHM7IGkrKykgewotICAgICAgICBpZiAodltpXS5uYW1lLmxlbiAhPSBuYW1lLT5sZW4pIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5neF9zdHJuY21wKHZbaV0ubmFtZS5kYXRhLCBuYW1lLT5kYXRhLCBuYW1lLT5sZW4pID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBuZ3hfaHR0cF9nZXRfaW5kZXhlZF92YXJpYWJsZShyLCB2W2ldLmluZGV4KTsKLSAgICAgICAgfQorICAgIGtleSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG5hbWUtPmxlbjsgaSsrKSB7CisgICAgICAgIGtleSArPSBuYW1lLT5kYXRhW2ldOwogICAgIH0KIAotICAgIG5neF9odHRwX3ZhcnNfaGFzaF9rZXkoa2V5LCBuYW1lKTsKKyAgICBrZXkgJT0gY21jZi0+dmFyaWFibGVzX2hhc2guaGFzaF9zaXplOworICAgIHYgPSAobmd4X2h0dHBfdmFyaWFibGVfdCAqKSBjbWNmLT52YXJpYWJsZXNfaGFzaC5idWNrZXRzOwogCi0gICAgY3YgPSBuZ3hfaHR0cF9jb3JlX3ZhcmlhYmxlc19oYXNoW2tleV0uZWx0czsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmd4X2h0dHBfY29yZV92YXJpYWJsZXNfaGFzaFtrZXldLm5lbHRzOyBpKyspIHsKLSAgICAgICAgaWYgKGN2W2ldLm5hbWUubGVuICE9IG5hbWUtPmxlbikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmd4X3N0cm5jbXAoY3ZbaV0ubmFtZS5kYXRhLCBuYW1lLT5kYXRhLCBuYW1lLT5sZW4pID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBjdltpXS5oYW5kbGVyKHIsIGN2W2ldLmRhdGEpOwotICAgICAgICB9CisgICAgaWYgKHZba2V5XS5uYW1lLmxlbiA9PSBuYW1lLT5sZW4KKyAgICAgICAgJiYgbmd4X3N0cm5jbXAodltrZXldLm5hbWUuZGF0YSwgbmFtZS0+ZGF0YSwgbmFtZS0+bGVuKSA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZba2V5XS5oYW5kbGVyKHIsIHZba2V5XS5kYXRhKTsKICAgICB9CiAKLSAgICBpZiAobmd4X3N0cm5jbXAobmFtZS0+ZGF0YSwgIkhUVFBfIiwgNSkgPT0gMCkgeworICAgIGlmIChuZ3hfc3RybmNtcChuYW1lLT5kYXRhLCAiaHR0cF8iLCA1KSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBuZ3hfaHR0cF92YXJpYWJsZV91bmtub3duX2hlYWRlcihyLCAodWludHB0cl90KSBuYW1lKTsKICAgICB9CiAKICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAidW5rbm93biBcIiVWXCIgdmFyaWFibGUiLCBuYW1lKTsKIAotICAgIHJldHVybiBOR1hfSFRUUF9WQVJJQUJMRV9OT1RfRk9VTkQ7CisgICAgcmV0dXJuIE5HWF9IVFRQX1ZBUl9OT1RfRk9VTkQ7Cit9CisKKworc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgorbmd4X2h0dHBfdmFyaWFibGVfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKQoreworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICpzOworICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICp2djsKKworICAgIHMgPSAobmd4X3N0cl90ICopICgoY2hhciAqKSByICsgZGF0YSk7CisKKyAgICBpZiAocy0+ZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOR1hfSFRUUF9WQVJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHZ2ID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCkpOworICAgIGlmICh2diA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHZ2LT52YWx1ZSA9IDA7CisgICAgdnYtPnRleHQgPSAqczsKKworICAgIHJldHVybiB2djsKIH0KIAogCkBAIC0yMTUsMTAgKzMxNSwxMCBAQAogICAgIG5neF90YWJsZV9lbHRfdCAgICAgICAgICAgICpoOwogICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICp2djsKIAotICAgIGggPSAqKG5neF90YWJsZV9lbHRfdCAqKikgKChjaGFyICopICZyLT5oZWFkZXJzX2luICsgZGF0YSk7CisgICAgaCA9ICoobmd4X3RhYmxlX2VsdF90ICoqKSAoKGNoYXIgKikgciArIGRhdGEpOwogCiAgICAgaWYgKGggPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTkdYX0hUVFBfVkFSSUFCTEVfTk9UX0ZPVU5EOworICAgICAgICByZXR1cm4gTkdYX0hUVFBfVkFSX05PVF9GT1VORDsKICAgICB9CiAKICAgICB2diA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKQEAgLTI1OSwxMiArMzU5LDExIEBACiAgICAgICAgICAgICBpID0gMDsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAobiA9IDA7IG4gKyA1IDwgdmFyLT5sZW4gJiYgbiA8IGhlYWRlcltpXS5rZXkubGVuOyBuKyspCi0gICAgICAgIHsKKyAgICAgICAgZm9yIChuID0gMDsgbiArIDUgPCB2YXItPmxlbiAmJiBuIDwgaGVhZGVyW2ldLmtleS5sZW47IG4rKykgewogICAgICAgICAgICAgY2ggPSBoZWFkZXJbaV0ua2V5LmRhdGFbbl07CiAKLSAgICAgICAgICAgIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSB7Ci0gICAgICAgICAgICAgICAgY2ggJj0gfjB4MjA7CisgICAgICAgICAgICBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJykgeworICAgICAgICAgICAgICAgIGNoIHw9IDB4MjA7CiAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy0nKSB7CiAgICAgICAgICAgICAgICAgY2ggPSAnXyc7CkBAIC0yODcsNyArMzg2LDMxIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gTkdYX0hUVFBfVkFSSUFCTEVfTk9UX0ZPVU5EOworICAgIHJldHVybiBOR1hfSFRUUF9WQVJfTk9UX0ZPVU5EOworfQorCisKK3N0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKK25neF9odHRwX3ZhcmlhYmxlX2hvc3Qobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSkKK3sKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CisKKyAgICB2diA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKKyAgICBpZiAodnYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB2di0+dmFsdWUgPSAwOworCisgICAgaWYgKHItPmhlYWRlcnNfaW4uaG9zdCkgeworICAgICAgICB2di0+dGV4dC5sZW4gPSByLT5oZWFkZXJzX2luLmhvc3RfbmFtZV9sZW47CisgICAgICAgIHZ2LT50ZXh0LmRhdGEgPSByLT5oZWFkZXJzX2luLmhvc3QtPnZhbHVlLmRhdGE7CisKKyAgICB9IGVsc2UgeworICAgICAgICB2di0+dGV4dCA9IHItPnNlcnZlcl9uYW1lOworICAgIH0KKworICAgIHJldHVybiB2djsKIH0KIAogCkBAIC0zMDksOCArNDMyLDEwIEBACiAKIAogc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgotbmd4X2h0dHBfdmFyaWFibGVfdXJpKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpCituZ3hfaHR0cF92YXJpYWJsZV9yZW1vdGVfcG9ydChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKQogeworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBwb3J0OworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAgICAgICAgICpzaW47CiAgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnZ2OwogCiAgICAgdnYgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7CkBAIC0zMTksMTUgKzQ0NCwzNyBAQAogICAgIH0KIAogICAgIHZ2LT52YWx1ZSA9IDA7Ci0gICAgdnYtPnRleHQgPSByLT51cmk7CisgICAgdnYtPnRleHQubGVuID0gMDsKKworICAgIHZ2LT50ZXh0LmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZigiNjU1MzUiKSAtIDEpOworICAgIGlmICh2di0+dGV4dC5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogQUZfSU5FVCBvbmx5ICovCisgICAgCisgICAgaWYgKHItPmNvbm5lY3Rpb24tPnNvY2thZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgeworICAgICAgICBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopIHItPmNvbm5lY3Rpb24tPnNvY2thZGRyOworICAgIAorICAgICAgICBwb3J0ID0gbnRvaHMoc2luLT5zaW5fcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAocG9ydCA+IDAgJiYgcG9ydCA8IDY1NTM2KSB7CisgICAgICAgICAgICB2di0+dmFsdWUgPSBwb3J0OworICAgICAgICAgICAgdnYtPnRleHQubGVuID0gbmd4X3NwcmludGYodnYtPnRleHQuZGF0YSwgIiV1aSIsIHBvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHZ2LT50ZXh0LmRhdGE7CisgICAgICAgIH0KKyAgICB9CiAKICAgICByZXR1cm4gdnY7CiB9CiAKIAogc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgotbmd4X2h0dHBfdmFyaWFibGVfcXVlcnlfc3RyaW5nKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpCituZ3hfaHR0cF92YXJpYWJsZV9zZXJ2ZXJfYWRkcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKQogeworICAgIHNvY2tsZW5fdCAgICAgICAgICAgICAgICAgICBsZW47CisgICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICAgICAgKmM7CisgICAgc3RydWN0IHNvY2thZGRyX2luICAgICAgICAgIHNpbjsKICAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CiAKICAgICB2diA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKQEAgLTMzNiw4NCArNDgzLDIwNyBAQAogICAgIH0KIAogICAgIHZ2LT52YWx1ZSA9IDA7Ci0gICAgdnYtPnRleHQgPSByLT5hcmdzOworCisgICAgdnYtPnRleHQuZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgSU5FVF9BRERSU1RSTEVOKTsKKyAgICBpZiAodnYtPnRleHQuZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGMgPSByLT5jb25uZWN0aW9uOworCisgICAgaWYgKHItPmluX2FkZHIgPT0gMCkgeworICAgICAgICBsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKyAgICAgICAgaWYgKGdldHNvY2tuYW1lKGMtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZzaW4sICZsZW4pID09IC0xKSB7CisgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQ1JJVCwgYy0+bG9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfc29ja2V0X2Vycm5vLCAiZ2V0c29ja25hbWUoKSBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgci0+aW5fYWRkciA9IHNpbi5zaW5fYWRkci5zX2FkZHI7CisgICAgfQorCisgICAgdnYtPnRleHQubGVuID0gbmd4X2luZXRfbnRvcChjLT5saXN0ZW5pbmctPmZhbWlseSwgJnItPmluX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2di0+dGV4dC5kYXRhLCBJTkVUX0FERFJTVFJMRU4pOworCisgICAgcmV0dXJuIHZ2OworfQorCisKK3N0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKK25neF9odHRwX3ZhcmlhYmxlX3NlcnZlcl9wb3J0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpCit7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCAgKnZ2OworCisgICAgdnYgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90KSk7CisgICAgaWYgKHZ2ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdnYtPnZhbHVlID0gci0+cG9ydDsKKyAgICB2di0+dGV4dC5sZW4gPSByLT5wb3J0X3RleHQtPmxlbiAtIDE7CisgICAgdnYtPnRleHQuZGF0YSA9IHItPnBvcnRfdGV4dC0+ZGF0YSArIDE7CisKKyAgICByZXR1cm4gdnY7Cit9CisKKworc3RhdGljIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKgorbmd4X2h0dHBfdmFyaWFibGVfZG9jdW1lbnRfcm9vdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKQoreworICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgICpjbGNmOworICAgIG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgICp2djsKKworICAgIHZ2ID0gbmd4X3BhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdCkpOworICAgIGlmICh2diA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHIsIG5neF9odHRwX2NvcmVfbW9kdWxlKTsKKworICAgIHZ2LT52YWx1ZSA9IDA7CisgICAgdnYtPnRleHQgPSBjbGNmLT5yb290OworCisgICAgcmV0dXJuIHZ2OworfQorCisKK3N0YXRpYyBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICoKK25neF9odHRwX3ZhcmlhYmxlX3JlcXVlc3RfZmlsZW5hbWUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSkKK3sKKyAgICB1X2NoYXIgICAgICAgICAgICAgICAgICAgICAqcDsKKyAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICAqY2xjZjsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICAqdnY7CisKKyAgICB2diA9IG5neF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QpKTsKKyAgICBpZiAodnYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB2di0+dmFsdWUgPSAwOworCisgICAgY2xjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOworCisgICAgaWYgKCFjbGNmLT5hbGlhcykgeworICAgICAgICB2di0+dGV4dC5sZW4gPSBjbGNmLT5yb290LmxlbiArIHItPnVyaS5sZW47CisgICAgICAgIHZ2LT50ZXh0LmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsIHZ2LT50ZXh0Lmxlbik7CisgICAgICAgIGlmICh2di0+dGV4dC5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgcCA9IG5neF9jcHltZW0odnYtPnRleHQuZGF0YSwgY2xjZi0+cm9vdC5kYXRhLCBjbGNmLT5yb290Lmxlbik7CisgICAgICAgIG5neF9tZW1jcHkocCwgci0+dXJpLmRhdGEsIHItPnVyaS5sZW4gKyAxKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIHZ2LT50ZXh0LmxlbiA9IGNsY2YtPnJvb3QubGVuICsgci0+dXJpLmxlbiArIDIgLSBjbGNmLT5uYW1lLmxlbjsKKyAgICAgICAgdnYtPnRleHQuZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgdnYtPnRleHQubGVuKTsKKyAgICAgICAgaWYgKHZ2LT50ZXh0LmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBwID0gbmd4X2NweW1lbSh2di0+dGV4dC5kYXRhLCBjbGNmLT5yb290LmRhdGEsIGNsY2YtPnJvb3QubGVuKTsKKyAgICAgICAgbmd4X21lbWNweShwLCByLT51cmkuZGF0YSArIGNsY2YtPm5hbWUubGVuLAorICAgICAgICAgICAgICAgICAgIHItPnVyaS5sZW4gKyAxIC0gY2xjZi0+bmFtZS5sZW4pOworICAgIH0KIAogICAgIHJldHVybiB2djsKIH0KIAogCiBuZ3hfaW50X3QKLW5neF9odHRwX3ZhcmlhYmxlc19pbml0KG5neF9jeWNsZV90ICpjeWNsZSkKK25neF9odHRwX3ZhcmlhYmxlc19hZGRfY29yZV92YXJzKG5neF9jb25mX3QgKmNmKQogewotICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgICBpLCBqLCBrZXk7Ci0gICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgICAgICAgKnY7Ci0gICAgbmd4X2h0dHBfY29yZV92YXJpYWJsZV90ICAgKmN2LCAqdnA7CisgICAgbmd4X2h0dHBfdmFyaWFibGVfdCAgICAgICAgKnYsICpjdjsKICAgICBuZ3hfaHR0cF9jb3JlX21haW5fY29uZl90ICAqY21jZjsKIAotICAgIG5neF9odHRwX2NvcmVfdmFyaWFibGVzX2hhc2ggPSBuZ3hfcGFsbG9jKGN5Y2xlLT5wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX1ZBUlNfSEFTSF9QUklNRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKG5neF9hcnJheV90KSk7Ci0gICAgaWYgKG5neF9odHRwX2NvcmVfdmFyaWFibGVzX2hhc2ggPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgIH0KKyAgICBjbWNmID0gbmd4X2h0dHBfY29uZl9nZXRfbW9kdWxlX21haW5fY29uZihjZiwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwogCi0gICAgZm9yIChpID0gMDsgaSA8IE5HWF9IVFRQX1ZBUlNfSEFTSF9QUklNRTsgaSsrKSB7Ci0gICAgICAgIGlmIChuZ3hfYXJyYXlfaW5pdCgmbmd4X2h0dHBfY29yZV92YXJpYWJsZXNfaGFzaFtpXSwgY3ljbGUtPnBvb2wsIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfY29yZV92YXJpYWJsZV90KSkgPT0gTkdYX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICB9CisgICAgaWYgKG5neF9hcnJheV9pbml0KCZjbWNmLT5hbGxfdmFyaWFibGVzLCBjZi0+cG9vbCwgMzIsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZ3hfaHR0cF92YXJpYWJsZV90KSkgPT0gTkdYX0VSUk9SKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKICAgICBmb3IgKGN2ID0gbmd4X2h0dHBfY29yZV92YXJpYWJsZXM7IGN2LT5uYW1lLmxlbjsgY3YrKykgewotICAgICAgICBuZ3hfaHR0cF92YXJzX2hhc2hfa2V5KGtleSwgJmN2LT5uYW1lKTsKLQotICAgICAgICB2cCA9IG5neF9hcnJheV9wdXNoKCZuZ3hfaHR0cF9jb3JlX3ZhcmlhYmxlc19oYXNoW2tleV0pOwotICAgICAgICBpZiAodnAgPT0gTlVMTCkgeworICAgICAgICB2ID0gbmd4X2FycmF5X3B1c2goJmNtY2YtPmFsbF92YXJpYWJsZXMpOworICAgICAgICBpZiAodiA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgKnZwID0gKmN2OworICAgICAgICAqdiA9ICpjdjsKICAgICB9CiAKKyAgICByZXR1cm4gTkdYX09LOworfQogCi0gICAgY21jZiA9IG5neF9odHRwX2N5Y2xlX2dldF9tb2R1bGVfbWFpbl9jb25mKGN5Y2xlLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CisKK25neF9pbnRfdAorbmd4X2h0dHBfdmFyaWFibGVzX2luaXRfdmFycyhuZ3hfY29uZl90ICpjZikKK3sKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgaSwgbjsKKyAgICBuZ3hfaHR0cF92YXJpYWJsZV90ICAgICAgICAqdiwgKmF2OworICAgIG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgICpjbWNmOworCisgICAgLyogc2V0IHRoZSBoYW5kbGVycyBmb3IgdGhlIGluZGV4ZWQgaHR0cCB2YXJpYWJsZXMgKi8KKworICAgIGNtY2YgPSBuZ3hfaHR0cF9jb25mX2dldF9tb2R1bGVfbWFpbl9jb25mKGNmLCBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CiAKICAgICB2ID0gY21jZi0+dmFyaWFibGVzLmVsdHM7CisgICAgYXYgPSBjbWNmLT5hbGxfdmFyaWFibGVzLmVsdHM7CisKICAgICBmb3IgKGkgPSAwOyBpIDwgY21jZi0+dmFyaWFibGVzLm5lbHRzOyBpKyspIHsKIAotICAgICAgICBpZiAodltpXS5oYW5kbGVyKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQorICAgICAgICBmb3IgKG4gPSAwOyBuIDwgY21jZi0+YWxsX3ZhcmlhYmxlcy5uZWx0czsgbisrKSB7CiAKLSAgICAgICAgbmd4X2h0dHBfdmFyc19oYXNoX2tleShrZXksICZ2W2ldLm5hbWUpOwotCi0gICAgICAgIGN2ID0gbmd4X2h0dHBfY29yZV92YXJpYWJsZXNfaGFzaFtrZXldLmVsdHM7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBuZ3hfaHR0cF9jb3JlX3ZhcmlhYmxlc19oYXNoW2tleV0ubmVsdHM7IGorKykgewotICAgICAgICAgICAgaWYgKGN2W2pdLm5hbWUubGVuICE9IHZbaV0ubmFtZS5sZW4pIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG5neF9zdHJuY21wKGN2W2pdLm5hbWUuZGF0YSwgdltpXS5uYW1lLmRhdGEsIHZbaV0ubmFtZS5sZW4pCi0gICAgICAgICAgICAgICAgPT0gMCkKKyAgICAgICAgICAgIGlmICh2W2ldLm5hbWUubGVuID09IGF2W25dLm5hbWUubGVuCisgICAgICAgICAgICAgICAgJiYgbmd4X3N0cm5jbXAodltpXS5uYW1lLmRhdGEsIGF2W25dLm5hbWUuZGF0YSwgdltpXS5uYW1lLmxlbikKKyAgICAgICAgICAgICAgICAgICA9PSAwKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZbaV0uaGFuZGxlciA9IGN2W2pdLmhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgdltpXS5kYXRhID0gY3Zbal0uZGF0YTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB2W2ldLmhhbmRsZXIgPSBhdltuXS5oYW5kbGVyOworICAgICAgICAgICAgICAgIHZbaV0uZGF0YSA9IGF2W25dLmRhdGE7CisgICAgICAgICAgICAgICAgdltpXS5mbGFncyA9IGF2W25dLmZsYWdzOworCisgICAgICAgICAgICAgICAgZ290byBuZXh0OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG5neF9zdHJuY21wKHZbaV0ubmFtZS5kYXRhLCAiSFRUUF8iLCA1KSA9PSAwKSB7CisgICAgICAgIGlmIChuZ3hfc3RybmNtcCh2W2ldLm5hbWUuZGF0YSwgImh0dHBfIiwgNSkgPT0gMCkgewogICAgICAgICAgICAgdltpXS5oYW5kbGVyID0gbmd4X2h0dHBfdmFyaWFibGVfdW5rbm93bl9oZWFkZXI7CiAgICAgICAgICAgICB2W2ldLmRhdGEgPSAodWludHB0cl90KSAmdltpXS5uYW1lOworCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIGN5Y2xlLT5sb2csIDAsCisgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY2YtPmxvZywgMCwKICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBcIiVWXCIgdmFyaWFibGUiLCAmdltpXS5uYW1lKTsKIAogICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworCisgICAgbmV4dDoKKyAgICAgICAgY29udGludWU7CiAgICAgfQogCisgICAgbmd4X2xvZ19kZWJ1ZzEoTkdYX0xPR19ERUJVR19IVFRQLCBjZi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICJodHRwIHZhcmlhYmxlczogJXVpIiwgY21jZi0+dmFyaWFibGVzLm5lbHRzKTsKKworCisgICAgLyogaW5pdCB0aGUgYWxsIGh0dHAgdmFyaWFibGVzIGhhc2ggKi8KKworICAgIGNtY2YtPnZhcmlhYmxlc19oYXNoLm1heF9zaXplID0gNTAwOworICAgIGNtY2YtPnZhcmlhYmxlc19oYXNoLmJ1Y2tldF9saW1pdCA9IDE7CisgICAgY21jZi0+dmFyaWFibGVzX2hhc2guYnVja2V0X3NpemUgPSBzaXplb2Yobmd4X2h0dHBfdmFyaWFibGVfdCk7CisgICAgY21jZi0+dmFyaWFibGVzX2hhc2gubmFtZSA9ICJodHRwIHZhcmlhYmxlcyI7CisKKyAgICBpZiAobmd4X2hhc2hfaW5pdCgmY21jZi0+dmFyaWFibGVzX2hhc2gsIGNmLT5wb29sLAorICAgICAgICAgICAgY21jZi0+YWxsX3ZhcmlhYmxlcy5lbHRzLCBjbWNmLT5hbGxfdmFyaWFibGVzLm5lbHRzKSAhPSBOR1hfT0spCisgICAgeworICAgICAgICByZXR1cm4gTkdYX0VSUk9SOworICAgIH0KKworICAgIG5neF9sb2dfZGVidWczKE5HWF9MT0dfREVCVUdfSFRUUCwgY2YtPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCB2YXJpYWJsZXMgaGFzaCBzaXplOiAldWkgZm9yICV1aSB2YWx1ZXMsICIKKyAgICAgICAgICAgICAgICAgICAibWF4IGJ1Y2tldHMgcGVyIGVudHJ5OiAldWkiLAorICAgICAgICAgICAgICAgICAgIGNtY2YtPnZhcmlhYmxlc19oYXNoLmhhc2hfc2l6ZSwgY21jZi0+YWxsX3ZhcmlhYmxlcy5uZWx0cywKKyAgICAgICAgICAgICAgICAgICBjbWNmLT52YXJpYWJsZXNfaGFzaC5taW5fYnVja2V0cyk7CisKICAgICByZXR1cm4gTkdYX09LOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfdmFyaWFibGVzLmggYi9zcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuaAppbmRleCBiZjgwMzg2Li42NjI0NTM1IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuaAorKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF92YXJpYWJsZXMuaApAQCAtMTQsMTMgKzE0LDEzIEBACiAjaW5jbHVkZSA8bmd4X2h0dHAuaD4KIAogCi0jZGVmaW5lIE5HWF9IVFRQX1ZBUklBQkxFX05PVF9GT1VORCAgKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKikgLTEKKyNkZWZpbmUgTkdYX0hUVFBfVkFSX05PVF9GT1VORCAgKG5neF9odHRwX3ZhcmlhYmxlX3ZhbHVlX3QgKikgLTEKIAogCi1zdHJ1Y3Qgbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfcyB7Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgICAgICB0ZXh0OwotfTsKK30gbmd4X2h0dHBfdmFyaWFibGVfdmFsdWVfdDsKIAogdHlwZWRlZiBzdHJ1Y3Qgbmd4X2h0dHBfdmFyaWFibGVfcyAgbmd4X2h0dHBfdmFyaWFibGVfdDsKIApAQCAtMjgsMzAgKzI4LDI4IEBACiAgICAgKCpuZ3hfaHR0cF9nZXRfdmFyaWFibGVfcHQpIChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKTsKIAogCisjZGVmaW5lIE5HWF9IVFRQX1ZBUl9DSEFOR0FCTEUgICAxCisjZGVmaW5lIE5HWF9IVFRQX1ZBUl9OT0NBQ0hBQkxFICAyCisKKwogc3RydWN0IG5neF9odHRwX3ZhcmlhYmxlX3MgewotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgIG5hbWU7Ci0gICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICAgaW5kZXg7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgbmFtZTsgICAvKiBtdXN0IGJlIGZpcnN0IHRvIGJ1aWxkIHRoZSBoYXNoICovCiAgICAgbmd4X2h0dHBfZ2V0X3ZhcmlhYmxlX3B0ICAgaGFuZGxlcjsKICAgICB1aW50cHRyX3QgICAgICAgICAgICAgICAgICBkYXRhOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgIGZsYWdzOwogfTsKIAogCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgICAgbmFtZTsKLSAgICBuZ3hfaHR0cF9nZXRfdmFyaWFibGVfcHQgICBoYW5kbGVyOwotICAgIHVpbnRwdHJfdCAgICAgICAgICAgICAgICAgIGRhdGE7Ci19IG5neF9odHRwX2NvcmVfdmFyaWFibGVfdDsKLQotCiBuZ3hfaHR0cF92YXJpYWJsZV90ICpuZ3hfaHR0cF9hZGRfdmFyaWFibGUobmd4X2NvbmZfdCAqY2YsIG5neF9zdHJfdCAqbmFtZSwKLSAgICBuZ3hfdWludF90IHNldCk7Ci1uZ3hfaW50X3Qgbmd4X2h0dHBfZ2V0X3ZhcmlhYmxlX2luZGV4KG5neF9odHRwX2NvcmVfbWFpbl9jb25mX3QgKmNtY2YsCi0gICAgbmd4X3N0cl90ICpuYW1lKTsKKyAgICBuZ3hfdWludF90IGZsYWdzKTsKK25neF9pbnRfdCBuZ3hfaHR0cF9nZXRfdmFyaWFibGVfaW5kZXgobmd4X2NvbmZfdCAqY2YsIG5neF9zdHJfdCAqbmFtZSk7CiBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICpuZ3hfaHR0cF9nZXRfaW5kZXhlZF92YXJpYWJsZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCiAgICAgbmd4X3VpbnRfdCBpbmRleCk7CiBuZ3hfaHR0cF92YXJpYWJsZV92YWx1ZV90ICpuZ3hfaHR0cF9nZXRfdmFyaWFibGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLAogICAgIG5neF9zdHJfdCAqbmFtZSk7Ci1uZ3hfaW50X3Qgbmd4X2h0dHBfdmFyaWFibGVzX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKTsKKworbmd4X2ludF90IG5neF9odHRwX3ZhcmlhYmxlc19hZGRfY29yZV92YXJzKG5neF9jb25mX3QgKmNmKTsKK25neF9pbnRfdCBuZ3hfaHR0cF92YXJpYWJsZXNfaW5pdF92YXJzKG5neF9jb25mX3QgKmNmKTsKIAogCiAjZW5kaWYgLyogX05HWF9IVFRQX1ZBUklBQkxFU19IX0lOQ0xVREVEXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfd3JpdGVfZmlsdGVyX21vZHVsZS5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfd3JpdGVfZmlsdGVyX21vZHVsZS5jCmluZGV4IGE5NTI2OTcuLmUwZjM4MjggMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3dyaXRlX2ZpbHRlcl9tb2R1bGUuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF93cml0ZV9maWx0ZXJfbW9kdWxlLmMKQEAgLTEwLDE2ICsxMCwxMiBAQAogI2luY2x1ZGUgPG5neF9odHRwLmg+CiAKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9jaGFpbl90ICAqb3V0OwotfSBuZ3hfaHR0cF93cml0ZV9maWx0ZXJfY3R4X3Q7Ci0KLQogc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF93cml0ZV9maWx0ZXJfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpOwogCiAKIG5neF9odHRwX21vZHVsZV90ICBuZ3hfaHR0cF93cml0ZV9maWx0ZXJfbW9kdWxlX2N0eCA9IHsKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmUgY29uZiAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZWNvbmZpZ3VyYXRpb24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3N0Y29uZmlndXJhdGlvbiAqLwogCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRlIG1haW4gY29uZmlndXJhdGlvbiAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgbWFpbiBjb25maWd1cmF0aW9uICovCkBAIC0zMyw3ICsyOSw3IEBACiAKIAogbmd4X21vZHVsZV90ICBuZ3hfaHR0cF93cml0ZV9maWx0ZXJfbW9kdWxlID0gewotICAgIE5HWF9NT0RVTEUsCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X2h0dHBfd3JpdGVfZmlsdGVyX21vZHVsZV9jdHgsICAgICAvKiBtb2R1bGUgY29udGV4dCAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0hUVFBfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KQEAgLTQ1LDM0ICs0MSwyMCBAQAogbmd4X2ludF90CiBuZ3hfaHR0cF93cml0ZV9maWx0ZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfY2hhaW5fdCAqaW4pCiB7Ci0gICAgb2ZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgc2VudDsKLSAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgICAgICBsYXN0LCBmbHVzaDsKLSAgICBuZ3hfY2hhaW5fdCAgICAgICAgICAgICAgICAgICpjbCwgKmxuLCAqKmxsLCAqY2hhaW47Ci0gICAgbmd4X2Nvbm5lY3Rpb25fdCAgICAgICAgICAgICAqYzsKLSAgICBuZ3hfaHR0cF9jb3JlX2xvY19jb25mX3QgICAgICpjbGNmOwotICAgIG5neF9odHRwX3dyaXRlX2ZpbHRlcl9jdHhfdCAgKmN0eDsKLQotICAgIGN0eCA9IG5neF9odHRwX2dldF9tb2R1bGVfY3R4KHItPm1haW4gPyByLT5tYWluIDogciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF93cml0ZV9maWx0ZXJfbW9kdWxlKTsKLQotICAgIGlmIChjdHggPT0gTlVMTCkgewotCi0gICAgICAgIGN0eCA9IG5neF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihuZ3hfaHR0cF93cml0ZV9maWx0ZXJfY3R4X3QpKTsKLSAgICAgICAgaWYgKGN0eCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgbmd4X2h0dHBfc2V0X2N0eChyLCBjdHgsIG5neF9odHRwX3dyaXRlX2ZpbHRlcl9tb2R1bGUpOwotICAgIH0KKyAgICBvZmZfdCAgICAgICAgICAgICAgICAgICAgICBzaXplLCBzZW50OworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICAgIGxhc3QsIGZsdXNoOworICAgIG5neF9jaGFpbl90ICAgICAgICAgICAgICAgKmNsLCAqbG4sICoqbGwsICpjaGFpbjsKKyAgICBuZ3hfY29ubmVjdGlvbl90ICAgICAgICAgICpjOworICAgIG5neF9odHRwX2NvcmVfbG9jX2NvbmZfdCAgKmNsY2Y7CiAKICAgICBzaXplID0gMDsKICAgICBmbHVzaCA9IDA7CiAgICAgbGFzdCA9IDA7Ci0gICAgbGwgPSAmY3R4LT5vdXQ7CisgICAgbGwgPSAmci0+b3V0OwogCiAgICAgLyogZmluZCB0aGUgc2l6ZSwgdGhlIGZsdXNoIHBvaW50IGFuZCB0aGUgbGFzdCBsaW5rIG9mIHRoZSBzYXZlZCBjaGFpbiAqLwogCi0gICAgZm9yIChjbCA9IGN0eC0+b3V0OyBjbDsgY2wgPSBjbC0+bmV4dCkgeworICAgIGZvciAoY2wgPSByLT5vdXQ7IGNsOyBjbCA9IGNsLT5uZXh0KSB7CiAgICAgICAgIGxsID0gJmNsLT5uZXh0OwogCiAgICAgICAgIG5neF9sb2dfZGVidWc3KE5HWF9MT0dfREVCVUdfRVZFTlQsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKQEAgLTE3NCwxMSArMTU2LDEwIEBACiAgICAgbmd4X2xvZ19kZWJ1ZzMoTkdYX0xPR19ERUJVR19IVFRQLCBjLT5sb2csIDAsCiAgICAgICAgICAgICAgICAgICAgImh0dHAgd3JpdGUgZmlsdGVyOiBsOiVkIGY6JWQgczolTyIsIGxhc3QsIGZsdXNoLCBzaXplKTsKIAotICAgIGNsY2YgPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2xvY19jb25mKHItPm1haW4gPyByLT5tYWluIDogciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9jb3JlX21vZHVsZSk7CisgICAgY2xjZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfY29yZV9tb2R1bGUpOwogCiAgICAgLyoKLSAgICAgKiBhdm9pZCB0aGUgb3V0cHV0IGlmIHRoZXJlIGlzIG5vIGxhc3QgYnVmLCBubyBmbHVzaCBwb2ludCwKKyAgICAgKiBhdm9pZCB0aGUgb3V0cHV0IGlmIHRoZXJlIGFyZSBubyBsYXN0IGJ1Ziwgbm8gZmx1c2ggcG9pbnQsCiAgICAgICogdGhlcmUgYXJlIHRoZSBpbmNvbWluZyBidWZzIGFuZCB0aGUgc2l6ZSBvZiBhbGwgYnVmcwogICAgICAqIGlzIHNtYWxsZXIgdGhhbiAicG9zdHBvbmVfb3V0cHV0IiBkaXJlY3RpdmUKICAgICAgKi8KQEAgLTE4NywyMCArMTY4LDMwIEBACiAgICAgICAgIHJldHVybiBOR1hfT0s7CiAgICAgfQogCisgICAgLyoKKyAgICAgKiBhdm9pZCB0aGUgb3V0cHV0IGlmIHRoZXJlIGFyZSBubyBpbmNvbWluZyBidWZzIGJ1dCB0aGVyZSBhcmUKKyAgICAgKiB0aGUgcG9zdHBvbmVkIHJlcXVlc3RzIG9yIGRhdGEKKyAgICAgKi8KKworICAgIGlmIChpbiA9PSBOVUxMICYmIHItPnBvc3Rwb25lZCkgeworICAgICAgICByZXR1cm4gTkdYX09LOworICAgIH0KKwogICAgIGlmIChjLT53cml0ZS0+ZGVsYXllZCkgewogICAgICAgICByZXR1cm4gTkdYX0FHQUlOOwogICAgIH0KIAogICAgIGlmIChzaXplID09IDAgJiYgIWMtPmJ1ZmZlcmVkKSB7CiAgICAgICAgIGlmIChsYXN0KSB7CisgICAgICAgICAgICByLT5vdXQgPSBOVUxMOwogICAgICAgICAgICAgcmV0dXJuIE5HWF9PSzsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChmbHVzaCkgewogICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGN0eC0+b3V0ID0gY3R4LT5vdXQtPm5leHQ7CisgICAgICAgICAgICAgICAgci0+b3V0ID0gci0+b3V0LT5uZXh0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKGN0eC0+b3V0KTsKKyAgICAgICAgICAgIHdoaWxlIChyLT5vdXQpOwogCiAgICAgICAgICAgICByZXR1cm4gTkdYX09LOwogICAgICAgICB9CkBAIC0yMTUsNyArMjA2LDcgQEAKIAogICAgIHNlbnQgPSBjLT5zZW50OwogCi0gICAgY2hhaW4gPSBjLT5zZW5kX2NoYWluKGMsIGN0eC0+b3V0LCBjbGNmLT5saW1pdF9yYXRlKTsKKyAgICBjaGFpbiA9IGMtPnNlbmRfY2hhaW4oYywgci0+b3V0LCBjbGNmLT5saW1pdF9yYXRlKTsKIAogICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgYy0+bG9nLCAwLAogICAgICAgICAgICAgICAgICAgICJodHRwIHdyaXRlIGZpbHRlciAlcCIsIGNoYWluKTsKQEAgLTIzMSwxMyArMjIyLDEzIEBACiAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgfQogCi0gICAgZm9yIChjbCA9IGN0eC0+b3V0OyBjbCAmJiBjbCAhPSBjaGFpbjsgLyogdm9pZCAqLykgeworICAgIGZvciAoY2wgPSByLT5vdXQ7IGNsICYmIGNsICE9IGNoYWluOyAvKiB2b2lkICovKSB7CiAgICAgICAgIGxuID0gY2w7CiAgICAgICAgIGNsID0gY2wtPm5leHQ7CiAgICAgICAgIG5neF9mcmVlX2NoYWluKHItPnBvb2wsIGxuKTsKICAgICB9CiAKLSAgICBjdHgtPm91dCA9IGNoYWluOworICAgIHItPm91dCA9IGNoYWluOwogCiAgICAgaWYgKGNoYWluIHx8IChsYXN0ICYmIGMtPmJ1ZmZlcmVkKSkgewogICAgICAgICByZXR1cm4gTkdYX0FHQUlOOwpkaWZmIC0tZ2l0IGEvc3JjL2ltYXAvbmd4X2ltYXAuYyBiL3NyYy9pbWFwL25neF9pbWFwLmMKaW5kZXggN2MxYTQyZi4uOWZjNWUyNCAxMDA2NDQKLS0tIGEvc3JjL2ltYXAvbmd4X2ltYXAuYworKysgYi9zcmMvaW1hcC9uZ3hfaW1hcC5jCkBAIC0zNCw3ICszNCw3IEBACiAKIAogbmd4X21vZHVsZV90ICBuZ3hfaW1hcF9tb2R1bGUgPSB7Ci0gICAgTkdYX01PRFVMRSwgCisgICAgTkdYX01PRFVMRV9WMSwKICAgICAmbmd4X2ltYXBfbW9kdWxlX2N0eCwgICAgICAgICAgICAgICAgICAvKiBtb2R1bGUgY29udGV4dCAqLwogICAgIG5neF9pbWFwX2NvbW1hbmRzLCAgICAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBkaXJlY3RpdmVzICovCiAgICAgTkdYX0NPUkVfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlIHR5cGUgKi8KZGlmZiAtLWdpdCBhL3NyYy9pbWFwL25neF9pbWFwX2hhbmRsZXIuYyBiL3NyYy9pbWFwL25neF9pbWFwX2hhbmRsZXIuYwppbmRleCAzNzFkNzdmLi5mNjVkYjgxIDEwMDY0NAotLS0gYS9zcmMvaW1hcC9uZ3hfaW1hcF9oYW5kbGVyLmMKKysrIGIvc3JjL2ltYXAvbmd4X2ltYXBfaGFuZGxlci5jCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBjLT5yZWFkLT5ldmVudF9oYW5kbGVyID0gbmd4X2ltYXBfaW5pdF9zZXNzaW9uOworICAgIGMtPnJlYWQtPmhhbmRsZXIgPSBuZ3hfaW1hcF9pbml0X3Nlc3Npb247CiAKICAgICBuZ3hfYWRkX3RpbWVyKGMtPnJlYWQsIC8qIFNUVUIgKi8gNjAwMDApOwogCkBAIC05Myw3ICs5Myw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBjLT5yZWFkLT5ldmVudF9oYW5kbGVyID0gbmd4X3BvcDNfYXV0aF9zdGF0ZTsKKyAgICBjLT5yZWFkLT5oYW5kbGVyID0gbmd4X3BvcDNfYXV0aF9zdGF0ZTsKIAogICAgIG5neF9wb3AzX2F1dGhfc3RhdGUocmV2KTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9pbWFwL25neF9pbWFwX3Byb3h5LmMgYi9zcmMvaW1hcC9uZ3hfaW1hcF9wcm94eS5jCmluZGV4IDQ1MWZiMzcuLjJiNmUzMGUgMTAwNjQ0Ci0tLSBhL3NyYy9pbWFwL25neF9pbWFwX3Byb3h5LmMKKysrIGIvc3JjL2ltYXAvbmd4X2ltYXBfcHJveHkuYwpAQCAtODIsOSArODIsOSBAQAogICAgIHAtPnVwc3RyZWFtLmNvbm5lY3Rpb24tPmRhdGEgPSBzOwogICAgIHAtPnVwc3RyZWFtLmNvbm5lY3Rpb24tPnBvb2wgPSBzLT5jb25uZWN0aW9uLT5wb29sOwogCi0gICAgcy0+Y29ubmVjdGlvbi0+cmVhZC0+ZXZlbnRfaGFuZGxlciA9IG5neF9pbWFwX3Byb3h5X2Jsb2NrX3JlYWQ7Ci0gICAgcC0+dXBzdHJlYW0uY29ubmVjdGlvbi0+cmVhZC0+ZXZlbnRfaGFuZGxlciA9IG5neF9pbWFwX3Byb3h5X2F1dGhfaGFuZGxlcjsKLSAgICBwLT51cHN0cmVhbS5jb25uZWN0aW9uLT53cml0ZS0+ZXZlbnRfaGFuZGxlciA9IG5neF9pbWFwX3Byb3h5X2R1bW15X2hhbmRsZXI7CisgICAgcy0+Y29ubmVjdGlvbi0+cmVhZC0+aGFuZGxlciA9IG5neF9pbWFwX3Byb3h5X2Jsb2NrX3JlYWQ7CisgICAgcC0+dXBzdHJlYW0uY29ubmVjdGlvbi0+cmVhZC0+aGFuZGxlciA9IG5neF9pbWFwX3Byb3h5X2F1dGhfaGFuZGxlcjsKKyAgICBwLT51cHN0cmVhbS5jb25uZWN0aW9uLT53cml0ZS0+aGFuZGxlciA9IG5neF9pbWFwX3Byb3h5X2R1bW15X2hhbmRsZXI7CiB9CiAKIApAQCAtMjAwLDEwICsyMDAsMTAgQEAKICAgICBzLT5wcm94eS0+YnVmZmVyLT5wb3MgPSBzLT5wcm94eS0+YnVmZmVyLT5zdGFydDsKICAgICBzLT5wcm94eS0+YnVmZmVyLT5sYXN0ID0gcy0+cHJveHktPmJ1ZmZlci0+c3RhcnQ7CiAKLSAgICBzLT5jb25uZWN0aW9uLT5yZWFkLT5ldmVudF9oYW5kbGVyID0gbmd4X2ltYXBfcHJveHlfaGFuZGxlcjsKLSAgICBzLT5jb25uZWN0aW9uLT53cml0ZS0+ZXZlbnRfaGFuZGxlciA9IG5neF9pbWFwX3Byb3h5X2hhbmRsZXI7Ci0gICAgcmV2LT5ldmVudF9oYW5kbGVyID0gbmd4X2ltYXBfcHJveHlfaGFuZGxlcjsKLSAgICBjLT53cml0ZS0+ZXZlbnRfaGFuZGxlciA9IG5neF9pbWFwX3Byb3h5X2hhbmRsZXI7CisgICAgcy0+Y29ubmVjdGlvbi0+cmVhZC0+aGFuZGxlciA9IG5neF9pbWFwX3Byb3h5X2hhbmRsZXI7CisgICAgcy0+Y29ubmVjdGlvbi0+d3JpdGUtPmhhbmRsZXIgPSBuZ3hfaW1hcF9wcm94eV9oYW5kbGVyOworICAgIHJldi0+aGFuZGxlciA9IG5neF9pbWFwX3Byb3h5X2hhbmRsZXI7CisgICAgYy0+d3JpdGUtPmhhbmRsZXIgPSBuZ3hfaW1hcF9wcm94eV9oYW5kbGVyOwogfQogCiAKZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9jaGFubmVsLmMgYi9zcmMvb3MvdW5peC9uZ3hfY2hhbm5lbC5jCmluZGV4IDg1M2M1ZDYuLmMwNTJiNjAgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9jaGFubmVsLmMKKysrIGIvc3JjL29zL3VuaXgvbmd4X2NoYW5uZWwuYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAKICAgICBpZiAoY2gtPmNvbW1hbmQgPT0gTkdYX0NNRF9PUEVOX0NIQU5ORUwpIHsKIAotICAgICAgICBpZiAoY21zZy5jbS5jbXNnX2xlbiA8IHNpemVvZihjbXNnKSkgeworICAgICAgICBpZiAoY21zZy5jbS5jbXNnX2xlbiA8IChzb2NrbGVuX3QpIHNpemVvZihjbXNnKSkgewogICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0FMRVJULCBsb2csIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWN2bXNnKCkgcmV0dXJuZWQgdG9vIHNtYWxsIGFuY2lsbGFyeSBkYXRhIik7CiAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwpAQCAtMjE1LDcgKzIxNSw3IEBACiAKICAgICBldiA9IChldmVudCA9PSBOR1hfUkVBRF9FVkVOVCkgPyByZXYgOiB3ZXY7CiAKLSAgICBldi0+ZXZlbnRfaGFuZGxlciA9IGhhbmRsZXI7CisgICAgZXYtPmhhbmRsZXIgPSBoYW5kbGVyOwogCiAgICAgaWYgKG5neF9hZGRfY29ubiAmJiAobmd4X2V2ZW50X2ZsYWdzICYgTkdYX1VTRV9FUE9MTF9FVkVOVCkgPT0gMCkgewogICAgICAgICBpZiAobmd4X2FkZF9jb25uKGMpID09IE5HWF9FUlJPUikgewpkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X2ZyZWVic2RfY29uZmlnLmggYi9zcmMvb3MvdW5peC9uZ3hfZnJlZWJzZF9jb25maWcuaAppbmRleCBhNjFlZWVkLi44ZDBlOTgzIDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfZnJlZWJzZF9jb25maWcuaAorKysgYi9zcmMvb3MvdW5peC9uZ3hfZnJlZWJzZF9jb25maWcuaApAQCAtOTcsOSArOTcsNiBAQAogI2VuZGlmCiAKIAotI2RlZmluZSBuZ3hfc2V0cHJvY3RpdGxlICBzZXRwcm9jdGl0bGUKLQotCiBleHRlcm4gY2hhciAqbWFsbG9jX29wdGlvbnM7CiAKIApkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X2xpbnV4X2NvbmZpZy5oIGIvc3JjL29zL3VuaXgvbmd4X2xpbnV4X2NvbmZpZy5oCmluZGV4IDI5ZDhhYWUuLjViYWQ2NDUgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9saW51eF9jb25maWcuaAorKysgYi9zcmMvb3MvdW5peC9uZ3hfbGludXhfY29uZmlnLmgKQEAgLTk3LDEwICs5Nyw1IEBACiAjZGVmaW5lIE5HWF9IQVZFX1NFTEVDVF9DSEFOR0VfVElNRU9VVCAgIDEKICNlbmRpZgogCi0jaWZuZGVmIE5HWF9TRVRQUk9DVElUTEVfVVNFU19FTlYKLSNkZWZpbmUgTkdYX1NFVFBST0NUSVRMRV9VU0VTX0VOViAgICAxCi0jZGVmaW5lIE5HWF9TRVRQUk9DVElUTEVfUEFEICAgICAgICAgJ1wwJyAKLSNlbmRpZgotCiAKICNlbmRpZiAvKiBfTkdYX0xJTlVYX0NPTkZJR19IX0lOQ0xVREVEXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X2xpbnV4X2luaXQuYyBiL3NyYy9vcy91bml4L25neF9saW51eF9pbml0LmMKaW5kZXggN2Y3YmU4OS4uNmNiMjQ0OSAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X2xpbnV4X2luaXQuYworKysgYi9zcmMvb3MvdW5peC9uZ3hfbGludXhfaW5pdC5jCkBAIC03Myw4ICs3Myw2IEBACiAgICAgICAgIG5neF9saW51eF9ydHNpZ19tYXggPSAwOwogICAgIH0KIAotICAgIG5neF9pbml0X3NldHByb2N0aXRsZShsb2cpOwotCiAKICAgICByZXR1cm4gbmd4X3Bvc2l4X2luaXQobG9nKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9wb3NpeF9jb25maWcuaCBiL3NyYy9vcy91bml4L25neF9wb3NpeF9jb25maWcuaAppbmRleCA5MDQwNjBlLi4wODYyNzI2IDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfcG9zaXhfY29uZmlnLmgKKysrIGIvc3JjL29zL3VuaXgvbmd4X3Bvc2l4X2NvbmZpZy5oCkBAIC0xMDIsMTMgKzEwMiw2IEBACiAjZW5kaWYKIAogCi0jaWYgKE5HWF9IQVZFX1NFVFBST0NUSVRMRSkKLSNkZWZpbmUgbmd4X3NldHByb2N0aXRsZSAgICAgICAgc2V0cHJvY3RpdGxlCi0jZWxzZQotI2RlZmluZSBuZ3hfc2V0cHJvY3RpdGxlKHRpdGxlKQotI2VuZGlmCi0KLQogI2RlZmluZSBOR1hfUE9TSVhfSU8gIDEKIAogCmRpZmYgLS1naXQgYS9zcmMvb3MvdW5peC9uZ3hfcG9zaXhfaW5pdC5jIGIvc3JjL29zL3VuaXgvbmd4X3Bvc2l4X2luaXQuYwppbmRleCBkNDgzNDNiLi5hNjY1NjBhIDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfcG9zaXhfaW5pdC5jCisrKyBiL3NyYy9vcy91bml4L25neF9wb3NpeF9pbml0LmMKQEAgLTYsNiArNiw3IEBACiAKICNpbmNsdWRlIDxuZ3hfY29uZmlnLmg+CiAjaW5jbHVkZSA8bmd4X2NvcmUuaD4KKyNpbmNsdWRlIDxuZ3hfc2V0cHJvY3RpdGxlLmg+CiAKIAogbmd4X2ludF90ICAgbmd4X25jcHU7CkBAIC05Nyw2ICs5OCw4IEBACiAgICAgbmd4X3NpZ25hbF90ICAgICAgKnNpZzsKICAgICBzdHJ1Y3Qgc2lnYWN0aW9uICAgc2E7CiAKKyAgICBuZ3hfaW5pdF9zZXRwcm9jdGl0bGUobG9nKTsKKwogICAgIG5neF9wYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CiAKICAgICBpZiAobmd4X25jcHUgPT0gMCkgewpkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X3Byb2Nlc3MuaCBiL3NyYy9vcy91bml4L25neF9wcm9jZXNzLmgKaW5kZXggOTk1ZTkzYy4uYjg1YzUyOCAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X3Byb2Nlc3MuaAorKysgYi9zcmMvb3MvdW5peC9uZ3hfcHJvY2Vzcy5oCkBAIC02MiwxMiArNjIsNiBAQAogI2VuZGlmCiAKIAotI2lmICFkZWZpbmVkKG5neF9zZXRwcm9jdGl0bGUpCi1uZ3hfaW50X3Qgbmd4X2luaXRfc2V0cHJvY3RpdGxlKG5neF9sb2dfdCAqbG9nKTsKLXZvaWQgbmd4X3NldHByb2N0aXRsZShjaGFyICp0aXRsZSk7Ci0jZW5kaWYKLQotCiBleHRlcm4gaW50ICAgICAgICAgICAgbmd4X2FyZ2M7CiBleHRlcm4gY2hhciAgICAgICAgICoqbmd4X2FyZ3Y7CiBleHRlcm4gY2hhciAgICAgICAgICoqbmd4X29zX2FyZ3Y7CmRpZmYgLS1naXQgYS9zcmMvb3MvdW5peC9uZ3hfcHJvY2Vzc19jeWNsZS5jIGIvc3JjL29zL3VuaXgvbmd4X3Byb2Nlc3NfY3ljbGUuYwppbmRleCAyMzU4OWM5Li5mZmE5ZGZlIDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfcHJvY2Vzc19jeWNsZS5jCisrKyBiL3NyYy9vcy91bml4L25neF9wcm9jZXNzX2N5Y2xlLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8bmd4X2NvbmZpZy5oPgogI2luY2x1ZGUgPG5neF9jb3JlLmg+CiAjaW5jbHVkZSA8bmd4X2V2ZW50Lmg+CisjaW5jbHVkZSA8bmd4X3NldHByb2N0aXRsZS5oPgogI2luY2x1ZGUgPG5neF9jaGFubmVsLmg+CiAKIApkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X3NlbmQuYyBiL3NyYy9vcy91bml4L25neF9zZW5kLmMKaW5kZXggZWNkMTM2Mi4uZmZlNmJjYiAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X3NlbmQuYworKysgYi9zcmMvb3MvdW5peC9uZ3hfc2VuZC5jCkBAIC02Myw3ICs2Myw3IEBACiAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHdldi0+ZXJyb3IgPSAxOwotICAgICAgICAgICAgbmd4X2Nvbm5lY3Rpb25fZXJyb3IoYywgZXJyLCAicmVjdigpIGZhaWxlZCIpOworICAgICAgICAgICAgbmd4X2Nvbm5lY3Rpb25fZXJyb3IoYywgZXJyLCAic2VuZCgpIGZhaWxlZCIpOwogICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9zZXRwcm9jdGl0bGUuYyBiL3NyYy9vcy91bml4L25neF9zZXRwcm9jdGl0bGUuYwppbmRleCA3MTJjMjJjLi44YWU2NDNkIDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfc2V0cHJvY3RpdGxlLmMKKysrIGIvc3JjL29zL3VuaXgvbmd4X3NldHByb2N0aXRsZS5jCkBAIC02LDYgKzYsNyBAQAogCiAjaW5jbHVkZSA8bmd4X2NvbmZpZy5oPgogI2luY2x1ZGUgPG5neF9jb3JlLmg+CisjaW5jbHVkZSA8bmd4X3NldHByb2N0aXRsZS5oPgogCiAKICNpZiAoTkdYX1NFVFBST0NUSVRMRV9VU0VTX0VOVikKQEAgLTEzMSwxOSArMTMyLDQgQEAKICAgICAgICAgICAgICAgICAgICAic2V0cHJvY3RpdGxlOiBcIiVzXCIiLCBuZ3hfb3NfYXJndlswXSk7CiB9CiAKLQotI2VsaWYgIWRlZmluZWQobmd4X3NldHByb2N0aXRsZSkKLQotbmd4X2ludF90Ci1uZ3hfaW5pdF9zZXRwcm9jdGl0bGUobmd4X2xvZ190ICpsb2cpCi17Ci0gICAgcmV0dXJuIE5HWF9PSzsKLX0KLQotdm9pZAotbmd4X3NldHByb2N0aXRsZShjaGFyICp0aXRsZSkKLXsKLSAgICByZXR1cm47Ci19Ci0KLSNlbmRpZgorI2VuZGlmIC8qIE5HWF9TRVRQUk9DVElUTEVfVVNFU19FTlYgKi8KZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF9zZXRwcm9jdGl0bGUuaCBiL3NyYy9vcy91bml4L25neF9zZXRwcm9jdGl0bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDc3MjVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL29zL3VuaXgvbmd4X3NldHByb2N0aXRsZS5oCkBAIC0wLDAgKzEsNDUgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgSWdvciBTeXNvZXYKKyAqLworCisKKyNpZm5kZWYgX05HWF9TRVRQUk9DVElUTEVfSF9JTkNMVURFRF8KKyNkZWZpbmUgX05HWF9TRVRQUk9DVElUTEVfSF9JTkNMVURFRF8KKworCisjaWYgKE5HWF9IQVZFX1NFVFBST0NUSVRMRSkKKworLyogRnJlZUJTRCwgTmV0QlNELCBPcGVuQlNEICovCisKKyNkZWZpbmUgbmd4X2luaXRfc2V0cHJvY3RpdGxlKGxvZykKKyNkZWZpbmUgbmd4X3NldHByb2N0aXRsZSAgICAgICAgICAgc2V0cHJvY3RpdGxlCisKKworI2VsaWYgIWRlZmluZWQgTkdYX1NFVFBST0NUSVRMRV9VU0VTX0VOVgorCisjZGVmaW5lIE5HWF9TRVRQUk9DVElUTEVfVVNFU19FTlYgIDEKKworI2lmIChOR1hfU09MQVJJUykKKworI2RlZmluZSBOR1hfU0VUUFJPQ1RJVExFX1BBRCAgICAgICAnICcKKworI2VsaWYgKE5HWF9MSU5VWCkgfHwgKE5HWF9EQVJXSU4pCisKKyNkZWZpbmUgTkdYX1NFVFBST0NUSVRMRV9QQUQgICAgICAgJ1wwJworCisjZW5kaWYKKworbmd4X2ludF90IG5neF9pbml0X3NldHByb2N0aXRsZShuZ3hfbG9nX3QgKmxvZyk7Cit2b2lkIG5neF9zZXRwcm9jdGl0bGUoY2hhciAqdGl0bGUpOworCisKKyNlbHNlIC8qICFOR1hfU0VUUFJPQ1RJVExFX1VTRVNfRU5WICovCisKKyNkZWZpbmUgbmd4X2luaXRfc2V0cHJvY3RpdGxlKGxvZykKKyNkZWZpbmUgbmd4X3NldHByb2N0aXRsZSh0aXRsZSkKKworI2VuZGlmCisKKworI2VuZGlmIC8qIF9OR1hfU0VUUFJPQ1RJVExFX0hfSU5DTFVERURfICovCmRpZmYgLS1naXQgYS9zcmMvb3MvdW5peC9uZ3hfc29sYXJpc19jb25maWcuaCBiL3NyYy9vcy91bml4L25neF9zb2xhcmlzX2NvbmZpZy5oCmluZGV4IDA4OGZiZDAuLjQzN2U1MDYgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9zb2xhcmlzX2NvbmZpZy5oCisrKyBiL3NyYy9vcy91bml4L25neF9zb2xhcmlzX2NvbmZpZy5oCkBAIC04MywxMCArODMsNCBAQAogI2VuZGlmCiAKIAotI2lmbmRlZiBOR1hfU0VUUFJPQ1RJVExFX1VTRVNfRU5WCi0jZGVmaW5lIE5HWF9TRVRQUk9DVElUTEVfVVNFU19FTlYgIDEKLSNkZWZpbmUgTkdYX1NFVFBST0NUSVRMRV9QQUQgICAgICAgJyAnCi0jZW5kaWYKLQotCiAjZW5kaWYgLyogX05HWF9TT0xBUklTX0NPTkZJR19IX0lOQ0xVREVEXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X3NvbGFyaXNfaW5pdC5jIGIvc3JjL29zL3VuaXgvbmd4X3NvbGFyaXNfaW5pdC5jCmluZGV4IDAzMDcyZWQuLjkwODBlYjIgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9zb2xhcmlzX2luaXQuYworKysgYi9zcmMvb3MvdW5peC9uZ3hfc29sYXJpc19pbml0LmMKQEAgLTUzLDggKzUzLDYgQEAKICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICB9CiAKLSAgICBuZ3hfaW5pdF9zZXRwcm9jdGl0bGUobG9nKTsKLQogCiAgICAgcmV0dXJuIG5neF9wb3NpeF9pbml0KGxvZyk7CiB9CmRpZmYgLS1naXQgYS9zcmMvb3MvdW5peC9uZ3hfdGltZS5jIGIvc3JjL29zL3VuaXgvbmd4X3RpbWUuYwppbmRleCAyMGVjNDY0Li43MjEzN2Y5IDEwMDY0NAotLS0gYS9zcmMvb3MvdW5peC9uZ3hfdGltZS5jCisrKyBiL3NyYy9vcy91bml4L25neF90aW1lLmMKQEAgLTI5LDMgKzI5LDQzIEBACiAgICAgdG0tPm5neF90bV9tb24rKzsKICAgICB0bS0+bmd4X3RtX3llYXIgKz0gMTkwMDsKIH0KKworCit2b2lkIG5neF9saWJjX2xvY2FsdGltZShzdHJ1Y3QgdG0gKnRtKQoreworI2lmIChOR1hfSEFWRV9MT0NBTFRJTUVfUikKKyAgICB0aW1lX3QgICAgICBub3c7CisKKyAgICBub3cgPSBuZ3hfdGltZSgpOworICAgIGxvY2FsdGltZV9yKCZub3csIHRtKTsKKworI2Vsc2UKKyAgICB0aW1lX3QgICAgICBub3c7CisgICAgc3RydWN0IHRtICAqdDsKKworICAgIG5vdyA9IG5neF90aW1lKCk7CisgICAgdCA9IGxvY2FsdGltZSgmbm93KTsKKyAgICAqdG0gPSAqdDsKKworI2VuZGlmCit9CisKKwordm9pZCBuZ3hfbGliY19nbXRpbWUoc3RydWN0IHRtICp0bSkKK3sKKyNpZiAoTkdYX0hBVkVfTE9DQUxUSU1FX1IpCisgICAgdGltZV90ICAgICAgbm93OworCisgICAgbm93ID0gbmd4X3RpbWUoKTsKKyAgICBnbXRpbWVfcigmbm93LCB0bSk7CisKKyNlbHNlCisgICAgdGltZV90ICAgICAgbm93OworICAgIHN0cnVjdCB0bSAgKnQ7CisKKyAgICBub3cgPSBuZ3hfdGltZSgpOworICAgIHQgPSBnbXRpbWUoJm5vdyk7CisgICAgKnRtID0gKnQ7CisKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X3RpbWUuaCBiL3NyYy9vcy91bml4L25neF90aW1lLmgKaW5kZXggZjI1NzMyNS4uNmU1YTM4YSAxMDA2NDQKLS0tIGEvc3JjL29zL3VuaXgvbmd4X3RpbWUuaAorKysgYi9zcmMvb3MvdW5peC9uZ3hfdGltZS5oCkBAIC01NCw2ICs1NCw4IEBACiAKIAogdm9pZCBuZ3hfbG9jYWx0aW1lKG5neF90bV90ICp0bSk7Cit2b2lkIG5neF9saWJjX2xvY2FsdGltZShzdHJ1Y3QgdG0gKnRtKTsKK3ZvaWQgbmd4X2xpYmNfZ210aW1lKHN0cnVjdCB0bSAqdG0pOwogCiAjZGVmaW5lIG5neF9nZXR0aW1lb2ZkYXkodHApICBnZXR0aW1lb2ZkYXkodHAsIE5VTEwpOwogI2RlZmluZSBuZ3hfbXNsZWVwKG1zKSAgICAgICAgdXNsZWVwKG1zICogMTAwMCkKZGlmZiAtLWdpdCBhL3NyYy9vcy91bml4L25neF91c2VyLmMgYi9zcmMvb3MvdW5peC9uZ3hfdXNlci5jCmluZGV4IGZlMmY3OTQuLjIyZWFmZDIgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF91c2VyLmMKKysrIGIvc3JjL29zL3VuaXgvbmd4X3VzZXIuYwpAQCAtMjcsMTEgKzI3LDE4IEBACiB7CiAgICAgY2hhciAgICAgICAgICAgICAgICp2YWx1ZTsKICAgICBzaXplX3QgICAgICAgICAgICAgIGxlbjsKKyAgICBuZ3hfZXJyX3QgICAgICAgICAgIGVycjsKICAgICBzdHJ1Y3QgY3J5cHRfZGF0YSAgIGNkOwogCisgICAgbmd4X3NldF9lcnJubygwKTsKKworICAgIGNkLmluaXRpYWxpemVkID0gMDsKKwogICAgIHZhbHVlID0gY3J5cHRfcigoY2hhciAqKSBrZXksIChjaGFyICopIHNhbHQsICZjZCk7CiAKLSAgICBpZiAodmFsdWUpIHsKKyAgICBlcnIgPSBuZ3hfZXJybm87CisKKyAgICBpZiAoZXJyID09IDApIHsKICAgICAgICAgbGVuID0gbmd4X3N0cmxlbih2YWx1ZSk7CiAKICAgICAgICAgKmVuY3J5cHRlZCA9IG5neF9wYWxsb2MocG9vbCwgbGVuKTsKQEAgLTQxLDYgKzQ4LDggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19DUklULCBwb29sLT5sb2csIGVyciwgImNyeXB0X3IoKSBmYWlsZWQiKTsKKwogICAgIHJldHVybiBOR1hfRVJST1I7CiB9CiAKQEAgLTUxLDcgKzYwLDcgQEAKIHsKICAgICBjaGFyICAgICAgICp2YWx1ZTsKICAgICBzaXplX3QgICAgICBsZW47Ci0gICAgbmd4X2ludF90ICAgcmM7CisgICAgbmd4X2Vycl90ICAgZXJyOwogCiAjaWYgKE5HWF9USFJFQURTICYmIE5HWF9OT05SRUVOVFJBTlRfQ1JZUFQpCiAKQEAgLTYzLDcgKzcyLDcgQEAKIAogI2VuZGlmCiAKLSAgICByYyA9IE5HWF9FUlJPUjsKKyAgICBuZ3hfc2V0X2Vycm5vKDApOwogCiAgICAgdmFsdWUgPSBjcnlwdCgoY2hhciAqKSBrZXksIChjaGFyICopIHNhbHQpOwogCkBAIC03MywxNSArODIsMjMgQEAKICAgICAgICAgKmVuY3J5cHRlZCA9IG5neF9wYWxsb2MocG9vbCwgbGVuKTsKICAgICAgICAgaWYgKCplbmNyeXB0ZWQpIHsKICAgICAgICAgICAgIG5neF9tZW1jcHkoKmVuY3J5cHRlZCwgdmFsdWUsIGxlbiArIDEpOwotICAgICAgICAgICAgcmMgPSBOR1hfT0s7CiAgICAgICAgIH0KKworI2lmIChOR1hfVEhSRUFEUyAmJiBOR1hfTk9OUkVFTlRSQU5UX0NSWVBUKQorICAgICAgICBuZ3hfbXV0ZXhfdW5sb2NrKG5neF9jcnlwdF9tdXRleCk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIE5HWF9PSzsKICAgICB9CiAKKyAgICBlcnIgPSBuZ3hfZXJybm87CisKICNpZiAoTkdYX1RIUkVBRFMgJiYgTkdYX05PTlJFRU5UUkFOVF9DUllQVCkKICAgICBuZ3hfbXV0ZXhfdW5sb2NrKG5neF9jcnlwdF9tdXRleCk7CiAjZW5kaWYKIAotICAgIHJldHVybiByYzsKKyAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQ1JJVCwgcG9vbC0+bG9nLCBlcnIsICJjcnlwdCgpIGZhaWxlZCIpOworCisgICAgcmV0dXJuIE5HWF9FUlJPUjsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvb3Mvd2luMzIvbmd4X2d1aS5jIGIvc3JjL29zL3dpbjMyL25neF9ndWkuYwppbmRleCAzNmQzYzQ5Li4xMzhkNDRhIDEwMDY0NAotLS0gYS9zcmMvb3Mvd2luMzIvbmd4X2d1aS5jCisrKyBiL3NyYy9vcy93aW4zMi9uZ3hfZ3VpLmMKQEAgLTExLDcgKzExLDggQEAKICNkZWZpbmUgTkdYX01BWF9URVhUICAgMjA0OAogCiAKLXZvaWQgbmd4X2NkZWNsIG5neF9tZXNzYWdlX2JveChjaGFyICp0aXRsZSwgbmd4X3VpbnRfdCB0eXBlLCBuZ3hfZXJyX3QgZXJyLAordm9pZCBfX2NkZWNsCituZ3hfbWVzc2FnZV9ib3goY2hhciAqdGl0bGUsIG5neF91aW50X3QgdHlwZSwgbmd4X2Vycl90IGVyciwKICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKICAgICB2YV9saXN0ICBhcmdzOwpkaWZmIC0tZ2l0IGEvc3JjL29zL3dpbjMyL25neF9wcm9jZXNzX2N5Y2xlLmMgYi9zcmMvb3Mvd2luMzIvbmd4X3Byb2Nlc3NfY3ljbGUuYwppbmRleCAyMjUxZmYyLi43ZWFiZWZlIDEwMDY0NAotLS0gYS9zcmMvb3Mvd2luMzIvbmd4X3Byb2Nlc3NfY3ljbGUuYworKysgYi9zcmMvb3Mvd2luMzIvbmd4X3Byb2Nlc3NfY3ljbGUuYwpAQCAtMTIsNyArMTIsNyBAQAogCiBzdGF0aWMgdm9pZCAqbmd4X3dvcmtlcl90aHJlYWRfY3ljbGUodm9pZCAqZGF0YSk7CiBzdGF0aWMgbG9uZyBfX3N0ZGNhbGwgbmd4X3dpbmRvd19wcm9jZWR1cmUoSFdORCB3aW5kb3csIHVfaW50IG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQgd3BhcmFtLCBsb25nIGxwYXJhbSk7CisgICAgdV9pbnQgd3BhcmFtLCBsb25nIGxwYXJhbSk7CiAKICNpZiAwCiBuZ3hfcGlkX3QgICAgIG5neF9uZXdfYmluYXJ5OwpAQCAtNDUsNyArNDUsOCBAQAogc3RhdGljIEhNRU5VICBuZ3hfbWVudTsKIAogCi12b2lkIG5neF9tYXN0ZXJfcHJvY2Vzc19jeWNsZShuZ3hfY3ljbGVfdCAqY3ljbGUpCit2b2lkCituZ3hfbWFzdGVyX3Byb2Nlc3NfY3ljbGUobmd4X2N5Y2xlX3QgKmN5Y2xlKQogewogICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FTUVSRywgY3ljbGUtPmxvZywgMCwgIm1hc3RlciBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKIApAQCAtNTMsNyArNTQsOCBAQAogfQogCiAKLXZvaWQgbmd4X3NpbmdsZV9wcm9jZXNzX2N5Y2xlKG5neF9jeWNsZV90ICpjeWNsZSkKK3ZvaWQKK25neF9zaW5nbGVfcHJvY2Vzc19jeWNsZShuZ3hfY3ljbGVfdCAqY3ljbGUpCiB7CiAgICAgaW50ICAgICAgICAgICAgICAgcmM7CiAgICAgbmd4X2ludF90ICAgICAgICAgaTsKQEAgLTE2NSw3ICsxNjcsNyBAQAogCiAKICAgICBpZiAobmd4X3N5c3RlbV90cmF5X2ljb24od2luZG93LCBOSU1fQURELCB0cmF5LCAodV9jaGFyICopICIgbmdpbngiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTkdYX0VSUk9SKQorICAgICAgICAhPSBOR1hfT0spCiAgICAgewogICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRU1FUkcsIGN5Y2xlLT5sb2csIG5neF9lcnJubywKICAgICAgICAgICAgICAgICAgICAgICAiU2hlbGxfTm90aWZ5SWNvbihOSU1fQUREKSBmYWlsZWQiKTsKQEAgLTIwMCw3ICsyMDIsOCBAQAogfQogCiAKLXN0YXRpYyB2b2lkICpuZ3hfd29ya2VyX3RocmVhZF9jeWNsZSh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgKgorbmd4X3dvcmtlcl90aHJlYWRfY3ljbGUodm9pZCAqZGF0YSkKIHsKICAgICBuZ3hfY3ljbGVfdCAgKmN5Y2xlOwogCkBAIC0yMTYsOCArMjE5LDggQEAKIH0KIAogCi1zdGF0aWMgbG9uZyBfX3N0ZGNhbGwgbmd4X3dpbmRvd19wcm9jZWR1cmUoSFdORCB3aW5kb3csIHVfaW50IG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQgd3BhcmFtLCBsb25nIGxwYXJhbSkKK3N0YXRpYyBsb25nIF9fc3RkY2FsbAorbmd4X3dpbmRvd19wcm9jZWR1cmUoSFdORCB3aW5kb3csIHVfaW50IG1lc3NhZ2UsIHVfaW50IHdwYXJhbSwgbG9uZyBscGFyYW0pCiB7CiAgICAgUE9JTlQgIG1vdXNlOwogCkBAIC0yNTEsMTMgKzI1NCwxMyBAQAogICAgIGNhc2UgV01fQ09NTUFORDoKICAgICAgICAgaWYgKHdwYXJhbSA9PSBOR1hfV01fQUJPVVQpIHsKICAgICAgICAgICAgIG5neF9tZXNzYWdlX2JveCgibmdpbngiLCBNQl9PSywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR0lOWF9WRVIgQ1JMRiAiKEMpIDIwMDItMjAwNCBJZ29yIFN5c29ldiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HSU5YX1ZFUiBDUkxGICIoQykgMjAwMi0yMDA1IElnb3IgU3lzb2V2Iik7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogCiAgICAgICAgIGlmICh3cGFyYW0gPT0gTkdYX1dNX0VYSVQpIHsKICAgICAgICAgICAgIGlmIChuZ3hfc3lzdGVtX3RyYXlfaWNvbih3aW5kb3csIE5JTV9ERUxFVEUsIE5VTEwsIE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBOR1hfRVJST1IpCisgICAgICAgICAgICAgICAgIT0gTkdYX09LKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19BTEVSVCwgbmd4X2N5Y2xlLT5sb2csIG5neF9lcnJubywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaGVsbF9Ob3RpZnlJY29uKE5JTV9ERUxFVEUpIGZhaWxlZCIpOwpkaWZmIC0tZ2l0IGEvc3JjL29zL3dpbjMyL25neF90aW1lLmMgYi9zcmMvb3Mvd2luMzIvbmd4X3RpbWUuYwppbmRleCBjYTA3MjAyLi4wNGExYWY2IDEwMDY0NAotLS0gYS9zcmMvb3Mvd2luMzIvbmd4X3RpbWUuYworKysgYi9zcmMvb3Mvd2luMzIvbmd4X3RpbWUuYwpAQCAtMzYsNiArMzYsMjggQEAKIH0KIAogCit2b2lkIG5neF9saWJjX2xvY2FsdGltZShzdHJ1Y3QgdG0gKnRtKQoreworICAgIHRpbWVfdCAgICAgIG5vdzsKKyAgICBzdHJ1Y3QgdG0gICp0OworCisgICAgbm93ID0gbmd4X3RpbWUoKTsKKyAgICB0ID0gbG9jYWx0aW1lKCZub3cpOworICAgICp0bSA9ICp0OworfQorCisKK3ZvaWQgbmd4X2xpYmNfZ210aW1lKHN0cnVjdCB0bSAqdG0pCit7CisgICAgdGltZV90ICAgICAgbm93OworICAgIHN0cnVjdCB0bSAgKnQ7CisKKyAgICBub3cgPSBuZ3hfdGltZSgpOworICAgIHQgPSBnbXRpbWUoJm5vdyk7CisgICAgKnRtID0gKnQ7Cit9CisKKwogbmd4X2ludF90IG5neF9nZXR0aW1lem9uZSh2b2lkKQogewogICAgIFRJTUVfWk9ORV9JTkZPUk1BVElPTiAgdHo7CmRpZmYgLS1naXQgYS9zcmMvb3Mvd2luMzIvbmd4X3RpbWUuaCBiL3NyYy9vcy93aW4zMi9uZ3hfdGltZS5oCmluZGV4IDRjYjk4NDEuLmNjOTBjNDYgMTAwNjQ0Ci0tLSBhL3NyYy9vcy93aW4zMi9uZ3hfdGltZS5oCisrKyBiL3NyYy9vcy93aW4zMi9uZ3hfdGltZS5oCkBAIC00Miw2ICs0Miw4IEBACiAjZGVmaW5lIE5HWF9IQVZFX0dFVFRJTUVaT05FICAxCiAKIG5neF9pbnRfdCBuZ3hfZ2V0dGltZXpvbmUodm9pZCk7Cit2b2lkIG5neF9saWJjX2xvY2FsdGltZShzdHJ1Y3QgdG0gKnRtKTsKK3ZvaWQgbmd4X2xpYmNfZ210aW1lKHN0cnVjdCB0bSAqdG0pOwogdm9pZCBuZ3hfZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0cCk7CiAKIApkaWZmIC0tZ2l0IGEvc3JjL29zL3dpbjMyL25neF93aW4zMl9jb25maWcuaCBiL3NyYy9vcy93aW4zMi9uZ3hfd2luMzJfY29uZmlnLmgKaW5kZXggZjQ5YTE2Yy4uYTgxNGFjYiAxMDA2NDQKLS0tIGEvc3JjL29zL3dpbjMyL25neF93aW4zMl9jb25maWcuaAorKysgYi9zcmMvb3Mvd2luMzIvbmd4X3dpbjMyX2NvbmZpZy5oCkBAIC0yOSw2ICsyOSwxNCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgogCisjaWZkZWYgX19XQVRDT01DX18KKyNkZWZpbmUgX1RJTUVfVF9ERUZJTkVECit0eXBlZGVmIGxvbmcgIHRpbWVfdDsKKy8qIE9wZW5XYXRjb20gZGVmaW5lcyB0aW1lX3QgYXMgInVuc2lnbmVkIGxvbmciICovCisjZW5kaWYKKworI2luY2x1ZGUgPHRpbWUuaD4gICAgICAvKiBsb2NhbHRpbWUoKSwgc3RyZnRpbWUoKSAqLworCiAKICNpZmRlZiBfTVNDX1ZFUgogCkBAIC01MSwxMSArNTksNiBAQAogLyogRkRfU0VUKCkgYW5kIEZEX0NMUigpOiBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50ICovCiAjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTI3KQogCi0jaWYgMAotLyogYXNzaWdubWVudCB3aXRoaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbiAqLwotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDcwNikKLSNlbmRpZgotCiAvKiBmdW5jdGlvbiAnbmd4X2hhbmRsZV93cml0ZV9ldmVudCcgbm90IGlubGluZWQgKi8KICNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ3MTApCiAKQEAgLTgxLDExICs4NCw2IEBACiAvKiB1bnJlZmVyZW5jZWQgZm9ybWFsIHBhcmFtZXRlciAqLwogI3ByYWdtYSB3YXJuIC04MDU3CiAKLSNpZiAwCi0vKiBhc3NpZ25tZW50IHdpdGhpbiBjb25kaXRpb25hbCBleHByZXNzaW9uICovCi0jcHJhZ21hIHdhcm4gLTgwNjAKLSNlbmRpZgotCiAjZW5kaWYKIAogCkBAIC0xMTcsNyArMTE1LDYgQEAKIHR5cGVkZWYgdV9pbnQgICAgICAgICAgICAgdWludHB0cl90OwogCiB0eXBlZGVmIGludCAgICAgICAgICAgICAgIHNzaXplX3Q7Ci10eXBlZGVmIGxvbmcgICAgICAgICAgICAgIHRpbWVfdDsKIHR5cGVkZWYgX19pbnQ2NCAgICAgICAgICAgb2ZmX3Q7CiB0eXBlZGVmIHVpbnQzMl90ICAgICAgICAgIGluX2FkZHJfdDsKIHR5cGVkZWYgdV9zaG9ydCAgICAgICAgICAgaW5fcG9ydF90Owo=