ZGlmZiAtLWdpdCBhL3NyYy9NYWtlZmlsZSBiL3NyYy9NYWtlZmlsZQppbmRleCAxZDIwZWMxLi43NzJiMTVjIDEwMDY0NAotLS0gYS9zcmMvTWFrZWZpbGUKKysrIGIvc3JjL01ha2VmaWxlCkBAIC0xNDMxLDYgKzE0MzEsOCBAQAogCWJsb3dmaXNoLmMgXAogCWJ1ZmZlci5jIFwKIAljaGFyc2V0LmMgXAorCWNyeXB0LmMgXAorCWNyeXB0X3ppcC5jIFwKIAlkaWZmLmMgXAogCWRpZ3JhcGguYyBcCiAJZWRpdC5jIFwKQEAgLTE1MjAsNiArMTUyMiw4IEBACiAJb2JqZWN0cy9idWZmZXIubyBcCiAJb2JqZWN0cy9ibG93ZmlzaC5vIFwKIAlvYmplY3RzL2NoYXJzZXQubyBcCisJb2JqZWN0cy9jcnlwdC5vIFwKKwlvYmplY3RzL2NyeXB0X3ppcC5vIFwKIAlvYmplY3RzL2RpZmYubyBcCiAJb2JqZWN0cy9kaWdyYXBoLm8gXAogCW9iamVjdHMvZWRpdC5vIFwKQEAgLTE1ODksNiArMTU5Myw4IEBACiAJYmxvd2Zpc2gucHJvIFwKIAlidWZmZXIucHJvIFwKIAljaGFyc2V0LnBybyBcCisJY3J5cHQucHJvIFwKKwljcnlwdF96aXAucHJvIFwKIAlkaWZmLnBybyBcCiAJZGlncmFwaC5wcm8gXAogCWVkaXQucHJvIFwKQEAgLTE3NTMsMTAgKzE3NTksMTEgQEAKIGxhbmd1YWdlczoKIAlAaWYgdGVzdCAtbiAiJChNQUtFTU8pIiAtYSAtZiAkKFBPRElSKS9NYWtlZmlsZTsgdGhlbiBcCiAJCWNkICQoUE9ESVIpOyBcCi0JCUNDPSIkKENDKSIgJChNQUtFKSBwcmVmaXg9JChERVNURElSKSQocHJlZml4KTsgXAorCQkgIENDPSIkKENDKSIgJChNQUtFKSBwcmVmaXg9JChERVNURElSKSQocHJlZml4KTsgXAogCWZpCiAJLUBpZiB0ZXN0IC1uICIkKE1BS0VNTykiIC1hIC1mICQoUE9ESVIpL01ha2VmaWxlOyB0aGVuIFwKLQkJY2QgJChQT0RJUik7IENDPSIkKENDKSIgJChNQUtFKSBwcmVmaXg9JChERVNURElSKSQocHJlZml4KSBjb252ZXJ0ZWQ7IFwKKwkJY2QgJChQT0RJUik7IFwKKwkJICBDQz0iJChDQykiICQoTUFLRSkgcHJlZml4PSQoREVTVERJUikkKHByZWZpeCkgY29udmVydGVkOyBcCiAJZmkKIAogIyBVcGRhdGUgdGhlICoucG8gZmlsZXMgZm9yIGNoYW5nZXMgaW4gdGhlIHNvdXJjZXMuICBPbmx5IHJ1biBtYW51YWxseS4KQEAgLTE4ODMsOCArMTg5MCwxNCBAQAogIyBSdW4gaW5kaXZpZHVhbCB0ZXN0LCBhc3N1bWluZyB0aGF0IFZpbSB3YXMgYWxyZWFkeSBjb21waWxlZC4KIHRlc3QxIHRlc3QyIHRlc3QzIHRlc3Q0IHRlc3Q1IHRlc3Q2IHRlc3Q3IHRlc3Q4IHRlc3Q5IFwKIAl0ZXN0X2F1dG9mb3JtYXRfam9pbiBcCisJdGVzdF9icmVha2luZGVudCBcCisJdGVzdF9jaGFuZ2VsaXN0IFwKIAl0ZXN0X2V2YWwgXAorCXRlc3RfaW5zZXJ0Y291bnQgXAorCXRlc3RfbGlzdGxiciBcCisJdGVzdF9saXN0bGJyX3V0ZjggXAogCXRlc3Rfb3B0aW9ucyBcCisJdGVzdF9xZl90aXRsZSBcCiAJdGVzdDEwIHRlc3QxMSB0ZXN0MTIgdGVzdDEzIHRlc3QxNCB0ZXN0MTUgdGVzdDE2IHRlc3QxNyB0ZXN0MTggdGVzdDE5IFwKIAl0ZXN0MjAgdGVzdDIxIHRlc3QyMiB0ZXN0MjMgdGVzdDI0IHRlc3QyNSB0ZXN0MjYgdGVzdDI3IHRlc3QyOCB0ZXN0MjkgXAogCXRlc3QzMCB0ZXN0MzEgdGVzdDMyIHRlc3QzMyB0ZXN0MzQgdGVzdDM1IHRlc3QzNiB0ZXN0MzcgdGVzdDM4IHRlc3QzOSBcCkBAIC0yNTA2LDYgKzI1MTksMTIgQEAKIG9iamVjdHMvY2hhcnNldC5vOiBjaGFyc2V0LmMKIAkkKENDQykgLW8gJEAgY2hhcnNldC5jCiAKK29iamVjdHMvY3J5cHQubzogY3J5cHQuYworCSQoQ0NDKSAtbyAkQCBjcnlwdC5jCisKK29iamVjdHMvY3J5cHRfemlwLm86IGNyeXB0X3ppcC5jCisJJChDQ0MpIC1vICRAIGNyeXB0X3ppcC5jCisKIG9iamVjdHMvZGlmZi5vOiBkaWZmLmMKIAkkKENDQykgLW8gJEAgZGlmZi5jCiAKQEAgLTI4NTUsNiArMjg3NCwxNCBAQAogIGFzY2lpLmgga2V5bWFwLmggdGVybS5oIG1hY3Jvcy5oIG9wdGlvbi5oIHN0cnVjdHMuaCByZWdleHAuaCBndWkuaCBcCiAgZ3VpX2JldmFsLmggcHJvdG8vZ3VpX2JldmFsLnBybyBleF9jbWRzLmggcHJvdG8uaCBnbG9iYWxzLmggZmFyc2kuaCBcCiAgYXJhYmljLmgKK29iamVjdHMvY3J5cHQubzogY3J5cHQuYyB2aW0uaCBhdXRvL2NvbmZpZy5oIGZlYXR1cmUuaCBvc191bml4LmggYXV0by9vc2RlZi5oIFwKKyBhc2NpaS5oIGtleW1hcC5oIHRlcm0uaCBtYWNyb3MuaCBvcHRpb24uaCBzdHJ1Y3RzLmggcmVnZXhwLmggZ3VpLmggXAorIGd1aV9iZXZhbC5oIHByb3RvL2d1aV9iZXZhbC5wcm8gZXhfY21kcy5oIHByb3RvLmggZ2xvYmFscy5oIGZhcnNpLmggXAorIGFyYWJpYy5oCitvYmplY3RzL2NyeXB0X3ppcC5vOiBjcnlwdF96aXAuYyB2aW0uaCBhdXRvL2NvbmZpZy5oIGZlYXR1cmUuaCBvc191bml4LmggXAorIGF1dG8vb3NkZWYuaCBhc2NpaS5oIGtleW1hcC5oIHRlcm0uaCBtYWNyb3MuaCBvcHRpb24uaCBzdHJ1Y3RzLmggXAorIHJlZ2V4cC5oIGd1aS5oIGd1aV9iZXZhbC5oIHByb3RvL2d1aV9iZXZhbC5wcm8gZXhfY21kcy5oIHByb3RvLmggXAorIGdsb2JhbHMuaCBmYXJzaS5oIGFyYWJpYy5oCiBvYmplY3RzL2RpZmYubzogZGlmZi5jIHZpbS5oIGF1dG8vY29uZmlnLmggZmVhdHVyZS5oIG9zX3VuaXguaCBhdXRvL29zZGVmLmggXAogIGFzY2lpLmgga2V5bWFwLmggdGVybS5oIG1hY3Jvcy5oIG9wdGlvbi5oIHN0cnVjdHMuaCByZWdleHAuaCBndWkuaCBcCiAgZ3VpX2JldmFsLmggcHJvdG8vZ3VpX2JldmFsLnBybyBleF9jbWRzLmggcHJvdG8uaCBnbG9iYWxzLmggZmFyc2kuaCBcCmRpZmYgLS1naXQgYS9zcmMvYmxvd2Zpc2guYyBiL3NyYy9ibG93ZmlzaC5jCmluZGV4IDNkOWJhNTUuLjZiZjI0ODIgMTAwNjQ0Ci0tLSBhL3NyYy9ibG93ZmlzaC5jCisrKyBiL3NyYy9ibG93ZmlzaC5jCkBAIC05LDE3ICs5LDI1IEBACiAgKiBCbG93ZmlzaCBlbmNyeXB0aW9uIGZvciBWaW07IGluIEJsb3dmaXNoIGNpcGhlciBmZWVkYmFjayBtb2RlLgogICogQ29udHJpYnV0ZWQgYnkgTW9oc2luIEFobWVkLCBodHRwOi8vd3d3LmNzLmFsYmFueS5lZHUvfm1vc2gKICAqIEJhc2VkIG9uIGh0dHA6Ly93d3cuc2NobmVpZXIuY29tL2Jsb3dmaXNoLmh0bWwgYnkgQnJ1Y2UgU2NobmVpZXIuCisgKgorICogVGhlcmUgYXJlIHR3byB2YXJpYW50czoKKyAqIC0gVGhlIG9sZCBvbmUgImJsb3dmaXNoIiBoYXMgYSBmbGF3IHdoaWNoIG1ha2VzIGl0IG11Y2ggZWFzaWVyIHRvIGNyYWNrIHRoZQorICogICBrZXkuICBUbyBzZWUgdGhpcywgbWFrZSBhIHRleHQgZmlsZSB3aXRoIG9uZSBsaW5lIG9mIDEwMDAgIngiIGNoYXJhY3RlcnMKKyAqICAgYW5kIHdyaXRlIGl0IGVuY3J5cHRlZC4gIFVzZSAieHhkIiB0byBpbnNwZWN0IHRoZSBieXRlcyBpbiB0aGUgZmlsZS4gIFlvdQorICogICB3aWxsIHNlZSB0aGF0IGEgYmxvY2sgb2YgOCBieXRlcyByZXBlYXRzIDggdGltZXMuCisgKiAtIFRoZSBuZXcgb25lICJibG93ZmlzaDIiIGlzIGJldHRlci4gIEl0IHVzZXMgYW4gOCBieXRlIENGQiB0byBhdm9pZCB0aGUKKyAqICAgcmVwZWF0cy4KICAqLwogCiAjaW5jbHVkZSAidmltLmgiCiAKLSNpZiBkZWZpbmVkKEZFQVRfQ1JZUFQpCisjaWYgZGVmaW5lZChGRUFUX0NSWVBUKSB8fCBkZWZpbmVkKFBST1RPKQogCiAjZGVmaW5lIEFSUkFZX0xFTkdUSChBKSAgICAgIChzaXplb2YoQSkvc2l6ZW9mKEFbMF0pKQogCiAjZGVmaW5lIEJGX0JMT0NLICAgIDgKICNkZWZpbmUgQkZfQkxPQ0tfTUFTSyA3Ci0jZGVmaW5lIEJGX0NGQl9MRU4gICg4KihCRl9CTE9DSykpCisjZGVmaW5lIEJGX01BWF9DRkJfTEVOICAoOCAqIEJGX0JMT0NLKQogCiB0eXBlZGVmIHVuaW9uIHsKICAgICBVSU5UMzJfVCB1bFsyXTsKQEAgLTM3LDE0ICs0NSwyNiBAQAogIyBlbmRpZgogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGJmX2VfYmxvY2sgX19BUkdTKChVSU5UMzJfVCAqcF94bCwgVUlOVDMyX1QgKnBfeHIpKTsKLXN0YXRpYyB2b2lkIGJmX2VfY2Jsb2NrIF9fQVJHUygoY2hhcl91ICpibG9jaykpOwotc3RhdGljIGludCBiZl9jaGVja190YWJsZXMgX19BUkdTKChVSU5UMzJfVCBhX2lwYVsxOF0sIFVJTlQzMl9UIGFfc2JpWzRdWzI1Nl0sIFVJTlQzMl9UIHZhbCkpOworLyogVGhlIHN0YXRlIG9mIGVuY3J5cHRpb24sIHJlZmVyZW5jZWQgYnkgY3J5cHRzdGF0ZV9ULiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMl9UCXBheFsxOF07CSAgICAvKiBQLWFycmF5ICovCisgICAgVUlOVDMyX1QJc2J4WzRdWzI1Nl07CSAgICAvKiBTLWJveGVzICovCisgICAgaW50CQlyYW5kYnl0ZV9vZmZzZXQ7CisgICAgaW50CQl1cGRhdGVfb2Zmc2V0OworICAgIGNoYXJfdQljZmJfYnVmZmVyW0JGX01BWF9DRkJfTEVOXTsgLyogdXAgdG8gNjQgYnl0ZXMgdXNlZCAqLworICAgIGludAkJY2ZiX2xlbjsJICAgIC8qIHNpemUgb2YgY2ZiX2J1ZmZlciBhY3R1YWxseSB1c2VkICovCit9IGJmX3N0YXRlX1Q7CisKKworc3RhdGljIHZvaWQgYmZfZV9ibG9jayBfX0FSR1MoKGJmX3N0YXRlX1QgKnN0YXRlLCBVSU5UMzJfVCAqcF94bCwgVUlOVDMyX1QgKnBfeHIpKTsKK3N0YXRpYyB2b2lkIGJmX2VfY2Jsb2NrIF9fQVJHUygoYmZfc3RhdGVfVCAqc3RhdGUsIGNoYXJfdSAqYmxvY2spKTsKK3N0YXRpYyBpbnQgYmZfY2hlY2tfdGFibGVzIF9fQVJHUygoVUlOVDMyX1QgcGF4WzE4XSwgVUlOVDMyX1Qgc2J4WzRdWzI1Nl0sIFVJTlQzMl9UIHZhbCkpOwogc3RhdGljIGludCBiZl9zZWxmX3Rlc3QgX19BUkdTKCh2b2lkKSk7CitzdGF0aWMgdm9pZCBiZl9rZXlfaW5pdCBfX0FSR1MoKGJmX3N0YXRlX1QgKnN0YXRlLCBjaGFyX3UgKnBhc3N3b3JkLCBjaGFyX3UgKnNhbHQsIGludCBzYWx0X2xlbikpOworc3RhdGljIHZvaWQgYmZfY2ZiX2luaXQgX19BUkdTKChiZl9zdGF0ZV9UICpzdGF0ZSwgY2hhcl91ICpzZWVkLCBpbnQgc2VlZF9sZW4pKTsKIAogLyogQmxvd2Zpc2ggY29kZSAqLwotc3RhdGljIFVJTlQzMl9UIHBheFsxOF07Ci1zdGF0aWMgVUlOVDMyX1QgaXBhWzE4XSA9IHsKK3N0YXRpYyBVSU5UMzJfVCBwYXhfaW5pdFsxOF0gPSB7CiAgICAgMHgyNDNmNmE4OHUsIDB4ODVhMzA4ZDN1LCAweDEzMTk4YTJldSwKICAgICAweDAzNzA3MzQ0dSwgMHhhNDA5MzgyMnUsIDB4Mjk5ZjMxZDB1LAogICAgIDB4MDgyZWZhOTh1LCAweGVjNGU2Yzg5dSwgMHg0NTI4MjFlNnUsCkBAIC01Myw4ICs3Myw3IEBACiAgICAgMHhiNTQ3MDkxN3UsIDB4OTIxNmQ1ZDl1LCAweDg5NzlmYjFidQogfTsKIAotc3RhdGljIFVJTlQzMl9UIHNieFs0XVsyNTZdOwotc3RhdGljIFVJTlQzMl9UIHNiaVs0XVsyNTZdID0geworc3RhdGljIFVJTlQzMl9UIHNieF9pbml0WzRdWzI1Nl0gPSB7CiAgICB7MHhkMTMxMGJhNnUsIDB4OThkZmI1YWN1LCAweDJmZmQ3MmRidSwgMHhkMDFhZGZiN3UsCiAgICAgMHhiOGUxYWZlZHUsIDB4NmEyNjdlOTZ1LCAweGJhN2M5MDQ1dSwgMHhmMTJjN2Y5OXUsCiAgICAgMHgyNGExOTk0N3UsIDB4YjM5MTZjZjd1LCAweDA4MDFmMmUydSwgMHg4NThlZmMxNnUsCkBAIC0zMTQsMzMgKzMzMyw0MCBAQAogIH0KIH07CiAKLQogI2RlZmluZSBGMShpKSBcCi0gICAgeGwgXj0gcGF4W2ldOyBcCi0gICAgeHIgXj0gKChzYnhbMF1beGwgPj4gMjRdICsgXAotICAgIHNieFsxXVsoeGwgJiAweEZGMDAwMCkgPj4gMTZdKSBeIFwKLSAgICBzYnhbMl1bKHhsICYgMHhGRjAwKSA+PiA4XSkgKyBcCi0gICAgc2J4WzNdW3hsICYgMHhGRl07CisgICAgeGwgXj0gYmZzLT5wYXhbaV07IFwKKyAgICB4ciBePSAoKGJmcy0+c2J4WzBdW3hsID4+IDI0XSArIFwKKyAgICBiZnMtPnNieFsxXVsoeGwgJiAweEZGMDAwMCkgPj4gMTZdKSBeIFwKKyAgICBiZnMtPnNieFsyXVsoeGwgJiAweEZGMDApID4+IDhdKSArIFwKKyAgICBiZnMtPnNieFszXVt4bCAmIDB4RkZdOwogCiAjZGVmaW5lIEYyKGkpIFwKLSAgICB4ciBePSBwYXhbaV07IFwKLSAgICB4bCBePSAoKHNieFswXVt4ciA+PiAyNF0gKyBcCi0gICAgc2J4WzFdWyh4ciAmIDB4RkYwMDAwKSA+PiAxNl0pIF4gXAotICAgIHNieFsyXVsoeHIgJiAweEZGMDApID4+IDhdKSArIFwKLSAgICBzYnhbM11beHIgJiAweEZGXTsKLQorICAgIHhyIF49IGJmcy0+cGF4W2ldOyBcCisgICAgeGwgXj0gKChiZnMtPnNieFswXVt4ciA+PiAyNF0gKyBcCisgICAgYmZzLT5zYnhbMV1bKHhyICYgMHhGRjAwMDApID4+IDE2XSkgXiBcCisgICAgYmZzLT5zYnhbMl1bKHhyICYgMHhGRjAwKSA+PiA4XSkgKyBcCisgICAgYmZzLT5zYnhbM11beHIgJiAweEZGXTsKIAogICAgIHN0YXRpYyB2b2lkCi1iZl9lX2Jsb2NrKHBfeGwsIHBfeHIpCitiZl9lX2Jsb2NrKGJmcywgcF94bCwgcF94cikKKyAgICBiZl9zdGF0ZV9UICpiZnM7CiAgICAgVUlOVDMyX1QgKnBfeGw7CiAgICAgVUlOVDMyX1QgKnBfeHI7CiB7Ci0gICAgVUlOVDMyX1QgdGVtcCwgeGwgPSAqcF94bCwgeHIgPSAqcF94cjsKKyAgICBVSU5UMzJfVCB0ZW1wOworICAgIFVJTlQzMl9UIHhsID0gKnBfeGw7CisgICAgVUlOVDMyX1QgeHIgPSAqcF94cjsKIAotICAgIEYxKDApIEYyKDEpIEYxKDIpIEYyKDMpIEYxKDQpIEYyKDUpIEYxKDYpIEYyKDcpCi0gICAgRjEoOCkgRjIoOSkgRjEoMTApIEYyKDExKSBGMSgxMikgRjIoMTMpIEYxKDE0KSBGMigxNSkKLSAgICB4bCBePSBwYXhbMTZdOwotICAgIHhyIF49IHBheFsxN107CisgICAgRjEoMCkgRjIoMSkKKyAgICBGMSgyKSBGMigzKQorICAgIEYxKDQpIEYyKDUpCisgICAgRjEoNikgRjIoNykKKyAgICBGMSg4KSBGMig5KQorICAgIEYxKDEwKSBGMigxMSkKKyAgICBGMSgxMikgRjIoMTMpCisgICAgRjEoMTQpIEYyKDE1KQorICAgIHhsIF49IGJmcy0+cGF4WzE2XTsKKyAgICB4ciBePSBiZnMtPnBheFsxN107CiAgICAgdGVtcCA9IHhsOwogICAgIHhsID0geHI7CiAgICAgeHIgPSB0ZW1wOwpAQCAtMzQ4LDIyICszNzQsNiBAQAogICAgICpwX3hyID0geHI7CiB9CiAKLSNpZiAwICAvKiBub3QgdXNlZCAqLwotICAgIHN0YXRpYyB2b2lkCi1iZl9kX2Jsb2NrKHBfeGwsIHBfeHIpCi0gICAgVUlOVDMyX1QgKnBfeGw7Ci0gICAgVUlOVDMyX1QgKnBfeHI7Ci17Ci0gICAgVUlOVDMyX1QgdGVtcCwgeGwgPSAqcF94bCwgeHIgPSAqcF94cjsKLSAgICBGMSgxNykgRjIoMTYpIEYxKDE1KSBGMigxNCkgRjEoMTMpIEYyKDEyKSBGMSgxMSkgRjIoMTApCi0gICAgRjEoOSkgRjIoOCkgRjEoNykgRjIoNikgRjEoNSkgRjIoNCkgRjEoMykgRjIoMikKLSAgICB4bCBePSBwYXhbMV07Ci0gICAgeHIgXj0gcGF4WzBdOwotICAgIHRlbXAgPSB4bDsgeGwgPSB4cjsgeHIgPSB0ZW1wOwotICAgICpwX3hsID0geGw7ICpwX3hyID0geHI7Ci19Ci0jZW5kaWYKLQogCiAjaWZkZWYgV09SRFNfQklHRU5ESUFOCiAjIGRlZmluZSBodG9ubDIoeCkgXApAQCAtMzc0LDcgKzM4NCw4IEBACiAjZW5kaWYKIAogICAgIHN0YXRpYyB2b2lkCi1iZl9lX2NibG9jayhibG9jaykKK2JmX2VfY2Jsb2NrKGJmcywgYmxvY2spCisgICAgYmZfc3RhdGVfVCAqYmZzOwogICAgIGNoYXJfdSAqYmxvY2s7CiB7CiAgICAgYmxvY2s4CWJrOwpAQCAtMzgyLDM1ICszOTMsMjIgQEAKICAgICBtZW1jcHkoYmsudWMsIGJsb2NrLCA4KTsKICAgICBodG9ubDIoYmsudWxbMF0pOwogICAgIGh0b25sMihiay51bFsxXSk7Ci0gICAgYmZfZV9ibG9jaygmYmsudWxbMF0sICZiay51bFsxXSk7CisgICAgYmZfZV9ibG9jayhiZnMsICZiay51bFswXSwgJmJrLnVsWzFdKTsKICAgICBodG9ubDIoYmsudWxbMF0pOwogICAgIGh0b25sMihiay51bFsxXSk7CiAgICAgbWVtY3B5KGJsb2NrLCBiay51YywgOCk7CiB9CiAKLSNpZiAwICAvKiBub3QgdXNlZCAqLwotICAgIHZvaWQKLWJmX2RfY2Jsb2NrKGJsb2NrKQotICAgIGNoYXJfdSAqYmxvY2s7Ci17Ci0gICAgYmxvY2s4IGJrOwotICAgIG1lbWNweShiay51YywgYmxvY2ssIDgpOwotICAgIGh0b25sMihiay51bFswXSk7IGh0b25sMihiay51bFsxXSk7Ci0gICAgYmZfZF9ibG9jaygmYmsudWxbMF0sICZiay51bFsxXSk7Ci0gICAgaHRvbmwyKGJrLnVsWzBdKTsgaHRvbmwyKGJrLnVsWzFdKTsKLSAgICBtZW1jcHkoYmxvY2ssIGJrLnVjLCA4KTsKLX0KLSNlbmRpZgotCiAvKgogICogSW5pdGlhbGl6ZSB0aGUgY3J5cHQgbWV0aG9kIHVzaW5nICJwYXNzd29yZCIgYXMgdGhlIGVuY3J5cHRpb24ga2V5IGFuZAogICogInNhbHRbc2FsdF9sZW5dIiBhcyB0aGUgc2FsdC4KICAqLwotICAgIHZvaWQKLWJmX2tleV9pbml0KHBhc3N3b3JkLCBzYWx0LCBzYWx0X2xlbikKLSAgICBjaGFyX3UgKnBhc3N3b3JkOwotICAgIGNoYXJfdSAqc2FsdDsKLSAgICBpbnQgICAgc2FsdF9sZW47CisgICAgc3RhdGljIHZvaWQKK2JmX2tleV9pbml0KGJmcywgcGFzc3dvcmQsIHNhbHQsIHNhbHRfbGVuKQorICAgIGJmX3N0YXRlX1QJKmJmczsKKyAgICBjaGFyX3UJKnBhc3N3b3JkOworICAgIGNoYXJfdQkqc2FsdDsKKyAgICBpbnQJCXNhbHRfbGVuOwogewogICAgIGludCAgICAgIGksIGosIGtleXBvcyA9IDA7CiAgICAgdW5zaWduZWQgdTsKQEAgLTQxOCw3ICs0MTYsNyBAQAogICAgIGNoYXJfdSAgICprZXk7CiAgICAgaW50ICAgICAga2V5bGVuOwogCi0gICAgLyogUHJvY2VzcyB0aGUga2V5IDEwMDAgdGltZXMuCisgICAgLyogUHJvY2VzcyB0aGUga2V5IDEwMDEgdGltZXMuCiAgICAgICogU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvS2V5X3N0cmVuZ3RoZW5pbmcuICovCiAgICAga2V5ID0gc2hhMjU2X2tleShwYXNzd29yZCwgc2FsdCwgc2FsdF9sZW4pOwogICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspCkBAIC00MzcsNTIgKzQzNSw1NCBAQAogCWtleVtpXSA9IHU7CiAgICAgfQogCi0gICAgbWNoX21lbW1vdmUoc2J4LCBzYmksIDQgKiA0ICogMjU2KTsKKyAgICAvKiBVc2UgImtleSIgdG8gaW5pdGlhbGl6ZSB0aGUgUC1hcnJheSAoInBheCIpIGFuZCBTLWJveGVzICgic2J4Iikgb2YKKyAgICAgKiBCbG93ZmlzaC4gKi8KKyAgICBtY2hfbWVtbW92ZShiZnMtPnNieCwgc2J4X2luaXQsIDQgKiA0ICogMjU2KTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCAxODsgKytpKQogICAgIHsKIAl2YWwgPSAwOwogCWZvciAoaiA9IDA7IGogPCA0OyArK2opCiAJICAgIHZhbCA9ICh2YWwgPDwgOCkgfCBrZXlba2V5cG9zKysgJSBrZXlsZW5dOwotCXBheFtpXSA9IGlwYVtpXSBeIHZhbDsKKwliZnMtPnBheFtpXSA9IHBheF9pbml0W2ldIF4gdmFsOwogICAgIH0KIAogICAgIGRhdGFfbCA9IGRhdGFfciA9IDA7CiAgICAgZm9yIChpID0gMDsgaSA8IDE4OyBpICs9IDIpCiAgICAgewotCWJmX2VfYmxvY2soJmRhdGFfbCwgJmRhdGFfcik7Ci0JcGF4W2kgKyAwXSA9IGRhdGFfbDsKLQlwYXhbaSArIDFdID0gZGF0YV9yOworCWJmX2VfYmxvY2soYmZzLCAmZGF0YV9sLCAmZGF0YV9yKTsKKwliZnMtPnBheFtpICsgMF0gPSBkYXRhX2w7CisJYmZzLT5wYXhbaSArIDFdID0gZGF0YV9yOwogICAgIH0KIAogICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpCiAgICAgewogCWZvciAoaiA9IDA7IGogPCAyNTY7IGogKz0gMikKIAl7Ci0JICAgIGJmX2VfYmxvY2soJmRhdGFfbCwgJmRhdGFfcik7Ci0JICAgIHNieFtpXVtqICsgMF0gPSBkYXRhX2w7Ci0JICAgIHNieFtpXVtqICsgMV0gPSBkYXRhX3I7CisJICAgIGJmX2VfYmxvY2soYmZzLCAmZGF0YV9sLCAmZGF0YV9yKTsKKwkgICAgYmZzLT5zYnhbaV1baiArIDBdID0gZGF0YV9sOworCSAgICBiZnMtPnNieFtpXVtqICsgMV0gPSBkYXRhX3I7CiAJfQogICAgIH0KIH0KIAogLyoKLSAqIEJGIFNlbGYgdGVzdCBmb3IgY29ycnVwdGVkIHRhYmxlcyBvciBpbnN0cnVjdGlvbnMKKyAqIEJsb3dmaXNoIHNlbGYtdGVzdCBmb3IgY29ycnVwdGVkIHRhYmxlcyBvciBpbnN0cnVjdGlvbnMuCiAgKi8KICAgICBzdGF0aWMgaW50Ci1iZl9jaGVja190YWJsZXMoYV9pcGEsIGFfc2JpLCB2YWwpCi0gICAgVUlOVDMyX1QgYV9pcGFbMThdOwotICAgIFVJTlQzMl9UIGFfc2JpWzRdWzI1Nl07CitiZl9jaGVja190YWJsZXMocGF4LCBzYngsIHZhbCkKKyAgICBVSU5UMzJfVCBwYXhbMThdOworICAgIFVJTlQzMl9UIHNieFs0XVsyNTZdOwogICAgIFVJTlQzMl9UIHZhbDsKIHsKICAgICBpbnQgaSwgajsKICAgICBVSU5UMzJfVCBjID0gMDsKIAogICAgIGZvciAoaSA9IDA7IGkgPCAxODsgaSsrKQotCWMgXj0gYV9pcGFbaV07CisJYyBePSBwYXhbaV07CiAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKIAlmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspCi0JICAgIGMgXj0gYV9zYmlbaV1bal07CisJICAgIGMgXj0gc2J4W2ldW2pdOwogICAgIHJldHVybiBjID09IHZhbDsKIH0KIApAQCAtNTIwLDYgKzUyMCwxMCBAQAogICAgIGludCAgICBlcnIgPSAwOwogICAgIGJsb2NrOCBiazsKICAgICBVSU5UMzJfVCB1aSA9IDB4ZmZmZmZmZmZVTDsKKyAgICBiZl9zdGF0ZV9UIHN0YXRlOworCisgICAgdmltX21lbXNldCgmc3RhdGUsIDAsIHNpemVvZihiZl9zdGF0ZV9UKSk7CisgICAgc3RhdGUuY2ZiX2xlbiA9IEJGX01BWF9DRkJfTEVOOwogCiAgICAgLyogV2UgY2FuJ3Qgc2ltcGx5IHVzZSBzaXplb2YoVUlOVDMyX1QpLCBpdCB3b3VsZCBnZW5lcmF0ZSBhIGNvbXBpbGVyCiAgICAgICogd2FybmluZy4gKi8KQEAgLTUyOCwyMSArNTMyLDIxIEBACiAJRU1TRyhfKCJFODIwOiBzaXplb2YodWludDMyX3QpICE9IDQiKSk7CiAgICAgfQogCi0gICAgaWYgKCFiZl9jaGVja190YWJsZXMoaXBhLCBzYmksIDB4NmZmYTUyMGEpKQorICAgIGlmICghYmZfY2hlY2tfdGFibGVzKHBheF9pbml0LCBzYnhfaW5pdCwgMHg2ZmZhNTIwYSkpCiAJZXJyKys7CiAKICAgICBibiA9IEFSUkFZX0xFTkdUSChiZl90ZXN0X2RhdGEpOwogICAgIGZvciAoaSA9IDA7IGkgPCBibjsgaSsrKQogICAgIHsKLQliZl9rZXlfaW5pdCgoY2hhcl91ICopKGJmX3Rlc3RfZGF0YVtpXS5wYXNzd29yZCksCisJYmZfa2V5X2luaXQoJnN0YXRlLCAoY2hhcl91ICopKGJmX3Rlc3RfZGF0YVtpXS5wYXNzd29yZCksCiAJCSAgICBiZl90ZXN0X2RhdGFbaV0uc2FsdCwKIAkJICAgIChpbnQpU1RSTEVOKGJmX3Rlc3RfZGF0YVtpXS5zYWx0KSk7Ci0JaWYgKCFiZl9jaGVja190YWJsZXMocGF4LCBzYngsIGJmX3Rlc3RfZGF0YVtpXS5rZXlzdW0pKQorCWlmICghYmZfY2hlY2tfdGFibGVzKHN0YXRlLnBheCwgc3RhdGUuc2J4LCBiZl90ZXN0X2RhdGFbaV0ua2V5c3VtKSkKIAkgICAgZXJyKys7CiAKIAkvKiBEb24ndCBtb2RpZnkgYmZfdGVzdF9kYXRhW2ldLnBsYWludHh0LCBzZWxmIHRlc3QgaXMgaWRlbXBvdGVudC4gKi8KIAltZW1jcHkoYmsudWMsIGJmX3Rlc3RfZGF0YVtpXS5wbGFpbnR4dCwgOCk7Ci0JYmZfZV9jYmxvY2soYmsudWMpOworCWJmX2VfY2Jsb2NrKCZzdGF0ZSwgYmsudWMpOwogCWlmIChtZW1jbXAoYmsudWMsIGJmX3Rlc3RfZGF0YVtpXS5jcnlwdHh0LCA4KSAhPSAwKQogCXsKIAkgICAgaWYgKGVyciA9PSAwICYmIG1lbWNtcChiay51YywgYmZfdGVzdF9kYXRhW2ldLmJhZGNyeXB0eHQsIDgpID09IDApCkBAIC01NTQsNDMgKzU1OCw0MyBAQAogICAgIHJldHVybiBlcnIgPiAwID8gRkFJTCA6IE9LOwogfQogCi0vKiBDaXBoZXIgZmVlZGJhY2sgbW9kZS4gKi8KLXN0YXRpYyBpbnQgcmFuZGJ5dGVfb2Zmc2V0ID0gMDsKLXN0YXRpYyBpbnQgdXBkYXRlX29mZnNldCA9IDA7Ci1zdGF0aWMgY2hhcl91IGNmYl9idWZmZXJbQkZfQ0ZCX0xFTl07IC8qIDY0IGJ5dGVzICovCisvKgorICogQ0ZCOiBDaXBoZXIgRmVlZGJhY2sgTW9kZS4KKyAqLwogCiAvKgotICogSW5pdGlhbGl6ZSB3aXRoIHNlZWQgIml2W2l2X2xlbl0iLgorICogSW5pdGlhbGl6ZSB3aXRoIHNlZWQgInNlZWRbc2VlZF9sZW5dIi4KICAqLwotICAgIHZvaWQKLWJmX2NmYl9pbml0KGl2LCBpdl9sZW4pCi0gICAgY2hhcl91ICppdjsKLSAgICBpbnQgICAgaXZfbGVuOworICAgIHN0YXRpYyB2b2lkCitiZl9jZmJfaW5pdChiZnMsIHNlZWQsIHNlZWRfbGVuKQorICAgIGJmX3N0YXRlX1QJKmJmczsKKyAgICBjaGFyX3UJKnNlZWQ7CisgICAgaW50CQlzZWVkX2xlbjsKIHsKICAgICBpbnQgaSwgbWk7CiAKLSAgICByYW5kYnl0ZV9vZmZzZXQgPSB1cGRhdGVfb2Zmc2V0ID0gMDsKLSAgICB2aW1fbWVtc2V0KGNmYl9idWZmZXIsIDAsIEJGX0NGQl9MRU4pOwotICAgIGlmIChpdl9sZW4gPiAwKQorICAgIGJmcy0+cmFuZGJ5dGVfb2Zmc2V0ID0gYmZzLT51cGRhdGVfb2Zmc2V0ID0gMDsKKyAgICB2aW1fbWVtc2V0KGJmcy0+Y2ZiX2J1ZmZlciwgMCwgYmZzLT5jZmJfbGVuKTsKKyAgICBpZiAoc2VlZF9sZW4gPiAwKQogICAgIHsKLQltaSA9IGl2X2xlbiA+IEJGX0NGQl9MRU4gPyBpdl9sZW4gOiBCRl9DRkJfTEVOOworCW1pID0gc2VlZF9sZW4gPiBiZnMtPmNmYl9sZW4gPyBzZWVkX2xlbiA6IGJmcy0+Y2ZiX2xlbjsKIAlmb3IgKGkgPSAwOyBpIDwgbWk7IGkrKykKLQkgICAgY2ZiX2J1ZmZlcltpICUgQkZfQ0ZCX0xFTl0gXj0gaXZbaSAlIGl2X2xlbl07CisJICAgIGJmcy0+Y2ZiX2J1ZmZlcltpICUgYmZzLT5jZmJfbGVuXSBePSBzZWVkW2kgJSBzZWVkX2xlbl07CiAgICAgfQogfQogCi0jZGVmaW5lIEJGX0NGQl9VUERBVEUoYykgeyBcCi0gICAgY2ZiX2J1ZmZlclt1cGRhdGVfb2Zmc2V0XSBePSAoY2hhcl91KWM7IFwKLSAgICBpZiAoKyt1cGRhdGVfb2Zmc2V0ID09IEJGX0NGQl9MRU4pIFwKLQl1cGRhdGVfb2Zmc2V0ID0gMDsgXAorI2RlZmluZSBCRl9DRkJfVVBEQVRFKGJmcywgYykgeyBcCisgICAgYmZzLT5jZmJfYnVmZmVyW2Jmcy0+dXBkYXRlX29mZnNldF0gXj0gKGNoYXJfdSljOyBcCisgICAgaWYgKCsrYmZzLT51cGRhdGVfb2Zmc2V0ID09IGJmcy0+Y2ZiX2xlbikgXAorCWJmcy0+dXBkYXRlX29mZnNldCA9IDA7IFwKIH0KIAotI2RlZmluZSBCRl9SQU5CWVRFKHQpIHsgXAotICAgIGlmICgocmFuZGJ5dGVfb2Zmc2V0ICYgQkZfQkxPQ0tfTUFTSykgPT0gMCkgXAotCWJmX2VfY2Jsb2NrKCZjZmJfYnVmZmVyW3JhbmRieXRlX29mZnNldF0pOyBcCi0gICAgdCA9IGNmYl9idWZmZXJbcmFuZGJ5dGVfb2Zmc2V0XTsgXAotICAgIGlmICgrK3JhbmRieXRlX29mZnNldCA9PSBCRl9DRkJfTEVOKSBcCi0JcmFuZGJ5dGVfb2Zmc2V0ID0gMDsgXAorI2RlZmluZSBCRl9SQU5CWVRFKGJmcywgdCkgeyBcCisgICAgaWYgKChiZnMtPnJhbmRieXRlX29mZnNldCAmIEJGX0JMT0NLX01BU0spID09IDApIFwKKwliZl9lX2NibG9jayhiZnMsICYoYmZzLT5jZmJfYnVmZmVyW2Jmcy0+cmFuZGJ5dGVfb2Zmc2V0XSkpOyBcCisgICAgdCA9IGJmcy0+Y2ZiX2J1ZmZlcltiZnMtPnJhbmRieXRlX29mZnNldF07IFwKKyAgICBpZiAoKytiZnMtPnJhbmRieXRlX29mZnNldCA9PSBiZnMtPmNmYl9sZW4pIFwKKwliZnMtPnJhbmRieXRlX29mZnNldCA9IDA7IFwKIH0KIAogLyoKQEAgLTU5OCw5MCArNjAyLDY5IEBACiAgKiAiZnJvbSIgYW5kICJ0byIgY2FuIGJlIGVxdWFsIHRvIGVuY3J5cHQgaW4gcGxhY2UuCiAgKi8KICAgICB2b2lkCi1iZl9jcnlwdF9lbmNvZGUoZnJvbSwgbGVuLCB0bykKK2NyeXB0X2Jsb3dmaXNoX2VuY29kZShzdGF0ZSwgZnJvbSwgbGVuLCB0bykKKyAgICBjcnlwdHN0YXRlX1QgKnN0YXRlOwogICAgIGNoYXJfdQkqZnJvbTsKICAgICBzaXplX3QJbGVuOwogICAgIGNoYXJfdQkqdG87CiB7CisgICAgYmZfc3RhdGVfVCAqYmZzID0gc3RhdGUtPm1ldGhvZF9zdGF0ZTsKICAgICBzaXplX3QJaTsKICAgICBpbnQJCXp0ZW1wLCB0OwogCiAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKQogICAgIHsKIAl6dGVtcCA9IGZyb21baV07Ci0JQkZfUkFOQllURSh0KTsKLQlCRl9DRkJfVVBEQVRFKHp0ZW1wKTsKKwlCRl9SQU5CWVRFKGJmcywgdCk7CisJQkZfQ0ZCX1VQREFURShiZnMsIHp0ZW1wKTsKIAl0b1tpXSA9IHQgXiB6dGVtcDsKICAgICB9CiB9CiAKIC8qCi0gKiBEZWNyeXB0ICJwdHJbbGVuXSIgaW4gcGxhY2UuCisgKiBEZWNyeXB0ICJmcm9tW2xlbl0iIGludG8gInRvW2xlbl0iLgogICovCiAgICAgdm9pZAotYmZfY3J5cHRfZGVjb2RlKHB0ciwgbGVuKQotICAgIGNoYXJfdQkqcHRyOwotICAgIGxvbmcJbGVuOworY3J5cHRfYmxvd2Zpc2hfZGVjb2RlKHN0YXRlLCBmcm9tLCBsZW4sIHRvKQorICAgIGNyeXB0c3RhdGVfVCAqc3RhdGU7CisgICAgY2hhcl91CSpmcm9tOworICAgIHNpemVfdAlsZW47CisgICAgY2hhcl91CSp0bzsKIHsKLSAgICBjaGFyX3UJKnA7CisgICAgYmZfc3RhdGVfVCAqYmZzID0gc3RhdGUtPm1ldGhvZF9zdGF0ZTsKKyAgICBzaXplX3QJaTsKICAgICBpbnQJCXQ7CiAKLSAgICBmb3IgKHAgPSBwdHI7IHAgPCBwdHIgKyBsZW47ICsrcCkKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCiAgICAgewotCUJGX1JBTkJZVEUodCk7Ci0JKnAgXj0gdDsKLQlCRl9DRkJfVVBEQVRFKCpwKTsKKwlCRl9SQU5CWVRFKGJmcywgdCk7CisJdG9baV0gPSBmcm9tW2ldIF4gdDsKKwlCRl9DRkJfVVBEQVRFKGJmcywgdG9baV0pOwogICAgIH0KIH0KIAotLyoKLSAqIEluaXRpYWxpemUgdGhlIGVuY3J5cHRpb24ga2V5cyBhbmQgdGhlIHJhbmRvbSBoZWFkZXIgYWNjb3JkaW5nIHRvCi0gKiB0aGUgZ2l2ZW4gcGFzc3dvcmQuCi0gKi8KICAgICB2b2lkCi1iZl9jcnlwdF9pbml0X2tleXMocGFzc3dkKQotICAgIGNoYXJfdSAqcGFzc3dkOwkJLyogcGFzc3dvcmQgc3RyaW5nIHdpdGggd2hpY2ggdG8gbW9kaWZ5IGtleXMgKi8KK2NyeXB0X2Jsb3dmaXNoX2luaXQoc3RhdGUsIGtleSwgc2FsdCwgc2FsdF9sZW4sIHNlZWQsIHNlZWRfbGVuKQorICAgIGNyeXB0c3RhdGVfVAkqc3RhdGU7CisgICAgY2hhcl91KgkJa2V5OworICAgIGNoYXJfdSoJCXNhbHQ7CisgICAgaW50CQkJc2FsdF9sZW47CisgICAgY2hhcl91KgkJc2VlZDsKKyAgICBpbnQJCQlzZWVkX2xlbjsKIHsKLSAgICBjaGFyX3UgKnA7CisgICAgYmZfc3RhdGVfVAkqYmZzID0gKGJmX3N0YXRlX1QgKilhbGxvY19jbGVhcihzaXplb2YoYmZfc3RhdGVfVCkpOwogCi0gICAgZm9yIChwID0gcGFzc3dkOyAqcCAhPSBOVUw7ICsrcCkKLSAgICB7Ci0JQkZfQ0ZCX1VQREFURSgqcCk7Ci0gICAgfQotfQorICAgIHN0YXRlLT5tZXRob2Rfc3RhdGUgPSBiZnM7CiAKLXN0YXRpYyBpbnQgc2F2ZV9yYW5kYnl0ZV9vZmZzZXQ7Ci1zdGF0aWMgaW50IHNhdmVfdXBkYXRlX29mZnNldDsKLXN0YXRpYyBjaGFyX3Ugc2F2ZV9jZmJfYnVmZmVyW0JGX0NGQl9MRU5dOwotc3RhdGljIFVJTlQzMl9UIHNhdmVfcGF4WzE4XTsKLXN0YXRpYyBVSU5UMzJfVCBzYXZlX3NieFs0XVsyNTZdOworICAgIC8qICJibG93ZmlzaCIgdXNlcyBhIDY0IGJ5dGUgYnVmZmVyLCBjYXVzaW5nIGl0IHRvIHJlcGVhdCA4IGJ5dGUgZ3JvdXBzIDgKKyAgICAgKiB0aW1lcy4gICJibG93ZmlzaDIiIHVzZXMgYSA4IGJ5dGUgYnVmZmVyIHRvIGF2b2lkIHJlcGVhdGluZy4gKi8KKyAgICBiZnMtPmNmYl9sZW4gPSBzdGF0ZS0+bWV0aG9kX25yID09IENSWVBUX01fQkYgPyBCRl9NQVhfQ0ZCX0xFTiA6IEJGX0JMT0NLOwogCi0vKgotICogU2F2ZSB0aGUgY3VycmVudCBjcnlwdCBzdGF0ZS4gIENhbiBvbmx5IGJlIHVzZWQgb25jZSBiZWZvcmUKLSAqIGJmX2NyeXB0X3Jlc3RvcmUoKS4KLSAqLwotICAgIHZvaWQKLWJmX2NyeXB0X3NhdmUoKQotewotICAgIHNhdmVfcmFuZGJ5dGVfb2Zmc2V0ID0gcmFuZGJ5dGVfb2Zmc2V0OwotICAgIHNhdmVfdXBkYXRlX29mZnNldCA9IHVwZGF0ZV9vZmZzZXQ7Ci0gICAgbWNoX21lbW1vdmUoc2F2ZV9jZmJfYnVmZmVyLCBjZmJfYnVmZmVyLCBCRl9DRkJfTEVOKTsKLSAgICBtY2hfbWVtbW92ZShzYXZlX3BheCwgcGF4LCA0ICogMTgpOwotICAgIG1jaF9tZW1tb3ZlKHNhdmVfc2J4LCBzYngsIDQgKiA0ICogMjU2KTsKLX0KKyAgICBpZiAoYmxvd2Zpc2hfc2VsZl90ZXN0KCkgPT0gRkFJTCkKKwlyZXR1cm47CiAKLS8qCi0gKiBSZXN0b3JlIHRoZSBjdXJyZW50IGNyeXB0IHN0YXRlLiAgQ2FuIG9ubHkgYmUgdXNlZCBhZnRlcgotICogYmZfY3J5cHRfc2F2ZSgpLgotICovCi0gICAgdm9pZAotYmZfY3J5cHRfcmVzdG9yZSgpCi17Ci0gICAgcmFuZGJ5dGVfb2Zmc2V0ID0gc2F2ZV9yYW5kYnl0ZV9vZmZzZXQ7Ci0gICAgdXBkYXRlX29mZnNldCA9IHNhdmVfdXBkYXRlX29mZnNldDsKLSAgICBtY2hfbWVtbW92ZShjZmJfYnVmZmVyLCBzYXZlX2NmYl9idWZmZXIsIEJGX0NGQl9MRU4pOwotICAgIG1jaF9tZW1tb3ZlKHBheCwgc2F2ZV9wYXgsIDQgKiAxOCk7Ci0gICAgbWNoX21lbW1vdmUoc2J4LCBzYXZlX3NieCwgNCAqIDQgKiAyNTYpOworICAgIGJmX2tleV9pbml0KGJmcywga2V5LCBzYWx0LCBzYWx0X2xlbik7CisgICAgYmZfY2ZiX2luaXQoYmZzLCBzZWVkLCBzZWVkX2xlbik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zcmMvY3J5cHQuYyBiL3NyYy9jcnlwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OGZmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY3J5cHQuYwpAQCAtMCwwICsxLDU4NSBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogY3J5cHQuYzogR2VuZXJpYyBlbmNyeXB0aW9uIHN1cHBvcnQuCisgKi8KKyNpbmNsdWRlICJ2aW0uaCIKKworI2lmIGRlZmluZWQoRkVBVF9DUllQVCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBPcHRpb25hbCBlbmNyeXB0aW9uIHN1cHBvcnQuCisgKiBNb2hzaW4gQWhtZWQsIG1vc2hAc2FzaS5jb20sIDE5OTgtMDktMjQKKyAqIEJhc2VkIG9uIHppcC9jcnlwdCBzb3VyY2VzLgorICogUmVmYWN0b3JlZCBieSBEYXZpZCBMZWFkYmVhdGVyLCAyMDE0LgorICoKKyAqIE5PVEUgRk9SIFVTQTogU2luY2UgMjAwMCBleHBvcnRpbmcgdGhpcyBjb2RlIGZyb20gdGhlIFVTQSBpcyBhbGxvd2VkIHRvCisgKiBtb3N0IGNvdW50cmllcy4gIFRoZXJlIGFyZSBhIGZldyBleGNlcHRpb25zLCBidXQgdGhhdCBzdGlsbCBzaG91bGQgbm90IGJlIGEKKyAqIHByb2JsZW0gc2luY2UgdGhpcyBjb2RlIHdhcyBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4gRXVyb3BlIGFuZCBJbmRpYS4KKyAqCisgKiBCbG93ZmlzaCBhZGRpdGlvbiBvcmlnaW5hbGx5IG1hZGUgYnkgTW9oc2luIEFobWVkLAorICogaHR0cDovL3d3dy5jcy5hbGJhbnkuZWR1L35tb3NoIDIwMTAtMDMtMTQKKyAqIEJhc2VkIG9uIGJsb3dmaXNoIGJ5IEJydWNlIFNjaG5laWVyIChodHRwOi8vd3d3LnNjaG5laWVyLmNvbS9ibG93ZmlzaC5odG1sKQorICogYW5kIHNoYTI1NiBieSBDaHJpc3RvcGhlIERldmluZS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciAgICAqbmFtZTsJLyogZW5jcnlwdGlvbiBuYW1lIGFzIHVzZWQgaW4gJ2NyeXB0bWV0aG9kJyAqLworICAgIGNoYXIgICAgKm1hZ2ljOwkvKiBtYWdpYyBieXRlcyBzdG9yZWQgaW4gZmlsZSBoZWFkZXIgKi8KKyAgICBpbnQJICAgIHNhbHRfbGVuOwkvKiBsZW5ndGggb2Ygc2FsdCwgb3IgMCB3aGVuIG5vdCB1c2luZyBzYWx0ICovCisgICAgaW50CSAgICBzZWVkX2xlbjsJLyogbGVuZ3RoIG9mIHNlZWQsIG9yIDAgd2hlbiBub3QgdXNpbmcgc2FsdCAqLworICAgIGludAkgICAgd29ya3NfaW5wbGFjZTsgLyogZW5jcnlwdGlvbi9kZWNyeXB0aW9uIGNhbiBiZSBkb25lIGluLXBsYWNlICovCisgICAgaW50CSAgICB3aG9sZV91bmRvZmlsZTsgLyogd2hvbGUgdW5kbyBmaWxlIGlzIGVuY3J5cHRlZCAqLworCisgICAgLyogT3B0aW9uYWwgZnVuY3Rpb24gcG9pbnRlciBmb3IgYSBzZWxmLXRlc3QuICovCisgICAgaW50ICgqIHNlbGZfdGVzdF9mbikoKTsKKworICAgIC8qIEZ1bmN0aW9uIHBvaW50ZXIgZm9yIGluaXRpYWxpemluZyBlbmNyeXB0aW9uL2RlY3JpcHRpb24uICovCisgICAgdm9pZCAoKiBpbml0X2ZuKShjcnlwdHN0YXRlX1QgKnN0YXRlLCBjaGFyX3UgKmtleSwKKwkJICAgICAgY2hhcl91ICpzYWx0LCBpbnQgc2FsdF9sZW4sIGNoYXJfdSAqc2VlZCwgaW50IHNlZWRfbGVuKTsKKworICAgIC8qIEZ1bmN0aW9uIHBvaW50ZXJzIGZvciBlbmNvZGluZy9kZWNvZGluZyBmcm9tIG9uZSBidWZmZXIgaW50byBhbm90aGVyLgorICAgICAqIE9wdGlvbmFsLCBob3dldmVyLCB0aGVzZSBvciB0aGUgX2J1ZmZlciBvbmVzIHNob3VsZCBiZSBjb25maWd1cmVkLiAqLworICAgIHZvaWQgKCplbmNvZGVfZm4pKGNyeXB0c3RhdGVfVCAqc3RhdGUsIGNoYXJfdSAqZnJvbSwgc2l6ZV90IGxlbiwKKwkJCQkJCQkJICBjaGFyX3UgKnRvKTsKKyAgICB2b2lkICgqZGVjb2RlX2ZuKShjcnlwdHN0YXRlX1QgKnN0YXRlLCBjaGFyX3UgKmZyb20sIHNpemVfdCBsZW4sCisJCQkJCQkJCSAgY2hhcl91ICp0byk7CisKKyAgICAvKiBGdW5jdGlvbiBwb2ludGVycyBmb3IgZW5jb2RpbmcgYW5kIGRlY29kaW5nLCBjYW4gYnVmZmVyIGRhdGEgaWYgbmVlZGVkLgorICAgICAqIE9wdGlvbmFsIChob3dldmVyLCB0aGVzZSBvciB0aGUgYWJvdmUgc2hvdWxkIGJlIGNvbmZpZ3VyZWQpLiAqLworICAgIGxvbmcgKCplbmNvZGVfYnVmZmVyX2ZuKShjcnlwdHN0YXRlX1QgKnN0YXRlLCBjaGFyX3UgKmZyb20sIHNpemVfdCBsZW4sCisJCQkJCQkJICAgICBjaGFyX3UgKipuZXdwdHIpOworICAgIGxvbmcgKCpkZWNvZGVfYnVmZmVyX2ZuKShjcnlwdHN0YXRlX1QgKnN0YXRlLCBjaGFyX3UgKmZyb20sIHNpemVfdCBsZW4sCisJCQkJCQkJICAgICBjaGFyX3UgKipuZXdwdHIpOworCisgICAgLyogRnVuY3Rpb24gcG9pbnRlcnMgZm9yIGluLXBsYWNlIGVuY29kaW5nIGFuZCBkZWNvZGluZywgdXNlZCBmb3IKKyAgICAgKiBjcnlwdF8qX2lucGxhY2UoKS4gImZyb20iIGFuZCAidG8iIGFyZ3VtZW50cyB3aWxsIGJlIGVxdWFsLgorICAgICAqIFRoZXNlIG1heSBiZSB0aGUgc2FtZSBhcyBkZWNvZGVfZm4gYW5kIGVuY29kZV9mbiBhYm92ZSwgaG93ZXZlciBhbgorICAgICAqIGFsZ29yaXRobSBtYXkgaW1wbGVtZW50IHRoZW0gaW4gYSB3YXkgdGhhdCBpcyBub3QgaW50ZXJjaGFuZ2VhYmxlIHdpdGgKKyAgICAgKiB0aGUgY3J5cHRfKGVufGRlKWNvZGUoKSBpbnRlcmZhY2UgKGZvciBleGFtcGxlIGJlY2F1c2UgaXQgd2lzaGVzIHRvIGFkZAorICAgICAqIHBhZGRpbmcgdG8gZmlsZXMpLgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIHN3YXAgYW5kIHVuZG8gZmlsZXMgd2hpY2ggaGF2ZSBhIHJpZ2lkIGZvcm1hdC4KKyAgICAgKi8KKyAgICB2b2lkICgqZW5jb2RlX2lucGxhY2VfZm4pKGNyeXB0c3RhdGVfVCAqc3RhdGUsIGNoYXJfdSAqcDEsIHNpemVfdCBsZW4sCisJCQkJCQkJCSAgY2hhcl91ICpwMik7CisgICAgdm9pZCAoKmRlY29kZV9pbnBsYWNlX2ZuKShjcnlwdHN0YXRlX1QgKnN0YXRlLCBjaGFyX3UgKnAxLCBzaXplX3QgbGVuLAorCQkJCQkJCQkgIGNoYXJfdSAqcDIpOworfSBjcnlwdG1ldGhvZF9UOworCisvKiBpbmRleCBpcyBtZXRob2RfbnIgb2YgY3J5cHRzdGF0ZV9ULCBDUllQVF9NXyogKi8KK3N0YXRpYyBjcnlwdG1ldGhvZF9UIGNyeXB0bWV0aG9kc1tDUllQVF9NX0NPVU5UXSA9IHsKKyAgICAvKiBQS19aaXA7IHZlcnkgd2VhayAqLworICAgIHsKKwkiemlwIiwKKwkiVmltQ3J5cHR+MDEhIiwKKwkwLAorCTAsCisJVFJVRSwKKwlGQUxTRSwKKwlOVUxMLAorCWNyeXB0X3ppcF9pbml0LAorCWNyeXB0X3ppcF9lbmNvZGUsIGNyeXB0X3ppcF9kZWNvZGUsCisJTlVMTCwgTlVMTCwKKwljcnlwdF96aXBfZW5jb2RlLCBjcnlwdF96aXBfZGVjb2RlLAorICAgIH0sCisKKyAgICAvKiBCbG93ZmlzaC9DRkIgKyBTSEEtMjU2IGN1c3RvbSBrZXkgZGVyaXZhdGlvbjsgaW1wbGVtZW50YXRpb24gaXNzdWVzLiAqLworICAgIHsKKwkiYmxvd2Zpc2giLAorCSJWaW1DcnlwdH4wMiEiLAorCTgsCisJOCwKKwlUUlVFLAorCUZBTFNFLAorCWJsb3dmaXNoX3NlbGZfdGVzdCwKKwljcnlwdF9ibG93ZmlzaF9pbml0LAorCWNyeXB0X2Jsb3dmaXNoX2VuY29kZSwgY3J5cHRfYmxvd2Zpc2hfZGVjb2RlLAorCU5VTEwsIE5VTEwsCisJY3J5cHRfYmxvd2Zpc2hfZW5jb2RlLCBjcnlwdF9ibG93ZmlzaF9kZWNvZGUsCisgICAgfSwKKworICAgIC8qIEJsb3dmaXNoL0NGQiArIFNIQS0yNTYgY3VzdG9tIGtleSBkZXJpdmF0aW9uOyBmaXhlZC4gKi8KKyAgICB7CisJImJsb3dmaXNoMiIsCisJIlZpbUNyeXB0fjAzISIsCisJOCwKKwk4LAorCVRSVUUsCisJVFJVRSwKKwlibG93ZmlzaF9zZWxmX3Rlc3QsCisJY3J5cHRfYmxvd2Zpc2hfaW5pdCwKKwljcnlwdF9ibG93ZmlzaF9lbmNvZGUsIGNyeXB0X2Jsb3dmaXNoX2RlY29kZSwKKwlOVUxMLCBOVUxMLAorCWNyeXB0X2Jsb3dmaXNoX2VuY29kZSwgY3J5cHRfYmxvd2Zpc2hfZGVjb2RlLAorICAgIH0sCit9OworCisjZGVmaW5lIENSWVBUX01BR0lDX0xFTgkxMgkvKiBjYW5ub3QgY2hhbmdlICovCitzdGF0aWMgY2hhcgljcnlwdF9tYWdpY19oZWFkW10gPSAiVmltQ3J5cHR+IjsKKworLyoKKyAqIFJldHVybiBpbnQgdmFsdWUgZm9yIGNyeXB0IG1ldGhvZCBuYW1lLgorICogMCBmb3IgInppcCIsIHRoZSBvbGQgbWV0aG9kLiAgQWxzbyBmb3IgYW55IG5vbi12YWxpZCB2YWx1ZS4KKyAqIDEgZm9yICJibG93ZmlzaCIuCisgKiAyIGZvciAiYmxvd2Zpc2gyIi4KKyAqLworICAgIGludAorY3J5cHRfbWV0aG9kX25yX2Zyb21fbmFtZShuYW1lKQorICAgIGNoYXJfdSAgKm5hbWU7Cit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ1JZUFRfTV9DT1VOVDsgKytpKQorCWlmIChTVFJDTVAobmFtZSwgY3J5cHRtZXRob2RzW2ldLm5hbWUpID09IDApCisJICAgIHJldHVybiBpOworICAgIHJldHVybiAwOworfQorCisvKgorICogR2V0IHRoZSBjcnlwdCBtZXRob2QgdXNlZCBmb3IgYSBmaWxlIGZyb20gInB0cltsZW5dIiwgdGhlIG1hZ2ljIHRleHQgYXQgdGhlCisgKiBzdGFydCBvZiB0aGUgZmlsZS4KKyAqIFJldHVybnMgLTEgd2hlbiBubyBlbmNyeXB0aW9uIHVzZWQuCisgKi8KKyAgICBpbnQKK2NyeXB0X21ldGhvZF9ucl9mcm9tX21hZ2ljKHB0ciwgbGVuKQorICAgIGNoYXIgICpwdHI7CisgICAgaW50ICAgbGVuOworeworICAgIGludCBpOworCisgICAgaWYgKGxlbiA8IENSWVBUX01BR0lDX0xFTikKKwlyZXR1cm4gLTE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ1JZUFRfTV9DT1VOVDsgaSsrKQorCWlmIChtZW1jbXAocHRyLCBjcnlwdG1ldGhvZHNbaV0ubWFnaWMsIENSWVBUX01BR0lDX0xFTikgPT0gMCkKKwkgICAgcmV0dXJuIGk7CisKKyAgICBpID0gKGludClTVFJMRU4oY3J5cHRfbWFnaWNfaGVhZCk7CisgICAgaWYgKGxlbiA+PSBpICYmIG1lbWNtcChwdHIsIGNyeXB0X21hZ2ljX2hlYWQsIGkpID09IDApCisJRU1TRyhfKCJFODIxOiBGaWxlIGlzIGVuY3J5cHRlZCB3aXRoIHVua25vd24gbWV0aG9kIikpOworCisgICAgcmV0dXJuIC0xOworfQorCisvKgorICogUmV0dXJuIFRSVUUgaWYgdGhlIGNyeXB0IG1ldGhvZCBmb3IgIm1ldGhvZF9uciIgY2FuIGJlIGRvbmUgaW4tcGxhY2UuCisgKi8KKyAgICBpbnQKK2NyeXB0X3dvcmtzX2lucGxhY2Uoc3RhdGUpCisgICAgY3J5cHRzdGF0ZV9UICpzdGF0ZTsKK3sKKyAgICByZXR1cm4gY3J5cHRtZXRob2RzW3N0YXRlLT5tZXRob2RfbnJdLndvcmtzX2lucGxhY2U7Cit9CisKKy8qCisgKiBHZXQgdGhlIGNyeXB0IG1ldGhvZCBmb3IgYnVmZmVyICJidWYiIGFzIGEgbnVtYmVyLgorICovCisgICAgaW50CitjcnlwdF9nZXRfbWV0aG9kX25yKGJ1ZikKKyAgICBidWZfVCAqYnVmOworeworICAgIHJldHVybiBjcnlwdF9tZXRob2RfbnJfZnJvbV9uYW1lKCpidWYtPmJfcF9jbSA9PSBOVUwgPyBwX2NtIDogYnVmLT5iX3BfY20pOworfQorCisvKgorICogUmV0dXJuIFRSVUUgd2hlbiB0aGUgYnVmZmVyIHVzZXMgYW4gZW5jcnlwdGlvbiBtZXRob2QgdGhhdCBlbmNyeXB0cyB0aGUKKyAqIHdob2xlIHVuZG8gZmlsZSwgbm90IG9ubHkgdGhlIHRleHQuCisgKi8KKyAgICBpbnQKK2NyeXB0X3dob2xlX3VuZG9maWxlKG1ldGhvZF9ucikKKyAgICBpbnQgbWV0aG9kX25yOworeworICAgIHJldHVybiBjcnlwdG1ldGhvZHNbbWV0aG9kX25yXS53aG9sZV91bmRvZmlsZTsKK30KKworLyoKKyAqIEdldCBjcnlwdCBtZXRob2Qgc3BlY2lmYyBsZW5ndGggb2YgdGhlIGZpbGUgaGVhZGVyIGluIGJ5dGVzLgorICovCisgICAgaW50CitjcnlwdF9nZXRfaGVhZGVyX2xlbihtZXRob2RfbnIpCisgICAgaW50IG1ldGhvZF9ucjsKK3sKKyAgICByZXR1cm4gQ1JZUFRfTUFHSUNfTEVOCisJKyBjcnlwdG1ldGhvZHNbbWV0aG9kX25yXS5zYWx0X2xlbgorCSsgY3J5cHRtZXRob2RzW21ldGhvZF9ucl0uc2VlZF9sZW47Cit9CisKKy8qCisgKiBTZXQgdGhlIGNyeXB0IG1ldGhvZCBmb3IgYnVmZmVyICJidWYiIHRvICJtZXRob2RfbnIiIHVzaW5nIHRoZSBpbnQgdmFsdWUgYXMKKyAqIHJldHVybmVkIGJ5IGNyeXB0X21ldGhvZF9ucl9mcm9tX25hbWUoKS4KKyAqLworICAgIHZvaWQKK2NyeXB0X3NldF9jbV9vcHRpb24oYnVmLCBtZXRob2RfbnIpCisgICAgYnVmX1QgICAqYnVmOworICAgIGludAkgICAgbWV0aG9kX25yOworeworICAgIGZyZWVfc3RyaW5nX29wdGlvbihidWYtPmJfcF9jbSk7CisgICAgYnVmLT5iX3BfY20gPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopY3J5cHRtZXRob2RzW21ldGhvZF9ucl0ubmFtZSk7Cit9CisKKy8qCisgKiBJZiB0aGUgY3J5cHQgbWV0aG9kIGZvciB0aGUgY3VycmVudCBidWZmZXIgaGFzIGEgc2VsZi10ZXN0LCBydW4gaXQgYW5kCisgKiByZXR1cm4gT0svRkFJTC4KKyAqLworICAgIGludAorY3J5cHRfc2VsZl90ZXN0KCkKK3sKKyAgICBpbnQgbWV0aG9kX25yID0gY3J5cHRfZ2V0X21ldGhvZF9ucihjdXJidWYpOworCisgICAgaWYgKGNyeXB0bWV0aG9kc1ttZXRob2RfbnJdLnNlbGZfdGVzdF9mbiA9PSBOVUxMKQorCXJldHVybiBPSzsKKyAgICByZXR1cm4gY3J5cHRtZXRob2RzW21ldGhvZF9ucl0uc2VsZl90ZXN0X2ZuKCk7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIGNyeXB0IHN0YXRlIGFuZCBpbml0aWFsaXplIGl0LgorICovCisgICAgY3J5cHRzdGF0ZV9UICoKK2NyeXB0X2NyZWF0ZShtZXRob2RfbnIsIGtleSwgc2FsdCwgc2FsdF9sZW4sIHNlZWQsIHNlZWRfbGVuKQorICAgIGludAkJbWV0aG9kX25yOworICAgIGNoYXJfdQkqa2V5OworICAgIGNoYXJfdQkqc2FsdDsKKyAgICBpbnQJCXNhbHRfbGVuOworICAgIGNoYXJfdQkqc2VlZDsKKyAgICBpbnQJCXNlZWRfbGVuOworeworICAgIGNyeXB0c3RhdGVfVCAqc3RhdGUgPSAoY3J5cHRzdGF0ZV9UICopYWxsb2MoKGludClzaXplb2YoY3J5cHRzdGF0ZV9UKSk7CisKKyAgICBzdGF0ZS0+bWV0aG9kX25yID0gbWV0aG9kX25yOworICAgIGNyeXB0bWV0aG9kc1ttZXRob2RfbnJdLmluaXRfZm4oc3RhdGUsIGtleSwgc2FsdCwgc2FsdF9sZW4sIHNlZWQsIHNlZWRfbGVuKTsKKyAgICByZXR1cm4gc3RhdGU7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIGNyeXB0IHN0YXRlIGZyb20gYSBmaWxlIGhlYWRlciBhbmQgaW5pdGlhbGl6ZSBpdC4KKyAqIEFzc3VtZXMgdGhhdCBoZWFkZXIgY29udGFpbnMgYXQgbGVhc3QgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0CisgKiBjcnlwdF9nZXRfaGVhZGVyX2xlbigpIHJldHVybnMgZm9yICJtZXRob2RfbnIiLgorICovCisgICAgY3J5cHRzdGF0ZV9UICoKK2NyeXB0X2NyZWF0ZV9mcm9tX2hlYWRlcihtZXRob2RfbnIsIGtleSwgaGVhZGVyKQorICAgIGludAkJbWV0aG9kX25yOworICAgIGNoYXJfdQkqa2V5OworICAgIGNoYXJfdQkqaGVhZGVyOworeworICAgIGNoYXJfdQkqc2FsdCA9IE5VTEw7CisgICAgY2hhcl91CSpzZWVkID0gTlVMTDsKKyAgICBpbnQJCXNhbHRfbGVuID0gY3J5cHRtZXRob2RzW21ldGhvZF9ucl0uc2FsdF9sZW47CisgICAgaW50CQlzZWVkX2xlbiA9IGNyeXB0bWV0aG9kc1ttZXRob2RfbnJdLnNlZWRfbGVuOworCisgICAgaWYgKHNhbHRfbGVuID4gMCkKKwlzYWx0ID0gaGVhZGVyICsgQ1JZUFRfTUFHSUNfTEVOOworICAgIGlmIChzZWVkX2xlbiA+IDApCisJc2VlZCA9IGhlYWRlciArIENSWVBUX01BR0lDX0xFTiArIHNhbHRfbGVuOworCisgICAgcmV0dXJuIGNyeXB0X2NyZWF0ZShtZXRob2RfbnIsIGtleSwgc2FsdCwgc2FsdF9sZW4sIHNlZWQsIHNlZWRfbGVuKTsKK30KKworLyoKKyAqIFJlYWQgdGhlIGNyeXB0IG1ldGhvZCBzcGVjaWZpYyBoZWFkZXIgZGF0YSBmcm9tICJmcCIuCisgKiBSZXR1cm4gYW4gYWxsb2NhdGVkIGNyeXB0c3RhdGVfVCBvciBOVUxMIG9uIGVycm9yLgorICovCisgICAgY3J5cHRzdGF0ZV9UICoKK2NyeXB0X2NyZWF0ZV9mcm9tX2ZpbGUoZnAsIGtleSkKKyAgICBGSUxFICAgICpmcDsKKyAgICBjaGFyX3UgICprZXk7Cit7CisgICAgaW50CQltZXRob2RfbnI7CisgICAgaW50CQloZWFkZXJfbGVuOworICAgIGNoYXIJbWFnaWNfYnVmZmVyW0NSWVBUX01BR0lDX0xFTl07CisgICAgY2hhcl91CSpidWZmZXI7CisgICAgY3J5cHRzdGF0ZV9UICpzdGF0ZTsKKworICAgIGlmIChmcmVhZChtYWdpY19idWZmZXIsIENSWVBUX01BR0lDX0xFTiwgMSwgZnApICE9IDEpCisJcmV0dXJuIE5VTEw7CisgICAgbWV0aG9kX25yID0gY3J5cHRfbWV0aG9kX25yX2Zyb21fbWFnaWMobWFnaWNfYnVmZmVyLCBDUllQVF9NQUdJQ19MRU4pOworICAgIGlmIChtZXRob2RfbnIgPCAwKQorCXJldHVybiBOVUxMOworCisgICAgaGVhZGVyX2xlbiA9IGNyeXB0X2dldF9oZWFkZXJfbGVuKG1ldGhvZF9ucik7CisgICAgaWYgKChidWZmZXIgPSBhbGxvYyhoZWFkZXJfbGVuKSkgPT0gTlVMTCkKKwlyZXR1cm4gTlVMTDsKKyAgICBtY2hfbWVtbW92ZShidWZmZXIsIG1hZ2ljX2J1ZmZlciwgQ1JZUFRfTUFHSUNfTEVOKTsKKyAgICBpZiAoaGVhZGVyX2xlbiA+IENSWVBUX01BR0lDX0xFTgorCSAgICAmJiBmcmVhZChidWZmZXIgKyBDUllQVF9NQUdJQ19MRU4sCisJCQkJICAgIGhlYWRlcl9sZW4gLSBDUllQVF9NQUdJQ19MRU4sIDEsIGZwKSAhPSAxKQorICAgIHsKKwl2aW1fZnJlZShidWZmZXIpOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIHN0YXRlID0gY3J5cHRfY3JlYXRlX2Zyb21faGVhZGVyKG1ldGhvZF9uciwga2V5LCBidWZmZXIpOworICAgIHZpbV9mcmVlKGJ1ZmZlcik7CisgICAgcmV0dXJuIHN0YXRlOworfQorCisvKgorICogQWxsb2NhdGUgYSBjcnlwdHN0YXRlX1QgZm9yIHdyaXRpbmcgYW5kIGluaXRpYWxpemUgaXQgd2l0aCAia2V5Ii4KKyAqIEFsbG9jYXRlcyBhbmQgZmlsbHMgaW4gdGhlIGhlYWRlciBhbmQgc3RvcmVzIGl0IGluICJoZWFkZXIiLCBzZXR0aW5nCisgKiAiaGVhZGVyX2xlbiIuICBUaGUgaGVhZGVyIG1heSBpbmNsdWRlIHNhbHQgYW5kIHNlZWQsIGRlcGVuZGluZyBvbgorICogY3J5cHRtZXRob2QuICBDYWxsZXIgbXVzdCBmcmVlIGhlYWRlci4KKyAqIFJldHVybnMgdGhlIHN0YXRlIG9yIE5VTEwgb24gZmFpbHVyZS4KKyAqLworICAgIGNyeXB0c3RhdGVfVCAqCitjcnlwdF9jcmVhdGVfZm9yX3dyaXRpbmcobWV0aG9kX25yLCBrZXksIGhlYWRlciwgaGVhZGVyX2xlbikKKyAgICBpbnQJICAgIG1ldGhvZF9ucjsKKyAgICBjaGFyX3UgICprZXk7CisgICAgY2hhcl91ICAqKmhlYWRlcjsKKyAgICBpbnQJICAgICpoZWFkZXJfbGVuOworeworICAgIGludAkgICAgbGVuID0gY3J5cHRfZ2V0X2hlYWRlcl9sZW4obWV0aG9kX25yKTsKKyAgICBjaGFyX3UgICpzYWx0ID0gTlVMTDsKKyAgICBjaGFyX3UgICpzZWVkID0gTlVMTDsKKyAgICBpbnQJICAgIHNhbHRfbGVuID0gY3J5cHRtZXRob2RzW21ldGhvZF9ucl0uc2FsdF9sZW47CisgICAgaW50CSAgICBzZWVkX2xlbiA9IGNyeXB0bWV0aG9kc1ttZXRob2RfbnJdLnNlZWRfbGVuOworICAgIGNyeXB0c3RhdGVfVCAqc3RhdGU7CisKKyAgICAqaGVhZGVyX2xlbiA9IGxlbjsKKyAgICAqaGVhZGVyID0gYWxsb2MobGVuKTsKKyAgICBpZiAoKmhlYWRlciA9PSBOVUxMKQorCXJldHVybiBOVUxMOworCisgICAgbWNoX21lbW1vdmUoKmhlYWRlciwgY3J5cHRtZXRob2RzW21ldGhvZF9ucl0ubWFnaWMsIENSWVBUX01BR0lDX0xFTik7CisgICAgaWYgKHNhbHRfbGVuID4gMCB8fCBzZWVkX2xlbiA+IDApCisgICAgeworCWlmIChzYWx0X2xlbiA+IDApCisJICAgIHNhbHQgPSAqaGVhZGVyICsgQ1JZUFRfTUFHSUNfTEVOOworCWlmIChzZWVkX2xlbiA+IDApCisJICAgIHNlZWQgPSAqaGVhZGVyICsgQ1JZUFRfTUFHSUNfTEVOICsgc2FsdF9sZW47CisKKwkvKiBUT0RPOiBTaG91bGQgdGhpcyBiZSBjcnlwdCBtZXRob2Qgc3BlY2lmaWM/IChQcm9iYWJseSBub3Qgd29ydGgKKwkgKiBpdCkuICBzaGEyX3NlZWQgaXMgcHJldHR5IGJhZCBmb3IgbGFyZ2UgYW1vdW50cyBvZiBlbnRyb3B5LCBzbyBtYWtlCisJICogdGhhdCBpbnRvIHNvbWV0aGluZyB3aGljaCBpcyBzdWl0YWJsZSBmb3IgYW55dGhpbmcuICovCisJc2hhMl9zZWVkKHNhbHQsIHNhbHRfbGVuLCBzZWVkLCBzZWVkX2xlbik7CisgICAgfQorCisgICAgc3RhdGUgPSBjcnlwdF9jcmVhdGUobWV0aG9kX25yLCBrZXksIHNhbHQsIHNhbHRfbGVuLCBzZWVkLCBzZWVkX2xlbik7CisgICAgaWYgKHN0YXRlID09IE5VTEwpCisgICAgeworCXZpbV9mcmVlKCpoZWFkZXIpOworCSpoZWFkZXIgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gc3RhdGU7Cit9CisKKy8qCisgKiBGcmVlIHRoZSBjcnlwdCBzdGF0ZS4KKyAqLworICAgIHZvaWQKK2NyeXB0X2ZyZWVfc3RhdGUoc3RhdGUpCisgICAgY3J5cHRzdGF0ZV9UCSpzdGF0ZTsKK3sKKyAgICB2aW1fZnJlZShzdGF0ZS0+bWV0aG9kX3N0YXRlKTsKKyAgICB2aW1fZnJlZShzdGF0ZSk7Cit9CisKKy8qCisgKiBFbmNvZGUgImZyb21bbGVuXSIgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gYSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLCB3aGljaAorICogaXMgc3RvcmVkIGluICJuZXdwdHIiLgorICogUmV0dXJuIG51bWJlciBvZiBieXRlcyBpbiAibmV3cHRyIiwgMCBmb3IgbmVlZCBtb3JlIG9yIC0xIG9uIGVycm9yLgorICovCisgICAgbG9uZworY3J5cHRfZW5jb2RlX2FsbG9jKHN0YXRlLCBmcm9tLCBsZW4sIG5ld3B0cikKKyAgICBjcnlwdHN0YXRlX1QgKnN0YXRlOworICAgIGNoYXJfdQkqZnJvbTsKKyAgICBzaXplX3QJbGVuOworICAgIGNoYXJfdQkqKm5ld3B0cjsKK3sKKyAgICBjcnlwdG1ldGhvZF9UICptZXRob2QgPSAmY3J5cHRtZXRob2RzW3N0YXRlLT5tZXRob2RfbnJdOworCisgICAgaWYgKG1ldGhvZC0+ZW5jb2RlX2J1ZmZlcl9mbiAhPSBOVUxMKQorCS8qIEhhcyBidWZmZXIgZnVuY3Rpb24sIHBhc3MgdGhyb3VnaC4gKi8KKwlyZXR1cm4gbWV0aG9kLT5lbmNvZGVfYnVmZmVyX2ZuKHN0YXRlLCBmcm9tLCBsZW4sIG5ld3B0cik7CisgICAgaWYgKGxlbiA9PSAwKQorCS8qIE5vdCBidWZmZXJpbmcsIGp1c3QgcmV0dXJuIEVPRi4gKi8KKwlyZXR1cm4gbGVuOworCisgICAgKm5ld3B0ciA9IGFsbG9jKGxlbik7CisgICAgaWYgKCpuZXdwdHIgPT0gTlVMTCkKKwlyZXR1cm4gLTE7CisgICAgbWV0aG9kLT5lbmNvZGVfZm4oc3RhdGUsIGZyb20sIGxlbiwgKm5ld3B0cik7CisgICAgcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIERlY3J5cHQgInB0cltsZW5dIiBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiBhIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIsIHdoaWNoCisgKiBpcyBzdG9yZWQgaW4gIm5ld3B0ciIuCisgKiBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGluICJuZXdwdHIiLCAwIGZvciBuZWVkIG1vcmUgb3IgLTEgb24gZXJyb3IuCisgKi8KKyAgICBsb25nCitjcnlwdF9kZWNvZGVfYWxsb2Moc3RhdGUsIHB0ciwgbGVuLCBuZXdwdHIpCisgICAgY3J5cHRzdGF0ZV9UICpzdGF0ZTsKKyAgICBjaGFyX3UJKnB0cjsKKyAgICBsb25nCWxlbjsKKyAgICBjaGFyX3UgICAgICAqKm5ld3B0cjsKK3sKKyAgICBjcnlwdG1ldGhvZF9UICptZXRob2QgPSAmY3J5cHRtZXRob2RzW3N0YXRlLT5tZXRob2RfbnJdOworCisgICAgaWYgKG1ldGhvZC0+ZGVjb2RlX2J1ZmZlcl9mbiAhPSBOVUxMKQorCS8qIEhhcyBidWZmZXIgZnVuY3Rpb24sIHBhc3MgdGhyb3VnaC4gKi8KKwlyZXR1cm4gbWV0aG9kLT5kZWNvZGVfYnVmZmVyX2ZuKHN0YXRlLCBwdHIsIGxlbiwgbmV3cHRyKTsKKworICAgIGlmIChsZW4gPT0gMCkKKwkvKiBOb3QgYnVmZmVyaW5nLCBqdXN0IHJldHVybiBFT0YuICovCisJcmV0dXJuIGxlbjsKKworICAgICpuZXdwdHIgPSBhbGxvYyhsZW4pOworICAgIGlmICgqbmV3cHRyID09IE5VTEwpCisJcmV0dXJuIC0xOworICAgIG1ldGhvZC0+ZGVjb2RlX2ZuKHN0YXRlLCBwdHIsIGxlbiwgKm5ld3B0cik7CisgICAgcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIEVuY3J5cHRpbmcgImZyb21bbGVuXSIgaW50byAidG9bbGVuXSIuCisgKi8KKyAgICB2b2lkCitjcnlwdF9lbmNvZGUoc3RhdGUsIGZyb20sIGxlbiwgdG8pCisgICAgY3J5cHRzdGF0ZV9UICpzdGF0ZTsKKyAgICBjaGFyX3UJKmZyb207CisgICAgc2l6ZV90CWxlbjsKKyAgICBjaGFyX3UJKnRvOworeworICAgIGNyeXB0bWV0aG9kc1tzdGF0ZS0+bWV0aG9kX25yXS5lbmNvZGVfZm4oc3RhdGUsIGZyb20sIGxlbiwgdG8pOworfQorCisvKgorICogZGVjcnlwdGluZyAiZnJvbVtsZW5dIiBpbnRvICJ0b1tsZW5dIi4KKyAqLworICAgIHZvaWQKK2NyeXB0X2RlY29kZShzdGF0ZSwgZnJvbSwgbGVuLCB0bykKKyAgICBjcnlwdHN0YXRlX1QgKnN0YXRlOworICAgIGNoYXJfdQkqZnJvbTsKKyAgICBzaXplX3QJbGVuOworICAgIGNoYXJfdQkqdG87Cit7CisgICAgY3J5cHRtZXRob2RzW3N0YXRlLT5tZXRob2RfbnJdLmRlY29kZV9mbihzdGF0ZSwgZnJvbSwgbGVuLCB0byk7Cit9CisKKy8qCisgKiBTaW1wbGUgaW5wbGFjZSBlbmNyeXB0aW9uLCBtb2RpZmllcyAiYnVmW2xlbl0iIGluIHBsYWNlLgorICovCisgICAgdm9pZAorY3J5cHRfZW5jb2RlX2lucGxhY2Uoc3RhdGUsIGJ1ZiwgbGVuKQorICAgIGNyeXB0c3RhdGVfVCAqc3RhdGU7CisgICAgY2hhcl91CSpidWY7CisgICAgc2l6ZV90CWxlbjsKK3sKKyAgICBjcnlwdG1ldGhvZHNbc3RhdGUtPm1ldGhvZF9ucl0uZW5jb2RlX2lucGxhY2VfZm4oc3RhdGUsIGJ1ZiwgbGVuLCBidWYpOworfQorCisvKgorICogU2ltcGxlIGlucGxhY2UgZGVjcnlwdGlvbiwgbW9kaWZpZXMgImJ1ZltsZW5dIiBpbiBwbGFjZS4KKyAqLworICAgIHZvaWQKK2NyeXB0X2RlY29kZV9pbnBsYWNlKHN0YXRlLCBidWYsIGxlbikKKyAgICBjcnlwdHN0YXRlX1QgKnN0YXRlOworICAgIGNoYXJfdQkqYnVmOworICAgIHNpemVfdAlsZW47Cit7CisgICAgY3J5cHRtZXRob2RzW3N0YXRlLT5tZXRob2RfbnJdLmRlY29kZV9pbnBsYWNlX2ZuKHN0YXRlLCBidWYsIGxlbiwgYnVmKTsKK30KKworLyoKKyAqIEZyZWUgYW4gYWxsb2NhdGVkIGNyeXB0IGtleS4gIENsZWFyIHRoZSB0ZXh0IHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IHN0YXkKKyAqIGluIG1lbW9yeSBhbnl3aGVyZS4KKyAqLworICAgIHZvaWQKK2NyeXB0X2ZyZWVfa2V5KGtleSkKKyAgICBjaGFyX3UgKmtleTsKK3sKKyAgICBjaGFyX3UgKnA7CisKKyAgICBpZiAoa2V5ICE9IE5VTEwpCisgICAgeworCWZvciAocCA9IGtleTsgKnAgIT0gTlVMOyArK3ApCisJICAgICpwID0gMDsKKwl2aW1fZnJlZShrZXkpOworICAgIH0KK30KKworLyoKKyAqIEFzayB0aGUgdXNlciBmb3IgYSBjcnlwdCBrZXkuCisgKiBXaGVuICJzdG9yZSIgaXMgVFJVRSwgdGhlIG5ldyBrZXkgaXMgc3RvcmVkIGluIHRoZSAna2V5JyBvcHRpb24sIGFuZCB0aGUKKyAqICdrZXknIG9wdGlvbiB2YWx1ZSBpcyByZXR1cm5lZDogRG9uJ3QgZnJlZSBpdC4KKyAqIFdoZW4gInN0b3JlIiBpcyBGQUxTRSwgdGhlIHR5cGVkIGtleSBpcyByZXR1cm5lZCBpbiBhbGxvY2F0ZWQgbWVtb3J5LgorICogUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuCisgKi8KKyAgICBjaGFyX3UgKgorY3J5cHRfZ2V0X2tleShzdG9yZSwgdHdpY2UpCisgICAgaW50CQlzdG9yZTsKKyAgICBpbnQJCXR3aWNlOwkgICAgLyogQXNrIGZvciB0aGUga2V5IHR3aWNlLiAqLworeworICAgIGNoYXJfdQkqcDEsICpwMiA9IE5VTEw7CisgICAgaW50CQlyb3VuZDsKKworICAgIGZvciAocm91bmQgPSAwOyA7ICsrcm91bmQpCisgICAgeworCWNtZGxpbmVfc3RhciA9IFRSVUU7CisJY21kbGluZV9yb3cgPSBtc2dfcm93OworCXAxID0gZ2V0Y21kbGluZV9wcm9tcHQoTlVMLCByb3VuZCA9PSAwCisJCT8gKGNoYXJfdSAqKV8oIkVudGVyIGVuY3J5cHRpb24ga2V5OiAiKQorCQk6IChjaGFyX3UgKilfKCJFbnRlciBzYW1lIGtleSBhZ2FpbjogIiksIDAsIEVYUEFORF9OT1RISU5HLAorCQlOVUxMKTsKKwljbWRsaW5lX3N0YXIgPSBGQUxTRTsKKworCWlmIChwMSA9PSBOVUxMKQorCSAgICBicmVhazsKKworCWlmIChyb3VuZCA9PSB0d2ljZSkKKwl7CisJICAgIGlmIChwMiAhPSBOVUxMICYmIFNUUkNNUChwMSwgcDIpICE9IDApCisJICAgIHsKKwkJTVNHKF8oIktleXMgZG9uJ3QgbWF0Y2ghIikpOworCQljcnlwdF9mcmVlX2tleShwMSk7CisJCWNyeXB0X2ZyZWVfa2V5KHAyKTsKKwkJcDIgPSBOVUxMOworCQlyb3VuZCA9IC0xOwkJLyogZG8gaXQgYWdhaW4gKi8KKwkJY29udGludWU7CisJICAgIH0KKworCSAgICBpZiAoc3RvcmUpCisJICAgIHsKKwkJc2V0X29wdGlvbl92YWx1ZSgoY2hhcl91ICopImtleSIsIDBMLCBwMSwgT1BUX0xPQ0FMKTsKKwkJY3J5cHRfZnJlZV9rZXkocDEpOworCQlwMSA9IGN1cmJ1Zi0+Yl9wX2tleTsKKwkgICAgfQorCSAgICBicmVhazsKKwl9CisJcDIgPSBwMTsKKyAgICB9CisKKyAgICAvKiBzaW5jZSB0aGUgdXNlciB0eXBlZCB0aGlzLCBubyBuZWVkIHRvIHdhaXQgZm9yIHJldHVybiAqLworICAgIGlmIChtc2dfZGlkb3V0KQorCW1zZ19wdXRjaGFyKCdcbicpOworICAgIG5lZWRfd2FpdF9yZXR1cm4gPSBGQUxTRTsKKyAgICBtc2dfZGlkb3V0ID0gRkFMU0U7CisKKyAgICBjcnlwdF9mcmVlX2tleShwMik7CisgICAgcmV0dXJuIHAxOworfQorCisKKy8qCisgKiBBcHBlbmQgYSBtZXNzYWdlIHRvIElPYnVmZiBmb3IgdGhlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBtZXRob2QgYmVpbmcgdXNlZC4KKyAqLworICAgIHZvaWQKK2NyeXB0X2FwcGVuZF9tc2coYnVmKQorICAgIGJ1Zl9UICpidWY7Cit7CisgICAgaWYgKGNyeXB0X2dldF9tZXRob2RfbnIoYnVmKSA9PSAwKQorCVNUUkNBVChJT2J1ZmYsIF8oIltjcnlwdGVkXSIpKTsKKyAgICBlbHNlCisgICAgeworCVNUUkNBVChJT2J1ZmYsICJbIik7CisJU1RSQ0FUKElPYnVmZiwgKmJ1Zi0+Yl9wX2NtID09IE5VTCA/IHBfY20gOiBidWYtPmJfcF9jbSk7CisJU1RSQ0FUKElPYnVmZiwgIl0iKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBGRUFUX0NSWVBUICovCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRfemlwLmMgYi9zcmMvY3J5cHRfemlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcxZjNlYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdF96aXAuYwpAQCAtMCwwICsxLDE1OCBAQAorLyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKKyAqCisgKiBWSU0gLSBWaSBJTXByb3ZlZAlieSBCcmFtIE1vb2xlbmFhcgorICoKKyAqIERvICI6aGVscCB1Z2FuZGEiICBpbiBWaW0gdG8gcmVhZCBjb3B5aW5nIGFuZCB1c2FnZSBjb25kaXRpb25zLgorICogRG8gIjpoZWxwIGNyZWRpdHMiIGluIFZpbSB0byBzZWUgYSBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQuCisgKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KKyAqLworCisvKgorICogY3J5cHRfemlwLmM6IFppcCBlbmNyeXB0aW9uIHN1cHBvcnQuCisgKi8KKyNpbmNsdWRlICJ2aW0uaCIKKworI2lmIGRlZmluZWQoRkVBVF9DUllQVCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBPcHRpb25hbCBlbmNyeXB0aW9uIHN1cHBvcnQuCisgKiBNb2hzaW4gQWhtZWQsIG1vc2hAc2FzaS5jb20sIDk4LTA5LTI0CisgKiBCYXNlZCBvbiB6aXAvY3J5cHQgc291cmNlcy4KKyAqCisgKiBOT1RFIEZPUiBVU0E6IFNpbmNlIDIwMDAgZXhwb3J0aW5nIHRoaXMgY29kZSBmcm9tIHRoZSBVU0EgaXMgYWxsb3dlZCB0bworICogbW9zdCBjb3VudHJpZXMuICBUaGVyZSBhcmUgYSBmZXcgZXhjZXB0aW9ucywgYnV0IHRoYXQgc3RpbGwgc2hvdWxkIG5vdCBiZSBhCisgKiBwcm9ibGVtIHNpbmNlIHRoaXMgY29kZSB3YXMgb3JpZ2luYWxseSBjcmVhdGVkIGluIEV1cm9wZSBhbmQgSW5kaWEuCisgKi8KKworLyogTmVlZCBhIHR5cGUgdGhhdCBzaG91bGQgYmUgMzIgYml0cy4gNjQgYWxzbyB3b3JrcyBidXQgd2FzdGVzIHNwYWNlLiAqLworIyBpZiBWSU1fU0laRU9GX0lOVCA+PSA0Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1MzJfVDsJLyogaW50IGlzIGF0IGxlYXN0IDMyIGJpdHMgKi8KKyMgZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIHUzMl9UOwkvKiBsb25nIHNob3VsZCBiZSAzMiBiaXRzIG9yIG1vcmUgKi8KKyMgZW5kaWYKKworLyogVGhlIHN0YXRlIG9mIGVuY3J5cHRpb24sIHJlZmVyZW5jZWQgYnkgY3J5cHRzdGF0ZV9ULiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHUzMl9UIGtleXNbM107Cit9IHppcF9zdGF0ZV9UOworCisKK3N0YXRpYyB2b2lkIG1ha2VfY3JjX3RhYiBfX0FSR1MoKHZvaWQpKTsKKworc3RhdGljIHUzMl9UIGNyY18zMl90YWJsZVsyNTZdOworCisvKgorICogRmlsbCB0aGUgQ1JDIHRhYmxlLCBpZiBub3QgZG9uZSBhbHJlYWR5LgorICovCisgICAgc3RhdGljIHZvaWQKK21ha2VfY3JjX3RhYigpCit7CisgICAgdTMyX1QJcywgdCwgdjsKKyAgICBzdGF0aWMgaW50CWRvbmUgPSBGQUxTRTsKKworICAgIGlmIChkb25lKQorCXJldHVybjsKKyAgICBmb3IgKHQgPSAwOyB0IDwgMjU2OyB0KyspCisgICAgeworCXYgPSB0OworCWZvciAocyA9IDA7IHMgPCA4OyBzKyspCisJICAgIHYgPSAodiA+PiAxKSBeICgodiAmIDEpICogKHUzMl9UKTB4ZWRiODgzMjBMKTsKKwljcmNfMzJfdGFibGVbdF0gPSB2OworICAgIH0KKyAgICBkb25lID0gVFJVRTsKK30KKworI2RlZmluZSBDUkMzMihjLCBiKSAoY3JjXzMyX3RhYmxlWygoaW50KShjKSBeIChiKSkgJiAweGZmXSBeICgoYykgPj4gOCkpCisKKy8qCisgKiBSZXR1cm4gdGhlIG5leHQgYnl0ZSBpbiB0aGUgcHNldWRvLXJhbmRvbSBzZXF1ZW5jZS4KKyAqLworI2RlZmluZSBERUNSWVBUX0JZVEVfWklQKGtleXMsIHQpIHsgXAorICAgIHNob3J0X3UgdGVtcCA9IChzaG9ydF91KWtleXNbMl0gfCAyOyBcCisgICAgdCA9IChpbnQpKCgodW5zaWduZWQpKHRlbXAgKiAodGVtcCBeIDFVKSkgPj4gOCkgJiAweGZmKTsgXAorfQorCisvKgorICogVXBkYXRlIHRoZSBlbmNyeXB0aW9uIGtleXMgd2l0aCB0aGUgbmV4dCBieXRlIG9mIHBsYWluIHRleHQuCisgKi8KKyNkZWZpbmUgVVBEQVRFX0tFWVNfWklQKGtleXMsIGMpIHsgXAorICAgIGtleXNbMF0gPSBDUkMzMihrZXlzWzBdLCAoYykpOyBcCisgICAga2V5c1sxXSArPSBrZXlzWzBdICYgMHhmZjsgXAorICAgIGtleXNbMV0gPSBrZXlzWzFdICogMTM0Nzc1ODEzTCArIDE7IFwKKyAgICBrZXlzWzJdID0gQ1JDMzIoa2V5c1syXSwgKGludCkoa2V5c1sxXSA+PiAyNCkpOyBcCit9CisKKy8qCisgKiBJbml0aWFsaXplIGZvciBlbmNyeXB0aW9uL2RlY3J5cHRpb24uCisgKi8KKyAgICB2b2lkCitjcnlwdF96aXBfaW5pdChzdGF0ZSwga2V5LCBzYWx0LCBzYWx0X2xlbiwgc2VlZCwgc2VlZF9sZW4pCisgICAgY3J5cHRzdGF0ZV9UICAgICpzdGF0ZTsKKyAgICBjaGFyX3UJICAgICprZXk7CisgICAgY2hhcl91CSAgICAqc2FsdCBVTlVTRUQ7CisgICAgaW50CQkgICAgc2FsdF9sZW4gVU5VU0VEOworICAgIGNoYXJfdQkgICAgKnNlZWQgVU5VU0VEOworICAgIGludAkJICAgIHNlZWRfbGVuIFVOVVNFRDsKK3sKKyAgICBjaGFyX3UJKnA7CisgICAgemlwX3N0YXRlX1QJKnpzOworCisgICAgenMgPSAoemlwX3N0YXRlX1QgKilhbGxvYyhzaXplb2YoemlwX3N0YXRlX1QpKTsKKyAgICBzdGF0ZS0+bWV0aG9kX3N0YXRlID0genM7CisKKyAgICBtYWtlX2NyY190YWIoKTsKKyAgICB6cy0+a2V5c1swXSA9IDMwNTQxOTg5Nkw7CisgICAgenMtPmtleXNbMV0gPSA1OTE3NTEwNDlMOworICAgIHpzLT5rZXlzWzJdID0gODc4MDgyMTkyTDsKKyAgICBmb3IgKHAgPSBrZXk7ICpwICE9IE5VTDsgKytwKQorICAgIHsKKwlVUERBVEVfS0VZU19aSVAoenMtPmtleXMsIChpbnQpKnApOworICAgIH0KK30KKworLyoKKyAqIEVuY3J5cHQgImZyb21bbGVuXSIgaW50byAidG9bbGVuXSIuCisgKiAiZnJvbSIgYW5kICJ0byIgY2FuIGJlIGVxdWFsIHRvIGVuY3J5cHQgaW4gcGxhY2UuCisgKi8KKyAgICB2b2lkCitjcnlwdF96aXBfZW5jb2RlKHN0YXRlLCBmcm9tLCBsZW4sIHRvKQorICAgIGNyeXB0c3RhdGVfVCAqc3RhdGU7CisgICAgY2hhcl91CSpmcm9tOworICAgIHNpemVfdAlsZW47CisgICAgY2hhcl91CSp0bzsKK3sKKyAgICB6aXBfc3RhdGVfVCAqenMgPSBzdGF0ZS0+bWV0aG9kX3N0YXRlOworICAgIHNpemVfdAlpOworICAgIGludAkJenRlbXAsIHQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisgICAgeworCXp0ZW1wID0gZnJvbVtpXTsKKwlERUNSWVBUX0JZVEVfWklQKHpzLT5rZXlzLCB0KTsKKwlVUERBVEVfS0VZU19aSVAoenMtPmtleXMsIHp0ZW1wKTsKKwl0b1tpXSA9IHQgXiB6dGVtcDsKKyAgICB9Cit9CisKKy8qCisgKiBEZWNyeXB0ICJmcm9tW2xlbl0iIGludG8gInRvW2xlbl0iLgorICovCisgICAgdm9pZAorY3J5cHRfemlwX2RlY29kZShzdGF0ZSwgZnJvbSwgbGVuLCB0bykKKyAgICBjcnlwdHN0YXRlX1QgKnN0YXRlOworICAgIGNoYXJfdQkqZnJvbTsKKyAgICBzaXplX3QJbGVuOworICAgIGNoYXJfdQkqdG87Cit7CisgICAgemlwX3N0YXRlX1QgKnpzID0gc3RhdGUtPm1ldGhvZF9zdGF0ZTsKKyAgICBzaXplX3QJaTsKKyAgICBzaG9ydF91CXRlbXA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisgICAgeworCXRlbXAgPSAoc2hvcnRfdSl6cy0+a2V5c1syXSB8IDI7CisJdGVtcCA9IChpbnQpKCgodW5zaWduZWQpKHRlbXAgKiAodGVtcCBeIDFVKSkgPj4gOCkgJiAweGZmKTsKKwlVUERBVEVfS0VZU19aSVAoenMtPmtleXMsIHRvW2ldID0gZnJvbVtpXSBeIHRlbXApOworICAgIH0KK30KKworI2VuZGlmIC8qIEZFQVRfQ1JZUFQgKi8KZGlmZiAtLWdpdCBhL3NyYy9leF9kb2NtZC5jIGIvc3JjL2V4X2RvY21kLmMKaW5kZXggYmE3NjRiZi4uZmVjYjY1MyAxMDA2NDQKLS0tIGEvc3JjL2V4X2RvY21kLmMKKysrIGIvc3JjL2V4X2RvY21kLmMKQEAgLTExNTA2LDggKzExNTA2LDcgQEAKIGV4X1goZWFwKQogICAgIGV4YXJnX1QJKmVhcCBVTlVTRUQ7CiB7Ci0gICAgaWYgKGdldF9jcnlwdF9tZXRob2QoY3VyYnVmKSA9PSAwIHx8IGJsb3dmaXNoX3NlbGZfdGVzdCgpID09IE9LKQotCSh2b2lkKWdldF9jcnlwdF9rZXkoVFJVRSwgVFJVRSk7CisgICAgKHZvaWQpY3J5cHRfZ2V0X2tleShUUlVFLCBUUlVFKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9zcmMvZmlsZWlvLmMgYi9zcmMvZmlsZWlvLmMKaW5kZXggMzhkYzI1OS4uYTAyOGIyMiAxMDA2NDQKLS0tIGEvc3JjL2ZpbGVpby5jCisrKyBiL3NyYy9maWxlaW8uYwpAQCAtMjQsMjAgKzI0LDYgQEAKICNkZWZpbmUgQlVGU0laRQkJODE5MgkvKiBzaXplIG9mIG5vcm1hbCB3cml0ZSBidWZmZXIgKi8KICNkZWZpbmUgU01CVUZTSVpFCTI1NgkvKiBzaXplIG9mIGVtZXJnZW5jeSB3cml0ZSBidWZmZXIgKi8KIAotI2lmZGVmIEZFQVRfQ1JZUFQKLS8qIGNyeXB0X21hZ2ljWzBdIGlzIHBremlwIGNyeXB0LCBjcnlwdF9tYWdpY1sxXSBpcyBzaGEyK2Jsb3dmaXNoICovCi1zdGF0aWMgY2hhcgkqY3J5cHRfbWFnaWNbXSA9IHsiVmltQ3J5cHR+MDEhIiwgIlZpbUNyeXB0fjAyISJ9Owotc3RhdGljIGNoYXIJY3J5cHRfbWFnaWNfaGVhZFtdID0gIlZpbUNyeXB0fiI7Ci0jIGRlZmluZSBDUllQVF9NQUdJQ19MRU4JMTIJCS8qIG11c3QgYmUgbXVsdGlwbGUgb2YgNCEgKi8KLQotLyogRm9yIGJsb3dmaXNoLCBhZnRlciB0aGUgbWFnaWMgaGVhZGVyLCB3ZSBzdG9yZSA4IGJ5dGVzIG9mIHNhbHQgYW5kIHRoZW4gOAotICogYnl0ZXMgb2Ygc2VlZCAoaW5pdGlhbGlzYXRpb24gdmVjdG9yKS4gKi8KLXN0YXRpYyBpbnQJY3J5cHRfc2FsdF9sZW5bXSA9IHswLCA4fTsKLXN0YXRpYyBpbnQJY3J5cHRfc2VlZF9sZW5bXSA9IHswLCA4fTsKLSNkZWZpbmUgQ1JZUFRfU0FMVF9MRU5fTUFYIDgKLSNkZWZpbmUgQ1JZUFRfU0VFRF9MRU5fTUFYIDgKLSNlbmRpZgotCiAvKiBJcyB0aGVyZSBhbnkgc3lzdGVtIHRoYXQgZG9lc24ndCBoYXZlIGFjY2VzcygpPyAqLwogI2RlZmluZSBVU0VfTUNIX0FDQ0VTUwogCkBAIC01NSw3ICs0MSw2IEBACiBzdGF0aWMgdm9pZCBjaGVja19tYXJrc19yZWFkIF9fQVJHUygodm9pZCkpOwogI2VuZGlmCiAjaWZkZWYgRkVBVF9DUllQVAotc3RhdGljIGludCBjcnlwdF9tZXRob2RfZnJvbV9tYWdpYyBfX0FSR1MoKGNoYXIgKnB0ciwgaW50IGxlbikpOwogc3RhdGljIGNoYXJfdSAqY2hlY2tfZm9yX2NyeXB0a2V5IF9fQVJHUygoY2hhcl91ICpjcnlwdGtleSwgY2hhcl91ICpwdHIsIGxvbmcgKnNpemVwLCBvZmZfdCAqZmlsZXNpemVwLCBpbnQgbmV3ZmlsZSwgY2hhcl91ICpmbmFtZSwgaW50ICpkaWRfYXNrKSk7CiAjZW5kaWYKICNpZmRlZiBVTklYCkBAIC0xMTYsNiArMTAxLDkgQEAKICNpZmRlZiBIQVNfQldfRkxBR1MKICAgICBpbnQJCWJ3X2ZsYWdzOwkvKiBGSU9fIGZsYWdzICovCiAjZW5kaWYKKyNpZmRlZiBGRUFUX0NSWVBUCisgICAgYnVmX1QJKmJ3X2J1ZmZlcjsJLyogYnVmZmVyIGJlaW5nIHdyaXR0ZW4gKi8KKyNlbmRpZgogI2lmZGVmIEZFQVRfTUJZVEUKICAgICBjaGFyX3UJYndfcmVzdFtDT05WX1JFU1RMRU5dOyAvKiBub3QgY29udmVydGVkIGJ5dGVzICovCiAgICAgaW50CQlid19yZXN0bGVuOwkvKiBuciBvZiBieXRlcyBpbiBid19yZXN0W10gKi8KQEAgLTI1MCw3ICsyMzgsNiBAQAogI2lmZGVmIEZFQVRfQ1JZUFQKICAgICBjaGFyX3UJKmNyeXB0a2V5ID0gTlVMTDsKICAgICBpbnQJCWRpZF9hc2tfZm9yX2tleSA9IEZBTFNFOwotICAgIGludAkJY3J5cHRfbWV0aG9kX3VzZWQ7CiAjZW5kaWYKICNpZmRlZiBGRUFUX1BFUlNJU1RFTlRfVU5ETwogICAgIGNvbnRleHRfc2hhMjU2X1Qgc2hhX2N0eDsKQEAgLTk2NiwxMyArOTUzLDYgQEAKICNlbmRpZgogICAgIH0KIAotI2lmZGVmIEZFQVRfQ1JZUFQKLSAgICBpZiAoY3J5cHRrZXkgIT0gTlVMTCkKLQkvKiBOZWVkIHRvIHJlc2V0IHRoZSBzdGF0ZSwgYnV0IGtlZXAgdGhlIGtleSwgZG9uJ3Qgd2FudCB0byBhc2sgZm9yIGl0Ci0JICogYWdhaW4uICovCi0JY3J5cHRfcG9wX3N0YXRlKCk7Ci0jZW5kaWYKLQogICAgIC8qCiAgICAgICogV2hlbiByZXRyeWluZyB3aXRoIGFub3RoZXIgImZlbmMiIGFuZCB0aGUgZmlyc3QgdGltZSAiZmlsZWZvcm1hdCIKICAgICAgKiB3aWxsIGJlIHJlc2V0LgpAQCAtMTE3NSw2ICsxMTU1LDE1IEBACiAJaWYgKHJlYWRfdW5kb19maWxlKQogCSAgICBzaGEyNTZfc3RhcnQoJnNoYV9jdHgpOwogI2VuZGlmCisjaWZkZWYgRkVBVF9DUllQVAorCWlmIChjdXJidWYtPmJfY3J5cHRzdGF0ZSAhPSBOVUxMKQorCXsKKwkgICAgLyogTmVlZCB0byBmcmVlIHRoZSBzdGF0ZSwgYnV0IGtlZXAgdGhlIGtleSwgZG9uJ3Qgd2FudCB0byBhc2sgZm9yCisJICAgICAqIGl0IGFnYWluLiAqLworCSAgICBjcnlwdF9mcmVlX3N0YXRlKGN1cmJ1Zi0+Yl9jcnlwdHN0YXRlKTsKKwkgICAgY3VyYnVmLT5iX2NyeXB0c3RhdGUgPSBOVUxMOworCX0KKyNlbmRpZgogICAgIH0KIAogICAgIHdoaWxlICghZXJyb3IgJiYgIWdvdF9pbnQpCkBAIC0xMzM5LDYgKzEzMjgsNzYgQEAKIAkJICAgIHNpemUgPSByZWFkX2VpbnRyKGZkLCBwdHIsIHNpemUpOwogCQl9CiAKKyNpZmRlZiBGRUFUX0NSWVBUCisJCS8qCisJCSAqIEF0IHN0YXJ0IG9mIGZpbGU6IENoZWNrIGZvciBtYWdpYyBudW1iZXIgb2YgZW5jcnlwdGlvbi4KKwkJICovCisJCWlmIChmaWxlc2l6ZSA9PSAwICYmIHNpemUgPiAwKQorCQkgICAgY3J5cHRrZXkgPSBjaGVja19mb3JfY3J5cHRrZXkoY3J5cHRrZXksIHB0ciwgJnNpemUsCisJCQkJCQkgICZmaWxlc2l6ZSwgbmV3ZmlsZSwgc2ZuYW1lLAorCQkJCQkJICAmZGlkX2Fza19mb3Jfa2V5KTsKKwkJLyoKKwkJICogRGVjcnlwdCB0aGUgcmVhZCBieXRlcy4gIFRoaXMgaXMgZG9uZSBiZWZvcmUgY2hlY2tpbmcgZm9yCisJCSAqIEVPRiBiZWNhdXNlIHRoZSBjcnlwdCBsYXllciBtYXkgYmUgYnVmZmVyaW5nLgorCQkgKi8KKwkJaWYgKGNyeXB0a2V5ICE9IE5VTEwgJiYgc2l6ZSA+IDApCisJCXsKKwkJICAgIGlmIChjcnlwdF93b3Jrc19pbnBsYWNlKGN1cmJ1Zi0+Yl9jcnlwdHN0YXRlKSkKKwkJICAgIHsKKwkJCWNyeXB0X2RlY29kZV9pbnBsYWNlKGN1cmJ1Zi0+Yl9jcnlwdHN0YXRlLCBwdHIsIHNpemUpOworCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJY2hhcl91CSpuZXdwdHIgPSBOVUxMOworCQkJaW50CWRlY3J5cHRlZF9zaXplOworCisJCQlkZWNyeXB0ZWRfc2l6ZSA9IGNyeXB0X2RlY29kZV9hbGxvYygKKwkJCQkgICAgY3VyYnVmLT5iX2NyeXB0c3RhdGUsIHB0ciwgc2l6ZSwgJm5ld3B0cik7CisKKwkJCS8qIElmIHRoZSBjcnlwdCBsYXllciBpcyBidWZmZXJpbmcsIG5vdCBwcm9kdWNpbmcKKwkJCSAqIGFueXRoaW5nIHlldCwgbmVlZCB0byByZWFkIG1vcmUuICovCisJCQlpZiAoc2l6ZSA+IDAgJiYgZGVjcnlwdGVkX3NpemUgPT0gMCkKKwkJCSAgICBjb250aW51ZTsKKworCQkJaWYgKGxpbmVyZXN0ID09IDApCisJCQl7CisJCQkgICAgLyogU2ltcGxlIGNhc2U6IHJldXNlIHJldHVybmVkIGJ1ZmZlciAobWF5IGJlCisJCQkgICAgICogTlVMTCwgY2hlY2tlZCBsYXRlcikuICovCisJCQkgICAgbmV3X2J1ZmZlciA9IG5ld3B0cjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCSAgICBsb25nX3UJbmV3X3NpemU7CisKKwkJCSAgICAvKiBOZWVkIG5ldyBidWZmZXIgdG8gYWRkIGJ5dGVzIGNhcnJpZWQgb3Zlci4gKi8KKwkJCSAgICBuZXdfc2l6ZSA9IChsb25nX3UpKGRlY3J5cHRlZF9zaXplICsgbGluZXJlc3QgKyAxKTsKKwkJCSAgICBuZXdfYnVmZmVyID0gbGFsbG9jKG5ld19zaXplLCBGQUxTRSk7CisJCQkgICAgaWYgKG5ld19idWZmZXIgPT0gTlVMTCkKKwkJCSAgICB7CisJCQkJZG9fb3V0b2ZtZW1fbXNnKG5ld19zaXplKTsKKwkJCQllcnJvciA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQkgICAgfQorCisJCQkgICAgbWNoX21lbW1vdmUobmV3X2J1ZmZlciwgYnVmZmVyLCBsaW5lcmVzdCk7CisJCQkgICAgaWYgKG5ld3B0ciAhPSBOVUxMKQorCQkJCW1jaF9tZW1tb3ZlKG5ld19idWZmZXIgKyBsaW5lcmVzdCwgbmV3cHRyLAorCQkJCQkJCSAgICAgIGRlY3J5cHRlZF9zaXplKTsKKwkJCX0KKworCQkJaWYgKG5ld19idWZmZXIgIT0gTlVMTCkKKwkJCXsKKwkJCSAgICB2aW1fZnJlZShidWZmZXIpOworCQkJICAgIGJ1ZmZlciA9IG5ld19idWZmZXI7CisJCQkgICAgbmV3X2J1ZmZlciA9IE5VTEw7CisJCQkgICAgbGluZV9zdGFydCA9IGJ1ZmZlcjsKKwkJCSAgICBwdHIgPSBidWZmZXIgKyBsaW5lcmVzdDsKKwkJCX0KKwkJCXNpemUgPSBkZWNyeXB0ZWRfc2l6ZTsKKwkJICAgIH0KKwkJfQorI2VuZGlmCisKIAkJaWYgKHNpemUgPD0gMCkKIAkJewogCQkgICAgaWYgKHNpemUgPCAwKQkJICAgIC8qIHJlYWQgZXJyb3IgKi8KQEAgLTE0MDMsMjEgKzE0NjIsNiBAQAogCQkgICAgfQogI2VuZGlmCiAJCX0KLQotI2lmZGVmIEZFQVRfQ1JZUFQKLQkJLyoKLQkJICogQXQgc3RhcnQgb2YgZmlsZTogQ2hlY2sgZm9yIG1hZ2ljIG51bWJlciBvZiBlbmNyeXB0aW9uLgotCQkgKi8KLQkJaWYgKGZpbGVzaXplID09IDApCi0JCSAgICBjcnlwdGtleSA9IGNoZWNrX2Zvcl9jcnlwdGtleShjcnlwdGtleSwgcHRyLCAmc2l6ZSwKLQkJCQkJJmZpbGVzaXplLCBuZXdmaWxlLCBzZm5hbWUsCi0JCQkJCSZkaWRfYXNrX2Zvcl9rZXkpOwotCQkvKgotCQkgKiBEZWNyeXB0IHRoZSByZWFkIGJ5dGVzLgotCQkgKi8KLQkJaWYgKGNyeXB0a2V5ICE9IE5VTEwgJiYgc2l6ZSA+IDApCi0JCSAgICBjcnlwdF9kZWNvZGUocHRyLCBzaXplKTsKLSNlbmRpZgogCSAgICB9CiAJICAgIHNraXBfcmVhZCA9IEZBTFNFOwogCkBAIC0xNDMwLDEwICsxNDc0LDkgQEAKIAkgICAgICovCiAJICAgIGlmICgoZmlsZXNpemUgPT0gMAogIyBpZmRlZiBGRUFUX0NSWVBUCi0JCSAgIHx8IChmaWxlc2l6ZSA9PSAoQ1JZUFRfTUFHSUNfTEVOCi0JCQkJCSAgICsgY3J5cHRfc2FsdF9sZW5bdXNlX2NyeXB0X21ldGhvZF0KLQkJCQkJICAgKyBjcnlwdF9zZWVkX2xlblt1c2VfY3J5cHRfbWV0aG9kXSkKLQkJCQkJCQkgICYmIGNyeXB0a2V5ICE9IE5VTEwpCisJCSAgIHx8IChjcnlwdGtleSAhPSBOVUxMCisJCQkmJiBmaWxlc2l6ZSA9PSBjcnlwdF9nZXRfaGVhZGVyX2xlbigKKwkJCQkJCSBjcnlwdF9nZXRfbWV0aG9kX25yKGN1cmJ1ZikpKQogIyBlbmRpZgogCQkgICAgICAgKQogCQkgICAgJiYgKGZpb19mbGFncyA9PSBGSU9fVUNTQk9NCkBAIC0yMjYyLDE1ICsyMzA1LDE1IEBACiAJc2F2ZV9maWxlX2ZmKGN1cmJ1Zik7CQkvKiByZW1lbWJlciB0aGUgY3VycmVudCBmaWxlIGZvcm1hdCAqLwogCiAjaWZkZWYgRkVBVF9DUllQVAotICAgIGNyeXB0X21ldGhvZF91c2VkID0gdXNlX2NyeXB0X21ldGhvZDsKLSAgICBpZiAoY3J5cHRrZXkgIT0gTlVMTCkKKyAgICBpZiAoY3VyYnVmLT5iX2NyeXB0c3RhdGUgIT0gTlVMTCkKICAgICB7Ci0JY3J5cHRfcG9wX3N0YXRlKCk7Ci0JaWYgKGNyeXB0a2V5ICE9IGN1cmJ1Zi0+Yl9wX2tleSkKLQkgICAgZnJlZV9jcnlwdF9rZXkoY3J5cHRrZXkpOwotCS8qIGRvbid0IHNldCBjcnlwdGtleSB0byBOVUxMLCBpdCdzIHVzZWQgYmVsb3cgYXMgYSBmbGFnIHRoYXQKLQkgKiBlbmNyeXB0aW9uIHdhcyB1c2VkICovCisJY3J5cHRfZnJlZV9zdGF0ZShjdXJidWYtPmJfY3J5cHRzdGF0ZSk7CisJY3VyYnVmLT5iX2NyeXB0c3RhdGUgPSBOVUxMOwogICAgIH0KKyAgICBpZiAoY3J5cHRrZXkgIT0gTlVMTCAmJiBjcnlwdGtleSAhPSBjdXJidWYtPmJfcF9rZXkpCisJY3J5cHRfZnJlZV9rZXkoY3J5cHRrZXkpOworICAgIC8qIERvbid0IHNldCBjcnlwdGtleSB0byBOVUxMLCBpdCdzIHVzZWQgYmVsb3cgYXMgYSBmbGFnIHRoYXQKKyAgICAgKiBlbmNyeXB0aW9uIHdhcyB1c2VkLiAqLwogI2VuZGlmCiAKICNpZmRlZiBGRUFUX01CWVRFCkBAIC0yNDU3LDEwICsyNTAwLDcgQEAKICNpZmRlZiBGRUFUX0NSWVBUCiAJICAgIGlmIChjcnlwdGtleSAhPSBOVUxMKQogCSAgICB7Ci0JCWlmIChjcnlwdF9tZXRob2RfdXNlZCA9PSAxKQotCQkgICAgU1RSQ0FUKElPYnVmZiwgXygiW2Jsb3dmaXNoXSIpKTsKLQkJZWxzZQotCQkgICAgU1RSQ0FUKElPYnVmZiwgXygiW2NyeXB0ZWRdIikpOworCQljcnlwdF9hcHBlbmRfbXNnKGN1cmJ1Zik7CiAJCWMgPSBUUlVFOwogCSAgICB9CiAjZW5kaWYKQEAgLTI0ODksOSArMjUyOSw3IEBACiAjaWZkZWYgRkVBVF9DUllQVAogCSAgICBpZiAoY3J5cHRrZXkgIT0gTlVMTCkKIAkJbXNnX2FkZF9saW5lcyhjLCAobG9uZylsaW5lY250LCBmaWxlc2l6ZQotCQkJLSBDUllQVF9NQUdJQ19MRU4KLQkJCS0gY3J5cHRfc2FsdF9sZW5bdXNlX2NyeXB0X21ldGhvZF0KLQkJCS0gY3J5cHRfc2VlZF9sZW5bdXNlX2NyeXB0X21ldGhvZF0pOworCQkJIC0gY3J5cHRfZ2V0X2hlYWRlcl9sZW4oY3J5cHRfZ2V0X21ldGhvZF9ucihjdXJidWYpKSk7CiAJICAgIGVsc2UKICNlbmRpZgogCQltc2dfYWRkX2xpbmVzKGMsIChsb25nKWxpbmVjbnQsIGZpbGVzaXplKTsKQEAgLTI4ODIsMzMgKzI5MjAsNiBAQAogCiAjaWYgZGVmaW5lZChGRUFUX0NSWVBUKSB8fCBkZWZpbmVkKFBST1RPKQogLyoKLSAqIEdldCB0aGUgY3J5cHQgbWV0aG9kIHVzZWQgZm9yIGEgZmlsZSBmcm9tICJwdHJbbGVuXSIsIHRoZSBtYWdpYyB0ZXh0IGF0IHRoZQotICogc3RhcnQgb2YgdGhlIGZpbGUuCi0gKiBSZXR1cm5zIC0xIHdoZW4gbm8gZW5jcnlwdGlvbiB1c2VkLgotICovCi0gICAgc3RhdGljIGludAotY3J5cHRfbWV0aG9kX2Zyb21fbWFnaWMocHRyLCBsZW4pCi0gICAgY2hhciAgKnB0cjsKLSAgICBpbnQgICBsZW47Ci17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkoc2l6ZW9mKGNyeXB0X21hZ2ljKSAvIHNpemVvZihjcnlwdF9tYWdpY1swXSkpOyBpKyspCi0gICAgewotCWlmIChsZW4gPCAoQ1JZUFRfTUFHSUNfTEVOICsgY3J5cHRfc2FsdF9sZW5baV0gKyBjcnlwdF9zZWVkX2xlbltpXSkpCi0JICAgIGNvbnRpbnVlOwotCWlmIChtZW1jbXAocHRyLCBjcnlwdF9tYWdpY1tpXSwgQ1JZUFRfTUFHSUNfTEVOKSA9PSAwKQotCSAgICByZXR1cm4gaTsKLSAgICB9Ci0KLSAgICBpID0gKGludClTVFJMRU4oY3J5cHRfbWFnaWNfaGVhZCk7Ci0gICAgaWYgKGxlbiA+PSBpICYmIG1lbWNtcChwdHIsIGNyeXB0X21hZ2ljX2hlYWQsIGkpID09IDApCi0JRU1TRyhfKCJFODIxOiBGaWxlIGlzIGVuY3J5cHRlZCB3aXRoIHVua25vd24gbWV0aG9kIikpOwotCi0gICAgcmV0dXJuIC0xOwotfQotCi0vKgogICogQ2hlY2sgZm9yIG1hZ2ljIG51bWJlciB1c2VkIGZvciBlbmNyeXB0aW9uLiAgQXBwbGllcyB0byB0aGUgY3VycmVudCBidWZmZXIuCiAgKiBJZiBmb3VuZCwgdGhlIG1hZ2ljIG51bWJlciBpcyByZW1vdmVkIGZyb20gcHRyWypzaXplcF0gYW5kICpzaXplcCBhbmQKICAqICpmaWxlc2l6ZXAgYXJlIHVwZGF0ZWQuCkBAIC0yOTI0LDcgKzI5MzUsNyBAQAogICAgIGNoYXJfdQkqZm5hbWU7CQkvKiBmaWxlIG5hbWUgdG8gZGlzcGxheSAqLwogICAgIGludAkJKmRpZF9hc2s7CS8qIGZsYWc6IHdoZXRoZXIgYWxyZWFkeSBhc2tlZCBmb3Iga2V5ICovCiB7Ci0gICAgaW50IG1ldGhvZCA9IGNyeXB0X21ldGhvZF9mcm9tX21hZ2ljKChjaGFyICopcHRyLCAqc2l6ZXApOworICAgIGludCBtZXRob2QgPSBjcnlwdF9tZXRob2RfbnJfZnJvbV9tYWdpYygoY2hhciAqKXB0ciwgKnNpemVwKTsKICAgICBpbnQgYl9wX3JvID0gY3VyYnVmLT5iX3Bfcm87CiAKICAgICBpZiAobWV0aG9kID49IDApCkBAIC0yOTMzLDkgKzI5NDQsNyBAQAogCSAqIEF2b2lkcyBhY2NpZGVudGFsbHkgb3ZlcndyaXRpbmcgdGhlIGZpbGUgd2l0aCBnYXJiYWdlLiAqLwogCWN1cmJ1Zi0+Yl9wX3JvID0gVFJVRTsKIAotCXNldF9jcnlwdF9tZXRob2QoY3VyYnVmLCBtZXRob2QpOwotCWlmIChtZXRob2QgPiAwKQotCSAgICAodm9pZClibG93ZmlzaF9zZWxmX3Rlc3QoKTsKKwljcnlwdF9zZXRfY21fb3B0aW9uKGN1cmJ1ZiwgbWV0aG9kKTsKIAlpZiAoY3J5cHRrZXkgPT0gTlVMTCAmJiAhKmRpZF9hc2spCiAJewogCSAgICBpZiAoKmN1cmJ1Zi0+Yl9wX2tleSkKQEAgLTI5NDgsNyArMjk1Nyw3IEBACiAJCSAqIEhhcHBlbnMgd2hlbiByZXRyeWluZyB0byBkZXRlY3QgZW5jb2RpbmcuICovCiAJCXNtc2coKGNoYXJfdSAqKV8obmVlZF9rZXlfbXNnKSwgZm5hbWUpOwogCQltc2dfc2Nyb2xsID0gVFJVRTsKLQkJY3J5cHRrZXkgPSBnZXRfY3J5cHRfa2V5KG5ld2ZpbGUsIEZBTFNFKTsKKwkJY3J5cHRrZXkgPSBjcnlwdF9nZXRfa2V5KG5ld2ZpbGUsIEZBTFNFKTsKIAkJKmRpZF9hc2sgPSBUUlVFOwogCiAJCS8qIGNoZWNrIGlmIGVtcHR5IGtleSBlbnRlcmVkICovCkBAIC0yOTYzLDI0ICsyOTcyLDE4IEBACiAKIAlpZiAoY3J5cHRrZXkgIT0gTlVMTCkKIAl7Ci0JICAgIGludCBzZWVkX2xlbiA9IGNyeXB0X3NlZWRfbGVuW21ldGhvZF07Ci0JICAgIGludCBzYWx0X2xlbiA9IGNyeXB0X3NhbHRfbGVuW21ldGhvZF07CisJICAgIGludCBoZWFkZXJfbGVuOwogCi0JICAgIGNyeXB0X3B1c2hfc3RhdGUoKTsKLQkgICAgdXNlX2NyeXB0X21ldGhvZCA9IG1ldGhvZDsKLQkgICAgaWYgKG1ldGhvZCA9PSAwKQotCQljcnlwdF9pbml0X2tleXMoY3J5cHRrZXkpOwotCSAgICBlbHNlCi0JICAgIHsKLQkJYmZfa2V5X2luaXQoY3J5cHRrZXksIHB0ciArIENSWVBUX01BR0lDX0xFTiwgc2FsdF9sZW4pOwotCQliZl9jZmJfaW5pdChwdHIgKyBDUllQVF9NQUdJQ19MRU4gKyBzYWx0X2xlbiwgc2VlZF9sZW4pOwotCSAgICB9CisJICAgIGN1cmJ1Zi0+Yl9jcnlwdHN0YXRlID0gY3J5cHRfY3JlYXRlX2Zyb21faGVhZGVyKAorCQkJCQkJICAgICAgIG1ldGhvZCwgY3J5cHRrZXksIHB0cik7CisJICAgIGNyeXB0X3NldF9jbV9vcHRpb24oY3VyYnVmLCBtZXRob2QpOwogCi0JICAgIC8qIFJlbW92ZSBtYWdpYyBudW1iZXIgZnJvbSB0aGUgdGV4dCAqLwotCSAgICAqZmlsZXNpemVwICs9IENSWVBUX01BR0lDX0xFTiArIHNhbHRfbGVuICsgc2VlZF9sZW47Ci0JICAgICpzaXplcCAtPSBDUllQVF9NQUdJQ19MRU4gKyBzYWx0X2xlbiArIHNlZWRfbGVuOwotCSAgICBtY2hfbWVtbW92ZShwdHIsIHB0ciArIENSWVBUX01BR0lDX0xFTiArIHNhbHRfbGVuICsgc2VlZF9sZW4sCi0JCQkJCQkJICAgICAgKHNpemVfdCkqc2l6ZXApOworCSAgICAvKiBSZW1vdmUgY3J5cHRtZXRob2Qgc3BlY2lmaWMgaGVhZGVyIGZyb20gdGhlIHRleHQuICovCisJICAgIGhlYWRlcl9sZW4gPSBjcnlwdF9nZXRfaGVhZGVyX2xlbihtZXRob2QpOworCSAgICAqZmlsZXNpemVwICs9IGhlYWRlcl9sZW47CisJICAgICpzaXplcCAtPSBoZWFkZXJfbGVuOworCSAgICBtY2hfbWVtbW92ZShwdHIsIHB0ciArIGhlYWRlcl9sZW4sIChzaXplX3QpKnNpemVwKTsKKwogCSAgICAvKiBSZXN0b3JlIHRoZSByZWFkLW9ubHkgZmxhZy4gKi8KIAkgICAgY3VyYnVmLT5iX3Bfcm8gPSBiX3Bfcm87CiAJfQpAQCAtMjk5Miw4NSArMjk5NSw2IEBACiAKICAgICByZXR1cm4gY3J5cHRrZXk7CiB9Ci0KLS8qCi0gKiBDaGVjayBmb3IgbWFnaWMgbnVtYmVyIHVzZWQgZm9yIGVuY3J5cHRpb24uICBBcHBsaWVzIHRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KLSAqIElmIGZvdW5kIGFuZCBkZWNyeXB0aW9uIGlzIHBvc3NpYmxlIHJldHVybnMgT0s7Ci0gKi8KLSAgICBpbnQKLXByZXBhcmVfY3J5cHRfcmVhZChmcCkKLSAgICBGSUxFCSpmcDsKLXsKLSAgICBpbnQJCW1ldGhvZDsKLSAgICBjaGFyX3UJYnVmZmVyW0NSWVBUX01BR0lDX0xFTiArIENSWVBUX1NBTFRfTEVOX01BWAotCQkJCQkJICAgICsgQ1JZUFRfU0VFRF9MRU5fTUFYICsgMl07Ci0KLSAgICBpZiAoZnJlYWQoYnVmZmVyLCBDUllQVF9NQUdJQ19MRU4sIDEsIGZwKSAhPSAxKQotCXJldHVybiBGQUlMOwotICAgIG1ldGhvZCA9IGNyeXB0X21ldGhvZF9mcm9tX21hZ2ljKChjaGFyICopYnVmZmVyLAotCQkJCQlDUllQVF9NQUdJQ19MRU4gKwotCQkJCQlDUllQVF9TRUVEX0xFTl9NQVggKwotCQkJCQlDUllQVF9TQUxUX0xFTl9NQVgpOwotICAgIGlmIChtZXRob2QgPCAwIHx8IG1ldGhvZCAhPSBnZXRfY3J5cHRfbWV0aG9kKGN1cmJ1ZikpCi0JcmV0dXJuIEZBSUw7Ci0KLSAgICBjcnlwdF9wdXNoX3N0YXRlKCk7Ci0gICAgaWYgKG1ldGhvZCA9PSAwKQotCWNyeXB0X2luaXRfa2V5cyhjdXJidWYtPmJfcF9rZXkpOwotICAgIGVsc2UKLSAgICB7Ci0JaW50IHNhbHRfbGVuID0gY3J5cHRfc2FsdF9sZW5bbWV0aG9kXTsKLQlpbnQgc2VlZF9sZW4gPSBjcnlwdF9zZWVkX2xlblttZXRob2RdOwotCi0JaWYgKGZyZWFkKGJ1ZmZlciwgc2FsdF9sZW4gKyBzZWVkX2xlbiwgMSwgZnApICE9IDEpCi0JICAgIHJldHVybiBGQUlMOwotCWJmX2tleV9pbml0KGN1cmJ1Zi0+Yl9wX2tleSwgYnVmZmVyLCBzYWx0X2xlbik7Ci0JYmZfY2ZiX2luaXQoYnVmZmVyICsgc2FsdF9sZW4sIHNlZWRfbGVuKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vKgotICogUHJlcGFyZSBmb3Igd3JpdGluZyBlbmNyeXB0ZWQgYnl0ZXMgZm9yIGJ1ZmZlciAiYnVmIi4KLSAqIFJldHVybnMgYSBwb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBoZWFkZXIgb2YgbGVuZ3RoICIqbGVucCIuCi0gKiBXaGVuIG91dCBvZiBtZW1vcnkgcmV0dXJucyBOVUxMLgotICogT3RoZXJ3aXNlIGNhbGxzIGNyeXB0X3B1c2hfc3RhdGUoKSwgY2FsbCBjcnlwdF9wb3Bfc3RhdGUoKSBsYXRlci4KLSAqLwotICAgIGNoYXJfdSAqCi1wcmVwYXJlX2NyeXB0X3dyaXRlKGJ1ZiwgbGVucCkKLSAgICBidWZfVCAqYnVmOwotICAgIGludCAgICpsZW5wOwotewotICAgIGNoYXJfdSAgKmhlYWRlcjsKLSAgICBpbnQJICAgIHNlZWRfbGVuID0gY3J5cHRfc2VlZF9sZW5bZ2V0X2NyeXB0X21ldGhvZChidWYpXTsKLSAgICBpbnQgICAgIHNhbHRfbGVuID0gY3J5cHRfc2FsdF9sZW5bZ2V0X2NyeXB0X21ldGhvZChidWYpXTsKLSAgICBjaGFyX3UgICpzYWx0OwotICAgIGNoYXJfdSAgKnNlZWQ7Ci0KLSAgICBoZWFkZXIgPSBhbGxvY19jbGVhcihDUllQVF9NQUdJQ19MRU4gKyBDUllQVF9TQUxUX0xFTl9NQVgKLQkJCQkJCSAgICArIENSWVBUX1NFRURfTEVOX01BWCArIDIpOwotICAgIGlmIChoZWFkZXIgIT0gTlVMTCkKLSAgICB7Ci0JY3J5cHRfcHVzaF9zdGF0ZSgpOwotCXVzZV9jcnlwdF9tZXRob2QgPSBnZXRfY3J5cHRfbWV0aG9kKGJ1Zik7ICAvKiBzZWxlY3QgemlwIG9yIGJsb3dmaXNoICovCi0JdmltX3N0cm5jcHkoaGVhZGVyLCAoY2hhcl91ICopY3J5cHRfbWFnaWNbdXNlX2NyeXB0X21ldGhvZF0sCi0JCQkJCQkJICAgICBDUllQVF9NQUdJQ19MRU4pOwotCWlmICh1c2VfY3J5cHRfbWV0aG9kID09IDApCi0JICAgIGNyeXB0X2luaXRfa2V5cyhidWYtPmJfcF9rZXkpOwotCWVsc2UKLQl7Ci0JICAgIC8qIFVzaW5nIGJsb3dmaXNoLCBhZGQgc2FsdCBhbmQgc2VlZC4gKi8KLQkgICAgc2FsdCA9IGhlYWRlciArIENSWVBUX01BR0lDX0xFTjsKLQkgICAgc2VlZCA9IHNhbHQgKyBzYWx0X2xlbjsKLQkgICAgc2hhMl9zZWVkKHNhbHQsIHNhbHRfbGVuLCBzZWVkLCBzZWVkX2xlbik7Ci0JICAgIGJmX2tleV9pbml0KGJ1Zi0+Yl9wX2tleSwgc2FsdCwgc2FsdF9sZW4pOwotCSAgICBiZl9jZmJfaW5pdChzZWVkLCBzZWVkX2xlbik7Ci0JfQotICAgIH0KLSAgICAqbGVucCA9IENSWVBUX01BR0lDX0xFTiArIHNhbHRfbGVuICsgc2VlZF9sZW47Ci0gICAgcmV0dXJuIGhlYWRlcjsKLX0KLQogI2VuZGlmICAvKiBGRUFUX0NSWVBUICovCiAKICNpZmRlZiBVTklYCkBAIC0zMjI0LDkgKzMxNDgsNiBAQAogICAgIGludAkJICAgIHdyaXRlX3VuZG9fZmlsZSA9IEZBTFNFOwogICAgIGNvbnRleHRfc2hhMjU2X1Qgc2hhX2N0eDsKICNlbmRpZgotI2lmZGVmIEZFQVRfQ1JZUFQKLSAgICBpbnQJCSAgICBjcnlwdF9tZXRob2RfdXNlZDsKLSNlbmRpZgogCiAgICAgaWYgKGZuYW1lID09IE5VTEwgfHwgKmZuYW1lID09IE5VTCkJLyogc2FmZXR5IGNoZWNrICovCiAJcmV0dXJuIEZBSUw7CkBAIC0zMjYyLDYgKzMxODMsOSBAQAogICAgIHdyaXRlX2luZm8uYndfaWNvbnZfZmQgPSAoaWNvbnZfdCktMTsKICMgZW5kaWYKICNlbmRpZgorI2lmZGVmIEZFQVRfQ1JZUFQKKyAgICB3cml0ZV9pbmZvLmJ3X2J1ZmZlciA9IGJ1ZjsKKyNlbmRpZgogCiAgICAgLyogQWZ0ZXIgd3JpdGluZyBhIGZpbGUgY2hhbmdlZHRpY2sgY2hhbmdlcyBidXQgd2UgZG9uJ3Qgd2FudCB0byBkaXNwbGF5CiAgICAgICogdGhlIGxpbmUuICovCkBAIC00NTA1LDE3ICs0NDI5LDE3IEBACiAjaWZkZWYgRkVBVF9DUllQVAogICAgIGlmICgqYnVmLT5iX3Bfa2V5ICE9IE5VTCAmJiAhZmlsdGVyaW5nKQogICAgIHsKLQljaGFyX3UgKmhlYWRlcjsKLQlpbnQgICAgaGVhZGVyX2xlbjsKKwljaGFyX3UJCSpoZWFkZXI7CisJaW50CQloZWFkZXJfbGVuOwogCi0JaGVhZGVyID0gcHJlcGFyZV9jcnlwdF93cml0ZShidWYsICZoZWFkZXJfbGVuKTsKLQlpZiAoaGVhZGVyID09IE5VTEwpCisJYnVmLT5iX2NyeXB0c3RhdGUgPSBjcnlwdF9jcmVhdGVfZm9yX3dyaXRpbmcoY3J5cHRfZ2V0X21ldGhvZF9ucihidWYpLAorCQkJCQkgIGJ1Zi0+Yl9wX2tleSwgJmhlYWRlciwgJmhlYWRlcl9sZW4pOworCWlmIChidWYtPmJfY3J5cHRzdGF0ZSA9PSBOVUxMIHx8IGhlYWRlciA9PSBOVUxMKQogCSAgICBlbmQgPSAwOwogCWVsc2UKIAl7Ci0JICAgIC8qIFdyaXRlIG1hZ2ljIG51bWJlciwgc28gdGhhdCBWaW0ga25vd3MgdGhhdCB0aGlzIGZpbGUgaXMKLQkgICAgICogZW5jcnlwdGVkIHdoZW4gcmVhZGluZyBpdCBhZ2Fpbi4gIFRoaXMgYWxzbyB1bmRlcmdvZXMgdXRmLTggdG8KLQkgICAgICogdWNzLTIvNCBjb252ZXJzaW9uIHdoZW4gbmVlZGVkLiAqLworCSAgICAvKiBXcml0ZSBtYWdpYyBudW1iZXIsIHNvIHRoYXQgVmltIGtub3dzIGhvdyB0aGlzIGZpbGUgaXMKKwkgICAgICogZW5jcnlwdGVkIHdoZW4gcmVhZGluZyBpdCBiYWNrLiAqLwogCSAgICB3cml0ZV9pbmZvLmJ3X2J1ZiA9IGhlYWRlcjsKIAkgICAgd3JpdGVfaW5mby5id19sZW4gPSBoZWFkZXJfbGVuOwogCSAgICB3cml0ZV9pbmZvLmJ3X2ZsYWdzID0gRklPX05PQ09OVkVSVDsKQEAgLTQ3NjksMTIgKzQ2OTMsMTMgQEAKIAltY2hfc2V0X2FjbCh3Zm5hbWUsIGFjbCk7CiAjZW5kaWYKICNpZmRlZiBGRUFUX0NSWVBUCi0gICAgY3J5cHRfbWV0aG9kX3VzZWQgPSB1c2VfY3J5cHRfbWV0aG9kOwotICAgIGlmICh3Yl9mbGFncyAmIEZJT19FTkNSWVBURUQpCi0JY3J5cHRfcG9wX3N0YXRlKCk7CisgICAgaWYgKGJ1Zi0+Yl9jcnlwdHN0YXRlICE9IE5VTEwpCisgICAgeworCWNyeXB0X2ZyZWVfc3RhdGUoYnVmLT5iX2NyeXB0c3RhdGUpOworCWJ1Zi0+Yl9jcnlwdHN0YXRlID0gTlVMTDsKKyAgICB9CiAjZW5kaWYKIAotCiAjaWYgZGVmaW5lZChGRUFUX01CWVRFKSAmJiBkZWZpbmVkKEZFQVRfRVZBTCkKICAgICBpZiAod2ZuYW1lICE9IGZuYW1lKQogICAgIHsKQEAgLTQ5MjQsMTAgKzQ4NDksNyBAQAogI2lmZGVmIEZFQVRfQ1JZUFQKIAlpZiAod2JfZmxhZ3MgJiBGSU9fRU5DUllQVEVEKQogCXsKLQkgICAgaWYgKGNyeXB0X21ldGhvZF91c2VkID09IDEpCi0JCVNUUkNBVChJT2J1ZmYsIF8oIltibG93ZmlzaF0iKSk7Ci0JICAgIGVsc2UKLQkJU1RSQ0FUKElPYnVmZiwgXygiW2NyeXB0ZWRdIikpOworCSAgICBjcnlwdF9hcHBlbmRfbXNnKGJ1Zik7CiAJICAgIGMgPSBUUlVFOwogCX0KICNlbmRpZgpAQCAtNTc0MCw4ICs1NjYyLDI2IEBACiAjZW5kaWYgLyogRkVBVF9NQllURSAqLwogCiAjaWZkZWYgRkVBVF9DUllQVAotICAgIGlmIChmbGFncyAmIEZJT19FTkNSWVBURUQpCQkvKiBlbmNyeXB0IHRoZSBkYXRhICovCi0JY3J5cHRfZW5jb2RlKGJ1ZiwgbGVuLCBidWYpOworICAgIGlmIChmbGFncyAmIEZJT19FTkNSWVBURUQpCisgICAgeworCS8qIEVuY3J5cHQgdGhlIGRhdGEuIERvIGl0IGluLXBsYWNlIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgdXNlIGFuCisJICogYWxsb2NhdGVkIGJ1ZmZlci4gKi8KKwlpZiAoY3J5cHRfd29ya3NfaW5wbGFjZShpcC0+YndfYnVmZmVyLT5iX2NyeXB0c3RhdGUpKQorCXsKKwkgICAgY3J5cHRfZW5jb2RlX2lucGxhY2UoaXAtPmJ3X2J1ZmZlci0+Yl9jcnlwdHN0YXRlLCBidWYsIGxlbik7CisJfQorCWVsc2UKKwl7CisJICAgIGNoYXJfdSAqb3V0YnVmOworCisJICAgIGxlbiA9IGNyeXB0X2VuY29kZV9hbGxvYyhjdXJidWYtPmJfY3J5cHRzdGF0ZSwgYnVmLCBsZW4sICZvdXRidWYpOworCSAgICBpZiAobGVuID09IDApCisJCXJldHVybiBPSzsgIC8qIENyeXB0IGxheWVyIGlzIGJ1ZmZlcmluZywgd2lsbCBmbHVzaCBsYXRlci4gKi8KKwkgICAgd2xlbiA9IHdyaXRlX2VpbnRyKGlwLT5id19mZCwgb3V0YnVmLCBsZW4pOworCSAgICB2aW1fZnJlZShvdXRidWYpOworCSAgICByZXR1cm4gKHdsZW4gPCBsZW4pID8gRkFJTCA6IE9LOworCX0KKyAgICB9CiAjZW5kaWYKIAogICAgIHdsZW4gPSB3cml0ZV9laW50cihpcC0+YndfZmQsIGJ1ZiwgbGVuKTsKZGlmZiAtLWdpdCBhL3NyYy9nbG9iYWxzLmggYi9zcmMvZ2xvYmFscy5oCmluZGV4IGNlODMxZjMuLmQxZmRjMzMgMTAwNjQ0Ci0tLSBhL3NyYy9nbG9iYWxzLmgKKysrIGIvc3JjL2dsb2JhbHMuaApAQCAtMTA1LDEwICsxMDUsNiBAQAogCiBFWFRFUk4gaW50CXNjcmVlbl9jbGVhcmVkIElOSVQoPSBGQUxTRSk7CS8qIHNjcmVlbiBoYXMgYmVlbiBjbGVhcmVkICovCiAKLSNpZmRlZiBGRUFUX0NSWVBUCi1FWFRFUk4gaW50ICAgICAgdXNlX2NyeXB0X21ldGhvZCBJTklUKD0gMCk7Ci0jZW5kaWYKLQogLyoKICAqIFdoZW4gJyQnIGlzIGluY2x1ZGVkIGluICdjcG9wdGlvbnMnIG9wdGlvbiBzZXQ6CiAgKiBXaGVuIGEgY2hhbmdlIGNvbW1hbmQgaXMgZ2l2ZW4gdGhhdCBkZWxldGVzIG9ubHkgcGFydCBvZiBhIGxpbmUsIGEgZG9sbGFyCmRpZmYgLS1naXQgYS9zcmMvbWFpbi5jIGIvc3JjL21haW4uYwppbmRleCA5YzkyZjdhLi4yZmIyZWRjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi5jCisrKyBiL3NyYy9tYWluLmMKQEAgLTg0Niw4ICs4NDYsNyBAQAogI2lmZGVmIEZFQVRfQ1JZUFQKICAgICBpZiAocGFyYW1zLmFza19mb3Jfa2V5KQogICAgIHsKLQkodm9pZClibG93ZmlzaF9zZWxmX3Rlc3QoKTsKLQkodm9pZClnZXRfY3J5cHRfa2V5KFRSVUUsIFRSVUUpOworCSh2b2lkKWNyeXB0X2dldF9rZXkoVFJVRSwgVFJVRSk7CiAJVElNRV9NU0coImdldHRpbmcgY3J5cHQga2V5Iik7CiAgICAgfQogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvbWVtbGluZS5jIGIvc3JjL21lbWxpbmUuYwppbmRleCBmYjQzOGQyLi5hNTA1M2YwIDEwMDY0NAotLS0gYS9zcmMvbWVtbGluZS5jCisrKyBiL3NyYy9tZW1saW5lLmMKQEAgLTYzLDYgKzYzLDE1IEBACiAjZGVmaW5lIEJMT0NLMF9JRDEgICAgICcwJwkJICAgIC8qIGJsb2NrIDAgaWQgMSAqLwogI2RlZmluZSBCTE9DSzBfSUQxX0MwICAnYycJCSAgICAvKiBibG9jayAwIGlkIDEgJ2NtJyAwICovCiAjZGVmaW5lIEJMT0NLMF9JRDFfQzEgICdDJwkJICAgIC8qIGJsb2NrIDAgaWQgMSAnY20nIDEgKi8KKyNkZWZpbmUgQkxPQ0swX0lEMV9DMiAgJ2QnCQkgICAgLyogYmxvY2sgMCBpZCAxICdjbScgMiAqLworCisjaWYgZGVmaW5lZChGRUFUX0NSWVBUKQorc3RhdGljIGludCBpZDFfY29kZXNbXSA9IHsKKyAgICBCTE9DSzBfSUQxX0MwLCAgLyogQ1JZUFRfTV9aSVAgKi8KKyAgICBCTE9DSzBfSUQxX0MxLCAgLyogQ1JZUFRfTV9CRiAqLworICAgIEJMT0NLMF9JRDFfQzIsICAvKiBDUllQVF9NX0JGMiAqLworfTsKKyNlbmRpZgogCiAvKgogICogcG9pbnRlciB0byBhIGJsb2NrLCB1c2VkIGluIGEgcG9pbnRlciBibG9jawpAQCAtMTUxLDcgKzE2MCw3IEBACiBzdHJ1Y3QgYmxvY2swCiB7CiAgICAgY2hhcl91CWIwX2lkWzJdOwkvKiBpZCBmb3IgYmxvY2sgMDogQkxPQ0swX0lEMCBhbmQgQkxPQ0swX0lEMSwKLQkJCQkgKiBCTE9DSzBfSUQxX0MwLCBCTE9DSzBfSUQxX0MxICovCisJCQkJICogQkxPQ0swX0lEMV9DMCwgQkxPQ0swX0lEMV9DMSwgZXRjLiAqLwogICAgIGNoYXJfdQliMF92ZXJzaW9uWzEwXTsJLyogVmltIHZlcnNpb24gc3RyaW5nICovCiAgICAgY2hhcl91CWIwX3BhZ2Vfc2l6ZVs0XTsvKiBudW1iZXIgb2YgYnl0ZXMgcGVyIHBhZ2UgKi8KICAgICBjaGFyX3UJYjBfbXRpbWVbNF07CS8qIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgb2YgZmlsZSAqLwpAQCAtMjU2LDcgKzI2NSw3IEBACiBzdGF0aWMgY2hhcl91ICptYWtlX3BlcmNlbnRfc3duYW1lIF9fQVJHUygoY2hhcl91ICpkaXIsIGNoYXJfdSAqbmFtZSkpOwogI2VuZGlmCiAjaWZkZWYgRkVBVF9DUllQVAotc3RhdGljIHZvaWQgbWxfY3J5cHRfcHJlcGFyZSBfX0FSR1MoKG1lbWZpbGVfVCAqbWZwLCBvZmZfdCBvZmZzZXQsIGludCByZWFkaW5nKSk7CitzdGF0aWMgY3J5cHRzdGF0ZV9UICptbF9jcnlwdF9wcmVwYXJlIF9fQVJHUygobWVtZmlsZV9UICptZnAsIG9mZl90IG9mZnNldCwgaW50IHJlYWRpbmcpKTsKICNlbmRpZgogI2lmZGVmIEZFQVRfQllURU9GRgogc3RhdGljIHZvaWQgbWxfdXBkYXRlY2h1bmsgX19BUkdTKChidWZfVCAqYnVmLCBsb25nIGxpbmUsIGxvbmcgbGVuLCBpbnQgdXBkdHlwZSkpOwpAQCAtMzU5LDggKzM2OCw3IEBACiAJYjBwLT5iMF9obmFtZVtCMF9ITkFNRV9TSVpFIC0gMV0gPSBOVUw7CiAJbG9uZ190b19jaGFyKG1jaF9nZXRfcGlkKCksIGIwcC0+YjBfcGlkKTsKICNpZmRlZiBGRUFUX0NSWVBUCi0JaWYgKCpidWYtPmJfcF9rZXkgIT0gTlVMKQotCSAgICBtbF9zZXRfYjBfY3J5cHQoYnVmLCBiMHApOworCW1sX3NldF9iMF9jcnlwdChidWYsIGIwcCk7CiAjZW5kaWYKICAgICB9CiAKQEAgLTQzNiwxMSArNDQ0LDExIEBACiAJYjBwLT5iMF9pZFsxXSA9IEJMT0NLMF9JRDE7CiAgICAgZWxzZQogICAgIHsKLQlpZiAoZ2V0X2NyeXB0X21ldGhvZChidWYpID09IDApCi0JICAgIGIwcC0+YjBfaWRbMV0gPSBCTE9DSzBfSUQxX0MwOwotCWVsc2UKKwlpbnQgbWV0aG9kX25yID0gY3J5cHRfZ2V0X21ldGhvZF9ucihidWYpOworCisJYjBwLT5iMF9pZFsxXSA9IGlkMV9jb2Rlc1ttZXRob2RfbnJdOworCWlmIChtZXRob2RfbnIgPiBDUllQVF9NX1pJUCkKIAl7Ci0JICAgIGIwcC0+YjBfaWRbMV0gPSBCTE9DSzBfSUQxX0MxOwogCSAgICAvKiBHZW5lcmF0ZSBhIHNlZWQgYW5kIHN0b3JlIGl0IGluIGJsb2NrIDAgYW5kIGluIHRoZSBtZW1maWxlLiAqLwogCSAgICBzaGEyX3NlZWQoJmIwcC0+YjBfc2VlZCwgTUZfU0VFRF9MRU4sIE5VTEwsIDApOwogCSAgICBtY2hfbWVtbW92ZShidWYtPmJfbWwubWxfbWZwLT5tZl9zZWVkLCAmYjBwLT5iMF9zZWVkLCBNRl9TRUVEX0xFTik7CkBAIC04ODcsNyArODk1LDggQEAKICAgICBpZiAoYjBwLT5iMF9pZFswXSAhPSBCTE9DSzBfSUQwCiAJICAgIHx8IChiMHAtPmIwX2lkWzFdICE9IEJMT0NLMF9JRDEKIAkJJiYgYjBwLT5iMF9pZFsxXSAhPSBCTE9DSzBfSUQxX0MwCi0JCSYmIGIwcC0+YjBfaWRbMV0gIT0gQkxPQ0swX0lEMV9DMSkKKwkJJiYgYjBwLT5iMF9pZFsxXSAhPSBCTE9DSzBfSUQxX0MxCisJCSYmIGIwcC0+YjBfaWRbMV0gIT0gQkxPQ0swX0lEMV9DMikKIAkgICAgKQogCXJldHVybiBGQUlMOwogICAgIHJldHVybiBPSzsKQEAgLTEyNTUsMTQgKzEyNjQsMTIgQEAKICAgICB9CiAKICNpZmRlZiBGRUFUX0NSWVBUCi0gICAgaWYgKGIwcC0+YjBfaWRbMV0gPT0gQkxPQ0swX0lEMV9DMCkKLQliMF9jbSA9IDA7Ci0gICAgZWxzZSBpZiAoYjBwLT5iMF9pZFsxXSA9PSBCTE9DSzBfSUQxX0MxKQotICAgIHsKLQliMF9jbSA9IDE7CisgICAgZm9yIChpID0gMDsgaSA8IChpbnQpKHNpemVvZihpZDFfY29kZXMpIC8gc2l6ZW9mKGludCkpOyArK2kpCisJaWYgKGlkMV9jb2Rlc1tpXSA9PSBiMHAtPmIwX2lkWzFdKQorCSAgICBiMF9jbSA9IGk7CisgICAgaWYgKGIwX2NtID4gMCkKIAltY2hfbWVtbW92ZShtZnAtPm1mX3NlZWQsICZiMHAtPmIwX3NlZWQsIE1GX1NFRURfTEVOKTsKLSAgICB9Ci0gICAgc2V0X2NyeXB0X21ldGhvZChidWYsIGIwX2NtKTsKKyAgICBjcnlwdF9zZXRfY21fb3B0aW9uKGJ1ZiwgYjBfY20gPCAwID8gMCA6IGIwX2NtKTsKICNlbHNlCiAgICAgaWYgKGIwcC0+YjBfaWRbMV0gIT0gQkxPQ0swX0lEMSkKICAgICB7CkBAIC0xMzg5LDcgKzEzOTYsNyBAQAogCX0KIAllbHNlCiAJICAgIHNtc2coKGNoYXJfdSAqKV8obmVlZF9rZXlfbXNnKSwgZm5hbWVfdXNlZCk7Ci0JYnVmLT5iX3Bfa2V5ID0gZ2V0X2NyeXB0X2tleShGQUxTRSwgRkFMU0UpOworCWJ1Zi0+Yl9wX2tleSA9IGNyeXB0X2dldF9rZXkoRkFMU0UsIEZBTFNFKTsKIAlpZiAoYnVmLT5iX3Bfa2V5ID09IE5VTEwpCiAJICAgIGJ1Zi0+Yl9wX2tleSA9IGN1cmJ1Zi0+Yl9wX2tleTsKIAllbHNlIGlmICgqYnVmLT5iX3Bfa2V5ID09IE5VTCkKQEAgLTQ4MTYsNiArNDgyMyw3IEBACiAgICAgY2hhcl91CSp0ZXh0X3N0YXJ0OwogICAgIGNoYXJfdQkqbmV3X2RhdGE7CiAgICAgaW50CQl0ZXh0X2xlbjsKKyAgICBjcnlwdHN0YXRlX1QgKnN0YXRlOwogCiAgICAgaWYgKGRwLT5kYl9pZCAhPSBEQVRBX0lEKQogCXJldHVybiBkYXRhOwpAQCAtNDgzMSwxMCArNDgzOSw5IEBACiAgICAgbWNoX21lbW1vdmUobmV3X2RhdGEsIGRwLCBoZWFkX2VuZCAtIChjaGFyX3UgKilkcCk7CiAKICAgICAvKiBFbmNyeXB0IHRoZSB0ZXh0LiAqLwotICAgIGNyeXB0X3B1c2hfc3RhdGUoKTsKLSAgICBtbF9jcnlwdF9wcmVwYXJlKG1mcCwgb2Zmc2V0LCBGQUxTRSk7Ci0gICAgY3J5cHRfZW5jb2RlKHRleHRfc3RhcnQsIHRleHRfbGVuLCBuZXdfZGF0YSArIGRwLT5kYl90eHRfc3RhcnQpOwotICAgIGNyeXB0X3BvcF9zdGF0ZSgpOworICAgIHN0YXRlID0gbWxfY3J5cHRfcHJlcGFyZShtZnAsIG9mZnNldCwgRkFMU0UpOworICAgIGNyeXB0X2VuY29kZShzdGF0ZSwgdGV4dF9zdGFydCwgdGV4dF9sZW4sIG5ld19kYXRhICsgZHAtPmRiX3R4dF9zdGFydCk7CisgICAgY3J5cHRfZnJlZV9zdGF0ZShzdGF0ZSk7CiAKICAgICAvKiBDbGVhciB0aGUgZ2FwLiAqLwogICAgIGlmIChoZWFkX2VuZCA8IHRleHRfc3RhcnQpCkBAIC00ODU3LDYgKzQ4NjQsNyBAQAogICAgIGNoYXJfdQkqaGVhZF9lbmQ7CiAgICAgY2hhcl91CSp0ZXh0X3N0YXJ0OwogICAgIGludAkJdGV4dF9sZW47CisgICAgY3J5cHRzdGF0ZV9UICpzdGF0ZTsKIAogICAgIGlmIChkcC0+ZGJfaWQgPT0gREFUQV9JRCkKICAgICB7CkBAIC00ODY5LDE3ICs0ODc3LDE3IEBACiAJICAgIHJldHVybjsgIC8qIGRhdGEgd2FzIG1lc3NlZCB1cCAqLwogCiAJLyogRGVjcnlwdCB0aGUgdGV4dCBpbiBwbGFjZS4gKi8KLQljcnlwdF9wdXNoX3N0YXRlKCk7Ci0JbWxfY3J5cHRfcHJlcGFyZShtZnAsIG9mZnNldCwgVFJVRSk7Ci0JY3J5cHRfZGVjb2RlKHRleHRfc3RhcnQsIHRleHRfbGVuKTsKLQljcnlwdF9wb3Bfc3RhdGUoKTsKKwlzdGF0ZSA9IG1sX2NyeXB0X3ByZXBhcmUobWZwLCBvZmZzZXQsIFRSVUUpOworCWNyeXB0X2RlY29kZV9pbnBsYWNlKHN0YXRlLCB0ZXh0X3N0YXJ0LCB0ZXh0X2xlbik7CisJY3J5cHRfZnJlZV9zdGF0ZShzdGF0ZSk7CiAgICAgfQogfQogCiAvKgogICogUHJlcGFyZSBmb3IgZW5jcnlwdGlvbi9kZWNyeXB0aW9uLCB1c2luZyB0aGUga2V5LCBzZWVkIGFuZCBvZmZzZXQuCisgKiBSZXR1cm4gYW4gYWxsb2NhdGVkIGNyeXB0c3RhdGVfVCAqLgogICovCi0gICAgc3RhdGljIHZvaWQKKyAgICBzdGF0aWMgY3J5cHRzdGF0ZV9UICoKIG1sX2NyeXB0X3ByZXBhcmUobWZwLCBvZmZzZXQsIHJlYWRpbmcpCiAgICAgbWVtZmlsZV9UCSptZnA7CiAgICAgb2ZmX3QJb2Zmc2V0OwpAQCAtNDg4NywzOCArNDg5NSwzNyBAQAogewogICAgIGJ1Zl9UCSpidWYgPSBtZnAtPm1mX2J1ZmZlcjsKICAgICBjaGFyX3UJc2FsdFs1MF07Ci0gICAgaW50CQltZXRob2Q7CisgICAgaW50CQltZXRob2RfbnI7CiAgICAgY2hhcl91CSprZXk7CiAgICAgY2hhcl91CSpzZWVkOwogCiAgICAgaWYgKHJlYWRpbmcgJiYgbWZwLT5tZl9vbGRfa2V5ICE9IE5VTEwpCiAgICAgewogCS8qIFJlYWRpbmcgYmFjayBibG9ja3Mgd2l0aCB0aGUgcHJldmlvdXMga2V5L21ldGhvZC9zZWVkLiAqLwotCW1ldGhvZCA9IG1mcC0+bWZfb2xkX2NtOworCW1ldGhvZF9uciA9IG1mcC0+bWZfb2xkX2NtOwogCWtleSA9IG1mcC0+bWZfb2xkX2tleTsKIAlzZWVkID0gbWZwLT5tZl9vbGRfc2VlZDsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLQltZXRob2QgPSBnZXRfY3J5cHRfbWV0aG9kKGJ1Zik7CisJbWV0aG9kX25yID0gY3J5cHRfZ2V0X21ldGhvZF9ucihidWYpOwogCWtleSA9IGJ1Zi0+Yl9wX2tleTsKIAlzZWVkID0gbWZwLT5tZl9zZWVkOwogICAgIH0KIAotICAgIHVzZV9jcnlwdF9tZXRob2QgPSBtZXRob2Q7ICAvKiBzZWxlY3QgcGt6aXAgb3IgYmxvd2Zpc2ggKi8KLSAgICBpZiAobWV0aG9kID09IDApCisgICAgaWYgKG1ldGhvZF9uciA9PSBDUllQVF9NX1pJUCkKICAgICB7CisJLyogRm9yIFBLemlwOiBBcHBlbmQgdGhlIG9mZnNldCB0byB0aGUga2V5LCBzbyB0aGF0IHdlIHVzZSBhIGRpZmZlcmVudAorCSAqIGtleSBmb3IgZXZlcnkgYmxvY2suICovCiAJdmltX3NucHJpbnRmKChjaGFyICopc2FsdCwgc2l6ZW9mKHNhbHQpLCAiJXMlbGQiLCBrZXksIChsb25nKW9mZnNldCk7Ci0JY3J5cHRfaW5pdF9rZXlzKHNhbHQpOworCXJldHVybiBjcnlwdF9jcmVhdGUobWV0aG9kX25yLCBzYWx0LCBOVUxMLCAwLCBOVUxMLCAwKTsKICAgICB9Ci0gICAgZWxzZQotICAgIHsKLQkvKiBVc2luZyBibG93ZmlzaCwgYWRkIHNhbHQgYW5kIHNlZWQuIFdlIHVzZSB0aGUgYnl0ZSBvZmZzZXQgb2YgdGhlCi0JICogYmxvY2sgZm9yIHRoZSBzYWx0LiAqLwotCXZpbV9zbnByaW50ZigoY2hhciAqKXNhbHQsIHNpemVvZihzYWx0KSwgIiVsZCIsIChsb25nKW9mZnNldCk7Ci0JYmZfa2V5X2luaXQoa2V5LCBzYWx0LCAoaW50KVNUUkxFTihzYWx0KSk7Ci0JYmZfY2ZiX2luaXQoc2VlZCwgTUZfU0VFRF9MRU4pOwotICAgIH0KKworICAgIC8qIFVzaW5nIGJsb3dmaXNoIG9yIGJldHRlcjogYWRkIHNhbHQgYW5kIHNlZWQuIFdlIHVzZSB0aGUgYnl0ZSBvZmZzZXQKKyAgICAgKiBvZiB0aGUgYmxvY2sgZm9yIHRoZSBzYWx0LiAqLworICAgIHZpbV9zbnByaW50ZigoY2hhciAqKXNhbHQsIHNpemVvZihzYWx0KSwgIiVsZCIsIChsb25nKW9mZnNldCk7CisgICAgcmV0dXJuIGNyeXB0X2NyZWF0ZShtZXRob2RfbnIsIGtleSwgc2FsdCwgKGludClTVFJMRU4oc2FsdCksCisJCQkJCQkJICAgc2VlZCwgTUZfU0VFRF9MRU4pOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9taXNjMi5jIGIvc3JjL21pc2MyLmMKaW5kZXggMWE1YjM3MC4uMWY4ODc4ZiAxMDA2NDQKLS0tIGEvc3JjL21pc2MyLmMKKysrIGIvc3JjL21pc2MyLmMKQEAgLTM4MDMsMzIyICszODAzLDYgQEAKICNlbmRpZiAvKiBDVVJTT1JfU0hBUEUgKi8KIAogCi0jaWZkZWYgRkVBVF9DUllQVAotLyoKLSAqIE9wdGlvbmFsIGVuY3J5cHRpb24gc3VwcG9ydC4KLSAqIE1vaHNpbiBBaG1lZCwgbW9zaEBzYXNpLmNvbSwgOTgtMDktMjQKLSAqIEJhc2VkIG9uIHppcC9jcnlwdCBzb3VyY2VzLgotICoKLSAqIE5PVEUgRk9SIFVTQTogU2luY2UgMjAwMCBleHBvcnRpbmcgdGhpcyBjb2RlIGZyb20gdGhlIFVTQSBpcyBhbGxvd2VkIHRvCi0gKiBtb3N0IGNvdW50cmllcy4gIFRoZXJlIGFyZSBhIGZldyBleGNlcHRpb25zLCBidXQgdGhhdCBzdGlsbCBzaG91bGQgbm90IGJlIGEKLSAqIHByb2JsZW0gc2luY2UgdGhpcyBjb2RlIHdhcyBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4gRXVyb3BlIGFuZCBJbmRpYS4KLSAqCi0gKiBCbG93ZmlzaCBhZGRpdGlvbiBvcmlnaW5hbGx5IG1hZGUgYnkgTW9oc2luIEFobWVkLAotICogaHR0cDovL3d3dy5jcy5hbGJhbnkuZWR1L35tb3NoIDIwMTAtMDMtMTQKLSAqIEJhc2VkIG9uIGJsb3dmaXNoIGJ5IEJydWNlIFNjaG5laWVyIChodHRwOi8vd3d3LnNjaG5laWVyLmNvbS9ibG93ZmlzaC5odG1sKQotICogYW5kIHNoYTI1NiBieSBDaHJpc3RvcGhlIERldmluZS4KLSAqLwotCi0vKiBmcm9tIHppcC5oICovCi0KLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdXNoOwkvKiB1bnNpZ25lZCAxNi1iaXQgdmFsdWUgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgdWxnOwkvKiB1bnNpZ25lZCAzMi1iaXQgdmFsdWUgKi8KLQotc3RhdGljIHZvaWQgbWFrZV9jcmNfdGFiIF9fQVJHUygodm9pZCkpOwotCi1zdGF0aWMgdWxnIGNyY18zMl90YWJbMjU2XTsKLQotLyoKLSAqIEZpbGwgdGhlIENSQyB0YWJsZS4KLSAqLwotICAgIHN0YXRpYyB2b2lkCi1tYWtlX2NyY190YWIoKQotewotICAgIHVsZwkJcyx0LHY7Ci0gICAgc3RhdGljIGludAlkb25lID0gRkFMU0U7Ci0KLSAgICBpZiAoZG9uZSkKLQlyZXR1cm47Ci0gICAgZm9yICh0ID0gMDsgdCA8IDI1NjsgdCsrKQotICAgIHsKLQl2ID0gdDsKLQlmb3IgKHMgPSAwOyBzIDwgODsgcysrKQotCSAgICB2ID0gKHYgPj4gMSkgXiAoKHYgJiAxKSAqICh1bGcpMHhlZGI4ODMyMEwpOwotCWNyY18zMl90YWJbdF0gPSB2OwotICAgIH0KLSAgICBkb25lID0gVFJVRTsKLX0KLQotI2RlZmluZSBDUkMzMihjLCBiKSAoY3JjXzMyX3RhYlsoKGludCkoYykgXiAoYikpICYgMHhmZl0gXiAoKGMpID4+IDgpKQotCi1zdGF0aWMgdWxnIGtleXNbM107IC8qIGtleXMgZGVmaW5pbmcgdGhlIHBzZXVkby1yYW5kb20gc2VxdWVuY2UgKi8KLQotLyoKLSAqIFJldHVybiB0aGUgbmV4dCBieXRlIGluIHRoZSBwc2V1ZG8tcmFuZG9tIHNlcXVlbmNlLgotICovCi0jZGVmaW5lIERFQ1JZUFRfQllURV9aSVAodCkgeyBcCi0gICAgdXNoIHRlbXA7IFwKLSBcCi0gICAgdGVtcCA9ICh1c2gpa2V5c1syXSB8IDI7IFwKLSAgICB0ID0gKGludCkoKCh1bnNpZ25lZCkodGVtcCAqICh0ZW1wIF4gMVUpKSA+PiA4KSAmIDB4ZmYpOyBcCi19Ci0KLS8qCi0gKiBVcGRhdGUgdGhlIGVuY3J5cHRpb24ga2V5cyB3aXRoIHRoZSBuZXh0IGJ5dGUgb2YgcGxhaW4gdGV4dC4KLSAqLwotI2RlZmluZSBVUERBVEVfS0VZU19aSVAoYykgeyBcCi0gICAga2V5c1swXSA9IENSQzMyKGtleXNbMF0sIChjKSk7IFwKLSAgICBrZXlzWzFdICs9IGtleXNbMF0gJiAweGZmOyBcCi0gICAga2V5c1sxXSA9IGtleXNbMV0gKiAxMzQ3NzU4MTNMICsgMTsgXAotICAgIGtleXNbMl0gPSBDUkMzMihrZXlzWzJdLCAoaW50KShrZXlzWzFdID4+IDI0KSk7IFwKLX0KLQotc3RhdGljIGludCBjcnlwdF9idXN5ID0gMDsKLXN0YXRpYyB1bGcgc2F2ZWRfa2V5c1szXTsKLXN0YXRpYyBpbnQgc2F2ZWRfY3J5cHRfbWV0aG9kOwotCi0vKgotICogUmV0dXJuIGludCB2YWx1ZSBmb3IgY3J5cHQgbWV0aG9kIHN0cmluZzoKLSAqIDAgZm9yICJ6aXAiLCB0aGUgb2xkIG1ldGhvZC4gIEFsc28gZm9yIGFueSBub24tdmFsaWQgdmFsdWUuCi0gKiAxIGZvciAiYmxvd2Zpc2giLgotICovCi0gICAgaW50Ci1jcnlwdF9tZXRob2RfZnJvbV9zdHJpbmcocykKLSAgICBjaGFyX3UgICpzOwotewotICAgIHJldHVybiAqcyA9PSAnYicgPyAxIDogMDsKLX0KLQotLyoKLSAqIEdldCB0aGUgY3J5cHQgbWV0aG9kIGZvciBidWZmZXIgImJ1ZiIgYXMgYSBudW1iZXIuCi0gKi8KLSAgICBpbnQKLWdldF9jcnlwdF9tZXRob2QoYnVmKQotICAgIGJ1Zl9UICpidWY7Ci17Ci0gICAgcmV0dXJuIGNyeXB0X21ldGhvZF9mcm9tX3N0cmluZygqYnVmLT5iX3BfY20gPT0gTlVMID8gcF9jbSA6IGJ1Zi0+Yl9wX2NtKTsKLX0KLQotLyoKLSAqIFNldCB0aGUgY3J5cHQgbWV0aG9kIGZvciBidWZmZXIgImJ1ZiIgdG8gIm1ldGhvZCIgdXNpbmcgdGhlIGludCB2YWx1ZSBhcwotICogcmV0dXJuZWQgYnkgY3J5cHRfbWV0aG9kX2Zyb21fc3RyaW5nKCkuCi0gKi8KLSAgICB2b2lkCi1zZXRfY3J5cHRfbWV0aG9kKGJ1ZiwgbWV0aG9kKQotICAgIGJ1Zl9UICAgKmJ1ZjsKLSAgICBpbnQJICAgIG1ldGhvZDsKLXsKLSAgICBmcmVlX3N0cmluZ19vcHRpb24oYnVmLT5iX3BfY20pOwotICAgIGJ1Zi0+Yl9wX2NtID0gdmltX3N0cnNhdmUoKGNoYXJfdSAqKShtZXRob2QgPT0gMCA/ICJ6aXAiIDogImJsb3dmaXNoIikpOwotfQotCi0vKgotICogUHJlcGFyZSBmb3IgaW5pdGlhbGl6aW5nIGVuY3J5cHRpb24uICBJZiBhbHJlYWR5IGRvaW5nIGVuY3J5cHRpb24gdGhlbiBzYXZlCi0gKiB0aGUgc3RhdGUuCi0gKiBNdXN0IGFsd2F5cyBiZSBjYWxsZWQgc3ltbWV0cmljYWxseSB3aXRoIGNyeXB0X3BvcF9zdGF0ZSgpLgotICovCi0gICAgdm9pZAotY3J5cHRfcHVzaF9zdGF0ZSgpCi17Ci0gICAgaWYgKGNyeXB0X2J1c3kgPT0gMSkKLSAgICB7Ci0JLyogc2F2ZSB0aGUgc3RhdGUgKi8KLQlpZiAodXNlX2NyeXB0X21ldGhvZCA9PSAwKQotCXsKLQkgICAgc2F2ZWRfa2V5c1swXSA9IGtleXNbMF07Ci0JICAgIHNhdmVkX2tleXNbMV0gPSBrZXlzWzFdOwotCSAgICBzYXZlZF9rZXlzWzJdID0ga2V5c1syXTsKLQl9Ci0JZWxzZQotCSAgICBiZl9jcnlwdF9zYXZlKCk7Ci0Jc2F2ZWRfY3J5cHRfbWV0aG9kID0gdXNlX2NyeXB0X21ldGhvZDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY3J5cHRfYnVzeSA+IDEpCi0JRU1TRzIoXyhlX2ludGVybjIpLCAiY3J5cHRfcHVzaF9zdGF0ZSgpIik7Ci0gICAgKytjcnlwdF9idXN5OwotfQotCi0vKgotICogRW5kIGVuY3J5cHRpb24uICBJZiBkb2luZyBlbmNyeXB0aW9uIGJlZm9yZSBjcnlwdF9wdXNoX3N0YXRlKCkgdGhlbiByZXN0b3JlCi0gKiB0aGUgc2F2ZWQgc3RhdGUuCi0gKiBNdXN0IGFsd2F5cyBiZSBjYWxsZWQgc3ltbWV0cmljYWxseSB3aXRoIGNyeXB0X3B1c2hfc3RhdGUoKS4KLSAqLwotICAgIHZvaWQKLWNyeXB0X3BvcF9zdGF0ZSgpCi17Ci0gICAgLS1jcnlwdF9idXN5OwotICAgIGlmIChjcnlwdF9idXN5ID09IDEpCi0gICAgewotCXVzZV9jcnlwdF9tZXRob2QgPSBzYXZlZF9jcnlwdF9tZXRob2Q7Ci0JaWYgKHVzZV9jcnlwdF9tZXRob2QgPT0gMCkKLQl7Ci0JICAgIGtleXNbMF0gPSBzYXZlZF9rZXlzWzBdOwotCSAgICBrZXlzWzFdID0gc2F2ZWRfa2V5c1sxXTsKLQkgICAga2V5c1syXSA9IHNhdmVkX2tleXNbMl07Ci0JfQotCWVsc2UKLQkgICAgYmZfY3J5cHRfcmVzdG9yZSgpOwotICAgIH0KLX0KLQotLyoKLSAqIEVuY3J5cHQgImZyb21bbGVuXSIgaW50byAidG9bbGVuXSIuCi0gKiAiZnJvbSIgYW5kICJ0byIgY2FuIGJlIGVxdWFsIHRvIGVuY3J5cHQgaW4gcGxhY2UuCi0gKi8KLSAgICB2b2lkCi1jcnlwdF9lbmNvZGUoZnJvbSwgbGVuLCB0bykKLSAgICBjaGFyX3UJKmZyb207Ci0gICAgc2l6ZV90CWxlbjsKLSAgICBjaGFyX3UJKnRvOwotewotICAgIHNpemVfdAlpOwotICAgIGludAkJenRlbXAsIHQ7Ci0KLSAgICBpZiAodXNlX2NyeXB0X21ldGhvZCA9PSAwKQotCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKLQl7Ci0JICAgIHp0ZW1wID0gZnJvbVtpXTsKLQkgICAgREVDUllQVF9CWVRFX1pJUCh0KTsKLQkgICAgVVBEQVRFX0tFWVNfWklQKHp0ZW1wKTsKLQkgICAgdG9baV0gPSB0IF4genRlbXA7Ci0JfQotICAgIGVsc2UKLQliZl9jcnlwdF9lbmNvZGUoZnJvbSwgbGVuLCB0byk7Ci19Ci0KLS8qCi0gKiBEZWNyeXB0ICJwdHJbbGVuXSIgaW4gcGxhY2UuCi0gKi8KLSAgICB2b2lkCi1jcnlwdF9kZWNvZGUocHRyLCBsZW4pCi0gICAgY2hhcl91CSpwdHI7Ci0gICAgbG9uZwlsZW47Ci17Ci0gICAgY2hhcl91ICpwOwotCi0gICAgaWYgKHVzZV9jcnlwdF9tZXRob2QgPT0gMCkKLQlmb3IgKHAgPSBwdHI7IHAgPCBwdHIgKyBsZW47ICsrcCkKLQl7Ci0JICAgIHVzaCB0ZW1wOwotCi0JICAgIHRlbXAgPSAodXNoKWtleXNbMl0gfCAyOwotCSAgICB0ZW1wID0gKGludCkoKCh1bnNpZ25lZCkodGVtcCAqICh0ZW1wIF4gMVUpKSA+PiA4KSAmIDB4ZmYpOwotCSAgICBVUERBVEVfS0VZU19aSVAoKnAgXj0gdGVtcCk7Ci0JfQotICAgIGVsc2UKLQliZl9jcnlwdF9kZWNvZGUocHRyLCBsZW4pOwotfQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgZW5jcnlwdGlvbiBrZXlzIGFuZCB0aGUgcmFuZG9tIGhlYWRlciBhY2NvcmRpbmcgdG8KLSAqIHRoZSBnaXZlbiBwYXNzd29yZC4KLSAqIElmICJwYXNzd2QiIGlzIE5VTEwgb3IgZW1wdHksIGRvbid0IGRvIGFueXRoaW5nLgotICovCi0gICAgdm9pZAotY3J5cHRfaW5pdF9rZXlzKHBhc3N3ZCkKLSAgICBjaGFyX3UgKnBhc3N3ZDsJCS8qIHBhc3N3b3JkIHN0cmluZyB3aXRoIHdoaWNoIHRvIG1vZGlmeSBrZXlzICovCi17Ci0gICAgaWYgKHBhc3N3ZCAhPSBOVUxMICYmICpwYXNzd2QgIT0gTlVMKQotICAgIHsKLQlpZiAodXNlX2NyeXB0X21ldGhvZCA9PSAwKQotCXsKLQkgICAgY2hhcl91ICpwOwotCi0JICAgIG1ha2VfY3JjX3RhYigpOwotCSAgICBrZXlzWzBdID0gMzA1NDE5ODk2TDsKLQkgICAga2V5c1sxXSA9IDU5MTc1MTA0OUw7Ci0JICAgIGtleXNbMl0gPSA4NzgwODIxOTJMOwotCSAgICBmb3IgKHAgPSBwYXNzd2Q7ICpwIT0gTlVMOyArK3ApCi0JICAgIHsKLQkJVVBEQVRFX0tFWVNfWklQKChpbnQpKnApOwotCSAgICB9Ci0JfQotCWVsc2UKLQkgICAgYmZfY3J5cHRfaW5pdF9rZXlzKHBhc3N3ZCk7Ci0gICAgfQotfQotCi0vKgotICogRnJlZSBhbiBhbGxvY2F0ZWQgY3J5cHQga2V5LiAgQ2xlYXIgdGhlIHRleHQgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3Qgc3RheQotICogaW4gbWVtb3J5IGFueXdoZXJlLgotICovCi0gICAgdm9pZAotZnJlZV9jcnlwdF9rZXkoa2V5KQotICAgIGNoYXJfdSAqa2V5OwotewotICAgIGNoYXJfdSAqcDsKLQotICAgIGlmIChrZXkgIT0gTlVMTCkKLSAgICB7Ci0JZm9yIChwID0ga2V5OyAqcCAhPSBOVUw7ICsrcCkKLQkgICAgKnAgPSAwOwotCXZpbV9mcmVlKGtleSk7Ci0gICAgfQotfQotCi0vKgotICogQXNrIHRoZSB1c2VyIGZvciBhIGNyeXB0IGtleS4KLSAqIFdoZW4gInN0b3JlIiBpcyBUUlVFLCB0aGUgbmV3IGtleSBpcyBzdG9yZWQgaW4gdGhlICdrZXknIG9wdGlvbiwgYW5kIHRoZQotICogJ2tleScgb3B0aW9uIHZhbHVlIGlzIHJldHVybmVkOiBEb24ndCBmcmVlIGl0LgotICogV2hlbiAic3RvcmUiIGlzIEZBTFNFLCB0aGUgdHlwZWQga2V5IGlzIHJldHVybmVkIGluIGFsbG9jYXRlZCBtZW1vcnkuCi0gKiBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZS4KLSAqLwotICAgIGNoYXJfdSAqCi1nZXRfY3J5cHRfa2V5KHN0b3JlLCB0d2ljZSkKLSAgICBpbnQJCXN0b3JlOwotICAgIGludAkJdHdpY2U7CSAgICAvKiBBc2sgZm9yIHRoZSBrZXkgdHdpY2UuICovCi17Ci0gICAgY2hhcl91CSpwMSwgKnAyID0gTlVMTDsKLSAgICBpbnQJCXJvdW5kOwotCi0gICAgZm9yIChyb3VuZCA9IDA7IDsgKytyb3VuZCkKLSAgICB7Ci0JY21kbGluZV9zdGFyID0gVFJVRTsKLQljbWRsaW5lX3JvdyA9IG1zZ19yb3c7Ci0JcDEgPSBnZXRjbWRsaW5lX3Byb21wdChOVUwsIHJvdW5kID09IDAKLQkJPyAoY2hhcl91ICopXygiRW50ZXIgZW5jcnlwdGlvbiBrZXk6ICIpCi0JCTogKGNoYXJfdSAqKV8oIkVudGVyIHNhbWUga2V5IGFnYWluOiAiKSwgMCwgRVhQQU5EX05PVEhJTkcsCi0JCU5VTEwpOwotCWNtZGxpbmVfc3RhciA9IEZBTFNFOwotCi0JaWYgKHAxID09IE5VTEwpCi0JICAgIGJyZWFrOwotCi0JaWYgKHJvdW5kID09IHR3aWNlKQotCXsKLQkgICAgaWYgKHAyICE9IE5VTEwgJiYgU1RSQ01QKHAxLCBwMikgIT0gMCkKLQkgICAgewotCQlNU0coXygiS2V5cyBkb24ndCBtYXRjaCEiKSk7Ci0JCWZyZWVfY3J5cHRfa2V5KHAxKTsKLQkJZnJlZV9jcnlwdF9rZXkocDIpOwotCQlwMiA9IE5VTEw7Ci0JCXJvdW5kID0gLTE7CQkvKiBkbyBpdCBhZ2FpbiAqLwotCQljb250aW51ZTsKLQkgICAgfQotCi0JICAgIGlmIChzdG9yZSkKLQkgICAgewotCQlzZXRfb3B0aW9uX3ZhbHVlKChjaGFyX3UgKikia2V5IiwgMEwsIHAxLCBPUFRfTE9DQUwpOwotCQlmcmVlX2NyeXB0X2tleShwMSk7Ci0JCXAxID0gY3VyYnVmLT5iX3Bfa2V5OwotCSAgICB9Ci0JICAgIGJyZWFrOwotCX0KLQlwMiA9IHAxOwotICAgIH0KLQotICAgIC8qIHNpbmNlIHRoZSB1c2VyIHR5cGVkIHRoaXMsIG5vIG5lZWQgdG8gd2FpdCBmb3IgcmV0dXJuICovCi0gICAgaWYgKG1zZ19kaWRvdXQpCi0JbXNnX3B1dGNoYXIoJ1xuJyk7Ci0gICAgbmVlZF93YWl0X3JldHVybiA9IEZBTFNFOwotICAgIG1zZ19kaWRvdXQgPSBGQUxTRTsKLQotICAgIGZyZWVfY3J5cHRfa2V5KHAyKTsKLSAgICByZXR1cm4gcDE7Ci19Ci0KLSNlbmRpZiAvKiBGRUFUX0NSWVBUICovCi0KIC8qIFRPRE86IG1ha2Ugc29tZSAjaWZkZWYgZm9yIHRoaXMgKi8KIC8qLS0tLS0tLS1bIGZpbGUgc2VhcmNoaW5nIF0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCkBAIC02NTg4LDggKzYyNzIsMjMgQEAKICAgICBGSUxFCSpmZDsKICAgICB0aW1lX3QJdGhlX3RpbWU7CiB7CisgICAgY2hhcl91CWJ1Zls4XTsKKworICAgIHRpbWVfdG9fYnl0ZXModGhlX3RpbWUsIGJ1Zik7CisgICAgZndyaXRlKGJ1ZiwgKHNpemVfdCk4LCAoc2l6ZV90KTEsIGZkKTsKK30KKworLyoKKyAqIFdyaXRlIHRpbWVfdCB0byAiYnVmWzhdIi4KKyAqLworICAgIHZvaWQKK3RpbWVfdG9fYnl0ZXModGhlX3RpbWUsIGJ1ZikKKyAgICB0aW1lX3QJdGhlX3RpbWU7CisgICAgY2hhcl91CSpidWY7Cit7CiAgICAgaW50CQljOwogICAgIGludAkJaTsKKyAgICBpbnQJCWJpID0gMDsKICAgICB0aW1lX3QJd3RpbWUgPSB0aGVfdGltZTsKIAogICAgIC8qIHRpbWVfdCBjYW4gYmUgdXAgdG8gOCBieXRlcyBpbiBzaXplLCBtb3JlIHRoYW4gbG9uZ191LCB0aHVzIHdlCkBAIC02NjAzLDcgKzYzMDIsNyBAQAogICAgIHsKIAlpZiAoaSArIDEgPiAoaW50KXNpemVvZih0aW1lX3QpKQogCSAgICAvKiAiPj4iIGRvZXNuJ3Qgd29yayB3ZWxsIHdoZW4gc2hpZnRpbmcgbW9yZSBiaXRzIHRoYW4gYXZhaWwgKi8KLQkgICAgcHV0YygwLCBmZCk7CisJICAgIGJ1ZltiaSsrXSA9IDA7CiAJZWxzZQogCXsKICNpZiBkZWZpbmVkKFNJWkVPRl9USU1FX1QpICYmIFNJWkVPRl9USU1FX1QgPiA0CkBAIC02NjExLDcgKzYzMTAsNyBAQAogI2Vsc2UKIAkgICAgYyA9IChpbnQpKChsb25nX3Upd3RpbWUgPj4gKGkgKiA4KSk7CiAjZW5kaWYKLQkgICAgcHV0YyhjLCBmZCk7CisJICAgIGJ1ZltiaSsrXSA9IGM7CiAJfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9vcHRpb24uYyBiL3NyYy9vcHRpb24uYwppbmRleCAzZTYxNjRlLi42MjU1NmI2IDEwMDY0NAotLS0gYS9zcmMvb3B0aW9uLmMKKysrIGIvc3JjL29wdGlvbi5jCkBAIC0yOTg5LDcgKzI5ODksNyBAQAogc3RhdGljIGNoYXIgKihwX25mX3ZhbHVlc1tdKSA9IHsib2N0YWwiLCAiaGV4IiwgImFscGhhIiwgTlVMTH07CiBzdGF0aWMgY2hhciAqKHBfZmZfdmFsdWVzW10pID0ge0ZGX1VOSVgsIEZGX0RPUywgRkZfTUFDLCBOVUxMfTsKICNpZmRlZiBGRUFUX0NSWVBUCi1zdGF0aWMgY2hhciAqKHBfY21fdmFsdWVzW10pID0geyJ6aXAiLCAiYmxvd2Zpc2giLCBOVUxMfTsKK3N0YXRpYyBjaGFyICoocF9jbV92YWx1ZXNbXSkgPSB7InppcCIsICJibG93ZmlzaCIsICJibG93ZmlzaDIiLCBOVUxMfTsKICNlbmRpZgogI2lmZGVmIEZFQVRfQ01ETF9DT01QTAogc3RhdGljIGNoYXIgKihwX3dvcF92YWx1ZXNbXSkgPSB7InRhZ2ZpbGUiLCBOVUxMfTsKQEAgLTYxNDAsNyArNjE0MCw3IEBACiAjIGVuZGlmCiAJaWYgKFNUUkNNUChjdXJidWYtPmJfcF9rZXksIG9sZHZhbCkgIT0gMCkKIAkgICAgLyogTmVlZCB0byB1cGRhdGUgdGhlIHN3YXBmaWxlLiAqLwotCSAgICBtbF9zZXRfY3J5cHRfa2V5KGN1cmJ1Ziwgb2xkdmFsLCBnZXRfY3J5cHRfbWV0aG9kKGN1cmJ1ZikpOworCSAgICBtbF9zZXRfY3J5cHRfa2V5KGN1cmJ1Ziwgb2xkdmFsLCBjcnlwdF9nZXRfbWV0aG9kX25yKGN1cmJ1ZikpOwogICAgIH0KIAogICAgIGVsc2UgaWYgKGd2YXJwID09ICZwX2NtKQpAQCAtNjE1MSw3ICs2MTUxLDcgQEAKIAkgICAgcCA9IHBfY207CiAJaWYgKGNoZWNrX29wdF9zdHJpbmdzKHAsIHBfY21fdmFsdWVzLCBUUlVFKSAhPSBPSykKIAkgICAgZXJybXNnID0gZV9pbnZhcmc7Ci0JZWxzZSBpZiAoZ2V0X2NyeXB0X21ldGhvZChjdXJidWYpID4gMCAmJiBibG93ZmlzaF9zZWxmX3Rlc3QoKSA9PSBGQUlMKQorCWVsc2UgaWYgKGNyeXB0X3NlbGZfdGVzdCgpID09IEZBSUwpCiAJICAgIGVycm1zZyA9IGVfaW52YXJnOwogCWVsc2UKIAl7CkBAIC02MTc3LDcgKzYxNzcsNyBAQAogCQlwID0gY3VyYnVmLT5iX3BfY207CiAJICAgIGlmIChTVFJDTVAocywgcCkgIT0gMCkKIAkJbWxfc2V0X2NyeXB0X2tleShjdXJidWYsIGN1cmJ1Zi0+Yl9wX2tleSwKLQkJCQkJCSBjcnlwdF9tZXRob2RfZnJvbV9zdHJpbmcocykpOworCQkJCQkJY3J5cHRfbWV0aG9kX25yX2Zyb21fbmFtZShzKSk7CiAKIAkgICAgLyogSWYgdGhlIGdsb2JhbCB2YWx1ZSBjaGFuZ2VzIG5lZWQgdG8gdXBkYXRlIHRoZSBzd2FwZmlsZSBmb3IgYWxsCiAJICAgICAqIGJ1ZmZlcnMgdXNpbmcgdGhhdCB2YWx1ZS4gKi8KQEAgLTYxODgsNyArNjE4OCw3IEBACiAJCWZvciAoYnVmID0gZmlyc3RidWY7IGJ1ZiAhPSBOVUxMOyBidWYgPSBidWYtPmJfbmV4dCkKIAkJICAgIGlmIChidWYgIT0gY3VyYnVmICYmICpidWYtPmJfcF9jbSA9PSBOVUwpCiAJCQltbF9zZXRfY3J5cHRfa2V5KGJ1ZiwgYnVmLT5iX3Bfa2V5LAotCQkJCQkgICAgY3J5cHRfbWV0aG9kX2Zyb21fc3RyaW5nKG9sZHZhbCkpOworCQkJCQkgICBjcnlwdF9tZXRob2RfbnJfZnJvbV9uYW1lKG9sZHZhbCkpOwogCSAgICB9CiAJfQogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9wcm90by5oIGIvc3JjL3Byb3RvLmgKaW5kZXggMTkxZWNkOC4uMmIwOGViMyAxMDA2NDQKLS0tIGEvc3JjL3Byb3RvLmgKKysrIGIvc3JjL3Byb3RvLmgKQEAgLTcwLDYgKzcwLDggQEAKIAogIyBpZmRlZiBGRUFUX0NSWVBUCiAjICBpbmNsdWRlICJibG93ZmlzaC5wcm8iCisjICBpbmNsdWRlICJjcnlwdC5wcm8iCisjICBpbmNsdWRlICJjcnlwdF96aXAucHJvIgogIyBlbmRpZgogIyBpbmNsdWRlICJidWZmZXIucHJvIgogIyBpbmNsdWRlICJjaGFyc2V0LnBybyIKZGlmZiAtLWdpdCBhL3NyYy9wcm90by9ibG93ZmlzaC5wcm8gYi9zcmMvcHJvdG8vYmxvd2Zpc2gucHJvCmluZGV4IDRkNjRlMTAuLjY2ZDAyOWMgMTAwNjQ0Ci0tLSBhL3NyYy9wcm90by9ibG93ZmlzaC5wcm8KKysrIGIvc3JjL3Byb3RvL2Jsb3dmaXNoLnBybwpAQCAtMSwxMCArMSw2IEBACiAvKiBibG93ZmlzaC5jICovCi12b2lkIGJmX2tleV9pbml0IF9fQVJHUygoY2hhcl91ICpwYXNzd29yZCwgY2hhcl91ICpzYWx0LCBpbnQgc2FsdF9sZW4pKTsKLXZvaWQgYmZfY2ZiX2luaXQgX19BUkdTKChjaGFyX3UgKml2LCBpbnQgaXZfbGVuKSk7Ci12b2lkIGJmX2NyeXB0X2VuY29kZSBfX0FSR1MoKGNoYXJfdSAqZnJvbSwgc2l6ZV90IGxlbiwgY2hhcl91ICp0bykpOwotdm9pZCBiZl9jcnlwdF9kZWNvZGUgX19BUkdTKChjaGFyX3UgKnB0ciwgbG9uZyBsZW4pKTsKLXZvaWQgYmZfY3J5cHRfaW5pdF9rZXlzIF9fQVJHUygoY2hhcl91ICpwYXNzd2QpKTsKLXZvaWQgYmZfY3J5cHRfc2F2ZSBfX0FSR1MoKHZvaWQpKTsKLXZvaWQgYmZfY3J5cHRfcmVzdG9yZSBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgY3J5cHRfYmxvd2Zpc2hfZW5jb2RlIF9fQVJHUygoY3J5cHRzdGF0ZV9UICpzdGF0ZSwgY2hhcl91ICpmcm9tLCBzaXplX3QgbGVuLCBjaGFyX3UgKnRvKSk7Cit2b2lkIGNyeXB0X2Jsb3dmaXNoX2RlY29kZSBfX0FSR1MoKGNyeXB0c3RhdGVfVCAqc3RhdGUsIGNoYXJfdSAqZnJvbSwgc2l6ZV90IGxlbiwgY2hhcl91ICp0bykpOwordm9pZCBjcnlwdF9ibG93ZmlzaF9pbml0IF9fQVJHUygoY3J5cHRzdGF0ZV9UICpzdGF0ZSwgY2hhcl91ICprZXksIGNoYXJfdSAqc2FsdCwgaW50IHNhbHRfbGVuLCBjaGFyX3UgKnNlZWQsIGludCBzZWVkX2xlbikpOwogaW50IGJsb3dmaXNoX3NlbGZfdGVzdCBfX0FSR1MoKHZvaWQpKTsKIC8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL2NyeXB0LnBybyBiL3NyYy9wcm90by9jcnlwdC5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYxZGY3MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9jcnlwdC5wcm8KQEAgLTAsMCArMSwyNCBAQAorLyogY3J5cHQuYyAqLworaW50IGNyeXB0X21ldGhvZF9ucl9mcm9tX25hbWUgX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKK2ludCBjcnlwdF9tZXRob2RfbnJfZnJvbV9tYWdpYyBfX0FSR1MoKGNoYXIgKnB0ciwgaW50IGxlbikpOworaW50IGNyeXB0X3dvcmtzX2lucGxhY2UgX19BUkdTKChjcnlwdHN0YXRlX1QgKnN0YXRlKSk7CitpbnQgY3J5cHRfZ2V0X21ldGhvZF9uciBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKK2ludCBjcnlwdF93aG9sZV91bmRvZmlsZSBfX0FSR1MoKGludCBtZXRob2RfbnIpKTsKK2ludCBjcnlwdF9nZXRfaGVhZGVyX2xlbiBfX0FSR1MoKGludCBtZXRob2RfbnIpKTsKK3ZvaWQgY3J5cHRfc2V0X2NtX29wdGlvbiBfX0FSR1MoKGJ1Zl9UICpidWYsIGludCBtZXRob2RfbnIpKTsKK2ludCBjcnlwdF9zZWxmX3Rlc3QgX19BUkdTKCh2b2lkKSk7CitjcnlwdHN0YXRlX1QgKmNyeXB0X2NyZWF0ZSBfX0FSR1MoKGludCBtZXRob2RfbnIsIGNoYXJfdSAqa2V5LCBjaGFyX3UgKnNhbHQsIGludCBzYWx0X2xlbiwgY2hhcl91ICpzZWVkLCBpbnQgc2VlZF9sZW4pKTsKK2NyeXB0c3RhdGVfVCAqY3J5cHRfY3JlYXRlX2Zyb21faGVhZGVyIF9fQVJHUygoaW50IG1ldGhvZF9uciwgY2hhcl91ICprZXksIGNoYXJfdSAqaGVhZGVyKSk7CitjcnlwdHN0YXRlX1QgKmNyeXB0X2NyZWF0ZV9mcm9tX2ZpbGUgX19BUkdTKChGSUxFICpmcCwgY2hhcl91ICprZXkpKTsKK2NyeXB0c3RhdGVfVCAqY3J5cHRfY3JlYXRlX2Zvcl93cml0aW5nIF9fQVJHUygoaW50IG1ldGhvZF9uciwgY2hhcl91ICprZXksIGNoYXJfdSAqKmhlYWRlciwgaW50ICpoZWFkZXJfbGVuKSk7Cit2b2lkIGNyeXB0X2ZyZWVfc3RhdGUgX19BUkdTKChjcnlwdHN0YXRlX1QgKnN0YXRlKSk7Citsb25nIGNyeXB0X2VuY29kZV9hbGxvYyBfX0FSR1MoKGNyeXB0c3RhdGVfVCAqc3RhdGUsIGNoYXJfdSAqZnJvbSwgc2l6ZV90IGxlbiwgY2hhcl91ICoqbmV3cHRyKSk7Citsb25nIGNyeXB0X2RlY29kZV9hbGxvYyBfX0FSR1MoKGNyeXB0c3RhdGVfVCAqc3RhdGUsIGNoYXJfdSAqcHRyLCBsb25nIGxlbiwgY2hhcl91ICoqbmV3cHRyKSk7Cit2b2lkIGNyeXB0X2VuY29kZSBfX0FSR1MoKGNyeXB0c3RhdGVfVCAqc3RhdGUsIGNoYXJfdSAqZnJvbSwgc2l6ZV90IGxlbiwgY2hhcl91ICp0bykpOwordm9pZCBjcnlwdF9kZWNvZGUgX19BUkdTKChjcnlwdHN0YXRlX1QgKnN0YXRlLCBjaGFyX3UgKmZyb20sIHNpemVfdCBsZW4sIGNoYXJfdSAqdG8pKTsKK3ZvaWQgY3J5cHRfZW5jb2RlX2lucGxhY2UgX19BUkdTKChjcnlwdHN0YXRlX1QgKnN0YXRlLCBjaGFyX3UgKmJ1Ziwgc2l6ZV90IGxlbikpOwordm9pZCBjcnlwdF9kZWNvZGVfaW5wbGFjZSBfX0FSR1MoKGNyeXB0c3RhdGVfVCAqc3RhdGUsIGNoYXJfdSAqYnVmLCBzaXplX3QgbGVuKSk7Cit2b2lkIGNyeXB0X2ZyZWVfa2V5IF9fQVJHUygoY2hhcl91ICprZXkpKTsKK2NoYXJfdSAqY3J5cHRfZ2V0X2tleSBfX0FSR1MoKGludCBzdG9yZSwgaW50IHR3aWNlKSk7Cit2b2lkIGNyeXB0X2FwcGVuZF9tc2cgX19BUkdTKChidWZfVCAqYnVmKSk7CisvKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm90by9jcnlwdF96aXAucHJvIGIvc3JjL3Byb3RvL2NyeXB0X3ppcC5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0ZTEzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm90by9jcnlwdF96aXAucHJvCkBAIC0wLDAgKzEsNSBAQAorLyogY3J5cHRfemlwLmMgKi8KK3ZvaWQgY3J5cHRfemlwX2luaXQgX19BUkdTKChjcnlwdHN0YXRlX1QgKnN0YXRlLCBjaGFyX3UgKmtleSwgY2hhcl91ICpzYWx0LCBpbnQgc2FsdF9sZW4sIGNoYXJfdSAqc2VlZCwgaW50IHNlZWRfbGVuKSk7Cit2b2lkIGNyeXB0X3ppcF9lbmNvZGUgX19BUkdTKChjcnlwdHN0YXRlX1QgKnN0YXRlLCBjaGFyX3UgKmZyb20sIHNpemVfdCBsZW4sIGNoYXJfdSAqdG8pKTsKK3ZvaWQgY3J5cHRfemlwX2RlY29kZSBfX0FSR1MoKGNyeXB0c3RhdGVfVCAqc3RhdGUsIGNoYXJfdSAqZnJvbSwgc2l6ZV90IGxlbiwgY2hhcl91ICp0bykpOworLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vZmlsZWlvLnBybyBiL3NyYy9wcm90by9maWxlaW8ucHJvCmluZGV4IDdhYTk5Y2YuLjBkNTMyZjQgMTAwNjQ0Ci0tLSBhL3NyYy9wcm90by9maWxlaW8ucHJvCisrKyBiL3NyYy9wcm90by9maWxlaW8ucHJvCkBAIC00LDggKzQsNiBAQAogaW50IHByZXBfZXhhcmcgX19BUkdTKChleGFyZ19UICplYXAsIGJ1Zl9UICpidWYpKTsKIHZvaWQgc2V0X2ZpbGVfb3B0aW9ucyBfX0FSR1MoKGludCBzZXRfb3B0aW9ucywgZXhhcmdfVCAqZWFwKSk7CiB2b2lkIHNldF9mb3JjZWRfZmVuYyBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwotaW50IHByZXBhcmVfY3J5cHRfcmVhZCBfX0FSR1MoKEZJTEUgKmZwKSk7Ci1jaGFyX3UgKnByZXBhcmVfY3J5cHRfd3JpdGUgX19BUkdTKChidWZfVCAqYnVmLCBpbnQgKmxlbnApKTsKIGludCBjaGVja19maWxlX3JlYWRvbmx5IF9fQVJHUygoY2hhcl91ICpmbmFtZSwgaW50IHBlcm0pKTsKIGludCBidWZfd3JpdGUgX19BUkdTKChidWZfVCAqYnVmLCBjaGFyX3UgKmZuYW1lLCBjaGFyX3UgKnNmbmFtZSwgbGluZW5yX1Qgc3RhcnQsIGxpbmVucl9UIGVuZCwgZXhhcmdfVCAqZWFwLCBpbnQgYXBwZW5kLCBpbnQgZm9yY2VpdCwgaW50IHJlc2V0X2NoYW5nZWQsIGludCBmaWx0ZXJpbmcpKTsKIHZvaWQgbXNnX2FkZF9mbmFtZSBfX0FSR1MoKGJ1Zl9UICpidWYsIGNoYXJfdSAqZm5hbWUpKTsKZGlmZiAtLWdpdCBhL3NyYy9wcm90by9taXNjMi5wcm8gYi9zcmMvcHJvdG8vbWlzYzIucHJvCmluZGV4IDRmZDQ1NzMuLmIyZjcyZDggMTAwNjQ0Ci0tLSBhL3NyYy9wcm90by9taXNjMi5wcm8KKysrIGIvc3JjL3Byb3RvL21pc2MyLnBybwpAQCAtODQsMTYgKzg0LDYgQEAKIGNoYXJfdSAqcGFyc2Vfc2hhcGVfb3B0IF9fQVJHUygoaW50IHdoYXQpKTsKIGludCBnZXRfc2hhcGVfaWR4IF9fQVJHUygoaW50IG1vdXNlKSk7CiB2b2lkIHVwZGF0ZV9tb3VzZXNoYXBlIF9fQVJHUygoaW50IHNoYXBlX2lkeCkpOwotaW50IGNyeXB0X21ldGhvZF9mcm9tX3N0cmluZyBfX0FSR1MoKGNoYXJfdSAqcykpOwotaW50IGdldF9jcnlwdF9tZXRob2QgX19BUkdTKChidWZfVCAqYnVmKSk7Ci12b2lkIHNldF9jcnlwdF9tZXRob2QgX19BUkdTKChidWZfVCAqYnVmLCBpbnQgbWV0aG9kKSk7Ci12b2lkIGNyeXB0X3B1c2hfc3RhdGUgX19BUkdTKCh2b2lkKSk7Ci12b2lkIGNyeXB0X3BvcF9zdGF0ZSBfX0FSR1MoKHZvaWQpKTsKLXZvaWQgY3J5cHRfZW5jb2RlIF9fQVJHUygoY2hhcl91ICpmcm9tLCBzaXplX3QgbGVuLCBjaGFyX3UgKnRvKSk7Ci12b2lkIGNyeXB0X2RlY29kZSBfX0FSR1MoKGNoYXJfdSAqcHRyLCBsb25nIGxlbikpOwotdm9pZCBjcnlwdF9pbml0X2tleXMgX19BUkdTKChjaGFyX3UgKnBhc3N3ZCkpOwotdm9pZCBmcmVlX2NyeXB0X2tleSBfX0FSR1MoKGNoYXJfdSAqa2V5KSk7Ci1jaGFyX3UgKmdldF9jcnlwdF9rZXkgX19BUkdTKChpbnQgc3RvcmUsIGludCB0d2ljZSkpOwogdm9pZCAqdmltX2ZpbmRmaWxlX2luaXQgX19BUkdTKChjaGFyX3UgKnBhdGgsIGNoYXJfdSAqZmlsZW5hbWUsIGNoYXJfdSAqc3RvcGRpcnMsIGludCBsZXZlbCwgaW50IGZyZWVfdmlzaXRlZCwgaW50IGZpbmRfd2hhdCwgdm9pZCAqc2VhcmNoX2N0eF9hcmcsIGludCB0YWdmaWxlLCBjaGFyX3UgKnJlbF9mbmFtZSkpOwogY2hhcl91ICp2aW1fZmluZGZpbGVfc3RvcGRpciBfX0FSR1MoKGNoYXJfdSAqYnVmKSk7CiB2b2lkIHZpbV9maW5kZmlsZV9jbGVhbnVwIF9fQVJHUygodm9pZCAqY3R4KSk7CkBAIC0xMTYsNSArMTA2LDYgQEAKIGNoYXJfdSAqcmVhZF9zdHJpbmcgX19BUkdTKChGSUxFICpmZCwgaW50IGNudCkpOwogaW50IHB1dF9ieXRlcyBfX0FSR1MoKEZJTEUgKmZkLCBsb25nX3UgbnIsIGludCBsZW4pKTsKIHZvaWQgcHV0X3RpbWUgX19BUkdTKChGSUxFICpmZCwgdGltZV90IHRoZV90aW1lKSk7Cit2b2lkIHRpbWVfdG9fYnl0ZXMgX19BUkdTKCh0aW1lX3QgdGhlX3RpbWUsIGNoYXJfdSAqYnVmKSk7CiBpbnQgaGFzX25vbl9hc2NpaSBfX0FSR1MoKGNoYXJfdSAqcykpOwogLyogdmltOiBzZXQgZnQ9YyA6ICovCmRpZmYgLS1naXQgYS9zcmMvc3RydWN0cy5oIGIvc3JjL3N0cnVjdHMuaAppbmRleCAxMzgyMzgwLi40NDFmY2FhIDEwMDY0NAotLS0gYS9zcmMvc3RydWN0cy5oCisrKyBiL3NyYy9zdHJ1Y3RzLmgKQEAgLTEyNTEsNiArMTI1MSwyNCBAQAogfSBzeW5fdGltZV9UOwogI2VuZGlmCiAKKyNpZmRlZiBGRUFUX0NSWVBUCisvKgorICogU3RydWN0dXJlIHRvIGhvbGQgdGhlIHR5cGUgb2YgZW5jcnlwdGlvbiBhbmQgdGhlIHN0YXRlIG9mIGVuY3J5cHRpb24gb3IKKyAqIGRlY3J5cHRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQJICAgIG1ldGhvZF9ucjsKKyAgICB2b2lkICAgICptZXRob2Rfc3RhdGU7ICAvKiBtZXRob2Qtc3BlY2lmaWMgc3RhdGUgaW5mb3JtYXRpb24gKi8KK30gY3J5cHRzdGF0ZV9UOworCisvKiB2YWx1ZXMgZm9yIG1ldGhvZF9uciAqLworIyBkZWZpbmUgQ1JZUFRfTV9aSVAJMAorIyBkZWZpbmUgQ1JZUFRfTV9CRgkxCisjIGRlZmluZSBDUllQVF9NX0JGMgkyCisjIGRlZmluZSBDUllQVF9NX0NPVU5UCTMgLyogbnVtYmVyIG9mIGNyeXB0IG1ldGhvZHMgKi8KKyNlbmRpZgorCisKIC8qCiAgKiBUaGVzZSBhcmUgaXRlbXMgbm9ybWFsbHkgcmVsYXRlZCB0byBhIGJ1ZmZlci4gIEJ1dCB3aGVuIHVzaW5nICI6b3duc3ludGF4IgogICogYSB3aW5kb3cgbWF5IGhhdmUgaXRzIG93biBpbnN0YW5jZS4KQEAgLTE3NzgsNyArMTc5NiwxMiBAQAogICAgIGludAkJYl93YXNfbmV0YmVhbnNfZmlsZTsvKiBUUlVFIGlmIGJfbmV0YmVhbnNfZmlsZSB3YXMgb25jZSBzZXQgKi8KICNlbmRpZgogCi19OworI2lmZGVmIEZFQVRfQ1JZUFQKKyAgICBjcnlwdHN0YXRlX1QgKmJfY3J5cHRzdGF0ZTsJLyogRW5jcnlwdGlvbiBzdGF0ZSB3aGlsZSByZWFkaW5nIG9yIHdyaXRpbmcKKwkJCQkgKiB0aGUgZmlsZS4gTlVMTCB3aGVuIG5vdCB1c2luZyBlbmNyeXB0aW9uLiAqLworI2VuZGlmCisKK307IC8qIGZpbGVfYnVmZmVyICovCiAKIAogI2lmZGVmIEZFQVRfRElGRgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDcxLmluIGIvc3JjL3Rlc3RkaXIvdGVzdDcxLmluCmluZGV4IDE1NWZkNDEuLjk0NGI2OWQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0ZGlyL3Rlc3Q3MS5pbgorKysgYi9zcmMvdGVzdGRpci90ZXN0NzEuaW4KQEAgLTEzLDYgKzEzLDggQEAKIDpsZXQgY20wX2J5dGVzID0gZ2V0bGluZSgnLicsICcuJykKIDovXnN0YXJ0IG9mIGNtPWJsb3dmaXNoIGJ5dGVzLysxCiA6bGV0IGNtMV9ieXRlcyA9IGdldGxpbmUoJy4nLCAnLicpCis6L15zdGFydCBvZiBjbT1ibG93ZmlzaDIgYnl0ZXMvKzEKKzpsZXQgY20yX2J5dGVzID0gZ2V0bGluZSgnLicsICcuJykKIDpid2lwZSEKIDpjYWxsIGFwcGVuZCgwLCB0ZXh0X2xpbmVzKQogOiRkCkBAIC0zNiw2ICszOCwxOCBAQAogOmUgWHRlc3RmaWxlCiBiYXJmb28KIDpsZXQgY20xX3JlYWRfYmFjayA9IGdldGxpbmUoJy4nLCAnJCcpCis6c2V0IGtleT0KKzpzZXQgY3J5cHRtZXRob2Q9Ymxvd2Zpc2gyCis6IiBJZiB0aGUgYmxvd2Zpc2ggdGVzdCBmYWlscyAnY3J5cHRtZXRob2QnIHdpbGwgYmUgJ3ppcCcgbm93LgorOiVzL14vXD0mY3J5cHRtZXRob2QgPT0gJ2Jsb3dmaXNoMicgPyAiT0sgIiA6ICJibG93ZmlzaCB0ZXN0IGZhaWxlZCAiLworOlgKK2JhcjJmb28KK2JhcjJmb28KKzp3ISBYdGVzdGZpbGUKKzpid2lwZSEKKzplIFh0ZXN0ZmlsZQorYmFyMmZvbworOmxldCBjbTJfcmVhZF9iYWNrID0gZ2V0bGluZSgnLicsICckJykKIDpid2lwZSEKIDpzZXQgYmluIG5vZW9sIGtleT0KIDpjYWxsIGFwcGVuZCgwLCBjbTBfYnl0ZXMpCkBAIC01Nyw3ICs3MSwyMCBAQAogOnNldCBub2JpbgogOmUgWHRlc3RmaWxlCiBiYXJiYXIKKzpsZXQgY20xX3JlYWRfYmluID0gZ2V0bGluZSgnLicsICckJykKKzpid2lwZSEKKzpzZXQgYmluIG5vZW9sIGtleT0KKzpjYWxsIGFwcGVuZCgwLCBjbTJfYnl0ZXMpCis6JGQKKzpzZXQgZmVuYz1sYXRpbjEKKzp3ISBYdGVzdGZpbGUKKzpid2lwZSEKKzpzZXQgbm9iaW4KKzplIFh0ZXN0ZmlsZQorYmFyYnVycAorOmNhbGwgYXBwZW5kKDAsIGNtMV9yZWFkX2JpbikKIDpjYWxsIGFwcGVuZCgwLCBjbTBfcmVhZF9iaW4pCis6Y2FsbCBhcHBlbmQoMCwgY20yX3JlYWRfYmFjaykKIDpjYWxsIGFwcGVuZCgwLCBjbTFfcmVhZF9iYWNrKQogOmNhbGwgYXBwZW5kKDAsIGNtMF9yZWFkX2JhY2spCiA6c2V0IGtleT0gZmVuYz1sYXRpbjEKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3Q3MS5vayBiL3NyYy90ZXN0ZGlyL3Rlc3Q3MS5vawppbmRleCAyNDY1MmM0Li5kZTFiMGFiIDEwMDY0NAotLS0gYS9zcmMvdGVzdGRpci90ZXN0NzEub2sKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDcxLm9rCkBAIC00LDcgKzQsMTIgQEAKIE9LIDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3CiBPSyBsaW5lIDIgIGZvbyBiYXIgYmxhaAogT0sgbGluZSAzIHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAorT0sgT0sgMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1NjcKK09LIE9LIGxpbmUgMiAgZm9vIGJhciBibGFoCitPSyBPSyBsaW5lIDMgeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CiAxMjM0NTY3ODkwCiBh4WJiY2NkZGXrZmYKIGFzZGZhc2RmYXNkZgogMDAwMTExMjIyMzMzMworYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKKyFAIyQlXiYqKClfKz0tYH4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3Q3MWEuaW4gYi9zcmMvdGVzdGRpci90ZXN0NzFhLmluCmluZGV4IDg1YmQyMmMuLmU3OWEzOTggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0ZGlyL3Rlc3Q3MWEuaW4KKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDcxYS5pbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NzIuaW4gYi9zcmMvdGVzdGRpci90ZXN0NzIuaW4KaW5kZXggM2IzYTZhNC4uMDMxZWRiZiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RkaXIvdGVzdDcyLmluCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q3Mi5pbgpAQCAtODEsNiArODEsNyBAQAogOiIKIDoiIFdpdGggZW5jcnlwdGlvbiwgY3J5cHRtZXRob2Q9Ymxvd2Zpc2gKIDplISBYdGVzdGZpbGUKK3J1YmJpc2gKIDpzZXQgdW5kb2ZpbGUgY209Ymxvd2Zpc2gKIGdnZEdpamFuCiBmZWIKQEAgLTEwNCw2ICsxMDUsMzIgQEAKIHU6LncgPj50ZXN0Lm91dAogdToudyA+PnRlc3Qub3V0CiA6IgorOiIgV2l0aCBlbmNyeXB0aW9uLCBjcnlwdG1ldGhvZD1ibG93ZmlzaDIKKzplISBYdGVzdGZpbGUKK3J1YmJpc2gKKzpzZXQgdW5kb2ZpbGUgY209Ymxvd2Zpc2gyCitnZ2RHaWphbgorZmViCittYXIKK2FwcgoranVuGzpzZXQgdWw9MTAwCitrazBpZm9vIBs6c2V0IHVsPTEwMAorZGQ6c2V0IHVsPTEwMAoraWJhciAbOnNldCB1bD0xMDAKKzpYCitmb28yYmFyCitmb28yYmFyCis6dyEKKzpid2lwZSEKKzplIFh0ZXN0ZmlsZQorZm9vMmJhcgorOnNldCBrZXk9CisvYmFyCis6LncgPj50ZXN0Lm91dAordToudyA+PnRlc3Qub3V0Cit1Oi53ID4+dGVzdC5vdXQKK3U6LncgPj50ZXN0Lm91dAorOiIKIDoiIFJlbmFtZSB0aGUgdW5kbyBmaWxlIHNvIHRoYXQgaXQgZ2V0cyBjbGVhbmVkIHVwLgogOmlmIGhhcygidm1zIikKIDogY2FsbCByZW5hbWUoIl91bl9YdGVzdGZpbGUiLCAiWHRlc3R1bmRvIikKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3Q3Mi5vayBiL3NyYy90ZXN0ZGlyL3Rlc3Q3Mi5vawppbmRleCBiYjI2N2QwLi44ZDMwYmExIDEwMDY0NAotLS0gYS9zcmMvdGVzdGRpci90ZXN0NzIub2sKKysrIGIvc3JjL3Rlc3RkaXIvdGVzdDcyLm9rCkBAIC0yNSwzICsyNSw3IEBACiBhcHIKIGZvbyBtYXIKIG1hcgorYmFyIGFwcgorYXByCitmb28gbWFyCittYXIKZGlmZiAtLWdpdCBhL3NyYy91bmRvLmMgYi9zcmMvdW5kby5jCmluZGV4IDVkYjI1ZjAuLjE2NjFjODAgMTAwNjQ0Ci0tLSBhL3NyYy91bmRvLmMKKysrIGIvc3JjL3VuZG8uYwpAQCAtODEsOCArODEsMjUgQEAKICNkZWZpbmUgVUhfTUFHSUMgMHgxOGRhZGUJLyogdmFsdWUgZm9yIHVoX21hZ2ljIHdoZW4gaW4gdXNlICovCiAjZGVmaW5lIFVFX01BR0lDIDB4YWJjMTIzCS8qIHZhbHVlIGZvciB1ZV9tYWdpYyB3aGVuIGluIHVzZSAqLwogCisvKiBTaXplIG9mIGJ1ZmZlciB1c2VkIGZvciBlbmNyeXB0aW9uLiAqLworI2RlZmluZSBDUllQVF9CVUZfU0laRSA4MTkyCisKICNpbmNsdWRlICJ2aW0uaCIKIAorLyogU3RydWN0dXJlIHBhc3NlZCBhcm91bmQgYmV0d2VlbiBmdW5jdGlvbnMuCisgKiBBdm9pZHMgcGFzc2luZyBjcnlwdHN0YXRlX1Qgd2hlbiBlbmNyeXB0aW9uIG5vdCBhdmFpbGFibGUuICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgYnVmX1QJKmJpX2J1ZjsKKyAgICBGSUxFCSpiaV9mcDsKKyNpZmRlZiBGRUFUX0NSWVBUCisgICAgY3J5cHRzdGF0ZV9UICpiaV9zdGF0ZTsKKyAgICBjaGFyX3UJKmJpX2J1ZmZlcjsgLyogQ1JZUFRfQlVGX1NJWkUsIE5VTEwgd2hlbiBub3QgYnVmZmVyaW5nICovCisgICAgc2l6ZV90CWJpX3VzZWQ7ICAgIC8qIGJ5dGVzIHdyaXR0ZW4gdG8vcmVhZCBmcm9tIGJpX2J1ZmZlciAqLworICAgIHNpemVfdAliaV9hdmFpbDsgICAvKiBieXRlcyBhdmFpbGFibGUgaW4gYmlfYnVmZmVyICovCisjZW5kaWYKK30gYnVmaW5mb19UOworCisKIHN0YXRpYyBsb25nIGdldF91bmRvbGV2ZWwgX19BUkdTKCh2b2lkKSk7CiBzdGF0aWMgdm9pZCB1X3VuY2hfYnJhbmNoIF9fQVJHUygodV9oZWFkZXJfVCAqdWhwKSk7CiBzdGF0aWMgdV9lbnRyeV9UICp1X2dldF9oZWFkZW50cnkgX19BUkdTKCh2b2lkKSk7CkBAIC05OCwxOCArMTE1LDI2IEBACiAjaWZkZWYgRkVBVF9QRVJTSVNURU5UX1VORE8KIHN0YXRpYyB2b2lkIGNvcnJ1cHRpb25fZXJyb3IgX19BUkdTKChjaGFyICptZXNnLCBjaGFyX3UgKmZpbGVfbmFtZSkpOwogc3RhdGljIHZvaWQgdV9mcmVlX3VocCBfX0FSR1MoKHVfaGVhZGVyX1QgKnVocCkpOwotc3RhdGljIHNpemVfdCBmd3JpdGVfY3J5cHQgX19BUkdTKChidWZfVCAqYnVmIFVOVVNFRCwgY2hhcl91ICpwdHIsIHNpemVfdCBsZW4sIEZJTEUgKmZwKSk7Ci1zdGF0aWMgY2hhcl91ICpyZWFkX3N0cmluZ19kZWNyeXB0IF9fQVJHUygoYnVmX1QgKmJ1ZiBVTlVTRUQsIEZJTEUgKmZkLCBpbnQgbGVuKSk7Ci1zdGF0aWMgaW50IHNlcmlhbGl6ZV9oZWFkZXIgX19BUkdTKChGSUxFICpmcCwgYnVmX1QgKmJ1ZiwgY2hhcl91ICpoYXNoKSk7Ci1zdGF0aWMgaW50IHNlcmlhbGl6ZV91aHAgX19BUkdTKChGSUxFICpmcCwgYnVmX1QgKmJ1ZiwgdV9oZWFkZXJfVCAqdWhwKSk7Ci1zdGF0aWMgdV9oZWFkZXJfVCAqdW5zZXJpYWxpemVfdWhwIF9fQVJHUygoRklMRSAqZnAsIGNoYXJfdSAqZmlsZV9uYW1lKSk7Ci1zdGF0aWMgaW50IHNlcmlhbGl6ZV91ZXAgX19BUkdTKChGSUxFICpmcCwgYnVmX1QgKmJ1ZiwgdV9lbnRyeV9UICp1ZXApKTsKLXN0YXRpYyB1X2VudHJ5X1QgKnVuc2VyaWFsaXplX3VlcCBfX0FSR1MoKEZJTEUgKmZwLCBpbnQgKmVycm9yLCBjaGFyX3UgKmZpbGVfbmFtZSkpOwotc3RhdGljIHZvaWQgc2VyaWFsaXplX3BvcyBfX0FSR1MoKHBvc19UIHBvcywgRklMRSAqZnApKTsKLXN0YXRpYyB2b2lkIHVuc2VyaWFsaXplX3BvcyBfX0FSR1MoKHBvc19UICpwb3MsIEZJTEUgKmZwKSk7Ci1zdGF0aWMgdm9pZCBzZXJpYWxpemVfdmlzdWFsaW5mbyBfX0FSR1MoKHZpc3VhbGluZm9fVCAqaW5mbywgRklMRSAqZnApKTsKLXN0YXRpYyB2b2lkIHVuc2VyaWFsaXplX3Zpc3VhbGluZm8gX19BUkdTKCh2aXN1YWxpbmZvX1QgKmluZm8sIEZJTEUgKmZwKSk7Ci1zdGF0aWMgdm9pZCBwdXRfaGVhZGVyX3B0ciBfX0FSR1MoKEZJTEUJKmZwLCB1X2hlYWRlcl9UICp1aHApKTsKK3N0YXRpYyBpbnQgdW5kb193cml0ZSBfX0FSR1MoKGJ1ZmluZm9fVCAqYmksIGNoYXJfdSAqcHRyLCBzaXplX3QgbGVuKSk7CitzdGF0aWMgaW50IHVuZG9fZmx1c2ggX19BUkdTKChidWZpbmZvX1QgKmJpKSk7CitzdGF0aWMgaW50IGZ3cml0ZV9jcnlwdCBfX0FSR1MoKGJ1ZmluZm9fVCAqYmksIGNoYXJfdSAqcHRyLCBzaXplX3QgbGVuKSk7CitzdGF0aWMgaW50IHVuZG9fd3JpdGVfYnl0ZXMgX19BUkdTKChidWZpbmZvX1QgKmJpLCBsb25nX3UgbnIsIGludCBsZW4pKTsKK3N0YXRpYyB2b2lkIHB1dF9oZWFkZXJfcHRyIF9fQVJHUygoYnVmaW5mb19UICpiaSwgdV9oZWFkZXJfVCAqdWhwKSk7CitzdGF0aWMgaW50IHVuZG9fcmVhZF80YyBfX0FSR1MoKGJ1ZmluZm9fVCAqYmkpKTsKK3N0YXRpYyBpbnQgdW5kb19yZWFkXzJjIF9fQVJHUygoYnVmaW5mb19UICpiaSkpOworc3RhdGljIGludCB1bmRvX3JlYWRfYnl0ZSBfX0FSR1MoKGJ1ZmluZm9fVCAqYmkpKTsKK3N0YXRpYyB0aW1lX3QgdW5kb19yZWFkX3RpbWUgX19BUkdTKChidWZpbmZvX1QgKmJpKSk7CitzdGF0aWMgaW50IHVuZG9fcmVhZCBfX0FSR1MoKGJ1ZmluZm9fVCAqYmksIGNoYXJfdSAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkpOworc3RhdGljIGNoYXJfdSAqcmVhZF9zdHJpbmdfZGVjcnlwdCBfX0FSR1MoKGJ1ZmluZm9fVCAqYmksIGludCBsZW4pKTsKK3N0YXRpYyBpbnQgc2VyaWFsaXplX2hlYWRlciBfX0FSR1MoKGJ1ZmluZm9fVCAqYmksIGNoYXJfdSAqaGFzaCkpOworc3RhdGljIGludCBzZXJpYWxpemVfdWhwIF9fQVJHUygoYnVmaW5mb19UICpiaSwgdV9oZWFkZXJfVCAqdWhwKSk7CitzdGF0aWMgdV9oZWFkZXJfVCAqdW5zZXJpYWxpemVfdWhwIF9fQVJHUygoYnVmaW5mb19UICpiaSwgY2hhcl91ICpmaWxlX25hbWUpKTsKK3N0YXRpYyBpbnQgc2VyaWFsaXplX3VlcCBfX0FSR1MoKGJ1ZmluZm9fVCAqYmksIHVfZW50cnlfVCAqdWVwKSk7CitzdGF0aWMgdV9lbnRyeV9UICp1bnNlcmlhbGl6ZV91ZXAgX19BUkdTKChidWZpbmZvX1QgKmJpLCBpbnQgKmVycm9yLCBjaGFyX3UgKmZpbGVfbmFtZSkpOworc3RhdGljIHZvaWQgc2VyaWFsaXplX3BvcyBfX0FSR1MoKGJ1ZmluZm9fVCAqYmksIHBvc19UIHBvcykpOworc3RhdGljIHZvaWQgdW5zZXJpYWxpemVfcG9zIF9fQVJHUygoYnVmaW5mb19UICpiaSwgcG9zX1QgKnBvcykpOworc3RhdGljIHZvaWQgc2VyaWFsaXplX3Zpc3VhbGluZm8gX19BUkdTKChidWZpbmZvX1QgKmJpLCB2aXN1YWxpbmZvX1QgKmluZm8pKTsKK3N0YXRpYyB2b2lkIHVuc2VyaWFsaXplX3Zpc3VhbGluZm8gX19BUkdTKChidWZpbmZvX1QgKmJpLCB2aXN1YWxpbmZvX1QgKmluZm8pKTsKICNlbmRpZgogCiAjZGVmaW5lIFVfQUxMT0NfTElORShzaXplKSBsYWxsb2MoKGxvbmdfdSkoc2l6ZSksIEZBTFNFKQpAQCAtODU5LDY4ICs4ODQsMjk0IEBACiB9CiAKIC8qCi0gKiBMaWtlIGZ3cml0ZSgpIGJ1dCBjcnlwdCB0aGUgYnl0ZXMgd2hlbiAna2V5JyBpcyBzZXQuCi0gKiBSZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bC4KKyAqIFdyaXRlIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgdG8gdGhlIHVuZG8gZmlsZS4KKyAqIEJ1ZmZlcnMgYW5kIGVuY3J5cHRzIGFzIG5lZWRlZC4KKyAqIFJldHVybnMgT0sgb3IgRkFJTC4KICAqLwotICAgIHN0YXRpYyBzaXplX3QKLWZ3cml0ZV9jcnlwdChidWYsIHB0ciwgbGVuLCBmcCkKLSAgICBidWZfVAkqYnVmIFVOVVNFRDsKKyAgICBzdGF0aWMgaW50Cit1bmRvX3dyaXRlKGJpLCBwdHIsIGxlbikKKyAgICBidWZpbmZvX1QJKmJpOwogICAgIGNoYXJfdQkqcHRyOwogICAgIHNpemVfdAlsZW47Ci0gICAgRklMRQkqZnA7Cit7CisjaWZkZWYgRkVBVF9DUllQVAorICAgIGlmIChiaS0+YmlfYnVmZmVyICE9IE5VTEwpCisgICAgeworCXNpemVfdAlsZW5fdG9kbyA9IGxlbjsKKwljaGFyX3UgICpwID0gcHRyOworCisJd2hpbGUgKGJpLT5iaV91c2VkICsgbGVuX3RvZG8gPj0gQ1JZUFRfQlVGX1NJWkUpCisJeworCSAgICBzaXplX3QJbiA9IENSWVBUX0JVRl9TSVpFIC0gYmktPmJpX3VzZWQ7CisKKwkgICAgbWNoX21lbW1vdmUoYmktPmJpX2J1ZmZlciArIGJpLT5iaV91c2VkLCBwLCBuKTsKKwkgICAgbGVuX3RvZG8gLT0gbjsKKwkgICAgcCArPSBuOworCSAgICBiaS0+YmlfdXNlZCA9IENSWVBUX0JVRl9TSVpFOworCSAgICBpZiAodW5kb19mbHVzaChiaSkgPT0gRkFJTCkKKwkJcmV0dXJuIEZBSUw7CisJfQorCWlmIChsZW5fdG9kbyA+IDApCisJeworCSAgICBtY2hfbWVtbW92ZShiaS0+YmlfYnVmZmVyICsgYmktPmJpX3VzZWQsIHAsIGxlbl90b2RvKTsKKwkgICAgYmktPmJpX3VzZWQgKz0gbGVuX3RvZG87CisJfQorCXJldHVybiBPSzsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoZndyaXRlKHB0ciwgbGVuLCAoc2l6ZV90KTEsIGJpLT5iaV9mcCkgIT0gMSkKKwlyZXR1cm4gRkFJTDsKKyAgICByZXR1cm4gT0s7Cit9CisKKyNpZmRlZiBGRUFUX0NSWVBUCisgICAgc3RhdGljIGludAordW5kb19mbHVzaChiaSkKKyAgICBidWZpbmZvX1QJKmJpOworeworICAgIGlmIChiaS0+YmlfdXNlZCA+IDApCisgICAgeworCWNyeXB0X2VuY29kZV9pbnBsYWNlKGJpLT5iaV9zdGF0ZSwgYmktPmJpX2J1ZmZlciwgYmktPmJpX3VzZWQpOworCWlmIChmd3JpdGUoYmktPmJpX2J1ZmZlciwgYmktPmJpX3VzZWQsIChzaXplX3QpMSwgYmktPmJpX2ZwKSAhPSAxKQorCSAgICByZXR1cm4gRkFJTDsKKwliaS0+YmlfdXNlZCA9IDA7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKyNlbmRpZgorCisvKgorICogV3JpdGUgInB0cltsZW5dIiBhbmQgY3J5cHQgdGhlIGJ5dGVzIHdoZW4gbmVlZGVkLgorICogUmV0dXJucyBPSyBvciBGQUlMLgorICovCisgICAgc3RhdGljIGludAorZndyaXRlX2NyeXB0KGJpLCBwdHIsIGxlbikKKyAgICBidWZpbmZvX1QJKmJpOworICAgIGNoYXJfdQkqcHRyOworICAgIHNpemVfdAlsZW47CiB7CiAjaWZkZWYgRkVBVF9DUllQVAogICAgIGNoYXJfdSAgKmNvcHk7CiAgICAgY2hhcl91ICBzbWFsbF9idWZbMTAwXTsKICAgICBzaXplX3QgIGk7CiAKLSAgICBpZiAoKmJ1Zi0+Yl9wX2tleSA9PSBOVUwpCi0JcmV0dXJuIGZ3cml0ZShwdHIsIGxlbiwgKHNpemVfdCkxLCBmcCk7Ci0gICAgaWYgKGxlbiA8IDEwMCkKLQljb3B5ID0gc21hbGxfYnVmOyAgLyogbm8gbWFsbG9jKCkvZnJlZSgpIGZvciBzaG9ydCBzdHJpbmdzICovCi0gICAgZWxzZQorICAgIGlmIChiaS0+Ymlfc3RhdGUgIT0gTlVMTCAmJiBiaS0+YmlfYnVmZmVyID09IE5VTEwpCiAgICAgewotCWNvcHkgPSBsYWxsb2MobGVuLCBGQUxTRSk7Ci0JaWYgKGNvcHkgPT0gTlVMTCkKLQkgICAgcmV0dXJuIDA7CisJLyogY3J5cHRpbmcgZXZlcnkgcGllY2Ugb2YgdGV4dCBzZXBhcmF0ZWx5ICovCisJaWYgKGxlbiA8IDEwMCkKKwkgICAgY29weSA9IHNtYWxsX2J1ZjsgIC8qIG5vIG1hbGxvYygpL2ZyZWUoKSBmb3Igc2hvcnQgc3RyaW5ncyAqLworCWVsc2UKKwl7CisJICAgIGNvcHkgPSBsYWxsb2MobGVuLCBGQUxTRSk7CisJICAgIGlmIChjb3B5ID09IE5VTEwpCisJCXJldHVybiAwOworCX0KKwljcnlwdF9lbmNvZGUoYmktPmJpX3N0YXRlLCBwdHIsIGxlbiwgY29weSk7CisJaSA9IGZ3cml0ZShjb3B5LCBsZW4sIChzaXplX3QpMSwgYmktPmJpX2ZwKTsKKwlpZiAoY29weSAhPSBzbWFsbF9idWYpCisJICAgIHZpbV9mcmVlKGNvcHkpOworCXJldHVybiBpID09IDEgPyBPSyA6IEZBSUw7CiAgICAgfQotICAgIGNyeXB0X2VuY29kZShwdHIsIGxlbiwgY29weSk7Ci0gICAgaSA9IGZ3cml0ZShjb3B5LCBsZW4sIChzaXplX3QpMSwgZnApOwotICAgIGlmIChjb3B5ICE9IHNtYWxsX2J1ZikKLQl2aW1fZnJlZShjb3B5KTsKLSAgICByZXR1cm4gaTsKLSNlbHNlCi0gICAgcmV0dXJuIGZ3cml0ZShwdHIsIGxlbiwgKHNpemVfdCkxLCBmcCk7CiAjZW5kaWYKKyAgICByZXR1cm4gdW5kb193cml0ZShiaSwgcHRyLCBsZW4pOwogfQogCiAvKgotICogUmVhZCBhIHN0cmluZyBvZiBsZW5ndGggImxlbiIgZnJvbSAiZmQiLgotICogV2hlbiAna2V5JyBpcyBzZXQgZGVjcnlwdCB0aGUgYnl0ZXMuCisgKiBXcml0ZSBhIG51bWJlciwgTVNCIGZpcnN0LCBpbiAibGVuIiBieXRlcy4KKyAqIE11c3QgbWF0Y2ggd2l0aCB1bmRvX3JlYWRfP2MoKSBmdW5jdGlvbnMuCisgKiBSZXR1cm5zIE9LIG9yIEZBSUwuCiAgKi8KLSAgICBzdGF0aWMgY2hhcl91ICoKLXJlYWRfc3RyaW5nX2RlY3J5cHQoYnVmLCBmZCwgbGVuKQotICAgIGJ1Zl9UICAgKmJ1ZiBVTlVTRUQ7Ci0gICAgRklMRSAgICAqZmQ7CisgICAgc3RhdGljIGludAordW5kb193cml0ZV9ieXRlcyhiaSwgbnIsIGxlbikKKyAgICBidWZpbmZvX1QgKmJpOworICAgIGxvbmdfdSAgbnI7CiAgICAgaW50CSAgICBsZW47CiB7Ci0gICAgY2hhcl91ICAqcHRyOworICAgIGNoYXJfdSAgYnVmWzhdOworICAgIGludAkgICAgaTsKKyAgICBpbnQJICAgIGJ1ZmkgPSAwOwogCi0gICAgcHRyID0gcmVhZF9zdHJpbmcoZmQsIGxlbik7Ci0jaWZkZWYgRkVBVF9DUllQVAotICAgIGlmIChwdHIgIT0gTlVMTCAmJiAqYnVmLT5iX3Bfa2V5ICE9IE5VTCkKLQljcnlwdF9kZWNvZGUocHRyLCBsZW4pOwotI2VuZGlmCi0gICAgcmV0dXJuIHB0cjsKKyAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkKKwlidWZbYnVmaSsrXSA9IG5yID4+IChpICogOCk7CisgICAgcmV0dXJuIHVuZG9fd3JpdGUoYmksIGJ1ZiwgKHNpemVfdClsZW4pOworfQorCisvKgorICogV3JpdGUgdGhlIHBvaW50ZXIgdG8gYW4gdW5kbyBoZWFkZXIuICBJbnN0ZWFkIG9mIHdyaXRpbmcgdGhlIHBvaW50ZXIgaXRzZWxmCisgKiB3ZSB1c2UgdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgaGVhZGVyLiAgVGhpcyBpcyBjb252ZXJ0ZWQgYmFjayB0bworICogcG9pbnRlcnMgd2hlbiByZWFkaW5nLiAqLworICAgIHN0YXRpYyB2b2lkCitwdXRfaGVhZGVyX3B0cihiaSwgdWhwKQorICAgIGJ1ZmluZm9fVAkqYmk7CisgICAgdV9oZWFkZXJfVAkqdWhwOworeworICAgIHVuZG9fd3JpdGVfYnl0ZXMoYmksIChsb25nX3UpKHVocCAhPSBOVUxMID8gdWhwLT51aF9zZXEgOiAwKSwgNCk7CiB9CiAKICAgICBzdGF0aWMgaW50Ci1zZXJpYWxpemVfaGVhZGVyKGZwLCBidWYsIGhhc2gpCi0gICAgRklMRQkqZnA7Ci0gICAgYnVmX1QJKmJ1ZjsKK3VuZG9fcmVhZF80YyhiaSkKKyAgICBidWZpbmZvX1QJKmJpOworeworI2lmZGVmIEZFQVRfQ1JZUFQKKyAgICBpZiAoYmktPmJpX2J1ZmZlciAhPSBOVUxMKQorICAgIHsKKwljaGFyX3UgIGJ1Zls0XTsKKwlpbnQJbjsKKworCXVuZG9fcmVhZChiaSwgYnVmLCAoc2l6ZV90KTQpOworCW4gPSAoYnVmWzBdIDw8IDI0KSArIChidWZbMV0gPDwgMTYpICsgKGJ1ZlsyXSA8PCA4KSArIGJ1ZlszXTsKKwlyZXR1cm4gbjsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gZ2V0NGMoYmktPmJpX2ZwKTsKK30KKworICAgIHN0YXRpYyBpbnQKK3VuZG9fcmVhZF8yYyhiaSkKKyAgICBidWZpbmZvX1QJKmJpOworeworI2lmZGVmIEZFQVRfQ1JZUFQKKyAgICBpZiAoYmktPmJpX2J1ZmZlciAhPSBOVUxMKQorICAgIHsKKwljaGFyX3UgIGJ1ZlsyXTsKKwlpbnQJbjsKKworCXVuZG9fcmVhZChiaSwgYnVmLCAoc2l6ZV90KTIpOworCW4gPSAoYnVmWzBdIDw8IDgpICsgYnVmWzFdOworCXJldHVybiBuOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBnZXQyYyhiaS0+YmlfZnApOworfQorCisgICAgc3RhdGljIGludAordW5kb19yZWFkX2J5dGUoYmkpCisgICAgYnVmaW5mb19UCSpiaTsKK3sKKyNpZmRlZiBGRUFUX0NSWVBUCisgICAgaWYgKGJpLT5iaV9idWZmZXIgIT0gTlVMTCkKKyAgICB7CisJY2hhcl91ICBidWZbMV07CisKKwl1bmRvX3JlYWQoYmksIGJ1ZiwgKHNpemVfdCkxKTsKKwlyZXR1cm4gYnVmWzBdOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBnZXRjKGJpLT5iaV9mcCk7Cit9CisKKyAgICBzdGF0aWMgdGltZV90Cit1bmRvX3JlYWRfdGltZShiaSkKKyAgICBidWZpbmZvX1QJKmJpOworeworI2lmZGVmIEZFQVRfQ1JZUFQKKyAgICBpZiAoYmktPmJpX2J1ZmZlciAhPSBOVUxMKQorICAgIHsKKwljaGFyX3UgIGJ1Zls4XTsKKwl0aW1lX3QJbiA9IDA7CisJaW50CWk7CisKKwl1bmRvX3JlYWQoYmksIGJ1ZiwgKHNpemVfdCk4KTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgKytpKQorCSAgICBuID0gKG4gPDwgOCkgKyBidWZbaV07CisJcmV0dXJuIG47CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIGdldDhjdGltZShiaS0+YmlfZnApOworfQorCisvKgorICogUmVhZCAiYnVmZmVyW3NpemVdIiBmcm9tIHRoZSB1bmRvIGZpbGUuCisgKiBSZXR1cm4gT0sgb3IgRkFJTC4KKyAqLworICAgIHN0YXRpYyBpbnQKK3VuZG9fcmVhZChiaSwgYnVmZmVyLCBzaXplKQorICAgIGJ1ZmluZm9fVCAgICpiaTsKKyAgICBjaGFyX3UJKmJ1ZmZlcjsKKyAgICBzaXplX3QJc2l6ZTsKK3sKKyNpZmRlZiBGRUFUX0NSWVBUCisgICAgaWYgKGJpLT5iaV9idWZmZXIgIT0gTlVMTCkKKyAgICB7CisJaW50CXNpemVfdG9kbyA9IHNpemU7CisJY2hhcl91CSpwID0gYnVmZmVyOworCisJd2hpbGUgKHNpemVfdG9kbyA+IDApCisJeworCSAgICBzaXplX3QgbjsKKworCSAgICBpZiAoYmktPmJpX3VzZWQgPj0gYmktPmJpX2F2YWlsKQorCSAgICB7CisJCW4gPSBmcmVhZChiaS0+YmlfYnVmZmVyLCAxLCAoc2l6ZV90KUNSWVBUX0JVRl9TSVpFLCBiaS0+YmlfZnApOworCQlpZiAobiA8PSAwKQorCQl7CisJCSAgICAvKiBFcnJvciBtYXkgYmUgY2hlY2tlZCBmb3Igb25seSBsYXRlci4gIEZpbGwgd2l0aCB6ZXJvcywKKwkJICAgICAqIHNvIHRoYXQgdGhlIHJlYWRlciB3b24ndCB1c2UgZ2FyYmFnZS4gKi8KKwkJICAgIHZpbV9tZW1zZXQocCwgMCwgc2l6ZV90b2RvKTsKKwkJICAgIHJldHVybiBGQUlMOworCQl9CisJCWJpLT5iaV9hdmFpbCA9IG47CisJCWJpLT5iaV91c2VkID0gMDsKKwkJY3J5cHRfZGVjb2RlX2lucGxhY2UoYmktPmJpX3N0YXRlLCBiaS0+YmlfYnVmZmVyLCBiaS0+YmlfYXZhaWwpOworCSAgICB9CisJICAgIG4gPSBzaXplX3RvZG87CisJICAgIGlmIChuID4gYmktPmJpX2F2YWlsIC0gYmktPmJpX3VzZWQpCisJCW4gPSBiaS0+YmlfYXZhaWwgLSBiaS0+YmlfdXNlZDsKKwkgICAgbWNoX21lbW1vdmUocCwgYmktPmJpX2J1ZmZlciArIGJpLT5iaV91c2VkLCBuKTsKKwkgICAgYmktPmJpX3VzZWQgKz0gbjsKKwkgICAgc2l6ZV90b2RvIC09IG47CisJICAgIHAgKz0gbjsKKwl9CisJcmV0dXJuIE9LOworICAgIH0KKyNlbmRpZgorICAgIGlmIChmcmVhZChidWZmZXIsIChzaXplX3Qpc2l6ZSwgMSwgYmktPmJpX2ZwKSAhPSAxKQorCXJldHVybiBGQUlMOworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIFJlYWQgYSBzdHJpbmcgb2YgbGVuZ3RoICJsZW4iIGZyb20gImJpLT5iaV9mZCIuCisgKiAibGVuIiBjYW4gYmUgemVybyB0byBhbGxvY2F0ZSBhbiBlbXB0eSBsaW5lLgorICogRGVjcnlwdCB0aGUgYnl0ZXMgaWYgbmVlZGVkLgorICogQXBwZW5kIGEgTlVMLgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeSBvciBOVUxMIGZvciBmYWlsdXJlLgorICovCisgICAgc3RhdGljIGNoYXJfdSAqCityZWFkX3N0cmluZ19kZWNyeXB0KGJpLCBsZW4pCisgICAgYnVmaW5mb19UCSpiaTsKKyAgICBpbnQJCWxlbjsKK3sKKyAgICBjaGFyX3UgICpwdHIgPSBhbGxvYygodW5zaWduZWQpbGVuICsgMSk7CisKKyAgICBpZiAocHRyICE9IE5VTEwpCisgICAgeworCWlmIChsZW4gPiAwICYmIHVuZG9fcmVhZChiaSwgcHRyLCBsZW4pID09IEZBSUwpCisJeworCSAgICB2aW1fZnJlZShwdHIpOworCSAgICByZXR1cm4gTlVMTDsKKwl9CisJcHRyW2xlbl0gPSBOVUw7CisjaWZkZWYgRkVBVF9DUllQVAorCWlmIChiaS0+Ymlfc3RhdGUgIT0gTlVMTCAmJiBiaS0+YmlfYnVmZmVyID09IE5VTEwpCisJICAgIGNyeXB0X2RlY29kZV9pbnBsYWNlKGJpLT5iaV9zdGF0ZSwgcHRyLCBsZW4pOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiBwdHI7Cit9CisKKy8qCisgKiBXcml0ZXMgdGhlIChub3QgZW5jcnlwdGVkKSBoZWFkZXIgYW5kIGluaXRpYWxpemVzIGVuY3J5cHRpb24gaWYgbmVlZGVkLgorICovCisgICAgc3RhdGljIGludAorc2VyaWFsaXplX2hlYWRlcihiaSwgaGFzaCkKKyAgICBidWZpbmZvX1QJKmJpOwogICAgIGNoYXJfdQkqaGFzaDsKIHsKLSAgICBpbnQgbGVuOworICAgIGludAkJbGVuOworICAgIGJ1Zl9UCSpidWYgPSBiaS0+YmlfYnVmOworICAgIEZJTEUJKmZwID0gYmktPmJpX2ZwOworICAgIGNoYXJfdQl0aW1lX2J1Zls4XTsKIAogICAgIC8qIFN0YXJ0IHdyaXRpbmcsIGZpcnN0IHRoZSBtYWdpYyBtYXJrZXIgYW5kIHVuZG8gaW5mbyB2ZXJzaW9uLiAqLwogICAgIGlmIChmd3JpdGUoVUZfU1RBUlRfTUFHSUMsIChzaXplX3QpVUZfU1RBUlRfTUFHSUNfTEVOLCAoc2l6ZV90KTEsIGZwKSAhPSAxKQpAQCAtOTM0LDEwOCArMTE4NSwxMjQgQEAKIAljaGFyX3UgKmhlYWRlcjsKIAlpbnQgICAgaGVhZGVyX2xlbjsKIAotCXB1dF9ieXRlcyhmcCwgKGxvbmdfdSlVRl9WRVJTSU9OX0NSWVBULCAyKTsKLQloZWFkZXIgPSBwcmVwYXJlX2NyeXB0X3dyaXRlKGJ1ZiwgJmhlYWRlcl9sZW4pOwotCWlmIChoZWFkZXIgPT0gTlVMTCkKKwl1bmRvX3dyaXRlX2J5dGVzKGJpLCAobG9uZ191KVVGX1ZFUlNJT05fQ1JZUFQsIDIpOworCWJpLT5iaV9zdGF0ZSA9IGNyeXB0X2NyZWF0ZV9mb3Jfd3JpdGluZyhjcnlwdF9nZXRfbWV0aG9kX25yKGJ1ZiksCisJCQkJCSAgYnVmLT5iX3Bfa2V5LCAmaGVhZGVyLCAmaGVhZGVyX2xlbik7CisJaWYgKGJpLT5iaV9zdGF0ZSA9PSBOVUxMKQogCSAgICByZXR1cm4gRkFJTDsKIAlsZW4gPSAoaW50KWZ3cml0ZShoZWFkZXIsIChzaXplX3QpaGVhZGVyX2xlbiwgKHNpemVfdCkxLCBmcCk7CiAJdmltX2ZyZWUoaGVhZGVyKTsKIAlpZiAobGVuICE9IDEpCiAJewotCSAgICBjcnlwdF9wb3Bfc3RhdGUoKTsKKwkgICAgY3J5cHRfZnJlZV9zdGF0ZShiaS0+Ymlfc3RhdGUpOworCSAgICBiaS0+Ymlfc3RhdGUgPSBOVUxMOwogCSAgICByZXR1cm4gRkFJTDsKIAl9CisKKwlpZiAoY3J5cHRfd2hvbGVfdW5kb2ZpbGUoY3J5cHRfZ2V0X21ldGhvZF9ucihidWYpKSkKKwl7CisJICAgIGJpLT5iaV9idWZmZXIgPSBhbGxvYyhDUllQVF9CVUZfU0laRSk7CisJICAgIGlmIChiaS0+YmlfYnVmZmVyID09IE5VTEwpCisJICAgIHsKKwkJY3J5cHRfZnJlZV9zdGF0ZShiaS0+Ymlfc3RhdGUpOworCQliaS0+Ymlfc3RhdGUgPSBOVUxMOworCQlyZXR1cm4gRkFJTDsKKwkgICAgfQorCSAgICBiaS0+YmlfdXNlZCA9IDA7CisJfQogICAgIH0KICAgICBlbHNlCiAjZW5kaWYKLQlwdXRfYnl0ZXMoZnAsIChsb25nX3UpVUZfVkVSU0lPTiwgMik7CisJdW5kb193cml0ZV9ieXRlcyhiaSwgKGxvbmdfdSlVRl9WRVJTSU9OLCAyKTsKIAogCiAgICAgLyogV3JpdGUgYSBoYXNoIG9mIHRoZSBidWZmZXIgdGV4dCwgc28gdGhhdCB3ZSBjYW4gdmVyaWZ5IGl0IGlzIHN0aWxsIHRoZQogICAgICAqIHNhbWUgd2hlbiByZWFkaW5nIHRoZSBidWZmZXIgdGV4dC4gKi8KLSAgICBpZiAoZndyaXRlKGhhc2gsIChzaXplX3QpVU5ET19IQVNIX1NJWkUsIChzaXplX3QpMSwgZnApICE9IDEpCisgICAgaWYgKHVuZG9fd3JpdGUoYmksIGhhc2gsIChzaXplX3QpVU5ET19IQVNIX1NJWkUpID09IEZBSUwpCiAJcmV0dXJuIEZBSUw7CiAKICAgICAvKiBidWZmZXItc3BlY2lmaWMgZGF0YSAqLwotICAgIHB1dF9ieXRlcyhmcCwgKGxvbmdfdSlidWYtPmJfbWwubWxfbGluZV9jb3VudCwgNCk7CisgICAgdW5kb193cml0ZV9ieXRlcyhiaSwgKGxvbmdfdSlidWYtPmJfbWwubWxfbGluZV9jb3VudCwgNCk7CiAgICAgbGVuID0gYnVmLT5iX3VfbGluZV9wdHIgIT0gTlVMTCA/IChpbnQpU1RSTEVOKGJ1Zi0+Yl91X2xpbmVfcHRyKSA6IDA7Ci0gICAgcHV0X2J5dGVzKGZwLCAobG9uZ191KWxlbiwgNCk7Ci0gICAgaWYgKGxlbiA+IDAgJiYgZndyaXRlX2NyeXB0KGJ1ZiwgYnVmLT5iX3VfbGluZV9wdHIsIChzaXplX3QpbGVuLCBmcCkgIT0gMSkKKyAgICB1bmRvX3dyaXRlX2J5dGVzKGJpLCAobG9uZ191KWxlbiwgNCk7CisgICAgaWYgKGxlbiA+IDAgJiYgZndyaXRlX2NyeXB0KGJpLCBidWYtPmJfdV9saW5lX3B0ciwgKHNpemVfdClsZW4pID09IEZBSUwpCiAJcmV0dXJuIEZBSUw7Ci0gICAgcHV0X2J5dGVzKGZwLCAobG9uZ191KWJ1Zi0+Yl91X2xpbmVfbG51bSwgNCk7Ci0gICAgcHV0X2J5dGVzKGZwLCAobG9uZ191KWJ1Zi0+Yl91X2xpbmVfY29sbnIsIDQpOworICAgIHVuZG9fd3JpdGVfYnl0ZXMoYmksIChsb25nX3UpYnVmLT5iX3VfbGluZV9sbnVtLCA0KTsKKyAgICB1bmRvX3dyaXRlX2J5dGVzKGJpLCAobG9uZ191KWJ1Zi0+Yl91X2xpbmVfY29sbnIsIDQpOwogCiAgICAgLyogVW5kbyBzdHJ1Y3R1cmVzIGhlYWRlciBkYXRhICovCi0gICAgcHV0X2hlYWRlcl9wdHIoZnAsIGJ1Zi0+Yl91X29sZGhlYWQpOwotICAgIHB1dF9oZWFkZXJfcHRyKGZwLCBidWYtPmJfdV9uZXdoZWFkKTsKLSAgICBwdXRfaGVhZGVyX3B0cihmcCwgYnVmLT5iX3VfY3VyaGVhZCk7CisgICAgcHV0X2hlYWRlcl9wdHIoYmksIGJ1Zi0+Yl91X29sZGhlYWQpOworICAgIHB1dF9oZWFkZXJfcHRyKGJpLCBidWYtPmJfdV9uZXdoZWFkKTsKKyAgICBwdXRfaGVhZGVyX3B0cihiaSwgYnVmLT5iX3VfY3VyaGVhZCk7CiAKLSAgICBwdXRfYnl0ZXMoZnAsIChsb25nX3UpYnVmLT5iX3VfbnVtaGVhZCwgNCk7Ci0gICAgcHV0X2J5dGVzKGZwLCAobG9uZ191KWJ1Zi0+Yl91X3NlcV9sYXN0LCA0KTsKLSAgICBwdXRfYnl0ZXMoZnAsIChsb25nX3UpYnVmLT5iX3Vfc2VxX2N1ciwgNCk7Ci0gICAgcHV0X3RpbWUoZnAsIGJ1Zi0+Yl91X3RpbWVfY3VyKTsKKyAgICB1bmRvX3dyaXRlX2J5dGVzKGJpLCAobG9uZ191KWJ1Zi0+Yl91X251bWhlYWQsIDQpOworICAgIHVuZG9fd3JpdGVfYnl0ZXMoYmksIChsb25nX3UpYnVmLT5iX3Vfc2VxX2xhc3QsIDQpOworICAgIHVuZG9fd3JpdGVfYnl0ZXMoYmksIChsb25nX3UpYnVmLT5iX3Vfc2VxX2N1ciwgNCk7CisgICAgdGltZV90b19ieXRlcyhidWYtPmJfdV90aW1lX2N1ciwgdGltZV9idWYpOworICAgIHVuZG9fd3JpdGUoYmksIHRpbWVfYnVmLCA4KTsKIAogICAgIC8qIE9wdGlvbmFsIGZpZWxkcy4gKi8KLSAgICBwdXRjKDQsIGZwKTsKLSAgICBwdXRjKFVGX0xBU1RfU0FWRV9OUiwgZnApOwotICAgIHB1dF9ieXRlcyhmcCwgKGxvbmdfdSlidWYtPmJfdV9zYXZlX25yX2xhc3QsIDQpOworICAgIHVuZG9fd3JpdGVfYnl0ZXMoYmksIDQsIDEpOworICAgIHVuZG9fd3JpdGVfYnl0ZXMoYmksIFVGX0xBU1RfU0FWRV9OUiwgMSk7CisgICAgdW5kb193cml0ZV9ieXRlcyhiaSwgKGxvbmdfdSlidWYtPmJfdV9zYXZlX25yX2xhc3QsIDQpOwogCi0gICAgcHV0YygwLCBmcCk7ICAvKiBlbmQgbWFya2VyICovCisgICAgdW5kb193cml0ZV9ieXRlcyhiaSwgMCwgMSk7ICAvKiBlbmQgbWFya2VyICovCiAKICAgICByZXR1cm4gT0s7CiB9CiAKICAgICBzdGF0aWMgaW50Ci1zZXJpYWxpemVfdWhwKGZwLCBidWYsIHVocCkKLSAgICBGSUxFCSpmcDsKLSAgICBidWZfVAkqYnVmOworc2VyaWFsaXplX3VocChiaSwgdWhwKQorICAgIGJ1ZmluZm9fVAkqYmk7CiAgICAgdV9oZWFkZXJfVAkqdWhwOwogewogICAgIGludAkJaTsKICAgICB1X2VudHJ5X1QJKnVlcDsKKyAgICBjaGFyX3UJdGltZV9idWZbOF07CiAKLSAgICBpZiAocHV0X2J5dGVzKGZwLCAobG9uZ191KVVGX0hFQURFUl9NQUdJQywgMikgPT0gRkFJTCkKKyAgICBpZiAodW5kb193cml0ZV9ieXRlcyhiaSwgKGxvbmdfdSlVRl9IRUFERVJfTUFHSUMsIDIpID09IEZBSUwpCiAJcmV0dXJuIEZBSUw7CiAKLSAgICBwdXRfaGVhZGVyX3B0cihmcCwgdWhwLT51aF9uZXh0LnB0cik7Ci0gICAgcHV0X2hlYWRlcl9wdHIoZnAsIHVocC0+dWhfcHJldi5wdHIpOwotICAgIHB1dF9oZWFkZXJfcHRyKGZwLCB1aHAtPnVoX2FsdF9uZXh0LnB0cik7Ci0gICAgcHV0X2hlYWRlcl9wdHIoZnAsIHVocC0+dWhfYWx0X3ByZXYucHRyKTsKLSAgICBwdXRfYnl0ZXMoZnAsIHVocC0+dWhfc2VxLCA0KTsKLSAgICBzZXJpYWxpemVfcG9zKHVocC0+dWhfY3Vyc29yLCBmcCk7CisgICAgcHV0X2hlYWRlcl9wdHIoYmksIHVocC0+dWhfbmV4dC5wdHIpOworICAgIHB1dF9oZWFkZXJfcHRyKGJpLCB1aHAtPnVoX3ByZXYucHRyKTsKKyAgICBwdXRfaGVhZGVyX3B0cihiaSwgdWhwLT51aF9hbHRfbmV4dC5wdHIpOworICAgIHB1dF9oZWFkZXJfcHRyKGJpLCB1aHAtPnVoX2FsdF9wcmV2LnB0cik7CisgICAgdW5kb193cml0ZV9ieXRlcyhiaSwgdWhwLT51aF9zZXEsIDQpOworICAgIHNlcmlhbGl6ZV9wb3MoYmksIHVocC0+dWhfY3Vyc29yKTsKICNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCi0gICAgcHV0X2J5dGVzKGZwLCAobG9uZ191KXVocC0+dWhfY3Vyc29yX3Zjb2wsIDQpOworICAgIHVuZG9fd3JpdGVfYnl0ZXMoYmksIChsb25nX3UpdWhwLT51aF9jdXJzb3JfdmNvbCwgNCk7CiAjZWxzZQotICAgIHB1dF9ieXRlcyhmcCwgKGxvbmdfdSkwLCA0KTsKKyAgICB1bmRvX3dyaXRlX2J5dGVzKGJpLCAobG9uZ191KTAsIDQpOwogI2VuZGlmCi0gICAgcHV0X2J5dGVzKGZwLCAobG9uZ191KXVocC0+dWhfZmxhZ3MsIDIpOworICAgIHVuZG9fd3JpdGVfYnl0ZXMoYmksIChsb25nX3UpdWhwLT51aF9mbGFncywgMik7CiAgICAgLyogQXNzdW1lIE5NQVJLUyB3aWxsIHN0YXkgdGhlIHNhbWUuICovCiAgICAgZm9yIChpID0gMDsgaSA8IE5NQVJLUzsgKytpKQotCXNlcmlhbGl6ZV9wb3ModWhwLT51aF9uYW1lZG1baV0sIGZwKTsKLSAgICBzZXJpYWxpemVfdmlzdWFsaW5mbygmdWhwLT51aF92aXN1YWwsIGZwKTsKLSAgICBwdXRfdGltZShmcCwgdWhwLT51aF90aW1lKTsKKwlzZXJpYWxpemVfcG9zKGJpLCB1aHAtPnVoX25hbWVkbVtpXSk7CisgICAgc2VyaWFsaXplX3Zpc3VhbGluZm8oYmksICZ1aHAtPnVoX3Zpc3VhbCk7CisgICAgdGltZV90b19ieXRlcyh1aHAtPnVoX3RpbWUsIHRpbWVfYnVmKTsKKyAgICB1bmRvX3dyaXRlKGJpLCB0aW1lX2J1ZiwgOCk7CiAKICAgICAvKiBPcHRpb25hbCBmaWVsZHMuICovCi0gICAgcHV0Yyg0LCBmcCk7Ci0gICAgcHV0YyhVSFBfU0FWRV9OUiwgZnApOwotICAgIHB1dF9ieXRlcyhmcCwgKGxvbmdfdSl1aHAtPnVoX3NhdmVfbnIsIDQpOworICAgIHVuZG9fd3JpdGVfYnl0ZXMoYmksIDQsIDEpOworICAgIHVuZG9fd3JpdGVfYnl0ZXMoYmksIFVIUF9TQVZFX05SLCAxKTsKKyAgICB1bmRvX3dyaXRlX2J5dGVzKGJpLCAobG9uZ191KXVocC0+dWhfc2F2ZV9uciwgNCk7CiAKLSAgICBwdXRjKDAsIGZwKTsgIC8qIGVuZCBtYXJrZXIgKi8KKyAgICB1bmRvX3dyaXRlX2J5dGVzKGJpLCAwLCAxKTsgIC8qIGVuZCBtYXJrZXIgKi8KIAogICAgIC8qIFdyaXRlIGFsbCB0aGUgZW50cmllcy4gKi8KICAgICBmb3IgKHVlcCA9IHVocC0+dWhfZW50cnk7IHVlcCAhPSBOVUxMOyB1ZXAgPSB1ZXAtPnVlX25leHQpCiAgICAgewotCXB1dF9ieXRlcyhmcCwgKGxvbmdfdSlVRl9FTlRSWV9NQUdJQywgMik7Ci0JaWYgKHNlcmlhbGl6ZV91ZXAoZnAsIGJ1ZiwgdWVwKSA9PSBGQUlMKQorCXVuZG9fd3JpdGVfYnl0ZXMoYmksIChsb25nX3UpVUZfRU5UUllfTUFHSUMsIDIpOworCWlmIChzZXJpYWxpemVfdWVwKGJpLCB1ZXApID09IEZBSUwpCiAJICAgIHJldHVybiBGQUlMOwogICAgIH0KLSAgICBwdXRfYnl0ZXMoZnAsIChsb25nX3UpVUZfRU5UUllfRU5EX01BR0lDLCAyKTsKKyAgICB1bmRvX3dyaXRlX2J5dGVzKGJpLCAobG9uZ191KVVGX0VOVFJZX0VORF9NQUdJQywgMik7CiAgICAgcmV0dXJuIE9LOwogfQogCiAgICAgc3RhdGljIHVfaGVhZGVyX1QgKgotdW5zZXJpYWxpemVfdWhwKGZwLCBmaWxlX25hbWUpCi0gICAgRklMRQkqZnA7Cit1bnNlcmlhbGl6ZV91aHAoYmksIGZpbGVfbmFtZSkKKyAgICBidWZpbmZvX1QJKmJpOwogICAgIGNoYXJfdQkqZmlsZV9uYW1lOwogewogICAgIHVfaGVhZGVyX1QJKnVocDsKQEAgLTEwNTEsNTYgKzEzMTgsNTYgQEAKICNpZmRlZiBVX0RFQlVHCiAgICAgdWhwLT51aF9tYWdpYyA9IFVIX01BR0lDOwogI2VuZGlmCi0gICAgdWhwLT51aF9uZXh0LnNlcSA9IGdldDRjKGZwKTsKLSAgICB1aHAtPnVoX3ByZXYuc2VxID0gZ2V0NGMoZnApOwotICAgIHVocC0+dWhfYWx0X25leHQuc2VxID0gZ2V0NGMoZnApOwotICAgIHVocC0+dWhfYWx0X3ByZXYuc2VxID0gZ2V0NGMoZnApOwotICAgIHVocC0+dWhfc2VxID0gZ2V0NGMoZnApOworICAgIHVocC0+dWhfbmV4dC5zZXEgPSB1bmRvX3JlYWRfNGMoYmkpOworICAgIHVocC0+dWhfcHJldi5zZXEgPSB1bmRvX3JlYWRfNGMoYmkpOworICAgIHVocC0+dWhfYWx0X25leHQuc2VxID0gdW5kb19yZWFkXzRjKGJpKTsKKyAgICB1aHAtPnVoX2FsdF9wcmV2LnNlcSA9IHVuZG9fcmVhZF80YyhiaSk7CisgICAgdWhwLT51aF9zZXEgPSB1bmRvX3JlYWRfNGMoYmkpOwogICAgIGlmICh1aHAtPnVoX3NlcSA8PSAwKQogICAgIHsKIAljb3JydXB0aW9uX2Vycm9yKCJ1aF9zZXEiLCBmaWxlX25hbWUpOwogCXZpbV9mcmVlKHVocCk7CiAJcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHVuc2VyaWFsaXplX3BvcygmdWhwLT51aF9jdXJzb3IsIGZwKTsKKyAgICB1bnNlcmlhbGl6ZV9wb3MoYmksICZ1aHAtPnVoX2N1cnNvcik7CiAjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAotICAgIHVocC0+dWhfY3Vyc29yX3Zjb2wgPSBnZXQ0YyhmcCk7CisgICAgdWhwLT51aF9jdXJzb3JfdmNvbCA9IHVuZG9fcmVhZF80YyhiaSk7CiAjZWxzZQotICAgICh2b2lkKWdldDRjKGZwKTsKKyAgICAodm9pZCl1bmRvX3JlYWRfNGMoYmkpOwogI2VuZGlmCi0gICAgdWhwLT51aF9mbGFncyA9IGdldDJjKGZwKTsKKyAgICB1aHAtPnVoX2ZsYWdzID0gdW5kb19yZWFkXzJjKGJpKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgTk1BUktTOyArK2kpCi0JdW5zZXJpYWxpemVfcG9zKCZ1aHAtPnVoX25hbWVkbVtpXSwgZnApOwotICAgIHVuc2VyaWFsaXplX3Zpc3VhbGluZm8oJnVocC0+dWhfdmlzdWFsLCBmcCk7Ci0gICAgdWhwLT51aF90aW1lID0gZ2V0OGN0aW1lKGZwKTsKKwl1bnNlcmlhbGl6ZV9wb3MoYmksICZ1aHAtPnVoX25hbWVkbVtpXSk7CisgICAgdW5zZXJpYWxpemVfdmlzdWFsaW5mbyhiaSwgJnVocC0+dWhfdmlzdWFsKTsKKyAgICB1aHAtPnVoX3RpbWUgPSB1bmRvX3JlYWRfdGltZShiaSk7CiAKICAgICAvKiBPcHRpb25hbCBmaWVsZHMuICovCiAgICAgZm9yICg7OykKICAgICB7Ci0JaW50IGxlbiA9IGdldGMoZnApOworCWludCBsZW4gPSB1bmRvX3JlYWRfYnl0ZShiaSk7CiAJaW50IHdoYXQ7CiAKIAlpZiAobGVuID09IDApCiAJICAgIGJyZWFrOwotCXdoYXQgPSBnZXRjKGZwKTsKKwl3aGF0ID0gdW5kb19yZWFkX2J5dGUoYmkpOwogCXN3aXRjaCAod2hhdCkKIAl7CiAJICAgIGNhc2UgVUhQX1NBVkVfTlI6Ci0JCXVocC0+dWhfc2F2ZV9uciA9IGdldDRjKGZwKTsKKwkJdWhwLT51aF9zYXZlX25yID0gdW5kb19yZWFkXzRjKGJpKTsKIAkJYnJlYWs7CiAJICAgIGRlZmF1bHQ6CiAJCS8qIGZpZWxkIG5vdCBzdXBwb3J0ZWQsIHNraXAgKi8KIAkJd2hpbGUgKC0tbGVuID49IDApCi0JCSAgICAodm9pZClnZXRjKGZwKTsKKwkJICAgICh2b2lkKXVuZG9fcmVhZF9ieXRlKGJpKTsKIAl9CiAgICAgfQogCiAgICAgLyogVW5zZXJpYWxpemUgdGhlIHVlcCBsaXN0LiAqLwogICAgIGxhc3RfdWVwID0gTlVMTDsKLSAgICB3aGlsZSAoKGMgPSBnZXQyYyhmcCkpID09IFVGX0VOVFJZX01BR0lDKQorICAgIHdoaWxlICgoYyA9IHVuZG9fcmVhZF8yYyhiaSkpID09IFVGX0VOVFJZX01BR0lDKQogICAgIHsKIAllcnJvciA9IEZBTFNFOwotCXVlcCA9IHVuc2VyaWFsaXplX3VlcChmcCwgJmVycm9yLCBmaWxlX25hbWUpOworCXVlcCA9IHVuc2VyaWFsaXplX3VlcChiaSwgJmVycm9yLCBmaWxlX25hbWUpOwogCWlmIChsYXN0X3VlcCA9PSBOVUxMKQogCSAgICB1aHAtPnVoX2VudHJ5ID0gdWVwOwogCWVsc2UKQEAgLTExMjMsMzUgKzEzOTAsMzQgQEAKIH0KIAogLyoKLSAqIFNlcmlhbGl6ZSAidWVwIiB0byAiZnAiLgorICogU2VyaWFsaXplICJ1ZXAiLgogICovCiAgICAgc3RhdGljIGludAotc2VyaWFsaXplX3VlcChmcCwgYnVmLCB1ZXApCi0gICAgRklMRQkqZnA7Ci0gICAgYnVmX1QJKmJ1ZjsKK3NlcmlhbGl6ZV91ZXAoYmksIHVlcCkKKyAgICBidWZpbmZvX1QJKmJpOwogICAgIHVfZW50cnlfVAkqdWVwOwogewogICAgIGludAkJaTsKICAgICBzaXplX3QJbGVuOwogCi0gICAgcHV0X2J5dGVzKGZwLCAobG9uZ191KXVlcC0+dWVfdG9wLCA0KTsKLSAgICBwdXRfYnl0ZXMoZnAsIChsb25nX3UpdWVwLT51ZV9ib3QsIDQpOwotICAgIHB1dF9ieXRlcyhmcCwgKGxvbmdfdSl1ZXAtPnVlX2xjb3VudCwgNCk7Ci0gICAgcHV0X2J5dGVzKGZwLCAobG9uZ191KXVlcC0+dWVfc2l6ZSwgNCk7CisgICAgdW5kb193cml0ZV9ieXRlcyhiaSwgKGxvbmdfdSl1ZXAtPnVlX3RvcCwgNCk7CisgICAgdW5kb193cml0ZV9ieXRlcyhiaSwgKGxvbmdfdSl1ZXAtPnVlX2JvdCwgNCk7CisgICAgdW5kb193cml0ZV9ieXRlcyhiaSwgKGxvbmdfdSl1ZXAtPnVlX2xjb3VudCwgNCk7CisgICAgdW5kb193cml0ZV9ieXRlcyhiaSwgKGxvbmdfdSl1ZXAtPnVlX3NpemUsIDQpOwogICAgIGZvciAoaSA9IDA7IGkgPCB1ZXAtPnVlX3NpemU7ICsraSkKICAgICB7CiAJbGVuID0gU1RSTEVOKHVlcC0+dWVfYXJyYXlbaV0pOwotCWlmIChwdXRfYnl0ZXMoZnAsIChsb25nX3UpbGVuLCA0KSA9PSBGQUlMKQorCWlmICh1bmRvX3dyaXRlX2J5dGVzKGJpLCAobG9uZ191KWxlbiwgNCkgPT0gRkFJTCkKIAkgICAgcmV0dXJuIEZBSUw7Ci0JaWYgKGxlbiA+IDAgJiYgZndyaXRlX2NyeXB0KGJ1ZiwgdWVwLT51ZV9hcnJheVtpXSwgbGVuLCBmcCkgIT0gMSkKKwlpZiAobGVuID4gMCAmJiBmd3JpdGVfY3J5cHQoYmksIHVlcC0+dWVfYXJyYXlbaV0sIGxlbikgPT0gRkFJTCkKIAkgICAgcmV0dXJuIEZBSUw7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAogICAgIHN0YXRpYyB1X2VudHJ5X1QgKgotdW5zZXJpYWxpemVfdWVwKGZwLCBlcnJvciwgZmlsZV9uYW1lKQotICAgIEZJTEUJKmZwOwordW5zZXJpYWxpemVfdWVwKGJpLCBlcnJvciwgZmlsZV9uYW1lKQorICAgIGJ1ZmluZm9fVAkqYmk7CiAgICAgaW50CQkqZXJyb3I7CiAgICAgY2hhcl91CSpmaWxlX25hbWU7CiB7CkBAIC0xMTY4LDEwICsxNDM0LDEwIEBACiAjaWZkZWYgVV9ERUJVRwogICAgIHVlcC0+dWVfbWFnaWMgPSBVRV9NQUdJQzsKICNlbmRpZgotICAgIHVlcC0+dWVfdG9wID0gZ2V0NGMoZnApOwotICAgIHVlcC0+dWVfYm90ID0gZ2V0NGMoZnApOwotICAgIHVlcC0+dWVfbGNvdW50ID0gZ2V0NGMoZnApOwotICAgIHVlcC0+dWVfc2l6ZSA9IGdldDRjKGZwKTsKKyAgICB1ZXAtPnVlX3RvcCA9IHVuZG9fcmVhZF80YyhiaSk7CisgICAgdWVwLT51ZV9ib3QgPSB1bmRvX3JlYWRfNGMoYmkpOworICAgIHVlcC0+dWVfbGNvdW50ID0gdW5kb19yZWFkXzRjKGJpKTsKKyAgICB1ZXAtPnVlX3NpemUgPSB1bmRvX3JlYWRfNGMoYmkpOwogICAgIGlmICh1ZXAtPnVlX3NpemUgPiAwKQogICAgIHsKIAlhcnJheSA9IChjaGFyX3UgKiopVV9BTExPQ19MSU5FKHNpemVvZihjaGFyX3UgKikgKiB1ZXAtPnVlX3NpemUpOwpAQCAtMTE4OCw5ICsxNDU0LDkgQEAKIAogICAgIGZvciAoaSA9IDA7IGkgPCB1ZXAtPnVlX3NpemU7ICsraSkKICAgICB7Ci0JbGluZV9sZW4gPSBnZXQ0YyhmcCk7CisJbGluZV9sZW4gPSB1bmRvX3JlYWRfNGMoYmkpOwogCWlmIChsaW5lX2xlbiA+PSAwKQotCSAgICBsaW5lID0gcmVhZF9zdHJpbmdfZGVjcnlwdChjdXJidWYsIGZwLCBsaW5lX2xlbik7CisJICAgIGxpbmUgPSByZWFkX3N0cmluZ19kZWNyeXB0KGJpLCBsaW5lX2xlbik7CiAJZWxzZQogCXsKIAkgICAgbGluZSA9IE5VTEw7CkBAIC0xMjA3LDgzICsxNDczLDcxIEBACiB9CiAKIC8qCi0gKiBTZXJpYWxpemUgInBvcyIgdG8gImZwIi4KKyAqIFNlcmlhbGl6ZSAicG9zIi4KICAqLwogICAgIHN0YXRpYyB2b2lkCi1zZXJpYWxpemVfcG9zKHBvcywgZnApCitzZXJpYWxpemVfcG9zKGJpLCBwb3MpCisgICAgYnVmaW5mb19UICpiaTsKICAgICBwb3NfVCBwb3M7Ci0gICAgRklMRSAgKmZwOwogewotICAgIHB1dF9ieXRlcyhmcCwgKGxvbmdfdSlwb3MubG51bSwgNCk7Ci0gICAgcHV0X2J5dGVzKGZwLCAobG9uZ191KXBvcy5jb2wsIDQpOworICAgIHVuZG9fd3JpdGVfYnl0ZXMoYmksIChsb25nX3UpcG9zLmxudW0sIDQpOworICAgIHVuZG9fd3JpdGVfYnl0ZXMoYmksIChsb25nX3UpcG9zLmNvbCwgNCk7CiAjaWZkZWYgRkVBVF9WSVJUVUFMRURJVAotICAgIHB1dF9ieXRlcyhmcCwgKGxvbmdfdSlwb3MuY29sYWRkLCA0KTsKKyAgICB1bmRvX3dyaXRlX2J5dGVzKGJpLCAobG9uZ191KXBvcy5jb2xhZGQsIDQpOwogI2Vsc2UKLSAgICBwdXRfYnl0ZXMoZnAsIChsb25nX3UpMCwgNCk7CisgICAgdW5kb193cml0ZV9ieXRlcyhiaSwgKGxvbmdfdSkwLCA0KTsKICNlbmRpZgogfQogCiAvKgotICogVW5zZXJpYWxpemUgdGhlIHBvc19UIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIGZwLgorICogVW5zZXJpYWxpemUgdGhlIHBvc19UIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgogICovCiAgICAgc3RhdGljIHZvaWQKLXVuc2VyaWFsaXplX3Bvcyhwb3MsIGZwKQordW5zZXJpYWxpemVfcG9zKGJpLCBwb3MpCisgICAgYnVmaW5mb19UICpiaTsKICAgICBwb3NfVCAqcG9zOwotICAgIEZJTEUgICpmcDsKIHsKLSAgICBwb3MtPmxudW0gPSBnZXQ0YyhmcCk7CisgICAgcG9zLT5sbnVtID0gdW5kb19yZWFkXzRjKGJpKTsKICAgICBpZiAocG9zLT5sbnVtIDwgMCkKIAlwb3MtPmxudW0gPSAwOwotICAgIHBvcy0+Y29sID0gZ2V0NGMoZnApOworICAgIHBvcy0+Y29sID0gdW5kb19yZWFkXzRjKGJpKTsKICAgICBpZiAocG9zLT5jb2wgPCAwKQogCXBvcy0+Y29sID0gMDsKICNpZmRlZiBGRUFUX1ZJUlRVQUxFRElUCi0gICAgcG9zLT5jb2xhZGQgPSBnZXQ0YyhmcCk7CisgICAgcG9zLT5jb2xhZGQgPSB1bmRvX3JlYWRfNGMoYmkpOwogICAgIGlmIChwb3MtPmNvbGFkZCA8IDApCiAJcG9zLT5jb2xhZGQgPSAwOwogI2Vsc2UKLSAgICAodm9pZClnZXQ0YyhmcCk7CisgICAgKHZvaWQpdW5kb19yZWFkXzRjKGJpKTsKICNlbmRpZgogfQogCiAvKgotICogU2VyaWFsaXplICJpbmZvIiB0byAiZnAiLgorICogU2VyaWFsaXplICJpbmZvIi4KICAqLwogICAgIHN0YXRpYyB2b2lkCi1zZXJpYWxpemVfdmlzdWFsaW5mbyhpbmZvLCBmcCkKK3NlcmlhbGl6ZV92aXN1YWxpbmZvKGJpLCBpbmZvKQorICAgIGJ1ZmluZm9fVAkgICAgKmJpOwogICAgIHZpc3VhbGluZm9fVCAgICAqaW5mbzsKLSAgICBGSUxFCSAgICAqZnA7CiB7Ci0gICAgc2VyaWFsaXplX3BvcyhpbmZvLT52aV9zdGFydCwgZnApOwotICAgIHNlcmlhbGl6ZV9wb3MoaW5mby0+dmlfZW5kLCBmcCk7Ci0gICAgcHV0X2J5dGVzKGZwLCAobG9uZ191KWluZm8tPnZpX21vZGUsIDQpOwotICAgIHB1dF9ieXRlcyhmcCwgKGxvbmdfdSlpbmZvLT52aV9jdXJzd2FudCwgNCk7CisgICAgc2VyaWFsaXplX3BvcyhiaSwgaW5mby0+dmlfc3RhcnQpOworICAgIHNlcmlhbGl6ZV9wb3MoYmksIGluZm8tPnZpX2VuZCk7CisgICAgdW5kb193cml0ZV9ieXRlcyhiaSwgKGxvbmdfdSlpbmZvLT52aV9tb2RlLCA0KTsKKyAgICB1bmRvX3dyaXRlX2J5dGVzKGJpLCAobG9uZ191KWluZm8tPnZpX2N1cnN3YW50LCA0KTsKIH0KIAogLyoKLSAqIFVuc2VyaWFsaXplIHRoZSB2aXN1YWxpbmZvX1QgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gZnAuCisgKiBVbnNlcmlhbGl6ZSB0aGUgdmlzdWFsaW5mb19UIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgogICovCiAgICAgc3RhdGljIHZvaWQKLXVuc2VyaWFsaXplX3Zpc3VhbGluZm8oaW5mbywgZnApCit1bnNlcmlhbGl6ZV92aXN1YWxpbmZvKGJpLCBpbmZvKQorICAgIGJ1ZmluZm9fVAkgICAgKmJpOwogICAgIHZpc3VhbGluZm9fVCAgICAqaW5mbzsKLSAgICBGSUxFCSAgICAqZnA7CiB7Ci0gICAgdW5zZXJpYWxpemVfcG9zKCZpbmZvLT52aV9zdGFydCwgZnApOwotICAgIHVuc2VyaWFsaXplX3BvcygmaW5mby0+dmlfZW5kLCBmcCk7Ci0gICAgaW5mby0+dmlfbW9kZSA9IGdldDRjKGZwKTsKLSAgICBpbmZvLT52aV9jdXJzd2FudCA9IGdldDRjKGZwKTsKLX0KLQotLyoKLSAqIFdyaXRlIHRoZSBwb2ludGVyIHRvIGFuIHVuZG8gaGVhZGVyLiAgSW5zdGVhZCBvZiB3cml0aW5nIHRoZSBwb2ludGVyIGl0c2VsZgotICogd2UgdXNlIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGhlYWRlci4gIFRoaXMgaXMgY29udmVydGVkIGJhY2sgdG8KLSAqIHBvaW50ZXJzIHdoZW4gcmVhZGluZy4gKi8KLSAgICBzdGF0aWMgdm9pZAotcHV0X2hlYWRlcl9wdHIoZnAsIHVocCkKLSAgICBGSUxFCSpmcDsKLSAgICB1X2hlYWRlcl9UCSp1aHA7Ci17Ci0gICAgcHV0X2J5dGVzKGZwLCAobG9uZ191KSh1aHAgIT0gTlVMTCA/IHVocC0+dWhfc2VxIDogMCksIDQpOworICAgIHVuc2VyaWFsaXplX3BvcyhiaSwgJmluZm8tPnZpX3N0YXJ0KTsKKyAgICB1bnNlcmlhbGl6ZV9wb3MoYmksICZpbmZvLT52aV9lbmQpOworICAgIGluZm8tPnZpX21vZGUgPSB1bmRvX3JlYWRfNGMoYmkpOworICAgIGluZm8tPnZpX2N1cnN3YW50ID0gdW5kb19yZWFkXzRjKGJpKTsKIH0KIAogLyoKQEAgLTEzMTcsOCArMTU3MSwxMSBAQAogICAgIHN0cnVjdCBzdGF0CXN0X29sZDsKICAgICBzdHJ1Y3Qgc3RhdAlzdF9uZXc7CiAjZW5kaWYKKyAgICBidWZpbmZvX1QJYmk7CisKICNpZmRlZiBGRUFUX0NSWVBUCi0gICAgaW50CQlkb19jcnlwdCA9IEZBTFNFOworICAgIGJpLmJpX3N0YXRlID0gTlVMTDsKKyAgICBiaS5iaV9idWZmZXIgPSBOVUxMOwogI2VuZGlmCiAKICAgICBpZiAobmFtZSA9PSBOVUxMKQpAQCAtMTQ3NCwxNCArMTczMSwxMiBAQAogICAgIHVfc3luYyhUUlVFKTsKIAogICAgIC8qCi0gICAgICogV3JpdGUgdGhlIGhlYWRlci4KKyAgICAgKiBXcml0ZSB0aGUgaGVhZGVyLiAgSW5pdGlhbGl6ZXMgZW5jcnlwdGlvbiwgaWYgZW5hYmxlZC4KICAgICAgKi8KLSAgICBpZiAoc2VyaWFsaXplX2hlYWRlcihmcCwgYnVmLCBoYXNoKSA9PSBGQUlMKQorICAgIGJpLmJpX2J1ZiA9IGJ1ZjsKKyAgICBiaS5iaV9mcCA9IGZwOworICAgIGlmIChzZXJpYWxpemVfaGVhZGVyKCZiaSwgaGFzaCkgPT0gRkFJTCkKIAlnb3RvIHdyaXRlX2Vycm9yOwotI2lmZGVmIEZFQVRfQ1JZUFQKLSAgICBpZiAoKmJ1Zi0+Yl9wX2tleSAhPSBOVUwpCi0JZG9fY3J5cHQgPSBUUlVFOwotI2VuZGlmCiAKICAgICAvKgogICAgICAqIEl0ZXJhdGl2ZWx5IHNlcmlhbGl6ZSBVSFBzIGFuZCB0aGVpciBVRVBzIGZyb20gdGhlIHRvcCBkb3duLgpAQCAtMTQ5Nyw3ICsxNzUyLDcgQEAKICNpZmRlZiBVX0RFQlVHCiAJICAgICsraGVhZGVyc193cml0dGVuOwogI2VuZGlmCi0JICAgIGlmIChzZXJpYWxpemVfdWhwKGZwLCBidWYsIHVocCkgPT0gRkFJTCkKKwkgICAgaWYgKHNlcmlhbGl6ZV91aHAoJmJpLCB1aHApID09IEZBSUwpCiAJCWdvdG8gd3JpdGVfZXJyb3I7CiAJfQogCkBAIC0xNTE2LDcgKzE3NzEsNyBAQAogCSAgICB1aHAgPSB1aHAtPnVoX25leHQucHRyOwogICAgIH0KIAotICAgIGlmIChwdXRfYnl0ZXMoZnAsIChsb25nX3UpVUZfSEVBREVSX0VORF9NQUdJQywgMikgPT0gT0spCisgICAgaWYgKHVuZG9fd3JpdGVfYnl0ZXMoJmJpLCAobG9uZ191KVVGX0hFQURFUl9FTkRfTUFHSUMsIDIpID09IE9LKQogCXdyaXRlX29rID0gVFJVRTsKICNpZmRlZiBVX0RFQlVHCiAgICAgaWYgKGhlYWRlcnNfd3JpdHRlbiAhPSBidWYtPmJfdV9udW1oZWFkKQpAQCAtMTUyNiw2ICsxNzgxLDExIEBACiAgICAgfQogI2VuZGlmCiAKKyNpZmRlZiBGRUFUX0NSWVBUCisgICAgaWYgKGJpLmJpX3N0YXRlICE9IE5VTEwgJiYgdW5kb19mbHVzaCgmYmkpID09IEZBSUwpCisJd3JpdGVfb2sgPSBGQUxTRTsKKyNlbmRpZgorCiB3cml0ZV9lcnJvcjoKICAgICBmY2xvc2UoZnApOwogICAgIGlmICghd3JpdGVfb2spCkBAIC0xNTUxLDggKzE4MTEsOSBAQAogCiB0aGVlbmQ6CiAjaWZkZWYgRkVBVF9DUllQVAotICAgIGlmIChkb19jcnlwdCkKLQljcnlwdF9wb3Bfc3RhdGUoKTsKKyAgICBpZiAoYmkuYmlfc3RhdGUgIT0gTlVMTCkKKwljcnlwdF9mcmVlX3N0YXRlKGJpLmJpX3N0YXRlKTsKKyAgICB2aW1fZnJlZShiaS5iaV9idWZmZXIpOwogI2VuZGlmCiAgICAgaWYgKGZpbGVfbmFtZSAhPSBuYW1lKQogCXZpbV9mcmVlKGZpbGVfbmFtZSk7CkBAIC0xNTk4LDkgKzE4NTksNyBAQAogICAgIHN0cnVjdCBzdGF0CXN0X29yaWc7CiAgICAgc3RydWN0IHN0YXQJc3RfdW5kbzsKICNlbmRpZgotI2lmZGVmIEZFQVRfQ1JZUFQKLSAgICBpbnQJCWRvX2RlY3J5cHQgPSBGQUxTRTsKLSNlbmRpZgorICAgIGJ1ZmluZm9fVAliaTsKIAogICAgIGlmIChuYW1lID09IE5VTEwpCiAgICAgewpAQCAtMTY0NCw2ICsxOTAzLDEyIEBACiAJICAgIEVNU0cyKF8oIkU4MjI6IENhbm5vdCBvcGVuIHVuZG8gZmlsZSBmb3IgcmVhZGluZzogJXMiKSwgZmlsZV9uYW1lKTsKIAlnb3RvIGVycm9yOwogICAgIH0KKyAgICBiaS5iaV9idWYgPSBjdXJidWY7CisgICAgYmkuYmlfZnAgPSBmcDsKKyNpZmRlZiBGRUFUX0NSWVBUCisgICAgYmkuYmlfc3RhdGUgPSBOVUxMOworICAgIGJpLmJpX2J1ZmZlciA9IE5VTEw7CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogUmVhZCB0aGUgdW5kbyBmaWxlIGhlYWRlci4KQEAgLTE2NjQsMTIgKzE5MjksMjQgQEAKIAkJCQkJCQkJICAgZmlsZV9uYW1lKTsKIAkgICAgZ290byBlcnJvcjsKIAl9Ci0JaWYgKHByZXBhcmVfY3J5cHRfcmVhZChmcCkgPT0gRkFJTCkKKwliaS5iaV9zdGF0ZSA9IGNyeXB0X2NyZWF0ZV9mcm9tX2ZpbGUoZnAsIGN1cmJ1Zi0+Yl9wX2tleSk7CisJaWYgKGJpLmJpX3N0YXRlID09IE5VTEwpCiAJewogCSAgICBFTVNHMihfKCJFODI2OiBVbmRvIGZpbGUgZGVjcnlwdGlvbiBmYWlsZWQ6ICVzIiksIGZpbGVfbmFtZSk7CiAJICAgIGdvdG8gZXJyb3I7CiAJfQotCWRvX2RlY3J5cHQgPSBUUlVFOworCWlmIChjcnlwdF93aG9sZV91bmRvZmlsZShiaS5iaV9zdGF0ZS0+bWV0aG9kX25yKSkKKwl7CisJICAgIGJpLmJpX2J1ZmZlciA9IGFsbG9jKENSWVBUX0JVRl9TSVpFKTsKKwkgICAgaWYgKGJpLmJpX2J1ZmZlciA9PSBOVUxMKQorCSAgICB7CisJCWNyeXB0X2ZyZWVfc3RhdGUoYmkuYmlfc3RhdGUpOworCQliaS5iaV9zdGF0ZSA9IE5VTEw7CisJCWdvdG8gZXJyb3I7CisJICAgIH0KKwkgICAgYmkuYmlfYXZhaWwgPSAwOworCSAgICBiaS5iaV91c2VkID0gMDsKKwl9CiAjZWxzZQogCUVNU0cyKF8oIkU4Mjc6IFVuZG8gZmlsZSBpcyBlbmNyeXB0ZWQ6ICVzIiksIGZpbGVfbmFtZSk7CiAJZ290byBlcnJvcjsKQEAgLTE2ODEsMTIgKzE5NTgsMTIgQEAKIAlnb3RvIGVycm9yOwogICAgIH0KIAotICAgIGlmIChmcmVhZChyZWFkX2hhc2gsIFVORE9fSEFTSF9TSVpFLCAxLCBmcCkgIT0gMSkKKyAgICBpZiAodW5kb19yZWFkKCZiaSwgcmVhZF9oYXNoLCAoc2l6ZV90KVVORE9fSEFTSF9TSVpFKSA9PSBGQUlMKQogICAgIHsKIAljb3JydXB0aW9uX2Vycm9yKCJoYXNoIiwgZmlsZV9uYW1lKTsKIAlnb3RvIGVycm9yOwogICAgIH0KLSAgICBsaW5lX2NvdW50ID0gKGxpbmVucl9UKWdldDRjKGZwKTsKKyAgICBsaW5lX2NvdW50ID0gKGxpbmVucl9UKXVuZG9fcmVhZF80YygmYmkpOwogICAgIGlmIChtZW1jbXAoaGFzaCwgcmVhZF9oYXNoLCBVTkRPX0hBU0hfU0laRSkgIT0gMAogCQkJCSAgfHwgbGluZV9jb3VudCAhPSBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCkKICAgICB7CkBAIC0xNzAzLDEzICsxOTgwLDEzIEBACiAgICAgfQogCiAgICAgLyogUmVhZCB1bmRvIGRhdGEgZm9yICJVIiBjb21tYW5kLiAqLwotICAgIHN0cl9sZW4gPSBnZXQ0YyhmcCk7CisgICAgc3RyX2xlbiA9IHVuZG9fcmVhZF80YygmYmkpOwogICAgIGlmIChzdHJfbGVuIDwgMCkKIAlnb3RvIGVycm9yOwogICAgIGlmIChzdHJfbGVuID4gMCkKLQlsaW5lX3B0ciA9IHJlYWRfc3RyaW5nX2RlY3J5cHQoY3VyYnVmLCBmcCwgc3RyX2xlbik7Ci0gICAgbGluZV9sbnVtID0gKGxpbmVucl9UKWdldDRjKGZwKTsKLSAgICBsaW5lX2NvbG5yID0gKGNvbG5yX1QpZ2V0NGMoZnApOworCWxpbmVfcHRyID0gcmVhZF9zdHJpbmdfZGVjcnlwdCgmYmksIHN0cl9sZW4pOworICAgIGxpbmVfbG51bSA9IChsaW5lbnJfVCl1bmRvX3JlYWRfNGMoJmJpKTsKKyAgICBsaW5lX2NvbG5yID0gKGNvbG5yX1QpdW5kb19yZWFkXzRjKCZiaSk7CiAgICAgaWYgKGxpbmVfbG51bSA8IDAgfHwgbGluZV9jb2xuciA8IDApCiAgICAgewogCWNvcnJ1cHRpb25fZXJyb3IoImxpbmUgbG51bS9jb2wiLCBmaWxlX25hbWUpOwpAQCAtMTcxNywzMiArMTk5NCwzMiBAQAogICAgIH0KIAogICAgIC8qIEJlZ2luIGdlbmVyYWwgdW5kbyBkYXRhICovCi0gICAgb2xkX2hlYWRlcl9zZXEgPSBnZXQ0YyhmcCk7Ci0gICAgbmV3X2hlYWRlcl9zZXEgPSBnZXQ0YyhmcCk7Ci0gICAgY3VyX2hlYWRlcl9zZXEgPSBnZXQ0YyhmcCk7Ci0gICAgbnVtX2hlYWQgPSBnZXQ0YyhmcCk7Ci0gICAgc2VxX2xhc3QgPSBnZXQ0YyhmcCk7Ci0gICAgc2VxX2N1ciA9IGdldDRjKGZwKTsKLSAgICBzZXFfdGltZSA9IGdldDhjdGltZShmcCk7CisgICAgb2xkX2hlYWRlcl9zZXEgPSB1bmRvX3JlYWRfNGMoJmJpKTsKKyAgICBuZXdfaGVhZGVyX3NlcSA9IHVuZG9fcmVhZF80YygmYmkpOworICAgIGN1cl9oZWFkZXJfc2VxID0gdW5kb19yZWFkXzRjKCZiaSk7CisgICAgbnVtX2hlYWQgPSB1bmRvX3JlYWRfNGMoJmJpKTsKKyAgICBzZXFfbGFzdCA9IHVuZG9fcmVhZF80YygmYmkpOworICAgIHNlcV9jdXIgPSB1bmRvX3JlYWRfNGMoJmJpKTsKKyAgICBzZXFfdGltZSA9IHVuZG9fcmVhZF90aW1lKCZiaSk7CiAKICAgICAvKiBPcHRpb25hbCBoZWFkZXIgZmllbGRzLiAqLwogICAgIGZvciAoOzspCiAgICAgewotCWludCBsZW4gPSBnZXRjKGZwKTsKKwlpbnQgbGVuID0gdW5kb19yZWFkX2J5dGUoJmJpKTsKIAlpbnQgd2hhdDsKIAogCWlmIChsZW4gPT0gMCB8fCBsZW4gPT0gRU9GKQogCSAgICBicmVhazsKLQl3aGF0ID0gZ2V0YyhmcCk7CisJd2hhdCA9IHVuZG9fcmVhZF9ieXRlKCZiaSk7CiAJc3dpdGNoICh3aGF0KQogCXsKIAkgICAgY2FzZSBVRl9MQVNUX1NBVkVfTlI6Ci0JCWxhc3Rfc2F2ZV9uciA9IGdldDRjKGZwKTsKKwkJbGFzdF9zYXZlX25yID0gdW5kb19yZWFkXzRjKCZiaSk7CiAJCWJyZWFrOwogCSAgICBkZWZhdWx0OgogCQkvKiBmaWVsZCBub3Qgc3VwcG9ydGVkLCBza2lwICovCiAJCXdoaWxlICgtLWxlbiA+PSAwKQotCQkgICAgKHZvaWQpZ2V0YyhmcCk7CisJCSAgICAodm9pZCl1bmRvX3JlYWRfYnl0ZSgmYmkpOwogCX0KICAgICB9CiAKQEAgLTE3NTgsNyArMjAzNSw3IEBACiAJICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgd2hpbGUgKChjID0gZ2V0MmMoZnApKSA9PSBVRl9IRUFERVJfTUFHSUMpCisgICAgd2hpbGUgKChjID0gdW5kb19yZWFkXzJjKCZiaSkpID09IFVGX0hFQURFUl9NQUdJQykKICAgICB7CiAJaWYgKG51bV9yZWFkX3VocHMgPj0gbnVtX2hlYWQpCiAJewpAQCAtMTc2Niw3ICsyMDQzLDcgQEAKIAkgICAgZ290byBlcnJvcjsKIAl9CiAKLQl1aHAgPSB1bnNlcmlhbGl6ZV91aHAoZnAsIGZpbGVfbmFtZSk7CisJdWhwID0gdW5zZXJpYWxpemVfdWhwKCZiaSwgZmlsZV9uYW1lKTsKIAlpZiAodWhwID09IE5VTEwpCiAJICAgIGdvdG8gZXJyb3I7CiAJdWhwX3RhYmxlW251bV9yZWFkX3VocHMrK10gPSB1aHA7CkBAIC0xODk4LDggKzIxNzUsOSBAQAogCiB0aGVlbmQ6CiAjaWZkZWYgRkVBVF9DUllQVAotICAgIGlmIChkb19kZWNyeXB0KQotCWNyeXB0X3BvcF9zdGF0ZSgpOworICAgIGlmIChiaS5iaV9zdGF0ZSAhPSBOVUxMKQorCWNyeXB0X2ZyZWVfc3RhdGUoYmkuYmlfc3RhdGUpOworICAgIHZpbV9mcmVlKGJpLmJpX2J1ZmZlcik7CiAjZW5kaWYKICAgICBpZiAoZnAgIT0gTlVMTCkKIAlmY2xvc2UoZnApOwpkaWZmIC0tZ2l0IGEvc3JjL3ZlcnNpb24uYyBiL3NyYy92ZXJzaW9uLmMKaW5kZXggMTkxODNmZC4uMzBiY2IyZSAxMDA2NDQKLS0tIGEvc3JjL3ZlcnNpb24uYworKysgYi9zcmMvdmVyc2lvbi5jCkBAIC03NDIsNiArNzQyLDggQEAKIHN0YXRpYyBpbnQgaW5jbHVkZWRfcGF0Y2hlc1tdID0KIHsgICAvKiBBZGQgbmV3IHBhdGNoIG51bWJlciBiZWxvdyB0aGlzIGxpbmUgKi8KIC8qKi8KKyAgICAzOTksCisvKiovCiAgICAgMzk4LAogLyoqLwogICAgIDM5NywK