ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggZTE5OWJhZS4uNmZkNzc1YyAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTMgKzEsMTQgQEAKLVRoaXMgaXMgcmVsZWFzZSA5ODA1MTcgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5ODA2MDEgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk4MDUxNzogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBMb3RzIG9mIGNvbW1vbiBjb250cm9scyBpbXByb3ZlbWVudHMuCi0JLSBCZXR0ZXIgdGh1bmtpbmcgc3VwcG9ydC4KK1dIQVQnUyBORVcgd2l0aCBXaW5lLTk4MDYwMTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCisJLSBOZXcgcmVzb3VyY2UgY29tcGlsZXIuCisJLSBUb29sYmFyIGNvbnRyb2wuCisJLSBQYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIENyZWF0ZURJQlNlY3Rpb24uCiAJLSBMb3RzIG9mIGJ1ZyBmaXhlcy4KIAogU2VlIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgpAQCAtMTYsMTAgKzE3LDEwIEBACiB0aGUgcmVsZWFzZSBpcyBhdmFpbGFibGUgYXQgdGhlIGZ0cCBzaXRlcy4gIFRoZSBzb3VyY2VzIHdpbGwgYmUgYXZhaWxhYmxlCiBmcm9tIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgogCi0gIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDUxNy50YXIuZ3oKLSAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODA1MTcudGFyLmd6Ci0gIGZ0cDovL2Z0cC5pbmZvbWFnaWMuY29tL3B1Yi9taXJyb3JzL2xpbnV4L3N1bnNpdGUvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDUxNy50YXIuZ3oKLSAgZnRwOi8vZnRwLnByb2dzb2MudXRzLmVkdS5hdS9wdWIvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDUxNy50YXIuZ3oKKyAgZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTgwNjAxLnRhci5negorICBmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDYwMS50YXIuZ3oKKyAgZnRwOi8vZnRwLmluZm9tYWdpYy5jb20vcHViL21pcnJvcnMvbGludXgvc3Vuc2l0ZS9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTgwNjAxLnRhci5negorICBmdHA6Ly9mdHAucHJvZ3NvYy51dHMuZWR1LmF1L3B1Yi9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwNjAxLnRhci5negogCiBJdCBzaG91bGQgYWxzbyBiZSBhdmFpbGFibGUgZnJvbSBhbnkgc2l0ZSB0aGF0IG1pcnJvcnMgdHN4LTExIG9yIHN1bnNpdGUuCiAKZGlmZiAtLWdpdCBhL0FVVEhPUlMgYi9BVVRIT1JTCmluZGV4IDQwMmRlZDkuLjZlNGFjZjQgMTAwNjQ0Ci0tLSBhL0FVVEhPUlMKKysrIGIvQVVUSE9SUwpAQCAtMjMsNiArMjMsNyBAQAogTmllbHMgZGUgQ2FycGVudGllciwKIEdvcmRvbiBDaGFmZmVlLAogSmltZW4gQ2hpbmcsCitQYXNjYWwgQ3VvcSwKIERhdmlkIEEuIEN1dGhiZXJ0LAogSHV3IEQuIE0uIERhdmllcywKIFJvbWFuIERvbGVqc2ksCkBAIC0zNCw2ICszNSw3IEBACiBDbGF1cyBGaXNjaGVyLAogT2xhZiBGbGViYmUsCiBDaGFkIEZyYWxlaWdoLAorTWF0dGhldyBGcmFuY2lzLAogUGV0ZXIgR2FsYmF2eSwKIFJhbW9uIEdhcmNpYSwKIE1hdHRoZXcgR2hpbywKQEAgLTQyLDYgKzQ0LDcgQEAKIENoYXJsZXMgTS4gSGFubnVtLAogQWRyaWFuIEhhcnZleSwKIEpvaG4gSGFydmV5LAorQmlsbCBIYXdlcywKIENhbWVyb24gSGVpZGUsCiBKb2NoZW4gSG9lbmlja2UsCiBPbm5vIEhvdmVycywKQEAgLTEyMyw2ICsxMjYsNyBAQAogUm9uYW4gV2FpZGUsCiBFcmljIFdhcm5rZSwKIE1hbmZyZWQgV2VpY2hlbCwKK1VscmljaCBXZWlnYW5kLAogTW9ydGVuIFdlbGluZGVyLAogTGVuIFdoaXRlLAogTGF3c29uIFdoaXRuZXksCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKaW5kZXggYjU4ODhjMy4uY2E3NjI3MSAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nCisrKyBiL0NoYW5nZUxvZwpAQCAtMSw0ICsxLDI2OCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU3VuIE1heSAzMSAxMzo0MDoxMyAxOTk4ICBBbGV4YW5kcmUgSnVsbGlhcmQgIDxqdWxsaWFyZEBscmMuZXBmbC5jaD4KKworCSogW2lmMTYzMi9zaWduYWwuY10KKwlBZGRlZCBkaXNwbGF5IG9mIGV4Y2VwdGlvbiBuYW1lLgorCisJKiBbbG9hZGVyL3Rhc2suY10KKwlZZXQgYW5vdGhlciBhdHRlbXB0IGF0IGZpeGluZyBTd2l0Y2hTdGFja1RvL1N3aXRjaFN0YWNrQmFjay4KKworCSogW21lbW9yeS9zZWxlY3Rvci5jXSBbcmVsYXkzMi9idWlsdGluMzIuY10gW3Rvb2xzL2J1aWxkLmNdCisJICBbd2luMzIva2VybmVsMzIuY10KKwlHZW5lcmF0ZSBhbiBhc3NlbWJseSBzdHViIGZvciBXaW4zMiByZWdpc3RlciBmdW5jdGlvbnMgdG8gbWFrZQorCXRoZWlyIG5hbWVzIGF2YWlsYWJsZSBhdCBsaW5rIHRpbWUuCisKKwkqIFtwcm9ncmFtcy8qL01ha2VmaWxlLmluXQorCUFkZGVkIGhhY2tzIHRvIHN1cHBvcnQgb2xkIHJlc291cmNlIGNvbXBpbGVyLgorCitGcmkgTWF5IDI5IDE2OjI3OjE0IDE5OTggIE1hcmN1cyBNZWlzc25lciA8bWFyY3VzQGpldC5mcmFua2VuLmRlPgorCisJKiBbdG9vbHMvdGVzdHJ1bl0KKwlNZXJnZSBvZiBteSB0ZXN0c2NyaXB0cyBhdCBob21lIGludG8gb25lIHNpbmdsZSBwZXJsIHByb2dyYW0KKwkodGVzdGVkIHdpdGggcGVybDUpLiBXb3JrcyBvbmx5IG9uIExpbnV4IGR1ZSB0byAncHMnIGFuZCAnaXBjcycKKwltYWdpYy4KKworCSogW2NvbnRyb2xzL21lbnUuY10KKwlBZGRlZCBzb21lIERlZmF1bHRNZW51SXRlbSBzdHVicy4KKworCSogW2RlYnVnZ2VyL3N0YWJzLmNdCisJRml4ZWQgc3RhYnMgbG9hZGluZywgbm93IHN1cHBvcnRzIChpbnQsaW50KSB0eXBlaW5mbyBmb3JtYXQgdXNlZAorCWJ5IGdjYy0yLjggYW5kIGVnY3MtMS4gSWYgaXQgc3RpbGwgY3Jhc2hlcywgcGxlYXNlIG1haWwgbWUuCisKKwkqIFtpZjE2MzIvXVtyZWxheTMyL10KKwlBZGRlZCBtc3ZpZGVvLmRsbCAoc3R1YnMgb25seSkKKwlSZXBsYWNlZCBzb21lIHB0ciBieSBzdHIgZm9yIHN0cmluZ2Nhc2VzCisJQWRkZWQgc29tZSBuZXcgc3R1YnMgKFZ4RENhbGwsIEZpbmRDbG9zZU5vdGlmLi4uLikKKworCSogW21pc2MvbmV0d29yay5jXQorCVNvbWUgYXJndW1lbnQgZml4ZXMuCisKKwkqIFttaXNjL3JlZ2lzdHJ5LmNdW21pc2MvY3B1LmNdCisJUmVnaXN0cnkgaW5pdGlhbGl6YXRpb24gcGFydGlhbGx5IHJld3JpdHRlbiBhbmQgZW5oYW5jZWQuCisKKwkqIFtzY2hlZHVsZXIvKi5jXQorCVNvbWUgYWRkaXRpb25zIHNvIHdlIGRvbid0IGRvIGtpbGwoMCxTSUdVU1IxKSAoa2lsbCBwcm9jZXNzZ3JvdXAKKwlpbnN0ZWFkIG9mIHRhcmdldGVkIHRocmVhZCkKKwlBZGRlZCBTZXRUaHJlYWRDb250ZXh0LgorCitUaHUgTWF5IDI4IDIzOjU5OjU5IDE5OTggIEJlcnRobyBTdHVsdGllbnMgPGJlcnRob0Bha2hwaGQuYXUuZGs+CisKKwkqIFt0b29scy93cmMvKl0KKwlOZXcgcmVzb3VyY2UgY29tcGlsZXIgdmVyc2lvbiAxLjAuMCAoMjgtTWF5LTE5OTgpCisKKwkqIFtNYWtlLnJ1bGVzLmluXSBbTWFrZWZpbGUuaW5dCisJQ2hhbmdlZCBhbmQgYWRkZWQgcmMgcnVsZXMgdG8gcG9pbnQgdG8gdG9vbHMvd3JjL3dyYy4KKworCSogW2NvbmZpZ3VyZS5pbl0gW2luY2x1ZGUvY29uZmlnLmguaW5dCisJQWRkZWQgY2hlY2sgZm9yIGZ1bmN0aW9uICdzdHJpY21wJy4KKworCSogW2luY2x1ZGUvcmVzb3VyY2UuaF0KKwlDb21tZW50ZWQgb3V0IHRoZSBvbGQgcmVzb3VyY2Ugc3RydWN0dXJlIHRvIGNhdGNoIHJlZmVyZW5jZXMuCisJSXQgYWxzbyBpbmNsdWRlcyB3cmNfcnNjLmguCisKKwkqIFtpbmNsdWRlL3dyY19yc2MuaF0KKwlOZXcgZmlsZS4gRGVmaW5pdGlvbnMgZm9yIHRoZSByZXNvdXJjZXMgZ2VuZXJhdGVkIHdpdGggd3JjLgorCisJKiBbaW5jbHVkZS93aW5kb3dzLmhdCisJQWRkZWQgI2lmZGVmIFJDX0lOVk9LRUQgdG8gZXhjbHVkZSBzdGRhcmcuaC4KKwlBZGRlZCBTU19OT1RJRlkgZmxhZy4KKworCSogW2luY2x1ZGUvd2lubmxzLmhdCisJQWRkZWQgU1VCTEFOR18qIGRlZmluaXRpb25zIGFuZCBjb3JyZWN0ZWQgc29tZSBkZWZhdWx0cy4KKworCSogW2xvYWRlci9saWJyZXMuY10KKwlDaGFuZ2VkIHRoZSBzeXNyZXMgbG9hZCBmdW5jdGlvbnMgdG8gc3VwcG9ydCB3cmMgZ2VuZXJhdGVkCisJcmVzb3VyY2VzLgorCisJKiBbcmVzb3VyY2Uvc3lzcmVzXyoucmNdCisJQWRkZWQgI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworCSogW3Jlc291cmNlL3N5c3Jlcy5jXQorCUNoYW5nZWQgZGVjbGFyYXRpb25zIHRvIG1hdGNoIHdyYydzIG91dHB1dAorCisJKiBbcmVzb3VyY2UvTWFrZWZpbGUuaW5dCisJQ2hhbmdlZCBydWxlcyB0byB3b3JrIHdpdGggd3JjLgorCisJKiBbdG9vbHMvbWFrZWRlcC5jXQorCUNoYW5nZWQgZ2VuZXJhdGlvbiBvZiAucmMgZmlsZSBkZXBlbmRlbmNpZXMgdG8gLnMgdGFyZ2V0LgorCitUaHUgTWF5IDI4IDIyOjI4OjM5IDE5OTggIEVyaWMgS29obCA8ZWtvaGxAYWJvLnJoZWluLXplaXR1bmcuZGU+CisKKwkqIFtmaWxlcy9maWxlLmNdW2luY2x1ZGUvd2luZG93cy5jXVtyZWxheTMyL2tlcm5lbDMyLnNwZWNdCisJSW1wbGVtZW50ZWQgR2V0RmlsZUF0dHJpYnV0ZXNFeDMyQS9XLgorCisJKiBbbWlzYy9pbWFnZWxpc3QuaF1baW5jbHVkZS9jb21tY3RybC5oXVtyZWxheTMyL2NvbWN0bDMyLnNwZWNdCisJQWRkZWQgSW1hZ2VMaXN0X1JlYWQgYW5kIEltYWdlTGlzdF9Xcml0ZSBzdHVicy4KKwlBZGRlZCBJbWFnZUxpc3RfQWRkSWNvbiBmdW5jdGlvbi4KKwlBZGRlZCBJbWFnZUxpc3RfTG9hZEltYWdlLiBJdCBpcyB0aGUgc2FtZSBhcyBJbWFnZUxpc3RfTG9hZEltYWdlMzJBLgorCisJKiBbY29udHJvbHMvaGVhZGVyLmNdCisJRml4ZWQgYml0bWFwIGRyYXdpbmcgYnVnLgorCUFkZGVkIGZ1bGwgYml0bWFwIHN1cHBvcnQuCisKKwkqIFtpbmNsdWRlL2NvbW1jdHJsLmhdCisJQWRkZWQgbWlzc2luZyBoZWFkZXIgbWFjcm9zLgorCisJKiBbY29udHJvbHMvdG9vbGJhci5jXVtpbmNsdWRlL3Rvb2xiYXIuaF1baW5jbHVkZS9jb21tY3RybC5oXQorCSAgW2NvbnRyb2xzL2NvbW1jdHJsLmNdIFtyZWxheTMyL2NvbWN0bDMyLnNwZWNdCisJRmlyc3QgaW1wbGVtZW50YXRpb24gb2YgdG9vbGJhciBjb250cm9sLgorCUltcGxlbWVudGVkIENyZWF0ZVRvb2xiYXIsIENyZWF0ZVRvb2xiYXJFeCBhbmQgQ3JlYXRlTWFwcGVkQml0bWFwLgorCisJKiBbY29udHJvbHMvcHJvZ3Jlc3MuY11bY29udHJvbHMvc3RhdHVzLmNdCisJU29tZSBjb2RlIGNsZWFudXAuCisKKwkqIFtjb250cm9scy9jb21tY3RybC5jXVtpbmNsdWRlL2NvbW1jdHJsLmhdW3JlbGF5MzIvY29tY3RsMzIuc3BlY10KKwlSZW1vdmVkIENyZWF0ZVN0YXR1c1dpbmRvdzE2IGFuZCBEcmF3U3RhdHVzVGV4dDE2LgorCUNyZWF0ZVN0YXR1c1dpbmRvdyBpcyB0aGUgc2FtZSBhcyBDcmVhdGVTdGF0dXNXaW5kb3czMkEuCisJRHJhd1N0YXR1c1RleHQgaXMgdGhlIHNhbWUgYXMgRHJhd1N0YXR1c1RleHQzMkEuCisKK1RodSBNYXkgMjggMTY6MDE6MjggMTk5OCAgTWF0dGhldyBKLiBGcmFuY2lzICA8YXNiZWxAZGlhbC5waXBleC5jb20+CisKKwkqIFtvYmplY3RzL2JpdG1hcC5jXSBbb2JqZWN0cy9iaXRtYXAuaF0gW29iamVjdHMvb2VtYml0bWFwLmNdCisJICBbb2JqZWN0cy9kYy5jXSBbZ3JhcGhpY3MveDExZHJ2L2JpdGJsdC5jXQorCUFkZGVkIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgQ3JlYXRlRElCU2VjdGlvbiwgd2l0aCBncmVhdCB0aGFua3MKKwl0byBVbHJpY2ggV2VpZ2FuZCA8d2VpZ2FuZEBpbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4gZm9yCisJY29udHJpYnV0aW5nIHRoZSBidWxrIG9mIHRoZSBwYXRjaC4KKworV2VkIE1heSAyNyAxOTowNDozMSAxOTk4ICBVbHJpY2ggV2VpZ2FuZCA8d2VpZ2FuZEBpbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4KKworCSogW3dpbjMyL2tlcm5lbDMyLmNdIFtpZjE2MzIvdGh1bmsuY10gW2luY2x1ZGUvZmxhdHRodW5rLmhdCisJVGh1bmtDb25uZWN0MTYgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zIG1vdmVkIHRvIGVtdWxhdG9yLgorCisJKiBbbG9hZGVyL25lL3NlZ21lbnQuY10KKwlDYWxsIERsbEVudHJ5UG9pbnQgd2l0aCBjb3JyZWN0IGFyZ3VtZW50cy4KKworCSogW3JlbGF5MzIvYnVpbHRpbjMyLmNdCisJQnVnZml4OiBSZWxheSBkZWJ1Z2dpbmcgZGlkIG5vdCB3b3JrIGZvciBtdWx0aXBsZSBwcm9jZXNzZXMuCisKKwkqIFtjb250cm9scy9tZW51LmNdCisJQnVnZml4OiBkd0l0ZW1EYXRhIHdhcyBub3Qgc2V0IGZvciBNRl9PV05FUkRSQVcgbWVudXMuCisKKwkqIFtpZjE2MzIvcmVsYXkuY10gW3JlbGF5MzIvcmVsYXkzODYuY10KKwlSZWxheSBtZXNzYWdlcyBjb252ZXJ0ZWQgdG8gdXNlIERQUklOVEYuCisKKwkqIFtjb250cm9scy9kZXNrdG9wLmNdIFtyZWxheTMyL3VzZXIzMi5zcGVjXQorCUltcGxlbWVudGVkIFBhaW50RGVza3RvcC4KKworCSogW2ZpbGVzL3Byb2ZpbGUuY10gW2lmMTYzMi9rZXJuZWwuc3BlY10gW21pc2MvbmV0d29yay5jXQorCSAgW21pc2MvcHJpbnRkcnYuY10gW3JlbGF5MzIvd2luc3Bvb2wuc3BlY10gCisJICBbd2luMzIvb3JkaW5hbHMuY10gW3JlbGF5MzIva2VybmVsMzIuc3BlY10KKwlTb21lIHN0dWJzIGFkZGVkLgorCisJKiBbcmVsYXkzMi9tcHIuc3BlY10KKwlBbGwgb3JkaW5hbHMgd2VyZSBvZmYgYnkgb25lLgorCitUdWUgTWF5IDI2IDEzOjMyOjU3IDE5OTggIEJpbGwgSGF3ZXMgPHdoYXdlc0BzdGFyLm5ldD4KKworCSogW21pc2MvbHN0ci5jXSBbaW5jbHVkZS9jYXNlbWFwLmhdIFt0b29scy91bmltYXAucGxdCisJQWRkZWQgVW5pY29kZSBjYXNlIGNvbnZlcnNpb24gcm91dGluZXMgdG93dXBwZXIvdG93bG93ZXIsCisJd2l0aCBtYXBwaW5nIHRhYmxlcyBjYXNlbWFwLmggY3JlYXRlZCBieSB0b29scy91bmltYXAucGwuCisKKwkqIFttaXNjL250ZGxsLmNdIFtpbmNsdWRlL3dpbm5scy5oXSBbcmVsYXkzMi9udGRsbC5zcGVjXQorCSAgW3JlbGF5MzIvYWR2YXBpLnNwZWNdCisJTWluaW1hbCBpbXBsZW1lbnRhdGlvbiBvZiBJc1RleHRVbmljb2RlLCBqdXN0IGVub3VnaCB0byBnZXQKKwlOVDQgbm90ZXBhZCB0byBvcGVuIGFzY2lpL3VuaWNvZGUgZmlsZXMuCisKKwkqIFtNYWtlLnJ1bGVzLmluXSBbcmVzb3VyY2VzL3N5c3Jlc19Fbi5yY10KKwlBZGRlZCBpbmNsdWRlIGZpbGUgZGxncy5oIGZvciBidWlsZGluZyByZXNvdXJjZSBmaWxlcywgc28gdGhhdAorCXJlc291cmNlcyBjYW4gcmVmZXIgdG8gZGVmaW5lZCB2YWx1ZXMgKGUuZy4gcHNoSGVscCkuCisKKwkqIFttaXNjL2NydGRsbC5jXSBbcmVsYXkzMi9jcnRkbGwuc3BlY10KKwlVc2UgdG93dXBwZXIvdG93bG93ZXIgZm9yIDMyVyBjYXNlIGNvbnZlcnNpb25zLgorCisJKiBbbWVtb3J5L3N0cmluZy5jXQorCVVzZSB0b3d1cHBlciBmb3IgMzJXIGNhc2UgY29udmVyc2lvbnMuCisKKwkqIFtvbGUvb2xlMm5scy5jXQorCVVzZSB0b3d1cHBlciBmb3IgMzJXIGNhc2UgY29udmVyc2lvbnM7IGZpeCBtZW0gbGVhazsgbWlub3IgY2xlYW51cAorCisJKiBbY29udHJvbHMvZWRpdC5jXQorCUFkZGVkIHNvZnQgYnJlYWsgZmxhZyB0byBlZGl0IHN0YXRlLiBQcmludCB1bmtub3duIGFjdGlvbiB2YWx1ZXMKKwlmb3IgV01fVlNDUk9MTCAoYWN0aW9uIDE5MCBvY2N1cnMgd2hlbiBydW5uaW5nIE5UNCBub3RlcGFkLikKKworTW9uIE1heSAyNSAyMjo0Mjo0MCAxOTk4ICBVd2UgQm9ubmVzIDxib25AZWxla3Ryb24uaWtwLnBoeXNpay50dS1kYXJtc3RhZHQuZGU+CisKKwkqIFtmaWxlcy9maWxlLmNdCisJQ2FyZSBmb3IgYSBwYXRob2xvZ2ljYWwgY2FzZSBpbiBTZXRGaWxlUG9pbnRlci4KKworCSogW2dyYXBoaWNzL3gxMWRydi94Zm9udC5jXQorCUhhbmRsZSBsb25nZXIgRm9udCBuYW1lcyBpbiBMRkRfQ29tcG9zZUxGRCBhbmQgdHJ5IHRvIGNhdGNoIGVycm9ycy4KKworCSogW2xvYWRlci9wZV9pbWFnZS5jXQorCVVubG9hZCBEdW1teW1vZHVsZSB3aGVuIFBFX0xvYWRMaWJyYXJ5RXgzMkEgZmFpbHMgd2l0aAorCVBFX0xvYWRJbWFnZSAobWFrZXMgRW5jYXJ0YSA5OCBpbnN0YWxsZXIgcHJvY2VlZCkuCisKKwkqIFttaXNjL3JlZ2lzdHJ5LmNdCisJTW92ZSBhIGNoZWNrIGZvciBhIHNwZWNpYWwgY2FzZSBpbiBSZWdDcmVhdGVLZXlFeDMyVyBhZnRlciB0aGUKKwljaGVjayBmb3IgZXhpc3RlbmNlLgorCitUdWUgTWF5IDI1IDIwOjE4OjI2IDE5OTggIE1hdHRoZXcgQmVja2VyIDxtYmVja2VyQGdsYXNzY2l0eS5uZXQ+CisKKwkqIFttaXNjL250ZGxsLmNdCisJQWRkZWQgc29tZSBzdHVicywganVzdCBndWVzc2luZyBhdCB0aGUgc2l6ZSBvZiB0aGVpciBwYXJhbSBsaXN0cy4KKworCSogW21pc2MvcmVnaXN0cnkuY10KKwlBZGRlZCBzdHVicyBmb3IgUmVnVW5Mb2FkS2V5LCBSZWdTZXRLZXlTZWN1cml0eSwgUmVnU2F2ZUtleSwKKwlSZWdSZXN0b3JlS2V5LCBhbmQgUmVnUmVwbGFjZUtleQorCisJKiBbcHJvZ3JhbXMvcmVndGVzdC9yZWd0ZXN0LmNdCisJVXBkYXRlZCByZWdpc3RyeSB0ZXN0aW5nIHByb2dyYW0uCisKK1N1biBNYXkgMjQgMTg6MTE6NDAgMTk5OCAgQWxleCBQcmllbSA8YWxleHBAc2NpLmt1bi5ubD4KKworCSogW2ZpbGUvcHJvZmlsZS5jXQorCUFkZGVkIGZsYWcgJ3JldHVybl92YWx1ZXMnIHRvIFBST0ZJTEVfR2V0U2VjdGlvbi4KKworU3VuIE1heSAyNCAxMzo0MToxMCAxOTk4ICBKYW1lcyBKdXJhbiA8anJqMTIwQHBzdS5lZHU+CisKKwkqIFttaXNjL3NoZWxsLmNdIFtmaWxlcy9kaXJlY3RvcnkuY10KKwlEb2N1bWVudGF0aW9uL2RlYnVnZ2luZyBpbmZvIGFkZGl0aW9ucy4KKworCSogWyovKi5jXSBbaW5jbHVkZS8qLmhdCisJTW92ZWQgbWFueSBleHRlcm4gZnVuY3Rpb24gZGVmaW5pdGlvbnMgdG8gYXBwcm9wcmlhdGUgaGVhZGVyIGZpbGVzLgorCUNsZWFuZWQgdXAgYSBmZXcgY29tcGlsZSB3YXJuaW5ncy4KKwlJZiAjaW5jbHVkZSAiZGVidWcuaCIgaXMgcHJlc2VudCwgcmVtb3ZlZCAjaW5jbHVkZSA8c3RkaW8uaD4uCisJZGVidWcuaCBpbmNsdWRlcyBzdGRpby5oLCBzbyBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGluY2x1ZGUgYm90aC4KKworCSogW2dyYXBoaWNzLyouY10gW2lmMTYzMi9zaWduYWwuY10gW2lwYy8qLmNdIFtzY2hlZHVsZXIvKi5jXQorCSAgW3dpbjMyLyouY10gW3dpbmRvd3MvKi5jXQorCUZpbmFsIHBhdGNoIHRvIGNvbnZlcnQgZnByaW50ZiBzdGF0ZW1lbnRzIHRvIG5ldyBkZWJ1Z2dpbmcgaW50ZXJmYWNlLgorCVNvbWUgZnByaW50ZnMgYXJlIHN0aWxsIGxlZnQsIGVzcGVjaWFsbHkgaW4gdGhlIGRlYnVnZ2VyLyBkaXJlY3RvcnkuCisJSG93ZXZlciwgSU1ITywgaXQncyBub3Qgd29ydGggdGhlIGVmZm9ydCB0byBjaGFuZ2UgdGhlIHJlc3QuCisKK0ZyaSBNYXkgMjIgMjE6NTg6MzUgMTk5OCAgTW9ydGVuIFdlbGluZGVyICA8dGVycmFAZGlrdS5kaz4KKworCSogW3dpbmRvd3Mva2V5Ym9hcmQuY10KKwlDb3JyZWN0IGhhbmRsaW5nIG9mIGtleXMgImAtPVtdXDsnLC4vIi4KKworRnJpIE1heSAyMiAxMjowNjowMCAxOTk4ICBQZXIgTGluZHN0cvZtIDxwZWxpbnN0ckBhbGdvbmV0LnNlPgorCisJKiBbaW5jbHVkZS93aW5kb3dzLmhdIFtyZWxheTMyL2tlcm5lbDMyLnNwZWNdIFt3aW4zMi9jb25zb2xlLmNdCisJQWRkZWQgc3R1YiBmb3IgUmVhZENvbnNvbGVPdXRwdXRDaGFyYWN0ZXIzMkEuCisKK1RodSBNYXkgMjEgMTY6NDU6NDggMTk5OCAgUGFzY2FsIEN1b3EgPHBjdW9xQGVucy1seW9uLmZyPgorCisJKiBbb2xlL29sZTJubHMuY10KKwlCZWdhbiBiZXR0ZXIgaW1wbGVtZW50YXRpb24gb2YgTENNYXBTdHJpbmczMkEuCisJTm90IHZlcnkgd2VsbCB0ZXN0ZWQgeWV0LCBhbmQgc3RpbGwgbmVlZCBpbXByb3ZlbWVudHMuCisKKwkqIFtjb250cm9scy9zY3JvbGwuY10KKwlEb2N1bWVudGVkIGZ1bmN0aW9ucy4KKworV2VkIE1heSAyMCAyMTozNzo1NiAxOTk4ICBQZXRlciBIdW5uaXNldHQgPGh1bm5pc2VAbm9ydGVsLmNhPgorCisJKiBbaW5jbHVkZS93aW5kb3dzLmhdW21pc2MvbWFpbi5jXQorCUNoYW5nZSBTeXN0ZW1QYXJhbWV0ZXJJbmZvIHRvIHN1cHBvcnQgU1BJX0dFVEhJR0hDT05UUkFTVC4gQWxzbworCWluY2x1ZGUgc29tZSBtaXNzaW5nIFNQSV8gZGVmaW5pdGlvbnMuCisKKwkqIFtpbmNsdWRlL2Rzb3VuZC5oXVttdWx0aW1lZGlhL2Rzb3VuZC5jXVtyZWxheTMyL2RwbGF5eC5zcGVjXQorCUFkZGVkIHN0dWJzIGZvciBEaXJlY3RQbGF5TG9iYnlDcmVhdGVbQVddLiBOb3Qgc3VyZSBpZiB0aGVzZQorCXNob3VsZCBnbyBpbnRvIGEgbmV3IGZpbGVzIGRwbGF5eC5jPyBBbnlvbmUgY2FyZT8KKworCSogW2luY2x1ZGUvd2lubmxzLmhdCisJQWRkZWQgdHdvIG1pc3NpbmcgZmxhZ3MgZm9yIHRoZSBDb21wYXJlU3RyaW5nMzIgZnVuY3Rpb25zLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTdW4gTWF5IDE3IDE2OjIzOjU2IDE5OTggIFV3ZSBCb25uZXMgPGJvbkBlbGVrdHJvbi5pa3AucGh5c2lrLnR1LWRhcm1zdGFkdC5kZT4KIAogCSogW2ZpbGUvcHJvZmlsZS5jXQpkaWZmIC0tZ2l0IGEvTWFrZS5ydWxlcy5pbiBiL01ha2UucnVsZXMuaW4KaW5kZXggOTA4MGI5My4uNWZlZmE1MyAxMDA2NDQKLS0tIGEvTWFrZS5ydWxlcy5pbgorKysgYi9NYWtlLnJ1bGVzLmluCkBAIC0xMSw2ICsxMSw3IEBACiAjIFJDX1NSQ1MgICAgICA6IHJlc291cmNlIHNvdXJjZSBmaWxlcyAob3B0aW9uYWwpCiAjIEVYVFJBX1NSQ1MgICA6IGV4dHJhIHNvdXJjZSBmaWxlcyBmb3IgbWFrZSBkZXBlbmQgKG9wdGlvbmFsKQogIyBFWFRSQV9PQkpTICAgOiBleHRyYSBvYmplY3QgZmlsZXMgKG9wdGlvbmFsKQorIyBXUkNFWFRSQSAgICAgOiBleHRyYSB3cmMgZmxhZ3MgKGUuZy4gJy1wIF9TeXNSZXMnKSAob3B0aW9uYWwpCiAKICMgRmlyc3Qgc29tZSB1c2VmdWwgZGVmaW5pdGlvbnMKIApAQCAtNDIsNiArNDMsOCBAQAogQlVJTEQgICAgID0gJChUT1BPQkpESVIpL3Rvb2xzL2J1aWxkQFBST0dFWFRACiBNQUtFREVQICAgPSAkKFRPUE9CSkRJUikvdG9vbHMvbWFrZWRlcEBQUk9HRVhUQAogV0lORVJDICAgID0gJChUT1BPQkpESVIpL3JjL3dpbmVyY0BQUk9HRVhUQAorV1JDICAgICAgID0gJChUT1BPQkpESVIpL3Rvb2xzL3dyYy93cmNAUFJPR0VYVEAKK1dSQ0ZMQUdTICA9IC10IC1jCiBXSU5FU1RVQiAgPSAkKFRPUE9CSkRJUikvbGlicmFyeS93aW5lc3R1Yi5vCiBTVUJNQUtFICAgPSAkKE1BS0UpICdDQz0kKENDKScgJ0NGTEFHUz0kKENGTEFHUyknICdPUFRJT05TPSQoT1BUSU9OUyknCiBAU0VUX01BS0VACkBAIC02NSw3ICs2OCw3IEBACiAKICMgSW1wbGljaXQgcnVsZXMKIAotLlNVRkZJWEVTOiAucmMKKy5TVUZGSVhFUzogLnJjIC5yZXMKIAogLmMubzoKIAkkKENDKSAtYyAkKEFMTENGTEFHUykgLW8gJCoubyAkPApAQCAtNzYsMjYgKzc5LDQ2IEBACiAuUy5vOgogCSQoQ0MpIC1jIC1vICQqLm8gJDwgIAogCi0ucmMuYzoKLQllY2hvICIjaW5jbHVkZSBcIndpbmRvd3MuaFwiIiA+JCotdG1wLmMKLQllY2hvIFdJTkRPV1NfSF9FTkRTX0hFUkUgPj4kKi10bXAuYwotCWNhdCAkPCA+PiQqLXRtcC5jCi0JJChDUFApICQoREVGUykgJChPUFRJT05TKSAkKERJVklOQ0wpIC1EUkNfSU5WT0tFRCAtUCAkKi10bXAuYyB8IHNlZCAtZSAnMSwvXldJTkRPV1NfSF9FTkRTX0hFUkUvZCcgfCAkKFdJTkVSQykgJChSQ0ZMQUdTKSAtYyAtbyAkKiAtcCAkKgotCSQoUk0pICQqLXRtcC5jCisucmMuczoKKwkkKFdSQykgJChXUkNGTEFHUykgJChXUkNFWFRSQSkgJChESVZJTkNMKSAkPAogCiAucmMuaDoKLQllY2hvICIjaW5jbHVkZSBcIndpbmRvd3MuaFwiIiA+JCotdG1wLmMKLQllY2hvIFdJTkRPV1NfSF9FTkRTX0hFUkUgPj4kKi10bXAuYwotCWNhdCAkPCA+PiQqLXRtcC5jCi0JJChDUFApICQoREVGUykgJChPUFRJT05TKSAkKERJVklOQ0wpIC1EUkNfSU5WT0tFRCAtUCAkKi10bXAuYyB8IHNlZCAtZSAnMSwvXldJTkRPV1NfSF9FTkRTX0hFUkUvZCcgfCAkKFdJTkVSQykgJChSQ0ZMQUdTKSAtYyAtbyAkKiAtcCAkKgotCSQoUk0pICQqLXRtcC5jCisJJChXUkMpICQoV1JDRkxBR1MpICQoV1JDRVhUUkEpICQoRElWSU5DTCkgLW5oICQ8CisKKy5yYy5yZXM6CisJJChXUkMpICQoV1JDRkxBR1MpICQoV1JDRVhUUkEpICQoRElWSU5DTCkgLXIgJDwKKworLnJlcy5zOgorCSQoV1JDKSAkKFdSQ0ZMQUdTKSAkKFdSQ0VYVFJBKSAtYiAkPAorCisucmVzLmg6CisJJChXUkMpICQoV1JDRkxBR1MpICQoV1JDRVhUUkEpIC1ibmggJDwKKworIyBPYnNvbGV0ZQorIy5yYy5jOgorIwllY2hvICIjaW5jbHVkZSBcIndpbmRvd3MuaFwiIiA+JCotdG1wLmMKKyMJZWNobyBXSU5ET1dTX0hfRU5EU19IRVJFID4+JCotdG1wLmMKKyMJY2F0ICQ8ID4+JCotdG1wLmMKKyMJJChDUFApICQoREVGUykgJChPUFRJT05TKSAkKERJVklOQ0wpIC1EUkNfSU5WT0tFRCAtUCAkKi10bXAuYyB8IHNlZCAtZSAnMSwvXldJTkRPV1NfSF9FTkRTX0hFUkUvZCcgfCAkKFdJTkVSQykgJChSQ0ZMQUdTKSAtYyAtbyAkKiAtcCAkKgorIwkkKFJNKSAkKi10bXAuYworIworIy5yYy5oOgorIwllY2hvICIjaW5jbHVkZSBcIndpbmRvd3MuaFwiIiA+JCotdG1wLmMKKyMJZWNobyBXSU5ET1dTX0hfRU5EU19IRVJFID4+JCotdG1wLmMKKyMJY2F0ICQ8ID4+JCotdG1wLmMKKyMJJChDUFApICQoREVGUykgJChPUFRJT05TKSAkKERJVklOQ0wpIC1EUkNfSU5WT0tFRCAtUCAkKi10bXAuYyB8IHNlZCAtZSAnMSwvXldJTkRPV1NfSF9FTkRTX0hFUkUvZCcgfCAkKFdJTkVSQykgJChSQ0ZMQUdTKSAtYyAtbyAkKiAtcCAkKgorIwkkKFJNKSAkKi10bXAuYworIwogCiAKLSMgUnVsZSB0byByZWJ1aWxkIHJlc291cmNlIGNvbXBpbGVyCisjIFJ1bGUgdG8gcmVidWlsZCB0aGUgcmVzb3VyY2UgY29tcGlsZXIKIAogJChXSU5FUkMpIGNoZWNrX3dpbmVyYzoKIAljZCAkKFRPUE9CSkRJUikvcmM7ICQoU1VCTUFLRSkgd2luZXJjQFBST0dFWFRACiAKKyQoV1JDKSBjaGVja193cmM6CisJY2QgJChUT1BPQkpESVIpL3Rvb2xzL3dyYzsgJChTVUJNQUtFKSB3cmNAUFJPR0VYVEAKKwogIyBSdWxlIHRvIHJlYnVpbGQgdGhlICdtYWtlZGVwJyBwcm9ncmFtCiAKICQoTUFLRURFUCkgY2hlY2tfbWFrZWRlcDoKQEAgLTEzMiw3ICsxNTUsNyBAQAogCSQoTUFLRURFUCkgJChESVZJTkNMKSAtQyQoU1JDRElSKSAkKENfU1JDUykgJChSQ19TUkNTKSAkKEVYVFJBX1NSQ1MpCiAKIGNsZWFuOjoKLQkkKFJNKSAqLm8gXCMqXCMgKn4gKiUgKi5iYWsgKi5vcmlnICoucmVqICouZmxjICotdG1wLmMgeS50YWIuYyB5LnRhYi5oIGxleC55eS5jIGNvcmUgJChHRU5fQVNNX1NSQ1MpICQoUkNfU1JDUzoucmM9LmMpICQoUkNfU1JDUzoucmM9LmgpICQoUFJPR1JBTVMpCisJJChSTSkgKi5vIFwjKlwjICp+IColICouYmFrICoub3JpZyAqLnJlaiAqLmZsYyAqLXRtcC5jIHkudGFiLmMgeS50YWIuaCBsZXgueXkuYyBjb3JlICQoR0VOX0FTTV9TUkNTKSAkKFJDX1NSQ1M6LnJjPS5zKSAkKFJDX1NSQ1M6LnJjPS5oKSAkKFBST0dSQU1TKQogCiBkdW1teToKIApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgppbmRleCBhZDAyM2Q5Li45ZmUxYzM4IDEwMDY0NAotLS0gYS9NYWtlZmlsZS5pbgorKysgYi9NYWtlZmlsZS5pbgpAQCAtMjYsNiArMjYsNyBAQAogTElCU1VCRElSUyA9IFwKIAlyYyBcCiAJdG9vbHMgXAorCXRvb2xzL3dyYyBcCiAJY29udHJvbHMgXAogCWZpbGVzIFwKIAlncmFwaGljcyBcCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKaW5kZXggNTg2M2NiMi4uMzM4YjU0OCAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZpZ3VyZQpAQCAtMjQwNyw3ICsyNDA3LDcgQEAKIGZpCiAKIAotZm9yIGFjX2Z1bmMgaW4gY2xvbmUgZ2V0cGFnZXNpemUgbWVtbW92ZSBzaWdhbHRzdGFjayBzdHJlcnJvciB0Y2dldGF0dHIgdGltZWdtIHVzbGVlcCB3YWl0NCB3YWl0cGlkCitmb3IgYWNfZnVuYyBpbiBjbG9uZSBnZXRwYWdlc2l6ZSBtZW1tb3ZlIHNpZ2FsdHN0YWNrIHN0cmVycm9yIHN0cmljbXAgdGNnZXRhdHRyIHRpbWVnbSB1c2xlZXAgd2FpdDQgd2FpdHBpZAogZG8KIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2CiBlY2hvICJjb25maWd1cmU6MjQxNDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKQEAgLTMyOTEsNiArMzI5MSw3IEBACiByZXNvdXJjZXMvTWFrZWZpbGUKIHNjaGVkdWxlci9NYWtlZmlsZQogdG9vbHMvTWFrZWZpbGUKK3Rvb2xzL3dyYy9NYWtlZmlsZQogdHN4MTEvTWFrZWZpbGUKIHdpbjMyL01ha2VmaWxlCiB3aW5kb3dzL01ha2VmaWxlICBpbmNsdWRlL2NvbmZpZy5oIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CkBAIC0zNDIyLDYgKzM0MjMsNyBAQAogcmVzb3VyY2VzL01ha2VmaWxlCiBzY2hlZHVsZXIvTWFrZWZpbGUKIHRvb2xzL01ha2VmaWxlCit0b29scy93cmMvTWFrZWZpbGUKIHRzeDExL01ha2VmaWxlCiB3aW4zMi9NYWtlZmlsZQogd2luZG93cy9NYWtlZmlsZSAifQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmluIGIvY29uZmlndXJlLmluCmluZGV4IDQzZTI2MjcuLjkxYmMzN2QgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5pbgorKysgYi9jb25maWd1cmUuaW4KQEAgLTIxNCw3ICsyMTQsNyBAQAogCiBkbmwgKioqKiBDaGVjayBmb3IgZnVuY3Rpb25zIGFuZCBoZWFkZXIgZmlsZXMgKioqKgogCi1BQ19DSEVDS19GVU5DUyhjbG9uZSBnZXRwYWdlc2l6ZSBtZW1tb3ZlIHNpZ2FsdHN0YWNrIHN0cmVycm9yIHRjZ2V0YXR0ciB0aW1lZ20gdXNsZWVwIHdhaXQ0IHdhaXRwaWQpCitBQ19DSEVDS19GVU5DUyhjbG9uZSBnZXRwYWdlc2l6ZSBtZW1tb3ZlIHNpZ2FsdHN0YWNrIHN0cmVycm9yIHN0cmljbXAgdGNnZXRhdHRyIHRpbWVnbSB1c2xlZXAgd2FpdDQgd2FpdHBpZCkKIEFDX0NIRUNLX0hFQURFUlMod2N0eXBlLmggc3lzL3N5c2NhbGwuaCBzeXNjYWxsLmggc3lzL3BhcmFtLmggc3lzL3Zmcy5oIHN5cy9tb3VudC5oIHN5cy9zdGF0ZnMuaCBmbG9hdC5oIGxpbnV4L2Nkcm9tLmggc3lzL2NkaW8uaCBzeXMvZmlsaW8uaCkKIEFDX0hFQURFUl9TVEFUKCkKIEFDX0NfQ09OU1QoKQpAQCAtNDQ5LDYgKzQ0OSw3IEBACiByZXNvdXJjZXMvTWFrZWZpbGUKIHNjaGVkdWxlci9NYWtlZmlsZQogdG9vbHMvTWFrZWZpbGUKK3Rvb2xzL3dyYy9NYWtlZmlsZQogdHN4MTEvTWFrZWZpbGUKIHdpbjMyL01ha2VmaWxlCiB3aW5kb3dzL01ha2VmaWxlIF0pCmRpZmYgLS1naXQgYS9jb250cm9scy9NYWtlZmlsZS5pbiBiL2NvbnRyb2xzL01ha2VmaWxlLmluCmluZGV4IDczNmMwMGIuLmZmOTJmNWMgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL01ha2VmaWxlLmluCisrKyBiL2NvbnRyb2xzL01ha2VmaWxlLmluCkBAIC0xOSw2ICsxOSw3IEBACiAJc2Nyb2xsLmMgXAogCXN0YXRpYy5jIFwKIAlzdGF0dXMuYyBcCisJdG9vbGJhci5jIFwKIAl1aXRvb2xzLmMgXAogCXVwZG93bi5jIFwKIAl3aWRnZXRzLmMKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2NvbWJvLmMgYi9jb250cm9scy9jb21iby5jCmluZGV4IGRiMjRlYzMuLjFiOGUxZDcgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2NvbWJvLmMKKysrIGIvY29udHJvbHMvY29tYm8uYwpAQCAtNiw3ICs2LDYgQEAKICAqIEZJWE1FOiByb2xsIHVwIGluIE5ldHNjYXBlIDMuMDEuCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCmRpZmYgLS1naXQgYS9jb250cm9scy9jb21tY3RybC5jIGIvY29udHJvbHMvY29tbWN0cmwuYwppbmRleCAyNDVlYjg2Li45M2RlMDkyIDEwMDY0NAotLS0gYS9jb250cm9scy9jb21tY3RybC5jCisrKyBiL2NvbnRyb2xzL2NvbW1jdHJsLmMKQEAgLTExLDEyICsxMSwxMyBAQAogI2luY2x1ZGUgImhlYWRlci5oIgogI2luY2x1ZGUgInByb2dyZXNzLmgiCiAjaW5jbHVkZSAic3RhdHVzLmgiCisjaW5jbHVkZSAidG9vbGJhci5oIgogI2luY2x1ZGUgInVwZG93bi5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRHJhd1N0YXR1c1RleHQzMkEgICAoQ09NQ1RMMzIuNSkKKyAqIERyYXdTdGF0dXNUZXh0MzJBIFtDT01DVEwzMi41XVtDT01DVEwzMi4yN10KICAqLwogdm9pZCBXSU5BUEkgRHJhd1N0YXR1c1RleHQzMkEoIEhEQzMyIGhkYywgTFBSRUNUMzIgbHByYywgTFBDU1RSIHRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIHN0eWxlICkKQEAgLTU1LDIyICs1Niw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERyYXdTdGF0dXNUZXh0MTYgICAoQ09NQ1RMMzIuMjcpCi0gKi8KLXZvaWQgV0lOQVBJIERyYXdTdGF0dXNUZXh0MTYoIEhEQzE2IGhkYywgTFBSRUNUMTYgbHByYywgTFBDU1RSIHRleHQsCi0JCQkgICAgICBVSU5UMTYgc3R5bGUgKQotewotICBpZighbHByYykKLSAgICBEcmF3U3RhdHVzVGV4dDMyQSgoSERDMzIpaGRjLCAwLCB0ZXh0LCAoVUlOVDMyKXN0eWxlKTsKLSAgZWxzZXsgICAgCi0gICAgUkVDVDMyIHJlY3QzMjsKLSAgICBDT05WX1JFQ1QxNlRPMzIoIGxwcmMsICZyZWN0MzIgKTsKLSAgICBEcmF3U3RhdHVzVGV4dDMyQSgoSERDMzIpaGRjLCAmcmVjdDMyLCB0ZXh0LCAoVUlOVDMyKXN0eWxlKTsKLSAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDcmVhdGVTdGF0dXNXaW5kb3czMkEgICAoQ09NQ1RMMzIuNikKKyAqIENyZWF0ZVN0YXR1c1dpbmRvdzMyQSBbQ09NQ1RMMzIuNl1bQ09NQ1RMMzIuMjFdCiAgKi8KIEhXTkQzMiBXSU5BUEkgQ3JlYXRlU3RhdHVzV2luZG93MzJBKCBJTlQzMiBzdHlsZSwgTFBDU1RSIHRleHQsIEhXTkQzMiBwYXJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIHdpZCApCkBAIC04MiwxOCArNjgsNiBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDcmVhdGVTdGF0dXNXaW5kb3cxNiAgIChDT01DVEwzMi4yMSkKLSAqLwotSFdORDE2IFdJTkFQSSBDcmVhdGVTdGF0dXNXaW5kb3cxNiggSU5UMTYgc3R5bGUsIExQQ1NUUiB0ZXh0LCBIV05EMTYgcGFyZW50LAotCQkJCSAgICBVSU5UMTYgd2lkICkKLXsKLSAgICByZXR1cm4gQ3JlYXRlV2luZG93MTYoU1RBVFVTQ0xBU1NOQU1FMTYsIHRleHQsIHN0eWxlLCAKLQkJCSAgIENXX1VTRURFRkFVTFQxNiwgQ1dfVVNFREVGQVVMVDE2LAotCQkJICAgQ1dfVVNFREVGQVVMVDE2LCBDV19VU0VERUZBVUxUMTYsIAotCQkJICAgcGFyZW50LCB3aWQsIDAsIDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDcmVhdGVTdGF0dXNXaW5kb3czMlcgICAoQ09NQ1RMMzIuMjIpCiAgKi8KIEhXTkQzMiBXSU5BUEkgQ3JlYXRlU3RhdHVzV2luZG93MzJXKCBJTlQzMiBzdHlsZSwgTFBDV1NUUiB0ZXh0LCBIV05EMzIgcGFyZW50LApAQCAtMTc3LDcgKzE1MSw3IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgICBjYXNlIElDQ19CQVJfQ0xBU1NFUzoKLSAgICAgICAgVFJBQ0UgKGNvbW1jdHJsLCAiTm8gdG9vbGJhciBjbGFzcyBpbXBsZW1lbnRlZCFcbiIpOworCVRPT0xCQVJfUmVnaXN0ZXIgKCk7CiAJU1RBVFVTX1JlZ2lzdGVyICgpOwogICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJObyB0cmFja2JhciBjbGFzcyBpbXBsZW1lbnRlZCFcbiIpOwogICAgICAgICBUUkFDRSAoY29tbWN0cmwsICJObyB0b29sdGlwIGNsYXNzIGltcGxlbWVudGVkIVxuIik7CkBAIC0yMDgsNiArMTgyLDcgQEAKICAgICAgICAgVFJBQ0UgKGNvbW1jdHJsLCAiTm8gbW9udGggY2FsZW5kYXIgY2xhc3MgaW1wbGVtZW50ZWQhXG4iKTsKICAgICAgICAgVFJBQ0UgKGNvbW1jdHJsLCAiTm8gZGF0ZSBwaWNrZXIgY2xhc3MgaW1wbGVtZW50ZWQhXG4iKTsKICAgICAgICAgVFJBQ0UgKGNvbW1jdHJsLCAiTm8gdGltZSBwaWNrZXIgY2xhc3MgaW1wbGVtZW50ZWQhXG4iKTsKKyAgICAgICAgVVBET1dOX1JlZ2lzdGVyICgpOwogICAgICAgICBicmVhazsKIAogICAgICAgY2FzZSBJQ0NfVVNFUkVYX0NMQVNTRVM6CkBAIC0yODgsMyArMjYzLDgxIEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDcmVhdGVUb29sYmFyRXggW0NPTUNUTDMyLjMyXQorICoKKyAqCisgKgorICovCisKK0hXTkQzMiBXSU5BUEkKK0NyZWF0ZVRvb2xiYXJFeCAoSFdORDMyIGh3bmQsIERXT1JEIHN0eWxlLCBVSU5UMzIgd0lELCBJTlQzMiBuQml0bWFwcywKKyAgICAgICAgICAgICAgICAgSElOU1RBTkNFMzIgaEJNSW5zdCwgVUlOVDMyIHdCTUlELCBMUENUQkJVVFRPTiBscEJ1dHRvbnMsCisgICAgICAgICAgICAgICAgIElOVDMyIGlOdW1CdXR0b25zLCBJTlQzMiBkeEJ1dHRvbiwgSU5UMzIgZHlCdXR0b24sCisgICAgICAgICAgICAgICAgIElOVDMyIGR4Qml0bWFwLCBJTlQzMiBkeUJpdG1hcCwgVUlOVDMyIHVTdHJ1Y3RTaXplKQoreworICAgIEhXTkQzMiBod25kVEIgPQorICAgICAgICBDcmVhdGVXaW5kb3dFeDMyQSgwLCBUT09MQkFSQ0xBU1NOQU1FMzJBLCAiIiwgc3R5bGUsIDAsIDAsIDAsIDAsCisJCQkgIGh3bmQsIChITUVOVTMyKXdJRCwgMCwgTlVMTCk7CisgICAgaWYoaHduZFRCKSB7CisJVEJBRERCSVRNQVAgdGJhYjsKKworICAgICAgICBTZW5kTWVzc2FnZTMyQSAoaHduZFRCLCBUQl9CVVRUT05TVFJVQ1RTSVpFLCBzaXplb2YoVEJCVVRUT04pLCAwKTsKKworCS8qIHNldCBiaXRtYXAgYW5kIGJ1dHRvbiBzaXplICovCisKKwkvKiBhZGQgYml0bWFwcyAqLworCXRiYWIuaEluc3QgPSBoQk1JbnN0OworCXRiYWIubklEICAgPSB3Qk1JRDsKKwlTZW5kTWVzc2FnZTMyQSAoaHduZFRCLCBUQl9BRERCSVRNQVAsCisJCQkoV1BBUkFNMzIpbkJpdG1hcHMsIChMUEFSQU0pJnRiYWIpOworCisJLyogYWRkIGJ1dHRvbnMgKi8KKwlTZW5kTWVzc2FnZTMyQSAoaHduZFRCLCBUQl9BRERCVVRUT05TMzJBLAorCQkJKFdQQVJBTTMyKWlOdW1CdXR0b25zLCAoTFBBUkFNKSZscEJ1dHRvbnMpOworICAgIH0KKworICAgIHJldHVybiAoaHduZFRCKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENyZWF0ZU1hcHBlZEJpdG1hcCBbQ09NQ1RMMzIuOF0KKyAqCisgKgorICoKKyAqLworCitIQklUTUFQMzIgV0lOQVBJCitDcmVhdGVNYXBwZWRCaXRtYXAgKEhJTlNUQU5DRTMyIGhJbnN0YW5jZSwgSU5UMzIgaWRCaXRtYXAsIFVJTlQzMiB3RmxhZ3MsCisJCSAgICBMUENPTE9STUFQIGxwQ29sb3JNYXAsIElOVDMyIGlOdW1NYXBzKQoreworICAgIEhCSVRNQVAzMiBoYm07CisKKyAgICBGSVhNRSAoY29tbWN0cmwsICJzZW1pLXN0dWIhXG4iKTsKKworICAgIGhibSA9IExvYWRCaXRtYXAzMkEgKGhJbnN0YW5jZSwgTUFLRUlOVFJFU09VUkNFMzJBKGlkQml0bWFwKSk7CisKKyAgICByZXR1cm4gaGJtOworIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENyZWF0ZVRvb2xiYXIgW0NPTUNUTDMyLjddCisgKgorICoKKyAqCisgKi8KKworSFdORDMyIFdJTkFQSQorQ3JlYXRlVG9vbGJhciAoSFdORDMyIGh3bmQsIERXT1JEIHN0eWxlLCBVSU5UMzIgd0lELCBJTlQzMiBuQml0bWFwcywKKwkgICAgICAgSElOU1RBTkNFMzIgaEJNSW5zdCwgVUlOVDMyIHdCTUlELAorCSAgICAgICBMUENPTERUQkJVVFRPTiBscEJ1dHRvbnMsSU5UMzIgaU51bUJ1dHRvbnMpCit7CisgICAgcmV0dXJuIENyZWF0ZVRvb2xiYXJFeCAoaHduZCwgc3R5bGUgfCBDQ1NfTk9ESVZJREVSLCB3SUQsIG5CaXRtYXBzLAorCQkJICAgIGhCTUluc3QsIHdCTUlELCAoTFBDVEJCVVRUT04pbHBCdXR0b25zLAorCQkJICAgIGlOdW1CdXR0b25zLCAwLCAwLCAwLCAwLCBzaXplb2YgKE9MRFRCQlVUVE9OKSk7Cit9CisKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2Rlc2t0b3AuYyBiL2NvbnRyb2xzL2Rlc2t0b3AuYwppbmRleCA1MjBiYjU2Li41MmFkZDhhIDEwMDY0NAotLS0gYS9jb250cm9scy9kZXNrdG9wLmMKKysrIGIvY29udHJvbHMvZGVza3RvcC5jCkBAIC0xNjYsNiArMTY2LDE4IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFBhaW50RGVza3RvcCAgIChVU0VSMzIuNDE1KQorICoKKyAqLworQk9PTDMyIFdJTkFQSSBQYWludERlc2t0b3AoSERDMzIgaGRjKQoreworICAgIEhXTkQzMiBod25kID0gR2V0RGVza3RvcFdpbmRvdzMyKCk7CisgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOworICAgIERFU0tUT1BJTkZPICppbmZvUHRyID0gKERFU0tUT1BJTkZPICopd25kUHRyLT53RXh0cmE7CisKKyAgICByZXR1cm4gREVTS1RPUF9Eb0VyYXNlQmtnbmQoIGh3bmQsIGhkYywgaW5mb1B0ciApOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBTZXREZXNrUGF0dGVybiAgIChVU0VSLjI3OSkKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2VkaXQuYyBiL2NvbnRyb2xzL2VkaXQuYwppbmRleCBhYjExNzc2Li5kODQwN2JjIDEwMDY0NAotLS0gYS9jb250cm9scy9lZGl0LmMKKysrIGIvY29udHJvbHMvZWRpdC5jCkBAIC0xMSw3ICsxMSw2IEBACiAgKglwbGVhc2UgcmVhZCBFRElULlRPRE8gKGFuZCB1cGRhdGUgaXQgd2hlbiB5b3UgY2hhbmdlIHRoaW5ncykKICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2lubnQuaCIKICNpbmNsdWRlICJ3aW4uaCIKQEAgLTQxLDYgKzQwLDcgQEAKICNkZWZpbmUgRUZfSFNDUk9MTF9IQUNLCQkweDAwNDAJLyogd2UgYWxyZWFkeSBoYXZlIGluZm9ybWVkIHRoZSB1c2VyIG9mIHRoZSBoYWNrZWQgaGFuZGxlciAqLwogI2RlZmluZSBFRl9BRlRFUl9XUkFQCQkweDAwODAJLyogdGhlIGNhcmV0IGlzIGRpc3BsYXllZCBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgYQogCQkJCQkgICB3cmFwcGVkIGxpbmUsIGluc3RlYWQgb2YgaW4gZnJvbnQgb2YgdGhlIG5leHQgY2hhcmFjdGVyICovCisjZGVmaW5lIEVGX1VTRV9TT0ZUQlJLCQkweDAxMDAJLyogRW5hYmxlIHNvZnQgYnJlYWtzIGluIHRleHQuICovCiAKIHR5cGVkZWYgQk9PTDMyICpMUEJPT0wzMjsKIApAQCAtMTk0OCwxMCArMTk0OCwxNSBAQAogICoKICAqCUVNX0ZNVExJTkVTCiAgKgorICogRW5hYmxlIG9yIGRpc2FibGUgc29mdCBicmVha3MuCiAgKi8KIHN0YXRpYyBCT09MMzIgRURJVF9FTV9GbXRMaW5lcyhXTkQgKnduZCwgRURJVFNUQVRFICplcywgQk9PTDMyIGFkZF9lb2wpCiB7Ci0JRklYTUUoZWRpdCwgIm1lc3NhZ2Ugbm90IGltcGxlbWVudGVkXG4iKTsKKwllcy0+ZmxhZ3MgJj0gfkVGX1VTRV9TT0ZUQlJLOworCWlmIChhZGRfZW9sKSB7CisJCWVzLT5mbGFncyB8PSBFRl9VU0VfU09GVEJSSzsKKwkJRklYTUUoZWRpdCwgInNvZnQgYnJlYWsgZW5hYmxlZCwgbm90IGltcGxlbWVudGVkXG4iKTsKKwl9CiAJcmV0dXJuIGFkZF9lb2w7CiB9CiAKQEAgLTE5NjUsNyArMTk3MCw3IEBACiAgKglIb3dldmVyLCB3aXRoIHRoaXMgbWVzc2FnZSBhIDMyIGJpdCBhcHBsaWNhdGlvbiByZXF1ZXN0cwogICoJYSBoYW5kbGUgdG8gMzIgYml0IG1vdmVhYmxlIGxvY2FsIGhlYXAgbWVtb3J5LCB3aGVyZSBpdCBleHBlY3RzCiAgKgl0byBmaW5kIHRoZSB0ZXh0LgotICoJSXQncyBhIHBpdHR5IHRoYXQgZnJvbSB0aGlzIG1vbWVudCBvbiB3ZSBoYXZlIHRvIHVzZSB0aGlzCisgKglJdCdzIGEgcGl0eSB0aGF0IGZyb20gdGhpcyBtb21lbnQgb24gd2UgaGF2ZSB0byB1c2UgdGhpcwogICoJbG9jYWwgaGVhcCwgYmVjYXVzZSBhcHBsaWNhdGlvbnMgbWF5IHJlbHkgb24gdGhlIGhhbmRsZQogICoJaW4gdGhlIGZ1dHVyZS4KICAqCkBAIC0zODk2LDcgKzM5MDEsOCBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCUVSUihlZGl0LCAidW5kb2N1bWVudGVkIFdNX1ZTQ1JPTEwgcGFyYW1ldGVyLCBwbGVhc2UgcmVwb3J0XG4iKTsKKwkJRVJSKGVkaXQsICJ1bmRvY3VtZW50ZWQgV01fVlNDUk9MTCBhY3Rpb24gJWQsIHBsZWFzZSByZXBvcnRcbiIsCisJCQlhY3Rpb24pOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKGR5KQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvaGVhZGVyLmMgYi9jb250cm9scy9oZWFkZXIuYwppbmRleCAzNWExMzU3Li4xOGJiZmFhIDEwMDY0NAotLS0gYS9jb250cm9scy9oZWFkZXIuYworKysgYi9jb250cm9scy9oZWFkZXIuYwpAQCAtNCwxNSArNCwyMCBAQAogICogIENvcHlyaWdodCAxOTk4IEVyaWMgS29obAogICoKICAqICBUT0RPOgotICogICAtIEJpdG1hcCBzdXBwb3J0IChwYXJ0aWFsbHkpLgogICogICAtIEltYWdlbGlzdCBzdXBwb3J0IChwYXJ0aWFsbHkpLgotICogICAtIEhvdHRyYWNrIHN1cHBvcnQgKHBhcnRpYWxseSkuCi0gKiAgIC0gQ29udHJvbCBzcGVjaWZpYyBjdXJzb3JzIChvdmVyIGRpdmlkZXJzKS4KKyAqICAgLSBDYWxsYmFjayBpdGVtcy4KICAqICAgLSBPd25lciBkcmF3IHN1cHBvcnQuCiAgKiAgIC0gT3JkZXIgbGlzdCBzdXBwb3J0LgorICogICAtIENvbnRyb2wgc3BlY2lmaWMgY3Vyc29ycyAob3ZlciBkaXZpZGVycykuCisgKiAgIC0gSG90dHJhY2sgc3VwcG9ydCAocGFydGlhbGx5KS4KICAqICAgLSBDdXN0b20gZHJhdyBzdXBwb3J0IChpbmNsdWRpbmcgTm90aWZpY2F0aW9ucykuCiAgKiAgIC0gRHJhZyBhbmQgRHJvcCBzdXBwb3J0IChpbmNsdWRpbmcgTm90aWZpY2F0aW9ucykuCiAgKiAgIC0gVW5pY29kZSBzdXBwb3J0LgorICoKKyAqICBGSVhNRToKKyAqICAgLSBSZXBsYWNlIERyYXdUZXh0MzJBIGJ5IERyYXdUZXh0RXgzMkEoLi4ufERUX0VOREVMTElQU0lTKSBpbgorICogICAgIEhFQURFUl9EcmF3SXRlbS4KKyAqICAgLSBMaXR0bGUgZmxhdyB3aGVuIGRyYXdpbmcgYSBiaXRtYXAgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHRleHQuCiAgKi8KIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKQEAgLTI5LDEwICszNCw2IEBACiAjZGVmaW5lIFZFUlRfQk9SREVSICAgICA0CiAjZGVmaW5lIERJVklERVJfV0lEVEggIDEwCiAKLSNkZWZpbmUgVU5LTk9XTl9QQVJBTShtc2csIHdQYXJhbSwgbFBhcmFtKSBXQVJOKGhlYWRlciwgXAotICAgICAgICAiVW5rbm93biBwYXJhbWV0ZXIocykgZm9yIG1lc3NhZ2UgIiAjbXNnICAgICBcCi0JIiglMDR4KTogd3A9JTA0eCBscD0lMDhseFxuIiwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7IAotCiAjZGVmaW5lIEhFQURFUl9HZXRJbmZvUHRyKHduZFB0cikgKChIRUFERVJfSU5GTyAqKXduZFB0ci0+d0V4dHJhWzBdKQogCiAKQEAgLTc2LDYgKzc3LDggQEAKIAkgICAgSERDMzIgICAgaGRjQml0bWFwOwogCSAgICBJTlQzMiAgICB5RCwgeVMsIGN4LCBjeSwgcngsIHJ5OwogCisJICAgIEdldE9iamVjdDMyQSAocGhkaS0+aGJtLCBzaXplb2YoQklUTUFQMzIpLCAoTFBWT0lEKSZibXApOworCiAJICAgIHJ5ID0gci5ib3R0b20gLSByLnRvcDsKIAkgICAgcnggPSByLnJpZ2h0IC0gci5sZWZ0OwogCkBAIC05OCw3ICsxMDEsNiBAQAogCQljeCA9IHJ4IC0gNjsKIAkgICAgfQogCi0JICAgIEdldE9iamVjdDMyQSAocGhkaS0+aGJtLCBzaXplb2YoQklUTUFQMzIpLCAoTFBWT0lEKSZibXApOwogCSAgICBoZGNCaXRtYXAgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoaGRjKTsKIAkgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0JpdG1hcCwgcGhkaS0+aGJtKTsKIAkgICAgQml0Qmx0MzIgKGhkYywgci5sZWZ0ICsgMywgeUQsIGN4LCBjeSwgaGRjQml0bWFwLCAwLCB5UywgU1JDQ09QWSk7CkBAIC0xMDcsMjQgKzEwOSw2MyBAQAogCSAgICByLmxlZnQgKz0gKGJtcC5ibVdpZHRoICsgMyk7CiAJfQogCi0vKgorCiAJaWYgKChwaGRpLT5mbXQgJiBIREZfQklUTUFQX09OX1JJR0hUKSAmJiAocGhkaS0+aGJtKSkgewogCSAgICBCSVRNQVAzMiBibXA7CiAJICAgIEhEQzMyICAgIGhkY0JpdG1hcDsKKwkgICAgSU5UMzIgICAgeEQsIHlELCB5UywgY3gsIGN5LCByeCwgcnksIHR4OworCSAgICBSRUNUMzIgICB0ZXh0UmVjdDsKIAogCSAgICBHZXRPYmplY3QzMkEgKHBoZGktPmhibSwgc2l6ZW9mKEJJVE1BUDMyKSwgKExQVk9JRCkmYm1wKTsKIAorCSAgICB0ZXh0UmVjdCA9IHI7CisgICAgICAgICAgICBEcmF3VGV4dDMyQShoZGMsIHBoZGktPnBzelRleHQsIGxzdHJsZW4zMkEocGhkaS0+cHN6VGV4dCksCisJICAgCSAgJnRleHRSZWN0LCBEVF9MRUZUfERUX1ZDRU5URVJ8RFRfU0lOR0xFTElORXxEVF9DQUxDUkVDVCk7CisJICAgIHR4ID0gdGV4dFJlY3QucmlnaHQgLSB0ZXh0UmVjdC5sZWZ0OworCSAgICByeSA9IHIuYm90dG9tIC0gci50b3A7CisJICAgIHJ4ID0gci5yaWdodCAtIHIubGVmdDsKIAorCSAgICBpZiAocnkgPj0gYm1wLmJtSGVpZ2h0KSB7CisJCWN5ID0gYm1wLmJtSGVpZ2h0OworCQl5RCA9IHIudG9wICsgKHJ5IC0gYm1wLmJtSGVpZ2h0KSAvIDI7CisJCXlTID0gMDsKKwkgICAgfQorCSAgICBlbHNlIHsKKwkJY3kgPSByeTsKKwkJeUQgPSByLnRvcDsKKwkJeVMgPSAoYm1wLmJtSGVpZ2h0IC0gcnkpIC8gMjsKKworCSAgICB9CisKKwkgICAgaWYgKHIubGVmdCArIHR4ICsgYm1wLmJtV2lkdGggKyA5IDw9IHIucmlnaHQpIHsKKwkJY3ggPSBibXAuYm1XaWR0aDsKKwkJeEQgPSByLmxlZnQgKyB0eCArIDY7CisJICAgIH0KKwkgICAgZWxzZSB7CisJCWlmIChyeCA+PSBibXAuYm1XaWR0aCArIDYpIHsKKwkJICAgIGN4ID0gYm1wLmJtV2lkdGg7CisJCSAgICB4RCA9IHIucmlnaHQgLSBibXAuYm1XaWR0aCAtIDM7CisJCSAgICByLnJpZ2h0ID0geEQgLSAzOworCQl9CisJCWVsc2UgeworCQkgICAgY3ggPSByeCAtIDM7CisJCSAgICB4RCA9IHIubGVmdDsKKwkJICAgIHIucmlnaHQgPSByLmxlZnQ7CisJCX0KKwkgICAgfQorCisJICAgIGhkY0JpdG1hcCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyIChoZGMpOworCSAgICBTZWxlY3RPYmplY3QzMiAoaGRjQml0bWFwLCBwaGRpLT5oYm0pOworCSAgICBCaXRCbHQzMiAoaGRjLCB4RCwgeUQsIGN4LCBjeSwgaGRjQml0bWFwLCAwLCB5UywgU1JDQ09QWSk7CisJICAgIERlbGV0ZURDMzIgKGhkY0JpdG1hcCk7CiAJfQotKi8KIAotLyoKIAlpZiAocGhkaS0+Zm10ICYgSERGX0lNQUdFKSB7CisJICAgIEhFQURFUl9JTkZPICppbmZvUHRyID0gSEVBREVSX0dldEluZm9QdHIod25kUHRyKTsKIAotCSAgICBJbWFnZUxpc3RfRHJhdyAoLi4uLik7CiAKKy8vCSAgICBJbWFnZUxpc3RfRHJhdyAoaW5mb1B0ci0+aGltbCwgcGhkaS0+aUltYWdlLC4uLik7CiAJfQotKi8KIAogICAgICAgICBpZiAoKHBoZGktPmZtdCAmIEhERl9TVFJJTkcpICYmIChwaGRpLT5wc3pUZXh0KSkgewogICAgICAgICAgICAgb2xkQmtNb2RlID0gU2V0QmtNb2RlMzIoaGRjLCBUUkFOU1BBUkVOVCk7CmRpZmYgLS1naXQgYS9jb250cm9scy9saXN0Ym94LmMgYi9jb250cm9scy9saXN0Ym94LmMKaW5kZXggZTYzMDFhNy4uNjBlYTE4MyAxMDA2NDQKLS0tIGEvY29udHJvbHMvbGlzdGJveC5jCisrKyBiL2NvbnRyb2xzL2xpc3Rib3guYwpAQCAtNSw3ICs1LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJkcml2ZS5oIgpkaWZmIC0tZ2l0IGEvY29udHJvbHMvbWVudS5jIGIvY29udHJvbHMvbWVudS5jCmluZGV4IDc4YWFmMGEuLjgxYmM2ODAgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL21lbnUuYworKysgYi9jb250cm9scy9tZW51LmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImJpdG1hcC5oIgpAQCAtNzcsNiArNzYsNyBAQAogICAgIEhXTkQzMiAgICAgIGhXbmQ7ICAgICAgICAgLyogV2luZG93IGNvbnRhaW5pbmcgdGhlIG1lbnUgKi8KICAgICBNRU5VSVRFTSAgICppdGVtczsgICAgICAgIC8qIEFycmF5IG9mIG1lbnUgaXRlbXMgKi8KICAgICBVSU5UMzIgICAgICBGb2N1c2VkSXRlbTsgIC8qIEN1cnJlbnRseSBmb2N1c2VkIGl0ZW0gKi8KKyAgICBXT1JECWRlZml0ZW07ICAgICAgLyogZGVmYXVsdCBpdGVtIHBvc2l0aW9uLiBVbnVzZWQgKGV4Y2VwdCBmb3Igc2V0L2dldCkqLwogfSBQT1BVUE1FTlUsICpMUFBPUFVQTUVOVTsKIAogLyogaW50ZXJuYWwgZmxhZ3MgZm9yIG1lbnUgdHJhY2tpbmcgKi8KQEAgLTE0NDQsOSArMTQ0NCwxMyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgaWYgKGZsYWdzICYgTUZfQklUTUFQKSBpdGVtLT50ZXh0ID0gKExQU1RSKShIQklUTUFQMzIpTE9XT1JEKHN0cik7Ci0gICAgZWxzZSBpZiAoZmxhZ3MgJiBNRl9PV05FUkRSQVcpIGl0ZW0tPnRleHQgPSAoTFBTVFIpc3RyOwogICAgIGVsc2UgaXRlbS0+dGV4dCA9IE5VTEw7CiAKKyAgICBpZiAoZmxhZ3MgJiBNRl9PV05FUkRSQVcpIAorICAgICAgICBpdGVtLT5kd0l0ZW1EYXRhID0gKERXT1JEKXN0cjsKKyAgICBlbHNlCisgICAgICAgIGl0ZW0tPmR3SXRlbURhdGEgPSAwOworCiAgICAgaWYgKChpdGVtLT5mVHlwZSAmIE1GX1BPUFVQKSAmJiAoZmxhZ3MgJiBNRl9QT1BVUCkgJiYgKGl0ZW0tPmhTdWJNZW51ICE9IGlkKSApCiAJRGVzdHJveU1lbnUzMiggaXRlbS0+aFN1Yk1lbnUgKTsgICAvKiBNb2RpZnlNZW51KCkgc3BlYyAqLwogCkBAIC0zMDMyLDcgKzMwMzYsNiBAQAogCSgoUE9QVVBNRU5VICopVVNFUl9IRUFQX0xJTl9BRERSKChITUVOVTE2KWlkKSktPndGbGFncyB8PSBNRl9QT1BVUDsKIAogICAgIGl0ZW0tPmhDaGVja0JpdCA9IGl0ZW0tPmhVbkNoZWNrQml0ID0gMDsKLSAgICBpdGVtLT5kd0l0ZW1EYXRhID0gMDsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMzczNSw3ICszNzM4LDcgQEAKIAkJCQkJIExQTUVOVUlURU1JTkZPMzJBIGxwbWlpLAogCQkJCQkgQk9PTDMyIHVuaWNvZGUpCiB7Ci0gIE1FTlVJVEVNICptZW51ID0gTUVOVV9GaW5kSXRlbSAoJmhtZW51LCAmaXRlbSwgYnlwb3MpOworICBNRU5VSVRFTSAqbWVudSA9IE1FTlVfRmluZEl0ZW0gKCZobWVudSwgJml0ZW0sIGJ5cG9zPyBNRl9CWVBPU0lUSU9OIDogMCk7CiAgICAgZGVidWdfcHJpbnRfbWVudWl0ZW0oIkdldE1lbnVJdGVtSW5mbzMyX2NvbW1vbjogIiwgbWVudSwgIiIpOwogICAgIGlmICghbWVudSkKIAlyZXR1cm4gRkFMU0U7CkBAIC0zODUzLDcgKzM4NTYsNyBAQAogQk9PTDMyIFdJTkFQSSBTZXRNZW51SXRlbUluZm8zMkEoSE1FTlUzMiBobWVudSwgVUlOVDMyIGl0ZW0sIEJPT0wzMiBieXBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1FTlVJVEVNSU5GTzMyQSAqbHBtaWkpIAogewotICAgIHJldHVybiBTZXRNZW51SXRlbUluZm8zMl9jb21tb24oTUVOVV9GaW5kSXRlbSgmaG1lbnUsICZpdGVtLCBieXBvcyksCisgICAgcmV0dXJuIFNldE1lbnVJdGVtSW5mbzMyX2NvbW1vbihNRU5VX0ZpbmRJdGVtKCZobWVudSwgJml0ZW0sIGJ5cG9zPyBNRl9CWVBPU0lUSU9OIDogMCksCiAJCQkJICAgIGxwbWlpLCBGQUxTRSk7CiB9CiAKQEAgLTM4NjMsNyArMzg2Niw3IEBACiBCT09MMzIgV0lOQVBJIFNldE1lbnVJdGVtSW5mbzMyVyhITUVOVTMyIGhtZW51LCBVSU5UMzIgaXRlbSwgQk9PTDMyIGJ5cG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUVOVUlURU1JTkZPMzJXICpscG1paSkKIHsKLSAgICByZXR1cm4gU2V0TWVudUl0ZW1JbmZvMzJfY29tbW9uKE1FTlVfRmluZEl0ZW0oJmhtZW51LCAmaXRlbSwgYnlwb3MpLAorICAgIHJldHVybiBTZXRNZW51SXRlbUluZm8zMl9jb21tb24oTUVOVV9GaW5kSXRlbSgmaG1lbnUsICZpdGVtLCBieXBvcz8gTUZfQllQT1NJVElPTiA6IDApLAogCQkJCSAgICAoY29uc3QgTUVOVUlURU1JTkZPMzJBKilscG1paSwgVFJVRSk7CiB9CiAKQEAgLTM4NzIsMTQgKzM4NzUsMzYgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBTZXRNZW51RGVmYXVsdEl0ZW0zMihITUVOVTMyIGhtZW51LCBVSU5UMzIgaXRlbSwgQk9PTDMyIGJ5cG9zKQogewotICAgIE1FTlVJVEVNICptZW51ID0gTUVOVV9GaW5kSXRlbSgmaG1lbnUsICZpdGVtLCBieXBvcyk7Ci0gICAgaWYgKCFtZW51KSByZXR1cm4gRkFMU0U7Ci0gICAgZGVidWdfcHJpbnRfbWVudWl0ZW0oIlNldE1lbnVEZWZhdWx0SXRlbTMyOiAiLCBtZW51LCAiIik7CisgICAgTUVOVUlURU0gKm1lbnVpdGVtID0gTUVOVV9GaW5kSXRlbSgmaG1lbnUsICZpdGVtLCBieXBvcyk7CisgICAgUE9QVVBNRU5VICptZW51OworCisgICAgaWYgKCFtZW51aXRlbSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghKG1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUihobWVudSkpKSByZXR1cm4gRkFMU0U7CisKKyAgICBtZW51LT5kZWZpdGVtID0gaXRlbTsgLyogcG9zaXRpb24gKi8KKworICAgIGRlYnVnX3ByaW50X21lbnVpdGVtKCJTZXRNZW51RGVmYXVsdEl0ZW0zMjogIiwgbWVudWl0ZW0sICIiKTsKICAgICBGSVhNRShtZW51LCAiKDB4JXgsJWQsJWQpLCBlbXB0eSBzdHViIVxuIiwKIAkJICBobWVudSwgaXRlbSwgYnlwb3MpOwogICAgIHJldHVybiBUUlVFOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUdldE1lbnVEZWZhdWx0SXRlbTMyICAgIChVU0VSMzIuMjYwKQorICovCitVSU5UMzIgV0lOQVBJIEdldE1lbnVEZWZhdWx0SXRlbTMyKEhNRU5VMzIgaG1lbnUsIFVJTlQzMiBieXBvcywgVUlOVDMyIGZsYWdzKQoreworICAgIFBPUFVQTUVOVSAqbWVudTsKKworICAgIGlmICghKG1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUihobWVudSkpKSByZXR1cm4gMDsgLypGSVhNRSovCisKKyAgICBGSVhNRShtZW51LCAiKDB4JXgsJWQsJWQpLCBzdHViIVxuIiwgaG1lbnUsIGJ5cG9zLCBmbGFncyk7CisgICAgaWYgKGJ5cG9zICYgTUZfQllQT1NJVElPTikKKyAgICAJcmV0dXJuIG1lbnUtPmRlZml0ZW07CisgICAgZWxzZQorICAgIAlyZXR1cm4gbWVudS0+aXRlbXNbbWVudS0+ZGVmaXRlbV0ud0lEOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgIEluc2VydE1lbnVJdGVtMTYgICAoVVNFUi40NDEpCiAgKgpkaWZmIC0tZ2l0IGEvY29udHJvbHMvcHJvZ3Jlc3MuYyBiL2NvbnRyb2xzL3Byb2dyZXNzLmMKaW5kZXggNzkzN2QyYi4uZDgzY2I5MyAxMDA2NDQKLS0tIGEvY29udHJvbHMvcHJvZ3Jlc3MuYworKysgYi9jb250cm9scy9wcm9ncmVzcy5jCkBAIC0xNTksOSArMTU5LDEwIEBACiAgICAgewogICAgIGNhc2UgV01fQ1JFQVRFOgogICAgICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBpbmZvIHN0cnVjdCAqLwotICAgICAgd25kUHRyLT53RXh0cmFbMF0gPSBIZWFwQWxsb2MgKFN5c3RlbUhlYXAsIEhFQVBfWkVST19NRU1PUlksCisgICAgICBpbmZvUHRyID0gKFBST0dSRVNTX0lORk8gKilIZWFwQWxsb2MgKFN5c3RlbUhlYXAsIEhFQVBfWkVST19NRU1PUlksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFBST0dSRVNTX0lORk8pKTsKLSAgICAgIGluZm9QdHIgPSAoUFJPR1JFU1NfSU5GTyAqKXduZFB0ci0+d0V4dHJhWzBdOworICAgICAgd25kUHRyLT53RXh0cmFbMF0gPSAoRFdPUkQpaW5mb1B0cjsKKwogICAgICAgLyogaW5pdGlhbGl6ZSB0aGUgaW5mbyBzdHJ1Y3QgKi8KICAgICAgIGluZm9QdHItPk1pblZhbD0wOyAKICAgICAgIGluZm9QdHItPk1heFZhbD0xMDA7CkBAIC0xNjksMTEgKzE3MCwxMSBAQAogICAgICAgaW5mb1B0ci0+U3RlcD0xMDsKICAgICAgIGluZm9QdHItPkNvbG9yQmFyPUNMUl9ERUZBVUxUOwogICAgICAgaW5mb1B0ci0+Q29sb3JCaz1DTFJfREVGQVVMVDsKLSAgICAgIFRSQUNFKHVwZG93biwgIlByb2dyZXNzIEN0cmwgY3JlYXRpb24sIGh3bmQ9JTA0eFxuIiwgaHduZCk7CisgICAgICBUUkFDRShwcm9ncmVzcywgIlByb2dyZXNzIEN0cmwgY3JlYXRpb24sIGh3bmQ9JTA0eFxuIiwgaHduZCk7CiAgICAgICBicmVhazsKICAgICAKICAgICBjYXNlIFdNX0RFU1RST1k6Ci0gICAgICBUUkFDRSh1cGRvd24sICJQcm9ncmVzcyBDdHJsIGRlc3RydWN0aW9uLCBod25kPSUwNHhcbiIsIGh3bmQpOworICAgICAgVFJBQ0UocHJvZ3Jlc3MsICJQcm9ncmVzcyBDdHJsIGRlc3RydWN0aW9uLCBod25kPSUwNHhcbiIsIGh3bmQpOwogICAgICAgSGVhcEZyZWUgKFN5c3RlbUhlYXAsIDAsIGluZm9QdHIpOwogICAgICAgYnJlYWs7CiAKQEAgLTE4MywxMCArMTg0LDEyIEBACiAgICAgICByZXR1cm4gMTsKIAkKICAgICBjYXNlIFdNX0dFVEZPTlQ6CisgICAgICBGSVhNRSAocHJvZ3Jlc3MsICJXTV9HRVRGT05UIC0gZW1wdHkgbWVzc2FnZSFcbiIpOwogICAgICAgLyogRklYTUU6IFdoYXQgZG8gd2UgbmVlZCB0byBkbz8gKi8KICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBXTV9TRVRGT05UOgorICAgICAgRklYTUUgKHByb2dyZXNzLCAiV01fU0VURk9OVCAtIGVtcHR5IG1lc3NhZ2UhXG4iKTsKICAgICAgIC8qIEZJWE1FOiBXaGF0IGRvIHdlIG5lZWQgdG8gZG8/ICovCiAgICAgICBicmVhazsKIApkaWZmIC0tZ2l0IGEvY29udHJvbHMvc2Nyb2xsLmMgYi9jb250cm9scy9zY3JvbGwuYwppbmRleCBlYzcxZWI0Li40Zjg0NGNmIDEwMDY0NAotLS0gYS9jb250cm9scy9zY3JvbGwuYworKysgYi9jb250cm9scy9zY3JvbGwuYwpAQCAtNiw3ICs2LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKQEAgLTkwMCw5ICs4OTksMjMgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBTZXRTY3JvbGxJbmZvMzIgICAoVVNFUjMyLjUwMSkKKyAqIFNldFNjcm9sbEluZm8zMiBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHBvc2l0aW9uLCB1cHBlciBib3VuZCwgCisgKiBsb3dlciBib3VuZCwgYW5kIHBhZ2Ugc2l6ZSBvZiBhIHNjcm9sbGJhciBjb250cm9sLgorICoKKyAqIFJFVFVSTlMKKyAqICAgIFNjcm9sbGJhciBwb3NpdGlvbgorICoKKyAqIE5PVEUKKyAqICAgIEZvciAxMDAgbGluZXMgb2YgdGV4dCB0byBiZSBkaXNwbGF5ZWQgaW4gYSB3aW5kb3cgb2YgMjUgbGluZXMsCisgKiAgb25lIHdvdWxkIGZvciBpbnN0YW5jZSB1c2UgaW5mby0+bk1pbj0wLCBpbmZvLT5uTWF4PTc1CisgKiAgKGNvcnJlc3BvbmRpbmcgdG8gdGhlIDc2IGRpZmZlcmVudCBwb3NpdGlvbnMgb2YgdGhlIHdpbmRvdyBvbgorICogIHRoZSB0ZXh0KSwgYW5kIGluZm8tPm5QYWdlPTI1LgogICovCi1JTlQzMiBXSU5BUEkgU2V0U2Nyb2xsSW5mbzMyKCBIV05EMzIgaHduZCwgSU5UMzIgbkJhciwgY29uc3QgU0NST0xMSU5GTyAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBiUmVkcmF3ICkKK0lOVDMyIFdJTkFQSSBTZXRTY3JvbGxJbmZvMzIoIAorSFdORDMyIGh3bmQgLyogW0ldIEhhbmRsZSBvZiB3aW5kb3cgd2hvc2Ugc2Nyb2xsYmFyIHdpbGwgYmUgYWZmZWN0ZWQgKi8sIAorSU5UMzIgbkJhciAvKiBbSV0gT25lIG9mIFNCX0hPUlosIFNCX1ZFUlQsIG9yIFNCX0NUTCAqLywgCitjb25zdCBTQ1JPTExJTkZPICppbmZvIC8qIFtJXSBTcGVjaWZpZXMgd2hhdCB0byBjaGFuZ2UgYW5kIG5ldyB2YWx1ZXMgKi8sCitCT09MMzIgYlJlZHJhdyAvKiBbSV0gU2hvdWxkIHNjcm9sbGJhciBiZSByZWRyYXduIGFmdGVyd2FyZHMgPyAqLykKIHsKICAgICBTQ1JPTExCQVJfSU5GTyAqaW5mb1B0cjsKICAgICBVSU5UMzIgbmV3X2ZsYWdzOwpAQCAtMTAxOSw4ICsxMDMyLDE1IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0U2Nyb2xsSW5mbzMyICAgKFVTRVIzMi4yODQpCisgKiBHZXRTY3JvbGxJbmZvMzIgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIHBvc2l0aW9uLCB1cHBlciBib3VuZCwgCisgKiBsb3dlciBib3VuZCwgYW5kIHBhZ2Ugc2l6ZSBvZiBhIHNjcm9sbGJhciBjb250cm9sLgorICoKKyAqIFJFVFVSTlMgU1RECiAgKi8KLUJPT0wzMiBXSU5BUEkgR2V0U2Nyb2xsSW5mbzMyKCBIV05EMzIgaHduZCwgSU5UMzIgbkJhciwgTFBTQ1JPTExJTkZPIGluZm8gKQorQk9PTDMyIFdJTkFQSSBHZXRTY3JvbGxJbmZvMzIoIAorICBIV05EMzIgaHduZCAvKiBbSV0gSGFuZGxlIG9mIHdpbmRvdyAqLyAsIAorICBJTlQzMiBuQmFyIC8qIFtJXSBPbmUgb2YgU0JfSE9SWiwgU0JfVkVSVCwgb3IgU0JfQ1RMICovLCAKKyAgTFBTQ1JPTExJTkZPIGluZm8gLyogW0lPXSAoaW5mby5mTWFzayBbSV0gc3BlY2lmaWVzIHdoaWNoIHZhbHVlcyBhcmUgdG8gcmV0cmlldmUpICovKQogewogICAgIFNDUk9MTEJBUl9JTkZPICppbmZvUHRyOwogCkBAIC0xMDU0LDkgKzEwNzQsMjAgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBTZXRTY3JvbGxQb3MzMiAgIChVU0VSMzIuNTAyKQorICoKKyAqIFJFVFVSTlMKKyAqICAgIFN1Y2Nlc3M6IFNjcm9sbGJhciBwb3NpdGlvbgorICogICAgRmFpbHVyZTogMAorICoKKyAqIFJFTUFSS1MKKyAqICAgIE5vdGUgdGhlIGFtYmlndWl0eSB3aGVuIDAgaXMgcmV0dXJuZWQuICBVc2UgR2V0TGFzdEVycm9yCisgKiAgICB0byBtYWtlIHN1cmUgdGhlcmUgd2FzIGFuIGVycm9yIChhbmQgdG8ga25vdyB3aGljaCBvbmUpLgogICovCi1JTlQzMiBXSU5BUEkgU2V0U2Nyb2xsUG9zMzIoIEhXTkQzMiBod25kLCBJTlQzMiBuQmFyLCBJTlQzMiBuUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgYlJlZHJhdyApCitJTlQzMiBXSU5BUEkgU2V0U2Nyb2xsUG9zMzIoIAorSFdORDMyIGh3bmQgLyogW0ldIEhhbmRsZSBvZiB3aW5kb3cgd2hvc2Ugc2Nyb2xsYmFyIHdpbGwgYmUgYWZmZWN0ZWQgKi8sCitJTlQzMiBuQmFyIC8qIFtJXSBPbmUgb2YgU0JfSE9SWiwgU0JfVkVSVCwgb3IgU0JfQ1RMICovLAorSU5UMzIgblBvcyAvKiBbSV0gTmV3IHZhbHVlICovLAorQk9PTDMyIGJSZWRyYXcgLyogW0ldIFNob3VsZCBzY3JvbGxiYXIgYmUgcmVkcmF3biBhZnRlcndhcmRzID8gKi8gKQogewogICAgIFNDUk9MTElORk8gaW5mbzsKICAgICBTQ1JPTExCQVJfSU5GTyAqaW5mb1B0cjsKQEAgLTEwODMsOCArMTExNCwxOCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldFNjcm9sbFBvczMyICAgKFVTRVIzMi4yODUpCisgKgorICogUkVUVVJOUworICogICAgU3VjY2VzczogQ3VycmVudCBwb3NpdGlvbgorICogICAgRmFpbHVyZTogMCAgIAorICoKKyAqIFJFTUFSS1MKKyAqICAgIE5vdGUgdGhlIGFtYmlndWl0eSB3aGVuIDAgaXMgcmV0dXJuZWQuICBVc2UgR2V0TGFzdEVycm9yCisgKiAgICB0byBtYWtlIHN1cmUgdGhlcmUgd2FzIGFuIGVycm9yIChhbmQgdG8ga25vdyB3aGljaCBvbmUpLgogICovCi1JTlQzMiBXSU5BUEkgR2V0U2Nyb2xsUG9zMzIoIEhXTkQzMiBod25kLCBJTlQzMiBuQmFyICkKK0lOVDMyIFdJTkFQSSBHZXRTY3JvbGxQb3MzMiggCitIV05EMzIgaHduZCwgLyogW0ldIEhhbmRsZSBvZiB3aW5kb3cgKi8KK0lOVDMyIG5CYXIgLyogW0ldIE9uZSBvZiBTQl9IT1JaLCBTQl9WRVJULCBvciBTQl9DVEwgKi8pCiB7CiAgICAgU0NST0xMQkFSX0lORk8gKmluZm9QdHI7CiAKQEAgLTExMDcsOSArMTE0OCwxNSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFNldFNjcm9sbFJhbmdlMzIgICAoVVNFUjMyLjUwMykKKyAqCisgKiBSRVRVUk5TIFNURAogICovCi1CT09MMzIgV0lOQVBJIFNldFNjcm9sbFJhbmdlMzIoIEhXTkQzMiBod25kLCBJTlQzMiBuQmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBNaW5WYWwsIElOVDMyIE1heFZhbCwgQk9PTDMyIGJSZWRyYXcgKQorQk9PTDMyIFdJTkFQSSBTZXRTY3JvbGxSYW5nZTMyKCAKK0hXTkQzMiBod25kLCAvKiBbSV0gSGFuZGxlIG9mIHdpbmRvdyB3aG9zZSBzY3JvbGxiYXIgd2lsbCBiZSBhZmZlY3RlZCAqLworSU5UMzIgbkJhciwgLyogW0ldIE9uZSBvZiBTQl9IT1JaLCBTQl9WRVJULCBvciBTQl9DVEwgKi8KK0lOVDMyIE1pblZhbCwgLyogW0ldIE5ldyBtaW5pbXVtIHZhbHVlICovCitJTlQzMiBNYXhWYWwsIC8qIFtJXSBOZXcgbWF4aW11bSB2YWx1ZSAqLworQk9PTDMyIGJSZWRyYXcgLyogW0ldIFNob3VsZCBzY3JvbGxiYXIgYmUgcmVkcmF3biBhZnRlcndhcmRzID8gKi8pCiB7CiAgICAgU0NST0xMSU5GTyBpbmZvOwogCkBAIC0xMTcyLDkgKzEyMTksMTQgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRTY3JvbGxSYW5nZTMyICAgKFVTRVIzMi4yODYpCisgKgorICogUkVUVVJOUyBTVEQKICAqLwotQk9PTDMyIFdJTkFQSSBHZXRTY3JvbGxSYW5nZTMyKCBIV05EMzIgaHduZCwgSU5UMzIgbkJhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBJTlQzMiBscE1pbiwgTFBJTlQzMiBscE1heCkKK0JPT0wzMiBXSU5BUEkgR2V0U2Nyb2xsUmFuZ2UzMiggCitIV05EMzIgaHduZCwgLyogW0ldIEhhbmRsZSBvZiB3aW5kb3cgKi8KK0lOVDMyIG5CYXIsIC8qIFtJXSBPbmUgb2YgU0JfSE9SWiwgU0JfVkVSVCwgb3IgU0JfQ1RMICAqLworTFBJTlQzMiBscE1pbiwgLyogW09dIFdoZXJlIHRvIHN0b3JlIG1pbmltdW0gdmFsdWUgKi8KK0xQSU5UMzIgbHBNYXggLyogW09dIFdoZXJlIHRvIHN0b3JlIG1heGltdW0gdmFsdWUgKi8pCiB7CiAgICAgU0NST0xMQkFSX0lORk8gKmluZm9QdHI7CiAKQEAgLTEyMDEsOCArMTI1MywxMyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFNob3dTY3JvbGxCYXIzMiAgIChVU0VSMzIuNTMyKQorICoKKyAqIFJFVFVSTlMgU1RECiAgKi8KLUJPT0wzMiBXSU5BUEkgU2hvd1Njcm9sbEJhcjMyKCBIV05EMzIgaHduZCwgSU5UMzIgbkJhciwgQk9PTDMyIGZTaG93ICkKK0JPT0wzMiBXSU5BUEkgU2hvd1Njcm9sbEJhcjMyKCAKK0hXTkQzMiBod25kLCAvKiBbSV0gSGFuZGxlIG9mIHdpbmRvdyB3aG9zZSBzY3JvbGxiYXIocykgd2lsbCBiZSBhZmZlY3RlZCAgICovCitJTlQzMiBuQmFyLCAvKiBbSV0gT25lIG9mIFNCX0hPUlosIFNCX1ZFUlQsIFNCX0JPVEggb3IgU0JfQ1RMICovCitCT09MMzIgZlNob3cgLyogW0ldIFRSVUUgPSBzaG93LCBGQUxTRSA9IGhpZGUgICovKQogewogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKIApkaWZmIC0tZ2l0IGEvY29udHJvbHMvc3RhdGljLmMgYi9jb250cm9scy9zdGF0aWMuYwppbmRleCBlMDg4ZDI3Li4wMWYzODZjIDEwMDY0NAotLS0gYS9jb250cm9scy9zdGF0aWMuYworKysgYi9jb250cm9scy9zdGF0aWMuYwpAQCAtNSw3ICs1LDYgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgImJpdG1hcC5oIgpkaWZmIC0tZ2l0IGEvY29udHJvbHMvc3RhdHVzLmMgYi9jb250cm9scy9zdGF0dXMuYwppbmRleCBlMWQ4Yjk1Li5hMjRhNDdiIDEwMDY0NAotLS0gYS9jb250cm9scy9zdGF0dXMuYworKysgYi9jb250cm9scy9zdGF0dXMuYwpAQCAtNSw4ICs1LDYgQEAKICAqIENvcHlyaWdodCAxOTk4IEVyaWMgS29obAogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgotCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgInN0YXR1cy5oIgogI2luY2x1ZGUgImNvbW1jdHJsLmgiCkBAIC0yMSwxNiArMTksMTAgQEAKIAogLyoKICAqIEZpeG1lL1RvZG8KLSAqIDEpIERvbid0IGhhcmQgY29kZSBiYXIgdG8gYm90dG9tIG9mIHdpbmRvdywgYWxsb3cgQ0NTX1RPUCBhbHNvCi0gKiAyKSBBZGQgJ25vbiBoYWNrJyB2ZXJzaW9uIG9mIGljb24gZHJhd2luZyBjb2RlCisgKiAxKSBEb24ndCBoYXJkIGNvZGUgYmFyIHRvIGJvdHRvbSBvZiB3aW5kb3csIGFsbG93IENDU19UT1AgYWxzby4KKyArIDIpIFRvb2x0aXAgc3VwcG9ydC4KICAqLwogCi0jZGVmaW5lIF9fR0VUX0lDT05fSU5GT19IQUNLX18KLQotI2lmZGVmIF9fR0VUX0lDT05fSU5GT19IQUNLX18KLSNpbmNsdWRlICJiaXRtYXAuaCIKLSNlbmRpZgotCiAjZGVmaW5lIF9NQVgoYSxiKSAoKChhKT4oYikpPyhhKTooYikpCiAjZGVmaW5lIF9NSU4oYSxiKSAoKChhKT4oYikpPyhiKTooYSkpCiAKQEAgLTkyLDYxICs4NCwyMCBAQAogICAgIFJFQ1QzMiByID0gKmxwcmM7CiAgICAgVUlOVDMyIGJvcmRlciA9IEJEUl9TVU5LRU5PVVRFUjsKIAotICAgIGlmKHN0eWxlPT1TQlRfUE9QT1VUKQorICAgIGlmIChzdHlsZT09U0JUX1BPUE9VVCkKICAgICAgIGJvcmRlciA9IEJEUl9SQUlTRURPVVRFUjsKLSAgICBlbHNlIGlmKHN0eWxlPT1TQlRfTk9CT1JERVJTKQorICAgIGVsc2UgaWYgKHN0eWxlPT1TQlRfTk9CT1JERVJTKQogICAgICAgYm9yZGVyID0gMDsKIAogICAgIERyYXdFZGdlMzIoaGRjLCAmciwgYm9yZGVyLCBCRl9SRUNUfEJGX0FESlVTVCk7CiAKICAgICAvKiBkcmF3IHRoZSBpY29uICovCiAgICAgaWYgKGhJY29uKSB7Ci0jaWZkZWYgX19HRVRfSUNPTl9JTkZPX0hBQ0tfXwotICAgICAgICBIQklUTUFQMzIgaGJtSW1hZ2U7Ci0gICAgICAgIEhCSVRNQVAzMiBoYm1NYXNrOwotICAgICAgICBDVVJTT1JJQ09OSU5GTyAqcHRyOwotICAgICAgICBIREMzMiBoZGNTcmM7Ci0JSU5UMzIgeSwgY3ksIHJ5LCB0eTsKKwlJTlQzMiBjeSA9IHIuYm90dG9tIC0gci50b3A7CiAKLSAgICAgICAgaWYgKHB0ciA9IChDVVJTT1JJQ09OSU5GTyAqKUdsb2JhbExvY2sxNihoSWNvbikpIHsKLSAgICAgICAgaGJtTWFzayAgPSBDcmVhdGVCaXRtYXAzMiAocHRyLT5uV2lkdGgsIHB0ci0+bkhlaWdodCwgMSwgMSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopKHB0ciArIDEpKTsKLSAgICAgICAgaGJtSW1hZ2UgPSBDcmVhdGVCaXRtYXAzMiAocHRyLT5uV2lkdGgsIHB0ci0+bkhlaWdodCwgcHRyLT5iUGxhbmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHItPmJCaXRzUGVyUGl4ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopKHB0ciArIDEpICsgcHRyLT5uSGVpZ2h0ICogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVE1BUF9XSURUSF9CWVRFUyhwdHItPm5XaWR0aCwgMSkpOwogCXIubGVmdCArPSAyOwotCXJ5ID0gci5ib3R0b20gLSByLnRvcDsKLQlpZiAocnkgPj0gcHRyLT5uSGVpZ2h0KSB7Ci0JICAgIC8qIGZ1bGwgdmlldyBvZiBpY29uICovCi0JICAgIHkgPSAwOwotCSAgICBjeSA9IHB0ci0+bkhlaWdodDsKLQkgICAgdHkgPSByLnRvcCArIChyeSAtIHB0ci0+bkhlaWdodCkgLyAyOwotCX0KLQllbHNlIHsKLQkgICAgLyogcGFydGlhbCB2aWV3IG9mIGljb24gKi8KLQkgICAgeSA9IChwdHItPm5IZWlnaHQgLSByeSkgLyAyOwotCSAgICBjeSA9IHJ5OwotCSAgICB0eSA9IHIudG9wOwotCX0KLQotCSAgICBoZGNTcmMgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoaGRjKTsKLQkgICAgU2VsZWN0T2JqZWN0MzIgKGhkY1NyYywgaGJtTWFzayk7Ci0JICAgIEJpdEJsdDMyIChoZGMsIHIubGVmdCwgci50b3AsIHB0ci0+bldpZHRoLCBjeSwKLQkJICAgICAgaGRjU3JjLCAwLCB5LCBTUkNBTkQpOwotCSAgICBTZWxlY3RPYmplY3QzMiAoaGRjU3JjLCBoYm1JbWFnZSk7Ci0JICAgIEJpdEJsdDMyIChoZGMsIHIubGVmdCwgci50b3AsIHB0ci0+bldpZHRoLCBjeSwKLQkJICAgICAgaGRjU3JjLCAwLCB5LCBTUkNQQUlOVCk7Ci0JICAgIERlbGV0ZURDMzIgKGhkY1NyYyk7Ci0KLQkgICAgci5sZWZ0ICs9IHB0ci0+bldpZHRoOwotCSAgICBEZWxldGVPYmplY3QzMiAoaGJtSW1hZ2UpOwotCSAgICBEZWxldGVPYmplY3QzMiAoaGJtTWFzayk7Ci0JICAgIEdsb2JhbFVubG9jazE2IChoSWNvbik7Ci0JfQotI2Vsc2UKLQkvKiBGSVhNRTogbm8gIm5vbiBoYWNrIiB2ZXJzaW9uIGF2YWlsYWJsZSEhISAqLwotI2VuZGlmCisJRHJhd0ljb25FeDMyIChoZGMsIHIubGVmdCwgci50b3AsIGhJY29uLCBjeSwgY3ksIDAsIDAsIERJX05PUk1BTCk7CisJci5sZWZ0ICs9IGN5OwogICAgIH0KIAogICAgIC8qIG5vdyBkcmF3IHRleHQgKi8KQEAgLTM3OCwxMCArMzI5LDExIEBACiAgICAgU1RBVFVTV0lORE9XSU5GTyAqc2VsZjsKIAogICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwotICAgIHduZFB0ci0+d0V4dHJhWzBdID0gSGVhcEFsbG9jIChTeXN0ZW1IZWFwLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkJCSAgIHNpemVvZihTVEFUVVNXSU5ET1dJTkZPKSk7CisgICAgc2VsZiA9IChTVEFUVVNXSU5ET1dJTkZPKilIZWFwQWxsb2MgKFN5c3RlbUhlYXAsIEhFQVBfWkVST19NRU1PUlksCisJCQkJCSBzaXplb2YoU1RBVFVTV0lORE9XSU5GTykpOwogCi0gICAgc2VsZiA9IChTVEFUVVNXSU5ET1dJTkZPKil3bmRQdHItPndFeHRyYVswXTsKKyAgICB3bmRQdHItPndFeHRyYVswXSA9IChEV09SRClzZWxmOworCiAgICAgc2VsZi0+bnVtUGFydHMgPSAxOwogICAgIHNlbGYtPnBhcnRzID0gMDsKICAgICBzZWxmLT5zaW1wbGUgPSBGQUxTRTsKQEAgLTM5NywzMyArMzQ5LDMzIEBACiAgICAgc2VsZi0+cGFydDAuaEljb24gPSAwOwogCiAgICAgLyogaW5pdGlhbGl6ZSBmaXJzdCBwYXJ0ICovCi0gICAgc2VsZi0+cGFydHMgPSBIZWFwQWxsb2MoU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwKLQkJCSAgICBzaXplb2YoU1RBVFVTV0lORE9XUEFSVCkpOworICAgIHNlbGYtPnBhcnRzID0gSGVhcEFsbG9jIChTeXN0ZW1IZWFwLCBIRUFQX1pFUk9fTUVNT1JZLAorCQkJICAgICBzaXplb2YoU1RBVFVTV0lORE9XUEFSVCkpOwogICAgIHNlbGYtPnBhcnRzWzBdLmJvdW5kID0gcmVjdDsKICAgICBzZWxmLT5wYXJ0c1swXS50ZXh0ID0gMDsKICAgICBzZWxmLT5wYXJ0c1swXS54ID0gLTE7CiAgICAgc2VsZi0+cGFydHNbMF0uc3R5bGUgPSAwOwogICAgIHNlbGYtPnBhcnRzWzBdLmhJY29uID0gMDsKIAotICAgIGlmIChsZW4gPSBsc3RybGVuMzJBKCBscENyZWF0ZS0+bHBzek5hbWUgKSApIHsKLSAgICAgICAgc2VsZi0+cGFydHNbMF0udGV4dCA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgbGVuICsgMSApOwotICAgICAgICBsc3RyY3B5MzJBKCBzZWxmLT5wYXJ0c1swXS50ZXh0LCBscENyZWF0ZS0+bHBzek5hbWUgKTsKKyAgICBpZiAoKGxlbiA9IGxzdHJsZW4zMkEgKGxwQ3JlYXRlLT5scHN6TmFtZSkpKSB7CisgICAgICAgIHNlbGYtPnBhcnRzWzBdLnRleHQgPSBIZWFwQWxsb2MgKFN5c3RlbUhlYXAsIDAsIGxlbiArIDEpOworICAgICAgICBsc3RyY3B5MzJBIChzZWxmLT5wYXJ0c1swXS50ZXh0LCBscENyZWF0ZS0+bHBzek5hbWUpOwogICAgIH0KIAogICAgIGhlaWdodCA9IDIwOwotICAgIGlmICgoaGRjID0gR2V0REMzMigwKSkpIHsKKyAgICBpZiAoKGhkYyA9IEdldERDMzIgKDApKSkgewogCVRFWFRNRVRSSUMzMkEgdG07CiAJR2V0VGV4dE1ldHJpY3MzMkEoaGRjLCAmdG0pOwogCXNlbGYtPnRleHRIZWlnaHQgPSB0bS50bUhlaWdodDsKIAlSZWxlYXNlREMzMigwLCBoZGMpOwogICAgIH0KIAotICAgIHBhcmVudCA9IEdldFBhcmVudDMyKGh3bmQpOwotICAgIEdldENsaWVudFJlY3QzMihwYXJlbnQsICZyZWN0KTsKKyAgICBwYXJlbnQgPSBHZXRQYXJlbnQzMiAoaHduZCk7CisgICAgR2V0Q2xpZW50UmVjdDMyIChwYXJlbnQsICZyZWN0KTsKICAgICB3aWR0aCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnQ7CiAgICAgc2VsZi0+aGVpZ2h0ID0gc2VsZi0+dGV4dEhlaWdodCArIDQgKyBWRVJUX0JPUkRFUjsKLSAgICBNb3ZlV2luZG93MzIoaHduZCwgbHBDcmVhdGUtPngsIGxwQ3JlYXRlLT55LTEsIHdpZHRoLCBzZWxmLT5oZWlnaHQsIEZBTFNFKTsKLSAgICBTV19TZXRQYXJ0Qm91bmRzKGh3bmQsIHNlbGYpOworICAgIE1vdmVXaW5kb3czMiAoaHduZCwgbHBDcmVhdGUtPngsIGxwQ3JlYXRlLT55LTEsIHdpZHRoLCBzZWxmLT5oZWlnaHQsIEZBTFNFKTsKKyAgICBTV19TZXRQYXJ0Qm91bmRzIChod25kLCBzZWxmKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNDk1LDEyICs0NDcsMTEgQEAKIHN0YXRpYyBMUkVTVUxUCiBTV19TZXRNaW5IZWlnaHQoU1RBVFVTV0lORE9XSU5GTyAqc2VsZiwgSFdORDMyIGh3bmQsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLSAgICBJTlQzMgl3aWR0aCwgaGVpZ2h0LCB4LCB5OworICAgIElOVDMyCXdpZHRoLCB4LCB5OwogICAgIFJFQ1QzMglwYXJlbnRfcmVjdDsKICAgICBIV05EMzIJcGFyZW50OwogCiAgICAgaWYgKElzV2luZG93VmlzaWJsZTMyIChod25kKSkgewotCS8qIHdpZHRoIGFuZCBoZWlnaHQgZG9uJ3QgYXBwbHkgKi8KIAlwYXJlbnQgPSBHZXRQYXJlbnQzMihod25kKTsKIAlHZXRDbGllbnRSZWN0MzIocGFyZW50LCAmcGFyZW50X3JlY3QpOwogCXNlbGYtPmhlaWdodCA9IChJTlQzMil3UGFyYW0gKyBWRVJUX0JPUkRFUjsKQEAgLTUzMSwxMiArNDgyLDEwIEBACiAKIAogc3RhdGljIExSRVNVTFQKLVNXX1NldEljb24oU1RBVFVTV0lORE9XSU5GTyAqc2VsZiwgSFdORDMyIGh3bmQsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK1NXX1NldEljb24gKFNUQVRVU1dJTkRPV0lORk8gKnNlbGYsIEhXTkQzMiBod25kLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0gICAgSERDMzIgICAgaGRjOwotICAgIElOVDMyICAgIG5QYXJ0OworICAgIElOVDMyICBuUGFydCA9IChJTlQzMil3UGFyYW0gJiAweDAwZmY7CiAKLSAgICBuUGFydCA9IChJTlQzMil3UGFyYW0gJiAweDAwZmY7CiAgICAgaWYgKChuUGFydCA8IC0xKSB8fCAoblBhcnQgPj0gc2VsZi0+bnVtUGFydHMpKSByZXR1cm4gRkFMU0U7CiAKICAgICBpZiAoblBhcnQgPT0gLTEpIHsKQEAgLTU1OCw3ICs1MDcsNyBAQAogICAgIElOVDMyICAgIG5QYXJ0OwogCiAgICAgblBhcnQgPSAoSU5UMzIpd1BhcmFtICYgMHgwMGZmOwotICAgIGlmICgoblBhcnQgPCAtMSkgfHwgKG5QYXJ0ID49IHNlbGYtPm51bVBhcnRzKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChuUGFydCA8IC0xKSB8fCAoblBhcnQgPj0gc2VsZi0+bnVtUGFydHMpKSByZXR1cm4gMDsKIAogICAgIGlmIChuUGFydCA9PSAtMSkKICAgICAgICAgcmV0dXJuIChzZWxmLT5wYXJ0MC5oSWNvbik7CkBAIC02NjMsNyArNjEyLDYgQEAKIHN0YXRpYyBMUkVTVUxUCiBTV19OY0xCdXR0b25Eb3duIChIV05EMzIgaHduZCwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotLy8gICAgVFJBQ0UgKHN0YXR1cywgIldNX05DTEJVVFRPTkRPV05cbiIpOwogICAgIFBvc3RNZXNzYWdlMzJBIChHZXRQYXJlbnQzMiAoaHduZCksIFdNX05DTEJVVFRPTkRPV04sCiAJCSAgICB3UGFyYW0sIGxQYXJhbSk7CiAgICAgcmV0dXJuIDA7CkBAIC02NzMsNyArNjIxLDYgQEAKIHN0YXRpYyBMUkVTVUxUCiBTV19OY0xCdXR0b25VcCAoSFdORDMyIGh3bmQsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLS8vICAgIFRSQUNFIChzdGF0dXMsICJXTV9OQ0xCVVRUT05VUFxuIik7CiAgICAgUG9zdE1lc3NhZ2UzMkEgKEdldFBhcmVudDMyIChod25kKSwgV01fTkNMQlVUVE9OVVAsCiAJCSAgICB3UGFyYW0sIGxQYXJhbSk7CiAgICAgcmV0dXJuIDA7CkBAIC03MjIsOCArNjY5LDggQEAKICAgICAgICAgSGVhcEZyZWUoU3lzdGVtSGVhcCwgMCwgcGFydC0+dGV4dCk7CiAgICAgcGFydC0+dGV4dCA9IDA7CiAgICAgaWYgKGxQYXJhbSAmJiAobGVuID0gbHN0cmxlbjMyQSgoTFBDU1RSKWxQYXJhbSkpKSB7Ci0gICAgICAgIHBhcnQtPnRleHQgPSBIZWFwQWxsb2MoU3lzdGVtSGVhcCwgMCwgbGVuKzEpOwotICAgICAgICBsc3RyY3B5MzJBKHBhcnQtPnRleHQsIChMUENTVFIpbFBhcmFtKTsKKyAgICAgICAgcGFydC0+dGV4dCA9IEhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgMCwgbGVuKzEpOworICAgICAgICBsc3RyY3B5MzJBIChwYXJ0LT50ZXh0LCAoTFBDU1RSKWxQYXJhbSk7CiAgICAgfQogICAgIEludmFsaWRhdGVSZWN0MzIoaHduZCwgJnBhcnQtPmJvdW5kLCBGQUxTRSk7CiAKQEAgLTczNSw3ICs2ODIsNyBAQAogU1dfU2l6ZShTVEFUVVNXSU5ET1dJTkZPICpzZWxmLCBIV05EMzIgaHduZCwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIC8qIE5lZWQgdG8gcmVzaXplIHdpZHRoIHRvIG1hdGNoIHBhcmVudCAqLwotICAgIElOVDMyCXdpZHRoLCBoZWlnaHQsIHgsIHk7CisgICAgSU5UMzIJd2lkdGgsIHgsIHk7CiAgICAgUkVDVDMyCXBhcmVudF9yZWN0OwogICAgIEhXTkQzMglwYXJlbnQ7CiAKQEAgLTgzNiw3ICs3ODMsNyBAQAogICAgIGNhc2UgV01fTkNISVRURVNUOgogICAgICAgICByZXR1cm4gU1dfTmNIaXRUZXN0ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAotICAgY2FzZSBXTV9OQ0xCVVRUT05ET1dOOgorICAgIGNhc2UgV01fTkNMQlVUVE9ORE9XTjoKIAlyZXR1cm4gU1dfTmNMQnV0dG9uRG93biAoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwogCiAgICAgY2FzZSBXTV9OQ0xCVVRUT05VUDoKQEAgLTg2MiwyNSArODA5LDI1IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU1RBVFVTX1JlZ2lzdGVyIFtJbnRlcm5hbF0KKyAqIFNUQVRVU19SZWdpc3RlciBbSW50ZXJuYWxdCiAgKgogICogUmVnaXN0ZXJzIHRoZSBzdGF0dXMgd2luZG93IGNsYXNzLgogICovCi12b2lkIFNUQVRVU19SZWdpc3Rlcih2b2lkKQordm9pZCBTVEFUVVNfUmVnaXN0ZXIgKHZvaWQpCiB7CiAgICAgV05EQ0xBU1MzMkEgd25kQ2xhc3M7CiAKLSAgICBpZiggR2xvYmFsRmluZEF0b20zMkEoIFNUQVRVU0NMQVNTTkFNRTMyQSApICkgcmV0dXJuOworICAgIGlmIChHbG9iYWxGaW5kQXRvbTMyQSAoU1RBVFVTQ0xBU1NOQU1FMzJBKSkgcmV0dXJuOwogCi0gICAgWmVyb01lbW9yeSggJnduZENsYXNzLCBzaXplb2YoIFdORENMQVNTMzJBICkgKTsKKyAgICBaZXJvTWVtb3J5ICgmd25kQ2xhc3MsIHNpemVvZihXTkRDTEFTUzMyQSkpOwogICAgIHduZENsYXNzLnN0eWxlICAgICAgICAgPSBDU19HTE9CQUxDTEFTUyB8IENTX0RCTENMS1MgfCBDU19WUkVEUkFXOwogICAgIHduZENsYXNzLmxwZm5XbmRQcm9jICAgPSAoV05EUFJPQzMyKVN0YXR1c1dpbmRvd1Byb2M7CiAgICAgd25kQ2xhc3MuY2JDbHNFeHRyYSAgICA9IDA7CiAgICAgd25kQ2xhc3MuY2JXbmRFeHRyYSAgICA9IHNpemVvZihTVEFUVVNXSU5ET1dJTkZPICopOwotICAgIHduZENsYXNzLmhDdXJzb3IgICAgICAgPSBMb2FkQ3Vyc29yMzJBKCAwLCBJRENfQVJST1czMkEgKTsKKyAgICB3bmRDbGFzcy5oQ3Vyc29yICAgICAgID0gTG9hZEN1cnNvcjMyQSAoMCwgSURDX0FSUk9XMzJBKTsKICAgICB3bmRDbGFzcy5oYnJCYWNrZ3JvdW5kID0gKEhCUlVTSDMyKShDT0xPUl8zREZBQ0UgKyAxKTsKICAgICB3bmRDbGFzcy5scHN6Q2xhc3NOYW1lID0gU1RBVFVTQ0xBU1NOQU1FMzJBOwogIAotICAgIFJlZ2lzdGVyQ2xhc3MzMkEoICZ3bmRDbGFzcyApOworICAgIFJlZ2lzdGVyQ2xhc3MzMkEgKCZ3bmRDbGFzcyk7CiB9CiAKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3Rvb2xiYXIuYyBiL2NvbnRyb2xzL3Rvb2xiYXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmExZTZjCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJvbHMvdG9vbGJhci5jCkBAIC0wLDAgKzEsMTI5MCBAQAorLyoKKyAqIFRvb2xiYXIgY29udHJvbAorICoKKyAqIENvcHlyaWdodCAxOTk4IEVyaWMgS29obAorICoKKyAqIE5PVEVTCisgKiAgIFBMRUFTRSBkb24ndCB0cnkgdG8gaW1wcm92ZSBvciBjaGFuZ2UgdGhpcyBjb2RlIHJpZ2h0IG5vdy4gTWFueQorICogICBmZWF0dXJlcyBhcmUgc3RpbGwgbWlzc2luZywgYnV0IEknbSB3b3JraW5nIG9uIGl0LiBJIHdhbnQgdG8gYXZvaWQKKyAqICAgYW55IGNvbmZ1c2lvbi4gVGhpcyBub3RlIHdpbGwgYmUgcmVtb3ZlZCBhcyBzb29uIGFzIG1vc3Qgb2YgdGhlCisgKiAgIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZC4KKyAqICAgICBFcmljIDxla29obEBhYm8ucmhlaW4temVpdHVuZy5kZT4KKyAqCisgKiBUT0RPOgorICogICAtIE1hbnkgbWVzc2FnZXMuCisgKiAgIC0gQWxsIG5vdGlmaWNhdGlvbnMuCisgKiAgIC0gVG9vbHRpcCBzdXBwb3J0LgorICogICAtIFVuaWNvZGUgc3VwcHBvcnQuCisgKiAgIC0gSW50ZXJuYWwgQ09NTUNUTDMyIGJpdG1hcHMuCisgKiAgIC0gQ3VzdG9taXplIGRpYWxvZy4KKyAqCisgKiBUZXN0aW5nOgorICogICAtIFJ1biB0ZXN0cyB1c2luZyBXYWl0ZSBHcm91cCBXaW5kb3dzOTUgQVBJIEJpYmxlIFZvbHVtZSAyLgorICogICAgIFRoZSBzZWNvbmQgY2Ryb20gY29udGFpbnMgZXhlY3V0YWJsZXMgYWRkc3RyLmV4ZSwgYnRuY291bnQuZXhlLAorICogICAgIGJ0bnN0YXRlLmV4ZSwgYnV0c3Ryc3ouZXhlLCBjaGtidG4uZXhlLCBjaG5nYm1wLmV4ZSwgY3VzdG9taXouZXhlLAorICogICAgIGVuYWJsZWJ0bi5leGUsIGdldGJtcC5leGUsIGdldGJ0bi5leGUsIGdldGZsYWdzLmV4ZSwgaGlkZWJ0bi5leGUsCisgKiAgICAgaW5kZXRidG4uZXhlLCBpbnNidG4uZXhlLCBwcmVzc2J0bi5leGUsIHNldGJ0bnN6LmV4ZSwgc2V0Y21kaWQuZXhlLAorICogICAgIHNldHBhcm50LmV4ZSwgc2V0cm93cy5leGUsIHRvb2x3bmQuZXhlLgorICogICAtIGFkZGl0aW9uYWwgZmVhdHVyZXMuCisgKi8KKworI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJjb21tY3RybC5oIgorI2luY2x1ZGUgInRvb2xiYXIuaCIKKyNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSAid2luLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworCisjZGVmaW5lIFNFUEFSQVRPUl9XSURUSCAgMTIKKworCisKKworCisjZGVmaW5lIFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpICgoVE9PTEJBUl9JTkZPICopd25kUHRyLT53RXh0cmFbMF0pCisKKworc3RhdGljIHZvaWQKK1RPT0xCQVJfRHJhd0J1dHRvbiAoV05EICp3bmRQdHIsIFRCVVRUT05fSU5GTyAqYnRuUHRyLCBIREMzMiBoZGMpCit7CisgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgUkVDVDMyIHJjOworCisgICAgaWYgKGJ0blB0ci0+ZnNTdGF0ZSAmIFRCU1RBVEVfSElEREVOKSByZXR1cm47CisKKyAgICByYyA9IGJ0blB0ci0+cmVjdDsKKyAgICBpZiAoYnRuUHRyLT5mc1N0eWxlICYgVEJTVFlMRV9TRVApIHsKKworICAgIH0KKyAgICBlbHNlIHsKKwlpZiAoIShidG5QdHItPmZzU3RhdGUgJiBUQlNUQVRFX0VOQUJMRUQpKSB7CisJICAgIC8qIGJ1dHRvbiBpcyBkaXNhYmxlZCAqLworCSAgICBEcmF3RWRnZTMyIChoZGMsICZyYywgRURHRV9SQUlTRUQsCisJCQlCRl9TT0ZUIHwgQkZfUkVDVCB8IEJGX01JRERMRSB8IEJGX0FESlVTVCk7CisJICAgIEltYWdlTGlzdF9EcmF3IChpbmZvUHRyLT5oaW1sRGlzLCBidG5QdHItPmlCaXRtYXAsIGhkYywKKwkJCSAgICByYy5sZWZ0KzIsIHJjLnRvcCsyLCBJTERfTk9STUFMKTsKKwkgICAgcmV0dXJuOworCX0KKworCS8qIFRCU1RZTEVfQlVUVE9OICovCisJaWYgKGJ0blB0ci0+ZnNTdGF0ZSAmIFRCU1RBVEVfUFJFU1NFRCkgeworCSAgICBEcmF3RWRnZTMyIChoZGMsICZyYywgRURHRV9TVU5LRU4sCisJCQlCRl9SRUNUIHwgQkZfTUlERExFIHwgQkZfQURKVVNUKTsKKwkgICAgSW1hZ2VMaXN0X0RyYXcgKGluZm9QdHItPmhpbWxEZWYsIGJ0blB0ci0+aUJpdG1hcCwgaGRjLAorCQkJICAgIHJjLmxlZnQrMywgcmMudG9wKzMsIElMRF9OT1JNQUwpOworCSAgICByZXR1cm47CisJfQorCWVsc2UgeworCSAgICBEcmF3RWRnZTMyIChoZGMsICZyYywgRURHRV9SQUlTRUQsCisJCQlCRl9TT0ZUIHwgQkZfUkVDVCB8IEJGX01JRERMRSB8IEJGX0FESlVTVCk7CisJICAgIEltYWdlTGlzdF9EcmF3IChpbmZvUHRyLT5oaW1sRGVmLCBidG5QdHItPmlCaXRtYXAsIGhkYywKKwkJCSAgICByYy5sZWZ0KzIsIHJjLnRvcCsyLCBJTERfTk9STUFMKTsKKwl9CisgICAgfQorfQorCisKKworc3RhdGljIHZvaWQKK1RPT0xCQVJfUmVmcmVzaCAoV05EICp3bmRQdHIsIEhEQzMyIGhkYykKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBUQlVUVE9OX0lORk8gKmJ0blB0cjsKKyAgICBJTlQzMiBpOworCisKKyAgICAvKiBkcmF3IGJ1dHRvbnMgKi8KKworICAgIGJ0blB0ciA9IGluZm9QdHItPmJ1dHRvbnM7CisgICAgZm9yIChpID0gMDsgaSA8IGluZm9QdHItPm5OdW1CdXR0b25zOyBpKyspIHsKKwlUT09MQkFSX0RyYXdCdXR0b24gKHduZFB0ciwgYnRuUHRyLCBoZGMpOworCWJ0blB0cisrOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorVE9PTEJBUl9DYWxjVG9vbGJhciAoV05EICp3bmRQdHIpCit7CisgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgVEJVVFRPTl9JTkZPICpidG5QdHI7CisgICAgUkVDVDMyIHJlY3Q7CisgICAgSU5UMzIgaTsKKworICAgIHJlY3QubGVmdCAgID0gaW5mb1B0ci0+bkluZGVudDsKKyAgICByZWN0LnRvcCAgICA9IGluZm9QdHItPm5CdXR0b25Ub3A7CisvLyAgICByZWN0LnJpZ2h0ICA9IHJlY3QubGVmdCArIGluZm9QdHItPm5CdXR0b25XaWR0aDsKKyAgICByZWN0LmJvdHRvbSA9IHJlY3QudG9wICsgaW5mb1B0ci0+bkJ1dHRvbkhlaWdodDsKKworICAgIGJ0blB0ciA9IGluZm9QdHItPmJ1dHRvbnM7CisgICAgZm9yIChpID0gMDsgaSA8IGluZm9QdHItPm5OdW1CdXR0b25zOyBpKyssIGJ0blB0cisrKSB7CisJaWYgKGJ0blB0ci0+ZnNTdGF0ZSAmIFRCU1RBVEVfSElEREVOKSB7CisJICAgIGJ0blB0ci0+cmVjdC5sZWZ0ID0gMDsKKwkgICAgYnRuUHRyLT5yZWN0LnJpZ2h0ID0gMDsKKwkgICAgYnRuUHRyLT5yZWN0LnRvcCA9IDA7CisJICAgIGJ0blB0ci0+cmVjdC5ib3R0b20gPSAwOworCSAgICBjb250aW51ZTsKKwl9CisKKwlidG5QdHItPnJlY3QgPSByZWN0OworCWlmIChidG5QdHItPmZzU3R5bGUgJiBUQlNUWUxFX1NFUCkKKwkgICAgYnRuUHRyLT5yZWN0LnJpZ2h0ID0gYnRuUHRyLT5yZWN0LmxlZnQgKyBTRVBBUkFUT1JfV0lEVEg7CisJZWxzZQorCSAgICBidG5QdHItPnJlY3QucmlnaHQgPSBidG5QdHItPnJlY3QubGVmdCArIGluZm9QdHItPm5CdXR0b25XaWR0aDsKKwlyZWN0LmxlZnQgPSBidG5QdHItPnJlY3QucmlnaHQ7CisgICAgfQorfQorCisKK3N0YXRpYyBJTlQzMgorVE9PTEJBUl9JbnRlcm5hbEhpdFRlc3QgKFdORCAqd25kUHRyLCBMUFBPSU5UMzIgbHBQdCkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBUQlVUVE9OX0lORk8gKmJ0blB0cjsKKyAgICBJTlQzMiBpOworICAgIAorCisgICAgYnRuUHRyID0gaW5mb1B0ci0+YnV0dG9uczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5mb1B0ci0+bk51bUJ1dHRvbnM7IGkrKykgeworCWlmIChidG5QdHItPmZzU3R5bGUgJiBUQlNUWUxFX1NFUCkgeworCSAgICBpZiAoUHRJblJlY3QzMiAoJmJ0blB0ci0+cmVjdCwgKmxwUHQpKSB7CisvLwkJVFJBQ0UgKHRvb2xiYXIsICIgT04gU0VQQVJBVE9SICVkIVxuIiwgaSk7CisJCXJldHVybiAtaTsKKwkgICAgfQorCX0KKwllbHNlIHsKKwkgICAgaWYgKFB0SW5SZWN0MzIgKCZidG5QdHItPnJlY3QsICpscFB0KSkgeworLy8JCVRSQUNFICh0b29sYmFyLCAiIE9OIEJVVFRPTiAlZCFcbiIsIGkpOworCQlyZXR1cm4gaTsKKwkgICAgfQorCisJfQorCisJYnRuUHRyKys7CisgICAgfQorCisvLyAgICBUUkFDRSAodG9vbGJhciwgIiBOT1dIRVJFIVxuIik7CisgICAgcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyBJTlQzMgorVE9PTEJBUl9HZXRCdXR0b25JbmRleCAoVE9PTEJBUl9JTkZPICppbmZvUHRyLCBJTlQzMiBpZENvbW1hbmQpCit7CisgICAgVEJVVFRPTl9JTkZPICpidG5QdHI7CisgICAgSU5UMzIgaTsKKworICAgIGJ0blB0ciA9IGluZm9QdHItPmJ1dHRvbnM7CisgICAgZm9yIChpID0gMDsgaSA8IGluZm9QdHItPm5OdW1CdXR0b25zOyBpKyspIHsKKwlpZiAoYnRuUHRyLT5pZENvbW1hbmQgPT0gaWRDb21tYW5kKQorCSAgICByZXR1cm4gaTsKKwlidG5QdHIrKzsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitUT09MQkFSX0FkZEJpdG1hcCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBMUFRCQUREQklUTUFQIGxwQWRkQm1wID0gKExQVEJBRERCSVRNQVApbFBhcmFtOworCisgICAgaWYgKCghbHBBZGRCbXApIHx8ICgoSU5UMzIpd1BhcmFtIDw9IDApKQorCXJldHVybiAtMTsKKworICAgIFRSQUNFICh0b29sYmFyLCAiYWRkaW5nICVkIGJpdG1hcHMhXG4iLCB3UGFyYW0pOworCisgICAgaWYgKCEoaW5mb1B0ci0+aGltbERlZikpIHsKKwkvKiBjcmVhdGUgbmV3IGRlZmF1bHQgaW1hZ2UgbGlzdCAqLworCVRSQUNFICh0b29sYmFyLCAiY3JlYXRpbmcgZGVmYXVsdCBpbWFnZSBsaXN0IVxuIik7CisJaW5mb1B0ci0+aGltbERlZiA9CisJICAgIEltYWdlTGlzdF9DcmVhdGUgKGluZm9QdHItPm5CaXRtYXBXaWR0aCwgCisJCQkgICAgICBpbmZvUHRyLT5uQml0bWFwSGVpZ2h0LCBJTENfQ09MT1IgfCBJTENfTUFTSywKKwkJCSAgICAgIChJTlQzMil3UGFyYW0sIDIpOworICAgIH0KKworICAgIGlmICghKGluZm9QdHItPmhpbWxEaXMpKSB7CisJLyogY3JlYXRlIG5ldyBkaXNhYmxlZCBpbWFnZSBsaXN0ICovCisJVFJBQ0UgKHRvb2xiYXIsICJjcmVhdGluZyBkaXNhYmxlZCBpbWFnZSBsaXN0IVxuIik7CisJaW5mb1B0ci0+aGltbERpcyA9CisJICAgIEltYWdlTGlzdF9DcmVhdGUgKGluZm9QdHItPm5CaXRtYXBXaWR0aCwgCisJCQkgICAgICBpbmZvUHRyLT5uQml0bWFwSGVpZ2h0LCBJTENfQ09MT1IgfCBJTENfTUFTSywKKwkJCSAgICAgIChJTlQzMil3UGFyYW0sIDIpOworICAgIH0KKworCisgICAgLyogQWRkIGJpdG1hcHMgdG8gdGhlIGRlZmF1bHQgaW1hZ2UgbGlzdCAqLworICAgIGlmIChscEFkZEJtcC0+aEluc3QgPT0gKEhJTlNUQU5DRTMyKTApIHsKKworCUltYWdlTGlzdF9BZGQgKGluZm9QdHItPmhpbWxEZWYsIChIQklUTUFQMzIpbHBBZGRCbXAtPm5JRCwgMCk7CisgICAgfQorICAgIGVsc2UgaWYgKGxwQWRkQm1wLT5oSW5zdCA9PSBISU5TVF9DT01NQ1RSTCkgeworCS8qIGFkZCBpbnRlcm5hbCBiaXRtYXBzICovCisJRklYTUUgKHRvb2xiYXIsICJpbnRlcm5hbCBiaXRtYXBzIG5vdCBzdXBwb3J0ZWQhXG4iKTsKKworCS8qIEhhY2sgdG8gImFkZCIgc29tZSByZXNlcnZlZCBpbWFnZXMgd2l0aGluIHRoZSBpbWFnZSBsaXN0IAorCSAgIHRvIGdldCB0aGUgcmlnaHQgaW1hZ2UgaW5kaWNlcyAqLworCUltYWdlTGlzdF9TZXRJbWFnZUNvdW50IChpbmZvUHRyLT5oaW1sRGVmLAorCSAgICBJbWFnZUxpc3RfR2V0SW1hZ2VDb3VudCAoaW5mb1B0ci0+aGltbERlZikgKyAoSU5UMzIpd1BhcmFtKTsKKyAgICB9CisgICAgZWxzZSB7CisJSEJJVE1BUDMyIGhCbXAgPQorCSAgICBMb2FkQml0bWFwMzJBIChscEFkZEJtcC0+aEluc3QsIChMUFNUUilscEFkZEJtcC0+bklEKTsKKworCUltYWdlTGlzdF9BZGQgKGluZm9QdHItPmhpbWxEZWYsIGhCbXAsIChIQklUTUFQMzIpMCk7CisKKwlEZWxldGVPYmplY3QzMiAoaEJtcCk7IAorICAgIH0KKworCisgICAgLyogQWRkIGJpdG1hcHMgdG8gdGhlIGRpc2FibGVkIGltYWdlIGxpc3QgKi8KKworCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1RPT0xCQVJfQWRkQnV0dG9uczMyQSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBMUFRCQlVUVE9OIGxwVGJiID0gKExQVEJCVVRUT04pbFBhcmFtOworICAgIElOVDMyIG5PbGRCdXR0b25zLCBuTmV3QnV0dG9ucywgbkFkZEJ1dHRvbnMsIG5Db3VudDsKKyAgICBIREMzMiBoZGM7CisKKyAgICBUUkFDRSAodG9vbGJhciwgImFkZGluZyAlZCBidXR0b25zIVxuIiwgd1BhcmFtKTsKKworICAgIG5BZGRCdXR0b25zID0gKFVJTlQzMil3UGFyYW07CisgICAgbk9sZEJ1dHRvbnMgPSBpbmZvUHRyLT5uTnVtQnV0dG9uczsKKyAgICBuTmV3QnV0dG9ucyA9IG5PbGRCdXR0b25zICsgbkFkZEJ1dHRvbnM7CisKKyAgICBpZiAoaW5mb1B0ci0+bk51bUJ1dHRvbnMgPT0gMCkgeworCWluZm9QdHItPmJ1dHRvbnMgPQorCSAgICBIZWFwQWxsb2MgKFN5c3RlbUhlYXAsIEhFQVBfWkVST19NRU1PUlksCisJCSAgICAgICBzaXplb2YgKFRCVVRUT05fSU5GTykgKiBuTmV3QnV0dG9ucyk7CisgICAgfQorICAgIGVsc2UgeworCVRCVVRUT05fSU5GTyAqb2xkQnV0dG9ucyA9IGluZm9QdHItPmJ1dHRvbnM7CisJaW5mb1B0ci0+YnV0dG9ucyA9CisJICAgIEhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwKKwkJICAgICAgIHNpemVvZiAoVEJVVFRPTl9JTkZPKSAqIG5OZXdCdXR0b25zKTsKKwltZW1jcHkgKCZpbmZvUHRyLT5idXR0b25zWzBdLCAmb2xkQnV0dG9uc1swXSwKKwkJbk9sZEJ1dHRvbnMgKiBzaXplb2YoVEJVVFRPTl9JTkZPKSk7CisgICAgICAgIEhlYXBGcmVlIChTeXN0ZW1IZWFwLCAwLCBvbGRCdXR0b25zKTsKKyAgICB9CisKKyAgICBpbmZvUHRyLT5uTnVtQnV0dG9ucyA9IG5OZXdCdXR0b25zOworCisgICAgLyogaW5zZXJ0IG5ldyBidXR0b24gZGF0YSAoYmFkIGltcGxlbWVudGF0aW9uKSovCisgICAgZm9yIChuQ291bnQgPSAwOyBuQ291bnQgPCBuQWRkQnV0dG9uczsgbkNvdW50KyspIHsKKwlpbmZvUHRyLT5idXR0b25zW25PbGRCdXR0b25zK25Db3VudF0uaUJpdG1hcCAgID0gbHBUYmJbbkNvdW50XS5pQml0bWFwOworCWluZm9QdHItPmJ1dHRvbnNbbk9sZEJ1dHRvbnMrbkNvdW50XS5pZENvbW1hbmQgPSBscFRiYltuQ291bnRdLmlkQ29tbWFuZDsKKwlpbmZvUHRyLT5idXR0b25zW25PbGRCdXR0b25zK25Db3VudF0uZnNTdGF0ZSAgID0gbHBUYmJbbkNvdW50XS5mc1N0YXRlOworCWluZm9QdHItPmJ1dHRvbnNbbk9sZEJ1dHRvbnMrbkNvdW50XS5mc1N0eWxlICAgPSBscFRiYltuQ291bnRdLmZzU3R5bGU7CisJaW5mb1B0ci0+YnV0dG9uc1tuT2xkQnV0dG9ucytuQ291bnRdLmR3RGF0YSAgICA9IGxwVGJiW25Db3VudF0uZHdEYXRhOworCWluZm9QdHItPmJ1dHRvbnNbbk9sZEJ1dHRvbnMrbkNvdW50XS5pU3RyaW5nICAgPSBscFRiYltuQ291bnRdLmlTdHJpbmc7CisgICAgfQorCisgICAgVE9PTEJBUl9DYWxjVG9vbGJhciAod25kUHRyKTsKKworICAgIGhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworICAgIFRPT0xCQVJfUmVmcmVzaCAod25kUHRyLCBoZGMpOworICAgIFJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLy8gPDwgVE9PTEJBUl9BZGRTdHJpbmczMkEgPj4KKy8vIDw8IFRPT0xCQVJfQXV0b1NpemUgPj4KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9CdXR0b25Db3VudCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKworICAgIHJldHVybiBpbmZvUHRyLT5uTnVtQnV0dG9uczsKK30KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9CdXR0b25TdHJ1Y3RTaXplIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0ciA9IFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworCisgICAgaW5mb1B0ci0+ZHdTdHJ1Y3RTaXplID0gKERXT1JEKXdQYXJhbTsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitUT09MQkFSX0NoYW5nZUJpdG1hcCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBUQlVUVE9OX0lORk8gKmJ0blB0cjsKKyAgICBIREMzMiBoZGM7CisgICAgSU5UMzIgbkluZGV4OworCisgICAgbkluZGV4ID0gVE9PTEJBUl9HZXRCdXR0b25JbmRleCAoaW5mb1B0ciwgKElOVDMyKXdQYXJhbSk7CisgICAgaWYgKG5JbmRleCA9PSAtMSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBidG5QdHIgPSAmaW5mb1B0ci0+YnV0dG9uc1tuSW5kZXhdOworICAgIGJ0blB0ci0+aUJpdG1hcCA9IExPV09SRChsUGFyYW0pOworCisgICAgaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7CisgICAgVE9PTEJBUl9EcmF3QnV0dG9uICh3bmRQdHIsIGJ0blB0ciwgaGRjKTsKKyAgICBSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9DaGVja0J1dHRvbiAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBUQlVUVE9OX0lORk8gKmJ0blB0cjsKKyAgICBIREMzMiBoZGM7CisgICAgSU5UMzIgbkluZGV4OworCisgICAgbkluZGV4ID0gVE9PTEJBUl9HZXRCdXR0b25JbmRleCAoaW5mb1B0ciwgKElOVDMyKXdQYXJhbSk7CisgICAgaWYgKG5JbmRleCA9PSAtMSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBidG5QdHIgPSAmaW5mb1B0ci0+YnV0dG9uc1tuSW5kZXhdOworICAgIGlmIChMT1dPUkQobFBhcmFtKSA9PSBGQUxTRSkKKwlidG5QdHItPmZzU3RhdGUgJj0gflRCU1RBVEVfQ0hFQ0tFRDsKKyAgICBlbHNlCisJYnRuUHRyLT5mc1N0YXRlIHw9IFRCU1RBVEVfQ0hFQ0tFRDsKKworICAgIGhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworICAgIFRPT0xCQVJfRHJhd0J1dHRvbiAod25kUHRyLCBidG5QdHIsIGhkYyk7CisgICAgUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKyovCisKKworc3RhdGljIExSRVNVTFQKK1RPT0xCQVJfQ29tbWFuZFRvSW5kZXggKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CisKKyAgICByZXR1cm4gVE9PTEJBUl9HZXRCdXR0b25JbmRleCAoaW5mb1B0ciwgKElOVDMyKXdQYXJhbSk7Cit9CisKKworLy8gPDwgVE9PTEJBUl9DdXN0b21pemUgPj4KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9EZWxldGVCdXR0b24gKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgSU5UMzIgaUluZGV4ID0gKElOVDMyKXdQYXJhbTsKKworICAgIGlmICgoaUluZGV4IDwgMCkgfHwgKGlJbmRleCA+PSBpbmZvUHRyLT5uTnVtQnV0dG9ucykpCisJcmV0dXJuIEZBTFNFOworCisgICAgaWYgKGluZm9QdHItPm5OdW1CdXR0b25zID09IDEpIHsKKwlUUkFDRSAodG9vbGJhciwgIiBzaW1wbGUgZGVsZXRlIVxuIik7CisJSGVhcEZyZWUgKFN5c3RlbUhlYXAsIDAsIGluZm9QdHItPmJ1dHRvbnMpOworCWluZm9QdHItPmJ1dHRvbnMgPSBOVUxMOworCWluZm9QdHItPm5OdW1CdXR0b25zID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgVFJBQ0UoaGVhZGVyLCAiY29tcGxleCBkZWxldGUhIFtpSW5kZXg9JWRdXG4iLCBpSW5kZXgpOworCisgICAgfQorCisgICAgVE9PTEJBUl9DYWxjVG9vbGJhciAod25kUHRyKTsKKworICAgIEludmFsaWRhdGVSZWN0MzIgKHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIFRSVUUpOworICAgIFVwZGF0ZVdpbmRvdzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitUT09MQkFSX0VuYWJsZUJ1dHRvbiAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBUQlVUVE9OX0lORk8gKmJ0blB0cjsKKyAgICBIREMzMiBoZGM7CisgICAgSU5UMzIgbkluZGV4OworCisgICAgbkluZGV4ID0gVE9PTEJBUl9HZXRCdXR0b25JbmRleCAoaW5mb1B0ciwgKElOVDMyKXdQYXJhbSk7CisgICAgaWYgKG5JbmRleCA9PSAtMSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBidG5QdHIgPSAmaW5mb1B0ci0+YnV0dG9uc1tuSW5kZXhdOworICAgIGlmIChMT1dPUkQobFBhcmFtKSA9PSBGQUxTRSkKKwlidG5QdHItPmZzU3RhdGUgJj0gflRCU1RBVEVfRU5BQkxFRDsKKyAgICBlbHNlCisJYnRuUHRyLT5mc1N0YXRlIHw9IFRCU1RBVEVfRU5BQkxFRDsKKworICAgIGhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworICAgIFRPT0xCQVJfRHJhd0J1dHRvbiAod25kUHRyLCBidG5QdHIsIGhkYyk7CisgICAgUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyA8PCBUT09MQkFSX0dldEFuY2hvckhpZ2hsaWdodCA+PgorCisKK3N0YXRpYyBMUkVTVUxUCitUT09MQkFSX0dldEJpdG1hcCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBJTlQzMiBuSW5kZXg7CisKKyAgICBuSW5kZXggPSBUT09MQkFSX0dldEJ1dHRvbkluZGV4IChpbmZvUHRyLCAoSU5UMzIpd1BhcmFtKTsKKyAgICBpZiAobkluZGV4ID09IC0xKQorCXJldHVybiAwOworCisgICAgcmV0dXJuIGluZm9QdHItPmJ1dHRvbnNbbkluZGV4XS5pQml0bWFwOworfQorCisKKy8vIDw8IFRPT0xCQVJfR2V0Qml0bWFwRmxhZ3MgPj4KKy8vIDw8IFRPT0xCQVJfR2V0QnV0dG9uID4+CisvLyA8PCAuLi4gPj4KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9IaWRlQnV0dG9uIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0ciA9IFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIFRCVVRUT05fSU5GTyAqYnRuUHRyOworICAgIElOVDMyIG5JbmRleDsKKworICAgIG5JbmRleCA9IFRPT0xCQVJfR2V0QnV0dG9uSW5kZXggKGluZm9QdHIsIChJTlQzMil3UGFyYW0pOworICAgIGlmIChuSW5kZXggPT0gLTEpCisJcmV0dXJuIEZBTFNFOworCisgICAgYnRuUHRyID0gJmluZm9QdHItPmJ1dHRvbnNbbkluZGV4XTsKKyAgICBpZiAoTE9XT1JEKGxQYXJhbSkgPT0gRkFMU0UpCisJYnRuUHRyLT5mc1N0YXRlICY9IH5UQlNUQVRFX0hJRERFTjsKKyAgICBlbHNlCisJYnRuUHRyLT5mc1N0YXRlIHw9IFRCU1RBVEVfSElEREVOOworCisgICAgVE9PTEJBUl9DYWxjVG9vbGJhciAod25kUHRyKTsKKworICAgIEludmFsaWRhdGVSZWN0MzIgKHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIFRSVUUpOworICAgIFVwZGF0ZVdpbmRvdzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitUT09MQkFSX0hpdFRlc3QgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgcmV0dXJuIFRPT0xCQVJfSW50ZXJuYWxIaXRUZXN0ICh3bmRQdHIsIChMUFBPSU5UMzIpbFBhcmFtKTsKK30KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9Jc0J1dHRvbkNoZWNrZWQgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgSU5UMzIgbkluZGV4OworCisgICAgbkluZGV4ID0gVE9PTEJBUl9HZXRCdXR0b25JbmRleCAoaW5mb1B0ciwgKElOVDMyKXdQYXJhbSk7CisgICAgaWYgKG5JbmRleCA9PSAtMSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gKGluZm9QdHItPmJ1dHRvbnNbbkluZGV4XS5mc1N0YXRlICYgVEJTVEFURV9DSEVDS0VEKTsKK30KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9Jc0J1dHRvbkVuYWJsZWQgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgSU5UMzIgbkluZGV4OworCisgICAgbkluZGV4ID0gVE9PTEJBUl9HZXRCdXR0b25JbmRleCAoaW5mb1B0ciwgKElOVDMyKXdQYXJhbSk7CisgICAgaWYgKG5JbmRleCA9PSAtMSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gKGluZm9QdHItPmJ1dHRvbnNbbkluZGV4XS5mc1N0YXRlICYgVEJTVEFURV9FTkFCTEVEKTsKK30KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9Jc0J1dHRvbkhpZGRlbiAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBJTlQzMiBuSW5kZXg7CisKKyAgICBuSW5kZXggPSBUT09MQkFSX0dldEJ1dHRvbkluZGV4IChpbmZvUHRyLCAoSU5UMzIpd1BhcmFtKTsKKyAgICBpZiAobkluZGV4ID09IC0xKQorCXJldHVybiBGQUxTRTsKKworICAgIHJldHVybiAoaW5mb1B0ci0+YnV0dG9uc1tuSW5kZXhdLmZzU3RhdGUgJiBUQlNUQVRFX0hJRERFTik7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1RPT0xCQVJfSXNCdXR0b25IaWdobGlnaHRlZCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBJTlQzMiBuSW5kZXg7CisKKyAgICBuSW5kZXggPSBUT09MQkFSX0dldEJ1dHRvbkluZGV4IChpbmZvUHRyLCAoSU5UMzIpd1BhcmFtKTsKKyAgICBpZiAobkluZGV4ID09IC0xKQorCXJldHVybiBGQUxTRTsKKworICAgIHJldHVybiAoaW5mb1B0ci0+YnV0dG9uc1tuSW5kZXhdLmZzU3RhdGUgJiBUQlNUQVRFX01BUktFRCk7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1RPT0xCQVJfSXNCdXR0b25JbmRldGVybWluYXRlIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0ciA9IFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIElOVDMyIG5JbmRleDsKKworICAgIG5JbmRleCA9IFRPT0xCQVJfR2V0QnV0dG9uSW5kZXggKGluZm9QdHIsIChJTlQzMil3UGFyYW0pOworICAgIGlmIChuSW5kZXggPT0gLTEpCisJcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIChpbmZvUHRyLT5idXR0b25zW25JbmRleF0uZnNTdGF0ZSAmIFRCU1RBVEVfSU5ERVRFUk1JTkFURSk7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1RPT0xCQVJfSXNCdXR0b25QcmVzc2VkIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0ciA9IFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIElOVDMyIG5JbmRleDsKKworICAgIG5JbmRleCA9IFRPT0xCQVJfR2V0QnV0dG9uSW5kZXggKGluZm9QdHIsIChJTlQzMil3UGFyYW0pOworICAgIGlmIChuSW5kZXggPT0gLTEpCisJcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIChpbmZvUHRyLT5idXR0b25zW25JbmRleF0uZnNTdGF0ZSAmIFRCU1RBVEVfUFJFU1NFRCk7Cit9CisKKworLy8gPDwgVE9PTEJBUl9Mb2FkSW1hZ2VzID4+CisvLyA8PCBUT09MQkFSX01hcEFjY2VsZXJhdG9yID4+CisvLyA8PCBUT09MQkFSX01hcmtCdXR0b24gPj4KKy8vIDw8IFRPT0xCQVJfTW92ZUJ1dHRvbiA+PgorCisKK3N0YXRpYyBMUkVTVUxUCitUT09MQkFSX1ByZXNzQnV0dG9uIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0ciA9IFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIFRCVVRUT05fSU5GTyAqYnRuUHRyOworICAgIEhEQzMyIGhkYzsKKyAgICBJTlQzMiBuSW5kZXg7CisKKyAgICBuSW5kZXggPSBUT09MQkFSX0dldEJ1dHRvbkluZGV4IChpbmZvUHRyLCAoSU5UMzIpd1BhcmFtKTsKKyAgICBpZiAobkluZGV4ID09IC0xKQorCXJldHVybiBGQUxTRTsKKworICAgIGJ0blB0ciA9ICZpbmZvUHRyLT5idXR0b25zW25JbmRleF07CisgICAgaWYgKExPV09SRChsUGFyYW0pID09IEZBTFNFKQorCWJ0blB0ci0+ZnNTdGF0ZSAmPSB+VEJTVEFURV9QUkVTU0VEOworICAgIGVsc2UKKwlidG5QdHItPmZzU3RhdGUgfD0gVEJTVEFURV9QUkVTU0VEOworCisgICAgaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7CisgICAgVE9PTEJBUl9EcmF3QnV0dG9uICh3bmRQdHIsIGJ0blB0ciwgaGRjKTsKKyAgICBSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisKKy8vIDw8IFRPT0xCQVJfUmVwbGFjZUJpdG1hcCA+PgorLy8gPDwgVE9PTEJBUl9TYXZlUmVzdG9yZSA+PgorLy8gPDwgVE9PTEJBUl9TZXRBbmNob3JIaWdobGlnaHQgPj4KKworc3RhdGljIExSRVNVTFQKK1RPT0xCQVJfU2V0Qml0bWFwU2l6ZSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKworICAgIGlmICgoTE9XT1JEKGxQYXJhbSkgPD0gMCkgfHwgKEhJV09SRChsUGFyYW0pPD0wKSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBpbmZvUHRyLT5uQml0bWFwV2lkdGggPSAoSU5UMzIpTE9XT1JEKGxQYXJhbSk7CisgICAgaW5mb1B0ci0+bkJpdG1hcEhlaWdodCA9IChJTlQzMilISVdPUkQobFBhcmFtKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisKKy8vIDw8IFRPT0xCQVJfU2V0QnV0dG9uSW5mbyA+PgorCisKK3N0YXRpYyBMUkVTVUxUCitUT09MQkFSX1NldEJ1dHRvblNpemUgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CisKKyAgICBpZiAoKExPV09SRChsUGFyYW0pIDw9IDApIHx8IChISVdPUkQobFBhcmFtKTw9MCkpCisJcmV0dXJuIEZBTFNFOworCisgICAgaW5mb1B0ci0+bkJ1dHRvbldpZHRoID0gKElOVDMyKUxPV09SRChsUGFyYW0pOworICAgIGluZm9QdHItPm5CdXR0b25IZWlnaHQgPSAoSU5UMzIpSElXT1JEKGxQYXJhbSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyA8PCBUT09MQkFSX1NldEJ1dHRvbldpZHRoID4+CisKKworc3RhdGljIExSRVNVTFQKK1RPT0xCQVJfU2V0Q21kSWQgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgSU5UMzIgbkluZGV4ID0gKElOVDMyKXdQYXJhbTsKKworICAgIGlmICgobkluZGV4IDwgMCkgfHwgKG5JbmRleCA+PSBpbmZvUHRyLT5uTnVtQnV0dG9ucykpCisJcmV0dXJuIEZBTFNFOworCisgICAgaW5mb1B0ci0+YnV0dG9uc1tuSW5kZXhdLmlkQ29tbWFuZCA9IChJTlQzMilsUGFyYW07CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisKK3N0YXRpYyBMUkVTVUxUCitUT09MQkFSX1NldEluZGVudCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBIREMzMiBoZGM7CisKKyAgICBpbmZvUHRyLT5uSW5kZW50ID0gKElOVDMyKXdQYXJhbTsKKyAgICBUT09MQkFSX0NhbGNUb29sYmFyICh3bmRQdHIpOworICAgIGhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworICAgIFRPT0xCQVJfUmVmcmVzaCAod25kUHRyLCBoZGMpOworICAgIFJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9TZXRTdGF0ZSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBUQlVUVE9OX0lORk8gKmJ0blB0cjsKKyAgICBIREMzMiBoZGM7CisgICAgSU5UMzIgbkluZGV4OworCisgICAgbkluZGV4ID0gVE9PTEJBUl9HZXRCdXR0b25JbmRleCAoaW5mb1B0ciwgKElOVDMyKXdQYXJhbSk7CisgICAgaWYgKG5JbmRleCA9PSAtMSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBidG5QdHIgPSAmaW5mb1B0ci0+YnV0dG9uc1tuSW5kZXhdOworICAgIGJ0blB0ci0+ZnNTdGF0ZSA9IExPV09SRChsUGFyYW0pOworCisgICAgaGRjID0gR2V0REMzMiAod25kUHRyLT5od25kU2VsZik7CisgICAgVE9PTEJBUl9EcmF3QnV0dG9uICh3bmRQdHIsIGJ0blB0ciwgaGRjKTsKKyAgICBSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitUT09MQkFSX1NldFN0eWxlIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0ciA9IFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIFRCVVRUT05fSU5GTyAqYnRuUHRyOworICAgIEhEQzMyIGhkYzsKKyAgICBJTlQzMiBuSW5kZXg7CisKKyAgICBuSW5kZXggPSBUT09MQkFSX0dldEJ1dHRvbkluZGV4IChpbmZvUHRyLCAoSU5UMzIpd1BhcmFtKTsKKyAgICBpZiAobkluZGV4ID09IC0xKQorCXJldHVybiBGQUxTRTsKKworICAgIGJ0blB0ciA9ICZpbmZvUHRyLT5idXR0b25zW25JbmRleF07CisgICAgYnRuUHRyLT5mc1N0eWxlID0gTE9XT1JEKGxQYXJhbSk7CisKKyAgICBoZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKyAgICBUT09MQkFSX0RyYXdCdXR0b24gKHduZFB0ciwgYnRuUHRyLCBoZGMpOworICAgIFJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLy8gPDwgVE9PTEJBUl9TZXRUb29sVGlwcyA+PgorLy8gPDwgVE9PTEJBUl9TZXRVbmljb2RlRm9ybWF0ID4+CisKKworc3RhdGljIExSRVNVTFQKK1RPT0xCQVJfQ3JlYXRlIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0cjsKKworICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgaW5mbyBzdHJ1Y3R1cmUgKi8KKyAgICBpbmZvUHRyID0gKFRPT0xCQVJfSU5GTyAqKUhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFRPT0xCQVJfSU5GTykpOworICAgIHduZFB0ci0+d0V4dHJhWzBdID0gKERXT1JEKWluZm9QdHI7CisKKyAgICBpbmZvUHRyLT5uQnV0dG9uSGVpZ2h0ID0gMjI7CisgICAgaW5mb1B0ci0+bkJ1dHRvbldpZHRoID0gMjQ7CisgICAgaW5mb1B0ci0+bkJ1dHRvblRvcCA9IDI7CisgICAgaW5mb1B0ci0+bkJpdG1hcEhlaWdodCA9IDE1OworICAgIGluZm9QdHItPm5CaXRtYXBXaWR0aCA9IDE2OworCisgICAgaW5mb1B0ci0+bkhlaWdodCA9IGluZm9QdHItPm5CdXR0b25IZWlnaHQgKyA2OworCisgICAgaW5mb1B0ci0+YkNhcHR1cmVkID0gMDsKKyAgICBpbmZvUHRyLT5uQnV0dG9uRG93biA9IC0xOworICAgIGluZm9QdHItPm5PbGRIaXQgPSAtMTsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitUT09MQkFSX0Rlc3Ryb3kgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CisKKyAgICAvKiBkZWxldGUgYnV0dG9uIGRhdGEgKi8KKyAgICBpZiAoaW5mb1B0ci0+YnV0dG9ucykKKwlIZWFwRnJlZSAoU3lzdGVtSGVhcCwgMCwgaW5mb1B0ci0+YnV0dG9ucyk7CisKKyAgICAvKiBkZXN0cm95IGRlZmF1bHQgaW1hZ2UgbGlzdCAqLworICAgIGlmIChpbmZvUHRyLT5oaW1sRGVmKQorCUltYWdlTGlzdF9EZXN0cm95IChpbmZvUHRyLT5oaW1sRGVmKTsKKworICAgIC8qIGRlc3Ryb3kgZGlzYWJsZWQgaW1hZ2UgbGlzdCAqLworICAgIGlmIChpbmZvUHRyLT5oaW1sRGlzKQorCUltYWdlTGlzdF9EZXN0cm95IChpbmZvUHRyLT5oaW1sRGlzKTsKKworICAgIC8qIGRlc3Ryb3kgaG90IGltYWdlIGxpc3QgKi8KKyAgICBpZiAoaW5mb1B0ci0+aGltbEhvdCkKKwlJbWFnZUxpc3RfRGVzdHJveSAoaW5mb1B0ci0+aGltbEhvdCk7CisKKyAgICAvKiBmcmVlIHRvb2xiYXIgaW5mbyBkYXRhICovCisgICAgSGVhcEZyZWUgKFN5c3RlbUhlYXAsIDAsIGluZm9QdHIpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1RPT0xCQVJfTEJ1dHRvbkRibENsayAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBUQlVUVE9OX0lORk8gKmJ0blB0cjsKKyAgICBQT0lOVDMyIHB0OworICAgIElOVDMyICAgbkhpdDsKKyAgICBIREMzMiAgIGhkYzsKKworICAgIHB0LnggPSAoSU5UMzIpTE9XT1JEKGxQYXJhbSk7CisgICAgcHQueSA9IChJTlQzMilISVdPUkQobFBhcmFtKTsKKyAgICBuSGl0ID0gVE9PTEJBUl9JbnRlcm5hbEhpdFRlc3QgKHduZFB0ciwgJnB0KTsKKworICAgIGlmIChuSGl0ID49IDApIHsKKwlidG5QdHIgPSAmaW5mb1B0ci0+YnV0dG9uc1tuSGl0XTsKKwlpZiAoIShidG5QdHItPmZzU3RhdGUgJiBUQlNUQVRFX0VOQUJMRUQpKQorCSAgICByZXR1cm4gMDsKKwlTZXRDYXB0dXJlMzIgKHduZFB0ci0+aHduZFNlbGYpOworCWluZm9QdHItPmJDYXB0dXJlZCA9IFRSVUU7CisJaW5mb1B0ci0+bkJ1dHRvbkRvd24gPSBuSGl0OworCisJYnRuUHRyLT5mc1N0YXRlIHw9IFRCU1RBVEVfUFJFU1NFRDsKKworCWhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworCVRPT0xCQVJfRHJhd0J1dHRvbiAod25kUHRyLCBidG5QdHIsIGhkYyk7CisJUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CisgICAgfQorICAgIGVsc2UgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIENDU19BREpVU1RBQkxFKSB7CisJLyogY3VzdG9taXplICovCisKKwlGSVhNRSAodG9vbGJhciwgImN1c3RvbWl6YXRpb24gbm90IGltcGxlbWVudGVkIVxuIik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1RPT0xCQVJfTEJ1dHRvbkRvd24gKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgVEJVVFRPTl9JTkZPICpidG5QdHI7CisgICAgUE9JTlQzMiBwdDsKKyAgICBJTlQzMiAgIG5IaXQ7CisgICAgSERDMzIgICBoZGM7CisKKyAgICBwdC54ID0gKElOVDMyKUxPV09SRChsUGFyYW0pOworICAgIHB0LnkgPSAoSU5UMzIpSElXT1JEKGxQYXJhbSk7CisgICAgbkhpdCA9IFRPT0xCQVJfSW50ZXJuYWxIaXRUZXN0ICh3bmRQdHIsICZwdCk7CisKKyAgICBpZiAobkhpdCA+PSAwKSB7CisJYnRuUHRyID0gJmluZm9QdHItPmJ1dHRvbnNbbkhpdF07CisJaWYgKCEoYnRuUHRyLT5mc1N0YXRlICYgVEJTVEFURV9FTkFCTEVEKSkKKwkgICAgcmV0dXJuIDA7CisKKwlTZXRDYXB0dXJlMzIgKHduZFB0ci0+aHduZFNlbGYpOworCWluZm9QdHItPmJDYXB0dXJlZCA9IFRSVUU7CisJaW5mb1B0ci0+bkJ1dHRvbkRvd24gPSBuSGl0OworCWluZm9QdHItPm5PbGRIaXQgPSBuSGl0OworCisJYnRuUHRyLT5mc1N0YXRlIHw9IFRCU1RBVEVfUFJFU1NFRDsKKworCWhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworCVRPT0xCQVJfRHJhd0J1dHRvbiAod25kUHRyLCBidG5QdHIsIGhkYyk7CisJUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CisgICAgfQorICAgIAorCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1RPT0xCQVJfTEJ1dHRvblVwIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0ciA9IFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIFRCVVRUT05fSU5GTyAqYnRuUHRyOworICAgIFBPSU5UMzIgcHQ7CisgICAgSU5UMzIgICBuSGl0OworICAgIEhEQzMyICAgaGRjOworCisgICAgcHQueCA9IChJTlQzMilMT1dPUkQobFBhcmFtKTsKKyAgICBwdC55ID0gKElOVDMyKUhJV09SRChsUGFyYW0pOworICAgIG5IaXQgPSBUT09MQkFSX0ludGVybmFsSGl0VGVzdCAod25kUHRyLCAmcHQpOworCisgICAgaWYgKChpbmZvUHRyLT5iQ2FwdHVyZWQpICYmIChpbmZvUHRyLT5uQnV0dG9uRG93biA+PSAwKSkgeworCisJYnRuUHRyID0gJmluZm9QdHItPmJ1dHRvbnNbaW5mb1B0ci0+bkJ1dHRvbkRvd25dOworCisKKworCisJYnRuUHRyLT5mc1N0YXRlICY9IH5UQlNUQVRFX1BSRVNTRUQ7CisJaW5mb1B0ci0+bkJ1dHRvbkRvd24gPSAtMTsKKwlpbmZvUHRyLT5uT2xkSGl0ID0gLTE7CisKKwlpbmZvUHRyLT5iQ2FwdHVyZWQgPSBGQUxTRTsKKwlSZWxlYXNlQ2FwdHVyZSAoKTsKKworCWhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworCVRPT0xCQVJfRHJhd0J1dHRvbiAod25kUHRyLCBidG5QdHIsIGhkYyk7CisJUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CisKKwlTZW5kTWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpLCBXTV9DT01NQU5ELAorCQkJTUFLRVdQQVJBTShidG5QdHItPmlkQ29tbWFuZCwgMCksCisJCQkoTFBBUkFNKXduZFB0ci0+aHduZFNlbGYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitUT09MQkFSX01vdXNlTW92ZSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBUQlVUVE9OX0lORk8gKmJ0blB0cjsKKyAgICBQT0lOVDMyIHB0OworICAgIElOVDMyICAgbkhpdDsKKyAgICBIREMzMiAgIGhkYzsKKworICAgIHB0LnggPSAoSU5UMzIpTE9XT1JEKGxQYXJhbSk7CisgICAgcHQueSA9IChJTlQzMilISVdPUkQobFBhcmFtKTsKKyAgICBuSGl0ID0gVE9PTEJBUl9JbnRlcm5hbEhpdFRlc3QgKHduZFB0ciwgJnB0KTsKKworICAgIGlmIChpbmZvUHRyLT5iQ2FwdHVyZWQpIHsKKwlpZiAoaW5mb1B0ci0+bk9sZEhpdCAhPSBuSGl0KSB7CisJICAgIGJ0blB0ciA9ICZpbmZvUHRyLT5idXR0b25zW2luZm9QdHItPm5CdXR0b25Eb3duXTsKKwkgICAgaWYgKGluZm9QdHItPm5PbGRIaXQgPT0gaW5mb1B0ci0+bkJ1dHRvbkRvd24pIHsKKwkJYnRuUHRyLT5mc1N0YXRlICY9IH5UQlNUQVRFX1BSRVNTRUQ7CisJCWhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworCQlUT09MQkFSX0RyYXdCdXR0b24gKHduZFB0ciwgYnRuUHRyLCBoZGMpOworCQlSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKKwkgICAgfQorCSAgICBlbHNlIGlmIChuSGl0ID09IGluZm9QdHItPm5CdXR0b25Eb3duKSB7CisJCWJ0blB0ci0+ZnNTdGF0ZSB8PSBUQlNUQVRFX1BSRVNTRUQ7CisJCWhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworCQlUT09MQkFSX0RyYXdCdXR0b24gKHduZFB0ciwgYnRuUHRyLCBoZGMpOworCQlSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKKwkgICAgfQorCX0KKwlpbmZvUHRyLT5uT2xkSGl0ID0gbkhpdDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisKKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9OQ0NhbGNTaXplIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFJFQ1QzMiB0bXBSZWN0ID0gezAsIDAsIDAsIDB9OworICAgIExQUkVDVDMyIHdpblJlY3Q7CisKKy8vICAgIERlZldpbmRvd1Byb2MzMkEgKHduZFB0ci0+aHduZFNlbGYsIFdNX05DQ0FMQ1NJWkUsIHdQYXJhbSwgbFBhcmFtKTsKKworICAgIHdpblJlY3QgPSAoTFBSRUNUMzIpbFBhcmFtOworCisvLyAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfQk9SREVSKQorLy8JSW5mbGF0ZVJlY3QzMiAoJnRtcFJlY3QsIDEsIDEpOworCisgICAgaWYgKCEod25kUHRyLT5kd1N0eWxlICYgQ0NTX05PRElWSURFUikpIHsKKwl0bXBSZWN0LnRvcCAtPSAyOworCXRtcFJlY3QuYm90dG9tIC09IDI7CisgICAgfQorCisgICAgd2luUmVjdC0+bGVmdCAgIC09IHRtcFJlY3QubGVmdDsgICAKKyAgICB3aW5SZWN0LT50b3AgICAgLT0gdG1wUmVjdC50b3A7ICAgCisgICAgd2luUmVjdC0+cmlnaHQgIC09IHRtcFJlY3QucmlnaHQ7ICAgCisgICAgd2luUmVjdC0+Ym90dG9tIC09IHRtcFJlY3QuYm90dG9tOyAgIAorCisgICAgcmV0dXJuIERlZldpbmRvd1Byb2MzMkEgKHduZFB0ci0+aHduZFNlbGYsIFdNX05DQ0FMQ1NJWkUsIHdQYXJhbSwgbFBhcmFtKTsKKy8vICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitUT09MQkFSX05DUGFpbnQgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgSERDMzIgaGRjOworICAgIFJFQ1QzMiByZWN0OworICAgIEhXTkQzMiBod25kID0gd25kUHRyLT5od25kU2VsZjsKKworICAgIGlmICggd25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUgfHwKKwkhV0lOX0lzV2luZG93RHJhd2FibGUoIHduZFB0ciwgMCApKSByZXR1cm4gMDsgLyogTm90aGluZyB0byBkbyAqLworCisgICAgRGVmV2luZG93UHJvYzMyQSAoaHduZCwgV01fTkNQQUlOVCwgd1BhcmFtLCBsUGFyYW0pOworCisgICAgaWYgKCEoaGRjID0gR2V0RENFeDMyKCBod25kLCAwLCBEQ1hfVVNFU1RZTEUgfCBEQ1hfV0lORE9XICkpKSByZXR1cm4gMDsKKworICAgIGlmIChFeGNsdWRlVmlzUmVjdCggaGRjLCB3bmRQdHItPnJlY3RDbGllbnQubGVmdC13bmRQdHItPnJlY3RXaW5kb3cubGVmdCwKKwkJICAgICAgICB3bmRQdHItPnJlY3RDbGllbnQudG9wLXduZFB0ci0+cmVjdFdpbmRvdy50b3AsCisJCSAgICAgICAgd25kUHRyLT5yZWN0Q2xpZW50LnJpZ2h0LXduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0LAorCQkgICAgICAgIHduZFB0ci0+cmVjdENsaWVudC5ib3R0b20td25kUHRyLT5yZWN0V2luZG93LnRvcCApCisJPT0gTlVMTFJFR0lPTikKKyAgICB7CisJUmVsZWFzZURDMzIoIGh3bmQsIGhkYyApOworCXJldHVybiAwOworICAgIH0KKworICAgIGlmICghKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTUFOQUdFRCkpIHsKKwlpZiAoISh3bmRQdHItPmR3U3R5bGUgJiBDQ1NfTk9ESVZJREVSKSkgeworCSAgICByZWN0LmxlZnQgPSB3bmRQdHItPnJlY3RDbGllbnQubGVmdDsKKwkgICAgcmVjdC50b3AgPSB3bmRQdHItPnJlY3RDbGllbnQudG9wIC0gMjsKKwkgICAgcmVjdC5yaWdodCA9IHduZFB0ci0+cmVjdENsaWVudC5yaWdodDsKKworCSAgICBTZWxlY3RPYmplY3QzMiAoIGhkYywgR2V0U3lzQ29sb3JQZW4zMiAoQ09MT1JfM0RTSEFET1cpKTsKKwkgICAgTW92ZVRvRXgzMiAoaGRjLCByZWN0LmxlZnQsIHJlY3QudG9wLCBOVUxMKTsKKwkgICAgTGluZVRvMzIgKGhkYywgcmVjdC5yaWdodCwgcmVjdC50b3ApOworCSAgICByZWN0LnRvcCsrOworCSAgICBTZWxlY3RPYmplY3QzMiAoIGhkYywgR2V0U3lzQ29sb3JQZW4zMiAoQ09MT1JfM0RISUxJR0hUKSk7CisJICAgIE1vdmVUb0V4MzIgKGhkYywgcmVjdC5sZWZ0LCByZWN0LnRvcCwgTlVMTCk7CisJICAgIExpbmVUbzMyIChoZGMsIHJlY3QucmlnaHQsIHJlY3QudG9wKTsKKwl9CisKKyAgICB9CisKKyAgICBSZWxlYXNlREMzMiggaHduZCwgaGRjICk7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9QYWludCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSkKK3sKKyAgICBIREMzMiBoZGM7CisgICAgUEFJTlRTVFJVQ1QzMiBwczsKKworICAgIGhkYyA9IHdQYXJhbT09MCA/IEJlZ2luUGFpbnQzMiAod25kUHRyLT5od25kU2VsZiwgJnBzKSA6IChIREMzMil3UGFyYW07CisgICAgVE9PTEJBUl9SZWZyZXNoICh3bmRQdHIsIGhkYyk7CisgICAgaWYgKCF3UGFyYW0pCisJRW5kUGFpbnQzMiAod25kUHRyLT5od25kU2VsZiwgJnBzKTsKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9TaXplIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0ciA9IFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIFJFQ1QzMiBwYXJlbnRfcmVjdDsKKyAgICBIV05EMzIgcGFyZW50OworICAgIElOVDMyICBmbGFnczsKKworICAgIGZsYWdzID0gKElOVDMyKSB3UGFyYW07CisKKyAgICAvKiBGSVhNRSBmb3IgZmxhZ3MgPQorICAgICAqIFNJWkVfTUFYSU1JWkVELCBTSVpFX01BWFNIT1csIFNJWkVfTUlOSU1JWkVELCBTSVpFX1JFU1RPUkVECisgICAgICovCisKKy8vICAgIGlmIChmbGFncyA9PSBTSVpFX1JFU1RPUkVEKSB7CisJLyogd2lkdGggYW5kIGhlaWdodCBkb24ndCBhcHBseSAqLworCXBhcmVudCA9IEdldFBhcmVudDMyICh3bmRQdHItPmh3bmRTZWxmKTsKKwlHZXRDbGllbnRSZWN0MzIocGFyZW50LCAmcGFyZW50X3JlY3QpOworICAgICAgICBpbmZvUHRyLT5uV2lkdGggPSBwYXJlbnRfcmVjdC5yaWdodCAtIHBhcmVudF9yZWN0LmxlZnQ7CisJTW92ZVdpbmRvdzMyKHduZFB0ci0+aHduZFNlbGYsIHBhcmVudF9yZWN0LmxlZnQsIHBhcmVudF9yZWN0LnRvcCwgLy8wLCAwLAorCQkgICAgIGluZm9QdHItPm5XaWR0aCwgaW5mb1B0ci0+bkhlaWdodCwgVFJVRSk7CisvLyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworCisKKworCisKK0xSRVNVTFQgV0lOQVBJCitUb29sYmFyV2luZG93UHJvYyAoSFdORDMyIGh3bmQsIFVJTlQzMiB1TXNnLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKKworICAgIHN3aXRjaCAodU1zZykKKyAgICB7CisJY2FzZSBUQl9BRERCSVRNQVA6CisJICAgIHJldHVybiBUT09MQkFSX0FkZEJpdG1hcCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIFRCX0FEREJVVFRPTlMzMkE6CisJICAgIHJldHVybiBUT09MQkFSX0FkZEJ1dHRvbnMzMkEgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisvLwljYXNlIFRCX0FERFNUUklORzMyQToKKy8vCSAgICByZXR1cm4gVE9PTEJBUl9BZGRTdHJpbmczMkEgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisvLwljYXNlIFRCX0FVVE9TSVpFOgorLy8JICAgIHJldHVybiBUT09MQkFSX0F1dG9TaXplICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgVEJfQlVUVE9OQ09VTlQ6CisJICAgIHJldHVybiBUT09MQkFSX0J1dHRvbkNvdW50ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgVEJfQlVUVE9OU1RSVUNUU0laRToKKwkgICAgcmV0dXJuIFRPT0xCQVJfQnV0dG9uU3RydWN0U2l6ZSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIFRCX0NIQU5HRUJJVE1BUDoKKwkgICAgcmV0dXJuIFRPT0xCQVJfQ2hhbmdlQml0bWFwICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBUQl9DSEVDS0JVVFRPTjoKKy8vCSAgICByZXR1cm4gVE9PTEJBUl9DaGVja0J1dHRvbiAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIFRCX0NPTU1BTkRUT0lOREVYOgorCSAgICByZXR1cm4gVE9PTEJBUl9Db21tYW5kVG9JbmRleCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKy8vCWNhc2UgVEJfQ1VTVE9NSVpFOgorCisJY2FzZSBUQl9ERUxFVEVCVVRUT046CisJICAgIHJldHVybiBUT09MQkFSX0RlbGV0ZUJ1dHRvbiAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIFRCX0VOQUJMRUJVVFRPTjoKKwkgICAgcmV0dXJuIFRPT0xCQVJfRW5hYmxlQnV0dG9uICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBUQl9HRVRBTkNIT1JISUdITElHSFQ6CQkvKiA0LjcxICovCisKKwljYXNlIFRCX0dFVEJJVE1BUDoKKwkgICAgcmV0dXJuIFRPT0xCQVJfR2V0Qml0bWFwICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBUQl9HRVRCSVRNQVBGTEFHUzoKKy8vCWNhc2UgVEJfR0VURElTQUJMRURJTUFHRUxJU1Q6CQkvKiA0LjcwICovCisvLwljYXNlIFRCX0dFVEVYVEVOREVEU1RZTEU6CQkvKiA0LjcxICovCisvLwljYXNlIFRCX0dFVEhPVElNQUdFTElTVDoJCS8qIDQuNzAgKi8KKy8vCWNhc2UgVEJfR0VUSE9USVRFTToJCQkvKiA0LjcxICovCisvLwljYXNlIFRCX0dFVElNQUdFTElTVDoJCQkvKiA0LjcwICovCisvLwljYXNlIFRCX0dFVElOU0VSVE1BUks6CQkJLyogNC43MSAqLworLy8JY2FzZSBUQl9HRVRJTlNFUlRNQVJLQ09MT1I6CQkvKiA0LjcxICovCisvLwljYXNlIFRCX0dFVElURU1SRUNUOgorLy8JY2FzZSBUQl9HRVRNQVhTSVpFOgkJCS8qIDQuNzEgKi8KKy8vCWNhc2UgVEJfR0VUT0JKRUNUOgkJCS8qIDQuNzEgKi8KKy8vCWNhc2UgVEJfR0VUUEFERElORzoJCQkvKiA0LjcxICovCisvLwljYXNlIFRCX0dFVFJFQ1Q6CQkJLyogNC43MCAqLworLy8JY2FzZSBUQl9HRVRST1dTOgorLy8JY2FzZSBUQl9HRVRTVEFURToKKy8vCWNhc2UgVEJfR0VUU1RZTEU6CQkJLyogNC43MCAqLworLy8JY2FzZSBUQl9HRVRURVhUUk9XUzoJCQkvKiA0LjcwICovCisvLwljYXNlIFRCX0dFVFRPT0xUSVBTOgorLy8JY2FzZSBUQl9HRVRVTklDT0RFRk9STUFUOgorCisJY2FzZSBUQl9ISURFQlVUVE9OOgorCSAgICByZXR1cm4gVE9PTEJBUl9IaWRlQnV0dG9uICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgVEJfSElUVEVTVDoKKwkgICAgcmV0dXJuIFRPT0xCQVJfSGl0VGVzdCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKy8vCWNhc2UgVEJfSU5ERVRFUk1JTkFURToKKy8vCSAgICByZXR1cm4gVE9PTEJBUl9JbmRldGVybWluYXRlICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBUQl9JTlNFUlRCVVRUT046CisvLwkgICAgcmV0dXJuIFRPT0xCQVJfSW5zZXJ0QnV0dG9uICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBUQl9JTlNFUlRNQVJLSElUVEVTVDoJCS8qIDQuNzEgKi8KKworCWNhc2UgVEJfSVNCVVRUT05DSEVDS0VEOgorCSAgICByZXR1cm4gVE9PTEJBUl9Jc0J1dHRvbkNoZWNrZWQgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBUQl9JU0JVVFRPTkVOQUJMRUQ6CisJICAgIHJldHVybiBUT09MQkFSX0lzQnV0dG9uRW5hYmxlZCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIFRCX0lTQlVUVE9OSElEREVOOgorCSAgICByZXR1cm4gVE9PTEJBUl9Jc0J1dHRvbkhpZGRlbiAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIFRCX0lTQlVUVE9OSElHSExJR0hURUQ6CisJICAgIHJldHVybiBUT09MQkFSX0lzQnV0dG9uSGlnaGxpZ2h0ZWQgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBUQl9JU0JVVFRPTklOREVURVJNSU5BVEU6CisJICAgIHJldHVybiBUT09MQkFSX0lzQnV0dG9uSW5kZXRlcm1pbmF0ZSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIFRCX0lTQlVUVE9OUFJFU1NFRDoKKwkgICAgcmV0dXJuIFRPT0xCQVJfSXNCdXR0b25QcmVzc2VkICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBUQl9MT0FESU1BR0VTOgkJCS8qIDQuNzAgKi8KKy8vCWNhc2UgVEJfTUFQQUNDRUxFUkFUT1I6CQkJLyogNC43MSAqLworCisvLwljYXNlIFRCX01BUktCVVRUT046CQkJLyogNC43MSAqLworLy8JICAgIHJldHVybiBUT09MQkFSX01hcmtCdXR0b24gKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisvLwljYXNlIFRCX01PVkVCVVRUT046CQkJLyogNC43MSAqLworCisJY2FzZSBUQl9QUkVTU0JVVFRPTjoKKwkgICAgcmV0dXJuIFRPT0xCQVJfUHJlc3NCdXR0b24gKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisvLwljYXNlIFRCX1JFUExBQ0VCSVRNQVA6CisvLwljYXNlIFRCX1NBVkVSRVNUT1JFOgorLy8JY2FzZSBUQl9TRVRBTkNIT1JISUdITElHSFQ6CQkvKiA0LjcxICovCisKKwljYXNlIFRCX1NFVEJJVE1BUFNJWkU6CisJICAgIHJldHVybiBUT09MQkFSX1NldEJpdG1hcFNpemUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisvLwljYXNlIFRCX1NFVEJVVFRPTklORk86CQkJLyogNC43MSAqLworCisJY2FzZSBUQl9TRVRCVVRUT05TSVpFOgorCSAgICByZXR1cm4gVE9PTEJBUl9TZXRCdXR0b25TaXplICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBUQl9TRVRCVVRUT05XSURUSDoJCQkvKiA0LjcwICovCisKKwljYXNlIFRCX1NFVENNRElEOgorCSAgICByZXR1cm4gVE9PTEJBUl9TZXRDbWRJZCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKy8vCWNhc2UgVEJfU0VUQ09MT1JTQ0hFTUU6CQkJLyogNC43MSAqLworLy8JY2FzZSBUQl9TRVRESVNBQkxFRElNQUdFTElTVDoJCS8qIDQuNzAgKi8KKy8vCWNhc2UgVEJfU0VURFJBV1RFWFRGTEFHUzoJCS8qIDQuNzEgKi8KKy8vCWNhc2UgVEJfU0VURVhURU5ERURTVFlMRToJCS8qIDQuNzEgKi8KKy8vCWNhc2UgVEJfU0VUSE9USU1BR0VMSVNUOgkJLyogNC43MCAqLworLy8JY2FzZSBUQl9TRVRIT1RJVEVNOgkJCS8qIDQuNzEgKi8KKy8vCWNhc2UgVEJfU0VUSU1BR0VMSVNUOgkJCS8qIDQuNzAgKi8KKworCWNhc2UgVEJfU0VUSU5ERU5UOgorCSAgICByZXR1cm4gVE9PTEJBUl9TZXRJbmRlbnQgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisvLwljYXNlIFRCX1NFVElOU0VSVE1BUks6CQkJLyogNC43MSAqLworLy8JY2FzZSBUQl9TRVRJTlNFUlRNQVJLQ09MT1I6CQkvKiA0LjcxICovCisvLwljYXNlIFRCX1NFVE1BWFRFWFRST1dTOgkJCS8qIDQuNzAgKi8KKy8vCWNhc2UgVEJfU0VUUEFERElORzoJCQkvKiA0LjcxICovCisvLwljYXNlIFRCX1NFVFBBUkVOVDoKKy8vCWNhc2UgVEJfU0VUUk9XUzoKKworCWNhc2UgVEJfU0VUU1RBVEU6CisJICAgIHJldHVybiBUT09MQkFSX1NldFN0YXRlICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgVEJfU0VUU1RZTEU6CisJICAgIHJldHVybiBUT09MQkFSX1NldFN0eWxlICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBUQl9TRVRUT09MVElQUzoKKy8vCWNhc2UgVEJfU0VUVU5JQ09ERUZPUk1BVDoKKworCWNhc2UgV01fQ1JFQVRFOgorCSAgICByZXR1cm4gVE9PTEJBUl9DcmVhdGUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBXTV9ERVNUUk9ZOgorCSAgICByZXR1cm4gVE9PTEJBUl9EZXN0cm95ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgV01fTEJVVFRPTkRCTENMSzoKKwkgICAgcmV0dXJuIFRPT0xCQVJfTEJ1dHRvbkRibENsayAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIFdNX0xCVVRUT05ET1dOOgorCSAgICByZXR1cm4gVE9PTEJBUl9MQnV0dG9uRG93biAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIFdNX0xCVVRUT05VUDoKKwkgICAgcmV0dXJuIFRPT0xCQVJfTEJ1dHRvblVwICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgV01fTU9VU0VNT1ZFOgorCSAgICByZXR1cm4gVE9PTEJBUl9Nb3VzZU1vdmUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisvLwljYXNlIFdNX05DQUNUSVZBVEU6CisvLwkgICAgcmV0dXJuIFRPT0xCQVJfTkNBY3RpdmF0ZSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIFdNX05DQ0FMQ1NJWkU6CisJICAgIHJldHVybiBUT09MQkFSX05DQ2FsY1NpemUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBXTV9OQ1BBSU5UOgorCSAgICByZXR1cm4gVE9PTEJBUl9OQ1BhaW50ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBXTV9OT1RJRlk6CisKKwljYXNlIFdNX1BBSU5UOgorCSAgICByZXR1cm4gVE9PTEJBUl9QYWludCAod25kUHRyLCB3UGFyYW0pOworCisJY2FzZSBXTV9TSVpFOgorCSAgICByZXR1cm4gVE9PTEJBUl9TaXplICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBXTV9TWVNDT0xPUkNIQU5HRToKKworLy8JY2FzZSBXTV9XSU5JTklDSEFOR0U6CisKKwljYXNlIFdNX0NIQVJUT0lURU06CisJY2FzZSBXTV9DT01NQU5EOgorCWNhc2UgV01fRFJBV0lURU06CisJY2FzZSBXTV9NRUFTVVJFSVRFTToKKwljYXNlIFdNX1ZLRVlUT0lURU06CisJICAgIHJldHVybiBTZW5kTWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKGh3bmQpLCB1TXNnLCB3UGFyYW0sIGxQYXJhbSk7CisKKwlkZWZhdWx0OgorCSAgICBpZiAodU1zZyA+PSBXTV9VU0VSKQorCQlFUlIgKHRvb2xiYXIsICJ1bmtub3duIG1zZyAlMDR4IHdwPSUwOHggbHA9JTA4bHhcbiIsCisJCSAgICAgdU1zZywgd1BhcmFtLCBsUGFyYW0pOworCSAgICByZXR1cm4gRGVmV2luZG93UHJvYzMyQSAoaHduZCwgdU1zZywgd1BhcmFtLCBsUGFyYW0pOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCit2b2lkCitUT09MQkFSX1JlZ2lzdGVyICh2b2lkKQoreworICAgIFdORENMQVNTMzJBIHduZENsYXNzOworCisgICAgaWYgKEdsb2JhbEZpbmRBdG9tMzJBIChUT09MQkFSQ0xBU1NOQU1FMzJBKSkgcmV0dXJuOworCisgICAgWmVyb01lbW9yeSAoJnduZENsYXNzLCBzaXplb2YoV05EQ0xBU1MzMkEpKTsKKyAgICB3bmRDbGFzcy5zdHlsZSAgICAgICAgID0gQ1NfR0xPQkFMQ0xBU1MgfCBDU19EQkxDTEtTOworICAgIHduZENsYXNzLmxwZm5XbmRQcm9jICAgPSAoV05EUFJPQzMyKVRvb2xiYXJXaW5kb3dQcm9jOworICAgIHduZENsYXNzLmNiQ2xzRXh0cmEgICAgPSAwOworICAgIHduZENsYXNzLmNiV25kRXh0cmEgICAgPSBzaXplb2YoVE9PTEJBUl9JTkZPICopOworICAgIHduZENsYXNzLmhDdXJzb3IgICAgICAgPSBMb2FkQ3Vyc29yMzJBICgwLCBJRENfQVJST1czMkEpOworICAgIHduZENsYXNzLmhickJhY2tncm91bmQgPSAoSEJSVVNIMzIpKENPTE9SXzNERkFDRSArIDEpOworICAgIHduZENsYXNzLmxwc3pDbGFzc05hbWUgPSBUT09MQkFSQ0xBU1NOQU1FMzJBOworIAorICAgIFJlZ2lzdGVyQ2xhc3MzMkEgKCZ3bmRDbGFzcyk7Cit9CisKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3VpdG9vbHMuYyBiL2NvbnRyb2xzL3VpdG9vbHMuYwppbmRleCBkZDU4NjY4Li4wMTY5YjAwIDEwMDY0NAotLS0gYS9jb250cm9scy91aXRvb2xzLmMKKysrIGIvY29udHJvbHMvdWl0b29scy5jCkBAIC01LDcgKzUsNiBAQAogICogQ29weXJpZ2h0IDE5OTcgQmVydGhvIEEuIFN0dWx0aWVucwogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCmRpZmYgLS1naXQgYS9jb250cm9scy91cGRvd24uYyBiL2NvbnRyb2xzL3VwZG93bi5jCmluZGV4IDY2YzI1MzIuLmQ3MWJhOWQgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3VwZG93bi5jCisrKyBiL2NvbnRyb2xzL3VwZG93bi5jCkBAIC0yNSw3ICsyNSw2IEBACiAgKi8KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZGJfZGlzYXNtLmMgYi9kZWJ1Z2dlci9kYl9kaXNhc20uYwppbmRleCAwNTY4NmE3Li42NWZiOWU1IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9kYl9kaXNhc20uYworKysgYi9kZWJ1Z2dlci9kYl9kaXNhc20uYwpAQCAtMjUsNyArMjUsNyBAQAogICovCiAvKgogICogSElTVE9SWQotICogJExvZzoJZGJfZGlzYXNtLmMsdiAkCisgKgogICogUmV2aXNpb24gMi42ICA5Mi8wMS8wMyAgMjA6MDU6MDAgIGRiZwogICogCUFkZCBhIHN3aXRjaCB0byBkaXNhc3NlbWJsZSAxNi1iaXQgY29kZS4KICAqIAlGaXggc3BlbGxpbmcgb2YgJ2xvZHMnIG9wY29kZXMuCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9kYmcueSBiL2RlYnVnZ2VyL2RiZy55CmluZGV4IDdhMDZjNDAuLjE0ZmQzYjAgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2RiZy55CisrKyBiL2RlYnVnZ2VyL2RiZy55CkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJ3aW5iYXNlLmgiCiAjaW5jbHVkZSAiY2xhc3MuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCkBAIC01NjUsMjAgKzU2NiwyMCBAQAogCiB2b2lkIHdpbmVfZGVidWcoIGludCBzaWduYWwsIFNJR0NPTlRFWFQgKnJlZ3MgKQogewotICAgIERFQlVHX1NldFNpZ0NvbnRleHQoIHJlZ3MgKTsKICNpZiAwCi0gICAgRFdPUkQgKnN0YWNrID0gKERXT1JEICopRVNQX3JlZygmREVCVUdfY29udGV4dCk7CisgICAgRFdPUkQgKnN0YWNrID0gKERXT1JEICopRVNQX3NpZyhyZWdzKTsKICAgICAqKC0tc3RhY2spID0gMDsKICAgICAqKC0tc3RhY2spID0gMDsKICAgICAqKC0tc3RhY2spID0gRUhfTk9OQ09OVElOVUFCTEU7CiAgICAgKigtLXN0YWNrKSA9IEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OOwotICAgICooLS1zdGFjaykgPSBFSVBfcmVnKCZERUJVR19jb250ZXh0KTsKLSAgICBFU1BfcmVnKCZERUJVR19jb250ZXh0KSA9IChEV09SRClzdGFjazsKLSAgICBFSVBfcmVnKCZERUJVR19jb250ZXh0KSA9IEdldFByb2NBZGRyZXNzMzIoIEdldE1vZHVsZUhhbmRsZSgiS0VSTkVMMzIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYWlzZUV4Y2VwdGlvbiIgKTsKLSNlbmRpZgorICAgICooLS1zdGFjaykgPSBFSVBfc2lnKHJlZ3MpOworICAgIEVTUF9zaWcocmVncykgPSAoRFdPUkQpc3RhY2s7CisgICAgRUlQX3NpZyhyZWdzKSA9IChEV09SRClSYWlzZUV4Y2VwdGlvbjsKKyNlbHNlCisgICAgREVCVUdfU2V0U2lnQ29udGV4dCggcmVncyApOwogICAgIERFQlVHX01haW4oIHNpZ25hbCApOwogICAgIERFQlVHX0dldFNpZ0NvbnRleHQoIHJlZ3MgKTsKKyNlbmRpZgogfQogCiBpbnQgeXllcnJvcihjaGFyICogcykKQEAgLTU4Niw0ICs1ODcsMyBAQAogCWZwcmludGYoc3RkZXJyLCIlc1xuIiwgcyk7CiAgICAgICAgIHJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9zdGFicy5jIGIvZGVidWdnZXIvc3RhYnMuYwppbmRleCAzNmZiZTJjLi4zYWYxZWY5IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9zdGFicy5jCisrKyBiL2RlYnVnZ2VyL3N0YWJzLmMKQEAgLTYsNiArNiw3IEBACiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KQEAgLTEyOCwxNCArMTI5LDg1IEBACiAgICAqICc6Jy4KICAgICovCiAgIHdoaWxlKCpzb3VyY2UgIT0gJ1wwJyAmJiAqc291cmNlICE9ICc6JykKLSAgICB7CiAgICAgICAqZGVzdCsrID0gKnNvdXJjZSsrOwotICAgIH0KICAgKmRlc3QrKyA9ICdcMCc7CiB9CiAKICNkZWZpbmUgTUFYX1REX05FU1RJTkcJMTI4CiAKK3N0YXRpYyBpbnQgKip0eXBlbnVtczsKK3N0YXRpYyBpbnQgKm5yb2Z0eXBlbnVtcz1OVUxMOworc3RhdGljIGludCBucm9mbnJvZnR5cGVudW1zPTA7CitzdGF0aWMgaW50IGN1cnR5cGVudW0gPSAwOworCitzdGF0aWMKK2ludAorREVCVUdfRmlsZVN1Yk5yMlN0YWJFbnVtKGludCBmaWxlbnIsaW50IHN1Ym5yKSB7CisgICAgaWYgKG5yb2Zucm9mdHlwZW51bXM8PWZpbGVucikgeworICAgIAlucm9mdHlwZW51bXMgPSB4cmVhbGxvYyhucm9mdHlwZW51bXMsc2l6ZW9mKG5yb2Z0eXBlbnVtc1swXSkqKGZpbGVucisxKSk7CisJbWVtc2V0KG5yb2Z0eXBlbnVtcytucm9mbnJvZnR5cGVudW1zLDAsKGZpbGVucisxLW5yb2Zucm9mdHlwZW51bXMpKnNpemVvZihucm9mdHlwZW51bXNbMF0pKTsKKwl0eXBlbnVtcyA9IHhyZWFsbG9jKHR5cGVudW1zLHNpemVvZih0eXBlbnVtc1swXSkqKGZpbGVucisxKSk7CisJbWVtc2V0KHR5cGVudW1zK25yb2Zucm9mdHlwZW51bXMsMCxzaXplb2YodHlwZW51bXNbMF0pKihmaWxlbnIrMS1ucm9mbnJvZnR5cGVudW1zKSk7CisJbnJvZm5yb2Z0eXBlbnVtcz1maWxlbnIrMTsKKyAgICB9CisgICAgaWYgKG5yb2Z0eXBlbnVtc1tmaWxlbnJdPD1zdWJucikgeworICAgIAl0eXBlbnVtc1tmaWxlbnJdID0geHJlYWxsb2ModHlwZW51bXNbZmlsZW5yXSxzaXplb2YodHlwZW51bXNbMF1bMF0pKihzdWJucisxKSk7CisJbWVtc2V0KHR5cGVudW1zW2ZpbGVucl0rbnJvZnR5cGVudW1zW2ZpbGVucl0sMCxzaXplb2YodHlwZW51bXNbMF1bMF0pKihzdWJucisxLW5yb2Z0eXBlbnVtc1tmaWxlbnJdKSk7CisJbnJvZnR5cGVudW1zW2ZpbGVucl0gPSBzdWJucisxOworICAgIH0KKyAgICBpZiAoIXR5cGVudW1zW2ZpbGVucl1bc3VibnJdKQorICAgIAl0eXBlbnVtc1tmaWxlbnJdW3N1Ym5yXT0rK2N1cnR5cGVudW07CisKKyAgICBpZiggbnVtX3N0YWJfdHlwZXMgPD0gY3VydHlwZW51bSApIHsKKwludW1fc3RhYl90eXBlcyA9IGN1cnR5cGVudW0gKyAyNTY7CisJc3RhYl90eXBlcyA9IChzdHJ1Y3QgZGF0YXR5cGUgKiopIHhyZWFsbG9jKHN0YWJfdHlwZXMsIAorCQkgICAgbnVtX3N0YWJfdHlwZXMgKiBzaXplb2Yoc3RydWN0IGRhdGF0eXBlICopCisJKTsKKyAgICB9CisgICAgLy9mcHJpbnRmKHN0ZGVyciwiKCVkLCVkKSBpcyAlZFxuIixmaWxlbnIsc3VibnIsdHlwZW51bXNbZmlsZW5yXVtzdWJucl0pOworICAgIHJldHVybiB0eXBlbnVtc1tmaWxlbnJdW3N1Ym5yXTsKK30KKworc3RhdGljCitpbnQKK0RFQlVHX1JlYWRUeXBlRW51bUJhY2t3YXJkcyhjaGFyKngpIHsKKyAgICBpbnQJZmlsZW5yLHN1Ym5yOworCisgICAgaWYgKCp4PT0nKScpIHsKKwl3aGlsZSAoKnghPScoJykKKwkgICAgeC0tOworCXgrKzsJCQkJLyogJygnICovCisJZmlsZW5yPXN0cnRvbCh4LCZ4LDEwKTsJCS8qIDxpbnQ+ICovCisJYXNzZXJ0KCooeCsrKT09JywnKTsJCS8qICcsJyAqLworCXN1Ym5yPXN0cnRvbCh4LCZ4LDEwKTsJCS8qIDxpbnQ+ICovCisJYXNzZXJ0KCooeCsrKT09JyknKTsJCS8qICcpJyAqLworICAgIH0gZWxzZSB7CisJd2hpbGUgKCgqeD49JzAnKSAmJiAoKng8PSc5JykpCisJICAgIHgtLTsKKwlmaWxlbnIgPSAwOworCXN1Ym5yID0gYXRvbCh4KzEpOworICAgIH0KKyAgICByZXR1cm4gREVCVUdfRmlsZVN1Yk5yMlN0YWJFbnVtKGZpbGVucixzdWJucik7Cit9CisKK3N0YXRpYyAKK2ludAorREVCVUdfUmVhZFR5cGVFbnVtKGNoYXIgKip4KSB7CisgICAgaW50IGZpbGVucixzdWJucjsKKworICAgIGlmICgqKng9PScoJykgeworCSgqeCkrKzsJCQkJCS8qICcoJyAqLworCWZpbGVucj1zdHJ0b2woKngseCwxMCk7CQkJLyogPGludD4gKi8KKwkoKngpKys7CQkJCQkvKiAnLCcgKi8KKwlzdWJucj1zdHJ0b2woKngseCwxMCk7CQkJLyogPGludD4gKi8KKwkoKngpKys7CQkJCQkvKiAnKScgKi8KKyAgICB9IGVsc2UgeworICAgIAlmaWxlbnIgPSAwOworCXN1Ym5yID0gc3RydG9sKCp4LHgsMTApOwkJLyogPGludD4gKi8KKyAgICB9CisgICAgcmV0dXJuIERFQlVHX0ZpbGVTdWJOcjJTdGFiRW51bShmaWxlbnIsc3VibnIpOworfQorCiBzdGF0aWMKIGludAogREVCVUdfUmVnaXN0ZXJUeXBlZGVmKGNvbnN0IGNoYXIgKiBuYW1lLCBzdHJ1Y3QgZGF0YXR5cGUgKiogdHlwZXMsIGludCBuZGVmKQpAQCAtMTQ0LDEyICsyMTYsMTAgQEAKICAgc3RydWN0IGtub3duX3R5cGVkZWYgKiBrdGQ7CiAKICAgaWYoIG5kZWYgPT0gMSApCi0gICAgewogICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQogCi0gIGt0ZCA9IChzdHJ1Y3Qga25vd25fdHlwZWRlZiAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBrbm93bl90eXBlZGVmKSAKLQkJCQkJKyBuZGVmICogc2l6ZW9mKHN0cnVjdCBkYXRhdHlwZSAqKSk7CisgIGt0ZCA9IChzdHJ1Y3Qga25vd25fdHlwZWRlZiAqKSB4bWFsbG9jKHNpemVvZihzdHJ1Y3Qga25vd25fdHlwZWRlZikgCisJCQkJCSArIG5kZWYgKiBzaXplb2Yoc3RydWN0IGRhdGF0eXBlICopKTsKICAgCiAgIGhhc2ggPSBzdGFiX2hhc2gobmFtZSk7CiAKQEAgLTE3MSwyNyArMjQxLDE4IEBACiAgIGludAkJCSBoYXNoOwogICBzdHJ1Y3Qga25vd25fdHlwZWRlZiAqIGt0ZDsKICAgY2hhcgkJICAgICAgICogcHRyOwotICBjaGFyCQkgICAgICAgKiB0YzsKLSAgaW50CQkJIHR5cGVudW07CiAKICAgaGFzaCA9IHN0YWJfaGFzaChuYW1lKTsKIAogICBmb3Ioa3RkID0ga3RkX2hlYWRbaGFzaF07IGt0ZDsga3RkID0ga3RkLT5uZXh0KQotICAgIHsKLSAgICAgIGlmKCAgICAoa3RkLT5uYW1lWzBdID09IG5hbWVbMF0pCi0JICAmJiAoc3RyY21wKG5hbWUsIGt0ZC0+bmFtZSkgPT0gMCkgKQotCXsKKyAgICAgIGlmICgoa3RkLT5uYW1lWzBdID09IG5hbWVbMF0pICYmIChzdHJjbXAobmFtZSwga3RkLT5uYW1lKSA9PSAwKSApCiAJICBicmVhazsKLQl9Ci0gICAgfQogCiAgIC8qCiAgICAqIERpZG4ndCBmaW5kIGl0LiAgVGhpcyBtdXN0IGJlIGEgbmV3IG9uZS4KICAgICovCiAgIGlmKCBrdGQgPT0gTlVMTCApCi0gICAgewogICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KIAogICAvKgogICAgKiBFeGFtaW5lIHRoZSBzdGFiIHRvIG1ha2Ugc3VyZSBpdCBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIGRlZmluaXRpb25zLgpAQCAtMjAwLDkgKzI2MSw3IEBACiAgIGZvcihwdHIgPSBzdHJjaHIoc3RhYiwgJz0nKTsgcHRyOyBwdHIgPSBzdHJjaHIocHRyKzEsICc9JykpCiAgICAgewogICAgICAgaWYoIGNvdW50ID49IGt0ZC0+bmRlZnMgKQotCXsKIAkgIHJldHVybiBGQUxTRTsKLQl9CiAKICAgICAgIC8qCiAgICAgICAgKiBNYWtlIHN1cmUgdGhlIHR5cGVzIG9mIGFsbCBvZiB0aGUgb2JqZWN0cyBpcyBjb25zaXN0ZW50IHdpdGgKQEAgLTIyMSw2ICsyODAsNyBAQAogCSAgZXhwZWN0ID0gQVJSQVk7CiAJICBicmVhazsKIAljYXNlICcxJzoKKwljYXNlICcoJzoKIAljYXNlICdyJzoKIAkgIGV4cGVjdCA9IEJBU0lDOwogCSAgYnJlYWs7CkBAIC0yMzQsNTIgKzI5NCwyNCBAQAogCSAgZXhwZWN0ID0gRlVOQzsKIAkgIGJyZWFrOwogCWRlZmF1bHQ6Ci0JICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gdHlwZS5cbiIpOworCSAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIHR5cGUgKCVjKS5cbiIscHRyWzFdKTsKICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAJfQogICAgICAgaWYoIGV4cGVjdCAhPSBERUJVR19HZXRUeXBlKGt0ZC0+dHlwZXNbY291bnRdKSApCi0JewogCSAgcmV0dXJuIEZBTFNFOwotCX0KICAgICAgIGNvdW50Kys7CiAgICAgfQogCiAgIGlmKCBrdGQtPm5kZWZzICE9IGNvdW50ICkKLSAgICB7CiAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQogCiAgIC8qCi0gICAqIE9LLCB0aGlzIG9uZSBpcyBzYWZlLiAgR28gdGhyb3VnaCwgZGlnIG91dCBhbGwgb2YgdGhlIHR5cGUgbnVtYmVycywKLSAgICogYW5kIHN1YnN0aXR1dGUgdGhlIGFwcHJvcHJpYXRlIHRoaW5ncy4KKyAgICogR28gdGhyb3VnaCwgZGlnIG91dCBhbGwgb2YgdGhlIHR5cGUgbnVtYmVycywgYW5kIHN1YnN0aXR1dGUgdGhlCisgICAqIGFwcHJvcHJpYXRlIHRoaW5ncy4KICAgICovCiAgIGNvdW50ID0gMDsKICAgZm9yKHB0ciA9IHN0cmNocihzdGFiLCAnPScpOyBwdHI7IHB0ciA9IHN0cmNocihwdHIrMSwgJz0nKSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogQmFjayB1cCB1bnRpbCB3ZSBnZXQgdG8gYSBub24tbnVtZXJpYyBjaGFyYWN0ZXIuICBUaGlzIGlzIHRoZSB0eXBlCi0gICAgICAgKiBudW1iZXIuCi0gICAgICAgKi8KLSAgICAgIHRjID0gcHRyIC0gMTsKLSAgICAgIHdoaWxlKCAqdGMgPj0gJzAnICYmICp0YyA8PSAnOScgKQotCXsKLQkgIHRjLS07Ci0JfQotICAgICAgCi0gICAgICB0eXBlbnVtID0gYXRvbCh0YyArIDEpOwotICAgICAgaWYoIG51bV9zdGFiX3R5cGVzIDw9IHR5cGVudW0gKQotCXsKLQkgIG51bV9zdGFiX3R5cGVzID0gdHlwZW51bSArIDMyOwotCSAgc3RhYl90eXBlcyA9IChzdHJ1Y3QgZGF0YXR5cGUgKiopIHhyZWFsbG9jKHN0YWJfdHlwZXMsIAotCQkJCQkJICAgICBudW1fc3RhYl90eXBlcyAqIHNpemVvZihzdHJ1Y3QgZGF0YXR5cGUgKikpOwotCSAgaWYoIHN0YWJfdHlwZXMgPT0gTlVMTCApCi0JICAgIHsKLQkgICAgICByZXR1cm4gRkFMU0U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN0YWJfdHlwZXNbdHlwZW51bV0gPSBrdGQtPnR5cGVzW2NvdW50KytdOwotICAgIH0KKyAgICAgIHN0YWJfdHlwZXNbREVCVUdfUmVhZFR5cGVFbnVtQmFja3dhcmRzKHB0ci0xKV0gPSBrdGQtPnR5cGVzW2NvdW50KytdOwogCiAgIHJldHVybiBUUlVFOwogfQpAQCAtMzIyLDcgKzM1NCw2IEBACiAgIGludAkJICAgIG50eXBlcyA9IDA7CiAgIGludAkJICAgIG9mZnNldDsKICAgY29uc3QgY2hhcgkgICogb3JpZ190eXBlbmFtZTsKLSAgaW50CQkgICAgcnRuID0gRkFMU0U7CiAgIGludAkJICAgIHNpemU7CiAgIGNoYXIJCSAgKiB0YzsKICAgY2hhcgkJICAqIHRjMjsKQEAgLTMzMCwxMCArMzYxLDggQEAKIAogICBvcmlnX3R5cGVuYW1lID0gdHlwZW5hbWU7CiAKLSAgaWYoIERFQlVHX0hhbmRsZVByZXZpb3VzVHlwZWRlZih0eXBlbmFtZSwgcHRyKSA9PSBUUlVFICkKLSAgICB7CisgIGlmKCBERUJVR19IYW5kbGVQcmV2aW91c1R5cGVkZWYodHlwZW5hbWUsIHB0cikgKQogICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQogCiAgIC8qIAogICAgKiBHbyBmcm9tIGJhY2sgdG8gZnJvbnQuICBGaXJzdCB3ZSBnbyB0aHJvdWdoIGFuZCBmaWd1cmUgb3V0IHdoYXQKQEAgLTM0NywyMiArMzc2LDcgQEAKICAgICAgICAqIEJhY2sgdXAgdW50aWwgd2UgZ2V0IHRvIGEgbm9uLW51bWVyaWMgY2hhcmFjdGVyLiAgVGhpcyBpcyB0aGUgdHlwZQogICAgICAgICogbnVtYmVyLgogICAgICAgICovCi0gICAgICB0YyA9IGMgLSAxOwotICAgICAgd2hpbGUoICp0YyA+PSAnMCcgJiYgKnRjIDw9ICc5JyApCi0JewotCSAgdGMtLTsKLQl9Ci0gICAgICB0eXBlbnVtID0gYXRvbCh0YyArIDEpOwotICAgICAgaWYoIG51bV9zdGFiX3R5cGVzIDw9IHR5cGVudW0gKQotCXsKLQkgIG51bV9zdGFiX3R5cGVzID0gdHlwZW51bSArIDMyOwotCSAgc3RhYl90eXBlcyA9IChzdHJ1Y3QgZGF0YXR5cGUgKiopIHhyZWFsbG9jKHN0YWJfdHlwZXMsIAotCQkJCQkJICAgICBudW1fc3RhYl90eXBlcyAqIHNpemVvZihzdHJ1Y3QgZGF0YXR5cGUgKikpOwotCSAgaWYoIHN0YWJfdHlwZXMgPT0gTlVMTCApCi0JICAgIHsKLQkgICAgICBnb3RvIGxlYXZlOwotCSAgICB9Ci0JfQorICAgICAgdHlwZW51bSA9IERFQlVHX1JlYWRUeXBlRW51bUJhY2t3YXJkcyhjLTEpOwogCiAgICAgICBpZiggbnR5cGVzID49IE1BWF9URF9ORVNUSU5HICkKIAl7CkBAIC0zODgsNiArNDAyLDcgQEAKIAkgIHN0YWJfdHlwZXNbdHlwZW51bV0gPSBERUJVR19OZXdEYXRhVHlwZShBUlJBWSwgTlVMTCk7CiAJICBjdXJyX3R5cGVzW250eXBlcysrXSA9IHN0YWJfdHlwZXNbdHlwZW51bV07CiAJICBicmVhazsKKwljYXNlICcoJzoKIAljYXNlICcxJzoKIAljYXNlICdyJzoKIAkgIHN0YWJfdHlwZXNbdHlwZW51bV0gPSBERUJVR19OZXdEYXRhVHlwZShCQVNJQywgdHlwZW5hbWUpOwpAQCAtNDA3LDcgKzQyMiw3IEBACiAJICBjdXJyX3R5cGVzW250eXBlcysrXSA9IHN0YWJfdHlwZXNbdHlwZW51bV07CiAJICBicmVhazsKIAlkZWZhdWx0OgotCSAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIHR5cGUuXG4iKTsKKwkgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biB0eXBlICglYykuXG4iLGNbMV0pOwogCX0KICAgICAgIHR5cGVuYW1lID0gTlVMTDsKICAgICB9CkBAIC00MjYsMTYgKzQ0MSw3IEBACiAgICAgICAqLwogICAgICBmb3IoIGMgPSBzdHJyY2hyKHB0ciwgJz0nKTsgYyAhPSBOVUxMOyBjID0gc3RycmNocihwdHIsICc9JykgKQogICAgICAgIHsKLQkgLyoKLQkgICogQmFjayB1cCB1bnRpbCB3ZSBnZXQgdG8gYSBub24tbnVtZXJpYyBjaGFyYWN0ZXIuICBUaGlzIGlzIHRoZSB0eXBlCi0JICAqIG51bWJlci4KLQkgICovCi0JIHRjID0gYyAtIDE7Ci0JIHdoaWxlKCAqdGMgPj0gJzAnICYmICp0YyA8PSAnOScgKQotCSAgIHsKLQkgICAgIHRjLS07Ci0JICAgfQotCSB0eXBlbnVtID0gYXRvbCh0YyArIDEpOworICAgICAgICAgaW50IHR5cGVudW0gPSBERUJVR19SZWFkVHlwZUVudW1CYWNrd2FyZHMoYy0xKTsKIAkgY3Vycl90eXBlID0gc3RhYl90eXBlc1t0eXBlbnVtXTsKIAkgCiAJIHN3aXRjaChjWzFdKQpAQCAtNDQzLDM0ICs0NDksMjQgQEAKIAkgICBjYXNlICd4JzoKIAkgICAgIHRjID0gYyArIDM7CiAJICAgICB3aGlsZSggKnRjICE9ICc6JyApCi0JICAgICAgIHsKLQkJIHRjICsrOwotCSAgICAgICB9CisJCSB0YysrOwogCSAgICAgdGMrKzsKIAkgICAgIGlmKCAqdGMgPT0gJ1wwJyApCi0JICAgICAgIHsKIAkJICpjID0gJ1wwJzsKLQkgICAgICAgfQogCSAgICAgZWxzZQotCSAgICAgICB7CiAJCSBzdHJjcHkoYywgdGMpOwotCSAgICAgICB9Ci0JICAgICAKIAkgICAgIGJyZWFrOwogCSAgIGNhc2UgJyonOgogCSAgIGNhc2UgJ2YnOgogCSAgICAgdGMgPSBjICsgMjsKLQkgICAgIGRhdGF0eXBlID0gc3RhYl90eXBlc1tzdHJ0b2wodGMsICZ0YywgMTApXTsKKwkgICAgIGRhdGF0eXBlID0gc3RhYl90eXBlc1tERUJVR19SZWFkVHlwZUVudW0oJnRjKV07CiAJICAgICBERUJVR19TZXRQb2ludGVyVHlwZShjdXJyX3R5cGUsIGRhdGF0eXBlKTsKIAkgICAgIGlmKCAqdGMgPT0gJ1wwJyApCi0JICAgICAgIHsKIAkJICpjID0gJ1wwJzsKLQkgICAgICAgfQogCSAgICAgZWxzZQotCSAgICAgICB7CiAJCSBzdHJjcHkoYywgdGMpOwotCSAgICAgICB9CiAJICAgICBicmVhazsKKwkgICBjYXNlICcoJzoKIAkgICBjYXNlICcxJzoKIAkgICBjYXNlICdyJzoKIAkgICAgIC8qCkBAIC00NzksMjUgKzQ3NSwyNyBAQAogCSAgICAgKmMgPSAnXDAnOwogCSAgICAgYnJlYWs7CiAJICAgY2FzZSAnYSc6Ci0JICAgICB0YyAgPSBjICsgNTsKLQkgICAgIGFycm1pbiA9IHN0cnRvbCh0YywgJnRjLCAxMCk7Ci0JICAgICB0YysrOwotCSAgICAgYXJybWF4ID0gc3RydG9sKHRjLCAmdGMsIDEwKTsKLQkgICAgIHRjKys7Ci0JICAgICBkYXRhdHlwZSA9IHN0YWJfdHlwZXNbc3RydG9sKHRjLCAmdGMsIDEwKV07CisJICAgICAvKiBhcjx0eXBlaW5mb19ub2RlZj47PGludD47PGludD47PHR5cGVpbmZvPiw8aW50Piw8aW50Pjs7ICovCisKKwkgICAgIHRjICA9IGMgKyAzOworCSAgICAgYXNzZXJ0KGNbMl09PSdyJyk7CisJICAgICBERUJVR19SZWFkVHlwZUVudW0oJnRjKTsKKwkgICAgIGFzc2VydCgqKHRjKyspPT0nOycpOyAJCQkvKiAnOycgKi8KKwkgICAgIGFycm1pbiA9IHN0cnRvbCh0YywgJnRjLCAxMCk7IAkJLyogPGludD4gKi8KKwkgICAgIGFzc2VydCgqKHRjKyspPT0nOycpOyAJCQkvKiAnOycgKi8KKwkgICAgIGFycm1heCA9IHN0cnRvbCh0YywgJnRjLCAxMCk7CQkvKiA8aW50PiAqLworCSAgICAgYXNzZXJ0KCoodGMrKyk9PSc7Jyk7IAkJCS8qICc7JyAqLworCSAgICAgZGF0YXR5cGUgPSBzdGFiX3R5cGVzW0RFQlVHX1JlYWRUeXBlRW51bSgmdGMpXTsgLyogPHR5cGVpbmZvPiAqLwogCSAgICAgaWYoICp0YyA9PSAnXDAnICkKLQkgICAgICAgewogCQkgKmMgPSAnXDAnOwotCSAgICAgICB9CiAJICAgICBlbHNlCi0JICAgICAgIHsKIAkJIHN0cmNweShjLCB0Yyk7Ci0JICAgICAgIH0KLQkgICAgIAogCSAgICAgREVCVUdfU2V0QXJyYXlQYXJhbXMoY3Vycl90eXBlLCBhcnJtaW4sIGFycm1heCwgZGF0YXR5cGUpOwogCSAgICAgYnJlYWs7CiAJICAgY2FzZSAncyc6Ci0JICAgY2FzZSAndSc6CisJICAgY2FzZSAndSc6IHsKKwkgICAgIGludCBmYWlsdXJlID0gMDsKKwogCSAgICAgdGMgPSBjICsgMjsKIAkgICAgIGlmKCBERUJVR19TZXRTdHJ1Y3RTaXplKGN1cnJfdHlwZSwgc3RydG9sKHRjLCAmdGMsIDEwKSkgPT0gRkFMU0UgKQogCSAgICAgICB7CkBAIC01MDYsMjAgKzUwNCwxNCBAQAogCQkgICogc28ganVzdCBza2lwIGZvcndhcmQgdG8gdGhlIGVuZCBvZiB0aGUgZGVmaW5pdGlvbi4KIAkJICAqLwogCQkgd2hpbGUoIHRjWzBdICE9ICc7JyAmJiB0Y1sxXSAhPSAnOycgKQotCQkgICB7CiAJCSAgICAgdGMrKzsKLQkJICAgfQogCQkgCiAJCSB0YyArPSAyOwogCQkgCiAJCSBpZiggKnRjID09ICdcMCcgKQotCQkgICB7CiAJCSAgICAgKmMgPSAnXDAnOwotCQkgICB9CiAJCSBlbHNlCi0JCSAgIHsKIAkJICAgICBzdHJjcHkoYywgdGMgKyAxKTsKLQkJICAgfQogCQkgY29udGludWU7CiAJICAgICAgIH0KIApAQCAtNTI4LDMwICs1MjAsNDQgQEAKIAkgICAgICAqLwogCSAgICAgd2hpbGUoKnRjICE9ICc7JykKIAkgICAgICAgeworCSAgICAgICAgIGNoYXIgKnRpOwogCQkgdGMyID0gZWxlbWVudF9uYW1lOwogCQkgd2hpbGUoKnRjICE9ICc6JykKLQkJICAgewogCQkgICAgICp0YzIrKyA9ICp0YysrOwotCQkgICB9CiAJCSB0YysrOwogCQkgKnRjMisrID0gJ1wwJzsKLQkJIGRhdGF0eXBlID0gc3RhYl90eXBlc1tzdHJ0b2wodGMsICZ0YywgMTApXTsKKwkJIHRpPXRjOworCQkgZGF0YXR5cGUgPSBzdGFiX3R5cGVzW0RFQlVHX1JlYWRUeXBlRW51bSgmdGMpXTsKKwkJICp0Yz0nXDAnOwogCQkgdGMrKzsKIAkJIG9mZnNldCAgPSBzdHJ0b2wodGMsICZ0YywgMTApOwogCQkgdGMrKzsKIAkJIHNpemUgID0gc3RydG9sKHRjLCAmdGMsIDEwKTsKIAkJIHRjKys7Ci0JCSBERUJVR19BZGRTdHJ1Y3RFbGVtZW50KGN1cnJfdHlwZSwgZWxlbWVudF9uYW1lLCBkYXRhdHlwZSwgb2Zmc2V0LCBzaXplKTsKKwkJIGlmIChkYXRhdHlwZSkKKwkJICAgIERFQlVHX0FkZFN0cnVjdEVsZW1lbnQoY3Vycl90eXBlLCBlbGVtZW50X25hbWUsIGRhdGF0eXBlLCBvZmZzZXQsIHNpemUpOworCQkgZWxzZSB7CisJCSAgICBmYWlsdXJlID0gMTsKKwkJICAgIC8qIC4uLiBidXQgcHJvY2VlZCBwYXJzaW5nIHRvIHRoZSBlbmQgb2YgdGhlIHN0YWIgKi8KKwkJIH0KIAkgICAgICAgfQorCisJICAgICBpZiAoZmFpbHVyZSkgeworCSAgICAgICAgLyogaWYgd2UgaGFkIGEgdW5kZWNsYXJlZCB2YWx1ZSB0aGlzIG9uZSBpcyB1bmRlY2xhcmVkIHRvby4KKwkJICogcmVtb3ZlIGl0IGZyb20gdGhlIHN0YWJfdHlwZXMuIAorCQkgKiBJIGp1c3Qgc2V0IGl0IHRvIE5VTEwgdG8gZGV0ZWN0IGJ1Z3MgaW4gbXkgdGhvdWdodHByb2Nlc3MuCisJCSAqIEZJWE1FOiBsZWFrcyB0aGUgbWVtb3J5IGZvciB0aGUgc3RydWN0dXJlIGVsZW1lbnRzLgorCQkgKiBGSVhNRTogc3VjaCBzdHJ1Y3R1cmVzIHNob3VsZCBoYXZlIGJlZW4gb3B0aW1pemVkIGF3YXkKKwkJICogICAgICAgIGJ5IGxkLgorCQkgKi8KKwkgICAgIAlzdGFiX3R5cGVzW3R5cGVudW1dID0gTlVMTDsKKwkgICAgIH0KIAkgICAgIGlmKCAqdGMgPT0gJ1wwJyApCi0JICAgICAgIHsKIAkJICpjID0gJ1wwJzsKLQkgICAgICAgfQogCSAgICAgZWxzZQotCSAgICAgICB7CiAJCSBzdHJjcHkoYywgdGMgKyAxKTsKLQkgICAgICAgfQogCSAgICAgYnJlYWs7CisJICAgfQogCSAgIGNhc2UgJ2UnOgogCSAgICAgdGMgPSBjICsgMjsKIAkgICAgIC8qCkBAIC01NjEsOSArNTY3LDcgQEAKIAkgICAgICAgewogCQkgdGMyID0gZWxlbWVudF9uYW1lOwogCQkgd2hpbGUoKnRjICE9ICc6JykKLQkJICAgewogCQkgICAgICp0YzIrKyA9ICp0YysrOwotCQkgICB9CiAJCSB0YysrOwogCQkgKnRjMisrID0gJ1wwJzsKIAkJIG9mZnNldCAgPSBzdHJ0b2wodGMsICZ0YywgMTApOwpAQCAtNTcxLDI1ICs1NzUsMTcgQEAKIAkJIERFQlVHX0FkZFN0cnVjdEVsZW1lbnQoY3Vycl90eXBlLCBlbGVtZW50X25hbWUsIE5VTEwsIG9mZnNldCwgMCk7CiAJICAgICAgIH0KIAkgICAgIGlmKCAqdGMgPT0gJ1wwJyApCi0JICAgICAgIHsKIAkJICpjID0gJ1wwJzsKLQkgICAgICAgfQogCSAgICAgZWxzZQotCSAgICAgICB7CiAJCSBzdHJjcHkoYywgdGMgKyAxKTsKLQkgICAgICAgfQogCSAgICAgYnJlYWs7CiAJICAgZGVmYXVsdDoKLQkgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biB0eXBlLlxuIik7CisJICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gdHlwZSAoJWMpLlxuIixjWzFdKTsKIAkgICAgIGJyZWFrOwogCSAgIH0KICAgICAgICB9CiAgICAgIAotICAgICBydG4gPSBUUlVFOwotICAgICAKLWxlYXZlOgotICAgICAKLSAgICAgcmV0dXJuIHJ0bjsKKyAgICAgcmV0dXJuIFRSVUU7CiAKIH0KIApAQCAtNTk3LDcgKzU5Myw2IEBACiBERUJVR19QYXJzZVN0YWJUeXBlKGNvbnN0IGNoYXIgKiBzdGFiKQogewogICBjaGFyICogYzsKLSAgaW50ICAgIHR5cGVudW07CiAKICAgLyoKICAgICogTG9vayB0aHJvdWdoIHRoZSBzdGFiIGRlZmluaXRpb24sIGFuZCBmaWd1cmUgb3V0IHdoYXQgZGF0YXR5cGUKQEAgLTYwNiw5ICs2MDEsNyBAQAogICAgKi8KICAgYyA9IHN0cmNocihzdGFiLCAnOicpOwogICBpZiggYyA9PSBOVUxMICkKLSAgICB7CiAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKICAgYysrOwogICAvKgpAQCAtNjE2LDE1ICs2MDksMTEgQEAKICAgICogb2Ygc3ltYm9sLiAgU2tpcCBpdC4KICAgICovCiAgIGMrKzsKLQotICB0eXBlbnVtID0gYXRvbChjKTsKLQotICBpZiggdHlwZW51bSA8IG51bV9zdGFiX3R5cGVzICYmIHN0YWJfdHlwZXNbdHlwZW51bV0gIT0gTlVMTCApCi0gICAgewotICAgICAgcmV0dXJuIHN0YWJfdHlwZXNbdHlwZW51bV07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOworICAvKiAKKyAgICogVGhlIG5leHQgaXMgZWl0aGVyIGFuIGludGVnZXIgb3IgYSAoaW50ZWdlcixpbnRlZ2VyKS4KKyAgICogVGhlIERFQlVHX1JlYWRUeXBlRW51bSB0YWtlcyBjYXJlIHRoYXQgc3RhYl90eXBlcyBpcyBsYXJnZSBlbm91Z2guCisgICAqLworICByZXR1cm4gc3RhYl90eXBlc1tERUJVR19SZWFkVHlwZUVudW0oJmMpXTsKIH0KIAogc3RhdGljIApAQCAtNjY0LDEwICs2NTMsNiBAQAogICAgKi8KICAgc3RhYmJ1ZmZsZW4gPSA2NTUzNjsKICAgc3RhYmJ1ZmYgPSAoY2hhciAqKSB4bWFsbG9jKHN0YWJidWZmbGVuKTsKLSAgaWYoIHN0YWJidWZmID09IE5VTEwgKQotICAgIHsKLSAgICAgIGdvdG8gbGVhdmU7Ci0gICAgfQogCiAgIHN0cnRhYmluYyA9IDA7CiAgIHN0YWJidWZmWzBdID0gJ1wwJzsKQEAgLTY4NiwxMCArNjcxLDYgQEAKIAkgICAgewogCSAgICAgIHN0YWJidWZmbGVuICs9IDY1NTM2OwogCSAgICAgIHN0YWJidWZmID0gKGNoYXIgKikgeHJlYWxsb2Moc3RhYmJ1ZmYsIHN0YWJidWZmbGVuKTsKLQkgICAgICBpZiggc3RhYmJ1ZmYgPT0gTlVMTCApCi0JCXsKLQkJICBnb3RvIGxlYXZlOwotCQl9CiAJICAgIH0KIAkgIHN0cm5jYXQoc3RhYmJ1ZmYsIHB0ciwgbGVuIC0gMSk7CiAJICBjb250aW51ZTsKQEAgLTg4Niw3ICs4NjcsMTEgQEAKIAkgICAgICAgKiBUaGUgZGF0YXR5cGVzIHRoYXQgd2Ugd291bGQgbmVlZCB0byB1c2UgYXJlIHJlc2V0IHdoZW4KIAkgICAgICAgKiB3ZSBzdGFydCBhIG5ldyBmaWxlLgogCSAgICAgICAqLwotCSAgICAgIG1lbXNldChzdGFiX3R5cGVzLCAwLCBudW1fc3RhYl90eXBlcyAqIHNpemVvZihzdGFiX3R5cGVzKSk7CisJICAgICAgbWVtc2V0KHN0YWJfdHlwZXMsIDAsIG51bV9zdGFiX3R5cGVzICogc2l6ZW9mKHN0YWJfdHlwZXNbMF0pKTsKKwkgICAgICAvKgorCSAgICAgIGZvciAoaT0wO2k8bnJvZm5yb2Z0eXBlbnVtcztpKyspCisJCW1lbXNldCh0eXBlbnVtc1tpXSwwLHNpemVvZih0eXBlbnVtc1tpXVswXSkqbnJvZnR5cGVudW1zW2ldKTsKKwkgICAgICAgKi8KIAkgICAgfQogCSAgZWxzZQogCSAgICB7CkBAIC05NDYsOCArOTMxLDYgQEAKICNlbmRpZgogICAgIH0KIAotbGVhdmU6Ci0KICAgaWYoIHN0YWJfdHlwZXMgIT0gTlVMTCApCiAgICAgewogICAgICAgZnJlZShzdGFiX3R5cGVzKTsKQEAgLTEwMjUsOSArMTAwOCw3IEBACiAgICAgICAgKi8KICAgICAgIGlmKCAgICAoREVCVUdfR2V0U3ltYm9sVmFsdWUoc3ltbmFtZSwgLTEsICZuZXdfYWRkciwgRkFMU0UgKSA9PSBUUlVFKQogCSAgJiYgKG5ld19hZGRyLm9mZiA9PSAobG9hZF9vZmZzZXQgKyBzeW1wLT5zdF92YWx1ZSkpICkKLQl7CiAJICBjb250aW51ZTsKLQl9CiAKICAgICAgIG5ld19hZGRyLnNlZyA9IDA7CiAgICAgICBuZXdfYWRkci50eXBlID0gTlVMTDsKQEAgLTEwMzUsMjIgKzEwMTYsMTYgQEAKICAgICAgIGZsYWdzID0gU1lNX1dJTkUgfCAoRUxGMzJfU1RfQklORChzeW1wLT5zdF9pbmZvKSA9PSBTVFRfRlVOQyAKIAkJCSAgPyBTWU1fRlVOQyA6IFNZTV9EQVRBKTsKICAgICAgIGlmKCBFTEYzMl9TVF9CSU5EKHN5bXAtPnN0X2luZm8pID09IFNUQl9HTE9CQUwgKQotCXsKIAkgIGN1cnJfc3ltID0gREVCVUdfQWRkU3ltYm9sKCBzeW1uYW1lLCAmbmV3X2FkZHIsIE5VTEwsIGZsYWdzICk7Ci0JfQogICAgICAgZWxzZQotCXsKIAkgIGN1cnJfc3ltID0gREVCVUdfQWRkU3ltYm9sKCBzeW1uYW1lLCAmbmV3X2FkZHIsIGN1cmZpbGUsIGZsYWdzICk7Ci0JfQogCiAgICAgICAvKgogICAgICAgICogUmVjb3JkIHRoZSBzaXplIG9mIHRoZSBzeW1ib2wuICBUaGlzIGNhbiBjb21lIGluIGhhbmR5IGluCiAgICAgICAgKiBzb21lIGNhc2VzLiAgTm90IHJlYWxseSB1c2VkIHlldCwgaG93ZXZlci4KICAgICAgICAqLwogICAgICAgaWYoICBzeW1wLT5zdF9zaXplICE9IDAgKQotCXsKIAkgIERFQlVHX1NldFN5bWJvbFNpemUoY3Vycl9zeW0sIHN5bXAtPnN0X3NpemUpOwotCX0KICAgICB9CiAKICAgcmV0dXJuIFRSVUU7CkBAIC0xMDc4LDkgKzEwNTMsNyBAQAogICAgKiBNYWtlIHN1cmUgd2UgY2FuIHN0YXQgYW5kIG9wZW4gdGhpcyBmaWxlLgogICAgKi8KICAgaWYoIGZpbGVuYW1lID09IE5VTEwgKQotICAgIHsKICAgICAgIGdvdG8gbGVhdmU7Ci0gICAgfQogCiAgIHN0YXR1cyA9IHN0YXQoZmlsZW5hbWUsICZzdGF0YnVmKTsKICAgaWYoIHN0YXR1cyA9PSAtMSApCkBAIC0xMTE2LDkgKzEwODksNyBAQAogICAgKi8KICAgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CiAgIGlmKCBmZCA9PSAtMSApCi0gICAgewogICAgICAgZ290byBsZWF2ZTsKLSAgICB9CiAKIAogICAvKgpAQCAtMTEyNyw5ICsxMDk4LDcgQEAKICAgYWRkciA9IG1tYXAoMCwgc3RhdGJ1Zi5zdF9zaXplLCBQUk9UX1JFQUQsIAogCSAgICAgIE1BUF9QUklWQVRFLCBmZCwgMCk7CiAgIGlmKCBhZGRyID09IChjaGFyICopIDB4ZmZmZmZmZmYgKQotICAgIHsKICAgICAgIGdvdG8gbGVhdmU7Ci0gICAgfQogCiAgIC8qCiAgICAqIEdpdmUgYSBuaWNlIHN0YXR1cyBtZXNzYWdlIGhlcmUuLi4KQEAgLTExNDUsMTMgKzExMTQsOSBAQAogICBlaHB0ciA9IChFbGYzMl9FaGRyICopIGFkZHI7CiAKICAgaWYoIGxvYWRfb2Zmc2V0ID09IDAgKQotICAgIHsKICAgICAgIERFQlVHX1JlZ2lzdGVyRUxGRGVidWdJbmZvKGVocHRyLT5lX2VudHJ5LCBzdGF0YnVmLnN0X3NpemUsIGZpbGVuYW1lKTsKLSAgICB9CiAgIGVsc2UKLSAgICB7CiAgICAgICBERUJVR19SZWdpc3RlckVMRkRlYnVnSW5mbyhsb2FkX29mZnNldCwgc3RhdGJ1Zi5zdF9zaXplLCBmaWxlbmFtZSk7Ci0gICAgfQogCiAgIHNwbnQgPSAoRWxmMzJfU2hkciAqKSAoYWRkciArIGVocHRyLT5lX3Nob2ZmKTsKICAgbnNlY3QgPSBlaHB0ci0+ZV9zaG51bTsKQEAgLTExNjIsMjAgKzExMjcsMTQgQEAKICAgZm9yKGk9MDsgaSA8IG5zZWN0OyBpKyspCiAgICAgewogICAgICAgaWYoIHN0cmNtcChzaHN0cnRhYiArIHNwbnRbaV0uc2hfbmFtZSwgIi5zdGFiIikgPT0gMCApCi0JewogCSAgc3RhYnNlY3QgPSBpOwotCX0KIAogICAgICAgaWYoIHN0cmNtcChzaHN0cnRhYiArIHNwbnRbaV0uc2hfbmFtZSwgIi5zdGFic3RyIikgPT0gMCApCi0JewogCSAgc3RhYnN0cnNlY3QgPSBpOwotCX0KICAgICB9CiAKICAgaWYoIHN0YWJzZWN0ID09IC0xIHx8IHN0YWJzdHJzZWN0ID09IC0xICkKLSAgICB7CiAgICAgICBnb3RvIGxlYXZlOwotICAgIH0KIAogICAvKgogICAgKiBPSywgbm93IGp1c3QgcGFyc2UgYWxsIG9mIHRoZSBzdGFicy4KQEAgLTExODcsMzggKzExNDYsMjggQEAKIAkJCSBzcG50W3N0YWJzdHJzZWN0XS5zaF9zaXplKTsKIAogICBpZiggcnRuICE9IFRSVUUgKQotICAgIHsKICAgICAgIGdvdG8gbGVhdmU7Ci0gICAgfQogCiAgIGZvcihpPTA7IGkgPCBuc2VjdDsgaSsrKQogICAgIHsKICAgICAgIGlmKCAgICAoc3RyY21wKHNoc3RydGFiICsgc3BudFtpXS5zaF9uYW1lLCAiLnN5bXRhYiIpID09IDApCiAJICAmJiAoc3BudFtpXS5zaF90eXBlID09IFNIVF9TWU1UQUIpICkKLQl7CiAJICBERUJVR19Qcm9jZXNzRWxmU3ltdGFiKGFkZHIsIGxvYWRfb2Zmc2V0LCAKIAkJCQkgc3BudCArIGksIHNwbnQgKyBzcG50W2ldLnNoX2xpbmspOwotCX0KIAogICAgICAgaWYoICAgIChzdHJjbXAoc2hzdHJ0YWIgKyBzcG50W2ldLnNoX25hbWUsICIuZHluc3ltIikgPT0gMCkKIAkgICYmIChzcG50W2ldLnNoX3R5cGUgPT0gU0hUX0RZTlNZTSkgKQotCXsKIAkgIERFQlVHX1Byb2Nlc3NFbGZTeW10YWIoYWRkciwgbG9hZF9vZmZzZXQsIAogCQkJCSBzcG50ICsgaSwgc3BudCArIHNwbnRbaV0uc2hfbGluayk7Ci0JfQogICAgIH0KIAogbGVhdmU6CiAKICAgaWYoIGFkZHIgIT0gKGNoYXIgKikgMHhmZmZmZmZmZiApCi0gICAgewogICAgICAgbXVubWFwKGFkZHIsIHN0YXRidWYuc3Rfc2l6ZSk7Ci0gICAgfQogCiAgIGlmKCBmZCAhPSAtMSApCi0gICAgewogICAgICAgY2xvc2UoZmQpOwotICAgIH0KIAogICByZXR1cm4gKHJ0bik7CiAKQEAgLTEyNDEsOSArMTE5MCw3IEBACiAgICAqIE1ha2Ugc3VyZSB3ZSBjYW4gc3RhdCBhbmQgb3BlbiB0aGlzIGZpbGUuCiAgICAqLwogICBpZiggZXhlX25hbWUgPT0gTlVMTCApCi0gICAgewogICAgICAgZ290byBsZWF2ZTsKLSAgICB9CiAKICAgREVCVUdfUHJvY2Vzc0VsZk9iamVjdChleGVfbmFtZSwgMCk7CiAKQEAgLTEyNTQsMjcgKzEyMDEsMTkgQEAKICAgICovCiAgIGR5bnBudCA9IF9EWU5BTUlDOwogICBpZiggZHlucG50ID09IE5VTEwgKQotICAgIHsKICAgICAgIGdvdG8gbGVhdmU7Ci0gICAgfQogCiAgIC8qCiAgICAqIE5vdyB3YWxrIHRoZSBkeW5hbWljIHNlY3Rpb24gKG9mIHRoZSBleGVjdXRhYmxlLCBsb29raW5nIGZvciBhIERUX0RFQlVHCiAgICAqIGVudHJ5LgogICAgKi8KICAgZm9yKDsgZHlucG50LT5kX3RhZyAhPSBEVF9OVUxMOyBkeW5wbnQrKykKLSAgICB7CiAgICAgICBpZiggZHlucG50LT5kX3RhZyA9PSBEVF9ERUJVRyApCi0JewogCSAgYnJlYWs7Ci0JfQotICAgIH0KIAogICBpZiggICAgKGR5bnBudC0+ZF90YWcgIT0gRFRfREVCVUcpCiAgICAgICB8fCAoZHlucG50LT5kX3VuLmRfcHRyID09IDApICkKLSAgICB7CiAgICAgICBnb3RvIGxlYXZlOwotICAgIH0KIAogICAvKgogICAgKiBPSywgbm93IGRpZyBpbnRvIHRoZSBhY3R1YWwgdGFibGVzIHRoZW1zZWx2ZXMuCkBAIC0xMjk3LDE0ICsxMjM2LDEwIEBACiAgICAgICAgKi8KICAgICAgIGVoZHIgPSAoRWxmMzJfRWhkciAqKSBscG50LT5sX2FkZHI7CiAgICAgICBpZiggKGxwbnQtPmxfYWRkciA9PSAwKSB8fCAoZWhkci0+ZV90eXBlICE9IEVUX0RZTikgKQotCXsKIAkgIGNvbnRpbnVlOwotCX0KIAogICAgICAgaWYoIGxwbnQtPmxfbmFtZSAhPSBOVUxMICkKLQl7CiAJICBERUJVR19Qcm9jZXNzRWxmT2JqZWN0KGxwbnQtPmxfbmFtZSwgbHBudC0+bF9hZGRyKTsKLQl9CiAgICAgfQogCiAgIHJ0biA9IFRSVUU7CkBAIC0xMzQwLDI0ICsxMjc1LDE4IEBACiAgICAqIE1ha2Ugc3VyZSB3ZSBjYW4gc3RhdCBhbmQgb3BlbiB0aGlzIGZpbGUuCiAgICAqLwogICBpZiggZXhlX25hbWUgPT0gTlVMTCApCi0gICAgewogICAgICAgZ290byBsZWF2ZTsKLSAgICB9CiAKICAgc3RhdHVzID0gc3RhdChleGVfbmFtZSwgJnN0YXRidWYpOwogICBpZiggc3RhdHVzID09IC0xICkKLSAgICB7CiAgICAgICBnb3RvIGxlYXZlOwotICAgIH0KIAogICAvKgogICAgKiBOb3cgb3BlbiB0aGUgZmlsZSwgc28gdGhhdCB3ZSBjYW4gbW1hcCgpIGl0LgogICAgKi8KICAgZmQgPSBvcGVuKGV4ZV9uYW1lLCBPX1JET05MWSk7CiAgIGlmKCBmZCA9PSAtMSApCi0gICAgewogICAgICAgZ290byBsZWF2ZTsKLSAgICB9CiAKIAogICAvKgpAQCAtMTM2Niw5ICsxMjk1LDcgQEAKICAgYWRkciA9IG1tYXAoMCwgc3RhdGJ1Zi5zdF9zaXplLCBQUk9UX1JFQUQsIAogCSAgICAgIE1BUF9QUklWQVRFLCBmZCwgMCk7CiAgIGlmKCBhZGRyID09IChjaGFyICopIDB4ZmZmZmZmZmYgKQotICAgIHsKICAgICAgIGdvdG8gbGVhdmU7Ci0gICAgfQogCiAgIGFoZHIgPSAoc3RydWN0IGV4ZWMgKikgYWRkcjsKIApAQCAtMTM5MCwxNCArMTMxNywxMCBAQAogbGVhdmU6CiAKICAgaWYoIGFkZHIgIT0gKGNoYXIgKikgMHhmZmZmZmZmZiApCi0gICAgewogICAgICAgbXVubWFwKGFkZHIsIHN0YXRidWYuc3Rfc2l6ZSk7Ci0gICAgfQogCiAgIGlmKCBmZCAhPSAtMSApCi0gICAgewogICAgICAgY2xvc2UoZmQpOwotICAgIH0KIAogICByZXR1cm4gKHJ0bik7CiAKZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vdHRmc2VydmVyIGIvZG9jdW1lbnRhdGlvbi90dGZzZXJ2ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzMDE5OQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3VtZW50YXRpb24vdHRmc2VydmVyCkBAIC0wLDAgKzEsNTAgQEAKKzEuIEdldCBmcmVldHlwZS0xLjAuZnVsbC50YXIuZ3ogCisyLiBSZWFkIGRvY3VzLCB1bnBhY2ssIGNvbmZpZ3VyZSBhbmQgaW5zdGFsbAorMy4gVGVzdCB0aGUgbGlicmFyeSwgZS5nLiAiZnR2aWV3IDIwIC9kb3NjL3dpbjk1L2ZvbnRzL3RpbWVzICIKKzQuIEdldCB4ZnNmdC1iZXRhMWUubGludXgtaTU4NgorNS4gSW5zdGFsbCBpdCBhbmQgc3RhcnQgaXQgd2hlbiBib290aW5nLCBlLmcuIGluIGFuIHJjLXNjcmlwdC4gCisJVGhlIG1hbnBhZ2UgZm9yIHhmcyBhcHBsaWVzLgorNi4gRm9sbG93IHRoZSBoaW50cyBnaXZlbiBieSB3aWxsaWFtY0BkYWkuZWQuYWMudWsKKz09PT09PT09PT0KK0kgZ290IHhmc2Z0IGZyb20gaHR0cDovL3d3dy5kY3MuZWQuYWMudWsvaG9tZS9qZWMvcHJvZ2luZGV4Lmh0bWwuCitJIGhhdmUgaXQgcnVubmluZyBhbGwgdGhlIHRpbWUuICBIZXJlIGlzIC91c3IvWDExUjYvbGliL1gxMS9mcy9jb25maWc6CitjbG9uZS1zZWxmID0gb24KK3VzZS1zeXNsb2cgPSBvZmYKK2NhdGFsb2d1ZSA9IC9jL3dpbmRvd3MvZm9udHMKK2Vycm9yLWZpbGUgPSAvdXNyL1gxMVI2L2xpYi9YMTEvZnMvZnMtZXJyb3JzCitkZWZhdWx0LXBvaW50LXNpemUgPSAxMjAKK2RlZmF1bHQtcmVzb2x1dGlvbnMgPSA3NSw3NSwxMDAsMTAwCitPYnZpb3VzbHkgL2Mvd2luZG93cy9mb250cyBpcyB3aGVyZSBteSBXaW5kb3dzIGZvbnRzIG9uIG15CitXaW45NSBDOiBkcml2ZSBsaXZlOyBjb3VsZCBiZSBlLmcuIC9tbnQvZG9zQy93aW5kb3dzL3N5c3RlbQorZm9yIFdpbjMxLgorSW4gL2Mvd2luZG93cy9mb250cy9mb250cy5zY2FsZSBJIGhhdmUKKzE0CithcmlhbC50dGYgLW1vbm90eXBlLWFyaWFsLW1lZGl1bS1yLW5vcm1hbC0tMC0wLTAtMC1wLTAtaXNvODg1OS0xCithcmlhbGJkLnR0ZiAtbW9ub3R5cGUtYXJpYWwtYm9sZC1yLW5vcm1hbC0tMC0wLTAtMC1wLTAtaXNvODg1OS0xCithcmlhbGJpLnR0ZiAtbW9ub3R5cGUtYXJpYWwtYm9sZC1vLW5vcm1hbC0tMC0wLTAtMC1wLTAtaXNvODg1OS0xCithcmlhbGkudHRmIC1tb25vdHlwZS1hcmlhbC1tZWRpdW0tby1ub3JtYWwtLTAtMC0wLTAtcC0wLWlzbzg4NTktMQorY291ci50dGYgLW1vbm90eXBlLWNvdXJpZXItbWVkaXVtLXItbm9ybWFsLS0wLTAtMC0wLXAtMC1pc284ODU5LTEKK2NvdXJiZC50dGYgLW1vbm90eXBlLWNvdXJpZXItYm9sZC1yLW5vcm1hbC0tMC0wLTAtMC1wLTAtaXNvODg1OS0xCitjb3VyYmkudHRmIC1tb25vdHlwZS1jb3VyaWVyLWJvbGQtby1ub3JtYWwtLTAtMC0wLTAtcC0wLWlzbzg4NTktMQorY291cmkudHRmIC1tb25vdHlwZS1jb3VyaWVyLW1lZGl1bS1vLW5vcm1hbC0tMC0wLTAtMC1wLTAtaXNvODg1OS0xCit0aW1lcy50dGYgLW1vbm90eXBlLXRpbWVzLW1lZGl1bS1yLW5vcm1hbC0tMC0wLTAtMC1wLTAtaXNvODg1OS0xCit0aW1lc2JkLnR0ZiAtbW9ub3R5cGUtdGltZXMtYm9sZC1yLW5vcm1hbC0tMC0wLTAtMC1wLTAtaXNvODg1OS0xCit0aW1lc2JpLnR0ZiAtbW9ub3R5cGUtdGltZXMtYm9sZC1pLW5vcm1hbC0tMC0wLTAtMC1wLTAtaXNvODg1OS0xCit0aW1lc2kudHRmIC1tb25vdHlwZS10aW1lcy1tZWRpdW0taS1ub3JtYWwtLTAtMC0wLTAtcC0wLWlzbzg4NTktMQorc3ltYm9sLnR0ZiAtbW9ub3R5cGUtc3ltYm9sLW1lZGl1bS1yLW5vcm1hbC0tMC0wLTAtMC1wLTAtbWljcm9zb2Z0LXN5bWJvbAord2luZ2RpbmcudHRmIC1taWNyb3NvZnQtd2luZ2RpbmdzLW1lZGl1bS1yLW5vcm1hbC0tMC0wLTAtMC1wLTAtbWljcm9zb2Z0LXN5bWJvbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorSW4gL2Mvd2luZG93cy9mb250cy9mb250cy5kaXIgSSBoYXZlIGV4YWN0bHkgdGhlIHNhbWUuCisKK0luIC91c3IvWDExUjYvbGliL1gxMS9YRjg2Q29uZmlnIEkgaGF2ZQorRm9udFBhdGggInRjcC9sb2NhbGhvc3Q6NzEwMCIKK2luIGZyb250IG9mIHRoZSBvdGhlciBGb250UGF0aCBsaW5lcy4KK1RoYXQncyBpdCEgIEFzIGFuIGludGVyZXN0aW5nIGJ5LXByb2R1Y3Qgb2YgY291cnNlLCBhbGwgdGhvc2Ugd2ViCitwYWdlcyB3aGljaCBzcGVjaWZ5IEFyaWFsIGNvbWUgdXAgaW4gQXJpYWwgaW4gTmV0c2NhcGUgLi4uCis9PT09PT09Cis3LiBTaHV0IGRvd24gWCBhbmQgcmVzdGFydCAoIGFuZCBkZWJ1ZyBlcnJvcnMgeW91IGRpZCB3aGlsZSBzZXR0aW5nCisgICB1cCBldmVyeXRoaW5nLgorCis4LiBUZXN0IHdpdGggZS5nICJ4bHNmb250IHxncmVwIGFyaWFsIgorCitIb3BlIHRoaXMgaGVscHMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9maWxlcy9kaXJlY3RvcnkuYyBiL2ZpbGVzL2RpcmVjdG9yeS5jCmluZGV4IDFjOThjYWEuLmFhOTc1YTQgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2RpcmVjdG9yeS5jCisrKyBiL2ZpbGVzL2RpcmVjdG9yeS5jCkBAIC00NjUsOSArNDY1LDExIEBACiAKICAgICBpZiAocGRiLT5mbGFncyAmIFBEQjMyX1dJTjE2X1BST0MpIHsKIAlpZiAoIUdldEN1cnJlbnRUYXNrKCkpIHJldHVybiBGQUxTRTsKLQlHZXRNb2R1bGVGaWxlTmFtZTE2KCBHZXRDdXJyZW50VGFzaygpLCBidWZmZXIsIHNpemVvZihidWZmZXIpICk7CisJaWYgKCFHZXRNb2R1bGVGaWxlTmFtZTE2KCBHZXRDdXJyZW50VGFzaygpLCBidWZmZXIsIHNpemVvZihidWZmZXIpICkpCisJCWJ1ZmZlclswXT0nXDAnOwogICAgIH0gZWxzZSB7Ci0JR2V0TW9kdWxlRmlsZU5hbWUzMkEoIDAsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgKTsKKwlpZiAoIUdldE1vZHVsZUZpbGVOYW1lMzJBKCAwLCBidWZmZXIsIHNpemVvZihidWZmZXIpICkpCisJCWJ1ZmZlclswXT0nXDAnOwogICAgIH0KICAgICBpZiAoIShwID0gc3RycmNociggYnVmZmVyLCAnXFwnICkpKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKHNpemVvZihidWZmZXIpIC0gKCsrcCAtIGJ1ZmZlcikgPD0gc3RybGVuKG5hbWUpKSByZXR1cm4gRkFMU0U7CkBAIC01NjgsNyArNTcwLDMxIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2VhcmNoUGF0aDMyQSAgIChLRVJORUwzMi40NDcpCisgKiBTZWFyY2hQYXRoMzJBIFtLRVJORUwzMi40NDddCisgKgorICogU2VhcmNoZXMgZm9yIGEgc3BlY2lmaWVkIGZpbGUgaW4gdGhlIHNlYXJjaCBwYXRoLgorICoKKyAqIFBBUkFNUworICogICAgcGF0aAlbSV0gUGF0aCB0byBzZWFyY2gKKyAqICAgIG5hbWUJW0ldIEZpbGVuYW1lIHRvIHNlYXJjaCBmb3IuCisgKiAgICBleHQJW0ldIEZpbGUgZXh0ZW5zaW9uIHRvIGFwcGVuZCB0byBmaWxlIG5hbWUuIFRoZSBmaXJzdAorICoJCSAgICBjaGFyYWN0ZXIgbXVzdCBiZSBhIHBlcmlvZC4gVGhpcyBwYXJhbWV0ZXIgaXMKKyAqICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIG9ubHkgaWYgdGhlIGZpbGVuYW1lIGdpdmVuIGRvZXMgbm90CisgKiAgICAgICAgICAgICAgICAgIGNvbnRhaW4gYW4gZXh0ZW5zaW9uLgorICogICAgYnVmbGVuCVtJXSBzaXplIG9mIGJ1ZmZlciwgaW4gY2hhcmFjdGVycworICogICAgYnVmZmVyCVtPXSBidWZmZXIgZm9yIGZvdW5kIGZpbGVuYW1lCisgKiAgICBsYXN0cGFydCAgW09dIGFkZHJlc3Mgb2YgcG9pbnRlciB0byBsYXN0IHVzZWQgY2hhcmFjdGVyIGluCisgKiAgICAgICAgICAgICAgICAgIGJ1ZmZlciAodGhlIGZpbmFsICdcJykKKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBsZW5ndGggb2Ygc3RyaW5nIGNvcGllZCBpbnRvIGJ1ZmZlciwgbm90IGluY2x1ZGluZworICogICAgICAgICAgICAgdGVybWluYXRpbmcgbnVsbCBjaGFyYWN0ZXIuIElmIHRoZSBmaWxlbmFtZSBmb3VuZCBpcworICogICAgICAgICAgICAgbG9uZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCB0aGUgbGVuZ3RoIG9mIHRoZQorICogICAgICAgICAgICAgZmlsZW5hbWUgaXMgcmV0dXJuZWQuCisgKiAgICBGYWlsdXJlOiBaZXJvCisgKiAKKyAqIE5PVEVTCisgKiAgICBTaG91bGQgY2FsbCBTZXRMYXN0RXJyb3IoYnV0IGN1cnJlbnRseSBkb2Vzbid0KS4KICAqLwogRFdPUkQgV0lOQVBJIFNlYXJjaFBhdGgzMkEoIExQQ1NUUiBwYXRoLCBMUENTVFIgbmFtZSwgTFBDU1RSIGV4dCwgRFdPUkQgYnVmbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGJ1ZmZlciwgTFBTVFIgKmxhc3RwYXJ0ICkKQEAgLTU4Nyw2ICs2MTMsNyBAQAogICAgICAgICBmb3IgKHAgPSBidWZmZXI7ICpwOyBwKyspIGlmICgqcCA9PSAnLycpICpwID0gJ1xcJzsKICAgICAgICAgaWYgKGxhc3RwYXJ0KSAqbGFzdHBhcnQgPSBzdHJyY2hyKCBidWZmZXIsICdcXCcgKSArIDE7CiAgICAgfQorICAgIFRSQUNFKGRvc2ZzLCAiUmV0dXJuaW5nICVkXG4iLCAoKnJlcyA/IHN0cmxlbihyZXMpICsgMiA6IDMpKTsKICAgICByZXR1cm4gKnJlcyA/IHN0cmxlbihyZXMpICsgMiA6IDM7CiB9CiAKZGlmZiAtLWdpdCBhL2ZpbGVzL2Rvc19mcy5jIGIvZmlsZXMvZG9zX2ZzLmMKaW5kZXggMzlmYmExNy4uNGQ5NTg2ZiAxMDA2NDQKLS0tIGEvZmlsZXMvZG9zX2ZzLmMKKysrIGIvZmlsZXMvZG9zX2ZzLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlIDx0aW1lLmg+CmRpZmYgLS1naXQgYS9maWxlcy9maWxlLmMgYi9maWxlcy9maWxlLmMKaW5kZXggZDk0YjdmZi4uOTgzMzUzZSAxMDA2NDQKLS0tIGEvZmlsZXMvZmlsZS5jCisrKyBiL2ZpbGVzL2ZpbGUuYwpAQCAtOSw3ICs5LDYgQEAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy9lcnJuby5oPgpAQCAtMTAwNCw3ICsxMDAzLDE1IEBACiAgICAgfQogCiAgICAgaWYgKChyZXN1bHQgPSBsc2VlayggZmlsZS0+dW5peF9oYW5kbGUsIGRpc3RhbmNlLCBvcmlnaW4gKSkgPT0gLTEpCisgICAgICB7CisJLyogY2FyZSBmb3IgdGhpcyBwYXRob2xvZ2ljYWwgY2FzZToKKwkgICBTZXRGaWxlUG9pbnRlcigwMDAwMDAwNixmZmZmZmZmZiwwMDAwMDAwMCwwMDAwMDAwMikKKwkgICByZXQ9MDA2MmFiNGEgZnM9MDFjNyAqLworCWlmICgoZGlzdGFuY2UgIT0gLTEpKQogICAgICAgICBGSUxFX1NldERvc0Vycm9yKCk7CisJZWxzZQorCSAgcmVzdWx0ID0gMDsKKyAgICAgIH0KICAgICBGSUxFX1JlbGVhc2VGaWxlKCBmaWxlICk7CiAgICAgcmV0dXJuIChEV09SRClyZXN1bHQ7CiB9CkBAIC0xODUwLDMgKzE4NTcsNTMgQEAKICAgcmV0dXJuIFRSVUU7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2V0RmlsZUF0dHJpYnV0ZXNFeDMyQSBbS0VSTkVMMzIuODc0XQorICovCitCT09MMzIgV0lOQVBJIEdldEZpbGVBdHRyaWJ1dGVzRXgzMkEoCisJTFBDU1RSIGxwRmlsZU5hbWUsIEdFVF9GSUxFRVhfSU5GT19MRVZFTFMgZkluZm9MZXZlbElkLAorCUxQVk9JRCBscEZpbGVJbmZvcm1hdGlvbikKK3sKKyAgICBET1NfRlVMTF9OQU1FIGZ1bGxfbmFtZTsKKyAgICBCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTiBpbmZvOworICAgIAorICAgIGlmIChscEZpbGVOYW1lID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyAgICBpZiAobHBGaWxlSW5mb3JtYXRpb24gPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKGZJbmZvTGV2ZWxJZCA9PSBHZXRGaWxlRXhJbmZvU3RhbmRhcmQpIHsKKwlMUFdJTjMyX0ZJTEVfQVRUUklCVVRFX0RBVEEgbHBGYWQgPSAKKwkgICAgKExQV0lOMzJfRklMRV9BVFRSSUJVVEVfREFUQSkgbHBGaWxlSW5mb3JtYXRpb247CisJaWYgKCFET1NGU19HZXRGdWxsTmFtZSggbHBGaWxlTmFtZSwgVFJVRSwgJmZ1bGxfbmFtZSApKSByZXR1cm4gRkFMU0U7CisJaWYgKCFGSUxFX1N0YXQoIGZ1bGxfbmFtZS5sb25nX25hbWUsICZpbmZvICkpIHJldHVybiBGQUxTRTsKKworCWxwRmFkLT5kd0ZpbGVBdHRyaWJ1dGVzID0gaW5mby5kd0ZpbGVBdHRyaWJ1dGVzOworCWxwRmFkLT5mdENyZWF0aW9uVGltZSAgID0gaW5mby5mdENyZWF0aW9uVGltZTsKKwlscEZhZC0+ZnRMYXN0QWNjZXNzVGltZSA9IGluZm8uZnRMYXN0QWNjZXNzVGltZTsKKwlscEZhZC0+ZnRMYXN0V3JpdGVUaW1lICA9IGluZm8uZnRMYXN0V3JpdGVUaW1lOworCWxwRmFkLT5uRmlsZVNpemVIaWdoICAgID0gaW5mby5uRmlsZVNpemVIaWdoOworCWxwRmFkLT5uRmlsZVNpemVMb3cgICAgID0gaW5mby5uRmlsZVNpemVMb3c7CisgICAgfQorICAgIGVsc2UgeworCUZJWE1FIChmaWxlLCAiaW52YWxpZCBpbmZvIGxldmVsICVkIVxuIiwgZkluZm9MZXZlbElkKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHZXRGaWxlQXR0cmlidXRlc0V4MzJXIFtLRVJORUwzMi44NzVdCisgKi8KK0JPT0wzMiBXSU5BUEkgR2V0RmlsZUF0dHJpYnV0ZXNFeDMyVygKKwlMUENXU1RSIGxwRmlsZU5hbWUsIEdFVF9GSUxFRVhfSU5GT19MRVZFTFMgZkluZm9MZXZlbElkLAorCUxQVk9JRCBscEZpbGVJbmZvcm1hdGlvbikKK3sKKyAgICBMUFNUUiBuYW1lQSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBGaWxlTmFtZSApOworICAgIEJPT0wzMiByZXMgPSAKKwlHZXRGaWxlQXR0cmlidXRlc0V4MzJBKCBuYW1lQSwgZkluZm9MZXZlbElkLCBscEZpbGVJbmZvcm1hdGlvbik7CisgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIG5hbWVBICk7CisgICAgcmV0dXJuIHJlczsKK30KKworCmRpZmYgLS1naXQgYS9maWxlcy9wcm9maWxlLmMgYi9maWxlcy9wcm9maWxlLmMKaW5kZXggZTFjMzU0NC4uZjUzODAwZiAxMDA2NDQKLS0tIGEvZmlsZXMvcHJvZmlsZS5jCisrKyBiL2ZpbGVzL3Byb2ZpbGUuYwpAQCAtNiw3ICs2LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCkBAIC00NTksMTAgKzQ1OCwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgUFJPRklMRV9HZXRTZWN0aW9uCiAgKgotICogRW51bWVyYXRlIGFsbCB0aGUga2V5cyBvZiBhIHNlY3Rpb24uCisgKiBSZXR1cm5zIGFsbCBrZXlzIG9mIGEgc2VjdGlvbi4KKyAqIElmIHJldHVybl92YWx1ZXMgaXMgVFJVRSwgYWxzbyBpbmNsdWRlIHRoZSBjb3Jyc2Vwb25kaW5nIHZhbHVlcy4KICAqLwogc3RhdGljIElOVDMyIFBST0ZJTEVfR2V0U2VjdGlvbiggUFJPRklMRVNFQ1RJT04gKnNlY3Rpb24sIExQQ1NUUiBzZWN0aW9uX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBidWZmZXIsIElOVDMyIGxlbiwgQk9PTDMyIGhhbmRsZV9lbnYgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgYnVmZmVyLCBJTlQzMiBsZW4sIEJPT0wzMiBoYW5kbGVfZW52LAorCQkJCSBCT09MMzIgcmV0dXJuX3ZhbHVlcyApCiB7CiAgICAgUFJPRklMRUtFWSAqa2V5OwogICAgIHdoaWxlIChzZWN0aW9uKQpAQCAtNDc3LDYgKzQ3OCwxMyBAQAogICAgICAgICAgICAgICAgIFBST0ZJTEVfQ29weUVudHJ5KCBidWZmZXIsIGtleS0+bmFtZSwgbGVuIC0gMSwgaGFuZGxlX2VudiApOwogICAgICAgICAgICAgICAgIGxlbiAtPSBzdHJsZW4oYnVmZmVyKSArIDE7CiAgICAgICAgICAgICAgICAgYnVmZmVyICs9IHN0cmxlbihidWZmZXIpICsgMTsKKwkJaWYgKHJldHVybl92YWx1ZXMgJiYga2V5LT52YWx1ZSkgeworCQkJYnVmZmVyWy0xXSA9ICc9JzsKKwkJCVBST0ZJTEVfQ29weUVudHJ5ICggYnVmZmVyLAorCQkJCWtleS0+dmFsdWUsIGxlbiAtIDEsIGhhbmRsZV9lbnYgKTsKKwkJCWxlbiAtPSBzdHJsZW4oYnVmZmVyKSArIDE7CisJCQlidWZmZXIgKz0gc3RybGVuKGJ1ZmZlcikgKyAxOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpidWZmZXIgPSAnXDAnOwogICAgICAgICAgICAgaWYgKGxlbiA8IDEpCkBAIC01MTgsNyArNTI2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLCBrZXlfbmFtZSwgZGVmX3ZhbCwgYnVmZmVyICk7CiAgICAgICAgIHJldHVybiBzdHJsZW4oIGJ1ZmZlciApOwogICAgIH0KLSAgICByZXR1cm4gUFJPRklMRV9HZXRTZWN0aW9uKEN1clByb2ZpbGUuc2VjdGlvbiwgc2VjdGlvbiwgYnVmZmVyLCBsZW4sIEZBTFNFKTsKKyAgICByZXR1cm4gUFJPRklMRV9HZXRTZWN0aW9uKEN1clByb2ZpbGUuc2VjdGlvbiwgc2VjdGlvbiwgYnVmZmVyLCBsZW4sCisJCQkJRkFMU0UsIEZBTFNFKTsKIH0KIAogCkBAIC01ODgsNyArNTk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLCBrZXlfbmFtZSwgZGVmLCBidWZmZXIgKTsKICAgICAgICAgcmV0dXJuIHN0cmxlbiggYnVmZmVyICk7CiAgICAgfQotICAgIHJldHVybiBQUk9GSUxFX0dldFNlY3Rpb24oIFdpbmVQcm9maWxlLCBzZWN0aW9uLCBidWZmZXIsIGxlbiwgVFJVRSApOworICAgIHJldHVybiBQUk9GSUxFX0dldFNlY3Rpb24oIFdpbmVQcm9maWxlLCBzZWN0aW9uLCBidWZmZXIsIGxlbiwgVFJVRSwgRkFMU0UgKTsKIH0KIAogCkBAIC05ODgsNyArOTk3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGxlbiwgTFBDU1RSIGZpbGVuYW1lICkKIHsKICAgICBpZiAoUFJPRklMRV9PcGVuKCBmaWxlbmFtZSApKQotICAgICAgICByZXR1cm4gUFJPRklMRV9HZXRTdHJpbmcoIHNlY3Rpb24sIE5VTEwsIE5VTEwsIGJ1ZmZlciwgbGVuICk7CisgICAgICAgIHJldHVybiBQUk9GSUxFX0dldFNlY3Rpb24oQ3VyUHJvZmlsZS5zZWN0aW9uLCBzZWN0aW9uLCBidWZmZXIsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIFRSVUUpOworCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTEwNTIsNiArMTA2MywxNiBAQAogICAgIHJldHVybiBGQUxTRTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uTmFtZXMxNiAgIChLRVJORUwuMTQzKQorICovCitXT1JEIFdJTkFQSSBHZXRQcml2YXRlUHJvZmlsZVNlY3Rpb25OYW1lczE2KCBMUFNUUiBidWZmZXIsIFdPUkQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBmaWxlbmFtZSApCit7CisgICAgRklYTUUocHJvZmlsZSwgIiglcCwlZCwlcyk6c3R1YlxuIiwgYnVmZmVyLCBzaXplLCBmaWxlbmFtZSk7CisgICAgYnVmZmVyWzBdID0gYnVmZmVyWzFdID0gJ1wwJzsKKyAgICByZXR1cm4gMDsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgV3JpdGVPdXRQcm9maWxlcyAgIChLRVJORUwuMzE1KQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvZGRyYXcuYyBiL2dyYXBoaWNzL2RkcmF3LmMKaW5kZXggNjZkZjgwNC4uYmQzNzk5OCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvZGRyYXcuYworKysgYi9ncmFwaGljcy9kZHJhdy5jCkBAIC00OCw3ICs0OCw2IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSAidHNfeGxpYi5oIgpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvZHJpdmVyLmMgYi9ncmFwaGljcy9kcml2ZXIuYwppbmRleCA3YzA5YjJiLi5hMjJjZDZkIDEwMDY0NAotLS0gYS9ncmFwaGljcy9kcml2ZXIuYworKysgYi9ncmFwaGljcy9kcml2ZXIuYwpAQCAtNCw3ICs0LDYgQEAKICAqIENvcHlyaWdodCAxOTk2IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgImdkaS5oIgogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luMTZkcnYvb2JqZWN0cy5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvb2JqZWN0cy5jCmluZGV4IDcwOWJkODAuLjQ0NDI2YWEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L29iamVjdHMuYworKysgYi9ncmFwaGljcy93aW4xNmRydi9vYmplY3RzLmMKQEAgLTQyLDcgKzQyLDcgQEAKICAgICAgICAgcmV0ID0gV0lOMTZEUlZfQlJVU0hfU2VsZWN0T2JqZWN0KCBkYywgaGFuZGxlLCAoQlJVU0hPQkogKilwdHIgKTsJICAKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBCSVRNQVBfTUFHSUM6Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiV0lOMTZEUlZfU2VsZWN0T2JqZWN0IGZvciBCSVRNQVAgbm90IGltcGxlbWVudGVkXG4iKTsKKyAgICAgICAgRklYTUUoZ2RpLCAiV0lOMTZEUlZfU2VsZWN0T2JqZWN0IGZvciBCSVRNQVAgbm90IGltcGxlbWVudGVkXG4iKTsKICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBGT05UX01BR0lDOgpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmMgYi9ncmFwaGljcy93aW4xNmRydi9wcnRkcnYuYwppbmRleCA0M2JiN2U4Li4wZmRmMWE2IDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9wcnRkcnYuYworKysgYi9ncmFwaGljcy93aW4xNmRydi9wcnRkcnYuYwpAQCAtMTMzLDcgKzEzMyw3IEBACiAgICAgfQogICAgIGlmICghYlNsb3RGb3VuZCkKICAgICB7Ci0JZnByaW50ZihzdGRlcnIsIlRvbyBtYW55IHByaW50ZXJzIGRyaXZlcnMgbG9hZGVkXG4iKTsKKwlXQVJOKHdpbjE2ZHJ2LCJUb28gbWFueSBwcmludGVycyBkcml2ZXJzIGxvYWRlZFxuIik7CiAJcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC0xNDgsNyArMTQ4LDcgQEAKICAgICBpZiAoaEluc3QgPD0gMzIpCiAgICAgewogCS8qIEZhaWxlZCB0byBsb2FkIGRyaXZlciAqLwotCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGxvYWQgcHJpbnRlciBkcml2ZXIgJXNcbiIsIHBzekRyaXZlcik7CisJV0FSTih3aW4xNmRydiwgIkZhaWxlZCB0byBsb2FkIHByaW50ZXIgZHJpdmVyICVzXG4iLCBwc3pEcml2ZXIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIFRSQUNFKHdpbjE2ZHJ2LCAiTG9hZGVkIHRoZSBsaWJyYXJ5XG4iKTsKIAkvKiBBbGxvY2F0ZSBzb21lIG1lbW9yeSBmb3IgcHJpbnRlciBkcml2ZXIgaW5mbyAqLwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAJaWYobHBGYWNlTmFtZSkKIAkgICAgU0VHUFRSX0ZSRUUobFAyKTsKICAgICB9IGVsc2UgCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCJGYWlsZWQgdG8gZmluZCBkZXZpY2VcbiIpOworICAgICAgICBXQVJOKHdpbjE2ZHJ2LCJGYWlsZWQgdG8gZmluZCBkZXZpY2VcbiIpOwogICAgIAogICAgIFRSQUNFKHdpbjE2ZHJ2LCAicmV0dXJuICV4XG4iLCB3UmV0KTsKICAgICByZXR1cm4gd1JldDsKQEAgLTM0MCw3ICszNDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQMSwgd1AyLCBsUDMsIGxQNCApOwogICAgIH0KICAgICBlbHNlIAotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiRmFpbGVkIHRvIGZpbmQgZGV2aWNlXG4iKTsKKyAgICAgICAgV0FSTih3aW4xNmRydiwiRmFpbGVkIHRvIGZpbmQgZGV2aWNlXG4iKTsKICAgICAKICAgICBUUkFDRSh3aW4xNmRydiwgInJldHVybiAleFxuIiwgd1JldCk7CiAgICAgcmV0dXJuIHdSZXQ7CkBAIC0zOTUsNyArMzk1LDcgQEAKIAkgICAgY2xpcCA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc2l6ZSApOwogCSAgICBpZighY2xpcCkgCiAJICAgIHsKLQkgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgYWxsb2MgY2xpcCBhcnJheSBpbiBQUlREUlZfT3V0cHV0XG4iKTsKKwkgICAgICAgIFdBUk4od2luMTZkcnYsICJDYW4ndCBhbGxvYyBjbGlwIGFycmF5IGluIFBSVERSVl9PdXRwdXRcbiIpOwogCQlyZXR1cm4gRkFMU0U7CiAJICAgIH0KIAkgICAgR2V0UmVnaW9uRGF0YSggaENsaXBSZ24sIHNpemUsIGNsaXAgKTsKQEAgLTQ4Niw4ICs0ODYsNyBAQAogCiAgICAgICAgIGNhc2UgRFJWT0JKX1BCSVRNQVA6CiAgICAgICAgIGRlZmF1bHQ6Ci0JICAgIGZwcmludGYoc3RkZXJyLCAKLQkgICAgICAgIlBSVERSVl9SZWFsaXplT2JqZWN0OiBPYmplY3QgdHlwZSAlZCBub3Qgc3VwcG9ydGVkXG4iLCB3U3R5bGUpOworCSAgICBXQVJOKHdpbjE2ZHJ2LCAiT2JqZWN0IHR5cGUgJWQgbm90IHN1cHBvcnRlZFxuIiwgd1N0eWxlKTsKICAgICAgICAgICAgIG5TaXplID0gMDsKICAgICAgICAgICAgIAogCX0KQEAgLTY3MCwyNiArNjY5LDI3IEBACiAKIGludCBXSU5BUEkgZG1SZWFsaXplT2JqZWN0KExQUERFVklDRSBscERlc3REZXYsIElOVDE2IHdTdHlsZSwgTFBTVFIgbHBJbk9iaiwgTFBTVFIgbHBPdXRPYmosIFNFR1BUUiBscFRleHRYRm9ybSkKIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImRtUmVhbGl6ZU9iamVjdChscERlc3REZXY6ICUwOHgsIHdTdHlsZTogJTA0eCwgbHBJbk9iajogJTA4eCwgbHBPdXRPYmo6ICUwOHgsIGxwVGV4dFhGb3JtOiAlMDh4KTogc3R1YjogIiwgKFVJTlQzMilscERlc3REZXYsIHdTdHlsZSwgKFVJTlQzMilscEluT2JqLCAoVUlOVDMyKWxwT3V0T2JqLCAoVUlOVDMyKWxwVGV4dFhGb3JtKTsKKyAgICBGSVhNRSh3aW4xNmRydiwgIihscERlc3REZXY9JTA4eCx3U3R5bGU9JTA0eCxscEluT2JqPSUwOHgsbHBPdXRPYmo9JTA4eCxscFRleHRYRm9ybT0lMDh4KTogc3R1YlxuIiwKKyAgICAgICAgKFVJTlQzMilscERlc3REZXYsIHdTdHlsZSwgKFVJTlQzMilscEluT2JqLCAoVUlOVDMyKWxwT3V0T2JqLCAoVUlOVDMyKWxwVGV4dFhGb3JtKTsKICAgICBpZiAod1N0eWxlIDwgMCkgeyAvKiBGcmVlIGV4dHJhIG1lbW9yeSBvZiBnaXZlbiBvYmplY3QncyBzdHJ1Y3R1cmUgKi8KIAlzd2l0Y2ggKCAtd1N0eWxlICkgewogICAgICAgICAgICAgY2FzZSBEUlZPQkpfUEVOOiAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExQTE9HUEVOMTYgRGVsZXRlUGVuID0gKExQTE9HUEVOMTYpbHBJbk9iajsgKi8KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRSVk9CSl9QRU5fZGVsZXRlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0Uod2luMTZkcnYsICJEUlZPQkpfUEVOX2RlbGV0ZVxuIik7CiAJCQkJYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhc2UgRFJWT0JKX0JSVVNIOgl7Ci0JCQkJZnByaW50ZihzdGRlcnIsICJEUlZPQkpfQlJVU0hfZGVsZXRlXG4iKTsKKwkJCQlUUkFDRSh3aW4xNmRydiwgIkRSVk9CSl9CUlVTSF9kZWxldGVcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAkJCQl9CiAgICAgICAgICAgICBjYXNlIERSVk9CSl9GT05UOgl7CiAJCQkJLyogTFBURVhUWEZPUk0xNiBUZXh0WEZvcm0KIAkJCQkJPSAoTFBURVhUWEZPUk0xNilscFRleHRYRm9ybTsgKi8KLQkJCQlmcHJpbnRmKHN0ZGVyciwgIkRSVk9CSl9GT05UX2RlbGV0ZVxuIik7CisJCQkJVFJBQ0Uod2luMTZkcnYsICJEUlZPQkpfRk9OVF9kZWxldGVcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAkJCQl9Ci0gICAgICAgICAgICBjYXNlIERSVk9CSl9QQklUTUFQOiAgICAgICAgZnByaW50ZihzdGRlcnIsICJEUlZPQkpfUEJJVE1BUF9kZWxldGVcbiIpOworICAgICAgICAgICAgY2FzZSBEUlZPQkpfUEJJVE1BUDogICAgICAgIFRSQUNFKHdpbjE2ZHJ2LCAiRFJWT0JKX1BCSVRNQVBfZGVsZXRlXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAJfQogICAgIH0KQEAgLTY5OSw3ICs2OTksNyBAQAogCSAgICBjYXNlIERSVk9CSl9QRU46IHsKIAkJCQlMUExPR1BFTjE2IEluUGVuICA9IChMUExPR1BFTjE2KWxwSW5PYmo7CiAKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIkRSVk9CSl9QRU5cbiIpOworCQkJCVRSQUNFKHdpbjE2ZHJ2LCAiRFJWT0JKX1BFTlxuIik7CiAJCQkJaWYgKGxwT3V0T2JqKSB7CiAJCQkJICAgIGlmIChJblBlbi0+bG9wblN0eWxlID09IFBTX05VTEwpIHsKIAkJCQkJKihEV09SRCAqKWxwT3V0T2JqID0gMDsKQEAgLTcyMiw3ICs3MjIsNyBAQAogCQkJCUxQTE9HQlJVU0gxNiBPdXRCcnVzaCA9IChMUExPR0JSVVNIMTYpbHBPdXRPYmo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExQUE9JTlQxNiBQb2ludCA9IChMUFBPSU5UMTYpbHBUZXh0WEZvcm07ICovCiAKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIkRSVk9CSl9CUlVTSFxuIik7CisJCQkJVFJBQ0Uod2luMTZkcnYsICJEUlZPQkpfQlJVU0hcbiIpOwogCQkJCWlmICghbHBPdXRPYmopIHJldHVybiBzaXplb2YoTE9HQlJVU0gxNik7CiAJCQkJZWxzZSB7CiAJCQkJICAgIE91dEJydXNoLT5sYlN0eWxlID0gSW5CcnVzaC0+bGJTdHlsZTsKQEAgLTczNiwxMCArNzM2LDEwIEBACiAJICAgIGNhc2UgRFJWT0JKX0ZPTlQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTFBURVhUWEZPUk0xNiBUZXh0WEZvcm0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChMUFRFWFRYRk9STTE2KWxwVGV4dFhGb3JtOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRSVk9CSl9GT05UXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0Uod2luMTZkcnYsICJEUlZPQkpfRk9OVFxuIik7CiAJCQkJcmV0dXJuIDA7LyogRElTUExBWS5EUlYgZG9lc24ndCByZWFsaXplIGZvbnRzICovCiAJCQkgICAgICB9Ci0JICAgIGNhc2UgRFJWT0JKX1BCSVRNQVA6CWZwcmludGYoc3RkZXJyLCAiRFJWT0JKX1BCSVRNQVBcbiIpOworCSAgICBjYXNlIERSVk9CSl9QQklUTUFQOglUUkFDRSh3aW4xNmRydiwgIkRSVk9CSl9QQklUTUFQXG4iKTsKIAkJCQkJcmV0dXJuIDA7IC8qIGNyZWF0ZSBtZW1vcnkgYml0bWFwICovCiAJfQogICAgIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbmcuYyBiL2dyYXBoaWNzL3dpbmcuYwppbmRleCA5NjJhNzUyLi5mNmRmZmExIDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW5nLmMKKysrIGIvZ3JhcGhpY3Mvd2luZy5jCkBAIC0xOSw4ICsxOSw2IEBACiAjaW5jbHVkZSAieG1hbGxvYy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLWV4dGVybiB2b2lkIENMSVBQSU5HX1VwZGF0ZUdDUmVnaW9uKERDKiApOwotCiB0eXBlZGVmIGVudW0gV0lOR19ESVRIRVJfVFlQRQogewogICBXSU5HX0RJU1BFUlNFRF80eDQsIFdJTkdfRElTUEVSU0VEXzh4OCwgV0lOR19DTFVTVEVSRURfNHg0CmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvYml0Ymx0LmMgYi9ncmFwaGljcy94MTFkcnYvYml0Ymx0LmMKaW5kZXggZGU2ODEwMy4uNjk5ZDY3YyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L2JpdGJsdC5jCisrKyBiL2dyYXBoaWNzL3gxMWRydi9iaXRibHQuYwpAQCAtMzgsOCArMzgsNiBAQAogI2RlZmluZSBTV0FQX0lOVDMyKGkxLGkyKSBcCiAgICAgZG8geyBJTlQzMiBfX3QgPSAqKGkxKTsgKihpMSkgPSAqKGkyKTsgKihpMikgPSBfX3Q7IH0gd2hpbGUoMCkKIAotZXh0ZXJuIHZvaWQgQ0xJUFBJTkdfVXBkYXRlR0NSZWdpb24oREMqICk7Ci0KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIEJJVEJMVF9PcGNvZGVzWzI1Nl1bTUFYX09QX0xFTl0gPQogewogICAgIHsgT1AoUEFULERTVCxHWGNsZWFyKSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDAwICAwICAgICAgICAgICAgICAqLwpAQCAtMTM4MSw5ICsxMzc5LDExIEBACiAgICAgc3RydWN0IFN0cmV0Y2hCbHRfcGFyYW1zIHBhcmFtcyA9IHsgZGMsIGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCAwLCAwLCByb3AgfTsKICAgICBCT09MMzIgcmVzdWx0OworICAgIERJQl9VcGRhdGVESUJTZWN0aW9uKCBkYywgRkFMU0UgKTsKICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICAgIHJlc3VsdCA9IChCT09MMzIpQ0FMTF9MQVJHRV9TVEFDSyggQklUQkxUX0RvU3RyZXRjaEJsdCwgJnBhcmFtcyApOwogICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CisgICAgRElCX1VwZGF0ZURJQlNlY3Rpb24oIGRjLCBUUlVFICk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTM5OCw5ICsxMzk4LDEzIEBACiAgICAgc3RydWN0IFN0cmV0Y2hCbHRfcGFyYW1zIHBhcmFtcyA9IHsgZGNEc3QsIHhEc3QsIHlEc3QsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNTcmMsIHhTcmMsIHlTcmMsIHdpZHRoLCBoZWlnaHQsIHJvcH07CiAgICAgQk9PTDMyIHJlc3VsdDsKKyAgICBESUJfVXBkYXRlRElCU2VjdGlvbiggZGNEc3QsIEZBTFNFICk7CisgICAgRElCX1VwZGF0ZURJQlNlY3Rpb24oIGRjU3JjLCBGQUxTRSApOwogICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CiAgICAgcmVzdWx0ID0gKEJPT0wzMilDQUxMX0xBUkdFX1NUQUNLKCBCSVRCTFRfRG9TdHJldGNoQmx0LCAmcGFyYW1zICk7CiAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKKyAgICBESUJfVXBkYXRlRElCU2VjdGlvbiggZGNEc3QsIFRSVUUgKTsKKyAgICBESUJfVXBkYXRlRElCU2VjdGlvbiggZGNTcmMsIFRSVUUgKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC0xNDE3LDggKzE0MjEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY1NyYywgeFNyYywgeVNyYywgd2lkdGhTcmMsIGhlaWdodFNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3AgfTsKICAgICBCT09MMzIgcmVzdWx0OworICAgIERJQl9VcGRhdGVESUJTZWN0aW9uKCBkY0RzdCwgRkFMU0UgKTsKKyAgICBESUJfVXBkYXRlRElCU2VjdGlvbiggZGNTcmMsIEZBTFNFICk7CiAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKICAgICByZXN1bHQgPSAoQk9PTDMyKUNBTExfTEFSR0VfU1RBQ0soIEJJVEJMVF9Eb1N0cmV0Y2hCbHQsICZwYXJhbXMgKTsKICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOworICAgIERJQl9VcGRhdGVESUJTZWN0aW9uKCBkY0RzdCwgVFJVRSApOworICAgIERJQl9VcGRhdGVESUJTZWN0aW9uKCBkY1NyYywgVFJVRSApOwogICAgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvYml0bWFwLmMgYi9ncmFwaGljcy94MTFkcnYvYml0bWFwLmMKaW5kZXggOTYwYzNjNy4uZDlhYTk4MSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L2JpdG1hcC5jCisrKyBiL2dyYXBoaWNzL3gxMWRydi9iaXRtYXAuYwpAQCAtMTUsOCArMTUsNiBAQAogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCi1leHRlcm4gdm9pZCBDTElQUElOR19VcGRhdGVHQ1JlZ2lvbihEQyogKTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgWDExRFJWX0JJVE1BUF9Jbml0CiAgKi8KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi9jbGlwcGluZy5jIGIvZ3JhcGhpY3MveDExZHJ2L2NsaXBwaW5nLmMKaW5kZXggOGU4N2NlNS4uODhiMzQ1NSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L2NsaXBwaW5nLmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L2NsaXBwaW5nLmMKQEAgLTI0LDcgKzI0LDcgQEAKICAgICBSR05PQkogKm9iaiA9IChSR05PQkogKikgR0RJX0dldE9ialB0cihkYy0+dy5oR0NDbGlwUmduLCBSRUdJT05fTUFHSUMpOwogICAgIGlmICghb2JqKQogICAgIHsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiWDExRFJWX1NldERldmljZUNsaXBwaW5nOiBSZ24gaXMgMC4gUGxlYXNlIHJlcG9ydCB0aGlzLlxuIik7CisgICAgICAgIEVSUih4MTFkcnYsICJSZ24gaXMgMC4gUGxlYXNlIHJlcG9ydCB0aGlzLlxuIik7CiAgICAgICAgIGV4aXQoMSk7CiAgICAgfQogICAgIApAQCAtMzgsNyArMzgsNyBAQAogCQkJICAgIHNpemVvZigqcFhyZWN0KSAqIG9iai0+cmduLT5udW1SZWN0cyApOwogCWlmKCFwWHJlY3QpCiAJewotCSAgICBmcHJpbnRmKHN0ZGVyciwgIlgxMURSVl9TZXREZXZpY2VDbGlwcGluZygpIGNhbid0IGFsbG9jIGJ1ZmZlclxuIik7CisJICAgIFdBUk4oeDExZHJ2LCAiQ2FuJ3QgYWxsb2MgYnVmZmVyXG4iKTsKIAkgICAgcmV0dXJuOwogCX0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L3hmb250LmMgYi9ncmFwaGljcy94MTFkcnYveGZvbnQuYwppbmRleCBhYWYwZTIwLi4yMzc4ZWMzIDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYveGZvbnQuYworKysgYi9ncmFwaGljcy94MTFkcnYveGZvbnQuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgInRzX3hsaWIuaCIKICNpbmNsdWRlIDxYMTEvWGF0b20uaD4KICNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIm9wdGlvbnMuaCIKICNpbmNsdWRlICJ4MTFmb250LmgiCkBAIC0yOSw3ICszMCw3IEBACiAjZGVmaW5lIFhfRk1DX01BR0lDCQkoMHgwMDAwQ0FGRSkKIAogI2RlZmluZSBNQVhfRk9OVF9GQU1JTElFUwk2NAotI2RlZmluZSBNQVhfTEZEX0xFTkdUSAkJMTI4CisjZGVmaW5lIE1BWF9MRkRfTEVOR1RICQkyNTYKIAogI2RlZmluZSBSRU1PVkVfU1VCU0VUUwkJMQogI2RlZmluZSBVTk1BUktfU1VCU0VUUwkJMApAQCAtMzk2LDYgKzM5Nyw3IEBACiAgICBjb25zdCBjaGFyKiAgbHBFbmNvZGluZyA9IE5VTEw7CiAgICBjaGFyICAgICAgICAgaF9zdHJpbmdbNjRdLCBwb2ludF9zdHJpbmdbNjRdOwogCisgICAqKGxwTEZEK01BWF9MRkRfTEVOR1RILTEpPTA7CiAgICBsc3RyY3B5MzJBKCBscExGRCwgZm8tPmZyLT5yZXNvdXJjZSApOwogCiAvKiBhZGQgd2VpZ2h0ICovCkBAIC01NDMsNiArNTQ1LDcgQEAKICAgIH0KIAogICAgVFJBQ0UoZm9udCwiXHRMRkQ6ICVzXG4iLCBscExGRCApOworICAgYXNzZXJ0KCoobHBMRkQrTUFYX0xGRF9MRU5HVEgtMSk9PTApOyAvKiBjaGVjayBpZiBvdmVyd3JpdHRlbSAqLwogICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTEyNDIsNyArMTI0NSw3IEBACiAgICAgUFJPRklMRV9FbnVtZXJhdGVXaW5lSW5pU2VjdGlvbigiRm9udHMiLCAmWEZPTlRfQ2hlY2tJbmlDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmZm91bmQpOwogICAgIGlmKGZvdW5kKQotICAgIGZwcmludGYoc3RkZXJyLCBmb250bXNnZXBpbG9ndWUpOworICAgIE1TRyhmb250bXNnZXBpbG9ndWUpOwogCiAgICAgcmV0dXJuIDE7CiB9CkBAIC0xMjY3LDIxICsxMjcwLDIxIEBACiAJLyogVmFsaWQga2V5OyBtYWtlIHN1cmUgdGhlIHZhbHVlIGRvZXNuJ3QgY29udGFpbiBhIHdpbGRjYXJkICovCiAJaWYoc3RyY2hyKHZhbHVlLCAnKicpKSB7CiAJICAgIGlmKCooaW50ICopZm91bmQgPT0gMCkgewotCQlmcHJpbnRmKHN0ZGVyciwgZm9udG1zZ3Byb2xvZ3VlKTsKKwkJTVNHKGZvbnRtc2dwcm9sb2d1ZSk7CiAJCSsrKihpbnQgKilmb3VuZDsKIAkgICAgfQogCi0JICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAlcz0lcyBbbm8gd2lsZGNhcmRzIGFsbG93ZWRdXG4iLCBrZXksIHZhbHVlKTsKKwkgICAgTVNHKCIgICAgICVzPSVzIFtubyB3aWxkY2FyZHMgYWxsb3dlZF1cbiIsIGtleSwgdmFsdWUpOwogCX0KICAgICB9CiAgICAgZWxzZSB7CiAJLyogTm90IGEgdmFsaWQga2V5ICovCiAJaWYoKihpbnQgKilmb3VuZCA9PSAwKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCBmb250bXNncHJvbG9ndWUpOworCSAgICBNU0coZm9udG1zZ3Byb2xvZ3VlKTsKIAkgICAgKysqKGludCAqKWZvdW5kOwogICAgIH0KIAotCWZwcmludGYoc3RkZXJyLCAiICAgICAlcz0lcyBbb2Jzb2xldGVdXG4iLCBrZXksIHZhbHVlKTsKKwlNU0coIiAgICAgJXM9JXMgW29ic29sZXRlXVxuIiwga2V5LCB2YWx1ZSk7CiAgICAgfQogCiAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvaWYxNjMyL01ha2VmaWxlLmluIGIvaWYxNjMyL01ha2VmaWxlLmluCmluZGV4IDllOWZlOGYuLmRmYWQyZGQgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9NYWtlZmlsZS5pbgorKysgYi9pZjE2MzIvTWFrZWZpbGUuaW4KQEAgLTE1LDYgKzE1LDcgQEAKIAlsemV4cGFuZC5zcGVjIFwKIAltbXN5c3RlbS5zcGVjIFwKIAltb3VzZS5zcGVjIFwKKwltc3ZpZGVvLnNwZWMgXAogCW9sZTIuc3BlYyBcCiAJb2xlMmNvbnYuc3BlYyBcCiAJb2xlMmRpc3Auc3BlYyBcCmRpZmYgLS1naXQgYS9pZjE2MzIvYnVpbHRpbi5jIGIvaWYxNjMyL2J1aWx0aW4uYwppbmRleCA3NGZkYmQ2Li5iYTlkYjE5IDEwMDY0NAotLS0gYS9pZjE2MzIvYnVpbHRpbi5jCisrKyBiL2lmMTYzMi9idWlsdGluLmMKQEAgLTUzLDYgKzUzLDcgQEAKIGV4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIExaRVhQQU5EX0Rlc2NyaXB0b3I7CiBleHRlcm4gY29uc3QgV0lOMTZfREVTQ1JJUFRPUiBNTVNZU1RFTV9EZXNjcmlwdG9yOwogZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgTU9VU0VfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIE1TVklERU9fRGVzY3JpcHRvcjsKIGV4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIE9MRTJDT05WX0Rlc2NyaXB0b3I7CiBleHRlcm4gY29uc3QgV0lOMTZfREVTQ1JJUFRPUiBPTEUyRElTUF9EZXNjcmlwdG9yOwogZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgT0xFMk5MU19EZXNjcmlwdG9yOwpAQCAtOTYsNiArOTcsNyBAQAogICAgIHsgJkxaRVhQQU5EX0Rlc2NyaXB0b3IsIDAgfSwKICAgICB7ICZNTVNZU1RFTV9EZXNjcmlwdG9yLCAwIH0sCiAgICAgeyAmTU9VU0VfRGVzY3JpcHRvciwgICAgMCB9LAorICAgIHsgJk1TVklERU9fRGVzY3JpcHRvciwgIDAgfSwKICAgICB7ICZPTEUyQ09OVl9EZXNjcmlwdG9yLCBETExfRkxBR19OT1RfVVNFRCB9LAogICAgIHsgJk9MRTJESVNQX0Rlc2NyaXB0b3IsIERMTF9GTEFHX05PVF9VU0VEIH0sCiAgICAgeyAmT0xFMk5MU19EZXNjcmlwdG9yLCAgRExMX0ZMQUdfTk9UX1VTRUQgfSwKZGlmZiAtLWdpdCBhL2lmMTYzMi9kdW1teS5jIGIvaWYxNjMyL2R1bW15LmMKaW5kZXggNGM2N2I1ZC4uZDgxYTE1OSAxMDA2NDQKLS0tIGEvaWYxNjMyL2R1bW15LmMKKysrIGIvaWYxNjMyL2R1bW15LmMKQEAgLTIsNyArMiw2IEBACiAgKiBEdW1teSBmdW5jdGlvbiBkZWZpbml0aW9ucwogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbnR5cGVzLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIApkaWZmIC0tZ2l0IGEvaWYxNjMyL2tlcm5lbC5zcGVjIGIvaWYxNjMyL2tlcm5lbC5zcGVjCmluZGV4IGFkNDUxZDMuLjM4YmQzNjYgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9rZXJuZWwuc3BlYworKysgYi9pZjE2MzIva2VybmVsLnNwZWMKQEAgLTEwNyw3ICsxMDcsNyBAQAogMTA2IHBhc2NhbCBTZXRTd2FwQXJlYVNpemUod29yZCkgU2V0U3dhcEFyZWFTaXplMTYKIDEwNyBwYXNjYWwxNiBTZXRFcnJvck1vZGUod29yZCkgU2V0RXJyb3JNb2RlMTYKIDEwOCBwYXNjYWwxNiBTd2l0Y2hTdGFja1RvKHdvcmQgd29yZCB3b3JkKSBTd2l0Y2hTdGFja1RvCi0xMDkgcmVnaXN0ZXIgU3dpdGNoU3RhY2tCYWNrKHdvcmQgd29yZCB3b3JkKSBTd2l0Y2hTdGFja0JhY2sKKzEwOSByZWdpc3RlciBTd2l0Y2hTdGFja0JhY2soKSBTd2l0Y2hTdGFja0JhY2sKIDExMCBwYXNjYWwxNiBQYXRjaENvZGVIYW5kbGUod29yZCkgUGF0Y2hDb2RlSGFuZGxlCiAxMTEgcGFzY2FsICAgR2xvYmFsV2lyZSh3b3JkKSBHbG9iYWxXaXJlMTYKIDExMiBwYXNjYWwxNiBHbG9iYWxVbldpcmUod29yZCkgR2xvYmFsVW5XaXJlMTYKQEAgLTE0Myw3ICsxNDMsNyBAQAogMTQwIHBhc2NhbDE2IFNldFNpZ0hhbmRsZXIoc2VncHRyIHB0ciBwdHIgd29yZCB3b3JkKSBTZXRTaWdIYW5kbGVyCiAxNDEgc3R1YiBJbml0VGFzazEKIDE0MiBzdHViIEdldFByb2ZpbGVTZWN0aW9uTmFtZXMKLTE0MyBzdHViIEdldFByaXZhdGVQcm9maWxlU2VjdGlvbk5hbWVzCisxNDMgcGFzY2FsMTYgR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uTmFtZXMocHRyIHdvcmQgc3RyKSBHZXRQcml2YXRlUHJvZmlsZVNlY3Rpb25OYW1lczE2CiAxNDQgcGFzY2FsMTYgQ3JlYXRlRGlyZWN0b3J5KHB0ciBwdHIpIENyZWF0ZURpcmVjdG9yeTE2CiAxNDUgcGFzY2FsMTYgUmVtb3ZlRGlyZWN0b3J5KHB0cikgUmVtb3ZlRGlyZWN0b3J5MTYKIDE0NiBwYXNjYWwxNiBEZWxldGVGaWxlKHB0cikgRGVsZXRlRmlsZTE2CkBAIC0yODAsNyArMjgwLDcgQEAKIDM1NyBwYXNjYWwgTWFwU0woc2VncHRyKSBNYXBTTAogMzU4IHBhc2NhbCBNYXBMUyhsb25nKSBNYXBMUwogMzU5IHBhc2NhbCBVbk1hcExTKHNlZ3B0cikgVW5NYXBMUwotMzYwIHN0dWIgT3BlbkZpbGVFeAorMzYwIHBhc2NhbDE2IE9wZW5GaWxlRXgoc3RyIHB0ciB3b3JkKSBPcGVuRmlsZTE2CiAjMzYxIFBJR0xFVF8zNjEKIDM2NSBzdHViIEtFUk5FTF8zNjUKIDQwMyBwYXNjYWwxNiBGYXJTZXRPd25lcih3b3JkIHdvcmQpIEZhclNldE93bmVyCkBAIC0zMTEsNiArMzExLDggQEAKIDQ0NyBzdHViIEtFUk5FTF80NDcKIDQ0OSBwYXNjYWwgS0VSTkVMXzQ0OSgpIEtFUk5FTF80NDkKIDQ1MCBwYXNjYWwxNiBLRVJORUxfNDUwKCkgc3R1Yl9LRVJORUxfNDUwCis0NTIgc3R1YiBLRVJORUxfNDUyCis0NTMgc3R1YiBLRVJORUxfNDUzCiA0NTQgZXF1YXRlIF9fRkxBVENTIDAgICAjIGluaXRpYWxpemVkIGJ5IEJVSUxUSU5fSW5pdCgpCiA0NTUgZXF1YXRlIF9fRkxBVERTIDAgICAjIGluaXRpYWxpemVkIGJ5IEJVSUxUSU5fSW5pdCgpCiA0NzEgcGFzY2FsIEtFUk5FTF80NzEoKSBfS0VSTkVMXzQ3MQpAQCAtMzIxLDYgKzMyMyw3IEBACiA0ODEgc3R1YiBLRVJORUxfNDgxCiA0ODIgcGFzY2FsIExvYWRMaWJyYXJ5MzIoc3RyKSBMb2FkTGlicmFyeTMyQQogNDg1IHN0dWIgS0VSTkVMXzQ4NQorNDg2IHN0dWIgS0VSTkVMXzQ4NgogNDkxIHN0dWIgUmVnaXN0ZXJTZXJ2aWNlUHJvY2VzcwogNTAwIHN0dWIgS0VSTkVMXzUwMAogNTAyIHN0dWIgS0VSTkVMXzUwMgpkaWZmIC0tZ2l0IGEvaWYxNjMyL21zdmlkZW8uc3BlYyBiL2lmMTYzMi9tc3ZpZGVvLnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiNmUxYQotLS0gL2Rldi9udWxsCisrKyBiL2lmMTYzMi9tc3ZpZGVvLnNwZWMKQEAgLTAsMCArMSw2OSBAQAorbmFtZSBtc3ZpZGVvCit0eXBlIHdpbjE2CisKKzIgc3R1YiBWSURFT0ZPUldJTkRPV1NWRVJTSU9OCisyMCBzdHViIFZJREVPR0VUTlVNREVWUworMjEgc3R1YiBWSURFT0dFVEVSUk9SVEVYVAorMjIgc3R1YiBWSURFT0NBUERSSVZFUkRFU0NBTkRWRVIKKzI4IHN0dWIgVklERU9PUEVOCisyOSBzdHViIFZJREVPQ0xPU0UKKzMwIHN0dWIgVklERU9ESUFMT0cKKzMxIHN0dWIgVklERU9GUkFNRQorMzIgc3R1YiBWSURFT0NPTkZJR1VSRQorMzMgc3R1YiBWSURFT0NPTkZJR1VSRVNUT1JBR0UKKzM0IHN0dWIgVklERU9HRVRDSEFOTkVMQ0FQUworMzUgc3R1YiBWSURFT1VQREFURQorNDAgc3R1YiBWSURFT1NUUkVBTUFEREJVRkZFUgorNDEgc3R1YiBWSURFT1NUUkVBTUZJTkkKKzQyIHN0dWIgVklERU9TVFJFQU1HRVRFUlJPUgorNDMgc3R1YiBWSURFT1NUUkVBTUdFVFBPU0lUSU9OCis0NCBzdHViIFZJREVPU1RSRUFNSU5JVAorNDYgc3R1YiBWSURFT1NUUkVBTVBSRVBBUkVIRUFERVIKKzQ3IHN0dWIgVklERU9TVFJFQU1SRVNFVAorNDkgc3R1YiBWSURFT1NUUkVBTVNUQVJUCis1MCBzdHViIFZJREVPU1RSRUFNU1RPUAorNTEgc3R1YiBWSURFT1NUUkVBTVVOUFJFUEFSRUhFQURFUgorNTIgc3R1YiBWSURFT1NUUkVBTUFMTE9DSERSQU5EQlVGRkVSCis1MyBzdHViIFZJREVPU1RSRUFNRlJFRUhEUkFOREJVRkZFUgorNjAgc3R1YiBWSURFT01FU1NBR0UKKzEwMiBzdHViIERSQVdESUJPUEVOCisxMDMgc3R1YiBEUkFXRElCQ0xPU0UKKzEwNCBzdHViIERSQVdESUJCRUdJTgorMTA1IHN0dWIgRFJBV0RJQkVORAorMTA2IHN0dWIgRFJBV0RJQkRSQVcKKzEwOCBzdHViIERSQVdESUJHRVRQQUxFVFRFCisxMTAgc3R1YiBEUkFXRElCU0VUUEFMRVRURQorMTExIHN0dWIgRFJBV0RJQkNIQU5HRVBBTEVUVEUKKzExMiBzdHViIERSQVdESUJSRUFMSVpFCisxMTMgc3R1YiBEUkFXRElCVElNRQorMTE0IHN0dWIgRFJBV0RJQlBST0ZJTEVESVNQTEFZCisxMTUgc3R1YiBTVFJFVENIRElCCisxMTggc3R1YiBEUkFXRElCU1RBUlQKKzExOSBzdHViIERSQVdESUJTVE9QCisxMjAgc3R1YiBEUkFXRElCR0VUQlVGRkVSCisyMDAgc3R1YiBJQ0lORk8KKzIwMSBzdHViIElDSU5TVEFMTAorMjAyIHN0dWIgSUNSRU1PVkUKKzIwMyBzdHViIElDT1BFTgorMjA0IHN0dWIgSUNDTE9TRQorMjA1IHN0dWIgSUNTRU5ETUVTU0FHRQorMjA2IHN0dWIgSUNPUEVORlVOQ1RJT04KKzIwNyBzdHViIF9JQ01FU1NBR0UKKzIxMiBzdHViIElDR0VUSU5GTworMjEzIHN0dWIgSUNMT0NBVEUKKzIyNCBzdHViIF9JQ0NPTVBSRVNTCisyMzAgc3R1YiBfSUNERUNPTVBSRVNTCisyMzIgc3R1YiBfSUNEUkFXQkVHSU4KKzIzNCBzdHViIF9JQ0RSQVcKKzIzOSBzdHViIElDR0VURElTUExBWUZPUk1BVAorMjQwIHN0dWIgSUNJTUFHRUNPTVBSRVNTCisyNDEgc3R1YiBJQ0lNQUdFREVDT01QUkVTUworMjQyIHN0dWIgSUNDT01QUkVTU09SQ0hPT1NFCisyNDMgc3R1YiBJQ0NPTVBSRVNTT1JGUkVFCisyNDQgc3R1YiBJQ1NFUUNPTVBSRVNTRlJBTUVTVEFSVAorMjQ1IHN0dWIgSUNTRVFDT01QUkVTU0ZSQU1FRU5ECisyNDYgc3R1YiBJQ1NFUUNPTVBSRVNTRlJBTUUKKzI1MCBzdHViIF9NQ0lXTkRDUkVBVEUKKzI1MSBzdHViIF9NQ0lXTkRSRUdJU1RFUkNMQVNTCisyNTIgc3R1YiBHRVRPUEVORklMRU5BTUVQUkVWSUVXCisyNTMgc3R1YiBHRVRTQVZFRklMRU5BTUVQUkVWSUVXCmRpZmYgLS1naXQgYS9pZjE2MzIvcmVsYXkuYyBiL2lmMTYzMi9yZWxheS5jCmluZGV4IDE5OTlkNzYuLjMxMzVkOWMgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9yZWxheS5jCisrKyBiL2lmMTYzMi9yZWxheS5jCkBAIC00LDcgKzQsNiBAQAogICovCiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5udC5oIgpAQCAtNzEsOSArNzAsOSBAQAogICAgIGlmICghVFJBQ0VfT04ocmVsYXkpKSByZXR1cm47CiAKICAgICBmcmFtZSA9IENVUlJFTlRfU1RBQ0sxNjsKLSAgICBwcmludGYoICJDYWxsICVzKCIsIEJVSUxUSU5fR2V0RW50cnlQb2ludDE2KCBmcmFtZS0+ZW50cnlfY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmVudHJ5X2lwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmRpbmFsICkpOworICAgIERQUklOVEYoICJDYWxsICVzKCIsIEJVSUxUSU5fR2V0RW50cnlQb2ludDE2KCBmcmFtZS0+ZW50cnlfY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5lbnRyeV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9yZGluYWwgKSk7CiAgICAgVkFfU1RBUlQxNiggYXJnczE2ICk7CiAKICAgICBpZiAoZnVuY190eXBlICYgNCkgIC8qIGNkZWNsICovCkBAIC04NCwzMiArODMsMzIgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgJ3cnOgogICAgICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCAiMHglMDR4IiwgKihXT1JEICopYXJnczE2ICk7CisgICAgICAgICAgICAgICAgRFBSSU5URiggIjB4JTA0eCIsICooV09SRCAqKWFyZ3MxNiApOwogICAgICAgICAgICAgICAgIGFyZ3MxNiArPSAyOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnbCc6Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCAiMHglMDh4IiwgKihpbnQgKilhcmdzMTYgKTsKKyAgICAgICAgICAgICAgICBEUFJJTlRGKCAiMHglMDh4IiwgKihpbnQgKilhcmdzMTYgKTsKICAgICAgICAgICAgICAgICBhcmdzMTYgKz0gNDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgICAgIHByaW50ZiggIiUwNHg6JTA0eCIsICooV09SRCAqKShhcmdzMTYrMiksICooV09SRCAqKWFyZ3MxNiApOworICAgICAgICAgICAgICAgIERQUklOVEYoICIlMDR4OiUwNHgiLCAqKFdPUkQgKikoYXJnczE2KzIpLCAqKFdPUkQgKilhcmdzMTYgKTsKICAgICAgICAgICAgICAgICBpZiAoSElXT1JEKCooU0VHUFRSICopYXJnczE2KSkKICAgICAgICAgICAgICAgICAgICAgZGVidWdfZHVtcHN0ciggKExQU1RSKVBUUl9TRUdfVE9fTElOKCooU0VHUFRSICopYXJnczE2ICkpOwogICAgICAgICAgICAgICAgIGFyZ3MxNiArPSA0OwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAncCc6Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCAiJTA0eDolMDR4IiwgKihXT1JEICopKGFyZ3MxNisyKSwgKihXT1JEICopYXJnczE2ICk7CisgICAgICAgICAgICAgICAgRFBSSU5URiggIiUwNHg6JTA0eCIsICooV09SRCAqKShhcmdzMTYrMiksICooV09SRCAqKWFyZ3MxNiApOwogICAgICAgICAgICAgICAgIGFyZ3MxNiArPSA0OwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnVCc6Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCAiJTA0eDolMDR4IiwgKihXT1JEICopKGFyZ3MxNisyKSwgKihXT1JEICopYXJnczE2ICk7CisgICAgICAgICAgICAgICAgRFBSSU5URiggIiUwNHg6JTA0eCIsICooV09SRCAqKShhcmdzMTYrMiksICooV09SRCAqKWFyZ3MxNiApOwogICAgICAgICAgICAgICAgIGlmIChISVdPUkQoICooU0VHUFRSICopYXJnczE2ICkpCiAgICAgICAgICAgICAgICAgICAgIGRlYnVnX2R1bXBzdHIoIChMUFNUUilQVFJfU0VHX1RPX0xJTigqKFNFR1BUUiAqKWFyZ3MxNiApKTsKICAgICAgICAgICAgICAgICBhcmdzMTYgKz0gNDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICAgIGlmICgqYXJncykgcHJpbnRmKCAiLCIgKTsKKyAgICAgICAgICAgIGlmICgqYXJncykgRFBSSU5URiggIiwiICk7CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSAgLyogbm90IGNkZWNsICovCkBAIC0xMzksNDIgKzEzOCw0MiBAQAogICAgICAgICAgICAgY2FzZSAndyc6CiAgICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICAgICBhcmdzMTYgLT0gMjsKLSAgICAgICAgICAgICAgICBwcmludGYoICIweCUwNHgiLCAqKFdPUkQgKilhcmdzMTYgKTsKKyAgICAgICAgICAgICAgICBEUFJJTlRGKCAiMHglMDR4IiwgKihXT1JEICopYXJnczE2ICk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdsJzoKICAgICAgICAgICAgICAgICBhcmdzMTYgLT0gNDsKLSAgICAgICAgICAgICAgICBwcmludGYoICIweCUwOHgiLCAqKGludCAqKWFyZ3MxNiApOworICAgICAgICAgICAgICAgIERQUklOVEYoICIweCUwOHgiLCAqKGludCAqKWFyZ3MxNiApOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgICAgICAgYXJnczE2IC09IDQ7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCAiMHglMDh4IiwgKihpbnQgKilhcmdzMTYgKTsKKyAgICAgICAgICAgICAgICBEUFJJTlRGKCAiMHglMDh4IiwgKihpbnQgKilhcmdzMTYgKTsKICAgICAgICAgICAgICAgICBpZiAoSElXT1JEKCooU0VHUFRSICopYXJnczE2KSkKICAgICAgICAgICAgICAgICAgICAgZGVidWdfZHVtcHN0ciggKExQU1RSKVBUUl9TRUdfVE9fTElOKCooU0VHUFRSICopYXJnczE2ICkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAncCc6CiAgICAgICAgICAgICAgICAgYXJnczE2IC09IDQ7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCAiJTA0eDolMDR4IiwgKihXT1JEICopKGFyZ3MxNisyKSwgKihXT1JEICopYXJnczE2ICk7CisgICAgICAgICAgICAgICAgRFBSSU5URiggIiUwNHg6JTA0eCIsICooV09SRCAqKShhcmdzMTYrMiksICooV09SRCAqKWFyZ3MxNiApOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnVCc6CiAgICAgICAgICAgICAgICAgYXJnczE2IC09IDQ7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCAiJTA0eDolMDR4IiwgKihXT1JEICopKGFyZ3MxNisyKSwgKihXT1JEICopYXJnczE2ICk7CisgICAgICAgICAgICAgICAgRFBSSU5URiggIiUwNHg6JTA0eCIsICooV09SRCAqKShhcmdzMTYrMiksICooV09SRCAqKWFyZ3MxNiApOwogICAgICAgICAgICAgICAgIGlmIChISVdPUkQoICooU0VHUFRSICopYXJnczE2ICkpCiAgICAgICAgICAgICAgICAgICAgIGRlYnVnX2R1bXBzdHIoIChMUFNUUilQVFJfU0VHX1RPX0xJTigqKFNFR1BUUiAqKWFyZ3MxNiApKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICAgIGlmICgqYXJncykgcHJpbnRmKCAiLCIgKTsKKyAgICAgICAgICAgIGlmICgqYXJncykgRFBSSU5URiggIiwiICk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcmludGYoICIpIHJldD0lMDR4OiUwNHggZHM9JTA0eFxuIiwgZnJhbWUtPmNzLCBmcmFtZS0+aXAsIGZyYW1lLT5kcyApOworICAgIERQUklOVEYoICIpIHJldD0lMDR4OiUwNHggZHM9JTA0eFxuIiwgZnJhbWUtPmNzLCBmcmFtZS0+aXAsIGZyYW1lLT5kcyApOwogICAgIFZBX0VORDE2KCBhcmdzMTYgKTsKIAogICAgIGlmIChmdW5jX3R5cGUgJiAyKSAgLyogcmVnaXN0ZXIgZnVuY3Rpb24gKi8KLSAgICAgICAgcHJpbnRmKCAiICAgICBBWD0lMDR4IEJYPSUwNHggQ1g9JTA0eCBEWD0lMDR4IFNJPSUwNHggREk9JTA0eCBFUz0lMDR4IEVGTD0lMDhseFxuIiwKLSAgICAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCksIEJYX3JlZyhjb250ZXh0KSwgQ1hfcmVnKGNvbnRleHQpLAotICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSwgU0lfcmVnKGNvbnRleHQpLCBESV9yZWcoY29udGV4dCksCi0gICAgICAgICAgICAgICAgKFdPUkQpRVNfcmVnKGNvbnRleHQpLCBFRkxfcmVnKGNvbnRleHQpICk7CisgICAgICAgIERQUklOVEYoICIgICAgIEFYPSUwNHggQlg9JTA0eCBDWD0lMDR4IERYPSUwNHggU0k9JTA0eCBEST0lMDR4IEVTPSUwNHggRUZMPSUwOGx4XG4iLAorICAgICAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCksIEJYX3JlZyhjb250ZXh0KSwgQ1hfcmVnKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCksIFNJX3JlZyhjb250ZXh0KSwgRElfcmVnKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAoV09SRClFU19yZWcoY29udGV4dCksIEVGTF9yZWcoY29udGV4dCkgKTsKIH0KIAogCkBAIC0xODgsMjMgKzE4NywyMyBAQAogCiAgICAgaWYgKCFUUkFDRV9PTihyZWxheSkpIHJldHVybjsKICAgICBmcmFtZSA9IENVUlJFTlRfU1RBQ0sxNjsKLSAgICBwcmludGYoICJSZXQgICVzKCkgIiwgQlVJTFRJTl9HZXRFbnRyeVBvaW50MTYoIGZyYW1lLT5lbnRyeV9jcywKKyAgICBEUFJJTlRGKCAiUmV0ICAlcygpICIsIEJVSUxUSU5fR2V0RW50cnlQb2ludDE2KCBmcmFtZS0+ZW50cnlfY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+ZW50cnlfaXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3JkaW5hbCApKTsKICAgICBzd2l0Y2goZnVuY190eXBlKQogICAgIHsKICAgICBjYXNlIDA6IC8qIGxvbmcgKi8KLSAgICAgICAgcHJpbnRmKCAicmV0dmFsPTB4JTA4eCByZXQ9JTA0eDolMDR4IGRzPSUwNHhcbiIsCi0gICAgICAgICAgICAgICAgcmV0X3ZhbCwgZnJhbWUtPmNzLCBmcmFtZS0+aXAsIGZyYW1lLT5kcyApOworICAgICAgICBEUFJJTlRGKCAicmV0dmFsPTB4JTA4eCByZXQ9JTA0eDolMDR4IGRzPSUwNHhcbiIsCisgICAgICAgICAgICAgICAgIHJldF92YWwsIGZyYW1lLT5jcywgZnJhbWUtPmlwLCBmcmFtZS0+ZHMgKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxOiAvKiB3b3JkICovCi0gICAgICAgIHByaW50ZiggInJldHZhbD0weCUwNHggcmV0PSUwNHg6JTA0eCBkcz0lMDR4XG4iLAotICAgICAgICAgICAgICAgIHJldF92YWwgJiAweGZmZmYsIGZyYW1lLT5jcywgZnJhbWUtPmlwLCBmcmFtZS0+ZHMgKTsKKyAgICAgICAgRFBSSU5URiggInJldHZhbD0weCUwNHggcmV0PSUwNHg6JTA0eCBkcz0lMDR4XG4iLAorICAgICAgICAgICAgICAgICByZXRfdmFsICYgMHhmZmZmLCBmcmFtZS0+Y3MsIGZyYW1lLT5pcCwgZnJhbWUtPmRzICk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMjogLyogcmVncyAqLwotICAgICAgICBwcmludGYoICJyZXR2YWw9bm9uZSByZXQ9JTA0eDolMDR4IGRzPSUwNHhcbiIsCisgICAgICAgIERQUklOVEYoInJldHZhbD1ub25lIHJldD0lMDR4OiUwNHggZHM9JTA0eFxuIiwKICAgICAgICAgICAgICAgICAoV09SRClDU19yZWcoY29udGV4dCksIElQX3JlZyhjb250ZXh0KSwgKFdPUkQpRFNfcmVnKGNvbnRleHQpKTsKLSAgICAgICAgcHJpbnRmKCAiICAgICBBWD0lMDR4IEJYPSUwNHggQ1g9JTA0eCBEWD0lMDR4IFNJPSUwNHggREk9JTA0eCBFUz0lMDR4IEVGTD0lMDhseFxuIiwKKyAgICAgICAgRFBSSU5URigiICAgICBBWD0lMDR4IEJYPSUwNHggQ1g9JTA0eCBEWD0lMDR4IFNJPSUwNHggREk9JTA0eCBFUz0lMDR4IEVGTD0lMDhseFxuIiwKICAgICAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCksIEJYX3JlZyhjb250ZXh0KSwgQ1hfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSwgU0lfcmVnKGNvbnRleHQpLCBESV9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgKFdPUkQpRVNfcmVnKGNvbnRleHQpLCBFRkxfcmVnKGNvbnRleHQpICk7CkBAIC0yNTEsMjUgKzI1MCwyNSBAQAogICAgIHsKICAgICAgICAgQ09OVEVYVCAqY29udGV4dCA9IChDT05URVhUICopc3RhY2tbMF07CiAgICAgICAgIFdPUkQgKnN0YWNrMTYgPSAoV09SRCAqKVRIUkVBRF9TVEFDSzE2KHRoZGIpOwotICAgICAgICBwcmludGYoICJDYWxsVG8xNihmdW5jPSUwNGx4OiUwNHgsZHM9JTA0bHgiLAorICAgICAgICBEUFJJTlRGKCJDYWxsVG8xNihmdW5jPSUwNGx4OiUwNHgsZHM9JTA0bHgiLAogICAgICAgICAgICAgICAgIENTX3JlZyhjb250ZXh0KSwgSVBfcmVnKGNvbnRleHQpLCBEU19yZWcoY29udGV4dCkgKTsKICAgICAgICAgbmJfYXJncyA9IHN0YWNrWzFdIC8gc2l6ZW9mKFdPUkQpOwogICAgICAgICB3aGlsZSAobmJfYXJncy0tKSBwcmludGYoICIsMHglMDR4IiwgKigtLXN0YWNrMTYpICk7Ci0gICAgICAgIHByaW50ZiggIikgc3M6c3A9JTA0eDolMDR4XG4iLCBTRUxFQ1RPUk9GKHRoZGItPmN1cl9zdGFjayksCisgICAgICAgIERQUklOVEYoIikgc3M6c3A9JTA0eDolMDR4XG4iLCBTRUxFQ1RPUk9GKHRoZGItPmN1cl9zdGFjayksCiAgICAgICAgICAgICAgICAgT0ZGU0VUT0YodGhkYi0+Y3VyX3N0YWNrKSApOwotICAgICAgICBwcmludGYoICIgICAgIEFYPSUwNHggQlg9JTA0eCBDWD0lMDR4IERYPSUwNHggU0k9JTA0eCBEST0lMDR4IEJQPSUwNHggRVM9JTA0eFxuIiwKKyAgICAgICAgRFBSSU5URigiICAgICBBWD0lMDR4IEJYPSUwNHggQ1g9JTA0eCBEWD0lMDR4IFNJPSUwNHggREk9JTA0eCBCUD0lMDR4IEVTPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpLCBCWF9yZWcoY29udGV4dCksIENYX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCksIFNJX3JlZyhjb250ZXh0KSwgRElfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgIEJQX3JlZyhjb250ZXh0KSwgKFdPUkQpRVNfcmVnKGNvbnRleHQpICk7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIHByaW50ZiggIkNhbGxUbzE2KGZ1bmM9JTA0eDolMDR4LGRzPSUwNHgiLAorICAgICAgICBEUFJJTlRGKCJDYWxsVG8xNihmdW5jPSUwNHg6JTA0eCxkcz0lMDR4IiwKICAgICAgICAgICAgICAgICBISVdPUkQoc3RhY2tbMF0pLCBMT1dPUkQoc3RhY2tbMF0pLAogICAgICAgICAgICAgICAgIFNFTEVDVE9ST0YodGhkYi0+Y3VyX3N0YWNrKSApOwogICAgICAgICBzdGFjaysrOwotICAgICAgICB3aGlsZSAobmJfYXJncy0tKSBwcmludGYoICIsMHglMDR4IiwgKnN0YWNrKysgKTsKLSAgICAgICAgcHJpbnRmKCAiKSBzczpzcD0lMDR4OiUwNHhcbiIsIFNFTEVDVE9ST0YodGhkYi0+Y3VyX3N0YWNrKSwKKyAgICAgICAgd2hpbGUgKG5iX2FyZ3MtLSkgRFBSSU5URigiLDB4JTA0eCIsICpzdGFjaysrICk7CisgICAgICAgIERQUklOVEYoIikgc3M6c3A9JTA0eDolMDR4XG4iLCBTRUxFQ1RPUk9GKHRoZGItPmN1cl9zdGFjayksCiAgICAgICAgICAgICAgICAgT0ZGU0VUT0YodGhkYi0+Y3VyX3N0YWNrKSApOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2lmMTYzMi9zaWduYWwuYyBiL2lmMTYzMi9zaWduYWwuYwppbmRleCA5YzIyZDgyLi5hMzEwY2Y4IDEwMDY0NAotLS0gYS9pZjE2MzIvc2lnbmFsLmMKKysrIGIvaWYxNjMyL3NpZ25hbC5jCkBAIC00LDcgKzQsNiBAQAogICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0yNCw2ICsyMywzMCBAQAogI2luY2x1ZGUgInRocmVhZC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgU0lHTkFMX3RyYXBzW10gPQoreworICAgICJEaXZpc2lvbiBieSB6ZXJvIGV4Y2VwdGlvbiIsICAgICAgLyogMCAqLworICAgICJEZWJ1ZyBleGNlcHRpb24iLCAgICAgICAgICAgICAgICAgLyogMSAqLworICAgICJOTUkgaW50ZXJydXB0IiwgICAgICAgICAgICAgICAgICAgLyogMiAqLworICAgICJCcmVha3BvaW50IGV4Y2VwdGlvbiIsICAgICAgICAgICAgLyogMyAqLworICAgICJPdmVyZmxvdyBleGNlcHRpb24iLCAgICAgICAgICAgICAgLyogNCAqLworICAgICJCb3VuZCByYW5nZSBleGNlcHRpb24iLCAgICAgICAgICAgLyogNSAqLworICAgICJJbnZhbGlkIG9wY29kZSBleGNlcHRpb24iLCAgICAgICAgLyogNiAqLworICAgICJEZXZpY2Ugbm90IGF2YWlsYWJsZSBleGNlcHRpb24iLCAgLyogNyAqLworICAgICJEb3VibGUgZmF1bHQgZXhjZXB0aW9uIiwgICAgICAgICAgLyogOCAqLworICAgICJDb3Byb2Nlc3NvciBzZWdtZW50IG92ZXJydW4iLCAgICAgLyogOSAqLworICAgICJJbnZhbGlkIFRTUyBleGNlcHRpb24iLCAgICAgICAgICAgLyogMTAgKi8KKyAgICAiU2VnbWVudCBub3QgcHJlc2VudCBleGNlcHRpb24iLCAgIC8qIDExICovCisgICAgIlN0YWNrIGZhdWx0IiwgICAgICAgICAgICAgICAgICAgICAvKiAxMiAqLworICAgICJHZW5lcmFsIHByb3RlY3Rpb24gZmF1bHQiLCAgICAgICAgLyogMTMgKi8KKyAgICAiUGFnZSBmYXVsdCIsICAgICAgICAgICAgICAgICAgICAgIC8qIDE0ICovCisgICAgIlVua25vd24gZXhjZXB0aW9uIiwgICAgICAgICAgICAgICAvKiAxNSAqLworICAgICJGbG9hdGluZyBwb2ludCBleGNlcHRpb24iLCAgICAgICAgLyogMTYgKi8KKyAgICAiQWxpZ25tZW50IGNoZWNrIGV4Y2VwdGlvbiIsICAgICAgIC8qIDE3ICovCisgICAgIk1hY2hpbmUgY2hlY2sgZXhjZXB0aW9uIiAgICAgICAgICAvKiAxOCAqLworfTsKKworI2RlZmluZSBOQl9UUkFQUyAgKHNpemVvZihTSUdOQUxfdHJhcHMpIC8gc2l6ZW9mKFNJR05BTF90cmFwc1swXSkpCiAKIGV4dGVybiB2b2lkIFNJR05BTF9TZXRIYW5kbGVyKCBpbnQgc2lnLCB2b2lkICgqZnVuYykoKSwgaW50IGZsYWdzICk7CiBleHRlcm4gQk9PTDMyIElOU1RSX0VtdWxhdGVJbnN0cnVjdGlvbiggU0lHQ09OVEVYVCAqY29udGV4dCApOwpAQCAtNjIsMjAgKzg1LDI1IEBACiAgKi8KIHN0YXRpYyBIQU5ETEVSX0RFRihTSUdOQUxfZmF1bHQpCiB7CisgICAgY29uc3QgY2hhciAqZmF1bHQgPSAiU2VnbWVudGF0aW9uIGZhdWx0IjsKKwogICAgIEhBTkRMRVJfSU5JVCgpOwogICAgIGlmIChJTlNUUl9FbXVsYXRlSW5zdHJ1Y3Rpb24oIEhBTkRMRVJfQ09OVEVYVCApKSByZXR1cm47CisjaWZkZWYgVFJBUF9zaWcKKyAgICBpZiAoVFJBUF9zaWcoIEhBTkRMRVJfQ09OVEVYVCApIDwgTkJfVFJBUFMpCisgICAgICAgIGZhdWx0ID0gU0lHTkFMX3RyYXBzW1RSQVBfc2lnKCBIQU5ETEVSX0NPTlRFWFQgKV07CisjZW5kaWYKICAgICBpZiAoSVNfU0VMRUNUT1JfU1lTVEVNKENTX3NpZyhIQU5ETEVSX0NPTlRFWFQpKSkKICAgICB7Ci0gICAgICAgIE1TRygiU2VnbWVudGF0aW9uIGZhdWx0IGluIDMyLWJpdCBjb2RlICgweCUwOGx4KS5cbiIsCi0gICAgICAgICAgICBFSVBfc2lnKEhBTkRMRVJfQ09OVEVYVCkgKTsKKyAgICAgICAgTVNHKCIlcyBpbiAzMi1iaXQgY29kZSAoMHglMDhseCkuXG4iLCBmYXVsdCwgRUlQX3NpZyhIQU5ETEVSX0NPTlRFWFQpKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgTVNHKCJTZWdtZW50YXRpb24gZmF1bHQgaW4gMTYtYml0IGNvZGUgKCUwNHg6JTA0bHgpLlxuIiwKKyAgICAgICAgTVNHKCIlcyBpbiAxNi1iaXQgY29kZSAoJTA0eDolMDRseCkuXG4iLCBmYXVsdCwKICAgICAgICAgICAgIChXT1JEKUNTX3NpZyhIQU5ETEVSX0NPTlRFWFQpLCBFSVBfc2lnKEhBTkRMRVJfQ09OVEVYVCkgKTsKICAgICB9CiAjaWZkZWYgQ1IyX3NpZwotICAgIGZwcmludGYoc3RkZXJyLCJGYXVsdCBhZGRyZXNzIGlzIDB4JTA4bHhcbiIsQ1IyX3NpZyhIQU5ETEVSX0NPTlRFWFQpKTsKKyAgICBNU0coIkZhdWx0IGFkZHJlc3MgaXMgMHglMDhseFxuIixDUjJfc2lnKEhBTkRMRVJfQ09OVEVYVCkpOwogI2VuZGlmCiAgICAgd2luZV9kZWJ1Zyggc2lnbmFsLCBIQU5ETEVSX0NPTlRFWFQgKTsKIH0KZGlmZiAtLWdpdCBhL2lmMTYzMi90aHVuay5jIGIvaWYxNjMyL3RodW5rLmMKaW5kZXggYzQ3NDBkNC4uZmVjM2I5ZSAxMDA2NDQKLS0tIGEvaWYxNjMyL3RodW5rLmMKKysrIGIvaWYxNjMyL3RodW5rLmMKQEAgLTIsOSArMiw5IEBACiAgKiBFbXVsYXRvciB0aHVua3MKICAqCiAgKiBDb3B5cmlnaHQgMTk5NiwgMTk5NyBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqIENvcHlyaWdodCAxOTk4ICAgICAgIFVscmljaCBXZWlnYW5kCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAicmVzb3VyY2UuaCIKQEAgLTEzLDEyICsxMywxNCBAQAogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJob29rLmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCisjaW5jbHVkZSAicHJvY2Vzcy5oIgogI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKICNpbmNsdWRlICJzZWxlY3RvcnMuaCIKICNpbmNsdWRlICJ0YXNrLmgiCiAjaW5jbHVkZSAiZXhjZXB0LmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJmbGF0dGh1bmsuaCIKIAogCiAvKiBMaXN0IG9mIHRoZSAxNi1iaXQgY2FsbGJhY2sgZnVuY3Rpb25zLiBUaGlzIGxpc3QgaXMgdXNlZCAgKi8KQEAgLTcxMCwzICs3MTIsMjM4IEBACiAgICAgCSpwZHdyZXQgPSByZXQ7CiAgICAgcmV0dXJuIFRSVUU7CiB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAxNi0+MzIgRmxhdCBUaHVuayByb3V0aW5lczoKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICBUaHVua0Nvbm5lY3QxNiAgICAgICAgICAoS0VSTkVMLjY1MSkKKyAqIENvbm5lY3RzIGEgMzJiaXQgYW5kIGEgMTZiaXQgdGh1bmtidWZmZXIuCisgKi8KK1VJTlQzMiBXSU5BUEkgVGh1bmtDb25uZWN0MTYoCisgICAgICAgIExQU1RSIG1vZHVsZTE2LCAgICAgICAgICAgICAgLyogW2luXSBuYW1lIG9mIHdpbjE2IGRsbCAqLworICAgICAgICBMUFNUUiBtb2R1bGUzMiwgICAgICAgICAgICAgIC8qIFtpbl0gbmFtZSBvZiB3aW4zMiBkbGwgKi8KKyAgICAgICAgSElOU1RBTkNFMTYgaEluc3QxNiwgICAgICAgICAvKiBbaW5dIGhJbnN0IG9mIHdpbjE2IGRsbCAqLworICAgICAgICBEV09SRCBkd1JlYXNvbiwgICAgICAgICAgICAgIC8qIFtpbl0gaW5pdGlhbGlzYXRpb24gYXJndW1lbnQgKi8KKyAgICAgICAgc3RydWN0IFRodW5rRGF0YUNvbW1vbiAqVEQsICAvKiBbaW4vb3V0XSB0aHVua2J1ZmZlciAqLworICAgICAgICBMUFNUUiB0aHVua2Z1bjMyLCAgICAgICAgICAgIC8qIFtpbl0gd2luMzIgdGh1bmtmdW5jdGlvbiAqLworICAgICAgICBXT1JEIENTICAgICAgICAgICAgICAgICAgICAgIC8qIFtpbl0gQ1Mgb2Ygd2luMTYgZGxsICovCispIHsKKyAgICBCT09MMzIgZGlyZWN0aW9uU0w7CisKKyAgICBpZiAoIWxzdHJuY21wMzJBKFRELT5tYWdpYywgIlNMMDEiLCA0KSkKKyAgICB7CisgICAgICAgIGRpcmVjdGlvblNMID0gVFJVRTsKKworICAgICAgICBUUkFDRSh0aHVuaywgIlNMMDEgdGh1bmsgJXMgKCVseCkgLT4gJXMgKCVzKSwgUmVhc29uOiAlbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICBtb2R1bGUxNiwgKERXT1JEKVRELCBtb2R1bGUzMiwgdGh1bmtmdW4zMiwgZHdSZWFzb24pOworICAgIH0KKyAgICBlbHNlIGlmICghbHN0cm5jbXAzMkEoVEQtPm1hZ2ljLCAiTFMwMSIsIDQpKQorICAgIHsKKyAgICAgICAgZGlyZWN0aW9uU0wgPSBGQUxTRTsKKworICAgICAgICBUUkFDRSh0aHVuaywgIkxTMDEgdGh1bmsgJXMgKCVseCkgPC0gJXMgKCVzKSwgUmVhc29uOiAlbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICBtb2R1bGUxNiwgKERXT1JEKVRELCBtb2R1bGUzMiwgdGh1bmtmdW4zMiwgZHdSZWFzb24pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBFUlIodGh1bmssICJJbnZhbGlkIG1hZ2ljICVjJWMlYyVjXG4iLAorICAgICAgICAgICAgICAgICAgIFRELT5tYWdpY1swXSwgVEQtPm1hZ2ljWzFdLCBURC0+bWFnaWNbMl0sIFRELT5tYWdpY1szXSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHN3aXRjaCAoZHdSZWFzb24pCisgICAgeworICAgICAgICBjYXNlIERMTF9QUk9DRVNTX0FUVEFDSDoKKyAgICAgICAgICAgIGlmIChkaXJlY3Rpb25TTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgVGh1bmtEYXRhU0wxNiAqU0wxNiA9IChzdHJ1Y3QgVGh1bmtEYXRhU0wxNiAqKVREOworICAgICAgICAgICAgICAgIHN0cnVjdCBUaHVua0RhdGFTTCAgICpTTCAgID0gU0wxNi0+ZnBEYXRhOworCisgICAgICAgICAgICAgICAgaWYgKFNMID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTTCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoKlNMKSk7CisKKyAgICAgICAgICAgICAgICAgICAgU0wtPmNvbW1vbiAgID0gU0wxNi0+Y29tbW9uOworICAgICAgICAgICAgICAgICAgICBTTC0+ZmxhZ3MxICAgPSBTTDE2LT5mbGFnczE7CisgICAgICAgICAgICAgICAgICAgIFNMLT5mbGFnczIgICA9IFNMMTYtPmZsYWdzMjsKKworICAgICAgICAgICAgICAgICAgICBTTC0+YXBpREIgICAgPSBQVFJfU0VHX1RPX0xJTihTTDE2LT5hcGlEYXRhYmFzZSk7CisgICAgICAgICAgICAgICAgICAgIFNMLT50YXJnZXREQiA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICAgICAgbHN0cmNweW4zMkEoU0wtPnBzekRsbDE2LCBtb2R1bGUxNiwgMjU1KTsKKyAgICAgICAgICAgICAgICAgICAgbHN0cmNweW4zMkEoU0wtPnBzekRsbDMyLCBtb2R1bGUzMiwgMjU1KTsKKworICAgICAgICAgICAgICAgICAgICAvKiBXZSBzaG91bGQgY3JlYXRlIGEgU0VHUFRSIHRvIHRoZSBUaHVua0RhdGFTTCwKKyAgICAgICAgICAgICAgICAgICAgICAgYnV0IHNpbmNlIHRoZSBjb250ZW50cyBhcmUgbm90IGluIHRoZSBvcmlnaW5hbCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgIGFueSBhY2Nlc3MgdG8gdGhpcyBieSAxNi1iaXQgY29kZSB3b3VsZCBjcmFzaCBhbnl3YXkuICovCisgICAgICAgICAgICAgICAgICAgIFNMMTYtPnNwRGF0YSA9IDA7CisgICAgICAgICAgICAgICAgICAgIFNMMTYtPmZwRGF0YSA9IFNMOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgaWYgKFNMLT5mbGFnczIgJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVFJBQ0UodGh1bmssICJQcmVsb2FkaW5nIDMyLWJpdCBsaWJyYXJ5XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgTG9hZExpYnJhcnkzMkEobW9kdWxlMzIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERMTF9QUk9DRVNTX0RFVEFDSDoKKyAgICAgICAgICAgIC8qIEZJWE1FOiBjbGVhbnVwICovCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDMTZUaGtTTCAgICAgICAgICAgICAgICAgICAgICAgICAgIChLRVJORUwuNjMwKQorICovCisKK3ZvaWQgV0lOQVBJIEMxNlRoa1NMKENPTlRFWFQgKmNvbnRleHQpCit7CisgICAgZXh0ZXJuIHZvaWQgQ2FsbEZyb20xNl90X2xvbmdfKHZvaWQpOworICAgIExQQllURSBzdHViID0gUFRSX1NFR19UT19MSU4oRUFYX3JlZyhjb250ZXh0KSksIHggPSBzdHViOworICAgIFdPUkQgY3MsIGRzOworICAgIEdFVF9DUyhjcyk7CisgICAgR0VUX0RTKGRzKTsKKworICAgIC8qIFdlIHByb2R1Y2UgdGhlIGZvbGxvd2luZyBjb2RlOgorICAgICAqCisgICAgICogICBtb3YgYXgsIF9fRkxBVERTCisgICAgICogICBtb3YgZXMsIGF4CisgICAgICogICBtb3Z6eCBlY3gsIGN4CisgICAgICogICBtb3YgZWR4LCBlczpbZWN4ICsgJEVEWF0KKyAgICAgKiAgIHB1c2ggYnAKKyAgICAgKiAgIHB1c2ggZWR4CisgICAgICogICBjYWxsIF9fRkxBVENTOkNhbGxGcm9tMTZfdF9sb25nXworICAgICAqLworCisgICAgKngrKyA9IDB4Qjg7ICooKFdPUkQgKil4KSsrID0gZHM7CisgICAgKngrKyA9IDB4OEU7ICp4KysgPSAweEMwOworICAgICp4KysgPSAweDYwOyAqeCsrID0gMHgwRjsgKngrKyA9IDB4Qjc7ICp4KysgPSAweEM5OworICAgICp4KysgPSAweDY3OyAqeCsrID0gMHg2NjsgKngrKyA9IDB4MjY7ICp4KysgPSAweDhCOworICAgICAgICAgICAgICAgICAqeCsrID0gMHg5MTsgKigoRFdPUkQgKil4KSsrID0gRURYX3JlZyhjb250ZXh0KTsKKworICAgICp4KysgPSAweDU1OworICAgICp4KysgPSAweDY2OyAqeCsrID0gMHg1MjsKKyAgICAqeCsrID0gMHg2NjsgKngrKyA9IDB4OUE7ICooKERXT1JEICopeCkrKyA9IChEV09SRClDYWxsRnJvbTE2X3RfbG9uZ187CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChXT1JEICopeCkrKyA9IGNzOworCisgICAgLyogSnVtcCB0byB0aGUgc3R1YiBjb2RlIGp1c3QgY3JlYXRlZCAqLworICAgIElQX3JlZyhjb250ZXh0KSA9IExPV09SRChFQVhfcmVnKGNvbnRleHQpKTsKKyAgICBDU19yZWcoY29udGV4dCkgPSBISVdPUkQoRUFYX3JlZyhjb250ZXh0KSk7CisKKyAgICAvKiBTaW5jZSBDMTZUaGtTTCBnb3QgY2FsbGVkIGJ5IGEgam1wLCB3ZSBuZWVkIHRvIGxlYXZlIHRoZQorICAgICAgIG9yZ2luYWwgcmV0dXJuIGFkZHJlc3Mgb24gdGhlIHN0YWNrICovCisgICAgU1BfcmVnKGNvbnRleHQpIC09IDQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEMxNlRoa1NMMDEgICAgICAgICAgICAgICAgICAgICAgICAgKEtFUk5FTC42MzEpCisgKi8KKwordm9pZCBXSU5BUEkgQzE2VGhrU0wwMShDT05URVhUICpjb250ZXh0KQoreworICAgIExQQllURSBzdHViID0gUFRSX1NFR19UT19MSU4oRUFYX3JlZyhjb250ZXh0KSksIHggPSBzdHViOworCisgICAgaWYgKHN0dWIpCisgICAgeworICAgICAgICBzdHJ1Y3QgVGh1bmtEYXRhU0wxNiAqU0wxNiA9IFBUUl9TRUdfVE9fTElOKEVEWF9yZWcoY29udGV4dCkpOworICAgICAgICBzdHJ1Y3QgVGh1bmtEYXRhU0wgKnRkID0gU0wxNi0+ZnBEYXRhOworCisgICAgICAgIGV4dGVybiB2b2lkIENhbGxGcm9tMTZfdF9sb25nXyh2b2lkKTsKKyAgICAgICAgRFdPUkQgcHJvY0FkZHJlc3MgPSAoRFdPUkQpR2V0UHJvY0FkZHJlc3MxNihHZXRNb2R1bGVIYW5kbGUxNigiS0VSTkVMIiksIDYzMSk7CisgICAgICAgIFdPUkQgY3M7CisgICAgICAgIEdFVF9DUyhjcyk7CisKKyAgICAgICAgaWYgKCF0ZCkKKyAgICAgICAgeworICAgICAgICAgICAgRVJSKHRodW5rLCAiVGh1bmtDb25uZWN0MTYgd2FzIG5vdCBjYWxsZWQhXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFRSQUNFKHRodW5rLCAiQ3JlYXRpbmcgc3R1YiBmb3IgVGh1bmtEYXRhU0wgJTA4bHhcbiIsIChEV09SRCl0ZCk7CisKKworICAgICAgICAvKiBXZSBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgY29kZToKKyAgICAgICAgICoKKyAgICAgICAgICogICB4b3IgZWF4LCBlYXgKKyAgICAgICAgICogICBtb3YgZWR4LCAkdGQKKyAgICAgICAgICogICBjYWxsIEMxNlRoa1NMMDEKKyAgICAgICAgICogICBwdXNoIGJwCisgICAgICAgICAqICAgcHVzaCBlZHgKKyAgICAgICAgICogICBjYWxsIF9fRkxBVENTOkNhbGxGcm9tMTZfdF9sb25nXworICAgICAgICAgKi8KKworICAgICAgICAqeCsrID0gMHg2NjsgKngrKyA9IDB4MzM7ICp4KysgPSAweEMwOworICAgICAgICAqeCsrID0gMHg2NjsgKngrKyA9IDB4QkE7ICooKERXT1JEICopeCkrKyA9IChEV09SRCl0ZDsKKyAgICAgICAgKngrKyA9IDB4OUE7ICooKERXT1JEICopeCkrKyA9IHByb2NBZGRyZXNzOworCisgICAgICAgICp4KysgPSAweDU1OworICAgICAgICAqeCsrID0gMHg2NjsgKngrKyA9IDB4NTI7CisgICAgICAgICp4KysgPSAweDY2OyAqeCsrID0gMHg5QTsgKigoRFdPUkQgKil4KSsrID0gKERXT1JEKUNhbGxGcm9tMTZfdF9sb25nXzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChXT1JEICopeCkrKyA9IGNzOworCisgICAgICAgIC8qIEp1bXAgdG8gdGhlIHN0dWIgY29kZSBqdXN0IGNyZWF0ZWQgKi8KKyAgICAgICAgSVBfcmVnKGNvbnRleHQpID0gTE9XT1JEKEVBWF9yZWcoY29udGV4dCkpOworICAgICAgICBDU19yZWcoY29udGV4dCkgPSBISVdPUkQoRUFYX3JlZyhjb250ZXh0KSk7CisKKyAgICAgICAgLyogU2luY2UgQzE2VGhrU0wwMSBnb3QgY2FsbGVkIGJ5IGEgam1wLCB3ZSBuZWVkIHRvIGxlYXZlIHRoZQorICAgICAgICAgICBvcmdpbmFsIHJldHVybiBhZGRyZXNzIG9uIHRoZSBzdGFjayAqLworICAgICAgICBTUF9yZWcoY29udGV4dCkgLT0gNDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RydWN0IFRodW5rRGF0YVNMICp0ZCA9IChzdHJ1Y3QgVGh1bmtEYXRhU0wgKilFRFhfcmVnKGNvbnRleHQpOworICAgICAgICBEV09SRCB0YXJnZXROciA9IENYX3JlZyhjb250ZXh0KSAvIDQ7CisgICAgICAgIHN0cnVjdCBTTFRhcmdldERCICp0ZGI7CisKKyAgICAgICAgVFJBQ0UodGh1bmssICJQcm9jZXNzICUwOGx4IGNhbGxpbmcgdGFyZ2V0ICVsZCBvZiBUaHVua0RhdGFTTCAlMDhseFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIChEV09SRClQUk9DRVNTX0N1cnJlbnQoKSwgdGFyZ2V0TnIsIChEV09SRCl0ZCk7CisKKyAgICAgICAgZm9yICh0ZGIgPSB0ZC0+dGFyZ2V0REI7IHRkYjsgdGRiID0gdGRiLT5uZXh0KQorICAgICAgICAgICAgaWYgKHRkYi0+cHJvY2VzcyA9PSBQUk9DRVNTX0N1cnJlbnQoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoIXRkYikKKyAgICAgICAgeworICAgICAgICAgICAgVFJBQ0UodGh1bmssICJMb2FkaW5nIDMyLWJpdCBsaWJyYXJ5ICVzXG4iLCB0ZC0+cHN6RGxsMzIpOworICAgICAgICAgICAgTG9hZExpYnJhcnkzMkEodGQtPnBzekRsbDMyKTsKKworICAgICAgICAgICAgZm9yICh0ZGIgPSB0ZC0+dGFyZ2V0REI7IHRkYjsgdGRiID0gdGRiLT5uZXh0KQorICAgICAgICAgICAgICAgIGlmICh0ZGItPnByb2Nlc3MgPT0gUFJPQ0VTU19DdXJyZW50KCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRkYikKKyAgICAgICAgeworICAgICAgICAgICAgRURYX3JlZyhjb250ZXh0KSA9IHRkYi0+dGFyZ2V0VGFibGVbdGFyZ2V0TnJdOworCisgICAgICAgICAgICBUUkFDRSh0aHVuaywgIkNhbGwgdGFyZ2V0IGlzICUwOGx4XG4iLCBFRFhfcmVnKGNvbnRleHQpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFdPUkQgKnN0YWNrID0gUFRSX1NFR19PRkZfVE9fTElOKFNTX3JlZyhjb250ZXh0KSwgU1BfcmVnKGNvbnRleHQpKTsKKyAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSA9IEhJV09SRCh0ZC0+YXBpREJbdGFyZ2V0TnJdLmVycm9yUmV0dXJuVmFsdWUpOworICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gTE9XT1JEKHRkLT5hcGlEQlt0YXJnZXROcl0uZXJyb3JSZXR1cm5WYWx1ZSk7CisgICAgICAgICAgICBJUF9yZWcoY29udGV4dCkgPSBzdGFja1syXTsKKyAgICAgICAgICAgIENTX3JlZyhjb250ZXh0KSA9IHN0YWNrWzNdOworICAgICAgICAgICAgU1BfcmVnKGNvbnRleHQpICs9IHRkLT5hcGlEQlt0YXJnZXROcl0ubnJBcmdCeXRlcyArIDQ7CisKKyAgICAgICAgICAgIC8qIFdpbjk1IGFsbG93cyBkZWxheWVkIGxvYWRpbmcgb2YgdGhlIDMyLWJpdCBETEwuCisgICAgICAgICAgICAgICBXZSBkb24ndCBkbyB0aGF0IGF0IHRoZSBtb21lbnQuICovCisgICAgICAgICAgICBFUlIodGh1bmssICJQcm9jZXNzICUwOGx4IGRpZCBub3QgVGh1bmtDb25uZWN0MzIgJXMgdG8gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIChEV09SRClQUk9DRVNTX0N1cnJlbnQoKSwgdGQtPnBzekRsbDMyLCB0ZC0+cHN6RGxsMTYpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3VzZXIuc3BlYyBiL2lmMTYzMi91c2VyLnNwZWMKaW5kZXggNWVlYTg3Yi4uNTcwYWEyMSAxMDA2NDQKLS0tIGEvaWYxNjMyL3VzZXIuc3BlYworKysgYi9pZjE2MzIvdXNlci5zcGVjCkBAIC00NjIsOCArNDYyLDggQEAKIDUxNCBwYXNjYWwxNiBXTmV0RGV2aWNlTW9kZSh3b3JkKSBXTmV0RGV2aWNlTW9kZQogNTE1IHBhc2NhbDE2IFdOZXRCcm93c2VEaWFsb2cod29yZCB3b3JkIHB0cikgV05ldEJyb3dzZURpYWxvZwogNTE2IHBhc2NhbDE2IFdOZXRHZXRVc2VyKHB0ciBwdHIgcHRyKSBXTmV0R2V0VXNlcgotNTE3IHBhc2NhbDE2IFdOZXRBZGRDb25uZWN0aW9uKHB0ciBwdHIgcHRyKSBXTmV0QWRkQ29ubmVjdGlvbjE2Ci01MTggcGFzY2FsMTYgV05ldENhbmNlbENvbm5lY3Rpb24ocHRyIHdvcmQpIFdOZXRDYW5jZWxDb25uZWN0aW9uCis1MTcgcGFzY2FsMTYgV05ldEFkZENvbm5lY3Rpb24oc3RyIHN0ciBzdHIpIFdOZXRBZGRDb25uZWN0aW9uMTYKKzUxOCBwYXNjYWwxNiBXTmV0Q2FuY2VsQ29ubmVjdGlvbihzdHIgd29yZCkgV05ldENhbmNlbENvbm5lY3Rpb24KIDUxOSBwYXNjYWwxNiBXTmV0R2V0RXJyb3IocHRyKSBXTmV0R2V0RXJyb3IKIDUyMCBwYXNjYWwxNiBXTmV0R2V0RXJyb3JUZXh0KHdvcmQgcHRyIHB0cikgV05ldEdldEVycm9yVGV4dAogNTIxIHN0dWIgV05ldEVuYWJsZQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3dpbnNvY2suc3BlYyBiL2lmMTYzMi93aW5zb2NrLnNwZWMKaW5kZXggZTg1NjRiYi4uNThlOTFlMSAxMDA2NDQKLS0tIGEvaWYxNjMyL3dpbnNvY2suc3BlYworKysgYi9pZjE2MzIvd2luc29jay5zcGVjCkBAIC0zOSwxNSArMzksMTUgQEAKIDEwMSBwYXNjYWwxNiBXU0FBc3luY1NlbGVjdCh3b3JkIHdvcmQgd29yZCBsb25nKSBXU0FBc3luY1NlbGVjdDE2CiAxMDIgcGFzY2FsMTYgV1NBQXN5bmNHZXRIb3N0QnlBZGRyKHdvcmQgd29yZCBwdHIgd29yZCB3b3JkIHNlZ3B0ciB3b3JkKQogICAgICAgICAgICAgIFdTQUFzeW5jR2V0SG9zdEJ5QWRkcjE2Ci0xMDMgcGFzY2FsMTYgV1NBQXN5bmNHZXRIb3N0QnlOYW1lKHdvcmQgd29yZCBwdHIgc2VncHRyIHdvcmQpCisxMDMgcGFzY2FsMTYgV1NBQXN5bmNHZXRIb3N0QnlOYW1lKHdvcmQgd29yZCBzdHIgc2VncHRyIHdvcmQpCiAgICAgICAgICAgICAgV1NBQXN5bmNHZXRIb3N0QnlOYW1lMTYKIDEwNCBwYXNjYWwxNiBXU0FBc3luY0dldFByb3RvQnlOdW1iZXIod29yZCB3b3JkIHdvcmQgc2VncHRyIHdvcmQpCiAgICAgICAgICAgICAgV1NBQXN5bmNHZXRQcm90b0J5TnVtYmVyMTYKLTEwNSBwYXNjYWwxNiBXU0FBc3luY0dldFByb3RvQnlOYW1lKHdvcmQgd29yZCBwdHIgc2VncHRyIHdvcmQpCisxMDUgcGFzY2FsMTYgV1NBQXN5bmNHZXRQcm90b0J5TmFtZSh3b3JkIHdvcmQgc3RyIHNlZ3B0ciB3b3JkKQogICAgICAgICAgICAgIFdTQUFzeW5jR2V0UHJvdG9CeU5hbWUxNgotMTA2IHBhc2NhbDE2IFdTQUFzeW5jR2V0U2VydkJ5UG9ydCh3b3JkIHdvcmQgd29yZCBwdHIgc2VncHRyIHdvcmQpCisxMDYgcGFzY2FsMTYgV1NBQXN5bmNHZXRTZXJ2QnlQb3J0KHdvcmQgd29yZCB3b3JkIHN0ciBzZWdwdHIgd29yZCkKICAgICAgICAgICAgICBXU0FBc3luY0dldFNlcnZCeVBvcnQxNgotMTA3IHBhc2NhbDE2IFdTQUFzeW5jR2V0U2VydkJ5TmFtZSh3b3JkIHdvcmQgcHRyIHB0ciBzZWdwdHIgd29yZCkKKzEwNyBwYXNjYWwxNiBXU0FBc3luY0dldFNlcnZCeU5hbWUod29yZCB3b3JkIHN0ciBzdHIgc2VncHRyIHdvcmQpCiAgICAgICAgICAgICAgV1NBQXN5bmNHZXRTZXJ2QnlOYW1lMTYKIDEwOCBwYXNjYWwxNiBXU0FDYW5jZWxBc3luY1JlcXVlc3Qod29yZCkgV1NBQ2FuY2VsQXN5bmNSZXF1ZXN0MTYKIDEwOSBwYXNjYWwxNiBXU0FTZXRCbG9ja2luZ0hvb2soc2VncHRyKSBXU0FTZXRCbG9ja2luZ0hvb2sxNgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaXRtYXAuaCBiL2luY2x1ZGUvYml0bWFwLmgKaW5kZXggMzY5MGRlMi4uMDQyYzRhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9iaXRtYXAuaAorKysgYi9pbmNsdWRlL2JpdG1hcC5oCkBAIC0yOSw2ICsyOSwxMiBAQAogICAgIEJJVE1BUDE2ICAgIGJpdG1hcDsKICAgICBQaXhtYXAgICAgICBwaXhtYXA7CiAgICAgU0laRTE2ICAgICAgc2l6ZTsgICAvKiBGb3IgU2V0Qml0bWFwRGltZW5zaW9uKCkgKi8KKworICAgIC8qIEZvciBkZXZpY2UtaW5kZXBlbmRlbnQgYml0bWFwczogKi8KKyAgICBESUJTRUNUSU9OICpkaWJTZWN0aW9uOworICAgIFJHQlFVQUQgICAgKmNvbG9yTWFwOworICAgIGludCAgICAgICAgIG5Db2xvck1hcDsKKwogfSBCSVRNQVBPQko7CiAKICAgLyogR0NzIHVzZWQgZm9yIEImVyBhbmQgY29sb3IgYml0bWFwIG9wZXJhdGlvbnMgKi8KQEAgLTYyLDYgKzY4LDggQEAKIGV4dGVybiBpbnQgRElCX0dldERJQldpZHRoQnl0ZXMoIGludCB3aWR0aCwgaW50IGRlcHRoICk7CiBleHRlcm4gaW50IERJQl9HZXRYSW1hZ2VXaWR0aEJ5dGVzKCBpbnQgd2lkdGgsIGludCBkZXB0aCApOwogZXh0ZXJuIGludCBESUJfQml0bWFwSW5mb1NpemUoIEJJVE1BUElORk8gKiBpbmZvLCBXT1JEIGNvbG9ydXNlICk7CitleHRlcm4gdm9pZCBESUJfVXBkYXRlRElCU2VjdGlvbiggREMgKmRjLCBCT09MMzIgdG9ESUIgKTsKKwogCiAgIC8qIG9iamVjdHMvb2VtYml0bWFwLmMgKi8KIGV4dGVybiBCT09MMzIgT0JNX0luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2J1aWx0aW4zMi5oIGIvaW5jbHVkZS9idWlsdGluMzIuaAppbmRleCA0ZDNkZDNiLi4wNWNmMTA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2J1aWx0aW4zMi5oCisrKyBiL2luY2x1ZGUvYnVpbHRpbjMyLmgKQEAgLTE1LDcgKzE1LDYgQEAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgYmFzZTsgICAgICAgICAvKiBPcmRpbmFsIGJhc2UgKi8KICAgICBpbnQgICAgICAgICAgICAgICAgICAgbmJfZnVuY3M7ICAgICAvKiBOdW1iZXIgb2YgZnVuY3Rpb25zICovCiAgICAgaW50ICAgICAgICAgICAgICAgICAgIG5iX25hbWVzOyAgICAgLyogTnVtYmVyIG9mIGZ1bmN0aW9uIG5hbWVzICovCi0gICAgaW50ICAgICAgICAgICAgICAgICAgIG5iX3JlZ19mdW5jczsgLyogTnVtYmVyIG9mIHJlZ2lzdGVyIGZ1bmN0aW9ucyAqLwogICAgIGNvbnN0IEVOVFJZUE9JTlQzMiAgICpmdW5jdGlvbnM7ICAgIC8qIFBvaW50ZXIgdG8gZnVuY3Rpb24gdGFibGUgKi8KICAgICBjb25zdCBjaGFyICogY29uc3QgICAqbmFtZXM7ICAgICAgICAvKiBQb2ludGVyIHRvIG5hbWVzIHRhYmxlICovCiAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKm9yZGluYWxzOyAgICAgLyogUG9pbnRlciB0byBvcmRpbmFscyB0YWJsZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYXNlbWFwLmggYi9pbmNsdWRlL2Nhc2VtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTAzYjU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jYXNlbWFwLmgKQEAgLTAsMCArMSw5MDUgQEAKKy8qCisgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlIC0tIGRvIG5vdCBlZGl0IQorICogKFVzZSB0b29scy91bmltYXAucGwgZm9yIGdlbmVyYXRpb24pCisgKgorICogTWFwcGluZyB0YWJsZXMgZm9yIFVuaWNvZGUgY2FzZSBjb252ZXJzaW9uCisgKi8KKworLyogTG93ZXJjYXNlIG1hcHBpbmdzIDAwMDAgLSAwMEZGICovCitzdGF0aWMgY29uc3QgV0NIQVIgbGJsazAwWzI1Nl0gPSB7CisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLCAweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwQSwgMHgwMDBCLCAweDAwMEMsIDB4MDAwRCwgMHgwMDBFLCAweDAwMEYsCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLCAweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisJMHgwMDE4LCAweDAwMTksIDB4MDAxQSwgMHgwMDFCLCAweDAwMUMsIDB4MDAxRCwgMHgwMDFFLCAweDAwMUYsCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzQSwgMHgwMDNCLCAweDAwM0MsIDB4MDAzRCwgMHgwMDNFLCAweDAwM0YsCisJMHgwMDQwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDVCLCAweDAwNUMsIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2QSwgMHgwMDZCLCAweDAwNkMsIDB4MDA2RCwgMHgwMDZFLCAweDAwNkYsCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDdCLCAweDAwN0MsIDB4MDA3RCwgMHgwMDdFLCAweDAwN0YsCisJMHgwMDgwLCAweDAwODEsIDB4MDA4MiwgMHgwMDgzLCAweDAwODQsIDB4MDA4NSwgMHgwMDg2LCAweDAwODcsCisJMHgwMDg4LCAweDAwODksIDB4MDA4QSwgMHgwMDhCLCAweDAwOEMsIDB4MDA4RCwgMHgwMDhFLCAweDAwOEYsCisJMHgwMDkwLCAweDAwOTEsIDB4MDA5MiwgMHgwMDkzLCAweDAwOTQsIDB4MDA5NSwgMHgwMDk2LCAweDAwOTcsCisJMHgwMDk4LCAweDAwOTksIDB4MDA5QSwgMHgwMDlCLCAweDAwOUMsIDB4MDA5RCwgMHgwMDlFLCAweDAwOUYsCisJMHgwMEEwLCAweDAwQTEsIDB4MDBBMiwgMHgwMEEzLCAweDAwQTQsIDB4MDBBNSwgMHgwMEE2LCAweDAwQTcsCisJMHgwMEE4LCAweDAwQTksIDB4MDBBQSwgMHgwMEFCLCAweDAwQUMsIDB4MDBBRCwgMHgwMEFFLCAweDAwQUYsCisJMHgwMEIwLCAweDAwQjEsIDB4MDBCMiwgMHgwMEIzLCAweDAwQjQsIDB4MDBCNSwgMHgwMEI2LCAweDAwQjcsCisJMHgwMEI4LCAweDAwQjksIDB4MDBCQSwgMHgwMEJCLCAweDAwQkMsIDB4MDBCRCwgMHgwMEJFLCAweDAwQkYsCisJMHgwMEUwLCAweDAwRTEsIDB4MDBFMiwgMHgwMEUzLCAweDAwRTQsIDB4MDBFNSwgMHgwMEU2LCAweDAwRTcsCisJMHgwMEU4LCAweDAwRTksIDB4MDBFQSwgMHgwMEVCLCAweDAwRUMsIDB4MDBFRCwgMHgwMEVFLCAweDAwRUYsCisJMHgwMEYwLCAweDAwRjEsIDB4MDBGMiwgMHgwMEYzLCAweDAwRjQsIDB4MDBGNSwgMHgwMEY2LCAweDAwRDcsCisJMHgwMEY4LCAweDAwRjksIDB4MDBGQSwgMHgwMEZCLCAweDAwRkMsIDB4MDBGRCwgMHgwMEZFLCAweDAwREYsCisJMHgwMEUwLCAweDAwRTEsIDB4MDBFMiwgMHgwMEUzLCAweDAwRTQsIDB4MDBFNSwgMHgwMEU2LCAweDAwRTcsCisJMHgwMEU4LCAweDAwRTksIDB4MDBFQSwgMHgwMEVCLCAweDAwRUMsIDB4MDBFRCwgMHgwMEVFLCAweDAwRUYsCisJMHgwMEYwLCAweDAwRjEsIDB4MDBGMiwgMHgwMEYzLCAweDAwRjQsIDB4MDBGNSwgMHgwMEY2LCAweDAwRjcsCisJMHgwMEY4LCAweDAwRjksIDB4MDBGQSwgMHgwMEZCLCAweDAwRkMsIDB4MDBGRCwgMHgwMEZFLCAweDAwRkYsCit9OworCisvKiBMb3dlcmNhc2UgbWFwcGluZ3MgMDEwMCAtIDAxRkYgKi8KK3N0YXRpYyBjb25zdCBXQ0hBUiBsYmxrMDFbMjU2XSA9IHsKKwkweDAxMDEsIDB4MDEwMSwgMHgwMTAzLCAweDAxMDMsIDB4MDEwNSwgMHgwMTA1LCAweDAxMDcsIDB4MDEwNywKKwkweDAxMDksIDB4MDEwOSwgMHgwMTBCLCAweDAxMEIsIDB4MDEwRCwgMHgwMTBELCAweDAxMEYsIDB4MDEwRiwKKwkweDAxMTEsIDB4MDExMSwgMHgwMTEzLCAweDAxMTMsIDB4MDExNSwgMHgwMTE1LCAweDAxMTcsIDB4MDExNywKKwkweDAxMTksIDB4MDExOSwgMHgwMTFCLCAweDAxMUIsIDB4MDExRCwgMHgwMTFELCAweDAxMUYsIDB4MDExRiwKKwkweDAxMjEsIDB4MDEyMSwgMHgwMTIzLCAweDAxMjMsIDB4MDEyNSwgMHgwMTI1LCAweDAxMjcsIDB4MDEyNywKKwkweDAxMjksIDB4MDEyOSwgMHgwMTJCLCAweDAxMkIsIDB4MDEyRCwgMHgwMTJELCAweDAxMkYsIDB4MDEyRiwKKwkweDAwNjksIDB4MDEzMSwgMHgwMTMzLCAweDAxMzMsIDB4MDEzNSwgMHgwMTM1LCAweDAxMzcsIDB4MDEzNywKKwkweDAxMzgsIDB4MDEzQSwgMHgwMTNBLCAweDAxM0MsIDB4MDEzQywgMHgwMTNFLCAweDAxM0UsIDB4MDE0MCwKKwkweDAxNDAsIDB4MDE0MiwgMHgwMTQyLCAweDAxNDQsIDB4MDE0NCwgMHgwMTQ2LCAweDAxNDYsIDB4MDE0OCwKKwkweDAxNDgsIDB4MDE0OSwgMHgwMTRCLCAweDAxNEIsIDB4MDE0RCwgMHgwMTRELCAweDAxNEYsIDB4MDE0RiwKKwkweDAxNTEsIDB4MDE1MSwgMHgwMTUzLCAweDAxNTMsIDB4MDE1NSwgMHgwMTU1LCAweDAxNTcsIDB4MDE1NywKKwkweDAxNTksIDB4MDE1OSwgMHgwMTVCLCAweDAxNUIsIDB4MDE1RCwgMHgwMTVELCAweDAxNUYsIDB4MDE1RiwKKwkweDAxNjEsIDB4MDE2MSwgMHgwMTYzLCAweDAxNjMsIDB4MDE2NSwgMHgwMTY1LCAweDAxNjcsIDB4MDE2NywKKwkweDAxNjksIDB4MDE2OSwgMHgwMTZCLCAweDAxNkIsIDB4MDE2RCwgMHgwMTZELCAweDAxNkYsIDB4MDE2RiwKKwkweDAxNzEsIDB4MDE3MSwgMHgwMTczLCAweDAxNzMsIDB4MDE3NSwgMHgwMTc1LCAweDAxNzcsIDB4MDE3NywKKwkweDAwRkYsIDB4MDE3QSwgMHgwMTdBLCAweDAxN0MsIDB4MDE3QywgMHgwMTdFLCAweDAxN0UsIDB4MDE3RiwKKwkweDAxODAsIDB4MDI1MywgMHgwMTgzLCAweDAxODMsIDB4MDE4NSwgMHgwMTg1LCAweDAyNTQsIDB4MDE4OCwKKwkweDAxODgsIDB4MDI1NiwgMHgwMjU3LCAweDAxOEMsIDB4MDE4QywgMHgwMThELCAweDAyNTgsIDB4MDI1OSwKKwkweDAyNUIsIDB4MDE5MiwgMHgwMTkyLCAweDAyNjAsIDB4MDI2MywgMHgwMTk1LCAweDAyNjksIDB4MDI2OCwKKwkweDAxOTksIDB4MDE5OSwgMHgwMTlBLCAweDAxOUIsIDB4MDI2RiwgMHgwMjcyLCAweDAxOUUsIDB4MDE5RiwKKwkweDAxQTEsIDB4MDFBMSwgMHgwMUEzLCAweDAxQTMsIDB4MDFBNSwgMHgwMUE1LCAweDAxQTYsIDB4MDFBOCwKKwkweDAxQTgsIDB4MDI4MywgMHgwMUFBLCAweDAxQUIsIDB4MDFBRCwgMHgwMUFELCAweDAyODgsIDB4MDFCMCwKKwkweDAxQjAsIDB4MDI4QSwgMHgwMjhCLCAweDAxQjQsIDB4MDFCNCwgMHgwMUI2LCAweDAxQjYsIDB4MDI5MiwKKwkweDAxQjksIDB4MDFCOSwgMHgwMUJBLCAweDAxQkIsIDB4MDFCRCwgMHgwMUJELCAweDAxQkUsIDB4MDFCRiwKKwkweDAxQzAsIDB4MDFDMSwgMHgwMUMyLCAweDAxQzMsIDB4MDFDNiwgMHgwMUM2LCAweDAxQzYsIDB4MDFDOSwKKwkweDAxQzksIDB4MDFDOSwgMHgwMUNDLCAweDAxQ0MsIDB4MDFDQywgMHgwMUNFLCAweDAxQ0UsIDB4MDFEMCwKKwkweDAxRDAsIDB4MDFEMiwgMHgwMUQyLCAweDAxRDQsIDB4MDFENCwgMHgwMUQ2LCAweDAxRDYsIDB4MDFEOCwKKwkweDAxRDgsIDB4MDFEQSwgMHgwMURBLCAweDAxREMsIDB4MDFEQywgMHgwMURELCAweDAxREYsIDB4MDFERiwKKwkweDAxRTEsIDB4MDFFMSwgMHgwMUUzLCAweDAxRTMsIDB4MDFFNSwgMHgwMUU1LCAweDAxRTcsIDB4MDFFNywKKwkweDAxRTksIDB4MDFFOSwgMHgwMUVCLCAweDAxRUIsIDB4MDFFRCwgMHgwMUVELCAweDAxRUYsIDB4MDFFRiwKKwkweDAxRjAsIDB4MDFGMywgMHgwMUYzLCAweDAxRjMsIDB4MDFGNSwgMHgwMUY1LCAweDAxRjYsIDB4MDFGNywKKwkweDAxRjgsIDB4MDFGOSwgMHgwMUZCLCAweDAxRkIsIDB4MDFGRCwgMHgwMUZELCAweDAxRkYsIDB4MDFGRiwKK307CisKKy8qIExvd2VyY2FzZSBtYXBwaW5ncyAwMjAwIC0gMDJGRiAqLworc3RhdGljIGNvbnN0IFdDSEFSIGxibGswMlsyNTZdID0geworCTB4MDIwMSwgMHgwMjAxLCAweDAyMDMsIDB4MDIwMywgMHgwMjA1LCAweDAyMDUsIDB4MDIwNywgMHgwMjA3LAorCTB4MDIwOSwgMHgwMjA5LCAweDAyMEIsIDB4MDIwQiwgMHgwMjBELCAweDAyMEQsIDB4MDIwRiwgMHgwMjBGLAorCTB4MDIxMSwgMHgwMjExLCAweDAyMTMsIDB4MDIxMywgMHgwMjE1LCAweDAyMTUsIDB4MDIxNywgMHgwMjE3LAorCTB4MDIxOCwgMHgwMjE5LCAweDAyMUEsIDB4MDIxQiwgMHgwMjFDLCAweDAyMUQsIDB4MDIxRSwgMHgwMjFGLAorCTB4MDIyMCwgMHgwMjIxLCAweDAyMjIsIDB4MDIyMywgMHgwMjI0LCAweDAyMjUsIDB4MDIyNiwgMHgwMjI3LAorCTB4MDIyOCwgMHgwMjI5LCAweDAyMkEsIDB4MDIyQiwgMHgwMjJDLCAweDAyMkQsIDB4MDIyRSwgMHgwMjJGLAorCTB4MDIzMCwgMHgwMjMxLCAweDAyMzIsIDB4MDIzMywgMHgwMjM0LCAweDAyMzUsIDB4MDIzNiwgMHgwMjM3LAorCTB4MDIzOCwgMHgwMjM5LCAweDAyM0EsIDB4MDIzQiwgMHgwMjNDLCAweDAyM0QsIDB4MDIzRSwgMHgwMjNGLAorCTB4MDI0MCwgMHgwMjQxLCAweDAyNDIsIDB4MDI0MywgMHgwMjQ0LCAweDAyNDUsIDB4MDI0NiwgMHgwMjQ3LAorCTB4MDI0OCwgMHgwMjQ5LCAweDAyNEEsIDB4MDI0QiwgMHgwMjRDLCAweDAyNEQsIDB4MDI0RSwgMHgwMjRGLAorCTB4MDI1MCwgMHgwMjUxLCAweDAyNTIsIDB4MDI1MywgMHgwMjU0LCAweDAyNTUsIDB4MDI1NiwgMHgwMjU3LAorCTB4MDI1OCwgMHgwMjU5LCAweDAyNUEsIDB4MDI1QiwgMHgwMjVDLCAweDAyNUQsIDB4MDI1RSwgMHgwMjVGLAorCTB4MDI2MCwgMHgwMjYxLCAweDAyNjIsIDB4MDI2MywgMHgwMjY0LCAweDAyNjUsIDB4MDI2NiwgMHgwMjY3LAorCTB4MDI2OCwgMHgwMjY5LCAweDAyNkEsIDB4MDI2QiwgMHgwMjZDLCAweDAyNkQsIDB4MDI2RSwgMHgwMjZGLAorCTB4MDI3MCwgMHgwMjcxLCAweDAyNzIsIDB4MDI3MywgMHgwMjc0LCAweDAyNzUsIDB4MDI3NiwgMHgwMjc3LAorCTB4MDI3OCwgMHgwMjc5LCAweDAyN0EsIDB4MDI3QiwgMHgwMjdDLCAweDAyN0QsIDB4MDI3RSwgMHgwMjdGLAorCTB4MDI4MCwgMHgwMjgxLCAweDAyODIsIDB4MDI4MywgMHgwMjg0LCAweDAyODUsIDB4MDI4NiwgMHgwMjg3LAorCTB4MDI4OCwgMHgwMjg5LCAweDAyOEEsIDB4MDI4QiwgMHgwMjhDLCAweDAyOEQsIDB4MDI4RSwgMHgwMjhGLAorCTB4MDI5MCwgMHgwMjkxLCAweDAyOTIsIDB4MDI5MywgMHgwMjk0LCAweDAyOTUsIDB4MDI5NiwgMHgwMjk3LAorCTB4MDI5OCwgMHgwMjk5LCAweDAyOUEsIDB4MDI5QiwgMHgwMjlDLCAweDAyOUQsIDB4MDI5RSwgMHgwMjlGLAorCTB4MDJBMCwgMHgwMkExLCAweDAyQTIsIDB4MDJBMywgMHgwMkE0LCAweDAyQTUsIDB4MDJBNiwgMHgwMkE3LAorCTB4MDJBOCwgMHgwMkE5LCAweDAyQUEsIDB4MDJBQiwgMHgwMkFDLCAweDAyQUQsIDB4MDJBRSwgMHgwMkFGLAorCTB4MDJCMCwgMHgwMkIxLCAweDAyQjIsIDB4MDJCMywgMHgwMkI0LCAweDAyQjUsIDB4MDJCNiwgMHgwMkI3LAorCTB4MDJCOCwgMHgwMkI5LCAweDAyQkEsIDB4MDJCQiwgMHgwMkJDLCAweDAyQkQsIDB4MDJCRSwgMHgwMkJGLAorCTB4MDJDMCwgMHgwMkMxLCAweDAyQzIsIDB4MDJDMywgMHgwMkM0LCAweDAyQzUsIDB4MDJDNiwgMHgwMkM3LAorCTB4MDJDOCwgMHgwMkM5LCAweDAyQ0EsIDB4MDJDQiwgMHgwMkNDLCAweDAyQ0QsIDB4MDJDRSwgMHgwMkNGLAorCTB4MDJEMCwgMHgwMkQxLCAweDAyRDIsIDB4MDJEMywgMHgwMkQ0LCAweDAyRDUsIDB4MDJENiwgMHgwMkQ3LAorCTB4MDJEOCwgMHgwMkQ5LCAweDAyREEsIDB4MDJEQiwgMHgwMkRDLCAweDAyREQsIDB4MDJERSwgMHgwMkRGLAorCTB4MDJFMCwgMHgwMkUxLCAweDAyRTIsIDB4MDJFMywgMHgwMkU0LCAweDAyRTUsIDB4MDJFNiwgMHgwMkU3LAorCTB4MDJFOCwgMHgwMkU5LCAweDAyRUEsIDB4MDJFQiwgMHgwMkVDLCAweDAyRUQsIDB4MDJFRSwgMHgwMkVGLAorCTB4MDJGMCwgMHgwMkYxLCAweDAyRjIsIDB4MDJGMywgMHgwMkY0LCAweDAyRjUsIDB4MDJGNiwgMHgwMkY3LAorCTB4MDJGOCwgMHgwMkY5LCAweDAyRkEsIDB4MDJGQiwgMHgwMkZDLCAweDAyRkQsIDB4MDJGRSwgMHgwMkZGLAorfTsKKworLyogTG93ZXJjYXNlIG1hcHBpbmdzIDAzMDAgLSAwM0ZGICovCitzdGF0aWMgY29uc3QgV0NIQVIgbGJsazAzWzI1Nl0gPSB7CisJMHgwMzAwLCAweDAzMDEsIDB4MDMwMiwgMHgwMzAzLCAweDAzMDQsIDB4MDMwNSwgMHgwMzA2LCAweDAzMDcsCisJMHgwMzA4LCAweDAzMDksIDB4MDMwQSwgMHgwMzBCLCAweDAzMEMsIDB4MDMwRCwgMHgwMzBFLCAweDAzMEYsCisJMHgwMzEwLCAweDAzMTEsIDB4MDMxMiwgMHgwMzEzLCAweDAzMTQsIDB4MDMxNSwgMHgwMzE2LCAweDAzMTcsCisJMHgwMzE4LCAweDAzMTksIDB4MDMxQSwgMHgwMzFCLCAweDAzMUMsIDB4MDMxRCwgMHgwMzFFLCAweDAzMUYsCisJMHgwMzIwLCAweDAzMjEsIDB4MDMyMiwgMHgwMzIzLCAweDAzMjQsIDB4MDMyNSwgMHgwMzI2LCAweDAzMjcsCisJMHgwMzI4LCAweDAzMjksIDB4MDMyQSwgMHgwMzJCLCAweDAzMkMsIDB4MDMyRCwgMHgwMzJFLCAweDAzMkYsCisJMHgwMzMwLCAweDAzMzEsIDB4MDMzMiwgMHgwMzMzLCAweDAzMzQsIDB4MDMzNSwgMHgwMzM2LCAweDAzMzcsCisJMHgwMzM4LCAweDAzMzksIDB4MDMzQSwgMHgwMzNCLCAweDAzM0MsIDB4MDMzRCwgMHgwMzNFLCAweDAzM0YsCisJMHgwMzQwLCAweDAzNDEsIDB4MDM0MiwgMHgwMzQzLCAweDAzNDQsIDB4MDM0NSwgMHgwMzQ2LCAweDAzNDcsCisJMHgwMzQ4LCAweDAzNDksIDB4MDM0QSwgMHgwMzRCLCAweDAzNEMsIDB4MDM0RCwgMHgwMzRFLCAweDAzNEYsCisJMHgwMzUwLCAweDAzNTEsIDB4MDM1MiwgMHgwMzUzLCAweDAzNTQsIDB4MDM1NSwgMHgwMzU2LCAweDAzNTcsCisJMHgwMzU4LCAweDAzNTksIDB4MDM1QSwgMHgwMzVCLCAweDAzNUMsIDB4MDM1RCwgMHgwMzVFLCAweDAzNUYsCisJMHgwMzYwLCAweDAzNjEsIDB4MDM2MiwgMHgwMzYzLCAweDAzNjQsIDB4MDM2NSwgMHgwMzY2LCAweDAzNjcsCisJMHgwMzY4LCAweDAzNjksIDB4MDM2QSwgMHgwMzZCLCAweDAzNkMsIDB4MDM2RCwgMHgwMzZFLCAweDAzNkYsCisJMHgwMzcwLCAweDAzNzEsIDB4MDM3MiwgMHgwMzczLCAweDAzNzQsIDB4MDM3NSwgMHgwMzc2LCAweDAzNzcsCisJMHgwMzc4LCAweDAzNzksIDB4MDM3QSwgMHgwMzdCLCAweDAzN0MsIDB4MDM3RCwgMHgwMzdFLCAweDAzN0YsCisJMHgwMzgwLCAweDAzODEsIDB4MDM4MiwgMHgwMzgzLCAweDAzODQsIDB4MDM4NSwgMHgwM0FDLCAweDAzODcsCisJMHgwM0FELCAweDAzQUUsIDB4MDNBRiwgMHgwMzhCLCAweDAzQ0MsIDB4MDM4RCwgMHgwM0NELCAweDAzQ0UsCisJMHgwMzkwLCAweDAzQjEsIDB4MDNCMiwgMHgwM0IzLCAweDAzQjQsIDB4MDNCNSwgMHgwM0I2LCAweDAzQjcsCisJMHgwM0I4LCAweDAzQjksIDB4MDNCQSwgMHgwM0JCLCAweDAzQkMsIDB4MDNCRCwgMHgwM0JFLCAweDAzQkYsCisJMHgwM0MwLCAweDAzQzEsIDB4MDNBMiwgMHgwM0MzLCAweDAzQzQsIDB4MDNDNSwgMHgwM0M2LCAweDAzQzcsCisJMHgwM0M4LCAweDAzQzksIDB4MDNDQSwgMHgwM0NCLCAweDAzQUMsIDB4MDNBRCwgMHgwM0FFLCAweDAzQUYsCisJMHgwM0IwLCAweDAzQjEsIDB4MDNCMiwgMHgwM0IzLCAweDAzQjQsIDB4MDNCNSwgMHgwM0I2LCAweDAzQjcsCisJMHgwM0I4LCAweDAzQjksIDB4MDNCQSwgMHgwM0JCLCAweDAzQkMsIDB4MDNCRCwgMHgwM0JFLCAweDAzQkYsCisJMHgwM0MwLCAweDAzQzEsIDB4MDNDMiwgMHgwM0MzLCAweDAzQzQsIDB4MDNDNSwgMHgwM0M2LCAweDAzQzcsCisJMHgwM0M4LCAweDAzQzksIDB4MDNDQSwgMHgwM0NCLCAweDAzQ0MsIDB4MDNDRCwgMHgwM0NFLCAweDAzQ0YsCisJMHgwM0QwLCAweDAzRDEsIDB4MDNEMiwgMHgwM0QzLCAweDAzRDQsIDB4MDNENSwgMHgwM0Q2LCAweDAzRDcsCisJMHgwM0Q4LCAweDAzRDksIDB4MDNEQSwgMHgwM0RCLCAweDAzREMsIDB4MDNERCwgMHgwM0RFLCAweDAzREYsCisJMHgwM0UwLCAweDAzRTEsIDB4MDNFMywgMHgwM0UzLCAweDAzRTUsIDB4MDNFNSwgMHgwM0U3LCAweDAzRTcsCisJMHgwM0U5LCAweDAzRTksIDB4MDNFQiwgMHgwM0VCLCAweDAzRUQsIDB4MDNFRCwgMHgwM0VGLCAweDAzRUYsCisJMHgwM0YwLCAweDAzRjEsIDB4MDNGMiwgMHgwM0YzLCAweDAzRjQsIDB4MDNGNSwgMHgwM0Y2LCAweDAzRjcsCisJMHgwM0Y4LCAweDAzRjksIDB4MDNGQSwgMHgwM0ZCLCAweDAzRkMsIDB4MDNGRCwgMHgwM0ZFLCAweDAzRkYsCit9OworCisvKiBMb3dlcmNhc2UgbWFwcGluZ3MgMDQwMCAtIDA0RkYgKi8KK3N0YXRpYyBjb25zdCBXQ0hBUiBsYmxrMDRbMjU2XSA9IHsKKwkweDA0MDAsIDB4MDQ1MSwgMHgwNDUyLCAweDA0NTMsIDB4MDQ1NCwgMHgwNDU1LCAweDA0NTYsIDB4MDQ1NywKKwkweDA0NTgsIDB4MDQ1OSwgMHgwNDVBLCAweDA0NUIsIDB4MDQ1QywgMHgwNDBELCAweDA0NUUsIDB4MDQ1RiwKKwkweDA0MzAsIDB4MDQzMSwgMHgwNDMyLCAweDA0MzMsIDB4MDQzNCwgMHgwNDM1LCAweDA0MzYsIDB4MDQzNywKKwkweDA0MzgsIDB4MDQzOSwgMHgwNDNBLCAweDA0M0IsIDB4MDQzQywgMHgwNDNELCAweDA0M0UsIDB4MDQzRiwKKwkweDA0NDAsIDB4MDQ0MSwgMHgwNDQyLCAweDA0NDMsIDB4MDQ0NCwgMHgwNDQ1LCAweDA0NDYsIDB4MDQ0NywKKwkweDA0NDgsIDB4MDQ0OSwgMHgwNDRBLCAweDA0NEIsIDB4MDQ0QywgMHgwNDRELCAweDA0NEUsIDB4MDQ0RiwKKwkweDA0MzAsIDB4MDQzMSwgMHgwNDMyLCAweDA0MzMsIDB4MDQzNCwgMHgwNDM1LCAweDA0MzYsIDB4MDQzNywKKwkweDA0MzgsIDB4MDQzOSwgMHgwNDNBLCAweDA0M0IsIDB4MDQzQywgMHgwNDNELCAweDA0M0UsIDB4MDQzRiwKKwkweDA0NDAsIDB4MDQ0MSwgMHgwNDQyLCAweDA0NDMsIDB4MDQ0NCwgMHgwNDQ1LCAweDA0NDYsIDB4MDQ0NywKKwkweDA0NDgsIDB4MDQ0OSwgMHgwNDRBLCAweDA0NEIsIDB4MDQ0QywgMHgwNDRELCAweDA0NEUsIDB4MDQ0RiwKKwkweDA0NTAsIDB4MDQ1MSwgMHgwNDUyLCAweDA0NTMsIDB4MDQ1NCwgMHgwNDU1LCAweDA0NTYsIDB4MDQ1NywKKwkweDA0NTgsIDB4MDQ1OSwgMHgwNDVBLCAweDA0NUIsIDB4MDQ1QywgMHgwNDVELCAweDA0NUUsIDB4MDQ1RiwKKwkweDA0NjEsIDB4MDQ2MSwgMHgwNDYzLCAweDA0NjMsIDB4MDQ2NSwgMHgwNDY1LCAweDA0NjcsIDB4MDQ2NywKKwkweDA0NjksIDB4MDQ2OSwgMHgwNDZCLCAweDA0NkIsIDB4MDQ2RCwgMHgwNDZELCAweDA0NkYsIDB4MDQ2RiwKKwkweDA0NzEsIDB4MDQ3MSwgMHgwNDczLCAweDA0NzMsIDB4MDQ3NSwgMHgwNDc1LCAweDA0NzcsIDB4MDQ3NywKKwkweDA0NzksIDB4MDQ3OSwgMHgwNDdCLCAweDA0N0IsIDB4MDQ3RCwgMHgwNDdELCAweDA0N0YsIDB4MDQ3RiwKKwkweDA0ODEsIDB4MDQ4MSwgMHgwNDgyLCAweDA0ODMsIDB4MDQ4NCwgMHgwNDg1LCAweDA0ODYsIDB4MDQ4NywKKwkweDA0ODgsIDB4MDQ4OSwgMHgwNDhBLCAweDA0OEIsIDB4MDQ4QywgMHgwNDhELCAweDA0OEUsIDB4MDQ4RiwKKwkweDA0OTEsIDB4MDQ5MSwgMHgwNDkzLCAweDA0OTMsIDB4MDQ5NSwgMHgwNDk1LCAweDA0OTcsIDB4MDQ5NywKKwkweDA0OTksIDB4MDQ5OSwgMHgwNDlCLCAweDA0OUIsIDB4MDQ5RCwgMHgwNDlELCAweDA0OUYsIDB4MDQ5RiwKKwkweDA0QTEsIDB4MDRBMSwgMHgwNEEzLCAweDA0QTMsIDB4MDRBNSwgMHgwNEE1LCAweDA0QTcsIDB4MDRBNywKKwkweDA0QTksIDB4MDRBOSwgMHgwNEFCLCAweDA0QUIsIDB4MDRBRCwgMHgwNEFELCAweDA0QUYsIDB4MDRBRiwKKwkweDA0QjEsIDB4MDRCMSwgMHgwNEIzLCAweDA0QjMsIDB4MDRCNSwgMHgwNEI1LCAweDA0QjcsIDB4MDRCNywKKwkweDA0QjksIDB4MDRCOSwgMHgwNEJCLCAweDA0QkIsIDB4MDRCRCwgMHgwNEJELCAweDA0QkYsIDB4MDRCRiwKKwkweDA0QzAsIDB4MDRDMiwgMHgwNEMyLCAweDA0QzQsIDB4MDRDNCwgMHgwNEM1LCAweDA0QzYsIDB4MDRDOCwKKwkweDA0QzgsIDB4MDRDOSwgMHgwNENBLCAweDA0Q0MsIDB4MDRDQywgMHgwNENELCAweDA0Q0UsIDB4MDRDRiwKKwkweDA0RDEsIDB4MDREMSwgMHgwNEQzLCAweDA0RDMsIDB4MDRENSwgMHgwNEQ1LCAweDA0RDcsIDB4MDRENywKKwkweDA0RDksIDB4MDREOSwgMHgwNERCLCAweDA0REIsIDB4MDRERCwgMHgwNERELCAweDA0REYsIDB4MDRERiwKKwkweDA0RTEsIDB4MDRFMSwgMHgwNEUzLCAweDA0RTMsIDB4MDRFNSwgMHgwNEU1LCAweDA0RTcsIDB4MDRFNywKKwkweDA0RTksIDB4MDRFOSwgMHgwNEVCLCAweDA0RUIsIDB4MDRFQywgMHgwNEVELCAweDA0RUYsIDB4MDRFRiwKKwkweDA0RjEsIDB4MDRGMSwgMHgwNEYzLCAweDA0RjMsIDB4MDRGNSwgMHgwNEY1LCAweDA0RjYsIDB4MDRGNywKKwkweDA0RjksIDB4MDRGOSwgMHgwNEZBLCAweDA0RkIsIDB4MDRGQywgMHgwNEZELCAweDA0RkUsIDB4MDRGRiwKK307CisKKy8qIExvd2VyY2FzZSBtYXBwaW5ncyAwNTAwIC0gMDVGRiAqLworc3RhdGljIGNvbnN0IFdDSEFSIGxibGswNVsyNTZdID0geworCTB4MDUwMCwgMHgwNTAxLCAweDA1MDIsIDB4MDUwMywgMHgwNTA0LCAweDA1MDUsIDB4MDUwNiwgMHgwNTA3LAorCTB4MDUwOCwgMHgwNTA5LCAweDA1MEEsIDB4MDUwQiwgMHgwNTBDLCAweDA1MEQsIDB4MDUwRSwgMHgwNTBGLAorCTB4MDUxMCwgMHgwNTExLCAweDA1MTIsIDB4MDUxMywgMHgwNTE0LCAweDA1MTUsIDB4MDUxNiwgMHgwNTE3LAorCTB4MDUxOCwgMHgwNTE5LCAweDA1MUEsIDB4MDUxQiwgMHgwNTFDLCAweDA1MUQsIDB4MDUxRSwgMHgwNTFGLAorCTB4MDUyMCwgMHgwNTIxLCAweDA1MjIsIDB4MDUyMywgMHgwNTI0LCAweDA1MjUsIDB4MDUyNiwgMHgwNTI3LAorCTB4MDUyOCwgMHgwNTI5LCAweDA1MkEsIDB4MDUyQiwgMHgwNTJDLCAweDA1MkQsIDB4MDUyRSwgMHgwNTJGLAorCTB4MDUzMCwgMHgwNTYxLCAweDA1NjIsIDB4MDU2MywgMHgwNTY0LCAweDA1NjUsIDB4MDU2NiwgMHgwNTY3LAorCTB4MDU2OCwgMHgwNTY5LCAweDA1NkEsIDB4MDU2QiwgMHgwNTZDLCAweDA1NkQsIDB4MDU2RSwgMHgwNTZGLAorCTB4MDU3MCwgMHgwNTcxLCAweDA1NzIsIDB4MDU3MywgMHgwNTc0LCAweDA1NzUsIDB4MDU3NiwgMHgwNTc3LAorCTB4MDU3OCwgMHgwNTc5LCAweDA1N0EsIDB4MDU3QiwgMHgwNTdDLCAweDA1N0QsIDB4MDU3RSwgMHgwNTdGLAorCTB4MDU4MCwgMHgwNTgxLCAweDA1ODIsIDB4MDU4MywgMHgwNTg0LCAweDA1ODUsIDB4MDU4NiwgMHgwNTU3LAorCTB4MDU1OCwgMHgwNTU5LCAweDA1NUEsIDB4MDU1QiwgMHgwNTVDLCAweDA1NUQsIDB4MDU1RSwgMHgwNTVGLAorCTB4MDU2MCwgMHgwNTYxLCAweDA1NjIsIDB4MDU2MywgMHgwNTY0LCAweDA1NjUsIDB4MDU2NiwgMHgwNTY3LAorCTB4MDU2OCwgMHgwNTY5LCAweDA1NkEsIDB4MDU2QiwgMHgwNTZDLCAweDA1NkQsIDB4MDU2RSwgMHgwNTZGLAorCTB4MDU3MCwgMHgwNTcxLCAweDA1NzIsIDB4MDU3MywgMHgwNTc0LCAweDA1NzUsIDB4MDU3NiwgMHgwNTc3LAorCTB4MDU3OCwgMHgwNTc5LCAweDA1N0EsIDB4MDU3QiwgMHgwNTdDLCAweDA1N0QsIDB4MDU3RSwgMHgwNTdGLAorCTB4MDU4MCwgMHgwNTgxLCAweDA1ODIsIDB4MDU4MywgMHgwNTg0LCAweDA1ODUsIDB4MDU4NiwgMHgwNTg3LAorCTB4MDU4OCwgMHgwNTg5LCAweDA1OEEsIDB4MDU4QiwgMHgwNThDLCAweDA1OEQsIDB4MDU4RSwgMHgwNThGLAorCTB4MDU5MCwgMHgwNTkxLCAweDA1OTIsIDB4MDU5MywgMHgwNTk0LCAweDA1OTUsIDB4MDU5NiwgMHgwNTk3LAorCTB4MDU5OCwgMHgwNTk5LCAweDA1OUEsIDB4MDU5QiwgMHgwNTlDLCAweDA1OUQsIDB4MDU5RSwgMHgwNTlGLAorCTB4MDVBMCwgMHgwNUExLCAweDA1QTIsIDB4MDVBMywgMHgwNUE0LCAweDA1QTUsIDB4MDVBNiwgMHgwNUE3LAorCTB4MDVBOCwgMHgwNUE5LCAweDA1QUEsIDB4MDVBQiwgMHgwNUFDLCAweDA1QUQsIDB4MDVBRSwgMHgwNUFGLAorCTB4MDVCMCwgMHgwNUIxLCAweDA1QjIsIDB4MDVCMywgMHgwNUI0LCAweDA1QjUsIDB4MDVCNiwgMHgwNUI3LAorCTB4MDVCOCwgMHgwNUI5LCAweDA1QkEsIDB4MDVCQiwgMHgwNUJDLCAweDA1QkQsIDB4MDVCRSwgMHgwNUJGLAorCTB4MDVDMCwgMHgwNUMxLCAweDA1QzIsIDB4MDVDMywgMHgwNUM0LCAweDA1QzUsIDB4MDVDNiwgMHgwNUM3LAorCTB4MDVDOCwgMHgwNUM5LCAweDA1Q0EsIDB4MDVDQiwgMHgwNUNDLCAweDA1Q0QsIDB4MDVDRSwgMHgwNUNGLAorCTB4MDVEMCwgMHgwNUQxLCAweDA1RDIsIDB4MDVEMywgMHgwNUQ0LCAweDA1RDUsIDB4MDVENiwgMHgwNUQ3LAorCTB4MDVEOCwgMHgwNUQ5LCAweDA1REEsIDB4MDVEQiwgMHgwNURDLCAweDA1REQsIDB4MDVERSwgMHgwNURGLAorCTB4MDVFMCwgMHgwNUUxLCAweDA1RTIsIDB4MDVFMywgMHgwNUU0LCAweDA1RTUsIDB4MDVFNiwgMHgwNUU3LAorCTB4MDVFOCwgMHgwNUU5LCAweDA1RUEsIDB4MDVFQiwgMHgwNUVDLCAweDA1RUQsIDB4MDVFRSwgMHgwNUVGLAorCTB4MDVGMCwgMHgwNUYxLCAweDA1RjIsIDB4MDVGMywgMHgwNUY0LCAweDA1RjUsIDB4MDVGNiwgMHgwNUY3LAorCTB4MDVGOCwgMHgwNUY5LCAweDA1RkEsIDB4MDVGQiwgMHgwNUZDLCAweDA1RkQsIDB4MDVGRSwgMHgwNUZGLAorfTsKKworLyogTG93ZXJjYXNlIG1hcHBpbmdzIDEwMDAgLSAxMEZGICovCitzdGF0aWMgY29uc3QgV0NIQVIgbGJsazEwWzI1Nl0gPSB7CisJMHgxMDAwLCAweDEwMDEsIDB4MTAwMiwgMHgxMDAzLCAweDEwMDQsIDB4MTAwNSwgMHgxMDA2LCAweDEwMDcsCisJMHgxMDA4LCAweDEwMDksIDB4MTAwQSwgMHgxMDBCLCAweDEwMEMsIDB4MTAwRCwgMHgxMDBFLCAweDEwMEYsCisJMHgxMDEwLCAweDEwMTEsIDB4MTAxMiwgMHgxMDEzLCAweDEwMTQsIDB4MTAxNSwgMHgxMDE2LCAweDEwMTcsCisJMHgxMDE4LCAweDEwMTksIDB4MTAxQSwgMHgxMDFCLCAweDEwMUMsIDB4MTAxRCwgMHgxMDFFLCAweDEwMUYsCisJMHgxMDIwLCAweDEwMjEsIDB4MTAyMiwgMHgxMDIzLCAweDEwMjQsIDB4MTAyNSwgMHgxMDI2LCAweDEwMjcsCisJMHgxMDI4LCAweDEwMjksIDB4MTAyQSwgMHgxMDJCLCAweDEwMkMsIDB4MTAyRCwgMHgxMDJFLCAweDEwMkYsCisJMHgxMDMwLCAweDEwMzEsIDB4MTAzMiwgMHgxMDMzLCAweDEwMzQsIDB4MTAzNSwgMHgxMDM2LCAweDEwMzcsCisJMHgxMDM4LCAweDEwMzksIDB4MTAzQSwgMHgxMDNCLCAweDEwM0MsIDB4MTAzRCwgMHgxMDNFLCAweDEwM0YsCisJMHgxMDQwLCAweDEwNDEsIDB4MTA0MiwgMHgxMDQzLCAweDEwNDQsIDB4MTA0NSwgMHgxMDQ2LCAweDEwNDcsCisJMHgxMDQ4LCAweDEwNDksIDB4MTA0QSwgMHgxMDRCLCAweDEwNEMsIDB4MTA0RCwgMHgxMDRFLCAweDEwNEYsCisJMHgxMDUwLCAweDEwNTEsIDB4MTA1MiwgMHgxMDUzLCAweDEwNTQsIDB4MTA1NSwgMHgxMDU2LCAweDEwNTcsCisJMHgxMDU4LCAweDEwNTksIDB4MTA1QSwgMHgxMDVCLCAweDEwNUMsIDB4MTA1RCwgMHgxMDVFLCAweDEwNUYsCisJMHgxMDYwLCAweDEwNjEsIDB4MTA2MiwgMHgxMDYzLCAweDEwNjQsIDB4MTA2NSwgMHgxMDY2LCAweDEwNjcsCisJMHgxMDY4LCAweDEwNjksIDB4MTA2QSwgMHgxMDZCLCAweDEwNkMsIDB4MTA2RCwgMHgxMDZFLCAweDEwNkYsCisJMHgxMDcwLCAweDEwNzEsIDB4MTA3MiwgMHgxMDczLCAweDEwNzQsIDB4MTA3NSwgMHgxMDc2LCAweDEwNzcsCisJMHgxMDc4LCAweDEwNzksIDB4MTA3QSwgMHgxMDdCLCAweDEwN0MsIDB4MTA3RCwgMHgxMDdFLCAweDEwN0YsCisJMHgxMDgwLCAweDEwODEsIDB4MTA4MiwgMHgxMDgzLCAweDEwODQsIDB4MTA4NSwgMHgxMDg2LCAweDEwODcsCisJMHgxMDg4LCAweDEwODksIDB4MTA4QSwgMHgxMDhCLCAweDEwOEMsIDB4MTA4RCwgMHgxMDhFLCAweDEwOEYsCisJMHgxMDkwLCAweDEwOTEsIDB4MTA5MiwgMHgxMDkzLCAweDEwOTQsIDB4MTA5NSwgMHgxMDk2LCAweDEwOTcsCisJMHgxMDk4LCAweDEwOTksIDB4MTA5QSwgMHgxMDlCLCAweDEwOUMsIDB4MTA5RCwgMHgxMDlFLCAweDEwOUYsCisJMHgxMEQwLCAweDEwRDEsIDB4MTBEMiwgMHgxMEQzLCAweDEwRDQsIDB4MTBENSwgMHgxMEQ2LCAweDEwRDcsCisJMHgxMEQ4LCAweDEwRDksIDB4MTBEQSwgMHgxMERCLCAweDEwREMsIDB4MTBERCwgMHgxMERFLCAweDEwREYsCisJMHgxMEUwLCAweDEwRTEsIDB4MTBFMiwgMHgxMEUzLCAweDEwRTQsIDB4MTBFNSwgMHgxMEU2LCAweDEwRTcsCisJMHgxMEU4LCAweDEwRTksIDB4MTBFQSwgMHgxMEVCLCAweDEwRUMsIDB4MTBFRCwgMHgxMEVFLCAweDEwRUYsCisJMHgxMEYwLCAweDEwRjEsIDB4MTBGMiwgMHgxMEYzLCAweDEwRjQsIDB4MTBGNSwgMHgxMEM2LCAweDEwQzcsCisJMHgxMEM4LCAweDEwQzksIDB4MTBDQSwgMHgxMENCLCAweDEwQ0MsIDB4MTBDRCwgMHgxMENFLCAweDEwQ0YsCisJMHgxMEQwLCAweDEwRDEsIDB4MTBEMiwgMHgxMEQzLCAweDEwRDQsIDB4MTBENSwgMHgxMEQ2LCAweDEwRDcsCisJMHgxMEQ4LCAweDEwRDksIDB4MTBEQSwgMHgxMERCLCAweDEwREMsIDB4MTBERCwgMHgxMERFLCAweDEwREYsCisJMHgxMEUwLCAweDEwRTEsIDB4MTBFMiwgMHgxMEUzLCAweDEwRTQsIDB4MTBFNSwgMHgxMEU2LCAweDEwRTcsCisJMHgxMEU4LCAweDEwRTksIDB4MTBFQSwgMHgxMEVCLCAweDEwRUMsIDB4MTBFRCwgMHgxMEVFLCAweDEwRUYsCisJMHgxMEYwLCAweDEwRjEsIDB4MTBGMiwgMHgxMEYzLCAweDEwRjQsIDB4MTBGNSwgMHgxMEY2LCAweDEwRjcsCisJMHgxMEY4LCAweDEwRjksIDB4MTBGQSwgMHgxMEZCLCAweDEwRkMsIDB4MTBGRCwgMHgxMEZFLCAweDEwRkYsCit9OworCisvKiBMb3dlcmNhc2UgbWFwcGluZ3MgMUUwMCAtIDFFRkYgKi8KK3N0YXRpYyBjb25zdCBXQ0hBUiBsYmxrMUVbMjU2XSA9IHsKKwkweDFFMDEsIDB4MUUwMSwgMHgxRTAzLCAweDFFMDMsIDB4MUUwNSwgMHgxRTA1LCAweDFFMDcsIDB4MUUwNywKKwkweDFFMDksIDB4MUUwOSwgMHgxRTBCLCAweDFFMEIsIDB4MUUwRCwgMHgxRTBELCAweDFFMEYsIDB4MUUwRiwKKwkweDFFMTEsIDB4MUUxMSwgMHgxRTEzLCAweDFFMTMsIDB4MUUxNSwgMHgxRTE1LCAweDFFMTcsIDB4MUUxNywKKwkweDFFMTksIDB4MUUxOSwgMHgxRTFCLCAweDFFMUIsIDB4MUUxRCwgMHgxRTFELCAweDFFMUYsIDB4MUUxRiwKKwkweDFFMjEsIDB4MUUyMSwgMHgxRTIzLCAweDFFMjMsIDB4MUUyNSwgMHgxRTI1LCAweDFFMjcsIDB4MUUyNywKKwkweDFFMjksIDB4MUUyOSwgMHgxRTJCLCAweDFFMkIsIDB4MUUyRCwgMHgxRTJELCAweDFFMkYsIDB4MUUyRiwKKwkweDFFMzEsIDB4MUUzMSwgMHgxRTMzLCAweDFFMzMsIDB4MUUzNSwgMHgxRTM1LCAweDFFMzcsIDB4MUUzNywKKwkweDFFMzksIDB4MUUzOSwgMHgxRTNCLCAweDFFM0IsIDB4MUUzRCwgMHgxRTNELCAweDFFM0YsIDB4MUUzRiwKKwkweDFFNDEsIDB4MUU0MSwgMHgxRTQzLCAweDFFNDMsIDB4MUU0NSwgMHgxRTQ1LCAweDFFNDcsIDB4MUU0NywKKwkweDFFNDksIDB4MUU0OSwgMHgxRTRCLCAweDFFNEIsIDB4MUU0RCwgMHgxRTRELCAweDFFNEYsIDB4MUU0RiwKKwkweDFFNTEsIDB4MUU1MSwgMHgxRTUzLCAweDFFNTMsIDB4MUU1NSwgMHgxRTU1LCAweDFFNTcsIDB4MUU1NywKKwkweDFFNTksIDB4MUU1OSwgMHgxRTVCLCAweDFFNUIsIDB4MUU1RCwgMHgxRTVELCAweDFFNUYsIDB4MUU1RiwKKwkweDFFNjEsIDB4MUU2MSwgMHgxRTYzLCAweDFFNjMsIDB4MUU2NSwgMHgxRTY1LCAweDFFNjcsIDB4MUU2NywKKwkweDFFNjksIDB4MUU2OSwgMHgxRTZCLCAweDFFNkIsIDB4MUU2RCwgMHgxRTZELCAweDFFNkYsIDB4MUU2RiwKKwkweDFFNzEsIDB4MUU3MSwgMHgxRTczLCAweDFFNzMsIDB4MUU3NSwgMHgxRTc1LCAweDFFNzcsIDB4MUU3NywKKwkweDFFNzksIDB4MUU3OSwgMHgxRTdCLCAweDFFN0IsIDB4MUU3RCwgMHgxRTdELCAweDFFN0YsIDB4MUU3RiwKKwkweDFFODEsIDB4MUU4MSwgMHgxRTgzLCAweDFFODMsIDB4MUU4NSwgMHgxRTg1LCAweDFFODcsIDB4MUU4NywKKwkweDFFODksIDB4MUU4OSwgMHgxRThCLCAweDFFOEIsIDB4MUU4RCwgMHgxRThELCAweDFFOEYsIDB4MUU4RiwKKwkweDFFOTEsIDB4MUU5MSwgMHgxRTkzLCAweDFFOTMsIDB4MUU5NSwgMHgxRTk1LCAweDFFOTYsIDB4MUU5NywKKwkweDFFOTgsIDB4MUU5OSwgMHgxRTlBLCAweDFFOUIsIDB4MUU5QywgMHgxRTlELCAweDFFOUUsIDB4MUU5RiwKKwkweDFFQTEsIDB4MUVBMSwgMHgxRUEzLCAweDFFQTMsIDB4MUVBNSwgMHgxRUE1LCAweDFFQTcsIDB4MUVBNywKKwkweDFFQTksIDB4MUVBOSwgMHgxRUFCLCAweDFFQUIsIDB4MUVBRCwgMHgxRUFELCAweDFFQUYsIDB4MUVBRiwKKwkweDFFQjEsIDB4MUVCMSwgMHgxRUIzLCAweDFFQjMsIDB4MUVCNSwgMHgxRUI1LCAweDFFQjcsIDB4MUVCNywKKwkweDFFQjksIDB4MUVCOSwgMHgxRUJCLCAweDFFQkIsIDB4MUVCRCwgMHgxRUJELCAweDFFQkYsIDB4MUVCRiwKKwkweDFFQzEsIDB4MUVDMSwgMHgxRUMzLCAweDFFQzMsIDB4MUVDNSwgMHgxRUM1LCAweDFFQzcsIDB4MUVDNywKKwkweDFFQzksIDB4MUVDOSwgMHgxRUNCLCAweDFFQ0IsIDB4MUVDRCwgMHgxRUNELCAweDFFQ0YsIDB4MUVDRiwKKwkweDFFRDEsIDB4MUVEMSwgMHgxRUQzLCAweDFFRDMsIDB4MUVENSwgMHgxRUQ1LCAweDFFRDcsIDB4MUVENywKKwkweDFFRDksIDB4MUVEOSwgMHgxRURCLCAweDFFREIsIDB4MUVERCwgMHgxRURELCAweDFFREYsIDB4MUVERiwKKwkweDFFRTEsIDB4MUVFMSwgMHgxRUUzLCAweDFFRTMsIDB4MUVFNSwgMHgxRUU1LCAweDFFRTcsIDB4MUVFNywKKwkweDFFRTksIDB4MUVFOSwgMHgxRUVCLCAweDFFRUIsIDB4MUVFRCwgMHgxRUVELCAweDFFRUYsIDB4MUVFRiwKKwkweDFFRjEsIDB4MUVGMSwgMHgxRUYzLCAweDFFRjMsIDB4MUVGNSwgMHgxRUY1LCAweDFFRjcsIDB4MUVGNywKKwkweDFFRjksIDB4MUVGOSwgMHgxRUZBLCAweDFFRkIsIDB4MUVGQywgMHgxRUZELCAweDFFRkUsIDB4MUVGRiwKK307CisKKy8qIExvd2VyY2FzZSBtYXBwaW5ncyAxRjAwIC0gMUZGRiAqLworc3RhdGljIGNvbnN0IFdDSEFSIGxibGsxRlsyNTZdID0geworCTB4MUYwMCwgMHgxRjAxLCAweDFGMDIsIDB4MUYwMywgMHgxRjA0LCAweDFGMDUsIDB4MUYwNiwgMHgxRjA3LAorCTB4MUYwMCwgMHgxRjAxLCAweDFGMDIsIDB4MUYwMywgMHgxRjA0LCAweDFGMDUsIDB4MUYwNiwgMHgxRjA3LAorCTB4MUYxMCwgMHgxRjExLCAweDFGMTIsIDB4MUYxMywgMHgxRjE0LCAweDFGMTUsIDB4MUYxNiwgMHgxRjE3LAorCTB4MUYxMCwgMHgxRjExLCAweDFGMTIsIDB4MUYxMywgMHgxRjE0LCAweDFGMTUsIDB4MUYxRSwgMHgxRjFGLAorCTB4MUYyMCwgMHgxRjIxLCAweDFGMjIsIDB4MUYyMywgMHgxRjI0LCAweDFGMjUsIDB4MUYyNiwgMHgxRjI3LAorCTB4MUYyMCwgMHgxRjIxLCAweDFGMjIsIDB4MUYyMywgMHgxRjI0LCAweDFGMjUsIDB4MUYyNiwgMHgxRjI3LAorCTB4MUYzMCwgMHgxRjMxLCAweDFGMzIsIDB4MUYzMywgMHgxRjM0LCAweDFGMzUsIDB4MUYzNiwgMHgxRjM3LAorCTB4MUYzMCwgMHgxRjMxLCAweDFGMzIsIDB4MUYzMywgMHgxRjM0LCAweDFGMzUsIDB4MUYzNiwgMHgxRjM3LAorCTB4MUY0MCwgMHgxRjQxLCAweDFGNDIsIDB4MUY0MywgMHgxRjQ0LCAweDFGNDUsIDB4MUY0NiwgMHgxRjQ3LAorCTB4MUY0MCwgMHgxRjQxLCAweDFGNDIsIDB4MUY0MywgMHgxRjQ0LCAweDFGNDUsIDB4MUY0RSwgMHgxRjRGLAorCTB4MUY1MCwgMHgxRjUxLCAweDFGNTIsIDB4MUY1MywgMHgxRjU0LCAweDFGNTUsIDB4MUY1NiwgMHgxRjU3LAorCTB4MUY1OCwgMHgxRjUxLCAweDFGNUEsIDB4MUY1MywgMHgxRjVDLCAweDFGNTUsIDB4MUY1RSwgMHgxRjU3LAorCTB4MUY2MCwgMHgxRjYxLCAweDFGNjIsIDB4MUY2MywgMHgxRjY0LCAweDFGNjUsIDB4MUY2NiwgMHgxRjY3LAorCTB4MUY2MCwgMHgxRjYxLCAweDFGNjIsIDB4MUY2MywgMHgxRjY0LCAweDFGNjUsIDB4MUY2NiwgMHgxRjY3LAorCTB4MUY3MCwgMHgxRjcxLCAweDFGNzIsIDB4MUY3MywgMHgxRjc0LCAweDFGNzUsIDB4MUY3NiwgMHgxRjc3LAorCTB4MUY3OCwgMHgxRjc5LCAweDFGN0EsIDB4MUY3QiwgMHgxRjdDLCAweDFGN0QsIDB4MUY3RSwgMHgxRjdGLAorCTB4MUY4MCwgMHgxRjgxLCAweDFGODIsIDB4MUY4MywgMHgxRjg0LCAweDFGODUsIDB4MUY4NiwgMHgxRjg3LAorCTB4MUY4MCwgMHgxRjgxLCAweDFGODIsIDB4MUY4MywgMHgxRjg0LCAweDFGODUsIDB4MUY4NiwgMHgxRjg3LAorCTB4MUY5MCwgMHgxRjkxLCAweDFGOTIsIDB4MUY5MywgMHgxRjk0LCAweDFGOTUsIDB4MUY5NiwgMHgxRjk3LAorCTB4MUY5MCwgMHgxRjkxLCAweDFGOTIsIDB4MUY5MywgMHgxRjk0LCAweDFGOTUsIDB4MUY5NiwgMHgxRjk3LAorCTB4MUZBMCwgMHgxRkExLCAweDFGQTIsIDB4MUZBMywgMHgxRkE0LCAweDFGQTUsIDB4MUZBNiwgMHgxRkE3LAorCTB4MUZBMCwgMHgxRkExLCAweDFGQTIsIDB4MUZBMywgMHgxRkE0LCAweDFGQTUsIDB4MUZBNiwgMHgxRkE3LAorCTB4MUZCMCwgMHgxRkIxLCAweDFGQjIsIDB4MUZCMywgMHgxRkI0LCAweDFGQjUsIDB4MUZCNiwgMHgxRkI3LAorCTB4MUZCMCwgMHgxRkIxLCAweDFGNzAsIDB4MUY3MSwgMHgxRkIzLCAweDFGQkQsIDB4MUZCRSwgMHgxRkJGLAorCTB4MUZDMCwgMHgxRkMxLCAweDFGQzIsIDB4MUZDMywgMHgxRkM0LCAweDFGQzUsIDB4MUZDNiwgMHgxRkM3LAorCTB4MUY3MiwgMHgxRjczLCAweDFGNzQsIDB4MUY3NSwgMHgxRkMzLCAweDFGQ0QsIDB4MUZDRSwgMHgxRkNGLAorCTB4MUZEMCwgMHgxRkQxLCAweDFGRDIsIDB4MUZEMywgMHgxRkQ0LCAweDFGRDUsIDB4MUZENiwgMHgxRkQ3LAorCTB4MUZEMCwgMHgxRkQxLCAweDFGNzYsIDB4MUY3NywgMHgxRkRDLCAweDFGREQsIDB4MUZERSwgMHgxRkRGLAorCTB4MUZFMCwgMHgxRkUxLCAweDFGRTIsIDB4MUZFMywgMHgxRkU0LCAweDFGRTUsIDB4MUZFNiwgMHgxRkU3LAorCTB4MUZFMCwgMHgxRkUxLCAweDFGN0EsIDB4MUY3QiwgMHgxRkU1LCAweDFGRUQsIDB4MUZFRSwgMHgxRkVGLAorCTB4MUZGMCwgMHgxRkYxLCAweDFGRjIsIDB4MUZGMywgMHgxRkY0LCAweDFGRjUsIDB4MUZGNiwgMHgxRkY3LAorCTB4MUY3OCwgMHgxRjc5LCAweDFGN0MsIDB4MUY3RCwgMHgxRkYzLCAweDFGRkQsIDB4MUZGRSwgMHgxRkZGLAorfTsKKworLyogTG93ZXJjYXNlIG1hcHBpbmdzIDIxMDAgLSAyMUZGICovCitzdGF0aWMgY29uc3QgV0NIQVIgbGJsazIxWzI1Nl0gPSB7CisJMHgyMTAwLCAweDIxMDEsIDB4MjEwMiwgMHgyMTAzLCAweDIxMDQsIDB4MjEwNSwgMHgyMTA2LCAweDIxMDcsCisJMHgyMTA4LCAweDIxMDksIDB4MjEwQSwgMHgyMTBCLCAweDIxMEMsIDB4MjEwRCwgMHgyMTBFLCAweDIxMEYsCisJMHgyMTEwLCAweDIxMTEsIDB4MjExMiwgMHgyMTEzLCAweDIxMTQsIDB4MjExNSwgMHgyMTE2LCAweDIxMTcsCisJMHgyMTE4LCAweDIxMTksIDB4MjExQSwgMHgyMTFCLCAweDIxMUMsIDB4MjExRCwgMHgyMTFFLCAweDIxMUYsCisJMHgyMTIwLCAweDIxMjEsIDB4MjEyMiwgMHgyMTIzLCAweDIxMjQsIDB4MjEyNSwgMHgyMTI2LCAweDIxMjcsCisJMHgyMTI4LCAweDIxMjksIDB4MjEyQSwgMHgyMTJCLCAweDIxMkMsIDB4MjEyRCwgMHgyMTJFLCAweDIxMkYsCisJMHgyMTMwLCAweDIxMzEsIDB4MjEzMiwgMHgyMTMzLCAweDIxMzQsIDB4MjEzNSwgMHgyMTM2LCAweDIxMzcsCisJMHgyMTM4LCAweDIxMzksIDB4MjEzQSwgMHgyMTNCLCAweDIxM0MsIDB4MjEzRCwgMHgyMTNFLCAweDIxM0YsCisJMHgyMTQwLCAweDIxNDEsIDB4MjE0MiwgMHgyMTQzLCAweDIxNDQsIDB4MjE0NSwgMHgyMTQ2LCAweDIxNDcsCisJMHgyMTQ4LCAweDIxNDksIDB4MjE0QSwgMHgyMTRCLCAweDIxNEMsIDB4MjE0RCwgMHgyMTRFLCAweDIxNEYsCisJMHgyMTUwLCAweDIxNTEsIDB4MjE1MiwgMHgyMTUzLCAweDIxNTQsIDB4MjE1NSwgMHgyMTU2LCAweDIxNTcsCisJMHgyMTU4LCAweDIxNTksIDB4MjE1QSwgMHgyMTVCLCAweDIxNUMsIDB4MjE1RCwgMHgyMTVFLCAweDIxNUYsCisJMHgyMTcwLCAweDIxNzEsIDB4MjE3MiwgMHgyMTczLCAweDIxNzQsIDB4MjE3NSwgMHgyMTc2LCAweDIxNzcsCisJMHgyMTc4LCAweDIxNzksIDB4MjE3QSwgMHgyMTdCLCAweDIxN0MsIDB4MjE3RCwgMHgyMTdFLCAweDIxN0YsCisJMHgyMTcwLCAweDIxNzEsIDB4MjE3MiwgMHgyMTczLCAweDIxNzQsIDB4MjE3NSwgMHgyMTc2LCAweDIxNzcsCisJMHgyMTc4LCAweDIxNzksIDB4MjE3QSwgMHgyMTdCLCAweDIxN0MsIDB4MjE3RCwgMHgyMTdFLCAweDIxN0YsCisJMHgyMTgwLCAweDIxODEsIDB4MjE4MiwgMHgyMTgzLCAweDIxODQsIDB4MjE4NSwgMHgyMTg2LCAweDIxODcsCisJMHgyMTg4LCAweDIxODksIDB4MjE4QSwgMHgyMThCLCAweDIxOEMsIDB4MjE4RCwgMHgyMThFLCAweDIxOEYsCisJMHgyMTkwLCAweDIxOTEsIDB4MjE5MiwgMHgyMTkzLCAweDIxOTQsIDB4MjE5NSwgMHgyMTk2LCAweDIxOTcsCisJMHgyMTk4LCAweDIxOTksIDB4MjE5QSwgMHgyMTlCLCAweDIxOUMsIDB4MjE5RCwgMHgyMTlFLCAweDIxOUYsCisJMHgyMUEwLCAweDIxQTEsIDB4MjFBMiwgMHgyMUEzLCAweDIxQTQsIDB4MjFBNSwgMHgyMUE2LCAweDIxQTcsCisJMHgyMUE4LCAweDIxQTksIDB4MjFBQSwgMHgyMUFCLCAweDIxQUMsIDB4MjFBRCwgMHgyMUFFLCAweDIxQUYsCisJMHgyMUIwLCAweDIxQjEsIDB4MjFCMiwgMHgyMUIzLCAweDIxQjQsIDB4MjFCNSwgMHgyMUI2LCAweDIxQjcsCisJMHgyMUI4LCAweDIxQjksIDB4MjFCQSwgMHgyMUJCLCAweDIxQkMsIDB4MjFCRCwgMHgyMUJFLCAweDIxQkYsCisJMHgyMUMwLCAweDIxQzEsIDB4MjFDMiwgMHgyMUMzLCAweDIxQzQsIDB4MjFDNSwgMHgyMUM2LCAweDIxQzcsCisJMHgyMUM4LCAweDIxQzksIDB4MjFDQSwgMHgyMUNCLCAweDIxQ0MsIDB4MjFDRCwgMHgyMUNFLCAweDIxQ0YsCisJMHgyMUQwLCAweDIxRDEsIDB4MjFEMiwgMHgyMUQzLCAweDIxRDQsIDB4MjFENSwgMHgyMUQ2LCAweDIxRDcsCisJMHgyMUQ4LCAweDIxRDksIDB4MjFEQSwgMHgyMURCLCAweDIxREMsIDB4MjFERCwgMHgyMURFLCAweDIxREYsCisJMHgyMUUwLCAweDIxRTEsIDB4MjFFMiwgMHgyMUUzLCAweDIxRTQsIDB4MjFFNSwgMHgyMUU2LCAweDIxRTcsCisJMHgyMUU4LCAweDIxRTksIDB4MjFFQSwgMHgyMUVCLCAweDIxRUMsIDB4MjFFRCwgMHgyMUVFLCAweDIxRUYsCisJMHgyMUYwLCAweDIxRjEsIDB4MjFGMiwgMHgyMUYzLCAweDIxRjQsIDB4MjFGNSwgMHgyMUY2LCAweDIxRjcsCisJMHgyMUY4LCAweDIxRjksIDB4MjFGQSwgMHgyMUZCLCAweDIxRkMsIDB4MjFGRCwgMHgyMUZFLCAweDIxRkYsCit9OworCisvKiBMb3dlcmNhc2UgbWFwcGluZ3MgMjQwMCAtIDI0RkYgKi8KK3N0YXRpYyBjb25zdCBXQ0hBUiBsYmxrMjRbMjU2XSA9IHsKKwkweDI0MDAsIDB4MjQwMSwgMHgyNDAyLCAweDI0MDMsIDB4MjQwNCwgMHgyNDA1LCAweDI0MDYsIDB4MjQwNywKKwkweDI0MDgsIDB4MjQwOSwgMHgyNDBBLCAweDI0MEIsIDB4MjQwQywgMHgyNDBELCAweDI0MEUsIDB4MjQwRiwKKwkweDI0MTAsIDB4MjQxMSwgMHgyNDEyLCAweDI0MTMsIDB4MjQxNCwgMHgyNDE1LCAweDI0MTYsIDB4MjQxNywKKwkweDI0MTgsIDB4MjQxOSwgMHgyNDFBLCAweDI0MUIsIDB4MjQxQywgMHgyNDFELCAweDI0MUUsIDB4MjQxRiwKKwkweDI0MjAsIDB4MjQyMSwgMHgyNDIyLCAweDI0MjMsIDB4MjQyNCwgMHgyNDI1LCAweDI0MjYsIDB4MjQyNywKKwkweDI0MjgsIDB4MjQyOSwgMHgyNDJBLCAweDI0MkIsIDB4MjQyQywgMHgyNDJELCAweDI0MkUsIDB4MjQyRiwKKwkweDI0MzAsIDB4MjQzMSwgMHgyNDMyLCAweDI0MzMsIDB4MjQzNCwgMHgyNDM1LCAweDI0MzYsIDB4MjQzNywKKwkweDI0MzgsIDB4MjQzOSwgMHgyNDNBLCAweDI0M0IsIDB4MjQzQywgMHgyNDNELCAweDI0M0UsIDB4MjQzRiwKKwkweDI0NDAsIDB4MjQ0MSwgMHgyNDQyLCAweDI0NDMsIDB4MjQ0NCwgMHgyNDQ1LCAweDI0NDYsIDB4MjQ0NywKKwkweDI0NDgsIDB4MjQ0OSwgMHgyNDRBLCAweDI0NEIsIDB4MjQ0QywgMHgyNDRELCAweDI0NEUsIDB4MjQ0RiwKKwkweDI0NTAsIDB4MjQ1MSwgMHgyNDUyLCAweDI0NTMsIDB4MjQ1NCwgMHgyNDU1LCAweDI0NTYsIDB4MjQ1NywKKwkweDI0NTgsIDB4MjQ1OSwgMHgyNDVBLCAweDI0NUIsIDB4MjQ1QywgMHgyNDVELCAweDI0NUUsIDB4MjQ1RiwKKwkweDI0NjAsIDB4MjQ2MSwgMHgyNDYyLCAweDI0NjMsIDB4MjQ2NCwgMHgyNDY1LCAweDI0NjYsIDB4MjQ2NywKKwkweDI0NjgsIDB4MjQ2OSwgMHgyNDZBLCAweDI0NkIsIDB4MjQ2QywgMHgyNDZELCAweDI0NkUsIDB4MjQ2RiwKKwkweDI0NzAsIDB4MjQ3MSwgMHgyNDcyLCAweDI0NzMsIDB4MjQ3NCwgMHgyNDc1LCAweDI0NzYsIDB4MjQ3NywKKwkweDI0NzgsIDB4MjQ3OSwgMHgyNDdBLCAweDI0N0IsIDB4MjQ3QywgMHgyNDdELCAweDI0N0UsIDB4MjQ3RiwKKwkweDI0ODAsIDB4MjQ4MSwgMHgyNDgyLCAweDI0ODMsIDB4MjQ4NCwgMHgyNDg1LCAweDI0ODYsIDB4MjQ4NywKKwkweDI0ODgsIDB4MjQ4OSwgMHgyNDhBLCAweDI0OEIsIDB4MjQ4QywgMHgyNDhELCAweDI0OEUsIDB4MjQ4RiwKKwkweDI0OTAsIDB4MjQ5MSwgMHgyNDkyLCAweDI0OTMsIDB4MjQ5NCwgMHgyNDk1LCAweDI0OTYsIDB4MjQ5NywKKwkweDI0OTgsIDB4MjQ5OSwgMHgyNDlBLCAweDI0OUIsIDB4MjQ5QywgMHgyNDlELCAweDI0OUUsIDB4MjQ5RiwKKwkweDI0QTAsIDB4MjRBMSwgMHgyNEEyLCAweDI0QTMsIDB4MjRBNCwgMHgyNEE1LCAweDI0QTYsIDB4MjRBNywKKwkweDI0QTgsIDB4MjRBOSwgMHgyNEFBLCAweDI0QUIsIDB4MjRBQywgMHgyNEFELCAweDI0QUUsIDB4MjRBRiwKKwkweDI0QjAsIDB4MjRCMSwgMHgyNEIyLCAweDI0QjMsIDB4MjRCNCwgMHgyNEI1LCAweDI0RDAsIDB4MjREMSwKKwkweDI0RDIsIDB4MjREMywgMHgyNEQ0LCAweDI0RDUsIDB4MjRENiwgMHgyNEQ3LCAweDI0RDgsIDB4MjREOSwKKwkweDI0REEsIDB4MjREQiwgMHgyNERDLCAweDI0REQsIDB4MjRERSwgMHgyNERGLCAweDI0RTAsIDB4MjRFMSwKKwkweDI0RTIsIDB4MjRFMywgMHgyNEU0LCAweDI0RTUsIDB4MjRFNiwgMHgyNEU3LCAweDI0RTgsIDB4MjRFOSwKKwkweDI0RDAsIDB4MjREMSwgMHgyNEQyLCAweDI0RDMsIDB4MjRENCwgMHgyNEQ1LCAweDI0RDYsIDB4MjRENywKKwkweDI0RDgsIDB4MjREOSwgMHgyNERBLCAweDI0REIsIDB4MjREQywgMHgyNERELCAweDI0REUsIDB4MjRERiwKKwkweDI0RTAsIDB4MjRFMSwgMHgyNEUyLCAweDI0RTMsIDB4MjRFNCwgMHgyNEU1LCAweDI0RTYsIDB4MjRFNywKKwkweDI0RTgsIDB4MjRFOSwgMHgyNEVBLCAweDI0RUIsIDB4MjRFQywgMHgyNEVELCAweDI0RUUsIDB4MjRFRiwKKwkweDI0RjAsIDB4MjRGMSwgMHgyNEYyLCAweDI0RjMsIDB4MjRGNCwgMHgyNEY1LCAweDI0RjYsIDB4MjRGNywKKwkweDI0RjgsIDB4MjRGOSwgMHgyNEZBLCAweDI0RkIsIDB4MjRGQywgMHgyNEZELCAweDI0RkUsIDB4MjRGRiwKK307CisKKy8qIExvd2VyY2FzZSBtYXBwaW5ncyBGRjAwIC0gRkZGRiAqLworc3RhdGljIGNvbnN0IFdDSEFSIGxibGtGRlsyNTZdID0geworCTB4RkYwMCwgMHhGRjAxLCAweEZGMDIsIDB4RkYwMywgMHhGRjA0LCAweEZGMDUsIDB4RkYwNiwgMHhGRjA3LAorCTB4RkYwOCwgMHhGRjA5LCAweEZGMEEsIDB4RkYwQiwgMHhGRjBDLCAweEZGMEQsIDB4RkYwRSwgMHhGRjBGLAorCTB4RkYxMCwgMHhGRjExLCAweEZGMTIsIDB4RkYxMywgMHhGRjE0LCAweEZGMTUsIDB4RkYxNiwgMHhGRjE3LAorCTB4RkYxOCwgMHhGRjE5LCAweEZGMUEsIDB4RkYxQiwgMHhGRjFDLCAweEZGMUQsIDB4RkYxRSwgMHhGRjFGLAorCTB4RkYyMCwgMHhGRjQxLCAweEZGNDIsIDB4RkY0MywgMHhGRjQ0LCAweEZGNDUsIDB4RkY0NiwgMHhGRjQ3LAorCTB4RkY0OCwgMHhGRjQ5LCAweEZGNEEsIDB4RkY0QiwgMHhGRjRDLCAweEZGNEQsIDB4RkY0RSwgMHhGRjRGLAorCTB4RkY1MCwgMHhGRjUxLCAweEZGNTIsIDB4RkY1MywgMHhGRjU0LCAweEZGNTUsIDB4RkY1NiwgMHhGRjU3LAorCTB4RkY1OCwgMHhGRjU5LCAweEZGNUEsIDB4RkYzQiwgMHhGRjNDLCAweEZGM0QsIDB4RkYzRSwgMHhGRjNGLAorCTB4RkY0MCwgMHhGRjQxLCAweEZGNDIsIDB4RkY0MywgMHhGRjQ0LCAweEZGNDUsIDB4RkY0NiwgMHhGRjQ3LAorCTB4RkY0OCwgMHhGRjQ5LCAweEZGNEEsIDB4RkY0QiwgMHhGRjRDLCAweEZGNEQsIDB4RkY0RSwgMHhGRjRGLAorCTB4RkY1MCwgMHhGRjUxLCAweEZGNTIsIDB4RkY1MywgMHhGRjU0LCAweEZGNTUsIDB4RkY1NiwgMHhGRjU3LAorCTB4RkY1OCwgMHhGRjU5LCAweEZGNUEsIDB4RkY1QiwgMHhGRjVDLCAweEZGNUQsIDB4RkY1RSwgMHhGRjVGLAorCTB4RkY2MCwgMHhGRjYxLCAweEZGNjIsIDB4RkY2MywgMHhGRjY0LCAweEZGNjUsIDB4RkY2NiwgMHhGRjY3LAorCTB4RkY2OCwgMHhGRjY5LCAweEZGNkEsIDB4RkY2QiwgMHhGRjZDLCAweEZGNkQsIDB4RkY2RSwgMHhGRjZGLAorCTB4RkY3MCwgMHhGRjcxLCAweEZGNzIsIDB4RkY3MywgMHhGRjc0LCAweEZGNzUsIDB4RkY3NiwgMHhGRjc3LAorCTB4RkY3OCwgMHhGRjc5LCAweEZGN0EsIDB4RkY3QiwgMHhGRjdDLCAweEZGN0QsIDB4RkY3RSwgMHhGRjdGLAorCTB4RkY4MCwgMHhGRjgxLCAweEZGODIsIDB4RkY4MywgMHhGRjg0LCAweEZGODUsIDB4RkY4NiwgMHhGRjg3LAorCTB4RkY4OCwgMHhGRjg5LCAweEZGOEEsIDB4RkY4QiwgMHhGRjhDLCAweEZGOEQsIDB4RkY4RSwgMHhGRjhGLAorCTB4RkY5MCwgMHhGRjkxLCAweEZGOTIsIDB4RkY5MywgMHhGRjk0LCAweEZGOTUsIDB4RkY5NiwgMHhGRjk3LAorCTB4RkY5OCwgMHhGRjk5LCAweEZGOUEsIDB4RkY5QiwgMHhGRjlDLCAweEZGOUQsIDB4RkY5RSwgMHhGRjlGLAorCTB4RkZBMCwgMHhGRkExLCAweEZGQTIsIDB4RkZBMywgMHhGRkE0LCAweEZGQTUsIDB4RkZBNiwgMHhGRkE3LAorCTB4RkZBOCwgMHhGRkE5LCAweEZGQUEsIDB4RkZBQiwgMHhGRkFDLCAweEZGQUQsIDB4RkZBRSwgMHhGRkFGLAorCTB4RkZCMCwgMHhGRkIxLCAweEZGQjIsIDB4RkZCMywgMHhGRkI0LCAweEZGQjUsIDB4RkZCNiwgMHhGRkI3LAorCTB4RkZCOCwgMHhGRkI5LCAweEZGQkEsIDB4RkZCQiwgMHhGRkJDLCAweEZGQkQsIDB4RkZCRSwgMHhGRkJGLAorCTB4RkZDMCwgMHhGRkMxLCAweEZGQzIsIDB4RkZDMywgMHhGRkM0LCAweEZGQzUsIDB4RkZDNiwgMHhGRkM3LAorCTB4RkZDOCwgMHhGRkM5LCAweEZGQ0EsIDB4RkZDQiwgMHhGRkNDLCAweEZGQ0QsIDB4RkZDRSwgMHhGRkNGLAorCTB4RkZEMCwgMHhGRkQxLCAweEZGRDIsIDB4RkZEMywgMHhGRkQ0LCAweEZGRDUsIDB4RkZENiwgMHhGRkQ3LAorCTB4RkZEOCwgMHhGRkQ5LCAweEZGREEsIDB4RkZEQiwgMHhGRkRDLCAweEZGREQsIDB4RkZERSwgMHhGRkRGLAorCTB4RkZFMCwgMHhGRkUxLCAweEZGRTIsIDB4RkZFMywgMHhGRkU0LCAweEZGRTUsIDB4RkZFNiwgMHhGRkU3LAorCTB4RkZFOCwgMHhGRkU5LCAweEZGRUEsIDB4RkZFQiwgMHhGRkVDLCAweEZGRUQsIDB4RkZFRSwgMHhGRkVGLAorCTB4RkZGMCwgMHhGRkYxLCAweEZGRjIsIDB4RkZGMywgMHhGRkY0LCAweEZGRjUsIDB4RkZGNiwgMHhGRkY3LAorCTB4RkZGOCwgMHhGRkY5LCAweEZGRkEsIDB4RkZGQiwgMHhGRkZDLCAweEZGRkQsIDB4RkZGRSwgMHhGRkZGLAorfTsKKworc3RhdGljIGNvbnN0IFdDSEFSICogY29uc3QgbHdydGFibGVbMjU2XSA9IHsKKwlsYmxrMDAsIGxibGswMSwgbGJsazAyLCBsYmxrMDMsIGxibGswNCwgbGJsazA1LCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwlsYmxrMTAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCBsYmxrMUUsIGxibGsxRiwKKwkwMDAwMDAsIGxibGsyMSwgMDAwMDAwLCAwMDAwMDAsIGxibGsyNCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwKKwkwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIGxibGtGRiwKK307CisKKy8qIFVwcGVyY2FzZSBtYXBwaW5ncyAwMDAwIC0gMDBGRiAqLworc3RhdGljIGNvbnN0IFdDSEFSIHVibGswMFsyNTZdID0geworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywgMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMEEsIDB4MDAwQiwgMHgwMDBDLCAweDAwMEQsIDB4MDAwRSwgMHgwMDBGLAorCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywgMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMUEsIDB4MDAxQiwgMHgwMDFDLCAweDAwMUQsIDB4MDAxRSwgMHgwMDFGLAorCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMkEsIDB4MDAyQiwgMHgwMDJDLCAweDAwMkQsIDB4MDAyRSwgMHgwMDJGLAorCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLAorCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLAorCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA1QiwgMHgwMDVDLCAweDAwNUQsIDB4MDA1RSwgMHgwMDVGLAorCTB4MDA2MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNEEsIDB4MDA0QiwgMHgwMDRDLCAweDAwNEQsIDB4MDA0RSwgMHgwMDRGLAorCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNUEsIDB4MDA3QiwgMHgwMDdDLCAweDAwN0QsIDB4MDA3RSwgMHgwMDdGLAorCTB4MDA4MCwgMHgwMDgxLCAweDAwODIsIDB4MDA4MywgMHgwMDg0LCAweDAwODUsIDB4MDA4NiwgMHgwMDg3LAorCTB4MDA4OCwgMHgwMDg5LCAweDAwOEEsIDB4MDA4QiwgMHgwMDhDLCAweDAwOEQsIDB4MDA4RSwgMHgwMDhGLAorCTB4MDA5MCwgMHgwMDkxLCAweDAwOTIsIDB4MDA5MywgMHgwMDk0LCAweDAwOTUsIDB4MDA5NiwgMHgwMDk3LAorCTB4MDA5OCwgMHgwMDk5LCAweDAwOUEsIDB4MDA5QiwgMHgwMDlDLCAweDAwOUQsIDB4MDA5RSwgMHgwMDlGLAorCTB4MDBBMCwgMHgwMEExLCAweDAwQTIsIDB4MDBBMywgMHgwMEE0LCAweDAwQTUsIDB4MDBBNiwgMHgwMEE3LAorCTB4MDBBOCwgMHgwMEE5LCAweDAwQUEsIDB4MDBBQiwgMHgwMEFDLCAweDAwQUQsIDB4MDBBRSwgMHgwMEFGLAorCTB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMEI0LCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAorCTB4MDBCOCwgMHgwMEI5LCAweDAwQkEsIDB4MDBCQiwgMHgwMEJDLCAweDAwQkQsIDB4MDBCRSwgMHgwMEJGLAorCTB4MDBDMCwgMHgwMEMxLCAweDAwQzIsIDB4MDBDMywgMHgwMEM0LCAweDAwQzUsIDB4MDBDNiwgMHgwMEM3LAorCTB4MDBDOCwgMHgwMEM5LCAweDAwQ0EsIDB4MDBDQiwgMHgwMENDLCAweDAwQ0QsIDB4MDBDRSwgMHgwMENGLAorCTB4MDBEMCwgMHgwMEQxLCAweDAwRDIsIDB4MDBEMywgMHgwMEQ0LCAweDAwRDUsIDB4MDBENiwgMHgwMEQ3LAorCTB4MDBEOCwgMHgwMEQ5LCAweDAwREEsIDB4MDBEQiwgMHgwMERDLCAweDAwREQsIDB4MDBERSwgMHgwMERGLAorCTB4MDBDMCwgMHgwMEMxLCAweDAwQzIsIDB4MDBDMywgMHgwMEM0LCAweDAwQzUsIDB4MDBDNiwgMHgwMEM3LAorCTB4MDBDOCwgMHgwMEM5LCAweDAwQ0EsIDB4MDBDQiwgMHgwMENDLCAweDAwQ0QsIDB4MDBDRSwgMHgwMENGLAorCTB4MDBEMCwgMHgwMEQxLCAweDAwRDIsIDB4MDBEMywgMHgwMEQ0LCAweDAwRDUsIDB4MDBENiwgMHgwMEY3LAorCTB4MDBEOCwgMHgwMEQ5LCAweDAwREEsIDB4MDBEQiwgMHgwMERDLCAweDAwREQsIDB4MDBERSwgMHgwMTc4LAorfTsKKworLyogVXBwZXJjYXNlIG1hcHBpbmdzIDAxMDAgLSAwMUZGICovCitzdGF0aWMgY29uc3QgV0NIQVIgdWJsazAxWzI1Nl0gPSB7CisJMHgwMTAwLCAweDAxMDAsIDB4MDEwMiwgMHgwMTAyLCAweDAxMDQsIDB4MDEwNCwgMHgwMTA2LCAweDAxMDYsCisJMHgwMTA4LCAweDAxMDgsIDB4MDEwQSwgMHgwMTBBLCAweDAxMEMsIDB4MDEwQywgMHgwMTBFLCAweDAxMEUsCisJMHgwMTEwLCAweDAxMTAsIDB4MDExMiwgMHgwMTEyLCAweDAxMTQsIDB4MDExNCwgMHgwMTE2LCAweDAxMTYsCisJMHgwMTE4LCAweDAxMTgsIDB4MDExQSwgMHgwMTFBLCAweDAxMUMsIDB4MDExQywgMHgwMTFFLCAweDAxMUUsCisJMHgwMTIwLCAweDAxMjAsIDB4MDEyMiwgMHgwMTIyLCAweDAxMjQsIDB4MDEyNCwgMHgwMTI2LCAweDAxMjYsCisJMHgwMTI4LCAweDAxMjgsIDB4MDEyQSwgMHgwMTJBLCAweDAxMkMsIDB4MDEyQywgMHgwMTJFLCAweDAxMkUsCisJMHgwMTMwLCAweDAwNDksIDB4MDEzMiwgMHgwMTMyLCAweDAxMzQsIDB4MDEzNCwgMHgwMTM2LCAweDAxMzYsCisJMHgwMTM4LCAweDAxMzksIDB4MDEzOSwgMHgwMTNCLCAweDAxM0IsIDB4MDEzRCwgMHgwMTNELCAweDAxM0YsCisJMHgwMTNGLCAweDAxNDEsIDB4MDE0MSwgMHgwMTQzLCAweDAxNDMsIDB4MDE0NSwgMHgwMTQ1LCAweDAxNDcsCisJMHgwMTQ3LCAweDAxNDksIDB4MDE0QSwgMHgwMTRBLCAweDAxNEMsIDB4MDE0QywgMHgwMTRFLCAweDAxNEUsCisJMHgwMTUwLCAweDAxNTAsIDB4MDE1MiwgMHgwMTUyLCAweDAxNTQsIDB4MDE1NCwgMHgwMTU2LCAweDAxNTYsCisJMHgwMTU4LCAweDAxNTgsIDB4MDE1QSwgMHgwMTVBLCAweDAxNUMsIDB4MDE1QywgMHgwMTVFLCAweDAxNUUsCisJMHgwMTYwLCAweDAxNjAsIDB4MDE2MiwgMHgwMTYyLCAweDAxNjQsIDB4MDE2NCwgMHgwMTY2LCAweDAxNjYsCisJMHgwMTY4LCAweDAxNjgsIDB4MDE2QSwgMHgwMTZBLCAweDAxNkMsIDB4MDE2QywgMHgwMTZFLCAweDAxNkUsCisJMHgwMTcwLCAweDAxNzAsIDB4MDE3MiwgMHgwMTcyLCAweDAxNzQsIDB4MDE3NCwgMHgwMTc2LCAweDAxNzYsCisJMHgwMTc4LCAweDAxNzksIDB4MDE3OSwgMHgwMTdCLCAweDAxN0IsIDB4MDE3RCwgMHgwMTdELCAweDAwNTMsCisJMHgwMTgwLCAweDAxODEsIDB4MDE4MiwgMHgwMTgyLCAweDAxODQsIDB4MDE4NCwgMHgwMTg2LCAweDAxODcsCisJMHgwMTg3LCAweDAxODksIDB4MDE4QSwgMHgwMThCLCAweDAxOEIsIDB4MDE4RCwgMHgwMThFLCAweDAxOEYsCisJMHgwMTkwLCAweDAxOTEsIDB4MDE5MSwgMHgwMTkzLCAweDAxOTQsIDB4MDE5NSwgMHgwMTk2LCAweDAxOTcsCisJMHgwMTk4LCAweDAxOTgsIDB4MDE5QSwgMHgwMTlCLCAweDAxOUMsIDB4MDE5RCwgMHgwMTlFLCAweDAxOUYsCisJMHgwMUEwLCAweDAxQTAsIDB4MDFBMiwgMHgwMUEyLCAweDAxQTQsIDB4MDFBNCwgMHgwMUE2LCAweDAxQTcsCisJMHgwMUE3LCAweDAxQTksIDB4MDFBQSwgMHgwMUFCLCAweDAxQUMsIDB4MDFBQywgMHgwMUFFLCAweDAxQUYsCisJMHgwMUFGLCAweDAxQjEsIDB4MDFCMiwgMHgwMUIzLCAweDAxQjMsIDB4MDFCNSwgMHgwMUI1LCAweDAxQjcsCisJMHgwMUI4LCAweDAxQjgsIDB4MDFCQSwgMHgwMUJCLCAweDAxQkMsIDB4MDFCQywgMHgwMUJFLCAweDAxQkYsCisJMHgwMUMwLCAweDAxQzEsIDB4MDFDMiwgMHgwMUMzLCAweDAxQzQsIDB4MDFDNCwgMHgwMUM0LCAweDAxQzcsCisJMHgwMUM3LCAweDAxQzcsIDB4MDFDQSwgMHgwMUNBLCAweDAxQ0EsIDB4MDFDRCwgMHgwMUNELCAweDAxQ0YsCisJMHgwMUNGLCAweDAxRDEsIDB4MDFEMSwgMHgwMUQzLCAweDAxRDMsIDB4MDFENSwgMHgwMUQ1LCAweDAxRDcsCisJMHgwMUQ3LCAweDAxRDksIDB4MDFEOSwgMHgwMURCLCAweDAxREIsIDB4MDFERCwgMHgwMURFLCAweDAxREUsCisJMHgwMUUwLCAweDAxRTAsIDB4MDFFMiwgMHgwMUUyLCAweDAxRTQsIDB4MDFFNCwgMHgwMUU2LCAweDAxRTYsCisJMHgwMUU4LCAweDAxRTgsIDB4MDFFQSwgMHgwMUVBLCAweDAxRUMsIDB4MDFFQywgMHgwMUVFLCAweDAxRUUsCisJMHgwMUYwLCAweDAxRjEsIDB4MDFGMSwgMHgwMUYxLCAweDAxRjQsIDB4MDFGNCwgMHgwMUY2LCAweDAxRjcsCisJMHgwMUY4LCAweDAxRjksIDB4MDFGQSwgMHgwMUZBLCAweDAxRkMsIDB4MDFGQywgMHgwMUZFLCAweDAxRkUsCit9OworCisvKiBVcHBlcmNhc2UgbWFwcGluZ3MgMDIwMCAtIDAyRkYgKi8KK3N0YXRpYyBjb25zdCBXQ0hBUiB1YmxrMDJbMjU2XSA9IHsKKwkweDAyMDAsIDB4MDIwMCwgMHgwMjAyLCAweDAyMDIsIDB4MDIwNCwgMHgwMjA0LCAweDAyMDYsIDB4MDIwNiwKKwkweDAyMDgsIDB4MDIwOCwgMHgwMjBBLCAweDAyMEEsIDB4MDIwQywgMHgwMjBDLCAweDAyMEUsIDB4MDIwRSwKKwkweDAyMTAsIDB4MDIxMCwgMHgwMjEyLCAweDAyMTIsIDB4MDIxNCwgMHgwMjE0LCAweDAyMTYsIDB4MDIxNiwKKwkweDAyMTgsIDB4MDIxOSwgMHgwMjFBLCAweDAyMUIsIDB4MDIxQywgMHgwMjFELCAweDAyMUUsIDB4MDIxRiwKKwkweDAyMjAsIDB4MDIyMSwgMHgwMjIyLCAweDAyMjMsIDB4MDIyNCwgMHgwMjI1LCAweDAyMjYsIDB4MDIyNywKKwkweDAyMjgsIDB4MDIyOSwgMHgwMjJBLCAweDAyMkIsIDB4MDIyQywgMHgwMjJELCAweDAyMkUsIDB4MDIyRiwKKwkweDAyMzAsIDB4MDIzMSwgMHgwMjMyLCAweDAyMzMsIDB4MDIzNCwgMHgwMjM1LCAweDAyMzYsIDB4MDIzNywKKwkweDAyMzgsIDB4MDIzOSwgMHgwMjNBLCAweDAyM0IsIDB4MDIzQywgMHgwMjNELCAweDAyM0UsIDB4MDIzRiwKKwkweDAyNDAsIDB4MDI0MSwgMHgwMjQyLCAweDAyNDMsIDB4MDI0NCwgMHgwMjQ1LCAweDAyNDYsIDB4MDI0NywKKwkweDAyNDgsIDB4MDI0OSwgMHgwMjRBLCAweDAyNEIsIDB4MDI0QywgMHgwMjRELCAweDAyNEUsIDB4MDI0RiwKKwkweDAyNTAsIDB4MDI1MSwgMHgwMjUyLCAweDAxODEsIDB4MDE4NiwgMHgwMjU1LCAweDAxODksIDB4MDE4QSwKKwkweDAxOEUsIDB4MDE4RiwgMHgwMjVBLCAweDAxOTAsIDB4MDI1QywgMHgwMjVELCAweDAyNUUsIDB4MDI1RiwKKwkweDAxOTMsIDB4MDI2MSwgMHgwMjYyLCAweDAxOTQsIDB4MDI2NCwgMHgwMjY1LCAweDAyNjYsIDB4MDI2NywKKwkweDAxOTcsIDB4MDE5NiwgMHgwMjZBLCAweDAyNkIsIDB4MDI2QywgMHgwMjZELCAweDAyNkUsIDB4MDE5QywKKwkweDAyNzAsIDB4MDI3MSwgMHgwMTlELCAweDAyNzMsIDB4MDI3NCwgMHgwMjc1LCAweDAyNzYsIDB4MDI3NywKKwkweDAyNzgsIDB4MDI3OSwgMHgwMjdBLCAweDAyN0IsIDB4MDI3QywgMHgwMjdELCAweDAyN0UsIDB4MDI3RiwKKwkweDAyODAsIDB4MDI4MSwgMHgwMjgyLCAweDAxQTksIDB4MDI4NCwgMHgwMjg1LCAweDAyODYsIDB4MDI4NywKKwkweDAxQUUsIDB4MDI4OSwgMHgwMUIxLCAweDAxQjIsIDB4MDI4QywgMHgwMjhELCAweDAyOEUsIDB4MDI4RiwKKwkweDAyOTAsIDB4MDI5MSwgMHgwMUI3LCAweDAyOTMsIDB4MDI5NCwgMHgwMjk1LCAweDAyOTYsIDB4MDI5NywKKwkweDAyOTgsIDB4MDI5OSwgMHgwMjlBLCAweDAyOUIsIDB4MDI5QywgMHgwMjlELCAweDAyOUUsIDB4MDI5RiwKKwkweDAyQTAsIDB4MDJBMSwgMHgwMkEyLCAweDAyQTMsIDB4MDJBNCwgMHgwMkE1LCAweDAyQTYsIDB4MDJBNywKKwkweDAyQTgsIDB4MDJBOSwgMHgwMkFBLCAweDAyQUIsIDB4MDJBQywgMHgwMkFELCAweDAyQUUsIDB4MDJBRiwKKwkweDAyQjAsIDB4MDJCMSwgMHgwMkIyLCAweDAyQjMsIDB4MDJCNCwgMHgwMkI1LCAweDAyQjYsIDB4MDJCNywKKwkweDAyQjgsIDB4MDJCOSwgMHgwMkJBLCAweDAyQkIsIDB4MDJCQywgMHgwMkJELCAweDAyQkUsIDB4MDJCRiwKKwkweDAyQzAsIDB4MDJDMSwgMHgwMkMyLCAweDAyQzMsIDB4MDJDNCwgMHgwMkM1LCAweDAyQzYsIDB4MDJDNywKKwkweDAyQzgsIDB4MDJDOSwgMHgwMkNBLCAweDAyQ0IsIDB4MDJDQywgMHgwMkNELCAweDAyQ0UsIDB4MDJDRiwKKwkweDAyRDAsIDB4MDJEMSwgMHgwMkQyLCAweDAyRDMsIDB4MDJENCwgMHgwMkQ1LCAweDAyRDYsIDB4MDJENywKKwkweDAyRDgsIDB4MDJEOSwgMHgwMkRBLCAweDAyREIsIDB4MDJEQywgMHgwMkRELCAweDAyREUsIDB4MDJERiwKKwkweDAyRTAsIDB4MDJFMSwgMHgwMkUyLCAweDAyRTMsIDB4MDJFNCwgMHgwMkU1LCAweDAyRTYsIDB4MDJFNywKKwkweDAyRTgsIDB4MDJFOSwgMHgwMkVBLCAweDAyRUIsIDB4MDJFQywgMHgwMkVELCAweDAyRUUsIDB4MDJFRiwKKwkweDAyRjAsIDB4MDJGMSwgMHgwMkYyLCAweDAyRjMsIDB4MDJGNCwgMHgwMkY1LCAweDAyRjYsIDB4MDJGNywKKwkweDAyRjgsIDB4MDJGOSwgMHgwMkZBLCAweDAyRkIsIDB4MDJGQywgMHgwMkZELCAweDAyRkUsIDB4MDJGRiwKK307CisKKy8qIFVwcGVyY2FzZSBtYXBwaW5ncyAwMzAwIC0gMDNGRiAqLworc3RhdGljIGNvbnN0IFdDSEFSIHVibGswM1syNTZdID0geworCTB4MDMwMCwgMHgwMzAxLCAweDAzMDIsIDB4MDMwMywgMHgwMzA0LCAweDAzMDUsIDB4MDMwNiwgMHgwMzA3LAorCTB4MDMwOCwgMHgwMzA5LCAweDAzMEEsIDB4MDMwQiwgMHgwMzBDLCAweDAzMEQsIDB4MDMwRSwgMHgwMzBGLAorCTB4MDMxMCwgMHgwMzExLCAweDAzMTIsIDB4MDMxMywgMHgwMzE0LCAweDAzMTUsIDB4MDMxNiwgMHgwMzE3LAorCTB4MDMxOCwgMHgwMzE5LCAweDAzMUEsIDB4MDMxQiwgMHgwMzFDLCAweDAzMUQsIDB4MDMxRSwgMHgwMzFGLAorCTB4MDMyMCwgMHgwMzIxLCAweDAzMjIsIDB4MDMyMywgMHgwMzI0LCAweDAzMjUsIDB4MDMyNiwgMHgwMzI3LAorCTB4MDMyOCwgMHgwMzI5LCAweDAzMkEsIDB4MDMyQiwgMHgwMzJDLCAweDAzMkQsIDB4MDMyRSwgMHgwMzJGLAorCTB4MDMzMCwgMHgwMzMxLCAweDAzMzIsIDB4MDMzMywgMHgwMzM0LCAweDAzMzUsIDB4MDMzNiwgMHgwMzM3LAorCTB4MDMzOCwgMHgwMzM5LCAweDAzM0EsIDB4MDMzQiwgMHgwMzNDLCAweDAzM0QsIDB4MDMzRSwgMHgwMzNGLAorCTB4MDM0MCwgMHgwMzQxLCAweDAzNDIsIDB4MDM0MywgMHgwMzQ0LCAweDAzNDUsIDB4MDM0NiwgMHgwMzQ3LAorCTB4MDM0OCwgMHgwMzQ5LCAweDAzNEEsIDB4MDM0QiwgMHgwMzRDLCAweDAzNEQsIDB4MDM0RSwgMHgwMzRGLAorCTB4MDM1MCwgMHgwMzUxLCAweDAzNTIsIDB4MDM1MywgMHgwMzU0LCAweDAzNTUsIDB4MDM1NiwgMHgwMzU3LAorCTB4MDM1OCwgMHgwMzU5LCAweDAzNUEsIDB4MDM1QiwgMHgwMzVDLCAweDAzNUQsIDB4MDM1RSwgMHgwMzVGLAorCTB4MDM2MCwgMHgwMzYxLCAweDAzNjIsIDB4MDM2MywgMHgwMzY0LCAweDAzNjUsIDB4MDM2NiwgMHgwMzY3LAorCTB4MDM2OCwgMHgwMzY5LCAweDAzNkEsIDB4MDM2QiwgMHgwMzZDLCAweDAzNkQsIDB4MDM2RSwgMHgwMzZGLAorCTB4MDM3MCwgMHgwMzcxLCAweDAzNzIsIDB4MDM3MywgMHgwMzc0LCAweDAzNzUsIDB4MDM3NiwgMHgwMzc3LAorCTB4MDM3OCwgMHgwMzc5LCAweDAzN0EsIDB4MDM3QiwgMHgwMzdDLCAweDAzN0QsIDB4MDM3RSwgMHgwMzdGLAorCTB4MDM4MCwgMHgwMzgxLCAweDAzODIsIDB4MDM4MywgMHgwMzg0LCAweDAzODUsIDB4MDM4NiwgMHgwMzg3LAorCTB4MDM4OCwgMHgwMzg5LCAweDAzOEEsIDB4MDM4QiwgMHgwMzhDLCAweDAzOEQsIDB4MDM4RSwgMHgwMzhGLAorCTB4MDM5MCwgMHgwMzkxLCAweDAzOTIsIDB4MDM5MywgMHgwMzk0LCAweDAzOTUsIDB4MDM5NiwgMHgwMzk3LAorCTB4MDM5OCwgMHgwMzk5LCAweDAzOUEsIDB4MDM5QiwgMHgwMzlDLCAweDAzOUQsIDB4MDM5RSwgMHgwMzlGLAorCTB4MDNBMCwgMHgwM0ExLCAweDAzQTIsIDB4MDNBMywgMHgwM0E0LCAweDAzQTUsIDB4MDNBNiwgMHgwM0E3LAorCTB4MDNBOCwgMHgwM0E5LCAweDAzQUEsIDB4MDNBQiwgMHgwMzg2LCAweDAzODgsIDB4MDM4OSwgMHgwMzhBLAorCTB4MDNCMCwgMHgwMzkxLCAweDAzOTIsIDB4MDM5MywgMHgwMzk0LCAweDAzOTUsIDB4MDM5NiwgMHgwMzk3LAorCTB4MDM5OCwgMHgwMzk5LCAweDAzOUEsIDB4MDM5QiwgMHgwMzlDLCAweDAzOUQsIDB4MDM5RSwgMHgwMzlGLAorCTB4MDNBMCwgMHgwM0ExLCAweDAzQzIsIDB4MDNBMywgMHgwM0E0LCAweDAzQTUsIDB4MDNBNiwgMHgwM0E3LAorCTB4MDNBOCwgMHgwM0E5LCAweDAzQUEsIDB4MDNBQiwgMHgwMzhDLCAweDAzOEUsIDB4MDM4RiwgMHgwM0NGLAorCTB4MDM5MiwgMHgwMzk4LCAweDAzRDIsIDB4MDNEMywgMHgwM0Q0LCAweDAzQTYsIDB4MDNBMCwgMHgwM0Q3LAorCTB4MDNEOCwgMHgwM0Q5LCAweDAzREEsIDB4MDNEQiwgMHgwM0RDLCAweDAzREQsIDB4MDNERSwgMHgwM0RGLAorCTB4MDNFMCwgMHgwM0UxLCAweDAzRTIsIDB4MDNFMiwgMHgwM0U0LCAweDAzRTQsIDB4MDNFNiwgMHgwM0U2LAorCTB4MDNFOCwgMHgwM0U4LCAweDAzRUEsIDB4MDNFQSwgMHgwM0VDLCAweDAzRUMsIDB4MDNFRSwgMHgwM0VFLAorCTB4MDM5QSwgMHgwM0ExLCAweDAzRjIsIDB4MDNGMywgMHgwM0Y0LCAweDAzRjUsIDB4MDNGNiwgMHgwM0Y3LAorCTB4MDNGOCwgMHgwM0Y5LCAweDAzRkEsIDB4MDNGQiwgMHgwM0ZDLCAweDAzRkQsIDB4MDNGRSwgMHgwM0ZGLAorfTsKKworLyogVXBwZXJjYXNlIG1hcHBpbmdzIDA0MDAgLSAwNEZGICovCitzdGF0aWMgY29uc3QgV0NIQVIgdWJsazA0WzI1Nl0gPSB7CisJMHgwNDAwLCAweDA0MDEsIDB4MDQwMiwgMHgwNDAzLCAweDA0MDQsIDB4MDQwNSwgMHgwNDA2LCAweDA0MDcsCisJMHgwNDA4LCAweDA0MDksIDB4MDQwQSwgMHgwNDBCLCAweDA0MEMsIDB4MDQwRCwgMHgwNDBFLCAweDA0MEYsCisJMHgwNDEwLCAweDA0MTEsIDB4MDQxMiwgMHgwNDEzLCAweDA0MTQsIDB4MDQxNSwgMHgwNDE2LCAweDA0MTcsCisJMHgwNDE4LCAweDA0MTksIDB4MDQxQSwgMHgwNDFCLCAweDA0MUMsIDB4MDQxRCwgMHgwNDFFLCAweDA0MUYsCisJMHgwNDIwLCAweDA0MjEsIDB4MDQyMiwgMHgwNDIzLCAweDA0MjQsIDB4MDQyNSwgMHgwNDI2LCAweDA0MjcsCisJMHgwNDI4LCAweDA0MjksIDB4MDQyQSwgMHgwNDJCLCAweDA0MkMsIDB4MDQyRCwgMHgwNDJFLCAweDA0MkYsCisJMHgwNDEwLCAweDA0MTEsIDB4MDQxMiwgMHgwNDEzLCAweDA0MTQsIDB4MDQxNSwgMHgwNDE2LCAweDA0MTcsCisJMHgwNDE4LCAweDA0MTksIDB4MDQxQSwgMHgwNDFCLCAweDA0MUMsIDB4MDQxRCwgMHgwNDFFLCAweDA0MUYsCisJMHgwNDIwLCAweDA0MjEsIDB4MDQyMiwgMHgwNDIzLCAweDA0MjQsIDB4MDQyNSwgMHgwNDI2LCAweDA0MjcsCisJMHgwNDI4LCAweDA0MjksIDB4MDQyQSwgMHgwNDJCLCAweDA0MkMsIDB4MDQyRCwgMHgwNDJFLCAweDA0MkYsCisJMHgwNDUwLCAweDA0MDEsIDB4MDQwMiwgMHgwNDAzLCAweDA0MDQsIDB4MDQwNSwgMHgwNDA2LCAweDA0MDcsCisJMHgwNDA4LCAweDA0MDksIDB4MDQwQSwgMHgwNDBCLCAweDA0MEMsIDB4MDQ1RCwgMHgwNDBFLCAweDA0MEYsCisJMHgwNDYwLCAweDA0NjAsIDB4MDQ2MiwgMHgwNDYyLCAweDA0NjQsIDB4MDQ2NCwgMHgwNDY2LCAweDA0NjYsCisJMHgwNDY4LCAweDA0NjgsIDB4MDQ2QSwgMHgwNDZBLCAweDA0NkMsIDB4MDQ2QywgMHgwNDZFLCAweDA0NkUsCisJMHgwNDcwLCAweDA0NzAsIDB4MDQ3MiwgMHgwNDcyLCAweDA0NzQsIDB4MDQ3NCwgMHgwNDc2LCAweDA0NzYsCisJMHgwNDc4LCAweDA0NzgsIDB4MDQ3QSwgMHgwNDdBLCAweDA0N0MsIDB4MDQ3QywgMHgwNDdFLCAweDA0N0UsCisJMHgwNDgwLCAweDA0ODAsIDB4MDQ4MiwgMHgwNDgzLCAweDA0ODQsIDB4MDQ4NSwgMHgwNDg2LCAweDA0ODcsCisJMHgwNDg4LCAweDA0ODksIDB4MDQ4QSwgMHgwNDhCLCAweDA0OEMsIDB4MDQ4RCwgMHgwNDhFLCAweDA0OEYsCisJMHgwNDkwLCAweDA0OTAsIDB4MDQ5MiwgMHgwNDkyLCAweDA0OTQsIDB4MDQ5NCwgMHgwNDk2LCAweDA0OTYsCisJMHgwNDk4LCAweDA0OTgsIDB4MDQ5QSwgMHgwNDlBLCAweDA0OUMsIDB4MDQ5QywgMHgwNDlFLCAweDA0OUUsCisJMHgwNEEwLCAweDA0QTAsIDB4MDRBMiwgMHgwNEEyLCAweDA0QTQsIDB4MDRBNCwgMHgwNEE2LCAweDA0QTYsCisJMHgwNEE4LCAweDA0QTgsIDB4MDRBQSwgMHgwNEFBLCAweDA0QUMsIDB4MDRBQywgMHgwNEFFLCAweDA0QUUsCisJMHgwNEIwLCAweDA0QjAsIDB4MDRCMiwgMHgwNEIyLCAweDA0QjQsIDB4MDRCNCwgMHgwNEI2LCAweDA0QjYsCisJMHgwNEI4LCAweDA0QjgsIDB4MDRCQSwgMHgwNEJBLCAweDA0QkMsIDB4MDRCQywgMHgwNEJFLCAweDA0QkUsCisJMHgwNEMwLCAweDA0QzEsIDB4MDRDMSwgMHgwNEMzLCAweDA0QzMsIDB4MDRDNSwgMHgwNEM2LCAweDA0QzcsCisJMHgwNEM3LCAweDA0QzksIDB4MDRDQSwgMHgwNENCLCAweDA0Q0IsIDB4MDRDRCwgMHgwNENFLCAweDA0Q0YsCisJMHgwNEQwLCAweDA0RDAsIDB4MDREMiwgMHgwNEQyLCAweDA0RDQsIDB4MDRENCwgMHgwNEQ2LCAweDA0RDYsCisJMHgwNEQ4LCAweDA0RDgsIDB4MDREQSwgMHgwNERBLCAweDA0REMsIDB4MDREQywgMHgwNERFLCAweDA0REUsCisJMHgwNEUwLCAweDA0RTAsIDB4MDRFMiwgMHgwNEUyLCAweDA0RTQsIDB4MDRFNCwgMHgwNEU2LCAweDA0RTYsCisJMHgwNEU4LCAweDA0RTgsIDB4MDRFQSwgMHgwNEVBLCAweDA0RUMsIDB4MDRFRCwgMHgwNEVFLCAweDA0RUUsCisJMHgwNEYwLCAweDA0RjAsIDB4MDRGMiwgMHgwNEYyLCAweDA0RjQsIDB4MDRGNCwgMHgwNEY2LCAweDA0RjcsCisJMHgwNEY4LCAweDA0RjgsIDB4MDRGQSwgMHgwNEZCLCAweDA0RkMsIDB4MDRGRCwgMHgwNEZFLCAweDA0RkYsCit9OworCisvKiBVcHBlcmNhc2UgbWFwcGluZ3MgMDUwMCAtIDA1RkYgKi8KK3N0YXRpYyBjb25zdCBXQ0hBUiB1YmxrMDVbMjU2XSA9IHsKKwkweDA1MDAsIDB4MDUwMSwgMHgwNTAyLCAweDA1MDMsIDB4MDUwNCwgMHgwNTA1LCAweDA1MDYsIDB4MDUwNywKKwkweDA1MDgsIDB4MDUwOSwgMHgwNTBBLCAweDA1MEIsIDB4MDUwQywgMHgwNTBELCAweDA1MEUsIDB4MDUwRiwKKwkweDA1MTAsIDB4MDUxMSwgMHgwNTEyLCAweDA1MTMsIDB4MDUxNCwgMHgwNTE1LCAweDA1MTYsIDB4MDUxNywKKwkweDA1MTgsIDB4MDUxOSwgMHgwNTFBLCAweDA1MUIsIDB4MDUxQywgMHgwNTFELCAweDA1MUUsIDB4MDUxRiwKKwkweDA1MjAsIDB4MDUyMSwgMHgwNTIyLCAweDA1MjMsIDB4MDUyNCwgMHgwNTI1LCAweDA1MjYsIDB4MDUyNywKKwkweDA1MjgsIDB4MDUyOSwgMHgwNTJBLCAweDA1MkIsIDB4MDUyQywgMHgwNTJELCAweDA1MkUsIDB4MDUyRiwKKwkweDA1MzAsIDB4MDUzMSwgMHgwNTMyLCAweDA1MzMsIDB4MDUzNCwgMHgwNTM1LCAweDA1MzYsIDB4MDUzNywKKwkweDA1MzgsIDB4MDUzOSwgMHgwNTNBLCAweDA1M0IsIDB4MDUzQywgMHgwNTNELCAweDA1M0UsIDB4MDUzRiwKKwkweDA1NDAsIDB4MDU0MSwgMHgwNTQyLCAweDA1NDMsIDB4MDU0NCwgMHgwNTQ1LCAweDA1NDYsIDB4MDU0NywKKwkweDA1NDgsIDB4MDU0OSwgMHgwNTRBLCAweDA1NEIsIDB4MDU0QywgMHgwNTRELCAweDA1NEUsIDB4MDU0RiwKKwkweDA1NTAsIDB4MDU1MSwgMHgwNTUyLCAweDA1NTMsIDB4MDU1NCwgMHgwNTU1LCAweDA1NTYsIDB4MDU1NywKKwkweDA1NTgsIDB4MDU1OSwgMHgwNTVBLCAweDA1NUIsIDB4MDU1QywgMHgwNTVELCAweDA1NUUsIDB4MDU1RiwKKwkweDA1NjAsIDB4MDUzMSwgMHgwNTMyLCAweDA1MzMsIDB4MDUzNCwgMHgwNTM1LCAweDA1MzYsIDB4MDUzNywKKwkweDA1MzgsIDB4MDUzOSwgMHgwNTNBLCAweDA1M0IsIDB4MDUzQywgMHgwNTNELCAweDA1M0UsIDB4MDUzRiwKKwkweDA1NDAsIDB4MDU0MSwgMHgwNTQyLCAweDA1NDMsIDB4MDU0NCwgMHgwNTQ1LCAweDA1NDYsIDB4MDU0NywKKwkweDA1NDgsIDB4MDU0OSwgMHgwNTRBLCAweDA1NEIsIDB4MDU0QywgMHgwNTRELCAweDA1NEUsIDB4MDU0RiwKKwkweDA1NTAsIDB4MDU1MSwgMHgwNTUyLCAweDA1NTMsIDB4MDU1NCwgMHgwNTU1LCAweDA1NTYsIDB4MDU4NywKKwkweDA1ODgsIDB4MDU4OSwgMHgwNThBLCAweDA1OEIsIDB4MDU4QywgMHgwNThELCAweDA1OEUsIDB4MDU4RiwKKwkweDA1OTAsIDB4MDU5MSwgMHgwNTkyLCAweDA1OTMsIDB4MDU5NCwgMHgwNTk1LCAweDA1OTYsIDB4MDU5NywKKwkweDA1OTgsIDB4MDU5OSwgMHgwNTlBLCAweDA1OUIsIDB4MDU5QywgMHgwNTlELCAweDA1OUUsIDB4MDU5RiwKKwkweDA1QTAsIDB4MDVBMSwgMHgwNUEyLCAweDA1QTMsIDB4MDVBNCwgMHgwNUE1LCAweDA1QTYsIDB4MDVBNywKKwkweDA1QTgsIDB4MDVBOSwgMHgwNUFBLCAweDA1QUIsIDB4MDVBQywgMHgwNUFELCAweDA1QUUsIDB4MDVBRiwKKwkweDA1QjAsIDB4MDVCMSwgMHgwNUIyLCAweDA1QjMsIDB4MDVCNCwgMHgwNUI1LCAweDA1QjYsIDB4MDVCNywKKwkweDA1QjgsIDB4MDVCOSwgMHgwNUJBLCAweDA1QkIsIDB4MDVCQywgMHgwNUJELCAweDA1QkUsIDB4MDVCRiwKKwkweDA1QzAsIDB4MDVDMSwgMHgwNUMyLCAweDA1QzMsIDB4MDVDNCwgMHgwNUM1LCAweDA1QzYsIDB4MDVDNywKKwkweDA1QzgsIDB4MDVDOSwgMHgwNUNBLCAweDA1Q0IsIDB4MDVDQywgMHgwNUNELCAweDA1Q0UsIDB4MDVDRiwKKwkweDA1RDAsIDB4MDVEMSwgMHgwNUQyLCAweDA1RDMsIDB4MDVENCwgMHgwNUQ1LCAweDA1RDYsIDB4MDVENywKKwkweDA1RDgsIDB4MDVEOSwgMHgwNURBLCAweDA1REIsIDB4MDVEQywgMHgwNURELCAweDA1REUsIDB4MDVERiwKKwkweDA1RTAsIDB4MDVFMSwgMHgwNUUyLCAweDA1RTMsIDB4MDVFNCwgMHgwNUU1LCAweDA1RTYsIDB4MDVFNywKKwkweDA1RTgsIDB4MDVFOSwgMHgwNUVBLCAweDA1RUIsIDB4MDVFQywgMHgwNUVELCAweDA1RUUsIDB4MDVFRiwKKwkweDA1RjAsIDB4MDVGMSwgMHgwNUYyLCAweDA1RjMsIDB4MDVGNCwgMHgwNUY1LCAweDA1RjYsIDB4MDVGNywKKwkweDA1RjgsIDB4MDVGOSwgMHgwNUZBLCAweDA1RkIsIDB4MDVGQywgMHgwNUZELCAweDA1RkUsIDB4MDVGRiwKK307CisKKy8qIFVwcGVyY2FzZSBtYXBwaW5ncyAxRTAwIC0gMUVGRiAqLworc3RhdGljIGNvbnN0IFdDSEFSIHVibGsxRVsyNTZdID0geworCTB4MUUwMCwgMHgxRTAwLCAweDFFMDIsIDB4MUUwMiwgMHgxRTA0LCAweDFFMDQsIDB4MUUwNiwgMHgxRTA2LAorCTB4MUUwOCwgMHgxRTA4LCAweDFFMEEsIDB4MUUwQSwgMHgxRTBDLCAweDFFMEMsIDB4MUUwRSwgMHgxRTBFLAorCTB4MUUxMCwgMHgxRTEwLCAweDFFMTIsIDB4MUUxMiwgMHgxRTE0LCAweDFFMTQsIDB4MUUxNiwgMHgxRTE2LAorCTB4MUUxOCwgMHgxRTE4LCAweDFFMUEsIDB4MUUxQSwgMHgxRTFDLCAweDFFMUMsIDB4MUUxRSwgMHgxRTFFLAorCTB4MUUyMCwgMHgxRTIwLCAweDFFMjIsIDB4MUUyMiwgMHgxRTI0LCAweDFFMjQsIDB4MUUyNiwgMHgxRTI2LAorCTB4MUUyOCwgMHgxRTI4LCAweDFFMkEsIDB4MUUyQSwgMHgxRTJDLCAweDFFMkMsIDB4MUUyRSwgMHgxRTJFLAorCTB4MUUzMCwgMHgxRTMwLCAweDFFMzIsIDB4MUUzMiwgMHgxRTM0LCAweDFFMzQsIDB4MUUzNiwgMHgxRTM2LAorCTB4MUUzOCwgMHgxRTM4LCAweDFFM0EsIDB4MUUzQSwgMHgxRTNDLCAweDFFM0MsIDB4MUUzRSwgMHgxRTNFLAorCTB4MUU0MCwgMHgxRTQwLCAweDFFNDIsIDB4MUU0MiwgMHgxRTQ0LCAweDFFNDQsIDB4MUU0NiwgMHgxRTQ2LAorCTB4MUU0OCwgMHgxRTQ4LCAweDFFNEEsIDB4MUU0QSwgMHgxRTRDLCAweDFFNEMsIDB4MUU0RSwgMHgxRTRFLAorCTB4MUU1MCwgMHgxRTUwLCAweDFFNTIsIDB4MUU1MiwgMHgxRTU0LCAweDFFNTQsIDB4MUU1NiwgMHgxRTU2LAorCTB4MUU1OCwgMHgxRTU4LCAweDFFNUEsIDB4MUU1QSwgMHgxRTVDLCAweDFFNUMsIDB4MUU1RSwgMHgxRTVFLAorCTB4MUU2MCwgMHgxRTYwLCAweDFFNjIsIDB4MUU2MiwgMHgxRTY0LCAweDFFNjQsIDB4MUU2NiwgMHgxRTY2LAorCTB4MUU2OCwgMHgxRTY4LCAweDFFNkEsIDB4MUU2QSwgMHgxRTZDLCAweDFFNkMsIDB4MUU2RSwgMHgxRTZFLAorCTB4MUU3MCwgMHgxRTcwLCAweDFFNzIsIDB4MUU3MiwgMHgxRTc0LCAweDFFNzQsIDB4MUU3NiwgMHgxRTc2LAorCTB4MUU3OCwgMHgxRTc4LCAweDFFN0EsIDB4MUU3QSwgMHgxRTdDLCAweDFFN0MsIDB4MUU3RSwgMHgxRTdFLAorCTB4MUU4MCwgMHgxRTgwLCAweDFFODIsIDB4MUU4MiwgMHgxRTg0LCAweDFFODQsIDB4MUU4NiwgMHgxRTg2LAorCTB4MUU4OCwgMHgxRTg4LCAweDFFOEEsIDB4MUU4QSwgMHgxRThDLCAweDFFOEMsIDB4MUU4RSwgMHgxRThFLAorCTB4MUU5MCwgMHgxRTkwLCAweDFFOTIsIDB4MUU5MiwgMHgxRTk0LCAweDFFOTQsIDB4MUU5NiwgMHgxRTk3LAorCTB4MUU5OCwgMHgxRTk5LCAweDFFOUEsIDB4MUU5QiwgMHgxRTlDLCAweDFFOUQsIDB4MUU5RSwgMHgxRTlGLAorCTB4MUVBMCwgMHgxRUEwLCAweDFFQTIsIDB4MUVBMiwgMHgxRUE0LCAweDFFQTQsIDB4MUVBNiwgMHgxRUE2LAorCTB4MUVBOCwgMHgxRUE4LCAweDFFQUEsIDB4MUVBQSwgMHgxRUFDLCAweDFFQUMsIDB4MUVBRSwgMHgxRUFFLAorCTB4MUVCMCwgMHgxRUIwLCAweDFFQjIsIDB4MUVCMiwgMHgxRUI0LCAweDFFQjQsIDB4MUVCNiwgMHgxRUI2LAorCTB4MUVCOCwgMHgxRUI4LCAweDFFQkEsIDB4MUVCQSwgMHgxRUJDLCAweDFFQkMsIDB4MUVCRSwgMHgxRUJFLAorCTB4MUVDMCwgMHgxRUMwLCAweDFFQzIsIDB4MUVDMiwgMHgxRUM0LCAweDFFQzQsIDB4MUVDNiwgMHgxRUM2LAorCTB4MUVDOCwgMHgxRUM4LCAweDFFQ0EsIDB4MUVDQSwgMHgxRUNDLCAweDFFQ0MsIDB4MUVDRSwgMHgxRUNFLAorCTB4MUVEMCwgMHgxRUQwLCAweDFFRDIsIDB4MUVEMiwgMHgxRUQ0LCAweDFFRDQsIDB4MUVENiwgMHgxRUQ2LAorCTB4MUVEOCwgMHgxRUQ4LCAweDFFREEsIDB4MUVEQSwgMHgxRURDLCAweDFFREMsIDB4MUVERSwgMHgxRURFLAorCTB4MUVFMCwgMHgxRUUwLCAweDFFRTIsIDB4MUVFMiwgMHgxRUU0LCAweDFFRTQsIDB4MUVFNiwgMHgxRUU2LAorCTB4MUVFOCwgMHgxRUU4LCAweDFFRUEsIDB4MUVFQSwgMHgxRUVDLCAweDFFRUMsIDB4MUVFRSwgMHgxRUVFLAorCTB4MUVGMCwgMHgxRUYwLCAweDFFRjIsIDB4MUVGMiwgMHgxRUY0LCAweDFFRjQsIDB4MUVGNiwgMHgxRUY2LAorCTB4MUVGOCwgMHgxRUY4LCAweDFFRkEsIDB4MUVGQiwgMHgxRUZDLCAweDFFRkQsIDB4MUVGRSwgMHgxRUZGLAorfTsKKworLyogVXBwZXJjYXNlIG1hcHBpbmdzIDFGMDAgLSAxRkZGICovCitzdGF0aWMgY29uc3QgV0NIQVIgdWJsazFGWzI1Nl0gPSB7CisJMHgxRjA4LCAweDFGMDksIDB4MUYwQSwgMHgxRjBCLCAweDFGMEMsIDB4MUYwRCwgMHgxRjBFLCAweDFGMEYsCisJMHgxRjA4LCAweDFGMDksIDB4MUYwQSwgMHgxRjBCLCAweDFGMEMsIDB4MUYwRCwgMHgxRjBFLCAweDFGMEYsCisJMHgxRjE4LCAweDFGMTksIDB4MUYxQSwgMHgxRjFCLCAweDFGMUMsIDB4MUYxRCwgMHgxRjE2LCAweDFGMTcsCisJMHgxRjE4LCAweDFGMTksIDB4MUYxQSwgMHgxRjFCLCAweDFGMUMsIDB4MUYxRCwgMHgxRjFFLCAweDFGMUYsCisJMHgxRjI4LCAweDFGMjksIDB4MUYyQSwgMHgxRjJCLCAweDFGMkMsIDB4MUYyRCwgMHgxRjJFLCAweDFGMkYsCisJMHgxRjI4LCAweDFGMjksIDB4MUYyQSwgMHgxRjJCLCAweDFGMkMsIDB4MUYyRCwgMHgxRjJFLCAweDFGMkYsCisJMHgxRjM4LCAweDFGMzksIDB4MUYzQSwgMHgxRjNCLCAweDFGM0MsIDB4MUYzRCwgMHgxRjNFLCAweDFGM0YsCisJMHgxRjM4LCAweDFGMzksIDB4MUYzQSwgMHgxRjNCLCAweDFGM0MsIDB4MUYzRCwgMHgxRjNFLCAweDFGM0YsCisJMHgxRjQ4LCAweDFGNDksIDB4MUY0QSwgMHgxRjRCLCAweDFGNEMsIDB4MUY0RCwgMHgxRjQ2LCAweDFGNDcsCisJMHgxRjQ4LCAweDFGNDksIDB4MUY0QSwgMHgxRjRCLCAweDFGNEMsIDB4MUY0RCwgMHgxRjRFLCAweDFGNEYsCisJMHgxRjUwLCAweDFGNTksIDB4MUY1MiwgMHgxRjVCLCAweDFGNTQsIDB4MUY1RCwgMHgxRjU2LCAweDFGNUYsCisJMHgxRjU4LCAweDFGNTksIDB4MUY1QSwgMHgxRjVCLCAweDFGNUMsIDB4MUY1RCwgMHgxRjVFLCAweDFGNUYsCisJMHgxRjY4LCAweDFGNjksIDB4MUY2QSwgMHgxRjZCLCAweDFGNkMsIDB4MUY2RCwgMHgxRjZFLCAweDFGNkYsCisJMHgxRjY4LCAweDFGNjksIDB4MUY2QSwgMHgxRjZCLCAweDFGNkMsIDB4MUY2RCwgMHgxRjZFLCAweDFGNkYsCisJMHgxRkJBLCAweDFGQkIsIDB4MUZDOCwgMHgxRkM5LCAweDFGQ0EsIDB4MUZDQiwgMHgxRkRBLCAweDFGREIsCisJMHgxRkY4LCAweDFGRjksIDB4MUZFQSwgMHgxRkVCLCAweDFGRkEsIDB4MUZGQiwgMHgxRjdFLCAweDFGN0YsCisJMHgxRjg4LCAweDFGODksIDB4MUY4QSwgMHgxRjhCLCAweDFGOEMsIDB4MUY4RCwgMHgxRjhFLCAweDFGOEYsCisJMHgxRjg4LCAweDFGODksIDB4MUY4QSwgMHgxRjhCLCAweDFGOEMsIDB4MUY4RCwgMHgxRjhFLCAweDFGOEYsCisJMHgxRjk4LCAweDFGOTksIDB4MUY5QSwgMHgxRjlCLCAweDFGOUMsIDB4MUY5RCwgMHgxRjlFLCAweDFGOUYsCisJMHgxRjk4LCAweDFGOTksIDB4MUY5QSwgMHgxRjlCLCAweDFGOUMsIDB4MUY5RCwgMHgxRjlFLCAweDFGOUYsCisJMHgxRkE4LCAweDFGQTksIDB4MUZBQSwgMHgxRkFCLCAweDFGQUMsIDB4MUZBRCwgMHgxRkFFLCAweDFGQUYsCisJMHgxRkE4LCAweDFGQTksIDB4MUZBQSwgMHgxRkFCLCAweDFGQUMsIDB4MUZBRCwgMHgxRkFFLCAweDFGQUYsCisJMHgxRkI4LCAweDFGQjksIDB4MUZCMiwgMHgxRkJDLCAweDFGQjQsIDB4MUZCNSwgMHgxRkI2LCAweDFGQjcsCisJMHgxRkI4LCAweDFGQjksIDB4MUZCQSwgMHgxRkJCLCAweDFGQkMsIDB4MUZCRCwgMHgxRkJFLCAweDFGQkYsCisJMHgxRkMwLCAweDFGQzEsIDB4MUZDMiwgMHgxRkNDLCAweDFGQzQsIDB4MUZDNSwgMHgxRkM2LCAweDFGQzcsCisJMHgxRkM4LCAweDFGQzksIDB4MUZDQSwgMHgxRkNCLCAweDFGQ0MsIDB4MUZDRCwgMHgxRkNFLCAweDFGQ0YsCisJMHgxRkQ4LCAweDFGRDksIDB4MUZEMiwgMHgxRkQzLCAweDFGRDQsIDB4MUZENSwgMHgxRkQ2LCAweDFGRDcsCisJMHgxRkQ4LCAweDFGRDksIDB4MUZEQSwgMHgxRkRCLCAweDFGREMsIDB4MUZERCwgMHgxRkRFLCAweDFGREYsCisJMHgxRkU4LCAweDFGRTksIDB4MUZFMiwgMHgxRkUzLCAweDFGRTQsIDB4MUZFQywgMHgxRkU2LCAweDFGRTcsCisJMHgxRkU4LCAweDFGRTksIDB4MUZFQSwgMHgxRkVCLCAweDFGRUMsIDB4MUZFRCwgMHgxRkVFLCAweDFGRUYsCisJMHgxRkYwLCAweDFGRjEsIDB4MUZGMiwgMHgxRkZDLCAweDFGRjQsIDB4MUZGNSwgMHgxRkY2LCAweDFGRjcsCisJMHgxRkY4LCAweDFGRjksIDB4MUZGQSwgMHgxRkZCLCAweDFGRkMsIDB4MUZGRCwgMHgxRkZFLCAweDFGRkYsCit9OworCisvKiBVcHBlcmNhc2UgbWFwcGluZ3MgMjEwMCAtIDIxRkYgKi8KK3N0YXRpYyBjb25zdCBXQ0hBUiB1YmxrMjFbMjU2XSA9IHsKKwkweDIxMDAsIDB4MjEwMSwgMHgyMTAyLCAweDIxMDMsIDB4MjEwNCwgMHgyMTA1LCAweDIxMDYsIDB4MjEwNywKKwkweDIxMDgsIDB4MjEwOSwgMHgyMTBBLCAweDIxMEIsIDB4MjEwQywgMHgyMTBELCAweDIxMEUsIDB4MjEwRiwKKwkweDIxMTAsIDB4MjExMSwgMHgyMTEyLCAweDIxMTMsIDB4MjExNCwgMHgyMTE1LCAweDIxMTYsIDB4MjExNywKKwkweDIxMTgsIDB4MjExOSwgMHgyMTFBLCAweDIxMUIsIDB4MjExQywgMHgyMTFELCAweDIxMUUsIDB4MjExRiwKKwkweDIxMjAsIDB4MjEyMSwgMHgyMTIyLCAweDIxMjMsIDB4MjEyNCwgMHgyMTI1LCAweDIxMjYsIDB4MjEyNywKKwkweDIxMjgsIDB4MjEyOSwgMHgyMTJBLCAweDIxMkIsIDB4MjEyQywgMHgyMTJELCAweDIxMkUsIDB4MjEyRiwKKwkweDIxMzAsIDB4MjEzMSwgMHgyMTMyLCAweDIxMzMsIDB4MjEzNCwgMHgyMTM1LCAweDIxMzYsIDB4MjEzNywKKwkweDIxMzgsIDB4MjEzOSwgMHgyMTNBLCAweDIxM0IsIDB4MjEzQywgMHgyMTNELCAweDIxM0UsIDB4MjEzRiwKKwkweDIxNDAsIDB4MjE0MSwgMHgyMTQyLCAweDIxNDMsIDB4MjE0NCwgMHgyMTQ1LCAweDIxNDYsIDB4MjE0NywKKwkweDIxNDgsIDB4MjE0OSwgMHgyMTRBLCAweDIxNEIsIDB4MjE0QywgMHgyMTRELCAweDIxNEUsIDB4MjE0RiwKKwkweDIxNTAsIDB4MjE1MSwgMHgyMTUyLCAweDIxNTMsIDB4MjE1NCwgMHgyMTU1LCAweDIxNTYsIDB4MjE1NywKKwkweDIxNTgsIDB4MjE1OSwgMHgyMTVBLCAweDIxNUIsIDB4MjE1QywgMHgyMTVELCAweDIxNUUsIDB4MjE1RiwKKwkweDIxNjAsIDB4MjE2MSwgMHgyMTYyLCAweDIxNjMsIDB4MjE2NCwgMHgyMTY1LCAweDIxNjYsIDB4MjE2NywKKwkweDIxNjgsIDB4MjE2OSwgMHgyMTZBLCAweDIxNkIsIDB4MjE2QywgMHgyMTZELCAweDIxNkUsIDB4MjE2RiwKKwkweDIxNjAsIDB4MjE2MSwgMHgyMTYyLCAweDIxNjMsIDB4MjE2NCwgMHgyMTY1LCAweDIxNjYsIDB4MjE2NywKKwkweDIxNjgsIDB4MjE2OSwgMHgyMTZBLCAweDIxNkIsIDB4MjE2QywgMHgyMTZELCAweDIxNkUsIDB4MjE2RiwKKwkweDIxODAsIDB4MjE4MSwgMHgyMTgyLCAweDIxODMsIDB4MjE4NCwgMHgyMTg1LCAweDIxODYsIDB4MjE4NywKKwkweDIxODgsIDB4MjE4OSwgMHgyMThBLCAweDIxOEIsIDB4MjE4QywgMHgyMThELCAweDIxOEUsIDB4MjE4RiwKKwkweDIxOTAsIDB4MjE5MSwgMHgyMTkyLCAweDIxOTMsIDB4MjE5NCwgMHgyMTk1LCAweDIxOTYsIDB4MjE5NywKKwkweDIxOTgsIDB4MjE5OSwgMHgyMTlBLCAweDIxOUIsIDB4MjE5QywgMHgyMTlELCAweDIxOUUsIDB4MjE5RiwKKwkweDIxQTAsIDB4MjFBMSwgMHgyMUEyLCAweDIxQTMsIDB4MjFBNCwgMHgyMUE1LCAweDIxQTYsIDB4MjFBNywKKwkweDIxQTgsIDB4MjFBOSwgMHgyMUFBLCAweDIxQUIsIDB4MjFBQywgMHgyMUFELCAweDIxQUUsIDB4MjFBRiwKKwkweDIxQjAsIDB4MjFCMSwgMHgyMUIyLCAweDIxQjMsIDB4MjFCNCwgMHgyMUI1LCAweDIxQjYsIDB4MjFCNywKKwkweDIxQjgsIDB4MjFCOSwgMHgyMUJBLCAweDIxQkIsIDB4MjFCQywgMHgyMUJELCAweDIxQkUsIDB4MjFCRiwKKwkweDIxQzAsIDB4MjFDMSwgMHgyMUMyLCAweDIxQzMsIDB4MjFDNCwgMHgyMUM1LCAweDIxQzYsIDB4MjFDNywKKwkweDIxQzgsIDB4MjFDOSwgMHgyMUNBLCAweDIxQ0IsIDB4MjFDQywgMHgyMUNELCAweDIxQ0UsIDB4MjFDRiwKKwkweDIxRDAsIDB4MjFEMSwgMHgyMUQyLCAweDIxRDMsIDB4MjFENCwgMHgyMUQ1LCAweDIxRDYsIDB4MjFENywKKwkweDIxRDgsIDB4MjFEOSwgMHgyMURBLCAweDIxREIsIDB4MjFEQywgMHgyMURELCAweDIxREUsIDB4MjFERiwKKwkweDIxRTAsIDB4MjFFMSwgMHgyMUUyLCAweDIxRTMsIDB4MjFFNCwgMHgyMUU1LCAweDIxRTYsIDB4MjFFNywKKwkweDIxRTgsIDB4MjFFOSwgMHgyMUVBLCAweDIxRUIsIDB4MjFFQywgMHgyMUVELCAweDIxRUUsIDB4MjFFRiwKKwkweDIxRjAsIDB4MjFGMSwgMHgyMUYyLCAweDIxRjMsIDB4MjFGNCwgMHgyMUY1LCAweDIxRjYsIDB4MjFGNywKKwkweDIxRjgsIDB4MjFGOSwgMHgyMUZBLCAweDIxRkIsIDB4MjFGQywgMHgyMUZELCAweDIxRkUsIDB4MjFGRiwKK307CisKKy8qIFVwcGVyY2FzZSBtYXBwaW5ncyAyNDAwIC0gMjRGRiAqLworc3RhdGljIGNvbnN0IFdDSEFSIHVibGsyNFsyNTZdID0geworCTB4MjQwMCwgMHgyNDAxLCAweDI0MDIsIDB4MjQwMywgMHgyNDA0LCAweDI0MDUsIDB4MjQwNiwgMHgyNDA3LAorCTB4MjQwOCwgMHgyNDA5LCAweDI0MEEsIDB4MjQwQiwgMHgyNDBDLCAweDI0MEQsIDB4MjQwRSwgMHgyNDBGLAorCTB4MjQxMCwgMHgyNDExLCAweDI0MTIsIDB4MjQxMywgMHgyNDE0LCAweDI0MTUsIDB4MjQxNiwgMHgyNDE3LAorCTB4MjQxOCwgMHgyNDE5LCAweDI0MUEsIDB4MjQxQiwgMHgyNDFDLCAweDI0MUQsIDB4MjQxRSwgMHgyNDFGLAorCTB4MjQyMCwgMHgyNDIxLCAweDI0MjIsIDB4MjQyMywgMHgyNDI0LCAweDI0MjUsIDB4MjQyNiwgMHgyNDI3LAorCTB4MjQyOCwgMHgyNDI5LCAweDI0MkEsIDB4MjQyQiwgMHgyNDJDLCAweDI0MkQsIDB4MjQyRSwgMHgyNDJGLAorCTB4MjQzMCwgMHgyNDMxLCAweDI0MzIsIDB4MjQzMywgMHgyNDM0LCAweDI0MzUsIDB4MjQzNiwgMHgyNDM3LAorCTB4MjQzOCwgMHgyNDM5LCAweDI0M0EsIDB4MjQzQiwgMHgyNDNDLCAweDI0M0QsIDB4MjQzRSwgMHgyNDNGLAorCTB4MjQ0MCwgMHgyNDQxLCAweDI0NDIsIDB4MjQ0MywgMHgyNDQ0LCAweDI0NDUsIDB4MjQ0NiwgMHgyNDQ3LAorCTB4MjQ0OCwgMHgyNDQ5LCAweDI0NEEsIDB4MjQ0QiwgMHgyNDRDLCAweDI0NEQsIDB4MjQ0RSwgMHgyNDRGLAorCTB4MjQ1MCwgMHgyNDUxLCAweDI0NTIsIDB4MjQ1MywgMHgyNDU0LCAweDI0NTUsIDB4MjQ1NiwgMHgyNDU3LAorCTB4MjQ1OCwgMHgyNDU5LCAweDI0NUEsIDB4MjQ1QiwgMHgyNDVDLCAweDI0NUQsIDB4MjQ1RSwgMHgyNDVGLAorCTB4MjQ2MCwgMHgyNDYxLCAweDI0NjIsIDB4MjQ2MywgMHgyNDY0LCAweDI0NjUsIDB4MjQ2NiwgMHgyNDY3LAorCTB4MjQ2OCwgMHgyNDY5LCAweDI0NkEsIDB4MjQ2QiwgMHgyNDZDLCAweDI0NkQsIDB4MjQ2RSwgMHgyNDZGLAorCTB4MjQ3MCwgMHgyNDcxLCAweDI0NzIsIDB4MjQ3MywgMHgyNDc0LCAweDI0NzUsIDB4MjQ3NiwgMHgyNDc3LAorCTB4MjQ3OCwgMHgyNDc5LCAweDI0N0EsIDB4MjQ3QiwgMHgyNDdDLCAweDI0N0QsIDB4MjQ3RSwgMHgyNDdGLAorCTB4MjQ4MCwgMHgyNDgxLCAweDI0ODIsIDB4MjQ4MywgMHgyNDg0LCAweDI0ODUsIDB4MjQ4NiwgMHgyNDg3LAorCTB4MjQ4OCwgMHgyNDg5LCAweDI0OEEsIDB4MjQ4QiwgMHgyNDhDLCAweDI0OEQsIDB4MjQ4RSwgMHgyNDhGLAorCTB4MjQ5MCwgMHgyNDkxLCAweDI0OTIsIDB4MjQ5MywgMHgyNDk0LCAweDI0OTUsIDB4MjQ5NiwgMHgyNDk3LAorCTB4MjQ5OCwgMHgyNDk5LCAweDI0OUEsIDB4MjQ5QiwgMHgyNDlDLCAweDI0OUQsIDB4MjQ5RSwgMHgyNDlGLAorCTB4MjRBMCwgMHgyNEExLCAweDI0QTIsIDB4MjRBMywgMHgyNEE0LCAweDI0QTUsIDB4MjRBNiwgMHgyNEE3LAorCTB4MjRBOCwgMHgyNEE5LCAweDI0QUEsIDB4MjRBQiwgMHgyNEFDLCAweDI0QUQsIDB4MjRBRSwgMHgyNEFGLAorCTB4MjRCMCwgMHgyNEIxLCAweDI0QjIsIDB4MjRCMywgMHgyNEI0LCAweDI0QjUsIDB4MjRCNiwgMHgyNEI3LAorCTB4MjRCOCwgMHgyNEI5LCAweDI0QkEsIDB4MjRCQiwgMHgyNEJDLCAweDI0QkQsIDB4MjRCRSwgMHgyNEJGLAorCTB4MjRDMCwgMHgyNEMxLCAweDI0QzIsIDB4MjRDMywgMHgyNEM0LCAweDI0QzUsIDB4MjRDNiwgMHgyNEM3LAorCTB4MjRDOCwgMHgyNEM5LCAweDI0Q0EsIDB4MjRDQiwgMHgyNENDLCAweDI0Q0QsIDB4MjRDRSwgMHgyNENGLAorCTB4MjRCNiwgMHgyNEI3LCAweDI0QjgsIDB4MjRCOSwgMHgyNEJBLCAweDI0QkIsIDB4MjRCQywgMHgyNEJELAorCTB4MjRCRSwgMHgyNEJGLCAweDI0QzAsIDB4MjRDMSwgMHgyNEMyLCAweDI0QzMsIDB4MjRDNCwgMHgyNEM1LAorCTB4MjRDNiwgMHgyNEM3LCAweDI0QzgsIDB4MjRDOSwgMHgyNENBLCAweDI0Q0IsIDB4MjRDQywgMHgyNENELAorCTB4MjRDRSwgMHgyNENGLCAweDI0RUEsIDB4MjRFQiwgMHgyNEVDLCAweDI0RUQsIDB4MjRFRSwgMHgyNEVGLAorCTB4MjRGMCwgMHgyNEYxLCAweDI0RjIsIDB4MjRGMywgMHgyNEY0LCAweDI0RjUsIDB4MjRGNiwgMHgyNEY3LAorCTB4MjRGOCwgMHgyNEY5LCAweDI0RkEsIDB4MjRGQiwgMHgyNEZDLCAweDI0RkQsIDB4MjRGRSwgMHgyNEZGLAorfTsKKworLyogVXBwZXJjYXNlIG1hcHBpbmdzIEZGMDAgLSBGRkZGICovCitzdGF0aWMgY29uc3QgV0NIQVIgdWJsa0ZGWzI1Nl0gPSB7CisJMHhGRjAwLCAweEZGMDEsIDB4RkYwMiwgMHhGRjAzLCAweEZGMDQsIDB4RkYwNSwgMHhGRjA2LCAweEZGMDcsCisJMHhGRjA4LCAweEZGMDksIDB4RkYwQSwgMHhGRjBCLCAweEZGMEMsIDB4RkYwRCwgMHhGRjBFLCAweEZGMEYsCisJMHhGRjEwLCAweEZGMTEsIDB4RkYxMiwgMHhGRjEzLCAweEZGMTQsIDB4RkYxNSwgMHhGRjE2LCAweEZGMTcsCisJMHhGRjE4LCAweEZGMTksIDB4RkYxQSwgMHhGRjFCLCAweEZGMUMsIDB4RkYxRCwgMHhGRjFFLCAweEZGMUYsCisJMHhGRjIwLCAweEZGMjEsIDB4RkYyMiwgMHhGRjIzLCAweEZGMjQsIDB4RkYyNSwgMHhGRjI2LCAweEZGMjcsCisJMHhGRjI4LCAweEZGMjksIDB4RkYyQSwgMHhGRjJCLCAweEZGMkMsIDB4RkYyRCwgMHhGRjJFLCAweEZGMkYsCisJMHhGRjMwLCAweEZGMzEsIDB4RkYzMiwgMHhGRjMzLCAweEZGMzQsIDB4RkYzNSwgMHhGRjM2LCAweEZGMzcsCisJMHhGRjM4LCAweEZGMzksIDB4RkYzQSwgMHhGRjNCLCAweEZGM0MsIDB4RkYzRCwgMHhGRjNFLCAweEZGM0YsCisJMHhGRjQwLCAweEZGMjEsIDB4RkYyMiwgMHhGRjIzLCAweEZGMjQsIDB4RkYyNSwgMHhGRjI2LCAweEZGMjcsCisJMHhGRjI4LCAweEZGMjksIDB4RkYyQSwgMHhGRjJCLCAweEZGMkMsIDB4RkYyRCwgMHhGRjJFLCAweEZGMkYsCisJMHhGRjMwLCAweEZGMzEsIDB4RkYzMiwgMHhGRjMzLCAweEZGMzQsIDB4RkYzNSwgMHhGRjM2LCAweEZGMzcsCisJMHhGRjM4LCAweEZGMzksIDB4RkYzQSwgMHhGRjVCLCAweEZGNUMsIDB4RkY1RCwgMHhGRjVFLCAweEZGNUYsCisJMHhGRjYwLCAweEZGNjEsIDB4RkY2MiwgMHhGRjYzLCAweEZGNjQsIDB4RkY2NSwgMHhGRjY2LCAweEZGNjcsCisJMHhGRjY4LCAweEZGNjksIDB4RkY2QSwgMHhGRjZCLCAweEZGNkMsIDB4RkY2RCwgMHhGRjZFLCAweEZGNkYsCisJMHhGRjcwLCAweEZGNzEsIDB4RkY3MiwgMHhGRjczLCAweEZGNzQsIDB4RkY3NSwgMHhGRjc2LCAweEZGNzcsCisJMHhGRjc4LCAweEZGNzksIDB4RkY3QSwgMHhGRjdCLCAweEZGN0MsIDB4RkY3RCwgMHhGRjdFLCAweEZGN0YsCisJMHhGRjgwLCAweEZGODEsIDB4RkY4MiwgMHhGRjgzLCAweEZGODQsIDB4RkY4NSwgMHhGRjg2LCAweEZGODcsCisJMHhGRjg4LCAweEZGODksIDB4RkY4QSwgMHhGRjhCLCAweEZGOEMsIDB4RkY4RCwgMHhGRjhFLCAweEZGOEYsCisJMHhGRjkwLCAweEZGOTEsIDB4RkY5MiwgMHhGRjkzLCAweEZGOTQsIDB4RkY5NSwgMHhGRjk2LCAweEZGOTcsCisJMHhGRjk4LCAweEZGOTksIDB4RkY5QSwgMHhGRjlCLCAweEZGOUMsIDB4RkY5RCwgMHhGRjlFLCAweEZGOUYsCisJMHhGRkEwLCAweEZGQTEsIDB4RkZBMiwgMHhGRkEzLCAweEZGQTQsIDB4RkZBNSwgMHhGRkE2LCAweEZGQTcsCisJMHhGRkE4LCAweEZGQTksIDB4RkZBQSwgMHhGRkFCLCAweEZGQUMsIDB4RkZBRCwgMHhGRkFFLCAweEZGQUYsCisJMHhGRkIwLCAweEZGQjEsIDB4RkZCMiwgMHhGRkIzLCAweEZGQjQsIDB4RkZCNSwgMHhGRkI2LCAweEZGQjcsCisJMHhGRkI4LCAweEZGQjksIDB4RkZCQSwgMHhGRkJCLCAweEZGQkMsIDB4RkZCRCwgMHhGRkJFLCAweEZGQkYsCisJMHhGRkMwLCAweEZGQzEsIDB4RkZDMiwgMHhGRkMzLCAweEZGQzQsIDB4RkZDNSwgMHhGRkM2LCAweEZGQzcsCisJMHhGRkM4LCAweEZGQzksIDB4RkZDQSwgMHhGRkNCLCAweEZGQ0MsIDB4RkZDRCwgMHhGRkNFLCAweEZGQ0YsCisJMHhGRkQwLCAweEZGRDEsIDB4RkZEMiwgMHhGRkQzLCAweEZGRDQsIDB4RkZENSwgMHhGRkQ2LCAweEZGRDcsCisJMHhGRkQ4LCAweEZGRDksIDB4RkZEQSwgMHhGRkRCLCAweEZGREMsIDB4RkZERCwgMHhGRkRFLCAweEZGREYsCisJMHhGRkUwLCAweEZGRTEsIDB4RkZFMiwgMHhGRkUzLCAweEZGRTQsIDB4RkZFNSwgMHhGRkU2LCAweEZGRTcsCisJMHhGRkU4LCAweEZGRTksIDB4RkZFQSwgMHhGRkVCLCAweEZGRUMsIDB4RkZFRCwgMHhGRkVFLCAweEZGRUYsCisJMHhGRkYwLCAweEZGRjEsIDB4RkZGMiwgMHhGRkYzLCAweEZGRjQsIDB4RkZGNSwgMHhGRkY2LCAweEZGRjcsCisJMHhGRkY4LCAweEZGRjksIDB4RkZGQSwgMHhGRkZCLCAweEZGRkMsIDB4RkZGRCwgMHhGRkZFLCAweEZGRkYsCit9OworCitzdGF0aWMgY29uc3QgV0NIQVIgKiBjb25zdCB1cHJ0YWJsZVsyNTZdID0geworCXVibGswMCwgdWJsazAxLCB1YmxrMDIsIHVibGswMywgdWJsazA0LCB1YmxrMDUsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIHVibGsxRSwgdWJsazFGLAorCTAwMDAwMCwgdWJsazIxLCAwMDAwMDAsIDAwMDAwMCwgdWJsazI0LCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLAorCTAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgMDAwMDAwLCAwMDAwMDAsIDAwMDAwMCwgdWJsa0ZGLAorfTsKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tY3RybC5oIGIvaW5jbHVkZS9jb21tY3RybC5oCmluZGV4IGEyNjcwZTguLmM1N2M5OTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29tbWN0cmwuaAorKysgYi9pbmNsdWRlL2NvbW1jdHJsLmgKQEAgLTE5MiwxNCArMTkyLDEyIEBACiAgCiAvKiBGdW5jdGlvbnMgcHJvdG90eXBlcyAqLwogCi1IV05EMTYgICAgIFdJTkFQSSBDcmVhdGVTdGF0dXNXaW5kb3cxNihJTlQxNixMUENTVFIsSFdORDE2LFVJTlQxNik7CiBIV05EMzIgICAgIFdJTkFQSSBDcmVhdGVTdGF0dXNXaW5kb3czMkEoSU5UMzIsTFBDU1RSLEhXTkQzMixVSU5UMzIpOwogSFdORDMyICAgICBXSU5BUEkgQ3JlYXRlU3RhdHVzV2luZG93MzJXKElOVDMyLExQQ1dTVFIsSFdORDMyLFVJTlQzMik7CiAjZGVmaW5lICAgIENyZWF0ZVN0YXR1c1dpbmRvdyBXSU5FTElCX05BTUVfQVcoQ3JlYXRlU3RhdHVzV2luZG93KQogSFdORDMyICAgICBXSU5BUEkgQ3JlYXRlVXBEb3duQ29udHJvbChEV09SRCxJTlQzMixJTlQzMixJTlQzMixJTlQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdORDMyLElOVDMyLEhJTlNUQU5DRTMyLEhXTkQzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIsSU5UMzIsSU5UMzIpOwotVk9JRCAgICAgICBXSU5BUEkgRHJhd1N0YXR1c1RleHQxNihIREMxNixMUFJFQ1QxNixMUENTVFIsVUlOVDE2KTsKIFZPSUQgICAgICAgV0lOQVBJIERyYXdTdGF0dXNUZXh0MzJBKEhEQzMyLExQUkVDVDMyLExQQ1NUUixVSU5UMzIpOwogVk9JRCAgICAgICBXSU5BUEkgRHJhd1N0YXR1c1RleHQzMlcoSERDMzIsTFBSRUNUMzIsTFBDV1NUUixVSU5UMzIpOwogI2RlZmluZSAgICBEcmF3U3RhdHVzVGV4dCBXSU5FTElCX05BTUVfQVcoRHJhd1N0YXR1c1RleHQpCkBAIC0yNzYsNiArMjc0LDcgQEAKIAogIAogSU5UMzIgICAgICBXSU5BUEkgSW1hZ2VMaXN0X0FkZChISU1BR0VMSVNULEhCSVRNQVAzMixIQklUTUFQMzIpOworSU5UMzIgICAgICBXSU5BUEkgSW1hZ2VMaXN0X0FkZEljb24gKEhJTUFHRUxJU1QsIEhJQ09OMzIpOwogSU5UMzIgICAgICBXSU5BUEkgSW1hZ2VMaXN0X0FkZE1hc2tlZChISU1BR0VMSVNULEhCSVRNQVAzMixDT0xPUlJFRik7CiBCT09MMzIgICAgIFdJTkFQSSBJbWFnZUxpc3RfQmVnaW5EcmFnKEhJTUFHRUxJU1QsSU5UMzIsSU5UMzIsSU5UMzIpOwogQk9PTDMyICAgICBXSU5BUEkgSW1hZ2VMaXN0X0NvcHkoSElNQUdFTElTVCxJTlQzMixISU1BR0VMSVNULElOVDMyLElOVDMyKTsKQEAgLTI4NCw3ICsyODMsNyBAQAogQk9PTDMyICAgICBXSU5BUEkgSW1hZ2VMaXN0X0RyYWdFbnRlcihIV05EMzIsSU5UMzIsSU5UMzIpOwogQk9PTDMyICAgICBXSU5BUEkgSW1hZ2VMaXN0X0RyYWdMZWF2ZShIV05EMzIpOyAKIEJPT0wzMiAgICAgV0lOQVBJIEltYWdlTGlzdF9EcmFnTW92ZShJTlQzMixJTlQzMik7Ci1CT09MMzIgICAgIFdJTkFQSSBJbWFnZUxpc3RfRHJhZ1Nob3dOb2xvY2sgKEJPT0wzMiBiU2hvdyk7CitCT09MMzIgICAgIFdJTkFQSSBJbWFnZUxpc3RfRHJhZ1Nob3dOb2xvY2sgKEJPT0wzMik7CiBCT09MMzIgICAgIFdJTkFQSSBJbWFnZUxpc3RfRHJhdyhISU1BR0VMSVNULElOVDMyLEhEQzMyLElOVDMyLElOVDMyLFVJTlQzMik7CiBCT09MMzIgICAgIFdJTkFQSSBJbWFnZUxpc3RfRHJhd0V4KEhJTUFHRUxJU1QsSU5UMzIsSERDMzIsSU5UMzIsSU5UMzIsSU5UMzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyLENPTE9SUkVGLENPTE9SUkVGLFVJTlQzMik7CkBAIC0zMDQsMTggKzMwMywyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUlJFRixVSU5UMzIsVUlOVDMyKTsKICNkZWZpbmUgICAgSW1hZ2VMaXN0X0xvYWRJbWFnZSBXSU5FTElCX05BTUVfQVcoSW1hZ2VMaXN0X0xvYWRJbWFnZSkKIEhJTUFHRUxJU1QgV0lOQVBJIEltYWdlTGlzdF9NZXJnZShISU1BR0VMSVNULElOVDMyLEhJTUFHRUxJU1QsSU5UMzIsSU5UMzIsSU5UMzIpOwotCisjaWZkZWYgX19JU3RyZWFtX0lOVFJFRkFDRV9ERUZJTkVEX18KK0hJTUFHRUxJU1QgV0lOQVBJIEltYWdlTGlzdF9SZWFkIChMUFNUUkVBTTMyKTsKKyNlbmRpZgogQk9PTDMyICAgICBXSU5BUEkgSW1hZ2VMaXN0X1JlbW92ZShISU1BR0VMSVNULElOVDMyKTsKIEJPT0wzMiAgICAgV0lOQVBJIEltYWdlTGlzdF9SZXBsYWNlKEhJTUFHRUxJU1QsSU5UMzIsSEJJVE1BUDMyLEhCSVRNQVAzMik7CiBJTlQzMiAgICAgIFdJTkFQSSBJbWFnZUxpc3RfUmVwbGFjZUljb24oSElNQUdFTElTVCxJTlQzMixISUNPTjMyKTsKLQogQ09MT1JSRUYgICBXSU5BUEkgSW1hZ2VMaXN0X1NldEJrQ29sb3IoSElNQUdFTElTVCxDT0xPUlJFRik7CiBCT09MMzIgICAgIFdJTkFQSSBJbWFnZUxpc3RfU2V0RHJhZ0N1cnNvckltYWdlKEhJTUFHRUxJU1QsSU5UMzIsSU5UMzIsSU5UMzIpOworCiBCT09MMzIgICAgIFdJTkFQSSBJbWFnZUxpc3RfU2V0SWNvblNpemUgKEhJTUFHRUxJU1QsSU5UMzIsSU5UMzIpOwogQk9PTDMyICAgICBXSU5BUEkgSW1hZ2VMaXN0X1NldEltYWdlQ291bnQgKEhJTUFHRUxJU1QsSU5UMzIpOwogQk9PTDMyICAgICBXSU5BUEkgSW1hZ2VMaXN0X1NldE92ZXJsYXlJbWFnZShISU1BR0VMSVNULElOVDMyLElOVDMyKTsKKyNpZmRlZiBfX0lTdHJlYW1fSU5UUkVGQUNFX0RFRklORURfXworQk9PTDMyICAgICBXSU5BUEkgSW1hZ2VMaXN0X1dyaXRlIChISU1BR0VMSVNULCBMUFNUUkVBTTMyKTsKKyNlbmRpZgogCisjaWZuZGVmIF9fV0lORV9fCiAjZGVmaW5lIEltYWdlTGlzdF9BZGRJY29uKGhpbWwsaGljb24pIEltYWdlTGlzdF9SZXBsYWNlSWNvbihoaW1sLC0xLGhpY29uKQorI2VuZGlmCiAjZGVmaW5lIEltYWdlTGlzdF9FeHRyYWN0SWNvbihoaSxoaW1sLGkpIEltYWdlTGlzdF9HZXRJY29uKGhpbWwsaSwwKQogI2RlZmluZSBJbWFnZUxpc3RfTG9hZEJpdG1hcChoaSxscGJtcCxjeCxjR3Jvdyxjck1hc2spIFwKICAgSW1hZ2VMaXN0X0xvYWRJbWFnZShoaSxscGJtcCxjeCxjR3Jvdyxjck1hc2ssSU1BR0VfQklUTUFQLDApCkBAIC00MTUsMTEgKzQyMSw2IEBACiAjZGVmaW5lIEhETl9CRUdJTkRSQUNLICAgICAgICAgIChIRE5fRklSU1QtMTApCiAjZGVmaW5lIEhETl9FTkREUkFDSyAgICAgICAgICAgIChIRE5fRklSU1QtMTEpCiAKLQotI2RlZmluZSBIZWFkZXJfTGF5b3V0KGh3bmRIRCxwbGF5b3V0KSBcCi0gIChCT09MMzIpU2VuZE1lc3NhZ2UzMkEoKGh3bmRIRCksSERNX0xBWU9VVCwwLChMUEFSQU0pKExQSERMQVlPVVQpKHBsYXlvdXQpKQotCi0KIHR5cGVkZWYgc3RydWN0IF9IRF9MQVlPVVQKIHsKICAgICBSRUNUMzIgICAgICAqcHJjOwpAQCAtNDI4LDcgKzQyOSw2IEBACiAKICNkZWZpbmUgSERfTEFZT1VUICAgSERMQVlPVVQKIAotCiB0eXBlZGVmIHN0cnVjdCBfSERfSVRFTUEKIHsKICAgICBVSU5UMzIgICAgbWFzazsKQEAgLTQ0Miw3ICs0NDIsNiBAQAogICAgIElOVDMyICAgICBpT3JkZXI7CiB9IEhEX0lURU1BOwogCi0KIHR5cGVkZWYgc3RydWN0IF9IRF9ISVRURVNUSU5GTwogewogICAgIFBPSU5UMzIgcHQ7CkBAIC00NTIsNyArNDUxLDYgQEAKIAogI2RlZmluZSBIRF9ISVRURVNUSU5GTyAgIEhESElUVEVTVElORk8KIAotCiB0eXBlZGVmIHN0cnVjdCB0YWdOTUhFQURFUkEKIHsKICAgICBOTUhEUiAgICBoZHI7CkBAIC00NjIsNCArNDYwLDE5MSBAQAogfSBOTUhFQURFUkEsICpMUE5NSEVBREVSQTsKIAogCisjZGVmaW5lIEhlYWRlcl9HZXRJdGVtQ291bnQoaHduZEhEKSBcCisgIChJTlQzMilTZW5kTWVzc2FnZTMyQSgoaHduZEhEKSxIRE1fR0VUSVRFTUNPVU5ULDAsMEwpCisjZGVmaW5lIEhlYWRlcl9JbnNlcnRJdGVtKGh3bmRIRCxpLHBoZGkpIFwKKyAgKElOVDMyKVNlbmRNZXNzYWdlMzJBKChod25kSEQpLEhETV9JTlNFUlRJVEVNLChXUEFSQU0zMikoSU5UMzIpKGkpLFwKKwkJCShMUEFSQU0pKGNvbnN0IEhEX0lURU1BKikocGhkaSkpCisjZGVmaW5lIEhlYWRlcl9EZWxldGVJdGVtKGh3bmRIRCxpKSBcCisgIChCT09MMzIpU2VuZE1lc3NhZ2UzMkEoKGh3bmRIRCksSERNX0RFTEVURUlURU0sKFdQQVJBTTMyKShJTlQzMikoaSksMEwpCisjZGVmaW5lIEhlYWRlcl9HZXRJdGVtKGh3bmRIRCxpLHBoZGkpIFwKKyAgKEJPT0wzMilTZW5kTWVzc2FnZTMyQSgoaHduZEhEKSxIRE1fR0VUSVRFTSwoV1BBUkFNMzIpKElOVDMyKShpKSwoTFBBUkFNKShIRF9JVEVNQSopKHBoZGkpKQorI2RlZmluZSBIZWFkZXJfU2V0SXRlbShod25kSEQsaSxwaGRpKSBcCisgIChCT09MMzIpU2VuZE1lc3NhZ2UzMkEoKGh3bmRIRCksSERNX1NFVElURU0sKFdQQVJBTTMyKShJTlQzMikoaSksKExQQVJBTSkoY29uc3QgSERfSVRFTUEqKShwaGRpKSkKKyNkZWZpbmUgSGVhZGVyX0xheW91dChod25kSEQscGxheW91dCkgXAorICAoQk9PTDMyKVNlbmRNZXNzYWdlMzJBKChod25kSEQpLEhETV9MQVlPVVQsMCwoTFBBUkFNKShMUEhETEFZT1VUKShwbGF5b3V0KSkKKyNkZWZpbmUgSGVhZGVyX0dldEl0ZW1SZWN0KGh3bmQsaUl0ZW0sbHByYykgXAorICAoQk9PTDMyKVNlbmRNZXNzYWdlMzJBKChod25kKSxIRE1fR0VUSVRFTVJFQ1QsKFdQQVJBTTMyKWlJdGVtLChMUEFSQU0pbHByYykKKyNkZWZpbmUgSGVhZGVyX1NldEltYWdlTGlzdChod25kLGhpbWwpIFwKKyAgKEhJTUFHRUxJU1QpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLEhETV9TRVRJTUFHRUxJU1QsMCwoTFBBUkFNKWhpbWwpCisjZGVmaW5lIEhlYWRlcl9HZXRJbWFnZUxpc3QoaHduZCkgXAorICAoSElNQUdFTElTVClTZW5kTWVzc2FnZTMyQSgoaHduZCksSERNX0dFVElNQUdFTElTVCwwLDApCisjZGVmaW5lIEhlYWRlcl9PcmRlclRvSW5kZXgoaHduZCxpKSBcCisgIChJTlQzMilTZW5kTWVzc2FnZTMyQSgoaHduZCksSERNX09SREVSVE9JTkRFWCwoV1BBUkFNMzIpaSwwKQorI2RlZmluZSBIZWFkZXJfQ3JlYXRlRHJhZ0ltYWdlKGh3bmQsaSkgXAorICAoSElNQUdFTElTVClTZW5kTWVzc2FnZTMyQSgoaHduZCksSERNX0NSRUFURURSQUdJTUFHRSwoV1BBUkFNMzIpaSwwKQorI2RlZmluZSBIZWFkZXJfR2V0T3JkZXJBcnJheShod25kLGlDb3VudCxscGkpIFwKKyAgKEJPT0wzMilTZW5kTWVzc2FnZTMyQSgoaHduZCksSERNX0dFVE9SREVSQVJSQVksKFdQQVJBTTMyKWlDb3VudCwoTFBBUkFNKWxwaSkKKyNkZWZpbmUgSGVhZGVyX1NldE9yZGVyQXJyYXkoaHduZCxpQ291bnQsbHBpKSBcCisgIChCT09MMzIpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLEhETV9TRVRPUkRFUkFSUkFZLChXUEFSQU0zMilpQ291bnQsKExQQVJBTSlscGkpCisjZGVmaW5lIEhlYWRlcl9TZXRIb3REaXZpZGVyKGh3bmQsZlBvcyxkdykgXAorICAoSU5UMzIpU2VuZE1lc3NhZ2UzMkEoKGh3bmQpLEhETV9TRVRIT1RESVZJREVSLChXUEFSQU0zMilmUG9zLChMUEFSQU0pZHcpCisjZGVmaW5lIEhlYWRlcl9TZXRVbmljb2RlRm9ybWF0KGh3bmQsZlVuaWNvZGUpIFwKKyAgKEJPT0wzMilTZW5kTWVzc2FnZTMyQSgoaHduZCksSERNX1NFVFVOSUNPREVGT1JNQVQsKFdQQVJBTTMyKShmVW5pY29kZSksMCkKKyNkZWZpbmUgSGVhZGVyX0dldFVuaWNvZGVGb3JtYXQoaHduZCkgXAorICAoQk9PTDMyKVNlbmRNZXNzYWdlMzJBKChod25kKSxIRE1fR0VUVU5JQ09ERUZPUk1BVCwwLDApCisKKworLyogVG9vbGJhciAqLworCisjZGVmaW5lIFRPT0xCQVJDTEFTU05BTUUxNiAgICAgICAgIlRvb2xiYXJXaW5kb3ciIAorI2RlZmluZSBUT09MQkFSQ0xBU1NOQU1FMzJXICAgICAgIEwiVG9vbGJhcldpbmRvdzMyIiAKKyNkZWZpbmUgVE9PTEJBUkNMQVNTTkFNRTMyQSAgICAgICAiVG9vbGJhcldpbmRvdzMyIiAKKyNkZWZpbmUgVE9PTEJBUkNMQVNTTkFNRSBXSU5FTElCX05BTUVfQVcoVE9PTEJBUkNMQVNTTkFNRSkKKworIAorI2RlZmluZSBDTUJfTUFTS0VEICAgICAgICAgICAgICAweDAyIAorIAorI2RlZmluZSBUQlNUQVRFX0NIRUNLRUQgICAgICAgICAweDAxIAorI2RlZmluZSBUQlNUQVRFX1BSRVNTRUQgICAgICAgICAweDAyIAorI2RlZmluZSBUQlNUQVRFX0VOQUJMRUQgICAgICAgICAweDA0IAorI2RlZmluZSBUQlNUQVRFX0hJRERFTiAgICAgICAgICAweDA4IAorI2RlZmluZSBUQlNUQVRFX0lOREVURVJNSU5BVEUgICAweDEwIAorI2RlZmluZSBUQlNUQVRFX1dSQVAgICAgICAgICAgICAweDIwIAorI2RlZmluZSBUQlNUQVRFX0VMTElQU0VTICAgICAgICAweDQwCisjZGVmaW5lIFRCU1RBVEVfTUFSS0VEICAgICAgICAgIDB4ODAgCisgCisgCisjZGVmaW5lIFRCU1RZTEVfQlVUVE9OICAgICAgICAgIDB4MDAgCisjZGVmaW5lIFRCU1RZTEVfU0VQICAgICAgICAgICAgIDB4MDEgCisjZGVmaW5lIFRCU1RZTEVfQ0hFQ0sgICAgICAgICAgIDB4MDIgCisjZGVmaW5lIFRCU1RZTEVfR1JPVVAgICAgICAgICAgIDB4MDQgCisjZGVmaW5lIFRCU1RZTEVfQ0hFQ0tHUk9VUCAgICAgIChUQlNUWUxFX0dST1VQIHwgVEJTVFlMRV9DSEVDSykgCisjZGVmaW5lIFRCU1RZTEVfRFJPUERPV04gICAgICAgIDB4MDggCisgCisjZGVmaW5lIFRCU1RZTEVfVE9PTFRJUFMgICAgICAgIDB4MDEwMCAKKyNkZWZpbmUgVEJTVFlMRV9XUkFQQUJMRSAgICAgICAgMHgwMjAwIAorI2RlZmluZSBUQlNUWUxFX0FMVERSQUcgICAgICAgICAweDA0MDAgCisjZGVmaW5lIFRCU1RZTEVfRkxBVCAgICAgICAgICAgIDB4MDgwMCAKKyNkZWZpbmUgVEJTVFlMRV9MSVNUICAgICAgICAgICAgMHgxMDAwIAorI2RlZmluZSBUQlNUWUxFX0NVU1RPTUVSQVNFICAgICAweDIwMDAgCisgCisjZGVmaW5lIFRCX0VOQUJMRUJVVFRPTiAgICAgICAgICAoV01fVVNFUisxKQorI2RlZmluZSBUQl9DSEVDS0JVVFRPTiAgICAgICAgICAgKFdNX1VTRVIrMikKKyNkZWZpbmUgVEJfUFJFU1NCVVRUT04gICAgICAgICAgIChXTV9VU0VSKzMpCisjZGVmaW5lIFRCX0hJREVCVVRUT04gICAgICAgICAgICAoV01fVVNFUis0KQorI2RlZmluZSBUQl9JTkRFVEVSTUlOQVRFICAgICAgICAgKFdNX1VTRVIrNSkKKyNkZWZpbmUgVEJfSVNCVVRUT05FTkFCTEVEICAgICAgIChXTV9VU0VSKzkpIAorI2RlZmluZSBUQl9JU0JVVFRPTkNIRUNLRUQgICAgICAgKFdNX1VTRVIrMTApIAorI2RlZmluZSBUQl9JU0JVVFRPTlBSRVNTRUQgICAgICAgKFdNX1VTRVIrMTEpIAorI2RlZmluZSBUQl9JU0JVVFRPTkhJRERFTiAgICAgICAgKFdNX1VTRVIrMTIpIAorI2RlZmluZSBUQl9JU0JVVFRPTklOREVURVJNSU5BVEUgKFdNX1VTRVIrMTMpCisjZGVmaW5lIFRCX0lTQlVUVE9OSElHSExJR0hURUQgICAoV01fVVNFUisxNCkKKyNkZWZpbmUgVEJfU0VUU1RBVEUgICAgICAgICAgICAgIChXTV9VU0VSKzE3KQorI2RlZmluZSBUQl9HRVRTVEFURSAgICAgICAgICAgICAgKFdNX1VTRVIrMTgpCisjZGVmaW5lIFRCX0FEREJJVE1BUCAgICAgICAgICAgICAoV01fVVNFUisxOSkKKyNkZWZpbmUgVEJfQUREQlVUVE9OUzMyQSAgICAgICAgIChXTV9VU0VSKzIwKQorI2RlZmluZSBUQl9BRERCVVRUT05TMzJXICAgICAgICAgKFdNX1VTRVIrNjgpCisjZGVmaW5lIFRCX0FEREJVVFRPTlMgV0lORUxJQl9OQU1FX0FXKFRCX0FEREJVVFRPTlMpCisjZGVmaW5lIFRCX0hJVFRFU1QgICAgICAgICAgICAgICAoV01fVVNFUis2OSkKKyNkZWZpbmUgVEJfSU5TRVJUQlVUVE9OMzJBICAgICAgIChXTV9VU0VSKzIxKQorI2RlZmluZSBUQl9JTlNFUlRCVVRUT04zMlcgICAgICAgKFdNX1VTRVIrNjcpCisjZGVmaW5lIFRCX0lOU0VSVEJVVFRPTiBXSU5FTElCX05BTUVfQVcoVEJfSU5TRVJUQlVUVE9OKQorI2RlZmluZSBUQl9ERUxFVEVCVVRUT04gICAgICAgICAgKFdNX1VTRVIrMjIpCisjZGVmaW5lIFRCX0dFVEJVVFRPTiAgICAgICAgICAgICAoV01fVVNFUisyMykKKyNkZWZpbmUgVEJfQlVUVE9OQ09VTlQgICAgICAgICAgIChXTV9VU0VSKzI0KQorI2RlZmluZSBUQl9DT01NQU5EVE9JTkRFWCAgICAgICAgKFdNX1VTRVIrMjUpCisjZGVmaW5lIFRCX1NBVkVSRVNUT1JFMzJBICAgICAgICAoV01fVVNFUisyNikKKyNkZWZpbmUgVEJfU0FWRVJFU1RPUkUzMlcgICAgICAgIChXTV9VU0VSKzc2KQorI2RlZmluZSBUQl9TQVZFUkVTVE9SRSBXSU5FTElCX05BTUVfQVcoVEJfU0FWRVJFU1RPUkUpCisjZGVmaW5lIFRCX0NVU1RPTUlaRSAgICAgICAgICAgICAoV01fVVNFUisyNykKKyNkZWZpbmUgVEJfQUREU1RSSU5HMzJBICAgICAgICAgIChXTV9VU0VSKzI4KSAKKyNkZWZpbmUgVEJfQUREU1RSSU5HMzJXICAgICAgICAgIChXTV9VU0VSKzc3KSAKKyNkZWZpbmUgVEJfQUREU1RSSU5HIFdJTkVMSUJfTkFNRV9BVyhUQl9BRERTVFJJTkcpCisjZGVmaW5lIFRCX0dFVElURU1SRUNUICAgICAgICAgICAoV01fVVNFUisyOSkKKyNkZWZpbmUgVEJfQlVUVE9OU1RSVUNUU0laRSAgICAgIChXTV9VU0VSKzMwKQorI2RlZmluZSBUQl9TRVRCVVRUT05TSVpFICAgICAgICAgKFdNX1VTRVIrMzEpCisjZGVmaW5lIFRCX1NFVEJJVE1BUFNJWkUgICAgICAgICAoV01fVVNFUiszMikKKyNkZWZpbmUgVEJfQVVUT1NJWkUgICAgICAgICAgICAgIChXTV9VU0VSKzMzKQorI2RlZmluZSBUQl9HRVRUT09MVElQUyAgICAgICAgICAgKFdNX1VTRVIrMzUpCisjZGVmaW5lIFRCX1NFVFRPT0xUSVBTICAgICAgICAgICAoV01fVVNFUiszNikKKyNkZWZpbmUgVEJfU0VUUEFSRU5UICAgICAgICAgICAgIChXTV9VU0VSKzM3KQorI2RlZmluZSBUQl9TRVRST1dTICAgICAgICAgICAgICAgKFdNX1VTRVIrMzkpCisjZGVmaW5lIFRCX0dFVFJPV1MgICAgICAgICAgICAgICAoV01fVVNFUis0MCkKKyNkZWZpbmUgVEJfU0VUQ01ESUQgICAgICAgICAgICAgIChXTV9VU0VSKzQyKQorI2RlZmluZSBUQl9DSEFOR0VCSVRNQVAgICAgICAgICAgKFdNX1VTRVIrNDMpCisjZGVmaW5lIFRCX0dFVEJJVE1BUCAgICAgICAgICAgICAoV01fVVNFUis0NCkKKyNkZWZpbmUgVEJfR0VUQlVUVE9OVEVYVDMyQSAgICAgIChXTV9VU0VSKzQ1KQorI2RlZmluZSBUQl9HRVRCVVRUT05URVhUMzJXICAgICAgKFdNX1VTRVIrNzUpCisjZGVmaW5lIFRCX0dFVEJVVFRPTlRFWFQgV0lORUxJQl9OQU1FX0FXKFRCX0dFVEJVVFRPTlRFWFQpCisjZGVmaW5lIFRCX1JFUExBQ0VCSVRNQVAgICAgICAgICAoV01fVVNFUis0NikKKyNkZWZpbmUgVEJfU0VUSU5ERU5UICAgICAgICAgICAgIChXTV9VU0VSKzQ3KQorI2RlZmluZSBUQl9TRVRJTUFHRUxJU1QgICAgICAgICAgKFdNX1VTRVIrNDgpCisjZGVmaW5lIFRCX0dFVElNQUdFTElTVCAgICAgICAgICAoV01fVVNFUis0OSkKKyNkZWZpbmUgVEJfTE9BRElNQUdFUyAgICAgICAgICAgIChXTV9VU0VSKzUwKQorI2RlZmluZSBUQl9HRVRSRUNUICAgICAgICAgICAgICAgKFdNX1VTRVIrNTEpIC8qIHdQYXJhbSBpcyB0aGUgQ21kIGluc3RlYWQgb2YgaW5kZXggKi8KKyNkZWZpbmUgVEJfU0VUSE9USU1BR0VMSVNUICAgICAgIChXTV9VU0VSKzUyKQorI2RlZmluZSBUQl9HRVRIT1RJTUFHRUxJU1QgICAgICAgKFdNX1VTRVIrNTMpCisjZGVmaW5lIFRCX1NFVERJU0FCTEVESU1BR0VMSVNUICAoV01fVVNFUis1NCkKKyNkZWZpbmUgVEJfR0VURElTQUJMRURJTUFHRUxJU1QgIChXTV9VU0VSKzU1KQorI2RlZmluZSBUQl9TRVRTVFlMRSAgICAgICAgICAgICAgKFdNX1VTRVIrNTYpCisjZGVmaW5lIFRCX0dFVFNUWUxFICAgICAgICAgICAgICAoV01fVVNFUis1NykKKyNkZWZpbmUgVEJfR0VUQlVUVE9OU0laRSAgICAgICAgIChXTV9VU0VSKzU4KQorI2RlZmluZSBUQl9TRVRCVVRUT05XSURUSCAgICAgICAgKFdNX1VTRVIrNTkpCisjZGVmaW5lIFRCX1NFVE1BWFRFWFRST1dTICAgICAgICAoV01fVVNFUis2MCkKKyNkZWZpbmUgVEJfR0VUVEVYVFJPV1MgICAgICAgICAgIChXTV9VU0VSKzYxKQorCisKKy8qIFRoaXMgaXMganVzdCBmb3Igb2xkIENyZWF0ZVRvb2xiYXIuICovCisvKiBEb24ndCB1c2UgaXQgaW4gbmV3IHByb2dyYW1zLiAqLwordHlwZWRlZiBzdHJ1Y3QgX09MRFRCQlVUVE9OIHsKKyAgICBJTlQzMiBpQml0bWFwOworICAgIElOVDMyIGlkQ29tbWFuZDsKKyAgICBCWVRFICBmc1N0YXRlOworICAgIEJZVEUgIGZzU3R5bGU7CisgICAgQllURSAgYlJlc2VydmVkWzJdOworICAgIERXT1JEIGR3RGF0YTsKK30gT0xEVEJCVVRUT04sICpQT0xEVEJCVVRUT04sICpMUE9MRFRCQlVUVE9OOwordHlwZWRlZiBjb25zdCBPTERUQkJVVFRPTiAqTFBDT0xEVEJCVVRUT047CisKKwordHlwZWRlZiBzdHJ1Y3QgX1RCQlVUVE9OIHsKKyAgICBJTlQzMiBpQml0bWFwOworICAgIElOVDMyIGlkQ29tbWFuZDsKKyAgICBCWVRFICBmc1N0YXRlOworICAgIEJZVEUgIGZzU3R5bGU7CisgICAgQllURSAgYlJlc2VydmVkWzJdOworICAgIERXT1JEIGR3RGF0YTsKKyAgICBJTlQzMiBpU3RyaW5nOworfSBUQkJVVFRPTiwgKlBUQkJVVFRPTiwgKkxQVEJCVVRUT047Cit0eXBlZGVmIGNvbnN0IFRCQlVUVE9OICpMUENUQkJVVFRPTjsKKworCit0eXBlZGVmIHN0cnVjdCBfQ09MT1JNQVAgeworICAgIENPTE9SUkVGIGZyb207CisgICAgQ09MT1JSRUYgdG87Cit9IENPTE9STUFQLCAqTFBDT0xPUk1BUDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnVEJBRERCSVRNQVAgeworICAgIEhJTlNUQU5DRTMyIGhJbnN0OworICAgIFVJTlQzMiAgICAgIG5JRDsKK30gVEJBRERCSVRNQVAsICpMUFRCQUREQklUTUFQOworCisjZGVmaW5lIEhJTlNUX0NPTU1DVFJMICAgICAgICAgKChISU5TVEFOQ0UzMiktMSkKKworCitIV05EMzIgV0lOQVBJCitDcmVhdGVUb29sYmFyKEhXTkQzMiwgRFdPUkQsIFVJTlQzMiwgSU5UMzIsIEhJTlNUQU5DRTMyLAorICAgICAgICAgICAgICBVSU5UMzIsIExQQ09MRFRCQlVUVE9OLCBJTlQzMik7IAorIAorSFdORDMyIFdJTkFQSQorQ3JlYXRlVG9vbGJhckV4KEhXTkQzMiwgRFdPUkQsIFVJTlQzMiwgSU5UMzIsCisgICAgICAgICAgICAgICAgSElOU1RBTkNFMzIsIFVJTlQzMiwgTFBDVEJCVVRUT04sIAorICAgICAgICAgICAgICAgIElOVDMyLCBJTlQzMiwgSU5UMzIsIElOVDMyLCBJTlQzMiwgVUlOVDMyKTsgCisKK0hCSVRNQVAzMiBXSU5BUEkKK0NyZWF0ZU1hcHBlZEJpdG1hcCAoSElOU1RBTkNFMzIsIElOVDMyLCBVSU5UMzIsIExQQ09MT1JNQVAsIElOVDMyKTsgCisKKworCiAjZW5kaWYgIC8qIF9fV0lORV9DT01NQ1RSTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbW1kbGcuaCBiL2luY2x1ZGUvY29tbWRsZy5oCmluZGV4IGIwY2JmZGQuLmE1NDQ5OWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29tbWRsZy5oCisrKyBiL2luY2x1ZGUvY29tbWRsZy5oCkBAIC0xMTMsOCArMTEzLDggQEAKIAlMUENXU1RSCQlscFRlbXBsYXRlTmFtZTsKIH0gT1BFTkZJTEVOQU1FMzJXLCpMUE9QRU5GSUxFTkFNRTMyVzsKIAotREVDTF9XSU5FTElCX1RZUEVfQVcoT1BFTkZJTEVOQU1FKTsKLURFQ0xfV0lORUxJQl9UWVBFX0FXKExQT1BFTkZJTEVOQU1FKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKE9QRU5GSUxFTkFNRSkKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQT1BFTkZJTEVOQU1FKQogCiB0eXBlZGVmIFVJTlQzMiAoQ0FMTEJBQ0sgKkxQQ0NIT09LUFJPQykgKEhXTkQzMiwgVUlOVDMyLCBXUEFSQU0zMiwgTFBBUkFNKTsKIApAQCAtMTU3LDggKzE1Nyw4IEBACiB9IENIT09TRUNPTE9SMzJXOwogdHlwZWRlZiBDSE9PU0VDT0xPUjMyVyAqTFBDSE9PU0VDT0xPUjMyVzsKIAotREVDTF9XSU5FTElCX1RZUEVfQVcoQ0hPT1NFQ09MT1IpOwotREVDTF9XSU5FTElCX1RZUEVfQVcoTFBDSE9PU0VDT0xPUik7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhDSE9PU0VDT0xPUikKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQQ0hPT1NFQ09MT1IpCiAKIAogI2RlZmluZSBDQ19SR0JJTklUICAgICAgICAgICAgICAgMHgwMDAwMDAwMQpAQCAtMjE0LDggKzIxNCw4IEBACiAJTFBDV1NUUgkJbHBUZW1wbGF0ZU5hbWU7CiAJfSBGSU5EUkVQTEFDRTMyVywgKkxQRklORFJFUExBQ0UzMlc7CiAJCi1ERUNMX1dJTkVMSUJfVFlQRV9BVyhGSU5EUkVQTEFDRSk7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhMUEZJTkRSRVBMQUNFKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKEZJTkRSRVBMQUNFKQorREVDTF9XSU5FTElCX1RZUEVfQVcoTFBGSU5EUkVQTEFDRSkKIAkKICNkZWZpbmUgRlJfRE9XTiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCiAjZGVmaW5lIEZSX1dIT0xFV09SRCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgpAQCAtMzAzLDggKzMwMyw4IEBACiAJSU5UMzIJCW5TaXplTWF4OyAKIH0gQ0hPT1NFRk9OVDMyVywgKkxQQ0hPT1NFRk9OVDMyVzsKIAotREVDTF9XSU5FTElCX1RZUEVfQVcoQ0hPT1NFRk9OVCk7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhMUENIT09TRUZPTlQpOworREVDTF9XSU5FTElCX1RZUEVfQVcoQ0hPT1NFRk9OVCkKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQQ0hPT1NFRk9OVCkKIAogI3ByYWdtYSBwYWNrKDQpCiAKQEAgLTQzMyw4ICs0MzMsOCBAQAogICAgIEhHTE9CQUwzMiAgICAgICAgaFNldHVwVGVtcGxhdGU7CiB9IFBSSU5URExHMzJXLCAqTFBQUklOVERMRzMyVzsKIAotREVDTF9XSU5FTElCX1RZUEVfQVcoUFJJTlRETEcpOwotREVDTF9XSU5FTElCX1RZUEVfQVcoTFBQUklOVERMRyk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhQUklOVERMRykKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQUFJJTlRETEcpCiAKICNkZWZpbmUgUERfQUxMUEFHRVMgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCiAjZGVmaW5lIFBEX1NFTEVDVElPTiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWcuaC5pbiBiL2luY2x1ZGUvY29uZmlnLmguaW4KaW5kZXggMTY0MmNiNC4uNmE3YTRjMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWcuaC5pbgorKysgYi9pbmNsdWRlL2NvbmZpZy5oLmluCkBAIC02OSw2ICs2OSw5IEBACiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmVycm9yIGZ1bmN0aW9uLiAgKi8KICN1bmRlZiBIQVZFX1NUUkVSUk9SCiAKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyaWNtcCBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TVFJJQ01QCisKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGNnZXRhdHRyIGZ1bmN0aW9uLiAgKi8KICN1bmRlZiBIQVZFX1RDR0VUQVRUUgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NydGRsbC5oIGIvaW5jbHVkZS9jcnRkbGwuaAppbmRleCBjNWQ5ZjRlLi5hMjcyY2U1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NydGRsbC5oCisrKyBiL2luY2x1ZGUvY3J0ZGxsLmgKQEAgLTIyLDQgKzIyLDcgQEAKICNkZWZpbmUgQ1JURExMX0xFQURCWVRFCQkweDgwMDAKICNkZWZpbmUgQ1JURExMX0FMUEhBCQkoMHgwMTAwfENSVERMTF9VUFBFUnxDUlRETExfTE9XRVIpCiAKLSNlbmRpZgorLyogZnVuY3Rpb24gcHJvdG90eXBlcyB1c2VkIGluIGNydGRsbC5jICovCitleHRlcm4gaW50IExhc3RFcnJvclRvRXJybm8oRFdPUkQpOworCisjZW5kaWYgLyogX19XSU5FX0NSVERMTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RjLmggYi9pbmNsdWRlL2RjLmgKaW5kZXggZWExYTM5My4uZjk0ZTBhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kYy5oCisrKyBiL2luY2x1ZGUvZGMuaApAQCAtMjUsNyArMjUsOSBAQAogCiBleHRlcm4gY29uc3QgaW50IERDX1hST1BmdW5jdGlvbltdOwogCisvKiBvYmplY3RzL2NsaXBwaW5nLmMgKi8KIElOVDMyIENMSVBQSU5HX0ludGVyc2VjdENsaXBSZWN0KCBEQyAqIGRjLCBJTlQzMiBsZWZ0LCBJTlQzMiB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgcmlnaHQsIElOVDMyIGJvdHRvbSwgVUlOVDMyIGZsYWdzICk7CisgICAgSU5UMzIgcmlnaHQsIElOVDMyIGJvdHRvbSwgVUlOVDMyIGZsYWdzICk7CitleHRlcm4gdm9pZCBDTElQUElOR19VcGRhdGVHQ1JlZ2lvbiggREMgKiBkYyApOwogCiAjZW5kaWYgLyogX19XSU5FX0RDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGRlbWwuaCBiL2luY2x1ZGUvZGRlbWwuaAppbmRleCAwOWMyZTIwLi4zNzU0NDhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RkZW1sLmgKKysrIGIvaW5jbHVkZS9kZGVtbC5oCkBAIC0xOSw3ICsxOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSERERURBVEEsRFdPUkQsRFdPUkQpOwogdHlwZWRlZiBIRERFREFUQSAoQ0FMTEJBQ0sgKlBGTkNBTExCQUNLMzIpKFVJTlQzMixVSU5UMzIsSENPTlYsSFNaLEhTWiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRERFREFUQSxEV09SRCxEV09SRCk7Ci1ERUNMX1dJTkVMSUJfVFlQRShQRk5DQUxMQkFDSyk7CitERUNMX1dJTkVMSUJfVFlQRShQRk5DQUxMQkFDSykKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTQxLDggKzQxLDggQEAKICAgICBEV09SRCAgIGR3U2VjdXJpdHk7CiB9IENPTlZDT05URVhUMzIsICpMUENPTlZDT05URVhUMzI7CiAKLURFQ0xfV0lORUxJQl9UWVBFKENPTlZDT05URVhUKTsKLURFQ0xfV0lORUxJQl9UWVBFKExQQ09OVkNPTlRFWFQpOworREVDTF9XSU5FTElCX1RZUEUoQ09OVkNPTlRFWFQpCitERUNMX1dJTkVMSUJfVFlQRShMUENPTlZDT05URVhUKQogCiBVSU5UMTYgICAgV0lOQVBJIERkZUluaXRpYWxpemUxNihMUERXT1JELFBGTkNBTExCQUNLMTYsRFdPUkQsRFdPUkQpOwogVUlOVDMyICAgIFdJTkFQSSBEZGVJbml0aWFsaXplMzJBKExQRFdPUkQsUEZOQ0FMTEJBQ0szMixEV09SRCxEV09SRCk7CkBAIC01NCw3ICs1NCw5IEBACiBIQ09OVkxJU1QgV0lOQVBJIERkZUNvbm5lY3RMaXN0MTYoRFdPUkQsSFNaLEhTWixIQ09OVkxJU1QsTFBDT05WQ09OVEVYVDE2KTsKIEhDT05WTElTVCBXSU5BUEkgRGRlQ29ubmVjdExpc3QzMihEV09SRCxIU1osSFNaLEhDT05WTElTVCxMUENPTlZDT05URVhUMzIpOwogI2RlZmluZSAgIERkZUNvbm5lY3RMaXN0IFdJTkVMSUJfTkFNRShEZGVDb25uZWN0TGlzdCkKLUhDT05WICAgICBXSU5BUEkgRGRlUXVlcnlOZXh0U2VydmVyKEhDT05WTElTVCwgSENPTlYpOworSENPTlYgICAgIFdJTkFQSSBEZGVRdWVyeU5leHRTZXJ2ZXIxNihIQ09OVkxJU1QsIEhDT05WKTsKK0hDT05WICAgICBXSU5BUEkgRGRlUXVlcnlOZXh0U2VydmVyMzIoSENPTlZMSVNULCBIQ09OVik7CisjZGVmaW5lICAgRGRlUXVlcnlOZXh0U2VydmVyIFdJTkVMSUJfTkFNRShEZGVRdWVyeU5leHRTZXJ2ZXIpCiBCT09MMTYgICAgV0lOQVBJIERkZURpc2Nvbm5lY3RMaXN0MTYoSENPTlZMSVNUKTsKIEJPT0wzMiAgICBXSU5BUEkgRGRlRGlzY29ubmVjdExpc3QzMihIQ09OVkxJU1QpOwogI2RlZmluZSAgIERkZURpc0Nvbm5lY3RMaXN0IFdJTkVMSUJfTkFNRShEZGVEaXNjb25uZWN0TGlzdCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGRyYXcuaCBiL2luY2x1ZGUvZGRyYXcuaAppbmRleCBmMTdmMDM1Li4wNGQ0OWM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RkcmF3LmgKKysrIGIvaW5jbHVkZS9kZHJhdy5oCkBAIC02NjgsNyArNjY4LDcgQEAKIAogdHlwZWRlZiBCT09MMzIgKENBTExCQUNLICogTFBEREVOVU1DQUxMQkFDSzMyQSkoR1VJRCAqLCBMUFNUUiwgTFBTVFIsIExQVk9JRCk7CiB0eXBlZGVmIEJPT0wzMiAoQ0FMTEJBQ0sgKiBMUERERU5VTUNBTExCQUNLMzJXKShHVUlEICosIExQV1NUUiwgTFBXU1RSLCBMUFZPSUQpOwotREVDTF9XSU5FTElCX1RZUEVfQVcoTFBEREVOVU1DQUxMQkFDSyk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUERERU5VTUNBTExCQUNLKQogCiB0eXBlZGVmIEhSRVNVTFQgKENBTExCQUNLICogTFBEREVOVU1NT0RFU0NBTExCQUNLKShMUEREU1VSRkFDRURFU0MsIExQVk9JRCk7CiB0eXBlZGVmIEhSRVNVTFQgKENBTExCQUNLICogTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLKShMUERJUkVDVERSQVdTVVJGQUNFLCBMUEREU1VSRkFDRURFU0MsIExQVk9JRCk7CkBAIC02NzYsNyArNjc2LDcgQEAKIHR5cGVkZWYgSEFORExFMzIgSE1PTklUT1I7CiB0eXBlZGVmIEJPT0wzMiAoQ0FMTEJBQ0sgKiBMUERERU5VTUNBTExCQUNLRVgzMkEpKEdVSUQgKiwgTFBTVFIsIExQU1RSLCBMUFZPSUQsIEhNT05JVE9SKTsKIHR5cGVkZWYgQk9PTDMyIChDQUxMQkFDSyAqIExQRERFTlVNQ0FMTEJBQ0tFWDMyVykoR1VJRCAqLCBMUFdTVFIsIExQV1NUUiwgTFBWT0lELCBITU9OSVRPUik7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhMUERERU5VTUNBTExCQUNLRVgpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTFBEREVOVU1DQUxMQkFDS0VYKQogCiBIUkVTVUxUIFdJTkFQSSBEaXJlY3REcmF3RW51bWVyYXRlRXhBKCBMUERERU5VTUNBTExCQUNLRVgzMkEgbHBDYWxsYmFjaywgTFBWT0lEIGxwQ29udGV4dCwgRFdPUkQgZHdGbGFncyk7CiBIUkVTVUxUIFdJTkFQSSBEaXJlY3REcmF3RW51bWVyYXRlRXhXKCBMUERERU5VTUNBTExCQUNLRVgzMlcgbHBDYWxsYmFjaywgTFBWT0lEIGxwQ29udGV4dCwgRFdPUkQgZHdGbGFncyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlYnVnLmggYi9pbmNsdWRlL2RlYnVnLmgKaW5kZXggZTllMWIzMy4uM2QxNzAyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZWJ1Zy5oCisrKyBiL2luY2x1ZGUvZGVidWcuaApAQCAtMzAsOTQgKzMwLDk3IEBACiAjZGVmaW5lIGRiY2hfZGRyYXcgMjIKICNkZWZpbmUgZGJjaF9kZWJ1ZyAyMwogI2RlZmluZSBkYmNoX2RpYWxvZyAyNAotI2RlZmluZSBkYmNoX2RsbCAyNQotI2RlZmluZSBkYmNoX2Rvc2ZzIDI2Ci0jZGVmaW5lIGRiY2hfZG9zbWVtIDI3Ci0jZGVmaW5lIGRiY2hfZHJpdmVyIDI4Ci0jZGVmaW5lIGRiY2hfZHNvdW5kIDI5Ci0jZGVmaW5lIGRiY2hfZWRpdCAzMAotI2RlZmluZSBkYmNoX2V2ZW50IDMxCi0jZGVmaW5lIGRiY2hfZXhlYyAzMgotI2RlZmluZSBkYmNoX2ZpbGUgMzMKLSNkZWZpbmUgZGJjaF9maXh1cCAzNAotI2RlZmluZSBkYmNoX2ZvbnQgMzUKLSNkZWZpbmUgZGJjaF9nZGkgMzYKLSNkZWZpbmUgZGJjaF9nbG9iYWwgMzcKLSNkZWZpbmUgZGJjaF9ncmFwaGljcyAzOAotI2RlZmluZSBkYmNoX2hlYWRlciAzOQotI2RlZmluZSBkYmNoX2hlYXAgNDAKLSNkZWZpbmUgZGJjaF9ob29rIDQxCi0jZGVmaW5lIGRiY2hfaWNvbiA0MgotI2RlZmluZSBkYmNoX2ltYWdlbGlzdCA0MwotI2RlZmluZSBkYmNoX2ludCA0NAotI2RlZmluZSBkYmNoX2ludDIxIDQ1Ci0jZGVmaW5lIGRiY2hfaW50MzEgNDYKLSNkZWZpbmUgZGJjaF9rZXkgNDcKLSNkZWZpbmUgZGJjaF9rZXlib2FyZCA0OAotI2RlZmluZSBkYmNoX2xkdCA0OQotI2RlZmluZSBkYmNoX2xpc3Rib3ggNTAKLSNkZWZpbmUgZGJjaF9sb2NhbCA1MQotI2RlZmluZSBkYmNoX21jaSA1MgotI2RlZmluZSBkYmNoX21jaWFuaW0gNTMKLSNkZWZpbmUgZGJjaF9tY2l3YXZlIDU0Ci0jZGVmaW5lIGRiY2hfbWRpIDU1Ci0jZGVmaW5lIGRiY2hfbWVudSA1NgotI2RlZmluZSBkYmNoX21lc3NhZ2UgNTcKLSNkZWZpbmUgZGJjaF9tZXRhZmlsZSA1OAotI2RlZmluZSBkYmNoX21pZGkgNTkKLSNkZWZpbmUgZGJjaF9tbWF1eCA2MAotI2RlZmluZSBkYmNoX21taW8gNjEKLSNkZWZpbmUgZGJjaF9tbXN5cyA2MgotI2RlZmluZSBkYmNoX21tdGltZSA2MwotI2RlZmluZSBkYmNoX21vZHVsZSA2NAotI2RlZmluZSBkYmNoX21wciA2NQotI2RlZmluZSBkYmNoX21zZyA2NgotI2RlZmluZSBkYmNoX25vbmNsaWVudCA2NwotI2RlZmluZSBkYmNoX250ZGxsIDY4Ci0jZGVmaW5lIGRiY2hfb2xlIDY5Ci0jZGVmaW5lIGRiY2hfcGFsZXR0ZSA3MAotI2RlZmluZSBkYmNoX3ByaW50IDcxCi0jZGVmaW5lIGRiY2hfcHJvZmlsZSA3MgotI2RlZmluZSBkYmNoX3Byb2dyZXNzIDczCi0jZGVmaW5lIGRiY2hfcHJvcCA3NAotI2RlZmluZSBkYmNoX3JlZyA3NQotI2RlZmluZSBkYmNoX3JlZ2lvbiA3NgotI2RlZmluZSBkYmNoX3JlbGF5IDc3Ci0jZGVmaW5lIGRiY2hfcmVzb3VyY2UgNzgKLSNkZWZpbmUgZGJjaF9zY3JvbGwgNzkKLSNkZWZpbmUgZGJjaF9zZWN1cml0eSA4MAotI2RlZmluZSBkYmNoX3NlZ21lbnQgODEKLSNkZWZpbmUgZGJjaF9zZWxlY3RvciA4MgotI2RlZmluZSBkYmNoX3NlbSA4MwotI2RlZmluZSBkYmNoX3NlbmRtc2cgODQKLSNkZWZpbmUgZGJjaF9zaGVsbCA4NQotI2RlZmluZSBkYmNoX3NobSA4NgotI2RlZmluZSBkYmNoX3NvdW5kIDg3Ci0jZGVmaW5lIGRiY2hfc3RhdGljIDg4Ci0jZGVmaW5lIGRiY2hfc3RhdHVzIDg5Ci0jZGVmaW5lIGRiY2hfc3RyZXNzIDkwCi0jZGVmaW5lIGRiY2hfc3RyaW5nIDkxCi0jZGVmaW5lIGRiY2hfc3lzdGVtIDkyCi0jZGVmaW5lIGRiY2hfdGFzayA5MwotI2RlZmluZSBkYmNoX3RleHQgOTQKLSNkZWZpbmUgZGJjaF90aHJlYWQgOTUKLSNkZWZpbmUgZGJjaF90aHVuayA5NgotI2RlZmluZSBkYmNoX3RpbWVyIDk3Ci0jZGVmaW5lIGRiY2hfdG9vbGhlbHAgOTgKLSNkZWZpbmUgZGJjaF90d2VhayA5OQotI2RlZmluZSBkYmNoX3VpdG9vbHMgMTAwCi0jZGVmaW5lIGRiY2hfdXBkb3duIDEwMQotI2RlZmluZSBkYmNoX3ZlciAxMDIKLSNkZWZpbmUgZGJjaF92aXJ0dWFsIDEwMwotI2RlZmluZSBkYmNoX3Z4ZCAxMDQKLSNkZWZpbmUgZGJjaF93aW4gMTA1Ci0jZGVmaW5lIGRiY2hfd2luMTZkcnYgMTA2Ci0jZGVmaW5lIGRiY2hfd2luMzIgMTA3Ci0jZGVmaW5lIGRiY2hfd2luZyAxMDgKLSNkZWZpbmUgZGJjaF93aW5zb2NrIDEwOQotI2RlZmluZSBkYmNoX3duZXQgMTEwCi0jZGVmaW5lIGRiY2hfeDExIDExMQotI2RlZmluZSBkYmNoX3gxMWRydiAxMTIKKyNkZWZpbmUgZGJjaF9kaW5wdXQgMjUKKyNkZWZpbmUgZGJjaF9kbGwgMjYKKyNkZWZpbmUgZGJjaF9kb3NmcyAyNworI2RlZmluZSBkYmNoX2Rvc21lbSAyOAorI2RlZmluZSBkYmNoX2RyaXZlciAyOQorI2RlZmluZSBkYmNoX2Rzb3VuZCAzMAorI2RlZmluZSBkYmNoX2VkaXQgMzEKKyNkZWZpbmUgZGJjaF9ldmVudCAzMgorI2RlZmluZSBkYmNoX2V4ZWMgMzMKKyNkZWZpbmUgZGJjaF9maWxlIDM0CisjZGVmaW5lIGRiY2hfZml4dXAgMzUKKyNkZWZpbmUgZGJjaF9mb250IDM2CisjZGVmaW5lIGRiY2hfZ2RpIDM3CisjZGVmaW5lIGRiY2hfZ2xvYmFsIDM4CisjZGVmaW5lIGRiY2hfZ3JhcGhpY3MgMzkKKyNkZWZpbmUgZGJjaF9oZWFkZXIgNDAKKyNkZWZpbmUgZGJjaF9oZWFwIDQxCisjZGVmaW5lIGRiY2hfaG9vayA0MgorI2RlZmluZSBkYmNoX2ljb24gNDMKKyNkZWZpbmUgZGJjaF9pbWFnZWxpc3QgNDQKKyNkZWZpbmUgZGJjaF9pbnQgNDUKKyNkZWZpbmUgZGJjaF9pbnQyMSA0NgorI2RlZmluZSBkYmNoX2ludDMxIDQ3CisjZGVmaW5lIGRiY2hfa2V5IDQ4CisjZGVmaW5lIGRiY2hfa2V5Ym9hcmQgNDkKKyNkZWZpbmUgZGJjaF9sZHQgNTAKKyNkZWZpbmUgZGJjaF9saXN0Ym94IDUxCisjZGVmaW5lIGRiY2hfbG9jYWwgNTIKKyNkZWZpbmUgZGJjaF9tY2kgNTMKKyNkZWZpbmUgZGJjaF9tY2lhbmltIDU0CisjZGVmaW5lIGRiY2hfbWNpd2F2ZSA1NQorI2RlZmluZSBkYmNoX21kaSA1NgorI2RlZmluZSBkYmNoX21lbnUgNTcKKyNkZWZpbmUgZGJjaF9tZXNzYWdlIDU4CisjZGVmaW5lIGRiY2hfbWV0YWZpbGUgNTkKKyNkZWZpbmUgZGJjaF9taWRpIDYwCisjZGVmaW5lIGRiY2hfbW1hdXggNjEKKyNkZWZpbmUgZGJjaF9tbWlvIDYyCisjZGVmaW5lIGRiY2hfbW1zeXMgNjMKKyNkZWZpbmUgZGJjaF9tbXRpbWUgNjQKKyNkZWZpbmUgZGJjaF9tb2R1bGUgNjUKKyNkZWZpbmUgZGJjaF9tcHIgNjYKKyNkZWZpbmUgZGJjaF9tc2cgNjcKKyNkZWZpbmUgZGJjaF9ub25jbGllbnQgNjgKKyNkZWZpbmUgZGJjaF9udGRsbCA2OQorI2RlZmluZSBkYmNoX29sZSA3MAorI2RlZmluZSBkYmNoX3BhbGV0dGUgNzEKKyNkZWZpbmUgZGJjaF9wcmludCA3MgorI2RlZmluZSBkYmNoX3Byb2Nlc3MgNzMKKyNkZWZpbmUgZGJjaF9wcm9maWxlIDc0CisjZGVmaW5lIGRiY2hfcHJvZ3Jlc3MgNzUKKyNkZWZpbmUgZGJjaF9wcm9wIDc2CisjZGVmaW5lIGRiY2hfcmVnIDc3CisjZGVmaW5lIGRiY2hfcmVnaW9uIDc4CisjZGVmaW5lIGRiY2hfcmVsYXkgNzkKKyNkZWZpbmUgZGJjaF9yZXNvdXJjZSA4MAorI2RlZmluZSBkYmNoX3Njcm9sbCA4MQorI2RlZmluZSBkYmNoX3NlY3VyaXR5IDgyCisjZGVmaW5lIGRiY2hfc2VnbWVudCA4MworI2RlZmluZSBkYmNoX3NlbGVjdG9yIDg0CisjZGVmaW5lIGRiY2hfc2VtIDg1CisjZGVmaW5lIGRiY2hfc2VuZG1zZyA4NgorI2RlZmluZSBkYmNoX3NoZWxsIDg3CisjZGVmaW5lIGRiY2hfc2htIDg4CisjZGVmaW5lIGRiY2hfc291bmQgODkKKyNkZWZpbmUgZGJjaF9zdGF0aWMgOTAKKyNkZWZpbmUgZGJjaF9zdHJlc3MgOTEKKyNkZWZpbmUgZGJjaF9zdHJpbmcgOTIKKyNkZWZpbmUgZGJjaF9zeXNjb2xvciA5MworI2RlZmluZSBkYmNoX3N5c3RlbSA5NAorI2RlZmluZSBkYmNoX3Rhc2sgOTUKKyNkZWZpbmUgZGJjaF90ZXh0IDk2CisjZGVmaW5lIGRiY2hfdGhyZWFkIDk3CisjZGVmaW5lIGRiY2hfdGh1bmsgOTgKKyNkZWZpbmUgZGJjaF90aW1lciA5OQorI2RlZmluZSBkYmNoX3Rvb2xiYXIgMTAwCisjZGVmaW5lIGRiY2hfdG9vbGhlbHAgMTAxCisjZGVmaW5lIGRiY2hfdHdlYWsgMTAyCisjZGVmaW5lIGRiY2hfdWl0b29scyAxMDMKKyNkZWZpbmUgZGJjaF91cGRvd24gMTA0CisjZGVmaW5lIGRiY2hfdmVyIDEwNQorI2RlZmluZSBkYmNoX3ZpcnR1YWwgMTA2CisjZGVmaW5lIGRiY2hfdnhkIDEwNworI2RlZmluZSBkYmNoX3dpbiAxMDgKKyNkZWZpbmUgZGJjaF93aW4xNmRydiAxMDkKKyNkZWZpbmUgZGJjaF93aW4zMiAxMTAKKyNkZWZpbmUgZGJjaF93aW5nIDExMQorI2RlZmluZSBkYmNoX3dpbnNvY2sgMTEyCisjZGVmaW5lIGRiY2hfd25ldCAxMTMKKyNkZWZpbmUgZGJjaF94MTEgMTE0CisjZGVmaW5lIGRiY2hfeDExZHJ2IDExNQogLyogRGVmaW5pdGlvbnMgZm9yIGNsYXNzZXMgaWRlbnRpZmllcnMgKi8KICNkZWZpbmUgZGJjbF9maXhtZSAwCiAjZGVmaW5lIGRiY2xfZXJyIDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVidWdkZWZzLmggYi9pbmNsdWRlL2RlYnVnZGVmcy5oCmluZGV4IGVhOTg3NDQuLjk2NzA0YzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGVidWdkZWZzLmgKKysrIGIvaW5jbHVkZS9kZWJ1Z2RlZnMuaApAQCAtNCw3ICs0LDcgQEAKICNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCiAjZW5kaWYKIAotI2RlZmluZSBERUJVR19DSEFOTkVMX0NPVU5UIDExMworI2RlZmluZSBERUJVR19DSEFOTkVMX0NPVU5UIDExNgogI2lmZGVmIERFQlVHX1JVTlRJTUUKIHNob3J0IGRlYnVnX21zZ19lbmFibGVkW11bREVCVUdfQ0xBU1NfQ09VTlRdID0gewogezEsIDEsIDAsIDB9LApAQCAtMTIwLDYgKzEyMCw5IEBACiB7MSwgMSwgMCwgMH0sCiB7MSwgMSwgMCwgMH0sCiB7MSwgMSwgMCwgMH0sCit7MSwgMSwgMCwgMH0sCit7MSwgMSwgMCwgMH0sCit7MSwgMSwgMCwgMH0sCiB9OwogY29uc3QgY2hhciogZGVidWdfY2hfbmFtZVtdID0gewogImFjY2VsIiwKQEAgLTE0Nyw2ICsxNTAsNyBAQAogImRkcmF3IiwKICJkZWJ1ZyIsCiAiZGlhbG9nIiwKKyJkaW5wdXQiLAogImRsbCIsCiAiZG9zZnMiLAogImRvc21lbSIsCkBAIC0xOTQsNiArMTk4LDcgQEAKICJvbGUiLAogInBhbGV0dGUiLAogInByaW50IiwKKyJwcm9jZXNzIiwKICJwcm9maWxlIiwKICJwcm9ncmVzcyIsCiAicHJvcCIsCkBAIC0yMTEsMTUgKzIxNiwxNiBAQAogInNobSIsCiAic291bmQiLAogInN0YXRpYyIsCi0ic3RhdHVzIiwKICJzdHJlc3MiLAogInN0cmluZyIsCisic3lzY29sb3IiLAogInN5c3RlbSIsCiAidGFzayIsCiAidGV4dCIsCiAidGhyZWFkIiwKICJ0aHVuayIsCiAidGltZXIiLAorInRvb2xiYXIiLAogInRvb2xoZWxwIiwKICJ0d2VhayIsCiAidWl0b29scyIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RpbnB1dC5oIGIvaW5jbHVkZS9kaW5wdXQuaAppbmRleCBkMTAzZTdiLi5kZTc5OTcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RpbnB1dC5oCisrKyBiL2luY2x1ZGUvZGlucHV0LmgKQEAgLTE1NSw4ICsxNTUsOCBAQAogICAgIFdPUkQJd1Jlc2VydmVkOwogI2VuZGlmIC8qIERJUkVDVElOUFVUX1ZFUlNJT04gPj0gMHgwNTAwICovCiB9IERJREVWSUNFT0JKRUNUSU5TVEFOQ0UzMlcsICpMUERJREVWSUNFT0JKRUNUSU5TVEFOQ0UzMlcsKkxQQ0RJREVWSUNFT0JKRUNUSU5TVEFOQ0UzMlc7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhMUERJREVWSUNFT0JKRUNUSU5TVEFOQ0UpOwotREVDTF9XSU5FTElCX1RZUEVfQVcoRElERVZJQ0VPQkpFQ1RJTlNUQU5DRSk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUERJREVWSUNFT0JKRUNUSU5TVEFOQ0UpCitERUNMX1dJTkVMSUJfVFlQRV9BVyhESURFVklDRU9CSkVDVElOU1RBTkNFKQogCiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTE4NiwxNyArMTg2LDE3IEBACiAgICAgV09SRAl3VXNhZ2U7CiAjZW5kaWYgLyogRElSRUNUSU5QVVRfVkVSU0lPTiA+PSAweDA1MDAgKi8KIH0gRElERVZJQ0VJTlNUQU5DRTMyVywgKkxQRElERVZJQ0VJTlNUQU5DRTMyVywgKkxQQ0RJREVWSUNFSU5TVEFOQ0UzMlc7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhESURFVklDRUlOU1RBTkNFKTsKLURFQ0xfV0lORUxJQl9UWVBFX0FXKExQRElERVZJQ0VJTlNUQU5DRSk7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhMUENESURFVklDRUlOU1RBTkNFKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKERJREVWSUNFSU5TVEFOQ0UpCitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUERJREVWSUNFSU5TVEFOQ0UpCitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUENESURFVklDRUlOU1RBTkNFKQogCiB0eXBlZGVmIEJPT0wzMiAoQ0FMTEJBQ0sgKiBMUERJRU5VTURFVklDRVNDQUxMQkFDSzMyQSkoTFBDRElERVZJQ0VJTlNUQU5DRTMyQSxMUFZPSUQpOwogdHlwZWRlZiBCT09MMzIgKENBTExCQUNLICogTFBESUVOVU1ERVZJQ0VTQ0FMTEJBQ0szMlcpKExQQ0RJREVWSUNFSU5TVEFOQ0UzMlcsTFBWT0lEKTsKLURFQ0xfV0lORUxJQl9UWVBFX0FXKExQRElFTlVNREVWSUNFU0NBTExCQUNLKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQRElFTlVNREVWSUNFU0NBTExCQUNLKQogCiB0eXBlZGVmIEJPT0wzMiAoQ0FMTEJBQ0sgKiBMUERJRU5VTURFVklDRU9CSkVDVFNDQUxMQkFDSzMyQSkoTFBDRElERVZJQ0VPQkpFQ1RJTlNUQU5DRTMyQSwgTFBWT0lEKTsKIHR5cGVkZWYgQk9PTDMyIChDQUxMQkFDSyAqIExQRElFTlVNREVWSUNFT0JKRUNUU0NBTExCQUNLMzJXKShMUENESURFVklDRU9CSkVDVElOU1RBTkNFMzJXLExQVk9JRCk7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhMUERJRU5VTURFVklDRU9CSkVDVFNDQUxMQkFDSyk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUERJRU5VTURFVklDRU9CSkVDVFNDQUxMQkFDSykKIAogI2RlZmluZSBESUtfRVNDQVBFICAgICAgICAgIDB4MDEKICNkZWZpbmUgRElLXzEgICAgICAgICAgICAgICAweDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Rzb3VuZC5oIGIvaW5jbHVkZS9kc291bmQuaAppbmRleCAwODE2OTZiLi5hZjdhNmE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2Rzb3VuZC5oCisrKyBiL2luY2x1ZGUvZHNvdW5kLmgKQEAgLTI0NiwxMCArMjQ2LDM0IEBACiAJTFBESVJFQ1RTT1VOREJVRkZFUgkJZHNiOwogfTsKICN1bmRlZiBUSElTCi0KICN1bmRlZiBTVERNRVRIT0QKICN1bmRlZiBTVERNRVRIT0RfCiAjdW5kZWYgUFVSRQogI3VuZGVmIEZBUgogI3VuZGVmIFRISVNfCisKKy8qIERpcmVjdFBsYXlMb2JieSBzdHVmZiAqLworLyoge0FGNDY1QzcxLTk1ODgtMTFjZi1BMDIwLTAwQUEwMDYxNTdBQ30gKi8KK0RFRklORV9HVUlEKElJRF9JRGlyZWN0UGxheUxvYmJ5LCAweGFmNDY1YzcxLCAweDk1ODgsIDB4MTFjZiwgMHhhMCwgMHgyMCwgMHgwLCAweGFhLCAweDAsIDB4NjEsIDB4NTcsIDB4YWMpOworLyogezI2QzY2QTcwLUIzNjctMTFjZi1BMDI0LTAwQUEwMDYxNTdBQ30gKi8KK0RFRklORV9HVUlEKElJRF9JRGlyZWN0UGxheUxvYmJ5QSwgMHgyNmM2NmE3MCwgMHhiMzY3LCAweDExY2YsIDB4YTAsIDB4MjQsIDB4MCwgMHhhYSwgMHgwLCAweDYxLCAweDU3LCAweGFjKTsKKy8qIHswMTk0QzIyMC1BMzAzLTExZDAtOUM0Ri0wMEEwQzkwNTQyNUV9ICovCitERUZJTkVfR1VJRChJSURfSURpcmVjdFBsYXlMb2JieTIsIDB4MTk0YzIyMCwgMHhhMzAzLCAweDExZDAsIDB4OWMsIDB4NGYsIDB4MCwgMHhhMCwgMHhjOSwgMHg1LCAweDQyLCAweDVlKTsKKy8qIHsxQkI0QUY4MC1BMzAzLTExZDAtOUM0Ri0wMEEwQzkwNTQyNUV9ICovCitERUZJTkVfR1VJRChJSURfSURpcmVjdFBsYXlMb2JieTJBLCAweDFiYjRhZjgwLCAweGEzMDMsIDB4MTFkMCwgMHg5YywgMHg0ZiwgMHgwLCAweGEwLCAweGM5LCAweDUsIDB4NDIsIDB4NWUpOworLyogezJGRThGODEwLUIyQTUtMTFkMC1BNzg3LTAwMDBGODAzQUJGQ30gKi8KK0RFRklORV9HVUlEKENMU0lEX0RpcmVjdFBsYXlMb2JieSwgMHgyZmU4ZjgxMCwgMHhiMmE1LCAweDExZDAsIDB4YTcsIDB4ODcsIDB4MCwgMHgwLCAweGY4LCAweDMsIDB4YWIsIDB4ZmMpOworCit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0UGxheUxvYmJ5ICAgICAqTFBESVJFQ1RQTEFZTE9CQlk7Cit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0UGxheUxvYmJ5ICAgICAqTFBESVJFQ1RQTEFZTE9CQllBOwordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdFBsYXlMb2JieSAgICAgSURpcmVjdFBsYXlMb2JieUE7CisKK3R5cGVkZWYgc3RydWN0IElEaXJlY3RQbGF5TG9iYnkyICAgICpMUERJUkVDVFBMQVlMT0JCWTI7Cit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0UGxheUxvYmJ5MiAgICAqTFBESVJFQ1RQTEFZTE9CQlkyQTsKK3R5cGVkZWYgc3RydWN0IElEaXJlY3RQbGF5TG9iYnkyICAgIElEaXJlY3RQbGF5TG9iYnkyQTsKKworZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIERpcmVjdFBsYXlMb2JieUNyZWF0ZVcoTFBHVUlELCBMUERJUkVDVFBMQVlMT0JCWSAqLCBJVW5rbm93biAqLCBMUFZPSUQsIERXT1JEICk7CisKK2V4dGVybiBIUkVTVUxUIFdJTkFQSSBEaXJlY3RQbGF5TG9iYnlDcmVhdGVBKExQR1VJRCwgTFBESVJFQ1RQTEFZTE9CQllBICosIElVbmtub3duICosIExQVk9JRCwgRFdPUkQgKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2V4Y2VwdC5oIGIvaW5jbHVkZS9leGNlcHQuaAppbmRleCA4MDI4MDYwLi5jOTU0MTc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2V4Y2VwdC5oCisrKyBiL2luY2x1ZGUvZXhjZXB0LmgKQEAgLTMyLDEzICszMiw2IEBACiAgIFBFWENFUFRJT05fSEFORExFUiAgICAgICBIYW5kbGVyOwogfSBFWENFUFRJT05fRlJBTUUsICpQRVhDRVBUSU9OX0ZSQU1FOwogCi0vKgotICogRnVuY3Rpb24gZGVmaW5pdGlvbnMgIAotICovCi0gCi12b2lkIFdJTkFQSSBSYWlzZUV4Y2VwdGlvbihEV09SRCBleGNjb2RlLCBEV09SRCBleGNmbGFncywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBuYXJncywgY29uc3QgTFBEV09SRCBwYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDT05URVhUIHBjb250ZXh0IC8qIFdpbmUgYWRkaXRpb25hbCBwYXJhbWV0ZXIgKi8pOyAKICAgICAgICAgICAgICAgICAgICAgICAgIAogLyoKICAqICB0aGlzIHVuZG9jdW1lbnRlZCBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhbiBleGNlcHRpb24KQEAgLTUzLDExICs0Niw5IEBACiAgKiAgYSBmb3VydGggcGFyYW1ldGVyLCB0aGF0IGlzIHVzZWQgYXMgdGhlIGVheCBpbiB0aGUgCiAgKiAgY29udGV4dC4gICAKICAqLwotCiB2b2lkIFdJTkFQSSBSdGxVbndpbmQoIFBFWENFUFRJT05fRlJBTUUgcGVzdGZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgdW51c2VkRUlQLAogICAgICAgICAgICAgICAgICAgICAgICBQRVhDRVBUSU9OX1JFQ09SRCBwZXhjcmVjLAotICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBjb250ZXh0RUFYLAotICAgICAgICAgICAgICAgICAgICAgICBQQ09OVEVYVCBwY29udGV4dCAvKiBXaW5lIGFkZGl0aW9uYWwgcGFyYW1ldGVyICovICk7CisgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGNvbnRleHRFQVggKTsKIAogI2VuZGlmICAvKiBfX1dJTkVfRVhDRVBUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZmxhdHRodW5rLmggYi9pbmNsdWRlL2ZsYXR0aHVuay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZTQyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2ZsYXR0aHVuay5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogV2luOTUgRmxhdCBUaHVuayBkYXRhIHN0cnVjdHVyZXMKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBVbHJpY2ggV2VpZ2FuZAorICovCisKKyNpZm5kZWYgX19XSU5FX0ZMQVRUSFVOS19ICisjZGVmaW5lIF9fV0lORV9GTEFUVEhVTktfSAorCitzdHJ1Y3QgVGh1bmtEYXRhQ29tbW9uCit7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICBtYWdpY1s0XTsgICAgICAgICAvKiAwMCAqLworICAgIERXT1JEICAgICAgICAgICAgICAgICAgY2hlY2tzdW07ICAgICAgICAgLyogMDQgKi8KK307CisKK3N0cnVjdCBUaHVua0RhdGFMUzE2Cit7CisgICAgc3RydWN0IFRodW5rRGF0YUNvbW1vbiBjb21tb247ICAgICAgICAgICAvKiAwMCAqLworICAgIFNFR1BUUiAgICAgICAgICAgICAgICAgdGFyZ2V0VGFibGU7ICAgICAgLyogMDggKi8KKyAgICBEV09SRCAgICAgICAgICAgICAgICAgIGZpcnN0VGltZTsgICAgICAgIC8qIDBDICovCit9OworCitzdHJ1Y3QgVGh1bmtEYXRhTFMzMgoreworICAgIHN0cnVjdCBUaHVua0RhdGFDb21tb24gY29tbW9uOyAgICAgICAgICAgLyogMDAgKi8KKyAgICBEV09SRCAqICAgICAgICAgICAgICAgIHRhcmdldFRhYmxlOyAgICAgIC8qIDA4ICovCisgICAgY2hhciAgICAgICAgICAgICAgICAgICBsYXRlQmluZGluZ1s0XTsgICAvKiAwQyAqLworICAgIERXT1JEICAgICAgICAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgICAgLyogMTAgKi8KKyAgICBEV09SRCAgICAgICAgICAgICAgICAgIHJlc2VydmVkMTsgICAgICAgIC8qIDE0ICovCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICByZXNlcnZlZDI7ICAgICAgICAvKiAxOCAqLworICAgIERXT1JEICAgICAgICAgICAgICAgICAgb2Zmc2V0UVRUaHVuazsgICAgLyogMUMgKi8KKyAgICBEV09SRCAgICAgICAgICAgICAgICAgIG9mZnNldEZUUHJvbG9nOyAgIC8qIDIwICovCit9OworCitzdHJ1Y3QgVGh1bmtEYXRhU0wxNgoreworICAgIHN0cnVjdCBUaHVua0RhdGFDb21tb24gY29tbW9uOyAgICAgICAgICAgIC8qIDAwICovCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICBmbGFnczE7ICAgICAgICAgICAgLyogMDggKi8KKyAgICBEV09SRCAgICAgICAgICAgICAgICAgIHJlc2VydmVkMTsgICAgICAgICAvKiAwQyAqLworICAgIHN0cnVjdCBUaHVua0RhdGFTTCAqICAgZnBEYXRhOyAgICAgICAgICAgIC8qIDEwICovCisgICAgU0VHUFRSICAgICAgICAgICAgICAgICBzcERhdGE7ICAgICAgICAgICAgLyogMTQgKi8KKyAgICBEV09SRCAgICAgICAgICAgICAgICAgIHJlc2VydmVkMjsgICAgICAgICAvKiAxOCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgbGF0ZUJpbmRpbmdbNF07ICAgIC8qIDFDICovCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICBmbGFnczI7ICAgICAgICAgICAgLyogMjAgKi8KKyAgICBEV09SRCAgICAgICAgICAgICAgICAgIHJlc2VydmVkMzsgICAgICAgICAvKiAyMCAqLworICAgIFNFR1BUUiAgICAgICAgICAgICAgICAgYXBpRGF0YWJhc2U7ICAgICAgIC8qIDI4ICovCit9OworCitzdHJ1Y3QgVGh1bmtEYXRhU0wzMgoreworICAgIHN0cnVjdCBUaHVua0RhdGFDb21tb24gY29tbW9uOyAgICAgICAgICAgIC8qIDAwICovCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICByZXNlcnZlZDE7ICAgICAgICAgLyogMDggKi8KKyAgICBzdHJ1Y3QgVGh1bmtEYXRhU0wgKiAgIGRhdGE7ICAgICAgICAgICAgICAvKiAwQyAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgbGF0ZUJpbmRpbmdbNF07ICAgIC8qIDEwICovCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgICAgLyogMTQgKi8KKyAgICBEV09SRCAgICAgICAgICAgICAgICAgIHJlc2VydmVkMjsgICAgICAgICAvKiAxOCAqLworICAgIERXT1JEICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQzOyAgICAgICAgIC8qIDFDICovCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICBvZmZzZXRUYXJnZXRUYWJsZTsgLyogMjAgKi8KK307CisKK3N0cnVjdCBUaHVua0RhdGFTTAoreworI2lmIDAKKyAgICBUaGlzIHN0cnVjdHVyZSBkaWZmZXJzIGZyb20gdGhlIFdpbjk1IG9yaWdpbmFsLAorICAgIGJ1dCB0aGlzIHNob3VsZCBub3QgbWF0dGVyIHNpbmNlIGl0IGlzIHN0cmljdGx5IGludGVybmFsIHRvCisgICAgdGhlIHRodW5rIGhhbmRsaW5nIHJvdXRpbmVzIGluIEtSTkwzODYgLyBLRVJORUwzMi4KKworICAgIEZvciByZWZlcmVuY2UsIGhlcmUgaXMgdGhlIFdpbjk1IGxheW91dDoKKworICAgIHN0cnVjdCBUaHVua0RhdGFDb21tb24gY29tbW9uOyAgICAgICAgICAgIC8qIDAwICovCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICBmbGFnczE7ICAgICAgICAgICAgLyogMDggKi8KKyAgICBTRUdQVFIgICAgICAgICAgICAgICAgIGFwaURhdGFiYXNlOyAgICAgICAvKiAwQyAqLworICAgIFdPUkQgICAgICAgICAgICAgICAgICAgZXhlUHRyOyAgICAgICAgICAgIC8qIDEwICovCisgICAgV09SRCAgICAgICAgICAgICAgICAgICBzZWdNQkE7ICAgICAgICAgICAgLyogMTIgKi8KKyAgICBEV09SRCAgICAgICAgICAgICAgICAgIGxlbk1CQVRvdGFsOyAgICAgICAvKiAxNCAqLworICAgIERXT1JEICAgICAgICAgICAgICAgICAgbGVuTUJBVXNlZDsgICAgICAgIC8qIDE4ICovCisgICAgRFdPUkQgICAgICAgICAgICAgICAgICBmbGFnczI7ICAgICAgICAgICAgLyogMUMgKi8KKyAgICBjaGFyICAgICAgICAgICAgICAgICAgIHBzekRsbDE2WzI1Nl07ICAgICAvKiAyMCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgcHN6RGxsMzJbMjU2XTsgICAgIC8qMTIwICovCisKKyAgICBXZSBkbyBpdCBkaWZmZXJlbnRseSBzaW5jZSBhbGwgb3VyIHRodW5rIGhhbmRsaW5nIGlzIGRvbmUKKyAgICBieSAzMi1iaXQgY29kZS4gVGhlcmVmb3JlIHdlIGRvIG5vdCBuZWVkIGRvIHByb3ZpZGUKKyAgICBlYXN5IGFjY2VzcyB0byB0aGlzIGRhdGEsIGVzcGVjaWFsbHkgdGhlIHByb2Nlc3MgdGFyZ2V0CisgICAgdGFibGUgZGF0YWJhc2UsIGZvciAxNi1iaXQgY29kZS4KKyNlbmRpZgorCisgICAgc3RydWN0IFRodW5rRGF0YUNvbW1vbiBjb21tb247CisgICAgRFdPUkQgICAgICAgICAgICAgICAgICBmbGFnczE7CisgICAgc3RydWN0IFNMQXBpREIgKiAgICAgICBhcGlEQjsKKyAgICBzdHJ1Y3QgU0xUYXJnZXREQiAqICAgIHRhcmdldERCOworICAgIERXT1JEICAgICAgICAgICAgICAgICAgZmxhZ3MyOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgcHN6RGxsMTZbMjU2XTsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgIHBzekRsbDMyWzI1Nl07Cit9OworCitzdHJ1Y3QgU0xUYXJnZXREQgoreworICAgICBzdHJ1Y3QgU0xUYXJnZXREQiAqICAgbmV4dDsKKyAgICAgUERCMzIgKiAgICAgICAgICAgICAgIHByb2Nlc3M7CisgICAgIERXT1JEICogICAgICAgICAgICAgICB0YXJnZXRUYWJsZTsKK307CisKK3N0cnVjdCBTTEFwaURCCit7CisgICAgRFdPUkQgICAgICAgICAgICAgICAgICBuckFyZ0J5dGVzOworICAgIERXT1JEICAgICAgICAgICAgICAgICAgZXJyb3JSZXR1cm5WYWx1ZTsKK307CisKKworI2VuZGlmIC8qIF9fV0lORV9GTEFUVEhVTktfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2dkaS5oIGIvaW5jbHVkZS9nZGkuaAppbmRleCAwN2FiNWEyLi5hZTQwYmQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2dkaS5oCisrKyBiL2luY2x1ZGUvZ2RpLmgKQEAgLTQyOSw2ICs0MjksOCBAQAogZXh0ZXJuIGNvbnN0IERDX0ZVTkNUSU9OUyAqRFJJVkVSX0ZpbmREcml2ZXIoIExQQ1NUUiBuYW1lICk7CiBleHRlcm4gQk9PTDMyIERSSVZFUl9VbnJlZ2lzdGVyRHJpdmVyKCBMUENTVFIgbmFtZSApOwogCitleHRlcm4gQk9PTDMyIERJQl9Jbml0KHZvaWQpOworCiBleHRlcm4gRGlzcGxheSAqIGRpc3BsYXk7CiBleHRlcm4gU2NyZWVuICogc2NyZWVuOwogZXh0ZXJuIFdpbmRvdyByb290V2luZG93OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9nbG9iYWwuaCBiL2luY2x1ZGUvZ2xvYmFsLmgKaW5kZXggN2FjYjZhNy4uNWM4Y2M5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9nbG9iYWwuaAorKysgYi9pbmNsdWRlL2dsb2JhbC5oCkBAIC0yOCw2ICsyOCw3IEBACiBleHRlcm4gV09SRCBHbG9iYWxIYW5kbGVUb1NlbCggSEdMT0JBTDE2IGhhbmRsZSApOwogCiAvKiBtZW1vcnkvdmlydHVhbC5jICovCitleHRlcm4gQk9PTDMyIFZJUlRVQUxfSW5pdCggdm9pZCApOwogZXh0ZXJuIERXT1JEIFZJUlRVQUxfR2V0UGFnZVNpemUodm9pZCk7CiBleHRlcm4gRFdPUkQgVklSVFVBTF9HZXRHcmFudWxhcml0eSh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pbnRlcmZhY2VzLmggYi9pbmNsdWRlL2ludGVyZmFjZXMuaAppbmRleCBlOGYyOTkzLi5kYTQyZjE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ludGVyZmFjZXMuaAorKysgYi9pbmNsdWRlL2ludGVyZmFjZXMuaApAQCAtMTA3LDYgKzEwNyw4IEBACiBMUE1BTExPQzMyCUlNYWxsb2MzMl9Db25zdHJ1Y3RvcigpOwogI2VuZGlmCiAKK0hSRVNVTFQgV0lOQVBJIENvR2V0TWFsbG9jMzIoRFdPUkQsIExQTUFMTE9DMzIqKTsKKwogI3VuZGVmIFNURE1FVEhPRAogI3VuZGVmIFNURE1FVEhPRF8KICN1bmRlZiBQVVJFCmRpZmYgLS1naXQgYS9pbmNsdWRlL21haW4uaCBiL2luY2x1ZGUvbWFpbi5oCmluZGV4IGVhM2EyOWMuLmVmM2E5NGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWFpbi5oCisrKyBiL2luY2x1ZGUvbWFpbi5oCkBAIC0xMCw0ICsxMCw3IEBACiBleHRlcm4gQk9PTDMyIE1BSU5fVXNlckluaXQodm9pZCk7CiBleHRlcm4gQk9PTDMyIE1BSU5fV2luZUluaXQoIGludCAqYXJnYywgY2hhciAqYXJndltdICk7CiAKK2V4dGVybiBCT09MMzIgUkVMQVlfSW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkKiBDQUxMMzJfSW5pdCh2b2lkKTsKKwogI2VuZGlmICAvKiBfX1dJTkVfTUFJTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lbnUuaCBiL2luY2x1ZGUvbWVudS5oCmluZGV4IGMyNzBiODQuLjkxOTIxOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVudS5oCisrKyBiL2luY2x1ZGUvbWVudS5oCkBAIC05LDYgKzksNyBAQAogZXh0ZXJuIEhNRU5VMzIgTUVOVV9HZXRTeXNNZW51KEhXTkQzMiBoV25kT3duZXIsIEhNRU5VMzIgaFN5c1BvcHVwKTsKIGV4dGVybiBVSU5UMzIgTUVOVV9HZXRNZW51QmFySGVpZ2h0KCBIV05EMzIgaHduZCwgVUlOVDMyIG1lbnViYXJXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBvcmdYLCBJTlQzMiBvcmdZICk7CitleHRlcm4gQk9PTDMyIE1FTlVfUGF0Y2hSZXNpZGVudFBvcHVwKCBIUVVFVUUxNiwgV05EKiApOwogZXh0ZXJuIHZvaWQgTUVOVV9UcmFja01vdXNlTWVudUJhciggV05EICp3bmQsIElOVDMyIGh0LCBQT0lOVDMyIHB0ICk7CiBleHRlcm4gdm9pZCBNRU5VX1RyYWNrS2JkTWVudUJhciggV05EICp3bmQsIFVJTlQzMiB3UGFyYW0sIElOVDMyIHZrZXkgKTsKIGV4dGVybiBVSU5UMzIgTUVOVV9EcmF3TWVudUJhciggSERDMzIgaERDLCBMUFJFQ1QzMiBscHJlY3QsCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lc3NhZ2UuaCBiL2luY2x1ZGUvbWVzc2FnZS5oCmluZGV4IGVjZjMzYzQuLjY5NDZlNzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVzc2FnZS5oCisrKyBiL2luY2x1ZGUvbWVzc2FnZS5oCkBAIC0zMSw2ICszMSwxMCBAQAogI2RlZmluZSBFVkVOVF9JT19FWENFUFQJCTIKIAogLyogZXZlbnQuYyAqLworZXh0ZXJuIHZvaWQgRVZFTlRfQWRkSU8oIGludCBmZCwgdW5zaWduZWQgZmxhZyApOworZXh0ZXJuIEJPT0wzMiBFVkVOVF9DaGVja0ZvY3VzKCB2b2lkICk7CitleHRlcm4gdm9pZCBFVkVOVF9EZWxldGVJTyggaW50IGZkLCB1bnNpZ25lZCBmbGFnICk7CitleHRlcm4gQk9PTDMyIEVWRU5UX0luaXQoIHZvaWQgKTsKIGV4dGVybiBCT09MMzIgRVZFTlRfV2FpdE5ldEV2ZW50KCBCT09MMzIgc2xlZXAsIEJPT0wzMiBwZWVrICk7CiBleHRlcm4gdm9pZCBFVkVOVF9TeW5jaHJvbml6ZSh2b2lkKTsKIGV4dGVybiB2b2lkIEVWRU5UX1Byb2Nlc3NFdmVudCggWEV2ZW50ICpldmVudCApOwpAQCAtNDAsNCArNDQsNiBAQAogZXh0ZXJuIEhXTkQzMiBFVkVOVF9DYXB0dXJlKCBIV05EMzIsIElOVDE2ICk7CiBleHRlcm4gSU5UMTYgRVZFTlRfR2V0Q2FwdHVyZUluZm8odm9pZCk7CiAKK2V4dGVybiB2b2lkIGpveVNlbmRNZXNzYWdlcyh2b2lkKTsKKwogI2VuZGlmICAvKiBfX1dJTkVfTUVTU0FHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21tc3lzdGVtLmggYi9pbmNsdWRlL21tc3lzdGVtLmgKaW5kZXggZjI5MzE3Ni4uYzIwMTFiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tbXN5c3RlbS5oCisrKyBiL2luY2x1ZGUvbW1zeXN0ZW0uaApAQCAtMjQsMTMgKzI0LDEzIEBACiAKIHR5cGVkZWYgVUlOVDE2CU1NVkVSU0lPTjE2OwogdHlwZWRlZiBVSU5UMzIJTU1WRVJTSU9OMzI7Ci1ERUNMX1dJTkVMSUJfVFlQRShNTVZFUlNJT04pOworREVDTF9XSU5FTElCX1RZUEUoTU1WRVJTSU9OKQogdHlwZWRlZiBVSU5UMTYJTUNJREVWSUNFSUQxNjsKIHR5cGVkZWYgVUlOVDMyCU1DSURFVklDRUlEMzI7Ci1ERUNMX1dJTkVMSUJfVFlQRShNQ0lERVZJQ0VJRCk7CitERUNMX1dJTkVMSUJfVFlQRShNQ0lERVZJQ0VJRCkKIHR5cGVkZWYJVUlOVDE2CU1NUkVTVUxUMTY7CiB0eXBlZGVmCVVJTlQzMglNTVJFU1VMVDMyOwotREVDTF9XSU5FTElCX1RZUEUoTU1SRVNVTFQpOworREVDTF9XSU5FTElCX1RZUEUoTU1SRVNVTFQpCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBVSU5UMTYgICAgd1R5cGU7CQkvKiBpbmRpY2F0ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSB1bmlvbiAqLwpAQCAtNzIsOCArNzIsOCBAQAogCX0gbWlkaTsKICAgICB9IHU7CiB9IE1NVElNRTMyLCAgKkxQTU1USU1FMzI7Ci1ERUNMX1dJTkVMSUJfVFlQRShNTVRJTUUpOwotREVDTF9XSU5FTElCX1RZUEUoTFBNTVRJTUUpOworREVDTF9XSU5FTElCX1RZUEUoTU1USU1FKQorREVDTF9XSU5FTElCX1RZUEUoTFBNTVRJTUUpCiAKICNkZWZpbmUgVElNRV9NUyAgICAgICAgIDB4MDAwMSAgLyogdGltZSBpbiBtaWxsaXNlY29uZHMgKi8KICNkZWZpbmUgVElNRV9TQU1QTEVTICAgIDB4MDAwMiAgLyogbnVtYmVyIG9mIHdhdmUgc2FtcGxlcyAqLwpAQCAtMjYxLDggKzI2MSw4IEBACiAgICAgV09SRAl3UmVzZXJ2ZWQxOwkJLyogcGFkZGluZyAqLwogICAgIERXT1JECWR3U3VwcG9ydDsJCS8qIGZ1bmN0aW9uYWxpdHkgc3VwcG9ydGVkIGJ5IGRyaXZlciAqLwogfSBXQVZFT1VUQ0FQUzMyVywgKkxQV0FWRU9VVENBUFMzMlc7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhXQVZFT1VUQ0FQUyk7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhMUFdBVkVPVVRDQVBTKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKFdBVkVPVVRDQVBTKQorREVDTF9XSU5FTElCX1RZUEVfQVcoTFBXQVZFT1VUQ0FQUykKIAogI2RlZmluZSBXQVZFQ0FQU19QSVRDSCAgICAgICAgICAweDAwMDEgICAvKiBzdXBwb3J0cyBwaXRjaCBjb250cm9sICovCiAjZGVmaW5lIFdBVkVDQVBTX1BMQVlCQUNLUkFURSAgIDB4MDAwMiAgIC8qIHN1cHBvcnRzIHBsYXliYWNrIHJhdGUgY29udHJvbCAqLwpAQCAtMjk3LDggKzI5Nyw4IEBACiAgICAgV09SRAl3Q2hhbm5lbHM7CQkvKiBudW1iZXIgb2YgY2hhbm5lbHMgc3VwcG9ydGVkICovCiAgICAgV09SRAl3UmVzZXJ2ZWQxOwogfSBXQVZFSU5DQVBTMzJXLCAqTFBXQVZFSU5DQVBTMzJXOwotREVDTF9XSU5FTElCX1RZUEVfQVcoV0FWRUlOQ0FQUyk7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhMUFdBVkVJTkNBUFMpOworREVDTF9XSU5FTElCX1RZUEVfQVcoV0FWRUlOQ0FQUykKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQV0FWRUlOQ0FQUykKIAogI2RlZmluZSBXQVZFX0lOVkFMSURGT1JNQVQgICAgIDB4MDAwMDAwMDAgICAgICAgLyogaW52YWxpZCBmb3JtYXQgKi8KICNkZWZpbmUgV0FWRV9GT1JNQVRfMU0wOCAgICAgICAweDAwMDAwMDAxICAgICAgIC8qIDExLjAyNSBrSHosIE1vbm8sICAgOC1iaXQgICovCkBAIC01MzAsOCArNTMwLDggQEAKICAgICBEV09SRAlkd1N1cHBvcnQ7CS8qIGZ1bmN0aW9uYWxpdHkgc3VwcG9ydGVkIGJ5IGRyaXZlciAqLwogfSBNSURJT1VUQ0FQUzMyVywgKkxQTUlESU9VVENBUFMzMlc7CiAKLURFQ0xfV0lORUxJQl9UWVBFX0FXKE1JRElPVVRDQVBTKTsKLURFQ0xfV0lORUxJQl9UWVBFX0FXKExQTUlESU9VVENBUFMpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTUlESU9VVENBUFMpCitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUE1JRElPVVRDQVBTKQogCiAjZGVmaW5lIE1PRF9NSURJUE9SVCAgICAxICAvKiBvdXRwdXQgcG9ydCAqLwogI2RlZmluZSBNT0RfU1lOVEggICAgICAgMiAgLyogZ2VuZXJpYyBpbnRlcm5hbCBzeW50aCAqLwpAQCAtNTY3LDggKzU2Nyw4IEBACiAgICAgRFdPUkQJZHdTdXBwb3J0OwkvKiBpbmNsdWRlZCBpbiB3aW45NSBhbmQgaGlnaGVyICovCiB9IE1JRElJTkNBUFMzMlcsICpMUE1JRElJTkNBUFMzMlc7CiAKLURFQ0xfV0lORUxJQl9UWVBFX0FXKE1JRElJTkNBUFMpOwotREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNSURJSU5DQVBTKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKE1JRElJTkNBUFMpCitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUE1JRElJTkNBUFMpCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBMUFNUUglscERhdGE7CQkvKiBwb2ludGVyIHRvIGxvY2tlZCBkYXRhIGJsb2NrICovCkBAIC03NDEsNyArNzQxLDcgQEAKIAogdHlwZWRlZiB2b2lkIChDQUxMQkFDSyAqTFBUSU1FQ0FMTEJBQ0sxNikoVUlOVDE2IHVUaW1lcklELCBVSU5UMTYgdU1lc3NhZ2UsIERXT1JEIGR3VXNlciwgRFdPUkQgZHcxLCBEV09SRCBkdzIpOwogdHlwZWRlZiB2b2lkIChDQUxMQkFDSyAqTFBUSU1FQ0FMTEJBQ0szMikoVUlOVDMyIHVUaW1lcklELCBVSU5UMzIgdU1lc3NhZ2UsIERXT1JEIGR3VXNlciwgRFdPUkQgZHcxLCBEV09SRCBkdzIpOwotREVDTF9XSU5FTElCX1RZUEUoTFBUSU1FQ0FMTEJBQ0spOworREVDTF9XSU5FTElCX1RZUEUoTFBUSU1FQ0FMTEJBQ0spCiAKICNkZWZpbmUgVElNRV9PTkVTSE9UICAgIDAgICAvKiBwcm9ncmFtIHRpbWVyIGZvciBzaW5nbGUgZXZlbnQgKi8KICNkZWZpbmUgVElNRV9QRVJJT0RJQyAgIDEgICAvKiBwcm9ncmFtIGZvciBjb250aW51b3VzIHBlcmlvZGljIGV2ZW50ICovCkBAIC03NTYsOCArNzU2LDggQEAKICAgICBVSU5UMzIJd1BlcmlvZE1heDsKIH0gVElNRUNBUFMzMiwgKkxQVElNRUNBUFMzMjsKIAotREVDTF9XSU5FTElCX1RZUEUoVElNRUNBUFMpOwotREVDTF9XSU5FTElCX1RZUEUoTFBUSU1FQ0FQUyk7CitERUNMX1dJTkVMSUJfVFlQRShUSU1FQ0FQUykKK0RFQ0xfV0lORUxJQl9UWVBFKExQVElNRUNBUFMpCiAKIE1NUkVTVUxUMTYgV0lOQVBJIHRpbWVHZXRTeXN0ZW1UaW1lMTYoTFBNTVRJTUUxNixVSU5UMTYpOwogTU1SRVNVTFQzMiBXSU5BUEkgdGltZUdldFN5c3RlbVRpbWUzMihMUE1NVElNRTMyLFVJTlQzMik7CkBAIC05MjIsOCArOTIyLDggQEAKICAgICBXQ0hBUiBzelJlZ0tleVtNQVhQTkFNRUxFTl07CiAgICAgV0NIQVIgc3pPRU1WeERbTUFYX0pPWVNUSUNLT0VNVlhETkFNRV07CiB9IEpPWUNBUFMzMlcsICpMUEpPWUNBUFMzMlc7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhKT1lDQVBTKTsKLURFQ0xfV0lORUxJQl9UWVBFX0FXKExQSk9ZQ0FQUyk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhKT1lDQVBTKQorREVDTF9XSU5FTElCX1RZUEVfQVcoTFBKT1lDQVBTKQogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgVUlOVDE2IHdYcG9zOyAgICAgICAgICAgICAgICAgLyogeCBwb3NpdGlvbiAqLwpAQCAtOTU1LDggKzk1NSw4IEBACiAgICAgRFdPUkQJZHdSZXNlcnZlZDI7CS8qIHJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCiB9IEpPWUlORk9FWCwqTFBKT1lJTkZPRVg7CiAKLURFQ0xfV0lORUxJQl9UWVBFKEpPWUlORk8pOwotREVDTF9XSU5FTElCX1RZUEUoTFBKT1lJTkZPKTsKK0RFQ0xfV0lORUxJQl9UWVBFKEpPWUlORk8pCitERUNMX1dJTkVMSUJfVFlQRShMUEpPWUlORk8pCiAKIE1NUkVTVUxUMTYgV0lOQVBJIGpveUdldERldkNhcHMxNiAoVUlOVDE2LExQSk9ZQ0FQUzE2ICxVSU5UMTYpOwogTU1SRVNVTFQzMiBXSU5BUEkgam95R2V0RGV2Q2FwczMyQShVSU5UMzIsTFBKT1lDQVBTMzJBLFVJTlQzMik7CkBAIC0xMDA5LDggKzEwMDksOCBAQAogCURXT1JECQljRGVzdGluYXRpb25zOwogfSBNSVhFUkNBUFMzMlcsKkxQTUlYRVJDQVBTMzJXOwogCi1ERUNMX1dJTkVMSUJfVFlQRV9BVyhNSVhFUkNBUFMpOwotREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNSVhFUkNBUFMpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTUlYRVJDQVBTKQorREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNSVhFUkNBUFMpCiAKICNkZWZpbmUgTUlYRVJfU0hPUlRfTkFNRV9DSEFSUwkxNgogI2RlZmluZSBNSVhFUl9MT05HX05BTUVfQ0hBUlMJNjQKQEAgLTExMjUsOCArMTEyNSw4IEBACiAgICAgfSBUYXJnZXQ7CiB9IE1JWEVSTElORTMyVywgKkxQTUlYRVJMSU5FMzJXOwogCi1ERUNMX1dJTkVMSUJfVFlQRV9BVyhNSVhFUkxJTkUpOwotREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNSVhFUkxJTkUpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTUlYRVJMSU5FKQorREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNSVhFUkxJTkUpCiAKIC8qICBNSVhFUkNPTlRST0wuZmR3Q29udHJvbCAqLwogI2RlZmluZQlNSVhFUkNPTlRST0xfQ09OVFJPTEZfVU5JRk9STQkweDAwMDAwMDAxTApAQCAtMTI3Niw4ICsxMjc2LDggQEAKICAgICB9IE1ldHJpY3M7CiB9IE1JWEVSQ09OVFJPTDMyVywgKkxQTUlYRVJDT05UUk9MMzJXOwogCi1ERUNMX1dJTkVMSUJfVFlQRV9BVyhNSVhFUkNPTlRST0wpOwotREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNSVhFUkNPTlRST0wpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTUlYRVJDT05UUk9MKQorREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNSVhFUkNPTlRST0wpCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBEV09SRAljYlN0cnVjdDsJLyogc2l6ZSBpbiBieXRlcyBvZiBNSVhFUkxJTkVDT05UUk9MUyAqLwpAQCAtMTMxNSw4ICsxMzE1LDggQEAKICAgICBMUE1JWEVSQ09OVFJPTDMyVwlwYW14Y3RybDsKIH0gTUlYRVJMSU5FQ09OVFJPTFMzMlcsICpMUE1JWEVSTElORUNPTlRST0xTMzJXOwogCi1ERUNMX1dJTkVMSUJfVFlQRV9BVyhNSVhFUkxJTkVDT05UUk9MUyk7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhMUE1JWEVSTElORUNPTlRST0xTKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKE1JWEVSTElORUNPTlRST0xTKQorREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNSVhFUkxJTkVDT05UUk9MUykKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIERXT1JECWNiU3RydWN0OwkvKiBzaXplIGluIGJ5dGVzIG9mIE1JWEVSQ09OVFJPTERFVEFJTFMgKi8KQEAgLTEzNDIsOCArMTM0Miw4IEBACiAgICAgTFBWT0lECXBhRGV0YWlsczsKIH0gTUlYRVJDT05UUk9MREVUQUlMUzMyLCpMUE1JWEVSQ09OVFJPTERFVEFJTFMzMjsKIAotREVDTF9XSU5FTElCX1RZUEUoTUlYRVJDT05UUk9MREVUQUlMUyk7Ci1ERUNMX1dJTkVMSUJfVFlQRShMUE1JWEVSQ09OVFJPTERFVEFJTFMpOworREVDTF9XSU5FTElCX1RZUEUoTUlYRVJDT05UUk9MREVUQUlMUykKK0RFQ0xfV0lORUxJQl9UWVBFKExQTUlYRVJDT05UUk9MREVUQUlMUykKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIERXT1JECWR3UGFyYW0xOwpAQCAtMTM2Myw4ICsxMzYzLDggQEAKICAgICBXQ0hBUglzek5hbWVbTUlYRVJfTE9OR19OQU1FX0NIQVJTXTsKIH0gTUlYRVJDT05UUk9MREVUQUlMU19MSVNUVEVYVDMyVywqTFBNSVhFUkNPTlRST0xERVRBSUxTX0xJU1RURVhUMzJXOwogCi1ERUNMX1dJTkVMSUJfVFlQRV9BVyhNSVhFUkNPTlRST0xERVRBSUxTX0xJU1RURVhUKTsKLURFQ0xfV0lORUxJQl9UWVBFX0FXKExQTUlYRVJDT05UUk9MREVUQUlMU19MSVNUVEVYVCk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhNSVhFUkNPTlRST0xERVRBSUxTX0xJU1RURVhUKQorREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNSVhFUkNPTlRST0xERVRBSUxTX0xJU1RURVhUKQogCiAvKiAgTUlYRVJfR0VUQ09OVFJPTERFVEFJTFNGX1ZBTFVFICovCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0xNDU4LDcgKzE0NTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIpOwogdHlwZWRlZiBMT05HIChDQUxMQkFDSyAqTFBNTUlPUFJPQzMyKShMUFNUUiBscG1taW9pbmZvLCBVSU5UMzIgdU1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMik7Ci1ERUNMX1dJTkVMSUJfVFlQRShMUE1NSU9QUk9DKTsKK0RFQ0xfV0lORUxJQl9UWVBFKExQTU1JT1BST0MpCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgRFdPUkQJCWR3RmxhZ3M7CS8qIGdlbmVyYWwgc3RhdHVzIGZsYWdzICovCkBAIC0xOTE2LDggKzE5MTYsOCBAQAogCUxQV1NUUgkJbHBzdHJBbGlhczsKIH0gTUNJX09QRU5fUEFSTVMzMlcsICpMUE1DSV9PUEVOX1BBUk1TMzJXOwogCi1ERUNMX1dJTkVMSUJfVFlQRV9BVyhNQ0lfT1BFTl9QQVJNUyk7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhMUE1DSV9PUEVOX1BBUk1TKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKE1DSV9PUEVOX1BBUk1TKQorREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNQ0lfT1BFTl9QQVJNUykKIAogdHlwZWRlZiBzdHJ1Y3QgewogCURXT1JEICAgZHdDYWxsYmFjazsKQEAgLTE5NTUsOCArMTk1NSw4IEBACiAJRFdPUkQgICBkd1JldFNpemU7CiB9IE1DSV9JTkZPX1BBUk1TMzJXLCAqTFBNQ0lfSU5GT19QQVJNUzMyVzsKIAotREVDTF9XSU5FTElCX1RZUEVfQVcoTUNJX0lORk9fUEFSTVMpOwotREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNQ0lfSU5GT19QQVJNUyk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhNQ0lfSU5GT19QQVJNUykKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQTUNJX0lORk9fUEFSTVMpCiAKIHR5cGVkZWYgc3RydWN0IHsKIAlEV09SRCAgIGR3Q2FsbGJhY2s7CkBAIC0xOTg5LDggKzE5ODksOCBAQAogCVVJTlQzMgl3RGV2aWNlVHlwZTsKIH0gTUNJX1NZU0lORk9fUEFSTVMzMlcsICpMUE1DSV9TWVNJTkZPX1BBUk1TMzJXOwogCi1ERUNMX1dJTkVMSUJfVFlQRV9BVyhNQ0lfU1lTSU5GT19QQVJNUyk7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhMUE1DSV9TWVNJTkZPX1BBUk1TKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKE1DSV9TWVNJTkZPX1BBUk1TKQorREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNQ0lfU1lTSU5GT19QQVJNUykKIAogdHlwZWRlZiBzdHJ1Y3QgewogCURXT1JEICAgZHdDYWxsYmFjazsKQEAgLTIwMTIsOCArMjAxMiw4IEBACiAJSFdORDMyCWh3bmRCcmVhazsKIH0gTUNJX0JSRUFLX1BBUk1TMzIsICpMUE1DSV9CUkVBS19QQVJNUzMyOwogCi1ERUNMX1dJTkVMSUJfVFlQRShNQ0lfQlJFQUtfUEFSTVMpOwotREVDTF9XSU5FTElCX1RZUEUoTFBNQ0lfQlJFQUtfUEFSTVMpOworREVDTF9XSU5FTElCX1RZUEUoTUNJX0JSRUFLX1BBUk1TKQorREVDTF9XSU5FTElCX1RZUEUoTFBNQ0lfQlJFQUtfUEFSTVMpCiAKIHR5cGVkZWYgc3RydWN0IHsKIAlEV09SRCAgIGR3Q2FsbGJhY2s7CkBAIC0yMDQwLDggKzIwNDAsOCBAQAogCUxQQ1dTVFIJbHBmaWxlbmFtZTsKIH0gTUNJX0xPQURfUEFSTVMzMlcsICpMUE1DSV9MT0FEX1BBUk1TMzJXOwogCi1ERUNMX1dJTkVMSUJfVFlQRV9BVyhNQ0lfTE9BRF9QQVJNUyk7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhMUE1DSV9MT0FEX1BBUk1TKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKE1DSV9MT0FEX1BBUk1TKQorREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNQ0lfTE9BRF9QQVJNUykKIAogdHlwZWRlZiBzdHJ1Y3QgewogCURXT1JEICAgZHdDYWxsYmFjazsKQEAgLTIxMTQsOCArMjExNCw4IEBACiAJTFBDV1NUUglscHN0ckNvbW1hbmQ7CiB9IE1DSV9WRF9FU0NBUEVfUEFSTVMzMlcsICpMUE1DSV9WRF9FU0NBUEVfUEFSTVMzMlc7CiAKLURFQ0xfV0lORUxJQl9UWVBFX0FXKE1DSV9WRF9FU0NBUEVfUEFSTVMpOwotREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNQ0lfVkRfRVNDQVBFX1BBUk1TKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKE1DSV9WRF9FU0NBUEVfUEFSTVMpCitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUE1DSV9WRF9FU0NBUEVfUEFSTVMpCiAKICNkZWZpbmUgTUNJX1dBVkVfT1BFTl9CVUZGRVIgICAgICAgICAgICAweDAwMDEwMDAwTAogCkBAIC0yMTcxLDggKzIxNzEsOCBAQAogCURXT1JEICAgCWR3QnVmZmVyU2Vjb25kczsKIH0gTUNJX1dBVkVfT1BFTl9QQVJNUzMyVywgKkxQTUNJX1dBVkVfT1BFTl9QQVJNUzMyVzsKIAotREVDTF9XSU5FTElCX1RZUEVfQVcoTUNJX1dBVkVfT1BFTl9QQVJNUyk7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhMUE1DSV9XQVZFX09QRU5fUEFSTVMpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTUNJX1dBVkVfT1BFTl9QQVJNUykKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQTUNJX1dBVkVfT1BFTl9QQVJNUykKIAogdHlwZWRlZiBzdHJ1Y3QgewogCURXT1JEICAgZHdDYWxsYmFjazsKQEAgLTIyMTQsOCArMjIxNCw4IEBACiAJVUlOVDMyCXdCaXRzUGVyU2FtcGxlOwogfSBNQ0lfV0FWRV9TRVRfUEFSTVMzMiwgKiBMUE1DSV9XQVZFX1NFVF9QQVJNUzMyOwogCi1ERUNMX1dJTkVMSUJfVFlQRShNQ0lfV0FWRV9TRVRfUEFSTVMpOwotREVDTF9XSU5FTElCX1RZUEUoTFBNQ0lfV0FWRV9TRVRfUEFSTVMpOworREVDTF9XSU5FTElCX1RZUEUoTUNJX1dBVkVfU0VUX1BBUk1TKQorREVDTF9XSU5FTElCX1RZUEUoTFBNQ0lfV0FWRV9TRVRfUEFSTVMpCiAKICNkZWZpbmUgICAgIE1DSV9TRVFfRElWX1BQUU4gICAgICAgICAgICAoMCArIE1DSV9TRVFfT0ZGU0VUKQogI2RlZmluZSAgICAgTUNJX1NFUV9ESVZfU01QVEVfMjQgICAgICAgICgxICsgTUNJX1NFUV9PRkZTRVQpCkBAIC0yMzM0LDggKzIzMzQsOCBAQAogCUhXTkQzMgkJaFduZFBhcmVudDsKIH0gTUNJX0FOSU1fT1BFTl9QQVJNUzMyVywgKkxQTUNJX0FOSU1fT1BFTl9QQVJNUzMyVzsKIAotREVDTF9XSU5FTElCX1RZUEVfQVcoTUNJX0FOSU1fT1BFTl9QQVJNUyk7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhMUE1DSV9BTklNX09QRU5fUEFSTVMpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTUNJX0FOSU1fT1BFTl9QQVJNUykKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQTUNJX0FOSU1fT1BFTl9QQVJNUykKIAogdHlwZWRlZiBzdHJ1Y3QgewogCURXT1JEICAgZHdDYWxsYmFjazsKQEAgLTIzNzIsOCArMjM3Miw4IEBACiAJTFBDV1NUUglscHN0clRleHQ7CiB9IE1DSV9BTklNX1dJTkRPV19QQVJNUzMyVywgKkxQTUNJX0FOSU1fV0lORE9XX1BBUk1TMzJXOwogCi1ERUNMX1dJTkVMSUJfVFlQRV9BVyhNQ0lfQU5JTV9XSU5ET1dfUEFSTVMpOwotREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNQ0lfQU5JTV9XSU5ET1dfUEFSTVMpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTUNJX0FOSU1fV0lORE9XX1BBUk1TKQorREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNQ0lfQU5JTV9XSU5ET1dfUEFSTVMpCiAKIHR5cGVkZWYgc3RydWN0IHsKIAlEV09SRCAgIGR3Q2FsbGJhY2s7CkBAIC0yMzk1LDggKzIzOTUsOCBAQAogI2VuZGlmICAvKiBpZmRlZiBNQ0lfVVNFX09GRkVYVCAqLwogfSBNQ0lfQU5JTV9SRUNUX1BBUk1TMzIsICpMUE1DSV9BTklNX1JFQ1RfUEFSTVMzMjsKIAotREVDTF9XSU5FTElCX1RZUEUoTUNJX0FOSU1fUkVDVF9QQVJNUyk7Ci1ERUNMX1dJTkVMSUJfVFlQRShMUE1DSV9BTklNX1JFQ1RfUEFSTVMpOworREVDTF9XSU5FTElCX1RZUEUoTUNJX0FOSU1fUkVDVF9QQVJNUykKK0RFQ0xfV0lORUxJQl9UWVBFKExQTUNJX0FOSU1fUkVDVF9QQVJNUykKIAogdHlwZWRlZiBzdHJ1Y3QgewogCURXT1JEICAgZHdDYWxsYmFjazsKQEAgLTI0MTAsOCArMjQxMCw4IEBACiAJSERDMzIgICBoREM7CiB9IE1DSV9BTklNX1VQREFURV9QQVJNUzMyLCAqTFBNQ0lfQU5JTV9VUERBVEVfUEFSTVMzMjsKIAotREVDTF9XSU5FTElCX1RZUEUoTUNJX0FOSU1fVVBEQVRFX1BBUk1TKTsKLURFQ0xfV0lORUxJQl9UWVBFKExQTUNJX0FOSU1fVVBEQVRFX1BBUk1TKTsKK0RFQ0xfV0lORUxJQl9UWVBFKE1DSV9BTklNX1VQREFURV9QQVJNUykKK0RFQ0xfV0lORUxJQl9UWVBFKExQTUNJX0FOSU1fVVBEQVRFX1BBUk1TKQogCiAjZGVmaW5lIE1DSV9PVkxZX09QRU5fV1MgICAgICAgICAgICAgICAgMHgwMDAxMDAwMEwKICNkZWZpbmUgTUNJX09WTFlfT1BFTl9QQVJFTlQgICAgICAgICAgICAweDAwMDIwMDAwTApAQCAtMjQ3Niw4ICsyNDc2LDggQEAKIAlIV05EMzIJCWhXbmRQYXJlbnQ7CiB9IE1DSV9PVkxZX09QRU5fUEFSTVMzMlcsICpMUE1DSV9PVkxZX09QRU5fUEFSTVMzMlc7CiAKLURFQ0xfV0lORUxJQl9UWVBFX0FXKE1DSV9PVkxZX09QRU5fUEFSTVMpOwotREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNQ0lfT1ZMWV9PUEVOX1BBUk1TKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKE1DSV9PVkxZX09QRU5fUEFSTVMpCitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUE1DSV9PVkxZX09QRU5fUEFSTVMpCiAKIHR5cGVkZWYgc3RydWN0IHsKIAlEV09SRAlkd0NhbGxiYWNrOwpAQCAtMjUwMiw4ICsyNTAyLDggQEAKIAlMUENXU1RSCWxwc3RyVGV4dDsKIH0gTUNJX09WTFlfV0lORE9XX1BBUk1TMzJXLCAqTFBNQ0lfT1ZMWV9XSU5ET1dfUEFSTVMzMlc7CiAKLURFQ0xfV0lORUxJQl9UWVBFX0FXKE1DSV9PVkxZX1dJTkRPV19QQVJNUyk7Ci1ERUNMX1dJTkVMSUJfVFlQRV9BVyhMUE1DSV9PVkxZX1dJTkRPV19QQVJNUyk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhNQ0lfT1ZMWV9XSU5ET1dfUEFSTVMpCitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUE1DSV9PVkxZX1dJTkRPV19QQVJNUykKIAogdHlwZWRlZiBzdHJ1Y3QgewogCURXT1JEICAgZHdDYWxsYmFjazsKQEAgLTI1MjUsOCArMjUyNSw4IEBACiAjZW5kaWYgIC8qIGlmZGVmIE1DSV9VU0VfT0ZGRVhUICovCiB9IE1DSV9PVkxZX1JFQ1RfUEFSTVMzMiwgKkxQTUNJX09WTFlfUkVDVF9QQVJNUzMyOwogCi1ERUNMX1dJTkVMSUJfVFlQRShNQ0lfT1ZMWV9SRUNUX1BBUk1TKTsKLURFQ0xfV0lORUxJQl9UWVBFKExQTUNJX09WTFlfUkVDVF9QQVJNUyk7CitERUNMX1dJTkVMSUJfVFlQRShNQ0lfT1ZMWV9SRUNUX1BBUk1TKQorREVDTF9XSU5FTElCX1RZUEUoTFBNQ0lfT1ZMWV9SRUNUX1BBUk1TKQogCiB0eXBlZGVmIHN0cnVjdCB7CiAJRFdPUkQgICBkd0NhbGxiYWNrOwpAQCAtMjU0Niw4ICsyNTQ2LDggQEAKIAlSRUNUMzIgIHJjOwogfSBNQ0lfT1ZMWV9TQVZFX1BBUk1TMzJXLCAqTFBNQ0lfT1ZMWV9TQVZFX1BBUk1TMzJXOwogCi1ERUNMX1dJTkVMSUJfVFlQRV9BVyhNQ0lfT1ZMWV9TQVZFX1BBUk1TKTsKLURFQ0xfV0lORUxJQl9UWVBFX0FXKExQTUNJX09WTFlfU0FWRV9QQVJNUyk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhNQ0lfT1ZMWV9TQVZFX1BBUk1TKQorREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNQ0lfT1ZMWV9TQVZFX1BBUk1TKQogCiB0eXBlZGVmIHN0cnVjdCB7CiAJRFdPUkQJZHdDYWxsYmFjazsKQEAgLTI1NjcsOCArMjU2Nyw4IEBACiAJUkVDVDMyCXJjOwogfSBNQ0lfT1ZMWV9MT0FEX1BBUk1TMzJXLCAqTFBNQ0lfT1ZMWV9MT0FEX1BBUk1TMzJXOwogCi1ERUNMX1dJTkVMSUJfVFlQRV9BVyhNQ0lfT1ZMWV9MT0FEX1BBUk1TKTsKLURFQ0xfV0lORUxJQl9UWVBFX0FXKExQTUNJX09WTFlfTE9BRF9QQVJNUyk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhNQ0lfT1ZMWV9MT0FEX1BBUk1TKQorREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNQ0lfT1ZMWV9MT0FEX1BBUk1TKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJTGludXggTU1TWVNURU0gSW50ZXJuYWxzICYgU2FtcGxlIEF1ZGlvIERyaXZlcnMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbW9kdWxlLmggYi9pbmNsdWRlL21vZHVsZS5oCmluZGV4IGI5OThiNmYuLmMwYmIyNzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbW9kdWxlLmgKKysrIGIvaW5jbHVkZS9tb2R1bGUuaApAQCAtNjUsNiArNjUsOCBAQAogCiAgIC8qIFNlbGYtbG9hZGluZyBtb2R1bGVzIGNvbnRhaW4gdGhpcyBzdHJ1Y3R1cmUgaW4gdGhlaXIgZmlyc3Qgc2VnbWVudCAqLwogCisjcHJhZ21hIHBhY2soMSkKKwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBXT1JEICAgICAgdmVyc2lvbjsgICAgICAgLyogTXVzdCBiZSAweEEwICovCkBAIC04MCw4ICs4Miw2IEBACiAgICAgRkFSUFJPQzE2IFNldE93bmVyOyAgICAgIC8qIFNldCBPd25lciBwcm9jZWR1cmUsIGV4cG9ydGVkIGJ5IHdpbmUgKi8KIH0gU0VMRkxPQURIRUFERVI7CiAKLSNwcmFnbWEgcGFjaygxKQotCiAgIC8qIFBhcmFtZXRlcnMgZm9yIExvYWRNb2R1bGUoKSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTEwMiw3ICsxMDIsNyBAQAogI3ByYWdtYSBwYWNrKDQpCiAKIC8qIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIDMyYml0IG1vZHVsZXMuIHBlciBwcm9jZXNzLiAqLwotdHlwZWRlZiBlbnVtIHsgTU9EVUxFMzJfUEU9MSwgTU9EVUxFMzJfRUxGLCAvKiAuLi4gKi8gfSBNT0RVTEUzMl9UWVBFOwordHlwZWRlZiBlbnVtIHsgTU9EVUxFMzJfUEU9MSwgTU9EVUxFMzJfRUxGIC8qICwuLi4gKi8gfSBNT0RVTEUzMl9UWVBFOwogdHlwZWRlZiBzdHJ1Y3QgX3dpbmVfbW9kcmVmCiB7CiAJc3RydWN0IF93aW5lX21vZHJlZgkqbmV4dDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXVsdGltZWRpYS5oIGIvaW5jbHVkZS9tdWx0aW1lZGlhLmgKaW5kZXggY2I3MGQ1Yy4uZDJkY2M5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tdWx0aW1lZGlhLmgKKysrIGIvaW5jbHVkZS9tdWx0aW1lZGlhLmgKQEAgLTczLDQgKzczLDggQEAKIAlITE9DQUwxNgloTWlkaUhkcjsKIAlXT1JECWR3U3RhdHVzOwogfSBMSU5VWF9NQ0lNSURJOworCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCitleHRlcm4gQk9PTDMyIE1VTFRJTUVESUFfSW5pdCggdm9pZCApOworCiAjZW5kaWYgLyogX19XSU5FX01VTFRJTUVESUFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vbGUuaCBiL2luY2x1ZGUvb2xlLmgKaW5kZXggNDJiYTcxMS4uYzIxZjA2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9vbGUuaAorKysgYi9pbmNsdWRlL29sZS5oCkBAIC0xNywxMSArMTcsMTEgQEAKIHR5cGVkZWYgQlNUUjMyCQkqTFBCU1RSMzI7CiB0eXBlZGVmIExQV1NUUgkJTFBPTEVTVFIzMjsKIHR5cGVkZWYgTFBDV1NUUgkJTFBDT0xFU1RSMzI7Ci1ERUNMX1dJTkVMSUJfVFlQRShPTEVDSEFSKTsKLURFQ0xfV0lORUxJQl9UWVBFKExQT0xFU1RSKTsKLURFQ0xfV0lORUxJQl9UWVBFKExQQ09MRVNUUik7Ci1ERUNMX1dJTkVMSUJfVFlQRShCU1RSKTsKLURFQ0xfV0lORUxJQl9UWVBFKExQQlNUUik7CitERUNMX1dJTkVMSUJfVFlQRShPTEVDSEFSKQorREVDTF9XSU5FTElCX1RZUEUoTFBPTEVTVFIpCitERUNMX1dJTkVMSUJfVFlQRShMUENPTEVTVFIpCitERUNMX1dJTkVMSUJfVFlQRShCU1RSKQorREVDTF9XSU5FTElCX1RZUEUoTFBCU1RSKQogCiAjZGVmaW5lIE9MRVNUUjE2KHgpIHgKICNkZWZpbmUgT0xFU1RSMzIoeCkgTCMjeAkvKiBwcm9iYWJseSB3cm9uZyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcm9jZXNzLmggYi9pbmNsdWRlL3Byb2Nlc3MuaAppbmRleCBkYmRmYmYzLi5lNjY5YzJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Byb2Nlc3MuaAorKysgYi9pbmNsdWRlL3Byb2Nlc3MuaApAQCAtMTMwLDYgKzEzMCw3IEBACiBleHRlcm4gdm9pZCBIQU5ETEVfQ2xvc2VBbGwoIFBEQjMyICpwZGIsIEszMk9CSiAqcHRyICk7CiAKIC8qIHNjaGVkdWxlci9wcm9jZXNzLmMgKi8KK2V4dGVybiBCT09MMzIgUFJPQ0VTU19Jbml0KCB2b2lkICk7CiBleHRlcm4gUERCMzIgKlBST0NFU1NfQ3VycmVudCh2b2lkKTsKIGV4dGVybiBQREIzMiAqUFJPQ0VTU19HZXRQdHIoIEhBTkRMRTMyIGhhbmRsZSwgRFdPUkQgYWNjZXNzICk7CiBleHRlcm4gUERCMzIgKlBST0NFU1NfSWRUb1BEQiggRFdPUkQgaWQgKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcXVldWUuaCBiL2luY2x1ZGUvcXVldWUuaAppbmRleCAxNDM1NGVjLi4zODEzNmM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3F1ZXVlLmgKKysrIGIvaW5jbHVkZS9xdWV1ZS5oCkBAIC05NSw2ICs5NSw3IEBACiBleHRlcm4gaW50IFFVRVVFX0ZpbmRNc2coIE1FU1NBR0VRVUVVRSAqIG1zZ1F1ZXVlLCBIV05EMzIgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpcnN0LCBpbnQgbGFzdCApOwogZXh0ZXJuIHZvaWQgUVVFVUVfUmVtb3ZlTXNnKCBNRVNTQUdFUVVFVUUgKiBtc2dRdWV1ZSwgaW50IHBvcyApOworZXh0ZXJuIHZvaWQgUVVFVUVfRmx1c2hNZXNzYWdlcyhIUVVFVUUxNik7CiBleHRlcm4gdm9pZCBoYXJkd2FyZV9ldmVudCggV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0sCiAJCQkgICAgaW50IHhQb3MsIGludCB5UG9zLCBEV09SRCB0aW1lLCBEV09SRCBleHRyYUluZm8gKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZXNvdXJjZS5oIGIvaW5jbHVkZS9yZXNvdXJjZS5oCmluZGV4IDBjODk5MDYuLjQzMDc2M2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcmVzb3VyY2UuaAorKysgYi9pbmNsdWRlL3Jlc291cmNlLmgKQEAgLTksMTQgKzksMjQgQEAKIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKIAotc3RydWN0IHJlc291cmNlCi17Ci0gICAgaW50IGlkOwotICAgIGludCB0eXBlOwotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciogYnl0ZXM7Ci0gICAgdW5zaWduZWQgc2l6ZTsKLX07CisjaWZuZGVmIF9fV1JDX1JTQ19ICisjaW5jbHVkZSAid3JjX3JzYy5oIgorI2VuZGlmCisKKy8qCisgKiBCUzogSSBjb21tZW50IHRoaXMgb3V0IHRvIGNhdGNoIGFsbCBvY2N1cmVuY2VzCisgKiBvZiByZWZlcmVuY2UgdG8gdGhpcyBzdHJ1Y3R1cmUgd2hpY2ggaXMgbm93CisgKiByZW5kZXJlZCBvYnNvbGV0ZS4KKyAqCisgKiBzdHJ1Y3QgcmVzb3VyY2UKKyAqIHsKKyAqICAgICBpbnQgaWQ7CisgKiAgICAgaW50IHR5cGU7CisgKiAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAqICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBieXRlczsKKyAqICAgICB1bnNpZ25lZCBzaXplOworICogfTsKKyAqLwogCiAvKiBCdWlsdC1pbiByZXNvdXJjZXMgKi8KIHR5cGVkZWYgZW51bQpAQCAtMzUsNyArNDUsNyBAQAogICAgIFNZU1JFU19ESUFMT0dfUkVQTEFDRV9URVhUCiB9IFNZU1RFTV9SRVNPVVJDRTsKIAotZXh0ZXJuIHZvaWQgTElCUkVTX1JlZ2lzdGVyUmVzb3VyY2VzKGNvbnN0IHN0cnVjdCByZXNvdXJjZSogY29uc3QgKiBSZXMpOworZXh0ZXJuIHZvaWQgTElCUkVTX1JlZ2lzdGVyUmVzb3VyY2VzKGNvbnN0IHdyY19yZXNvdXJjZTMyX3QgKiBjb25zdCAqIFJlcyk7CiAKICNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPT0gMikgJiYgKF9fR05VQ19NSU5PUl9fID49IDcpCiAjZGVmaW5lIFdJTkVfQ09OU1RSVUNUT1IgIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2hlbGwuaCBiL2luY2x1ZGUvc2hlbGwuaAppbmRleCBlZTBiYTM2Li4yN2JiNzk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NoZWxsLmgKKysrIGIvaW5jbHVkZS9zaGVsbC5oCkBAIC01OCw3ICs1OCw3IEBACiAJV0NIQVIJc3pUeXBlTmFtZVs4MF07CQkvKiB0eXBlIG5hbWUgKi8KIH0gU0hGSUxFSU5GTzMyVzsKIAotREVDTF9XSU5FTElCX1RZUEVfQVcoU0hGSUxFSU5GTyk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhTSEZJTEVJTkZPKQogCiB0eXBlZGVmIHN0cnVjdCBfQXBwQmFyRGF0YSB7CiAJRFdPUkQJY2JTaXplOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zaWdfY29udGV4dC5oIGIvaW5jbHVkZS9zaWdfY29udGV4dC5oCmluZGV4IGIxZWRjMzAuLjUwZGVmOTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2lnX2NvbnRleHQuaAorKysgYi9pbmNsdWRlL3NpZ19jb250ZXh0LmgKQEAgLTEyNCw2ICsxMjQsNyBAQAogI2RlZmluZSBGU19zaWcoY29udGV4dCkgICAgICAoKGNvbnRleHQpLT5zY19mcykKICNkZWZpbmUgR1Nfc2lnKGNvbnRleHQpICAgICAgKChjb250ZXh0KS0+c2NfZ3MpCiAjZGVmaW5lIENSMl9zaWcoY29udGV4dCkgICAgICgoY29udGV4dCktPmNyMikKKyNkZWZpbmUgVFJBUF9zaWcoY29udGV4dCkgICAgKChjb250ZXh0KS0+c2NfdHJhcG5vKQogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAjaWZuZGVmIF9fRnJlZUJTRF9fICAgICAgICAgCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N0YWNrZnJhbWUuaCBiL2luY2x1ZGUvc3RhY2tmcmFtZS5oCmluZGV4IDUzOTRjMDUuLjdhMDE5NmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3RhY2tmcmFtZS5oCisrKyBiL2luY2x1ZGUvc3RhY2tmcmFtZS5oCkBAIC0xLDcgKzEsNyBAQAogLyoKLSAqIDE2LWJpdCBtb2RlIHN0YWNrIGZyYW1lIGxheW91dAorICogMTYtYml0IGFuZCAzMi1iaXQgbW9kZSBzdGFjayBmcmFtZSBsYXlvdXQKICAqCi0gKiBDb3B5cmlnaHQgMTk5NSBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqIENvcHlyaWdodCAxOTk1LCAxOTk4IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKICNpZm5kZWYgX19XSU5FX1NUQUNLRlJBTUVfSApAQCAtNzgsNCArNzgsMTMgQEAKICAgICAgICAgICBzaXplb2YoU1RBQ0sxNkZSQU1FKSksIFwKICAgKHRoZGIpLT5jdXJfc3RhY2sgKz0gKHNpemUpKQogCisvKiBQdXNoIGEgRFdPUkQgb24gdGhlIDMyLWJpdCBzdGFjayAqLworI2RlZmluZSBTVEFDSzMyX1BVU0goY29udGV4dCx2YWwpICgqLS0oKERXT1JEICopRVNQX3JlZyhjb250ZXh0KSkgPSAodmFsKSkKKworLyogUG9wIGEgRFdPUkQgZnJvbSB0aGUgMzItYml0IHN0YWNrICovCisjZGVmaW5lIFNUQUNLMzJfUE9QKGNvbnRleHQpICgqKChEV09SRCAqKUVTUF9yZWcoY29udGV4dCkpKyspCisKKy8qIFdpbjMyIHJlZ2lzdGVyIGZ1bmN0aW9ucyAqLworI2RlZmluZSBSRUdTX0VOVFJZUE9JTlQobmFtZSkgdm9pZCBXSU5BUEkgX19yZWdzXyMjbmFtZSggQ09OVEVYVCAqY29udGV4dCApCisKICNlbmRpZiAvKiBfX1dJTkVfU1RBQ0tGUkFNRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N0b3JhZ2UuaCBiL2luY2x1ZGUvc3RvcmFnZS5oCmluZGV4IGRjZTIxOWIuLmMyNWJhZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3RvcmFnZS5oCisrKyBiL2luY2x1ZGUvc3RvcmFnZS5oCkBAIC00Miw3ICs0Miw3IEBACiAKIHR5cGVkZWYgTFBPTEVTVFIxNiAqU05CMTY7CiB0eXBlZGVmIExQT0xFU1RSMzIgKlNOQjMyOwotREVDTF9XSU5FTElCX1RZUEUoU05CKTsKK0RFQ0xfV0lORUxJQl9UWVBFKFNOQikKIAogdHlwZWRlZiBzdHJ1Y3QgSVN0b3JhZ2UxNiBJU3RvcmFnZTE2LCpMUFNUT1JBR0UxNjsKIHR5cGVkZWYgc3RydWN0IElTdG9yYWdlMzIgSVN0b3JhZ2UzMiwqTFBTVE9SQUdFMzI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RocmVhZC5oIGIvaW5jbHVkZS90aHJlYWQuaAppbmRleCAwOTBjZTYyLi4wOTZlYWRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RocmVhZC5oCisrKyBiL2luY2x1ZGUvdGhyZWFkLmgKQEAgLTEzOSw2ICsxMzksNyBAQAogLyogc2NoZWR1bGVyL3N5bmNocm8uYyAqLwogZXh0ZXJuIHZvaWQgU1lOQ19XYWl0Rm9yQ29uZGl0aW9uKCBXQUlUX1NUUlVDVCAqd2FpdCwgRFdPUkQgdGltZW91dCApOwogZXh0ZXJuIHZvaWQgU1lOQ19XYWtlVXAoIFRIUkVBRF9RVUVVRSAqcXVldWUsIERXT1JEIG1heCApOworZXh0ZXJuIHZvaWQgU1lOQ19TZXR1cFNpZ25hbHModm9pZCk7CiAKIC8qIHNjaGVkdWxlci9zeXNkZXBzLmMgKi8KIGV4dGVybiBpbnQgU1lTREVQU19TcGF3blRocmVhZCggVEhEQiAqdGhyZWFkICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Rvb2xiYXIuaCBiL2luY2x1ZGUvdG9vbGJhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYWQzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3Rvb2xiYXIuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogVG9vbGJhciBjbGFzcyBleHRyYSBpbmZvCisgKgorICogQ29weXJpZ2h0IDE5OTggRXJpYyBLb2hsCisgKi8KKworI2lmbmRlZiBfX1dJTkVfVE9PTEJBUl9ICisjZGVmaW5lIF9fV0lORV9UT09MQkFSX0gKKworCit0eXBlZGVmIHN0cnVjdCB0YWdUQlVUVE9OX0lORk8KK3sKKyAgICBJTlQzMiBpQml0bWFwOworICAgIElOVDMyIGlkQ29tbWFuZDsKKyAgICBCWVRFICBmc1N0YXRlOworICAgIEJZVEUgIGZzU3R5bGU7CisgICAgRFdPUkQgZHdEYXRhOworICAgIElOVDMyIGlTdHJpbmc7CisKKyAgICBSRUNUMzIgcmVjdDsKKworfSBUQlVUVE9OX0lORk87IAorCisKK3R5cGVkZWYgc3RydWN0IHRhZ1RPT0xCQVJfSU5GTworeworICAgIERXT1JEICAgICAgZHdTdHJ1Y3RTaXplOyAgIC8qIFNpemUgb2YgVEJCVVRUT04tU3RydWN0ICovCisgICAgSU5UMzIgICAgICBuSGVpZ2h0OyAgICAgICAgLyogSGVpZ2h0IG9mIHRoZSBUb29sYmFyICovCisgICAgSU5UMzIgICAgICBuV2lkdGg7ICAgICAgICAgLyogV2lkdGggb2YgdGhlIFRvb2xiYXIgKi8KKyAgICBJTlQzMiAgICAgIG5CdXR0b25Ub3A7ICAgICAvKiB0b3Agb2YgdGhlIGJ1dHRvbiByZWN0YW5nbGUgKi8KKyAgICBJTlQzMiAgICAgIG5CdXR0b25IZWlnaHQ7CisgICAgSU5UMzIgICAgICBuQnV0dG9uV2lkdGg7CisgICAgSU5UMzIgICAgICBuQml0bWFwSGVpZ2h0OworICAgIElOVDMyICAgICAgbkJpdG1hcFdpZHRoOworICAgIElOVDMyICAgICAgbkluZGVudDsKKworICAgIElOVDMyICAgICAgbk51bUJ1dHRvbnM7ICAgICAvKiBOdW1iZXIgb2YgYnV0dG9ucyAqLworICAgIElOVDMyICAgICAgbk51bUJpdG1hcHM7CisgICAgSU5UMzIgICAgICBuTnVtU3RyaW5nczsKKworICAgIEJPT0wzMiAgICAgYkNhcHR1cmVkOworICAgIElOVDMyICAgICAgbkJ1dHRvbkRvd247CisgICAgSU5UMzIgICAgICBuT2xkSGl0OworCisgICAgSElNQUdFTElTVCBoaW1sRGVmOyAgICAgICAgIC8qIGRlZmF1bHQgaW1hZ2UgbGlzdCAqLworICAgIEhJTUFHRUxJU1QgaGltbEhvdDsgICAgICAgICAvKiBob3QgaW1hZ2UgbGlzdCAqLworICAgIEhJTUFHRUxJU1QgaGltbERpczsgICAgICAgICAvKiBkaXNhYmxlZCBpbWFnZSBsaXN0ICovCisKKyAgICBUQlVUVE9OX0lORk8gKmJ1dHRvbnM7Cit9IFRPT0xCQVJfSU5GTzsKKworCitleHRlcm4gdm9pZCBUT09MQkFSX1JlZ2lzdGVyICh2b2lkKTsKKworI2VuZGlmICAvKiBfX1dJTkVfVE9PTEJBUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZlcnNpb24uaCBiL2luY2x1ZGUvdmVyc2lvbi5oCmluZGV4IDMxZTA5NGYuLjBjYzM2YjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmVyc2lvbi5oCisrKyBiL2luY2x1ZGUvdmVyc2lvbi5oCkBAIC0xICsxIEBACi0jZGVmaW5lIFdJTkVfUkVMRUFTRV9JTkZPICJXaW5lIHJlbGVhc2UgOTgwNTE3IgorI2RlZmluZSBXSU5FX1JFTEVBU0VfSU5GTyAiV2luZSByZWxlYXNlIDk4MDYwMSIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luLmggYi9pbmNsdWRlL3dpbi5oCmluZGV4IGViZTQ3Y2UuLjljZmZiZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luLmgKKysrIGIvaW5jbHVkZS93aW4uaApAQCAtMTI5LDYgKzEyOSwxMCBAQAogZXh0ZXJuIEhJTlNUQU5DRTMyIFdJTl9HZXRXaW5kb3dJbnN0YW5jZSggSFdORDMyIGh3bmQgKTsKIGV4dGVybiBXTkQqKiAgV0lOX0J1aWxkV2luQXJyYXkoIFdORCAqd25kUHRyLCBVSU5UMzIgYndhLCBVSU5UMzIqIHBudW0gKTsKIAorZXh0ZXJuIEhXTkQzMiBDQVJFVF9HZXRId25kKHZvaWQpOworZXh0ZXJuIHZvaWQgQ0FSRVRfR2V0UmVjdChMUFJFQ1QzMiBscHJjKTsgIC8qIHdpbmRvd3MvY2FyZXQuYyAqLworCitleHRlcm4gQk9PTDE2IERSQUdfUXVlcnlVcGRhdGUoIEhXTkQzMiwgU0VHUFRSLCBCT09MMzIgKTsKIGV4dGVybiB2b2lkIERFRldORF9TZXRUZXh0KCBXTkQgKnduZFB0ciwgTFBDU1RSIHRleHQgKTsKIGV4dGVybiBIQlJVU0gzMiBERUZXTkRfQ29udHJvbENvbG9yKCBIREMzMiBoREMsIFVJTlQxNiBjdGxUeXBlICk7ICAgICAvKiB3aW5kb3dzL2RlZnduZC5jICovCiAKQEAgLTEzOCw5ICsxNDIsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkdOMzIgaHJnblVwZGF0ZSwgVUlOVDMyIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBjb250cm9sICk7CQkgICAgICAvKiB3aW5kb3dzL3BhaW50aW5nLmMgKi8KIAotZXh0ZXJuIEJPT0wzMiBXSURHRVRTX0lzQ29udHJvbDMyKCBXTkQqIHBXbmQsIEJVSUxUSU5fQ0xBU1MzMiBjbHMgKTsgIC8qIGNvbnRyb2xzL3dpZGdldHMuYyAqLworLyogY29udHJvbHMvd2lkZ2V0cy5jICovCitleHRlcm4gQk9PTDMyIFdJREdFVFNfSW5pdCggdm9pZCApOworZXh0ZXJuIEJPT0wzMiBXSURHRVRTX0lzQ29udHJvbDMyKCBXTkQqIHBXbmQsIEJVSUxUSU5fQ0xBU1MzMiBjbHMgKTsgIAogCi1leHRlcm4gSFdORDMyIElDT05USVRMRV9DcmVhdGUoIFdORCogKTsJCQkJICAgICAgLyogY29udHJvbHMvaWNvbnRpdGxlLmMgKi8KKy8qIGNvbnRyb2xzL2ljb250aXRsZS5jICovCitleHRlcm4gSFdORDMyIElDT05USVRMRV9DcmVhdGUoIFdORCogKTsKK2V4dGVybiBCT09MMzIgSUNPTlRJVExFX0luaXQoIHZvaWQgKTsKKworLyogd2luZG93cy9mb2N1cy5jICovCitleHRlcm4gdm9pZCBGT0NVU19TZXRYRm9jdXMoIEhXTkQzMiApOworZXh0ZXJuIHZvaWQgRk9DVVNfU3dpdGNoRm9jdXMoIEhXTkQzMiAsIEhXTkQzMiApOwogCiBleHRlcm4gRGlzcGxheSAqIGRpc3BsYXk7CiBleHRlcm4gU2NyZWVuICogc2NyZWVuOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW4xNmRydi5oIGIvaW5jbHVkZS93aW4xNmRydi5oCmluZGV4IGQzNGUxNzMuLjEyOTg3ODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luMTZkcnYuaAorKysgYi9pbmNsdWRlL3dpbjE2ZHJ2LmgKQEAgLTIwMyw2ICsyMDMsNyBAQAogCiAvKiBXaW5lIGRyaXZlciBmdW5jdGlvbnMgKi8KIAorZXh0ZXJuIEJPT0wzMiBXSU4xNkRSVl9Jbml0KHZvaWQpOwogZXh0ZXJuIEJPT0wzMiBXSU4xNkRSVl9HZXRDaGFyV2lkdGgoIHN0cnVjdCB0YWdEQyAqZGMsIFVJTlQzMiBmaXJzdENoYXIsIFVJTlQzMiBsYXN0Q2hhciwKIAkJCQkgICBMUElOVDMyIGJ1ZmZlciApOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmJhc2UuaCBiL2luY2x1ZGUvd2luYmFzZS5oCmluZGV4IDc4ODM1ZjIuLjIyZGMxODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luYmFzZS5oCisrKyBiL2luY2x1ZGUvd2luYmFzZS5oCkBAIC0xNzgsNiArMTc4LDcgQEAKIHZvaWQgICAgICBXSU5BUEkgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihDUklUSUNBTF9TRUNUSU9OICpscENyaXQpOwogdm9pZCAgICAgIFdJTkFQSSBMZWF2ZUNyaXRpY2FsU2VjdGlvbihDUklUSUNBTF9TRUNUSU9OICpscENyaXQpOwogSEFORExFMzIgIFdJTkFQSSBPcGVuUHJvY2VzcyhEV09SRCBhY2Nlc3MsIEJPT0wzMiBpbmhlcml0LCBEV09SRCBpZCk7Cit2b2lkICAgICAgV0lOQVBJIFJhaXNlRXhjZXB0aW9uKERXT1JELERXT1JELERXT1JELGNvbnN0IExQRFdPUkQpOwogaW50ICAgICAgIFdJTkFQSSBUZXJtaW5hdGVQcm9jZXNzKEhBTkRMRTMyIGgsIGludCByZXQpOwogCiAjZW5kaWYgIC8qIF9fV0lORV9XSU5CQVNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZG93cy5oIGIvaW5jbHVkZS93aW5kb3dzLmgKaW5kZXggOTU3ZWIxOS4uZTI4YTE3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5kb3dzLmgKKysrIGIvaW5jbHVkZS93aW5kb3dzLmgKQEAgLTUsNyArNSwxMCBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAorI2lmbmRlZiBSQ19JTlZPS0VECiAjaW5jbHVkZSA8c3RkYXJnLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgIndpbnR5cGVzLmgiCiAKICNwcmFnbWEgcGFjaygxKQpAQCAtMjQ5OCw3ICsyNTAxLDcgQEAKICNkZWZpbmUgQ1NURl9UWElNCTB4NDAKIAogLyogU3lzdGVtUGFyYW1ldGVyc0luZm8gKi8KLQorLyogZGVmaW5lcyBiZWxvdyBhcmUgZm9yIGFsbCB3aW4gdmVyc2lvbnMgKi8KICNkZWZpbmUgU1BJX0dFVEJFRVAgICAgICAgICAgICAgICAxCiAjZGVmaW5lIFNQSV9TRVRCRUVQICAgICAgICAgICAgICAgMgogI2RlZmluZSBTUElfR0VUTU9VU0UgICAgICAgICAgICAgIDMKQEAgLTI1MzIsMTcgKzI1MzUsNyBAQAogI2RlZmluZSBTUElfU0VUSUNPTlRJVExFTE9HRk9OVCAgIDM0CiAjZGVmaW5lIFNQSV9HRVRGQVNUVEFTS1NXSVRDSCAgICAgMzUKICNkZWZpbmUgU1BJX1NFVEZBU1RUQVNLU1dJVENIICAgICAzNgotI2RlZmluZSBTUElfU0VURFJBR0ZVTExXSU5ET1dTICAgIDM3Ci0jZGVmaW5lIFNQSV9HRVREUkFHRlVMTFdJTkRPV1MgICAgMzgKLSNkZWZpbmUgU1BJX0dFVE5PTkNMSUVOVE1FVFJJQ1MgICA0MQotI2RlZmluZSBTUElfU0VUTk9OQ0xJRU5UTUVUUklDUyAgIDQyCi0jZGVmaW5lIFNQSV9HRVRNSU5JTUlaRURNRVRSSUNTICAgNDMKLSNkZWZpbmUgU1BJX1NFVE1JTklNSVpFRE1FVFJJQ1MgICA0NAotI2RlZmluZSBTUElfR0VUSUNPTk1FVFJJQ1MgICAgICAgIDQ1Ci0jZGVmaW5lIFNQSV9TRVRJQ09OTUVUUklDUyAgICAgICAgNDYKLSNkZWZpbmUgU1BJX1NFVFdPUktBUkVBICAgICAgICAgICA0NwotI2RlZmluZSBTUElfR0VUV09SS0FSRUEgICAgICAgICAgIDQ4Ci0jZGVmaW5lIFNQSV9TRVRQRU5XSU5ET1dTICAgICAgICAgNDkKKwogI2RlZmluZSBTUElfR0VURklMVEVSS0VZUyAgICAgICAgIDUwCiAjZGVmaW5lIFNQSV9TRVRGSUxURVJLRVlTICAgICAgICAgNTEKICNkZWZpbmUgU1BJX0dFVFRPR0dMRUtFWVMgICAgICAgICA1MgpAQCAtMjU1NSwxMCArMjU0OCwyNSBAQAogI2RlZmluZSBTUElfU0VUU1RJQ0tZS0VZUyAgICAgICAgIDU5CiAjZGVmaW5lIFNQSV9HRVRBQ0NFU1NUSU1FT1VUICAgICAgNjAKICNkZWZpbmUgU1BJX1NFVEFDQ0VTU1RJTUVPVVQgICAgICA2MQotI2RlZmluZSBTUElfR0VUU0VSSUFMS0VZUyAgICAgICAgIDYyCi0jZGVmaW5lIFNQSV9TRVRTRVJJQUxLRVlTICAgICAgICAgNjMKKwogI2RlZmluZSBTUElfR0VUU09VTkRTRU5UUlkgICAgICAgIDY0CiAjZGVmaW5lIFNQSV9TRVRTT1VORFNFTlRSWSAgICAgICAgNjUKKworLyogZGVmaW5lcyBiZWxvdyBhcmUgZm9yIGFsbCB3aW4gdmVyc2lvbnMgV0lOVkVSID49IDB4MDQwMCAqLworI2RlZmluZSBTUElfU0VURFJBR0ZVTExXSU5ET1dTICAgIDM3CisjZGVmaW5lIFNQSV9HRVREUkFHRlVMTFdJTkRPV1MgICAgMzgKKyNkZWZpbmUgU1BJX0dFVE5PTkNMSUVOVE1FVFJJQ1MgICA0MQorI2RlZmluZSBTUElfU0VUTk9OQ0xJRU5UTUVUUklDUyAgIDQyCisjZGVmaW5lIFNQSV9HRVRNSU5JTUlaRURNRVRSSUNTICAgNDMKKyNkZWZpbmUgU1BJX1NFVE1JTklNSVpFRE1FVFJJQ1MgICA0NAorI2RlZmluZSBTUElfR0VUSUNPTk1FVFJJQ1MgICAgICAgIDQ1CisjZGVmaW5lIFNQSV9TRVRJQ09OTUVUUklDUyAgICAgICAgNDYKKyNkZWZpbmUgU1BJX1NFVFdPUktBUkVBICAgICAgICAgICA0NworI2RlZmluZSBTUElfR0VUV09SS0FSRUEgICAgICAgICAgIDQ4CisjZGVmaW5lIFNQSV9TRVRQRU5XSU5ET1dTICAgICAgICAgNDkKKworI2RlZmluZSBTUElfR0VUU0VSSUFMS0VZUyAgICAgICAgIDYyCisjZGVmaW5lIFNQSV9TRVRTRVJJQUxLRVlTICAgICAgICAgNjMKICNkZWZpbmUgU1BJX0dFVEhJR0hDT05UUkFTVCAgICAgICA2NgogI2RlZmluZSBTUElfU0VUSElHSENPTlRSQVNUICAgICAgIDY3CiAjZGVmaW5lIFNQSV9HRVRLRVlCT0FSRFBSRUYgICAgICAgNjgKQEAgLTI1ODgsMTIgKzI1OTYsNzggQEAKICNkZWZpbmUgU1BJX0dFVFdJTkRPV1NFWFRFTlNJT04gICA5MgogI2RlZmluZSBTUElfU0VUTU9VU0VUUkFJTFMgICAgICAgIDkzCiAjZGVmaW5lIFNQSV9HRVRNT1VTRVRSQUlMUyAgICAgICAgOTQKLSNkZWZpbmUgU1BJX1NDUkVFTlNBVkVSUlVOTklORyAgICA5NworI2RlZmluZSBTUElfU0VUU0NSRUVOU0FWRVJSVU5OSU5HIDk3CisjZGVmaW5lIFNQSV9TQ1JFRU5TQVZFUlJVTk5JTkcgICAgU1BJX1NFVFNDUkVFTlNBVkVSUlVOTklORworCisvKiBkZWZpbmVzIGJlbG93IGFyZSBmb3IgYWxsIHdpbiB2ZXJzaW9ucyAoX1dJTjMyX1dJTk5UID49IDB4MDQwMCkgfHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfV0lOMzJfV0lORE9XUyA+IDB4MDQwMCkgKi8KKyNkZWZpbmUgU1BJX0dFVE1PVVNFSE9WRVJXSURUSCAgICA5OAorI2RlZmluZSBTUElfU0VUTU9VU0VIT1ZFUldJRFRIICAgIDk5CisjZGVmaW5lIFNQSV9HRVRNT1VTRUhPVkVSSEVJR0hUICAgMTAwCisjZGVmaW5lIFNQSV9TRVRNT1VTRUhPVkVSSEVJR0hUICAgMTAxCisjZGVmaW5lIFNQSV9HRVRNT1VTRUhPVkVSVElNRSAgICAgMTAyCisjZGVmaW5lIFNQSV9TRVRNT1VTRUhPVkVSVElNRSAgICAgMTAzCisjZGVmaW5lIFNQSV9HRVRXSEVFTFNDUk9MTExJTkVTICAgMTA0CisjZGVmaW5lIFNQSV9TRVRXSEVFTFNDUk9MTExJTkVTICAgMTA1CisKKyNkZWZpbmUgU1BJX0dFVFNIT1dJTUVVSSAgICAgICAgICAxMTAKKyNkZWZpbmUgU1BJX1NFVFNIT1dJTUVVSSAgICAgICAgICAxMTEKKworLyogZGVmaW5lcyBiZWxvdyBhcmUgZm9yIGFsbCB3aW4gdmVyc2lvbnMgV0lOVkVSID49IDB4MDUwMCAqLworI2RlZmluZSBTUElfR0VUTU9VU0VTUEVFRCAgICAgICAgIDExMgorI2RlZmluZSBTUElfU0VUTU9VU0VTUEVFRCAgICAgICAgIDExMworI2RlZmluZSBTUElfR0VUU0NSRUVOU0FWRVJSVU5OSU5HIDExNAorCisjZGVmaW5lIFNQSV9HRVRBQ1RJVkVXSU5ET1dUUkFDS0lORyAgICAweDEwMDAKKyNkZWZpbmUgU1BJX1NFVEFDVElWRVdJTkRPV1RSQUNLSU5HICAgIDB4MTAwMQorI2RlZmluZSBTUElfR0VUTUVOVUFOSU1BVElPTiAgICAgICAgICAgMHgxMDAyCisjZGVmaW5lIFNQSV9TRVRNRU5VQU5JTUFUSU9OICAgICAgICAgICAweDEwMDMKKyNkZWZpbmUgU1BJX0dFVENPTUJPQk9YQU5JTUFUSU9OICAgICAgIDB4MTAwNAorI2RlZmluZSBTUElfU0VUQ09NQk9CT1hBTklNQVRJT04gICAgICAgMHgxMDA1CisjZGVmaW5lIFNQSV9HRVRMSVNUQk9YU01PT1RIU0NST0xMSU5HICAweDEwMDYKKyNkZWZpbmUgU1BJX1NFVExJU1RCT1hTTU9PVEhTQ1JPTExJTkcgIDB4MTAwNworI2RlZmluZSBTUElfR0VUR1JBRElFTlRDQVBUSU9OUyAgICAgICAgMHgxMDA4CisjZGVmaW5lIFNQSV9TRVRHUkFESUVOVENBUFRJT05TICAgICAgICAweDEwMDkKKyNkZWZpbmUgU1BJX0dFVE1FTlVVTkRFUkxJTkVTICAgICAgICAgIDB4MTAwQQorI2RlZmluZSBTUElfU0VUTUVOVVVOREVSTElORVMgICAgICAgICAgMHgxMDBCCisjZGVmaW5lIFNQSV9HRVRBQ1RJVkVXTkRUUktaT1JERVIgICAgICAweDEwMEMKKyNkZWZpbmUgU1BJX1NFVEFDVElWRVdORFRSS1pPUkRFUiAgICAgIDB4MTAwRAorI2RlZmluZSBTUElfR0VUSE9UVFJBQ0tJTkcgICAgICAgICAgICAgMHgxMDBFCisjZGVmaW5lIFNQSV9TRVRIT1RUUkFDS0lORyAgICAgICAgICAgICAweDEwMEYKKyNkZWZpbmUgU1BJX0dFVEZPUkVHUk9VTkRMT0NLVElNRU9VVCAgIDB4MjAwMAorI2RlZmluZSBTUElfU0VURk9SRUdST1VORExPQ0tUSU1FT1VUICAgMHgyMDAxCisjZGVmaW5lIFNQSV9HRVRBQ1RJVkVXTkRUUktUSU1FT1VUICAgICAweDIwMDIKKyNkZWZpbmUgU1BJX1NFVEFDVElWRVdORFRSS1RJTUVPVVQgICAgIDB4MjAwMworI2RlZmluZSBTUElfR0VURk9SRUdST1VOREZMQVNIQ09VTlQgICAgMHgyMDA0CisjZGVmaW5lIFNQSV9TRVRGT1JFR1JPVU5ERkxBU0hDT1VOVCAgICAweDIwMDUKIAogLyogU3lzdGVtUGFyYW1ldGVyc0luZm8gZmxhZ3MgKi8KIAotI2RlZmluZSBTUElGX1VQREFURUlOSUZJTEUJCTEKLSNkZWZpbmUgU1BJRl9TRU5EV0lOSU5JQ0hBTkdFCQkyCisjZGVmaW5lIFNQSUZfVVBEQVRFSU5JRklMRSAgICAgICAgICAgICAgMQorI2RlZmluZSBTUElGX1NFTkRXSU5JTklDSEFOR0UgICAgICAgICAgIDIKKyNkZWZpbmUgU1BJRl9TRU5EQ0hBTkdFICAgICAgICAgICAgICAgICBTUElGX1NFTkRXSU5JTklDSEFOR0UKKworLyogZmxhZ3MgZm9yIEhJR0hDT05UUkFTVCBkd0ZsYWdzIGZpZWxkICovCisjZGVmaW5lIEhDRl9ISUdIQ09OVFJBU1RPTiAgMHgwMDAwMDAwMQorI2RlZmluZSBIQ0ZfQVZBSUxBQkxFICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENGX0hPVEtFWUFDVElWRSAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhDRl9DT05GSVJNSE9US0VZICAgMHgwMDAwMDAwOAorI2RlZmluZSBIQ0ZfSE9US0VZU09VTkQgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSENGX0lORElDQVRPUiAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEhDRl9IT1RLRVlBVkFJTEFCTEUgMHgwMDAwMDA0MAordHlwZWRlZiBzdHJ1Y3QgdGFnSElHSENPTlRSQVNUQQoreworICAgIFVJTlQzMiAgY2JTaXplOworICAgIERXT1JEICAgZHdGbGFnczsKKyAgICBMUFNUUiAgIGxwc3pEZWZhdWx0U2NoZW1lOworfSAgIEhJR0hDT05UUkFTVEEsICpMUEhJR0hDT05UUkFTVEE7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0hJR0hDT05UUkFTVFcKK3sKKyAgICBVSU5UMzIgIGNiU2l6ZTsKKyAgICBEV09SRCAgIGR3RmxhZ3M7CisgICAgTFBXU1RSICBscHN6RGVmYXVsdFNjaGVtZTsKK30gICBISUdIQ09OVFJBU1RXLCAqTFBISUdIQ09OVFJBU1RXOwogCiAvKiBHZXRGcmVlU3lzdGVtUmVzb3VyY2VzKCkgcGFyYW1ldGVycyAqLwogCkBAIC0zNjIyLDYgKzM2OTYsNyBAQAogI2RlZmluZSBTU19UWVBFTUFTSyAgICAgICAgIDB4MDAwMDAwMUZMCiAKICNkZWZpbmUgU1NfTk9QUkVGSVggICAgICAgICAweDAwMDAwMDgwTAorI2RlZmluZSBTU19OT1RJRlkgICAgICAgICAgIDB4MDAwMDAxMDBMCiAjZGVmaW5lIFNTX0NFTlRFUklNQUdFICAgICAgMHgwMDAwMDIwMEwKICNkZWZpbmUgU1NfUklHSFRKVVNUICAgICAgICAweDAwMDAwNDAwTAogI2RlZmluZSBTU19SRUFMU0laRUlNQUdFICAgIDB4MDAwMDA4MDBMCkBAIC00NDQ2LDkgKzQ1MjEsMTkgQEAKICNkZWZpbmUgVktfTE1FTlUgICAgICAgICAgICAweEE0CiAjZGVmaW5lIFZLX1JNRU5VICAgICAgICAgICAgMHhBNQogLyogICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTYtMHhCOSAgVW5hc3NpZ25lZCAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIDB4QkEtMHhDMCAgT0VNIHNwZWNpZmljICovCisjZGVmaW5lIFZLX09FTV8xICAgICAgICAgICAgMHhCQQorI2RlZmluZSBWS19PRU1fUExVUyAgICAgICAgIDB4QkIKKyNkZWZpbmUgVktfT0VNX0NPTU1BICAgICAgICAweEJDCisjZGVmaW5lIFZLX09FTV9NSU5VUyAgICAgICAgMHhCRAorI2RlZmluZSBWS19PRU1fUEVSSU9EICAgICAgIDB4QkUKKyNkZWZpbmUgVktfT0VNXzIgICAgICAgICAgICAweEJGCisjZGVmaW5lIFZLX09FTV8zICAgICAgICAgICAgMHhDMAogLyogICAgICAgICAgICAgICAgICAgICAgICAgIDB4QzEtMHhEQSAgVW5hc3NpZ25lZCAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIDB4REItMHhFNCAgT0VNIHNwZWNpZmljICovCisjZGVmaW5lIFZLX09FTV80ICAgICAgICAgICAgMHhEQgorI2RlZmluZSBWS19PRU1fNSAgICAgICAgICAgIDB4REMKKyNkZWZpbmUgVktfT0VNXzYgICAgICAgICAgICAweERECisjZGVmaW5lIFZLX09FTV83ICAgICAgICAgICAgMHhERQorLyogICAgICAgICAgICAgICAgICAgICAgICAgIDB4REYtMHhFNCAgT0VNIHNwZWNpZmljICovCiAKICNkZWZpbmUgVktfUFJPQ0VTU0tFWSAgICAgICAweEU1CiAKQEAgLTU5NDgsNiArNjAzMywxOSBAQAogICAgIFVJTlQzMiBOZWdhdGl2ZU9yZGVyOwogfSBOVU1CRVJGTVQzMlc7CiAKK3R5cGVkZWYgZW51bSBfR0VUX0ZJTEVFWF9JTkZPX0xFVkVMUyB7CisgICAgR2V0RmlsZUV4SW5mb1N0YW5kYXJkCit9IEdFVF9GSUxFRVhfSU5GT19MRVZFTFM7CisKK3R5cGVkZWYgc3RydWN0IF9XSU4zMl9GSUxFX0FUVFJJQlVURVNfREFUQSB7CisgICAgRFdPUkQgICAgZHdGaWxlQXR0cmlidXRlczsKKyAgICBGSUxFVElNRSBmdENyZWF0aW9uVGltZTsKKyAgICBGSUxFVElNRSBmdExhc3RBY2Nlc3NUaW1lOworICAgIEZJTEVUSU1FIGZ0TGFzdFdyaXRlVGltZTsKKyAgICBEV09SRCAgICBuRmlsZVNpemVIaWdoOworICAgIERXT1JEICAgIG5GaWxlU2l6ZUxvdzsKK30gV0lOMzJfRklMRV9BVFRSSUJVVEVfREFUQSwgKkxQV0lOMzJfRklMRV9BVFRSSUJVVEVfREFUQTsKKwogCiAKIApAQCAtNjIzOSw2ICs2MzM3LDkgQEAKIERXT1JEICAgICAgIFdJTkFQSSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJBKExQQ1NUUixMUFNUUixEV09SRCk7CiBEV09SRCAgICAgICBXSU5BUEkgR2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyVyhMUENXU1RSLExQV1NUUixEV09SRCk7CiAjZGVmaW5lICAgICBHZXRFbnZpcm9ubWVudFZhcmlhYmxlIFdJTkVMSUJfTkFNRV9BVyhHZXRFbnZpcm9ubWVudFZhcmlhYmxlKQorQk9PTDMyICAgICAgV0lOQVBJIEdldEZpbGVBdHRyaWJ1dGVzRXgzMkEoTFBDU1RSLEdFVF9GSUxFRVhfSU5GT19MRVZFTFMsTFBWT0lEKTsKK0JPT0wzMiAgICAgIFdJTkFQSSBHZXRGaWxlQXR0cmlidXRlc0V4MzJXKExQQ1dTVFIsR0VUX0ZJTEVFWF9JTkZPX0xFVkVMUyxMUFZPSUQpOworI2RlZmluZSAgICAgR2V0RmlsZWF0dHJpYnV0ZXNFeCBXSU5FTElCX05BTUVfQVcoR2V0RmlsZUF0dHJpYnV0ZXNFeCkKIERXT1JEICAgICAgIFdJTkFQSSBHZXRGaWxlSW5mb3JtYXRpb25CeUhhbmRsZShIRklMRTMyLEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OKik7CiBEV09SRCAgICAgICBXSU5BUEkgR2V0RmlsZVNpemUoSEZJTEUzMixMUERXT1JEKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBHZXRGaWxlVGltZShIRklMRTMyLExQRklMRVRJTUUsTFBGSUxFVElNRSxMUEZJTEVUSU1FKTsKQEAgLTYzNjYsNiArNjQ2Nyw5IEBACiBCT09MMzIgICAgICBXSU5BUEkgUmVhZENvbnNvbGUzMkEoSEFORExFMzIsTFBWT0lELERXT1JELExQRFdPUkQsTFBWT0lEKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBSZWFkQ29uc29sZTMyVyhIQU5ETEUzMixMUFZPSUQsRFdPUkQsTFBEV09SRCxMUFZPSUQpOwogI2RlZmluZSAgICAgUmVhZENvbnNvbGUgV0lORUxJQl9OQU1FX0FXKFJlYWRDb25zb2xlKQorQk9PTDMyICAgICAgV0lOQVBJIFJlYWRDb25zb2xlT3V0cHV0Q2hhcmFjdGVyMzJBKEhBTkRMRTMyLExQU1RSLERXT1JELAorCQkJCQkJIENPT1JELExQRFdPUkQpOworI2RlZmluZSAgICAgUmVhZENvbnNvbGVPdXRwdXRDaGFyYWN0ZXIgV0lORUxJQl9OQU1FX0FXKFJlYWRDb25zb2xlT3V0cHV0Q2hhcmFjdGVyKQogQk9PTDMyICAgICAgV0lOQVBJIFJlYWRGaWxlKEhBTkRMRTMyLExQVk9JRCxEV09SRCxMUERXT1JELExQT1ZFUkxBUFBFRCk7CiBMT05HICAgICAgICBXSU5BUEkgUmVnQ29ubmVjdFJlZ2lzdHJ5MzJBKExQQ1NUUixIS0VZLExQSEtFWSk7CiBMT05HICAgICAgICBXSU5BUEkgUmVnQ29ubmVjdFJlZ2lzdHJ5MzJXKExQQ1dTVFIsSEtFWSxMUEhLRVkpOwpAQCAtNjM5OCw2ICs2NTAyLDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQsTFBEV09SRCxMUERXT1JELExQRFdPUkQsTFBEV09SRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCxMUEZJTEVUSU1FKTsKICNkZWZpbmUgICAgIFJlZ1F1ZXJ5SW5mb0tleSBXSU5FTElCX05BTUVfQVcoUmVnUXVlcnlJbmZvS2V5KQorTE9ORyAgICAgICAgV0lOQVBJIFJlZ1JlcGxhY2VLZXkzMkEoSEtFWSxMUENTVFIsTFBDU1RSLExQQ1NUUik7CitMT05HICAgICAgICBXSU5BUEkgUmVnUmVwbGFjZUtleTMyVyhIS0VZLExQQ1dTVFIsTFBDV1NUUixMUENXU1RSKTsKKyNkZWZpbmUgICAgIFJlZ1JlcGxhY2VLZXkgV0lORUxJQl9OQU1FX0FXKFJlZ1JlcGxhY2VLZXkpCitMT05HICAgICAgICBXSU5BUEkgUmVnUmVzdG9yZUtleTMyQShIS0VZLExQQ1NUUixEV09SRCk7CitMT05HICAgICAgICBXSU5BUEkgUmVnUmVzdG9yZUtleTMyVyhIS0VZLExQQ1dTVFIsRFdPUkQpOworI2RlZmluZSAgICAgUmVnUmVzdG9yZUtleSBXSU5FTElCX05BTUVfQVcoUmVnUmVzdG9yZUtleSkKK0xPTkcgICAgICAgIFdJTkFQSSBSZWdTYXZlS2V5MzJBKEhLRVksTFBDU1RSLExQU0VDVVJJVFlfQVRUUklCVVRFUyk7CitMT05HICAgICAgICBXSU5BUEkgUmVnU2F2ZUtleTMyVyhIS0VZLExQQ1dTVFIsTFBTRUNVUklUWV9BVFRSSUJVVEVTKTsKKyNkZWZpbmUgICAgIFJlZ1NhdmVLZXkgV0lORUxJQl9OQU1FX0FXKFJlZ1NhdmVLZXkpCitMT05HICAgICAgICBXSU5BUEkgUmVnU2V0S2V5U2VjdXJpdHkoSEtFWSxTRUNVUklUWV9JTkZPUk1BVElPTixMUFNFQ1VSSVRZX0RFU0NSSVBUT1IpOworTE9ORyAgICAgICAgV0lOQVBJIFJlZ1VuTG9hZEtleTMyQShIS0VZLExQQ1NUUik7CitMT05HICAgICAgICBXSU5BUEkgUmVnVW5Mb2FkS2V5MzJXKEhLRVksTFBDV1NUUik7CisjZGVmaW5lICAgICBSZWdVbkxvYWRLZXkgV0lORUxJQl9OQU1FX0FXKFJlZ1VuTG9hZEtleSkKIEJPT0wzMiAgICAgIFdJTkFQSSBSZWxlYXNlU2VtYXBob3JlKEhBTkRMRTMyLExPTkcsTFBMT05HKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBSZXNldEV2ZW50KEhBTkRMRTMyKTsKIFZPSUQgICAgICAgIFdJTkFQSSBSdGxGaWxsTWVtb3J5KExQVk9JRCxVSU5UMzIsVUlOVDMyKTsKQEAgLTg3MzcsOSArODg1NCw5IEBACiBCT09MMzIgICAgICBXSU5BUEkgV2luSGVscDMyQShIV05EMzIsTFBDU1RSLFVJTlQzMixEV09SRCk7CiBCT09MMzIgICAgICBXSU5BUEkgV2luSGVscDMyVyhIV05EMzIsTFBDV1NUUixVSU5UMzIsRFdPUkQpOwogI2RlZmluZSAgICAgV2luSGVscCBXSU5FTElCX05BTUVfQVcoV2luSGVscCkKLVVJTlQxNiAgICAgIFdOZXRBZGRDb25uZWN0aW9uMTYoTFBTVFIsTFBTVFIsTFBTVFIpOwotVUlOVDMyICAgICAgV05ldEFkZENvbm5lY3Rpb24zMkEoTFBTVFIsTFBTVFIsTFBTVFIpOwotVUlOVDMyICAgICAgV05ldEFkZENvbm5lY3Rpb24zMlcoTFBXU1RSLExQV1NUUixMUFdTVFIpOworVUlOVDE2ICAgICAgV0lOQVBJIFdOZXRBZGRDb25uZWN0aW9uMTYoTFBDU1RSLExQQ1NUUixMUENTVFIpOworVUlOVDMyICAgICAgV0lOQVBJIFdOZXRBZGRDb25uZWN0aW9uMzJBKExQQ1NUUixMUENTVFIsTFBDU1RSKTsKK1VJTlQzMiAgICAgIFdJTkFQSSBXTmV0QWRkQ29ubmVjdGlvbjMyVyhMUENXU1RSLExQQ1dTVFIsTFBDV1NUUik7CiAjZGVmaW5lICAgICBXTmV0QWRkQ29ubmVjdGlvbiBXSU5FTElCX05BTUVfQVcoV05ldEFkZENvbm5lY3Rpb24pCiBJTlQxNiAgICAgICBXSU5BUElWIHdzbnByaW50ZjE2KExQU1RSLFVJTlQxNixMUENTVFIsLi4uKTsKIElOVDMyICAgICAgIFdJTkFQSVYgd3NucHJpbnRmMzJBKExQU1RSLFVJTlQzMixMUENTVFIsLi4uKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2lubmxzLmggYi9pbmNsdWRlL3dpbm5scy5oCmluZGV4IGFmNmQ3ZGUuLjQ5Njc5MjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2lubmxzLmgKKysrIGIvaW5jbHVkZS93aW5ubHMuaApAQCAtMTE2LDE4ICsxMTYsMjkgQEAKICNkZWZpbmUgTk9STV9JR05PUkVOT05TUEFDRQkJCTIKICNkZWZpbmUgTk9STV9JR05PUkVTWU1CT0xTCQkJNAogI2RlZmluZSBOT1JNX1NUUklOR1NPUlQJCQkJMHgxMDAwCisjZGVmaW5lIE5PUk1fSUdOT1JFS0FOQVRZUEUgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIE5PUk1fSUdOT1JFV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCiAKLSNkZWZpbmUgQ1BfQUNQCQkJCQkJMAotI2RlZmluZSBDUF9PRU1DUAkJCQkJMQorI2RlZmluZSBDUF9BQ1AJCQkJCTAKKyNkZWZpbmUgQ1BfT0VNQ1AJCQkJMQogCiAjZGVmaW5lIFdDX0RFRkFVTFRDSEVDSwkJCQkweDAwMDAwMTAwCiAjZGVmaW5lIFdDX0NPTVBPU0lURUNIRUNLCQkJMHgwMDAwMDIwMAogI2RlZmluZSBXQ19ESVNDQVJETlMJCQkJMHgwMDAwMDAxMAotI2RlZmluZSBXQ19TRVBDSEFSUwkJCQkJMHgwMDAwMDAyMAorI2RlZmluZSBXQ19TRVBDSEFSUwkJCQkweDAwMDAwMDIwCiAjZGVmaW5lIFdDX0RFRkFVTFRDSEFSCQkJCTB4MDAwMDAwNDAKIAotI2RlZmluZSBNQUtFTENJRChsLCBzKSAgICAoTUFLRUxPTkcobCwgcykpCi0jZGVmaW5lIE1BS0VMQU5HSUQocCwgcykgICgoKChXT1JEKShzKSk8PDEwKSB8IChXT1JEKShwKSkKKyNkZWZpbmUgTUFLRUxDSUQobCwgcykJCShNQUtFTE9ORyhsLCBzKSkKKworI2RlZmluZSBNQUtFTEFOR0lEKHAsIHMpCSgoKChXT1JEKShzKSk8PDEwKSB8IChXT1JEKShwKSkKKyNkZWZpbmUgUFJJTUFSWUxBTkdJRChsKQkoKFdPUkQpKGwpICYgMHgzZmYpCisjZGVmaW5lIFNVQkxBTkdJRChsKQkJKChXT1JEKShsKSA+PiAxMCkKKworI2RlZmluZSBMQU5HX1NZU1RFTV9ERUZBVUxUCShNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19TWVNfREVGQVVMVCkpCisjZGVmaW5lIExBTkdfVVNFUl9ERUZBVUxUCShNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSkKKyNkZWZpbmUgTE9DQUxFX1NZU1RFTV9ERUZBVUxUCShNQUtFTENJRChMQU5HX1NZU1RFTV9ERUZBVUxULCBTT1JUX0RFRkFVTFQpKQorI2RlZmluZSBMT0NBTEVfVVNFUl9ERUZBVUxUCShNQUtFTENJRChMQU5HX1VTRVJfREVGQVVMVCwgU09SVF9ERUZBVUxUKSkgCisKIAogLyogTGFuZ3VhZ2UgSURzICh3ZXJlIGluIHdpbm50LmgsICBmb3Igc29tZSByZWFzb24pICovCiAKQEAgLTE3OCwxNyArMTg5LDg2IEBACiAjZGVmaW5lIExBTkdfVFVSS0lTSCAgICAgICAgICAgICAgICAgICAgIDB4MWYKICNkZWZpbmUgTEFOR19VS1JBSU5JQU4gICAgICAgICAgICAgICAgICAgMHgyMgogCi0vKiAiZGVmYXVsdCJpc2ggdmFsdWVzICovCisvKiBTdWJsYW5ndWFnZSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBTVUJMQU5HX05FVVRSQUwgICAgICAgICAgICAgICAgICAweDAwICAgIC8qIGxhbmd1YWdlIG5ldXRyYWwgKi8KKyNkZWZpbmUgU1VCTEFOR19ERUZBVUxUICAgICAgICAgICAgICAgICAgMHgwMSAgICAvKiB1c2VyIGRlZmF1bHQgKi8KKyNkZWZpbmUgU1VCTEFOR19TWVNfREVGQVVMVCAgICAgICAgICAgICAgMHgwMiAgICAvKiBzeXN0ZW0gZGVmYXVsdCAqLwogCi0jZGVmaW5lIFNPUlRfREVGQVVMVCAgICAgIDAKLSNkZWZpbmUgU1VCTEFOR19ERUZBVUxUICAgMQotI2RlZmluZSBTVUJMQU5HX1NZU19ERUZBVUxUIDEgLyogRklYTUU6IEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIHJpZ2h0ICovCisjZGVmaW5lIFNVQkxBTkdfQVJBQklDICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgU1VCTEFOR19BUkFCSUNfSVJBUSAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBTVUJMQU5HX0FSQUJJQ19FR1lQVCAgICAgICAgICAgICAweDAzCisjZGVmaW5lIFNVQkxBTkdfQVJBQklDX0xJQllBICAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgU1VCTEFOR19BUkFCSUNfQUxHRVJJQSAgICAgICAgICAgMHgwNQorI2RlZmluZSBTVUJMQU5HX0FSQUJJQ19NT1JPQ0NPICAgICAgICAgICAweDA2CisjZGVmaW5lIFNVQkxBTkdfQVJBQklDX1RVTklTSUEgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgU1VCTEFOR19BUkFCSUNfT01BTiAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBTVUJMQU5HX0FSQUJJQ19ZRU1FTiAgICAgICAgICAgICAweDA5CisjZGVmaW5lIFNVQkxBTkdfQVJBQklDX1NZUklBICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgU1VCTEFOR19BUkFCSUNfSk9SREFOICAgICAgICAgICAgMHgxMQorI2RlZmluZSBTVUJMQU5HX0FSQUJJQ19MRUJBTk9OICAgICAgICAgICAweDEyCisjZGVmaW5lIFNVQkxBTkdfQVJBQklDX0tVV0FJVCAgICAgICAgICAgIDB4MTMKKyNkZWZpbmUgU1VCTEFOR19BUkFCSUNfVUFFICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBTVUJMQU5HX0FSQUJJQ19CQUhSQUlOICAgICAgICAgICAweDE1CisjZGVmaW5lIFNVQkxBTkdfQVJBQklDX1FBVEFSICAgICAgICAgICAgIDB4MTYKKyNkZWZpbmUgU1VCTEFOR19DSElORVNFX1RSQURJVElPTkFMICAgICAgMHgwMQorI2RlZmluZSBTVUJMQU5HX0NISU5FU0VfU0lNUExJRklFRCAgICAgICAweDAyCisjZGVmaW5lIFNVQkxBTkdfQ0hJTkVTRV9IT05HS09ORyAgICAgICAgIDB4MDMKKyNkZWZpbmUgU1VCTEFOR19DSElORVNFX1NJTkdBUE9SRSAgICAgICAgMHgwNAorI2RlZmluZSBTVUJMQU5HX0RVVENIICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFNVQkxBTkdfRFVUQ0hfQkVMR0lBTiAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgU1VCTEFOR19FTkdMSVNIX1VTICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBTVUJMQU5HX0VOR0xJU0hfVUsgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9BVVMgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgU1VCTEFOR19FTkdMSVNIX0NBTiAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBTVUJMQU5HX0VOR0xJU0hfTlogICAgICAgICAgICAgICAweDA1CisjZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9FSVJFICAgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgU1VCTEFOR19FTkdMSVNIX1NBRlJJQ0EgICAgICAgICAgMHgwNworI2RlZmluZSBTVUJMQU5HX0VOR0xJU0hfSkFNQUlDQSAgICAgICAgICAweDA4CisjZGVmaW5lIFNVQkxBTkdfRU5HTElTSF9DQVJSSUJFQU4gICAgICAgIDB4MDkKKyNkZWZpbmUgU1VCTEFOR19GUkVOQ0ggICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBTVUJMQU5HX0ZSRU5DSF9CRUxHSUFOICAgICAgICAgICAweDAyCisjZGVmaW5lIFNVQkxBTkdfRlJFTkNIX0NBTkFESUFOICAgICAgICAgIDB4MDMKKyNkZWZpbmUgU1VCTEFOR19GUkVOQ0hfU1dJU1MgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBTVUJMQU5HX0ZSRU5DSF9MVVhFTUJPVVJHICAgICAgICAweDA1CisjZGVmaW5lIFNVQkxBTkdfR0VSTUFOICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgU1VCTEFOR19HRVJNQU5fU1dJU1MgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBTVUJMQU5HX0dFUk1BTl9BVVNUUklBTiAgICAgICAgICAweDAzCisjZGVmaW5lIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkcgICAgICAgIDB4MDQKKyNkZWZpbmUgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTiAgICAgMHgwNQorI2RlZmluZSBTVUJMQU5HX0lUQUxJQU4gICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFNVQkxBTkdfSVRBTElBTl9TV0lTUyAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgU1VCTEFOR19LT1JFQU4gICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBTVUJMQU5HX0tPUkVBTl9KT0hBQiAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFNVQkxBTkdfTk9SV0VHSUFOX0JPS01BTCAgICAgICAgIDB4MDEKKyNkZWZpbmUgU1VCTEFOR19OT1JXRUdJQU5fTllOT1JTSyAgICAgICAgMHgwMgorI2RlZmluZSBTVUJMQU5HX1BPUlRVR1VFU0UgICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4gICAgIDB4MDEKKyNkZWZpbmUgU1VCTEFOR19TUEFOSVNIICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBTVUJMQU5HX1NQQU5JU0hfTUVYSUNBTiAgICAgICAgICAweDAyCisjZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9NT0RFUk4gICAgICAgICAgIDB4MDMKKyNkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0dVQVRFTUFMQSAgICAgICAgMHgwNAorI2RlZmluZSBTVUJMQU5HX1NQQU5JU0hfQ09TVEFSSUNBICAgICAgICAweDA1CisjZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9QQU5BTUEgICAgICAgICAgIDB4MDYKKyNkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0RPTUlOSUNBTiAgICAgICAgMHgwNworI2RlZmluZSBTVUJMQU5HX1NQQU5JU0hfVkVORVpVRUxBICAgICAgICAweDA4CisjZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9DT0xPTUJJQSAgICAgICAgIDB4MDkKKyNkZWZpbmUgU1VCTEFOR19TUEFOSVNIX1BFUlUgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBTVUJMQU5HX1NQQU5JU0hfQVJHRU5USU5BICAgICAgICAweDExCisjZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9FQ1VBRE9SICAgICAgICAgIDB4MTIKKyNkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0NISUxFICAgICAgICAgICAgMHgxMworI2RlZmluZSBTVUJMQU5HX1NQQU5JU0hfVVJVR1VBWSAgICAgICAgICAweDE0CisjZGVmaW5lIFNVQkxBTkdfU1BBTklTSF9QQVJBR1VBWSAgICAgICAgIDB4MTUKKyNkZWZpbmUgU1VCTEFOR19TUEFOSVNIX0JPTElWSUEgICAgICAgICAgMHgxNgogCisvKiBTb3J0IGRlZmluaXRpb25zICovCisjZGVmaW5lIFNPUlRfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBTT1JUX0pBUEFORVNFX1hKSVMgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgU09SVF9KQVBBTkVTRV9VTklDT0RFICAgICAgICAgICAgMHgxCisjZGVmaW5lIFNPUlRfQ0hJTkVTRV9CSUc1ICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBTT1JUX0NISU5FU0VfVU5JQ09ERSAgICAgICAgICAgICAweDEKKyNkZWZpbmUgU09SVF9LT1JFQU5fS1NDICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIFNPUlRfS09SRUFOX1VOSUNPREUgICAgICAgICAgICAgIDB4MQogCi0jZGVmaW5lIExBTkdfU1lTVEVNX0RFRkFVTFQgICAoTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfU1lTX0RFRkFVTFQpKQotI2RlZmluZSBMQU5HX1VTRVJfREVGQVVMVCAgICAgKE1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQpKQotI2RlZmluZSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQgKE1BS0VMQ0lEKExBTkdfU1lTVEVNX0RFRkFVTFQsIFNPUlRfREVGQVVMVCkpCi0jZGVmaW5lIExPQ0FMRV9VU0VSX0RFRkFVTFQgICAoTUFLRUxDSUQoTEFOR19VU0VSX0RFRkFVTFQsIFNPUlRfREVGQVVMVCkpIAogCiAvKiBMb2NhbGUgRGVwZW5kZW50IE1hcHBpbmcgRmxhZ3MgKi8KICNkZWZpbmUgTENNQVBfTE9XRVJDQVNFCTB4MDAwMDAxMDAJLyogbG93ZXIgY2FzZSBsZXR0ZXJzICovCkBAIC0xOTYsNiArMjc2LDggQEAKICNkZWZpbmUgTENNQVBfU09SVEtFWQkweDAwMDAwNDAwCS8qIFdDIHNvcnQga2V5IChub3JtYWxpemUpICovCiAjZGVmaW5lIExDTUFQX0JZVEVSRVYJMHgwMDAwMDgwMAkvKiBieXRlIHJldmVyc2FsICovCiAKKyNkZWZpbmUgU09SVF9TVFJJTkdTT1JUIDB4MDAwMDEwMDAgICAgICAvKiB0YWtlIHB1bmN0dWF0aW9uIGludG8gYWNjb3VudCAqLworCiAjZGVmaW5lIExDTUFQX0hJUkFHQU5BCTB4MDAxMDAwMDAJLyogbWFwIGthdGFrYW5hIHRvIGhpcmFnYW5hICovCiAjZGVmaW5lIExDTUFQX0tBVEFLQU5BCTB4MDAyMDAwMDAJLyogbWFwIGhpcmFnYW5hIHRvIGthdGFrYW5hICovCiAjZGVmaW5lIExDTUFQX0hBTEZXSURUSAkweDAwNDAwMDAwCS8qIG1hcCBkb3VibGUgYnl0ZSB0byBzaW5nbGUgYnl0ZSAqLwpAQCAtMjE2LDUgKzI5OCwyMSBAQAogLyogdXNlIHRoaXMgaW4gYSBXaW5lTGliIHByb2dyYW0gaWYgeW91IHJlYWxseSB3YW50IGFsbCB0eXBlcyAqLwogI2RlZmluZSBMT0NBTEVfVElNRURBVEVCT1RIICAgIDB4MDAwMDAzMDAgIC8qIGZ1bGwgc2V0ICovCiAKKy8qIFByb3RvdHlwZXMgZm9yIFVuaWNvZGUgY2FzZSBjb252ZXJzaW9uIHJvdXRpbmVzICovCitXQ0hBUiB0b3d1cHBlcihXQ0hBUik7CitXQ0hBUiB0b3dsb3dlcihXQ0hBUik7CisKKy8qIERlZmluaXRpb25zIGZvciBJc1RleHRVbmljb2RlKCkgZnVuY3Rpb24gKi8KKyNkZWZpbmUgSVNfVEVYVF9VTklDT0RFX0FTQ0lJMTYJCTB4MDAwMQorI2RlZmluZSBJU19URVhUX1VOSUNPREVfU0lHTkFUVVJFCTB4MDAwOAorI2RlZmluZSBJU19URVhUX1VOSUNPREVfUkVWRVJTRV9BU0NJSTE2CTB4MDAxMAorI2RlZmluZSBJU19URVhUX1VOSUNPREVfUkVWRVJTRV9TSUdOQVRVUkUgMHgwMDgwCisjZGVmaW5lIElTX1RFWFRfVU5JQ09ERV9JTExFR0FMX0NIQVJTCTB4MDEwMAorI2RlZmluZSBJU19URVhUX1VOSUNPREVfT0REX0xFTkdUSAkweDAyMDAKKworLyogVGVzdHMgdGhhdCB3ZSBjdXJyZW50bHkgaW1wbGVtZW50ICovCisjZGVmaW5lIElUVV9JTVBMRU1FTlRFRF9URVNUUyBcCisJSVNfVEVYVF9VTklDT0RFX1NJR05BVFVSRXwgXAorCUlTX1RFWFRfVU5JQ09ERV9PRERfTEVOR1RICiAKICNlbmRpZiAgLyogX19XSU5FX1dJTk5MU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbm50LmggYi9pbmNsdWRlL3dpbm50LmgKaW5kZXggMGRjYTNmNy4uNjQxZGY5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5udC5oCisrKyBiL2luY2x1ZGUvd2lubnQuaApAQCAtMzU2LDQgKzM1NiwxMSBAQAogI2RlZmluZSBGSUxFX0dFTkVSSUNfRVhFQ1VURSAgICAgIChTVEFOREFSRF9SSUdIVFNfRVhFQ1VURSB8IEZJTEVfRVhFQ1VURSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9SRUFEX0FUVFJJQlVURVMgfCBTWU5DSFJPTklaRSkKIAorCisvKiBSZWdpc3RyeSBzZWN1cml0eSB2YWx1ZXMgKi8KKyNkZWZpbmUgT1dORVJfU0VDVVJJVFlfSU5GT1JNQVRJT04gIDB4MDAwMDAwMDEKKyNkZWZpbmUgR1JPVVBfU0VDVVJJVFlfSU5GT1JNQVRJT04gIDB4MDAwMDAwMDIKKyNkZWZpbmUgREFDTF9TRUNVUklUWV9JTkZPUk1BVElPTiAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU0FDTF9TRUNVUklUWV9JTkZPUk1BVElPTiAgIDB4MDAwMDAwMDgKKwogI2VuZGlmICAvKiBfX1dJTkVfV0lOTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5zb2NrLmggYi9pbmNsdWRlL3dpbnNvY2suaAppbmRleCBmOGJmN2VmLi5hYTRiZGNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbnNvY2suaAorKysgYi9pbmNsdWRlL3dpbnNvY2suaApAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPG5ldGRiLmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCiAKICNwcmFnbWEgcGFjaygxKQogCkBAIC0xNjQsOCArMTY1LDggQEAKICNkZWZpbmUgSU5WQUxJRF9TT0NLRVQzMiAJICAgKH4wKQogI2RlZmluZSBTT0NLRVRfRVJST1IgICAgICAgICAgICAgICAoLTEpCiAKLURFQ0xfV0lORUxJQl9UWVBFKElOVkFMSURfU09DS0VUKTsKLURFQ0xfV0lORUxJQl9UWVBFKFNPQ0tFVCk7CitERUNMX1dJTkVMSUJfVFlQRShJTlZBTElEX1NPQ0tFVCkKK0RFQ0xfV0lORUxJQl9UWVBFKFNPQ0tFVCkKIAogLyoKICAqIFR5cGVzCkBAIC01NjMsNiArNTY0LDcgQEAKICAgSFRBU0sxNiAgICAgICAgICAgICAgIHRpZDsgICAgCQkvKiBvd25pbmcgdGFzayBpZCAtIHByb2Nlc3MgbWlnaHQgYmUgYmV0dGVyICovCiB9IFdTSU5GTywgKkxQV1NJTkZPOwogCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCiBpbnQgV1NfZHVwX2hlKExQV1NJTkZPIHB3c2ksIHN0cnVjdCBob3N0ZW50KiBwX2hlLCBpbnQgZmxhZyk7CiBpbnQgV1NfZHVwX3BlKExQV1NJTkZPIHB3c2ksIHN0cnVjdCBwcm90b2VudCogcF9wZSwgaW50IGZsYWcpOwogaW50IFdTX2R1cF9zZShMUFdTSU5GTyBwd3NpLCBzdHJ1Y3Qgc2VydmVudCogcF9zZSwgaW50IGZsYWcpOwpAQCAtNTcxLDYgKzU3MywxMSBAQAogdm9pZCBXU19kb19hc3luY19nZXRwcm90byhMUFdTSU5GTywgdW5zaWduZWQpOwogdm9pZCBXU19kb19hc3luY19nZXRzZXJ2KExQV1NJTkZPLCB1bnNpZ25lZCk7CiAKKy8qIHdpbnNvY2tfZG5zLmMgKi8KK2V4dGVybiBIQU5ETEUxNiBfX1dTQXN5bmNEQlF1ZXJ5KExQV1NJTkZPIHB3c2ksIEhXTkQzMiBoV25kLCBVSU5UMzIgdU1zZywgCisgICAgSU5UMzIgdHlwZSwgTFBDU1RSIGluaXQsIElOVDMyIGxlbiwgTFBDU1RSIHByb3RvLCB2b2lkKiBzYnVmLCAKKyAgICBJTlQzMiBidWZsZW4sIFVJTlQzMiBmbGFnKTsKKwogaW50IFdJTlNPQ0tfYXN5bmNfaW8oaW50IGZkLCBpbnQgYXN5bmMpOwogaW50IFdJTlNPQ0tfdW5ibG9ja19pbyhpbnQgZmQsIGludCBub2Jsb2NrKTsKIApAQCAtNTg2LDUgKzU5Myw3IEBACiBVSU5UMTYgd3NhRXJybm8odm9pZCk7CiBVSU5UMTYgd3NhSGVycm5vKHZvaWQpOwogCitleHRlcm4gSU5UMzIgV0lOU09DS19EZWxldGVUYXNrV1NJKCBUREIqIHBUYXNrLCBzdHJ1Y3QgX1dTSU5GTyogKTsKKwogI2VuZGlmICAvKiBfV0lOU09DS0FQSV8gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS93cmNfcnNjLmggYi9pbmNsdWRlL3dyY19yc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWJmZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS93cmNfcnNjLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIFdpbmUgUmVzb3VyY2UgQ29tcGlsZXIgc3RydWN0dXJlIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDE5OTggQmVydGhvIEEuIFN0dWx0aWVucworICoKKyAqLworCisjaWYgIWRlZmluZWQoX19XUkNfUlNDX0gpICYmICFkZWZpbmVkKF9fV0lORV9XUkNfUlNDX0gpCisjZGVmaW5lIF9fV1JDX1JTQ19ICisjZGVmaW5lIF9fV0lORV9XUkNfUlNDX0gKKworI2lmbmRlZiBfX1dJTkVfV0lOVFlQRVNfSAorI2luY2x1ZGUgPHdpbnR5cGVzLmg+CQkvKiBGb3IgdHlwZXMgaW4gc3RydWN0dXJlICovCisjZW5kaWYKKworLyoKKyAqIE5vdGUgb24gdGhlIHJlc291cmNlIGFuZCB0eXBlIG5hbWVzOgorICoKKyAqIFRoZXNlIGFyZSAoaWYgbm9uLW51bGwpIHBvaW50ZXJzIHRvIGEgcGFzY2FsLXN0eWxlCisgKiBzdHJpbmcuIFRoZSBmaXJzdCBjaGFyYWN0ZXIgKEJZVEUgZm9yIDE2IGJpdCBhbmQgV0NIQVIKKyAqIGZvciAzMiBiaXQgcmVzb3VyY2VzKSBjb250YWlucyB0aGUgbGVuZ3RoIGFuZCB0aGUKKyAqIHJlc3QgaXMgdGhlIHN0cmluZy4gVGhleSBhcmUgX25vdF8gJ1wwJyB0ZXJtaW5hdGVkIQorICovCisKK3R5cGVkZWYgc3RydWN0IHdyY19yZXNvdXJjZTE2Cit7CisJSU5UMzIJcmVzaWQ7CQkvKiBUaGUgcmVzb3VyY2UgaWQgaWYgcmVzbmFtZSA9PSBOVUxMICovCisJTFBTVFIJcmVzbmFtZTsKKwlJTlQzMglyZXN0eXBlOwkvKiBUaGUgcmVzb3VyY2UgdHlwZS1pZCBpZiB0eXBlbmFtZSA9PSBOVUxMICovCisJTFBTVFIJdHlwZW5hbWU7CisJTFBCWVRFCWRhdGE7CQkvKiBBY3R1YWwgcmVzb3VyY2UgZGF0YSAqLworCVVJTlQzMglkYXRhc2l6ZTsJLyogVGhlIHNpemUgb2YgdGhlIHJlc291cmNlICovCit9IHdyY19yZXNvdXJjZTE2X3Q7CisKK3R5cGVkZWYgc3RydWN0IHdyY19yZXNvdXJjZTMyCit7CisJSU5UMzIJcmVzaWQ7CQkvKiBUaGUgcmVzb3VyY2UgaWQgaWYgcmVzbmFtZSA9PSBOVUxMICovCisJTFBXU1RSCXJlc25hbWU7CisJSU5UMzIJcmVzdHlwZTsJLyogVGhlIHJlc291cmNlIHR5cGUtaWQgaWYgdHlwZW5hbWUgPT0gTlVMTCAqLworCUxQV1NUUgl0eXBlbmFtZTsKKwlMUEJZVEUJZGF0YTsJCS8qIEFjdHVhbCByZXNvdXJjZSBkYXRhICovCisJVUlOVDMyCWRhdGFzaXplOwkvKiBUaGUgc2l6ZSBvZiB0aGUgcmVzb3VyY2UgKi8KK30gd3JjX3Jlc291cmNlMzJfdDsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUveDExZHJ2LmggYi9pbmNsdWRlL3gxMWRydi5oCmluZGV4IDc4ZDkxMWQuLmM5NmE2ZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveDExZHJ2LmgKKysrIGIvaW5jbHVkZS94MTFkcnYuaApAQCAtNTEsNiArNTEsNyBAQAogc3RydWN0IHRhZ0RDOwogc3RydWN0IHRhZ0RldmljZUNhcHM7CiAKK2V4dGVybiBCT09MMzIgWDExRFJWX0luaXQodm9pZCk7CiBleHRlcm4gQk9PTDMyIFgxMURSVl9CaXRCbHQoIHN0cnVjdCB0YWdEQyAqZGNEc3QsIElOVDMyIHhEc3QsIElOVDMyIHlEc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIHdpZHRoLCBJTlQzMiBoZWlnaHQsIHN0cnVjdCB0YWdEQyAqZGNTcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIHhTcmMsIElOVDMyIHlTcmMsIERXT1JEIHJvcCApOwpAQCAtMTE2LDQgKzExNyw2IEBACiAKIGV4dGVybiBDUklUSUNBTF9TRUNUSU9OIFgxMURSVl9Dcml0U2VjdGlvbjsKIAorZXh0ZXJuIHZvaWQgX1hJbml0SW1hZ2VGdW5jUHRycyhYSW1hZ2UgKik7CisKICNlbmRpZiAgLyogX19XSU5FX1gxMURSVl9IICovCmRpZmYgLS1naXQgYS9pcGMvZGRlX2F0b20uYyBiL2lwYy9kZGVfYXRvbS5jCmluZGV4IDUwNDI4MGYuLmYxY2Q0YmYgMTAwNjQ0Ci0tLSBhL2lwYy9kZGVfYXRvbS5jCisrKyBiL2lwYy9kZGVfYXRvbS5jCkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgImRkZV9hdG9tLmgiCiAjaW5jbHVkZSAic2htX21haW5fYmxrLmgiCiAjaW5jbHVkZSAic2htX2ZyYWdtZW50LmgiCkBAIC0xODcsNyArMTg2LDcgQEAKICAgc3dpdGNoIChhdG9tX29mcz1BVE9NX09GUyhhdG9tX2lkeCkpIHsKICAgICBjYXNlIERFTEVURUQ6CiAgICAgY2FzZSBFTVBUWToKLSAgICAgIGZwcmludGYoc3RkZXJyLCJ0cnlpbmcgdG8gZnJlZSB1bmFsbG9jYXRlZCBhdG9tICVkXG4iLCBhdG9tKTsKKyAgICAgIFdBUk4oYXRvbSwgIlRyeWluZyB0byBmcmVlIHVuYWxsb2NhdGVkIGF0b20gJWRcbiIsIGF0b20pOwogICAgICAgcmV0dmFsPWF0b207CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0IDoKQEAgLTI3Myw3ICsyNzIsNyBAQAogICBzaG1fcmVhZF93YWl0KG1haW5fYmxvY2stPnNlbSk7CiAgIGF0b21fb2ZzPUFUT01fT0ZTKGF0b21faWR4KTsKICAgaWYgKGF0b21fb2ZzPT1FTVBUWSB8fCBhdG9tX29mcz09REVMRVRFRCkgewotICAgICBmcHJpbnRmKHN0ZGVyciwiR2xvYmFsR2V0QXRvbU5hbWU6IGlsbGVnYWwgYXRvbT0lZFxuIiwoaW50KWF0b20pOworICAgICBXQVJOKGF0b20sIklsbGVnYWwgYXRvbT0lZFxuIiwoaW50KWF0b20pOwogICAgICBzaXplPTA7CiAgIH0gZWxzZSB7CQkJICAgLyogbm9uIGVtcHR5IGVudHJ5ICovCiAgICAgIC8qIHN0cmluZyBsZW5ndGggd2lsbCBiZSBhdCBtb3N0IGNvdW50LTEsIGZpbmQgYWN0dWFsIHNpemUgKi8KZGlmZiAtLWdpdCBhL2lwYy9kZGVfbWVtLmMgYi9pcGMvZGRlX21lbS5jCmluZGV4IDUwNGIzMzAuLmVjZmQxNjQgMTAwNjQ0Ci0tLSBhL2lwYy9kZGVfbWVtLmMKKysrIGIvaXBjL2RkZV9tZW0uYwpAQCAtOSw3ICs5LDYgQEAKICAqLwogI2lmZGVmIENPTkZJR19JUEMKIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJsZHQuaCIKQEAgLTEzNiw3ICsxMzUsNyBAQAogICAgICAgIGhfaW5mbz0gKHN0cnVjdCBoYW5kbGVfaW5mbyAqKQogCSAgc2htX0ZyYWdQdHJBbGxvYyhibG9jaywgc2l6ZStzaXplb2Yoc3RydWN0IGhhbmRsZV9pbmZvKSk7CiAgICAgICAgaWYgKGhfaW5mbz09TlVMTCkgewotCSAgZnByaW50ZihzdGRlcnIsIkRERV9tYWxsb2M6IEJVRyEgdW5hbGxvY2F0ZWQgZnJhZ21lbnRcbiIpOworCSAgRVJSKGdsb2JhbCwiQlVHISB1bmFsbG9jYXRlZCBmcmFnbWVudFxuIik7CiAJICBzaG1fd3JpdGVfc2lnbmFsKG1haW5fYmxvY2stPnByb2NbY3Vycl9wcm9jX2lkeF0uc2VtKTsKIAkgIHJldHVybiAwOwogICAgICAgIH0KZGlmZiAtLWdpdCBhL2lwYy9kZGVfcHJvYy5jIGIvaXBjL2RkZV9wcm9jLmMKaW5kZXggNWQ0YWUxZC4uMzc5NTM4ZiAxMDA2NDQKLS0tIGEvaXBjL2RkZV9wcm9jLmMKKysrIGIvaXBjL2RkZV9wcm9jLmMKQEAgLTEzOSw3ICsxMzksNyBAQAogICB9CiAgIGVsc2UJewogICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgZnByaW50ZihzdGRlcnIsImRkZV9wcm9jX2FkZDogQ2FuJ3QgYWxsb2NhdGUgcHJvY2Vzc1xuIik7CisgICAgIFdBUk4oZGRlLCJDYW4ndCBhbGxvY2F0ZSBwcm9jZXNzXG4iKTsKICAgfQogICBzaG1fd3JpdGVfc2lnbmFsKG1haW5fYmxvY2stPnNlbSk7CiB9CkBAIC0yMzEsNyArMjMxLDcgQEAKIAlyZXR1cm4gVFJVRTsKICAgICAgfSBlbHNlIHsKIAlmZmx1c2goc3Rkb3V0KTsKLQlmcHJpbnRmKHN0ZGVyciwiZ2V0X2FjazogRERFX0RvT25lTWVzc2FnZTogdGltZW91dFxuIik7CisJV0FSTihkZGUsImdldF9hY2s6IERERV9Eb09uZU1lc3NhZ2U6IHRpbWVvdXRcbiIpOwogCXJldHVybiBGQUxTRTsKICAgICAgfQogICB9CkBAIC0yNzgsOCArMjc4LDcgQEAKICAgICByZXR1cm4gSURYX1RPX0hXTkQoZGRlX3duZF9pZHgpOwogICB9CiAKLSAgZnByaW50ZihzdGRlcnIsCi0JICAiSFdORF9Mb2NhbDJSZW1vdGU6IENhbid0IG1hcCBhbnkgbW9yZSB3aW5kb3dzIHRvIERERSB3aW5kb3dzXG4iKTsKKyAgV0FSTihkZGUsICJDYW4ndCBtYXAgYW55IG1vcmUgd2luZG93cyB0byBEREUgd2luZG93c1xuIik7CiAgIHJldHVybiAwOwkJCQogfQogCmRpZmYgLS1naXQgYS9pcGMvc2htX2Jsb2NrLmMgYi9pcGMvc2htX2Jsb2NrLmMKaW5kZXggNmZlYWJkNS4uMjVlMzg4MSAxMDA2NDQKLS0tIGEvaXBjL3NobV9ibG9jay5jCisrKyBiL2lwYy9zaG1fYmxvY2suYwpAQCAtMTIsNyArMTIsNiBAQAogI2RlZmluZSBpbmxpbmUgX19pbmxpbmVfXwogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zZW0uaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpkaWZmIC0tZ2l0IGEvaXBjL3NobV9mcmFnbWVudC5jIGIvaXBjL3NobV9mcmFnbWVudC5jCmluZGV4IGY1ZWM3YmYuLmRhYzM0MzEgMTAwNjQ0Ci0tLSBhL2lwYy9zaG1fZnJhZ21lbnQuYworKysgYi9pcGMvc2htX2ZyYWdtZW50LmMKQEAgLTE2NywxNCArMTY3LDE0IEBACiAKICAgaXRlbT1ibG9jay0+ZnJlZV9saXN0OwogICBpZiAoaXRlbT09MCkgewotICAgICBmcHJpbnRmKHN0ZGRlYiwibm8gZnJlZSBmcmFnbWVudHMiKTsKKyAgICAgRFVNUCgibm8gZnJlZSBmcmFnbWVudHMiKTsKICAgfSBlbHNlIHsKICAgICAgZm9yICg7IGl0ZW0gOyBpdGVtPWZyYWdtZW50LT5pbmZvLm5leHQpIHsKIAlmcmFnbWVudD1GUkFHX1BUUihibG9jayxpdGVtKTsKLQlmcHJpbnRmKHN0ZGRlYiwiezB4JTA0eCwweCUwNHh9ICIsaXRlbSxmcmFnbWVudC0+c2l6ZSk7CisJRFVNUCgiezB4JTA0eCwweCUwNHh9ICIsaXRlbSxmcmFnbWVudC0+c2l6ZSk7CiAgICAgIH0KICAgfQotICBmcHJpbnRmKHN0ZGRlYiwiIFt0b3RhbCBmcmVlPSUwNHhdXG4iLGJsb2NrLT5mcmVlKTsKKyAgRFVNUCgiIFt0b3RhbCBmcmVlPSUwNHhdXG4iLGJsb2NrLT5mcmVlKTsKICAgZmZsdXNoKHN0ZGRlYik7CiB9CiAKZGlmZiAtLWdpdCBhL2lwYy9zaG1fbWFpbl9ibGsuYyBiL2lwYy9zaG1fbWFpbl9ibGsuYwppbmRleCA3YzZlOTBlLi40NDU4ZjVjIDEwMDY0NAotLS0gYS9pcGMvc2htX21haW5fYmxrLmMKKysrIGIvaXBjL3NobV9tYWluX2Jsay5jCkBAIC0xMiw3ICsxMiw2IEBACiAjZGVmaW5lIGlubGluZSBfX2lubGluZV9fCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3NlbS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgpAQCAtMjUyLDggKzI1MSw3IEBACiB7CiAgIGlmICggIXNobV9sb2NhdGVfTWFpbkJsb2NrKFdpbmVLZXkpCiAgICAgICAgJiYgIXNobV9jcmVhdGVfTWFpbkJsb2NrKFdpbmVLZXkpKSB7IAotICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgZnByaW50ZihzdGRlcnIsInNobV9pbml0OiBmYWlsZWQgdG8gaW5pdCBtYWluIHNobSBibG9ja1xuIik7CisgICAgIEVSUihzaG0sICJGYWlsZWQgdG8gaW5pdCBtYWluIHNobSBibG9ja1xuIik7CiAgICAgIGV4aXQoMSk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvaXBjL3NobV9zZW1hcGguYyBiL2lwYy9zaG1fc2VtYXBoLmMKaW5kZXggM2ZiZTBhZC4uZDYzZjFlNSAxMDA2NDQKLS0tIGEvaXBjL3NobV9zZW1hcGguYworKysgYi9pcGMvc2htX3NlbWFwaC5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3NlbS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInNobV9zZW1hcGguaCIKQEAgLTQyLDggKzQxLDggQEAKICAgfSB3aGlsZSAocmV0PDAgJiYgZXJybm89PUVJTlRSKTsgIC8qIGludGVycnVwdGVkIHN5c3RlbSBjYWxsPyAqLwogICAKICAgaWYgKHJldDwwKSAKLSAgICAgZnByaW50ZihzdGRlcnIsImZhaWxlZCBzZW1hcGhvcmUgbG9jayBmb3IgcmVhZC4gc2VtaWQ9JWQsZXJybm89JWRcbiIsCi0JICAgICBzZW1pZCwgZXJybm8pOworICAgICBXQVJOKHNlbSwiKHNlbWlkPSVkLGVycm5vPSVkKTogRmFpbGVkIHNlbWFwaG9yZSBsb2NrIGZvciByZWFkXG4iLAorICAgICAgICAgc2VtaWQsIGVycm5vKTsKIH0KIHZvaWQgc2htX3dyaXRlX3dhaXQoc2htX3NlbSBzZW1pZCkKIHsKQEAgLTY4LDcgKzY3LDcgQEAKICAgfSB3aGlsZSAocmV0PDAgJiYgZXJybm89PUVJTlRSKTsgIC8qIGludGVycnVwdGVkIHN5c3RlbSBjYWxsPyAqLwogCiAgIGlmIChyZXQ8MCkgCQkJICAgLyogdGVzdCBmb3IgdGhlIGVycm9yICovCi0gICAgIGZwcmludGYoc3RkZXJyLCJmYWlsZWQgc2VtYXBob3JlIGxvY2sgZm9yIHdyaXRlLiBzZW1pZD0lZCxlcnJubz0lZFxuIiwKKyAgICAgV0FSTihzZW0sIihzZW1pZD0lZCxlcnJubz0lZCk6IEZhaWxlZCBzZW1hcGhvcmUgbG9jayBmb3Igd3JpdGVcbiIsCiAJICAgICBzZW1pZCwgZXJybm8pOwogfQogdm9pZCBzaG1fd3JpdGVfc2lnbmFsKHNobV9zZW0gc2VtaWQpCkBAIC05MCw3ICs4OSw3IEBACiAgIH0gd2hpbGUgKHJldDwwICYmIGVycm5vPT1FSU5UUik7ICAvKiBpbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbD8gKi8KIAogICBpZiAocmV0PDApIAkJCSAgIC8qIHRlc3QgZm9yIHRoZSBlcnJvciAqLwotICAgICBmcHJpbnRmKHN0ZGVyciwiZmFpbGVkIHNlbWFwaG9yZSB1bmxvY2sgZm9yIHdyaXRlLiBzZW1pZD0lZCxlcnJubz0lZFxuIiwKKyAgICAgV0FSTihzZW0sIihzZW1pZD0lZCxlcnJubz0lZCk6IEZhaWxlZCBzZW1hcGhvcmUgdW5sb2NrIGZvciB3cml0ZVxuIiwKIAkgICAgIHNlbWlkLCBlcnJubyk7CiB9CiAKQEAgLTEwOSw3ICsxMDgsNyBAQAogICB9IHdoaWxlIChyZXQ8MCAmJiBlcnJubz09RUlOVFIpOyAgLyogaW50ZXJydXB0ZWQgc3lzdGVtIGNhbGw/ICovCiAKICAgaWYgKHJldDwwKSAJCQkgICAvKiB0ZXN0IGZvciB0aGUgZXJyb3IgKi8KLSAgICAgZnByaW50ZihzdGRlcnIsImZhaWxlZCBzZW1hcGhvcmUgdW5sb2NrIGZvciByZWFkLiBzZW1pZD0lZCxlcnJubz0lZFxuIiwKKyAgICAgV0FSTihzZW0sIihzZW1pZD0lZCxlcnJubz0lZCk6IEZhaWxlZCBzZW1hcGhvcmUgdW5sb2NrIGZvciByZWFkXG4iLAogCSAgICAgc2VtaWQsIGVycm5vKTsKIH0KIApkaWZmIC0tZ2l0IGEvbG9hZGVyL2xpYnJlcy5jIGIvbG9hZGVyL2xpYnJlcy5jCmluZGV4IGViOTU5OGIuLjM1NzliMGEgMTAwNjQ0Ci0tLSBhL2xvYWRlci9saWJyZXMuYworKysgYi9sb2FkZXIvbGlicmVzLmMKQEAgLTQsNyArNCw2IEBACiAgKiBDb3BpZWQgYW5kIG1vZGlmaWVkIGhlYXZpbHkgZnJvbSBsb2FkZXIvcmVzb3VyY2UuYwogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAibGlicmVzLmgiCkBAIC0xNCwxMyArMTMsMTMgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgUkxFCiB7Ci0gICAgY29uc3Qgc3RydWN0IHJlc291cmNlKiBjb25zdCAqIFJlc291cmNlczsgIC8qIE5VTEwtdGVybWluYXRlZCBhcnJheSBvZiBwb2ludGVycyAqLworICAgIGNvbnN0IHdyY19yZXNvdXJjZTMyX3QgKiBjb25zdCAqIFJlc291cmNlczsgIC8qIE5VTEwtdGVybWluYXRlZCBhcnJheSBvZiBwb2ludGVycyAqLwogICAgIHN0cnVjdCBSTEUqIG5leHQ7CiB9IFJlc0xpc3RFOwogCiBzdGF0aWMgUmVzTGlzdEUqIFJlc291cmNlTGlzdD1OVUxMOwogCi12b2lkIExJQlJFU19SZWdpc3RlclJlc291cmNlcyhjb25zdCBzdHJ1Y3QgcmVzb3VyY2UqIGNvbnN0ICogUmVzKQordm9pZCBMSUJSRVNfUmVnaXN0ZXJSZXNvdXJjZXMoY29uc3Qgd3JjX3Jlc291cmNlMzJfdCAqIGNvbnN0ICogUmVzKQogewogICBSZXNMaXN0RSoqIEN1cnI7CiAgIFJlc0xpc3RFKiBuOwpAQCAtMzgsNyArMzcsNyBAQAogewogICBpbnQgbmFtZWlkPTAsdHlwZWlkOwogICBSZXNMaXN0RSogUmVzQmxvY2s7Ci0gIGNvbnN0IHN0cnVjdCByZXNvdXJjZSogY29uc3QgKiBSZXM7CisgIGNvbnN0IHdyY19yZXNvdXJjZTMyX3QqIGNvbnN0ICogUmVzOwogCiAgIGlmKEhJV09SRChuYW1lKSkKICAgewpAQCAtNzIsMTUgKzcxLDE2IEBACiAgIGVsc2UKICAgICB0eXBlaWQ9TE9XT1JEKHR5cGUpOwogICAKKyAgLyogRklYTUU6IHR5cGVzIGNhbiBiZSBzdHJpbmdzICovCiAgIGZvcihSZXNCbG9jaz1SZXNvdXJjZUxpc3Q7IFJlc0Jsb2NrOyBSZXNCbG9jaz1SZXNCbG9jay0+bmV4dCkKICAgICBmb3IoUmVzPVJlc0Jsb2NrLT5SZXNvdXJjZXM7ICpSZXM7IFJlcysrKQogICAgICAgaWYobmFtZSkKICAgICAgIHsKLQlpZigoKlJlcyktPnR5cGU9PXR5cGVpZCAmJiAhbHN0cmNtcGkzMlcoKExQQ1dTVFIpKCpSZXMpLT5uYW1lLG5hbWUpKQorCWlmKCgqUmVzKS0+cmVzdHlwZT09dHlwZWlkICYmICFsc3RybmNtcGkzMlcoKExQQ1dTVFIpKCgqUmVzKS0+cmVzbmFtZSsxKSwgbmFtZSwgKigoKlJlcyktPnJlc25hbWUpKSkKIAkgIHJldHVybiAoSFJTUkMzMikqUmVzOwogICAgICAgfQogICAgICAgZWxzZQotCWlmKCgqUmVzKS0+dHlwZT09dHlwZWlkICYmICgqUmVzKS0+aWQ9PW5hbWVpZCkKKwlpZigoKlJlcyktPnJlc3R5cGU9PXR5cGVpZCAmJiAoKlJlcyktPnJlc2lkPT1uYW1laWQpCiAJICByZXR1cm4gKEhSU1JDMzIpKlJlczsKICAgcmV0dXJuIDA7CiB9CkBAIC05MSw3ICs5MSw3IEBACiAgKi8KIEhHTE9CQUwzMiBMSUJSRVNfTG9hZFJlc291cmNlKCBISU5TVEFOQ0UzMiBoTW9kdWxlLCBIUlNSQzMyIGhSc3JjICkKIHsKLSAgcmV0dXJuIChIR0xPQkFMMzIpKCgoc3RydWN0IHJlc291cmNlKiloUnNyYyktPmJ5dGVzKTsKKyAgcmV0dXJuIChIR0xPQkFMMzIpKCgod3JjX3Jlc291cmNlMzJfdCopaFJzcmMpLT5kYXRhKTsKIH0KIAogCkBAIC0xMDAsNSArMTAwLDUgQEAKICAqLwogRFdPUkQgTElCUkVTX1NpemVvZlJlc291cmNlKCBISU5TVEFOQ0UzMiBoTW9kdWxlLCBIUlNSQzMyIGhSc3JjICkKIHsKLSAgcmV0dXJuIChEV09SRCkoKChzdHJ1Y3QgcmVzb3VyY2UqKWhSc3JjKS0+c2l6ZSk7CisgIHJldHVybiAoRFdPUkQpKCgod3JjX3Jlc291cmNlMzJfdCopaFJzcmMpLT5kYXRhc2l6ZSk7CiB9CmRpZmYgLS1naXQgYS9sb2FkZXIvbWFpbi5jIGIvbG9hZGVyL21haW4uYwppbmRleCA1YjFlYWVjLi41ZjU5MmE2IDEwMDY0NAotLS0gYS9sb2FkZXIvbWFpbi5jCisrKyBiL2xvYWRlci9tYWluLmMKQEAgLTIsNyArMiw2IEBACiAgKiBNYWluIGluaXRpYWxpemF0aW9uIGNvZGUKICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgpAQCAtMTYsNiArMTUsOCBAQAogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgIm1haW4uaCIKICNpbmNsdWRlICJtZW51LmgiCisjaW5jbHVkZSAibWVzc2FnZS5oIgorI2luY2x1ZGUgIm11bHRpbWVkaWEuaCIKICNpbmNsdWRlICJhdG9tLmgiCiAjaW5jbHVkZSAiZGlhbG9nLmgiCiAjaW5jbHVkZSAiZHJpdmUuaCIKQEAgLTI3LDYgKzI4LDcgQEAKICNpbmNsdWRlICJrZXlib2FyZC5oIgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCisjaW5jbHVkZSAicHJvY2Vzcy5oIgogI2luY2x1ZGUgInNweS5oIgogI2luY2x1ZGUgInR3ZWFrLmgiCiAjaW5jbHVkZSAidXNlci5oIgpAQCAtNDMsOCArNDUsNiBAQAogICovCiBCT09MMzIgTUFJTl9LZXJuZWxJbml0KHZvaWQpCiB7Ci0gICAgZXh0ZXJuIEJPT0wzMiBFVkVOVF9Jbml0KHZvaWQpOwotCiAgICAgLyogSW5pdGlhbGl6ZSBzaWduYWwgaGFuZGxpbmcgKi8KICAgICBpZiAoIVNJR05BTF9Jbml0KCkpIHJldHVybiBGQUxTRTsKIApAQCAtNzgsOSArNzgsNiBAQAogICovCiBCT09MMzIgTUFJTl9Vc2VySW5pdCh2b2lkKQogewotICAgIGV4dGVybiBCT09MMzIgV0lER0VUU19Jbml0KHZvaWQpOwotICAgIGV4dGVybiBCT09MMzIgTVVMVElNRURJQV9Jbml0KHZvaWQpOwotCiAgICAgaW50IHF1ZXVlU2l6ZTsKIAogICAgIC8qIENyZWF0ZSBVU0VSIGFuZCBHREkgaGVhcCAqLwpAQCAtMTYwLDggKzE1Nyw2IEBACiAgKi8KIEJPT0wzMiBNQUlOX1dpbmVsaWJJbml0KCBpbnQgKmFyZ2MsIGNoYXIgKmFyZ3ZbXSApCiB7Ci0gICAgZXh0ZXJuIEJPT0wzMiBQUk9DRVNTX0luaXQodm9pZCk7Ci0KICAgICAvKiBDcmVhdGUgdGhlIGluaXRpYWwgcHJvY2VzcyAqLwogICAgIGlmICghUFJPQ0VTU19Jbml0KCkpIHJldHVybiBGQUxTRTsKIApkaWZmIC0tZ2l0IGEvbG9hZGVyL21vZHVsZS5jIGIvbG9hZGVyL21vZHVsZS5jCmluZGV4IDE3ZjFiYjAuLmMwNGUyYjIgMTAwNjQ0Ci0tLSBhL2xvYWRlci9tb2R1bGUuYworKysgYi9sb2FkZXIvbW9kdWxlLmMKQEAgLTcsNyArNyw2IEBACiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgpkaWZmIC0tZ2l0IGEvbG9hZGVyL25lL21vZHVsZS5jIGIvbG9hZGVyL25lL21vZHVsZS5jCmluZGV4IDBhMmZlNzAuLjg5M2M4MzQgMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZS9tb2R1bGUuYworKysgYi9sb2FkZXIvbmUvbW9kdWxlLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogICAgIGlmICghKHBNb2R1bGUgPSBORV9HZXRQdHIoIGhNb2R1bGUgKSkpCiAgICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIqKioqICUwNHggaXMgbm90IGEgbW9kdWxlIGhhbmRsZVxuIiwgaE1vZHVsZSApOworICAgICAgICBNU0coICIqKioqICUwNHggaXMgbm90IGEgbW9kdWxlIGhhbmRsZVxuIiwgaE1vZHVsZSApOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xODksMTYgKzE4OSwxNiBAQAogdm9pZCBORV9XYWxrTW9kdWxlcyh2b2lkKQogewogICAgIEhNT0RVTEUxNiBoTW9kdWxlID0gaEZpcnN0TW9kdWxlOwotICAgIGZwcmludGYoIHN0ZGVyciwgIk1vZHVsZSBGbGFncyBOYW1lXG4iICk7CisgICAgTVNHKCAiTW9kdWxlIEZsYWdzIE5hbWVcbiIgKTsKICAgICB3aGlsZSAoaE1vZHVsZSkKICAgICB7CiAgICAgICAgIE5FX01PRFVMRSAqcE1vZHVsZSA9IE5FX0dldFB0ciggaE1vZHVsZSApOwogICAgICAgICBpZiAoIXBNb2R1bGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIioqKiogQmFkIG1vZHVsZSAlMDR4IGluIGxpc3RcbiIsIGhNb2R1bGUgKTsKKyAgICAgICAgICAgIE1TRyggIkJhZCBtb2R1bGUgJTA0eCBpbiBsaXN0XG4iLCBoTW9kdWxlICk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiICUwNHggICUwNHggICUuKnNcbiIsIGhNb2R1bGUsIHBNb2R1bGUtPmZsYWdzLAorICAgICAgICBNU0coICIgJTA0eCAgJTA0eCAgJS4qc1xuIiwgaE1vZHVsZSwgcE1vZHVsZS0+ZmxhZ3MsCiAgICAgICAgICAgICAgICAgICooKGNoYXIgKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZSksCiAgICAgICAgICAgICAgICAgIChjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUgKyAxICk7CiAgICAgICAgIGhNb2R1bGUgPSBwTW9kdWxlLT5uZXh0OwpAQCAtNzE2LDExICs3MTYsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICBORV9Mb2FkTW9kdWxlCiAgKgotICogSW1wbGVtZW50YXRpb24gb2YgTG9hZE1vZHVsZSgpLgotICoKLSAqIGNtZF9saW5lIG11c3QgY29udGFpbiB0aGUgd2hvbGUgY29tbWFuZC1saW5lLCBpbmNsdWRpbmcgYXJndlswXSAoYW5kCi0gKiB3aXRob3V0IGEgcHJlY2VkaW5nIGxlbmd0aCBieXRlKS4KLSAqIElmIGNtZF9saW5lIGlzIE5VTEwsIHRoZSBtb2R1bGUgaXMgbG9hZGVkIGFzIGEgbGlicmFyeSBldmVuIGlmIGl0IGlzIGEgLmV4ZQorICogSW1wbGVtZW50YXRpb24gb2YgTG9hZE1vZHVsZTE2KCkuCiAgKi8KIEhJTlNUQU5DRTE2IE5FX0xvYWRNb2R1bGUoIExQQ1NUUiBuYW1lLCBISU5TVEFOQ0UxNiAqaFByZXZJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBpbXBsaWNpdCwgQk9PTDMyIGxpYl9vbmx5ICkKZGlmZiAtLWdpdCBhL2xvYWRlci9uZS9yZXNvdXJjZS5jIGIvbG9hZGVyL25lL3Jlc291cmNlLmMKaW5kZXggODA3ODcxZC4uNzMzOTQ2NyAxMDA2NDQKLS0tIGEvbG9hZGVyL25lL3Jlc291cmNlLmMKKysrIGIvbG9hZGVyL25lL3Jlc291cmNlLmMKQEAgLTUxMyw3ICs1MTMsNyBAQAogICAgIE5FX1RZUEVJTkZPICpwVHlwZUluZm87CiAgICAgTkVfTkFNRUlORk8gKnBOYW1lSW5mbzsKICAgICBXT1JEIGNvdW50OwotICAgIE5FX01PRFVMRSAqcE1vZHVsZSA9IE5FX0dldFB0ciggR2V0RXhlUHRyKGhhbmRsZSkgKTsKKyAgICBORV9NT0RVTEUgKnBNb2R1bGUgPSBORV9HZXRQdHIoIEZhckdldE93bmVyKGhhbmRsZSkgKTsKIAogICAgIGlmICghaGFuZGxlIHx8ICFwTW9kdWxlIHx8ICFwTW9kdWxlLT5yZXNfdGFibGUpIHJldHVybiBoYW5kbGU7CiAKZGlmZiAtLWdpdCBhL2xvYWRlci9uZS9zZWdtZW50LmMgYi9sb2FkZXIvbmUvc2VnbWVudC5jCmluZGV4IGE2NDc4YTUuLjcxOWQ2ZDEgMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZS9zZWdtZW50LmMKKysrIGIvbG9hZGVyL25lL3NlZ21lbnQuYwpAQCAtNTIxLDYgKzUyMSw0NiBAQAogICAgIH0KIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTkVfR2V0RExMSW5pdFBhcmFtcworICovCitzdGF0aWMgVk9JRCBORV9HZXRETExJbml0UGFyYW1zKCBORV9NT0RVTEUgKnBNb2R1bGUsIAorCQkJCSBXT1JEICpoSW5zdCwgV09SRCAqZHMsIFdPUkQgKmhlYXAgKQoreworICAgIFNFR1RBQkxFRU5UUlkgKnBTZWdUYWJsZSA9IE5FX1NFR19UQUJMRSggcE1vZHVsZSApOworCisgICAgaWYgKCEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfU0lOR0xFREFUQSkpCisgICAgeworICAgICAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfTVVMVElQTEVEQVRBIHx8IHBNb2R1bGUtPmRncm91cCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogTm90IFNJTkdMRURBVEEgKi8KKyAgICAgICAgICAgIEVSUihkbGwsICJMaWJyYXJ5IGlzIG5vdCBtYXJrZWQgU0lOR0xFREFUQVxuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgIC8qIERBVEEgTk9ORSBETEwgKi8KKyAgICAgICAgeworICAgICAgICAgICAgKmRzID0gMDsKKyAgICAgICAgICAgICpoZWFwID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlICAvKiBEQVRBIFNJTkdMRSBETEwgKi8KKyAgICB7CisJaWYgKHBNb2R1bGUtPmRncm91cCkgeworICAgICAgICAgICAgKmRzICAgPSBwU2VnVGFibGVbcE1vZHVsZS0+ZGdyb3VwLTFdLnNlbGVjdG9yOworICAgICAgICAgICAgKmhlYXAgPSBwTW9kdWxlLT5oZWFwX3NpemU7CisJfQorCWVsc2UgLyogaG1tLCBETEwgaGFzIG5vIGRncm91cCwKKwkJYnV0IHdoeSBoYXMgaXQgTkVfRkZMQUdTX1NJTkdMRURBVEEgc2V0ID8KKwkJQnVnZ3kgRExMIGNvbXBpbGVyID8gKi8KKwl7CisgICAgICAgICAgICAqZHMgICA9IDA7CisgICAgICAgICAgICAqaGVhcCA9IDA7CisJfQorICAgIH0KKworICAgICpoSW5zdCA9ICpkcyA/ICpkcyA6IHBNb2R1bGUtPnNlbGY7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTkVfSW5pdERMTApAQCAtNTMwLDE1ICs1NzAsOSBAQAogc3RhdGljIEJPT0wzMiBORV9Jbml0RExMKCBUREIqIHBUYXNrLCBORV9NT0RVTEUgKnBNb2R1bGUgKQogewogICAgIFNFR1RBQkxFRU5UUlkgKnBTZWdUYWJsZTsKKyAgICBXT1JEIGhJbnN0LCBkcywgaGVhcCwgZnM7CiAgICAgQ09OVEVYVCBjb250ZXh0OwogCi0gICAgLyogUmVnaXN0ZXJzIGF0IGluaXRpYWxpemF0aW9uIG11c3QgYmU6Ci0gICAgICogY3ggICAgIGhlYXAgc2l6ZQotICAgICAqIGRpICAgICBsaWJyYXJ5IGluc3RhbmNlCi0gICAgICogZHMgICAgIGRhdGEgc2VnbWVudCBpZiBhbnkKLSAgICAgKiBlczpzaSAgY29tbWFuZCBsaW5lIChhbHdheXMgMCkKLSAgICAgKi8KLQogICAgIHBTZWdUYWJsZSA9IE5FX1NFR19UQUJMRSggcE1vZHVsZSApOwogCiAgICAgaWYgKCEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfTElCTU9EVUxFKSB8fApAQCAtNTU2LDQyICs1OTAsMjkgQEAKIAogICAgIGlmICghcE1vZHVsZS0+Y3MpIHJldHVybiBUUlVFOyAgLyogbm8gaW5pdGlhbGl6YXRpb24gY29kZSAqLwogCisKKyAgICAvKiBSZWdpc3RlcnMgYXQgaW5pdGlhbGl6YXRpb24gbXVzdCBiZToKKyAgICAgKiBjeCAgICAgaGVhcCBzaXplCisgICAgICogZGkgICAgIGxpYnJhcnkgaW5zdGFuY2UKKyAgICAgKiBkcyAgICAgZGF0YSBzZWdtZW50IGlmIGFueQorICAgICAqIGVzOnNpICBjb21tYW5kIGxpbmUgKGFsd2F5cyAwKQorICAgICAqLworCiAgICAgbWVtc2V0KCAmY29udGV4dCwgMCwgc2l6ZW9mKGNvbnRleHQpICk7CiAKLSAgICBpZiAoIShwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19TSU5HTEVEQVRBKSkKLSAgICB7Ci0gICAgICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19NVUxUSVBMRURBVEEgfHwgcE1vZHVsZS0+ZGdyb3VwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBOb3QgU0lOR0xFREFUQSAqLwotICAgICAgICAgICAgRVJSKGRsbCwgIkxpYnJhcnkgaXMgbm90IG1hcmtlZCBTSU5HTEVEQVRBXG4iKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgLyogREFUQSBOT05FIERMTCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBEU19yZWcoJmNvbnRleHQpICA9IDA7Ci0gICAgICAgICAgICBFQ1hfcmVnKCZjb250ZXh0KSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAgLyogREFUQSBTSU5HTEUgRExMICovCi0gICAgewotCWlmIChwTW9kdWxlLT5kZ3JvdXApIHsKLSAgICAgICAgICAgIERTX3JlZygmY29udGV4dCkgID0gcFNlZ1RhYmxlW3BNb2R1bGUtPmRncm91cC0xXS5zZWxlY3RvcjsKLSAgICAgICAgICAgIEVDWF9yZWcoJmNvbnRleHQpID0gcE1vZHVsZS0+aGVhcF9zaXplOwotCX0KLQllbHNlIC8qIGhtbSwgRExMIGhhcyBubyBkZ3JvdXAsCi0JCWJ1dCB3aHkgaGFzIGl0IE5FX0ZGTEFHU19TSU5HTEVEQVRBIHNldCA/Ci0JCUJ1Z2d5IERMTCBjb21waWxlciA/ICovCi0JewotICAgICAgICAgICAgRFNfcmVnKCZjb250ZXh0KSAgPSAwOwotICAgICAgICAgICAgRUNYX3JlZygmY29udGV4dCkgPSAwOwotCX0KLSAgICB9CisgICAgTkVfR2V0RExMSW5pdFBhcmFtcyggcE1vZHVsZSwgJmhJbnN0LCAmZHMsICZoZWFwICk7CisgICAgR0VUX0ZTKCBmcyApOworCisgICAgRUNYX3JlZygmY29udGV4dCkgPSBoZWFwOworICAgIEVESV9yZWcoJmNvbnRleHQpID0gaEluc3Q7CisgICAgRFNfcmVnKCZjb250ZXh0KSAgPSBkczsKKyAgICBFU19yZWcoJmNvbnRleHQpICA9IGRzOyAgIC8qIHdobyBrbm93cyAuLi4gKi8KKyAgICBGU19yZWcoJmNvbnRleHQpICA9IGZzOwogCiAgICAgQ1NfcmVnKCZjb250ZXh0KSAgPSBwU2VnVGFibGVbcE1vZHVsZS0+Y3MtMV0uc2VsZWN0b3I7CiAgICAgRUlQX3JlZygmY29udGV4dCkgPSBwTW9kdWxlLT5pcDsKICAgICBFQlBfcmVnKCZjb250ZXh0KSA9IE9GRlNFVE9GKFRIUkVBRF9DdXJyZW50KCktPmN1cl9zdGFjaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoV09SRCkmKChTVEFDSzE2RlJBTUUqKTApLT5icDsKLSAgICBFRElfcmVnKCZjb250ZXh0KSA9IERTX3JlZygmY29udGV4dCkgPyBEU19yZWcoJmNvbnRleHQpIDogcE1vZHVsZS0+c2VsZjsKIAogCiAgICAgcE1vZHVsZS0+Y3MgPSAwOyAgLyogRG9uJ3QgaW5pdGlhbGl6ZSBpdCB0d2ljZSAqLwpAQCAtNjEwLDYgKzYzMSw3IEBACiAKIHN0YXRpYyB2b2lkIE5FX0NhbGxEbGxFbnRyeVBvaW50KCBORV9NT0RVTEUgKnBNb2R1bGUsIERXT1JEIGR3UmVhc29uICkKIHsKKyAgICBXT1JEIGhJbnN0LCBkcywgaGVhcCwgZnM7CiAgICAgRkFSUFJPQzE2IGVudHJ5UG9pbnQ7CiAgICAgV09SRCBvcmRpbmFsOwogICAgIENPTlRFWFQgY29udGV4dDsKQEAgLTYyMiwxNSArNjQ0LDIyIEBACiAKICAgICBtZW1zZXQoICZjb250ZXh0LCAwLCBzaXplb2YoY29udGV4dCkgKTsKIAorICAgIE5FX0dldERMTEluaXRQYXJhbXMoIHBNb2R1bGUsICZoSW5zdCwgJmRzLCAmaGVhcCApOworICAgIEdFVF9GUyggZnMgKTsKKworICAgIERTX3JlZygmY29udGV4dCkgPSBkczsKKyAgICBFU19yZWcoJmNvbnRleHQpID0gZHM7ICAgLyogd2hvIGtub3dzIC4uLiAqLworICAgIEZTX3JlZygmY29udGV4dCkgPSBmczsKKwogICAgIENTX3JlZygmY29udGV4dCkgPSBISVdPUkQoZW50cnlQb2ludCk7CiAgICAgSVBfcmVnKCZjb250ZXh0KSA9IExPV09SRChlbnRyeVBvaW50KTsKICAgICBFQlBfcmVnKCZjb250ZXh0KSA9ICBPRkZTRVRPRiggdGhkYi0+Y3VyX3N0YWNrICkKICAgICAgICAgICAgICAgICAgICAgICAgICArIChXT1JEKSYoKFNUQUNLMTZGUkFNRSopMCktPmJwOwogCiAgICAgKihEV09SRCAqKShzdGFjayAtICA0KSA9IGR3UmVhc29uOyAgICAgIC8qIGR3UmVhc29uICovCi0gICAgKihXT1JEICopIChzdGFjayAtICA2KSA9IHBNb2R1bGUtPnNlbGY7IC8qIGhJbnN0ICovCi0gICAgKihXT1JEICopIChzdGFjayAtICA4KSA9IDA7ICAgICAgICAgICAgIC8qIHdEUyAqLwotICAgICooV09SRCAqKSAoc3RhY2sgLSAxMCkgPSAwOyAgICAgICAgICAgICAvKiB3SGVhcFNpemUgKi8KKyAgICAqKFdPUkQgKikgKHN0YWNrIC0gIDYpID0gaEluc3Q7ICAgICAgICAgLyogaEluc3QgKi8KKyAgICAqKFdPUkQgKikgKHN0YWNrIC0gIDgpID0gZHM7ICAgICAgICAgICAgLyogd0RTICovCisgICAgKihXT1JEICopIChzdGFjayAtIDEwKSA9IGhlYXA7ICAgICAgICAgIC8qIHdIZWFwU2l6ZSAqLwogICAgICooRFdPUkQgKikoc3RhY2sgLSAxNCkgPSAwOyAgICAgICAgICAgICAvKiBkd1Jlc2VydmVkMSAqLwogICAgICooV09SRCAqKSAoc3RhY2sgLSAxNikgPSAwOyAgICAgICAgICAgICAvKiB3UmVzZXJ2ZWQyICovCiAKZGlmZiAtLWdpdCBhL2xvYWRlci9wZV9pbWFnZS5jIGIvbG9hZGVyL3BlX2ltYWdlLmMKaW5kZXggM2QyZGZiZC4uZWY2NzM0YSAxMDA2NDQKLS0tIGEvbG9hZGVyL3BlX2ltYWdlLmMKKysrIGIvbG9hZGVyL3BlX2ltYWdlLmMKQEAgLTM4LDcgKzM4LDYgQEAKIAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTI1MSw3ICsyNTAsNyBAQAogCSAgICByZXMgPSBQRV9Mb2FkTGlicmFyeUV4MzJBKCBidWZmZXIsIHByb2Nlc3MsIDAsIDAgKTsKIAl9CiAJaWYgKHJlcyA8PSAoSE1PRFVMRTMyKSAzMikgewotCSAgICBXQVJOIChtb2R1bGUsICJNb2R1bGUgJXMgbm90IGZvdW5kXG4iLCBuYW1lKTsKKwkgICAgRVJSIChtb2R1bGUsICJNb2R1bGUgJXMgbm90IGZvdW5kXG4iLCBuYW1lKTsKIAkgICAgcmV0dXJuIHJlczsKIAl9CiAJeHdtID0gd20tPm5leHQ7CkBAIC03OTMsNiArNzkyLDcgQEAKICAgICAgICAgaWYgKHdtLT5tb2R1bGUgPCAzMikgCiAgICAgICAgIHsKIAkgICAgcHJvY2Vzcy0+bW9kcmVmX2xpc3QgPSB3bS0+bmV4dDsKKwkgICAgRnJlZUxpYnJhcnkxNiggaE1vZHVsZSk7CiAJICAgIEhlYXBGcmVlKHByb2Nlc3MtPmhlYXAsMCx3bSk7CiAJICAgIEVSUih3aW4zMiwiY2FuJ3QgbG9hZCAlc1xuIixvZnMuc3pQYXRoTmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gMjE7IC8qIEZJWE1FOiBwcm9iYWJseSAwICovCmRpZmYgLS1naXQgYS9sb2FkZXIvcmVzb3VyY2UuYyBiL2xvYWRlci9yZXNvdXJjZS5jCmluZGV4IGM0YmVjMmYuLmU0YjJhMmEgMTAwNjQ0Ci0tLSBhL2xvYWRlci9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9yZXNvdXJjZS5jCkBAIC02LDcgKzYsNiBAQAogICovCiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvbG9hZGVyL3Rhc2suYyBiL2xvYWRlci90YXNrLmMKaW5kZXggMmQyNWVhYy4uYTg0MmMwOCAxMDA2NDQKLS0tIGEvbG9hZGVyL3Rhc2suYworKysgYi9sb2FkZXIvdGFzay5jCkBAIC00LDcgKzQsNiBAQAogICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKQEAgLTI5LDYgKzI4LDcgQEAKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJ0b29saGVscC5oIgogI2luY2x1ZGUgIndpbm50LmgiCisjaW5jbHVkZSAid2luc29jay5oIgogI2luY2x1ZGUgInRocmVhZC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiZGRlX3Byb2MuaCIKQEAgLTM2LDggKzM2LDYgQEAKICAgLyogTWluLiBudW1iZXIgb2YgdGh1bmtzIGFsbG9jYXRlZCB3aGVuIGNyZWF0aW5nIGEgbmV3IHNlZ21lbnQgKi8KICNkZWZpbmUgTUlOX1RIVU5LUyAgMzIKIAotZXh0ZXJuIElOVDMyIFdJTlNPQ0tfRGVsZXRlVGFza1dTSSggVERCKiBwVGFzaywgc3RydWN0IF9XU0lORk8qICk7Ci0KICAgLyogUG9pbnRlciB0byBmdW5jdGlvbiB0byBzd2l0Y2ggdG8gYSBsYXJnZXIgc3RhY2sgKi8KIGludCAoKklGMTYzMl9DYWxsTGFyZ2VTdGFjaykoIGludCAoKmZ1bmMpKCksIHZvaWQgKmFyZyApID0gTlVMTDsKIApAQCAtOTcxLDcgKzk2OSwxMSBAQAogCiAgICAgLyogU2F2ZSB0aGUgb2xkIHN0YWNrICovCiAKLSAgICBwRGF0YS0+b2xkX3NzX3NwICAgPSBwVGFzay0+dGhkYi0+Y3VyX3N0YWNrOworICAgIG9sZEZyYW1lID0gVEhSRUFEX1NUQUNLMTYoIHBUYXNrLT50aGRiICk7CisgICAgLyogcG9wIGZyYW1lICsgYXJncyBhbmQgcHVzaCBicCAqLworICAgIHBEYXRhLT5vbGRfc3Nfc3AgICA9IHBUYXNrLT50aGRiLT5jdXJfc3RhY2sgLSBzaXplb2YoU1RBQ0sxNkZSQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAyICogc2l6ZW9mKFdPUkQpOworICAgICooV09SRCAqKVBUUl9TRUdfVE9fTElOKHBEYXRhLT5vbGRfc3Nfc3ApID0gb2xkRnJhbWUtPmJwOwogICAgIHBEYXRhLT5zdGFja3RvcCAgICA9IHRvcDsKICAgICBwRGF0YS0+c3RhY2ttaW4gICAgPSBwdHI7CiAgICAgcERhdGEtPnN0YWNrYm90dG9tID0gcHRyOwpAQCAtOTgxLDE1ICs5ODMsMTYgQEAKICAgICAvKiBOb3RlOiB3ZSBuZWVkIHRvIHRha2UgdGhlIDMgYXJndW1lbnRzIGludG8gYWNjb3VudDsgb3RoZXJ3aXNlLAogICAgICAqIHRoZSBzdGFjayB3aWxsIHVuZGVyZmxvdyB1cG9uIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24uCiAgICAgICovCi0gICAgb2xkRnJhbWUgPSAoU1RBQ0sxNkZSQU1FICopUFRSX1NFR19UT19MSU4oIHBUYXNrLT50aGRiLT5jdXJfc3RhY2sgKTsKLSAgICBwVGFzay0+dGhkYi0+Y3VyX3N0YWNrID0gUFRSX1NFR19PRkZfVE9fU0VHUFRSKCBzZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciAtIHNpemVvZihTVEFDSzE2RlJBTUUpIC0gMyAqIHNpemVvZihXT1JEKSApOwotICAgIG5ld0ZyYW1lID0gKFNUQUNLMTZGUkFNRSAqKVBUUl9TRUdfVE9fTElOKCBwVGFzay0+dGhkYi0+Y3VyX3N0YWNrICk7CisgICAgY29weVNpemUgPSBvbGRGcmFtZS0+YnAgLSBPRkZTRVRPRihwRGF0YS0+b2xkX3NzX3NwKTsKKyAgICBjb3B5U2l6ZSArPSAzICogc2l6ZW9mKFdPUkQpICsgc2l6ZW9mKFNUQUNLMTZGUkFNRSk7CisgICAgcFRhc2stPnRoZGItPmN1cl9zdGFjayA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggc2VnLCBwdHIgLSBjb3B5U2l6ZSApOworICAgIG5ld0ZyYW1lID0gVEhSRUFEX1NUQUNLMTYoIHBUYXNrLT50aGRiICk7CiAKICAgICAvKiBDb3B5IHRoZSBzdGFjayBmcmFtZSBhbmQgdGhlIGxvY2FsIHZhcmlhYmxlcyB0byB0aGUgbmV3IHN0YWNrICovCiAKLSAgICBjb3B5U2l6ZSA9IG9sZEZyYW1lLT5icCAtIE9GRlNFVE9GKHBEYXRhLT5vbGRfc3Nfc3ApOwotICAgIG1lbW1vdmUoIG5ld0ZyYW1lLCBvbGRGcmFtZSwgTUFYKCBjb3B5U2l6ZSwgc2l6ZW9mKFNUQUNLMTZGUkFNRSkgKSk7CisgICAgbWVtbW92ZSggbmV3RnJhbWUsIG9sZEZyYW1lLCBjb3B5U2l6ZSApOworICAgIG5ld0ZyYW1lLT5icCA9IHB0cjsKKyAgICAqKFdPUkQgKilQVFJfU0VHX09GRl9UT19MSU4oIHNlZywgcHRyICkgPSAwOyAgLyogY2xlYXIgcHJldmlvdXMgYnAgKi8KIH0KIAogCkBAIC0xMDEzLDE4ICsxMDE2LDIzIEBACiAgICAgVFJBQ0UodGFzaywgInJlc3RvcmluZyBzdGFjayAlMDR4OiUwNHhcbiIsCiAJCSBTRUxFQ1RPUk9GKHBEYXRhLT5vbGRfc3Nfc3ApLCBPRkZTRVRPRihwRGF0YS0+b2xkX3NzX3NwKSApOwogCi0gICAgb2xkRnJhbWUgPSAoU1RBQ0sxNkZSQU1FICopUFRSX1NFR19UT19MSU4oIHBUYXNrLT50aGRiLT5jdXJfc3RhY2sgKTsKKyAgICBvbGRGcmFtZSA9IFRIUkVBRF9TVEFDSzE2KCBwVGFzay0+dGhkYiApOworCisgICAgLyogUG9wIGJwIGZyb20gdGhlIHByZXZpb3VzIHN0YWNrICovCisKKyAgICBCUF9yZWcoY29udGV4dCkgPSAqKFdPUkQgKilQVFJfU0VHX1RPX0xJTihwRGF0YS0+b2xkX3NzX3NwKTsKKyAgICBwRGF0YS0+b2xkX3NzX3NwICs9IHNpemVvZihXT1JEKTsKIAogICAgIC8qIFN3aXRjaCBiYWNrIHRvIHRoZSBvbGQgc3RhY2sgKi8KIAotICAgIHBUYXNrLT50aGRiLT5jdXJfc3RhY2sgPSBwRGF0YS0+b2xkX3NzX3NwOworICAgIHBUYXNrLT50aGRiLT5jdXJfc3RhY2sgPSBwRGF0YS0+b2xkX3NzX3NwIC0gc2l6ZW9mKFNUQUNLMTZGUkFNRSk7CiAgICAgU1NfcmVnKGNvbnRleHQpICA9IFNFTEVDVE9ST0YocERhdGEtPm9sZF9zc19zcCk7Ci0gICAgRVNQX3JlZyhjb250ZXh0KSA9IE9GRlNFVE9GKHBEYXRhLT5vbGRfc3Nfc3ApOworICAgIEVTUF9yZWcoY29udGV4dCkgPSBPRkZTRVRPRihwRGF0YS0+b2xkX3NzX3NwKSAtIHNpemVvZihEV09SRCk7IC8qcmV0IGFkZHIqLwogICAgIHBEYXRhLT5vbGRfc3Nfc3AgPSAwOwogCiAgICAgLyogQnVpbGQgYSBzdGFjayBmcmFtZSBmb3IgdGhlIHJldHVybiAqLwogCi0gICAgbmV3RnJhbWUgPSAoU1RBQ0sxNkZSQU1FICopUFRSX1NFR19UT19MSU4oIHBUYXNrLT50aGRiLT5jdXJfc3RhY2sgKTsKKyAgICBuZXdGcmFtZSA9IFRIUkVBRF9TVEFDSzE2KCBwVGFzay0+dGhkYiApOwogICAgIG5ld0ZyYW1lLT5mcmFtZTMyID0gb2xkRnJhbWUtPmZyYW1lMzI7CiAgICAgaWYgKFRSQUNFX09OKHJlbGF5KSkKICAgICB7CmRpZmYgLS1naXQgYS9tZW1vcnkvaGVhcC5jIGIvbWVtb3J5L2hlYXAuYwppbmRleCBiNjA0ZjdjLi42NTg1YWM1IDEwMDY0NAotLS0gYS9tZW1vcnkvaGVhcC5jCisrKyBiL21lbW9yeS9oZWFwLmMKQEAgLTUsNyArNSw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgpkaWZmIC0tZ2l0IGEvbWVtb3J5L2xkdC5jIGIvbWVtb3J5L2xkdC5jCmluZGV4IDRlYmQyMzEuLjE0NDE5MDcgMTAwNjQ0Ci0tLSBhL21lbW9yeS9sZHQuYworKysgYi9tZW1vcnkvbGR0LmMKQEAgLTUsNyArNSw2IEBACiAgKiBDb3B5cmlnaHQgMTk5NSBBbGV4YW5kcmUgSnVsbGlhcmQKICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxlcnJuby5oPgpkaWZmIC0tZ2l0IGEvbWVtb3J5L3NlbGVjdG9yLmMgYi9tZW1vcnkvc2VsZWN0b3IuYwppbmRleCA4ZWRiYzJlLi5mNjI5MGQ4IDEwMDY0NAotLS0gYS9tZW1vcnkvc2VsZWN0b3IuYworKysgYi9tZW1vcnkvc2VsZWN0b3IuYwpAQCAtNjIxLDE3ICs2MjEsMTcgQEAKICAgICBFQVhfcmVnKGNvbnRleHQpID0gcHRyOwogfQogCi12b2lkIFdJTkFQSSBTTWFwTFNfSVBfRUJQXzgoQ09OVEVYVCAqY29udGV4dCkgIHt4X1NNYXBMU19JUF9FQlBfeChjb250ZXh0LDgpO30KLXZvaWQgV0lOQVBJIFNNYXBMU19JUF9FQlBfMTIoQ09OVEVYVCAqY29udGV4dCkge3hfU01hcExTX0lQX0VCUF94KGNvbnRleHQsMTIpO30KLXZvaWQgV0lOQVBJIFNNYXBMU19JUF9FQlBfMTYoQ09OVEVYVCAqY29udGV4dCkge3hfU01hcExTX0lQX0VCUF94KGNvbnRleHQsMTYpO30KLXZvaWQgV0lOQVBJIFNNYXBMU19JUF9FQlBfMjAoQ09OVEVYVCAqY29udGV4dCkge3hfU01hcExTX0lQX0VCUF94KGNvbnRleHQsMjApO30KLXZvaWQgV0lOQVBJIFNNYXBMU19JUF9FQlBfMjQoQ09OVEVYVCAqY29udGV4dCkge3hfU01hcExTX0lQX0VCUF94KGNvbnRleHQsMjQpO30KLXZvaWQgV0lOQVBJIFNNYXBMU19JUF9FQlBfMjgoQ09OVEVYVCAqY29udGV4dCkge3hfU01hcExTX0lQX0VCUF94KGNvbnRleHQsMjgpO30KLXZvaWQgV0lOQVBJIFNNYXBMU19JUF9FQlBfMzIoQ09OVEVYVCAqY29udGV4dCkge3hfU01hcExTX0lQX0VCUF94KGNvbnRleHQsMzIpO30KLXZvaWQgV0lOQVBJIFNNYXBMU19JUF9FQlBfMzYoQ09OVEVYVCAqY29udGV4dCkge3hfU01hcExTX0lQX0VCUF94KGNvbnRleHQsMzYpO30KLXZvaWQgV0lOQVBJIFNNYXBMU19JUF9FQlBfNDAoQ09OVEVYVCAqY29udGV4dCkge3hfU01hcExTX0lQX0VCUF94KGNvbnRleHQsNDApO30KK1JFR1NfRU5UUllQT0lOVChTTWFwTFNfSVBfRUJQXzgpICB7eF9TTWFwTFNfSVBfRUJQX3goY29udGV4dCw4KTt9CitSRUdTX0VOVFJZUE9JTlQoU01hcExTX0lQX0VCUF8xMikge3hfU01hcExTX0lQX0VCUF94KGNvbnRleHQsMTIpO30KK1JFR1NfRU5UUllQT0lOVChTTWFwTFNfSVBfRUJQXzE2KSB7eF9TTWFwTFNfSVBfRUJQX3goY29udGV4dCwxNik7fQorUkVHU19FTlRSWVBPSU5UKFNNYXBMU19JUF9FQlBfMjApIHt4X1NNYXBMU19JUF9FQlBfeChjb250ZXh0LDIwKTt9CitSRUdTX0VOVFJZUE9JTlQoU01hcExTX0lQX0VCUF8yNCkge3hfU01hcExTX0lQX0VCUF94KGNvbnRleHQsMjQpO30KK1JFR1NfRU5UUllQT0lOVChTTWFwTFNfSVBfRUJQXzI4KSB7eF9TTWFwTFNfSVBfRUJQX3goY29udGV4dCwyOCk7fQorUkVHU19FTlRSWVBPSU5UKFNNYXBMU19JUF9FQlBfMzIpIHt4X1NNYXBMU19JUF9FQlBfeChjb250ZXh0LDMyKTt9CitSRUdTX0VOVFJZUE9JTlQoU01hcExTX0lQX0VCUF8zNikge3hfU01hcExTX0lQX0VCUF94KGNvbnRleHQsMzYpO30KK1JFR1NfRU5UUllQT0lOVChTTWFwTFNfSVBfRUJQXzQwKSB7eF9TTWFwTFNfSVBfRUJQX3goY29udGV4dCw0MCk7fQogCi12b2lkIFdJTkFQSSBTTWFwTFMoQ09OVEVYVCAqY29udGV4dCkKK1JFR1NfRU5UUllQT0lOVChTTWFwTFMpCiB7CiAgICAgaWYgKEVBWF9yZWcoY29udGV4dCk+PTB4MTAwMDApIHsKIAlFQVhfcmVnKGNvbnRleHQpID0gTWFwTFMoKExQVk9JRClFQVhfcmVnKGNvbnRleHQpKTsKQEAgLTY0MSw3ICs2NDEsNyBAQAogICAgIH0KIH0KIAotdm9pZCBXSU5BUEkgU1VuTWFwTFMoQ09OVEVYVCAqY29udGV4dCkKK1JFR1NfRU5UUllQT0lOVChTVW5NYXBMUykKIHsKICAgICBpZiAoRUFYX3JlZyhjb250ZXh0KT49MHgxMDAwMCkKIAlVbk1hcExTKChTRUdQVFIpRUFYX3JlZyhjb250ZXh0KSk7CkBAIC02NTMsMTUgKzY1MywxNSBAQAogCQlVbk1hcExTKCooRFdPUkQqKShFQlBfcmVnKGNvbnRleHQpK2FyZ29mZikpOwogCSooRFdPUkQqKShFQlBfcmVnKGNvbnRleHQpK2FyZ29mZik9MDsKIH0KLXZvaWQgV0lOQVBJIFNVbk1hcExTX0lQX0VCUF84KENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDEyKTsgfQotdm9pZCBXSU5BUEkgU1VuTWFwTFNfSVBfRUJQXzEyKENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDEyKTsgfQotdm9pZCBXSU5BUEkgU1VuTWFwTFNfSVBfRUJQXzE2KENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDE2KTsgfQotdm9pZCBXSU5BUEkgU1VuTWFwTFNfSVBfRUJQXzIwKENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDIwKTsgfQotdm9pZCBXSU5BUEkgU1VuTWFwTFNfSVBfRUJQXzI0KENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDI0KTsgfQotdm9pZCBXSU5BUEkgU1VuTWFwTFNfSVBfRUJQXzI4KENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDI4KTsgfQotdm9pZCBXSU5BUEkgU1VuTWFwTFNfSVBfRUJQXzMyKENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDMyKTsgfQotdm9pZCBXSU5BUEkgU1VuTWFwTFNfSVBfRUJQXzM2KENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDM2KTsgfQotdm9pZCBXSU5BUEkgU1VuTWFwTFNfSVBfRUJQXzQwKENPTlRFWFQgKmNvbnRleHQpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDQwKTsgfQorUkVHU19FTlRSWVBPSU5UKFNVbk1hcExTX0lQX0VCUF84KSAgeyB4X1NVbk1hcExTX0lQX0VCUF94KGNvbnRleHQsMTIpOyB9CitSRUdTX0VOVFJZUE9JTlQoU1VuTWFwTFNfSVBfRUJQXzEyKSB7IHhfU1VuTWFwTFNfSVBfRUJQX3goY29udGV4dCwxMik7IH0KK1JFR1NfRU5UUllQT0lOVChTVW5NYXBMU19JUF9FQlBfMTYpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDE2KTsgfQorUkVHU19FTlRSWVBPSU5UKFNVbk1hcExTX0lQX0VCUF8yMCkgeyB4X1NVbk1hcExTX0lQX0VCUF94KGNvbnRleHQsMjApOyB9CitSRUdTX0VOVFJZUE9JTlQoU1VuTWFwTFNfSVBfRUJQXzI0KSB7IHhfU1VuTWFwTFNfSVBfRUJQX3goY29udGV4dCwyNCk7IH0KK1JFR1NfRU5UUllQT0lOVChTVW5NYXBMU19JUF9FQlBfMjgpIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDI4KTsgfQorUkVHU19FTlRSWVBPSU5UKFNVbk1hcExTX0lQX0VCUF8zMikgeyB4X1NVbk1hcExTX0lQX0VCUF94KGNvbnRleHQsMzIpOyB9CitSRUdTX0VOVFJZUE9JTlQoU1VuTWFwTFNfSVBfRUJQXzM2KSB7IHhfU1VuTWFwTFNfSVBfRUJQX3goY29udGV4dCwzNik7IH0KK1JFR1NfRU5UUllQT0lOVChTVW5NYXBMU19JUF9FQlBfNDApIHsgeF9TVW5NYXBMU19JUF9FQlBfeChjb250ZXh0LDQwKTsgfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQlBbGxvY01hcHBlZEJ1ZmZlcgkoS0VSTkVMMzIuMzgpCkBAIC02ODIsNyArNjgyLDcgQEAKICAqICAgICAgIFRoZSBTRUdQVFIgaXMgdXNlZCBieSB0aGUgY2FsbGVyIQogICovCiAKLXZvaWQgV0lOQVBJIEFsbG9jTWFwcGVkQnVmZmVyKENPTlRFWFQgKmNvbnRleHQpCitSRUdTX0VOVFJZUE9JTlQoQWxsb2NNYXBwZWRCdWZmZXIpCiB7CiAgICAgSEdMT0JBTDMyIGhhbmRsZSA9IEdsb2JhbEFsbG9jMzIoMCwgRURJX3JlZyhjb250ZXh0KSArIDgpOwogICAgIERXT1JEICpidWZmZXIgPSAoRFdPUkQgKilHbG9iYWxMb2NrMzIoaGFuZGxlKTsKQEAgLTcxNSw3ICs3MTUsNyBAQAogICogSW5wdXQ6IEVESSByZWdpc3RlcjogcG9pbnRlciB0byBidWZmZXIKICAqLwogCi12b2lkIFdJTkFQSSBGcmVlTWFwcGVkQnVmZmVyKENPTlRFWFQgKmNvbnRleHQpCitSRUdTX0VOVFJZUE9JTlQoRnJlZU1hcHBlZEJ1ZmZlcikKIHsKICAgICBpZiAoRURJX3JlZyhjb250ZXh0KSkKICAgICB7CmRpZmYgLS1naXQgYS9tZW1vcnkvc3RyaW5nLmMgYi9tZW1vcnkvc3RyaW5nLmMKaW5kZXggZWUwZGI2Ny4uOTJkMWE4OCAxMDA2NDQKLS0tIGEvbWVtb3J5L3N0cmluZy5jCisrKyBiL21lbW9yeS9zdHJpbmcuYwpAQCAtMjMwLDEyICsyMzAsMTEgQEAKICAgICB9CiAgICAgd2hpbGUgKCpzdHIxKQogICAgIHsKLSAgICAgICAgLyogRklYTUU6IFVuaWNvZGUgKi8KLSAgICAgICAgaWYgKChyZXMgPSB0b3VwcGVyKCpzdHIxKSAtIHRvdXBwZXIoKnN0cjIpKSAhPSAwKSByZXR1cm4gcmVzOworICAgICAgICBpZiAoKHJlcyA9IHRvd3VwcGVyKCpzdHIxKSAtIHRvd3VwcGVyKCpzdHIyKSkgIT0gMCkgcmV0dXJuIHJlczsKICAgICAgICAgc3RyMSsrOwogICAgICAgICBzdHIyKys7CiAgICAgfQotICAgIHJldHVybiB0b3VwcGVyKCpzdHIxKSAtIHRvdXBwZXIoKnN0cjIpOworICAgIHJldHVybiB0b3d1cHBlcigqc3RyMSkgLSB0b3d1cHBlcigqc3RyMik7CiB9CiAKIApAQCAtNDA4LDEyICs0MDcsMTEgQEAKICAgICBpZiAoIW4pIHJldHVybiAwOwogICAgIHdoaWxlICgoLS1uID4gMCkgJiYgKnN0cjEpCiAgICAgewotICAgICAgICAvKiBGSVhNRTogVW5pY29kZSAqLwotICAgICAgICBpZiAoKHJlcyA9IHRvdXBwZXIoKnN0cjEpIC0gdG91cHBlcigqc3RyMikpICE9IDApIHJldHVybiByZXM7CisgICAgICAgIGlmICgocmVzID0gdG93dXBwZXIoKnN0cjEpIC0gdG93dXBwZXIoKnN0cjIpKSAhPSAwKSByZXR1cm4gcmVzOwogICAgICAgICBzdHIxKys7CiAgICAgICAgIHN0cjIrKzsKICAgICB9Ci0gICAgcmV0dXJuIHRvdXBwZXIoKnN0cjEpIC0gdG91cHBlcigqc3RyMik7CisgICAgcmV0dXJuIHRvd3VwcGVyKCpzdHIxKSAtIHRvd3VwcGVyKCpzdHIyKTsKIH0KIAogCmRpZmYgLS1naXQgYS9tZW1vcnkvdmlydHVhbC5jIGIvbWVtb3J5L3ZpcnR1YWwuYwppbmRleCBkMjc1OWU2Li5jMDMzNTQzIDEwMDY0NAotLS0gYS9tZW1vcnkvdmlydHVhbC5jCisrKyBiL21lbW9yeS92aXJ0dWFsLmMKQEAgLTYsNyArNiw2IEBACiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CmRpZmYgLS1naXQgYS9taXNjL2FzcGkuYyBiL21pc2MvYXNwaS5jCmluZGV4IGJmMzhiMjkuLjUxZTExYjAgMTAwNjQ0Ci0tLSBhL21pc2MvYXNwaS5jCisrKyBiL21pc2MvYXNwaS5jCkBAIC0xLDUgKzEsNCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgpAQCAtMzEwLDcgKzMwOSw3IEBACiAgICAgV0FSTihhc3BpLCAiTm90IGVub3VnaCBieXRlcyB3cml0dGVuIHRvIHNjc2kgZGV2aWNlIGJ5dGVzPSVkIC4uICVkXG4iLCBpbl9sZW4sIHN0YXR1cyk7CiAgICAgaWYgKHN0YXR1cyA8IDApIHsKIAlpZiAobXllcnJvciA9PSBFTk9NRU0pIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICJBU1BJOiBMaW51eCBnZW5lcmljIHNjc2kgZHJpdmVyXG4gIFlvdSBwcm9iYWJseSBuZWVkIHRvIHJlLWNvbXBpbGUgeW91ciBrZXJuZWwgd2l0aCBhIGxhcmdlciBTR19CSUdfQlVGRiB2YWx1ZSAoc2cuaClcbiAgU3VnZ2VzdCAxMzA1NjBcbiIpOworCSAgICBNU0coIkFTUEk6IExpbnV4IGdlbmVyaWMgc2NzaSBkcml2ZXJcbiAgWW91IHByb2JhYmx5IG5lZWQgdG8gcmUtY29tcGlsZSB5b3VyIGtlcm5lbCB3aXRoIGEgbGFyZ2VyIFNHX0JJR19CVUZGIHZhbHVlIChzZy5oKVxuICBTdWdnZXN0IDEzMDU2MFxuIik7CiAJfQogCVdBUk4oYXNwaSwgImVycm5vOiA9ICVkXG4iLCBteWVycm9yKTsKICAgICB9CmRpZmYgLS1naXQgYS9taXNjL2NhbGxiYWNrLmMgYi9taXNjL2NhbGxiYWNrLmMKaW5kZXggMmRjZjg4My4uYTM5MTE5YSAxMDA2NDQKLS0tIGEvbWlzYy9jYWxsYmFjay5jCisrKyBiL21pc2MvY2FsbGJhY2suYwpAQCAtNSw3ICs1LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgpkaWZmIC0tZ2l0IGEvbWlzYy9jb21tLmMgYi9taXNjL2NvbW0uYwppbmRleCAyMWNhNWU4Li5mZTY3ZjZmIDEwMDY0NAotLS0gYS9taXNjL2NvbW0uYworKysgYi9taXNjL2NvbW0uYwpAQCAtMTgsNyArMTgsNiBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHRlcm1pb3MuaD4KICNpbmNsdWRlIDxmY250bC5oPgpkaWZmIC0tZ2l0IGEvbWlzYy9jb21tZGxnLmMgYi9taXNjL2NvbW1kbGcuYwppbmRleCBmZjVlMjc1Li4xZTNjZmVjIDEwMDY0NAotLS0gYS9taXNjL2NvbW1kbGcuYworKysgYi9taXNjL2NvbW1kbGcuYwpAQCAtNSw3ICs1LDYgQEAKICAqIENvcHlyaWdodCAxOTk2IEFsYnJlY2h0IEtsZWluZQogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgIndpbi5oIgpkaWZmIC0tZ2l0IGEvbWlzYy9jcHUuYyBiL21pc2MvY3B1LmMKaW5kZXggMzkwYzQ3Ny4uMzdjOWYxYiAxMDA2NDQKLS0tIGEvbWlzYy9jcHUuYworKysgYi9taXNjL2NwdS5jCkBAIC0yLDEwICsyLDkgQEAKICAqIFdoYXQgcHJvY2Vzc29yPwogICoKICAqIENvcHlyaWdodCAxOTk1LDE5OTcgTW9ydGVuIFdlbGluZGVyCi0gKiBDb3B5cmlnaHQgMTk5NyBNYXJjdXMgTWVpc3NuZXIKKyAqIENvcHlyaWdodCAxOTk3LTE5OTggTWFyY3VzIE1laXNzbmVyCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJnbG9iYWwuaCIKQEAgLTE1LDE5ICsxNCwzMyBAQAogI2luY2x1ZGUgIndpbnJlZy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLS8qIFNob3VsZCB0aGlzIHdyaXRlIHRvIHRoZSByZWdpc3RyeT8gKi8KLSNkZWZpbmUgRE9fUkVHIEZBTFNFCi0KIHN0YXRpYyBCWVRFIFBGWzY0XSA9IHswLH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJR2V0U3lzdGVtSW5mbyAgICAgICAgICAgIAlbS0VSTkVMTDMyLjQwNF0KKyAqCisgKiBHZXRzIHRoZSBjdXJyZW50IHN5c3RlbSBpbmZvcm1hdGlvbi4KKyAqCisgKiBPbiB0aGUgZmlyc3QgY2FsbCBpdCByZWFkcyBjYWNoZWQgdmFsdWVzLCBzbyBpdCBkb2Vzbid0IGhhdmUgdG8gZGV0ZXJtaW5lCisgKiB0aGVtIHJlcGVhdGVkbHkuIE9uIExpbnV4LCB0aGUgL3Byb2MvY3B1aW5mbyBzcGVjaWFsIGZpbGUgaXMgdXNlZC4KKyAqCisgKiBJdCBjcmVhdGVzIGEgcmVnaXN0cnkgc3ViaGllcmFyY2h5LCBsb29raW5nIGxpa2U6CisgKiBcSEFSRFdBUkVcREVTQ1JJUFRJT05cU3lzdGVtXENlbnRyYWxQcm9jZXNzb3JcPHByb2Nlc3Nvcm51bWJlcj5cCisgKgkJCQkJCQlJZGVudGlmaWVyIChDUFUgeDg2KQorICogTm90ZSB0aGF0IHRoZXJlIGlzIGEgaGllcmFyY2h5IGZvciBldmVyeSBwcm9jZXNzb3IgaW5zdGFsbGVkLCBzbyB0aGlzCisgKiBzdXBwb3J0cyBtdWx0aXByb2Nlc3NvciBzeXN0ZW1zLiBUaGlzIGlzIGRvbmUgbGlrZSBXaW45NSBkb2VzIGl0LCBJIHRoaW5rLgorICoJCQkJCQkJCisgKiBJdCBhbHNvIGNyZWF0ZXMgYSBjYWNoZWQgZmxhZyBhcnJheSBmb3IgSXNQcm9jZXNzb3JGZWF0dXJlUHJlc2VudCgpLgorICoKKyAqIFJFVFVSTlMKKyAqCW5vdGhpbmcsIHJlYWxseQogICovCi1WT0lEIFdJTkFQSSBHZXRTeXN0ZW1JbmZvKExQU1lTVEVNX0lORk8gc2kpCi17CitWT0lEIFdJTkFQSSBHZXRTeXN0ZW1JbmZvKAorCUxQU1lTVEVNX0lORk8gc2kJLyogW291dF0gc3lzdGVtIGluZm9ybWF0aW9uICovCispIHsKIAlzdGF0aWMgaW50IGNhY2hlID0gMDsKIAlzdGF0aWMgU1lTVEVNX0lORk8gY2FjaGVkc2k7Ci0JSEtFWQloa2V5OworCUhLRVkJeGhrZXk9MCxoa2V5OwogCWNoYXIJYnVmWzIwXTsKIAogCWlmIChjYWNoZSkgewpAQCAtNTUsMTcgKzY4LDEyIEBACiAJY2FjaGUgPSAxOyAvKiBldmVuIGlmIHRoZXJlIGlzIG5vIG1vcmUgaW5mbywgd2Ugbm93IGhhdmUgYSBjYWNoZWVudHJ5ICovCiAJbWVtY3B5KHNpLCZjYWNoZWRzaSxzaXplb2YoKnNpKSk7CiAKLQkvKiBobW0sIHJlYXNvbmFibGUgcHJvY2Vzc29yIGZlYXR1cmUgZGVmYXVsdHM/ICovCisJLyogSG1tLCByZWFzb25hYmxlIHByb2Nlc3NvciBmZWF0dXJlIGRlZmF1bHRzPyAqLwogCi0gICAgICAgIC8qIFRoZSByZWdpc3RyeSBjYWxscyB3ZXJlIHJlbW92ZWQgYmVjYXVzZSB0aGV5IHdlcmUgYmVpbmcgY2FsbGVkIAotICAgICAgICAgICBiZWZvcmUgdGhlIHJlZ2lzdHJpZXMgd2VyZSBsb2FkZWQsIGFuZCB0aGV5IHdlcmUgZ2l2aW5nIGVycm9ycyAqLwogICAgICAgICAvKiBDcmVhdGUgdGhpcyByZWdpc3RyeSBrZXkgZm9yIGFsbCBzeXN0ZW1zICovCi0KLSNpZiBET19SRUcKIAlpZiAoUmVnQ3JlYXRlS2V5MTYoSEtFWV9MT0NBTF9NQUNISU5FLCJIQVJEV0FSRVxcREVTQ1JJUFRJT05cXFN5c3RlbVxcQ2VudHJhbFByb2Nlc3NvciIsJmhrZXkpIT1FUlJPUl9TVUNDRVNTKSB7CiAgICAgICAgICAgICBXQVJOKHJlZywiVW5hYmxlIHRvIHJlZ2lzdGVyIENQVSBpbmZvcm1hdGlvblxuIik7CiAgICAgICAgIH0KLSNlbmRpZgogCiAjaWZkZWYgbGludXgKIAl7CkBAIC03NCw3ICs4Miw3IEBACiAKIAlpZiAoIWYpCiAJCXJldHVybjsKLSAgICAgICAgLyp4aGtleSA9IDA7Ki8KKyAgICAgICAgeGhrZXkgPSAwOwogCXdoaWxlIChmZ2V0cyhsaW5lLDIwMCxmKSE9TlVMTCkgewogCQljaGFyCSpzLCp2YWx1ZTsKIApAQCAtMTA4LDEyICsxMTYsMTAgQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQotI2lmIERPX1JFRwogCQkJLyogc2V0IHRoZSBDUFUgdHlwZSBvZiB0aGUgY3VycmVudCBwcm9jZXNzb3IgKi8KIAkJCXNwcmludGYoYnVmLCJDUFUgJWxkIixjYWNoZWRzaS5kd1Byb2Nlc3NvclR5cGUpOwotCQkJaWYgKGhrZXkpCi0JCQkJUmVnU2V0VmFsdWVFeDMyQShoa2V5LCJJZGVudGlmaWVyIiwwLFJFR19TWixidWYsc3RybGVuKGJ1ZikpOwotI2VuZGlmCisJCQlpZiAoeGhrZXkpCisJCQkJUmVnU2V0VmFsdWVFeDMyQSh4aGtleSwiSWRlbnRpZmllciIsMCxSRUdfU1osYnVmLHN0cmxlbihidWYpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCS8qIG9sZCAyLjAgbWV0aG9kICovCkBAIC0xMzgsMTIgKzE0NCwxMCBAQAogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9Ci0jaWYgRE9fUkVHCiAJCQkvKiBzZXQgdGhlIENQVSB0eXBlIG9mIHRoZSBjdXJyZW50IHByb2Nlc3NvciAqLwogCQkJc3ByaW50ZihidWYsIkNQVSAlbGQiLGNhY2hlZHNpLmR3UHJvY2Vzc29yVHlwZSk7Ci0JCQlpZiAoaGtleSkKLQkJCQlSZWdTZXRWYWx1ZUV4MzJBKGhrZXksIklkZW50aWZpZXIiLDAsUkVHX1NaLGJ1ZixzdHJsZW4oYnVmKSk7Ci0jZW5kaWYKKwkJCWlmICh4aGtleSkKKwkJCQlSZWdTZXRWYWx1ZUV4MzJBKHhoa2V5LCJJZGVudGlmaWVyIiwwLFJFR19TWixidWYsc3RybGVuKGJ1ZikpOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKCFsc3RybmNtcGkzMkEobGluZSwiZmRpdl9idWciLHN0cmxlbigiZmRpdl9idWciKSkpIHsKQEAgLTE2NiwxNCArMTcwLDEzIEBACiAJCQkJaWYgKHgrMT5jYWNoZWRzaS5kd051bWJlck9mUHJvY2Vzc29ycykKIAkJCQkJY2FjaGVkc2kuZHdOdW1iZXJPZlByb2Nlc3NvcnM9eCsxOwogCi0jaWYgMAotCQkJLyogY3JlYXRlIGEgbmV3IHByb2Nlc3NvciBzdWJrZXkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdoYXQgZXhhY3RseSBpcyB0cnlpbmcgdG8gYmUgZG9uZSBoZXJlPyAqLworCQkJLyogQ3JlYXRlIGEgbmV3IHByb2Nlc3NvciBzdWJrZXkgb24gYSBtdWx0aXByb2Nlc3NvcgorCQkJICogc3lzdGVtCisJCQkgKi8KIAkJCXNwcmludGYoYnVmLCIlZCIseCk7CiAJCQlpZiAoeGhrZXkpCiAJCQkJUmVnQ2xvc2VLZXkoeGhrZXkpOwogCQkJUmVnQ3JlYXRlS2V5MTYoaGtleSxidWYsJnhoa2V5KTsKLSNlbmRpZgogCQl9CiAJCWlmICghbHN0cm5jbXBpMzJBKGxpbmUsInN0ZXBwaW5nIixzdHJsZW4oInN0ZXBwaW5nIikpKSB7CiAJCQlpbnQJeDsKQEAgLTE5NSwzMSArMTk4LDI3IEBACiAjZWxzZSAgLyogbGludXggKi8KIAkvKiBGSVhNRTogaG93IGRvIHdlIGRvIHRoaXMgb24gb3RoZXIgc3lzdGVtcz8gKi8KIAotI2lmIDAKKwlSZWdDcmVhdGVLZXkxNihoa2V5LCIwIiwmeGhrZXkpOwogCVJlZ1NldFZhbHVlRXgzMkEoeGhrZXksIklkZW50aWZpZXIiLDAsUkVHX1NaLCJDUFUgMzg2IixzdHJsZW4oIkNQVSAzODYiKSk7Ci0jZW5kaWYKLQogI2VuZGlmICAvKiAhbGludXggKi8KLQotI2lmIDAKLQkoeGhrZXkpCisJaWYgKHhoa2V5KQogCQlSZWdDbG9zZUtleSh4aGtleSk7Ci0jZW5kaWYKLSNpZiBET19SRUcKLSAgICBpZiAoaGtleSkKLSAgICAgICAgUmVnQ2xvc2VLZXkoaGtleSk7Ci0jZW5kaWYKLQorCWlmIChoa2V5KQorCQlSZWdDbG9zZUtleShoa2V5KTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCUlzUHJvY2Vzc29yRmVhdHVyZVByZXNlbnQJW0tFUk5FTEwzMi44ODBdCisgKiBSRVRVUk5TOgorICoJVFJVRSBpZiBwcm9jZXNzb3JmZWF0dXJlIHByZXNlbnQKKyAqCUZBTFNFIG90aGVyd2lzZQogICovCi1CT09MMzIgV0lOQVBJIElzUHJvY2Vzc29yRmVhdHVyZVByZXNlbnQgKERXT1JEIGZlYXR1cmUpCi17CitCT09MMzIgV0lOQVBJIElzUHJvY2Vzc29yRmVhdHVyZVByZXNlbnQgKAorCURXT1JEIGZlYXR1cmUJLyogW2luXSBmZWF0dXJlIG51bWJlciwgc2VlIFBGXyBkZWZpbmVzICovCispIHsKICAgU1lTVEVNX0lORk8gc2k7Ci0gIEdldFN5c3RlbUluZm8gKCZzaSk7IC8qIHRvIGVuc3VyZSB0aGUgaW5mb3JtYXRpb24gaXMgbG9hZGVkIGFuZCBjYWNoZWQgKi8KKyAgR2V0U3lzdGVtSW5mbyAoJnNpKTsgLyogVG8gZW5zdXJlIHRoZSBpbmZvcm1hdGlvbiBpcyBsb2FkZWQgYW5kIGNhY2hlZCAqLwogCiAgIGlmIChmZWF0dXJlIDwgNjQpCiAgICAgcmV0dXJuIFBGW2ZlYXR1cmVdOwpkaWZmIC0tZ2l0IGEvbWlzYy9jcnRkbGwuYyBiL21pc2MvY3J0ZGxsLmMKaW5kZXggMGFjYWQyOS4uM2Q0MTBlYSAxMDA2NDQKLS0tIGEvbWlzYy9jcnRkbGwuYworKysgYi9taXNjL2NydGRsbC5jCkBAIC0yMSw3ICsyMSw2IEBACiAvKiBGSVhNRTogYWxsIHRoZSBmaWxlIGhhbmRsaW5nIGlzIGhvcGVsZXNzbHkgYnJva2VuIC0tIEFKICovCiAKICNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC00NCwxMyArNDMsMTIgQEAKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiZXhjZXB0LmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgorI2luY2x1ZGUgIndpbm5scy5oIgogCiBleHRlcm4gaW50IEZJTEVfR2V0VW5peEhhbmRsZSggSEZJTEUzMiAgKTsKIAogc3RhdGljIERPU19GVUxMX05BTUUgQ1JURExMX3RtcG5hbWU7CiAKLWV4dGVybiBJTlQzMiBXSU4zMl93c3ByaW50ZjMyVyggRFdPUkQgKmFyZ3MgKTsKLQogVUlOVDMyIENSVERMTF9hcmdjX2RsbDsgICAgICAgICAvKiBDUlRETEwuMjMgKi8KIExQU1RSICpDUlRETExfYXJndl9kbGw7ICAgICAgICAgLyogQ1JURExMLjI0ICovCiBMUFNUUiAgQ1JURExMX2FjbWRsbl9kbGw7ICAgICAgIC8qIENSVERMTC4zOCAqLwpAQCAtMTk5LDIzICsxOTcsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIF9nbG9iYWxfdW53aW5kMiAgKENSVERMTC4xMjkpCiAgKi8KLXZvaWQgX19jZGVjbCBDUlRETExfX2dsb2JhbF91bndpbmQyKCBDT05URVhUICpjb250ZXh0ICkKK3ZvaWQgX19jZGVjbCBDUlRETExfX2dsb2JhbF91bndpbmQyKCBQRVhDRVBUSU9OX0ZSQU1FIGZyYW1lICkKIHsKLSAgICAvKiBSZXRyaWV2ZSB0aGUgYXJndW1lbnRzIChhcmdzWzBdIGlzIHJldHVybiBhZGRyLCBhcmdzWzFdIGlzIGZpcnN0IGFyZykgKi8KLSAgICBEV09SRCAqYXJncyA9IChEV09SRCAqKUVTUF9yZWcoY29udGV4dCk7Ci0gICAgUnRsVW53aW5kKCAoUEVYQ0VQVElPTl9GUkFNRSlhcmdzWzFdLCAoTFBWT0lEKUVJUF9yZWcoY29udGV4dCksCi0gICAgICAgICAgICAgICBOVUxMLCAwLCBjb250ZXh0ICk7CisgICAgUnRsVW53aW5kKCBmcmFtZSwgMCwgTlVMTCwgMCApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICBfbG9jYWxfdW53aW5kMiAgKENSVERMTC4xNzMpCiAgKi8KLXZvaWQgX19jZGVjbCBDUlRETExfX2xvY2FsX3Vud2luZDIoIENPTlRFWFQgKmNvbnRleHQgKQordm9pZCBfX2NkZWNsIENSVERMTF9fbG9jYWxfdW53aW5kMiggUEVYQ0VQVElPTl9GUkFNRSBlbmRmcmFtZSwgRFdPUkQgbnIgKQogewotICAgIC8qIFJldHJpZXZlIHRoZSBhcmd1bWVudHMgKGFyZ3NbMF0gaXMgcmV0dXJuIGFkZHIsIGFyZ3NbMV0gaXMgZmlyc3QgYXJnKSAqLwotICAgIERXT1JEICphcmdzID0gKERXT1JEICopRVNQX3JlZyhjb250ZXh0KTsKLSAgICBQRVhDRVBUSU9OX0ZSQU1FIGVuZGZyYW1lID0gKFBFWENFUFRJT05fRlJBTUUpYXJnc1sxXTsKLSAgICBEV09SRCBuciA9IGFyZ3NbMl07CiAgICAgVFJBQ0UoY3J0ZGxsLCIoJXAsJWxkKVxuIixlbmRmcmFtZSxucik7CiB9CiAKQEAgLTkwMiw3ICs4OTMsNyBAQAogCUxQV1NUUgl5PXg7CiAKIAl3aGlsZSAoKnkpIHsKLQkJKnk9dG91cHBlcigqeSk7CisJCSp5PXRvd3VwcGVyKCp5KTsKIAkJeSsrOwogCX0KIAlyZXR1cm4geDsKQEAgLTkxNiw3ICs5MDcsNyBAQAogCUxQV1NUUgl5PXg7CiAKIAl3aGlsZSAoKnkpIHsKLQkJKnk9dG9sb3dlcigqeSk7CisJCSp5PXRvd2xvd2VyKCp5KTsKIAkJeSsrOwogCX0KIAlyZXR1cm4geDsKQEAgLTEyOTQsMTQgKzEyODUsNiBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgIHRvd3VwcGVyICAgICAgICAgICAoQ1JURExMLjQ5NCkKLSAqLwotV0NIQVIgX19jZGVjbCBDUlRETExfdG93dXBwZXIoV0NIQVIgeCkKLXsKLSAgICByZXR1cm4gKFdDSEFSKXRvdXBwZXIoKENIQVIpeCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgX3djc2ljbXAgICAgICAgICAgIChDUlRETEwuMzIxKQogICovCiBEV09SRCBfX2NkZWNsIENSVERMTF9fd2NzaWNtcCggTFBDV1NUUiBzMSwgTFBDV1NUUiBzMiApCkBAIC0xNjkyLDggKzE2NzUsNyBAQAogTFBJTlQzMiBfX2NkZWNsIENSVERMTF9fZXJybm8oKQogewogCXN0YXRpYwlpbnQgY3J0ZGxsZXJybm87Ci0JZXh0ZXJuIGludCBMYXN0RXJyb3JUb0Vycm5vKERXT1JEKTsKLQorCQogCS8qIEZJWE1FOiB3ZSBzaG91bGQgc2V0IHRoZSBlcnJvciBhdCB0aGUgZmFpbGluZyBmdW5jdGlvbiBjYWxsIHRpbWUgKi8KIAljcnRkbGxlcnJubyA9IExhc3RFcnJvclRvRXJybm8oR2V0TGFzdEVycm9yKCkpOwogCXJldHVybiAmY3J0ZGxsZXJybm87CmRpZmYgLS1naXQgYS9taXNjL2RkZW1sLmMgYi9taXNjL2RkZW1sLmMKaW5kZXggNGJiYzFmZS4uOWE1NDY5NCAxMDA2NDQKLS0tIGEvbWlzYy9kZGVtbC5jCisrKyBiL21pc2MvZGRlbWwuYwpAQCAtNyw3ICs3LDYgQEAKIAogLyogT25seSBlbXB0eSBzdHVicyBmb3Igbm93ICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgImRkZW1sLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIApAQCAtMjgzLDcgKzI4Miw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgRGRlRnJlZVN0cmluZ0hhbmRsZTMyKCBEV09SRCBpZEluc3QsIEhTWiBoc3ogKQogewotICAgIEZJWE1FKCBkZGVtbCwgIiglZCwlZCk6IHN0dWJcbiIsaWRJbnN0LCBoc3ogKTsKKyAgICBGSVhNRSggZGRlbWwsICIoJWxkLCVsZCk6IHN0dWJcbiIsaWRJbnN0LCBoc3ogKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvbWlzYy9lcnJvci5jIGIvbWlzYy9lcnJvci5jCmluZGV4IDRhZTY1YTcuLjRmMzJkMGIgMTAwNjQ0Ci0tLSBhL21pc2MvZXJyb3IuYworKysgYi9taXNjL2Vycm9yLmMKQEAgLTQsNyArNCw2IEBACiAgKiBDb3B5cmlnaHQgMTk5NyBBbmRyZXcgVGF5bG9yCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKZGlmZiAtLWdpdCBhL21pc2MvaW1hZ2VsaXN0LmMgYi9taXNjL2ltYWdlbGlzdC5jCmluZGV4IDk1YzI3ZDkuLmVjZDZkMzEgMTAwNjQ0Ci0tLSBhL21pc2MvaW1hZ2VsaXN0LmMKKysrIGIvbWlzYy9pbWFnZWxpc3QuYwpAQCAtNCwxMyArNCwxMiBAQAogICogIENvcHlyaWdodCAxOTk4IEVyaWMgS29obAogICoKICAqICBUT0RPOgotICogICAgLSBJbXByb3ZlIGVycm9yIGNoZWNraW5nIGluIHNvbWUgZnVuY3Rpb25zLgotICogICAgLSBGaXggSUxEX1RSQU5TUEFSRU5UIGVycm9yIGluIEltYWdlTGlzdF9EcmF3SW5kaXJlY3QuCiAgKiAgICAtIEZpeCBvZmZzZXRzIGluIEltYWdlTGlzdF9EcmF3SW5kaXJlY3QuCisgKiAgICAtIEZpeCBJTERfVFJBTlNQQVJFTlQgZXJyb3IgaW4gSW1hZ2VMaXN0X0RyYXdJbmRpcmVjdC4KICAqICAgIC0gRml4IEltYWdlTGlzdF9HZXRJY29uIChtaWdodCBiZSBhIHJlc3VsdCBvZiB0aGUKICAqICAgICAgSUxEX1RSQU5TUEFSRU5UIGVycm9yIGluIEltYWdlTGlzdF9EcmF3SW5kaXJlY3QpLgogICogICAgLSBGaXggZHJhZyBmdW5jdGlvbnMuCi0gKiAgICAtIEZpeCBhbGwgb3RoZXIgc3R1YnMuCisgKiAgICAtIEZpeCBJbWFnZUxpc3RfUmVhZCBhbmQgSW1hZ2VMaXN0X1dyaXRlLgogICogICAgLSBBZGQgSW1hZ2VMaXN0X1NldEZpbHRlciAodW5kb2N1bWVudGVkKS4KICAqICAgICAgQlRXIGRvZXMgYW55Ym9keSBrbm93IGFueXRoaW5nIGFib3V0IHRoaXMgZnVuY3Rpb24/Pz8KICAqICAgICAgICAtIEl0IHJlbW92ZXMgMTIgQnl0ZXMgZnJvbSB0aGUgc3RhY2sgKDMgUGFyYW1ldGVycykuCkBAIC0xOCwxMCArMTcsNiBAQAogICogICAgICAgIC0gU2Vjb25kIHBhcmFtZXRlciBDT1VMRCBiZSBhbiBpbmRleD8/Pz8/CiAgKiAgICAgICAgLSBUaGlyZCBwYXJhbWV0ZXIuLi4uID8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/PwogICoKLSAqICBUZXN0aW5nOgotICogICAgLSBUZXN0IEltYWdlTGlzdF9HZXRJbWFnZVJlY3QgKHVuZG9jdW1lbnRlZCkuCi0gKiAgICAtIFRlc3QgYWxsIHRoZSBvdGhlciBmdW5jdGlvbnMuCi0gKgogICogIENvbW1lbnRzOgogICogICAgLSBJbWFnZUxpc3RfRHJhdywgSW1hZ2VMaXN0X0RyYXdFeCBhbmQgSW1hZ2VMaXN0X0dldEljb24gdXNlCiAgKiAgICAgIEltYWdlTGlzdF9EcmF3SW5kaXJlY3QuIFNpbmNlIEltYWdlTGlzdF9EcmF3SW5kaXJlY3QgaXMgc3RpbGwKQEAgLTQzLDYgKzM4LDggQEAKICNkZWZpbmUgX19HRVRfSUNPTl9JTkZPX0hBQ0tfXyAKICAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiY29tcG9iai5oIgorI2luY2x1ZGUgInN0b3JhZ2UuaCIKICNpbmNsdWRlICJpbWFnZWxpc3QuaCIKICNpbmNsdWRlICJjb21tY3RybC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCkBAIC02NCw2ICs2MSwxMyBAQAogc3RhdGljIElOVDMyICAgICAgbkludGVybmFsRHJhZ0hvdHNwb3RYID0gMDsKIHN0YXRpYyBJTlQzMiAgICAgIG5JbnRlcm5hbERyYWdIb3RzcG90WSA9IDA7CiAKK3N0YXRpYyBIV05EMzIgICAgIGh3bmRJbnRlcm5hbERyYWcgPSAwOworc3RhdGljIElOVDMyICAgICAgeEludGVybmFsUG9zID0gMDsKK3N0YXRpYyBJTlQzMiAgICAgIHlJbnRlcm5hbFBvcyA9IDA7CisKK3N0YXRpYyBIREMzMiAgICAgIGhkY0JhY2tCdWZmZXIgPSAwOworc3RhdGljIEhCSVRNQVAzMiAgaGJtQmFja0J1ZmZlciA9IDA7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIElNQUdFTElTVF9JbnRlcm5hbEV4cGFuZEJpdG1hcHMgW0ludGVybmFsXSAKQEAgLTIyNyw2ICsyMzEsMjcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW1hZ2VMaXN0X0FkZEljb24gW0NPTUNUTDMyLjQwXQorICoKKyAqIEFkZHMgYW4gaWNvbiB0byBhbiBpbWFnZSBsaXN0LgorICoKKyAqIFBBUkFNUworICogICAgIGhpbWwgIFtJXSBpbWFnZSBsaXN0IGhhbmRsZQorICogICAgIGhJY29uIFtJXSBpY29uIGhhbmRsZQorICoKKyAqIFJFVFVSTlMKKyAqICAgICBTdWNjZXNzOiBpbmRleCBvZiB0aGUgbmV3IGltYWdlCisgKiAgICAgRmFpbHVyZTogLTEKKyAqLworCitJTlQzMiBXSU5BUEkKK0ltYWdlTGlzdF9BZGRJY29uIChISU1BR0VMSVNUIGhpbWwsIEhJQ09OMzIgaEljb24pCit7CisgICAgcmV0dXJuIChJbWFnZUxpc3RfUmVwbGFjZUljb24gKGhpbWwsIC0xLCBoSWNvbikpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJbWFnZUxpc3RfQWRkTWFza2VkIFtDT01DVEwzMi40MV0gCiAgKgogICogQWRkcyBhbiBpbWFnZSBvciBpbWFnZXMgdG8gYW4gaW1hZ2UgbGlzdCBhbmQgY3JlYXRlcyBhIG1hc2sgZnJvbSB0aGUKQEAgLTYyMCw5ICs2NDUsNiBAQAogICogICAgIFN1Y2Nlc3M6IFRSVUUKICAqICAgICBGYWlsdXJlOiBGQUxTRQogICoKLSAqIEZJWE1FCi0gKiAgICAgVGhpcyBpcyBzdGlsbCBhbiBlbXB0eSBzdHViLgotICoKICAqIE5PVEVTCiAgKiAgICAgVGhlIHBvc2l0aW9uIG9mIHRoZSBkcmFnIGltYWdlIGlzIHJlbGF0aXZlIHRvIHRoZSB3aW5kb3csIG5vdAogICogICAgIHRoZSBjbGllbnQgYXJlYS4KQEAgLTYzMSw3ICs2NTMsMjEgQEAKIEJPT0wzMiBXSU5BUEkKIEltYWdlTGlzdF9EcmFnRW50ZXIgKEhXTkQzMiBod25kTG9jaywgSU5UMzIgeCwgSU5UMzIgeSkKIHsKLSAgICBGSVhNRSAoaW1hZ2VsaXN0LCAiZW1wdHkgc3R1YiFcbiIpOworICAgIGlmIChoaW1sSW50ZXJuYWxEcmFnID09IE5VTEwpIHJldHVybiAoRkFMU0UpOworCisgICAgaWYgKGh3bmRMb2NrKQorCWh3bmRJbnRlcm5hbERyYWcgPSBod25kTG9jazsKKyAgICBlbHNlCisJaHduZEludGVybmFsRHJhZyA9IEdldERlc2t0b3BXaW5kb3czMiAoKTsKKworICAgIHhJbnRlcm5hbFBvcyA9IHg7CisgICAgeUludGVybmFsUG9zID0geTsKKworICAgIGhkY0JhY2tCdWZmZXIgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7CisgICAgaGJtQmFja0J1ZmZlciA9IENyZWF0ZUNvbXBhdGlibGVCaXRtYXAzMiAoaGRjQmFja0J1ZmZlciwKKwkJaGltbEludGVybmFsRHJhZy0+Y3gsIGhpbWxJbnRlcm5hbERyYWctPmN5KTsKKworICAgIEltYWdlTGlzdF9EcmFnU2hvd05vbG9jayAoVFJVRSk7CiAKICAgICByZXR1cm4gKEZBTFNFKTsKIH0KQEAgLTY0OCwxNyArNjg0LDIyIEBACiAgKiBSRVRVUk5TCiAgKiAgICAgU3VjY2VzczogVFJVRQogICogICAgIEZhaWx1cmU6IEZBTFNFCi0gKgotICogRklYTUUKLSAqICAgICBUaGlzIGlzIHN0aWxsIGFuIGVtcHR5IHN0dWIuCiAgKi8KIAogQk9PTDMyIFdJTkFQSQogSW1hZ2VMaXN0X0RyYWdMZWF2ZSAoSFdORDMyIGh3bmRMb2NrKQogewotICAgIEZJWE1FIChpbWFnZWxpc3QsICJlbXB0eSBzdHViIVxuIik7CisgICAgaWYgKGh3bmRMb2NrKQorCWh3bmRJbnRlcm5hbERyYWcgPSBod25kTG9jazsKKyAgICBlbHNlCisJaHduZEludGVybmFsRHJhZyA9IEdldERlc2t0b3BXaW5kb3czMiAoKTsKIAotICAgIHJldHVybiAoRkFMU0UpOworICAgIEltYWdlTGlzdF9EcmFnU2hvd05vbG9jayAoRkFMU0UpOworCisgICAgRGVsZXRlREMzMiAoaGRjQmFja0J1ZmZlcik7CisgICAgRGVsZXRlT2JqZWN0MzIgKGhibUJhY2tCdWZmZXIpOworCisgICAgcmV0dXJuIChUUlVFKTsKIH0KIAogCkBAIC02NzgsMTUgKzcxOSwxNyBAQAogICogTk9URVMKICAqICAgICBUaGUgcG9zaXRpb24gb2YgdGhlIGRyYWcgaW1hZ2UgaXMgcmVsYXRpdmUgdG8gdGhlIHdpbmRvdywgbm90CiAgKiAgICAgdGhlIGNsaWVudCBhcmVhLgotICoKLSAqIEZJWE1FCi0gKiAgICAgVGhpcyBpcyBzdGlsbCBhbiBlbXB0eSBzdHViLgogICovCiAKIEJPT0wzMiBXSU5BUEkKIEltYWdlTGlzdF9EcmFnTW92ZSAoSU5UMzIgeCwgSU5UMzIgeSkKIHsKLSAgICBGSVhNRSAoaW1hZ2VsaXN0LCAiZW1wdHkgc3R1YiFcbiIpOworICAgIEltYWdlTGlzdF9EcmFnU2hvd05vbG9jayAoRkFMU0UpOworCisgICAgeEludGVybmFsUG9zID0geDsKKyAgICB5SW50ZXJuYWxQb3MgPSB5OworCisgICAgSW1hZ2VMaXN0X0RyYWdTaG93Tm9sb2NrIChUUlVFKTsKIAogICAgIHJldHVybiAoRkFMU0UpOwogfQpAQCAtNzA1LDEzICs3NDgsMzYgQEAKICAqICAgICBGYWlsdXJlOiBGQUxTRQogICoKICAqIEZJWE1FCi0gKiAgICAgVGhpcyBpcyBzdGlsbCBhbiBlbXB0eSBzdHViLgorICogICAgIHNlbWktc3R1Yi4KICAqLwogCiBCT09MMzIgV0lOQVBJCiBJbWFnZUxpc3RfRHJhZ1Nob3dOb2xvY2sgKEJPT0wzMiBiU2hvdykKIHsKLSAgICBGSVhNRSAoaW1hZ2VsaXN0LCAiZW1wdHkgc3R1YiFcbiIpOworICAgIEhEQzMyIGhkY0RyYWc7CisKKyAgICBGSVhNRSAoaW1hZ2VsaXN0LCAic2VtaS1zdHViIVxuIik7CisgICAgVFJBQ0UgKGltYWdlbGlzdCwgImJTaG93PTB4JVghXG4iLCBiU2hvdyk7CisKKyAgICBoZGNEcmFnID0gR2V0RENFeDMyIChod25kSW50ZXJuYWxEcmFnLCAwLAorCQkJIERDWF9XSU5ET1cgfCBEQ1hfQ0FDSEUgfCBEQ1hfTE9DS1dJTkRPV1VQREFURSk7CisKKyAgICBpZiAoYlNob3cpIHsKKwkvKiBzaG93IGRyYWcgaW1hZ2UgKi8KKworCS8qIHNhdmUgYmFja2dyb3VuZCAqLworCisJLyogZHJhdyBkcmFnIGltYWdlICovCisKKyAgICB9CisgICAgZWxzZSB7CisJLyogaGlkZSBkcmFnIGltYWdlICovCisKKwkvKiByZXN0b3JlIGJhY2tncm91bmQgKi8KKworICAgIH0KKworICAgIFJlbGVhc2VEQzMyIChod25kSW50ZXJuYWxEcmFnLCBoZGNEcmFnKTsKIAogICAgIHJldHVybiAoRkFMU0UpOwogfQpAQCAtNzc1LDggKzg0MSw4IEBACiAgKiAgICAgaGRjICAgIFtJXSBkZXZpY2UgY29udGV4dCBoYW5kbGUKICAqICAgICB4ICAgICAgW0ldIFggcG9zaXRpb24KICAqICAgICB5ICAgICAgW0ldIFkgcG9zaXRpb24KLSAqICAgICB4T2ZmcyAgW0ldIAotICogICAgIHlPZmZzICBbSV0KKyAqICAgICB4T2ZmcyAgW0ldIFggb2Zmc2V0CisgKiAgICAgeU9mZnMgIFtJXSBZIG9mZnNldAogICogICAgIHJnYkJrICBbSV0gYmFja2dyb3VuZCBjb2xvcgogICogICAgIHJnYkZnICBbSV0gZm9yZWdyb3VuZCBjb2xvcgogICogICAgIGZTdHlsZSBbSV0gZHJhd2luZyBmbGFncwpAQCAtODI0LDExICs4OTAsMTEgQEAKICAqIERyYXdzIGFuIGltYWdlIHVzaW5nIC4uLgogICoKICAqIFBBUkFNUwotICogICAgIHBpbWxkcCBbSV0gcG9pbnRlciB0byAuLi4KKyAqICAgICBwaW1sZHAgW0ldIHBvaW50ZXIgdG8gSU1BR0VMSVNURFJBV1BBUkFNUyBzdHJ1Y3R1cmUuCiAgKgogICogUkVUVVJOUwotICogICAgIFN1Y2Nlc3M6Ci0gKiAgICAgRmFpbHVyZToKKyAqICAgICBTdWNjZXNzOiBUUlVFCisgKiAgICAgRmFpbHVyZTogRkFMU0UKICAqLwogCiBCT09MMzIgV0lOQVBJCkBAIC04NTAsNiArOTE2LDggQEAKICAgICBpZiAocGltbGRwID09IE5VTEwpIHJldHVybiAoRkFMU0UpOwogICAgIGlmIChwaW1sZHAtPmNiU2l6ZSA8IHNpemVvZihJTUFHRUxJU1REUkFXUEFSQU1TKSkgcmV0dXJuIChGQUxTRSk7CiAgICAgaWYgKHBpbWxkcC0+aGltbCA9PSBOVUxMKSByZXR1cm4gKEZBTFNFKTsKKyAgICBpZiAoKHBpbWxkcC0+aSA8IDApIHx8IChwaW1sZHAtPmkgPj0gcGltbGRwLT5oaW1sLT5jQ3VySW1hZ2UpKQorCXJldHVybiAoRkFMU0UpOwogCiAgICAgaGltbExvY2FsID0gcGltbGRwLT5oaW1sOwogICAgIApAQCAtMTAxMyw3ICsxMDgxLDcgQEAKICAqCiAgKiBSRVRVUk5TCiAgKiAgICAgU3VjY2VzczogSGFuZGxlIG9mIGR1cGxpY2F0ZWQgaW1hZ2UgbGlzdC4KLSAqICAgICBGYWlsdXJlOiAwCisgKiAgICAgRmFpbHVyZTogTlVMTAogICovCiAKIEhJTUFHRUxJU1QgV0lOQVBJCkBAIC0xMDYxLDcgKzExMjksNyBAQAogICogRmluaXNoZXMgYSBkcmFnIG9wZXJhdGlvbi4KICAqCiAgKiBQQVJBTVMKLSAqICAgICBubworICogICAgIG5vIFBhcmFtZXRlcnMKICAqCiAgKiBSRVRVUk5TCiAgKiAgICAgU3VjY2VzczogVFJVRQpAQCAtMTA3NCw3ICsxMTQyLDcgQEAKIEJPT0wzMiBXSU5BUEkKIEltYWdlTGlzdF9FbmREcmFnIChWT0lEKQogewotICAgIEZJWE1FIChpbWFnZWxpc3QsICJwYXJ0aWFsbHkgaW1wbGVtZW50ZWQhXG4iKTsKKyAgICBGSVhNRSAoaW1hZ2VsaXN0LCAic2VtaS1zdHViIVxuIik7CiAKICAgICBpZiAoaGltbEludGVybmFsRHJhZykKICAgICB7CkBAIC0xMTAwLDE0ICsxMTY4LDE1IEBACiAgKiAgICAgaGltbCBbSV0gSW1hZ2UgbGlzdCBoYW5kbGUuCiAgKgogICogUkVUVVJOUwotICogICAgIEJhY2tncm91bmQgY29sb3IuCisgKiAgICAgU3VjY2VzczogYmFja2dyb3VuZCBjb2xvcgorICogICAgIEZhaWx1cmU6IENMUl9OT05FCiAgKi8KIAogQ09MT1JSRUYgV0lOQVBJCiBJbWFnZUxpc3RfR2V0QmtDb2xvciAoSElNQUdFTElTVCBoaW1sKQogewotLy8gICAgaWYgKGhpbWwgPT0gTlVMTCkKLS8vCXJldHVybiBDTFJfTk9ORTsKKyAgICBpZiAoaGltbCA9PSBOVUxMKQorCXJldHVybiBDTFJfTk9ORTsKIAogICAgIHJldHVybiAoaGltbC0+Y2xyQmspOwogfQpAQCAtMTEzMyw3ICsxMjAyLDcgQEAKIEhJTUFHRUxJU1QgV0lOQVBJCiBJbWFnZUxpc3RfR2V0RHJhZ0ltYWdlIChQT0lOVDMyICpwcHQsIFBPSU5UMzIgKnBwdEhvdHNwb3QpCiB7Ci0gICAgRklYTUUgKGltYWdlbGlzdCwgInBhcnRpYWxseSBpbWxlbWVudGVkIVxuIik7CisgICAgRklYTUUgKGltYWdlbGlzdCwgInNlbWktc3R1YiFcbiIpOwogCiAgICAgaWYgKGhpbWxJbnRlcm5hbERyYWcpCiAgICAgICAgIHJldHVybiAoaGltbEludGVybmFsRHJhZyk7CkBAIC0xMTY1LDYgKzEyMzQsOSBAQAogICAgIEhEQzMyICAgIGhkYzsKICAgICBJTlQzMiAgICBuV2lkdGgsIG5IZWlnaHQ7CiAKKyAgICBpZiAoaGltbCA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICBpZiAoKGkgPCAwKSB8fCAoaSA+PSBoaW1sLT5jQ3VySW1hZ2UpKSByZXR1cm4gMDsKKwogICAgIG5XaWR0aCA9IEdldFN5c3RlbU1ldHJpY3MzMiAoU01fQ1hJQ09OKTsKICAgICBuSGVpZ2h0ID0gR2V0U3lzdGVtTWV0cmljczMyIChTTV9DWUlDT04pOwogCkBAIC0xMjMwLDcgKzEzMDIsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJbWFnZUxpc3RfR2V0SWNvbkNvdW50IFtDT01DVEwzMi41OV0KKyAqIEltYWdlTGlzdF9HZXRJbWFnZUNvdW50IFtDT01DVEwzMi41OV0KICAqCiAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaW1hZ2VzIGluIGFuIGltYWdlIGxpc3QuCiAgKgpAQCAtMTIzOSwxNCArMTMxMSwxNCBAQAogICoKICAqIFJFVFVSTlMKICAqICAgICBTdWNjZXNzOiBOdW1iZXIgb2YgaW1hZ2VzLgotICogICAgIEZhaWx1cmU6ID8/Pz8gKE51bWJlciBvZiB3aGF0Li4uKQorICogICAgIEZhaWx1cmU6IDAKICAqLwogCiBJTlQzMiBXSU5BUEkKIEltYWdlTGlzdF9HZXRJbWFnZUNvdW50IChISU1BR0VMSVNUIGhpbWwpCiB7Ci0vLyAgICBpZiAoaGltbCA9PSBOVUxMKQotLy8JcmV0dXJuIC0xOworICAgIGlmIChoaW1sID09IE5VTEwpCisJcmV0dXJuIDA7CiAKICAgICByZXR1cm4gKGhpbWwtPmNDdXJJbWFnZSk7CiB9CkBAIC0xMjcxLDYgKzEzNDMsNyBAQAogSW1hZ2VMaXN0X0dldEltYWdlSW5mbyAoSElNQUdFTElTVCBoaW1sLCBJTlQzMiBpLCBJTUFHRUlORk8gKnBJbWFnZUluZm8pCiB7CiAgICAgaWYgKChoaW1sID09IE5VTEwpIHx8IChwSW1hZ2VJbmZvID09IE5VTEwpKSByZXR1cm4gKEZBTFNFKTsKKyAgICBpZiAoKGkgPCAwKSB8fCAoaSA+PSBoaW1sLT5jQ3VySW1hZ2UpKSByZXR1cm4gKEZBTFNFKTsKIAogICAgIHBJbWFnZUluZm8tPmhibUltYWdlID0gaGltbC0+aGJtSW1hZ2U7CiAgICAgcEltYWdlSW5mby0+aGJtTWFzayAgPSBoaW1sLT5oYm1NYXNrOwpAQCAtMTI5NSwyMiArMTM2OCwxOCBAQAogICogICAgIGxwUmVjdCBbT10gcG9pbnRlciB0byB0aGUgaW1hZ2UgcmVjdGFuZ2xlCiAgKgogICogUkVUVVJOUwotICogICAgU3VjY2VzczogVFJVRSA/Pz8/Ci0gKiAgICBGYWlsdXJlOiBGQUxTRSA/Pz8/CisgKiAgICBTdWNjZXNzOiBUUlVFCisgKiAgICBGYWlsdXJlOiBGQUxTRQogICoKICAqIE5PVEVTCiAgKiAgICBUaGlzIGlzIGFuIFVORE9DVU1FTlRFRCBmdW5jdGlvbiEhIQotICoKLSAqIEJVR1MKLSAqICAgIEkgZG9uJ3Qga25vdyBpZiBpdCByZWFsbHkgcmV0dXJucyBhIEJPT0wzMiBvciBzb21ldGhpbmcgZWxzZSEhIT8/CiAgKi8KIAogQk9PTDMyIFdJTkFQSQogSW1hZ2VMaXN0X0dldEltYWdlUmVjdCAoSElNQUdFTElTVCBoaW1sLCBJTlQzMiBpLCBMUFJFQ1QzMiBscFJlY3QpCiB7Ci0gICAgaWYgKGhpbWwgPT0gTlVMTCkgcmV0dXJuIChGQUxTRSk7CisgICAgaWYgKChoaW1sID09IE5VTEwpIHx8IChscFJlY3QgPT0gTlVMTCkpIHJldHVybiAoRkFMU0UpOwogICAgIGlmICgoaSA8IDApIHx8IChpID49IGhpbWwtPmNDdXJJbWFnZSkpIHJldHVybiAoRkFMU0UpOwotICAgIGlmIChscFJlY3QgPT0gTlVMTCkgcmV0dXJuIChGQUxTRSk7CiAKICAgICBscFJlY3QtPmxlZnQgPSBpICogaGltbC0+Y3g7CiAgICAgbHBSZWN0LT50b3AgPSAwOwpAQCAtMTMyMiwyMyArMTM5MSwyNSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJbWFnZUxpc3RfTG9hZEltYWdlMzJBICAgW0NPTUNUTDMyLjYzXQorICogSW1hZ2VMaXN0X0xvYWRJbWFnZTMyQSBbQ09NQ1RMMzIuNjJdW0NPTUNUTDMyLjYzXQogICoKICAqIENyZWF0ZXMgYW4gaW1hZ2UgbGlzdCBmcm9tIGEgYml0bWFwLCBpY29uIG9yIGN1cnNvci4KICAqCiAgKiBQQVJBTVMKLSAqICAgICBoaSAgICAgIFtJXQotICogICAgIGxwYm1wICAgW0ldCi0gKiAgICAgY3ggICAgICBbSV0KLSAqICAgICBjeSAgICAgIFtJXQotICogICAgIGNHcm93ICAgW0ldCi0gKiAgICAgY2xyTWFzayBbSV0KLSAqICAgICB1VHlwZSAgIFtJXQotICogICAgIHVGbGFncyAgW0ldCisgKiAgICAgaGkgICAgICBbSV0gaW5zdGFuY2UgaGFuZGxlCisgKiAgICAgbHBibXAgICBbSV0gbmFtZSBvciBpZCBvZiB0aGUgaW1hZ2UKKyAqICAgICBjeCAgICAgIFtJXSB3aWR0aCBvZiBlYWNoIGltYWdlCisgKiAgICAgY0dyb3cgICBbSV0gbnVtYmVyIG9mIGltYWdlcyB0byBleHBhbmQKKyAqICAgICBjbHJNYXNrIFtJXSBtYXNrIGNvbG9yCisgKiAgICAgdVR5cGUgICBbSV0gdHlwZSBvZiBpbWFnZSB0byBsb2FkCisgKiAgICAgdUZsYWdzICBbSV0gbG9hZGluZyBmbGFncwogICoKICAqIFJFVFVSTlMKLSAqICAgICBTdWNjZXNzOgotICogICAgIEZhaWx1cmU6CisgKiAgICAgU3VjY2VzczogaGFuZGxlIG9mIHRoZSBsb2FkZWQgaW1hZ2UKKyAqICAgICBGYWlsdXJlOiBOVUxMCisgKgorICogU0VFCisgKiAgICAgTG9hZEltYWdlICgpCiAgKi8KIAogSElNQUdFTElTVCBXSU5BUEkKQEAgLTE0MDQsMTggKzE0NzUsMjAgQEAKICAqIENyZWF0ZXMgYW4gaW1hZ2UgbGlzdCBmcm9tIGEgYml0bWFwLCBpY29uIG9yIGN1cnNvci4KICAqCiAgKiBQQVJBTVMKLSAqICAgICBoaSAgICAgIFtJXQotICogICAgIGxwYm1wICAgW0ldCi0gKiAgICAgY3ggICAgICBbSV0KLSAqICAgICBjeSAgICAgIFtJXQotICogICAgIGNHcm93ICAgW0ldCi0gKiAgICAgY2xyTWFzayBbSV0KLSAqICAgICB1VHlwZSAgIFtJXQotICogICAgIHVGbGFncyAgW0ldCisgKiAgICAgaGkgICAgICBbSV0gaW5zdGFuY2UgaGFuZGxlCisgKiAgICAgbHBibXAgICBbSV0gbmFtZSBvciBpZCBvZiB0aGUgaW1hZ2UKKyAqICAgICBjeCAgICAgIFtJXSB3aWR0aCBvZiBlYWNoIGltYWdlCisgKiAgICAgY0dyb3cgICBbSV0gbnVtYmVyIG9mIGltYWdlcyB0byBleHBhbmQKKyAqICAgICBjbHJNYXNrIFtJXSBtYXNrIGNvbG9yCisgKiAgICAgdVR5cGUgICBbSV0gdHlwZSBvZiBpbWFnZSB0byBsb2FkCisgKiAgICAgdUZsYWdzICBbSV0gbG9hZGluZyBmbGFncwogICoKICAqIFJFVFVSTlMKLSAqICAgICBTdWNjZXNzOgotICogICAgIEZhaWx1cmU6CisgKiAgICAgU3VjY2VzczogaGFuZGxlIG9mIHRoZSBsb2FkZWQgaW1hZ2UKKyAqICAgICBGYWlsdXJlOiBOVUxMCisgKgorICogU0VFCisgKiAgICAgTG9hZEltYWdlICgpCiAgKi8KIAogSElNQUdFTElTVCBXSU5BUEkKQEAgLTE0OTMsOCArMTU2Niw4IEBACiAgKiAgICAgZHkgICAgW0ldIFkgb2Zmc2V0IG9mIHRoZSBzZWNvbmQgaW1hZ2UgcmVsYXRpdmUgdG8gdGhlIGZpcnN0LgogICoKICAqIFJFVFVSTlMKLSAqICAgICBTdWNjZXNzOgotICogICAgIEZhaWx1cmU6CisgKiAgICAgU3VjY2VzczogaGFuZGxlIG9mIHRoZSBtZXJnZWQgaW1hZ2UgbGlzdC4KKyAqICAgICBGYWlsdXJlOiBOVUxMCiAgKi8KIAogSElNQUdFTElTVCBXSU5BUEkKQEAgLTE2MDcsMTkgKzE2ODAsMjIgQEAKICAqIFJFVFVSTlMKICAqICAgICBTdWNjZXNzOiBpbWFnZSBsaXN0IGhhbmRsZQogICogICAgIEZhaWx1cmU6IE5VTEwKKyAqCisgKiBOT1RFUworICogICAgIFRoaXMgZnVuY3Rpb24gY2FuIG5vdCBiZSBpbXBsZW1lbnRlZCB5ZXQsIGJlY2F1c2UKKyAqICAgICBJU3RyZWFtMzI6OlJlYWQgaXMgbm90IGltcGxlbWVudGVkLgorICoKKyAqIEJVR1MKKyAqICAgICBlbXB0eSBzdHViLgogICovCiAKLSNpZiAwCi0jaWYgX19JU3RyZWFtX0lOVEVSRkFDRV9ERUZJTkVEX18KLUhJTUFHRUxJU1QgV0lOQVBJIEltYWdlTGlzdF9SZWFkIChMUFNUUkVBTSBwc3RtKQorSElNQUdFTElTVCBXSU5BUEkgSW1hZ2VMaXN0X1JlYWQgKExQU1RSRUFNMzIgcHN0bSkKIHsKICAgICBGSVhNRSAoaW1hZ2VsaXN0LCAiZW1wdHkgc3R1YiFcbiIpOwogCiAKICAgICByZXR1cm4gKE5VTEwpOwogfQotI2VuZGlmIC8qIF9fSVN0cmVhbV9JTlRFUkZBQ0VfREVGSU5FRF9fICovCi0jZW5kaWYgLyogMCAqLwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNjQyLDE4ICsxNzE4LDE4IEBACiAgICAgSU5UMzIgICAgIGN4TmV3LCBuQ291bnQ7CiAKICAgICBpZiAoKGkgPCAtMSkgfHwgKGkgPj0gaGltbC0+Y0N1ckltYWdlKSkgewotICAgICAgICBFUlIgKGltYWdlbGlzdCwgIkluZGV4IG91dCBvZiByYW5nZSEgJWRcbiIsIGkpOworICAgICAgICBFUlIgKGltYWdlbGlzdCwgImluZGV4IG91dCBvZiByYW5nZSEgJWRcbiIsIGkpOwogICAgICAgICByZXR1cm4gKEZBTFNFKTsKICAgICB9CiAKICAgICBpZiAoaGltbC0+Y0N1ckltYWdlID09IDApIHsKLSAgICAgICAgRVJSIChpbWFnZWxpc3QsICJMaXN0IGlzIGFscmVhZHkgZW1wdHkhXG4iKTsKKyAgICAgICAgRVJSIChpbWFnZWxpc3QsICJpbWFnZSBsaXN0IGlzIGFscmVhZHkgZW1wdHkhXG4iKTsKICAgICAgICAgcmV0dXJuIChGQUxTRSk7CiAgICAgfQogCiAgICAgaWYgKGkgPT0gLTEpIHsKICAgICAgICAgLyogcmVtb3ZlIGFsbCAqLwotICAgICAgICBUUkFDRSAoaW1hZ2VsaXN0LCAiUmVtb3ZlIGFsbCFcbiIpOworICAgICAgICBUUkFDRSAoaW1hZ2VsaXN0LCAicmVtb3ZlIGFsbCFcbiIpOwogCiAgICAgICAgIGhpbWwtPmNNYXhJbWFnZSA9IGhpbWwtPmNJbml0aWFsICsgaGltbC0+Y0dyb3c7CiAgICAgICAgIGhpbWwtPmNDdXJJbWFnZSA9IDA7CkBAIC0xOTQ2LDcgKzIwMjIsNyBAQAogICogICAgIEZhaWx1cmU6IEZBTFNFCiAgKgogICogQlVHUwotICogICAgIGVtcHR5IHN0dWIuCisgKiAgICAgc2VtaS1zdHViLgogICovCiAKIEJPT0wzMiBXSU5BUEkKQEAgLTE5NTUsNyArMjAzMSw3IEBACiB7CiAgICAgSElNQUdFTElTVCBoaW1sVGVtcDsKIAotICAgIEZJWE1FIChpbWFnZWxpc3QsICJlbXB0eSBzdHViIVxuIik7CisgICAgRklYTUUgKGltYWdlbGlzdCwgInNlbWktc3R1YiFcbiIpOwogCiAgICAgaWYgKGhpbWxJbnRlcm5hbERyYWcgPT0gTlVMTCkgcmV0dXJuIChGQUxTRSk7CiAKQEAgLTE5ODYsMTEgKzIwNjIsMTEgQEAKICAqICAgICBkd0ZpbHRlciBbSV0gPz8/CiAgKgogICogUkVUVVJOUwotICogICAgIFN1Y2Nlc3M6IFRSVUUKLSAqICAgICBGYWlsdXJlOiBGQUxTRQorICogICAgIFN1Y2Nlc3M6IFRSVUUgPz8/CisgKiAgICAgRmFpbHVyZTogRkFMU0UgPz8/CiAgKgogICogQlVHUwotICogICAgIHVuZG9jdW1lbnRlZCEhISEKKyAqICAgICBUaGlzIGlzIGFuIFVORE9DVU1FTlRFRCBmdW5jdGlvbiEhISEKICAqICAgICBlbXB0eSBzdHViLgogICovCiAKQEAgLTIwMjUsNiArMjEwMSw4IEBACiB7CiAgICAgSU5UMzIgbkNvdW50OwogCisgICAgaWYgKGhpbWwgPT0gTlVMTCkgcmV0dXJuIChGQUxTRSk7CisKICAgICAvKiByZW1vdmUgYWxsIGltYWdlcyovCiAgICAgaGltbC0+Y01heEltYWdlICA9IGhpbWwtPmNJbml0aWFsICsgaGltbC0+Y0dyb3c7CiAgICAgaGltbC0+Y0N1ckltYWdlICA9IDA7CkBAIC0yMTUxLDcgKzIyMjksNyBAQAogICAgIGlmICgoaUltYWdlIDwgMCkgfHwgKGlJbWFnZSA+IGhpbWwtPmNDdXJJbWFnZSkpIHJldHVybiAoRkFMU0UpOwogICAgIAogICAgIGhpbWwtPm5PdmxJZHhbaU92ZXJsYXkgLSAxXSA9IGlJbWFnZTsKLSAgICByZXR1cm4gKFRSVUUpOworICAgIHJldHVybiBUUlVFOwogfQogCiAKQEAgLTIxNjgsMjAgKzIyNDYsMjEgQEAKICAqICAgICBTdWNjZXNzOiBUUlVFCiAgKiAgICAgRmFpbHVyZTogRkFMU0UKICAqCisgKiBOT1RFUworICogICAgIFRoaXMgZnVuY3Rpb24gY2FuIG5vdCBiZSBpbXBsZW1lbnRlZCB5ZXQsIGJlY2F1c2UKKyAqICAgICBJU3RyZWFtMzI6OldyaXRlIGlzIG5vdCBpbXBsZW1lbnRlZC4KKyAqCiAgKiBCVUdTCiAgKiAgICAgZW1wdHkgc3R1Yi4KICAqLwogCi0jaWYgMAotI2lmIF9fSVN0cmVhbV9JTlRFUkZBQ0VfREVGSU5FRF9fCiBCT09MMzIgV0lOQVBJCi1JbWFnZUxpc3RfV3JpdGUgKEhJTUFHRUxJU1QgaGltbCwgTFBTVFJFQU0gcHN0bSkKK0ltYWdlTGlzdF9Xcml0ZSAoSElNQUdFTElTVCBoaW1sLCBMUFNUUkVBTTMyIHBzdG0pCiB7CiAgICAgRklYTUUgKGltYWdlbGlzdCwgImVtcHR5IHN0dWIhXG4iKTsKIAorICAgIGlmIChoaW1sID09IE5VTEwpIHJldHVybiAoRkFMU0UpOwogCi0gICAgcmV0dXJuIChGQUxTRSk7CisgICAgcmV0dXJuIEZBTFNFOwogfQotI2VuZGlmICAvKiBfX0lTdHJlYW1fSU5URVJGQUNFX0RFRklORURfXyAqLwotI2VuZGlmICAvKiAwICovCiAKZGlmZiAtLWdpdCBhL21pc2MvbHN0ci5jIGIvbWlzYy9sc3RyLmMKaW5kZXggMTQ5MWQ0Zi4uYmZmZDFlNyAxMDA2NDQKLS0tIGEvbWlzYy9sc3RyLmMKKysrIGIvbWlzYy9sc3RyLmMKQEAgLTcsNyArNyw2IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0xNiw4ICsxNSw2IEBACiAjaWZkZWYgSEFWRV9XQ1RZUEVfSAogIyBpbmNsdWRlIDx3Y3R5cGUuaD4KICNlbHNlCi0jIGRlZmluZSB0b3dsb3dlcihjKSB0b2xvd2VyKGMpCi0jIGRlZmluZSB0b3d1cHBlcihjKSB0b3VwcGVyKGMpCiAjIGRlZmluZSBpc3dhbG51bShjKSBpc2FsbnVtKGMpCiAjIGRlZmluZSBpc3dhbHBoYShjKSBpc2FscGhhKGMpCiAjIGRlZmluZSBpc3d1cHBlcihjKSBpc3VwcGVyKGMpCkBAIC0zOCw2ICszNSwyNyBAQAogCiAvKiBiZSBjYXJlZnVsOiBhbHdheXMgdXNlIGZ1bmN0aW9ucyBmcm9tIHdjdHlwZS5oIGlmIGNoYXJhY3RlciA+IDI1NSAqLwogCisvKgorICogVW5pY29kZSBjYXNlIGNvbnZlcnNpb24gcm91dGluZXMgLi4uIHRoZXNlIHNob3VsZCBiZSB1c2VkIHdoZXJlCisgKiB0b3VwcGVyL3RvbG93ZXIgYXJlIHVzZWQgZm9yIEFTQ0lJLgorICovCisjaWZuZGVmIEhBVkVfV0NUWVBFX0gKKy8qIEZJWE1FOiBzaG91bGQgcHJvYmFibHkgZ2V0IHJpZCBvZiB3Y3R5cGUuaCBhbHRvZ2V0aGVyICovCisjaW5jbHVkZSAiY2FzZW1hcC5oIgorCitXQ0hBUiBfdG93dXBwZXIoV0NIQVIgY29kZSkKK3sKKyAgICBjb25zdCBXQ0hBUiAqIHB0ciA9IHVwcnRhYmxlW0hJQllURShjb2RlKV07CisgICAgcmV0dXJuIHB0ciA/IHB0cltMT0JZVEUoY29kZSldIDogY29kZTsKK30KKworV0NIQVIgX3Rvd2xvd2VyKFdDSEFSIGNvZGUpCit7CisgICAgY29uc3QgV0NIQVIgKiBwdHIgPSBsd3J0YWJsZVtISUJZVEUoY29kZSldOworICAgIHJldHVybiBwdHIgPyBwdHJbTE9CWVRFKGNvZGUpXSA6IGNvZGU7Cit9CisjZW5kaWYgIC8qIEhBVkVfV0NUWVBFX0ggKi8KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJSXNDaGFyQWxwaGEgKFVTRVIuNDMzKQogICovCkBAIC0zNTAsNyArMzY4LDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4geDsKICAgICB9Ci0gICAgZWxzZSByZXR1cm4gKExQV1NUUil0b3dsb3dlcihMT1dPUkQoeCkpOworICAgIGVsc2UgcmV0dXJuIChMUFdTVFIpKChVSU5UMzIpdG93bG93ZXIoTE9XT1JEKHgpKSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDI0LDcgKzQ0Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHg7CiAgICAgfQotICAgIGVsc2UgcmV0dXJuIChMUFdTVFIpdG93dXBwZXIoTE9XT1JEKHgpKTsKKyAgICBlbHNlIHJldHVybiAoTFBXU1RSKSgoVUlOVDMyKXRvd3VwcGVyKExPV09SRCh4KSkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL21pc2MvbHpleHBhbmQuYyBiL21pc2MvbHpleHBhbmQuYwppbmRleCA2YmM5ZjQ0Li43OTJhN2RiIDEwMDY0NAotLS0gYS9taXNjL2x6ZXhwYW5kLmMKKysrIGIvbWlzYy9semV4cGFuZC5jCkBAIC04LDcgKzgsNiBAQAogICovCiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CmRpZmYgLS1naXQgYS9taXNjL21haW4uYyBiL21pc2MvbWFpbi5jCmluZGV4IDZkN2Y0N2QuLjQ5ZWY2ZGYgMTAwNjQ0Ci0tLSBhL21pc2MvbWFpbi5jCisrKyBiL21pc2MvbWFpbi5jCkBAIC00LDcgKzQsNiBAQAogICogQ29weXJpZ2h0IDE5OTQgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CkBAIC01OTYsOSArNTk1LDEzIEBACiAKICAgICBpZiAoT3B0aW9ucy5kZXNrdG9wR2VvbWV0cnkgJiYgT3B0aW9ucy5tYW5hZ2VkKQogICAgIHsKKyNpZiAwCiAgICAgICAgIE1TRyggIiVzOiAtbWFuYWdlZCBhbmQgLWRlc2t0b3Agb3B0aW9ucyBjYW5ub3QgYmUgdXNlZCB0b2dldGhlclxuIiwKICAgICAgICAgICAgICAgICAgT3B0aW9ucy5wcm9ncmFtTmFtZSApOwogICAgICAgICBleGl0KDEpOworI2Vsc2UKKyAgICAgICAgT3B0aW9ucy5tYW5hZ2VkID0gRkFMU0U7CisjZW5kaWYKICAgICB9CiAKICAgICBzY3JlZW4gICAgICAgPSBEZWZhdWx0U2NyZWVuT2ZEaXNwbGF5KCBkaXNwbGF5ICk7CkBAIC04MTMsNyArODE2LDI3IEBACiAgICAgICAgICAgICAgICAgdVBhcmFtID0gc2l6ZW9mKEFOSU1BVElPTklORk8pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gCisKKyAgICAgICAgY2FzZSBTUElfR0VUSElHSENPTlRSQVNUOgorICAgICAgICB7CisgICAgICAgICAgICAgICAgTFBISUdIQ09OVFJBU1RBIGxwSGlnaENvbnRyYXN0QSA9IChMUEhJR0hDT05UUkFTVEEpbHB2UGFyYW07CisKKyAgICAgICAgICAgICAgICBGSVhNRShzeXN0ZW0sIlNQSV9HRVRISUdIQ09OVFJBU1Qgbm90IGZ1bGx5IGltcGxlbWVudGVkXG4iKTsKKworICAgICAgICAgICAgICAgIGlmICggbHBIaWdoQ29udHJhc3RBLT5jYlNpemUgPT0gc2l6ZW9mKCBISUdIQ09OVFJBU1RBICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8gaGlnaCBjb250cmFzdCBhdmFpbGFibGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxwSGlnaENvbnRyYXN0QS0+ZHdGbGFncyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBscEhpZ2hDb250cmFzdEEtPmxwc3pEZWZhdWx0U2NoZW1lID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAJZGVmYXVsdDoKIAkJcmV0dXJuIFN5c3RlbVBhcmFtZXRlcnNJbmZvMTYodUFjdGlvbix1UGFyYW0sbHB2UGFyYW0sZnVXaW5JbmkpOwogCX0KQEAgLTk5Myw3ICsxMDE2LDYgQEAKIAkJY2FzZSBTUElfU0VURkFTVFRBU0tTV0lUQ0g6CiAJCWNhc2UgU1BJX1NFVEtFWUJPQVJEREVMQVk6CiAJCWNhc2UgU1BJX1NFVEtFWUJPQVJEU1BFRUQ6Ci0JICAgICAgICBjYXNlIFNQSV9HRVRISUdIQ09OVFJBU1Q6CiAJCQlXQVJOKHN5c3RlbSwgIk9wdGlvbiAlZCBpZ25vcmVkLlxuIiwgdUFjdGlvbik7CiAJCQlicmVhazsKIApAQCAtMTA2OSw2ICsxMDkxLDI2IEBACiAJYnJlYWs7CiAgICAgfQogCisgICAgY2FzZSBTUElfR0VUSElHSENPTlRSQVNUOgorICAgIHsKKyAgICAgICBMUEhJR0hDT05UUkFTVEEgbHBIaWdoQ29udHJhc3RXID0gKExQSElHSENPTlRSQVNUVylscHZQYXJhbTsKKworICAgICAgIEZJWE1FKHN5c3RlbSwiU1BJX0dFVEhJR0hDT05UUkFTVCBub3QgZnVsbHkgaW1wbGVtZW50ZWRcbiIpOworCisgICAgICAgaWYgKCBscEhpZ2hDb250cmFzdFctPmNiU2l6ZSA9PSBzaXplb2YoIEhJR0hDT05UUkFTVFcgKSApCisgICAgICAgeworICAgICAgICAgIC8qIEluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8gaGlnaCBjb250cmFzdCBhdmFpbGFibGUgKi8KKyAgICAgICAgICBscEhpZ2hDb250cmFzdFctPmR3RmxhZ3MgPSAwOworICAgICAgICAgIGxwSGlnaENvbnRyYXN0Vy0+bHBzekRlZmF1bHRTY2hlbWUgPSBOVUxMOworICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICB9CisKKyAgICAgICBicmVhazsKKyAgICB9CisKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gU3lzdGVtUGFyYW1ldGVyc0luZm8zMkEodUFjdGlvbix1UGFyYW0sbHB2UGFyYW0sZnVXaW5JbmkpOwogCQpkaWZmIC0tZ2l0IGEvbWlzYy9uZXR3b3JrLmMgYi9taXNjL25ldHdvcmsuYwppbmRleCAyYzE3ZGNiLi43OTM2MzgzIDEwMDY0NAotLS0gYS9taXNjL25ldHdvcmsuYworKysgYi9taXNjL25ldHdvcmsuYwpAQCAtNyw3ICs3LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCkBAIC0yMiwxNiArMjEsMTYgQEAKICAqIFJlZGlyZWN0cyBhIGxvY2FsIGRldmljZSAoZWl0aGVyIGEgZGlzayBkcml2ZSBvciBwcmludGVyIHBvcnQpCiAgKiB0byBhIHNoYXJlZCBkZXZpY2Ugb24gYSByZW1vdGUgc2VydmVyLgogICovCi1VSU5UMTYgV0lOQVBJIFdOZXRBZGRDb25uZWN0aW9uMTYoTFBTVFIgbHBOZXRQYXRoLCBMUFNUUiBscFBhc3NXb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBscExvY2FsTmFtZSkKK1VJTlQxNiBXSU5BUEkgV05ldEFkZENvbm5lY3Rpb24xNihMUENTVFIgbHBOZXRQYXRoLCBMUENTVFIgbHBQYXNzV29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwTG9jYWxOYW1lKQogewkKICAgIHJldHVybiBXTmV0QWRkQ29ubmVjdGlvbjMyQShscE5ldFBhdGgsIGxwUGFzc1dvcmQsIGxwTG9jYWxOYW1lKTsKIH0KIAogLyogW01QUi41MF0gKi8KIAotVUlOVDMyIFdOZXRBZGRDb25uZWN0aW9uMzJBKExQU1RSIE5ldFBhdGgsIExQU1RSIFBhc3NXb3JkLAotCQkJICAgIExQU1RSIExvY2FsTmFtZSkKK1VJTlQzMiBXSU5BUEkgV05ldEFkZENvbm5lY3Rpb24zMkEoTFBDU1RSIE5ldFBhdGgsIExQQ1NUUiBQYXNzV29yZCwKKwkJCSAgICBMUENTVFIgTG9jYWxOYW1lKQogewogICAgRklYTUUod25ldCwgIignJXMnLCAlcCwgJyVzJyk6IHN0dWJcbiIsCiAJIE5ldFBhdGgsIFBhc3NXb3JkLCBMb2NhbE5hbWUpOwpAQCAtNDAsOSArMzksOSBAQAogCiAvKiBbTVBSLjUxXSAqLwogCi1VSU5UMzIgV05ldEFkZENvbm5lY3Rpb24zMlcoTFBXU1RSIE5ldFBhdGgsIAotCQkJICAgIExQV1NUUiBQYXNzV29yZCwKLQkJCSAgICBMUFdTVFIgTG9jYWxOYW1lKQorVUlOVDMyIFdJTkFQSSBXTmV0QWRkQ29ubmVjdGlvbjMyVyhMUENXU1RSIE5ldFBhdGgsIAorCQkJICAgIExQQ1dTVFIgUGFzc1dvcmQsCisJCQkgICAgTFBDV1NUUiBMb2NhbE5hbWUpCiB7CiAgICBGSVhNRSh3bmV0LCAiIHN0dWIhXG4iKTsKICAgIHJldHVybiBXTl9OT19ORVRXT1JLOwpAQCAtNTIsNyArNTEsNyBAQAogICogV05ldEFkZENvbm5lY3Rpb24yXzMyQSBbTVBSLjQ2XSAKICAqLwogCi1VSU5UMzIKK1VJTlQzMiBXSU5BUEkKIFdOZXRBZGRDb25uZWN0aW9uMl8zMkEoTFBORVRSRVNPVVJDRTMyQSBuZXRyZXNvdXJjZSwgLyogW2luXSAqLwogCQkgICAgICAgTFBDU1RSIHBhc3N3b3JkLCAgICAgICAgLyogW2luXSAqLyAgICAgCiAJCSAgICAgICBMUENTVFIgdXNlcm5hbWUsICAgICAgICAvKiBbaW5dICovCkBAIC02OCw3ICs2Nyw3IEBACiAgKiBXTmV0QWRkQ29ubmVjdGlvbjJXIFtNUFIuNDddCiAgKi8KIAotVUlOVDMyCitVSU5UMzIgV0lOQVBJCiBXTmV0QWRkQ29ubmVjdGlvbjJfMzJXKExQTkVUUkVTT1VSQ0UzMlcgbmV0cmVzb3VyY2UsIC8qIFtpbl0gKi8KIAkJICAgICAgIExQQ1dTVFIgcGFzc3dvcmQsICAgICAgICAvKiBbaW5dICovICAgICAKIAkJICAgICAgIExQQ1dTVFIgdXNlcm5hbWUsICAgICAgICAvKiBbaW5dICovCkBAIC04Myw3ICs4Miw3IEBACiAgKiBXTmV0QWRkQ29ubmVjdGlvbjNfMzJBIFtNUFIuNDhdCiAgKi8KIAotVUlOVDMyIFdOZXRBZGRDb25uZWN0aW9uM18zMkEoSFdORDMyIG93bmVyLAorVUlOVDMyIFdJTkFQSSBXTmV0QWRkQ29ubmVjdGlvbjNfMzJBKEhXTkQzMiBvd25lciwKIAkJICAgICAgTFBORVRSRVNPVVJDRTMyQSBuZXRyZXNvdXJjZSwKIAkJICAgICAgTFBDU1RSIHBhc3N3b3JkLAogCQkgICAgICBMUENTVFIgdXNlcm5hbWUsCkBAIC05OCw3ICs5Nyw3IEBACiAgKiBXTmV0QWRkQ29ubmVjdGlvbjNXIFtNUFIuNDldCiAgKi8KIAotVUlOVDMyIFdOZXRBZGRDb25uZWN0aW9uM18zMlcoSFdORDMyIG93bmVyLAorVUlOVDMyIFdJTkFQSSBXTmV0QWRkQ29ubmVjdGlvbjNfMzJXKEhXTkQzMiBvd25lciwKIAkJCSAgICAgIExQTkVUUkVTT1VSQ0UzMlcgbmV0cmVzb3VyY2UsCiAJCQkgICAgICBMUENXU1RSIHVzZXJuYW1lLAogCQkJICAgICAgTFBDV1NUUiBwYXNzd29yZCwKQEAgLTExMyw3ICsxMTIsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgIFdOZXRDYW5jZWxDb25uZWN0aW9uCVtVU0VSLjUxOF0gIHVuZGlyZWN0cyBhIGxvY2FsIGRldmljZQogICovCi1VSU5UMTYgV0lOQVBJIFdOZXRDYW5jZWxDb25uZWN0aW9uKExQU1RSIGxwTmFtZSwgQk9PTDE2IGJGb3JjZSkKK1VJTlQxNiBXSU5BUEkgV05ldENhbmNlbENvbm5lY3Rpb24oTFBDU1RSIGxwTmFtZSwgQk9PTDE2IGJGb3JjZSkKIHsKICAgICBGSVhNRSh3bmV0LCAiKCclcycsICUwNFgpOiBzdHViXG4iLCBscE5hbWUsIGJGb3JjZSk7CiAgICAgcmV0dXJuIFdOX05PX05FVFdPUks7CkBAIC01NTIsMTEgKzU1MSwxMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQlXTmV0T3BlbkVudW1BCQlbTVBSLjkyXQogICovCi1VSU5UMzIgV0lOQVBJIFdOZXRPcGVuRW51bTMyQShEV09SRCBkd1Njb3BlLCBEV09SRCBkd1R5cGUsIAorVUlOVDMyIFdJTkFQSSBXTmV0T3BlbkVudW0zMkEoRFdPUkQgZHdTY29wZSwgRFdPUkQgZHdUeXBlLCBEV09SRCBkd1VzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBORVRSRVNPVVJDRTMyQSBscE5ldCwgSEFORExFMzIgKmxwaEVudW0pCiB7Ci0JRklYTUUod25ldCwgIiglMDhsWCwgJTA4bFgsICVwLCAlcCk6IHN0dWJcbiIsCi0JICAgICAgZHdTY29wZSwgZHdUeXBlLCBscE5ldCwgbHBoRW51bSk7CisJRklYTUUod25ldCwgIiglMDhsWCwgJTA4bFgsICUwOGxYLCAlcCwgJXApOiBzdHViXG4iLAorCSAgICAgIGR3U2NvcGUsIGR3VHlwZSwgZHdVc2FnZSwgbHBOZXQsIGxwaEVudW0pOwogCXJldHVybiBXTl9OT19ORVRXT1JLOwogfQogCkBAIC02MTQsNyArNjEzLDcgQEAKICAgICByZXR1cm4gV05fQUNDRVNTX0RFTklFRDsKIH0KIAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgTXVsdGluZXRHZXRDb25uZWN0aW9uUGVyZm9ybWFuY2VBIFtNUFIuMjVdCiAgKgogICogUkVUVVJOUwpAQCAtNjI5LDUgKzYyOCwyNyBAQAogCUxQTkVUQ09OTkVDVElORk9TVFJVQ1QgbHBOZXRDb25uZWN0SW5mb1N0cnVjdAogKSB7CiAJRklYTUUobXByLCIoJXAsJXApOiBzdHViXG4iLGxwTmV0UmVzb3VyY2UsbHBOZXRDb25uZWN0SW5mb1N0cnVjdCk7CisJcmV0dXJuIFdOX05PX05FVFdPUks7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgW01QUi4yMl0KKyAqLworCitEV09SRCBXSU5BUEkgX01QUl8yMihEV09SRCB4KQoreworCUZJWE1FKG1wciwiKCVseCk6IHN0dWJcbiIseCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFtNUFIuMjVdCisgKi8KKworRFdPUkQgV0lOQVBJIF9NUFJfMjUoRFdPUkQgeCwgRFdPUkQgeSkKK3sKKwlGSVhNRShtcHIsIiglbHgsJWx4KTogc3R1YlxuIix4LHkpOwogCXJldHVybiAxOwogfQorCmRpZmYgLS1naXQgYS9taXNjL250ZGxsLmMgYi9taXNjL250ZGxsLmMKaW5kZXggNzc0NGY5NS4uMjFlZmI1MCAxMDA2NDQKLS0tIGEvbWlzYy9udGRsbC5jCisrKyBiL21pc2MvbnRkbGwuYwpAQCAtNCw3ICs0LDYgQEAKICAqIENvcHlyaWdodCAxOTk2IE1hcmN1cyBNZWlzc25lcgogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KQEAgLTEyLDYgKzExLDcgQEAKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbm5scy5oIgogI2luY2x1ZGUgIm50ZGxsLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCkBAIC0yMDQsNyArMjA0LDcgQEAKICAqLwogTFBWT0lEIFdJTkFQSSBSdGxOb3JtYWxpemVQcm9jZXNzUGFyYW1zKExQVk9JRCB4KQogewotICAgIEZJWE1FKG50ZGxsLCIoJXApLCBzdHViLlxuIix4KTsKKyAgICBGSVhNRShudGRsbCwiKCVwKSwgc3R1YlxuIix4KTsKICAgICByZXR1cm4geDsKIH0KIApAQCAtNDI5LDggKzQyOSw4IEBACiAgKi8KIERXT1JEIFdJTkFQSSBSdGxOdFN0YXR1c1RvRG9zRXJyb3IoRFdPUkQgZXJyb3IpCiB7Ci0JLyogRklYTUU6IG1hcCBTVEFUVVNfIHRvIEVSUk9SXyAqLwotCXJldHVybiBlcnJvcjsKKyAgICBGSVhNRShudGRsbCwgIigleCk6IG1hcCBTVEFUVVNfIHRvIEVSUk9SX1xuIixlcnJvcik7CisgICAgcmV0dXJuIGVycm9yOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQzOCw4ICs0MzgsOCBAQAogICovCiBEV09SRCBXSU5BUEkgUnRsR2V0TnRQcm9kdWN0VHlwZShMUFZPSUQgeCkKIHsKLQkvKiBGSVhNRSA6IGZpbmQgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBvbmUgKi8KLQlyZXR1cm4gMDsKKyAgICBGSVhNRShudGRsbCwgIiglcCk6IHN0dWJcbiIsIHgpOworICAgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCXM9ZGVzdC0+QnVmZmVyO3Q9c3JjLT5CdWZmZXI7CiAJLyogbGVuIGlzIGluIGJ5dGVzICovCiAJZm9yIChpPTA7aTxsZW4vMjtpKyspCi0JCXNbaV09dG91cHBlcih0W2ldKTsKKwkJc1tpXSA9IHRvd3VwcGVyKHRbaV0pOwogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIApAQCAtNDg0LDYgKzQ4NCw0OSBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICBSdGxJc1RleHRVbmljb2RlCQkJW05URExMXQorICoKKyAqCUFwcGx5IHZhcmlvdXMgZmVlYmxlIGhldXJpc3RpY3MgdG8gZ3Vlc3Mgd2hldGhlcgorICoJdGhlIHRleHQgYnVmZmVyIGNvbnRhaW5zIFVuaWNvZGUuCisgKglGSVhNRTogc2hvdWxkIGltcGxlbWVudCBtb3JlIHRlc3RzLgorICovCitEV09SRCBXSU5BUEkgUnRsSXNUZXh0VW5pY29kZShMUFZPSUQgYnVmLCBEV09SRCBsZW4sIERXT1JEICpwZikKK3sKKwlMUFdTVFIgcyA9IGJ1ZjsKKwlEV09SRCBmbGFncyA9IC0xLCBvdXRfZmxhZ3MgPSAwOworCisJaWYgKCFsZW4pCisJCWdvdG8gb3V0OworCWlmIChwZikKKwkJZmxhZ3MgPSAqcGY7CisJLyoKKwkgKiBBcHBseSB2YXJpb3VzIHRlc3RzIHRvIHRoZSB0ZXh0IHN0cmluZy4gQWNjb3JkaW5nIHRvIHRoZQorCSAqIGRvY3MsIGVhY2ggdGVzdCAicGFzc2VkIiBzZXRzIHRoZSBjb3JyZXNwb25kaW5nIGZsYWcgaW4KKwkgKiB0aGUgb3V0cHV0IGZsYWdzLiBCdXQgc29tZSBvZiB0aGUgdGVzdHMgYXJlIG11dHVhbGx5CisJICogZXhjbHVzaXZlLCBzbyBJIGRvbid0IHNlZSBob3cgeW91IGNvdWxkIHBhc3MgYWxsIHRlc3RzIC4uLgorCSAqLworCisJLyogQ2hlY2sgZm9yIGFuIG9kZCBsZW5ndGggLi4uIHBhc3MgaWYgZXZlbi4gKi8KKwlpZiAoIShsZW4gJiAxKSkKKwkJb3V0X2ZsYWdzIHw9IElTX1RFWFRfVU5JQ09ERV9PRERfTEVOR1RIOworCisJLyogQ2hlY2sgZm9yIHRoZSBzcGVjaWFsIHVuaWNvZGUgbWFya2VyIGJ5dGUuICovCisJaWYgKCpzID09IDB4RkVGRikKKwkJb3V0X2ZsYWdzIHw9IElTX1RFWFRfVU5JQ09ERV9TSUdOQVRVUkU7CisKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgdGhlIHN0cmluZyBwYXNzZWQgYWxsIG9mIHRoZSB0ZXN0cy4KKwkgKi8KKwlmbGFncyAmPSBJVFVfSU1QTEVNRU5URURfVEVTVFM7CisJaWYgKChvdXRfZmxhZ3MgJiBmbGFncykgIT0gZmxhZ3MpCisJCWxlbiA9IDA7CitvdXQ6CisJaWYgKHBmKQorCQkqcGYgPSBvdXRfZmxhZ3M7CisJcmV0dXJuIGxlbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgUnRsRG9zUGF0aE5hbWVUb050UGF0aE5hbWVfVQkJW05URExMXQogICoKICAqIEZJWE1FOiBjb252ZXJ0IHRvIFVOQyBvciB3aGF0ZXZlciBpcyBleHBlY3RlZCBoZXJlCkBAIC01MDQsNyArNTQ3LDcgQEAKICAqLwogRFdPUkQgV0lOQVBJIE50T3BlbkZpbGUoRFdPUkQgeDEsRFdPUkQgZmxhZ3MsRFdPUkQgeDMsRFdPUkQgeDQsRFdPUkQgYWxpZ25tZW50LERXT1JEIHg2KQogewotCUZJWE1FKG50ZGxsLCIoJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgpXG4iLAorCUZJWE1FKG50ZGxsLCIoJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgpOiBzdHViXG4iLAogCSAgICAgIHgxLGZsYWdzLHgzLHg0LGFsaWdubWVudCx4Nik7CiAJLyogcmV0dXJucyBmaWxlIGlvIGNvbXBsZXRpb24gc3RhdHVzICovCiAJcmV0dXJuIDA7CkBAIC01MTcsNCArNTYwLDc3IEBACiB2b2lkIE5URExMX2Noa3N0ayh2b2lkKQogewogICAgIC8qIEZJWE1FOiBzaG91bGQgc3VidHJhY3QgJWVheCBieXRlcyBmcm9tIHN0YWNrIHBvaW50ZXIgKi8KKyAgICBGSVhNRShudGRsbCwgIih2b2lkKTogc3R1YlxuIik7CiB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOdE9wZW5EaXJlY3RvcnlPYmplY3QgW05URExMLjEyNF0KKyAqLworRFdPUkQgV0lOQVBJIE50T3BlbkRpcmVjdG9yeU9iamVjdChEV09SRCB4MSxEV09SRCB4MixEV09SRCB4MykKK3sKKyAgICBGSVhNRShudGRsbCwiKCVseCwlbHgsJWx4KTogc3R1YlxuIix4MSx4Mix4Myk7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOdFF1ZXJ5RGlyZWN0b3J5T2JqZWN0IFtOVERMTC4xNDldCisgKi8KK0RXT1JEIFdJTkFQSSBOdFF1ZXJ5RGlyZWN0b3J5T2JqZWN0KERXT1JEIHgxLCBEV09SRCB4MikKK3sKKyAgICBGSVhNRShudGRsbCwiKCVseCwlbHgpOiBzdHViXG4iLHgxLHgyKTsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJ0bEZyZWVBbnNpU3RyaW5nIFtOVERMTC4zNzNdCisgKi8KK0RXT1JEIFdJTkFQSSBSdGxGcmVlQW5zaVN0cmluZyhEV09SRCB4MSkKK3sKKyAgICBGSVhNRShudGRsbCwiKCVseCk6IHN0dWJcbiIseDEpOworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uIFtOVERMTC4xNjhdCisgKi8KK0RXT1JEIFdJTkFQSSBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24oIERXT1JEIHgxICkKK3sKKyAgICBGSVhNRShudGRsbCwiKCVseCk6IHN0dWJcbiIseDEpOworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE50UXVlcnlPYmplY3QgW05URExMLjE2MV0KKyAqLworRFdPUkQgV0lOQVBJIE50UXVlcnlPYmplY3QoIERXT1JEIHgxLCBEV09SRCB4MiApCit7CisgICAgRklYTUUobnRkbGwsIiglbHgsJWx4KTogc3R1YlxuIix4MSx4Mik7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUnRsVGltZVRvRWxhcHNlZFRpbWVGaWVsZHMgW05URExMLjUwMl0KKyAqLworRFdPUkQgV0lOQVBJIFJ0bFRpbWVUb0VsYXBzZWRUaW1lRmllbGRzKCBEV09SRCB4MSApCit7CisgICAgRklYTUUobnRkbGwsIiglbHgpOiBzdHViXG4iLHgxKTsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOdFNldEluZm9ybWF0aW9uUHJvY2VzcyBbTlRETEwuMjA3XQorICovCitEV09SRCBXSU5BUEkgTnRTZXRJbmZvcm1hdGlvblByb2Nlc3MoIERXT1JEIHgxICkKK3sKKyAgICBGSVhNRShudGRsbCwiKCVseCk6IHN0dWJcbiIseDEpOworICAgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL21pc2MvcHJpbnRkcnYuYyBiL21pc2MvcHJpbnRkcnYuYwppbmRleCA3Mzg5ZWQzLi4yMGMyMjA3IDEwMDY0NAotLS0gYS9taXNjL3ByaW50ZHJ2LmMKKysrIGIvbWlzYy9wcmludGRydi5jCkBAIC01LDcgKzUsNiBAQAogICovCiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgpAQCAtMTA2LDMgKzEwNSw5IEBACiAgICAgKmxwZHdSZXR1cm5lZD0wOwogICAgIHJldHVybiBUUlVFOwogfQorQk9PTDMyIFdJTkFQSSBBZGRNb25pdG9yMzJBKExQQ1NUUiBwTmFtZSwgRFdPUkQgTGV2ZWwsIExQQllURSBwTW9uaXRvcnMpCit7CisgICAgRklYTUUocHJpbnQsICIoJXMsJWx4LCVwKTpzdHViIVxuIiwgcE5hbWUsIExldmVsLCBwTW9uaXRvcnMpOworICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgICAgcmV0dXJuIEZBTFNFOworfQpkaWZmIC0tZ2l0IGEvbWlzYy9yZWdpc3RyeS5jIGIvbWlzYy9yZWdpc3RyeS5jCmluZGV4IGQ0NTY5ZTYuLjU1MzA3ZTUgMTAwNjQ0Ci0tLSBhL21pc2MvcmVnaXN0cnkuYworKysgYi9taXNjL3JlZ2lzdHJ5LmMKQEAgLTIwLDcgKzIwLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgpAQCAtNDAsMTEgKzM5LDcgQEAKICNpbmNsdWRlICJ4bWFsbG9jLmgiCiAjaW5jbHVkZSAid2lucmVnLmgiCiAKLXZvaWQgU0hFTExfU3RhcnR1cFJlZ2lzdHJ5KCk7Ci0KLS8qIFRoaXMgaXMgbm90IHVzZWQgYW55d2hlcmUgKi8KLSNkZWZpbmUJREVCVUdfVzk1X0xPQURSRUcJMAotCitzdGF0aWMgdm9pZCBSRUdJU1RSWV9Jbml0KCk7CiAvKiBGSVhNRTogZm9sbG93aW5nIGRlZmluZXMgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgZ2xvYmFsIC4uLiAqLwogCiAvKiBOT1RFOiBkbyBub3QgYXBwZW5kIGEgLy4gbGludXgnIG1rZGlyKCkgV0lMTCBGQUlMIGlmIHlvdSBkbyB0aGF0ICovCkBAIC0xMDIsNiArOTcsMTAgQEAKICAqIEZJWE1FCiAgKiAgIEFyZSB0aGVzZSBkb2luZyB0aGUgc2FtZSBhcyBIRUFQX3N0cmR1cEF0b1cgYW5kIEhFQVBfc3RyZHVwV3RvQT8KICAqICAgSWYgc28sIGNhbiB3ZSByZW1vdmUgdGhlbT8KKyAqIEFOU1dFUgorICogICBObywgdGhlIG1lbW9yeSBoYW5kbGluZyBmdW5jdGlvbnMgYXJlIGNhbGxlZCB2ZXJ5IG9mdGVuIGluIGhlcmUsIAorICogICBqdXN0IHJlcGxhY2luZyB0aGVtIGJ5IEhlYXBBbGxvYyhTeXN0ZW1IZWFwLC4uLikgbWFrZXMgcmVnaXN0cnkKKyAqICAgbG9hZGluZyAxMDAgdGltZXMgc2xvd2VyLiAtTU0KICAqLwogc3RhdGljIExQV1NUUiBzdHJkdXBBMlcoTFBDU1RSIHNyYykKIHsKQEAgLTIxNCw1OSArMjEzLDEwMSBAQAogfQogCiAKLS8qIGRlYnVnIGZ1bmN0aW9uLCBjb252ZXJ0cyBhIHVuaWNvZGUgaW50byBhIHN0YXRpYyBtZW1vcnkgYXJlYSAKLSAqIChzdWIgZm9yIHVzaW5nIHR3byBzdGF0aWMgc3RyaW5ncywgaW4gY2FzZSB3ZSBuZWVkIHRoZW0gaW4gYSBzaW5nbGUgY2FsbCkKLSAqCi0gKiBGSVhNRQotICogICAgVGhpcyBzZWVtcyB0byBiZSB1c2VkIHRoZSBzYW1lIGFzIGRlYnVnc3RyX3cuCi0gKiAgICBJZiBzbywgY2FuIHRoaXMgb25lIGdvIGF3YXk/Ci0gKi8KLUxQU1RSCi1XMkMoTFBDV1NUUiB4LGludCBzdWIpIHsKLQlzdGF0aWMJTFBTVFIJdW5pY29kZWRlYnVnWzJdPXtOVUxMLE5VTEx9OwotCWlmICh4PT1OVUxMKQotCQlyZXR1cm4gIjxOVUxMPiI7Ci0JaWYgKHN1YiE9MCAmJiBzdWIhPTEpCi0JCXJldHVybiAiPFcyQzpiYWQgc3ViPiI7Ci0JaWYgKHVuaWNvZGVkZWJ1Z1tzdWJdKSBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgdW5pY29kZWRlYnVnW3N1Yl0gKTsKLQl1bmljb2RlZGVidWdbc3ViXSA9IEhFQVBfc3RyZHVwV3RvQSggU3lzdGVtSGVhcCwgMCwgeCApOwotCXJldHVybiB1bmljb2RlZGVidWdbc3ViXTsKLX0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBsb29rdXBfaGtleSBbSW50ZXJuYWxdCisgKiAKKyAqIEp1c3QgYXMgdGhlIG5hbWUgc2F5cy4gQ3JlYXRlcyB0aGUgcm9vdCBrZXlzIG9uIGRlbWFuZCwgc28gd2UgY2FuIGNhbGwgdGhlCisgKiBSZWcqIGZ1bmN0aW9ucyBhdCBhbnkgdGltZS4KICAqCiAgKiBSRVRVUk5TCiAgKiAgICBTdWNjZXNzOiBQb2ludGVyIHRvIGtleSBzdHJ1Y3R1cmUKICAqICAgIEZhaWx1cmU6IE5VTEwKICAqLworI2RlZmluZSBBRERfUk9PVF9LRVkoeHgpIFwKKwl4eCA9IChMUEtFWVNUUlVDVCl4bWFsbG9jKHNpemVvZihLRVlTVFJVQ1QpKTtcCisJbWVtc2V0KHh4LCdcMCcsc2l6ZW9mKEtFWVNUUlVDVCkpO1wKKwl4eC0+a2V5bmFtZT0gc3RyZHVwQTJXKCI8c2hvdWxkX25vdF9hcHBlYXJfYW55d2hlcmU+Iik7CisKIHN0YXRpYyBMUEtFWVNUUlVDVCBsb29rdXBfaGtleSggSEtFWSBoa2V5ICkKIHsKIAlzd2l0Y2ggKGhrZXkpIHsKLSAgICAvKiBUaGVzZSBzZWVtIGVycm9uZW91cyAqLwotICAgIC8qCWNhc2UgMHgwMDAwMDAwMDogKi8KLSAgICAvKgljYXNlIDB4MDAwMDAwMDE6ICovCi0JY2FzZSBIS0VZX0NMQVNTRVNfUk9PVDoKKwkvKiAwIGFuZCAxIGFyZSB2YWxpZCByb290a2V5cyBpbiB3aW4xNiBzaGVsbC5kbGwgYW5kIGFyZSB1c2VkIGJ5CisJICogc29tZSBwcm9ncmFtcy4gRG8gbm90IHJlbW92ZSB0aG9zZSBjYXNlcy4gLU1NCisJICovCisgICAgCWNhc2UgMHgwMDAwMDAwMDoKKwljYXNlIDB4MDAwMDAwMDE6CisJY2FzZSBIS0VZX0NMQVNTRVNfUk9PVDogeworCQlpZiAoIWtleV9jbGFzc2VzX3Jvb3QpIHsKKwkJCUhLRVkJY2xfcl9oa2V5OworCisJCQkvKiBjYWxscyBsb29rdXBfaGtleSByZWN1cnNpdmVseSwgVFdJQ0UgKi8KKwkJCWlmIChSZWdDcmVhdGVLZXkxNihIS0VZX0xPQ0FMX01BQ0hJTkUsIlNPRlRXQVJFXFxDbGFzc2VzIiwmY2xfcl9oa2V5KSE9RVJST1JfU1VDQ0VTUykgeworCQkJCUVSUihyZWcsIkNvdWxkIG5vdCBjcmVhdGUgSEtMTVxcU09GVFdBUkVcXENsYXNzZXMuIFRoaXMgaXMgaW1wb3NzaWJsZS5cbiIpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlrZXlfY2xhc3Nlc19yb290ID0gbG9va3VwX2hrZXkoY2xfcl9oa2V5KTsKKwkJfQogCQlyZXR1cm4ga2V5X2NsYXNzZXNfcm9vdDsKKwl9CiAJY2FzZSBIS0VZX0NVUlJFTlRfVVNFUjoKKwkJaWYgKCFrZXlfY3VycmVudF91c2VyKSB7CisJCQlIS0VZCWNfdV9oa2V5OworCQkJc3RydWN0CXBhc3N3ZAkqcHdkOworCisJCQlwd2Q9Z2V0cHd1aWQoZ2V0dWlkKCkpOworCQkJLyogY2FsbHMgbG9va3VwX2hrZXkgcmVjdXJzaXZlbHksIFRXSUNFICovCisJCQlpZiAocHdkICYmIHB3ZC0+cHdfbmFtZSkgeworCQkJCWlmIChSZWdDcmVhdGVLZXkxNihIS0VZX1VTRVJTLHB3ZC0+cHdfbmFtZSwmY191X2hrZXkpIT1FUlJPUl9TVUNDRVNTKSB7CisJCQkJCUVSUihyZWcsIkNvdWxkIG5vdCBjcmVhdGUgSFVcXCVzLiBUaGlzIGlzIGltcG9zc2libGUuXG4iLHB3ZC0+cHdfbmFtZSk7CisJCQkJCWV4aXQoMSk7CisJCQkJfQorCQkJCWtleV9jdXJyZW50X3VzZXIgPSBsb29rdXBfaGtleShjX3VfaGtleSk7CisJCQl9IGVsc2UgeworCQkJCS8qIG5vdGhpbmcgZm91bmQsIHVzZSBzdGFuZGFsb25lICovCisJCQkJQUREX1JPT1RfS0VZKGtleV9jdXJyZW50X3VzZXIpOworCQkJfQorCQl9CiAJCXJldHVybiBrZXlfY3VycmVudF91c2VyOwogCWNhc2UgSEtFWV9MT0NBTF9NQUNISU5FOgorCQlpZiAoIWtleV9sb2NhbF9tYWNoaW5lKSB7CisJCQlBRERfUk9PVF9LRVkoa2V5X2xvY2FsX21hY2hpbmUpOworCQkJUkVHSVNUUllfSW5pdCgpOworCQl9CiAJCXJldHVybiBrZXlfbG9jYWxfbWFjaGluZTsKIAljYXNlIEhLRVlfVVNFUlM6CisJCWlmICgha2V5X3VzZXJzKSB7CisJCQlBRERfUk9PVF9LRVkoa2V5X3VzZXJzKTsKKwkJfQogCQlyZXR1cm4ga2V5X3VzZXJzOwogCWNhc2UgSEtFWV9QRVJGT1JNQU5DRV9EQVRBOgorCQlpZiAoIWtleV9wZXJmb3JtYW5jZV9kYXRhKSB7CisJCQlBRERfUk9PVF9LRVkoa2V5X3BlcmZvcm1hbmNlX2RhdGEpOworCQl9CiAJCXJldHVybiBrZXlfcGVyZm9ybWFuY2VfZGF0YTsKIAljYXNlIEhLRVlfRFlOX0RBVEE6CisJCWlmICgha2V5X2R5bl9kYXRhKSB7CisJCQlBRERfUk9PVF9LRVkoa2V5X2R5bl9kYXRhKTsKKwkJfQogCQlyZXR1cm4ga2V5X2R5bl9kYXRhOwogCWNhc2UgSEtFWV9DVVJSRU5UX0NPTkZJRzoKKwkJaWYgKCFrZXlfY3VycmVudF9jb25maWcpIHsKKwkJCUFERF9ST09UX0tFWShrZXlfY3VycmVudF9jb25maWcpOworCQl9CiAJCXJldHVybiBrZXlfY3VycmVudF9jb25maWc7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIGdldF9oYW5kbGUoaGtleSk7CiAJfQogCS8qTk9UUkVBQ0hFRCovCiB9Ci0KKyN1bmRlZiBBRERfUk9PVF9LRVkKKy8qIHNvIHdlIGRvbid0IGFjY2lkZW50bHkgYWNjZXNzIHRoZW0gLi4uICovCisjZGVmaW5lIGtleV9jdXJyZW50X2NvbmZpZyBOVUxMIE5VTEwKKyNkZWZpbmUga2V5X2N1cnJlbnRfdXNlciBOVUxMIE5VTEwKKyNkZWZpbmUga2V5X3VzZXJzIE5VTEwgTlVMTAorI2RlZmluZSBrZXlfbG9jYWxfbWFjaGluZSBOVUxMIE5VTEwKKyNkZWZpbmUga2V5X2NsYXNzZXNfcm9vdCBOVUxMIE5VTEwKKyNkZWZpbmUga2V5X2R5bl9kYXRhIE5VTEwgTlVMTAorI2RlZmluZSBrZXlfcGVyZm9ybWFuY2VfZGF0YSBOVUxMIE5VTEwKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogc3BsaXRfa2V5cGF0aCBbSW50ZXJuYWxdCkBAIC0zMjIsNjIgKzM2MywxNCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNIRUxMX0luaXQgW0ludGVybmFsXQotICogU2hlbGwgaW5pdGlhbGlzYXRpb24sIGFsbG9jYXRlcyBrZXlzLiAKKyAqIFJFR0lTVFJZX0luaXQgW0ludGVybmFsXQorICogUmVnaXN0cnkgaW5pdGlhbGlzYXRpb24sIGFsbG9jYXRlcyBzb21lIGRlZmF1bHQga2V5cy4gCiAgKi8KLXZvaWQgU0hFTExfSW5pdCgpIHsKLQlzdHJ1Y3QJcGFzc3dkCSpwd2Q7Ci0KLQlIS0VZCWNsX3JfaGtleSxjX3VfaGtleTsKLSNkZWZpbmUgQUREX1JPT1RfS0VZKHh4KSBcCi0JeHggPSAoTFBLRVlTVFJVQ1QpeG1hbGxvYyhzaXplb2YoS0VZU1RSVUNUKSk7XAotCW1lbXNldCh4eCwnXDAnLHNpemVvZihLRVlTVFJVQ1QpKTtcCi0JeHgtPmtleW5hbWU9IHN0cmR1cEEyVygiPHNob3VsZF9ub3RfYXBwZWFyX2FueXdoZXJlPiIpOwotCi0JQUREX1JPT1RfS0VZKGtleV9sb2NhbF9tYWNoaW5lKTsKLQlpZiAoUmVnQ3JlYXRlS2V5MTYoSEtFWV9MT0NBTF9NQUNISU5FLCJTT0ZUV0FSRVxcQ2xhc3NlcyIsJmNsX3JfaGtleSkhPUVSUk9SX1NVQ0NFU1MpIHsKLQkJRVJSKHJlZywiQ291bGQgbm90IGNyZWF0ZSBIS0xNXFxTT0ZUV0FSRVxcQ2xhc3Nlcy4gVGhpcyBpcyBpbXBvc3NpYmxlLlxuIik7Ci0JCWV4aXQoMSk7Ci0JfQotCWtleV9jbGFzc2VzX3Jvb3QgPSBsb29rdXBfaGtleShjbF9yX2hrZXkpOwotCi0JQUREX1JPT1RfS0VZKGtleV91c2Vycyk7Ci0KLSNpZiAwCi0JLyogRklYTUU6IGxvYWQgYWxsIHVzZXJzIGFuZCB0aGVpciByZXNwLiBwd2QtPnB3X2Rpci8ud2luZS91c2VyLnJlZyAKLQkgKgkgIChsYXRlciwgd2hlbiBhIHdpbjMyIHJlZ2lzdHJ5IGVkaXRpbmcgdG9vbCBiZWNvbWVzIGF2YWlsLikKLQkgKi8KLQl3aGlsZSAocHdkPWdldHB3ZW50KCkpIHsKLQkJaWYgKHB3ZC0+cHdfbmFtZSA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCVJlZ0NyZWF0ZUtleTE2KEhLRVlfVVNFUlMscHdkLT5wd19uYW1lLCZjX3VfaGtleSk7Ci0JCVJlZ0Nsb3NlS2V5KGNfdV9oa2V5KTsKLQl9Ci0jZW5kaWYKLQlwd2Q9Z2V0cHd1aWQoZ2V0dWlkKCkpOwotCWlmIChwd2QgJiYgcHdkLT5wd19uYW1lKSB7Ci0JCVJlZ0NyZWF0ZUtleTE2KEhLRVlfVVNFUlMscHdkLT5wd19uYW1lLCZjX3VfaGtleSk7Ci0JCWtleV9jdXJyZW50X3VzZXIgPSBsb29rdXBfaGtleShjX3VfaGtleSk7Ci0JfSBlbHNlIHsKLQkJQUREX1JPT1RfS0VZKGtleV9jdXJyZW50X3VzZXIpOwotCX0KLQlBRERfUk9PVF9LRVkoa2V5X3BlcmZvcm1hbmNlX2RhdGEpOwotCUFERF9ST09UX0tFWShrZXlfY3VycmVudF9jb25maWcpOwotCUFERF9ST09UX0tFWShrZXlfZHluX2RhdGEpOwotI3VuZGVmIEFERF9ST09UX0tFWQotCVNIRUxMX1N0YXJ0dXBSZWdpc3RyeSgpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNIRUxMX1N0YXJ0dXBSZWdpc3RyeSBbSW50ZXJuYWxdCi0gKi8KLXZvaWQgU0hFTExfU3RhcnR1cFJlZ2lzdHJ5KCB2b2lkICkKLXsKK3N0YXRpYyB2b2lkIFJFR0lTVFJZX0luaXQoKSB7CiAJSEtFWQloa2V5OwogCWNoYXIJYnVmWzIwMF07CiAKLSAgICBUUkFDRShyZWcsIih2b2lkKVxuIik7CisJVFJBQ0UocmVnLCIodm9pZClcbiIpOwogCiAJUmVnQ3JlYXRlS2V5MTYoSEtFWV9EWU5fREFUQSwiUGVyZlN0YXRzXFxTdGF0RGF0YSIsJmhrZXkpOwogCVJlZ0Nsb3NlS2V5KGhrZXkpOwpAQCAtNTk5LDcgKzU5Miw3IEBACiAJCXN0cmNhdChmbiwiLyJTQVZFX0NVUlJFTlRfVVNFUik7CiAJCXRtcCA9IChjaGFyKil4bWFsbG9jKHN0cmxlbihmbikrc3RybGVuKCIudG1wIikrMSk7CiAJCXN0cmNweSh0bXAsZm4pO3N0cmNhdCh0bXAsIi50bXAiKTsKLQkJaWYgKF9zYXZlcmVnKGtleV9jdXJyZW50X3VzZXIsdG1wLGFsbCkpIHsKKwkJaWYgKF9zYXZlcmVnKGxvb2t1cF9oa2V5KEhLRVlfQ1VSUkVOVF9VU0VSKSx0bXAsYWxsKSkgewogCQkJaWYgKC0xPT1yZW5hbWUodG1wLGZuKSkgewogCQkJCXBlcnJvcigicmVuYW1lIHRtcCByZWdpc3RyeSIpOwogCQkJCXVubGluayh0bXApOwpAQCAtNjEyLDcgKzYwNSw3IEBACiAJCXN0cmNhdChmbixXSU5FX1BSRUZJWCIvIlNBVkVfTE9DQUxfTUFDSElORSk7CiAJCXRtcCA9IChjaGFyKil4bWFsbG9jKHN0cmxlbihmbikrc3RybGVuKCIudG1wIikrMSk7CiAJCXN0cmNweSh0bXAsZm4pO3N0cmNhdCh0bXAsIi50bXAiKTsKLQkJaWYgKF9zYXZlcmVnKGtleV9sb2NhbF9tYWNoaW5lLHRtcCxhbGwpKSB7CisJCWlmIChfc2F2ZXJlZyhsb29rdXBfaGtleShIS0VZX0xPQ0FMX01BQ0hJTkUpLHRtcCxhbGwpKSB7CiAJCQlpZiAoLTE9PXJlbmFtZSh0bXAsZm4pKSB7CiAJCQkJcGVycm9yKCJyZW5hbWUgdG1wIHJlZ2lzdHJ5Iik7CiAJCQkJdW5saW5rKHRtcCk7CkBAIC0xNTA4LDEwICsxNTAxLDkgQEAKIAlPRlNUUlVDVAkJb2ZzOwogCUJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGhmaW5mbzsKIAl0aW1lX3QJCQlsYXN0bW9kaWZpZWQ7Ci0JSEtFWQkJCWhrZXk7CiAJTFBLRVlTVFJVQ1QJCWxwa2V5OwogCi0gICAgVFJBQ0UocmVnLCIodm9pZClcbiIpOworCVRSQUNFKHJlZywiKHZvaWQpXG4iKTsKIAogCWhmID0gT3BlbkZpbGUzMigicmVnLmRhdCIsJm9mcyxPRl9SRUFEKTsKIAlpZiAoaGY9PUhGSUxFX0VSUk9SMzIpCkBAIC0xNTY0LDEwICsxNTU2LDcgQEAKIAkJcmV0dXJuOwogCX0KIAlsYXN0bW9kaWZpZWQgPSBET1NGU19GaWxlVGltZVRvVW5peFRpbWUoJmhmaW5mby5mdExhc3RXcml0ZVRpbWUsTlVMTCk7Ci0KLQlpZiAoUmVnQ3JlYXRlS2V5MTYoSEtFWV9MT0NBTF9NQUNISU5FLCJTT0ZUV0FSRVxcQ2xhc3NlcyIsJmhrZXkpIT1FUlJPUl9TVUNDRVNTKQotCQlyZXR1cm47Ci0JbHBrZXkgPSBsb29rdXBfaGtleShoa2V5KTsKKwlscGtleSA9IGxvb2t1cF9oa2V5KEhLRVlfQ0xBU1NFU19ST09UKTsKIAlfX3czMV9kdW1wdHJlZSh0YWJbMF0udzEsdHh0LHRhYiwmaGVhZCxscGtleSxsYXN0bW9kaWZpZWQsMCk7CiAJZnJlZSh0YWIpOwogCWZyZWUodHh0KTsKQEAgLTE1ODYsMTcgKzE1NzUsMTQgQEAKIAlMUEtFWVNUUlVDVAlscGtleTsKIAlIS0VZCQloa2V5OwogCi0gICAgVFJBQ0UocmVnLCIodm9pZClcbiIpOwotCi0JaWYgKGtleV9jbGFzc2VzX3Jvb3Q9PU5VTEwpCi0JCVNIRUxMX0luaXQoKTsKKwlUUkFDRShyZWcsIih2b2lkKVxuIik7CiAKIAkvKiBMb2FkIHdpbmRvd3MgMy4xIGVudHJpZXMgKi8KIAlfdzMxX2xvYWRyZWcoKTsKIAkvKiBMb2FkIHdpbmRvd3MgOTUgZW50cmllcyAqLwotCV93OTVfbG9hZHJlZygiQzpcXHN5c3RlbS4xc3QiLAlrZXlfbG9jYWxfbWFjaGluZSk7Ci0JX3c5NV9sb2FkcmVnKCJzeXN0ZW0uZGF0IiwJa2V5X2xvY2FsX21hY2hpbmUpOwotCV93OTVfbG9hZHJlZygidXNlci5kYXQiLAlrZXlfdXNlcnMpOworCV93OTVfbG9hZHJlZygiQzpcXHN5c3RlbS4xc3QiLAlsb29rdXBfaGtleShIS0VZX0xPQ0FMX01BQ0hJTkUpKTsKKwlfdzk1X2xvYWRyZWcoInN5c3RlbS5kYXQiLAlsb29rdXBfaGtleShIS0VZX0xPQ0FMX01BQ0hJTkUpKTsKKwlfdzk1X2xvYWRyZWcoInVzZXIuZGF0IiwJbG9va3VwX2hrZXkoSEtFWV9VU0VSUykpOwogCiAJLyogdGhlIGdsb2JhbCB1c2VyIGRlZmF1bHQgaXMgbG9hZGVkIHVuZGVyIEhLRVlfVVNFUlNcXC5EZWZhdWx0ICovCiAJUmVnQ3JlYXRlS2V5MTYoSEtFWV9VU0VSUywiLkRlZmF1bHQiLCZoa2V5KTsKQEAgLTE2MDYsMTEgKzE1OTIsMTEgQEAKIAlfd2luZV9sb2FkcmVnKGxwa2V5LFNBVkVfVVNFUlNfREVGQVVMVCwwKTsKIAogCS8qIEhLRVlfVVNFUlNcXC5EZWZhdWx0IGlzIGNvcGllZCB0byBIS0VZX0NVUlJFTlRfVVNFUiAqLwotCV9jb3B5X3JlZ2lzdHJ5KGxwa2V5LGtleV9jdXJyZW50X3VzZXIpOworCV9jb3B5X3JlZ2lzdHJ5KGxwa2V5LGxvb2t1cF9oa2V5KEhLRVlfQ1VSUkVOVF9VU0VSKSk7CiAJUmVnQ2xvc2VLZXkoaGtleSk7CiAKIAkvKiB0aGUgZ2xvYmFsIG1hY2hpbmUgZGVmYXVsdHMgKi8KLQlfd2luZV9sb2FkcmVnKGtleV9sb2NhbF9tYWNoaW5lLFNBVkVfTE9DQUxfTUFDSElORV9ERUZBVUxULDApOworCV93aW5lX2xvYWRyZWcobG9va3VwX2hrZXkoSEtFWV9MT0NBTF9NQUNISU5FKSxTQVZFX0xPQ0FMX01BQ0hJTkVfREVGQVVMVCwwKTsKIAogCS8qIGxvYWQgdGhlIHVzZXIgc2F2ZWQgcmVnaXN0cmllcyAqLwogCkBAIC0xNjIxLDEyICsxNjA3LDEyIEBACiAJCWZuPShjaGFyKil4bWFsbG9jKHN0cmxlbihwd2QtPnB3X2Rpcikrc3RybGVuKFdJTkVfUFJFRklYKStzdHJsZW4oU0FWRV9DVVJSRU5UX1VTRVIpKzIpOwogCQlzdHJjcHkoZm4scHdkLT5wd19kaXIpOwogCQlzdHJjYXQoZm4sV0lORV9QUkVGSVgiLyJTQVZFX0NVUlJFTlRfVVNFUik7Ci0JCV93aW5lX2xvYWRyZWcoa2V5X2N1cnJlbnRfdXNlcixmbixSRUdfT1BUSU9OX1RBSU5URUQpOworCQlfd2luZV9sb2FkcmVnKGxvb2t1cF9oa2V5KEhLRVlfQ1VSUkVOVF9VU0VSKSxmbixSRUdfT1BUSU9OX1RBSU5URUQpOwogCQlmcmVlKGZuKTsKIAkJZm49KGNoYXIqKXhtYWxsb2Moc3RybGVuKHB3ZC0+cHdfZGlyKStzdHJsZW4oV0lORV9QUkVGSVgpK3N0cmxlbihTQVZFX0xPQ0FMX01BQ0hJTkUpKzIpOwogCQlzdHJjcHkoZm4scHdkLT5wd19kaXIpOwogCQlzdHJjYXQoZm4sV0lORV9QUkVGSVgiLyJTQVZFX0xPQ0FMX01BQ0hJTkUpOwotCQlfd2luZV9sb2FkcmVnKGtleV9sb2NhbF9tYWNoaW5lLGZuLFJFR19PUFRJT05fVEFJTlRFRCk7CisJCV93aW5lX2xvYWRyZWcobG9va3VwX2hrZXkoSEtFWV9MT0NBTF9NQUNISU5FKSxmbixSRUdfT1BUSU9OX1RBSU5URUQpOwogCQlmcmVlKGZuKTsKIAl9IGVsc2UKIAkJV0FSTihyZWcsIkZhaWxlZCB0byBnZXQgaG9tZWRpcmVjdG9yeSBvZiBVSUQgJWQuXG4iLGdldHVpZCgpKTsKQEAgLTE4MjgsMTEgKzE4MTQsNiBAQAogICAgIGlmICghbHBOZXh0S2V5KQogICAgICAgICByZXR1cm4gRVJST1JfQkFES0VZOwogCi0gICAgaWYgKGxwc3pTdWJLZXlbMF0gPT0gJ1xcJykgewotICAgICAgICBXQVJOKHJlZywiU3Via2V5ICVzIG11c3Qgbm90IGJlZ2luIHdpdGggYmFja3NsYXNoLlxuIixkZWJ1Z3N0cl93KGxwc3pTdWJLZXkpKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0JBRF9QQVRITkFNRTsKLSAgICB9Ci0KIAlpZiAoIWxwc3pTdWJLZXkgfHwgISpscHN6U3ViS2V5KSB7CiAJCWFkZF9oYW5kbGUoKytjdXJyZW50aGFuZGxlLGxwTmV4dEtleSxzYW1EZXNpcmVkKTsKIAkJKnJldGtleT1jdXJyZW50aGFuZGxlOwpAQCAtMTg0MSw2ICsxODIyLDExIEBACiAJCXJldHVybiBFUlJPUl9TVUNDRVNTOwogCX0KIAorICAgIGlmIChscHN6U3ViS2V5WzBdID09ICdcXCcpIHsKKyAgICAgICAgV0FSTihyZWcsIlN1YmtleSAlcyBtdXN0IG5vdCBiZWdpbiB3aXRoIGJhY2tzbGFzaC5cbiIsZGVidWdzdHJfdyhscHN6U3ViS2V5KSk7CisgICAgICAgIHJldHVybiBFUlJPUl9CQURfUEFUSE5BTUU7CisgICAgfQorCiAJc3BsaXRfa2V5cGF0aChscHN6U3ViS2V5LCZ3cHMsJndwYyk7CiAJaSAJPSAwOwogCXdoaWxlICgoaTx3cGMpICYmICh3cHNbaV1bMF09PSdcMCcpKSBpKys7CkBAIC0yMzg4LDcgKzIzNzQsNyBAQAogICAgICAgICAgICAgVFJBQ0UocmVnLCIgRGF0YShiaW5hcnkpXG4iKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFR19EV09SRDoKLSAgICAgICAgICAgIFRSQUNFKHJlZywiIERhdGEoZHdvcmQpPSVseFxuIiwgKERXT1JEKSpscGJEYXRhKTsKKyAgICAgICAgICAgIFRSQUNFKHJlZywiIERhdGEoZHdvcmQpPSVseFxuIiwgKERXT1JEKWxwYkRhdGEpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBUUkFDRShyZWcsIlVua25vd24gdHlwZTogJWxkXG4iLCBkd1R5cGUpOwpAQCAtMjUwMCw3ICsyNDg2LDcgQEAKIAlEV09SRAlyZXQ7CiAKIAlUUkFDRShyZWcsIigleCwlcywlbGQsJXMsJWxkKVxuIiwKLQkJaGtleSxXMkMobHBzelN1YktleSwwKSxkd1R5cGUsVzJDKGxwc3pEYXRhLDApLGNiRGF0YQorCQloa2V5LGRlYnVnc3RyX3cobHBzelN1YktleSksZHdUeXBlLGRlYnVnc3RyX3cobHBzekRhdGEpLGNiRGF0YQogCSk7CiAJaWYgKGxwc3pTdWJLZXkgJiYgKmxwc3pTdWJLZXkpIHsKIAkJcmV0PVJlZ0NyZWF0ZUtleTMyVyhoa2V5LGxwc3pTdWJLZXksJnhoa2V5KTsKQEAgLTI1MTQsNyArMjUwMCw3IEBACiAJfQogCWlmIChjYkRhdGEhPTIqbHN0cmxlbjMyVyhscHN6RGF0YSkrMikgewogCQlUUkFDRShyZWcsIlJlZ1NldFZhbHVlWCBjYWxsZWQgd2l0aCBsZW49JWxkICE9IHN0cmxlbiglcykrMT0lZCFcbiIsCi0JCQljYkRhdGEsVzJDKGxwc3pEYXRhLDApLDIqbHN0cmxlbjMyVyhscHN6RGF0YSkrMgorCQkJY2JEYXRhLGRlYnVnc3RyX3cobHBzekRhdGEpLDIqbHN0cmxlbjMyVyhscHN6RGF0YSkrMgogCQkpOwogCQljYkRhdGE9Mipsc3RybGVuMzJXKGxwc3pEYXRhKSsyOwogCX0KQEAgLTI5MTMsNyArMjg5OSw3IEBACiAJCWxweGtleT1scE5leHRLZXktPm5leHRzdWI7CiAJCXdoaWxlIChscHhrZXkpIHsKIAkJCVRSQUNFKHJlZywgIiAgU2Nhbm5pbmcgWyVzXVxuIiwKLQkJCQkgICAgIFcyQyAobHB4a2V5LT5rZXluYW1lLCAwKSk7CisJCQkJICAgICBkZWJ1Z3N0cl93KGxweGtleS0+a2V5bmFtZSkpOwogCQkJaWYgKCFsc3RyY21waTMyVyh3cHNbaV0sbHB4a2V5LT5rZXluYW1lKSkKIAkJCQlicmVhazsKIAkJCWxweGtleT1scHhrZXktPm5leHQ7CkBAIC0yOTMxLDcgKzI5MTcsNyBAQAogCWxwbHBQcmV2S2V5ID0gJihscE5leHRLZXktPm5leHRzdWIpOwogCXdoaWxlIChscHhrZXkpIHsKIAkJVFJBQ0UocmVnLCAiICBTY2FubmluZyBbJXNdXG4iLAotCQkJICAgICBXMkMgKGxweGtleS0+a2V5bmFtZSwgMCkpOworCQkJICAgICBkZWJ1Z3N0cl93KGxweGtleS0+a2V5bmFtZSkpOwogCQlpZiAoIWxzdHJjbXBpMzJXKHdwc1tpXSxscHhrZXktPmtleW5hbWUpKQogCQkJYnJlYWs7CiAJCWxwbHBQcmV2S2V5CT0gJihscHhrZXktPm5leHQpOwpAQCAtMzMxMiwzICszMjk4LDExNSBAQAogICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOwogfQogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlZ1VuTG9hZEtleTMyVyBbQURWQVBJMzIuMTczXQorICovCitMT05HIFdJTkFQSSBSZWdVbkxvYWRLZXkzMlcoIEhLRVkgaGtleSwgTFBDV1NUUiBscFN1YktleSApCit7CisgICAgRklYTUUocmVnLCIoJXgsJXMpOiBzdHViXG4iLGhrZXksIGRlYnVnc3RyX3cobHBTdWJLZXkpKTsKKyAgICByZXR1cm4gRVJST1JfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdVbkxvYWRLZXkzMkEgW0FEVkFQSTMyLjE3Ml0KKyAqLworTE9ORyBXSU5BUEkgUmVnVW5Mb2FkS2V5MzJBKCBIS0VZIGhrZXksIExQQ1NUUiBscFN1YktleSApCit7CisgICAgTE9ORyByZXQ7CisgICAgTFBXU1RSIGxwU3ViS2V5VyA9IEhFQVBfc3RyZHVwQXRvVyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBTdWJLZXkgKTsKKyAgICByZXQgPSBSZWdVbkxvYWRLZXkzMlcoIGhrZXksIGxwU3ViS2V5VyApOworICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscFN1YktleVcgKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlZ1NldEtleVNlY3VyaXR5IFtBRFZBUEkzMi4xNjddCisgKi8KK0xPTkcgV0lOQVBJIFJlZ1NldEtleVNlY3VyaXR5KCBIS0VZIGhrZXksIFNFQ1VSSVRZX0lORk9STUFUSU9OIFNlY3VyaXR5SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0RFU0NSSVBUT1IgcFNlY3VyaXR5RGVzYyApCit7CisgICAgRklYTUUocmVnLCAiJXgsJWxkLCVwKTogc3R1YlxuIiwgaGtleSwgU2VjdXJpdHlJbmZvLCBwU2VjdXJpdHlEZXNjKTsKKyAgICByZXR1cm4gRVJST1JfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdTYXZlS2V5MzJXIFtBRFZBUEkzMi4xNjZdCisgKi8KK0xPTkcgV0lOQVBJIFJlZ1NhdmVLZXkzMlcoIEhLRVkgaGtleSwgTFBDV1NUUiBscEZpbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTRUNVUklUWV9BVFRSSUJVVEVTIHNhICkKK3sKKyAgICBGSVhNRShyZWcsICIleCwlcywlcCk6IHN0dWJcbiIsIGhrZXksIGRlYnVnc3RyX3cobHBGaWxlKSwgc2EpOworICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlZ1NhdmVLZXkzMkEgW0FEVkFQSTMyLjE2NV0KKyAqLworTE9ORyBXSU5BUEkgUmVnU2F2ZUtleTMyQSggSEtFWSBoa2V5LCBMUENTVFIgbHBGaWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBzYSApCit7CisgICAgTE9ORyByZXQ7CisgICAgTFBXU1RSIGxwRmlsZVcgPSBIRUFQX3N0cmR1cEF0b1coR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBGaWxlKTsKKyAgICByZXQgPSBSZWdTYXZlS2V5MzJXKCBoa2V5LCBscEZpbGVXLCBzYSApOworICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscEZpbGVXICk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdSZXN0b3JlS2V5MzJXIFtBRFZBUEkzMi4xNjRdCisgKi8KK0xPTkcgV0lOQVBJIFJlZ1Jlc3RvcmVLZXkzMlcoIEhLRVkgaGtleSwgTFBDV1NUUiBscEZpbGUsIERXT1JEIGR3RmxhZ3MgKQoreworICAgIEZJWE1FKHJlZywgIiV4LCVzLCVsZCk6IHN0dWJcbiIsIGhrZXksIGRlYnVnc3RyX3cobHBGaWxlKSwgZHdGbGFncyk7CisgICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnUmVzdG9yZUtleTMyQSBbQURWQVBJMzIuMTYzXQorICovCitMT05HIFdJTkFQSSBSZWdSZXN0b3JlS2V5MzJBKCBIS0VZIGhrZXksIExQQ1NUUiBscEZpbGUsIERXT1JEIGR3RmxhZ3MgKQoreworICAgIExPTkcgcmV0OworICAgIExQV1NUUiBscEZpbGVXID0gSEVBUF9zdHJkdXBBdG9XKEdldFByb2Nlc3NIZWFwKCksIDAsIGxwRmlsZSk7CisgICAgcmV0ID0gUmVnUmVzdG9yZUtleTMyVyggaGtleSwgbHBGaWxlVywgZHdGbGFncyApOworICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscEZpbGVXICk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWdSZXBsYWNlS2V5MzJXIFtBRFZBUEkzMi4xNjJdCisgKi8KK0xPTkcgV0lOQVBJIFJlZ1JlcGxhY2VLZXkzMlcoIEhLRVkgaGtleSwgTFBDV1NUUiBscFN1YktleSwgTFBDV1NUUiBscE5ld0ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIGxwT2xkRmlsZSApCit7CisgICAgRklYTUUocmVnLCAiJXgsJXMsJXMsJXMpOiBzdHViXG4iLCBoa2V5LCBkZWJ1Z3N0cl93KGxwU3ViS2V5KSwgCisgICAgICAgICAgZGVidWdzdHJfdyhscE5ld0ZpbGUpLGRlYnVnc3RyX3cobHBPbGRGaWxlKSk7CisgICAgcmV0dXJuIEVSUk9SX1NVQ0NFU1M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmVnUmVwbGFjZUtleTMyQSBbQURWQVBJMzIuMTYxXQorICovCitMT05HIFdJTkFQSSBSZWdSZXBsYWNlS2V5MzJBKCBIS0VZIGhrZXksIExQQ1NUUiBscFN1YktleSwgTFBDU1RSIGxwTmV3RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscE9sZEZpbGUgKQoreworICAgIExPTkcgcmV0OworICAgIExQV1NUUiBscFN1YktleVcgPSBIRUFQX3N0cmR1cEF0b1coR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBTdWJLZXkpOworICAgIExQV1NUUiBscE5ld0ZpbGVXID0gSEVBUF9zdHJkdXBBdG9XKEdldFByb2Nlc3NIZWFwKCksIDAsIGxwTmV3RmlsZSk7CisgICAgTFBXU1RSIGxwT2xkRmlsZVcgPSBIRUFQX3N0cmR1cEF0b1coR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBPbGRGaWxlKTsKKyAgICByZXQgPSBSZWdSZXBsYWNlS2V5MzJXKCBoa2V5LCBscFN1YktleVcsIGxwTmV3RmlsZVcsIGxwT2xkRmlsZVcgKTsKKyAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBPbGRGaWxlVyApOworICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscE5ld0ZpbGVXICk7CisgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxwU3ViS2V5VyApOworICAgIHJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL21pc2Mvc2hlbGwuYyBiL21pc2Mvc2hlbGwuYwppbmRleCAwNTIwZDY5Li40YWMwZDdjIDEwMDY0NAotLS0gYS9taXNjL3NoZWxsLmMKKysrIGIvbWlzYy9zaGVsbC5jCkBAIC0zLDcgKzMsNiBAQAogICovCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgpAQCAtNDUsNiArNDQsNyBAQAogICAgICJOaWVscyBkZSBDYXJwZW50aWVyIiwKICAgICAiR29yZG9uIENoYWZmZWUiLAogICAgICJKaW1lbiBDaGluZyIsCisgICAgIlBhc2NhbCBDdW9xIiwKICAgICAiRGF2aWQgQS4gQ3V0aGJlcnQiLAogICAgICJIdXcgRC4gTS4gRGF2aWVzIiwKICAgICAiUm9tYW4gRG9sZWpzaSIsCkBAIC01Niw2ICs1Niw3IEBACiAgICAgIkNsYXVzIEZpc2NoZXIiLAogICAgICJPbGFmIEZsZWJiZSIsCiAgICAgIkNoYWQgRnJhbGVpZ2giLAorICAgICJNYXR0aGV3IEZyYW5jaXMiLAogICAgICJQZXRlciBHYWxiYXZ5IiwKICAgICAiUmFtb24gR2FyY2lhIiwKICAgICAiTWF0dGhldyBHaGlvIiwKQEAgLTY0LDYgKzY1LDcgQEAKICAgICAiQ2hhcmxlcyBNLiBIYW5udW0iLAogICAgICJBZHJpYW4gSGFydmV5IiwKICAgICAiSm9obiBIYXJ2ZXkiLAorICAgICJCaWxsIEhhd2VzIiwKICAgICAiQ2FtZXJvbiBIZWlkZSIsCiAgICAgIkpvY2hlbiBIb2VuaWNrZSIsCiAgICAgIk9ubm8gSG92ZXJzIiwKQEAgLTE0NSw2ICsxNDcsNyBAQAogICAgICJSb25hbiBXYWlkZSIsCiAgICAgIkVyaWMgV2FybmtlIiwKICAgICAiTWFuZnJlZCBXZWljaGVsIiwKKyAgICAiVWxyaWNoIFdlaWdhbmQiLAogICAgICJNb3J0ZW4gV2VsaW5kZXIiLAogICAgICJMZW4gV2hpdGUiLAogICAgICJMYXdzb24gV2hpdG5leSIsCkBAIC0yNzksNyArMjgyLDggQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCVNIRUxMX0ZpbmRFeGVjdXRhYmxlCisgKglTSEVMTF9GaW5kRXhlY3V0YWJsZSBbSW50ZXJuYWxdCisgKgogICogVXRpbGl0eSBmb3IgY29kZSBzaGFyaW5nIGJldHdlZW4gRmluZEV4ZWN1dGFibGUgYW5kIFNoZWxsRXhlY3V0ZQogICovCiBzdGF0aWMgSElOU1RBTkNFMzIgU0hFTExfRmluZEV4ZWN1dGFibGUoIExQQ1NUUiBscEZpbGUsIApAQCAtMjk4LDI3ICszMDIsMzQgQEAKICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAvKiByYW5kb20gY291bnRlciAqLwogICAgIGNoYXIgeGxwRmlsZVsyNTZdOyAgICAgIC8qIHJlc3VsdCBvZiBTZWFyY2hQYXRoICovCiAKLSAgICBUUkFDRShleGVjLCAiJXNcbiIsCi0gICAgICAgICAgICAgICAgIChscEZpbGUgIT0gTlVMTD9scEZpbGU6Ii0iKSApOworICAgIFRSQUNFKGV4ZWMsICIlc1xuIiwgKGxwRmlsZSAhPSBOVUxMP2xwRmlsZToiLSIpICk7CisKICAgICBscFJlc3VsdFswXT0nXDAnOyAvKiBTdGFydCBvZmYgd2l0aCBhbiBlbXB0eSByZXR1cm4gc3RyaW5nICovCiAKICAgICAvKiB0cmFwIE5VTEwgcGFyYW1ldGVycyBvbiBlbnRyeSAqLwogICAgIGlmICgoIGxwRmlsZSA9PSBOVUxMICkgfHwgKCBscFJlc3VsdCA9PSBOVUxMICkgfHwgKCBscE9wZXJhdGlvbiA9PSBOVUxMICkpCiAgICAgewotCS8qIEZJWE1FIC0gc2hvdWxkIHRocm93IGEgd2FybmluZywgcGVyaGFwcyEgKi8KLQlyZXR1cm4gMjsgLyogRmlsZSBub3QgZm91bmQuIENsb3NlIGVub3VnaCwgSSBndWVzcy4gKi8KKwlXQVJOKGV4ZWMsICIobHBGaWxlPSVzLGxwUmVzdWx0PSVzLGxwT3BlcmF0aW9uPSVzKTogTlVMTCBwYXJhbWV0ZXJcbiIsCisgICAgICAgICAgIGxwRmlsZSwgbHBPcGVyYXRpb24sIGxwUmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIDI7IC8qIEZpbGUgbm90IGZvdW5kLiBDbG9zZSBlbm91Z2gsIEkgZ3Vlc3MuICovCiAgICAgfQogCiAgICAgaWYgKFNlYXJjaFBhdGgzMkEoIE5VTEwsIGxwRmlsZSwiLmV4ZSIsc2l6ZW9mKHhscEZpbGUpLHhscEZpbGUsTlVMTCkpCisgICAgeworCVRSQUNFKGV4ZWMsICJTZWFyY2hQYXRoMzJBIHJldHVybmVkIG5vbi16ZXJvXG4iKTsKICAgICAgICAgbHBGaWxlID0geGxwRmlsZTsKKyAgICB9CiAKICAgICAvKiBGaXJzdCB0aGluZyB3ZSBuZWVkIGlzIHRoZSBmaWxlJ3MgZXh0ZW5zaW9uICovCiAgICAgZXh0ZW5zaW9uID0gc3RycmNociggeGxwRmlsZSwgJy4nICk7IC8qIEFzc3VtZSBsYXN0ICIuIiBpcyB0aGUgb25lOyAqLwogCQkJCQkvKiBGaWxlLT5SdW4gaW4gcHJvZ21hbiB1c2VzICovCiAJCQkJCS8qIC5cRklMRS5FWEUgOiggKi8KKyAgICBUUkFDRShleGVjLCAieGxwRmlsZT0lcyxleHRlbnNpb249JXNcbiIsIHhscEZpbGUsIGV4dGVuc2lvbik7CisKICAgICBpZiAoKGV4dGVuc2lvbiA9PSBOVUxMKSB8fCAoZXh0ZW5zaW9uID09ICZ4bHBGaWxlW3N0cmxlbih4bHBGaWxlKV0pKQogICAgIHsKLQlyZXR1cm4gMzE7IC8qIG5vIGFzc29jaWF0aW9uICovCisgICAgICAgIFdBUk4oZXhlYywgIlJldHVybmluZyAzMSAtIE5vIGFzc29jaWF0aW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIDMxOyAvKiBubyBhc3NvY2lhdGlvbiAqLwogICAgIH0KIAogICAgIC8qIE1ha2UgbG9jYWwgY29weSAmIGxvd2VyY2FzZSBpdCBmb3IgcmVnICYgJ3Byb2dyYW1zPScgbG9va3VwICovCkBAIC0xNjU4LDggKzE2NjksMyBAQAogCWxzdHJjcHkzMkEocHN6UGF0aCwiRTpcXCIpOyAvKiBGSVhNRSAqLwogCXJldHVybiBOT0VSUk9SOwogfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL21pc2Mvc2hlbGxvcmQuYyBiL21pc2Mvc2hlbGxvcmQuYwppbmRleCAzNDRlYTExLi40MWYwNTM4IDEwMDY0NAotLS0gYS9taXNjL3NoZWxsb3JkLmMKKysrIGIvbWlzYy9zaGVsbG9yZC5jCkBAIC0xMCwxMSArMTAsMTEgQEAKICAqIENvcHlyaWdodCAxOTk3IE1hcmN1cyBNZWlzc25lcgogICovCiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJzaGVsbC5oIgogI2luY2x1ZGUgImhlYXAuaCIKQEAgLTI1MSw2ICsyNTEsMTQgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCVNIRUxMMzJfNTEJW1NIRUxMMzIuNTFdCisgKi8KK0RXT1JEIFdJTkFQSSBTSEVMTDMyXzUxKExQQ1NUUiBzLERXT1JEIHgyLERXT1JEIHgzKSB7CisJRklYTUUoc2hlbGwsIiglcywweCUwOGx4LDB4JTA4bHgpLHN0dWIhXG4iLHMseDIseDMpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJU0hFTEwzMl81MglbU0hFTEwzMi41Ml0KICAqIGxvb2sgZm9yIG5leHQgYXJnIGluIHN0cmluZy4gaGFuZGxlICJxdW90ZWQiIHN0cmluZ3MKICAqIHJldHVybnMgcG9pbnRlciB0byBhcmd1bWVudCAqQUZURVIqIHRoZSBzcGFjZS4gT3IgdG8gdGhlIFwwLgpAQCAtNDUzLDggKzQ2MSwxMiBAQAogCiAgKi8KIAlocmVzID0gKCpkbGxnZXRjbGFzc29iKShjbHNpZCwoUkVGSUlEKSZJSURfSUNsYXNzRmFjdG9yeSwmY2xhc3NmYWMpOwotCWlmIChocmVzPDApCisJaWYgKGhyZXM8MCB8fCAoaHJlcz49MHg4MDAwMDAwMCkpCiAJCXJldHVybiBocmVzOworCWlmICghY2xhc3NmYWMpIHsKKwkJRklYTUUoc2hlbGwsIm5vIGNsYXNzZmFjdG9yeSwgYnV0IGhyZXMgaXMgMHglbGQhXG4iLGhyZXMpOworCQlyZXR1cm4gRV9GQUlMOworCX0KIAljbGFzc2ZhYy0+bHB2dGJsLT5mbkNyZWF0ZUluc3RhbmNlKGNsYXNzZmFjLHVua25vd25vdXRlcixyZWZpaWQsaW5zdCk7CiAJY2xhc3NmYWMtPmxwdnRibC0+Zm5SZWxlYXNlKGNsYXNzZmFjKTsKIAlyZXR1cm4gMDsKQEAgLTY3MSwzICs2ODMsMjEgQEAKICAgICByZXR1cm4gMDsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNIRUxMMzJfODYgW1NIRUxMMzIuODZdCisgKiB1bmtub3duCisgKi8KK0RXT1JEIFdJTkFQSSBTSEVMTDMyXzg2KEhXTkQzMiBod25kLERXT1JEIHgyKSB7CisgICAgRklYTUUoc2hlbGwsIigweCUwOGx4LDB4JTA4bHgpOnN0dWIuXG4iLGh3bmQseDIpOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0hFTEwzMl84NyBbU0hFTEwzMi44N10KKyAqIHVua25vd24KKyAqLworRFdPUkQgV0lOQVBJIFNIRUxMMzJfODcoRFdPUkQgeCkgeworICAgIEZJWE1FKHNoZWxsLCIoMHglMDhseCk6c3R1Yi5cbiIseCk7CisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL21pc2Mvc291bmQuYyBiL21pc2Mvc291bmQuYwppbmRleCA5ZGU4MWYwLi4zMzdiYzQ4IDEwMDY0NAotLS0gYS9taXNjL3NvdW5kLmMKKysrIGIvbWlzYy9zb3VuZC5jCkBAIC0xLDEwICsxLDggQEAKIC8qCi1zdGF0aWMgY2hhciBSQ1NJZFtdID0gIiRJZDogaGVhcC5jLHYgMS4zIDE5OTMvMDcvMDQgMDQ6MDQ6MjEgcm9vdCBFeHAgcm9vdCAkIjsKLXN0YXRpYyBjaGFyIENvcHlyaWdodFtdID0gIkNvcHlyaWdodCAgUm9iZXJ0IEouIEFtc3RhZHQsIDE5OTMiOwotKi8KKyAqICBDb3B5cmlnaHQgIFJvYmVydCBKLiBBbXN0YWR0LCAxOTkzCisgKi8KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKZGlmZiAtLWdpdCBhL21pc2Mvc3B5LmMgYi9taXNjL3NweS5jCmluZGV4IDk3OWFkMjMuLjA0MTljMDUgMTAwNjQ0Ci0tLSBhL21pc2Mvc3B5LmMKKysrIGIvbWlzYy9zcHkuYwpAQCAtNiw3ICs2LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luLmgiCmRpZmYgLS1naXQgYS9taXNjL3N0cmVzcy5jIGIvbWlzYy9zdHJlc3MuYwppbmRleCA2MzIwZGZhLi43YTdmOWY0IDEwMDY0NAotLS0gYS9taXNjL3N0cmVzcy5jCisrKyBiL21pc2Mvc3RyZXNzLmMKQEAgLTEsNCArMSwzIEBACi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAic3RyZXNzLmgiCmRpZmYgLS1naXQgYS9taXNjL3N5c3RlbS5jIGIvbWlzYy9zeXN0ZW0uYwppbmRleCA5OWZiY2ZiLi43N2U0OTQwIDEwMDY0NAotLS0gYS9taXNjL3N5c3RlbS5jCisrKyBiL21pc2Mvc3lzdGVtLmMKQEAgLTQsNyArNCw2IEBACiAgKiBDb3B5cmlnaHQgMTk5NiBBbGV4YW5kcmUgSnVsbGlhcmQKICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDx0aW1lLmg+CmRpZmYgLS1naXQgYS9taXNjL3Rvb2xoZWxwLmMgYi9taXNjL3Rvb2xoZWxwLmMKaW5kZXggYTY1MjBkOC4uNjA2NDE2YiAxMDA2NDQKLS0tIGEvbWlzYy90b29saGVscC5jCisrKyBiL21pc2MvdG9vbGhlbHAuYwpAQCAtNSw3ICs1LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgpkaWZmIC0tZ2l0IGEvbWlzYy90d2Vhay5jIGIvbWlzYy90d2Vhay5jCmluZGV4IDYwM2Y5ZGYuLjVlN2U2YWYgMTAwNjQ0Ci0tLSBhL21pc2MvdHdlYWsuYworKysgYi9taXNjL3R3ZWFrLmMKQEAgLTI0LDcgKzI0LDYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPG1hbGxvYy5oPgogI2luY2x1ZGUgInRzX3hsaWIuaCIKICNpbmNsdWRlIDxzdHJpbmcuaD4KZGlmZiAtLWdpdCBhL21pc2MvdmVyLmMgYi9taXNjL3Zlci5jCmluZGV4IDg1MWIzN2IuLjBjODE0OWIgMTAwNjQ0Ci0tLSBhL21pc2MvdmVyLmMKKysrIGIvbWlzYy92ZXIuYwpAQCAtNSw3ICs1LDYgQEAKICAqIENvcHlyaWdodCAxOTk3IERhdmlkIEN1dGhiZXJ0CiAgKi8KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CmRpZmYgLS1naXQgYS9taXNjL3ZlcnNpb24uYyBiL21pc2MvdmVyc2lvbi5jCmluZGV4IDJiMTI1ZTIuLjg5Y2I4Y2QgMTAwNjQ0Ci0tLSBhL21pc2MvdmVyc2lvbi5jCisrKyBiL21pc2MvdmVyc2lvbi5jCkBAIC01LDcgKzUsNiBAQAogICogQ29weXJpZ2h0IDE5OTcgTWFyY3VzIE1laXNzbmVyCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmJhc2UuaCIKZGlmZiAtLWdpdCBhL21pc2Mvd2luMzJzMTYuYyBiL21pc2Mvd2luMzJzMTYuYwppbmRleCBmZGUxYjI4Li41ZmMwNDg0IDEwMDY0NAotLS0gYS9taXNjL3dpbjMyczE2LmMKKysrIGIvbWlzYy93aW4zMnMxNi5jCkBAIC05LDcgKzksNiBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KIAogdm9pZCBCb290VGFzaygpCiB7CmRpZmYgLS1naXQgYS9taXNjL3dpbmRlYnVnLmMgYi9taXNjL3dpbmRlYnVnLmMKaW5kZXggNWU3NGNmNC4uYzIyYzcxMiAxMDA2NDQKLS0tIGEvbWlzYy93aW5kZWJ1Zy5jCisrKyBiL21pc2Mvd2luZGVidWcuYwpAQCAtNCw3ICs0LDYgQEAKICAqIENvcHlyaWdodCAoYykgMTk5NyBBbmRyZWFzIE1vaHIKICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCmRpZmYgLS1naXQgYS9taXNjL3dpbnNvY2suYyBiL21pc2Mvd2luc29jay5jCmluZGV4IDI0ZDUyNDIuLjRkYWU2YzQgMTAwNjQ0Ci0tLSBhL21pc2Mvd2luc29jay5jCisrKyBiL21pc2Mvd2luc29jay5jCkBAIC0xMiw3ICsxMiw2IEBACiAgCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtOTgsOSArOTcsNiBAQAogc3RhdGljIGludCAgIF9jaGVja193cyhMUFdTSU5GTyBwd3NpLCB3c19zb2NrZXQqIHB3cyk7CiBzdGF0aWMgY2hhciogX2NoZWNrX2J1ZmZlcihMUFdTSU5GTyBwd3NpLCBpbnQgc2l6ZSk7CiAKLWV4dGVybiB2b2lkIEVWRU5UX0FkZElPKCBpbnQgZmQsIHVuc2lnbmVkIGZsYWcgKTsKLWV4dGVybiB2b2lkIEVWRU5UX0RlbGV0ZUlPKCBpbnQgZmQsIHVuc2lnbmVkIGZsYWcgKTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICBjb252ZXJ0X3NvY2tvcHQoKQogICoKQEAgLTE2NzYsMTQgKzE2NzIsNiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgQXN5bmNocm9ub3VzIEROUyBzZXJ2aWNlcwotICovCi0KLS8qIHdpbnNvY2tfZG5zLmMgKi8KLWV4dGVybiBIQU5ETEUxNiBfX1dTQXN5bmNEQlF1ZXJ5KExQV1NJTkZPIHB3c2ksIEhXTkQzMiBoV25kLCBVSU5UMzIgdU1zZywgSU5UMzIgdHlwZSwgTFBDU1RSIGluaXQsCi0JCQkJIElOVDMyIGxlbiwgTFBDU1RSIHByb3RvLCB2b2lkKiBzYnVmLCBJTlQzMiBidWZsZW4sIFVJTlQzMiBmbGFnKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICBXU0FBc3luY0dldEhvc3RCeUFkZHIoKQkoV0lOU09DSy4xMDIpCiAgKi8KIEhBTkRMRTE2IFdJTkFQSSBXU0FBc3luY0dldEhvc3RCeUFkZHIxNihIV05EMTYgaFduZCwgVUlOVDE2IHVNc2csIExQQ1NUUiBhZGRyLApkaWZmIC0tZ2l0IGEvbWlzYy93aW5zb2NrX2Rucy5jIGIvbWlzYy93aW5zb2NrX2Rucy5jCmluZGV4IGRjOWIyOTguLjNjYjFmZTAgMTAwNjQ0Ci0tLSBhL21pc2Mvd2luc29ja19kbnMuYworKysgYi9taXNjL3dpbnNvY2tfZG5zLmMKQEAgLTc3LDkgKzc3LDYgQEAKIHN0YXRpYyB2b2lkIGZpeHVwX3dzcGUoc3RydWN0IHdzX3Byb3RvZW50KiBwX3dzcGUsIHZvaWQqIGJhc2UpOwogc3RhdGljIHZvaWQgZml4dXBfd3NzZShzdHJ1Y3Qgd3Nfc2VydmVudCogcF93c3NlLCB2b2lkKiBiYXNlKTsKIAotZXh0ZXJuIHZvaWQgRVZFTlRfQWRkSU8oIGludCBmZCwgdW5zaWduZWQgZmxhZyApOwotZXh0ZXJuIHZvaWQgRVZFTlRfRGVsZXRlSU8oIGludCBmZCwgdW5zaWduZWQgZmxhZyApOwotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhc3luYy9ub24tYmxvY2tpbmcgSS9PICovCiAKIGludCBXSU5TT0NLX2FzeW5jX2lvKGludCBmZCwgaW50IGFzeW5jKQpAQCAtMzIxLDggKzMxOCw4IEBACiB9CiAKIAotSEFORExFMTYgX19XU0FzeW5jREJRdWVyeShMUFdTSU5GTyBwd3NpLCBIV05EMzIgaFduZCwgVUlOVDMyIHVNc2csIElOVDMyIHR5cGUsIExQU1RSIGluaXQsCi0JCSAgCSAgSU5UMzIgbGVuLCBMUFNUUiBwcm90bywgdm9pZCogc2J1ZiwgSU5UMzIgYnVmbGVuLCBVSU5UMzIgZmxhZykKK0hBTkRMRTE2IF9fV1NBc3luY0RCUXVlcnkoTFBXU0lORk8gcHdzaSwgSFdORDMyIGhXbmQsIFVJTlQzMiB1TXNnLCBJTlQzMiB0eXBlLCAKKyAgICBMUENTVFIgaW5pdCwgSU5UMzIgbGVuLCBMUENTVFIgcHJvdG8sIHZvaWQqIHNidWYsIElOVDMyIGJ1ZmxlbiwgVUlOVDMyIGZsYWcpCiB7CiAgICAgLyogcXVldWUgJ2ZsYWcnIHJlcXVlc3QgYW5kIGZvcmsgb2ZmIGl0cyBoYW5kbGVyICovCiAKQEAgLTMzNiw3ICszMzMsNyBAQAogCXsKIAkgICAgYXN5bmNfY3RsLnJxLmluaXQgPSAoY2hhciopaW5pdDsKIAkgICAgYXN5bmNfY3RsLmlsZW5ndGggPSBsZW47Ci0JICAgIGFzeW5jX2N0bC5idWZmZXIgPSBwcm90bzsKKwkgICAgYXN5bmNfY3RsLmJ1ZmZlciA9IChjaGFyKilwcm90bzsKIAkgICAgYXN5bmNfY3RsLnR5cGUgPSB0eXBlOwogCiAJICAgIGFzeW5jX2N0bC53c19hb3AtPmhXbmQgPSBoV25kOwpkaWZmIC0tZ2l0IGEvbWlzYy93c3ByaW50Zi5jIGIvbWlzYy93c3ByaW50Zi5jCmluZGV4IGZjZmQ1ODkuLjk2YjIzYjQgMTAwNjQ0Ci0tLSBhL21pc2Mvd3NwcmludGYuYworKysgYi9taXNjL3dzcHJpbnRmLmMKQEAgLTUsNyArNSw2IEBACiAgKi8KIAogI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImxkdC5oIgpkaWZmIC0tZ2l0IGEvbWlzYy94bWFsbG9jLmMgYi9taXNjL3htYWxsb2MuYwppbmRleCA4ZmY3YjM4Li4zZmFhNmE4IDEwMDY0NAotLS0gYS9taXNjL3htYWxsb2MuYworKysgYi9taXNjL3htYWxsb2MuYwpAQCAtMTMsNyArMTMsNiBAQAogCiAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJ4bWFsbG9jLmgiCmRpZmYgLS1naXQgYS9taXNjZW11L2VtdWxhdGUuYyBiL21pc2NlbXUvZW11bGF0ZS5jCmluZGV4IGYxNDFhNDQuLjBkOTVkYWQgMTAwNjQ0Ci0tLSBhL21pc2NlbXUvZW11bGF0ZS5jCisrKyBiL21pc2NlbXUvZW11bGF0ZS5jCkBAIC0xLDUgKzEsNCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAibWlzY2VtdS5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKZGlmZiAtLWdpdCBhL21pc2NlbXUvaW5zdHIuYyBiL21pc2NlbXUvaW5zdHIuYwppbmRleCAxYjY1NzBkLi40NjVmMTZjIDEwMDY0NAotLS0gYS9taXNjZW11L2luc3RyLmMKKysrIGIvbWlzY2VtdS9pbnN0ci5jCkBAIC00LDcgKzQsNiBAQAogICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImxkdC5oIgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKQEAgLTI5OSw2ICsyOTgsNyBAQAogCiAgICAgbG9uZ19vcCA9IGxvbmdfYWRkciA9IElTX1NFTEVDVE9SXzMyQklUKENTX3NpZyhjb250ZXh0KSk7CiAgICAgaW5zdHIgPSAoQllURSAqKU1BS0VfUFRSKENTX3NpZyhjb250ZXh0KSxFSVBfc2lnKGNvbnRleHQpKTsKKyAgICBpZiAoIWluc3RyKSByZXR1cm4gRkFMU0U7CiAKICAgICAvKiBGaXJzdCBoYW5kbGUgYW55IHBvc3NpYmxlIHByZWZpeCAqLwogCmRpZmYgLS1naXQgYS9taXNjZW11L21haW4uYyBiL21pc2NlbXUvbWFpbi5jCmluZGV4IDFmNTNjODkuLjQxNzRiMGUgMTAwNjQ0Ci0tLSBhL21pc2NlbXUvbWFpbi5jCisrKyBiL21pc2NlbXUvbWFpbi5jCkBAIC0zLDE0ICszLDE2IEBACiAgKgogICovCiAKLSNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnZ2VyLmgiCiAjaW5jbHVkZSAibWFpbi5oIgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJwcm9jZXNzLmgiCisjaW5jbHVkZSAid2luMTZkcnYuaCIKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xOCw5ICsyMCw2IEBACiAgKi8KIEJPT0wzMiBNQUlOX0VtdWxhdG9ySW5pdCh2b2lkKQogewotICAgIGV4dGVybiBCT09MMzIgV0lOMTZEUlZfSW5pdCh2b2lkKTsKLSAgICBleHRlcm4gQk9PTDMyIFJFTEFZX0luaXQodm9pZCk7Ci0KICAgICAvKiBJbml0aWFsaXplIHRoZSBrZXJuZWwgKi8KICAgICBpZiAoIU1BSU5fS2VybmVsSW5pdCgpKSByZXR1cm4gRkFMU0U7CiAKQEAgLTQzLDggKzQyLDYgQEAKICAqLwogaW50IG1haW4oIGludCBhcmdjLCBjaGFyICphcmd2W10gKQogewotICAgIGV4dGVybiBCT09MMzIgUFJPQ0VTU19Jbml0KHZvaWQpOwotICAgIGV4dGVybiB2b2lkICpDQUxMMzJfSW5pdCh2b2lkKTsKICAgICBleHRlcm4gY2hhciAqIERFQlVHX2FyZ3YwOwogCiAgICAgaW50IGksbG9hZGVkOwpkaWZmIC0tZ2l0IGEvbXNkb3MvZG9zbWVtLmMgYi9tc2Rvcy9kb3NtZW0uYwppbmRleCA2MDQ4ZWM1Li4wMjI2NDUwIDEwMDY0NAotLS0gYS9tc2Rvcy9kb3NtZW0uYworKysgYi9tc2Rvcy9kb3NtZW0uYwpAQCAtNiw3ICs2LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCmRpZmYgLS1naXQgYS9tc2Rvcy9kcG1pLmMgYi9tc2Rvcy9kcG1pLmMKaW5kZXggMzZkNzA1OC4uZDcxMjhkOSAxMDA2NDQKLS0tIGEvbXNkb3MvZHBtaS5jCisrKyBiL21zZG9zL2RwbWkuYwpAQCAtNCw3ICs0LDYgQEAKICAqIENvcHlyaWdodCAxOTk1IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKQEAgLTM3NCwxNCArMzczLDE4IEBACiAgICAgc3dpdGNoKEFYX3JlZyhjb250ZXh0KSkKICAgICB7CiAgICAgY2FzZSAweDAwMDA6ICAvKiBBbGxvY2F0ZSBMRFQgZGVzY3JpcHRvcnMgKi8KKyAgICAJVFJBQ0UoaW50MzEsImFsbG9jYXRlIExEVCBkZXNjcmlwdG9ycyAoJWQpXG4iLENYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgIGlmICghKEFYX3JlZyhjb250ZXh0KSA9IEFsbG9jU2VsZWN0b3JBcnJheSggQ1hfcmVnKGNvbnRleHQpICkpKQogICAgICAgICB7CisgICAgCSAgICBUUkFDRShpbnQzMSwiZmFpbGVkXG4iKTsKICAgICAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IDB4ODAxMTsgIC8qIGRlc2NyaXB0b3IgdW5hdmFpbGFibGUgKi8KICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKICAgICAgICAgfQorCVRSQUNFKGludDMxLCJzdWNjZXNzLCBhcnJheSBzdGFydHMgYXQgMHglMDR4XG4iLEFYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDAwMDE6ICAvKiBGcmVlIExEVCBkZXNjcmlwdG9yICovCisgICAgCVRSQUNFKGludDMxLCJmcmVlIExEVCBkZXNjcmlwdG9yICgweCUwNHgpXG4iLEJYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgIGlmIChGcmVlU2VsZWN0b3IoIEJYX3JlZyhjb250ZXh0KSApKQogICAgICAgICB7CiAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAweDgwMjI7ICAvKiBpbnZhbGlkIHNlbGVjdG9yICovCkBAIC0zOTksNiArNDAyLDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4MDAwMjogIC8qIFJlYWwgbW9kZSBzZWdtZW50IHRvIGRlc2NyaXB0b3IgKi8KKyAgICAJVFJBQ0UoaW50MzEsInJlYWwgbW9kZSBzZWdtZW50IHRvIGRlc2NyaXB0b3IgKDB4JTA0eClcbiIsQlhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgewogICAgICAgICAgICAgV09SRCBlbnRyeVBvaW50ID0gMDsgIC8qIEtFUk5FTCBlbnRyeSBwb2ludCBmb3IgZGVzY3JpcHRvciAqLwogICAgICAgICAgICAgc3dpdGNoKEJYX3JlZyhjb250ZXh0KSkKQEAgLTQyNCwxOCArNDI4LDIyIEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDAwMDM6ICAvKiBHZXQgbmV4dCBzZWxlY3RvciBpbmNyZW1lbnQgKi8KKyAgICAJVFJBQ0UoaW50MzEsImdldCBzZWxlY3RvciBpbmNyZW1lbnQgKF9fQUhJTkNSKVxuIik7CiAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IF9fQUhJTkNSOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgwMDA0OiAgLyogTG9jayBzZWxlY3RvciAobm90IHN1cHBvcnRlZCkgKi8KKyAgICAJRklYTUUoaW50MzEsImxvY2sgc2VsZWN0b3Igbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IDA7ICAvKiBGSVhNRTogaXMgdGhpcyBhIGNvcnJlY3QgcmV0dXJuIHZhbHVlPyAqLwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgwMDA1OiAgLyogVW5sb2NrIHNlbGVjdG9yIChub3Qgc3VwcG9ydGVkKSAqLworICAgIAlGSVhNRShpbnQzMSwidW5sb2NrIHNlbGVjdG9yIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAwOyAgLyogRklYTUU6IGlzIHRoaXMgYSBjb3JyZWN0IHJldHVybiB2YWx1ZT8gKi8KICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4MDAwNjogIC8qIEdldCBzZWxlY3RvciBiYXNlIGFkZHJlc3MgKi8KKyAgICAJVFJBQ0UoaW50MzEsImdldCBzZWxlY3RvciBiYXNlIGFkZHJlc3MgKDB4JTA0eClcbiIsQlhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgaWYgKCEoZHcgPSBHZXRTZWxlY3RvckJhc2UoIEJYX3JlZyhjb250ZXh0KSApKSkKICAgICAgICAgewogICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gMHg4MDIyOyAgLyogaW52YWxpZCBzZWxlY3RvciAqLwpAQCAtNDQ5LDIwICs0NTcsMjQgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4MDAwNzogIC8qIFNldCBzZWxlY3RvciBiYXNlIGFkZHJlc3MgKi8KKyAgICAJVFJBQ0UoaW50MzEsInNldCBzZWxlY3RvciBiYXNlIGFkZHJlc3MgKDB4JTA0eCwweCUwOGx4KVxuIixCWF9yZWcoY29udGV4dCksTUFLRUxPTkcoRFhfcmVnKGNvbnRleHQpLENYX3JlZyhjb250ZXh0KSkpOwogICAgICAgICBTZXRTZWxlY3RvckJhc2UoIEJYX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyggRFhfcmVnKGNvbnRleHQpLCBDWF9yZWcoY29udGV4dCkgKSApOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgwMDA4OiAgLyogU2V0IHNlbGVjdG9yIGxpbWl0ICovCisgICAgCVRSQUNFKGludDMxLCJzZXQgc2VsZWN0b3IgbGltaXQgKDB4JTA0eCwweCUwOGx4KVxuIixCWF9yZWcoY29udGV4dCksTUFLRUxPTkcoRFhfcmVnKGNvbnRleHQpLENYX3JlZyhjb250ZXh0KSkpOwogICAgICAgICBTZXRTZWxlY3RvckxpbWl0KCBCWF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKCBEWF9yZWcoY29udGV4dCksIENYX3JlZyhjb250ZXh0KSApICk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDAwMDk6ICAvKiBTZXQgc2VsZWN0b3IgYWNjZXNzIHJpZ2h0cyAqLworICAgIAlUUkFDRShpbnQzMSwic2V0IHNlbGVjdG9yIGFjY2VzcyByaWdodHMoMHglMDR4LDB4JTA0eClcbiIsQlhfcmVnKGNvbnRleHQpLENYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgIFNlbGVjdG9yQWNjZXNzUmlnaHRzKCBCWF9yZWcoY29udGV4dCksIDEsIENYX3JlZyhjb250ZXh0KSApOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgwMDBhOiAgLyogQWxsb2NhdGUgc2VsZWN0b3IgYWxpYXMgKi8KKyAgICAJVFJBQ0UoaW50MzEsImFsbG9jYXRlIHNlbGVjdG9yIGFsaWFzICgweCUwNHgpXG4iLEJYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgIGlmICghKEFYX3JlZyhjb250ZXh0KSA9IEFsbG9jQ1N0b0RTQWxpYXMoIEJYX3JlZyhjb250ZXh0KSApKSkKICAgICAgICAgewogICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gMHg4MDExOyAgLyogZGVzY3JpcHRvciB1bmF2YWlsYWJsZSAqLwpAQCAtNDcxLDYgKzQ4Myw3IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDAwMGI6ICAvKiBHZXQgZGVzY3JpcHRvciAqLworICAgIAlUUkFDRShpbnQzMSwiZ2V0IGRlc2NyaXB0b3IgKDB4JTA0eClcbiIsQlhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgewogICAgICAgICAgICAgbGR0X2VudHJ5IGVudHJ5OwogICAgICAgICAgICAgTERUX0dldEVudHJ5KCBTRUxFQ1RPUl9UT19FTlRSWSggQlhfcmVnKGNvbnRleHQpICksICZlbnRyeSApOwpAQCAtNDgxLDYgKzQ5NCw3IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDAwMGM6ICAvKiBTZXQgZGVzY3JpcHRvciAqLworICAgIAlUUkFDRShpbnQzMSwic2V0IGRlc2NyaXB0b3IgKDB4JTA0eClcbiIsQlhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgewogICAgICAgICAgICAgbGR0X2VudHJ5IGVudHJ5OwogICAgICAgICAgICAgTERUX0J5dGVzVG9FbnRyeSggUFRSX1NFR19PRkZfVE9fTElOKCBFU19yZWcoY29udGV4dCksCkBAIC00OTAsNiArNTA0LDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4MDAwZDogIC8qIEFsbG9jYXRlIHNwZWNpZmljIExEVCBkZXNjcmlwdG9yICovCisgICAgCUZJWE1FKGludDMxLCJhbGxvY2F0ZSBkZXNjcmlwdG9yICgweCUwNHgpLCBzdHViIVxuIixCWF9yZWcoY29udGV4dCkpOwogICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAweDgwMTE7IC8qIGRlc2NyaXB0b3IgdW5hdmFpbGFibGUgKi8KICAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOwogICAgICAgICBicmVhazsKQEAgLTUwMywxMiArNTE4LDE0IEBACiAgICAgCVNFVF9DRkxBRyhjb250ZXh0KTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAweDAyMDQ6ICAvKiBHZXQgcHJvdGVjdGVkIG1vZGUgaW50ZXJydXB0IHZlY3RvciAqLworICAgIAlUUkFDRShpbnQzMSwiZ2V0IHByb3RlY3RlZCBtb2RlIGludGVycnVwdCBoYW5kbGVyICgweCUwMngpLCBzdHViIVxuIixCTF9yZWcoY29udGV4dCkpOwogCWR3ID0gKERXT1JEKUlOVF9HZXRIYW5kbGVyKCBCTF9yZWcoY29udGV4dCkgKTsKIAlDWF9yZWcoY29udGV4dCkgPSBISVdPUkQoZHcpOwogCURYX3JlZyhjb250ZXh0KSA9IExPV09SRChkdyk7CiAJYnJlYWs7CiAKICAgICBjYXNlIDB4MDIwNTogIC8qIFNldCBwcm90ZWN0ZWQgbW9kZSBpbnRlcnJ1cHQgdmVjdG9yICovCisgICAgCVRSQUNFKGludDMxLCJzZXQgcHJvdGVjdGVkIG1vZGUgaW50ZXJydXB0IGhhbmRsZXIgKDB4JTAyeCwweCUwOGx4KSwgc3R1YiFcbiIsQkxfcmVnKGNvbnRleHQpLFBUUl9TRUdfT0ZGX1RPX0xJTihDWF9yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKSk7CiAJSU5UX1NldEhhbmRsZXIoIEJMX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgIChGQVJQUk9DMTYpUFRSX1NFR19PRkZfVE9fU0VHUFRSKCBDWF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpICkpOwpAQCAtNTQwLDYgKzU1Nyw3IEBACiAJYnJlYWs7CiAKICAgICBjYXNlIDB4MDQwMDogIC8qIEdldCBEUE1JIHZlcnNpb24gKi8KKyAgICAgICAgVFJBQ0UoaW50MzEsImdldCBEUE1JIHZlcnNpb25cbiIpOwogICAgIAl7CiAJICAgIFNZU1RFTV9JTkZPIHNpOwogCkBAIC01NTEsNiArNTY5LDcgQEAKIAkgICAgYnJlYWs7CiAJfQogICAgIGNhc2UgMHgwNTAwOiAgLyogR2V0IGZyZWUgbWVtb3J5IGluZm9ybWF0aW9uICovCisgICAgICAgIFRSQUNFKGludDMxLCJnZXQgZnJlZSBtZW1vcnkgaW5mb3JtYXRpb25cbiIpOwogICAgICAgICB7CiAgICAgICAgICAgICBNRU1NQU5JTkZPIG1taTsKIApAQCAtNTY0LDYgKzU4Myw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIGNhc2UgMHgwNTAxOiAgLyogQWxsb2NhdGUgbWVtb3J5IGJsb2NrICovCisgICAgICAgIFRSQUNFKGludDMxLCJhbGxvY2F0ZSBtZW1vcnkgYmxvY2sgKCVsZClcbiIsTUFLRUxPTkcoQ1hfcmVnKGNvbnRleHQpLEJYX3JlZyhjb250ZXh0KSkpOwogCWlmICghKHB0ciA9IChCWVRFICopVmlydHVhbEFsbG9jKE5VTEwsIE1BS0VMT05HKENYX3JlZyhjb250ZXh0KSwgQlhfcmVnKGNvbnRleHQpKSwgTUVNX0NPTU1JVCwgUEFHRV9FWEVDVVRFX1JFQURXUklURSkpKQogICAgICAgICB7CiAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAweDgwMTI7ICAvKiBsaW5lYXIgbWVtb3J5IG5vdCBhdmFpbGFibGUgKi8KQEAgLTU3NywxMCArNTk3LDEyIEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDA1MDI6ICAvKiBGcmVlIG1lbW9yeSBibG9jayAqLworICAgICAgICBUUkFDRShpbnQzMSwiZnJlZSBtZW1vcnkgYmxvY2sgKDB4JTA4bHgpXG4iLE1BS0VMT05HKERJX3JlZyhjb250ZXh0KSxTSV9yZWcoY29udGV4dCkpKTsKIAlWaXJ0dWFsRnJlZSgodm9pZCAqKU1BS0VMT05HKERJX3JlZyhjb250ZXh0KSwgU0lfcmVnKGNvbnRleHQpKSwgMCwgTUVNX1JFTEVBU0UpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgwNTAzOiAgLyogUmVzaXplIG1lbW9yeSBibG9jayAqLworICAgICAgICBUUkFDRShpbnQzMSwicmVzaXplIG1lbW9yeSBibG9jayAoMHglMDhseCwlbGQpXG4iLE1BS0VMT05HKERJX3JlZyhjb250ZXh0KSxTSV9yZWcoY29udGV4dCkpLE1BS0VMT05HKENYX3JlZyhjb250ZXh0KSxCWF9yZWcoY29udGV4dCkpKTsKICAgICAgICAgaWYgKCEocHRyID0gKEJZVEUgKilIZWFwUmVBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopTUFLRUxPTkcoRElfcmVnKGNvbnRleHQpLFNJX3JlZyhjb250ZXh0KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKENYX3JlZyhjb250ZXh0KSxCWF9yZWcoY29udGV4dCkpKSkpCkBAIC01OTYsMjkgKzYxOCwzNyBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgwNjAwOiAgLyogTG9jayBsaW5lYXIgcmVnaW9uICovCisgICAgICAgIEZJWE1FKGludDMxLCJsb2NrIGxpbmVhciByZWdpb24gdW5pbXBsZW1lbnRlZFxuIik7CiAgICAgICAgIGJyZWFrOyAgLyogSnVzdCBpZ25vcmUgaXQgKi8KIAogICAgIGNhc2UgMHgwNjAxOiAgLyogVW5sb2NrIGxpbmVhciByZWdpb24gKi8KKyAgICAgICAgRklYTUUoaW50MzEsInVubG9jayBsaW5lYXIgcmVnaW9uIHVuaW1wbGVtZW50ZWRcbiIpOwogICAgICAgICBicmVhazsgIC8qIEp1c3QgaWdub3JlIGl0ICovCiAKICAgICBjYXNlIDB4MDYwMjogIC8qIFVubG9jayByZWFsLW1vZGUgcmVnaW9uICovCisgICAgICAgIEZJWE1FKGludDMxLCJ1bmxvY2sgcmVhbG1vZGUgcmVnaW9uIHVuaW1wbGVtZW50ZWRcbiIpOwogICAgICAgICBicmVhazsgIC8qIEp1c3QgaWdub3JlIGl0ICovCiAKICAgICBjYXNlIDB4MDYwMzogIC8qIExvY2sgcmVhbC1tb2RlIHJlZ2lvbiAqLworICAgICAgICBGSVhNRShpbnQzMSwibG9jayByZWFsbW9kZSByZWdpb24gdW5pbXBsZW1lbnRlZFxuIik7CiAgICAgICAgIGJyZWFrOyAgLyogSnVzdCBpZ25vcmUgaXQgKi8KIAogICAgIGNhc2UgMHgwNjA0OiAgLyogR2V0IHBhZ2Ugc2l6ZSAqLworICAgICAgICBUUkFDRShpbnQzMSwiZ2V0IHBhZ2VzaXplXG4iKTsKICAgICAgICAgQlhfcmVnKGNvbnRleHQpID0gMDsKLSAgICAgICAgQ1hfcmVnKGNvbnRleHQpID0gNDA5NjsKKyAgICAgICAgQ1hfcmVnKGNvbnRleHQpID0gVklSVFVBTF9HZXRQYWdlU2l6ZSgpOwogCWJyZWFrOwogCiAgICAgY2FzZSAweDA3MDI6ICAvKiBNYXJrIHBhZ2UgYXMgZGVtYW5kLXBhZ2luZyBjYW5kaWRhdGUgKi8KKyAgICAgICAgRklYTUUoaW50MzEsIm1hcmsgcGFnZSBhcyBkZW1hbmQtcGFnaW5nIGNhbmRpZGF0ZVxuIik7CiAgICAgICAgIGJyZWFrOyAgLyogSnVzdCBpZ25vcmUgaXQgKi8KIAogICAgIGNhc2UgMHgwNzAzOiAgLyogRGlzY2FyZCBwYWdlIGNvbnRlbnRzICovCisgICAgICAgIEZJWE1FKGludDMxLCJkaXNjYXJkIHBhZ2UgY29udGVudHNcbiIpOwogICAgICAgICBicmVhazsgIC8qIEp1c3QgaWdub3JlIGl0ICovCiAKICAgICAgY2FzZSAweDA4MDA6ICAvKiBQaHlzaWNhbCBhZGRyZXNzIG1hcHBpbmcgKi8KKyAgICAgICAgRklYTUUoaW50MzEsIm1hcCByZWFsIHRvIGxpbmVhciAoMHglMDhseClcbiIsTUFLRUxPTkcoQ1hfcmVnKGNvbnRleHQpLEJYX3JlZyhjb250ZXh0KSkpOwogICAgICAgICAgaWYoIShwdHI9RE9TTUVNX01hcFJlYWxUb0xpbmVhcihNQUtFTE9ORyhDWF9yZWcoY29udGV4dCksQlhfcmVnKGNvbnRleHQpKSkpKQogICAgICAgICAgewogICAgICAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IDB4ODAyMTsgCmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQxMC5jIGIvbXNkb3MvaW50MTAuYwppbmRleCAyZjM3MTA3Li5kNThjMjllIDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQxMC5jCisrKyBiL21zZG9zL2ludDEwLmMKQEAgLTIsNyArMiw2IEBACiAgKiBCSU9TIGludGVycnVwdCAxMGggaGFuZGxlcgogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKIC8qICNkZWZpbmUgREVCVUdfSU5UICovCmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQxMS5jIGIvbXNkb3MvaW50MTEuYwppbmRleCA0ZGUzZDQxLi4wOGNlMzJkIDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQxMS5jCisrKyBiL21zZG9zL2ludDExLmMKQEAgLTIsNyArMiw2IEBACiAgKiBCSU9TIGludGVycnVwdCAxMWggaGFuZGxlcgogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKICNpbmNsdWRlICJtc2Rvcy5oIgpkaWZmIC0tZ2l0IGEvbXNkb3MvaW50MTMuYyBiL21zZG9zL2ludDEzLmMKaW5kZXggNjg3MTlkMi4uZGM0MjExOSAxMDA2NDQKLS0tIGEvbXNkb3MvaW50MTMuYworKysgYi9tc2Rvcy9pbnQxMy5jCkBAIC0yLDcgKzIsNiBAQAogICogQklPUyBpbnRlcnJ1cHQgMTNoIGhhbmRsZXIKICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL21zZG9zL2ludDE1LmMgYi9tc2Rvcy9pbnQxNS5jCmluZGV4IDdiYzljNmEuLmNhMDQ2ZDEgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDE1LmMKKysrIGIvbXNkb3MvaW50MTUuYwpAQCAtMiw3ICsyLDYgQEAKICAqIEJJT1MgaW50ZXJydXB0IDE1aCBoYW5kbGVyCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAibWlzY2VtdS5oIgogI2luY2x1ZGUgImRlYnVnLmgiCmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQxYS5jIGIvbXNkb3MvaW50MWEuYwppbmRleCAzNTBhOWE5Li4xNDM2YmIzIDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQxYS5jCisrKyBiL21zZG9zL2ludDFhLmMKQEAgLTQsNyArNCw2IEBACiAKICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIm9wdGlvbnMuaCIKICNpbmNsdWRlICJtaXNjZW11LmgiCmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQyMC5jIGIvbXNkb3MvaW50MjAuYwppbmRleCA4ZWQ2Njg0Li5lNTM4MTNhIDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQyMC5jCisrKyBiL21zZG9zL2ludDIwLmMKQEAgLTIsNyArMiw2IEBACiAgKiBET1MgaW50ZXJydXB0IDIwaCBoYW5kbGVyIChURVJNSU5BVEUgUFJPR1JBTSkKICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJtaXNjZW11LmgiCiAvKiAjZGVmaW5lIERFQlVHX0lOVCAqLwpkaWZmIC0tZ2l0IGEvbXNkb3MvaW50MjEuYyBiL21zZG9zL2ludDIxLmMKaW5kZXggYmQzYzc3Mi4uNzIzZGViMyAxMDA2NDQKLS0tIGEvbXNkb3MvaW50MjEuYworKysgYi9tc2Rvcy9pbnQyMS5jCkBAIC01LDcgKzUsNiBAQAogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzeXMvZmlsZS5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtOTIwLDkgKzkxOSw2IEBACiAJcmV0dXJuIHNlZ19MT0wrKFdPUkQpJigoRE9TX0xJU1RPRkxJU1RTKikwKS0+cHRyX2ZpcnN0X0RQQjsKIH0KIAotCi1leHRlcm4gdm9pZCBMT0NBTF9QcmludEhlYXAgKFdPUkQgZHMpOwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBET1MzQ2FsbCAgKEtFUk5FTC4xMDIpCiAgKi8KZGlmZiAtLWdpdCBhL21zZG9zL2ludDI1LmMgYi9tc2Rvcy9pbnQyNS5jCmluZGV4IDZmMTZkODguLmMyNzA5YWEgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDI1LmMKKysrIGIvbXNkb3MvaW50MjUuYwpAQCAtMiw3ICsyLDYgQEAKICAqIERPUyBpbnRlcnJ1cHQgMjVoIGhhbmRsZXIKICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxmY250bC5oPgpkaWZmIC0tZ2l0IGEvbXNkb3MvaW50MjYuYyBiL21zZG9zL2ludDI2LmMKaW5kZXggMGFkMWI0MS4uNDRjNWU4OSAxMDA2NDQKLS0tIGEvbXNkb3MvaW50MjYuYworKysgYi9tc2Rvcy9pbnQyNi5jCkBAIC0yLDcgKzIsNiBAQAogICogRE9TIGludGVycnVwdCAyNmggaGFuZGxlcgogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQyYS5jIGIvbXNkb3MvaW50MmEuYwppbmRleCBkY2FkMTczLi4xOTI0YTM1IDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQyYS5jCisrKyBiL21zZG9zL2ludDJhLmMKQEAgLTIsNyArMiw2IEBACiAgKiBET1MgaW50ZXJydXB0IDJhaCBoYW5kbGVyCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAibXNkb3MuaCIKICNpbmNsdWRlICJtaXNjZW11LmgiCmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQyZi5jIGIvbXNkb3MvaW50MmYuYwppbmRleCA3YWI4ZWRlLi40MDg3OGYxIDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQyZi5jCisrKyBiL21zZG9zL2ludDJmLmMKQEAgLTIsNyArMiw2IEBACiAgKiBET1MgaW50ZXJydXB0IDJmaCBoYW5kbGVyCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQzZC5jIGIvbXNkb3MvaW50M2QuYwppbmRleCA1N2I5OTk1Li4xMzE5MDM2IDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQzZC5jCisrKyBiL21zZG9zL2ludDNkLmMKQEAgLTMsNyArMyw2IEBACiAgKiBDb3B5cmlnaHQgMTk5NyBMZW4gV2hpdGUKICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJtc2Rvcy5oIgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKZGlmZiAtLWdpdCBhL21zZG9zL2lvcG9ydHMuYyBiL21zZG9zL2lvcG9ydHMuYwppbmRleCA0MjMzZmZmLi43Yzk0MjgwIDEwMDY0NAotLS0gYS9tc2Rvcy9pb3BvcnRzLmMKKysrIGIvbXNkb3MvaW9wb3J0cy5jCkBAIC0xMSw3ICsxMSw2IEBACiAqLwogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KQEAgLTg3LDcgKzg2LDcgQEAKIHsKIAlpbnQgdmFsLCB2YWwxLCBpLCBsZW47CiAJaWYgKCFzdHJjYXNlY21wKHRlbXAsICJhbGwiKSkgewotCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmchISEgR3JhbnRpbmcgRlVMTCBJTyBwb3J0IGFjY2VzcyB0byIKKwkJTVNHKCJXYXJuaW5nISEhIEdyYW50aW5nIEZVTEwgSU8gcG9ydCBhY2Nlc3MgdG8iCiAJCQkiIHdpbmRvemUgcHJvZ3JhbXMhXG5XYXJuaW5nISEhICIKIAkJCSIqKiogVEhJUyBJUyBOT1QgQVQgQUxMICIKIAkJCSJSRUNPTU1FTkRFRCEhISAqKipcbiIpOwpkaWZmIC0tZ2l0IGEvbXNkb3MvdnhkLmMgYi9tc2Rvcy92eGQuYwppbmRleCA2MGExMjBkLi43MDhjZDM2IDEwMDY0NAotLS0gYS9tc2Rvcy92eGQuYworKysgYi9tc2Rvcy92eGQuYwpAQCAtNCw3ICs0LDYgQEAKICAqIENvcHlyaWdodCAxOTk1IEFuYW5kIEt1bXJpYQogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJtc2Rvcy5oIgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvYXVkaW8uYyBiL211bHRpbWVkaWEvYXVkaW8uYwppbmRleCA5MmQ2ZTZlLi5jYWY2M2M2IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL2F1ZGlvLmMKKysrIGIvbXVsdGltZWRpYS9hdWRpby5jCkBAIC0xMyw3ICsxMyw2IEBACiAKICNkZWZpbmUgREVCVUdfTUNJV0FWRQogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9kc291bmQuYyBiL211bHRpbWVkaWEvZHNvdW5kLmMKaW5kZXggNGQ0YWMxYy4uNjM1MTlmYSAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9kc291bmQuYworKysgYi9tdWx0aW1lZGlhL2Rzb3VuZC5jCkBAIC0yOSw3ICsyOSw2IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KQEAgLTkzMCwzICs5MjksMjUgQEAKICAgICByZXR1cm4gU19GQUxTRTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBEaXJlY3RQbGF5TG9iYnlDcmVhdGVXIChEUExBWVguNSkKKyAqCisgKi8KK0hSRVNVTFQgV0lOQVBJIERpcmVjdFBsYXlMb2JieUNyZWF0ZVcoIExQR1VJRCBscEdVSUQsIExQRElSRUNUUExBWUxPQkJZICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVVua25vd24gKmIsIExQVk9JRCBjLCBEV09SRCBkICkKK3sKKyAgRklYTUUoZHNvdW5kLCJscEdVSUQ9JXAgYT0lcCBiPSVwIGM9JXAgZD0lMDhseCA6c3R1YlxuIixscEdVSUQsYSxiLGMsZCk7CisgIHJldHVybiBFX0ZBSUw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBEaXJlY3RQbGF5TG9iYnlDcmVhdGVBICAgKERQTEFZWC40KQorICoKKyAqLworSFJFU1VMVCBXSU5BUEkgRGlyZWN0UGxheUxvYmJ5Q3JlYXRlQSggTFBHVUlEIGxwR1VJRCwgTFBESVJFQ1RQTEFZTE9CQllBICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVVua25vd24gKmIsIExQVk9JRCBjLCBEV09SRCBkICkKK3sKKyAgRklYTUUoZHNvdW5kLCJscEdVSUQ9JXAgYT0lcCBiPSVwIGM9JXAgZD0lMDhseCA6c3R1YlxuIixscEdVSUQsYSxiLGMsZCk7CisgIHJldHVybiBFX0ZBSUw7Cit9CisKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvam95c3RpY2suYyBiL211bHRpbWVkaWEvam95c3RpY2suYwppbmRleCA3ODczZGFhLi4xMDJmMTNhIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL2pveXN0aWNrLmMKKysrIGIvbXVsdGltZWRpYS9qb3lzdGljay5jCkBAIC0xNCw3ICsxNCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWNpYW5pbS5jIGIvbXVsdGltZWRpYS9tY2lhbmltLmMKaW5kZXggZTU2ZjUwMy4uZWQ3NGRmNiAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tY2lhbmltLmMKKysrIGIvbXVsdGltZWRpYS9tY2lhbmltLmMKQEAgLTQsNyArNCw2IEBACiAgKiBDb3B5cmlnaHQgMTk5NCBNYXJ0aW4gQXlvdHRlCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21jaWNkYS5jIGIvbXVsdGltZWRpYS9tY2ljZGEuYwppbmRleCA3N2NlNDRiLi5lYTM0ZGU5IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21jaWNkYS5jCisrKyBiL211bHRpbWVkaWEvbWNpY2RhLmMKQEAgLTQsNyArNCw2IEBACiAgKiBDb3B5cmlnaHQgMTk5NCBNYXJ0aW4gQXlvdHRlCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21jaXN0cmluZy5jIGIvbXVsdGltZWRpYS9tY2lzdHJpbmcuYwppbmRleCAzMzE4ZDY1Li44MzQzMjQxIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21jaXN0cmluZy5jCisrKyBiL211bHRpbWVkaWEvbWNpc3RyaW5nLmMKQEAgLTEyLDcgKzEyLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxmY250bC5oPgpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9taWRpLmMgYi9tdWx0aW1lZGlhL21pZGkuYwppbmRleCA1YmVhODdjLi5lZWMwZjgyIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21pZGkuYworKysgYi9tdWx0aW1lZGlhL21pZGkuYwpAQCAtNCw3ICs0LDYgQEAKICAqIENvcHlyaWdodCAxOTk0IE1hcnRpbiBBeW90dGUKICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9taXhlci5jIGIvbXVsdGltZWRpYS9taXhlci5jCmluZGV4IDRiNTU0ZTYuLjFjMjllNDcgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbWl4ZXIuYworKysgYi9tdWx0aW1lZGlhL21peGVyLmMKQEAgLTQsNyArNCw2IEBACiAgKiBDb3B5cmlnaHQgMTk5NyBNYXJjdXMgTWVpc3NuZXIKICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxmY250bC5oPgpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tbWF1eC5jIGIvbXVsdGltZWRpYS9tbWF1eC5jCmluZGV4IDhkMjY3M2QuLjViYmJmODEgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbW1hdXguYworKysgYi9tdWx0aW1lZGlhL21tYXV4LmMKQEAgLTYsNyArNiw2IEBACiAKICNkZWZpbmUgRU1VTEFURV9TQjE2CiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21taW8uYyBiL211bHRpbWVkaWEvbW1pby5jCmluZGV4IDBlNjdmNDEuLjMyOTIyZWQgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbW1pby5jCisrKyBiL211bHRpbWVkaWEvbW1pby5jCkBAIC05LDcgKzksNiBAQAogICovCiAKIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbW1zeXN0ZW0uYyBiL211bHRpbWVkaWEvbW1zeXN0ZW0uYwppbmRleCBkNDAwMDBlLi4yNzVjYzE3IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21tc3lzdGVtLmMKKysrIGIvbXVsdGltZWRpYS9tbXN5c3RlbS5jCkBAIC04LDcgKzgsNiBAQAogICovCiAKICNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL3RpbWUuYyBiL211bHRpbWVkaWEvdGltZS5jCmluZGV4IGExYWUzODUuLjc0MjY2MDUgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvdGltZS5jCisrKyBiL211bHRpbWVkaWEvdGltZS5jCkBAIC00LDcgKzQsNiBAQAogICogQ29weXJpZ2h0IDE5OTMgTWFydGluIEF5b3R0ZQogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKZGlmZiAtLWdpdCBhL29iamVjdHMvYml0bWFwLmMgYi9vYmplY3RzL2JpdG1hcC5jCmluZGV4IDI0MWVhZjMuLjBhM2RiZGYgMTAwNjQ0Ci0tLSBhL29iamVjdHMvYml0bWFwLmMKKysrIGIvb2JqZWN0cy9iaXRtYXAuYwpAQCAtNCw3ICs0LDYgQEAKICAqIENvcHlyaWdodCAxOTkzIEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgInRzX3hsaWIuaCIKQEAgLTE3Niw2ICsxNzUsMTAgQEAKICAgICBibXBPYmpQdHItPmJpdG1hcC5ibVdpZHRoQnl0ZXMgPSAoSU5UMTYpQklUTUFQX1dJRFRIX0JZVEVTKCB3aWR0aCwgYnBwICk7CiAgICAgYm1wT2JqUHRyLT5iaXRtYXAuYm1CaXRzID0gTlVMTDsKIAorICAgIGJtcE9ialB0ci0+ZGliU2VjdGlvbiA9IE5VTEw7CisgICAgYm1wT2JqUHRyLT5jb2xvck1hcCA9IE5VTEw7CisgICAgYm1wT2JqUHRyLT5uQ29sb3JNYXAgPSAwOworCiAgICAgICAvKiBDcmVhdGUgdGhlIHBpeG1hcCAqLwogICAgIGJtcE9ialB0ci0+cGl4bWFwID0gVFNYQ3JlYXRlUGl4bWFwKGRpc3BsYXksIHJvb3RXaW5kb3csIHdpZHRoLCBoZWlnaHQsIGJwcCk7CiAgICAgaWYgKCFibXBPYmpQdHItPnBpeG1hcCkKQEAgLTgyNCw2ICs4MjcsMTkgQEAKICAgICAgIHNobWR0KHAtPnNpLnNobWFkZHIpOyAgLyogYWxyZWFkeSBtYXJrZWQgZm9yIGRlc3RydWN0aW9uICovCiAgICAgfQogI2VuZGlmCisKKyAgICBpZiAoYm1wLT5kaWJTZWN0aW9uKQorICAgIHsKKwlESUJTRUNUSU9OICpkaWIgPSBibXAtPmRpYlNlY3Rpb247CisKKwlpZiAoIWRpYi0+ZHNoU2VjdGlvbiAmJiBkaWItPmRzQm0uYm1CaXRzKQorCSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkaWItPmRzQm0uYm1CaXRzKTsKKworCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRpYik7CisgICAgfQorICAgIGlmIChibXAtPmNvbG9yTWFwKQorCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGJtcC0+Y29sb3JNYXApOworCiAgICAgcmV0dXJuIEdESV9GcmVlT2JqZWN0KCBoYml0bWFwICk7CiB9CiAKQEAgLTgzMyw5ICs4NDksMTcgQEAKICAqLwogSU5UMTYgQklUTUFQX0dldE9iamVjdDE2KCBCSVRNQVBPQkogKiBibXAsIElOVDE2IGNvdW50LCBMUFZPSUQgYnVmZmVyICkKIHsKLSAgICBpZiAoY291bnQgPiBzaXplb2YoYm1wLT5iaXRtYXApKSBjb3VudCA9IHNpemVvZihibXAtPmJpdG1hcCk7Ci0gICAgbWVtY3B5KCBidWZmZXIsICZibXAtPmJpdG1hcCwgY291bnQgKTsKLSAgICByZXR1cm4gY291bnQ7CisgICAgaWYgKGJtcC0+ZGliU2VjdGlvbikKKyAgICB7CisJRklYTUUoYml0bWFwLCAibm90IGltcGxlbWVudGVkIGZvciBESUJzXG4iKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlpZiAoY291bnQgPiBzaXplb2YoYm1wLT5iaXRtYXApKSBjb3VudCA9IHNpemVvZihibXAtPmJpdG1hcCk7CisJbWVtY3B5KCBidWZmZXIsICZibXAtPmJpdG1hcCwgY291bnQgKTsKKwlyZXR1cm4gY291bnQ7CisgICAgfQogfQogICAgIAogCkBAIC04NDQsMTcgKzg2OCwzNCBAQAogICovCiBJTlQzMiBCSVRNQVBfR2V0T2JqZWN0MzIoIEJJVE1BUE9CSiAqIGJtcCwgSU5UMzIgY291bnQsIExQVk9JRCBidWZmZXIgKQogewotICAgIEJJVE1BUDMyIGJtcDMyOwotICAgIGJtcDMyLmJtVHlwZSAgICAgICA9IGJtcC0+Yml0bWFwLmJtVHlwZTsKLSAgICBibXAzMi5ibVdpZHRoICAgICAgPSBibXAtPmJpdG1hcC5ibVdpZHRoOwotICAgIGJtcDMyLmJtSGVpZ2h0ICAgICA9IGJtcC0+Yml0bWFwLmJtSGVpZ2h0OwotICAgIGJtcDMyLmJtV2lkdGhCeXRlcyA9IGJtcC0+Yml0bWFwLmJtV2lkdGhCeXRlczsKLSAgICBibXAzMi5ibVBsYW5lcyAgICAgPSBibXAtPmJpdG1hcC5ibVBsYW5lczsKLSAgICBibXAzMi5ibUJpdHNQaXhlbCAgPSBibXAtPmJpdG1hcC5ibUJpdHNQaXhlbDsKLSAgICBibXAzMi5ibUJpdHMgICAgICAgPSBOVUxMOwotICAgIGlmIChjb3VudCA+IHNpemVvZihibXAzMikpIGNvdW50ID0gc2l6ZW9mKGJtcDMyKTsKLSAgICBtZW1jcHkoIGJ1ZmZlciwgJmJtcDMyLCBjb3VudCApOwotICAgIHJldHVybiBjb3VudDsKKyAgICBpZiAoYm1wLT5kaWJTZWN0aW9uKQorICAgIHsKKwlpZiAoY291bnQgPCBzaXplb2YoRElCU0VDVElPTikpCisJeworCSAgICBpZiAoY291bnQgPiBzaXplb2YoQklUTUFQMzIpKSBjb3VudCA9IHNpemVvZihCSVRNQVAzMik7CisJfQorCWVsc2UKKwl7CisJICAgIGlmIChjb3VudCA+IHNpemVvZihESUJTRUNUSU9OKSkgY291bnQgPSBzaXplb2YoRElCU0VDVElPTik7CisJfQorCisJbWVtY3B5KCBidWZmZXIsIGJtcC0+ZGliU2VjdGlvbiwgY291bnQgKTsKKwlyZXR1cm4gY291bnQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJQklUTUFQMzIgYm1wMzI7CisJYm1wMzIuYm1UeXBlICAgICAgID0gYm1wLT5iaXRtYXAuYm1UeXBlOworCWJtcDMyLmJtV2lkdGggICAgICA9IGJtcC0+Yml0bWFwLmJtV2lkdGg7CisJYm1wMzIuYm1IZWlnaHQgICAgID0gYm1wLT5iaXRtYXAuYm1IZWlnaHQ7CisJYm1wMzIuYm1XaWR0aEJ5dGVzID0gYm1wLT5iaXRtYXAuYm1XaWR0aEJ5dGVzOworCWJtcDMyLmJtUGxhbmVzICAgICA9IGJtcC0+Yml0bWFwLmJtUGxhbmVzOworCWJtcDMyLmJtQml0c1BpeGVsICA9IGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsOworCWJtcDMyLmJtQml0cyAgICAgICA9IE5VTEw7CisJaWYgKGNvdW50ID4gc2l6ZW9mKGJtcDMyKSkgY291bnQgPSBzaXplb2YoYm1wMzIpOworCW1lbWNweSggYnVmZmVyLCAmYm1wMzIsIGNvdW50ICk7CisJcmV0dXJuIGNvdW50OworICAgIH0KIH0KICAgICAKIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9jbGlwcGluZy5jIGIvb2JqZWN0cy9jbGlwcGluZy5jCmluZGV4IDcwMjVkNzQuLmFjNzExOWUgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY2xpcHBpbmcuYworKysgYi9vYmplY3RzL2NsaXBwaW5nLmMKQEAgLTQsNyArNCw2IEBACiAgKiBDb3B5cmlnaHQgMTk5MyBBbGV4YW5kcmUgSnVsbGlhcmQKICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJkYy5oIgogI2luY2x1ZGUgIm1ldGFmaWxlLmgiCiAjaW5jbHVkZSAicmVnaW9uLmgiCmRpZmYgLS1naXQgYS9vYmplY3RzL2NvbG9yLmMgYi9vYmplY3RzL2NvbG9yLmMKaW5kZXggNTA3NzlkYy4uNjQ4N2FkYiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9jb2xvci5jCisrKyBiL29iamVjdHMvY29sb3IuYwpAQCAtNyw3ICs3LDYgQEAKIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgInRzX3hsaWIuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCmRpZmYgLS1naXQgYS9vYmplY3RzL2N1cnNvcmljb24uYyBiL29iamVjdHMvY3Vyc29yaWNvbi5jCmluZGV4IDc0ZGE0NzcuLjQzOTY2MGYgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY3Vyc29yaWNvbi5jCisrKyBiL29iamVjdHMvY3Vyc29yaWNvbi5jCkBAIC00Miw5ICs0Miw3IEBACiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJrZXlib2FyZC5oIgotCi1leHRlcm4gVUlOVDE2IENPTE9SX0dldFN5c3RlbVBhbGV0dGVTaXplKCk7Ci1leHRlcm4gdm9pZCBfWEluaXRJbWFnZUZ1bmNQdHJzKFhJbWFnZSAqKTsKKyNpbmNsdWRlICJ4MTFkcnYuaCIKIAogQ3Vyc29yIENVUlNPUklDT05fWEN1cnNvciA9IE5vbmU7ICAgIC8qIEN1cnJlbnQgWCBjdXJzb3IgKi8KIHN0YXRpYyBIQ1VSU09SMzIgaEFjdGl2ZUN1cnNvciA9IDA7ICAvKiBBY3RpdmUgY3Vyc29yICovCmRpZmYgLS1naXQgYS9vYmplY3RzL2RjLmMgYi9vYmplY3RzL2RjLmMKaW5kZXggZjYwOGIwOS4uODBhNWI5NCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9kYy5jCisrKyBiL29iamVjdHMvZGMuYwpAQCAtNyw2ICs3LDcgQEAKIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImRjLmgiCiAjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIm1ldGFmaWxlLmgiCkBAIC0xNiw5ICsxNyw2IEBACiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJ4MTFmb250LmgiCiAKLWV4dGVybiB2b2lkIENMSVBQSU5HX1VwZGF0ZUdDUmVnaW9uKCBEQyAqIGRjICk7ICAgICAvKiBvYmplY3RzL2NsaXBwaW5nLmMgKi8KLQotCiAgIC8qIFJPUCBjb2RlIHRvIEdDIGZ1bmN0aW9uIGNvbnZlcnNpb24gKi8KIGNvbnN0IGludCBEQ19YUk9QZnVuY3Rpb25bMTZdID0KIHsKZGlmZiAtLWdpdCBhL29iamVjdHMvZGliLmMgYi9vYmplY3RzL2RpYi5jCmluZGV4IGE1YWU2ZTMuLmU0MWVkZWIgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZGliLmMKKysrIGIvb2JqZWN0cy9kaWIuYwpAQCAtNCw3ICs0LDYgQEAKICAqIENvcHlyaWdodCAxOTkzLDE5OTQgIEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgInRzX3hsaWIuaCIKICNpbmNsdWRlICJ0c194dXRpbC5oIgpAQCAtMTUsOCArMTQsNiBAQAogI2luY2x1ZGUgImNvbG9yLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotZXh0ZXJuIHZvaWQgQ0xJUFBJTkdfVXBkYXRlR0NSZWdpb24oREMqICk7Ci0KIHN0YXRpYyBpbnQgYml0bWFwRGVwdGhUYWJsZVtdID0geyA4LCAxLCAzMiwgMTYsIDI0LCAxNSwgNCwgMCB9Owogc3RhdGljIGludCB4aW1hZ2VEZXB0aFRhYmxlW10gPSB7IDAsIDAsIDAsICAwLCAgMCwgIDAsICAwIH07CiAKQEAgLTMwLDggKzI3LDkgQEAKICAgICBEV09SRCAgICAgICAgICAgICBpbmZvV2lkdGg7CiAgICAgV09SRCAgICAgICAgICAgICAgZGVwdGg7CiAgICAgV09SRCAgICAgICAgICAgICAgaW5mb0JwcDsKLSAgICBjb25zdCBCSVRNQVBJTkZPICppbmZvOwotICAgIFdPUkQgICAgICAgICAgICAgIGNvbG9ydXNlOworICAgIFdPUkQgICAgICAgICAgICAgIGNvbXByZXNzaW9uOworICAgIFJHQlFVQUQgICAgICAgICAgKmNvbG9yTWFwOworICAgIGludCAgICAgICAgICAgICAgIG5Db2xvck1hcDsKICAgICBEcmF3YWJsZSAgICAgICAgICBkcmF3YWJsZTsKICAgICBHQyAgICAgICAgICAgICAgICBnYzsKICAgICBpbnQgICAgICAgICAgICAgICB4U3JjOwpAQCAtMTQ1LDEzICsxNDMsMTQgQEAKICAqIFJldHVybiAxIGZvciBJTkZPSEVBREVSLCAwIGZvciBDT1JFSEVBREVSLCAtMSBmb3IgZXJyb3IuCiAgKi8KIHN0YXRpYyBpbnQgRElCX0dldEJpdG1hcEluZm8oIGNvbnN0IEJJVE1BUElORk9IRUFERVIgKmhlYWRlciwgRFdPUkQgKndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpoZWlnaHQsIFdPUkQgKmJwcCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmhlaWdodCwgV09SRCAqYnBwLCBXT1JEICpjb21wciApCiB7CiAgICAgaWYgKGhlYWRlci0+YmlTaXplID09IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSkKICAgICB7CiAgICAgICAgICp3aWR0aCAgPSBoZWFkZXItPmJpV2lkdGg7CiAgICAgICAgICpoZWlnaHQgPSBoZWFkZXItPmJpSGVpZ2h0OwogICAgICAgICAqYnBwICAgID0gaGVhZGVyLT5iaUJpdENvdW50OworICAgICAgICAqY29tcHIgID0gaGVhZGVyLT5iaUNvbXByZXNzaW9uOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAgICAgaWYgKGhlYWRlci0+YmlTaXplID09IHNpemVvZihCSVRNQVBDT1JFSEVBREVSKSkKQEAgLTE2MCw2ICsxNTksNyBAQAogICAgICAgICAqd2lkdGggID0gY29yZS0+YmNXaWR0aDsKICAgICAgICAgKmhlaWdodCA9IGNvcmUtPmJjSGVpZ2h0OwogICAgICAgICAqYnBwICAgID0gY29yZS0+YmNCaXRDb3VudDsKKyAgICAgICAgKmNvbXByICA9IDA7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBXQVJOKGJpdG1hcCwgIiglbGQpOiB3cm9uZyBzaXplIGZvciBoZWFkZXJcbiIsIGhlYWRlci0+YmlTaXplICk7CkBAIC0xNzEsMTUgKzE3MSwxNSBAQAogICogICAgICAgICAgIERJQl9CdWlsZENvbG9yTWFwCiAgKgogICogQnVpbGQgdGhlIGNvbG9yIG1hcCBmcm9tIHRoZSBiaXRtYXAgcGFsZXR0ZS4gU2hvdWxkIG5vdCBiZSBjYWxsZWQKLSAqIGZvciBhIDI0LWJpdCBkZWVwIGJpdG1hcC4KKyAqIGZvciBhID44LWJpdCBkZWVwIGJpdG1hcC4KICAqLwotc3RhdGljIGludCAqRElCX0J1aWxkQ29sb3JNYXAoIERDICpkYywgV09SRCBjb2xvcnVzZSwgV09SRCBkZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSVRNQVBJTkZPICppbmZvICkKK3N0YXRpYyBSR0JRVUFEICpESUJfQnVpbGRDb2xvck1hcCggY29uc3QgQklUTUFQSU5GTyAqaW5mbywgCisJCQkJICAgSFBBTEVUVEUxNiBoUGFsZXR0ZSwgaW50ICpuQ29sb3JzICkKIHsKICAgICBpbnQgaSwgY29sb3JzOwogICAgIEJPT0wzMiBpc0luZm87CiAgICAgV09SRCAqY29sb3JQdHI7Ci0gICAgaW50ICpjb2xvck1hcHBpbmc7CisgICAgUkdCUVVBRCAqY29sb3JNYXBwaW5nOwogCiAgICAgaWYgKChpc0luZm8gPSAoaW5mby0+Ym1pSGVhZGVyLmJpU2l6ZSA9PSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpKSkKICAgICB7CkBAIC0xOTIsNDUgKzE5Miw5MCBAQAogICAgICAgICBjb2xvcnMgPSAxIDw8ICgoQklUTUFQQ09SRUhFQURFUiAqKSZpbmZvLT5ibWlIZWFkZXIpLT5iY0JpdENvdW50OwogICAgICAgICBjb2xvclB0ciA9IChXT1JEICopKChCSVRNQVBDT1JFSU5GTyAqKWluZm8pLT5ibWNpQ29sb3JzOwogICAgIH0KLSAgICBpZiAoIShjb2xvck1hcHBpbmcgPSAoaW50ICopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnMgKiBzaXplb2YoaW50KSApKSkgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoY29sb3J1c2UgPT0gRElCX1JHQl9DT0xPUlMpCisgICAgaWYgKGNvbG9ycyA+IDI1NikKKyAgICB7CisgICAgICAgIEVSUihiaXRtYXAsICJESUJfQnVpbGRDb2xvck1hcCBjYWxsZWQgd2l0aCA+MjU2IGNvbG9ycyFcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIShjb2xvck1hcHBpbmcgPSAoUkdCUVVBRCAqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycyAqIHNpemVvZihSR0JRVUFEKSApKSkgCisJcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoaFBhbGV0dGUgPT0gMCkgLyogRElCX1JHQl9DT0xPUlMgKi8KICAgICB7CiAgICAgICAgIGlmIChpc0luZm8pCiAgICAgICAgIHsKICAgICAgICAgICAgIFJHQlFVQUQgKiByZ2IgPSAoUkdCUVVBRCAqKWNvbG9yUHRyOwotICAgICAgICAKLSAgICAgICAgICAgIGlmIChkZXB0aCA9PSAxKSAgLyogTW9ub2Nocm9tZSAqLwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2xvcnM7IGkrKywgcmdiKyspCi0gICAgICAgICAgICAgICAgICAgIGNvbG9yTWFwcGluZ1tpXSA9IChyZ2ItPnJnYlJlZCArIHJnYi0+cmdiR3JlZW4gKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYi0+cmdiQmx1ZSA+IDI1NSozLzIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2xvcnM7IGkrKywgcmdiKyspCi0gICAgICAgICAgICAgICAgICAgIGNvbG9yTWFwcGluZ1tpXSA9IENPTE9SX1RvUGh5c2ljYWwoIGRjLCBSR0IocmdiLT5yZ2JSZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiLT5yZ2JHcmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2ItPnJnYkJsdWUpKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbG9yczsgaSsrLCByZ2IrKykKKyAgICAgICAgICAgICAgICBjb2xvck1hcHBpbmdbaV0gPSAqcmdiOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgUkdCVFJJUExFICogcmdiID0gKFJHQlRSSVBMRSAqKWNvbG9yUHRyOwogICAgICAgICAKLSAgICAgICAgICAgIGlmIChkZXB0aCA9PSAxKSAgLyogTW9ub2Nocm9tZSAqLwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2xvcnM7IGkrKywgcmdiKyspCi0gICAgICAgICAgICAgICAgICAgIGNvbG9yTWFwcGluZ1tpXSA9IChyZ2ItPnJnYnRSZWQgKyByZ2ItPnJnYnRHcmVlbiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiLT5yZ2J0Qmx1ZSA+IDI1NSozLzIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2xvcnM7IGkrKywgcmdiKyspCi0gICAgICAgICAgICAgICAgICAgIGNvbG9yTWFwcGluZ1tpXSA9IENPTE9SX1RvUGh5c2ljYWwoIGRjLCBSR0IocmdiLT5yZ2J0UmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiLT5yZ2J0R3JlZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2ItPnJnYnRCbHVlKSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29sb3JzOyBpKyssIHJnYisrKQorICAgICAgICAgICAgICAgIGNvbG9yTWFwcGluZ1tpXS5yZ2JSZWQgICA9IHJnYi0+cmdidFJlZCwKKyAgICAgICAgICAgICAgICBjb2xvck1hcHBpbmdbaV0ucmdiR3JlZW4gPSByZ2ItPnJnYnRHcmVlbiwKKyAgICAgICAgICAgICAgICBjb2xvck1hcHBpbmdbaV0ucmdiQmx1ZSAgPSByZ2ItPnJnYnRCbHVlOwogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgIC8qIERJQl9QQUxfQ09MT1JTICovCiAgICAgeworCVBBTEVUVEVPQkogKnBhbFB0ciA9IChQQUxFVFRFT0JKICopR0RJX0dldE9ialB0cihoUGFsZXR0ZSwgUEFMRVRURV9NQUdJQyk7CisJaWYgKCFwYWxQdHIpIAorCXsKKwkgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY29sb3JNYXBwaW5nKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb2xvcnM7IGkrKywgY29sb3JQdHIrKykKLSAgICAgICAgICAgIGNvbG9yTWFwcGluZ1tpXSA9IENPTE9SX1RvUGh5c2ljYWwoIGRjLCBQQUxFVFRFSU5ERVgoKmNvbG9yUHRyKSApOworCSAgICBpZiAoKmNvbG9yUHRyID49IHBhbFB0ci0+bG9ncGFsZXR0ZS5wYWxOdW1FbnRyaWVzKQorCSAgICB7CisJCWNvbG9yTWFwcGluZ1tpXS5yZ2JSZWQgICA9IDA7CisJCWNvbG9yTWFwcGluZ1tpXS5yZ2JHcmVlbiA9IDA7CisJCWNvbG9yTWFwcGluZ1tpXS5yZ2JCbHVlICA9IDA7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCVBBTEVUVEVFTlRSWSAqcGUgPSBwYWxQdHItPmxvZ3BhbGV0dGUucGFsUGFsRW50cnkgKyAqY29sb3JQdHI7CisJCWNvbG9yTWFwcGluZ1tpXS5yZ2JSZWQgICA9IHBlLT5wZVJlZDsKKwkJY29sb3JNYXBwaW5nW2ldLnJnYkdyZWVuID0gcGUtPnBlR3JlZW47CisJCWNvbG9yTWFwcGluZ1tpXS5yZ2JCbHVlICA9IHBlLT5wZUJsdWU7CisJICAgIH0KKwkKKwlHRElfSEVBUF9VTkxPQ0soaFBhbGV0dGUpOwogICAgIH0KKworICAgICpuQ29sb3JzID0gY29sb3JzOworICAgIHJldHVybiBjb2xvck1hcHBpbmc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERJQl9QaHlzaWNhbENvbG9yTWFwCisgKgorICogVHJhbnNsYXRlIGNvbG9yIG1hcCB0byBwaHlzaWNhbCBjb2xvcnMKKyAqLworc3RhdGljIGludCAqRElCX1BoeXNpY2FsQ29sb3JNYXAoIERDICpkYywgaW50IGRlcHRoLCAKKwkJCQkgIFJHQlFVQUQgKmNvbG9yTWFwLCBpbnQgbkNvbG9yTWFwKQoreworICAgIGludCAqY29sb3JNYXBwaW5nLCBpOworCisgICAgaWYgKCFuQ29sb3JNYXApIHJldHVybiBOVUxMOworICAgIGlmICghKGNvbG9yTWFwcGluZyA9IChpbnQgKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Db2xvck1hcCAqIHNpemVvZihpbnQpICkpKSByZXR1cm4gTlVMTDsKKworICAgIGlmIChkZXB0aCA9PSAxKSAvKiBNb25vY2hyb21lICovCisJZm9yIChpID0gMDsgaSA8IG5Db2xvck1hcDsgaSsrLCBjb2xvck1hcCsrKQorCSAgICBjb2xvck1hcHBpbmdbaV0gPSAoY29sb3JNYXAtPnJnYlJlZCArIGNvbG9yTWFwLT5yZ2JHcmVlbiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTWFwLT5yZ2JCbHVlID4gMjU1KjMvMik7CisgICAgZWxzZQorCWZvciAoaSA9IDA7IGkgPCBuQ29sb3JNYXA7IGkrKywgY29sb3JNYXArKykKKyAgICAgICAgICAgIGNvbG9yTWFwcGluZ1tpXSA9IENPTE9SX1RvUGh5c2ljYWwoIGRjLCBSR0IoY29sb3JNYXAtPnJnYlJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JNYXAtPnJnYkdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvck1hcC0+cmdiQmx1ZSkpOwogICAgIHJldHVybiBjb2xvck1hcHBpbmc7CiB9CiAKQEAgLTc3MSwxNyArODE2LDEzIEBACiB7CiAgICAgaW50ICpjb2xvck1hcHBpbmc7CiAgICAgWEltYWdlICpibXBJbWFnZTsKLSAgICBEV09SRCBjb21wcmVzc2lvbiA9IDA7CiAgICAgaW50IGxpbmVzOwogCi0gICAgaWYgKGRlc2NyLT5pbmZvLT5ibWlIZWFkZXIuYmlTaXplID09IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSkKLSAgICAgICAgY29tcHJlc3Npb24gPSBkZXNjci0+aW5mby0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb247Ci0KLSAgICAgIC8qIEJ1aWxkIHRoZSBjb2xvciBtYXBwaW5nIHRhYmxlICovCisgICAgICAvKiBUcmFuc2xhdGUgdGhlIGNvbG9yIG1hcHBpbmcgdGFibGUgKi8KIAogICAgIGlmIChkZXNjci0+aW5mb0JwcCA+IDgpIGNvbG9yTWFwcGluZyA9IE5VTEw7Ci0gICAgZWxzZSBpZiAoIShjb2xvck1hcHBpbmcgPSBESUJfQnVpbGRDb2xvck1hcCggZGVzY3ItPmRjLCBkZXNjci0+Y29sb3J1c2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmRlcHRoLCBkZXNjci0+aW5mbyApKSkKKyAgICBlbHNlIGlmICghKGNvbG9yTWFwcGluZyA9IERJQl9QaHlzaWNhbENvbG9yTWFwKCBkZXNjci0+ZGMsIGRlc2NyLT5kZXB0aCwKKwkJCQkJCSAgICBkZXNjci0+Y29sb3JNYXAsIGRlc2NyLT5uQ29sb3JNYXAgKSkpCiAgICAgICAgIHJldHVybiAwOwogCiAgICAgaWYoIGRlc2NyLT5kYy0+dy5mbGFncyAmIERDX0RJUlRZICkgQ0xJUFBJTkdfVXBkYXRlR0NSZWdpb24oZGVzY3ItPmRjKTsKQEAgLTc5OCwxNCArODM5LDE0IEBACiAJCQkgICAgZGVzY3ItPndpZHRoLCBkZXNjci0+eFNyYywgY29sb3JNYXBwaW5nLCBibXBJbWFnZSApOwogCWJyZWFrOwogICAgIGNhc2UgNDoKLQlpZiAoY29tcHJlc3Npb24pIERJQl9TZXRJbWFnZUJpdHNfUkxFNCggZGVzY3ItPmxpbmVzLCBkZXNjci0+Yml0cywKKwlpZiAoZGVzY3ItPmNvbXByZXNzaW9uKSBESUJfU2V0SW1hZ2VCaXRzX1JMRTQoIGRlc2NyLT5saW5lcywgZGVzY3ItPmJpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci0+aW5mb1dpZHRoLCBkZXNjci0+d2lkdGgsIGRlc2NyLT54U3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JNYXBwaW5nLCBibXBJbWFnZSApOwogCWVsc2UgRElCX1NldEltYWdlQml0c180KCBkZXNjci0+bGluZXMsIGRlc2NyLT5iaXRzLCBkZXNjci0+aW5mb1dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPndpZHRoLCBkZXNjci0+eFNyYywgY29sb3JNYXBwaW5nLCBibXBJbWFnZSApOwogCWJyZWFrOwogICAgIGNhc2UgODoKLQlpZiAoY29tcHJlc3Npb24pIERJQl9TZXRJbWFnZUJpdHNfUkxFOCggZGVzY3ItPmxpbmVzLCBkZXNjci0+Yml0cywKKwlpZiAoZGVzY3ItPmNvbXByZXNzaW9uKSBESUJfU2V0SW1hZ2VCaXRzX1JMRTgoIGRlc2NyLT5saW5lcywgZGVzY3ItPmJpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci0+aW5mb1dpZHRoLCBkZXNjci0+d2lkdGgsIGRlc2NyLT54U3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JNYXBwaW5nLCBibXBJbWFnZSApOwogCWVsc2UgRElCX1NldEltYWdlQml0c184KCBkZXNjci0+bGluZXMsIGRlc2NyLT5iaXRzLCBkZXNjci0+aW5mb1dpZHRoLApAQCAtOTI1LDcgKzk2Niw3IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBpZiAoRElCX0dldEJpdG1hcEluZm8oICZpbmZvLT5ibWlIZWFkZXIsICZkZXNjci5pbmZvV2lkdGgsICZoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzY3IuaW5mb0JwcCApID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyLmluZm9CcHAsICZkZXNjci5jb21wcmVzc2lvbiApID09IC0xKQogICAgIHsKICAgICAgICAgR0RJX0hFQVBfVU5MT0NLKCBoYml0bWFwICk7CiAgICAgICAgIEdESV9IRUFQX1VOTE9DSyggaGRjICk7CkBAIC05NDEsMTEgKzk4MiwyNSBAQAogICAgIH0KICAgICBpZiAoc3RhcnRzY2FuICsgbGluZXMgPiBoZWlnaHQpIGxpbmVzID0gaGVpZ2h0IC0gc3RhcnRzY2FuOwogCisgICAgaWYgKGRlc2NyLmluZm9CcHAgPD0gOCkKKyAgICB7CisgICAgICAgIGRlc2NyLmNvbG9yTWFwID0gRElCX0J1aWxkQ29sb3JNYXAoIGluZm8sIGNvbG9ydXNlID09IERJQl9QQUxfQ09MT1JTPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci5kYy0+dy5oUGFsZXR0ZSA6IDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzY3IubkNvbG9yTWFwKTsKKworICAgICAgICBpZiAoIWRlc2NyLmNvbG9yTWFwKQorICAgICAgICB7CisgICAgICAgICAgICBHRElfSEVBUF9VTkxPQ0soIGhiaXRtYXAgKTsKKyAgICAgICAgICAgIEdESV9IRUFQX1VOTE9DSyggaGRjICk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSAKKyAgICB9CisKKworCiAgICAgZGVzY3IuYml0cyAgICAgID0gYml0czsKICAgICBkZXNjci5saW5lcyAgICAgPSB0bXBoZWlnaHQgPj0gMCA/IGxpbmVzIDogLWxpbmVzOwogICAgIGRlc2NyLmRlcHRoICAgICA9IGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsOwotICAgIGRlc2NyLmluZm8gICAgICA9IGluZm87Ci0gICAgZGVzY3IuY29sb3J1c2UgID0gY29sb3J1c2U7CiAgICAgZGVzY3IuZHJhd2FibGUgID0gYm1wLT5waXhtYXA7CiAgICAgZGVzY3IuZ2MgICAgICAgID0gQklUTUFQX0dDKGJtcCk7CiAgICAgZGVzY3IueFNyYyAgICAgID0gMDsKQEAgLTk1OSw2ICsxMDE0LDggQEAKICAgICByZXN1bHQgPSBDQUxMX0xBUkdFX1NUQUNLKCBESUJfU2V0SW1hZ2VCaXRzLCAmZGVzY3IgKTsKICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogCisgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGVzY3IuY29sb3JNYXApOworCiAgICAgR0RJX0hFQVBfVU5MT0NLKCBoZGMgKTsKICAgICBHRElfSEVBUF9VTkxPQ0soIGhiaXRtYXAgKTsKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTAwMCw4ICsxMDU3LDggQEAKIAlkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoaGRjLCBNRVRBRklMRV9EQ19NQUdJQyk7CiAJaWYgKCFkYykgcmV0dXJuIDA7CiAgICAgfQotICAgIGlmIChESUJfR2V0Qml0bWFwSW5mbyggJmluZm8tPmJtaUhlYWRlciwgJndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCwgJmRlc2NyLmluZm9CcHAgKSA9PSAtMSkKKyAgICBpZiAoRElCX0dldEJpdG1hcEluZm8oICZpbmZvLT5ibWlIZWFkZXIsICZ3aWR0aCwgJmhlaWdodCwgCisJCQkgICAmZGVzY3IuaW5mb0JwcCwgJmRlc2NyLmNvbXByZXNzaW9uICkgPT0gLTEpCiAgICAgICAgIHJldHVybiAwOwogICAgIHRtcGhlaWdodCA9IGhlaWdodDsKICAgICBpZiAoaGVpZ2h0IDwgMCkgaGVpZ2h0ID0gLWhlaWdodDsKQEAgLTEwMTcsMTMgKzEwNzQsMjEgQEAKICAgICBEQ19TZXR1cEdDRm9yVGV4dCggZGMgKTsgIC8qIFRvIGhhdmUgdGhlIGNvcnJlY3QgY29sb3JzICovCiAgICAgVFNYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjLT51LnguZ2MsIERDX1hST1BmdW5jdGlvbltkYy0+dy5ST1Btb2RlLTFdICk7CiAKKyAgICBpZiAoZGVzY3IuaW5mb0JwcCA8PSA4KQorICAgIHsKKyAgICAgICAgZGVzY3IuY29sb3JNYXAgPSBESUJfQnVpbGRDb2xvck1hcCggaW5mbywgY29sb3J1c2UgPT0gRElCX1BBTF9DT0xPUlM/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyLmRjLT53LmhQYWxldHRlIDogMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjci5uQ29sb3JNYXAgKTsKKworICAgICAgICBpZiAoIWRlc2NyLmNvbG9yTWFwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCiAgICAgZGVzY3IuZGMgICAgICAgID0gZGM7CiAgICAgZGVzY3IuYml0cyAgICAgID0gYml0czsKICAgICBkZXNjci5saW5lcyAgICAgPSB0bXBoZWlnaHQgPj0gMCA/IGxpbmVzIDogLWxpbmVzOwogICAgIGRlc2NyLmluZm9XaWR0aCA9IHdpZHRoOwogICAgIGRlc2NyLmRlcHRoICAgICA9IGRjLT53LmJpdHNQZXJQaXhlbDsKLSAgICBkZXNjci5pbmZvICAgICAgPSBpbmZvOwotICAgIGRlc2NyLmNvbG9ydXNlICA9IGNvbG9ydXNlOwogICAgIGRlc2NyLmRyYXdhYmxlICA9IGRjLT51LnguZHJhd2FibGU7CiAgICAgZGVzY3IuZ2MgICAgICAgID0gZGMtPnUueC5nYzsKICAgICBkZXNjci54U3JjICAgICAgPSB4U3JjOwpAQCAtMTAzNiw2ICsxMTAxLDggQEAKICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJlgxMURSVl9Dcml0U2VjdGlvbiApOwogICAgIHJlc3VsdCA9IENBTExfTEFSR0VfU1RBQ0soIERJQl9TZXRJbWFnZUJpdHMsICZkZXNjciApOwogICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CisKKyAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkZXNjci5jb2xvck1hcCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTE2MSw3ICsxMjI4LDcgQEAKICAgICBQQUxFVFRFT0JKICogcGFsZXR0ZTsKICAgICBYSW1hZ2UgKiBibXBJbWFnZTsKICAgICBpbnQgaSwgeCwgeTsKLSAgICAgICAgCisKICAgICBpZiAoIWxpbmVzKSByZXR1cm4gMDsKICAgICBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7CiAgICAgaWYgKCFkYykgCkBAIC0xMTkzLDcgKzEyNjAsNyBAQAogCSAgICBlbHNlICgoV09SRCAqKWluZm8tPmJtaUNvbG9ycylbaV0gPSAoV09SRClpOwogCX0KICAgICB9Ci0gICAgCisKICAgICBpZiAoYml0cykKICAgICB7CQogCUJZVEUqCWJiaXRzID0gYml0czsKQEAgLTEzNjcsOCArMTQzNCw5IEBACiAgICAgRFdPUkQgd2lkdGg7CiAgICAgaW50IGhlaWdodDsKICAgICBXT1JEIGJwcDsKKyAgICBXT1JEIGNvbXByOwogCi0gICAgaWYgKERJQl9HZXRCaXRtYXBJbmZvKCBoZWFkZXIsICZ3aWR0aCwgJmhlaWdodCwgJmJwcCApID09IC0xKSByZXR1cm4gMDsKKyAgICBpZiAoRElCX0dldEJpdG1hcEluZm8oIGhlYWRlciwgJndpZHRoLCAmaGVpZ2h0LCAmYnBwLCAmY29tcHIgKSA9PSAtMSkgcmV0dXJuIDA7CiAgICAgaWYgKGhlaWdodCA8IDApIGhlaWdodCA9IC1oZWlnaHQ7CiAKICAgICAvKiBDaGVjayBpZiB3ZSBzaG91bGQgY3JlYXRlIGEgbW9ub2Nocm9tZSBvciBjb2xvciBiaXRtYXAuICovCkBAIC0xNDE1LDcgKzE0ODMsNyBAQAogCiAgICAgLyogTm93IGNyZWF0ZSB0aGUgYml0bWFwICovCiAKLSAgICBoYW5kbGUgPSBmQ29sb3IgPyBDcmVhdGVDb21wYXRpYmxlQml0bWFwMzIoIGhkYywgd2lkdGgsIGhlaWdodCApIDoKKyAgICBoYW5kbGUgPSBmQ29sb3IgPyBDcmVhdGVCaXRtYXAzMiggd2lkdGgsIGhlaWdodCwgMSwgc2NyZWVuRGVwdGgsIE5VTEwgKSA6CiAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQml0bWFwMzIoIHdpZHRoLCBoZWlnaHQsIDEsIDEsIE5VTEwgKTsKICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIDA7CiAKQEAgLTE0MzEsNyArMTQ5OSw3IEBACiAJCQkJICAgICBMUFZPSUQgKipiaXRzLCBIQU5ETEUxNiBzZWN0aW9uLAogCQkJCSAgICAgRFdPUkQgb2Zmc2V0KQogewotICByZXR1cm4gQ3JlYXRlRElCU2VjdGlvbjMyIChoZGMsIGJtaSwgdXNhZ2UsIGJpdHMsIHNlY3Rpb24sIG9mZnNldCk7CisgICAgcmV0dXJuIENyZWF0ZURJQlNlY3Rpb24zMihoZGMsIGJtaSwgdXNhZ2UsIGJpdHMsIHNlY3Rpb24sIG9mZnNldCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTQ0MSwzNSArMTUwOSwxNzMgQEAKIAkJCQkgICAgIExQVk9JRCAqKmJpdHMsSEFORExFMzIgc2VjdGlvbiwKIAkJCQkgICAgIERXT1JEIG9mZnNldCkKIHsKLSAgSEJJVE1BUDMyIHJlcyA9IDA7CisgICAgSEJJVE1BUDMyIHJlcyA9IDA7CisgICAgQklUTUFQT0JKICpibXAgPSBOVUxMOworICAgIERJQlNFQ1RJT04gKmRpYiA9IE5VTEw7CisgICAgUkdCUVVBRCAqY29sb3JNYXAgPSBOVUxMOworICAgIGludCBuQ29sb3JNYXA7CiAKLSAgRklYTUUoYml0bWFwLAotCSAgIiglZCxbdz0lbGQsaD0lbGRdLCVkLCVwLDB4JTA4eCwlbGQpLHNlbWlzdHViXG4iLAotCSAgaGRjLGJtaS0+Ym1pSGVhZGVyLmJpV2lkdGgsYm1pLT5ibWlIZWFkZXIuYmlIZWlnaHQsCi0JICB1c2FnZSxiaXRzLHNlY3Rpb24sb2Zmc2V0KTsKKyAgICAvKiBGaWxsIEJJVE1BUDMyIHN0cnVjdHVyZSB3aXRoIERJQiBkYXRhICovCisgICAgQklUTUFQSU5GT0hFQURFUiAqYmkgPSAmYm1pLT5ibWlIZWFkZXI7CisgICAgQklUTUFQMzIgYm07CiAKLSAgaWYgKGJtaS0+Ym1pSGVhZGVyLmJpSGVpZ2h0IDwgMCApIGJtaS0+Ym1pSGVhZGVyLmJpSGVpZ2h0ID0gLWJtaS0+Ym1pSGVhZGVyLmJpSGVpZ2h0OwotICBpZiAoYm1pLT5ibWlIZWFkZXIuYmlXaWR0aCA8IDAgKSBibWktPmJtaUhlYWRlci5iaVdpZHRoID0gLWJtaS0+Ym1pSGVhZGVyLmJpV2lkdGg7Ci0gIC8qIEZJWE1FLiAgVGhlIGZvbGxvd2luZyBsaW5lIGlzbid0IHF1aXRlIHJpZ2h0LiAgKi8KLSAgcmVzID0gQ3JlYXRlRElCaXRtYXAzMiAoaGRjLCAmYm1pLT5ibWlIZWFkZXIsIDAsIE5VTEwsIGJtaSwgMCk7Ci0gIGlmIChyZXMpCisgICAgVFJBQ0UoYml0bWFwLCAiZm9ybWF0ICglbGQsJWxkKSwgcGxhbmVzICVkLCBicHAgJWQsIHNpemUgJWxkLCBjb2xvcnMgJWxkICglcylcbiIsCisJICBiaS0+YmlXaWR0aCwgYmktPmJpSGVpZ2h0LCBiaS0+YmlQbGFuZXMsIGJpLT5iaUJpdENvdW50LAorCSAgYmktPmJpU2l6ZUltYWdlLCBiaS0+YmlDbHJVc2VkLCB1c2FnZSA9PSBESUJfUEFMX0NPTE9SUz8gIlBBTCIgOiAiUkdCIik7CisKKyAgICBpZiAoYmktPmJpQ29tcHJlc3Npb24pCiAgICAgewotICAgICAgQklUTUFQMzIgYm1wOwotICAgICAgaWYgKEdldE9iamVjdDMyQSAocmVzLCBzaXplb2YgKGJtcCksICZibXApKQotCXsKLSAgICAgICAgICAgIC8qIEZJWE1FOiB0aGlzIGlzIHdyb25nISAoYm1CaXRzIGlzIGFsd2F5cyBOVUxMKSAqLwotICAgICAgICAgICAgaWYgKGJpdHMpICpiaXRzID0gYm1wLmJtQml0czsKLQkgICAgLyogaG1wZiAqLwotCSAgICBUUkFDRShiaXRtYXAsImFsbG9jYXRpbmcgJWxkIGJ5dGVzIG9mIG1lbW9yeVxuIiwKLSAgICAgICAgICAgICAgICBibWktPmJtaUhlYWRlci5iaVdpZHRoKmJtaS0+Ym1pSGVhZGVyLmJpSGVpZ2h0KjQpOwotCSAgICBpZiAoYml0cykgKmJpdHMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLAotICAgICAgICAgICAgICAgIGJtaS0+Ym1pSGVhZGVyLmJpV2lkdGgqYm1pLT5ibWlIZWFkZXIuYmlIZWlnaHQqNCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotCX0KKwlGSVhNRShiaXRtYXAsICJDb21wcmVzc2lvbiBub3QgaW1wbGVtZW50ZWQhXG4iKTsKKwlyZXR1cm4gMDsKICAgICB9CiAKLSAgLyogRXJyb3IuICAqLwotICBpZiAocmVzKSBEZWxldGVPYmplY3QzMiAocmVzKTsKLSAgaWYgKGJpdHMpICpiaXRzID0gTlVMTDsKLSAgcmV0dXJuIDA7CisgICAgYm0uYm1UeXBlID0gMDsKKyAgICBibS5ibVdpZHRoID0gYmktPmJpV2lkdGg7CisgICAgYm0uYm1IZWlnaHQgPSBiaS0+YmlIZWlnaHQ7CisgICAgYm0uYm1XaWR0aEJ5dGVzID0gRElCX0dldERJQldpZHRoQnl0ZXMoYm0uYm1XaWR0aCwgYmktPmJpQml0Q291bnQpOworICAgIGJtLmJtUGxhbmVzID0gYmktPmJpUGxhbmVzOworICAgIGJtLmJtQml0c1BpeGVsID0gYmktPmJpQml0Q291bnQ7CisgICAgYm0uYm1CaXRzID0gTlVMTDsKKworICAgIC8qIEdldCBzdG9yYWdlIGxvY2F0aW9uIGZvciBESUIgYml0cyAqLworICAgIGlmIChzZWN0aW9uKQorCUZJWE1FKGJpdG1hcCwgInNlY3Rpb24gIT0gTlVMTCBub3QgaW1wbGVtZW50ZWQhXG4iKTsJCisgICAgZWxzZQorICAgIHsKKwlJTlQzMiB0b3RhbFNpemUgPSBiaS0+YmlTaXplSW1hZ2U/IGJpLT5iaVNpemVJbWFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJtLmJtV2lkdGhCeXRlcyAqIGJtLmJtSGVpZ2h0OworCisJYm0uYm1CaXRzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHRvdGFsU2l6ZSk7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgTWVtb3J5IGZvciBESUIgYW5kIGZpbGwgc3RydWN0dXJlICovCisgICAgaWYgKGJtLmJtQml0cykKKwlkaWIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKERJQlNFQ1RJT04pKTsKKyAgICBpZiAoZGliKQorICAgIHsKKwlkaWItPmRzQm0gPSBibTsKKwlkaWItPmRzQm1paCA9ICpiaTsKKwkvKiBGSVhNRTogZGliLT5kc0JpdGZpZWxkcyA/Pz8gKi8KKwlkaWItPmRzaFNlY3Rpb24gPSBzZWN0aW9uOworCWRpYi0+ZHNPZmZzZXQgPSBvZmZzZXQ7CisgICAgfQorCisgICAgLyogQ3JlYXRlIENvbG9yIE1hcCAqLworICAgIGlmIChkaWIgJiYgYm0uYm1CaXRzUGl4ZWwgPD0gOCkKKyAgICB7CisgICAgICAgIEhQQUxFVFRFMTYgaFBhbGV0dGUgPSAwOworICAgICAgICBpZiAodXNhZ2UgPT0gRElCX1BBTF9DT0xPUlMpCisgICAgICAgIHsKKyAgICAgICAgICAgIERDICpkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoaGRjLCBEQ19NQUdJQyk7CisgICAgICAgICAgICBpZiAoIWRjKSAKKwkgICAgICAgIGRjID0gKERDICopR0RJX0dldE9ialB0cihoZGMsIE1FVEFGSUxFX0RDX01BR0lDKTsKKyAgICAgICAgICAgIGlmIChkYykKKwkgICAgeworCQloUGFsZXR0ZSA9IGRjLT53LmhQYWxldHRlOworCQlHRElfSEVBUF9VTkxPQ0soaGRjKTsKKwkgICAgfQorCX0KKwljb2xvck1hcCA9IERJQl9CdWlsZENvbG9yTWFwKGJtaSwgaFBhbGV0dGUsICZuQ29sb3JNYXApOworICAgIH0KKworICAgIC8qIENyZWF0ZSBEZXZpY2UgRGVwZW5kZW50IEJpdG1hcCBhbmQgYWRkIERJQi9Db2xvck1hcCBpbmZvICovCisgICAgaWYgKGRpYikgCisgICAgeworICAgICAgIHJlcyA9IENyZWF0ZURJQml0bWFwMzIoaGRjLCBiaSwgMCwgTlVMTCwgYm1pLCB1c2FnZSk7CisgICAgICAgYm1wID0gKEJJVE1BUE9CSiAqKSBHRElfR2V0T2JqUHRyKHJlcywgQklUTUFQX01BR0lDKTsKKyAgICAgICBpZiAoYm1wKQorICAgICAgIHsKKwkgICAgYm1wLT5kaWJTZWN0aW9uID0gZGliOworICAgICAgICAgICAgYm1wLT5jb2xvck1hcCAgID0gY29sb3JNYXA7CisJICAgIGJtcC0+bkNvbG9yTWFwICA9IG5Db2xvck1hcDsKKwkgICAgR0RJX0hFQVBfVU5MT0NLKHJlcyk7CisgICAgICAgfQorICAgIH0KKworICAgIC8qIENsZWFuIHVwIGluIGNhc2Ugb2YgZXJyb3JzICovCisgICAgaWYgKCFyZXMgfHwgIWJtcCB8fCAhZGliIHx8ICFibS5ibUJpdHMgfHwgKGJtLmJtQml0c1BpeGVsIDw9IDggJiYgIWNvbG9yTWFwKSkKKyAgICB7CisJaWYgKGJtLmJtQml0cyAmJiBzZWN0aW9uKSAKKwkgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYm0uYm1CaXRzKSwgYm0uYm1CaXRzID0gTlVMTDsKKworCWlmIChjb2xvck1hcCkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY29sb3JNYXApLCBjb2xvck1hcCA9IE5VTEw7CisJaWYgKGRpYikgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGliKSwgZGliID0gTlVMTDsKKwlpZiAocmVzKSBEZWxldGVPYmplY3QzMihyZXMpLCByZXMgPSAwOworICAgIH0KKworICAgIC8qIFJldHVybiBCSVRNQVAgaGFuZGxlIGFuZCBzdG9yYWdlIGxvY2F0aW9uICovCisgICAgaWYgKGJtLmJtQml0cyAmJiBiaXRzKSAqYml0cyA9IGJtLmJtQml0czsKKyAgICByZXR1cm4gcmVzOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBESUJfVXBkYXRlRElCU2VjdGlvbgorICovCit2b2lkIERJQl9VcGRhdGVESUJTZWN0aW9uKCBEQyAqZGMsIEJPT0wzMiB0b0RJQiApCit7CisgICAgQklUTUFQT0JKICpibXA7CisgICAgRElCU0VDVElPTiAqZGliOworCisgICAgLyogRW5zdXJlIHRoaXMgaXMgYSBDb21wYXRpYmxlIERDIHRoYXQgaGFzIGEgRElCIHNlY3Rpb24gc2VsZWN0ZWQgKi8KKworICAgIGlmICghZGMpIHJldHVybjsKKyAgICBpZiAoIShkYy0+dy5mbGFncyAmIERDX01FTU9SWSkpIHJldHVybjsKKworICAgIGJtcCA9IChCSVRNQVBPQkogKilHRElfR2V0T2JqUHRyKCBkYy0+dy5oQml0bWFwLCBCSVRNQVBfTUFHSUMgKTsKKyAgICBpZiAoIWJtcCkgcmV0dXJuOworCisgICAgZGliID0gYm1wLT5kaWJTZWN0aW9uOworICAgIGlmICghZGliKQorICAgIHsKKwlHRElfSEVBUF9VTkxPQ0soZGMtPncuaEJpdG1hcCk7CisJcmV0dXJuOworICAgIH0KKworICAKKyAgICAvKiBDb3B5IFBpeG1hcCB0byBiaXRzICovCisgICAgaWYgKHRvRElCKQorICAgIHsKKyAgICAgICAgLyogRXhwZWN0IGNvbG91ciBjb3JydXB0aW9uIGlmIHlvdSB1bmNvbW1lbnQgdGhpcy4gLU1GICovCisvLyAgICAgICAgQklUTUFQSU5GTyBiaTsKKy8vICAgICAgICBiaS5ibWlIZWFkZXIgPSBkaWItPmRzQm1paDsKKy8vICAgICAgICBiaS5ibWlIZWFkZXIuYmlDbHJVc2VkID0gMDsgLyogZG9uJ3QgY29weSBwYWxldHRlICovCisvLyAgICAgICAgVFJBQ0UoYml0bWFwLCAiQ29weWluZyBmcm9tIFBpeG1hcCB0byBESUIgYml0c1xuIik7CisvLyAgICAgICAgR2V0RElCaXRzMzIoIGRjLT5oU2VsZiwgZGMtPncuaEJpdG1hcCwgMCwgZGliLT5kc0JtaWguYmlIZWlnaHQsCisvLyAgICAgICAgICAgICAgICAgICAgIGRpYi0+ZHNCbS5ibUJpdHMsICZiaSwgMCApOworICAgIH0KKworICAgIC8qIENvcHkgYml0cyB0byBQaXhtYXAgKi8KKyAgICBlbHNlCisgICAgeworICAgIAlESUJfU0VUSU1BR0VCSVRTX0RFU0NSIGRlc2NyOworCisJVFJBQ0UoYml0bWFwLCAiQ29weWluZyBmcm9tIERJQiBiaXRzIHRvIFBpeG1hcFxuIik7IAorCWlmIChESUJfR2V0Qml0bWFwSW5mbyggJmRpYi0+ZHNCbWloLCAmZGVzY3IuaW5mb1dpZHRoLCAmZGVzY3IubGluZXMsCisJCQkgICAgICAgJmRlc2NyLmluZm9CcHAsICZkZXNjci5jb21wcmVzc2lvbiApID09IC0xKQorCXsKKwkgICAgR0RJX0hFQVBfVU5MT0NLKGRjLT53LmhCaXRtYXApOworCSAgICByZXR1cm47CisJfQorCisgICAgICAgIGRlc2NyLmRjICAgICAgICA9IGRjOworICAgICAgICBkZXNjci5jb2xvck1hcCAgPSBibXAtPmNvbG9yTWFwOworICAgICAgICBkZXNjci5uQ29sb3JNYXAgPSBibXAtPm5Db2xvck1hcDsKKyAgICAgICAgZGVzY3IuYml0cyAgICAgID0gZGliLT5kc0JtLmJtQml0czsKKyAgICAgICAgZGVzY3IuZGVwdGggICAgID0gYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWw7CisgICAgICAgIGRlc2NyLmRyYXdhYmxlICA9IGJtcC0+cGl4bWFwOworICAgICAgICBkZXNjci5nYyAgICAgICAgPSBCSVRNQVBfR0MoYm1wKTsKKyAgICAgICAgZGVzY3IueFNyYyAgICAgID0gMDsKKyAgICAgICAgZGVzY3IueVNyYyAgICAgID0gMDsKKyAgICAgICAgZGVzY3IueERlc3QgICAgID0gMDsKKyAgICAgICAgZGVzY3IueURlc3QgICAgID0gMDsKKyAgICAgICAgZGVzY3Iud2lkdGggICAgID0gYm1wLT5iaXRtYXAuYm1XaWR0aDsKKyAgICAgICAgZGVzY3IuaGVpZ2h0ICAgID0gYm1wLT5iaXRtYXAuYm1IZWlnaHQ7CisKKyAgICAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZYMTFEUlZfQ3JpdFNlY3Rpb24gKTsKKyAgICAgICAgQ0FMTF9MQVJHRV9TVEFDSyggRElCX1NldEltYWdlQml0cywgJmRlc2NyICk7CisgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmWDExRFJWX0NyaXRTZWN0aW9uICk7CisgICAgfQorCisgICAgR0RJX0hFQVBfVU5MT0NLKGRjLT53LmhCaXRtYXApOworfQorCmRpZmYgLS1naXQgYS9vYmplY3RzL2VuaG1ldGFmaWxlLmMgYi9vYmplY3RzL2VuaG1ldGFmaWxlLmMKaW5kZXggOGMzNGJmOS4uOTI3NTI3OCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9lbmhtZXRhZmlsZS5jCisrKyBiL29iamVjdHMvZW5obWV0YWZpbGUuYwpAQCAtMyw3ICszLDYgQEAKICAgQ29weXJpZ2h0IDE5OTgsIERvdWdsYXMgUmlkZ3dheQogKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImdkaS5oIgpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9mb250LmMgYi9vYmplY3RzL2ZvbnQuYwppbmRleCA3MTE3ZTdlLi42ZjVhOTExIDEwMDY0NAotLS0gYS9vYmplY3RzL2ZvbnQuYworKysgYi9vYmplY3RzL2ZvbnQuYwpAQCAtNSw3ICs1LDYgQEAKICAqICAgICAgICAgICAxOTk3IEFsZXggS29yb2JrYQogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgImZvbnQuaCIKZGlmZiAtLWdpdCBhL29iamVjdHMvZ2Rpb2JqLmMgYi9vYmplY3RzL2dkaW9iai5jCmluZGV4IGFlNGFkN2UuLjIyYzg3MjIgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZ2Rpb2JqLmMKKysrIGIvb2JqZWN0cy9nZGlvYmouYwpAQCAtNSw3ICs1LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJjb2xvci5oIgogI2luY2x1ZGUgImJpdG1hcC5oIgogI2luY2x1ZGUgImJydXNoLmgiCkBAIC0yMjcsOSArMjI2LDYgQEAKICAqLwogQk9PTDMyIEdESV9Jbml0KHZvaWQpCiB7Ci0gICAgZXh0ZXJuIEJPT0wzMiBYMTFEUlZfSW5pdCh2b2lkKTsKLSAgICBleHRlcm4gQk9PTDMyIERJQl9Jbml0KHZvaWQpOwotCiAgICAgLyogS2lsbCBzb21lIHdhcm5pbmdzLiAgKi8KICAgICAodm9pZClhbGlnbl9PRU1GaXhlZEZvbnQ7CiAgICAgKHZvaWQpYWxpZ25fQW5zaUZpeGVkRm9udDsKZGlmZiAtLWdpdCBhL29iamVjdHMvb2VtYml0bWFwLmMgYi9vYmplY3RzL29lbWJpdG1hcC5jCmluZGV4IDg2MmVjNTIuLjhkYmQyNWYgMTAwNjQ0Ci0tLSBhL29iamVjdHMvb2VtYml0bWFwLmMKKysrIGIvb2JqZWN0cy9vZW1iaXRtYXAuYwpAQCAtMzM2LDYgKzMzNiwxMSBAQAogICAgIGJtcE9ialB0ci0+Yml0bWFwLmJtUGxhbmVzICAgICA9IDE7CiAgICAgYm1wT2JqUHRyLT5iaXRtYXAuYm1CaXRzUGl4ZWwgID0gYnBwOwogICAgIGJtcE9ialB0ci0+Yml0bWFwLmJtQml0cyAgICAgICA9IChTRUdQVFIpTlVMTDsKKworICAgIGJtcE9ialB0ci0+ZGliU2VjdGlvbiAgICAgICAgICA9IE5VTEw7CisgICAgYm1wT2JqUHRyLT5jb2xvck1hcCAgICAgICAgICAgID0gTlVMTDsKKyAgICBibXBPYmpQdHItPm5Db2xvck1hcCAgICAgICAgICAgPSAwOworCiAgICAgR0RJX0hFQVBfVU5MT0NLKCBoYml0bWFwICk7CiAgICAgcmV0dXJuIGhiaXRtYXA7CiB9CmRpZmYgLS1naXQgYS9vYmplY3RzL3JlZ2lvbi5jIGIvb2JqZWN0cy9yZWdpb24uYwppbmRleCBhOWFlZTFjLi42Yzc5ZTFlIDEwMDY0NAotLS0gYS9vYmplY3RzL3JlZ2lvbi5jCisrKyBiL29iamVjdHMvcmVnaW9uLmMKQEAgLTgwLDcgKzgwLDYgQEAKICAqIHRoZSB5LXgtYmFuZGluZyB0aGF0J3Mgc28gbmljZSB0byBoYXZlLi4uCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAicmVnaW9uLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJoZWFwLmgiCmRpZmYgLS1naXQgYS9vbGUvZm9sZGVycy5jIGIvb2xlL2ZvbGRlcnMuYwppbmRleCA2ZDE1OWY1Li5hOWZjNzE3IDEwMDY0NAotLS0gYS9vbGUvZm9sZGVycy5jCisrKyBiL29sZS9mb2xkZXJzLmMKQEAgLTExMCw3ICsxMTAsOCBAQAogCUZJWE1FKG9sZSwiKCVwKS0+KCUwOHgsJXAsJXAsJXAsJXAsJXApLHN0dWIhXG4iLAogCQl0aGlzLGh3bmRPd25lcixwYmNSZXNlcnZlZCxscHN6RGlzcGxheU5hbWUscGNoRWF0ZW4scHBpZGwscGR3QXR0cmlidXRlcwogCSk7Ci0JKihEV09SRCopcGJjUmVzZXJ2ZWQgPSAwOworCWlmIChwYmNSZXNlcnZlZCkKKwkJKihEV09SRCopcGJjUmVzZXJ2ZWQgPSAwOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9vbGUvb2xlMm5scy5jIGIvb2xlL29sZTJubHMuYwppbmRleCBjMWQ2ZmNhLi5hYmJhNjYwIDEwMDY0NAotLS0gYS9vbGUvb2xlMm5scy5jCisrKyBiL29sZS9vbGUybmxzLmMKQEAgLTEzOCw3ICsxMzgsNyBAQAogCXsweDA0MDMsIkthdGFsYW5pc2NoIn0sCiAJezB4MDQwNCwiVHJhZGl0aW9uYWxlcyBDaGluZXNpc2NoIn0sCiAJezB4MDQwNSwiVHNjaGVjaXNjaCJ9LAotCXsweDA0MDYsIkRkbmlzY2gifSwKKwl7MHgwNDA2LCJE5G5pc2NoIn0sCiAJezB4MDQwNywiRGV1dHNjaCJ9LAogCXsweDA0MDgsIkdyaWVjaGlzY2gifSwKIAl7MHgwNDA5LCJBbWVyaWthbmlzY2hlcyBFbmdsaXNjaCJ9LApAQCAtMTcxMCw3ICsxNzEwLDcgQEAKIHsKIAlpbnQgbGVuLHJldDsKIAlpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFTk9OU1BBQ0UpCi0JCUZJWE1FKG9sZSwgIklHTk9SRU5PTlNQQUNFIG5vdCBzdXBwcnRlZFxuIik7CisJCUZJWE1FKG9sZSwgIklHTk9SRU5PTlNQQUNFIG5vdCBzdXBwb3J0ZWRcbiIpOwogCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQogCQlGSVhNRShvbGUsICJJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOwogCS8qIElzIHN0cmNtcCBkZWZhdWx0aW5nIHRvIHN0cmluZyBzb3J0IG9yIHRvIHdvcmQgc29ydD8/ICovCkBAIC0xOTYwLDE5ICsxOTYwLDIzIEBACiBEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lMTYoVUlOVDE2IGxhbmdpZCxMUFNUUiBsYW5nbmFtZSxVSU5UMTYgbGFuZ25hbWVsZW4pCiB7CiAJaW50CWk7Ci0JY2hhcgkqYnVmOworCURXT1JECXJlc3VsdDsKKwljaGFyCWJ1ZmZlcls4MF07CiAKIAlUUkFDRSh2ZXIsIiglZCwlcCwlZClcbiIsbGFuZ2lkLGxhbmduYW1lLGxhbmduYW1lbGVuKTsKIAkvKiBGaXJzdCwgY2hlY2sgXFN5c3RlbVxDdXJyZW50Q29udHJvbFNldFxjb250cm9sXE5sc1xMb2NhbGVcPGxhbmdpZD4KIAkgKiBmcm9tIHRoZSByZWdpc3RyeS4gCiAJICovCi0JYnVmPShjaGFyKiltYWxsb2Moc3RybGVuKCJcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwiKSs5KTsKLQlzcHJpbnRmKGJ1ZiwiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcJTA4eCIsbGFuZ2lkKTsKLQlpZiAoRVJST1JfU1VDQ0VTUz09UmVnUXVlcnlWYWx1ZTE2KEhLRVlfTE9DQUxfTUFDSElORSxidWYsbGFuZ25hbWUsKExQRFdPUkQpJmxhbmduYW1lbGVuKSkgeworCXNwcmludGYoYnVmZmVyLAorCQkiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcJTA4eCIsCisJCWxhbmdpZCk7CisJcmVzdWx0ID0gUmVnUXVlcnlWYWx1ZTE2KEhLRVlfTE9DQUxfTUFDSElORSwgYnVmZmVyLCBsYW5nbmFtZSwKKwkJCQkoTFBEV09SRCkmbGFuZ25hbWVsZW4pOworCWlmIChyZXN1bHQgPT0gRVJST1JfU1VDQ0VTUykgewogCQlsYW5nbmFtZVtsYW5nbmFtZWxlbi0xXT0nXDAnOwogCQlyZXR1cm4gbGFuZ25hbWVsZW47CiAJfQotCS8qIGlmIHRoYXQgZmFpbHMsIHVzZSB0aGUgaW50ZXJhbCB0YWJsZSAqLworCS8qIGlmIHRoYXQgZmFpbHMsIHVzZSB0aGUgaW50ZXJuYWwgdGFibGUgKi8KIAlmb3IgKGk9MDtsYW5ndWFnZXNbaV0ubGFuZ2lkIT0wO2krKykKIAkJaWYgKGxhbmdpZD09bGFuZ3VhZ2VzW2ldLmxhbmdpZCkKIAkJCWJyZWFrOwpAQCAtMTk5NywxMDEgKzIwMDEsNjA4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBsYW5nbmFtZWxlbikKIHsKIAlpbnQJaTsKLQljaGFyCWJ1ZmZlcls4MF07CiAJTFBXU1RSCWtleW5hbWU7CisJRFdPUkQJcmVzdWx0OworCWNoYXIJYnVmZmVyWzgwXTsKIAogCS8qIEZpcnN0LCBjaGVjayBcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XGNvbnRyb2xcTmxzXExvY2FsZVw8bGFuZ2lkPgogCSAqIGZyb20gdGhlIHJlZ2lzdHJ5LiAKIAkgKi8KLQlzcHJpbnRmKGJ1ZmZlciwiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcJTA4eCIsbGFuZ2lkKTsKKwlzcHJpbnRmKGJ1ZmZlciwKKwkJIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCUwOHgiLAorCQlsYW5naWQpOwogCWtleW5hbWUgPSBIRUFQX3N0cmR1cEF0b1coIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZmZlciApOwotCWlmIChFUlJPUl9TVUNDRVNTPT1SZWdRdWVyeVZhbHVlMzJXKEhLRVlfTE9DQUxfTUFDSElORSxrZXluYW1lLGxhbmduYW1lLChMUERXT1JEKSZsYW5nbmFtZWxlbikpIHsKLQkJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGtleW5hbWUgKTsKLQkJcmV0dXJuIGxhbmduYW1lbGVuOworCXJlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWUzMlcoSEtFWV9MT0NBTF9NQUNISU5FLCBrZXluYW1lLCBsYW5nbmFtZSwKKwkJCQkoTFBEV09SRCkmbGFuZ25hbWVsZW4pOworCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBrZXluYW1lICk7CisJaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKSB7CisJCS8qIGlmIHRoYXQgZmFpbHMsIHVzZSB0aGUgaW50ZXJuYWwgdGFibGUgKi8KKwkJZm9yIChpPTA7bGFuZ3VhZ2VzW2ldLmxhbmdpZCE9MDtpKyspCisJCQlpZiAobGFuZ2lkPT1sYW5ndWFnZXNbaV0ubGFuZ2lkKQorCQkJCWJyZWFrOworICAgICAgICAJbHN0cmNweUF0b1coIGxhbmduYW1lLCBsYW5ndWFnZXNbaV0ubGFuZ25hbWUgKTsKKwkJbGFuZ25hbWVsZW4gPSBzdHJsZW4obGFuZ3VhZ2VzW2ldLmxhbmduYW1lKTsKKwkgCS8qIHNhbWUgYXMgc3RybGVuVyhsYW5nbmFtZSk7ICovCiAJfQotICAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwga2V5bmFtZSApOwotCS8qIGlmIHRoYXQgZmFpbHMsIHVzZSB0aGUgaW50ZXJhbCB0YWJsZSAqLwotCWZvciAoaT0wO2xhbmd1YWdlc1tpXS5sYW5naWQhPTA7aSsrKQotCQlpZiAobGFuZ2lkPT1sYW5ndWFnZXNbaV0ubGFuZ2lkKQotCQkJYnJlYWs7Ci0gICAgICAgIGxzdHJjcHlBdG9XKCBsYW5nbmFtZSwgbGFuZ3VhZ2VzW2ldLmxhbmduYW1lICk7Ci0JcmV0dXJuIHN0cmxlbihsYW5ndWFnZXNbaV0ubGFuZ25hbWUpOyAvKiBzYW1lIGFzIHN0cmxlblcobGFuZ25hbWUpOyAqLworCXJldHVybiBsYW5nbmFtZWxlbjsKK30KKyAKK3N0YXRpYyBpbnQgaXNfcHVuY3R1YXRpb24odW5zaWduZWQgY2hhciBjKQoreworICAvKiBwdW5jdHVhdGlvbiBjaGFyYWN0ZXJzIGFyZSA6CisgICAgIDM5LCA0NSwgMTI3LTEyOSwgMTQxLTE0NCwgMTUwLTE1MSwgMTU3LTE1OCwgMTczICovCisgIGlmIChjPj0xNDEpCisgIHsKKyAgICBpZiAoYzw9MTUxKQorICAgICAgcmV0dXJuIChjPD0xNDQpIHx8IChjPj0xNTApOworICAgIGlmIChjPD0xNTgpCisgICAgICByZXR1cm4gKGM+PTE1Nyk7CisgICAgcmV0dXJuIChjPT0xNzMpOworICB9CisgIGlmIChjPj0xMjcpCisgICAgcmV0dXJuIChjPD0xMjkpOworICByZXR1cm4gKGM9PTM5KSB8fCAoYz09NDUpOwogfQogCi0KLUlOVDMyIFdJTkFQSSBMQ01hcFN0cmluZzMyQSgKLQlMQ0lEIGxjaWQsRFdPUkQgbWFwZmxhZ3MsTFBDU1RSIHNyY3N0cixJTlQzMiBzcmNsZW4sTFBTVFIgZHN0c3RyLAotCUlOVDMyIGRzdGxlbgotKSB7Ci0JaW50CWksbGVuOwotCi0JVFJBQ0Uoc3RyaW5nLCIoMHglMDRseCwweCUwOGx4LCVzLCVkLCVwLCVkKVxuIiwKLQkJbGNpZCxtYXBmbGFncyxzcmNzdHIsc3JjbGVuLGRzdHN0cixkc3RsZW4pOwotCWlmICghZHN0bGVuIHx8ICFkc3RzdHIpIHsKLQkJZHN0c3RyID0gKExQU1RSKXNyY3N0cjsKLQl9Ci0JaWYgKCFzcmNsZW4pIHNyY2xlbiA9IHN0cmxlbihzcmNzdHIpOwotCWlmICghZHN0bGVuKSBkc3RsZW4gPSBzdHJsZW4oZHN0c3RyKTsKLQlsZW4gPSBkc3RsZW47Ci0JaWYgKHNyY2xlbiA8IGxlbikKLQkJbGVuID0gc3JjbGVuOwotCWlmIChtYXBmbGFncyAmIExDTUFQX0xPV0VSQ0FTRSkgewotCQlmb3IgKGk9MDtpPGxlbjtpKyspCi0JCQlkc3RzdHJbaV09dG9sb3dlcihzcmNzdHJbaV0pOwotCQltYXBmbGFncyAmPSB+TENNQVBfTE9XRVJDQVNFOwotCX0KLQlpZiAobWFwZmxhZ3MgJiBMQ01BUF9VUFBFUkNBU0UpIHsKLQkJZm9yIChpPTA7aTxsZW47aSsrKQotCQkJZHN0c3RyW2ldPXRvdXBwZXIoc3Jjc3RyW2ldKTsKLQkJbWFwZmxhZ3MgJj0gfkxDTUFQX1VQUEVSQ0FTRTsKLQl9Ci0JaWYgKG1hcGZsYWdzKQotCSAgewotCSAgICBGSVhNRShvbGUsIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCi0JCSAgInVuaW1wbGVtZW50ZWQgZmxhZ3M6IDB4JTA4bHhcbiIsCi0JCSAgbGNpZCxtYXBmbGFncyxzcmNzdHIsc3JjbGVuLGRzdHN0cixkc3RsZW4sbWFwZmxhZ3MpOwotCSAgfQotCXJldHVybiBsZW47CitzdGF0aWMgaW50IGlkZW50aXR5KGludCBjKQoreworICByZXR1cm4gYzsKIH0KIAotLyogRklYTUU6IGltcGxlbWVudCBldmVyeWh0aW5nICYgY29ycmVjdCAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgTENNX1VuaWNvZGVfTFVUW10gPSB7CisgIDcgICAgICAsICAgMiwgLyogICAtICAzMiAqLworICA3ICAgICAgLCAgMjgsIC8qICEgLSAgMzMgKi8KKyAgNyAgICAgICwgIDI5LCAvKiAiIC0gIDM0ICovIC8qICIgKi8KKyAgNyAgICAgICwgIDMxLCAvKiAjIC0gIDM1ICovCisgIDcgICAgICAsICAzMywgLyogJCAtICAzNiAqLworICA3ICAgICAgLCAgMzUsIC8qICUgLSAgMzcgKi8KKyAgNyAgICAgICwgIDM3LCAvKiAmIC0gIDM4ICovCisgIDYgICAgICAsIDEyOCwgLyogJyAtICAzOSAqLworICA3ICAgICAgLCAgMzksIC8qICggLSAgNDAgKi8KKyAgNyAgICAgICwgIDQyLCAvKiApIC0gIDQxICovCisgIDcgICAgICAsICA0NSwgLyogKiAtICA0MiAqLworICA4ICAgICAgLCAgIDMsIC8qICsgLSAgNDMgKi8KKyAgNyAgICAgICwgIDQ3LCAvKiAsIC0gIDQ0ICovCisgIDYgICAgICAsIDEzMCwgLyogLSAtICA0NSAqLworICA3ICAgICAgLCAgNTEsIC8qIC4gLSAgNDYgKi8KKyAgNyAgICAgICwgIDUzLCAvKiAvIC0gIDQ3ICovCisgMTIgICAgICAsICAgMywgLyogMCAtICA0OCAqLworIDEyICAgICAgLCAgMzMsIC8qIDEgLSAgNDkgKi8KKyAxMiAgICAgICwgIDUxLCAvKiAyIC0gIDUwICovCisgMTIgICAgICAsICA3MCwgLyogMyAtICA1MSAqLworIDEyICAgICAgLCAgODgsIC8qIDQgLSAgNTIgKi8KKyAxMiAgICAgICwgMTA2LCAvKiA1IC0gIDUzICovCisgMTIgICAgICAsIDEyNSwgLyogNiAtICA1NCAqLworIDEyICAgICAgLCAxNDQsIC8qIDcgLSAgNTUgKi8KKyAxMiAgICAgICwgMTYyLCAvKiA4IC0gIDU2ICovCisgMTIgICAgICAsIDE4MCwgLyogOSAtICA1NyAqLworICA3ICAgICAgLCAgNTUsIC8qIDogLSAgNTggKi8KKyAgNyAgICAgICwgIDU4LCAvKiA7IC0gIDU5ICovCisgIDggICAgICAsICAxNCwgLyogPCAtICA2MCAqLworICA4ICAgICAgLCAgMTgsIC8qID0gLSAgNjEgKi8KKyAgOCAgICAgICwgIDIwLCAvKiA+IC0gIDYyICovCisgIDcgICAgICAsICA2MCwgLyogPyAtICA2MyAqLworICA3ICAgICAgLCAgNjIsIC8qIEAgLSAgNjQgKi8KKyAxNCAgICAgICwgICAyLCAvKiBBIC0gIDY1ICovCisgMTQgICAgICAsICAgOSwgLyogQiAtICA2NiAqLworIDE0ICAgICAgLCAgMTAsIC8qIEMgLSAgNjcgKi8KKyAxNCAgICAgICwgIDI2LCAvKiBEIC0gIDY4ICovCisgMTQgICAgICAsICAzMywgLyogRSAtICA2OSAqLworIDE0ICAgICAgLCAgMzUsIC8qIEYgLSAgNzAgKi8KKyAxNCAgICAgICwgIDM3LCAvKiBHIC0gIDcxICovCisgMTQgICAgICAsICA0NCwgLyogSCAtICA3MiAqLworIDE0ICAgICAgLCAgNTAsIC8qIEkgLSAgNzMgKi8KKyAxNCAgICAgICwgIDUzLCAvKiBKIC0gIDc0ICovCisgMTQgICAgICAsICA1NCwgLyogSyAtICA3NSAqLworIDE0ICAgICAgLCAgNzIsIC8qIEwgLSAgNzYgKi8KKyAxNCAgICAgICwgIDgxLCAvKiBNIC0gIDc3ICovCisgMTQgICAgICAsIDExMiwgLyogTiAtICA3OCAqLworIDE0ICAgICAgLCAxMjQsIC8qIE8gLSAgNzkgKi8KKyAxNCAgICAgICwgMTI2LCAvKiBQIC0gIDgwICovCisgMTQgICAgICAsIDEzNywgLyogUSAtICA4MSAqLworIDE0ICAgICAgLCAxMzgsIC8qIFIgLSAgODIgKi8KKyAxNCAgICAgICwgMTQ1LCAvKiBTIC0gIDgzICovCisgMTQgICAgICAsIDE1MywgLyogVCAtICA4NCAqLworIDE0ICAgICAgLCAxNTksIC8qIFUgLSAgODUgKi8KKyAxNCAgICAgICwgMTYyLCAvKiBWIC0gIDg2ICovCisgMTQgICAgICAsIDE2NCwgLyogVyAtICA4NyAqLworIDE0ICAgICAgLCAxNjYsIC8qIFggLSAgODggKi8KKyAxNCAgICAgICwgMTY3LCAvKiBZIC0gIDg5ICovCisgMTQgICAgICAsIDE2OSwgLyogWiAtICA5MCAqLworICA3ICAgICAgLCAgNjMsIC8qIFsgLSAgOTEgKi8KKyAgNyAgICAgICwgIDY1LCAvKiBcIC0gIDkyICovCisgIDcgICAgICAsICA2NiwgLyogXSAtICA5MyAqLworICA3ICAgICAgLCAgNjcsIC8qIF4gLSAgOTQgKi8KKyAgNyAgICAgICwgIDY4LCAvKiBfIC0gIDk1ICovCisgIDcgICAgICAsICA3MiwgLyogYCAtICA5NiAqLworIDE0ICAgICAgLCAgIDIsIC8qIGEgLSAgOTcgKi8KKyAxNCAgICAgICwgICA5LCAvKiBiIC0gIDk4ICovCisgMTQgICAgICAsICAxMCwgLyogYyAtICA5OSAqLworIDE0ICAgICAgLCAgMjYsIC8qIGQgLSAxMDAgKi8KKyAxNCAgICAgICwgIDMzLCAvKiBlIC0gMTAxICovCisgMTQgICAgICAsICAzNSwgLyogZiAtIDEwMiAqLworIDE0ICAgICAgLCAgMzcsIC8qIGcgLSAxMDMgKi8KKyAxNCAgICAgICwgIDQ0LCAvKiBoIC0gMTA0ICovCisgMTQgICAgICAsICA1MCwgLyogaSAtIDEwNSAqLworIDE0ICAgICAgLCAgNTMsIC8qIGogLSAxMDYgKi8KKyAxNCAgICAgICwgIDU0LCAvKiBrIC0gMTA3ICovCisgMTQgICAgICAsICA3MiwgLyogbCAtIDEwOCAqLworIDE0ICAgICAgLCAgODEsIC8qIG0gLSAxMDkgKi8KKyAxNCAgICAgICwgMTEyLCAvKiBuIC0gMTEwICovCisgMTQgICAgICAsIDEyNCwgLyogbyAtIDExMSAqLworIDE0ICAgICAgLCAxMjYsIC8qIHAgLSAxMTIgKi8KKyAxNCAgICAgICwgMTM3LCAvKiBxIC0gMTEzICovCisgMTQgICAgICAsIDEzOCwgLyogciAtIDExNCAqLworIDE0ICAgICAgLCAxNDUsIC8qIHMgLSAxMTUgKi8KKyAxNCAgICAgICwgMTUzLCAvKiB0IC0gMTE2ICovCisgMTQgICAgICAsIDE1OSwgLyogdSAtIDExNyAqLworIDE0ICAgICAgLCAxNjIsIC8qIHYgLSAxMTggKi8KKyAxNCAgICAgICwgMTY0LCAvKiB3IC0gMTE5ICovCisgMTQgICAgICAsIDE2NiwgLyogeCAtIDEyMCAqLworIDE0ICAgICAgLCAxNjcsIC8qIHkgLSAxMjEgKi8KKyAxNCAgICAgICwgMTY5LCAvKiB6IC0gMTIyICovCisgIDcgICAgICAsICA3NCwgLyogeyAtIDEyMyAqLworICA3ICAgICAgLCAgNzYsIC8qIHwgLSAxMjQgKi8KKyAgNyAgICAgICwgIDc4LCAvKiB9IC0gMTI1ICovCisgIDcgICAgICAsICA4MCwgLyogfiAtIDEyNiAqLworICA2ICAgICAgLCAgMjksIC8qIH8gLSAxMjcgKi8KKyAgNiAgICAgICwgIDMwLCAvKiCAIC0gMTI4ICovCisgIDYgICAgICAsICAzMSwgLyoggSAtIDEyOSAqLworICA3ICAgICAgLCAxMjMsIC8qIIIgLSAxMzAgKi8KKyAxNCAgICAgICwgIDM1LCAvKiCDIC0gMTMxICovCisgIDcgICAgICAsIDEyNywgLyoghCAtIDEzMiAqLworIDEwICAgICAgLCAgMjEsIC8qIIUgLSAxMzMgKi8KKyAxMCAgICAgICwgIDE1LCAvKiCGIC0gMTM0ICovCisgMTAgICAgICAsICAxNiwgLyoghyAtIDEzNSAqLworICA3ICAgICAgLCAgNjcsIC8qIIggLSAxMzYgKi8KKyAxMCAgICAgICwgIDIyLCAvKiCJIC0gMTM3ICovCisgMTQgICAgICAsIDE0NSwgLyogiiAtIDEzOCAqLworICA3ICAgICAgLCAxMzYsIC8qIIsgLSAxMzkgKi8KKyAxNCArIDE2ICwgMTI0LCAvKiCMIC0gMTQwICovCisgIDYgICAgICAsICA0MywgLyogjSAtIDE0MSAqLworICA2ICAgICAgLCAgNDQsIC8qII4gLSAxNDIgKi8KKyAgNiAgICAgICwgIDQ1LCAvKiCPIC0gMTQzICovCisgIDYgICAgICAsICA0NiwgLyogkCAtIDE0NCAqLworICA3ICAgICAgLCAxMjEsIC8qIJEgLSAxNDUgKi8KKyAgNyAgICAgICwgMTIyLCAvKiCSIC0gMTQ2ICovCisgIDcgICAgICAsIDEyNSwgLyogkyAtIDE0NyAqLworICA3ICAgICAgLCAxMjYsIC8qIJQgLSAxNDggKi8KKyAxMCAgICAgICwgIDE3LCAvKiCVIC0gMTQ5ICovCisgIDYgICAgICAsIDEzNywgLyogliAtIDE1MCAqLworICA2ICAgICAgLCAxMzksIC8qIJcgLSAxNTEgKi8KKyAgNyAgICAgICwgIDkzLCAvKiCYIC0gMTUyICovCisgMTQgICAgICAsIDE1NiwgLyogmSAtIDE1MyAqLworIDE0ICAgICAgLCAxNDUsIC8qIJogLSAxNTQgKi8KKyAgNyAgICAgICwgMTM3LCAvKiCbIC0gMTU1ICovCisgMTQgKyAxNiAsIDEyNCwgLyognCAtIDE1NiAqLworICA2ICAgICAgLCAgNTksIC8qIJ0gLSAxNTcgKi8KKyAgNiAgICAgICwgIDYwLCAvKiCeIC0gMTU4ICovCisgMTQgICAgICAsIDE2NywgLyognyAtIDE1OSAqLworICA3ICAgICAgLCAgIDQsIC8qIKAgLSAxNjAgKi8KKyAgNyAgICAgICwgIDgxLCAvKiChIC0gMTYxICovCisgMTAgICAgICAsICAgMiwgLyogoiAtIDE2MiAqLworIDEwICAgICAgLCAgIDMsIC8qIKMgLSAxNjMgKi8KKyAxMCAgICAgICwgICA0LCAvKiCkIC0gMTY0ICovCisgMTAgICAgICAsICAgNSwgLyogpSAtIDE2NSAqLworICA3ICAgICAgLCAgODIsIC8qIKYgLSAxNjYgKi8KKyAxMCAgICAgICwgICA2LCAvKiCnIC0gMTY3ICovCisgIDcgICAgICAsICA4MywgLyogqCAtIDE2OCAqLworIDEwICAgICAgLCAgIDcsIC8qIKkgLSAxNjkgKi8KKyAxNCAgICAgICwgICAyLCAvKiCqIC0gMTcwICovCisgIDggICAgICAsICAyNCwgLyogqyAtIDE3MSAqLworIDEwICAgICAgLCAgIDgsIC8qIKwgLSAxNzIgKi8KKyAgNiAgICAgICwgMTMxLCAvKiCtIC0gMTczICovCisgMTAgICAgICAsICAgOSwgLyogriAtIDE3NCAqLworICA3ICAgICAgLCAgODQsIC8qIK8gLSAxNzUgKi8KKyAxMCAgICAgICwgIDEwLCAvKiCwIC0gMTc2ICovCisgIDggICAgICAsICAyMywgLyogsSAtIDE3NyAqLworIDEyICAgICAgLCAgNTEsIC8qILIgLSAxNzggKi8KKyAxMiAgICAgICwgIDcwLCAvKiCzIC0gMTc5ICovCisgIDcgICAgICAsICA4NSwgLyogtCAtIDE4MCAqLworIDEwICAgICAgLCAgMTEsIC8qILUgLSAxODEgKi8KKyAxMCAgICAgICwgIDEyLCAvKiC2IC0gMTgyICovCisgMTAgICAgICAsICAxMywgLyogtyAtIDE4MyAqLworICA3ICAgICAgLCAgODYsIC8qILggLSAxODQgKi8KKyAxMiAgICAgICwgIDMzLCAvKiC5IC0gMTg1ICovCisgMTQgICAgICAsIDEyNCwgLyoguiAtIDE4NiAqLworICA4ICAgICAgLCAgMjYsIC8qILsgLSAxODcgKi8KKyAxMiAgICAgICwgIDIxLCAvKiC8IC0gMTg4ICovCisgMTIgICAgICAsICAyNSwgLyogvSAtIDE4OSAqLworIDEyICAgICAgLCAgMjksIC8qIL4gLSAxOTAgKi8KKyAgNyAgICAgICwgIDg3LCAvKiC/IC0gMTkxICovCisgMTQgICAgICAsICAgMiwgLyogwCAtIDE5MiAqLworIDE0ICAgICAgLCAgIDIsIC8qIMEgLSAxOTMgKi8KKyAxNCAgICAgICwgICAyLCAvKiDCIC0gMTk0ICovCisgMTQgICAgICAsICAgMiwgLyogwyAtIDE5NSAqLworIDE0ICAgICAgLCAgIDIsIC8qIMQgLSAxOTYgKi8KKyAxNCAgICAgICwgICAyLCAvKiDFIC0gMTk3ICovCisgMTQgKyAxNiAsICAgMiwgLyogxiAtIDE5OCAqLworIDE0ICAgICAgLCAgMTAsIC8qIMcgLSAxOTkgKi8KKyAxNCAgICAgICwgIDMzLCAvKiDIIC0gMjAwICovCisgMTQgICAgICAsICAzMywgLyogySAtIDIwMSAqLworIDE0ICAgICAgLCAgMzMsIC8qIMogLSAyMDIgKi8KKyAxNCAgICAgICwgIDMzLCAvKiDLIC0gMjAzICovCisgMTQgICAgICAsICA1MCwgLyogzCAtIDIwNCAqLworIDE0ICAgICAgLCAgNTAsIC8qIM0gLSAyMDUgKi8KKyAxNCAgICAgICwgIDUwLCAvKiDOIC0gMjA2ICovCisgMTQgICAgICAsICA1MCwgLyogzyAtIDIwNyAqLworIDE0ICAgICAgLCAgMjYsIC8qINAgLSAyMDggKi8KKyAxNCAgICAgICwgMTEyLCAvKiDRIC0gMjA5ICovCisgMTQgICAgICAsIDEyNCwgLyog0iAtIDIxMCAqLworIDE0ICAgICAgLCAxMjQsIC8qINMgLSAyMTEgKi8KKyAxNCAgICAgICwgMTI0LCAvKiDUIC0gMjEyICovCisgMTQgICAgICAsIDEyNCwgLyog1SAtIDIxMyAqLworIDE0ICAgICAgLCAxMjQsIC8qINYgLSAyMTQgKi8KKyAgOCAgICAgICwgIDI4LCAvKiDXIC0gMjE1ICovCisgMTQgICAgICAsIDEyNCwgLyog2CAtIDIxNiAqLworIDE0ICAgICAgLCAxNTksIC8qINkgLSAyMTcgKi8KKyAxNCAgICAgICwgMTU5LCAvKiDaIC0gMjE4ICovCisgMTQgICAgICAsIDE1OSwgLyog2yAtIDIxOSAqLworIDE0ICAgICAgLCAxNTksIC8qINwgLSAyMjAgKi8KKyAxNCAgICAgICwgMTY3LCAvKiDdIC0gMjIxICovCisgMTQgKyAzMiAsIDE1MywgLyog3iAtIDIyMiAqLworIDE0ICsgNDggLCAxNDUsIC8qIN8gLSAyMjMgKi8KKyAxNCAgICAgICwgICAyLCAvKiDgIC0gMjI0ICovCisgMTQgICAgICAsICAgMiwgLyog4SAtIDIyNSAqLworIDE0ICAgICAgLCAgIDIsIC8qIOIgLSAyMjYgKi8KKyAxNCAgICAgICwgICAyLCAvKiDjIC0gMjI3ICovCisgMTQgICAgICAsICAgMiwgLyog5CAtIDIyOCAqLworIDE0ICAgICAgLCAgIDIsIC8qIOUgLSAyMjkgKi8KKyAxNCArIDE2ICwgICAyLCAvKiDmIC0gMjMwICovCisgMTQgICAgICAsICAxMCwgLyog5yAtIDIzMSAqLworIDE0ICAgICAgLCAgMzMsIC8qIOggLSAyMzIgKi8KKyAxNCAgICAgICwgIDMzLCAvKiDpIC0gMjMzICovCisgMTQgICAgICAsICAzMywgLyog6iAtIDIzNCAqLworIDE0ICAgICAgLCAgMzMsIC8qIOsgLSAyMzUgKi8KKyAxNCAgICAgICwgIDUwLCAvKiDsIC0gMjM2ICovCisgMTQgICAgICAsICA1MCwgLyog7SAtIDIzNyAqLworIDE0ICAgICAgLCAgNTAsIC8qIO4gLSAyMzggKi8KKyAxNCAgICAgICwgIDUwLCAvKiDvIC0gMjM5ICovCisgMTQgICAgICAsICAyNiwgLyog8CAtIDI0MCAqLworIDE0ICAgICAgLCAxMTIsIC8qIPEgLSAyNDEgKi8KKyAxNCAgICAgICwgMTI0LCAvKiDyIC0gMjQyICovCisgMTQgICAgICAsIDEyNCwgLyog8yAtIDI0MyAqLworIDE0ICAgICAgLCAxMjQsIC8qIPQgLSAyNDQgKi8KKyAxNCAgICAgICwgMTI0LCAvKiD1IC0gMjQ1ICovCisgMTQgICAgICAsIDEyNCwgLyog9iAtIDI0NiAqLworICA4ICAgICAgLCAgMjksIC8qIPcgLSAyNDcgKi8KKyAxNCAgICAgICwgMTI0LCAvKiD4IC0gMjQ4ICovCisgMTQgICAgICAsIDE1OSwgLyog+SAtIDI0OSAqLworIDE0ICAgICAgLCAxNTksIC8qIPogLSAyNTAgKi8KKyAxNCAgICAgICwgMTU5LCAvKiD7IC0gMjUxICovCisgMTQgICAgICAsIDE1OSwgLyog/CAtIDI1MiAqLworIDE0ICAgICAgLCAxNjcsIC8qIP0gLSAyNTMgKi8KKyAxNCArIDMyICwgMTUzLCAvKiD+IC0gMjU0ICovCisgMTQgICAgICAsIDE2NyAgLyog/yAtIDI1NSAqLyB9OwogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fVW5pY29kZV9MVVRfMltdID0geyAzMywgNDQsIDE0NSB9OworCisjZGVmaW5lIExDTV9EaWFjcml0aWNfU3RhcnQgMTMxCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9EaWFjcml0aWNfTFVUW10gPSB7IAorMTIzLCAgLyoggyAtIDEzMSAqLworICAyLCAgLyoghCAtIDEzMiAqLworICAyLCAgLyoghSAtIDEzMyAqLworICAyLCAgLyoghiAtIDEzNCAqLworICAyLCAgLyoghyAtIDEzNSAqLworICAzLCAgLyogiCAtIDEzNiAqLworICAyLCAgLyogiSAtIDEzNyAqLworIDIwLCAgLyogiiAtIDEzOCAqLworICAyLCAgLyogiyAtIDEzOSAqLworICAyLCAgLyogjCAtIDE0MCAqLworICAyLCAgLyogjSAtIDE0MSAqLworICAyLCAgLyogjiAtIDE0MiAqLworICAyLCAgLyogjyAtIDE0MyAqLworICAyLCAgLyogkCAtIDE0NCAqLworICAyLCAgLyogkSAtIDE0NSAqLworICAyLCAgLyogkiAtIDE0NiAqLworICAyLCAgLyogkyAtIDE0NyAqLworICAyLCAgLyoglCAtIDE0OCAqLworICAyLCAgLyoglSAtIDE0OSAqLworICAyLCAgLyogliAtIDE1MCAqLworICAyLCAgLyoglyAtIDE1MSAqLworICAyLCAgLyogmCAtIDE1MiAqLworICAyLCAgLyogmSAtIDE1MyAqLworIDIwLCAgLyogmiAtIDE1NCAqLworICAyLCAgLyogmyAtIDE1NSAqLworICAyLCAgLyognCAtIDE1NiAqLworICAyLCAgLyognSAtIDE1NyAqLworICAyLCAgLyogniAtIDE1OCAqLworIDE5LCAgLyognyAtIDE1OSAqLworICAyLCAgLyogoCAtIDE2MCAqLworICAyLCAgLyogoSAtIDE2MSAqLworICAyLCAgLyogoiAtIDE2MiAqLworICAyLCAgLyogoyAtIDE2MyAqLworICAyLCAgLyogpCAtIDE2NCAqLworICAyLCAgLyogpSAtIDE2NSAqLworICAyLCAgLyogpiAtIDE2NiAqLworICAyLCAgLyogpyAtIDE2NyAqLworICAyLCAgLyogqCAtIDE2OCAqLworICAyLCAgLyogqSAtIDE2OSAqLworICAzLCAgLyogqiAtIDE3MCAqLworICAyLCAgLyogqyAtIDE3MSAqLworICAyLCAgLyogrCAtIDE3MiAqLworICAyLCAgLyogrSAtIDE3MyAqLworICAyLCAgLyogriAtIDE3NCAqLworICAyLCAgLyogryAtIDE3NSAqLworICAyLCAgLyogsCAtIDE3NiAqLworICAyLCAgLyogsSAtIDE3NyAqLworICAyLCAgLyogsiAtIDE3OCAqLworICAyLCAgLyogsyAtIDE3OSAqLworICAyLCAgLyogtCAtIDE4MCAqLworICAyLCAgLyogtSAtIDE4MSAqLworICAyLCAgLyogtiAtIDE4MiAqLworICAyLCAgLyogtyAtIDE4MyAqLworICAyLCAgLyoguCAtIDE4NCAqLworICAyLCAgLyoguSAtIDE4NSAqLworICAzLCAgLyoguiAtIDE4NiAqLworICAyLCAgLyoguyAtIDE4NyAqLworICAyLCAgLyogvCAtIDE4OCAqLworICAyLCAgLyogvSAtIDE4OSAqLworICAyLCAgLyogviAtIDE5MCAqLworICAyLCAgLyogvyAtIDE5MSAqLworIDE1LCAgLyogwCAtIDE5MiAqLworIDE0LCAgLyogwSAtIDE5MyAqLworIDE4LCAgLyogwiAtIDE5NCAqLworIDI1LCAgLyogwyAtIDE5NSAqLworIDE5LCAgLyogxCAtIDE5NiAqLworIDI2LCAgLyogxSAtIDE5NyAqLworICAyLCAgLyogxiAtIDE5OCAqLworIDI4LCAgLyogxyAtIDE5OSAqLworIDE1LCAgLyogyCAtIDIwMCAqLworIDE0LCAgLyogySAtIDIwMSAqLworIDE4LCAgLyogyiAtIDIwMiAqLworIDE5LCAgLyogyyAtIDIwMyAqLworIDE1LCAgLyogzCAtIDIwNCAqLworIDE0LCAgLyogzSAtIDIwNSAqLworIDE4LCAgLyogziAtIDIwNiAqLworIDE5LCAgLyogzyAtIDIwNyAqLworMTA0LCAgLyog0CAtIDIwOCAqLworIDI1LCAgLyog0SAtIDIwOSAqLworIDE1LCAgLyog0iAtIDIxMCAqLworIDE0LCAgLyog0yAtIDIxMSAqLworIDE4LCAgLyog1CAtIDIxMiAqLworIDI1LCAgLyog1SAtIDIxMyAqLworIDE5LCAgLyog1iAtIDIxNCAqLworICAyLCAgLyog1yAtIDIxNSAqLworIDMzLCAgLyog2CAtIDIxNiAqLworIDE1LCAgLyog2SAtIDIxNyAqLworIDE0LCAgLyog2iAtIDIxOCAqLworIDE4LCAgLyog2yAtIDIxOSAqLworIDE5LCAgLyog3CAtIDIyMCAqLworIDE0LCAgLyog3SAtIDIyMSAqLworICAyLCAgLyog3iAtIDIyMiAqLworICAyLCAgLyog3yAtIDIyMyAqLworIDE1LCAgLyog4CAtIDIyNCAqLworIDE0LCAgLyog4SAtIDIyNSAqLworIDE4LCAgLyog4iAtIDIyNiAqLworIDI1LCAgLyog4yAtIDIyNyAqLworIDE5LCAgLyog5CAtIDIyOCAqLworIDI2LCAgLyog5SAtIDIyOSAqLworICAyLCAgLyog5iAtIDIzMCAqLworIDI4LCAgLyog5yAtIDIzMSAqLworIDE1LCAgLyog6CAtIDIzMiAqLworIDE0LCAgLyog6SAtIDIzMyAqLworIDE4LCAgLyog6iAtIDIzNCAqLworIDE5LCAgLyog6yAtIDIzNSAqLworIDE1LCAgLyog7CAtIDIzNiAqLworIDE0LCAgLyog7SAtIDIzNyAqLworIDE4LCAgLyog7iAtIDIzOCAqLworIDE5LCAgLyog7yAtIDIzOSAqLworMTA0LCAgLyog8CAtIDI0MCAqLworIDI1LCAgLyog8SAtIDI0MSAqLworIDE1LCAgLyog8iAtIDI0MiAqLworIDE0LCAgLyog8yAtIDI0MyAqLworIDE4LCAgLyog9CAtIDI0NCAqLworIDI1LCAgLyog9SAtIDI0NSAqLworIDE5LCAgLyog9iAtIDI0NiAqLworICAyLCAgLyog9yAtIDI0NyAqLworIDMzLCAgLyog+CAtIDI0OCAqLworIDE1LCAgLyog+SAtIDI0OSAqLworIDE0LCAgLyog+iAtIDI1MCAqLworIDE4LCAgLyog+yAtIDI1MSAqLworIDE5LCAgLyog/CAtIDI1MiAqLworIDE0LCAgLyog/SAtIDI1MyAqLworICAyLCAgLyog/iAtIDI1NCAqLworIDE5LCAgLyog/yAtIDI1NSAqLworfSA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb252ZXJ0IGEgc3RyaW5nLCBvciBnZW5lcmF0ZSBhIHNvcnQga2V5IGZyb20gaXQuCisgKgorICogSWYgKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSksIHRoZSBmdW5jdGlvbiB3aWxsIGdlbmVyYXRlCisgKiBhIHNvcnQga2V5IGZvciB0aGUgc291cmNlIHN0cmluZy4gIEVsc2UsIGl0IHdpbGwgY29udmVydCBpdAorICogYWNjb3JkaW5nbHkgdG8gdGhlIGZsYWdzIExDTUFQX1VQUEVSQ0FTRSwgTENNQVBfTE9XRVJDQVNFLC4uLgorICoKKyAqIFJFVFVSTlMKKyAqICAgIEVycm9yIDogKGRlc3RpbmF0aW9uIGJ1ZmZlciB0b28gc21hbGwpIDAuCisgKiAgICBTdWNjZXNzIDogbGVuZ3RoIG9mIHRoZSByZXN1bHQgc3RyaW5nLgorICoKKyAqIFJFTUFSS1MKKyAqICAgIElmIGNhbGxlZCB3aXRoIHNjcmxlbiA9IC0xLCB0aGUgZnVuY3Rpb24gd2lsbCBjb21wdXRlIHRoZSBsZW5ndGgKKyAqICAgICAgb2YgdGhlIDAtdGVybWluYXRlZCBzdHJpbmcgc3Ryc3JjIGJ5IGl0c2VsZi4gICAgICAKKyAqLworIElOVDMyIFdJTkFQSSBMQ01hcFN0cmluZzMyQSgKKwlMQ0lEIGxjaWQgLyogbG9jYWxlIGlkZW50aWZpZXIgY3JlYXRlZCB3aXRoIE1BS0VMQ0lEOyAKKwkJICAgICBMT0NBTEVfU1lTVEVNX0RFRkFVTFQgYW5kIExPQ0FMRV9VU0VSX0RFRkFVTFQgYXJlIHByZWRlZmluZWQKKwkJICAgICB2YWx1ZXMuICovLAorCURXT1JEIG1hcGZsYWdzIC8qIGZsYWdzICovLAorCUxQQ1NUUiBzcmNzdHIgIC8qIHNvdXJjZSBidWZmZXIgKi8sCisJSU5UMzIgc3JjbGVuICAgLyogc291cmNlIGxlbmd0aCAqLywKKwlMUFNUUiBkc3RzdHIgICAvKiBkZXN0aW5hdGlvbiBidWZmZXIgKi8sCisJSU5UMzIgZHN0bGVuICAgLyogZGVzdGluYXRpb24gYnVmZmVyIGxlbmd0aCAqLykgCit7CisgIGludCBpOworIAorICBUUkFDRShzdHJpbmcsIigweCUwNGx4LDB4JTA4bHgsJXMsJWQsJXAsJWQpXG4iLAorCWxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuKTsKKworICBpZiAoKGRzdHN0cj09TlVMTCkgfHwgKHNyY3N0cj09TlVMTCkpCisgICAgcmV0dXJuIDA7CisgIGlmIChzcmNsZW49PS0xKSAKKyAgICBzcmNsZW4gPSBsc3RybGVuMzJBKHNyY3N0cik7CisKKyAgaWYgKG1hcGZsYWdzICYgfiAoIExDTUFQX1VQUEVSQ0FTRSB8IExDTUFQX0xPV0VSQ0FTRSB8IExDTUFQX1NPUlRLRVkgfAorCQkgICAgIFNPUlRfU1RSSU5HU09SVCkgKQorICB7CisgICAgRklYTUUoc3RyaW5nLCIoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKTogIgorCSAgInVuaW1wbGVtZW50ZWQgZmxhZ3M6IDB4JTA4bHhcbiIsCisJICBsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbixtYXBmbGFncyk7CisgIH0KKyAgCisgIGlmICggIShtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICkKKyAgeworICAgIGludCAoKmYpKGludCk9aWRlbnRpdHk7IAorCisgICAgaWYgKGRzdGxlbj09MCkKKyAgICAgIHJldHVybiBzcmNsZW47ICAvKiBkc3RsZW49MCBtZWFucyAiZG8gbm90aGluZyBidXQgcmV0dXJuIHJlcXVpcmVkIGxlbmd0aCIgKi8KKyAgICBpZiAoZHN0bGVuPHNyY2xlbikKKyAgICAgIHJldHVybiAwOyAgICAgICAvKiBpdCdzIGFuIGVycm9yICovCisgICAgaWYgKG1hcGZsYWdzICYgTENNQVBfVVBQRVJDQVNFKQorICAgICAgZiA9IHRvdXBwZXI7CisgICAgZWxzZSBpZiAobWFwZmxhZ3MgJiBMQ01BUF9MT1dFUkNBU0UpCisgICAgICBmID0gdG9sb3dlcjsKKyAgICBmb3IgKGk9MDsgaSA8IHNyY2xlbjsgaSsrKQorICAgICAgZHN0c3RyW2ldID0gKENIQVIpIGYoc3Jjc3RyW2ldKTsKKyAgICByZXR1cm4gc3JjbGVuOworICB9CisKKyAgLyogZWxzZSAuLi4gKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgICovCisgIHsKKyAgICBpbnQgdW5pY29kZV9sZW49MDsKKyAgICBpbnQgY2FzZV9sZW49MDsKKyAgICBpbnQgZGlhY3JpdGljX2xlbj0wOworICAgIGNoYXIgKmNhc2VfY29tcG9uZW50OworICAgIGNoYXIgKmRpYWNyaXRpY19jb21wb25lbnQ7CisgICAgaW50IHJvb20sY291bnQ7CisgICAgaW50IGZsYWdfc3RyaW5nc29ydCA9IG1hcGZsYWdzICYgU09SVF9TVFJJTkdTT1JUOworCisgICAgLyogY29tcHV0ZSBob3cgbXVjaCByb29tIHdlIHdpbGwgbmVlZCAqLworICAgIGZvciAoaT0wO2k8c3JjbGVuO2krKykKKyAgICB7CisgICAgICBpbnQgb2ZzOworICAgICAgaWYgKChzcmNzdHJbaV0hPSdcMCcpICYmIChmbGFnX3N0cmluZ3NvcnQgfHwgIWlzX3B1bmN0dWF0aW9uKHNyY3N0cltpXSkpKQorICAgICAgeworCXVuaWNvZGVfbGVuKys7CisJaWYoKCh1bnNpZ25lZCBjaGFyKXNyY3N0cltpXSk8PTMxKQorCXsKKwkgIEZJWE1FKHN0cmluZywiIGNvbnRyb2wgY2hhcmFjdGVycyBpbiBhcmd1bWVudCBzdHJpbmdcbiIpOworCSAgcmV0dXJuIDA7CisJfQorCWlmICggTENNX1VuaWNvZGVfTFVUWzIqKCh1bnNpZ25lZCBjaGFyKXNyY3N0cltpXS0zMildICYgfjE1ICkKKwkgIHVuaWNvZGVfbGVuKys7ICAgICAgICAgICAgIC8qIGRvdWJsZSBsZXR0ZXIgKi8KKyAgICAgIH0KKwkgIAorICAgICAgaWYgKGlzdXBwZXIoc3Jjc3RyW2ldKSkKKwljYXNlX2xlbj11bmljb2RlX2xlbjsgCisKKyAgICAgIG9mcyA9ICh1bnNpZ25lZCBjaGFyKXNyY3N0cltpXSAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CisgICAgICBpZiAoKG9mcz49MCkgJiYgKExDTV9EaWFjcml0aWNfTFVUW29mc10hPTIpKQorCWRpYWNyaXRpY19sZW49dW5pY29kZV9sZW47CisgICAgfQorCisgICAgcm9vbSA9ICAyICogdW5pY29kZV9sZW4gICAgICAgICAvKiAidW5pY29kZSIgY29tcG9uZW50ICovCisgICAgICArICAgICBkaWFjcml0aWNfbGVuICAgICAgICAgICAvKiAiZGlhY3JpdGljIiBjb21wb25lbnQgKi8KKyAgICAgICsgICAgIGNhc2VfbGVuICAgICAgICAgICAgICAgIC8qICJjYXNlIiBjb21wb25lbnQgKi8KKyAgICAgICsgICAgIDQgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvdXIgJ1wxJyBzZXBhcmF0b3JzICovCisgICAgICArICAgICAxICA7ICAgICAgICAgICAgICAgICAgICAvKiB0ZXJtaW5hbCAnXDAnICovCisgICAgaWYgKGRzdGxlbj09MCkKKyAgICAgIHJldHVybiByb29tOyAgICAgIAorICAgIGVsc2UgaWYgKGRzdGxlbjxyb29tKQorICAgICAgcmV0dXJuIDA7ICAgCisKKyAgICAvKiBsb2NhdGUgZWFjaCBjb21wb25lbnQsIHdyaXRlIHNlcGFyYXRvcnMgKi8KKyAgICBkaWFjcml0aWNfY29tcG9uZW50ID0gZHN0c3RyICsgMip1bmljb2RlX2xlbiA7CisgICAgKmRpYWNyaXRpY19jb21wb25lbnQrKyA9ICdcMSc7IAorCisgICAgY2FzZV9jb21wb25lbnQgPSBkaWFjcml0aWNfY29tcG9uZW50ICsgZGlhY3JpdGljX2xlbiA7CisgICAgKmNhc2VfY29tcG9uZW50KysgPSAnXDEnOyAKKworICAgIC8qIHJlYWQgc291cmNlIHN0cmluZyBjaGFyIGJ5IGNoYXIsIHdyaXRlIAorICAgICAgIGNvcnJlc3BvbmRpbmcgd2VpZ2h0IGluIGVhY2ggY29tcG9uZW50LiAqLworICAgIGZvciAoaT0wLGNvdW50PTA7Y291bnQ8dW5pY29kZV9sZW47aSsrKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgYz1zcmNzdHJbaV07CisgICAgICBpZiAoIChjIT0nXDAnKSAmJiAoZmxhZ19zdHJpbmdzb3J0IHx8ICFpc19wdW5jdHVhdGlvbihjKSkgKQorICAgICAgeworCWludCB0eXBlLGxvbmdjb2RlOworCWludCBMVVRfb2Zmc2V0ID0gMiooYy0zMik7CisJdHlwZSA9IExDTV9Vbmljb2RlX0xVVFtMVVRfb2Zmc2V0XTsKKwlsb25nY29kZSA9IHR5cGUgPj4gNDsKKwl0eXBlICY9IDE1OworCWRzdHN0clsyKmNvdW50XSA9IHR5cGU7CisJZHN0c3RyWzIqY291bnQrMV0gPSBMQ01fVW5pY29kZV9MVVRbTFVUX29mZnNldCsxXTsgIAorCWlmIChsb25nY29kZSkKKwl7CisJICBpZiAoY291bnQ8Y2FzZV9sZW4pCisJICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzcmNzdHJbaV0pID8gMTggOiAyICkgOworCSAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCisJICAgIGRpYWNyaXRpY19jb21wb25lbnRbY291bnRdID0gMjsgLyogYXNzdW1wdGlvbjogYSBkb3VibGUgbGV0dGVyCisJCQkJCSAgICAgICBpcyBuZXZlciBhY2NlbnRlZCAqLworCSAgY291bnQrKzsKKworCSAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKKwkgIGRzdHN0clsyKmNvdW50KzFdID0gKihMQ01fVW5pY29kZV9MVVRfMiAtIDEgKyBsb25nY29kZSk7IAorCSAgLyogMTYgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAxIAorCSAgICAgMzIgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAyIAorCSAgICAgNDggaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAzICovCisJfQorCisJaWYgKGNvdW50PGNhc2VfbGVuKQorCSAgY2FzZV9jb21wb25lbnRbY291bnRdID0gKCBpc3VwcGVyKHNyY3N0cltpXSkgPyAxOCA6IDIgKSA7CisJaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCisJeworCSAgaW50IG9mcyA9ICh1bnNpZ25lZCBjaGFyKXNyY3N0cltpXSAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CisJICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IChvZnM+PTAgPyBMQ01fRGlhY3JpdGljX0xVVFtvZnNdIDogMik7CisJfQorCWNvdW50Kys7CisgICAgICB9CisgICAgfQorICAgIGRzdHN0cltyb29tLTNdID0gZHN0c3RyW3Jvb20tMl0gPSAnXDEnOworICAgIGRzdHN0cltyb29tLTFdID0gJ1wwJzsKKyAgICByZXR1cm4gcm9vbTsKKyAgfQorfQorIAogSU5UMzIgV0lOQVBJIExDTWFwU3RyaW5nMzJXKAogCUxDSUQgbGNpZCxEV09SRCBtYXBmbGFncyxMUENXU1RSIHNyY3N0cixJTlQzMiBzcmNsZW4sTFBXU1RSIGRzdHN0ciwKLQlJTlQzMiBkc3RsZW4KLSkgewotCWludAlpLGxlbjsKKwlJTlQzMiBkc3RsZW4pCit7CisgIGludCBpOworIAorICBUUkFDRShzdHJpbmcsIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpXG4iLAorCWxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuKTsKIAotCVRSQUNFKHN0cmluZywiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZClcbiIsCi0JCWxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuCi0JKTsKLQlpZiAoIWRzdGxlbiB8fCAhZHN0c3RyKSB7Ci0JCWRzdHN0ciA9IChMUFdTVFIpc3Jjc3RyOwotCX0KLQlpZiAoIXNyY2xlbikgc3JjbGVuID0gbHN0cmxlbjMyVyhzcmNzdHIpOwotCWlmICghZHN0bGVuKSBkc3RsZW4gPSBsc3RybGVuMzJXKGRzdHN0cik7Ci0JbGVuID0gZHN0bGVuOwotCWlmIChzcmNsZW4gPCBsZW4pCi0JCWxlbiA9IHNyY2xlbjsKLQlpZiAobWFwZmxhZ3MgJiBMQ01BUF9MT1dFUkNBU0UpIHsKLQkJZm9yIChpPTA7aTxsZW47aSsrKQotCQkJZHN0c3RyW2ldPXRvbG93ZXIoc3Jjc3RyW2ldKTsKLQkJbWFwZmxhZ3MgJj0gfkxDTUFQX0xPV0VSQ0FTRTsKLQl9Ci0JaWYgKG1hcGZsYWdzICYgTENNQVBfVVBQRVJDQVNFKSB7Ci0JCWZvciAoaT0wO2k8bGVuO2krKykKLQkJCWRzdHN0cltpXT10b3VwcGVyKHNyY3N0cltpXSk7Ci0JCW1hcGZsYWdzICY9IH5MQ01BUF9VUFBFUkNBU0U7Ci0JfQotCWlmIChtYXBmbGFncykKLQkgIHsKLQkgICAgRklYTUUob2xlLCIoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKTogIgotCQkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAotCQkgIGxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuLG1hcGZsYWdzKTsKLQkgIH0KLQlyZXR1cm4gbGVuOworICBpZiAoKGRzdHN0cj09TlVMTCkgfHwgKHNyY3N0cj09TlVMTCkpCisgICAgcmV0dXJuIDA7CisgIGlmIChzcmNsZW49PS0xKSAKKyAgICBzcmNsZW4gPSBsc3RybGVuMzJXKHNyY3N0cik7CisgIGlmIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpIAorICB7CisgICAgRklYTUUoc3RyaW5nLCIoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKTogIgorCSAgInVuaW1wbGVtZW50ZWQgZmxhZ3M6IDB4JTA4bHhcbiIsCisJICBsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbixtYXBmbGFncyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZWxzZQorICB7CisgICAgaW50ICgqZikoaW50KT1pZGVudGl0eTsgCisKKyAgICBpZiAoZHN0bGVuPT0wKQorICAgICAgcmV0dXJuIHNyY2xlbjsgIAorICAgIGlmIChkc3RsZW48c3JjbGVuKQorICAgICAgcmV0dXJuIDA7ICAgICAgIAorICAgIGlmIChtYXBmbGFncyAmIExDTUFQX1VQUEVSQ0FTRSkKKyAgICAgIGYgPSB0b3VwcGVyOworICAgIGVsc2UgaWYgKG1hcGZsYWdzICYgTENNQVBfTE9XRVJDQVNFKQorICAgICAgZiA9IHRvbG93ZXI7CisgICAgZm9yIChpPTA7IGkgPCBzcmNsZW47IGkrKykKKyAgICAgIGRzdHN0cltpXSA9IChXQ0hBUikgZihzcmNzdHJbaV0pOworICAgIHJldHVybiBzcmNsZW47CisgIH0KIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiAgT0xFX0dldEZvcm1hdEEoKSBbaW50ZXJuYWxdCkBAIC0yNjI2LDEyICszMTM3LDExIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgIEdldE51bWJlckZvcm1hdDMyQQkoS0VSTkVMMzIuMzU1KQorICogTk9URTogdHlwZSBvZiBscEZvcm1hdCBzaG91bGQgYmUgQ09OU1QgTlVNQkVSRk9STUFUIAogICovCiBJTlQzMiBXSU5BUEkgR2V0TnVtYmVyRm9ybWF0MzJBKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAogCQkJICAgICAgIExQQ1NUUiBscHZhbHVlLCAgY2hhciAqbHBGb3JtYXQsCiAJCQkgICAgICAgTFBTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hOdW1iZXIpCi0vKiBOT1RFOiB0eXBlIG9mIGxwRm9ybWF0IHNob3VsZCBiZSBDT05TVCBOVU1CRVJGT1JNQVQgKi8KLQogewogIGludCBuOwogCkBAIC0yNzA0LDcgKzMyMTQsNiBAQAogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIEdldFRpbWVGb3JtYXQzMlcoKSAgW0tFUk5FTDMyLjQyM10gTWFrZXMgYSBVbmljb2RlIHN0cmluZyBvZiB0aGUgdGltZQogICogCi0KICAqCiAgKi8KIApAQCAtMjczNiwzOSArMzI0NSw0MCBAQAogICAgICAgcmVhbGZvcm1hdCA9IGZvcm1hdDsKICAgIH0gZWxzZSBpZiAobG9jYWxlKSB7CiAgICAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KKyAgICAgIHJldHZhbCA9IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVI7CiAgICAgICBmbXRfYnVmID0gbWFsbG9jKChmbXRfYnVmX3NpemUrPTcpICogc2l6ZW9mKFdDSEFSKSk7Ci0gICAgICBpZiAoIWZtdF9idWYpIHsKLQkgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwotCSBXQVJOKG9sZSwgImNvdWxkIG5vdCBhbGxvY2F0ZSAlZCBjaGFycyBvZiBtZW1vcnlcbiIsIGZtdF9idWZfc2l6ZSk7IAotCSByZXR1cm4gMDsKLSAgICAgIH07CisgICAgICBpZiAoIWZtdF9idWYpCisJZ290byBvdXRfbm9tZW07CisKICAgICAgIHdoaWxlKCFHZXRMb2NhbGVJbmZvMzJXKGxvY2FsZSwgTE9DQUxFX1NUSU1FRk9STUFULAogCQkJICAgICAgZm10X2J1ZiwgZm10X2J1Zl9zaXplKSkgewotCSBmbXRfYnVmID0gcmVhbGxvYyhmbXRfYnVmLCAKKwlyZXR2YWwgPSBFUlJPUl9PVVRPRk1FTU9SWTsKKwlmbXRfYnVmID0gcmVhbGxvYyhmbXRfYnVmLCAKIAkJCSAgIChmbXRfYnVmX3NpemUgKz0gMTApICogc2l6ZW9mKFdDSEFSKSk7Ci0JIGlmICghZm10X2J1ZikgewotCSAgICBTZXRMYXN0RXJyb3IoRVJST1JfT1VUT0ZNRU1PUlkpOwotCSAgICBXQVJOKG9sZSwgImNvdWxkIG5vdCBhbGxvY2F0ZSAlZCBjaGFycyBvZiBtZW1vcnlcbiIsIGZtdF9idWZfc2l6ZSk7IAotCSAgICByZXR1cm4gMDsKLQkgfTsKLSAgICAgIH07CisJaWYgKCFmbXRfYnVmKQorCQlnb3RvIG91dF9ub21lbTsKKyAgICAgIH0KICAgICAgIHJlYWxmb3JtYXQgPSBmbXRfYnVmOwogICAgfSBlbHNlIHsKICAgICAgIEZJWE1FKG9sZSwgICJjYWxsZXIgZ2F2ZSBubyBsb2NhbGUsICBubyBmb3JtYXQ7ICB3aGF0IHNob3VsZCB3ZSBkbz9cbiIpOwogICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0JBRF9GT1JNQVQpOwotICAgfTsKLSAgIGlmICghbG9jYWxlKSB7CisgICB9CisgICBpZiAoIWxvY2FsZSkKICAgICAgIGxvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7Ci19CiAKICAgIHJlYWx0aW1lID0geHRpbWU7CiAgICBpZiAoIXJlYWx0aW1lKSB7CiAgICAgICByZWFsdGltZSA9ICZ0OwogICAgICAgR2V0U3lzdGVtVGltZShyZWFsdGltZSk7Ci0gICB9OwotCisgICB9CiAKICAgIHJldHZhbCA9IE9MRV9HZXRGb3JtYXRXKGxvY2FsZSwgZmxhZ3MsIHJlYWx0aW1lLCByZWFsZm9ybWF0LCB0aW1lc3RyLCAgdGltZWxlbik7Ci0gICBpZiAoZm10X2J1ZikgZnJlZShmbXRfYnVmKTsKKyAgIGlmIChmbXRfYnVmKQorCWZyZWUoZm10X2J1Zik7CiAgICByZXR1cm4gcmV0dmFsOworCitvdXRfbm9tZW06CisJU2V0TGFzdEVycm9yKHJldHZhbCk7CisJV0FSTihvbGUsICJjb3VsZCBub3QgYWxsb2NhdGUgJWQgY2hhcnMgb2YgbWVtb3J5XG4iLCBmbXRfYnVmX3NpemUpOyAKKwlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL29sZS9zdG9yYWdlLmMgYi9vbGUvc3RvcmFnZS5jCmluZGV4IDA0ZGZkM2YuLjc2ODU0OWIgMTAwNjQ0Ci0tLSBhL29sZS9zdG9yYWdlLmMKKysrIGIvb2xlL3N0b3JhZ2UuYwpAQCAtNyw3ICs3LDYgQEAKICAqIENvcHlyaWdodCAxOTk4IE1hcmN1cyBNZWlzc25lcgogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTE1MDQsMjcgKzE1MDMsMjcgQEAKIAlPRlNUUlVDVAlvZnM7CiAJQllURQkJbWFnaWNbMjRdOwogCi0JVFJBQ0Uob2xlLCIoXCclc1wnKSIsZm4pOworCVRSQUNFKG9sZSwiKFwnJXNcJylcbiIsZm4pOwogCWhmID0gT3BlbkZpbGUzMihmbiwmb2ZzLE9GX1NIQVJFX0RFTllfTk9ORSk7CiAJaWYgKGhmPT1IRklMRV9FUlJPUjMyKQogCQlyZXR1cm4gU1RHX0VfRklMRU5PVEZPVU5EOwogCWlmICgyNCE9X2xyZWFkMzIoaGYsbWFnaWMsMjQpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCIgdG9vIHNob3J0XG4iKTsKKwkJV0FSTihvbGUsIiB0b28gc2hvcnRcbiIpOwogCQlfbGNsb3NlMzIoaGYpOwogCQlyZXR1cm4gU19GQUxTRTsKIAl9CiAJaWYgKCFtZW1jbXAobWFnaWMsU1RPUkFHRV9tYWdpYyw4KSkgewotCQlmcHJpbnRmKHN0ZGVyciwiIC0+IFlFU1xuIik7CisJCVdBUk4ob2xlLCIgLT4gWUVTXG4iKTsKIAkJX2xjbG9zZTMyKGhmKTsKIAkJcmV0dXJuIFNfT0s7CiAJfQogCWlmICghbWVtY21wKG1hZ2ljLFNUT1JBR0Vfbm90bWFnaWMsOCkpIHsKLQkJZnByaW50ZihzdGRlcnIsIiAtPiBOT1xuIik7CisJCVdBUk4ob2xlLCIgLT4gTk9cbiIpOwogCQlfbGNsb3NlMzIoaGYpOwogCQlyZXR1cm4gU19GQUxTRTsKIAl9CiAJaWYgKCFtZW1jbXAobWFnaWMsU1RPUkFHRV9vbGRtYWdpYyw4KSkgewotCQlmcHJpbnRmKHN0ZGVyciwiIC0+IG9sZCBmb3JtYXRcbiIpOworCQlXQVJOKG9sZSwiIC0+IG9sZCBmb3JtYXRcbiIpOwogCQlfbGNsb3NlMzIoaGYpOwogCQlyZXR1cm4gU1RHX0VfT0xERk9STUFUOwogCX0KQEAgLTE1NjAsNyArMTU1OSw3IEBACiAJX2NyZWF0ZV9pc3RvcmFnZTE2KHBwc3RnT3Blbik7CiAJaGYgPSBDcmVhdGVGaWxlMzJBKHB3Y3NOYW1lLEdFTkVSSUNfUkVBRCwwLE5VTEwsMCwwLDApOwogCWlmIChoZj09SU5WQUxJRF9IQU5ETEVfVkFMVUUzMikgewotCQlmcHJpbnRmKHN0ZGVyciwiY291bGRuJ3Qgb3BlbiBmaWxlIGZvciBzdG9yYWdlXG4iKTsKKwkJV0FSTihvbGUsIkNvdWxkbid0IG9wZW4gZmlsZSBmb3Igc3RvcmFnZVxuIik7CiAJCXJldHVybiBFX0ZBSUw7CiAJfQogCWxwc3RnID0gKExQU1RPUkFHRTE2KVBUUl9TRUdfVE9fTElOKCpwcHN0Z09wZW4pOwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvY2xvY2svQ2hhbmdlTG9nIGIvcHJvZ3JhbXMvY2xvY2svQ2hhbmdlTG9nCmluZGV4IDVkOWM3OTEuLjExNjI3NjUgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL2Nsb2NrL0NoYW5nZUxvZworKysgYi9wcm9ncmFtcy9jbG9jay9DaGFuZ2VMb2cKQEAgLTEsMTMgKzEsMjcgQEAKK1RodSBNYXkgMjggMjA6NDI6MTMgMTk5OCAgTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgorICAgICAgICogW2xhbmd1YWdlLmNdCisgICAgICAgICBVcGRhdGVXaW5kb3dDYXB0aW9uKCksIGxvY2FsZSBhbmQgZGF0ZQorICAgICAgICAgVXBkYXRlTWVudUNoZWNrbWFya3MoKQorICAgICAgICAgR2VuZXJhbCBjb2RlIGNsZWFudXAgKHJlbW92ZWQgb2Jzb2xldGUgcHJpbnRmJ3MpCisgICAgICAgICAKK1RodSBNYXkgMjggMjA6MTA6MzYgMTk5OCAgTWlrb2xhaiBaYWxld3NraSA8bWlrb2xhanpAaWRzLmVkdS5wbD4KKyAgICAgICAqIFttYWluLmNdIFt3aW5jbG9jay5oXQorICAgICAgICAgRml4ZWQgZGVzdHJveWVkIGJhY2tncm91bmQKKworTW9uIE1heSAyNSAxNDozMDozMiAxOTk4ICBIZW5yaWsgT2xzZW4gPGhlbnJpa0BpYWVzdGUuZGs+CisgICAgICAgKiBbRGEucmNdCisgICAgICAgICBBZGRlZCBEYW5pc2ggbGFuZ3VhZ2Ugc3VwcG9ydC4KKwogV2VkIE1hciAxMSAyMzoxMDozNyAxOTk4ICBLYXJsIEJhY2tzdHL2bSA8a2FybF9iQGdlb2NpdGllcy5jb20+CiAgICAgICAgKiBbbWFpbi5jXQotCSBTdGFydGVkIHdpdGggdGhlIGRpZ2l0YWwgY2xvY2suCisgICAgICAgICBTdGFydGVkIHdpdGggdGhlIGRpZ2l0YWwgY2xvY2suCiAKIFR1ZSBGZWIgMjQgMjM6MjY6NDAgMTk5OCAgS2FybCBCYWNrc3Ry9m0gPGthcmxfYkBnZW9jaXRpZXMuY29tPgogICAgICAgICogW2xhbmd1YWdlLmNdIFtsYW5ndWFnZS5oXSBORVcKLQkgTW92ZWQgbGFuZ3VhZ2Ugc3R1ZmYgaGVyZS4KKyAgICAgICAgIE1vdmVkIGxhbmd1YWdlIHN0dWZmIGhlcmUuCiAgICAgICAgKiBbbWFpbi5jXSBbd2luY2xvY2suY10gW2Nsb2NrLnJjXQotCSBNYWRlIHRoZSBjbG9jayBhcHBlYXIgaW4gdGhlIGNlbnRlci4KLQkgRml4ZWQgcHJvYmxlbXMgd2l0aCBtZW51ZXMuCisgICAgICAgICBNYWRlIHRoZSBjbG9jayBhcHBlYXIgaW4gdGhlIGNlbnRlci4KKyAgICAgICAgIEZpeGVkIHByb2JsZW1zIHdpdGggbWVudWVzLgogCiBNb24gRmViIDIzIDE5OjU5OjI3IDE5OTggIE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KICAgICAgICAqIFtDaGFuZ2VMb2ddIFtEZS5yY10gW0VuLnJjXSBbU3cucmNdIFtjbG9jay5yY10KQEAgLTE1LDQgKzI5LDUgQEAKICAgICAgICAgIFtSRUFETUVdIFtUT0RPXQogICAgICAgICAgW21haW4uY10gW21haW4uaF0gW3dpbmNsb2NrLmNdIFt3aW5jbG9jay5oXQogCi0JIE9yaWdpbmFscyBieSBNYXJjZWwgQmF1cgorICAgICAgICAgT3JpZ2luYWxzIGJ5IE1hcmNlbCBCYXVyCisKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2Nsb2NrL0RhLnJjIGIvcHJvZ3JhbXMvY2xvY2svRGEucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUzYzMwYwotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL2Nsb2NrL0RhLnJjCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDbG9jayAoRGFuaXNoIHJlc291cmNlcykKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBIZW5yaWsgT2xzZW4gPGhlbnJpa0BpYWVzdGUuZGs+CisgKi8KKworI2RlZmluZSBMQU5HVUFHRV9JRCAgICAgICAgICAgICAgICAgIERhCisjZGVmaW5lIExBTkdVQUdFX05VTUJFUiAgICAgICAgICAgICAgNgorI2RlZmluZSBMQU5HVUFHRV9NRU5VX0lURU0gICAgICAgICAgICImRGFuc2siCisKKy8qIE1lbnUgKi8KKworI2RlZmluZSBNRU5VX1BST1BFUlRJRVMgICAgICAgICAgICAgICImSW5zdGlsbGluZ2VyIgorI2RlZmluZSBNRU5VX0FOQUxPRyAgICAgICAgICAgICAgICAgICImQW5hbG9nIgorI2RlZmluZSBNRU5VX0RJR0lUQUwgICAgICAgICAgICAgICAgICImRGlnaXRhbCIKKyNkZWZpbmUgTUVOVV9GT05UICAgICAgICAgICAgICAgICAgICAiJlNrcmlmdHR5cGUuLi4iCisjZGVmaW5lIE1FTlVfV0lUSE9VVF9USVRMRSAgICAgICAgICAgIlNranVsIFRpdGVsJmxpbmplIgorI2RlZmluZSBNRU5VX09OX1RPUCAgICAgICAgICAgICAgICAgICImQWx0aWQg+HZlcnN0IgorI2RlZmluZSBNRU5VX1NFQ09ORFMgICAgICAgICAgICAgICAgICJTZSZrdW5kZXIiCisjZGVmaW5lIE1FTlVfREFURSAgICAgICAgICAgICAgICAgICAgIkRhJnRvIgorCisjZGVmaW5lIE1FTlVfTEFOR1VBR0UgICAgICAgICAgICAgICAgIlMmcHJvZyIKKworI2RlZmluZSBNRU5VX0lORk8gICAgICAgICAgICAgICAgICAgICJJbmYmby4uLiIKKyNkZWZpbmUgTUVOVV9JTkZPX0xJQ0VOU0UgICAgICAgICAgICAiJkxpY2VucyIKKyNkZWZpbmUgTUVOVV9JTkZPX05PX1dBUlJBTlRZICAgICAgICAiJk5PIFdBUlJBTlRZIgorI2RlZmluZSBNRU5VX0lORk9fQUJPVVRfV0lORSAgICAgICAgICImT20gVXIuLi4iCisKKy8qIFN0cmluZ3MgKi8KKyNkZWZpbmUgU1RSSU5HX0NMT0NLICAgICAgICAgICAgICAgICAiVXIiCisKKworI2luY2x1ZGUgImNsb2NrLnJjIgpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvY2xvY2svTWFrZWZpbGUuaW4gYi9wcm9ncmFtcy9jbG9jay9NYWtlZmlsZS5pbgppbmRleCAwNmIzN2QxLi5mZGJkMmNjIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9jbG9jay9NYWtlZmlsZS5pbgorKysgYi9wcm9ncmFtcy9jbG9jay9NYWtlZmlsZS5pbgpAQCAtOCw3ICs4LDcgQEAKIEFMTF9MSUJTICA9ICQoV0lORUxJQikgJChYX0xJQlMpICQoWFBNX0xJQikgJChYTElCKSAkKExJQlMpCiBSQ0ZMQUdTICAgPSAtdzMyIC1oCiAKLUxBTkdVQUdFUyAgID0gRW4gRGUgU3cKK0xBTkdVQUdFUyAgID0gRW4gRGEgRGUgU3cKIExJQ0VOU0VMQU5HID0gRW4KIAogTU9TVFNSQ1MgPSBcCkBAIC0zNCw2ICszNCwyMyBAQAogCiBATUFLRV9SVUxFU0AKIAorIyBSdWxlcyBmb3IgdXNpbmcgb2xkIHJlc291cmNlIGNvbXBpbGVyCisucmMuYzoKKwllY2hvICIjaW5jbHVkZSBcIndpbmRvd3MuaFwiIiA+JCotdG1wLmMKKwllY2hvIFdJTkRPV1NfSF9FTkRTX0hFUkUgPj4kKi10bXAuYworCWNhdCAkPCA+PiQqLXRtcC5jCisJJChDUFApICQoREVGUykgJChPUFRJT05TKSAkKERJVklOQ0wpIC1EUkNfSU5WT0tFRCAtUCAkKi10bXAuYyB8IHNlZCAtZSAnMSwvXldJTkRPV1NfSF9FTkRTX0hFUkUvZCcgfCAkKFdJTkVSQykgJChSQ0ZMQUdTKSAtYyAtbyAkKiAtcCAkKgorCSQoUk0pICQqLXRtcC5jCisucmMuaDoKKwllY2hvICIjaW5jbHVkZSBcIndpbmRvd3MuaFwiIiA+JCotdG1wLmMKKwllY2hvIFdJTkRPV1NfSF9FTkRTX0hFUkUgPj4kKi10bXAuYworCWNhdCAkPCA+PiQqLXRtcC5jCisJJChDUFApICQoREVGUykgJChPUFRJT05TKSAkKERJVklOQ0wpIC1EUkNfSU5WT0tFRCAtUCAkKi10bXAuYyB8IHNlZCAtZSAnMSwvXldJTkRPV1NfSF9FTkRTX0hFUkUvZCcgfCAkKFdJTkVSQykgJChSQ0ZMQUdTKSAtYyAtbyAkKiAtcCAkKgorCSQoUk0pICQqLXRtcC5jCitjbGVhbjo6CisJJChSTSkgJChSQ19TUkNTOi5yYz0uYykKKworCiBjbG9jazogJChNT1NUT0JKUykgJChTVFJJTkdPQkpTKQogCSQoQ0MpIC1vIGNsb2NrICQoTU9TVE9CSlMpICQoTERPUFRJT05TKSAkKEFMTF9MSUJTKSAkKFNUUklOR09CSlMpCiAKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2Nsb2NrL2xhbmd1YWdlLmMgYi9wcm9ncmFtcy9jbG9jay9sYW5ndWFnZS5jCmluZGV4IGM1NjgzZDYuLmFhOTIwYTcgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL2Nsb2NrL2xhbmd1YWdlLmMKKysrIGIvcHJvZ3JhbXMvY2xvY2svbGFuZ3VhZ2UuYwpAQCAtOSwxMiArOSw3MyBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJtYWluLmgiCiAjaW5jbHVkZSAibGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICJ3aW5ubHMuaCIKICNpZmRlZiBXSU5FTElCCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2VuZGlmCiAKIENIQVIgU1RSSU5HX01FTlVfWHhbXSAgICAgID0gIk1FTlVfWHgiOwogCitWT0lEIExBTkdVQUdFX1VwZGF0ZU1lbnVDaGVja21hcmtzKFZPSUQpIHsKKworICAgIGlmKEdsb2JhbHMuYkFuYWxvZyA9PSBUUlVFKSB7CisgICAgCisgICAgICAgIC8qIGFuYWxvZyBjbG9jayAqLworICAgICAgICAKKyAgICAgICAgQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfQU5BTE9HLCBcCisgICAgICAgICAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX0NIRUNLRUQpOworICAgICAgICBDaGVja01lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9ESUdJVEFMLCBcCisgICAgICAgICAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX1VOQ0hFQ0tFRCk7CisgICAgICAgIEVuYWJsZU1lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9GT05ULCBcCisgICAgICAgICAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX0dSQVlFRCk7CisgICAgfQorICAgICAgICBlbHNlIAorICAgIHsKKyAgICAKKyAgICAgICAgLyogZGlnaXRhbCBjbG9jayAqLworICAgICAgICAKKyAgICAgICAgQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfQU5BTE9HLCBcCisgICAgICAgICAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX1VOQ0hFQ0tFRCk7CisgICAgICAgIENoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX0RJR0lUQUwsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgTUZfQllDT01NQU5EIHwgTUZfQ0hFQ0tFRCk7CisgICAgfQorICAgIAorICAgIENoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX1dJVEhPVVRfVElUTEUsIE1GX0JZQ09NTUFORCB8IFwKKyAgICAgICAgICAgICAgICAgKEdsb2JhbHMuYldpdGhvdXRUaXRsZSA/IE1GX0NIRUNLRUQgOiBNRl9VTkNIRUNLRUQpKTsKKyAgICBDaGVja01lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9PTl9UT1AsIE1GX0JZQ09NTUFORCB8IFwKKyAgICAgICAgICAgICAgICAgKEdsb2JhbHMuYkFsd2F5c09uVG9wID8gTUZfQ0hFQ0tFRCA6IE1GX1VOQ0hFQ0tFRCkpOworICAgIENoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX1NFQ09ORFMsIE1GX0JZQ09NTUFORCB8IFwKKyAgICAgICAgICAgICAgICAgKEdsb2JhbHMuYlNlY29uZHMgPyBNRl9DSEVDS0VEIDogTUZfVU5DSEVDS0VEKSk7CisgICAgQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfREFURSwgTUZfQllDT01NQU5EIHwgXAorICAgICAgICAgICAgICAgICAoR2xvYmFscy5iRGF0ZSA/IE1GX0NIRUNLRUQgOiBNRl9VTkNIRUNLRUQpKTsKK30KKworVk9JRCBMQU5HVUFHRV9VcGRhdGVXaW5kb3dDYXB0aW9uKFZPSUQpIHsKKworICBDSEFSIHN6Q2FwdGlvbltNQVhfU1RSSU5HX0xFTl07CisgIENIQVIgc3pEYXRlW01BWF9TVFJJTkdfTEVOXTsKKyAgCisgIExQU1RSIGRhdGUgPSBzekRhdGU7CisgIAorICBTWVNURU1USU1FIHN0OworICBMUFNZU1RFTVRJTUUgbHBzdCA9ICZzdDsKKworICBHZXRMb2NhbFRpbWUoJnN0KTsKKyAgR2V0RGF0ZUZvcm1hdChMT0NBTEVfVVNFUl9ERUZBVUxULCBMT0NBTEVfU0xPTkdEQVRFLCBscHN0LCBOVUxMLCBkYXRlLAorICAgICAgICAgICAgICAgIE1BWF9TVFJJTkdfTEVOKTsKKworICAvKiBTZXQgZnJhbWUgY2FwdGlvbiAqLworICBMb2FkU3RyaW5nKEdsb2JhbHMuaEluc3RhbmNlLCBJRFNfQ0xPQ0ssIHN6Q2FwdGlvbiwgc2l6ZW9mKHN6Q2FwdGlvbikpOworICBpZiAoR2xvYmFscy5iRGF0ZSkgeworICAgICBsc3RyY2F0KHN6Q2FwdGlvbiwgIiAtICIpOworICAgICBsc3RyY2F0KHN6Q2FwdGlvbiwgc3pEYXRlKTsKKyAgfQorICBTZXRXaW5kb3dUZXh0KEdsb2JhbHMuaE1haW5XbmQsIHN6Q2FwdGlvbik7CisKK30KKworCisKIHN0YXRpYyBCT09MIExBTkdVQUdFX0xvYWRTdHJpbmdPdGhlcihVSU5UIG51bSwgVUlOVCBpZHMsIExQU1RSIHN0ciwgVUlOVCBsZW4pCiB7CiAgIGlkcyAtPSBHbG9iYWxzLndTdHJpbmdUYWJsZU9mZnNldDsKQEAgLTI5LDE4ICs5MCwxOCBAQAogCiAgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xBTkdVQUdFX05VTUJFUjsgaSsrKQogICAgIGlmIChMQU5HVUFHRV9Mb2FkU3RyaW5nT3RoZXIoaSwgSURTX0xBTkdVQUdFX0lELCBuZXdsYW5nLCBzaXplb2YobmV3bGFuZykpICYmCi0JIWxzdHJjbXAobGFuZywgbmV3bGFuZykpCisgICAgICAgICFsc3RyY21wKGxhbmcsIG5ld2xhbmcpKQogICAgICAgewogICAgICAgICBMQU5HVUFHRV9TZWxlY3RCeU51bWJlcihpKTsKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKICAgICAgIH0KIAogICAvKiBGYWxsYmFjayAqLwogICAgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xBTkdVQUdFX05VTUJFUjsgaSsrKQogICAgIGlmIChMQU5HVUFHRV9Mb2FkU3RyaW5nT3RoZXIoaSwgSURTX0xBTkdVQUdFX0lELCBuZXdsYW5nLCBzaXplb2YobmV3bGFuZykpKQogICAgICAgewotCUxBTkdVQUdFX1NlbGVjdEJ5TnVtYmVyKGkpOwotCXJldHVybjsKKyAgICAgICAgTEFOR1VBR0VfU2VsZWN0QnlOdW1iZXIoaSk7CisgICAgICAgIHJldHVybjsKICAgICAgIH0KIAogICBNZXNzYWdlQm94KEdsb2JhbHMuaE1haW5XbmQsICJObyBsYW5ndWFnZSBmb3VuZCIsICJGQVRBTCBFUlJPUiIsIE1CX09LKTsKQEAgLTUxLDcgKzExMiw3IEBACiB7CiAgIElOVCAgICBpOwogICBDSEFSICAgbGFuZ1szXTsKLSAgQ0hBUiAgIGNhcHRpb25bTUFYX1NUUklOR19MRU5dOworCiAgIENIQVIgICBpdGVtW01BWF9TVFJJTkdfTEVOXTsKICAgSE1FTlUgIGhNYWluTWVudTsKIApAQCAtNjIsOSArMTIzLDcgQEAKICAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgSURTX0xBTkdVQUdFX0lELCBsYW5nLCBzaXplb2YobGFuZykpOwogICBHbG9iYWxzLmxwc3pMYW5ndWFnZSA9IGxhbmc7CiAKLSAgLyogU2V0IGZyYW1lIGNhcHRpb24gKi8KLSAgTG9hZFN0cmluZyhHbG9iYWxzLmhJbnN0YW5jZSwgSURTX0NMT0NLLCBjYXB0aW9uLCBzaXplb2YoY2FwdGlvbikpOwotICBTZXRXaW5kb3dUZXh0KEdsb2JhbHMuaE1haW5XbmQsIGNhcHRpb24pOworICBMQU5HVUFHRV9VcGRhdGVXaW5kb3dDYXB0aW9uKCk7CiAKICAgLyogQ2hhbmdlIFJlc291cmNlIG5hbWVzICovCiAgIGxzdHJjcHluKFNUUklOR19NRU5VX1h4ICAgICsgc2l6ZW9mKFNUUklOR19NRU5VX1h4KSAgICAtIDMsIGxhbmcsIDMpOwpAQCAtNzIsOCArMTMxLDggQEAKICAgLyogQ3JlYXRlIG1lbnUgKi8KICAgaE1haW5NZW51ID0gTG9hZE1lbnUoR2xvYmFscy5oSW5zdGFuY2UsIFNUUklOR19NRU5VX1h4KTsKICAgICBHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSAgICAgPSBHZXRTdWJNZW51KGhNYWluTWVudSwgMCk7Ci0gICAgR2xvYmFscy5oTGFuZ3VhZ2VNZW51IAk9IEdldFN1Yk1lbnUoaE1haW5NZW51LCAxKTsKLSAgICBHbG9iYWxzLmhJbmZvTWVudSAgICAgCT0gR2V0U3ViTWVudShoTWFpbk1lbnUsIDIpOworICAgIEdsb2JhbHMuaExhbmd1YWdlTWVudSAgICAgICA9IEdldFN1Yk1lbnUoaE1haW5NZW51LCAxKTsKKyAgICBHbG9iYWxzLmhJbmZvTWVudSAgICAgICAgICAgPSBHZXRTdWJNZW51KGhNYWluTWVudSwgMik7CiAKICAgLyogUmVtb3ZlIGR1bW15IGl0ZW0gKi8KICAgUmVtb3ZlTWVudShHbG9iYWxzLmhMYW5ndWFnZU1lbnUsIDAsIE1GX0JZUE9TSVRJT04pOwpAQCAtODEsNyArMTQwLDcgQEAKICAgZm9yIChpID0gMDsgaSA8PSBNQVhfTEFOR1VBR0VfTlVNQkVSOyBpKyspCiAgICAgaWYgKExBTkdVQUdFX0xvYWRTdHJpbmdPdGhlcihpLCBJRFNfTEFOR1VBR0VfTUVOVV9JVEVNLCBpdGVtLCBzaXplb2YoaXRlbSkpKQogICAgICAgQXBwZW5kTWVudShHbG9iYWxzLmhMYW5ndWFnZU1lbnUsIE1GX1NUUklORyB8IE1GX0JZQ09NTUFORCwKLQkJIENMX0ZJUlNUX0xBTkdVQUdFICsgaSwgaXRlbSk7CisgICAgICAgICAgICAgICAgIENMX0ZJUlNUX0xBTkdVQUdFICsgaSwgaXRlbSk7CiAKICAgU2V0TWVudShHbG9iYWxzLmhNYWluV25kLCBoTWFpbk1lbnUpOwogCkBAIC05MywzMiArMTUyLDExIEBACiAgIC8qIFVwZGF0ZSBzeXN0ZW0gbWVudXMgKi8KICAgZm9yIChpID0gMDsgTGFuZ3VhZ2VzW2ldLm5hbWUgJiYgbHN0cmNtcChsYW5nLCBMYW5ndWFnZXNbaV0ubmFtZSk7KSBpKys7CiAgIGlmIChMYW5ndWFnZXNbaV0ubmFtZSkgT3B0aW9ucy5sYW5ndWFnZSA9IGk7Ci0KICNlbmRpZgogCi0vKiBTcGVjaWZpYyBmb3IgY2xvY2sgKi8KLWlmKEdsb2JhbHMuYkFuYWxvZyA9PSBUUlVFKSB7Ci0JQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfQU5BTE9HLCBcCi0gICAgICAgICAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX0NIRUNLRUQpOwotICAgICAgICBDaGVja01lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9ESUdJVEFMLCBcCi0gICAgICAgICAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX1VOQ0hFQ0tFRCk7Ci0JRW5hYmxlTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX0ZPTlQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgTUZfQllDT01NQU5EIHwgTUZfR1JBWUVEKTsKLX0KLWVsc2UgewotCUNoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX0FOQUxPRywgXAotICAgICAgICAgICAgICAgICAgICAgICBNRl9CWUNPTU1BTkQgfCBNRl9VTkNIRUNLRUQpOwotICAgICAgICBDaGVja01lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9ESUdJVEFMLCBcCi0gICAgICAgICAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX0NIRUNLRUQpOwotfQotCUNoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX1dJVEhPVVRfVElUTEUsIE1GX0JZQ09NTUFORCB8IFwKLQkgICAgICAgICAgICAgICAgICAgICAoR2xvYmFscy5iV2l0aG91dFRpdGxlID8gTUZfQ0hFQ0tFRCA6IE1GX1VOQ0hFQ0tFRCkpOwotCUNoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX09OX1RPUCwgTUZfQllDT01NQU5EIHwgXAotCSAgICAgICAgICAgICAgICAgICAgIChHbG9iYWxzLmJBbHdheXNPblRvcCA/IE1GX0NIRUNLRUQgOiBNRl9VTkNIRUNLRUQpKTsKLQlDaGVja01lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9TRUNPTkRTLCBNRl9CWUNPTU1BTkQgfCBcCi0JICAgICAgICAgICAgICAgICAgICAgKEdsb2JhbHMuYlNlY29uZHMgPyBNRl9DSEVDS0VEIDogTUZfVU5DSEVDS0VEKSk7Ci0JQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfREFURSwgTUZfQllDT01NQU5EIHwgXAotCSAgICAgICAgICAgICAgICAgICAgIChHbG9iYWxzLmJEYXRlID8gTUZfQ0hFQ0tFRCA6IE1GX1VOQ0hFQ0tFRCkpOworICAgLyogc3BlY2lmaWMgZm9yIENsb2NrOiAqLworCisgICBMQU5HVUFHRV9VcGRhdGVNZW51Q2hlY2ttYXJrcygpOwogfQogCiBWT0lEIExBTkdVQUdFX0RlZmF1bHRIYW5kbGUoV1BBUkFNIHdQYXJhbSkKQEAgLTEzMCwyMCArMTY4LDE5IEBACiAKIFZPSUQgTEFOR1VBR0VfSW5pdChWT0lEKQogeworICBDSEFSIHN6QnVmZmVyW01BWF9QQVRITkFNRV9MRU5dOworCiAgICNpZmRlZiBXSU5FTElCCiAgICBHbG9iYWxzLmxwc3pMYW5ndWFnZSA9IExhbmd1YWdlc1tPcHRpb25zLmxhbmd1YWdlXS5uYW1lOwogICAjZW5kaWYKLS8vICAjZWxzZQotICBwcmludGYoIkdsb2JhbHMubHBzekxhbmd1YWdlID09ICVzXG4iLCBHbG9iYWxzLmxwc3pMYW5ndWFnZSk7CisgIAogICBpZiAoR2xvYmFscy5scHN6TGFuZ3VhZ2UgPT0gIkVuIikgewotICAgIENIQVIgYnVmZmVyW01BWF9QQVRITkFNRV9MRU5dLCAqcDsKLSAgICBwcmludGYoIk11dVxuIik7Ci0gICAgUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCJwcm9ncmFtcyIsICJsYW5ndWFnZSIsICJFbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKLSAgR2xvYmFscy5scHN6TGFuZ3VhZ2UgPSBwID0gTG9jYWxMb2NrKExvY2FsQWxsb2MoTE1FTV9GSVhFRCwgbHN0cmxlbihidWZmZXIpKSk7Ci0gIGhtZW1jcHkocCwgYnVmZmVyLCAxICsgbHN0cmxlbihidWZmZXIpKTsgfQotLy8gICNlbmRpZgotLy8gIGlmICghR2xvYmFscy5scHN6TGFuZ3VhZ2UpIEdsb2JhbHMubHBzekxhbmd1YWdlID0gIkVuIjsKKyAgICAgICAgUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCJwcm9ncmFtcyIsICJsYW5ndWFnZSIsICJFbiIsIHN6QnVmZmVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3pCdWZmZXIpKTsgICAgICAgCisgICAgICAgIEdsb2JhbHMubHBzekxhbmd1YWdlID0gTG9jYWxMb2NrKExvY2FsQWxsb2MoTE1FTV9GSVhFRCwgbHN0cmxlbihzekJ1ZmZlcikpKTsKKworICAgICAgICBobWVtY3B5KEdsb2JhbHMubHBzekxhbmd1YWdlLCBzekJ1ZmZlciwgMStsc3RybGVuKHN6QnVmZmVyKSk7IAorICB9CiB9CiAKIC8qIExvY2FsIFZhcmlhYmxlczogICAgKi8KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL2Nsb2NrL2xhbmd1YWdlLmggYi9wcm9ncmFtcy9jbG9jay9sYW5ndWFnZS5oCmluZGV4IDI3ZDVjNDguLjM2MzMxYWYgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL2Nsb2NrL2xhbmd1YWdlLmgKKysrIGIvcHJvZ3JhbXMvY2xvY2svbGFuZ3VhZ2UuaApAQCAtNSw2ICs1LDggQEAKICAqIENvcHlyaWdodCAxOTk4IEthcmwgQmFja3N0cvZtIDxrYXJsX2JAZ2VvY2l0aWVzLmNvbT4KICAqLwogCitWT0lEIExBTkdVQUdFX1VwZGF0ZVdpbmRvd0NhcHRpb24oVk9JRCk7CitWT0lEIExBTkdVQUdFX1VwZGF0ZU1lbnVDaGVja21hcmtzKFZPSUQpOwogVk9JRCBMQU5HVUFHRV9TZWxlY3RCeU51bWJlcihVSU5UIG51bSk7CiBWT0lEIExBTkdVQUdFX1NlbGVjdEJ5TmFtZShMUENTVFIgbGFuZyk7CiBWT0lEIExBTkdVQUdFX0RlZmF1bHRIYW5kbGUoV1BBUkFNIHdQYXJhbSk7CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9jbG9jay9tYWluLmMgYi9wcm9ncmFtcy9jbG9jay9tYWluLmMKaW5kZXggNWQ4NjUwMS4uZDczNTU4YiAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvY2xvY2svbWFpbi5jCisrKyBiL3Byb2dyYW1zL2Nsb2NrL21haW4uYwpAQCAtMzgsOTIgKzM4LDYxIEBACiAKIGludCBDTE9DS19NZW51Q29tbWFuZCAoV1BBUkFNIHdQYXJhbSkKIHsgIAotICAgQ0hBUiAgIGNhcHRpb25bTUFYX1NUUklOR19MRU5dOwogICAgc3dpdGNoICh3UGFyYW0pIHsKICAgICAgY2FzZSBDTF9BTkFMT0c6IHsKICAgICAgICAgIEdsb2JhbHMuYkFuYWxvZyA9IFRSVUU7Ci0JIENoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX0FOQUxPRywgXAotCSAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX0NIRUNLRUQpOwotCSBDaGVja01lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9ESUdJVEFMLCBcCi0JICAgICAgICAgICAgICAgTUZfQllDT01NQU5EIHwgTUZfVU5DSEVDS0VEKTsKLQkgRW5hYmxlTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX0ZPTlQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgTUZfQllDT01NQU5EIHwgTUZfR1JBWUVEKTsKKyAgICAgICAgIExBTkdVQUdFX1VwZGF0ZU1lbnVDaGVja21hcmtzKCk7CiAJIFNlbmRNZXNzYWdlKEdsb2JhbHMuaE1haW5XbmQsIFdNX1BBSU5ULCAwLCAwKTsKIAkgYnJlYWs7CSAgICAgCiAgICAgICAgfSAKICAgICAgY2FzZSBDTF9ESUdJVEFMOiB7CiAgICAgICAgICBHbG9iYWxzLmJBbmFsb2cgPSBGQUxTRTsKLQkgQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfQU5BTE9HLCBcCi0JICAgICAgICAgICAgICAgTUZfQllDT01NQU5EIHwgTUZfVU5DSEVDS0VEKTsKLQkgQ2hlY2tNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfRElHSVRBTCwgXAotCSAgICAgICAgICAgICAgIE1GX0JZQ09NTUFORCB8IE1GX0NIRUNLRUQpOwotCSBFbmFibGVNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfRk9OVCwgXAotICAgICAgICAgICAgICAgICAgICAgICBNRl9CWUNPTU1BTkQgfCBNRl9FTkFCTEVEKTsKKyAgICAgICAgIExBTkdVQUdFX1VwZGF0ZU1lbnVDaGVja21hcmtzKCk7CiAJIFNlbmRNZXNzYWdlKEdsb2JhbHMuaE1haW5XbmQsIFdNX1BBSU5ULCAwLCAwKTsKIAkgYnJlYWs7CSAgICAgICAKICAgICAgICB9Ci0gICAgIGNhc2UgQ0xfRk9OVDoKLQlNQUlOX0ZpbGVDaG9vc2VGb250KCk7Ci0gICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgQ0xfV0lUSE9VVF9USVRMRToKLSAgICAgICBHbG9iYWxzLmJXaXRob3V0VGl0bGUgPSAhR2xvYmFscy5iV2l0aG91dFRpdGxlOwotICAgICAgIENoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX1dJVEhPVVRfVElUTEUsIE1GX0JZQ09NTUFORCB8IFwKLSAgICAgICAgICAgICAgICAgICAgIChHbG9iYWxzLmJXaXRob3V0VGl0bGUgPyBNRl9DSEVDS0VEIDogTUZfVU5DSEVDS0VEKSk7Ci0JU2V0TWVudShHbG9iYWxzLmhNYWluV25kLCBOVUxMKTsKLSAgCVNldFdpbmRvd1RleHQoR2xvYmFscy5oTWFpblduZCwgTlVMTCk7Ci0gICAgCVVwZGF0ZVdpbmRvdyAoR2xvYmFscy5oTWFpblduZCk7Ci0gICAgICAgIHByaW50ZigiTk8gVElUTEU6Iik7Ci0gICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgQ0xfT05fVE9QOgotICAgICAgIEdsb2JhbHMuYkFsd2F5c09uVG9wID0gIUdsb2JhbHMuYkFsd2F5c09uVG9wOwotICAgICAgIENoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX09OX1RPUCwgTUZfQllDT01NQU5EIHwgXAotICAgICAgICAgICAgICAgICAgICAgKEdsb2JhbHMuYkFsd2F5c09uVG9wID8gTUZfQ0hFQ0tFRCA6IE1GX1VOQ0hFQ0tFRCkpOwotICAgICAgIGJyZWFrOwotICAgICBjYXNlIENMX1NFQ09ORFM6Ci0gICAgICAgR2xvYmFscy5iU2Vjb25kcyA9ICFHbG9iYWxzLmJTZWNvbmRzOwotICAgICAgIENoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX1NFQ09ORFMsIE1GX0JZQ09NTUFORCB8IFwKLSAgICAgICAgICAgICAgICAgICAgIChHbG9iYWxzLmJTZWNvbmRzID8gTUZfQ0hFQ0tFRCA6IE1GX1VOQ0hFQ0tFRCkpOwotICAgICAgIFNlbmRNZXNzYWdlKEdsb2JhbHMuaE1haW5XbmQsIFdNX1BBSU5ULCAwLCAwKTsKLSAgICAgICBicmVhazsKLSAgICAgY2FzZSBDTF9EQVRFOgotICAgICAgIEdsb2JhbHMuYkRhdGUgPSAhR2xvYmFscy5iRGF0ZTsKLSAgICAgICBDaGVja01lbnVJdGVtKEdsb2JhbHMuaFByb3BlcnRpZXNNZW51LCBDTF9EQVRFLCBNRl9CWUNPTU1BTkQgfCBcCi0gICAgICAgICAgICAgICAgICAgICAoR2xvYmFscy5iRGF0ZSA/IE1GX0NIRUNLRUQgOiBNRl9VTkNIRUNLRUQpKTsKLSAgICAgICBMb2FkU3RyaW5nKEdsb2JhbHMuaEluc3RhbmNlLCBJRFNfQ0xPQ0ssIGNhcHRpb24sIHNpemVvZihjYXB0aW9uKSk7Ci0gICAgICAgaWYgKEdsb2JhbHMuYkRhdGUpCi0gICAgICAgewotCSBpZiAoR2xvYmFscy5iQW5hbG9nKQotCSB7Ci0JICAgLyogRklYTUU6IEFkZCBkYXRlIHRvIGNhcHRpb24gKi8KLQkgICBTZXRXaW5kb3dUZXh0KEdsb2JhbHMuaE1haW5XbmQsIGNhcHRpb24pOwotCSB9Ci0JIGVsc2UKLQkgewotCSB9CisgICAgIGNhc2UgQ0xfRk9OVDogeworICAgICAgICAgTUFJTl9GaWxlQ2hvb3NlRm9udCgpOworICAgICAgICAgYnJlYWs7CiAgICAgICAgfQotICAgICAgIGVsc2UgCi0gICAgICAgewotCSBpZiAoR2xvYmFscy5iQW5hbG9nKQotICAgICAgICAgewotICAgICAgICAgICBTZXRXaW5kb3dUZXh0KEdsb2JhbHMuaE1haW5XbmQsIGNhcHRpb24pOwotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgfQorICAgICBjYXNlIENMX1dJVEhPVVRfVElUTEU6IHsgICAgIAorICAgICAgICAgR2xvYmFscy5iV2l0aG91dFRpdGxlID0gIUdsb2JhbHMuYldpdGhvdXRUaXRsZTsKKyAgICAgICAgIExBTkdVQUdFX1VwZGF0ZVdpbmRvd0NhcHRpb24oKTsKKyAgICAgICAgIExBTkdVQUdFX1VwZGF0ZU1lbnVDaGVja21hcmtzKCk7CisgICAgICAgICBicmVhazsKKyAgICAgICB9IAorICAgICBjYXNlIENMX09OX1RPUDogeworICAgICAgICAgR2xvYmFscy5iQWx3YXlzT25Ub3AgPSAhR2xvYmFscy5iQWx3YXlzT25Ub3A7CisgICAgICAgICBMQU5HVUFHRV9VcGRhdGVNZW51Q2hlY2ttYXJrcygpOworICAgICAgICAgYnJlYWs7CisgICAgICAgfSAgCisgICAgIGNhc2UgQ0xfU0VDT05EUzogeworICAgICAgICAgR2xvYmFscy5iU2Vjb25kcyA9ICFHbG9iYWxzLmJTZWNvbmRzOworICAgICAgICAgTEFOR1VBR0VfVXBkYXRlTWVudUNoZWNrbWFya3MoKTsKKyAgICAgICAgIFNlbmRNZXNzYWdlKEdsb2JhbHMuaE1haW5XbmQsIFdNX1BBSU5ULCAwLCAwKTsKKyAgICAgICAgIGJyZWFrOwogICAgICAgIH0KLSAgICAgICBicmVhazsKLSAgICAgY2FzZSBDTF9JTkZPX0xJQ0VOU0U6Ci0gICAgICAgV2luZUxpY2Vuc2UoR2xvYmFscy5oTWFpblduZCwgR2xvYmFscy5scHN6TGFuZ3VhZ2UpOwotICAgICAgIGJyZWFrOwotICAgICBjYXNlIENMX0lORk9fTk9fV0FSUkFOVFk6Ci0gICAgICAgV2luZVdhcnJhbnR5KEdsb2JhbHMuaE1haW5XbmQsIEdsb2JhbHMubHBzekxhbmd1YWdlKTsKLSAgICAgICBicmVhazsKLSAgICAgY2FzZSBDTF9JTkZPX0FCT1VUX1dJTkU6Ci0gICAgICAgU2hlbGxBYm91dChHbG9iYWxzLmhNYWluV25kLCAiQ2xvY2siLCAiQ2xvY2tcbiIgV0lORV9SRUxFQVNFX0lORk8sIDApOwotICAgICBicmVhazsKKyAgICAgY2FzZSBDTF9EQVRFOiB7CisgICAgICAgICBHbG9iYWxzLmJEYXRlID0gIUdsb2JhbHMuYkRhdGU7CisgICAgICAgICBMQU5HVUFHRV9VcGRhdGVNZW51Q2hlY2ttYXJrcygpOworICAgICAgICAgTEFOR1VBR0VfVXBkYXRlV2luZG93Q2FwdGlvbigpOworICAgICAgICAgYnJlYWs7CisgICAgICAgfQorICAgICBjYXNlIENMX0lORk9fTElDRU5TRTogeworICAgICAgICAgV2luZUxpY2Vuc2UoR2xvYmFscy5oTWFpblduZCwgR2xvYmFscy5scHN6TGFuZ3VhZ2UpOworICAgICAgICAgYnJlYWs7CisgICAgICAgfQorICAgICBjYXNlIENMX0lORk9fTk9fV0FSUkFOVFk6IHsKKyAgICAgICAgIFdpbmVXYXJyYW50eShHbG9iYWxzLmhNYWluV25kLCBHbG9iYWxzLmxwc3pMYW5ndWFnZSk7CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICAgIGNhc2UgQ0xfSU5GT19BQk9VVF9XSU5FOiB7CisgICAgICAgICBTaGVsbEFib3V0KEdsb2JhbHMuaE1haW5XbmQsICJDbG9jayIsICJDbG9ja1xuIiBXSU5FX1JFTEVBU0VfSU5GTywgMCk7CisgICAgICAgICBicmVhazsKKyAgICAgICB9CiAgICAgIC8vIEhhbmRsZSBsYW5ndWFnZXMKICAgICAgZGVmYXVsdDoKLSAgICAgICBMQU5HVUFHRV9EZWZhdWx0SGFuZGxlKHdQYXJhbSk7IAorICAgICAgICAgTEFOR1VBR0VfRGVmYXVsdEhhbmRsZSh3UGFyYW0pOyAKICAgIH0KICAgIHJldHVybiAwOwogfQpAQCAtMTMxLDIzICsxMDAsMjYgQEAKIFZPSUQgTUFJTl9GaWxlQ2hvb3NlRm9udChWT0lEKSB7CiAKICAgQ0hPT1NFRk9OVCBmb250OwotICAgICAgICBmb250LmxTdHJ1Y3RTaXplICAgICAgID0gMDsKLSAgICAgICAgZm9udC5od25kT3duZXIgICAgICAgICA9IEdsb2JhbHMuaE1haW5XbmQ7Ci0gICAgICAgIGZvbnQuaERDICAgICAgICAgICAgICAgPSBOVUxMOwotICAgICAgICBmb250LmxwTG9nRm9udCAgICAgICAgID0gMDsKLSAgICAgICAgZm9udC5pUG9pbnRTaXplICAgICAgICA9IDA7Ci0gICAgICAgIGZvbnQuRmxhZ3MgICAgICAgICAgICAgPSAwOwotICAgICAgICBmb250LnJnYkNvbG9ycyAgICAgICAgID0gMDsKLSAgICAgICAgZm9udC5sQ3VzdERhdGEgICAgICAgICA9IDA7Ci0gICAgICAgIGZvbnQubHBmbkhvb2sgICAgICAgICAgPSAwOwotICAgICAgICBmb250LmxwVGVtcGxhdGVOYW1lICAgID0gMDsKLSAgICAgICAgZm9udC5oSW5zdGFuY2UgICAgICAgICA9IEdsb2JhbHMuaEluc3RhbmNlOwotICAgICAgICBmb250Lmxwc3pTdHlsZSAgICAgICAgID0gTEZfRkFDRVNJWkU7Ci0gICAgICAgIGZvbnQubkZvbnRUeXBlICAgICAgICAgPSAwOwotICAgICAgICBmb250Lm5TaXplTWluICAgICAgICAgID0gMDsKLSAgICAgICAgZm9udC5uU2l6ZU1heCAgICAgICAgICA9IDA7CisgIAorICAgICAgICBmb250LmxTdHJ1Y3RTaXplICAgICA9IHNpemVvZihmb250KTsKKyAgICAgICAgZm9udC5od25kT3duZXIgICAgICAgPSBHbG9iYWxzLmhNYWluV25kOworICAgICAgICBmb250LmhEQyAgICAgICAgICAgICA9IE5VTEw7CisgICAgICAgIGZvbnQubHBMb2dGb250ICAgICAgID0gMDsKKyAgICAgICAgZm9udC5pUG9pbnRTaXplICAgICAgPSAwOworICAgICAgICBmb250LkZsYWdzICAgICAgICAgICA9IDA7CisgICAgICAgIGZvbnQucmdiQ29sb3JzICAgICAgID0gMDsKKyAgICAgICAgZm9udC5sQ3VzdERhdGEgICAgICAgPSAwOworICAgICAgICBmb250LmxwZm5Ib29rICAgICAgICA9IDA7CisgICAgICAgIGZvbnQubHBUZW1wbGF0ZU5hbWUgID0gMDsKKyAgICAgICAgZm9udC5oSW5zdGFuY2UgICAgICAgPSBHbG9iYWxzLmhJbnN0YW5jZTsKKyAgICAgICAgZm9udC5scHN6U3R5bGUgICAgICAgPSBMRl9GQUNFU0laRTsKKyAgICAgICAgZm9udC5uRm9udFR5cGUgICAgICAgPSAwOworICAgICAgICBmb250Lm5TaXplTWluICAgICAgICA9IDA7CisgICAgICAgIGZvbnQublNpemVNYXggICAgICAgID0gMDsKIAotICAgICAgICBpZiAoQ2hvb3NlRm9udCgmZm9udCkpOworICAgICAgICBpZiAoQ2hvb3NlRm9udCgmZm9udCkpIHsKKyAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgeWV0ICovCisgICAgICAgIH07CiAKIH0KIApAQCAtMTYwLDU0ICsxMzIsNjAgQEAKIHsKICAgICBQQUlOVFNUUlVDVCBwczsKICAgICBIREMgY29udGV4dDsKLSAgICBDSEFSICAgY2FwdGlvbltNQVhfU1RSSU5HX0xFTl07CiAKICAgICBzd2l0Y2ggKG1zZykgewogCi0gICAgICAgY2FzZSBXTV9DUkVBVEU6Ci0gICAgICAgIHByaW50ZigiV01fQ1JFQVRFXG4iKTsKLSAgIAlicmVhazsKKyAgICAgICAgY2FzZSBXTV9DUkVBVEU6IHsKKyAgICAgICAgICAgIHByaW50ZigiV01fQ1JFQVRFXG4iKTsKKyAgIAkgICAgYnJlYWs7CisgICAgICAgIH0KIAotICAgICAgICBjYXNlIFdNX1JCVVRUT05VUDoKLQkgIHByaW50ZigiV01fUkJVVFRPTlVQXG4iKTsKLQlHbG9iYWxzLmJXaXRob3V0VGl0bGUgPSAhR2xvYmFscy5iV2l0aG91dFRpdGxlOwotCVNldE1lbnUoR2xvYmFscy5oTWFpblduZCwgR2xvYmFscy5oTWFpbk1lbnUpOwotICAgICAgICBVcGRhdGVXaW5kb3cgKEdsb2JhbHMuaE1haW5XbmQpOwotCUNoZWNrTWVudUl0ZW0oR2xvYmFscy5oUHJvcGVydGllc01lbnUsIENMX1dJVEhPVVRfVElUTEUsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgTUZfQllDT01NQU5EIHwgTUZfVU5DSEVDS0VEKTsKLQlMb2FkU3RyaW5nKEdsb2JhbHMuaEluc3RhbmNlLCBJRFNfQ0xPQ0ssIGNhcHRpb24sIHNpemVvZihjYXB0aW9uKSk7Ci0gICAgICAgIFNldFdpbmRvd1RleHQoR2xvYmFscy5oTWFpblduZCwgY2FwdGlvbik7Ci0JYnJlYWs7CisgICAgICAgIGNhc2UgV01fUkJVVFRPTlVQOiB7CisJICAgIHByaW50ZigiV01fUkJVVFRPTlVQXG4iKTsKKyAgICAgICAgICAgIEdsb2JhbHMuYldpdGhvdXRUaXRsZSA9ICFHbG9iYWxzLmJXaXRob3V0VGl0bGU7CisgICAgICAgICAgICBMQU5HVUFHRV9VcGRhdGVNZW51Q2hlY2ttYXJrcygpOyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgTEFOR1VBR0VfVXBkYXRlV2luZG93Q2FwdGlvbigpOworICAgICAgICAgICAgVXBkYXRlV2luZG93IChHbG9iYWxzLmhNYWluV25kKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQljYXNlIFdNX1BBSU5UOgotCSAgcHJpbnRmKCJXTV9QQUlOVFxuIik7Ci0JICBjb250ZXh0ID0gQmVnaW5QYWludChoV25kLCAmcHMpOwotCSAgaWYoR2xvYmFscy5iQW5hbG9nKSB7Ci0JICAgIERyYXdGYWNlKGNvbnRleHQpOwotCSAgICBJZGxlKGNvbnRleHQpOwotCSAgfQotCSAgZWxzZSB7CisJY2FzZSBXTV9QQUlOVDogeworICAgICAgICAgICAgcHJpbnRmKCJXTV9QQUlOVFxuIik7CisgICAgICAgICAgICBjb250ZXh0ID0gQmVnaW5QYWludChoV25kLCAmcHMpOworCSAgICBpZihHbG9iYWxzLmJBbmFsb2cpIHsKKwkgICAgICAgIERyYXdGYWNlKGNvbnRleHQpOworCSAgICAgICAgSWRsZShjb250ZXh0KTsKKwkgICAgfQorCSAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgLyogZG8gbm90aGluZyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgRW5kUGFpbnQoaFduZCwgJnBzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkgIH0KLSAgICAgICAgICBFbmRQYWludChoV25kLCAmcHMpOwotICAgCWJyZWFrOwotCi0gICAgICAgY2FzZSBXTV9TSVpFOgotICAgICAgICAgIHByaW50ZigiV01fU0laRVxuIik7Ci0JICBHbG9iYWxzLk1heFggPSBMT1dPUkQobFBhcmFtKTsKLQkgIEdsb2JhbHMuTWF4WSA9IEhJV09SRChsUGFyYW0pOwotCSAgYnJlYWs7CisgICAgICAgIGNhc2UgV01fU0laRTogeworICAgICAgICAgICAgcHJpbnRmKCJXTV9TSVpFXG4iKTsKKwkgICAgR2xvYmFscy5NYXhYID0gTE9XT1JEKGxQYXJhbSk7CisJICAgIEdsb2JhbHMuTWF4WSA9IEhJV09SRChsUGFyYW0pOworICAgICAgICAgICAgT2xkSG91ci5Eb250UmVkcmF3ICAgPSBUUlVFOworICAgICAgICAgICAgT2xkTWludXRlLkRvbnRSZWRyYXcgPSBUUlVFOworICAgICAgICAgICAgT2xkU2Vjb25kLkRvbnRSZWRyYXcgPSBUUlVFOworCSAgICBicmVhazsKKyAgICAgICAgfQogCSAgCi0gICAgICAgY2FzZSBXTV9DT01NQU5EOgotICAgICAgICAgIENMT0NLX01lbnVDb21tYW5kKHdQYXJhbSk7Ci0gICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV01fQ09NTUFORDogeworICAgICAgICAgICAgQ0xPQ0tfTWVudUNvbW1hbmQod1BhcmFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IAogCi0gICAgICAgY2FzZSBXTV9ERVNUUk9ZOgotICAgICAgICAgIHByaW50ZigiV01fREVTVFJPWVxuIik7Ci0gICAgICAgICAgUG9zdFF1aXRNZXNzYWdlICgwKTsKLSAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXTV9ERVNUUk9ZOiB7CisgICAgICAgICAgICBwcmludGYoIldNX0RFU1RST1lcbiIpOworICAgICAgICAgICAgUG9zdFF1aXRNZXNzYWdlICgwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLSAgICAgICBkZWZhdWx0OgorICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIHJldHVybiBEZWZXaW5kb3dQcm9jIChoV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKICAgICB9CiAgICAgcmV0dXJuIDBsOwpAQCAtMjIwLDIxICsxOTgsMTEgQEAKICAqICAgICAgICAgICBXaW5NYWluCiAgKi8KIAotdm9pZCBEdW1wR2xvYmFscyh2b2lkKSB7Ci0KLSAgICBwcmludGYoIkR1bXBHbG9iYWxzKClcbiIpOwotICAgIHByaW50ZigiIEdsb2JhbHMubHBzekluaUZpbGU6ICVzXG4iLCBHbG9iYWxzLmxwc3pJbmlGaWxlKTsgCi0gICAgcHJpbnRmKCIgR2xvYmFscy5scHN6SWNvRmlsZTogJXNcbiIsIEdsb2JhbHMubHBzekljb0ZpbGUpOwotICAgIHByaW50ZigiR2xvYmFscy5scHN6TGFuZ3VhZ2U6ICVzXG4iLCBHbG9iYWxzLmxwc3pMYW5ndWFnZSk7Ci0gICAgcHJpbnRmKCIgICBHbG9iYWxzLmhJbnN0YW5jZTogJWlcbiIsIEdsb2JhbHMuaEluc3RhbmNlKTsKLSAgICBwcmludGYoIiAgIEdsb2JhbHMuaE1haW5NZW51OiAlaVxuIiwgR2xvYmFscy5oTWFpbk1lbnUpOwotICAgIAotfQotIAogaW50IFBBU0NBTCBXaW5NYWluIChIQU5ETEUgaEluc3RhbmNlLCBIQU5ETEUgcHJldiwgTFBTVFIgY21kbGluZSwgaW50IHNob3cpCiB7CiAgICAgTVNHICAgICAgbXNnOwogICAgIFdORENMQVNTIGNsYXNzOworICAgIAogICAgIGNoYXIgY2xhc3NOYW1lW10gPSAiQ0xDbGFzcyI7ICAvKiBUbyBtYWtlIHN1cmUgY2xhc3NOYW1lID49IDB4MTAwMDAgKi8KICAgICBjaGFyIHdpbk5hbWVbXSAgID0gIkNsb2NrIjsKIApAQCAtMjQ4LDIyICsyMTYsMjEgQEAKICAgICBwcmludGYoIldpbk1haW4oKVxuIik7CiAgICAgCiAgICAgLyogU2V0dXAgR2xvYmFscyAqLwotICAgIEdsb2JhbHMuYkFuYWxvZwkgID0gVFJVRTsKLSAgICBHbG9iYWxzLmJTZWNvbmRzICAgICAgPSBUUlVFOwotICAgIEdsb2JhbHMubHBzekluaUZpbGUgICA9ICJjbG9jay5pbmkiOwotICAgIEdsb2JhbHMubHBzekljb0ZpbGUgICA9ICJjbG9jay5pY28iOworICAgIEdsb2JhbHMuYkFuYWxvZwkgICAgPSBUUlVFOworICAgIEdsb2JhbHMuYlNlY29uZHMgICAgICAgID0gVFJVRTsKKyAgICBHbG9iYWxzLmxwc3pJbmlGaWxlICAgICA9ICJjbG9jay5pbmkiOworICAgIEdsb2JhbHMubHBzekljb0ZpbGUgICAgID0gImNsb2NrLmljbyI7CiAKLSAgLyogU2VsZWN0IExhbmd1YWdlICovCisgICAgLyogU2VsZWN0IExhbmd1YWdlICovCiAgICAgTEFOR1VBR0VfSW5pdCgpOwogCi0gICAgR2xvYmFscy5oSW5zdGFuY2UgICAgID0gaEluc3RhbmNlOwotICAgIEdsb2JhbHMuaE1haW5JY29uICAgICA9IEV4dHJhY3RJY29uKEdsb2JhbHMuaEluc3RhbmNlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxzLmxwc3pJY29GaWxlLCAwKTsKKyAgICBHbG9iYWxzLmhJbnN0YW5jZSAgICAgICA9IGhJbnN0YW5jZTsKKyAgICBHbG9iYWxzLmhNYWluSWNvbiAgICAgICA9IEV4dHJhY3RJY29uKEdsb2JhbHMuaEluc3RhbmNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbHMubHBzekljb0ZpbGUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgaWYgKCFHbG9iYWxzLmhNYWluSWNvbikgR2xvYmFscy5oTWFpbkljb24gPSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkSWNvbigwLCBNQUtFSU5UUkVTT1VSQ0UoREVGQVVMVElDT04pKTsKIAotICAgIER1bXBHbG9iYWxzKCk7CQkJCSAgCi0JCQkJICAKICAgICBpZiAoIXByZXYpewogCWNsYXNzLnN0eWxlICAgICAgICAgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsKIAljbGFzcy5scGZuV25kUHJvYyAgID0gQ0xPQ0tfV25kUHJvYzsKQEAgLTI3MywxMSArMjQwLDExIEBACiAJY2xhc3MuaEljb24gICAgICAgICA9IExvYWRJY29uICgwLCBJRElfQVBQTElDQVRJT04pOwogCWNsYXNzLmhDdXJzb3IgICAgICAgPSBMb2FkQ3Vyc29yICgwLCBJRENfQVJST1cpOwogCWNsYXNzLmhickJhY2tncm91bmQgPSBHZXRTdG9ja09iamVjdCAoR1JBWV9CUlVTSCk7Ci0JY2xhc3MubHBzek1lbnVOYW1lICA9ICJcMCI7CisJY2xhc3MubHBzek1lbnVOYW1lICA9IDA7CiAJY2xhc3MubHBzekNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKICAgICB9Ci0gICAgaWYgKCFSZWdpc3RlckNsYXNzICgmY2xhc3MpKQotCXJldHVybiBGQUxTRTsKKworICAgIGlmICghUmVnaXN0ZXJDbGFzcyAoJmNsYXNzKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgR2xvYmFscy5oTWFpblduZCA9IENyZWF0ZVdpbmRvdyAoY2xhc3NOYW1lLCB3aW5OYW1lLCBXU19PVkVSTEFQUEVEV0lORE9XLAogCQkJQ1dfVVNFREVGQVVMVCwgMCwgQ1dfVVNFREVGQVVMVCwgR2xvYmFscy5NYXhYLCBHbG9iYWxzLk1heFksIApAQCAtMjg3LDEyICsyNTQsOSBAQAogICAgIExBTkdVQUdFX1NlbGVjdEJ5TmFtZShHbG9iYWxzLmxwc3pMYW5ndWFnZSk7CiAgICAgU2V0TWVudShHbG9iYWxzLmhNYWluV25kLCBHbG9iYWxzLmhNYWluTWVudSk7CiAKLS8vICAgIEdsb2JhbHMuaFBvcHVwTWVudTEgPSBDcmVhdGVQb3B1cE1lbnUoKTsKLS8vICAgIEdsb2JhbHMuaFN5c3RlbU1lbnUgPSBHZXRTeXN0ZW1NZW51KEdsb2JhbHMuaE1haW5XbmQsIFRSVUUpOwotLy8gICAgcHJpbnRmKCIlaSIsIEdsb2JhbHMuaFN5c3RlbU1lbnUpOworICAgIEdsb2JhbHMuaFN5c3RlbU1lbnUgPSBHZXRTeXN0ZW1NZW51KEdsb2JhbHMuaE1haW5XbmQsIFRSVUUpOwogICAgIAotICAgIEFwcGVuZE1lbnUoR2xvYmFscy5oU3lzdGVtTWVudSwgTUZfU1RSSU5HIHwgTUZfQllDT01NQU5ELAotICAgICAgICAgICAgICAgICAxMDAwLCAiaXRlbSIpOworICAgIEFwcGVuZE1lbnUoR2xvYmFscy5oU3lzdGVtTWVudSwgTUZfU1RSSU5HIHwgTUZfQllDT01NQU5ELCAxMDAwLCAiaXRlbSIpOwogICAgIFNldFN5c3RlbU1lbnUoR2xvYmFscy5oTWFpblduZCwgR2xvYmFscy5oU3lzdGVtTWVudSk7CiAKICAgICBFbmFibGVNZW51SXRlbShHbG9iYWxzLmhQcm9wZXJ0aWVzTWVudSwgQ0xfRk9OVCwgXApAQCAtMzAxLDE0ICsyNjUsMTQgQEAKICAgICBVcGRhdGVXaW5kb3cgKEdsb2JhbHMuaE1haW5XbmQpOwogCiAgICAgd2hpbGUgKFRSVUUpIHsKLSAgICAgIFNsZWVwKDEpOwotICAgICAgaWYgKFBlZWtNZXNzYWdlKCZtc2csIDAsIDAsIDAsIFBNX1JFTU9WRSkpIHsKLSAgICAgICAgaWYgKG1zZy5tZXNzYWdlID09IFdNX1FVSVQpIHJldHVybiBtc2cud1BhcmFtOwotCVRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7Ci0JRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOwotCUlkbGUoTlVMTCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIElkbGUoTlVMTCk7CisgICAgICAgIFNsZWVwKDEpOworICAgICAgICBpZiAoUGVla01lc3NhZ2UoJm1zZywgMCwgMCwgMCwgUE1fUkVNT1ZFKSkgeworICAgICAgICAgICAgICAgIGlmIChtc2cubWVzc2FnZSA9PSBXTV9RVUlUKSByZXR1cm4gbXNnLndQYXJhbTsKKwkgICAgICAgIFRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7CisJICAgICAgICBEaXNwYXRjaE1lc3NhZ2UoJm1zZyk7CisJICAgICAgICBJZGxlKE5VTEwpOworICAgICAgICB9CisgICAgICAgICAgZWxzZSBJZGxlKE5VTEwpOwogICAgIH0KIAogICAgIC8vIFdlIHdpbGwgbmV2ZXIgcmVhY2ggdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgISAgCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9jbG9jay93aW5jbG9jay5jIGIvcHJvZ3JhbXMvY2xvY2svd2luY2xvY2suYwppbmRleCA1ZWM2MGU3Li44YTNkZWEwIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9jbG9jay93aW5jbG9jay5jCisrKyBiL3Byb2dyYW1zL2Nsb2NrL3dpbmNsb2NrLmMKQEAgLTg2LDE4ICs4NiwyMSBAQAogCiB2b2lkIERyYXdIb3VySGFuZChIREMgZGMpCiB7CisgIGlmIChPbGRIb3VyLkRvbnRSZWRyYXcpIHJldHVybjsKICAgTW92ZVRvRXgoZGMsIE9sZEhvdXIuU3RhcnRYLCBPbGRIb3VyLlN0YXJ0WSwgTlVMTCk7CiAgIExpbmVUbyhkYywgT2xkSG91ci5FbmRYLCBPbGRIb3VyLkVuZFkpOwogfQogCiB2b2lkIERyYXdNaW51dGVIYW5kKEhEQyBkYykKIHsKKyAgaWYgKE9sZE1pbnV0ZS5Eb250UmVkcmF3KSByZXR1cm47CiAgIE1vdmVUb0V4KGRjLCBPbGRNaW51dGUuU3RhcnRYLCBPbGRNaW51dGUuU3RhcnRZLCBOVUxMKTsKICAgTGluZVRvKGRjLCBPbGRNaW51dGUuRW5kWCwgT2xkTWludXRlLkVuZFkpOwogfQogCiB2b2lkIERyYXdTZWNvbmRIYW5kKEhEQyBkYykKIHsKKyAgICBpZiAoT2xkU2Vjb25kLkRvbnRSZWRyYXcpIHJldHVybjsKICAgICBNb3ZlVG9FeChkYywgT2xkU2Vjb25kLlN0YXJ0WCwgT2xkU2Vjb25kLlN0YXJ0WSwgTlVMTCk7CiAgICAgTGluZVRvKGRjLCBPbGRTZWNvbmQuRW5kWCwgT2xkU2Vjb25kLkVuZFkpOwogfQpAQCAtMTE2LDYgKzExOSw3IEBACiAgIGlmIChHbG9iYWxzLmJBbmFsb2cgJiYgcnYpRHJhd0hvdXJIYW5kKGRjKTsKICAgT2xkSG91ci5TdGFydFggPSBTeDsgT2xkSG91ci5FbmRYID0gRXg7CiAgIE9sZEhvdXIuU3RhcnRZID0gU3k7IE9sZEhvdXIuRW5kWSA9IEV5OworICBPbGRIb3VyLkRvbnRSZWRyYXc9RkFMU0U7CiAgIHJldHVybiBydjsKIH0KIApAQCAtMTMzLDYgKzEzNyw3IEBACiAgIGlmIChHbG9iYWxzLmJBbmFsb2cgJiYgcnYpRHJhd01pbnV0ZUhhbmQoZGMpOwogICBPbGRNaW51dGUuU3RhcnRYID0gU3g7IE9sZE1pbnV0ZS5FbmRYID0gRXg7CiAgIE9sZE1pbnV0ZS5TdGFydFkgPSBTeTsgT2xkTWludXRlLkVuZFkgPSBFeTsKKyAgT2xkTWludXRlLkRvbnRSZWRyYXc9RkFMU0U7CiAgIHJldHVybiBydjsKIH0KIApAQCAtMTUyLDYgKzE1Nyw3IEBACiAgICAgaWYgKEdsb2JhbHMuYkFuYWxvZyAmJiBydilEcmF3U2Vjb25kSGFuZChkYyk7CiAgICAgT2xkU2Vjb25kLlN0YXJ0WCA9IFN4OyBPbGRTZWNvbmQuRW5kWCA9IEV4OwogICAgIE9sZFNlY29uZC5TdGFydFkgPSBTeTsgT2xkU2Vjb25kLkVuZFkgPSBFeTsKKyAgICBPbGRTZWNvbmQuRG9udFJlZHJhdz1GQUxTRTsKICAgfQogICAKICAgcmV0dXJuIHJ2OwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvY2xvY2svd2luY2xvY2suaCBiL3Byb2dyYW1zL2Nsb2NrL3dpbmNsb2NrLmgKaW5kZXggYmJlYjczZC4uZDMwZmJiYyAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvY2xvY2svd2luY2xvY2suaAorKysgYi9wcm9ncmFtcy9jbG9jay93aW5jbG9jay5oCkBAIC0xMiw4ICsxMiwxMSBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgaW50IFN0YXJ0WCxTdGFydFksRW5kWCxFbmRZOworICBCT09MIERvbnRSZWRyYXc7CiB9IEhhbmREYXRhOwogCitleHRlcm4gSGFuZERhdGEgT2xkTWludXRlLCBPbGRIb3VyLCBPbGRTZWNvbmQ7CisKIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KIAogCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL0NoYW5nZUxvZyBiL3Byb2dyYW1zL25vdGVwYWQvQ2hhbmdlTG9nCmluZGV4IGJhNzJkOTUuLjBjMmQ3MDUgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvQ2hhbmdlTG9nCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNyBAQAorSGVucmlrIE9sc2VuIDxoZW5yaWtAaWFlc3RlLmRrPgorICAgICAgICAqIFtEYS5yY10KKyAgICAgICAgQWRkZWQgRGFuaXNoIGxhbmd1YWdlIHN1cHBvcnQuCisKIEZyaSBNYXkgMTUgMjM6NTk6MjIgMTk5OCAgTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgogICAgICAgICAqIERhdGUvVGltZSBub3cgdXNlcyBsb2NhbGUtc3BlY2lmaWMgZm9ybWF0cwogICAgICAgICAqIExhbmd1YWdlLXNwZWNpZmljIHdpbmRvdyBjYXB0aW9uLCBkaXNwbGF5cyBmaWxlIGJlaW5nIGVkaXRlZC4KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvRGEucmMgYi9wcm9ncmFtcy9ub3RlcGFkL0RhLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ODM5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9ub3RlcGFkL0RhLnJjCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBOb3RlcGFkIChEYW5pc2ggcmVzb3VyY2VzKQorICoKKyAqIENvcHlyaWdodCAxOTk4IEhlbnJpayBPbHNlbiA8aGVucmlrQGlhZXN0ZS5kaz4KKyAqLworCisjZGVmaW5lIExBTkdVQUdFX0lEICAgICAgICAgICAgICAgICAgRGEKKyNkZWZpbmUgTEFOR1VBR0VfTlVNQkVSICAgICAgICAgICAgICA2CisjZGVmaW5lIExBTkdVQUdFX01FTlVfSVRFTSAgICAgICAgICAgIiZEYW5zayIKKworLyogTWVudSAqLworCisjZGVmaW5lIE1FTlVfRklMRSAgICAgICAgICAgICAgICAgICAgIiZGaWxlZiIKKyNkZWZpbmUgTUVOVV9GSUxFX05FVyAgICAgICAgICAgICAgICAiJk55Li4uIgorI2RlZmluZSBNRU5VX0ZJTEVfT1BFTiAgICAgICAgICAgICAgICLFJmJuXHRFbnRlciIKKyNkZWZpbmUgTUVOVV9GSUxFX1NBVkUgICAgICAgICAgICAgICAiJkdlbSIKKyNkZWZpbmUgTUVOVV9GSUxFX1NBVkVBUyAgICAgICAgICAgICAiR2VtIHNvJm0uLi4iCisjZGVmaW5lIE1FTlVfRklMRV9QUklOVCAgICAgICAgICAgICAgIiZVZHNrcml2IgorI2RlZmluZSBNRU5VX0ZJTEVfUEFHRVNFVFVQICAgICAgICAgICJTaWRlJm9wc+Z0bmluZy4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX1BSSU5UU0VUVVAgICAgICAgICAiJkluZHN0aWwgcHJpbnRlci4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX0VYSVQgICAgICAgICAgICAgICAiJkFmc2x1dCIKKworI2RlZmluZSBNRU5VX0VESVQgICAgICAgICAgICAgICAgICAgICImUmVkaWdlciIKKyNkZWZpbmUgTUVOVV9FRElUX1VORE8gICAgICAgICAgICAgICAiJkZvcnRyeWRcdEN0cmwrWiIKKyNkZWZpbmUgTUVOVV9FRElUX0NVVCAgICAgICAgICAgICAgICAiJktsaXBcdEN0cmwrWCIKKyNkZWZpbmUgTUVOVV9FRElUX0NPUFkgICAgICAgICAgICAgICAiSyZvcGllclx0Q3RybCtDIgorI2RlZmluZSBNRU5VX0VESVRfUEFTVEUgICAgICAgICAgICAgICJT5nQgJmluZFx0Q3RybCtWIgorI2RlZmluZSBNRU5VX0VESVRfREVMRVRFICAgICAgICAgICAgICImU2xldFx0RGVsIgorI2RlZmluZSBNRU5VX0VESVRfU0VMRUNUQUxMICAgICAgICAgICJNYXJrZXIgJmFsdCIKKyNkZWZpbmUgTUVOVV9FRElUX1RJTUVEQVRFICAgICAgICAgICAiJkRhdG8vdGlkXHRGNSIKKyNkZWZpbmUgTUVOVV9FRElUX1dSQVAgICAgICAgICAgICAgICAiQXV0b21hdGlzayAmbGluamVza2lmdCIKKworI2RlZmluZSBNRU5VX1NFQVJDSCAgICAgICAgICAgICAgICAgICImU/hnIgorI2RlZmluZSBNRU5VX1NFQVJDSF9TRUFSQ0ggICAgICAgICAgICImU/hnLi4uIgorI2RlZmluZSBNRU5VX1NFQVJDSF9ORVhUICAgICAgICAgICAgICImRmluZCBu5nN0ZVx0RjMiCisKKyNkZWZpbmUgTUVOVV9MQU5HVUFHRSAgICAgICAgICAgICAgICAiUyZwcm9nIgorCisjZGVmaW5lIE1FTlVfSEVMUCAgICAgICAgICAgICAgICAgICAgIiZIauZscCIKKyNkZWZpbmUgTUVOVV9IRUxQX0NPTlRFTlRTICAgICAgICAgICAiJkluZGhvbGQiCisjZGVmaW5lIE1FTlVfSEVMUF9TRUFSQ0ggICAgICAgICAgICAgIiZT+GcgZWZ0ZXIgaGrmbHAgb20uLi4iCisjZGVmaW5lIE1FTlVfSEVMUF9IRUxQX09OX0hFTFAgICAgICAgIiZCcnVnIGFmIEhq5mxwIgorCisjZGVmaW5lIE1FTlVfSU5GTyAgICAgICAgICAgICAgICAgICAgIiZPbSBOb3Rlc2Jsb2suLi4iCisjZGVmaW5lIE1FTlVfSU5GT19MSUNFTlNFICAgICAgICAgICAgIiZMaWNlbnMiCisjZGVmaW5lIE1FTlVfSU5GT19OT19XQVJSQU5UWSAgICAgICAgIiZOTyBXQVJSQU5UWSIKKyNkZWZpbmUgTUVOVV9JTkZPX0FCT1VUX1dJTkUgICAgICAgICAiJk9tIFdJTkUiCisKKy8qIERpYWxvZ3MgKi8KKyNkZWZpbmUgRElBTE9HX09LICAgICAgICAgICAgICAgICAgICAiT0siCisjZGVmaW5lIERJQUxPR19DQU5DRUwgICAgICAgICAgICAgICAgIkFubnVsbGVyIgorI2RlZmluZSBESUFMT0dfQlJPV1NFICAgICAgICAgICAgICAgICImR2VubmVtc2UuLi4iCisjZGVmaW5lIERJQUxPR19IRUxQICAgICAgICAgICAgICAgICAgIiZIauZscCIKKworI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX0NBUFRJT04gICAgICJTaWRlb3Bz5nRuaW5nIgorI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX0hFQUQgICAgICAgICImU2lkZWhvdmVkOiIKKyNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9UQUlMICAgICAgICAiU2lkZSZmb2Q6IgorI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX01BUkdJTiAgICAgICJNYXJnZW5lcjoiCisjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfTEVGVCAgICAgICAgIiZWZW5zdHJlOiIKKyNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9SSUdIVCAgICAgICAiJkj4anJlOiIKKyNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9UT1AgICAgICAgICAiJlRvcDoiCisjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfQk9UVE9NICAgICAgIiZCdW5kOiIKKworCisvKiBTdHJpbmdzICovCisjZGVmaW5lIFNUUklOR19OT1RFUEFEICAgICAgICAgICAgICAgIk5vdGVzYmxvayIKKyNkZWZpbmUgU1RSSU5HX0VSUk9SICAgICAgICAgICAgICAgICAiRkVKTCIKKyNkZWZpbmUgU1RSSU5HX1dBUk5JTkcgICAgICAgICAgICAgICAiQURWQVJTRUwiCisjZGVmaW5lIFNUUklOR19JTkZPICAgICAgICAgICAgICAgICAgIkluZm9ybWF0aW9uIgorCisjZGVmaW5lIFNUUklOR19VTlRJVExFRCAgICAgICAgICAgICAgIihpa2tlLW5hdm5naXZldCkiCisKKyNkZWZpbmUgU1RSSU5HX0FMTF9GSUxFUyAgICAgICAgICAgICAiQWxsZSBmaWxlciAoKi4qKSIKKyNkZWZpbmUgU1RSSU5HX1RFWFRfRklMRVNfVFhUICAgICAgICAiVGVrc3QgZmlsZXIgKCoudHh0KSIKKworI2RlZmluZSBTVFJJTkdfVE9PTEFSR0UgICAgICAgICAiRmlsZW4gJyVzJyBlciBmb3Igc3RvciB0aWwgTm90ZXNibG9rLiBcCitcbkJydWcgZW4gYW5kZW4gZWRpdG9yIHRpbCBhdCByZWRpZ2VyZSBmaWxlbi4iCisKKyNkZWZpbmUgU1RSSU5HX05PVEVYVCAgICAgICAgICAgIkR1IGhhciBpa2tlIHNrcmV2ZXQgbm9nZXQgdGVrc3QuIFwKK1xuU2tyaXYgbm9nZXQgdGVrc3QsIG9nIHBy+HYgc+UgaWdlbiIKKworI2RlZmluZSBTVFJJTkdfTk9URk9VTkQgICAgICAgICAiS2FuIGlra2UgZmluZGUgJyVzJy4iCisKKyNkZWZpbmUgU1RSSU5HX09VVF9PRl9NRU1PUlkgICAgIkRlciBlciBpa2tlIG5vayBodWtvbW1lbHNlIHRpbCBhdCB1ZGb4cmUgXAorZGVubmUgb3BlcmF0aW9uLiBcbkFmc2x1dCBldCBlbGxlciBmbGVyZSBha3RpdmUgcHJvZ3JhbW1lciBmb3IgYXQgZnJpZ/hyZSBcCitodWtvbW1lbHNlLCBvZyBwcvh2IHPlIGlnZW4uIgorCisjaW5jbHVkZSAibm90ZXBhZC5yYyIKKworCisKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUuaW4gYi9wcm9ncmFtcy9ub3RlcGFkL01ha2VmaWxlLmluCmluZGV4IDNkNjJiOWEuLmY2ZmU5NjEgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUuaW4KKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZS5pbgpAQCAtOCw3ICs4LDcgQEAKIEFMTF9MSUJTICA9ICQoV0lORUxJQikgJChYX0xJQlMpICQoWFBNX0xJQikgJChYTElCKSAkKExJQlMpCiBSQ0ZMQUdTICAgPSAtdzMyIC1oCiAKLUxBTkdVQUdFUyAgID0gRW4gRGUgRnIgU3cKK0xBTkdVQUdFUyAgID0gRW4gRGEgRGUgRnIgU3cKIExJQ0VOU0VMQU5HID0gRW4KIAogTU9TVFNSQ1MgPSBcCkBAIC0zNCw2ICszNCwyMyBAQAogCiBATUFLRV9SVUxFU0AKIAorIyBSdWxlcyBmb3IgdXNpbmcgb2xkIHJlc291cmNlIGNvbXBpbGVyCisucmMuYzoKKwllY2hvICIjaW5jbHVkZSBcIndpbmRvd3MuaFwiIiA+JCotdG1wLmMKKwllY2hvIFdJTkRPV1NfSF9FTkRTX0hFUkUgPj4kKi10bXAuYworCWNhdCAkPCA+PiQqLXRtcC5jCisJJChDUFApICQoREVGUykgJChPUFRJT05TKSAkKERJVklOQ0wpIC1EUkNfSU5WT0tFRCAtUCAkKi10bXAuYyB8IHNlZCAtZSAnMSwvXldJTkRPV1NfSF9FTkRTX0hFUkUvZCcgfCAkKFdJTkVSQykgJChSQ0ZMQUdTKSAtYyAtbyAkKiAtcCAkKgorCSQoUk0pICQqLXRtcC5jCisucmMuaDoKKwllY2hvICIjaW5jbHVkZSBcIndpbmRvd3MuaFwiIiA+JCotdG1wLmMKKwllY2hvIFdJTkRPV1NfSF9FTkRTX0hFUkUgPj4kKi10bXAuYworCWNhdCAkPCA+PiQqLXRtcC5jCisJJChDUFApICQoREVGUykgJChPUFRJT05TKSAkKERJVklOQ0wpIC1EUkNfSU5WT0tFRCAtUCAkKi10bXAuYyB8IHNlZCAtZSAnMSwvXldJTkRPV1NfSF9FTkRTX0hFUkUvZCcgfCAkKFdJTkVSQykgJChSQ0ZMQUdTKSAtYyAtbyAkKiAtcCAkKgorCSQoUk0pICQqLXRtcC5jCitjbGVhbjo6CisJJChSTSkgJChSQ19TUkNTOi5yYz0uYykKKworCiBub3RlcGFkOiAkKE1PU1RPQkpTKSAkKFNUUklOR09CSlMpCiAJJChDQykgLW8gbm90ZXBhZCAkKE1PU1RPQkpTKSAkKExET1BUSU9OUykgJChBTExfTElCUykgJChTVFJJTkdPQkpTKQogCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL0NoYW5nZUxvZyBiL3Byb2dyYW1zL3Byb2dtYW4vQ2hhbmdlTG9nCmluZGV4IGEzMmIxM2UuLjlkYjhhYjggMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3Byb2dtYW4vQ2hhbmdlTG9nCisrKyBiL3Byb2dyYW1zL3Byb2dtYW4vQ2hhbmdlTG9nCkBAIC03LDcgKzcsNyBAQAogCSogW2dycGZpbGUuY10KIAlBZGRlZCBjaGVja3N1bSBjYWxjdWxhdGlvbiBbVU5URVNURUQhXS4KIAotRnJpIEp1bCA0IDEyOjAwOjAwIDE5OTcgIEhlbnJpayBPbHNlbiA8SGVucmlrLk9sc2VuQGlhZXN0ZS5kaz4KK0ZyaSBKdWwgNCAxMjowMDowMCAxOTk3ICBIZW5yaWsgT2xzZW4gPGhlbnJpa0BpYWVzdGUuZGs+CiAKIAkqIFtEYS5yY10gKG5ldykKIAlBZGRlZCBEYW5pc2ggbGFuZ3VhZ2Ugc3VwcG9ydC4KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3Byb2dtYW4vRGEucmMgYi9wcm9ncmFtcy9wcm9nbWFuL0RhLnJjCmluZGV4IDhkZGI4NTIuLmVkM2QxMjQgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3Byb2dtYW4vRGEucmMKKysrIGIvcHJvZ3JhbXMvcHJvZ21hbi9EYS5yYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBQcm9ncmFtIE1hbmFnZXIKICAqCi0gKiBDb3B5cmlnaHQgMTk5NyBIZW5yaWsgT2xzZW4KKyAqIENvcHlyaWdodCAxOTk3IEhlbnJpayBPbHNlbiA8aGVucmlrQGlhZXN0ZS5kaz4KICAqLwogCiAjZGVmaW5lIExBTkdVQUdFX0lEICAgICAgICAgICAgICAgICAgRGEKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUuaW4gYi9wcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlLmluCmluZGV4IGYzODdlZGIuLjRhZjU4YjggMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUuaW4KKysrIGIvcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZS5pbgpAQCAtMzksNiArMzksMjMgQEAKIAogQE1BS0VfUlVMRVNACiAKKyMgUnVsZXMgZm9yIHVzaW5nIG9sZCByZXNvdXJjZSBjb21waWxlcgorLnJjLmM6CisJZWNobyAiI2luY2x1ZGUgXCJ3aW5kb3dzLmhcIiIgPiQqLXRtcC5jCisJZWNobyBXSU5ET1dTX0hfRU5EU19IRVJFID4+JCotdG1wLmMKKwljYXQgJDwgPj4kKi10bXAuYworCSQoQ1BQKSAkKERFRlMpICQoT1BUSU9OUykgJChESVZJTkNMKSAtRFJDX0lOVk9LRUQgLVAgJCotdG1wLmMgfCBzZWQgLWUgJzEsL15XSU5ET1dTX0hfRU5EU19IRVJFL2QnIHwgJChXSU5FUkMpICQoUkNGTEFHUykgLWMgLW8gJCogLXAgJCoKKwkkKFJNKSAkKi10bXAuYworLnJjLmg6CisJZWNobyAiI2luY2x1ZGUgXCJ3aW5kb3dzLmhcIiIgPiQqLXRtcC5jCisJZWNobyBXSU5ET1dTX0hfRU5EU19IRVJFID4+JCotdG1wLmMKKwljYXQgJDwgPj4kKi10bXAuYworCSQoQ1BQKSAkKERFRlMpICQoT1BUSU9OUykgJChESVZJTkNMKSAtRFJDX0lOVk9LRUQgLVAgJCotdG1wLmMgfCBzZWQgLWUgJzEsL15XSU5ET1dTX0hfRU5EU19IRVJFL2QnIHwgJChXSU5FUkMpICQoUkNGTEFHUykgLWMgLW8gJCogLXAgJCoKKwkkKFJNKSAkKi10bXAuYworY2xlYW46OgorCSQoUk0pICQoUkNfU1JDUzoucmM9LmMpCisKKwogcHJvZ21hbjogJChNT1NUT0JKUykgJChTVFJJTkdPQkpTKQogCSQoQ0MpIC1vIHByb2dtYW4gJChNT1NUT0JKUykgJChMRE9QVElPTlMpICQoQUxMX0xJQlMpICQoU1RSSU5HT0JKUykKIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcmVndGVzdC9DaGFuZ2VMb2cgYi9wcm9ncmFtcy9yZWd0ZXN0L0NoYW5nZUxvZwppbmRleCBlZjg0MTEwLi5hNTJhY2VmIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9yZWd0ZXN0L0NoYW5nZUxvZworKysgYi9wcm9ncmFtcy9yZWd0ZXN0L0NoYW5nZUxvZwpAQCAtMSwzICsxLDggQEAKK1R1ZSBNYXkgMjYgMTY6NTY6NDggMTk5NyAgTWF0dGhldyBCZWNrZXIgPG1iZWNrZXJAZ2xhc3NjaXR5Lm5ldD4KKworCSogW3JlZ3Rlc3QuY10KKwlNb3JlIGltcHJvdmVtZW50cywgdW50ZXN0ZWQgYmVjYXVzZSBvZiBXaW5lTGliIGlzc3VlLgorCiBXZWQgTWF5IDEzIDIyOjU4OjA1IDE5OTcgIE1hdHRoZXcgQmVja2VyIDxtYmVja2VyQGdsYXNzY2l0eS5uZXQ+CiAKIAkqIFtyZWd0ZXN0LmNdIChuZXcpCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9yZWd0ZXN0L3JlZ3Rlc3QuYyBiL3Byb2dyYW1zL3JlZ3Rlc3QvcmVndGVzdC5jCmluZGV4IGY4NzlkOWMuLmQwMzhjYmIgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3JlZ3Rlc3QvcmVndGVzdC5jCisrKyBiL3Byb2dyYW1zL3JlZ3Rlc3QvcmVndGVzdC5jCkBAIC0xLDIwICsxLDMzIEBACiAvKgogICogUmVnaXN0cnkgdGVzdGluZyBwcm9ncmFtCiAgKgorICogQ29weXJpZ2h0IDE5OTggTWF0dGhldyBCZWNrZXIKKyAqCiAgKiBUaGUgcmV0dXJuIGNvZGVzIHdlcmUgZ2VuZXJhdGVkIGluIGFuIE5UNDAgZW52aXJvbm1lbnQsIHVzaW5nIGxjYy13aW4zMgogICoKLSAqIENvcHlyaWdodCAxOTk4IGJ5IE1hdHRoZXcgQmVja2VyIChtYmVja2VyQGdsYXNzY2l0eS5uZXQpCisgKiBOT1RFUworICogICAgV2hlbiBjb21waWxpbmcgdW5kZXIgbGNjLXdpbjMyLCBJIGdldCB0aHJlZSAoMykgd2FybmluZywgYnV0IHRoZXkgYWxsCisgKiAgICBzZWVtIHRvIGJlIGlzc3VlcyB3aXRoIGxjYy4KICAqCi0qLworICogICAgSWYgY3JlYXRpbmcgYSBuZXcgdGVzdGluZyBzZXF1ZW5jZSwgcGxlYXNlIHRyeSB0byBjbGVhbiB1cCBhbnkKKyAqICAgIHJlZ2lzdHJ5IGNoYW5nZXMgdGhhdCBhcmUgbWFkZS4KKyAqLwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjaW5jbHVkZSA8d2lucmVnLmg+CiAjaW5jbHVkZSA8d2luZXJyb3IuaD4KKyNpbmNsdWRlIDx3aW5udC5oPgorCisvKiBUcnVlIHRoaXMgd2hlbiBzZWN1cml0eSBpcyBpbXBsZW1lbnRlZCAqLworI2RlZmluZSBDSEVDS19TQU0gRkFMU0UKIAogLyoKICAqIE5PVEVTOiBUaGVzZSBpbmRpdmlkdWFsIHJvdXRpbmVzIGFyZSBsaXN0ZWQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgorICoKKyAqIFRoZXkgYXJlIG1lYW50IHRvIHRlc3QgZXJyb3IgY29uZGl0aW9ucy4gIFN1Y2Nlc3MgY29uZGl0aW9ucyBhcmUKKyAqIHRlc3RlZCBpbiB0aGUgc2VxdWVuY2VzIGZvdW5kIGF0IHRoZSBlbmQuCiAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjMsMjIgKzM2LDE3IEBACiB2b2lkIFRlc3RDbG9zZUtleSgpCiB7CiAgICAgbG9uZyBsU3RzOwotICAgIEhLRVkgaGtleTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIlRlc3RpbmcgUmVnQ2xvc2VLZXkuLi5cbiIpOwogCi0gICAgaGtleSA9IChIS0VZKTA7Ci0gICAgbFN0cyA9IFJlZ0Nsb3NlS2V5KGhrZXkpOworICAgIGxTdHMgPSBSZWdDbG9zZUtleSgoSEtFWSkyKTsKICAgICBpZiAobFN0cyAhPSBFUlJPUl9JTlZBTElEX0hBTkRMRSkgZnByaW50ZihzdGRlcnIsICIgMTolbGRcbiIsbFN0cyk7CiAKLSAgICBoa2V5ID0gKEhLRVkpLTI7Ci0gICAgbFN0cyA9IFJlZ0Nsb3NlS2V5KGhrZXkpOwotICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiAyOiVsZFxuIixsU3RzKTsKKyAgICBsU3RzID0gUmVnQ2xvc2VLZXkoSEtFWV9MT0NBTF9NQUNISU5FKTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9TVUNDRVNTKSBmcHJpbnRmKHN0ZGVyciwgIiAyOiVsZFxuIixsU3RzKTsKIAorICAgIC8qIENoZWNrIHR3aWNlIGp1c3QgZm9yIGtpY2tzICovCiAgICAgbFN0cyA9IFJlZ0Nsb3NlS2V5KEhLRVlfTE9DQUxfTUFDSElORSk7CiAgICAgaWYgKGxTdHMgIT0gRVJST1JfU1VDQ0VTUykgZnByaW50ZihzdGRlcnIsICIgMzolbGRcbiIsbFN0cyk7Ci0KLSAgICBsU3RzID0gUmVnQ2xvc2VLZXkoSEtFWV9MT0NBTF9NQUNISU5FKTsKLSAgICBpZiAobFN0cyAhPSBFUlJPUl9TVUNDRVNTKSBmcHJpbnRmKHN0ZGVyciwgIiA0OiVsZFxuIixsU3RzKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTAsMTEgKzU4LDE2IEBACiAgICAgSEtFWSBoa2V5OwogICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdDb25uZWN0UmVnaXN0cnkuLi5cbiIpOwogCi0gICAgbFN0cyA9IFJlZ0Nvbm5lY3RSZWdpc3RyeSgiIiwwLCZoa2V5KTsKKyAgICBsU3RzID0gUmVnQ29ubmVjdFJlZ2lzdHJ5KCIiLChIS0VZKTIsJmhrZXkpOwogICAgIGlmIChsU3RzICE9IEVSUk9SX1NVQ0NFU1MpIGZwcmludGYoc3RkZXJyLCAiIDE6JWxkXG4iLGxTdHMpOwogCiAgICAgbFN0cyA9IFJlZ0Nvbm5lY3RSZWdpc3RyeSgiIixIS0VZX0xPQ0FMX01BQ0hJTkUsJmhrZXkpOwogICAgIGlmIChsU3RzICE9IEVSUk9SX1NVQ0NFU1MpIGZwcmludGYoc3RkZXJyLCAiIDI6JWxkXG4iLGxTdHMpOworCisjaWYgVE9PX1NMT1cKKyAgICBsU3RzID0gUmVnQ29ubmVjdFJlZ2lzdHJ5KCJcXFxccmVndGVzdCIsSEtFWV9MT0NBTF9NQUNISU5FLCZoa2V5KTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9CQURfTkVUUEFUSCkgZnByaW50ZihzdGRlcnIsICIgMzolbGRcbiIsbFN0cyk7CisjZW5kaWYKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjIsMTggKzc1LDI2IEBACiAgKi8KIHZvaWQgVGVzdENyZWF0ZUtleSgpCiB7Ci0gICAgSEtFWSBoS2V5SW47CiAgICAgbG9uZyBsU3RzOwogICAgIEhLRVkgaGtleTsKIAogICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdDcmVhdGVLZXkuLi5cbiIpOwogCi0gICAgaEtleUluID0gKEhLRVkpMTsKLSAgICBsU3RzID0gUmVnQ3JlYXRlS2V5KGhLZXlJbiwiIiwmaGtleSk7CisgICAgbFN0cyA9IFJlZ0NyZWF0ZUtleSgoSEtFWSkyLCIiLCZoa2V5KTsKICAgICBpZiAobFN0cyAhPSBFUlJPUl9CQURLRVkpIGZwcmludGYoc3RkZXJyLCAiIDE6JWxkXG4iLGxTdHMpOwogCisgICAgbFN0cyA9IFJlZ0NyZWF0ZUtleShIS0VZX0xPQ0FMX01BQ0hJTkUsIiIsJmhrZXkpOworICAgIGlmIChsU3RzICE9IEVSUk9SX1NVQ0NFU1MpIGZwcmludGYoc3RkZXJyLCAiIDI6JWxkXG4iLGxTdHMpOworICAgIFJlZ0Nsb3NlS2V5KGhrZXkpOworCiAgICAgbFN0cyA9IFJlZ0NyZWF0ZUtleShIS0VZX0xPQ0FMX01BQ0hJTkUsIlxcYXNkZiIsJmhrZXkpOwotICAgIGlmIChsU3RzICE9IEVSUk9SX0JBRF9QQVRITkFNRSkgZnByaW50ZihzdGRlcnIsICIgMjolbGRcbiIsbFN0cyk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfQkFEX1BBVEhOQU1FKSBmcHJpbnRmKHN0ZGVyciwgIiAzOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdDcmVhdGVLZXkoSEtFWV9MT0NBTF9NQUNISU5FLCJhc2RmXFwiLCZoa2V5KTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUikgZnByaW50ZihzdGRlcnIsICIgNDolbGRcbiIsbFN0cyk7CisKKyAgICBsU3RzID0gUmVnQ3JlYXRlS2V5KEhLRVlfTE9DQUxfTUFDSElORSwiXFxhc2RmXFwiLCZoa2V5KTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9CQURfUEFUSE5BTUUpIGZwcmludGYoc3RkZXJyLCAiIDU6JWxkXG4iLGxTdHMpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC04MSwyMiArMTAyLDI3IEBACiAgKi8KIHZvaWQgVGVzdENyZWF0ZUtleUV4KCkKIHsKLSAgICBIS0VZIGhLZXlJbjsKICAgICBsb25nIGxTdHM7CiAgICAgSEtFWSBoa2V5OwogICAgIERXT1JEIGR3RGlzcDsKIAogICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdDcmVhdGVLZXlFeC4uLlxuIik7CiAKLSAgICBoS2V5SW4gPSAoSEtFWSkxOwotICAgIGxTdHMgPSBSZWdDcmVhdGVLZXlFeChoS2V5SW4sIiIsMCwiIiwwLDAsTlVMTCwmaGtleSwmZHdEaXNwKTsKLSAgICBpZiAobFN0cyAhPSBFUlJPUl9TVUNDRVNTKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKKyAgICBsU3RzID0gUmVnQ3JlYXRlS2V5RXgoKEhLRVkpMiwiIiwwLCIiLDAsMCxOVUxMLCZoa2V5LCZkd0Rpc3ApOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKIAotICAgIGxTdHMgPSBSZWdDcmVhdGVLZXlFeChoS2V5SW4sInJlZ3Rlc3QiLDAsIiIsMCwwLE5VTEwsJmhrZXksJmR3RGlzcCk7Ci0gICAgaWYgKGxTdHMgIT0gRVJST1JfU1VDQ0VTUykgZnByaW50ZihzdGRlcnIsICIgMjolbGRcbiIsbFN0cyk7CisgICAgbFN0cyA9IFJlZ0NyZWF0ZUtleUV4KEhLRVlfTE9DQUxfTUFDSElORSwicmVndGVzdCIsMCwiIiwwLDAsTlVMTCwmaGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR3RGlzcCk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpIGZwcmludGYoc3RkZXJyLCAiIDI6JWxkXG4iLGxTdHMpOwogCi0gICAgbFN0cyA9IFJlZ0NyZWF0ZUtleUV4KGhLZXlJbiwicmVndGVzdCIsMCwiYXNkZiIsMCxLRVlfQUxMX0FDQ0VTUyxOVUxMLCZoa2V5LCZkd0Rpc3ApOwotICAgIGlmIChsU3RzICE9IEVSUk9SX1NVQ0NFU1MpIGZwcmludGYoc3RkZXJyLCAiIDM6JWxkXG4iLGxTdHMpOworICAgIGxTdHMgPSBSZWdDcmVhdGVLZXlFeChIS0VZX0xPQ0FMX01BQ0hJTkUsInJlZ3Rlc3QiLDAsImFzZGYiLDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9BTExfQUNDRVNTLE5VTEwsJmhrZXksJmR3RGlzcCk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpIGZwcmludGYoc3RkZXJyLCAiIDM6JWxkXG4iLGxTdHMpOworCisgICAgbFN0cyA9IFJlZ0NyZWF0ZUtleUV4KEhLRVlfTE9DQUxfTUFDSElORSwicmVndGVzdCIsMCwiIiwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfQUxMX0FDQ0VTUyxOVUxMLCZoa2V5LCZkd0Rpc3ApOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSBmcHJpbnRmKHN0ZGVyciwgIiA0OiVsZFxuIixsU3RzKTsKKwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDUsMTUgKzEzMSwxOCBAQAogdm9pZCBUZXN0RGVsZXRlS2V5KCkKIHsKICAgICBsb25nIGxTdHM7Ci0gICAgSEtFWSBoa2V5OwogICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdEZWxldGVLZXkuLi5cbiIpOwogCi0gICAgaGtleSA9IChIS0VZKTA7Ci0gICAgbFN0cyA9IFJlZ0RlbGV0ZUtleShoa2V5LCAiYXNkZiIpOworICAgIGxTdHMgPSBSZWdEZWxldGVLZXkoKEhLRVkpMiwgImFzZGYiKTsKICAgICBpZiAobFN0cyAhPSBFUlJPUl9JTlZBTElEX0hBTkRMRSkgZnByaW50ZihzdGRlcnIsICIgMTolbGRcbiIsbFN0cyk7CiAKICAgICBsU3RzID0gUmVnRGVsZXRlS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCAiYXNkZiIpOwogICAgIGlmIChsU3RzICE9IEVSUk9SX0ZJTEVfTk9UX0ZPVU5EKSBmcHJpbnRmKHN0ZGVyciwgIiAyOiVsZFxuIixsU3RzKTsKKworI2lmIENIRUNLX1NBTQorICAgIGxTdHMgPSBSZWdEZWxldGVLZXkoSEtFWV9DVVJSRU5UX1VTRVIsICIiKTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9BQ0NFU1NfREVOSUVEKSBmcHJpbnRmKHN0ZGVyciwgIiAzOiVsZFxuIixsU3RzKTsKKyNlbmRpZgogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjIsMTUgKzE1MSwxOSBAQAogdm9pZCBUZXN0RGVsZXRlVmFsdWUoKQogewogICAgIGxvbmcgbFN0czsKLSAgICBIS0VZIGhrZXk7CiAgICAgZnByaW50ZihzdGRlcnIsICJUZXN0aW5nIFJlZ0RlbGV0ZVZhbHVlLi4uXG4iKTsKIAotICAgIGhrZXkgPSAoSEtFWSkwOwotICAgIGxTdHMgPSBSZWdEZWxldGVWYWx1ZShoa2V5LCAiYXNkZiIpOworICAgIGxTdHMgPSBSZWdEZWxldGVWYWx1ZSgoSEtFWSkyLCAiYXNkZiIpOwogICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKIAotICAgIGxTdHMgPSBSZWdEZWxldGVWYWx1ZShIS0VZX0NVUlJFTlRfVVNFUiwgImFzZGYiKTsKKyAgICBsU3RzID0gUmVnRGVsZXRlVmFsdWUoSEtFWV9DVVJSRU5UX1VTRVIsICIiKTsKICAgICBpZiAobFN0cyAhPSBFUlJPUl9GSUxFX05PVF9GT1VORCkgZnByaW50ZihzdGRlcnIsICIgMjolbGRcbiIsbFN0cyk7CisKKyAgICBsU3RzID0gUmVnRGVsZXRlVmFsdWUoSEtFWV9DVVJSRU5UX1VTRVIsICJhc2RmIik7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfRklMRV9OT1RfRk9VTkQpIGZwcmludGYoc3RkZXJyLCAiIDM6JWxkXG4iLGxTdHMpOworCisgICAgbFN0cyA9IFJlZ0RlbGV0ZVZhbHVlKEhLRVlfQ1VSUkVOVF9VU0VSLCAiXFxhc2RmIik7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfRklMRV9OT1RfRk9VTkQpIGZwcmludGYoc3RkZXJyLCAiIDQ6JWxkXG4iLGxTdHMpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNDEsMTQgKzE3NCwxMiBAQAogICAgIGxvbmcgbFN0czsKICAgICBjaGFyICpzVmFsOwogICAgIGxvbmcgbFZhbDsKLSAgICBIS0VZIGhrZXk7CiAKICAgICBmcHJpbnRmKHN0ZGVyciwgIlRlc3RpbmcgUmVnRW51bUtleS4uLlxuIik7Ci0gICAgc1ZhbCA9IChjaGFyICopbWFsbG9jKDEgKiBzaXplb2YoY2hhcikpOwotICAgIGxWYWwgPSBzaXplb2Yoc1ZhbCk7CisgICAgbFZhbCA9IDE7CisgICAgc1ZhbCA9IChjaGFyICopbWFsbG9jKGxWYWwgKiBzaXplb2YoY2hhcikpOwogCi0gICAgaGtleSA9IChIS0VZKTA7Ci0gICAgbFN0cyA9IFJlZ0VudW1LZXkoaGtleSwzLHNWYWwsbFZhbCk7CisgICAgbFN0cyA9IFJlZ0VudW1LZXkoKEhLRVkpMiwzLHNWYWwsbFZhbCk7CiAgICAgaWYgKGxTdHMgIT0gRVJST1JfSU5WQUxJRF9IQU5ETEUpIGZwcmludGYoc3RkZXJyLCAiIDE6JWxkXG4iLGxTdHMpOwogCiAgICAgbFN0cyA9IFJlZ0VudW1LZXkoSEtFWV9DVVJSRU5UX1VTRVIsLTEsc1ZhbCxsVmFsKTsKQEAgLTE3MSwxMyArMjAyLDE5IEBACiAgICAgRklMRVRJTUUgZnQ7CiAKICAgICBmcHJpbnRmKHN0ZGVyciwgIlRlc3RpbmcgUmVnRW51bUtleUV4Li4uXG4iKTsKLSAgICBzVmFsID0gKGNoYXIgKiltYWxsb2MoODAgKiBzaXplb2YoY2hhcikpOwotICAgIGxMZW4xPSBzaXplb2Yoc1ZhbCk7Ci0gICAgc0NsYXNzID0gKGNoYXIgKiltYWxsb2MoMTAgKiBzaXplb2YoY2hhcikpOwotICAgIGxMZW4yID0gc2l6ZW9mKHNDbGFzcyk7CisgICAgbExlbjEgPSAxOworICAgIHNWYWwgPSAoY2hhciAqKW1hbGxvYyhsTGVuMSAqIHNpemVvZihjaGFyKSk7CisgICAgbExlbjIgPSAxOworICAgIHNDbGFzcyA9IChjaGFyICopbWFsbG9jKGxMZW4yICogc2l6ZW9mKGNoYXIpKTsKIAotICAgIGxTdHMgPSBSZWdFbnVtS2V5RXgoMCwwLHNWYWwsJmxMZW4xLDAsc0NsYXNzLCZsTGVuMiwmZnQpOworICAgIGxTdHMgPSBSZWdFbnVtS2V5RXgoKEhLRVkpMiwwLHNWYWwsJmxMZW4xLDAsc0NsYXNzLCZsTGVuMiwmZnQpOwogICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdFbnVtS2V5RXgoSEtFWV9MT0NBTF9NQUNISU5FLDAsc1ZhbCwmbExlbjEsMCxzQ2xhc3MsJmxMZW4yLCZmdCk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfTU9SRV9EQVRBKSBmcHJpbnRmKHN0ZGVyciwgIiAyOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdFbnVtS2V5RXgoSEtFWV9MT0NBTF9NQUNISU5FLDAsc1ZhbCwmbExlbjEsMCxzQ2xhc3MsJmxMZW4yLCZmdCk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfTU9SRV9EQVRBKSBmcHJpbnRmKHN0ZGVyciwgIiAzOiVsZFxuIixsU3RzKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTkxLDIzICsyMjgsMjEgQEAKICAgICB1bnNpZ25lZCBsb25nIGxUeXBlOwogICAgIHVuc2lnbmVkIGxvbmcgbExlbjE7CiAgICAgY2hhciAqYlZhbDsKLSAgICBIS0VZIGhrZXk7CiAKICAgICBmcHJpbnRmKHN0ZGVyciwgIlRlc3RpbmcgUmVnRW51bVZhbHVlLi4uXG4iKTsKLSAgICBzVmFsID0gKGNoYXIgKiltYWxsb2MoODAgKiBzaXplb2YoY2hhcikpOwotICAgIGJWYWwgPSAoY2hhciAqKW1hbGxvYyg4MCAqIHNpemVvZihjaGFyKSk7Ci0gICAgbFZhbCA9IHNpemVvZihzVmFsKTsKLSAgICBsTGVuMSA9IHNpemVvZihiVmFsKTsKKyAgICBsVmFsID0gMTsKKyAgICBzVmFsID0gKGNoYXIgKiltYWxsb2MobFZhbCAqIHNpemVvZihjaGFyKSk7CisgICAgbExlbjEgPSAxOworICAgIGJWYWwgPSAoY2hhciAqKW1hbGxvYyhsTGVuMSAqIHNpemVvZihjaGFyKSk7CiAKLSAgICBoa2V5ID0gKEhLRVkpMDsKLSAgICBsU3RzID0gUmVnRW51bVZhbHVlKGhrZXksLTEsc1ZhbCwmbFZhbCwwLCZsVHlwZSxOVUxMLCZsTGVuMSk7CisgICAgbFN0cyA9IFJlZ0VudW1WYWx1ZSgoSEtFWSkyLC0xLHNWYWwsJmxWYWwsMCwmbFR5cGUsTlVMTCwmbExlbjEpOwogICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKIAogICAgIGxTdHMgPSBSZWdFbnVtVmFsdWUoSEtFWV9MT0NBTF9NQUNISU5FLC0xLHNWYWwsJmxWYWwsMCwmbFR5cGUsTlVMTCwmbExlbjEpOwogICAgIGlmIChsU3RzICE9IEVSUk9SX05PX01PUkVfSVRFTVMpIGZwcmludGYoc3RkZXJyLCAiIDI6JWxkXG4iLGxTdHMpOwogCiAgICAgbFN0cyA9IFJlZ0VudW1WYWx1ZShIS0VZX0xPQ0FMX01BQ0hJTkUsMCxzVmFsLCZsVmFsLDAsJmxUeXBlLE5VTEwsJmxMZW4xKTsKLSAgICBpZiAobFN0cyAhPSBFUlJPUl9OT19NT1JFX0lURU1TKSBmcHJpbnRmKHN0ZGVyciwgIiAzOiVsZFxuIixsU3RzKTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9TVUNDRVNTKSBmcHJpbnRmKHN0ZGVyciwgIiAzOiVsZFxuIixsU3RzKTsKIAogICAgIGxTdHMgPSBSZWdFbnVtVmFsdWUoSEtFWV9MT0NBTF9NQUNISU5FLDEsc1ZhbCwmbFZhbCwwLCZsVHlwZSxiVmFsLCZsTGVuMSk7CiAgICAgaWYgKGxTdHMgIT0gRVJST1JfTk9fTU9SRV9JVEVNUykgZnByaW50ZihzdGRlcnIsICIgNDolbGRcbiIsbFN0cyk7CkBAIC0yMjEsNyArMjU2LDcgQEAKICAgICBsb25nIGxTdHM7CiAgICAgZnByaW50ZihzdGRlcnIsICJUZXN0aW5nIFJlZ0ZsdXNoS2V5Li4uXG4iKTsKIAotICAgIGxTdHMgPSBSZWdGbHVzaEtleSgwKTsKKyAgICBsU3RzID0gUmVnRmx1c2hLZXkoKEhLRVkpMik7CiAgICAgaWYgKGxTdHMgIT0gRVJST1JfSU5WQUxJRF9IQU5ETEUpIGZwcmludGYoc3RkZXJyLCAiIDE6JWxkXG4iLGxTdHMpOwogCiAgICAgbFN0cyA9IFJlZ0ZsdXNoS2V5KEhLRVlfTE9DQUxfTUFDSElORSk7CkBAIC0yMzcsMjEgKzI3MiwxNyBAQAogICAgIFNFQ1VSSVRZX0lORk9STUFUSU9OIHNpOwogICAgIFNFQ1VSSVRZX0RFU0NSSVBUT1Igc2Q7CiAgICAgdW5zaWduZWQgbG9uZyBsTGVuOwotICAgIEhLRVkgaGtleTsKIAogICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdHZXRLZXlTZWN1cml0eS4uLlxuIik7CiAgICAgbExlbiA9IHNpemVvZihzZCk7CiAKLSAgICBoa2V5ID0gKEhLRVkpMDsKLSAgICBsU3RzID0gUmVnR2V0S2V5U2VjdXJpdHkoaGtleSxzaSwmc2QsJmxMZW4pOworICAgIGxTdHMgPSBSZWdHZXRLZXlTZWN1cml0eSgoSEtFWSkyLHNpLCZzZCwmbExlbik7CiAgICAgaWYgKGxTdHMgIT0gRVJST1JfSU5WQUxJRF9IQU5ETEUpIGZwcmludGYoc3RkZXJyLCAiIDE6JWxkXG4iLGxTdHMpOwogCiAgICAgbFN0cyA9IFJlZ0dldEtleVNlY3VyaXR5KEhLRVlfTE9DQUxfTUFDSElORSxzaSwmc2QsJmxMZW4pOwogICAgIGlmIChsU3RzICE9IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpIGZwcmludGYoc3RkZXJyLCAiIDI6JWxkXG4iLGxTdHMpOwogCi0jaWYgMAogICAgIHNpID0gR1JPVVBfU0VDVVJJVFlfSU5GT1JNQVRJT047Ci0jZW5kaWYKICAgICBsU3RzID0gUmVnR2V0S2V5U2VjdXJpdHkoSEtFWV9MT0NBTF9NQUNISU5FLHNpLCZzZCwmbExlbik7CiAgICAgaWYgKGxTdHMgIT0gRVJST1JfU1VDQ0VTUykgZnByaW50ZihzdGRlcnIsICIgMzolbGRcbiIsbFN0cyk7CiB9CkBAIC0yNjQsOCArMjk1LDggQEAKICAgICBsb25nIGxTdHM7CiAgICAgZnByaW50ZihzdGRlcnIsICJUZXN0aW5nIFJlZ0xvYWRLZXkuLi5cbiIpOwogCi0gICAgbFN0cyA9IFJlZ0xvYWRLZXkoMCwiIiwiIik7Ci0gICAgaWYgKGxTdHMgIT0gRVJST1JfSU5WQUxJRF9IQU5ETEUpIGZwcmludGYoc3RkZXJyLCAiIDE6JWxkXG4iLGxTdHMpOworICAgIGxTdHMgPSBSZWdMb2FkS2V5KChIS0VZKTIsIiIsIiIpOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKIAogICAgIGxTdHMgPSBSZWdMb2FkS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCIiLCIiKTsKICAgICBpZiAobFN0cyAhPSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUikgZnByaW50ZihzdGRlcnIsICIgMjolbGRcbiIsbFN0cyk7CkBAIC0yNzMsOCArMzA0LDE2IEBACiAgICAgbFN0cyA9IFJlZ0xvYWRLZXkoSEtFWV9DVVJSRU5UX1VTRVIsInJlZ3Rlc3QiLCIiKTsKICAgICBpZiAobFN0cyAhPSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUikgZnByaW50ZihzdGRlcnIsICIgMzolbGRcbiIsbFN0cyk7CiAKKyAgICBsU3RzID0gUmVnTG9hZEtleShIS0VZX0NVUlJFTlRfVVNFUiwiXFxyZWd0ZXN0IiwiIik7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpIGZwcmludGYoc3RkZXJyLCAiIDQ6JWxkXG4iLGxTdHMpOworCisjaWYgQ0hFQ0tfU0FNCiAgICAgbFN0cyA9IFJlZ0xvYWRLZXkoSEtFWV9DVVJSRU5UX1VTRVIsInJlZ3Rlc3QiLCJyZWd0ZXN0LmRhdCIpOwotICAgIGlmIChsU3RzICE9IEVSUk9SX1BSSVZJTEVHRV9OT1RfSEVMRCkgZnByaW50ZihzdGRlcnIsICIgNDolbGRcbiIsbFN0cyk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfUFJJVklMRUdFX05PVF9IRUxEKSBmcHJpbnRmKHN0ZGVyciwgIiA1OiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdMb2FkS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCJcXHJlZ3Rlc3QiLCJyZWd0ZXN0LmRhdCIpOworICAgIGlmIChsU3RzICE9IEVSUk9SX1BSSVZJTEVHRV9OT1RfSEVMRCkgZnByaW50ZihzdGRlcnIsICIgNjolbGRcbiIsbFN0cyk7CisjZW5kaWYKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjg0LDIwICszMjMsMTkgQEAKIHsKICAgICBsb25nIGxTdHM7CiAgICAgSEFORExFIGhFdmVudDsKLSAgICBIS0VZIGhrZXk7CiAKICAgICBmcHJpbnRmKHN0ZGVyciwgIlRlc3RpbmcgUmVnTm90aWZ5Q2hhbmdlS2V5VmFsdWUuLi5cbiIpOwotICAgIGhFdmVudCA9IDA7CisgICAgaEV2ZW50ID0gKEhBTkRMRSkwOwogCi0gICAgaGtleSA9IChIS0VZKTI7Ci0gICAgbFN0cyA9IFJlZ05vdGlmeUNoYW5nZUtleVZhbHVlKGhrZXksIFRSVUUsIFJFR19OT1RJRllfQ0hBTkdFX05BTUUsIDAsIDApOworICAgIGxTdHMgPSBSZWdOb3RpZnlDaGFuZ2VLZXlWYWx1ZSgoSEtFWSkyLCBUUlVFLCBSRUdfTk9USUZZX0NIQU5HRV9OQU1FLCAwLCAwKTsKICAgICBpZiAobFN0cyAhPSBFUlJPUl9JTlZBTElEX0hBTkRMRSkgZnByaW50ZihzdGRlcnIsICIgMTolbGRcbiIsbFN0cyk7CiAKICAgICBsU3RzID0gUmVnTm90aWZ5Q2hhbmdlS2V5VmFsdWUoSEtFWV9DVVJSRU5UX1VTRVIsIFRSVUUsIFJFR19OT1RJRllfQ0hBTkdFX05BTUUsIDAsIDEpOwogICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSBmcHJpbnRmKHN0ZGVyciwgIiAyOiVsZFxuIixsU3RzKTsKIAorICAgIGhFdmVudCA9IChIQU5ETEUpSEtFWV9DVVJSRU5UX1VTRVI7CiAgICAgbFN0cyA9IFJlZ05vdGlmeUNoYW5nZUtleVZhbHVlKEhLRVlfQ1VSUkVOVF9VU0VSLCBUUlVFLCBSRUdfTk9USUZZX0NIQU5HRV9OQU1FLCBoRXZlbnQsIDEpOwotICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSBmcHJpbnRmKHN0ZGVyciwgIiAzOiVsZFxuIixsU3RzKTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9JTlZBTElEX0hBTkRMRSkgZnByaW50ZihzdGRlcnIsICIgMzolbGRcbiIsbFN0cyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMwOSwxMyArMzQ3LDE0IEBACiAgICAgSEtFWSBoa2V5OwogICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdPcGVuS2V5Li4uXG4iKTsKIAotICAgIGxTdHMgPSBSZWdPcGVuS2V5KDAsICIiLCZoa2V5KTsKKyAgICBsU3RzID0gUmVnT3BlbktleSgoSEtFWSkyLCAiIiwmaGtleSk7CiAgICAgaWYgKGxTdHMgIT0gRVJST1JfU1VDQ0VTUykgZnByaW50ZihzdGRlcnIsICIgMTolbGRcbiIsbFN0cyk7CisgICAgUmVnQ2xvc2VLZXkoaGtleSk7CiAKLSAgICBsU3RzID0gUmVnT3BlbktleSgwLCAicmVndGVzdCIsJmhrZXkpOworICAgIGxTdHMgPSBSZWdPcGVuS2V5KChIS0VZKTIsICJyZWd0ZXN0IiwmaGtleSk7CiAgICAgaWYgKGxTdHMgIT0gRVJST1JfSU5WQUxJRF9IQU5ETEUpIGZwcmludGYoc3RkZXJyLCAiIDI6JWxkXG4iLGxTdHMpOwogCi0gICAgbFN0cyA9IFJlZ09wZW5LZXkoSEtFWV9DVVJSRU5UX1VTRVIsICJyZWd0ZXN0MSIsJmhrZXkpOworICAgIGxTdHMgPSBSZWdPcGVuS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCAicmVndGVzdCIsJmhrZXkpOwogICAgIGlmIChsU3RzICE9IEVSUk9SX0ZJTEVfTk9UX0ZPVU5EKSBmcHJpbnRmKHN0ZGVyciwgIiAzOiVsZFxuIixsU3RzKTsKIAogICAgIGxTdHMgPSBSZWdPcGVuS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCAiXFxyZWd0ZXN0IiwmaGtleSk7CkBAIC0zMjgsMTYgKzM2NywyMCBAQAogdm9pZCBUZXN0T3BlbktleUV4KCkKIHsKICAgICBsb25nIGxTdHM7Ci0gICAgSEtFWSBoa2V5SW47CiAgICAgSEtFWSBoa2V5OwogICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdPcGVuS2V5RXguLi5cbiIpOwogCi0gICAgaGtleUluID0gKEhLRVkpMDsKLSAgICBsU3RzID0gUmVnT3BlbktleUV4KGhrZXlJbiwiIiwwLEtFWV9BTExfQUNDRVNTLCZoa2V5KTsKKyAgICBsU3RzID0gUmVnT3BlbktleUV4KChIS0VZKTIsIiIsMCxLRVlfQUxMX0FDQ0VTUywmaGtleSk7CiAgICAgaWYgKGxTdHMgIT0gRVJST1JfSU5WQUxJRF9IQU5ETEUpIGZwcmludGYoc3RkZXJyLCAiIDE6JWxkXG4iLGxTdHMpOwogCiAgICAgbFN0cyA9IFJlZ09wZW5LZXlFeChIS0VZX0NVUlJFTlRfVVNFUiwiXFxyZWd0ZXN0IiwwLEtFWV9BTExfQUNDRVNTLCZoa2V5KTsKICAgICBpZiAobFN0cyAhPSBFUlJPUl9CQURfUEFUSE5BTUUpIGZwcmludGYoc3RkZXJyLCAiIDI6JWxkXG4iLGxTdHMpOworCisgICAgbFN0cyA9IFJlZ09wZW5LZXlFeChIS0VZX0NVUlJFTlRfVVNFUiwicmVndGVzdCIsMCwwLCZoa2V5KTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9GSUxFX05PVF9GT1VORCkgZnByaW50ZihzdGRlcnIsICIgMzolbGRcbiIsbFN0cyk7CisKKyAgICBsU3RzID0gUmVnT3BlbktleUV4KEhLRVlfQ1VSUkVOVF9VU0VSLCJyZWd0ZXN0XFwiLDAsMCwmaGtleSk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfRklMRV9OT1RfRk9VTkQpIGZwcmludGYoc3RkZXJyLCAiIDM6JWxkXG4iLGxTdHMpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zNDUsNyArMzg4LDMxIEBACiAgKi8KIHZvaWQgVGVzdFF1ZXJ5SW5mb0tleSgpCiB7CisgICAgbG9uZyBsU3RzOworICAgIGNoYXIgKnNDbGFzczsKKyAgICB1bnNpZ25lZCBsb25nIGxDbGFzczsKKyAgICB1bnNpZ25lZCBsb25nIGxTdWJLZXlzOworICAgIHVuc2lnbmVkIGxvbmcgbE1heFN1YkxlbjsKKyAgICB1bnNpZ25lZCBsb25nIGxNYXhDbGFzc0xlbjsKKyAgICB1bnNpZ25lZCBsb25nIGxWYWx1ZXM7CisgICAgdW5zaWduZWQgbG9uZyBsTWF4VmFsTmFtZUxlbjsKKyAgICB1bnNpZ25lZCBsb25nIGxNYXhWYWxMZW47CisgICAgdW5zaWduZWQgbG9uZyBsU2VjRGVzY0xlbjsKKyAgICBGSUxFVElNRSBmdDsKICAgICBmcHJpbnRmKHN0ZGVyciwgIlRlc3RpbmcgUmVnUXVlcnlJbmZvS2V5Li4uXG4iKTsKKworICAgIGxDbGFzcyA9IDE7CisgICAgc0NsYXNzID0gKGNoYXIgKiltYWxsb2MobENsYXNzICogc2l6ZW9mKGNoYXIpKTsKKworICAgIGxTdHMgPSBSZWdRdWVyeUluZm9LZXkoKEhLRVkpMixzQ2xhc3MsJmxDbGFzcywwLCZsU3ViS2V5cywmbE1heFN1YkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZsTWF4Q2xhc3NMZW4sJmxWYWx1ZXMsJmxNYXhWYWxOYW1lTGVuLCZsTWF4VmFsTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxTZWNEZXNjTGVuLCAmZnQpOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdRdWVyeUluZm9LZXkoSEtFWV9DVVJSRU5UX1VTRVIsc0NsYXNzLCZsQ2xhc3MsMCwmbFN1YktleXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmbE1heFN1YkxlbiwmbE1heENsYXNzTGVuLCZsVmFsdWVzLCZsTWF4VmFsTmFtZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZsTWF4VmFsTGVuLCZsU2VjRGVzY0xlbiwgJmZ0KTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9TVUNDRVNTKSBmcHJpbnRmKHN0ZGVyciwgIiAyOiVsZFxuIixsU3RzKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzU0LDE2ICs0MjEsMTQgQEAKIHZvaWQgVGVzdFF1ZXJ5VmFsdWUoKQogewogICAgIGxvbmcgbFN0czsKLSAgICBIS0VZIGhrZXk7CiAgICAgbG9uZyBsTGVuOwogICAgIGNoYXIgKnNWYWw7CiAKICAgICBmcHJpbnRmKHN0ZGVyciwgIlRlc3RpbmcgUmVnUXVlcnlWYWx1ZS4uLlxuIik7Ci0gICAgaGtleSA9IChIS0VZKTA7CiAgICAgc1ZhbCA9IChjaGFyICopbWFsbG9jKDgwICogc2l6ZW9mKGNoYXIpKTsKICAgICBsTGVuID0gc3RybGVuKHNWYWwpOwogCi0gICAgbFN0cyA9IFJlZ1F1ZXJ5VmFsdWUoaGtleSwiIixOVUxMLCZsTGVuKTsKKyAgICBsU3RzID0gUmVnUXVlcnlWYWx1ZSgoSEtFWSkyLCIiLE5VTEwsJmxMZW4pOwogICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKIAogICAgIGxTdHMgPSBSZWdRdWVyeVZhbHVlKEhLRVlfQ1VSUkVOVF9VU0VSLCIiLE5VTEwsJmxMZW4pOwpAQCAtMzgxLDcgKzQ0NiwyMyBAQAogICovCiB2b2lkIFRlc3RRdWVyeVZhbHVlRXgoKQogeworICAgIGNoYXIgKnNWYWw7CisgICAgbG9uZyBsU3RzOworICAgIHVuc2lnbmVkIGxvbmcgbFR5cGU7CisgICAgdW5zaWduZWQgbG9uZyBsTGVuOworCiAgICAgZnByaW50ZihzdGRlcnIsICJUZXN0aW5nIFJlZ1F1ZXJ5VmFsdWVFeC4uLlxuIik7CisgICAgbExlbiA9IDgwOworICAgIHNWYWwgPSAoY2hhciAqKW1hbGxvYyhsTGVuICogc2l6ZW9mKGNoYXIpKTsKKworICAgIGxTdHMgPSBSZWdRdWVyeVZhbHVlRXgoKEhLRVkpMiwiIiwwLCZsVHlwZSxzVmFsLCZsTGVuKTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9JTlZBTElEX0hBTkRMRSkgZnByaW50ZihzdGRlcnIsICIgMTolbGRcbiIsbFN0cyk7CisKKyAgICBsU3RzID0gUmVnUXVlcnlWYWx1ZUV4KEhLRVlfQ1VSUkVOVF9VU0VSLCIiLChMUERXT1JEKTEsJmxUeXBlLHNWYWwsJmxMZW4pOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSBmcHJpbnRmKHN0ZGVyciwgIiAyOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdRdWVyeVZhbHVlRXgoSEtFWV9MT0NBTF9NQUNISU5FLCIiLDAsJmxUeXBlLHNWYWwsJmxMZW4pOworICAgIGlmIChsU3RzICE9IEVSUk9SX1NVQ0NFU1MpIGZwcmludGYoc3RkZXJyLCAiIDM6JWxkXG4iLGxTdHMpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zODksNyArNDcwLDIwIEBACiAgKi8KIHZvaWQgVGVzdFJlcGxhY2VLZXkoKQogeworICAgIGxvbmcgbFN0czsKKwogICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdSZXBsYWNlS2V5Li4uXG4iKTsKKworICAgIGxTdHMgPSBSZWdSZXBsYWNlS2V5KChIS0VZKTIsIiIsIiIsIiIpOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKKworI2lmIENIRUNLX1NBTQorICAgIGxTdHMgPSBSZWdSZXBsYWNlS2V5KEhLRVlfTE9DQUxfTUFDSElORSwiIiwiIiwiIik7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfQUNDRVNTX0RFTklFRCkgZnByaW50ZihzdGRlcnIsICIgMjolbGRcbiIsbFN0cyk7CisKKyAgICBsU3RzID0gUmVnUmVwbGFjZUtleShIS0VZX0xPQ0FMX01BQ0hJTkUsIlNvZnR3YXJlIiwiIiwiIik7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfQUNDRVNTX0RFTklFRCkgZnByaW50ZihzdGRlcnIsICIgMzolbGRcbiIsbFN0cyk7CisjZW5kaWYKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzk3LDkgKzQ5MSwxMjggQEAKICAqLwogdm9pZCBUZXN0UmVzdG9yZUtleSgpCiB7CisgICAgbG9uZyBsU3RzOwogICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdSZXN0b3JlS2V5Li4uXG4iKTsKKworICAgIGxTdHMgPSBSZWdSZXN0b3JlS2V5KChIS0VZKTIsIiIsMCk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpIGZwcmludGYoc3RkZXJyLCAiIDE6JWxkXG4iLGxTdHMpOworCisgICAgbFN0cyA9IFJlZ1Jlc3RvcmVLZXkoSEtFWV9MT0NBTF9NQUNISU5FLCIiLDApOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSBmcHJpbnRmKHN0ZGVyciwgIiAyOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdSZXN0b3JlS2V5KEhLRVlfTE9DQUxfTUFDSElORSwiYS5hIiwwKTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9GSUxFX05PVF9GT1VORCkgZnByaW50ZihzdGRlcnIsICIgMzolbGRcbiIsbFN0cyk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3RTYXZlS2V5CisgKi8KK3ZvaWQgVGVzdFNhdmVLZXkoKQoreworICAgIGxvbmcgbFN0czsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlRlc3RpbmcgUmVnU2F2ZUtleS4uLlxuIik7CisKKyAgICBsU3RzID0gUmVnU2F2ZUtleSgoSEtFWSkyLCIiLE5VTEwpOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdTYXZlS2V5KEhLRVlfTE9DQUxfTUFDSElORSwiIixOVUxMKTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUikgZnByaW50ZihzdGRlcnIsICIgMjolbGRcbiIsbFN0cyk7CisKKyNpZiBDSEVDS19TQU0KKyAgICBsU3RzID0gUmVnU2F2ZUtleShIS0VZX0xPQ0FMX01BQ0hJTkUsImEuYSIsTlVMTCk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfUFJJVklMRUdFX05PVF9IRUxEKSBmcHJpbnRmKHN0ZGVyciwgIiAzOiVsZFxuIixsU3RzKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUZXN0U2V0S2V5U2VjdXJpdHkKKyAqLwordm9pZCBUZXN0U2V0S2V5U2VjdXJpdHkoKQoreworICAgIGxvbmcgbFN0czsKKyAgICBTRUNVUklUWV9ERVNDUklQVE9SIHNkOworICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdTZXRLZXlTZWN1cml0eS4uLlxuIik7CisKKyAgICBsU3RzID0gUmVnU2V0S2V5U2VjdXJpdHkoKEhLRVkpMiwwLE5VTEwpOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdTZXRLZXlTZWN1cml0eShIS0VZX0xPQ0FMX01BQ0hJTkUsMCxOVUxMKTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUikgZnByaW50ZihzdGRlcnIsICIgMjolbGRcbiIsbFN0cyk7CisKKyAgICBsU3RzID0gUmVnU2V0S2V5U2VjdXJpdHkoSEtFWV9MT0NBTF9NQUNISU5FLE9XTkVSX1NFQ1VSSVRZX0lORk9STUFUSU9OLE5VTEwpOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSBmcHJpbnRmKHN0ZGVyciwgIiAzOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdTZXRLZXlTZWN1cml0eShIS0VZX0xPQ0FMX01BQ0hJTkUsT1dORVJfU0VDVVJJVFlfSU5GT1JNQVRJT04sJnNkKTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUikgZnByaW50ZihzdGRlcnIsICIgNDolbGRcbiIsbFN0cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3RTZXRWYWx1ZQorICovCit2b2lkIFRlc3RTZXRWYWx1ZSgpCit7CisgICAgbG9uZyBsU3RzOworICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBSZWdTZXRWYWx1ZS4uLlxuIik7CisKKyNpZiBNQUtFX05UX0NSQVNICisgICAgbFN0cyA9IFJlZ1NldFZhbHVlKChIS0VZKTIsIiIsMCxOVUxMLDApOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKSBmcHJpbnRmKHN0ZGVyciwgIiAxOiVsZFxuIixsU3RzKTsKKyNlbmRpZgorCisjaWYgTUFLRV9OVF9DUkFTSAorICAgIGxTdHMgPSBSZWdTZXRWYWx1ZSgoSEtFWSkyLCJyZWd0ZXN0IiwwLE5VTEwsMCk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpIGZwcmludGYoc3RkZXJyLCAiIDI6JWxkXG4iLGxTdHMpOworI2VuZGlmCisKKyNpZiBNQUtFX05UX0NSQVNICisgICAgbFN0cyA9IFJlZ1NldFZhbHVlKChIS0VZKTIsInJlZ3Rlc3QiLFJFR19TWixOVUxMLDApOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiAzOiVsZFxuIixsU3RzKTsKKyNlbmRpZgorCisjaWYgTUFLRV9OVF9DUkFTSAorICAgIGxTdHMgPSBSZWdTZXRWYWx1ZShIS0VZX0xPQ0FMX01BQ0hJTkUsInJlZ3Rlc3QiLFJFR19TWixOVUxMLDApOworICAgIGlmIChsU3RzICE9IEVSUk9SX0lOVkFMSURfSEFORExFKSBmcHJpbnRmKHN0ZGVyciwgIiA0OiVsZFxuIixsU3RzKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUZXN0U2V0VmFsdWVFeAorICovCit2b2lkIFRlc3RTZXRWYWx1ZUV4KCkKK3sKKyAgICBsb25nIGxTdHM7CisgICAgZnByaW50ZihzdGRlcnIsICJUZXN0aW5nIFJlZ1NldFZhbHVlRXguLi5cbiIpOworCisgICAgbFN0cyA9IFJlZ1NldFZhbHVlRXgoKEhLRVkpMiwiIiwwLDAsTlVMTCwwKTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9JTlZBTElEX0hBTkRMRSkgZnByaW50ZihzdGRlcnIsICIgMTolbGRcbiIsbFN0cyk7CisKKyAgICBsU3RzID0gUmVnU2V0VmFsdWVFeChIS0VZX0xPQ0FMX01BQ0hJTkUsIiIsMCwwLE5VTEwsMCk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfU1VDQ0VTUykgZnByaW50ZihzdGRlcnIsICIgMjolbGRcbiIsbFN0cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3RVbkxvYWRLZXkKKyAqLwordm9pZCBUZXN0VW5Mb2FkS2V5KCkKK3sKKyAgICBsb25nIGxTdHM7CisgICAgZnByaW50ZihzdGRlcnIsICJUZXN0aW5nIFJlZ1VubG9hZEtleS4uLlxuIik7CisKKyNpZiBDSEVDS19TQU0KKyAgICBsU3RzID0gUmVnVW5Mb2FkS2V5KChIS0VZKTIsIiIpOworICAgIGlmIChsU3RzICE9IEVSUk9SX1BSSVZJTEVHRV9OT1RfSEVMRCkgZnByaW50ZihzdGRlcnIsICIgMTolbGRcbiIsbFN0cyk7CisKKyAgICBsU3RzID0gUmVnVW5Mb2FkS2V5KEhLRVlfTE9DQUxfTUFDSElORSwiIik7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfUFJJVklMRUdFX05PVF9IRUxEKSBmcHJpbnRmKHN0ZGVyciwgIiAyOiVsZFxuIixsU3RzKTsKKworICAgIGxTdHMgPSBSZWdVbkxvYWRLZXkoSEtFWV9MT0NBTF9NQUNISU5FLCJcXHJlZ3Rlc3QiKTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9QUklWSUxFR0VfTk9UX0hFTEQpIGZwcmludGYoc3RkZXJyLCAiIDM6JWxkXG4iLGxTdHMpOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRlc3RTZXF1ZW5jZTEKKyAqLwogdm9pZCBUZXN0U2VxdWVuY2UxKCkKIHsKICAgICBIS0VZIGhrZXk7CkBAIC00MDksNiArNjIyLDEzIEBACiAKICAgICBsU3RzID0gUmVnQ3JlYXRlS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCJyZWd0ZXN0IiwmaGtleSk7CiAgICAgaWYgKGxTdHMgIT0gRVJST1JfU1VDQ0VTUykgZnByaW50ZihzdGRlcnIsICIgMTolbGRcbiIsbFN0cyk7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiBoa2V5PTB4JXhcbiIsIGhrZXkpOworCisgICAgbFN0cyA9IFJlZ0RlbGV0ZUtleShIS0VZX0NVUlJFTlRfVVNFUiwgInJlZ3Rlc3QiKTsKKyAgICBpZiAobFN0cyAhPSBFUlJPUl9TVUNDRVNTKSBmcHJpbnRmKHN0ZGVyciwgIiAyOiVsZFxuIixsU3RzKTsKKyAgICBsU3RzID0gUmVnQ2xvc2VLZXkoaGtleSk7CisgICAgaWYgKGxTdHMgIT0gRVJST1JfU1VDQ0VTUykgZnByaW50ZihzdGRlcnIsICIgMzolbGRcbiIsbFN0cyk7CiB9CiAKIApAQCAtNDM2LDEzICs2NTYsMTEgQEAKICAgICBUZXN0UXVlcnlWYWx1ZUV4KCk7CiAgICAgVGVzdFJlcGxhY2VLZXkoKTsKICAgICBUZXN0UmVzdG9yZUtleSgpOwotLyoKICAgICBUZXN0U2F2ZUtleSgpOwogICAgIFRlc3RTZXRLZXlTZWN1cml0eSgpOwogICAgIFRlc3RTZXRWYWx1ZSgpOwogICAgIFRlc3RTZXRWYWx1ZUV4KCk7Ci0gICAgVGVzdFVubG9hZEtleSgpOwotKi8KKyAgICBUZXN0VW5Mb2FkS2V5KCk7CiAKICAgICAvKiBOb3cgd2UgaGF2ZSBzb21lIHNlcXVlbmNlIHRlc3RpbmcgKi8KICAgICBUZXN0U2VxdWVuY2UxKCk7CmRpZmYgLS1naXQgYS9wcm9ncmFtcy92aWV3L01ha2VmaWxlLmluIGIvcHJvZ3JhbXMvdmlldy9NYWtlZmlsZS5pbgppbmRleCBiMjIyYWVmLi5kZjg5MWFkIDEwMDY0NAotLS0gYS9wcm9ncmFtcy92aWV3L01ha2VmaWxlLmluCisrKyBiL3Byb2dyYW1zL3ZpZXcvTWFrZWZpbGUuaW4KQEAgLTIyLDYgKzIyLDIzIEBACiAKIEBNQUtFX1JVTEVTQAogCisjIFJ1bGVzIGZvciB1c2luZyBvbGQgcmVzb3VyY2UgY29tcGlsZXIKKy5yYy5jOgorCWVjaG8gIiNpbmNsdWRlIFwid2luZG93cy5oXCIiID4kKi10bXAuYworCWVjaG8gV0lORE9XU19IX0VORFNfSEVSRSA+PiQqLXRtcC5jCisJY2F0ICQ8ID4+JCotdG1wLmMKKwkkKENQUCkgJChERUZTKSAkKE9QVElPTlMpICQoRElWSU5DTCkgLURSQ19JTlZPS0VEIC1QICQqLXRtcC5jIHwgc2VkIC1lICcxLC9eV0lORE9XU19IX0VORFNfSEVSRS9kJyB8ICQoV0lORVJDKSAkKFJDRkxBR1MpIC1jIC1vICQqIC1wICQqCisJJChSTSkgJCotdG1wLmMKKy5yYy5oOgorCWVjaG8gIiNpbmNsdWRlIFwid2luZG93cy5oXCIiID4kKi10bXAuYworCWVjaG8gV0lORE9XU19IX0VORFNfSEVSRSA+PiQqLXRtcC5jCisJY2F0ICQ8ID4+JCotdG1wLmMKKwkkKENQUCkgJChERUZTKSAkKE9QVElPTlMpICQoRElWSU5DTCkgLURSQ19JTlZPS0VEIC1QICQqLXRtcC5jIHwgc2VkIC1lICcxLC9eV0lORE9XU19IX0VORFNfSEVSRS9kJyB8ICQoV0lORVJDKSAkKFJDRkxBR1MpIC1jIC1vICQqIC1wICQqCisJJChSTSkgJCotdG1wLmMKK2NsZWFuOjoKKwkkKFJNKSAkKFJDX1NSQ1M6LnJjPS5jKQorCisKIHZpZXc6ICQoT0JKUykKIAkkKENDKSAtbyB2aWV3ICQoT0JKUykgJChMRE9QVElPTlMpICQoQUxMX0xJQlMpCiAKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3dpbmhlbHAvTWFrZWZpbGUuaW4gYi9wcm9ncmFtcy93aW5oZWxwL01ha2VmaWxlLmluCmluZGV4IGZhOTA2MjguLjJiNzEyNDljIDEwMDY0NAotLS0gYS9wcm9ncmFtcy93aW5oZWxwL01ha2VmaWxlLmluCisrKyBiL3Byb2dyYW1zL3dpbmhlbHAvTWFrZWZpbGUuaW4KQEAgLTM0LDYgKzM0LDIyIEBACiAKIEBNQUtFX1JVTEVTQAogCisjIFJ1bGVzIGZvciB1c2luZyBvbGQgcmVzb3VyY2UgY29tcGlsZXIKKy5yYy5jOgorCWVjaG8gIiNpbmNsdWRlIFwid2luZG93cy5oXCIiID4kKi10bXAuYworCWVjaG8gV0lORE9XU19IX0VORFNfSEVSRSA+PiQqLXRtcC5jCisJY2F0ICQ8ID4+JCotdG1wLmMKKwkkKENQUCkgJChERUZTKSAkKE9QVElPTlMpICQoRElWSU5DTCkgLURSQ19JTlZPS0VEIC1QICQqLXRtcC5jIHwgc2VkIC1lICcxLC9eV0lORE9XU19IX0VORFNfSEVSRS9kJyB8ICQoV0lORVJDKSAkKFJDRkxBR1MpIC1jIC1vICQqIC1wICQqCisJJChSTSkgJCotdG1wLmMKKy5yYy5oOgorCWVjaG8gIiNpbmNsdWRlIFwid2luZG93cy5oXCIiID4kKi10bXAuYworCWVjaG8gV0lORE9XU19IX0VORFNfSEVSRSA+PiQqLXRtcC5jCisJY2F0ICQ8ID4+JCotdG1wLmMKKwkkKENQUCkgJChERUZTKSAkKE9QVElPTlMpICQoRElWSU5DTCkgLURSQ19JTlZPS0VEIC1QICQqLXRtcC5jIHwgc2VkIC1lICcxLC9eV0lORE9XU19IX0VORFNfSEVSRS9kJyB8ICQoV0lORVJDKSAkKFJDRkxBR1MpIC1jIC1vICQqIC1wICQqCisJJChSTSkgJCotdG1wLmMKK2NsZWFuOjoKKwkkKFJNKSAkKFJDX1NSQ1M6LnJjPS5jKQorCiAjIFNvbWUgc3RyaW5ncyBuZWVkIGFkZHJlc3NlcyA+PSAweDEwMDAwCiB3aW5oZWxwOiAkKE1PU1RPQkpTKSAkKFNUUklOR09CSlMpCiAJJChDQykgLW8gd2luaGVscCAkKE1PU1RPQkpTKSAkKExET1BUSU9OUykgJChBTExfTElCUykgJChTVFJJTkdPQkpTKQpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9hZHZhcGkzMi5zcGVjIGIvcmVsYXkzMi9hZHZhcGkzMi5zcGVjCmluZGV4IGNhZGQzYWEuLmIzZmNjMGQgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvYWR2YXBpMzIuc3BlYworKysgYi9yZWxheTMyL2FkdmFwaTMyLnNwZWMKQEAgLTc4LDcgKzc4LDcgQEAKIDAwNzQgc3RkY2FsbCBJbml0aWFsaXplU2lkKHB0ciBwdHIgbG9uZykgSW5pdGlhbGl6ZVNpZAogMDA3NSBzdHViIEluaXRpYXRlU3lzdGVtU2h1dGRvd25BCiAwMDc2IHN0dWIgSW5pdGlhdGVTeXN0ZW1TaHV0ZG93blcKLTAwNzcgc3R1YiBJc1RleHRVbmljb2RlCiswMDc3IHN0ZGNhbGwgSXNUZXh0VW5pY29kZShwdHIgbG9uZyBwdHIpIFJ0bElzVGV4dFVuaWNvZGUKIDAwNzggc3R1YiBJc1ZhbGlkQWNsCiAwMDc5IHN0dWIgSXNWYWxpZFNlY3VyaXR5RGVzY3JpcHRvcgogMDA4MCBzdGRjYWxsIElzVmFsaWRTaWQocHRyKSBJc1ZhbGlkU2lkCkBAIC0xNjIsMTkgKzE2MiwxOSBAQAogMDE1OCBzdGRjYWxsIFJlZ1F1ZXJ5VmFsdWVFeFcobG9uZyB3c3RyIHB0ciBwdHIgcHRyIHB0cikgUmVnUXVlcnlWYWx1ZUV4MzJXCiAwMTU5IHN0ZGNhbGwgUmVnUXVlcnlWYWx1ZVcobG9uZyB3c3RyIHB0ciBwdHIpIFJlZ1F1ZXJ5VmFsdWUzMlcKIDAxNjAgc3R1YiBSZWdSZW1hcFByZURlZktleQotMDE2MSBzdHViIFJlZ1JlcGxhY2VLZXlBCi0wMTYyIHN0dWIgUmVnUmVwbGFjZUtleVcKLTAxNjMgc3R1YiBSZWdSZXN0b3JlS2V5QQotMDE2NCBzdHViIFJlZ1Jlc3RvcmVLZXlXCi0wMTY1IHN0dWIgUmVnU2F2ZUtleUEKLTAxNjYgc3R1YiBSZWdTYXZlS2V5VwotMDE2NyBzdHViIFJlZ1NldEtleVNlY3VyaXR5CiswMTYxIHN0ZGNhbGwgUmVnUmVwbGFjZUtleUEobG9uZyBzdHIgc3RyIHN0cikgUmVnUmVwbGFjZUtleTMyQQorMDE2MiBzdGRjYWxsIFJlZ1JlcGxhY2VLZXlXKGxvbmcgd3N0ciB3c3RyIHdzdHIpIFJlZ1JlcGxhY2VLZXkzMlcKKzAxNjMgc3RkY2FsbCBSZWdSZXN0b3JlS2V5QShsb25nIHN0ciBsb25nKSBSZWdSZXN0b3JlS2V5MzJBCiswMTY0IHN0ZGNhbGwgUmVnUmVzdG9yZUtleVcobG9uZyB3c3RyIGxvbmcpIFJlZ1Jlc3RvcmVLZXkzMlcKKzAxNjUgc3RkY2FsbCBSZWdTYXZlS2V5QShsb25nIHB0ciBwdHIpIFJlZ1NhdmVLZXkzMkEKKzAxNjYgc3RkY2FsbCBSZWdTYXZlS2V5Vyhsb25nIHB0ciBwdHIpIFJlZ1NhdmVLZXkzMlcKKzAxNjcgc3RkY2FsbCBSZWdTZXRLZXlTZWN1cml0eShsb25nIGxvbmcgcHRyKSBSZWdTZXRLZXlTZWN1cml0eQogMDE2OCBzdGRjYWxsIFJlZ1NldFZhbHVlQShsb25nIHN0ciBsb25nIHB0ciBsb25nKSBSZWdTZXRWYWx1ZTMyQQogMDE2OSBzdGRjYWxsIFJlZ1NldFZhbHVlRXhBKGxvbmcgc3RyIGxvbmcgbG9uZyBwdHIgbG9uZykgUmVnU2V0VmFsdWVFeDMyQQogMDE3MCBzdGRjYWxsIFJlZ1NldFZhbHVlRXhXKGxvbmcgd3N0ciBsb25nIGxvbmcgcHRyIGxvbmcpIFJlZ1NldFZhbHVlRXgzMlcKIDAxNzEgc3RkY2FsbCBSZWdTZXRWYWx1ZVcobG9uZyB3c3RyIGxvbmcgcHRyIGxvbmcpIFJlZ1NldFZhbHVlMzJXCi0wMTcyIHN0dWIgUmVnVW5Mb2FkS2V5QQotMDE3MyBzdHViIFJlZ1VuTG9hZEtleVcKKzAxNzIgc3RkY2FsbCBSZWdVbkxvYWRLZXlBKGxvbmcgc3RyKSBSZWdVbkxvYWRLZXkzMkEKKzAxNzMgc3RkY2FsbCBSZWdVbkxvYWRLZXlXKGxvbmcgd3N0cikgUmVnVW5Mb2FkS2V5MzJXCiAwMTc0IHN0ZGNhbGwgUmVnaXN0ZXJFdmVudFNvdXJjZUEocHRyIHB0cikgUmVnaXN0ZXJFdmVudFNvdXJjZTMyQQogMDE3NSBzdGRjYWxsIFJlZ2lzdGVyRXZlbnRTb3VyY2VXKHB0ciBwdHIpIFJlZ2lzdGVyRXZlbnRTb3VyY2UzMlcKIDAxNzYgc3R1YiBSZWdpc3RlclNlcnZpY2VDdHJsSGFuZGxlckEKZGlmZiAtLWdpdCBhL3JlbGF5MzIvYnVpbHRpbjMyLmMgYi9yZWxheTMyL2J1aWx0aW4zMi5jCmluZGV4IGVlMTdhNjkuLjNlMjM4Y2EgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvYnVpbHRpbjMyLmMKKysrIGIvcmVsYXkzMi9idWlsdGluMzIuYwpAQCAtNSw3ICs1LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJidWlsdGluMzIuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKQEAgLTI0LDE3ICsyMyw3IEBACiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgQllURSAgcHVzaGw7ICAgICAgICAgICAgICAgICAgIC8qIDB4NjggcHVzaGwgJGZ1bmNfdG9fY2FsbCAqLwotICAgIERXT1JEIGZ1bmMgV0lORV9QQUNLRUQ7ICAgICAgICAvKiBmdW5jIHRvIGNhbGwgKi8KLSAgICBCWVRFICBqbXA7ICAgICAgICAgICAgICAgICAgICAgLyogMHhlOSBqbXAgQ0FMTDMyX1JlZ3MgKHJlbGF0aXZlKSAqLwotICAgIERXT1JEIGNhbGwzMl9yZWdzIFdJTkVfUEFDS0VEOyAvKiBDQUxMMzJfUmVncyByZWxhdGl2ZSBhZGRyICovCi0gICAgV09SRCAgbm9wOyAgICAgICAgICAgICAgICAgICAgIC8qIDB4OTA5MCBub3A7bm9wICovCi19IFJFR19FTlRSWV9QT0lOVDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKICAgICBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiAqZGVzY3I7ICAgICAvKiBETEwgZGVzY3JpcHRvciAqLwotICAgIERFQlVHX0VOVFJZX1BPSU5UICAgICAgICAgICpkYmdfZnVuY3M7IC8qIFJlbGF5IGRlYnVnZ2luZyBmdW5jdGlvbnMgdGFibGUqLwogICAgIEJPT0wzMiAgICAgICAgICAgICAgICAgICAgICB1c2VkOyAgICAgIC8qIFVzZWQgYnkgZGVmYXVsdCAqLwogfSBCVUlMVElOMzJfRExMOwogCkBAIC03MiwzOCArNjEsMzggQEAKIAogc3RhdGljIEJVSUxUSU4zMl9ETEwgQnVpbHRpbkRMTHNbXSA9CiB7Ci0gICAgeyAmQURWQVBJMzJfRGVzY3JpcHRvciwgTlVMTCwgVFJVRSAgfSwKLSAgICB7ICZDT01DVEwzMl9EZXNjcmlwdG9yLCBOVUxMLCBGQUxTRSB9LAotICAgIHsgJkNPTURMRzMyX0Rlc2NyaXB0b3IsIE5VTEwsIFRSVUUgIH0sCi0gICAgeyAmQ1JURExMX0Rlc2NyaXB0b3IsICAgTlVMTCwgVFJVRSAgfSwKLSAgICB7ICZEQ0lNQU4zMl9EZXNjcmlwdG9yLCBOVUxMLCBGQUxTRSB9LAotICAgIHsgJkREUkFXX0Rlc2NyaXB0b3IsICAgIE5VTEwsIFRSVUUgIH0sCi0gICAgeyAmRElOUFVUX0Rlc2NyaXB0b3IsICAgTlVMTCwgVFJVRSAgfSwKLSAgICB7ICZEUExBWV9EZXNjcmlwdG9yLCAgICBOVUxMLCBUUlVFICB9LAotICAgIHsgJkRQTEFZWF9EZXNjcmlwdG9yLCAgIE5VTEwsIFRSVUUgIH0sCi0gICAgeyAmRFNPVU5EX0Rlc2NyaXB0b3IsICAgTlVMTCwgVFJVRSAgfSwKLSAgICB7ICZHREkzMl9EZXNjcmlwdG9yLCAgICBOVUxMLCBUUlVFICB9LAotICAgIHsgJktFUk5FTDMyX0Rlc2NyaXB0b3IsIE5VTEwsIFRSVUUgIH0sCi0gICAgeyAmTFozMl9EZXNjcmlwdG9yLCAgICAgTlVMTCwgVFJVRSAgfSwKLSAgICB7ICZNUFJfRGVzY3JpcHRvciwgICAgICBOVUxMLCBUUlVFICB9LAotICAgIHsgJk1TVkZXMzJfRGVzY3JpcHRvciwgIE5VTEwsIEZBTFNFIH0sCi0gICAgeyAmTlRETExfRGVzY3JpcHRvciwgICAgTlVMTCwgVFJVRSAgfSwKLSAgICB7ICZPTEUzMl9EZXNjcmlwdG9yLCAgICBOVUxMLCBGQUxTRSB9LAotICAgIHsgJk9MRUFVVDMyX0Rlc2NyaXB0b3IsIE5VTEwsIEZBTFNFIH0sCi0gICAgeyAmT0xFQ0xJMzJfRGVzY3JpcHRvciwgTlVMTCwgRkFMU0UgfSwKLSAgICB7ICZPTEVTVlIzMl9EZXNjcmlwdG9yLCBOVUxMLCBGQUxTRSB9LAotICAgIHsgJlNIRUxMMzJfRGVzY3JpcHRvciwgIE5VTEwsIFRSVUUgIH0sCi0gICAgeyAmVEFQSTMyX0Rlc2NyaXB0b3IsICAgTlVMTCwgRkFMU0UgfSwKLSAgICB7ICZVU0VSMzJfRGVzY3JpcHRvciwgICBOVUxMLCBUUlVFICB9LAotICAgIHsgJlZFUlNJT05fRGVzY3JpcHRvciwgIE5VTEwsIFRSVUUgIH0sCi0gICAgeyAmVzMyU0tSTkxfRGVzY3JpcHRvciwgTlVMTCwgVFJVRSAgfSwKLSAgICB7ICZXSU5NTV9EZXNjcmlwdG9yLCAgICBOVUxMLCBUUlVFICB9LAotICAgIHsgJldJTlNQT09MX0Rlc2NyaXB0b3IsIE5VTEwsIFRSVUUgIH0sCi0gICAgeyAmV05BU1BJMzJfRGVzY3JpcHRvciwgTlVMTCwgVFJVRSAgfSwKLSAgICB7ICZXT1czMl9EZXNjcmlwdG9yLCAgICBOVUxMLCBUUlVFICB9LAotICAgIHsgJldTT0NLMzJfRGVzY3JpcHRvciwgIE5VTEwsIFRSVUUgIH0sCisgICAgeyAmQURWQVBJMzJfRGVzY3JpcHRvciwgVFJVRSAgfSwKKyAgICB7ICZDT01DVEwzMl9EZXNjcmlwdG9yLCBGQUxTRSB9LAorICAgIHsgJkNPTURMRzMyX0Rlc2NyaXB0b3IsIFRSVUUgIH0sCisgICAgeyAmQ1JURExMX0Rlc2NyaXB0b3IsICAgVFJVRSAgfSwKKyAgICB7ICZEQ0lNQU4zMl9EZXNjcmlwdG9yLCBGQUxTRSB9LAorICAgIHsgJkREUkFXX0Rlc2NyaXB0b3IsICAgIFRSVUUgIH0sCisgICAgeyAmRElOUFVUX0Rlc2NyaXB0b3IsICAgVFJVRSAgfSwKKyAgICB7ICZEUExBWV9EZXNjcmlwdG9yLCAgICBUUlVFICB9LAorICAgIHsgJkRQTEFZWF9EZXNjcmlwdG9yLCAgIFRSVUUgIH0sCisgICAgeyAmRFNPVU5EX0Rlc2NyaXB0b3IsICAgVFJVRSAgfSwKKyAgICB7ICZHREkzMl9EZXNjcmlwdG9yLCAgICBUUlVFICB9LAorICAgIHsgJktFUk5FTDMyX0Rlc2NyaXB0b3IsIFRSVUUgIH0sCisgICAgeyAmTFozMl9EZXNjcmlwdG9yLCAgICAgVFJVRSAgfSwKKyAgICB7ICZNUFJfRGVzY3JpcHRvciwgICAgICBUUlVFICB9LAorICAgIHsgJk1TVkZXMzJfRGVzY3JpcHRvciwgIEZBTFNFIH0sCisgICAgeyAmTlRETExfRGVzY3JpcHRvciwgICAgVFJVRSAgfSwKKyAgICB7ICZPTEUzMl9EZXNjcmlwdG9yLCAgICBGQUxTRSB9LAorICAgIHsgJk9MRUFVVDMyX0Rlc2NyaXB0b3IsIEZBTFNFIH0sCisgICAgeyAmT0xFQ0xJMzJfRGVzY3JpcHRvciwgRkFMU0UgfSwKKyAgICB7ICZPTEVTVlIzMl9EZXNjcmlwdG9yLCBGQUxTRSB9LAorICAgIHsgJlNIRUxMMzJfRGVzY3JpcHRvciwgIFRSVUUgIH0sCisgICAgeyAmVEFQSTMyX0Rlc2NyaXB0b3IsICAgRkFMU0UgfSwKKyAgICB7ICZVU0VSMzJfRGVzY3JpcHRvciwgICBUUlVFICB9LAorICAgIHsgJlZFUlNJT05fRGVzY3JpcHRvciwgIFRSVUUgIH0sCisgICAgeyAmVzMyU0tSTkxfRGVzY3JpcHRvciwgVFJVRSAgfSwKKyAgICB7ICZXSU5NTV9EZXNjcmlwdG9yLCAgICBUUlVFICB9LAorICAgIHsgJldJTlNQT09MX0Rlc2NyaXB0b3IsIFRSVUUgIH0sCisgICAgeyAmV05BU1BJMzJfRGVzY3JpcHRvciwgVFJVRSAgfSwKKyAgICB7ICZXT1czMl9EZXNjcmlwdG9yLCAgICBUUlVFICB9LAorICAgIHsgJldTT0NLMzJfRGVzY3JpcHRvciwgIFRSVUUgIH0sCiAgICAgLyogTGFzdCBlbnRyeSAqLwotICAgIHsgTlVMTCwgTlVMTCwgRkFMU0UgfQorICAgIHsgTlVMTCwgRkFMU0UgfQogfTsKIAogCkBAIC0xMTUsNyArMTA0LDYgQEAKIHN0YXRpYyBITU9EVUxFMzIgQlVJTFRJTjMyX0RvTG9hZE1vZHVsZSggQlVJTFRJTjMyX0RMTCAqZGxsLCBQREIzMiAqcGRiICkKIHsKICAgICBleHRlcm4gdm9pZCBSRUxBWV9DYWxsRnJvbTMyKCk7Ci0gICAgZXh0ZXJuIHZvaWQgQ0FMTDMyX1JlZ3MoKTsKIAogICAgIEhNT0RVTEUxNiBoTW9kdWxlOwogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKQEAgLTEyOCw3ICsxMTYsNiBAQAogICAgIExQVk9JRCAqZnVuY3M7CiAgICAgTFBTVFIgKm5hbWVzOwogICAgIERFQlVHX0VOVFJZX1BPSU5UICpkZWJ1ZzsKLSAgICBSRUdfRU5UUllfUE9JTlQgKnJlZ3M7CiAgICAgV0lORV9NT0RSRUYgKndtOwogICAgIFBFX01PRFJFRiAqcGVtOwogICAgIElOVDMyIGksIHNpemU7CkBAIC0xNDEsOCArMTI4LDcgQEAKICAgICAgICAgICAgICsgMiAqIHNpemVvZihJTUFHRV9TRUNUSU9OX0hFQURFUikKICAgICAgICAgICAgICsgc2l6ZW9mKElNQUdFX0VYUE9SVF9ESVJFQ1RPUlkpCiAgICAgICAgICAgICArIGRsbC0+ZGVzY3ItPm5iX2Z1bmNzICogc2l6ZW9mKExQVk9JRCkKLSAgICAgICAgICAgICsgZGxsLT5kZXNjci0+bmJfbmFtZXMgKiBzaXplb2YoTFBTVFIpCi0gICAgICAgICAgICArIGRsbC0+ZGVzY3ItPm5iX3JlZ19mdW5jcyAqIHNpemVvZihSRUdfRU5UUllfUE9JTlQpKTsKKyAgICAgICAgICAgICsgZGxsLT5kZXNjci0+bmJfbmFtZXMgKiBzaXplb2YoTFBTVFIpKTsKICNpZmRlZiBfX2kzODZfXwogICAgIGlmIChUUkFDRV9PTihyZWxheSkpCiAgICAgICAgIHNpemUgKz0gZGxsLT5kZXNjci0+bmJfZnVuY3MgKiBzaXplb2YoREVCVUdfRU5UUllfUE9JTlQpOwpAQCAtMTU1LDggKzE0MSw3IEBACiAgICAgZXhwICAgPSAoSU1BR0VfRVhQT1JUX0RJUkVDVE9SWSAqKShzZWMgKyAyKTsKICAgICBmdW5jcyA9IChMUFZPSUQgKikoZXhwICsgMSk7CiAgICAgbmFtZXMgPSAoTFBTVFIgKikoZnVuY3MgKyBkbGwtPmRlc2NyLT5uYl9mdW5jcyk7Ci0gICAgcmVncyAgPSAoUkVHX0VOVFJZX1BPSU5UICopKG5hbWVzICsgZGxsLT5kZXNjci0+bmJfbmFtZXMpOwotICAgIGRlYnVnID0gKERFQlVHX0VOVFJZX1BPSU5UICopKHJlZ3MgKyBkbGwtPmRlc2NyLT5uYl9yZWdfZnVuY3MpOworICAgIGRlYnVnID0gKERFQlVHX0VOVFJZX1BPSU5UICopKG5hbWVzICsgZGxsLT5kZXNjci0+bmJfbmFtZXMpOwogCiAgICAgLyogQnVpbGQgdGhlIERPUyBhbmQgTlQgaGVhZGVycyAqLwogCkBAIC0yMDcsMTQgKzE5MiwxNCBAQAogCiAgICAgc2VjKys7CiAgICAgc3RyY3B5KCBzZWMtPk5hbWUsICIuY29kZSIgKTsKLSAgICBzZWMtPlNpemVPZlJhd0RhdGEgPSBkbGwtPmRlc2NyLT5uYl9yZWdfZnVuY3MgKiBzaXplb2YoUkVHX0VOVFJZX1BPSU5UKTsKKyAgICBzZWMtPlNpemVPZlJhd0RhdGEgPSAwOwogI2lmZGVmIF9faTM4Nl9fCiAgICAgaWYgKFRSQUNFX09OKHJlbGF5KSkKICAgICAgICAgc2VjLT5TaXplT2ZSYXdEYXRhICs9IGRsbC0+ZGVzY3ItPm5iX2Z1bmNzICogc2l6ZW9mKERFQlVHX0VOVFJZX1BPSU5UKTsKICNlbmRpZgogICAgIHNlYy0+TWlzYy5WaXJ0dWFsU2l6ZSA9IHNlYy0+U2l6ZU9mUmF3RGF0YTsKLSAgICBzZWMtPlZpcnR1YWxBZGRyZXNzICAgPSAoQllURSAqKXJlZ3MgLSBhZGRyOwotICAgIHNlYy0+UG9pbnRlclRvUmF3RGF0YSA9IChCWVRFICopcmVncyAtIGFkZHI7CisgICAgc2VjLT5WaXJ0dWFsQWRkcmVzcyAgID0gKEJZVEUgKilkZWJ1ZyAtIGFkZHI7CisgICAgc2VjLT5Qb2ludGVyVG9SYXdEYXRhID0gKEJZVEUgKilkZWJ1ZyAtIGFkZHI7CiAgICAgc2VjLT5DaGFyYWN0ZXJpc3RpY3MgID0gKElNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQUdFX1NDTl9NRU1fRVhFQ1VURSB8IElNQUdFX1NDTl9NRU1fUkVBRCk7CiAKQEAgLTIzMCw1MCArMjE1LDM0IEBACiAKICAgICAvKiBCdWlsZCB0aGUgZnVuY3MgdGFibGUgKi8KIAotICAgIGlmIChUUkFDRV9PTihyZWxheSkpIGRsbC0+ZGJnX2Z1bmNzID0gZGVidWc7CiAgICAgZm9yIChpID0gMDsgaSA8IGRsbC0+ZGVzY3ItPm5iX2Z1bmNzOyBpKyssIGZ1bmNzKyssIGRlYnVnKyspCiAgICAgewogICAgICAgICBCWVRFIGFyZ3MgPSBkbGwtPmRlc2NyLT5hcmdzW2ldOwogICAgICAgICBpZiAoIWRsbC0+ZGVzY3ItPmZ1bmN0aW9uc1tpXSkgY29udGludWU7CisgICAgICAgICpmdW5jcyA9IChMUFZPSUQpKChCWVRFICopZGxsLT5kZXNjci0+ZnVuY3Rpb25zW2ldIC0gYWRkcik7CiAjaWZkZWYgX19pMzg2X18KKyAgICAgICAgaWYgKCFUUkFDRV9PTihyZWxheSkpIGNvbnRpbnVlOwogICAgICAgICBzd2l0Y2goYXJncykKICAgICAgICAgewogICAgICAgICBjYXNlIDB4ZmU6ICAvKiByZWdpc3RlciBmdW5jICovCi0gICAgICAgICAgICByZWdzLT5wdXNobCAgICAgICA9IDB4Njg7Ci0gICAgICAgICAgICByZWdzLT5mdW5jICAgICAgICA9IChEV09SRClkbGwtPmRlc2NyLT5mdW5jdGlvbnNbaV07Ci0gICAgICAgICAgICByZWdzLT5qbXAgICAgICAgICA9IDB4ZTk7Ci0gICAgICAgICAgICByZWdzLT5jYWxsMzJfcmVncyA9IChEV09SRClDQUxMMzJfUmVncyAtIChEV09SRCkmcmVncy0+bm9wOwotICAgICAgICAgICAgcmVncy0+bm9wICAgICAgICAgPSAweDkwOTA7Ci0gICAgICAgICAgICBpZiAoVFJBQ0VfT04ocmVsYXkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlYnVnLT5jYWxsICAgICAgID0gMHhlODsKLSAgICAgICAgICAgICAgICBkZWJ1Zy0+Y2FsbGZyb20zMiA9IChEV09SRClyZWdzIC0gKERXT1JEKSZkZWJ1Zy0+cmV0OwotICAgICAgICAgICAgICAgIGRlYnVnLT5yZXQgICAgICAgID0gMHg5MDsgIC8qIG5vcCAqLwotICAgICAgICAgICAgICAgIGRlYnVnLT5hcmdzICAgICAgID0gMDsKLSAgICAgICAgICAgICAgICAqZnVuY3MgPSAoTFBWT0lEKSgoQllURSAqKWRlYnVnIC0gYWRkcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlICpmdW5jcyA9IChMUFZPSUQpKChCWVRFICopcmVncyAtIGFkZHIpOwotICAgICAgICAgICAgcmVncysrOworICAgICAgICAgICAgZGVidWctPmNhbGwgICAgICAgPSAweGU4OworICAgICAgICAgICAgZGVidWctPmNhbGxmcm9tMzIgPSAoRFdPUkQpZGxsLT5kZXNjci0+ZnVuY3Rpb25zW2ldIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKSZkZWJ1Zy0+cmV0OworICAgICAgICAgICAgZGVidWctPnJldCAgICAgICAgPSAweDkwOyAgLyogbm9wICovCisgICAgICAgICAgICBkZWJ1Zy0+YXJncyAgICAgICA9IDA7CisgICAgICAgICAgICAqZnVuY3MgPSAoTFBWT0lEKSgoQllURSAqKWRlYnVnIC0gYWRkcik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAweGZmOiAgLyogc3R1YiBvciBleHRlcm4gKi8KLSAgICAgICAgICAgICpmdW5jcyA9IChMUFZPSUQpKChCWVRFICopZGxsLT5kZXNjci0+ZnVuY3Rpb25zW2ldIC0gYWRkcik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDogIC8qIG5vcm1hbCBmdW5jdGlvbiAoc3RkY2FsbCBvciBjZGVjbCkgKi8KLSAgICAgICAgICAgIGlmIChUUkFDRV9PTihyZWxheSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGVidWctPmNhbGwgICAgICAgPSAweGU4OwotICAgICAgICAgICAgICAgIGRlYnVnLT5jYWxsZnJvbTMyID0gKERXT1JEKVJFTEFZX0NhbGxGcm9tMzIgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKSZkZWJ1Zy0+cmV0OwotICAgICAgICAgICAgICAgIGRlYnVnLT5yZXQgICAgICAgID0gKGFyZ3MgJiAweDgwKSA/IDB4YzMgOiAweGMyOyAvKnJldC9yZXQgJG4qLwotICAgICAgICAgICAgICAgIGRlYnVnLT5hcmdzICAgICAgID0gKGFyZ3MgJiAweDdmKSAqIHNpemVvZihpbnQpOwotICAgICAgICAgICAgICAgICpmdW5jcyA9IChMUFZPSUQpKChCWVRFICopZGVidWcgLSBhZGRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAqZnVuY3MgPSAoTFBWT0lEKSgoQllURSAqKWRsbC0+ZGVzY3ItPmZ1bmN0aW9uc1tpXSAtIGFkZHIpOworICAgICAgICAgICAgZGVidWctPmNhbGwgICAgICAgPSAweGU4OworICAgICAgICAgICAgZGVidWctPmNhbGxmcm9tMzIgPSAoRFdPUkQpUkVMQVlfQ2FsbEZyb20zMiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRCkmZGVidWctPnJldDsKKyAgICAgICAgICAgIGRlYnVnLT5yZXQgICAgICAgID0gKGFyZ3MgJiAweDgwKSA/IDB4YzMgOiAweGMyOyAvKnJldC9yZXQgJG4qLworICAgICAgICAgICAgZGVidWctPmFyZ3MgICAgICAgPSAoYXJncyAmIDB4N2YpICogc2l6ZW9mKGludCk7CisgICAgICAgICAgICAqZnVuY3MgPSAoTFBWT0lEKSgoQllURSAqKWRlYnVnIC0gYWRkcik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotI2Vsc2UgIC8qIF9faTM4Nl9fICovCi0gICAgICAgICpmdW5jcyA9IChMUFZPSUQpKChCWVRFICopZGxsLT5kZXNjci0+ZnVuY3Rpb25zW2ldIC0gYWRkcik7CiAjZW5kaWYgIC8qIF9faTM4Nl9fICovCiAgICAgfQogCkBAIC0zNDksMTkgKzMxOCwzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnR5cGVtYXNrICkKIHsKICAgICBCVUlMVElOMzJfRExMICpkbGw7Ci0gICAgaW50IG9yZGluYWwsIGk7CisgICAgSE1PRFVMRTMyIGhNb2R1bGU7CisgICAgaW50IG9yZGluYWwgPSAwLCBpOwogCiAgICAgLyogRmlyc3QgZmluZCB0aGUgbW9kdWxlICovCiAKICAgICBmb3IgKGRsbCA9IEJ1aWx0aW5ETExzOyBkbGwtPmRlc2NyOyBkbGwrKykKLSAgICAgICAgaWYgKCgodm9pZCAqKWRsbC0+ZGJnX2Z1bmNzIDw9IHJlbGF5KSAmJgotICAgICAgICAgICAgKCh2b2lkICopKGRsbC0+ZGJnX2Z1bmNzICsgZGxsLT5kZXNjci0+bmJfZnVuY3MpID4gcmVsYXkpKQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChkbGwtPnVzZWQgCisgICAgICAgICAgICAmJiAoKGhNb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUzMkEoZGxsLT5kZXNjci0+bmFtZSkpICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICBJTUFHRV9TRUNUSU9OX0hFQURFUiAqc2VjID0gUEVfU0VDVElPTlMoaE1vZHVsZSk7CisgICAgICAgICAgICBERUJVR19FTlRSWV9QT0lOVCAqZGVidWcgPSAKKyAgICAgICAgICAgICAgICAgKERFQlVHX0VOVFJZX1BPSU5UICopKChEV09SRCloTW9kdWxlICsgc2VjWzFdLlZpcnR1YWxBZGRyZXNzKTsKKyAgICAgICAgICAgIERFQlVHX0VOVFJZX1BPSU5UICpmdW5jID0gKERFQlVHX0VOVFJZX1BPSU5UICopcmVsYXk7CisKKyAgICAgICAgICAgIGlmIChkZWJ1ZyA8PSBmdW5jICYmIGZ1bmMgPCBkZWJ1ZyArIGRsbC0+ZGVzY3ItPm5iX2Z1bmNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9yZGluYWwgPSBmdW5jIC0gZGVidWc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAKICAgICBhc3NlcnQoZGxsLT5kZXNjcik7CiAKICAgICAvKiBOb3cgZmluZCB0aGUgZnVuY3Rpb24gKi8KIAotICAgIG9yZGluYWwgPSAoKERXT1JEKXJlbGF5LShEV09SRClkbGwtPmRiZ19mdW5jcykgLyBzaXplb2YoREVCVUdfRU5UUllfUE9JTlQpOwogICAgIGZvciAoaSA9IDA7IGkgPCBkbGwtPmRlc2NyLT5uYl9uYW1lczsgaSsrKQogICAgICAgICBpZiAoZGxsLT5kZXNjci0+b3JkaW5hbHNbaV0gPT0gb3JkaW5hbCkgYnJlYWs7CiAgICAgYXNzZXJ0KCBpIDwgZGxsLT5kZXNjci0+bmJfbmFtZXMgKTsKQEAgLTM5MCwxMiArMzcxLDEyIEBACiAgICAgICAgIGlmIChkZXNjci0+b3JkaW5hbHNbaV0gKyBkZXNjci0+YmFzZSA9PSBvcmRpbmFsKSBicmVhazsKICAgICBpZiAoaSA8IGRlc2NyLT5uYl9uYW1lcykgZnVuY19uYW1lID0gZGVzY3ItPm5hbWVzW2ldOwogCi0gICAgZnByaW50Ziggc3RkZXJyLCAiTm8gaGFuZGxlciBmb3IgV2luMzIgcm91dGluZSAlcy4lZDogJXMiLAorICAgIE1TRyggIk5vIGhhbmRsZXIgZm9yIFdpbjMyIHJvdXRpbmUgJXMuJWQ6ICVzIiwKICAgICAgICAgICAgICBkZXNjci0+bmFtZSwgb3JkaW5hbCwgZnVuY19uYW1lICk7CiAjaWZkZWYgX19HTlVDX18KLSAgICBmcHJpbnRmKCBzdGRlcnIsICIgKGNhbGxlZCBmcm9tICVwKSIsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygxKSApOworICAgIE1TRyggIiAoY2FsbGVkIGZyb20gJXApIiwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDEpICk7CiAjZW5kaWYKLSAgICBmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKKyAgICBNU0coICJcbiIgKTsKICAgICBUQVNLX0tpbGxDdXJyZW50VGFzaygxKTsKIH0KIApAQCAtNDMyLDkgKzQxMyw5IEBACiAgICAgaW50IGk7CiAgICAgQlVJTFRJTjMyX0RMTCAqZGxsOwogCi0gICAgZnByaW50ZihzdGRlcnIsIkF2YWlsYWJsZSBXaW4zMiBETExzOlxuIik7CisgICAgTVNHKCJBdmFpbGFibGUgV2luMzIgRExMczpcbiIpOwogICAgIGZvciAoaSA9IDAsIGRsbCA9IEJ1aWx0aW5ETExzOyBkbGwtPmRlc2NyOyBkbGwrKykKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJS05cyVjIiwgZGxsLT5kZXNjci0+bmFtZSwKKyAgICAgICAgTVNHKCIlLTlzJWMiLCBkbGwtPmRlc2NyLT5uYW1lLAogICAgICAgICAgICAgICAgICAoKCsraSkgJSA4KSA/ICcgJyA6ICdcbicgKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKyAgICBNU0coIlxuIik7CiB9CmRpZmYgLS1naXQgYS9yZWxheTMyL2NvbWN0bDMyLnNwZWMgYi9yZWxheTMyL2NvbWN0bDMyLnNwZWMKaW5kZXggZjQ0NDhjMy4uYTQ5M2RjZiAxMDA2NDQKLS0tIGEvcmVsYXkzMi9jb21jdGwzMi5zcGVjCisrKyBiL3JlbGF5MzIvY29tY3RsMzIuc3BlYwpAQCAtMTEsOCArMTEsOCBAQAogICA0IHN0dWIgR2V0RWZmZWN0aXZlQ2xpZW50UmVjdAogICA1IHN0ZGNhbGwgRHJhd1N0YXR1c1RleHRBKGxvbmcgcHRyIHB0ciBsb25nKSBEcmF3U3RhdHVzVGV4dDMyQQogICA2IHN0ZGNhbGwgQ3JlYXRlU3RhdHVzV2luZG93QShsb25nIHB0ciBsb25nIGxvbmcpIENyZWF0ZVN0YXR1c1dpbmRvdzMyQQotICA3IHN0dWIgQ3JlYXRlVG9vbGJhcgotICA4IHN0dWIgQ3JlYXRlTWFwcGVkQml0bWFwCisgIDcgc3RkY2FsbCBDcmVhdGVUb29sYmFyKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIHB0ciBsb25nKSBDcmVhdGVUb29sYmFyCisgIDggc3RkY2FsbCBDcmVhdGVNYXBwZWRCaXRtYXAobG9uZyBsb25nIGxvbmcgcHRyIGxvbmcpIENyZWF0ZU1hcHBlZEJpdG1hcAogICA5IHN0dWIgQ09NQ1RMMzJfOQogIDEwIHN0dWIgQ09NQ1RMMzJfMTAKICAxMSBzdHViIENPTUNUTDMyXzExCkBAIC0yNSwxNSArMjUsMTMgQEAKICAxOCBzdHViIENyZWF0ZVByb3BlcnR5U2hlZXRQYWdlCiAgMTkgc3R1YiBDcmVhdGVQcm9wZXJ0eVNoZWV0UGFnZUEKICAyMCBzdHViIENyZWF0ZVByb3BlcnR5U2hlZXRQYWdlVwotIyAyMSBwYXNjYWwxNiBDcmVhdGVTdGF0dXNXaW5kb3cod29yZCBwdHIgd29yZCB3b3JkKSBDcmVhdGVTdGF0dXNXaW5kb3cxNgotIDIxIHN0dWIgQ3JlYXRlU3RhdHVzV2luZG93CisgMjEgc3RkY2FsbCBDcmVhdGVTdGF0dXNXaW5kb3cobG9uZyBwdHIgbG9uZyBsb25nKSBDcmVhdGVTdGF0dXNXaW5kb3czMkEKICAyMiBzdGRjYWxsIENyZWF0ZVN0YXR1c1dpbmRvd1cobG9uZyBwdHIgbG9uZyBsb25nKSBDcmVhdGVTdGF0dXNXaW5kb3czMlcKLSAyMyBzdHViIENyZWF0ZVRvb2xiYXJFeAorIDIzIHN0ZGNhbGwgQ3JlYXRlVG9vbGJhckV4KGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIHB0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgQ3JlYXRlVG9vbGJhckV4CiAgMjQgc3R1YiBEZXN0cm95UHJvcGVydHlTaGVldFBhZ2UKICAyNSBzdHViIERsbEdldFZlcnNpb24KICAyNiBzdHViIERsbEluc3RhbGwKLSMgMjcgcGFzY2FsMTYgRHJhd1N0YXR1c1RleHQod29yZCBwdHIgcHRyIHdvcmQpIERyYXdTdGF0dXNUZXh0MTYKLSAyNyBzdHViIERyYXdTdGF0dXNUZXh0CisgMjcgc3RkY2FsbCBEcmF3U3RhdHVzVGV4dChsb25nIHB0ciBwdHIgbG9uZykgRHJhd1N0YXR1c1RleHQzMkEKICAyOCBzdGRjYWxsIERyYXdTdGF0dXNUZXh0Vyhsb25nIHB0ciBwdHIgbG9uZykgRHJhd1N0YXR1c1RleHQzMlcKICAyOSBzdHViIEZsYXRTQl9FbmFibGVTY3JvbGxCYXIKICAzMCBzdHViIEZsYXRTQl9HZXRTY3JvbGxJbmZvCkBAIC00Niw3ICs0NCw3IEBACiAgMzcgc3R1YiBGbGF0U0JfU2V0U2Nyb2xsUmFuZ2UKICAzOCBzdHViIEZsYXRTQl9TaG93U2Nyb2xsQmFyCiAgMzkgc3RkY2FsbCBJbWFnZUxpc3RfQWRkKHB0ciBsb25nIGxvbmcpIEltYWdlTGlzdF9BZGQKLSA0MCBzdHViIEltYWdlTGlzdF9BZGRJY29uCisgNDAgc3RkY2FsbCBJbWFnZUxpc3RfQWRkSWNvbihwdHIgbG9uZykgSW1hZ2VMaXN0X0FkZEljb24KICA0MSBzdGRjYWxsIEltYWdlTGlzdF9BZGRNYXNrZWQocHRyIGxvbmcgbG9uZykgSW1hZ2VMaXN0X0FkZE1hc2tlZAogIDQyIHN0ZGNhbGwgSW1hZ2VMaXN0X0JlZ2luRHJhZyhwdHIgbG9uZyBsb25nIGxvbmcpIEltYWdlTGlzdF9CZWdpbkRyYWcKICA0MyBzdGRjYWxsIEltYWdlTGlzdF9Db3B5KHB0ciBsb25nIHB0ciBsb25nIGxvbmcpIEltYWdlTGlzdF9Db3B5CkBAIC02OCwxMSArNjYsMTEgQEAKICA1OSBzdGRjYWxsIEltYWdlTGlzdF9HZXRJbWFnZUNvdW50KHB0cikgSW1hZ2VMaXN0X0dldEltYWdlQ291bnQKICA2MCBzdGRjYWxsIEltYWdlTGlzdF9HZXRJbWFnZUluZm8ocHRyIGxvbmcgcHRyKSBJbWFnZUxpc3RfR2V0SW1hZ2VJbmZvCiAgNjEgc3RkY2FsbCBJbWFnZUxpc3RfR2V0SW1hZ2VSZWN0KHB0ciBsb25nIHB0cikgSW1hZ2VMaXN0X0dldEltYWdlUmVjdAotIDYyIHN0dWIgSW1hZ2VMaXN0X0xvYWRJbWFnZQorIDYzIHN0ZGNhbGwgSW1hZ2VMaXN0X0xvYWRJbWFnZShsb25nIHB0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIEltYWdlTGlzdF9Mb2FkSW1hZ2UzMkEKICA2MyBzdGRjYWxsIEltYWdlTGlzdF9Mb2FkSW1hZ2VBKGxvbmcgcHRyIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X0xvYWRJbWFnZTMyQQogIDY0IHN0ZGNhbGwgSW1hZ2VMaXN0X0xvYWRJbWFnZVcobG9uZyBwdHIgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBJbWFnZUxpc3RfTG9hZEltYWdlMzJXCiAgNjUgc3RkY2FsbCBJbWFnZUxpc3RfTWVyZ2UocHRyIGxvbmcgcHRyIGxvbmcgbG9uZyBsb25nKSBJbWFnZUxpc3RfTWVyZ2UKLSA2NiBzdHViIEltYWdlTGlzdF9SZWFkCisgNjYgc3RkY2FsbCBJbWFnZUxpc3RfUmVhZChwdHIpIEltYWdlTGlzdF9SZWFkCiAgNjcgc3RkY2FsbCBJbWFnZUxpc3RfUmVtb3ZlKHB0ciBsb25nKSBJbWFnZUxpc3RfUmVtb3ZlCiAgNjggc3RkY2FsbCBJbWFnZUxpc3RfUmVwbGFjZShwdHIgbG9uZyBsb25nIGxvbmcpIEltYWdlTGlzdF9SZXBsYWNlCiAgNjkgc3RkY2FsbCBJbWFnZUxpc3RfUmVwbGFjZUljb24ocHRyIGxvbmcgbG9uZykgSW1hZ2VMaXN0X1JlcGxhY2VJY29uCkBAIC04Niw3ICs4NCw3IEBACiAgNzcgc3RkY2FsbCBJbWFnZUxpc3RfU2V0SWNvblNpemUocHRyIGxvbmcgbG9uZykgSW1hZ2VMaXN0X1NldEljb25TaXplCiAgNzggc3RkY2FsbCBJbWFnZUxpc3RfU2V0SW1hZ2VDb3VudChwdHIgbG9uZykgSW1hZ2VMaXN0X1NldEltYWdlQ291bnQKICA3OSBzdGRjYWxsIEltYWdlTGlzdF9TZXRPdmVybGF5SW1hZ2UocHRyIGxvbmcgbG9uZykgSW1hZ2VMaXN0X1NldE92ZXJsYXlJbWFnZQotIDgwIHN0dWIgSW1hZ2VMaXN0X1dyaXRlCisgODAgc3RkY2FsbCBJbWFnZUxpc3RfV3JpdGUocHRyIHB0cikgSW1hZ2VMaXN0X1dyaXRlCiAgODEgc3RkY2FsbCBJbml0Q29tbW9uQ29udHJvbHNFeChwdHIpIEluaXRDb21tb25Db250cm9sc0V4CiAgODIgc3R1YiBJbml0aWFsaXplRmxhdFNCCiAgODMgc3R1YiBQcm9wZXJ0eVNoZWV0CkBAIC0xMjIsNiArMTIwLDcgQEAKIDMyNSBzdHViIERTQV9TZXRJdGVtCiAzMjYgc3R1YiBEU0FfRGVsZXRlSXRlbQogMzI3IHN0dWIgRFNBX0RlbGV0ZUFsbEl0ZW1zCisKIDMyOCBzdHViIERQQV9DcmVhdGUKIDMyOSBzdHViIERQQV9EZXN0cm95CiAzMzAgc3R1YiBEUEFfR3JvdwpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9jcnRkbGwuc3BlYyBiL3JlbGF5MzIvY3J0ZGxsLnNwZWMKaW5kZXggODRkNjAyNS4uNTI1OWU1MyAxMDA2NDQKLS0tIGEvcmVsYXkzMi9jcnRkbGwuc3BlYworKysgYi9yZWxheTMyL2NydGRsbC5zcGVjCkBAIC0xMzAsNyArMTMwLDcgQEAKIDEyNiBzdHViIF9nZXRwaWQKIDEyNyBzdHViIF9nZXRzeXN0aW1lCiAxMjggc3R1YiBfZ2V0dwotMTI5IHJlZ2lzdGVyIF9nbG9iYWxfdW53aW5kMigpIENSVERMTF9fZ2xvYmFsX3Vud2luZDIKKzEyOSBjZGVjbCBfZ2xvYmFsX3Vud2luZDIocHRyKSBDUlRETExfX2dsb2JhbF91bndpbmQyCiAxMzAgc3R1YiBfaGVhcGNoawogMTMxIHN0dWIgX2hlYXBtaW4KIDEzMiBzdHViIF9oZWFwc2V0CkBAIC0xNzQsNyArMTc0LDcgQEAKIDE3MCBzdHViIF9rYmhpdAogMTcxIHN0dWIgX2xmaW5kCiAxNzIgc3R1YiBfbG9hZGRsbAotMTczIHJlZ2lzdGVyIF9sb2NhbF91bndpbmQyKCkgQ1JURExMX19sb2NhbF91bndpbmQyCisxNzMgY2RlY2wgX2xvY2FsX3Vud2luZDIocHRyIGxvbmcpIENSVERMTF9fbG9jYWxfdW53aW5kMgogMTc0IHN0dWIgX2xvY2tpbmcKIDE3NSBzdHViIF9sb2diCiAxNzYgY2RlY2wgX2xyb3RsIChsb25nIGxvbmcpIENSVERMTF9fbHJvdGwKQEAgLTQ5NCw4ICs0OTQsOCBAQAogNDkwIGNkZWNsIHRtcG5hbShzdHIpIENSVERMTF90bXBuYW0KIDQ5MSBjZGVjbCB0b2xvd2VyKGxvbmcpIHRvbG93ZXIKIDQ5MiBjZGVjbCB0b3VwcGVyKGxvbmcpIHRvdXBwZXIKLTQ5MyBzdHViIHRvd2xvd2VyCi00OTQgY2RlY2wgdG93dXBwZXIobG9uZykgQ1JURExMX3Rvd3VwcGVyCis0OTMgY2RlY2wgdG93bG93ZXIobG9uZykgdG93bG93ZXIKKzQ5NCBjZGVjbCB0b3d1cHBlcihsb25nKSB0b3d1cHBlcgogNDk1IHN0dWIgdW5nZXRjCiA0OTYgc3R1YiB1bmdldHdjCiA0OTcgY2RlY2wgdmZwcmludGYocHRyIHN0ciBwdHIpIENSVERMTF92ZnByaW50ZgpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9kcGxheXguc3BlYyBiL3JlbGF5MzIvZHBsYXl4LnNwZWMKaW5kZXggN2E3Y2Q3NS4uY2ZmY2U4MCAxMDA2NDQKLS0tIGEvcmVsYXkzMi9kcGxheXguc3BlYworKysgYi9yZWxheTMyL2RwbGF5eC5zcGVjCkBAIC00LDYgKzQsNiBAQAogICAxIHN0dWIgRGlyZWN0UGxheUNyZWF0ZQogICAyIHN0dWIgRGlyZWN0UGxheUVudW1lcmF0ZUEKICAgMyBzdHViIERpcmVjdFBsYXlFbnVtZXJhdGVXCi0gIDQgc3R1YiBEaXJlY3RQbGF5TG9iYnlDcmVhdGVBCi0gIDUgc3R1YiBEaXJlY3RQbGF5TG9iYnlDcmVhdGVXCisgIDQgc3RkY2FsbCBEaXJlY3RQbGF5TG9iYnlDcmVhdGVBKHB0ciBwdHIgcHRyIHB0ciBsb25nKSBEaXJlY3RQbGF5TG9iYnlDcmVhdGVBCisgIDUgc3RkY2FsbCBEaXJlY3RQbGF5TG9iYnlDcmVhdGVXKHB0ciBwdHIgcHRyIHB0ciBsb25nKSBEaXJlY3RQbGF5TG9iYnlDcmVhdGVXCiAgIDkgc3R1YiBEaXJlY3RQbGF5RW51bWVyYXRlCmRpZmYgLS1naXQgYS9yZWxheTMyL2tlcm5lbDMyLnNwZWMgYi9yZWxheTMyL2tlcm5lbDMyLnNwZWMKaW5kZXggNWVjMjFmMy4uNDJlMGFmNyAxMDA2NDQKLS0tIGEvcmVsYXkzMi9rZXJuZWwzMi5zcGVjCisrKyBiL3JlbGF5MzIva2VybmVsMzIuc3BlYwpAQCAtMTIsMTUgKzEyLDE1IEBACiAjIC0gY29kZSBnZW5lcmF0ZWQgYnkgdGhlIE1TIFRodW5rIENvbXBpbGVyCiAjIC0gc3ltYm9scyBleHBvcnRlZCBieSB0aGUgT2N0IDk0IGJldGEgdmVyc2lvbiBvZiBrZXJuZWwzMi5kbGwKIAotICAxIHN0dWIgVnhEQ2FsbDAKLSAgMiBzdHViIFZ4RENhbGwxCi0gIDMgc3R1YiBWeERDYWxsMgotICA0IHN0dWIgVnhEQ2FsbDMKLSAgNSBzdHViIFZ4RENhbGw0Ci0gIDYgc3R1YiBWeERDYWxsNQotICA3IHN0dWIgVnhEQ2FsbDYKLSAgOCBzdHViIFZ4RENhbGw3Ci0gIDkgc3R1YiBWeERDYWxsOAorICAxIHN0ZGNhbGwgVnhEQ2FsbDAobG9uZykgVnhEQ2FsbAorICAyIHN0ZGNhbGwgVnhEQ2FsbDEobG9uZykgVnhEQ2FsbAorICAzIHN0ZGNhbGwgVnhEQ2FsbDIobG9uZykgVnhEQ2FsbAorICA0IHN0ZGNhbGwgVnhEQ2FsbDMobG9uZykgVnhEQ2FsbAorICA1IHN0ZGNhbGwgVnhEQ2FsbDQobG9uZykgVnhEQ2FsbAorICA2IHN0ZGNhbGwgVnhEQ2FsbDUobG9uZykgVnhEQ2FsbAorICA3IHN0ZGNhbGwgVnhEQ2FsbDYobG9uZykgVnhEQ2FsbAorICA4IHN0ZGNhbGwgVnhEQ2FsbDcobG9uZykgVnhEQ2FsbAorICA5IHN0ZGNhbGwgVnhEQ2FsbDgobG9uZykgVnhEQ2FsbAogIDEwIHN0ZGNhbGwgazMyQ2hhclRvT2VtQShzdHIgc3RyKSBDaGFyVG9PZW0zMkEKICAxMSBzdGRjYWxsIGszMkNoYXJUb09lbUJ1ZmZBKHN0ciBzdHIgbG9uZykgQ2hhclRvT2VtQnVmZjMyQQogIDEyIHN0ZGNhbGwgazMyT2VtVG9DaGFyQShwdHIgcHRyKSBPZW1Ub0NoYXIzMkEKQEAgLTU5LDggKzU5LDggQEAKICA0NSByZWdpc3RlciBDb21tb24zMlRoa0xTKCkgQ29tbW9uMzJUaGtMUyAKICA0NiBzdGRjYWxsIFRodW5rSW5pdFNMKGxvbmcgc3RyIGxvbmcgc3RyIHN0cikgVGh1bmtJbml0U0wKICA0NyBzdHViIExvZ0NCVGhrU0wKLSA0OCBzdHViIFJlbGVhc2VUaHVua0xvY2sKLSA0OSBzdHViIFJlc3RvcmVUaHVua0xvY2sKKyA0OCBzdGRjYWxsIFJlbGVhc2VUaHVua0xvY2socHRyKSBSZWxlYXNlVGh1bmtMb2NrCisgNDkgc3RkY2FsbCBSZXN0b3JlVGh1bmtMb2NrKGxvbmcpIFJlc3RvcmVUaHVua0xvY2sKICA1MCBzdGRjYWxsIEFkZEF0b21BKHN0cikgQWRkQXRvbTMyQQogIDUxIHN0dWIgVzMyU19CYWNrVG8zMgogIDUyIHN0ZGNhbGwgR2V0VGh1bmtCdWZmKCkgR2V0VGh1bmtCdWZmCkBAIC0xMDcsOSArMTA3LDkgQEAKICA5MyBzdGRjYWxsIEdldHBXaW4xNkxvY2socHRyKSBHZXRwV2luMTZMb2NrCiAgOTQgc3R1YiBfQ2hlY2tOb3RTeXNMZXZlbAogIDk1IHN0dWIgX0NvbmZpcm1TeXNMZXZlbAotIDk2IHN0dWIgX0NvbmZpcm1XaW4xNkxvY2sKLSA5NyBzdHViIF9FbnRlclN5c0xldmVsCi0gOTggc3R1YiBfTGVhdmVTeXNMZXZlbAorIDk2IHN0ZGNhbGwgX0NvbmZpcm1XaW4xNkxvY2soKSBfQ29uZmlybVdpbjE2TG9jaworIDk3IHN0ZGNhbGwgX0VudGVyU3lzTGV2ZWwocHRyKSBfRW50ZXJTeXNMZXZlbAorIDk4IHN0ZGNhbGwgX0xlYXZlU3lzTGV2ZWwocHRyKSBfTGVhdmVTeXNMZXZlbAogIDk5IHN0ZGNhbGwgX0tFUk5FTDMyXzk5KGxvbmcpIF9LRVJORUwzMl85OQogMTAwIHN0ZGNhbGwgX0tFUk5FTDMyXzEwMChsb25nIGxvbmcgbG9uZykgX0tFUk5FTDMyXzEwMAogMTAxIHN0dWIgX0tFUk5FTDMyXzEwMQpAQCAtMTkzLDcgKzE5Myw5IEBACiAxNzggc3RkY2FsbCBDcmVhdGVUaHJlYWQocHRyIGxvbmcgcHRyIGxvbmcgbG9uZyBwdHIpIENyZWF0ZVRocmVhZAogMTc5IHN0dWIgQ3JlYXRlVG9vbGhlbHAzMlNuYXBzaG90CiAxODAgc3R1YiBEZWJ1Z0FjdGl2ZVByb2Nlc3MKLTE4MSByZWdpc3RlciBEZWJ1Z0JyZWFrKCkgRGVidWdCcmVhaworIyBGSVhNRQorIzE4MSByZWdpc3RlciBEZWJ1Z0JyZWFrKCkgRGVidWdCcmVhaworMTgxIHN0dWIgRGVidWdCcmVhawogMTgyIHN0dWIgRGVmaW5lRG9zRGV2aWNlQQogMTgzIHN0dWIgRGVmaW5lRG9zRGV2aWNlVwogMTg0IHN0ZGNhbGwgRGVsZXRlQXRvbShsb25nKSBEZWxldGVBdG9tMzIKQEAgLTI1OCw3ICsyNjAsNyBAQAogMjQzIHN0ZGNhbGwgRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXJXKGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyKSBGaWxsQ29uc29sZU91dHB1dENoYXJhY3RlclcKIDI0NCBzdGRjYWxsIEZpbmRBdG9tQShzdHIpIEZpbmRBdG9tMzJBCiAyNDUgc3RkY2FsbCBGaW5kQXRvbVcod3N0cikgRmluZEF0b20zMlcKLTI0NyBzdHViIEZpbmRDbG9zZUNoYW5nZU5vdGlmaWNhdGlvbgorMjQ3IHN0ZGNhbGwgRmluZENsb3NlQ2hhbmdlTm90aWZpY2F0aW9uKGxvbmcpIEZpbmRDbG9zZUNoYW5nZU5vdGlmaWNhdGlvbgogMjQ2IHN0ZGNhbGwgRmluZENsb3NlKGxvbmcpIEZpbmRDbG9zZTMyCiAyNDggc3RkY2FsbCBGaW5kRmlyc3RDaGFuZ2VOb3RpZmljYXRpb25BKHN0ciBsb25nIGxvbmcpIEZpbmRGaXJzdENoYW5nZU5vdGlmaWNhdGlvbjMyQQogMjQ5IHN0dWIgRmluZEZpcnN0Q2hhbmdlTm90aWZpY2F0aW9uVwpAQCAtNTc5LDEzICs1ODEsMTMgQEAKIDU2NCBzdGRjYWxsIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKHB0cikgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIKIDU2NSBzdGRjYWxsIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3kocHRyKSBRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5CiA1NjYgc3R1YiBRdWV1ZVVzZXJBUEMKLTU2NyByZWdpc3RlciBSYWlzZUV4Y2VwdGlvbigpIEVYQ19SYWlzZUV4Y2VwdGlvbgorNTY3IHJlZ2lzdGVyIFJhaXNlRXhjZXB0aW9uKCkgUmFpc2VFeGNlcHRpb24KIDU2OCBzdGRjYWxsIFJlYWRDb25zb2xlQShsb25nIHB0ciBsb25nIHB0ciBwdHIpIFJlYWRDb25zb2xlMzJBCiA1Njkgc3RkY2FsbCBSZWFkQ29uc29sZUlucHV0QShsb25nIHB0ciBsb25nIHB0cikgUmVhZENvbnNvbGVJbnB1dEEKIDU3MCBzdHViIFJlYWRDb25zb2xlSW5wdXRXCiA1NzEgc3R1YiBSZWFkQ29uc29sZU91dHB1dEEKIDU3MiBzdHViIFJlYWRDb25zb2xlT3V0cHV0QXR0cmlidXRlCi01NzMgc3R1YiBSZWFkQ29uc29sZU91dHB1dENoYXJhY3RlckEKKzU3MyBzdGRjYWxsIFJlYWRDb25zb2xlT3V0cHV0Q2hhcmFjdGVyQShsb25nIHB0ciBsb25nIGxvbmcgcHRyKSBSZWFkQ29uc29sZU91dHB1dENoYXJhY3RlcjMyQQogNTc0IHN0dWIgUmVhZENvbnNvbGVPdXRwdXRDaGFyYWN0ZXJXCiA1NzUgc3R1YiBSZWFkQ29uc29sZU91dHB1dFcKIDU3NiBzdGRjYWxsIFJlYWRDb25zb2xlVyhsb25nIHB0ciBsb25nIHB0ciBwdHIpIFJlYWRDb25zb2xlMzJXCkBAIC02MDIsNyArNjA0LDcgQEAKIDU4NyBzdGRjYWxsIFJlc3VtZVRocmVhZChsb25nKSBSZXN1bWVUaHJlYWQKIDU4OCBzdGRjYWxsIFJ0bEZpbGxNZW1vcnkocHRyIGxvbmcgbG9uZykgUnRsRmlsbE1lbW9yeQogNTg5IHN0ZGNhbGwgUnRsTW92ZU1lbW9yeShwdHIgcHRyIGxvbmcpIFJ0bE1vdmVNZW1vcnkKLTU5MCByZWdpc3RlciBSdGxVbndpbmQoKSBFWENfUnRsVW53aW5kCis1OTAgcmVnaXN0ZXIgUnRsVW53aW5kKCkgUnRsVW53aW5kCiA1OTEgc3RkY2FsbCBSdGxaZXJvTWVtb3J5KHB0ciBsb25nKSBSdGxaZXJvTWVtb3J5CiA1OTIgcmVnaXN0ZXIgU01hcExTKCkgU01hcExTCiA1OTMgcmVnaXN0ZXIgU01hcExTX0lQX0VCUF8xMigpIFNNYXBMU19JUF9FQlBfMTIKQEAgLTg4Niw4ICs4ODgsOCBAQAogODcwIHN0dWIgR2V0Q29uc29sZUtleWJvYXJkTGF5b3V0TmFtZVcKIDg3MSBzdGRjYWxsIEdldERpc2tGcmVlU3BhY2VFeEEgKHN0ciBwdHIgcHRyIHB0cikgR2V0RGlza0ZyZWVTcGFjZUV4MzJBCiA4NzMgc3RkY2FsbCBHZXREaXNrRnJlZVNwYWNlRXhXICh3c3RyIHB0ciBwdHIgcHRyKSBHZXREaXNrRnJlZVNwYWNlRXgzMlcKLTg3NCBzdHViIEdldEZpbGVBdHRyaWJ1dGVzRXhBCi04NzUgc3R1YiBHZXRGaWxlQXR0cmlidXRlc0V4VworODc0IHN0ZGNhbGwgR2V0RmlsZUF0dHJpYnV0ZXNFeEEoc3RyIGxvbmcgcHRyKSBHZXRGaWxlQXR0cmlidXRlc0V4MzJBCis4NzUgc3RkY2FsbCBHZXRGaWxlQXR0cmlidXRlc0V4Vyh3c3RyIGxvbmcgcHRyKSBHZXRGaWxlQXR0cmlidXRlc0V4MzJXCiA4NzYgc3R1YiBHZXRQcm9jZXNzUHJpb3JpdHlCb29zdAogODc3IHN0dWIgR2V0VGhyZWFkUHJpb3JpdHlCb29zdAogODc4IHN0dWIgSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UKZGlmZiAtLWdpdCBhL3JlbGF5MzIvbXByLnNwZWMgYi9yZWxheTMyL21wci5zcGVjCmluZGV4IGNlOGU4MjEuLmFhMjUxNmEgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvbXByLnNwZWMKKysrIGIvcmVsYXkzMi9tcHIuc3BlYwpAQCAtMSw5MCArMSwxMTMgQEAKIG5hbWUgbXByCiB0eXBlIHdpbjMyCiAKLTAwMDkgc3R1YiBEbGxDYW5VbmxvYWROb3cKLTAwMTAgc3R1YiBEbGxHZXRDbGFzc09iamVjdAotMDAyNSBzdGRjYWxsIE11bHRpbmV0R2V0Q29ubmVjdGlvblBlcmZvcm1hbmNlQShwdHIgcHRyKSBNdWx0aW5ldEdldENvbm5lY3Rpb25QZXJmb3JtYW5jZTMyQQotMDAyNiBzdHViIE11bHRpbmV0R2V0Q29ubmVjdGlvblBlcmZvcm1hbmNlVwotMDAyNyBzdHViIE11bHRpbmV0R2V0RXJyb3JUZXh0QQotMDAyOCBzdHViIE11bHRpbmV0R2V0RXJyb3JUZXh0VwotMDAyOSBzdHViIE5QU0F1dGhlbnRpY2F0aW9uRGlhbG9nQQotMDAzMCBzdHViIE5QU0NvcHlTdHJpbmdBCi0wMDMxIHN0dWIgTlBTRGV2aWNlR2V0TnVtYmVyQQotMDAzMiBzdHViIE5QU0RldmljZUdldFN0cmluZ0EKLTAwMzMgc3R1YiBOUFNHZXRQcm92aWRlckhhbmRsZUEKLTAwMzQgc3R1YiBOUFNHZXRQcm92aWRlck5hbWVBCi0wMDM1IHN0dWIgTlBTR2V0U2VjdGlvbk5hbWVBCi0wMDM2IHN0dWIgTlBTTm90aWZ5R2V0Q29udGV4dEEKLTAwMzcgc3R1YiBOUFNOb3RpZnlSZWdpc3RlckEKLTAwMzggc3R1YiBOUFNTZXRDdXN0b21UZXh0QQotMDAzOSBzdHViIE5QU1NldEV4dGVuZGVkRXJyb3JBCi0wMDQwIHN0dWIgUHdkQ2hhbmdlUGFzc3dvcmRBCi0wMDQxIHN0dWIgUHdkQ2hhbmdlUGFzc3dvcmRXCi0wMDQyIHN0dWIgUHdkR2V0UGFzc3dvcmRTdGF0dXNBCi0wMDQzIHN0dWIgUHdkR2V0UGFzc3dvcmRTdGF0dXNXCi0wMDQ0IHN0dWIgUHdkU2V0UGFzc3dvcmRTdGF0dXNBCi0wMDQ1IHN0dWIgUHdkU2V0UGFzc3dvcmRTdGF0dXNXCi0wMDQ2IHN0ZGNhbGwgV05ldEFkZENvbm5lY3Rpb24yQShwdHIgc3RyIHN0ciBsb25nKSBXTmV0QWRkQ29ubmVjdGlvbjJfMzJBCi0wMDQ3IHN0ZGNhbGwgV05ldEFkZENvbm5lY3Rpb24yVyhwdHIgd3N0ciB3c3RyIGxvbmcpIFdOZXRBZGRDb25uZWN0aW9uMl8zMlcKLTAwNDggc3RkY2FsbCBXTmV0QWRkQ29ubmVjdGlvbjNBKGxvbmcgcHRyIHN0ciBzdHIgbG9uZykgV05ldEFkZENvbm5lY3Rpb24zXzMyQQotMDA0OSBzdGRjYWxsIFdOZXRBZGRDb25uZWN0aW9uM1cobG9uZyBwdHIgd3N0ciB3c3RyIGxvbmcpIFdOZXRBZGRDb25uZWN0aW9uM18zMlcKLTAwNTAgc3RkY2FsbCBXTmV0QWRkQ29ubmVjdGlvbkEoc3RyIHN0ciBzdHIpIFdOZXRBZGRDb25uZWN0aW9uMzJBCi0wMDUxIHN0ZGNhbGwgV05ldEFkZENvbm5lY3Rpb25XKHdzdHIgd3N0ciB3c3RyKSBXTmV0QWRkQ29ubmVjdGlvbjMyVwotMDA1MiBzdGRjYWxsIFdOZXRDYWNoZVBhc3N3b3JkKHN0ciBsb25nIHN0ciBsb25nIGxvbmcpIFdOZXRDYWNoZVBhc3N3b3JkCi0wMDUzIHN0dWIgV05ldENhbmNlbENvbm5lY3Rpb24yQQotMDA1NCBzdHViIFdOZXRDYW5jZWxDb25uZWN0aW9uMlcKLTAwNTUgc3R1YiBXTmV0Q2FuY2VsQ29ubmVjdGlvbkEKLTAwNTYgc3R1YiBXTmV0Q2FuY2VsQ29ubmVjdGlvblcKLTAwNTcgc3R1YiBXTmV0Q2xvc2VFbnVtCi0wMDYwIHN0dWIgV05ldENvbm5lY3Rpb25EaWFsb2cKLTAwNTggc3R1YiBXTmV0Q29ubmVjdGlvbkRpYWxvZzFBCi0wMDU5IHN0dWIgV05ldENvbm5lY3Rpb25EaWFsb2cxVwotMDA2MyBzdHViIFdOZXREaXNjb25uZWN0RGlhbG9nCi0wMDYxIHN0dWIgV05ldERpc2Nvbm5lY3REaWFsb2cxQQotMDA2MiBzdHViIFdOZXREaXNjb25uZWN0RGlhbG9nMVcKLTAwNjQgc3R1YiBXTmV0RW51bUNhY2hlZFBhc3N3b3JkcwotMDA2NSBzdHViIFdOZXRFbnVtUmVzb3VyY2VBCi0wMDY2IHN0dWIgV05ldEVudW1SZXNvdXJjZVcKLTAwNjcgc3R1YiBXTmV0Rm9ybWF0TmV0d29ya05hbWVBCi0wMDY4IHN0dWIgV05ldEZvcm1hdE5ldHdvcmtOYW1lVwotMDA2OSBzdGRjYWxsIFdOZXRHZXRDYWNoZWRQYXNzd29yZChwdHIgbG9uZyBwdHIgcHRyIGxvbmcpIFdOZXRHZXRDYWNoZWRQYXNzd29yZAotMDA3MCBzdGRjYWxsIFdOZXRHZXRDb25uZWN0aW9uQShwdHIgcHRyIHB0cikgV05ldEdldENvbm5lY3Rpb24zMkEKLTAwNzEgc3R1YiBXTmV0R2V0Q29ubmVjdGlvblcKLTAwNzIgc3R1YiBXTmV0R2V0SG9tZURpcmVjdG9yeUEKLTAwNzMgc3R1YiBXTmV0R2V0SG9tZURpcmVjdG9yeVcKLTAwNzQgc3R1YiBXTmV0R2V0TGFzdEVycm9yQQotMDA3NSBzdHViIFdOZXRHZXRMYXN0RXJyb3JXCi0wMDc2IHN0dWIgV05ldEdldE5ldHdvcmtJbmZvcm1hdGlvbkEKLTAwNzcgc3R1YiBXTmV0R2V0TmV0d29ya0luZm9ybWF0aW9uVwotMDA3OCBzdHViIFdOZXRHZXRQcm92aWRlck5hbWVBCi0wMDc5IHN0dWIgV05ldEdldFByb3ZpZGVyTmFtZVcKLTAwODAgc3RkY2FsbCBXTmV0R2V0UmVzb3VyY2VJbmZvcm1hdGlvbkEocHRyIHB0ciBwdHIgcHRyKSBXTmV0R2V0UmVzb3VyY2VJbmZvcm1hdGlvbjMyQQotMDA4MSBzdHViIFdOZXRHZXRSZXNvdXJjZUluZm9ybWF0aW9uVwotMDA4MiBzdHViIFdOZXRHZXRSZXNvdXJjZVBhcmVudEEKLTAwODMgc3R1YiBXTmV0R2V0UmVzb3VyY2VQYXJlbnRXCi0wMDg0IHN0dWIgV05ldEdldFVuaXZlcnNhbE5hbWVBCi0wMDg1IHN0dWIgV05ldEdldFVuaXZlcnNhbE5hbWVXCi0wMDg2IHN0dWIgV05ldEdldFVzZXJBCi0wMDg3IHN0dWIgV05ldEdldFVzZXJXCi0wMDg4IHN0dWIgV05ldExvZ29mZkEKLTAwODkgc3R1YiBXTmV0TG9nb2ZmVwotMDA5MCBzdHViIFdOZXRMb2dvbkEKLTAwOTEgc3R1YiBXTmV0TG9nb25XCi0wMDkyIHN0ZGNhbGwgV05ldE9wZW5FbnVtQShsb25nIGxvbmcgcHRyIHB0cikgV05ldE9wZW5FbnVtMzJBCi0wMDkzIHN0dWIgV05ldE9wZW5FbnVtVwotMDA5NCBzdHViIFdOZXRSZW1vdmVDYWNoZWRQYXNzd29yZAotMDA5NSBzdHViIFdOZXRSZXN0b3JlQ29ubmVjdGlvbkEKLTAwOTYgc3R1YiBXTmV0UmVzdG9yZUNvbm5lY3Rpb25XCi0wMDk3IHN0dWIgV05ldFNldENvbm5lY3Rpb25BCi0wMDk4IHN0dWIgV05ldFNldENvbm5lY3Rpb25XCi0wMDk5IHN0dWIgV05ldFVzZUNvbm5lY3Rpb25BCi0wMTAwIHN0dWIgV05ldFVzZUNvbm5lY3Rpb25XCi0wMTAxIHN0dWIgV05ldFZlcmlmeVBhc3N3b3JkQQotMDEwMiBzdHViIFdOZXRWZXJpZnlQYXNzd29yZFcgCiswMDAxIHN0dWIgTVBSXzEKKzAwMDIgc3R1YiBNUFJfMgorMDAwMyBzdHViIE1QUl8zCiswMDA0IHN0dWIgTVBSXzQKKzAwMDUgc3R1YiBNUFJfNQorMDAwNiBzdHViIE1QUl82CiswMDA3IHN0dWIgTVBSXzcKKzAwMDggc3R1YiBNUFJfOAorMDAwOSBzdHViIE1QUl85CiswMDEwIHN0dWIgRGxsQ2FuVW5sb2FkTm93CiswMDExIHN0dWIgRGxsR2V0Q2xhc3NPYmplY3QKKzAwMTIgc3R1YiBNUFJfMTIKKzAwMTMgc3R1YiBNUFJfMTMKKzAwMTQgc3R1YiBNUFJfMTQKKzAwMTUgc3R1YiBNUFJfMTUKKzAwMTYgc3R1YiBNUFJfMTYKKzAwMTcgc3R1YiBNUFJfMTcKKzAwMTggc3R1YiBNUFJfMTgKKzAwMTkgc3R1YiBNUFJfMTkKKzAwMjAgc3R1YiBNUFJfMjAKKzAwMjEgc3R1YiBNUFJfMjEKKzAwMjIgc3RkY2FsbCBNUFJfMjIobG9uZykgX01QUl8yMgorMDAyMyBzdHViIE1QUl8yMworMDAyNCBzdHViIE1QUl8yNAorMDAyNSBzdGRjYWxsIE1QUl8yNShzdHIgbG9uZykgX01QUl8yNQorMDAyNiBzdGRjYWxsIE11bHRpbmV0R2V0Q29ubmVjdGlvblBlcmZvcm1hbmNlQShwdHIgcHRyKSBNdWx0aW5ldEdldENvbm5lY3Rpb25QZXJmb3JtYW5jZTMyQQorMDAyNyBzdHViIE11bHRpbmV0R2V0Q29ubmVjdGlvblBlcmZvcm1hbmNlVworMDAyOCBzdHViIE11bHRpbmV0R2V0RXJyb3JUZXh0QQorMDAyOSBzdHViIE11bHRpbmV0R2V0RXJyb3JUZXh0VworMDAzMCBzdHViIE5QU0F1dGhlbnRpY2F0aW9uRGlhbG9nQQorMDAzMSBzdHViIE5QU0NvcHlTdHJpbmdBCiswMDMyIHN0dWIgTlBTRGV2aWNlR2V0TnVtYmVyQQorMDAzMyBzdHViIE5QU0RldmljZUdldFN0cmluZ0EKKzAwMzQgc3R1YiBOUFNHZXRQcm92aWRlckhhbmRsZUEKKzAwMzUgc3R1YiBOUFNHZXRQcm92aWRlck5hbWVBCiswMDM2IHN0dWIgTlBTR2V0U2VjdGlvbk5hbWVBCiswMDM3IHN0dWIgTlBTTm90aWZ5R2V0Q29udGV4dEEKKzAwMzggc3R1YiBOUFNOb3RpZnlSZWdpc3RlckEKKzAwMzkgc3R1YiBOUFNTZXRDdXN0b21UZXh0QQorMDA0MCBzdHViIE5QU1NldEV4dGVuZGVkRXJyb3JBCiswMDQxIHN0dWIgUHdkQ2hhbmdlUGFzc3dvcmRBCiswMDQyIHN0dWIgUHdkQ2hhbmdlUGFzc3dvcmRXCiswMDQzIHN0dWIgUHdkR2V0UGFzc3dvcmRTdGF0dXNBCiswMDQ0IHN0dWIgUHdkR2V0UGFzc3dvcmRTdGF0dXNXCiswMDQ1IHN0dWIgUHdkU2V0UGFzc3dvcmRTdGF0dXNBCiswMDQ2IHN0dWIgUHdkU2V0UGFzc3dvcmRTdGF0dXNXCiswMDQ3IHN0ZGNhbGwgV05ldEFkZENvbm5lY3Rpb24yQShwdHIgc3RyIHN0ciBsb25nKSBXTmV0QWRkQ29ubmVjdGlvbjJfMzJBCiswMDQ4IHN0ZGNhbGwgV05ldEFkZENvbm5lY3Rpb24yVyhwdHIgd3N0ciB3c3RyIGxvbmcpIFdOZXRBZGRDb25uZWN0aW9uMl8zMlcKKzAwNDkgc3RkY2FsbCBXTmV0QWRkQ29ubmVjdGlvbjNBKGxvbmcgcHRyIHN0ciBzdHIgbG9uZykgV05ldEFkZENvbm5lY3Rpb24zXzMyQQorMDA1MCBzdGRjYWxsIFdOZXRBZGRDb25uZWN0aW9uM1cobG9uZyBwdHIgd3N0ciB3c3RyIGxvbmcpIFdOZXRBZGRDb25uZWN0aW9uM18zMlcKKzAwNTEgc3RkY2FsbCBXTmV0QWRkQ29ubmVjdGlvbkEoc3RyIHN0ciBzdHIpIFdOZXRBZGRDb25uZWN0aW9uMzJBCiswMDUyIHN0ZGNhbGwgV05ldEFkZENvbm5lY3Rpb25XKHdzdHIgd3N0ciB3c3RyKSBXTmV0QWRkQ29ubmVjdGlvbjMyVworMDA1MyBzdGRjYWxsIFdOZXRDYWNoZVBhc3N3b3JkKHN0ciBsb25nIHN0ciBsb25nIGxvbmcpIFdOZXRDYWNoZVBhc3N3b3JkCiswMDU0IHN0dWIgV05ldENhbmNlbENvbm5lY3Rpb24yQQorMDA1NSBzdHViIFdOZXRDYW5jZWxDb25uZWN0aW9uMlcKKzAwNTYgc3R1YiBXTmV0Q2FuY2VsQ29ubmVjdGlvbkEKKzAwNTcgc3R1YiBXTmV0Q2FuY2VsQ29ubmVjdGlvblcKKzAwNTggc3R1YiBXTmV0Q2xvc2VFbnVtCiswMDU5IHN0dWIgV05ldENvbm5lY3Rpb25EaWFsb2cxQQorMDA2MCBzdHViIFdOZXRDb25uZWN0aW9uRGlhbG9nMVcKKzAwNjEgc3R1YiBXTmV0Q29ubmVjdGlvbkRpYWxvZworMDA2MiBzdHViIFdOZXREaXNjb25uZWN0RGlhbG9nMUEKKzAwNjMgc3R1YiBXTmV0RGlzY29ubmVjdERpYWxvZzFXCiswMDY0IHN0dWIgV05ldERpc2Nvbm5lY3REaWFsb2cKKzAwNjUgc3R1YiBXTmV0RW51bUNhY2hlZFBhc3N3b3JkcworMDA2NiBzdHViIFdOZXRFbnVtUmVzb3VyY2VBCiswMDY3IHN0dWIgV05ldEVudW1SZXNvdXJjZVcKKzAwNjggc3R1YiBXTmV0Rm9ybWF0TmV0d29ya05hbWVBCiswMDY5IHN0dWIgV05ldEZvcm1hdE5ldHdvcmtOYW1lVworMDA3MCBzdGRjYWxsIFdOZXRHZXRDYWNoZWRQYXNzd29yZChwdHIgbG9uZyBwdHIgcHRyIGxvbmcpIFdOZXRHZXRDYWNoZWRQYXNzd29yZAorMDA3MSBzdGRjYWxsIFdOZXRHZXRDb25uZWN0aW9uQShwdHIgcHRyIHB0cikgV05ldEdldENvbm5lY3Rpb24zMkEKKzAwNzIgc3R1YiBXTmV0R2V0Q29ubmVjdGlvblcKKzAwNzMgc3R1YiBXTmV0R2V0SG9tZURpcmVjdG9yeUEKKzAwNzQgc3R1YiBXTmV0R2V0SG9tZURpcmVjdG9yeVcKKzAwNzUgc3R1YiBXTmV0R2V0TGFzdEVycm9yQQorMDA3NiBzdHViIFdOZXRHZXRMYXN0RXJyb3JXCiswMDc3IHN0dWIgV05ldEdldE5ldHdvcmtJbmZvcm1hdGlvbkEKKzAwNzggc3R1YiBXTmV0R2V0TmV0d29ya0luZm9ybWF0aW9uVworMDA3OSBzdHViIFdOZXRHZXRQcm92aWRlck5hbWVBCiswMDgwIHN0dWIgV05ldEdldFByb3ZpZGVyTmFtZVcKKzAwODEgc3RkY2FsbCBXTmV0R2V0UmVzb3VyY2VJbmZvcm1hdGlvbkEocHRyIHB0ciBwdHIgcHRyKSBXTmV0R2V0UmVzb3VyY2VJbmZvcm1hdGlvbjMyQQorMDA4MiBzdHViIFdOZXRHZXRSZXNvdXJjZUluZm9ybWF0aW9uVworMDA4MyBzdHViIFdOZXRHZXRSZXNvdXJjZVBhcmVudEEKKzAwODQgc3R1YiBXTmV0R2V0UmVzb3VyY2VQYXJlbnRXCiswMDg1IHN0dWIgV05ldEdldFVuaXZlcnNhbE5hbWVBCiswMDg2IHN0dWIgV05ldEdldFVuaXZlcnNhbE5hbWVXCiswMDg3IHN0dWIgV05ldEdldFVzZXJBCiswMDg4IHN0dWIgV05ldEdldFVzZXJXCiswMDg5IHN0dWIgV05ldExvZ29mZkEKKzAwOTAgc3R1YiBXTmV0TG9nb2ZmVworMDA5MSBzdHViIFdOZXRMb2dvbkEKKzAwOTIgc3R1YiBXTmV0TG9nb25XCiswMDkzIHN0ZGNhbGwgV05ldE9wZW5FbnVtQShsb25nIGxvbmcgbG9uZyBwdHIgcHRyKSBXTmV0T3BlbkVudW0zMkEKKzAwOTQgc3R1YiBXTmV0T3BlbkVudW1XCiswMDk1IHN0dWIgV05ldFJlbW92ZUNhY2hlZFBhc3N3b3JkCiswMDk2IHN0dWIgV05ldFJlc3RvcmVDb25uZWN0aW9uQQorMDA5NyBzdHViIFdOZXRSZXN0b3JlQ29ubmVjdGlvblcKKzAwOTggc3R1YiBXTmV0U2V0Q29ubmVjdGlvbkEKKzAwOTkgc3R1YiBXTmV0U2V0Q29ubmVjdGlvblcKKzAxMDAgc3R1YiBXTmV0VXNlQ29ubmVjdGlvbkEKKzAxMDEgc3R1YiBXTmV0VXNlQ29ubmVjdGlvblcKKzAxMDIgc3R1YiBXTmV0VmVyaWZ5UGFzc3dvcmRBCiswMTAzIHN0dWIgV05ldFZlcmlmeVBhc3N3b3JkVyAKICNhZGRpdGlvbnMKLTAxMDMgc3R1YiBXTmV0UmVzdG9yZUNvbm5lY3Rpb24KLTAxMDQgc3R1YiBXTmV0TG9nb25Ob3RpZnkKLTAxMDUgc3R1YiBXTmV0UGFzc3dvcmRDaGFuZ2VOb3RpZnkKLTAxMDYgc3R1YiBXTmV0R2V0UHJvcGVydHlUZXh0QQotMDEwNyBzdHViIFdOZXRQcm9wZXJ0eURpYWxvZ0EKLTAxMDggc3R1YiBXTmV0R2V0RGlyZWN0b3J5VHlwZUEKKzAxMDQgc3R1YiBXTmV0UmVzdG9yZUNvbm5lY3Rpb24KKzAxMDUgc3R1YiBXTmV0TG9nb25Ob3RpZnkKKzAxMDYgc3R1YiBXTmV0UGFzc3dvcmRDaGFuZ2VOb3RpZnkKKzAxMDcgc3R1YiBXTmV0R2V0UHJvcGVydHlUZXh0QQorMDEwOCBzdHViIFdOZXRQcm9wZXJ0eURpYWxvZ0EKKzAxMDkgc3R1YiBXTmV0R2V0RGlyZWN0b3J5VHlwZUEKZGlmZiAtLWdpdCBhL3JlbGF5MzIvbnRkbGwuc3BlYyBiL3JlbGF5MzIvbnRkbGwuc3BlYwppbmRleCA0ZTZiYWQ2Li5kOGFiYTNiIDEwMDY0NAotLS0gYS9yZWxheTMyL250ZGxsLnNwZWMKKysrIGIvcmVsYXkzMi9udGRsbC5zcGVjCkBAIC0xMjQsNyArMTI0LDcgQEAKIDEyMSBzdHViIE50TWFwVmlld09mU2VjdGlvbgogMTIyIHN0dWIgTnROb3RpZnlDaGFuZ2VEaXJlY3RvcnlGaWxlCiAxMjMgc3R1YiBOdE5vdGlmeUNoYW5nZUtleQotMTI0IHN0dWIgTnRPcGVuRGlyZWN0b3J5T2JqZWN0CisxMjQgc3RkY2FsbCBOdE9wZW5EaXJlY3RvcnlPYmplY3QobG9uZyBsb25nIGxvbmcpIE50T3BlbkRpcmVjdG9yeU9iamVjdAogMTI1IHN0dWIgTnRPcGVuRXZlbnQKIDEyNiBzdHViIE50T3BlbkV2ZW50UGFpcgogMTI3IHN0ZGNhbGwgTnRPcGVuRmlsZShwdHIgbG9uZyBwdHIgcHRyIGxvbmcgbG9uZykgTnRPcGVuRmlsZQpAQCAtMTQ5LDcgKzE0OSw3IEBACiAxNDYgc3R1YiBOdFF1ZXJ5QXR0cmlidXRlc0ZpbGUKIDE0NyBzdHViIE50UXVlcnlEZWZhdWx0TG9jYWxlCiAxNDggc3R1YiBOdFF1ZXJ5RGlyZWN0b3J5RmlsZQotMTQ5IHN0dWIgTnRRdWVyeURpcmVjdG9yeU9iamVjdAorMTQ5IHN0ZGNhbGwgTnRRdWVyeURpcmVjdG9yeU9iamVjdChsb25nIGxvbmcpIE50UXVlcnlEaXJlY3RvcnlPYmplY3QKIDE1MCBzdHViIE50UXVlcnlFYUZpbGUKIDE1MSBzdHViIE50UXVlcnlFdmVudAogMTUyIHN0dWIgTnRRdWVyeUluZm9ybWF0aW9uRmlsZQpAQCAtMTYxLDE0ICsxNjEsMTQgQEAKIDE1OCBzdHViIE50UXVlcnlJb0NvbXBsZXRpb24KIDE1OSBzdHViIE50UXVlcnlLZXkKIDE2MCBzdHViIE50UXVlcnlNdXRhbnQKLTE2MSBzdHViIE50UXVlcnlPYmplY3QKKzE2MSBzdGRjYWxsIE50UXVlcnlPYmplY3QobG9uZyBsb25nKSBOdFF1ZXJ5T2JqZWN0CiAxNjIgc3R1YiBOdFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyCiAxNjMgc3R1YiBOdFF1ZXJ5U2VjdGlvbgogMTY0IHN0dWIgTnRRdWVyeVNlY3VyaXR5T2JqZWN0CiAxNjUgc3R1YiBOdFF1ZXJ5U2VtYXBob3JlCiAxNjYgc3R1YiBOdFF1ZXJ5U3ltYm9saWNMaW5rT2JqZWN0CiAxNjcgc3R1YiBOdFF1ZXJ5U3lzdGVtRW52aXJvbm1lbnRWYWx1ZQotMTY4IHN0dWIgTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uCisxNjggc3RkY2FsbCBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24obG9uZykgTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uCiAxNjkgc3R1YiBOdFF1ZXJ5U3lzdGVtVGltZQogMTcwIHN0dWIgTnRRdWVyeVRpbWVyCiAxNzEgc3R1YiBOdFF1ZXJ5VGltZXJSZXNvbHV0aW9uCkBAIC0yMDcsNyArMjA3LDcgQEAKIDIwNCBzdHViIE50U2V0SW5mb3JtYXRpb25GaWxlCiAyMDUgc3R1YiBOdFNldEluZm9ybWF0aW9uS2V5CiAyMDYgc3R1YiBOdFNldEluZm9ybWF0aW9uT2JqZWN0Ci0yMDcgc3R1YiBOdFNldEluZm9ybWF0aW9uUHJvY2VzcworMjA3IHN0ZGNhbGwgTnRTZXRJbmZvcm1hdGlvblByb2Nlc3MobG9uZykgTnRTZXRJbmZvcm1hdGlvblByb2Nlc3MKIDIwOCBzdHViIE50U2V0SW5mb3JtYXRpb25UaHJlYWQKIDIwOSBzdHViIE50U2V0SW5mb3JtYXRpb25Ub2tlbgogMjEwIHN0dWIgTnRTZXRJbnRlcnZhbFByb2ZpbGUKQEAgLTM3Myw3ICszNzMsNyBAQAogMzcwIHN0ZGNhbGwgUnRsRmlyc3RGcmVlQWNlKHB0ciBwdHIpIFJ0bEZpcnN0RnJlZUFjZQogMzcxIHN0dWIgUnRsRm9ybWF0Q3VycmVudFVzZXJLZXlQYXRoCiAzNzIgc3R1YiBSdGxGb3JtYXRNZXNzYWdlCi0zNzMgc3R1YiBSdGxGcmVlQW5zaVN0cmluZworMzczIHN0ZGNhbGwgUnRsRnJlZUFuc2lTdHJpbmcobG9uZykgUnRsRnJlZUFuc2lTdHJpbmcKIDM3NCBzdGRjYWxsIFJ0bEZyZWVIZWFwKGxvbmcgbG9uZyBsb25nKSBIZWFwRnJlZQogMzc1IHN0dWIgUnRsRnJlZU9lbVN0cmluZwogMzc2IHN0dWIgUnRsRnJlZVNpZApAQCAtNDE3LDcgKzQxNyw3IEBACiA0MTQgc3R1YiBSdGxJc0Rvc0RldmljZU5hbWVfVQogNDE1IHN0dWIgUnRsSXNHZW5lcmljVGFibGVFbXB0eQogNDE2IHN0dWIgUnRsSXNOYW1lTGVnYWxET1M4RG90MwotNDE3IHN0dWIgUnRsSXNUZXh0VW5pY29kZQorNDE3IHN0ZGNhbGwgUnRsSXNUZXh0VW5pY29kZShwdHIgbG9uZyBwdHIpIFJ0bElzVGV4dFVuaWNvZGUKIDQxOCBzdHViIFJ0bExhcmdlSW50ZWdlckFkZAogNDE5IHN0dWIgUnRsTGFyZ2VJbnRlZ2VyQXJpdGhtZXRpY1NoaWZ0CiA0MjAgc3R1YiBSdGxMYXJnZUludGVnZXJEaXZpZGUKQEAgLTUwMiw3ICs1MDIsNyBAQAogNDk5IHN0dWIgUnRsU3VidHJlZVN1Y2Nlc3NvcgogNTAwIHN0dWIgUnRsU3lzdGVtVGltZVRvTG9jYWxUaW1lCiA1MDEgc3R1YiBSdGxUaW1lRmllbGRzVG9UaW1lCi01MDIgc3R1YiBSdGxUaW1lVG9FbGFwc2VkVGltZUZpZWxkcworNTAyIHN0ZGNhbGwgUnRsVGltZVRvRWxhcHNlZFRpbWVGaWVsZHMobG9uZykgUnRsVGltZVRvRWxhcHNlZFRpbWVGaWVsZHMKIDUwMyBzdHViIFJ0bFRpbWVUb1NlY29uZHNTaW5jZTE5NzAKIDUwNCBzdHViIFJ0bFRpbWVUb1NlY29uZHNTaW5jZTE5ODAKIDUwNSBzdHViIFJ0bFRpbWVUb1RpbWVGaWVsZHMKQEAgLTkzNiw3ICs5MzYsNyBAQAogOTMzIGNkZWNsIHZzcHJpbnRmKHB0ciBzdHIgcHRyKSBDUlRETExfdnNwcmludGYKIDkzNCBjZGVjbCB3Y3NjYXQod3N0ciB3c3RyKSBDUlRETExfd2NzY2F0CiA5MzUgY2RlY2wgd2NzY2hyKHdzdHIgbG9uZykgQ1JURExMX3djc2NocgotOTM2IHN0dWIgd2NzY21wCis5MzYgY2RlY2wgd2NzY21wKHdzdHIgd3N0cikgQ1JURExMX3djc2NtcAogOTM3IGNkZWNsIHdjc2NweShwdHIgd3N0cikgQ1JURExMX3djc2NweQogOTM4IHN0dWIgd2NzY3NwbgogOTM5IGNkZWNsIHdjc2xlbih3c3RyKSBDUlRETExfd2NzbGVuCmRpZmYgLS1naXQgYS9yZWxheTMyL3JlbGF5Mzg2LmMgYi9yZWxheTMyL3JlbGF5Mzg2LmMKaW5kZXggYmJlOTkzMy4uNjEyYmJjNSAxMDA2NDQKLS0tIGEvcmVsYXkzMi9yZWxheTM4Ni5jCisrKyBiL3JlbGF5MzIvcmVsYXkzODYuYwpAQCAtNDAsMzAgKzQwLDIyIEBACiAgICAgYXNzZXJ0KFRSQUNFX09OKHJlbGF5KSk7CiAgICAgZnVuYyA9IChGQVJQUk9DMzIpQlVJTFRJTjMyX0dldEVudHJ5UG9pbnQoIGJ1ZmZlciwgcmVsYXlfYWRkciAtIDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlbWFzayApOwotICAgIHByaW50ZiggIkNhbGwgJXMoIiwgYnVmZmVyICk7CisgICAgRFBSSU5URiggIkNhbGwgJXMoIiwgYnVmZmVyICk7CiAgICAgYXJncysrOwogICAgIGZvciAoaSA9IDAsIG1hc2sgPSAzOyBpIDwgbmJfYXJnczsgaSsrLCBtYXNrIDw8PSAyKQogICAgIHsKLSAgICAgICAgaWYgKGkpIHByaW50ZiggIiwiICk7CisgICAgICAgIGlmIChpKSBEUFJJTlRGKCAiLCIgKTsKIAlpZiAoKHR5cGVtYXNrICYgbWFzaykgJiYgSElXT1JEKGFyZ3NbaV0pKQogICAgICAgICB7CiAJICAgIGlmICh0eXBlbWFzayAmICgyPDwoMippKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBidWZmWzgwXTsKLSAgICAgICAgICAgICAgICBsc3RyY3B5bld0b0EoIGJ1ZmYsIChMUFdTVFIpYXJnc1tpXSwgc2l6ZW9mKGJ1ZmYpICk7Ci0JCWJ1ZmZbc2l6ZW9mKGJ1ZmYpLTFdPSdcMCc7Ci0JICAgIAlwcmludGYoICIlMDh4IEwiLCBhcmdzW2ldICk7Ci0JCWRlYnVnX2R1bXBzdHIoIGJ1ZmYgKTsKLQkgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0JICAgIAlwcmludGYoICIlMDh4ICIsIGFyZ3NbaV0gKTsKLQkJZGVidWdfZHVtcHN0cigoTFBDU1RSKWFyZ3NbaV0pOwotCSAgICB9CisJICAgIAlEUFJJTlRGKCAiJTA4eCBMJXMiLCBhcmdzW2ldLCBkZWJ1Z3N0cl93KChMUFdTVFIpYXJnc1tpXSkgKTsKKyAgICAgICAgICAgIGVsc2UKKwkgICAgCURQUklOVEYoICIlMDh4ICVzIiwgYXJnc1tpXSwgZGVidWdzdHJfYSgoTFBDU1RSKWFyZ3NbaV0pICk7CiAJfQotICAgICAgICBlbHNlIHByaW50ZiggIiUwOHgiLCBhcmdzW2ldICk7CisgICAgICAgIGVsc2UgRFBSSU5URiggIiUwOHgiLCBhcmdzW2ldICk7CiAgICAgfQogICAgIEdFVF9GUyggZnMgKTsKLSAgICBwcmludGYoICIpIHJldD0lMDh4IGZzPSUwNHhcbiIsIHJldF9hZGRyLCBmcyApOworICAgIERQUklOVEYoICIpIHJldD0lMDh4IGZzPSUwNHhcbiIsIHJldF9hZGRyLCBmcyApOwogICAgIGlmICgqcmVsYXlfYWRkciA9PSAweGMzKSAvKiBjZGVjbCAqLwogICAgIHsKICAgICAgICAgTFJFU1VMVCAoKmNmdW5jKSgpID0gKExSRVNVTFQoKikoKSlmdW5jOwpAQCAtMTAwLDcgKzkyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XSxhcmdzWzEwXSxhcmdzWzExXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1sxMl0sYXJnc1sxM10sYXJnc1sxNF0pOyBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlJFTEFZX0NhbGxGcm9tMzI6IFVuc3VwcG9ydGVkIG5iIGFyZ3MgJWRcbiIsCisgICAgICAgICAgICBFUlIocmVsYXksICJVbnN1cHBvcnRlZCBuYiBhcmdzICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgbmJfYXJncyApOwogICAgICAgICAgICAgYXNzZXJ0KEZBTFNFKTsKICAgICAgICAgfQpAQCAtMTQwLDEzICsxMzIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XSxhcmdzWzldLGFyZ3NbMTBdLGFyZ3NbMTFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMTJdLGFyZ3NbMTNdLGFyZ3NbMTRdKTsgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJSRUxBWV9DYWxsRnJvbTMyOiBVbnN1cHBvcnRlZCBuYiBhcmdzICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgbmJfYXJncyApOworICAgICAgICAgICAgRVJSKHJlbGF5LCAiVW5zdXBwb3J0ZWQgbmIgYXJncyAlZFxuIixuYl9hcmdzICk7CiAgICAgICAgICAgICBhc3NlcnQoRkFMU0UpOwogICAgICAgICB9CiAgICAgfQotICAgIHByaW50ZiggIlJldCAgJXMoKSByZXR2YWw9JTA4eCByZXQ9JTA4eCBmcz0lMDR4XG4iLAotICAgICAgICAgICAgYnVmZmVyLCByZXQsIHJldF9hZGRyLCBmcyApOworICAgIERQUklOVEYoICJSZXQgICVzKCkgcmV0dmFsPSUwOHggcmV0PSUwOHggZnM9JTA0eFxuIiwKKyAgICAgICAgICAgICBidWZmZXIsIHJldCwgcmV0X2FkZHIsIGZzICk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMjIwLDExICsyMTEsMTEgQEAKIAlFSVBfcmVnKCZjb250ZXh0KSA9ICooRFdPUkQgKilFU1BfcmVnKCZjb250ZXh0KTsKIAogICAgICAgICBCVUlMVElOMzJfR2V0RW50cnlQb2ludCggYnVmZmVyLCByZWxheV9hZGRyIC0gNSwgJnR5cGVtYXNrICk7Ci0gICAgICAgIHByaW50ZigiQ2FsbCAlcyhyZWdzKSByZXQ9JTA4eFxuIiwgYnVmZmVyLCAqKGludCAqKUVTUF9yZWcoJmNvbnRleHQpICk7Ci0gICAgICAgIHByaW50ZigiIEVBWD0lMDhseCBFQlg9JTA4bHggRUNYPSUwOGx4IEVEWD0lMDhseCBFU0k9JTA4bHggRURJPSUwOGx4XG4iLAorICAgICAgICBEUFJJTlRGKCJDYWxsICVzKHJlZ3MpIHJldD0lMDh4XG4iLCBidWZmZXIsICooaW50ICopRVNQX3JlZygmY29udGV4dCkgKTsKKyAgICAgICAgRFBSSU5URigiIEVBWD0lMDhseCBFQlg9JTA4bHggRUNYPSUwOGx4IEVEWD0lMDhseCBFU0k9JTA4bHggRURJPSUwOGx4XG4iLAogICAgICAgICAgICAgICAgIEVBWF9yZWcoJmNvbnRleHQpLCBFQlhfcmVnKCZjb250ZXh0KSwgRUNYX3JlZygmY29udGV4dCksCiAgICAgICAgICAgICAgICAgRURYX3JlZygmY29udGV4dCksIEVTSV9yZWcoJmNvbnRleHQpLCBFRElfcmVnKCZjb250ZXh0KSApOwotICAgICAgICBwcmludGYoIiBFQlA9JTA4bHggRVNQPSUwOGx4IEVJUD0lMDhseCBEUz0lMDRseCBFUz0lMDRseCBGUz0lMDRseCBHUz0lMDRseCBFRkw9JTA4bHhcbiIsCisgICAgICAgIERQUklOVEYoIiBFQlA9JTA4bHggRVNQPSUwOGx4IEVJUD0lMDhseCBEUz0lMDRseCBFUz0lMDRseCBGUz0lMDRseCBHUz0lMDRseCBFRkw9JTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgRUJQX3JlZygmY29udGV4dCksIEVTUF9yZWcoJmNvbnRleHQpLCBFSVBfcmVnKCZjb250ZXh0KSwKICAgICAgICAgICAgICAgICBEU19yZWcoJmNvbnRleHQpLCBFU19yZWcoJmNvbnRleHQpLCBGU19yZWcoJmNvbnRleHQpLAogICAgICAgICAgICAgICAgIEdTX3JlZygmY29udGV4dCksIEVGTF9yZWcoJmNvbnRleHQpICk7CkBAIC0yMzIsMTEgKzIyMywxMSBAQAogICAgICAgICAvKiBOb3cgY2FsbCB0aGUgcmVhbCBmdW5jdGlvbiAqLwogICAgICAgICBlbnRyeV9wb2ludCggJmNvbnRleHQgKTsKIAotICAgICAgICBwcmludGYoIlJldCAgJXMoKSByZXR2YWw9cmVncyByZXQ9JTA4eFxuIiwgYnVmZmVyLCAqKGludCAqKUVTUF9yZWcoJmNvbnRleHQpICk7Ci0gICAgICAgIHByaW50ZigiIEVBWD0lMDhseCBFQlg9JTA4bHggRUNYPSUwOGx4IEVEWD0lMDhseCBFU0k9JTA4bHggRURJPSUwOGx4XG4iLAorICAgICAgICBEUFJJTlRGKCJSZXQgICVzKCkgcmV0dmFsPXJlZ3MgcmV0PSUwOHhcbiIsIGJ1ZmZlciwgKihpbnQgKilFU1BfcmVnKCZjb250ZXh0KSApOworICAgICAgICBEUFJJTlRGKCIgRUFYPSUwOGx4IEVCWD0lMDhseCBFQ1g9JTA4bHggRURYPSUwOGx4IEVTST0lMDhseCBFREk9JTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgRUFYX3JlZygmY29udGV4dCksIEVCWF9yZWcoJmNvbnRleHQpLCBFQ1hfcmVnKCZjb250ZXh0KSwKICAgICAgICAgICAgICAgICBFRFhfcmVnKCZjb250ZXh0KSwgRVNJX3JlZygmY29udGV4dCksIEVESV9yZWcoJmNvbnRleHQpICk7Ci0gICAgICAgIHByaW50ZigiIEVCUD0lMDhseCBFU1A9JTA4bHggRUlQPSUwOGx4IERTPSUwNGx4IEVTPSUwNGx4IEZTPSUwNGx4IEdTPSUwNGx4IEVGTD0lMDhseFxuIiwKKyAgICAgICAgRFBSSU5URigiIEVCUD0lMDhseCBFU1A9JTA4bHggRUlQPSUwOGx4IERTPSUwNGx4IEVTPSUwNGx4IEZTPSUwNGx4IEdTPSUwNGx4IEVGTD0lMDhseFxuIiwKICAgICAgICAgICAgICAgICBFQlBfcmVnKCZjb250ZXh0KSwgRVNQX3JlZygmY29udGV4dCksIEVJUF9yZWcoJmNvbnRleHQpLAogICAgICAgICAgICAgICAgIERTX3JlZygmY29udGV4dCksIEVTX3JlZygmY29udGV4dCksIEZTX3JlZygmY29udGV4dCksCiAgICAgICAgICAgICAgICAgR1NfcmVnKCZjb250ZXh0KSwgRUZMX3JlZygmY29udGV4dCkgKTsKZGlmZiAtLWdpdCBhL3JlbGF5MzIvc2hlbGwzMi5zcGVjIGIvcmVsYXkzMi9zaGVsbDMyLnNwZWMKaW5kZXggYzgxNWQwYy4uNzAzZjU3NCAxMDA2NDQKLS0tIGEvcmVsYXkzMi9zaGVsbDMyLnNwZWMKKysrIGIvcmVsYXkzMi9zaGVsbDMyLnNwZWMKQEAgLTEwLDcgKzEwLDcgQEAKICAgIDQgc3R1YiBTSEVMTDMyXzQKICAgIDUgc3R1YiBTSEVMTDMyXzUKICAgIDYgc3R1YiBDaGVja0VzY2FwZXNXCi0gICA3IHN0ZGNhbGwgQ29tbWFuZExpbmVUb0FyZ3ZXKHB0ciBwdHIpIENvbW1hbmRMaW5lVG9Bcmd2VworICAgNyBzdGRjYWxsIENvbW1hbmRMaW5lVG9Bcmd2Vyh3c3RyIHB0cikgQ29tbWFuZExpbmVUb0FyZ3ZXCiAgICA4IHN0dWIgQ29udHJvbF9GaWxsQ2FjaGVfUnVuRExMCiAgIDEyIHN0ZGNhbGwgQ29udHJvbF9SdW5ETEwobG9uZyBsb25nIGxvbmcgbG9uZykgQ29udHJvbF9SdW5ETEwKICAgMTQgc3RkY2FsbCBEbGxHZXRDbGFzc09iamVjdChsb25nIGxvbmcgcHRyKSBTSEVMTDMyX0RsbEdldENsYXNzT2JqZWN0CkBAIC01MCw3ICs1MCw3IEBACiAgIDQ4IHN0dWIgU0hFTEwzMl80OAogICA0OSBzdHViIFNIRUxMMzJfNDkKICAgNTAgc3R1YiBEcmFnUXVlcnlGaWxlQQotICA1MSBzdHViIFNIRUxMMzJfNTEKKyAgNTEgc3RkY2FsbCBTSEVMTDMyXzUxKHN0ciBsb25nIGxvbmcpIFNIRUxMMzJfNTEKICAgNTIgc3RkY2FsbCBTSEVMTDMyXzUyKHN0cikgU0hFTEwzMl81MgogICA1MyBzdHViIERyYWdRdWVyeUZpbGVBb3JXCiAgIDU0IHN0dWIgRHJhZ1F1ZXJ5RmlsZVcKQEAgLTgxLDEyICs4MSwxMiBAQAogICA3OSBzdGRjYWxsIFNIRUxMMzJfNzkoc3RyIHB0cikgU0hFTEwzMl83OQogICA4MCBzdHViIER1cGxpY2F0ZUljb24KICAgODEgc3R1YiBTSEVMTDMyXzgxCi0gIDgyIHN0dWIgRXh0cmFjdEFzc29jaWF0ZWRJY29uQQorICA4MiBzdGRjYWxsIEV4dHJhY3RBc3NvY2lhdGVkSWNvbkEobG9uZyBwdHIgbG9uZykgRXh0cmFjdEFzc29jaWF0ZWRJY29uMzJBCiAgIDgzIHN0dWIgU0hFTEwzMl84MwogICA4NCBzdHViIFNIRUxMMzJfODQKICAgODUgc3RkY2FsbCBTSEVMTDMyXzg1KGxvbmcgbG9uZyBsb25nIGxvbmcpIFNIRUxMMzJfODUKLSAgODYgc3R1YiBTSEVMTDMyXzg2Ci0gIDg3IHN0dWIgU0hFTEwzMl84NworICA4NiBzdGRjYWxsIFNIRUxMMzJfODYobG9uZyBwdHIpIFNIRUxMMzJfODYKKyAgODcgc3RkY2FsbCBTSEVMTDMyXzg3KGxvbmcpIFNIRUxMMzJfODcKICAgODggc3R1YiBTSEVMTDMyXzg4CiAgIDg5IHN0ZGNhbGwgU0hFTEwzMl84OShsb25nIGxvbmcgbG9uZykgU0hFTEwzMl84OQogICA5MCBzdHViIFNIRUxMMzJfOTAKQEAgLTEwMCw3ICsxMDAsNyBAQAogICA5OCBzdHViIFNIRUxMMzJfOTgKICAgOTkgc3R1YiBTSEVMTDMyXzk5CiAgMTAwIHN0ZGNhbGwgU0hFTEwzMl8xMDAobG9uZykgU0hFTEwzMl8xMDAKLSAxMDEgc3RkY2FsbCBFeHRyYWN0QXNzb2NpYXRlZEljb25BKGxvbmcgcHRyIGxvbmcpIEV4dHJhY3RBc3NvY2lhdGVkSWNvbjMyQQorIDEwMSBzdHViIEV4dHJhY3RBc3NvY2lhdGVkSWNvbkV4QQogIDEwMiBzdGRjYWxsIFNIRUxMMzJfMTAyKHB0ciBwdHIgbG9uZyBwdHIgcHRyKSBTSEVMTDMyXzEwMgogIDEwMyBzdHViIFNIRUxMMzJfMTAzCiAgMTA0IHN0dWIgU0hFTEwzMl8xMDQKQEAgLTI0Miw5ICsyNDIsOSBAQAogIDI0MCBzdHViIFNoZVNldEN1ckRyaXZlCiAgMjQxIHN0dWIgU2hlU2hvcnRlblBhdGhBCiAgMjQyIHN0dWIgU2hlU2hvcnRlblBhdGhXCi0gMjQzIHN0ZGNhbGwgU2hlbGxBYm91dEEobG9uZyBwdHIgcHRyIGxvbmcpIFNoZWxsQWJvdXQzMkEKLSAyNDQgc3RkY2FsbCBTaGVsbEFib3V0Vyhsb25nIHB0ciBwdHIgbG9uZykgU2hlbGxBYm91dDMyVwotIDI0NSBzdGRjYWxsIFNoZWxsRXhlY3V0ZUEobG9uZyBwdHIgcHRyIHB0ciBwdHIgbG9uZykgU2hlbGxFeGVjdXRlMzJBCisgMjQzIHN0ZGNhbGwgU2hlbGxBYm91dEEobG9uZyBzdHIgc3RyIGxvbmcpIFNoZWxsQWJvdXQzMkEKKyAyNDQgc3RkY2FsbCBTaGVsbEFib3V0Vyhsb25nIHdzdHIgd3N0ciBsb25nKSBTaGVsbEFib3V0MzJXCisgMjQ1IHN0ZGNhbGwgU2hlbGxFeGVjdXRlQShsb25nIHN0ciBzdHIgc3RyIHN0ciBsb25nKSBTaGVsbEV4ZWN1dGUzMkEKICAyNDYgc3R1YiBTaGVsbEV4ZWN1dGVFeAogIDI0NyBzdHViIFNoZWxsRXhlY3V0ZUV4QQogIDI0OCBzdHViIFNoZWxsRXhlY3V0ZVcKZGlmZiAtLWdpdCBhL3JlbGF5MzIvdXNlcjMyLnNwZWMgYi9yZWxheTMyL3VzZXIzMi5zcGVjCmluZGV4IDkxMGE2YTEuLjcxZTgxNmMgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvdXNlcjMyLnNwZWMKKysrIGIvcmVsYXkzMi91c2VyMzIuc3BlYwpAQCAtMjYyLDcgKzI2Miw3IEBACiAyNTcgc3RkY2FsbCBHZXRNZW51KGxvbmcpIEdldE1lbnUzMgogMjU4IHN0ZGNhbGwgR2V0TWVudUNoZWNrTWFya0RpbWVuc2lvbnMoKSBHZXRNZW51Q2hlY2tNYXJrRGltZW5zaW9ucwogMjU5IHN0dWIgR2V0TWVudUNvbnRleHRIZWxwSWQKLTI2MCBzdHViIEdldE1lbnVEZWZhdWx0SXRlbQorMjYwIHN0ZGNhbGwgR2V0TWVudURlZmF1bHRJdGVtKGxvbmcgbG9uZyBsb25nKSBHZXRNZW51RGVmYXVsdEl0ZW0zMgogMjYxIHN0dWIgR2V0TWVudUluZGV4CiAyNjIgc3RkY2FsbCBHZXRNZW51SXRlbUNvdW50KGxvbmcpIEdldE1lbnVJdGVtQ291bnQzMgogMjYzIHN0ZGNhbGwgR2V0TWVudUl0ZW1JRChsb25nIGxvbmcpIEdldE1lbnVJdGVtSUQzMgpAQCAtNDE3LDcgKzQxNyw3IEBACiA0MTIgc3R1YiBPcGVuV2luZG93U3RhdGlvbkEKIDQxMyBzdHViIE9wZW5XaW5kb3dTdGF0aW9uVwogNDE0IHN0dWIgUGFja0RERWxQYXJhbQotNDE1IHN0dWIgUGFpbnREZXNrdG9wCis0MTUgc3RkY2FsbCBQYWludERlc2t0b3AobG9uZykgUGFpbnREZXNrdG9wCiA0MTYgc3RkY2FsbCBQZWVrTWVzc2FnZUEocHRyIGxvbmcgbG9uZyBsb25nIGxvbmcpIFBlZWtNZXNzYWdlMzJBCiA0MTcgc3RkY2FsbCBQZWVrTWVzc2FnZVcocHRyIGxvbmcgbG9uZyBsb25nIGxvbmcpIFBlZWtNZXNzYWdlMzJXCiA0MTggc3R1YiBQbGF5U291bmRFdmVudApkaWZmIC0tZ2l0IGEvcmVsYXkzMi93aW5zcG9vbC5zcGVjIGIvcmVsYXkzMi93aW5zcG9vbC5zcGVjCmluZGV4IGJlNzcyMWYuLjllMDU5MzMgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvd2luc3Bvb2wuc3BlYworKysgYi9yZWxheTMyL3dpbnNwb29sLnNwZWMKQEAgLTcsNyArNyw3IEBACiAxMDQgc3R1YiBBZGRGb3JtVwogMTA1IHN0dWIgQWRkSm9iQQogMTA2IHN0dWIgQWRkSm9iVwotMTA3IHN0dWIgQWRkTW9uaXRvckEKKzEwNyBzdGRjYWxsIEFkZE1vbml0b3JBKHN0ciBsb25nIHB0cikgQWRkTW9uaXRvcjMyQQogMTA4IHN0dWIgQWRkTW9uaXRvclcKIDEwOSBzdHViIEFkZFBvcnRBCiAxMTAgc3R1YiBBZGRQb3J0RXhBCkBAIC02Niw3ICs2Niw3IEBACiAxNjMgc3R1YiBFbnVtSm9ic1cKIDE2NCBzdHViIEVudW1Nb25pdG9yc0EKIDE2NSBzdHViIEVudW1Nb25pdG9yc1cKLTE2NiBzdHViIEVudW1Qb3J0c0EKKzE2NiBzdGRjYWxsIEVudW1Qb3J0c0EocHRyIGxvbmcgcHRyIHB0ciBwdHIgcHRyKSBFbnVtUG9ydHMzMkEKIDE2NyBzdHViIEVudW1Qb3J0c1cKIDE2OCBzdHViIEVudW1QcmludFByb2Nlc3NvckRhdGF0eXBlc0EKIDE2OSBzdHViIEVudW1QcmludFByb2Nlc3NvckRhdGF0eXBlc1cKZGlmZiAtLWdpdCBhL3JlbGF5MzIvd3NvY2szMi5zcGVjIGIvcmVsYXkzMi93c29jazMyLnNwZWMKaW5kZXggN2RjNGRlZi4uZGUxOGJjZSAxMDA2NDQKLS0tIGEvcmVsYXkzMi93c29jazMyLnNwZWMKKysrIGIvcmVsYXkzMi93c29jazMyLnNwZWMKQEAgLTMzLDExICszMywxMSBAQAogMDU3IHN0ZGNhbGwgZ2V0aG9zdG5hbWUocHRyIGxvbmcpIFdJTlNPQ0tfZ2V0aG9zdG5hbWUzMgogMTAxIHN0ZGNhbGwgV1NBQXN5bmNTZWxlY3QobG9uZyBsb25nIGxvbmcgbG9uZykgV1NBQXN5bmNTZWxlY3QzMgogMTAyIHN0ZGNhbGwgV1NBQXN5bmNHZXRIb3N0QnlBZGRyKGxvbmcgbG9uZyBwdHIgbG9uZyBsb25nIHB0ciBsb25nKSBXU0FBc3luY0dldEhvc3RCeUFkZHIzMgotMTAzIHN0ZGNhbGwgV1NBQXN5bmNHZXRIb3N0QnlOYW1lKGxvbmcgbG9uZyBwdHIgcHRyIGxvbmcpIFdTQUFzeW5jR2V0SG9zdEJ5TmFtZTMyCisxMDMgc3RkY2FsbCBXU0FBc3luY0dldEhvc3RCeU5hbWUobG9uZyBsb25nIHN0ciBwdHIgbG9uZykgV1NBQXN5bmNHZXRIb3N0QnlOYW1lMzIKIDEwNCBzdGRjYWxsIFdTQUFzeW5jR2V0UHJvdG9CeU51bWJlcihsb25nIGxvbmcgbG9uZyBwdHIgbG9uZykgV1NBQXN5bmNHZXRQcm90b0J5TnVtYmVyMzIKLTEwNSBzdGRjYWxsIFdTQUFzeW5jR2V0UHJvdG9CeU5hbWUobG9uZyBsb25nIHB0ciBwdHIgbG9uZykgV1NBQXN5bmNHZXRQcm90b0J5TmFtZTMyCi0xMDYgc3RkY2FsbCBXU0FBc3luY0dldFNlcnZCeVBvcnQobG9uZyBsb25nIGxvbmcgcHRyIHB0ciBsb25nKSBXU0FBc3luY0dldFNlcnZCeVBvcnQzMgotMTA3IHN0ZGNhbGwgV1NBQXN5bmNHZXRTZXJ2QnlOYW1lKGxvbmcgbG9uZyBwdHIgcHRyIHB0ciBsb25nKSBXU0FBc3luY0dldFNlcnZCeU5hbWUzMgorMTA1IHN0ZGNhbGwgV1NBQXN5bmNHZXRQcm90b0J5TmFtZShsb25nIGxvbmcgc3RyIHB0ciBsb25nKSBXU0FBc3luY0dldFByb3RvQnlOYW1lMzIKKzEwNiBzdGRjYWxsIFdTQUFzeW5jR2V0U2VydkJ5UG9ydChsb25nIGxvbmcgbG9uZyBzdHIgcHRyIGxvbmcpIFdTQUFzeW5jR2V0U2VydkJ5UG9ydDMyCisxMDcgc3RkY2FsbCBXU0FBc3luY0dldFNlcnZCeU5hbWUobG9uZyBsb25nIHN0ciBzdHIgcHRyIGxvbmcpIFdTQUFzeW5jR2V0U2VydkJ5TmFtZTMyCiAxMDggc3RkY2FsbCBXU0FDYW5jZWxBc3luY1JlcXVlc3QobG9uZykgV1NBQ2FuY2VsQXN5bmNSZXF1ZXN0MzIKIDEwOSBzdGRjYWxsIFdTQVNldEJsb2NraW5nSG9vayhwdHIpIFdTQVNldEJsb2NraW5nSG9vazMyCiAxMTAgc3RkY2FsbCBXU0FVbmhvb2tCbG9ja2luZ0hvb2soKSBXU0FVbmhvb2tCbG9ja2luZ0hvb2szMgpAQCAtNTMsMTUgKzUzLDE1IEBACiAjIC4uLiBhcyBpdCBpcywgdGhleSBkb24ndAogIzEwMDAgc3R1YiBXU0FwU2V0UG9zdFJvdXRpbmUKIDEwMDEgc3RkY2FsbCBXc0NvbnRyb2wobG9uZyBsb25nIHB0ciBwdHIgcHRyIHB0cikgV3NDb250cm9sCi0xMTAwIHN0ZGNhbGwgaW5ldF9uZXR3b3JrKHB0cikgaW5ldF9uZXR3b3JrCi0xMTAxIHN0ZGNhbGwgZ2V0bmV0YnluYW1lKHB0cikgZ2V0bmV0YnluYW1lCisxMTAwIHN0ZGNhbGwgaW5ldF9uZXR3b3JrKHN0cikgaW5ldF9uZXR3b3JrCisxMTAxIHN0ZGNhbGwgZ2V0bmV0YnluYW1lKHN0cikgZ2V0bmV0YnluYW1lCiAjMTEwMiBzdHViIHJjbWQKICMxMTAzIHN0dWIgcmV4ZWMKICMxMTA0IHN0dWIgcnJlc3Zwb3J0CiAjMTEwNSBzdHViIHNldGhvc3RuYW1lCiAjMTEwNiBzdHViIGRuX2V4cGFuZAogMTEwNyBzdHViIFdTQVJlY3ZFeAotMTEwOCBzdGRjYWxsIHNfcGVycm9yKHB0cikgV1Nfc19wZXJyb3IKKzExMDggc3RkY2FsbCBzX3BlcnJvcihzdHIpIFdTX3NfcGVycm9yCiAxMTA5IHN0dWIgR2V0QWRkcmVzc0J5TmFtZUEKIDExMTAgc3R1YiBHZXRBZGRyZXNzQnlOYW1lVwogIzExMTEgc3R1YiBFbnVtUHJvdG9jb2xzQQpkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL01ha2VmaWxlLmluIGIvcmVzb3VyY2VzL01ha2VmaWxlLmluCmluZGV4IGRlYWYyNTYuLjhlYjFiMTggMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9NYWtlZmlsZS5pbgorKysgYi9yZXNvdXJjZXMvTWFrZWZpbGUuaW4KQEAgLTQsNyArNCw4IEBACiBTUkNESVIgICAgPSBAc3JjZGlyQAogVlBBVEggICAgID0gQHNyY2RpckAKIE1PRFVMRSAgICA9IHJlc291cmNlcwotUkNGTEFHUyAgID0gLXczMgorI1JDRkxBR1MgICA9IC13MzIKK1dSQ0VYVFJBICA9IC1wICQqCiAKIFJDX1NSQ1MgPSBcCiAJc3lzcmVzX0NhLnJjIFwKQEAgLTI2LDEwICsyNywxMCBAQAogCiBDX1NSQ1MgPSBzeXNyZXMuYwogCi1hbGw6IGNoZWNrX3dpbmVyYyAkKE1PRFVMRSkubworYWxsOiBjaGVja193cmMgJChNT0RVTEUpLm8KIAogQE1BS0VfUlVMRVNACiAKLSQoUkNfU1JDUzoucmM9LmMpOiAkKFdJTkVSQykKKyQoUkNfU1JDUzoucmM9LnMpOiAkKFdSQykKIAogIyMjIERlcGVuZGVuY2llczoKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXMuYyBiL3Jlc291cmNlcy9zeXNyZXMuYwppbmRleCAyNWM2ZDlmLi4zZjM5NzVkIDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvc3lzcmVzLmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlcy5jCkBAIC04LDQyICs4LDQzIEBACiAjaW5jbHVkZSAiZ2xvYmFsLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgInJlc291cmNlLmgiCisjaW5jbHVkZSAid3JjX3JzYy5oIgogCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0VuX1RhYmxlW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0VzX1RhYmxlW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0RlX1RhYmxlW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX05vX1RhYmxlW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0ZyX1RhYmxlW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0ZpX1RhYmxlW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0RhX1RhYmxlW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0N6X1RhYmxlW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0VvX1RhYmxlW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0l0X1RhYmxlW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0tvX1RhYmxlW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0h1X1RhYmxlW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX1BsX1RhYmxlW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX1BvX1RhYmxlW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX1N3X1RhYmxlW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3Qgc3lzcmVzX0NhX1RhYmxlW107CitleHRlcm4gY29uc3Qgd3JjX3Jlc291cmNlMzJfdCAqIGNvbnN0IHN5c3Jlc19Fbl9SZXNUYWJsZVtdOworZXh0ZXJuIGNvbnN0IHdyY19yZXNvdXJjZTMyX3QgKiBjb25zdCBzeXNyZXNfRXNfUmVzVGFibGVbXTsKK2V4dGVybiBjb25zdCB3cmNfcmVzb3VyY2UzMl90ICogY29uc3Qgc3lzcmVzX0RlX1Jlc1RhYmxlW107CitleHRlcm4gY29uc3Qgd3JjX3Jlc291cmNlMzJfdCAqIGNvbnN0IHN5c3Jlc19Ob19SZXNUYWJsZVtdOworZXh0ZXJuIGNvbnN0IHdyY19yZXNvdXJjZTMyX3QgKiBjb25zdCBzeXNyZXNfRnJfUmVzVGFibGVbXTsKK2V4dGVybiBjb25zdCB3cmNfcmVzb3VyY2UzMl90ICogY29uc3Qgc3lzcmVzX0ZpX1Jlc1RhYmxlW107CitleHRlcm4gY29uc3Qgd3JjX3Jlc291cmNlMzJfdCAqIGNvbnN0IHN5c3Jlc19EYV9SZXNUYWJsZVtdOworZXh0ZXJuIGNvbnN0IHdyY19yZXNvdXJjZTMyX3QgKiBjb25zdCBzeXNyZXNfQ3pfUmVzVGFibGVbXTsKK2V4dGVybiBjb25zdCB3cmNfcmVzb3VyY2UzMl90ICogY29uc3Qgc3lzcmVzX0VvX1Jlc1RhYmxlW107CitleHRlcm4gY29uc3Qgd3JjX3Jlc291cmNlMzJfdCAqIGNvbnN0IHN5c3Jlc19JdF9SZXNUYWJsZVtdOworZXh0ZXJuIGNvbnN0IHdyY19yZXNvdXJjZTMyX3QgKiBjb25zdCBzeXNyZXNfS29fUmVzVGFibGVbXTsKK2V4dGVybiBjb25zdCB3cmNfcmVzb3VyY2UzMl90ICogY29uc3Qgc3lzcmVzX0h1X1Jlc1RhYmxlW107CitleHRlcm4gY29uc3Qgd3JjX3Jlc291cmNlMzJfdCAqIGNvbnN0IHN5c3Jlc19QbF9SZXNUYWJsZVtdOworZXh0ZXJuIGNvbnN0IHdyY19yZXNvdXJjZTMyX3QgKiBjb25zdCBzeXNyZXNfUG9fUmVzVGFibGVbXTsKK2V4dGVybiBjb25zdCB3cmNfcmVzb3VyY2UzMl90ICogY29uc3Qgc3lzcmVzX1N3X1Jlc1RhYmxlW107CitleHRlcm4gY29uc3Qgd3JjX3Jlc291cmNlMzJfdCAqIGNvbnN0IHN5c3Jlc19DYV9SZXNUYWJsZVtdOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlc291cmNlICogY29uc3QgKiBTWVNSRVNfUmVzb3VyY2VzW10gPQorc3RhdGljIGNvbnN0IHdyY19yZXNvdXJjZTMyX3QgKiBjb25zdCAqIFNZU1JFU19SZXNvdXJjZXNbXSA9CiB7Ci0gICAgc3lzcmVzX0VuX1RhYmxlLCAgLyogTEFOR19FbiAqLwotICAgIHN5c3Jlc19Fc19UYWJsZSwgIC8qIExBTkdfRXMgKi8KLSAgICBzeXNyZXNfRGVfVGFibGUsICAvKiBMQU5HX0RlICovCi0gICAgc3lzcmVzX05vX1RhYmxlLCAgLyogTEFOR19ObyAqLwotICAgIHN5c3Jlc19Gcl9UYWJsZSwgIC8qIExBTkdfRnIgKi8KLSAgICBzeXNyZXNfRmlfVGFibGUsICAvKiBMQU5HX0ZpICovCi0gICAgc3lzcmVzX0RhX1RhYmxlLCAgLyogTEFOR19EYSAqLwotICAgIHN5c3Jlc19Del9UYWJsZSwgIC8qIExBTkdfQ3ogKi8KLSAgICBzeXNyZXNfRW9fVGFibGUsICAvKiBMQU5HX0VvICovCi0gICAgc3lzcmVzX0l0X1RhYmxlLCAgLyogTEFOR19JdCAqLwotICAgIHN5c3Jlc19Lb19UYWJsZSwgIC8qIExBTkdfS28gKi8KLSAgICBzeXNyZXNfSHVfVGFibGUsICAvKiBMQU5HX0h1ICovCi0gICAgc3lzcmVzX1BsX1RhYmxlLCAgLyogTEFOR19QbCAqLwotICAgIHN5c3Jlc19Qb19UYWJsZSwgIC8qIExBTkdfUG8gKi8KLSAgICBzeXNyZXNfU3dfVGFibGUsICAvKiBMQU5HX1N3ICovCi0gICAgc3lzcmVzX0NhX1RhYmxlICAgLyogTEFOR19DYSAqLworICAgIHN5c3Jlc19Fbl9SZXNUYWJsZSwgIC8qIExBTkdfRW4gKi8KKyAgICBzeXNyZXNfRXNfUmVzVGFibGUsICAvKiBMQU5HX0VzICovCisgICAgc3lzcmVzX0RlX1Jlc1RhYmxlLCAgLyogTEFOR19EZSAqLworICAgIHN5c3Jlc19Ob19SZXNUYWJsZSwgIC8qIExBTkdfTm8gKi8KKyAgICBzeXNyZXNfRnJfUmVzVGFibGUsICAvKiBMQU5HX0ZyICovCisgICAgc3lzcmVzX0ZpX1Jlc1RhYmxlLCAgLyogTEFOR19GaSAqLworICAgIHN5c3Jlc19EYV9SZXNUYWJsZSwgIC8qIExBTkdfRGEgKi8KKyAgICBzeXNyZXNfQ3pfUmVzVGFibGUsICAvKiBMQU5HX0N6ICovCisgICAgc3lzcmVzX0VvX1Jlc1RhYmxlLCAgLyogTEFOR19FbyAqLworICAgIHN5c3Jlc19JdF9SZXNUYWJsZSwgIC8qIExBTkdfSXQgKi8KKyAgICBzeXNyZXNfS29fUmVzVGFibGUsICAvKiBMQU5HX0tvICovCisgICAgc3lzcmVzX0h1X1Jlc1RhYmxlLCAgLyogTEFOR19IdSAqLworICAgIHN5c3Jlc19QbF9SZXNUYWJsZSwgIC8qIExBTkdfUGwgKi8KKyAgICBzeXNyZXNfUG9fUmVzVGFibGUsICAvKiBMQU5HX1BvICovCisgICAgc3lzcmVzX1N3X1Jlc1RhYmxlLCAgLyogTEFOR19TdyAqLworICAgIHN5c3Jlc19DYV9SZXNUYWJsZSAgIC8qIExBTkdfQ2EgKi8KIH07CiAKIApAQCAtNTQsNyArNTUsNyBAQAogICovCiBMUENWT0lEIFNZU1JFU19HZXRSZXNQdHIoIFNZU1RFTV9SRVNPVVJDRSBpZCApCiB7Ci0gICAgcmV0dXJuIFNZU1JFU19SZXNvdXJjZXNbT3B0aW9ucy5sYW5ndWFnZV1baWRdLT5ieXRlczsKKyAgICByZXR1cm4gU1lTUkVTX1Jlc291cmNlc1tPcHRpb25zLmxhbmd1YWdlXVtpZF0tPmRhdGE7CiB9CiAKIApAQCAtNjUsMTAgKzY2LDEwIEBACiAgKi8KIEhHTE9CQUwxNiBTWVNSRVNfTG9hZFJlc291cmNlKCBTWVNURU1fUkVTT1VSQ0UgaWQgKQogewotICAgIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcmVzUHRyOworICAgIGNvbnN0IHdyY19yZXNvdXJjZTMyX3QgKnJlc1B0cjsKIAogICAgIHJlc1B0ciA9IFNZU1JFU19SZXNvdXJjZXNbT3B0aW9ucy5sYW5ndWFnZV1baWRdOwotICAgIHJldHVybiBHTE9CQUxfQ3JlYXRlQmxvY2soIEdNRU1fRklYRUQsIHJlc1B0ci0+Ynl0ZXMsIHJlc1B0ci0+c2l6ZSwKKyAgICByZXR1cm4gR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX0ZJWEVELCByZXNQdHItPmRhdGEsIHJlc1B0ci0+ZGF0YXNpemUsCiAJCQkgICAgICAgR2V0Q3VycmVudFBEQigpLCBGQUxTRSwgRkFMU0UsIFRSVUUsIE5VTEwgKTsKIH0KIApkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19DYS5yYyBiL3Jlc291cmNlcy9zeXNyZXNfQ2EucmMKaW5kZXggNmJjZGFhZi4uZmI0YWUzYSAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlc19DYS5yYworKysgYi9yZXNvdXJjZXMvc3lzcmVzX0NhLnJjCkBAIC0xLDMgKzEsNCBAQAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KIAogU1lTTUVOVSBNRU5VIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUKIHsKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfQ3oucmMgYi9yZXNvdXJjZXMvc3lzcmVzX0N6LnJjCmluZGV4IDc3MThlZGEuLjUyMDcyODggMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfQ3oucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19Dei5yYwpAQCAtMSwzICsxLDUgQEAKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKIFNZU01FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCiB7CiAgTUVOVUlURU0gIiZPYm5vdiIsIDYxNzI4CmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvc3lzcmVzX0RhLnJjIGIvcmVzb3VyY2VzL3N5c3Jlc19EYS5yYwppbmRleCBlYzk5Y2Q2Li41ZjU2NTFiIDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvc3lzcmVzX0RhLnJjCisrKyBiL3Jlc291cmNlcy9zeXNyZXNfRGEucmMKQEAgLTEsMyArMSw1IEBACisjaW5jbHVkZSA8d2luZG93cy5oPgorCiBTWVNNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQogewogIE1FTlVJVEVNICImR2Vub3ByZXQiLCA2MTcyOApAQCAtNTEsNyArNTMsNyBAQAogIExJU1RCT1ggOTksIDgsIDY1LCAxMzcsIDgyLCBMQlNfTk9USUZZIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUgogIElDT04gIiIsIDEwODgsIDE4OSwgMTAsIDE0LCAxNgogIExURVhUICIiLCAxMDAsIDgsIDEwLCAxMzcsIDMzCi0gTFRFWFQgIldpbmUgd2FzIGJyb3VnaHQgdG8geW91IGJ5OiIsIDk4LCA4LCA1NSwgMTM3LCAxMAorIExURVhUICJXaW5lIGhhdmRlIGlra2UgduZyZXQgbXVsaWcgdWRlbiBoauZscCBmcmEgZGlzc2UgcGVyc29uZXI6IiwgOTgsIDgsIDU1LCAxMzcsIDEwCiB9CiAKIE9QRU5fRklMRSBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDI3NSwgMTM0CmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvc3lzcmVzX0RlLnJjIGIvcmVzb3VyY2VzL3N5c3Jlc19EZS5yYwppbmRleCAzNTM0MzM4Li4xNjE2MmU2IDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvc3lzcmVzX0RlLnJjCisrKyBiL3Jlc291cmNlcy9zeXNyZXNfRGUucmMKQEAgLTEsMyArMSw1IEBACisjaW5jbHVkZSA8d2luZG93cy5oPgorCiBTWVNNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAKIHsKICBNRU5VSVRFTSAiJldpZWRlcmhlcnN0ZWxsZW4iLCA2MTcyOApkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19Fbi5yYyBiL3Jlc291cmNlcy9zeXNyZXNfRW4ucmMKaW5kZXggOTUwMTU4MC4uMTgzOGY0YiAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlc19Fbi5yYworKysgYi9yZXNvdXJjZXMvc3lzcmVzX0VuLnJjCkBAIC0xLDMgKzEsNiBAQAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxkbGdzLmg+CisKIFNZU01FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCiB7CiAgTUVOVUlURU0gIiZSZXN0b3JlIiwgNjE3MjgKQEAgLTMzLDcgKzM2LDcgQEAKIEJFR0lOCiAgICAgICAgIElDT04gIiIsIDEwODgsIDgsIDIwLCAxNiwgMTYsIFdTX0NISUxEIHwgV1NfVklTSUJMRQogICAgICAgICBMVEVYVCAiIiwgMTAwLCAzMiwgNCwgMTc2LCA0OCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKLSAgICAgICAgUFVTSEJVVFRPTiAiJk9rIiwgMSwgMTYsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJk9LIiwgMSwgMTYsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKICAgICAgICAgUFVTSEJVVFRPTiAiJkNhbmNlbCIsIDIsIDY0LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCiAgICAgICAgIFBVU0hCVVRUT04gIiZBYm9ydCIsIDMsIDExMiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAogICAgICAgICBQVVNIQlVUVE9OICImUmV0cnkiLCA0LCAxNjAsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKQEAgLTQ3LDcgKzUwLDcgQEAKIENBUFRJT04gIkFib3V0ICVzIgogRk9OVCAxMCwgIlN5c3RlbSIKIHsKLSBERUZQVVNIQlVUVE9OICJPSyIsIDEsIDE1MywgMTMwLCA1MCwgMTIKKyBERUZQVVNIQlVUVE9OICJPSyIsIDEsIDE1MywgMTMwLCA1MCwgMTIsIFdTX1RBQlNUT1AKICBMSVNUQk9YIDk5LCA4LCA2NSwgMTM3LCA4MiwgTEJTX05PVElGWSB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIKICBJQ09OICIiLCAxMDg4LCAxODksIDEwLCAxNCwgMTYKICBMVEVYVCAiIiwgMTAwLCA4LCAxMCwgMTM3LCAzMwpAQCAtMTMxLDcgKzEzNCw3IEBACiAgTFRFWFQgIltub25lXSIsIDEwODgsIDM1LCAzNSwgMTIwLCA5CiAgUkFESU9CVVRUT04gIlNwZWNpZmljICZQcmludGVyIiwgMTA1NywgMTYsIDUwLCA4MCwgMTIKICBDT01CT0JPWCAxMTM2LCAzNSwgNjUsIDE0OSwgNjgsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfT1dORVJEUkFXRklYRUQgfCBDQlNfQVVUT0hTQ1JPTEwgfCBDQlNfU09SVCB8IENCU19IQVNTVFJJTkdTIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AKLSBERUZQVVNIQlVUVE9OICJPayIsIDEsIDIwNiwgNiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgREVGUFVTSEJVVFRPTiAiT0siLCAxLCAyMDYsIDYsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAogIFBVU0hCVVRUT04gIkNhbmNlbCIsIDIsIDIwNiwgMjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCiAgUFVTSEJVVFRPTiAiJlNldHVwIiwgMTAyNCwgMjA2LCA0NiwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKICBHUk9VUEJPWCAiT3JpZW50YXRpb24iLCAxMDczLCA2LCA4NSwgMTAwLCA1MCwgQlNfR1JPVVBCT1gKQEAgLTE2MSwxMCArMTY0LDEwIEBACiAgICAgTFRFWFQgICAgICAgICAgICImU2l6ZToiLDEwOTAsMTc5LDMsMzAsOQogICAgIENPTUJPQk9YICAgICAgICAxMTM4LDE3OSwxMywzMiw1NCwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0hBU1NUUklOR1MgfCBDQlNfRElTQUJMRU5PU0NST0xMIHwKICAgICAgICAgICAgICAgICAgICAgV1NfVlNDUk9MTCB8IFdTX1RBQlNUT1AgfCBDQlNfU0lNUExFIHwgQ0JTX1NPUlQKLSAgICBERUZQVVNIQlVUVE9OICAgIk9LIixJRE9LLDIxOCw2LDQwLDE0LFdTX0dST1VQCi0gICAgUFVTSEJVVFRPTiAgICAgICJDYW5jZWwiLElEQ0FOQ0VMLDIxOCwyMyw0MCwxNCxXU19HUk9VUAotICAgIFBVU0hCVVRUT04gICAgICAiJkFwcGx5IiwgMTAyNiwyMTgsNDAsNDAsMTQsV1NfR1JPVVAKLSAgICBQVVNIQlVUVE9OICAgICAgIiZIZWxwIiAsIDEwMzgsMjE4LDU3LDQwLDE0LFdTX0dST1VQCisgICAgREVGUFVTSEJVVFRPTiAgICJPSyIsSURPSywyMTgsNiw0MCwxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QIHwgQlNfREVGUFVTSEJVVFRPTiAKKyAgICBQVVNIQlVUVE9OICAgICAgIkNhbmNlbCIsSURDQU5DRUwsMjE4LDIzLDQwLDE0LFdTX0dST1VQIHwgV1NfVEFCU1RPUAorICAgIFBVU0hCVVRUT04gICAgICAiJkFwcGx5IiwgMTAyNiwyMTgsNDAsNDAsMTQsV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgICAgUFVTSEJVVFRPTiAgICAgICImSGVscCIgLCAxMDM4LDIxOCw1Nyw0MCwxNCxXU19HUk9VUCB8IFdTX1RBQlNUT1AKICAgICBHUk9VUEJPWCAgICAgICAgIkVmZmVjdHMiLDEwNzIsNiw3Miw4NCwzNCxXU19HUk9VUAogICAgIENIRUNLQk9YCSAgICAiU3RyaSZrZW91dCIsIDEwNDAsIDEwLDgyLDUwLDEwLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QCiAgICAgQ0hFQ0tCT1ggCSAgICAiJlVuZGVybGluZSIsIDEwNDEsIDEwLDk0LDUwLDEwLCBCU19BVVRPQ0hFQ0tCT1ggCkBAIC0yMDEsNyArMjA0LDcgQEAKICBDT05UUk9MICIiICw3MTAsIlNUQVRJQyIsV1NfQk9SREVSfFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLCAxNTIsNCwxMTgsMTE2CiAgQ09OVFJPTCAiIiAsNzAyLCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLCAyNzgsNCw4LDExNgogIENPTlRST0wgIiIgLDcwOSwiU1RBVElDIixTU19TSU1QTEV8V1NfVEFCU1RPUHxXU19HUk9VUCwgMTUyLDEyNCw0MCwyNgotIERFRlBVU0hCVVRUT04gIk9rIiwgIDEsICA0LCAxNjYsIDQ0LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIERFRlBVU0hCVVRUT04gIk9LIiwgIDEsICA0LCAxNjYsIDQ0LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAogIFBVU0hCVVRUT04gIkNhbmNlbCIsIDIsIDUyLCAxNjYsIDQ0LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCiAgUFVTSEJVVFRPTiAiSGVscCIsIDEwMzgsMTAwLDE2NiwgNDQsIDE0CiAgUFVTSEJVVFRPTiAiJkFkZCB0byBDdXN0b20gQ29sb3JzIiwgICAgNzEyLyoxMDI0Ki8sIDE1MiwgMTY2LCAxNDIsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKQEAgLTIyMiw5ICsyMjUsMTAgQEAKICBHUk9VUEJPWCAiRGlyZWN0aW9uIiwgMTA3MiwgMTA3LCAyNiwgNjgsIDI4CiAgQ09OVFJPTCAiJlVwIiwgMTA1NiwgIkJVVFRPTiIsIEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUCwgMTExLCAzOCwgMjAsIDEyCiAgQ09OVFJPTCAiJkRvd24iLCAxMDU3LCAiQlVUVE9OIiwgQlNfQVVUT1JBRElPQlVUVE9OIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUCwgMTM4LCAzOCwgMzAsIDEyCi0gREVGUFVTSEJVVFRPTiAiJkZpbmQgTmV4dCIsIDEsIDE4MiwgNSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKLSBQVVNIQlVUVE9OICJDYW5jZWwiLCAyLCAxODIsIDIzLCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAotIFBVU0hCVVRUT04gIiZIZWxwIiwgMTAzOCwgMTgyLCA0NSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKworIERFRlBVU0hCVVRUT04gIiZGaW5kIE5leHQiLCBJRE9LLCAxODIsICA1LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUCB8IEJTX0RFRlBVU0hCVVRUT04gCisgUFVTSEJVVFRPTiAiQ2FuY2VsIiwgSURDQU5DRUwJICwgMTgyLCAyMywgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImSGVscCIsIHBzaEhlbHAJICwgMTgyLCA0NSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKIH0KIAogCkBAIC0yMzksOSArMjQzLDEwIEBACiAgRURJVFRFWFQgMTE1MywgNTQsIDI0LCAxMTQsIDEyLCBFU19BVVRPSFNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAogIENIRUNLQk9YICJNYXRjaCAmV2hvbGUgV29yZCBPbmx5IiwgMTA0MCwgNSwgNDYsIDEwNCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAogIENIRUNLQk9YICJNYXRjaCAmQ2FzZSIsIDEwNDEsIDUsIDYyLCA1OSwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1AKLSBERUZQVVNIQlVUVE9OICImRmluZCBOZXh0IiwgMSwgMTc0LCA0LCA1MCwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKLSBQVVNIQlVUVE9OICImUmVwbGFjZSIsIDEwMjQsIDE3NCwgMjEsIDUwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCi0gUFVTSEJVVFRPTiAiUmVwbGFjZSAmQWxsIiwgMTAyNSwgMTc0LCAzOCwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKLSBQVVNIQlVUVE9OICJDYW5jZWwiLCAyLCAxNzQsIDU1LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAotIFBVU0hCVVRUT04gIiZIZWxwIiwgMTAzOCwgMTc0LCA3NSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKworIERFRlBVU0hCVVRUT04gIiZGaW5kIE5leHQiLCBJRE9LLCAxNzQsICA0LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUCB8IEJTX0RFRlBVU0hCVVRUT04gCisgUFVTSEJVVFRPTiAiJlJlcGxhY2UiLCBwc2gxCSAsIDE3NCwgMjEsIDUwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiUmVwbGFjZSAmQWxsIiwgcHNoMiAsIDE3NCwgMzgsIDUwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiQ2FuY2VsIiwgSURDQU5DRUwJICwgMTc0LCA1NSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICImSGVscCIsIHBzaEhlbHAJICwgMTc0LCA3NSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKIH0KZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfRW8ucmMgYi9yZXNvdXJjZXMvc3lzcmVzX0VvLnJjCmluZGV4IDJmYTZlODAuLmExNzA2OWIgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfRW8ucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19Fby5yYwpAQCAtMSwzICsxLDUgQEAKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKIFNZU01FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCiB7CiAgTUVOVUlURU0gIiZSZW5vcm1hbGlndSIsIDYxNzI4CmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvc3lzcmVzX0VzLnJjIGIvcmVzb3VyY2VzL3N5c3Jlc19Fcy5yYwppbmRleCAzODdkOGJiLi5mYzFiNGI4IDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvc3lzcmVzX0VzLnJjCisrKyBiL3Jlc291cmNlcy9zeXNyZXNfRXMucmMKQEAgLTEsMyArMSw1IEBACisjaW5jbHVkZSA8d2luZG93cy5oPgorCiAKIFNZU01FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCiB7CmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvc3lzcmVzX0ZpLnJjIGIvcmVzb3VyY2VzL3N5c3Jlc19GaS5yYwppbmRleCAzNjk4NzNjLi4xMjhkNjIxIDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvc3lzcmVzX0ZpLnJjCisrKyBiL3Jlc291cmNlcy9zeXNyZXNfRmkucmMKQEAgLTEsMyArMSw1IEBACisjaW5jbHVkZSA8d2luZG93cy5oPgorCiBTWVNNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQogewogIE1FTlVJVEVNICImUGFsYXV0YSIsIDYxNzI4CmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvc3lzcmVzX0ZyLnJjIGIvcmVzb3VyY2VzL3N5c3Jlc19Gci5yYwppbmRleCA0ZmE5NTM1Li41YmQzMzA0IDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvc3lzcmVzX0ZyLnJjCisrKyBiL3Jlc291cmNlcy9zeXNyZXNfRnIucmMKQEAgLTEsMyArMSw1IEBACisjaW5jbHVkZSA8d2luZG93cy5oPgorCiAKIFNZU01FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCiB7CmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvc3lzcmVzX0h1LnJjIGIvcmVzb3VyY2VzL3N5c3Jlc19IdS5yYwppbmRleCA2NmNmMjgxLi45MWVjYTY0IDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvc3lzcmVzX0h1LnJjCisrKyBiL3Jlc291cmNlcy9zeXNyZXNfSHUucmMKQEAgLTEsMyArMSw1IEBACisjaW5jbHVkZSA8d2luZG93cy5oPgorCiBTWVNNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQogQkVHSU4KICBNRU5VSVRFTSAiJlZpc3N6YeFsbO104XMiLCA2MTcyOApkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19JdC5yYyBiL3Jlc291cmNlcy9zeXNyZXNfSXQucmMKaW5kZXggYmQ3ODY3Mi4uM2IzODdhZiAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlc19JdC5yYworKysgYi9yZXNvdXJjZXMvc3lzcmVzX0l0LnJjCkBAIC0xLDMgKzEsNSBAQAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKwogU1lTTUVOVSBNRU5VIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUKIHsKICBNRU5VSVRFTSAiJlJpcHJpc3RpbmEiLCA2MTcyOApkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19Lby5yYyBiL3Jlc291cmNlcy9zeXNyZXNfS28ucmMKaW5kZXggNzgxMGMxMi4uNTQ0NzMzZSAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlc19Lby5yYworKysgYi9yZXNvdXJjZXMvc3lzcmVzX0tvLnJjCkBAIC0xLDMgKzEsNSBAQAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKwogU1lTTUVOVSBNRU5VIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUKIHsKICBNRU5VSVRFTSAiurmxzSgmUikiLCA2MTcyOApkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19Oby5yYyBiL3Jlc291cmNlcy9zeXNyZXNfTm8ucmMKaW5kZXggNTg1MGJmMS4uMDE4MWI5OCAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlc19Oby5yYworKysgYi9yZXNvdXJjZXMvc3lzcmVzX05vLnJjCkBAIC0xLDMgKzEsNSBAQAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKwogU1lTTUVOVSBNRU5VIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUKIHsKICBNRU5VSVRFTSAiJkdqZW5vcHByZXR0IiwgNjE3MjgKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfUGwucmMgYi9yZXNvdXJjZXMvc3lzcmVzX1BsLnJjCmluZGV4IDgwMjYwYmMuLmUyOGIzYTIgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfUGwucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19QbC5yYwpAQCAtMSwzICsxLDUgQEAKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKIFNZU01FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCiB7CiAJTUVOVUlURU0gIiZQcnp5d3Lz5iIsIDYxNzI4CmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvc3lzcmVzX1BvLnJjIGIvcmVzb3VyY2VzL3N5c3Jlc19Qby5yYwppbmRleCAyMDBiOGQyLi5kMGNhNTRiIDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvc3lzcmVzX1BvLnJjCisrKyBiL3Jlc291cmNlcy9zeXNyZXNfUG8ucmMKQEAgLTEsMyArMSw1IEBACisjaW5jbHVkZSA8d2luZG93cy5oPgorCiBTWVNNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQogewogIE1FTlVJVEVNICImUmVzdGF1cmFyIiwgNjE3MjgKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfU3cucmMgYi9yZXNvdXJjZXMvc3lzcmVzX1N3LnJjCmluZGV4IGFmOWJhNDkuLmI1YjQwZWUgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfU3cucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19Tdy5yYwpAQCAtMSwzICsxLDUgQEAKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKIFNZU01FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCiB7CiAgTUVOVUlURU0gIibFdGVyc3TkbGwiLCA2MTcyOApkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL2NyaXRzZWN0aW9uLmMgYi9zY2hlZHVsZXIvY3JpdHNlY3Rpb24uYwppbmRleCA5YzkyMzUxLi40ODkzNzEyIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvY3JpdHNlY3Rpb24uYworKysgYi9zY2hlZHVsZXIvY3JpdHNlY3Rpb24uYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3NlbS5oPgorI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAid2luYmFzZS5oIgpAQCAtMTAyLDcgKzEwMyw3IEBACiAgICAgaWYgKG9iaikKICAgICB7CiAgICAgICAgIGlmIChjcml0LT5SZWN1cnNpb25Db3VudCkgIC8qIFNob3VsZCBub3QgaGFwcGVuICovCi0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJEZWxldGluZyBvd25lZCBjcml0aWNhbCBzZWN0aW9uICglcClcbiIsIGNyaXQgKTsKKyAgICAgICAgICAgIE1TRygiRGVsZXRpbmcgb3duZWQgY3JpdGljYWwgc2VjdGlvbiAoJXApXG4iLCBjcml0ICk7CiAgICAgICAgIGNyaXQtPkxvY2tDb3VudCAgICAgID0gLTE7CiAgICAgICAgIGNyaXQtPlJlY3Vyc2lvbkNvdW50ID0gMDsKICAgICAgICAgY3JpdC0+T3duaW5nVGhyZWFkICAgPSAwOwpAQCAtMTU2LDcgKzE1Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJVbmluaXRpYWxpemVkIGNyaXRpY2FsIHNlY3Rpb24gKCVwKVxuIiwgY3JpdCApOworICAgICAgICAgICAgTVNHKCAiVW5pbml0aWFsaXplZCBjcml0aWNhbCBzZWN0aW9uICglcClcbiIsIGNyaXQgKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9oYW5kbGUuYyBiL3NjaGVkdWxlci9oYW5kbGUuYwppbmRleCBlNjYzMGFhLi43MmIzMDFkIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvaGFuZGxlLmMKKysrIGIvc2NoZWR1bGVyL2hhbmRsZS5jCkBAIC02LDYgKzYsNyBAQAogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgIndpbmJhc2UuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgImhlYXAuaCIKQEAgLTE1MCw3ICsxNTEsNyBAQAogICAgIHsKICAgICAgICAgSEFORExFX0VOVFJZICplbnRyeSA9ICZwZGItPmhhbmRsZV90YWJsZS0+ZW50cmllc1toYW5kbGVdOwogICAgICAgICBpZiAoKGVudHJ5LT5hY2Nlc3MgJiBhY2Nlc3MpICE9IGFjY2VzcykKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IGhhbmRsZSAlMDh4IGJhZCBhY2Nlc3MgKGFjYz0lMDhseCByZXE9JTA4bHgpXG4iLAorICAgICAgICAgICAgV0FSTih3aW4zMiwgIkhhbmRsZSAlMDh4IGJhZCBhY2Nlc3MgKGFjYz0lMDhseCByZXE9JTA4bHgpXG4iLAogICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCBlbnRyeS0+YWNjZXNzLCBhY2Nlc3MgKTsKICAgICAgICAgcHRyID0gZW50cnktPnB0cjsKICAgICAgICAgaWYgKHB0ciAmJiAoKHR5cGUgPT0gSzMyT0JKX1VOS05PV04pIHx8IChwdHItPnR5cGUgPT0gdHlwZSkpKQpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3Byb2Nlc3MuYyBiL3NjaGVkdWxlci9wcm9jZXNzLmMKaW5kZXggMzYxODc1ZS4uMjI1NGQ2MyAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL3Byb2Nlc3MuYworKysgYi9zY2hlZHVsZXIvcHJvY2Vzcy5jCkBAIC02LDExICs2LDExIEBACiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgInByb2Nlc3MuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJmaWxlLmgiCisjaW5jbHVkZSAiZ2xvYmFsLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJsZHQuaCIKQEAgLTIwOSw3ICsyMDksNiBAQAogICovCiBCT09MMzIgUFJPQ0VTU19Jbml0KHZvaWQpCiB7Ci0gICAgZXh0ZXJuIEJPT0wzMiBWSVJUVUFMX0luaXQodm9pZCk7CiAgICAgZXh0ZXJuIEJPT0wzMiBUSFJFQURfSW5pdERvbmU7CiAgICAgUERCMzIgKnBkYjsKICAgICBUSERCICp0aGRiOwpAQCAtMjI0LDYgKzIyMyw3IEBACiAgICAgLyogQ3JlYXRlIHRoZSBpbml0aWFsIHByb2Nlc3MgYW5kIHRocmVhZCBzdHJ1Y3R1cmVzICovCiAgICAgaWYgKCEocGRiID0gUFJPQ0VTU19DcmVhdGVQREIoIE5VTEwgKSkpIHJldHVybiBGQUxTRTsKICAgICBpZiAoISh0aGRiID0gVEhSRUFEX0NyZWF0ZSggcGRiLCAwLCBGQUxTRSwgTlVMTCwgTlVMTCApKSkgcmV0dXJuIEZBTFNFOworICAgIHRoZGItPnVuaXhfcGlkID0gZ2V0cGlkKCk7CiAgICAgU0VUX0NVUl9USFJFQUQoIHRoZGIgKTsKICAgICBUSFJFQURfSW5pdERvbmUgPSBUUlVFOwogCkBAIC0yNzgsNiArMjc4LDggQEAKICAgICAgICAgc2l6ZSA9IDA7CiAgICAgaWYgKCEodGhkYiA9IFRIUkVBRF9DcmVhdGUoIHBkYiwgc2l6ZSwgRkFMU0UsIE5VTEwsIE5VTEwgKSkpIGdvdG8gZXJyb3I7CiAKKyAgICB0aGRiLT51bml4X3BpZCA9IGdldHBpZCgpOyAvKiBGSVhNRTogd3JvbmcgaGVyZSAuLi4gKi8KKwogICAgIC8qIENyZWF0ZSBhIFdpbjE2IHRhc2sgZm9yIHRoaXMgcHJvY2VzcyAqLwogCiAgICAgcGRiLT50YXNrID0gVEFTS19DcmVhdGUoIHRoZGIsIHBNb2R1bGUsIGhJbnN0YW5jZSwgaFByZXZJbnN0YW5jZSwgY21kU2hvdyk7CkBAIC00NTEsNyArNDUzLDcgQEAKICAgICAJcGRiLT5wcmlvcml0eSA9IDB4MDAwMDAwMTg7CiAgICAgCWJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgCWZwcmludGYoc3RkZXJyLCJTZXRQcmlvcml0eUNsYXNzOiB1bmtub3duIHByaW9yaXR5IGNsYXNzICVsZFxuIixwcmlvcml0eWNsYXNzKTsKKyAgICAJV0FSTihwcm9jZXNzLCJVbmtub3duIHByaW9yaXR5IGNsYXNzICVsZFxuIixwcmlvcml0eWNsYXNzKTsKIAlicmVhazsKICAgICB9CiAgICAgSzMyT0JKX0RlY0NvdW50KCAmcGRiLT5oZWFkZXIgKTsKQEAgLTQ4Myw3ICs0ODUsNyBAQAogCSAgICByZXQgPSBSRUFMVElNRV9QUklPUklUWV9DTEFTUzsKIAkgICAgYnJlYWs7CiAJZGVmYXVsdDoKLQkgICAgZnByaW50ZihzdGRlcnIsIkdldFByaW9yaXR5Q2xhc3M6IHVua25vd24gcHJpb3JpdHkgJWxkXG4iLHBkYi0+cHJpb3JpdHkpOworCSAgICBXQVJOKHByb2Nlc3MsIlVua25vd24gcHJpb3JpdHkgJWxkXG4iLHBkYi0+cHJpb3JpdHkpOwogCX0KIAlLMzJPQkpfRGVjQ291bnQoICZwZGItPmhlYWRlciApOwogICAgIH0KQEAgLTU4OCwxMCArNTkwLDggQEAKIEJPT0wzMiBXSU5BUEkgU2V0UHJvY2Vzc1dvcmtpbmdTZXRTaXplKEhBTkRMRTMyIGhQcm9jZXNzLERXT1JEIG1pbnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIG1heHNldCkKIHsKLQlmcHJpbnRmKHN0ZGVyciwiU2V0UHJvY2Vzc1dvcmtpbmdTZXRTaXplKDB4JTA4eCwlbGQsJWxkKSwgU1RVQiFcbiIsCi0JCWhQcm9jZXNzLG1pbnNldCxtYXhzZXQKLQkpOwotCXJldHVybiBUUlVFOworICAgIEZJWE1FKHByb2Nlc3MsIigweCUwOHgsJWxkLCVsZCk6IHN0dWJcbiIsaFByb2Nlc3MsbWluc2V0LG1heHNldCk7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjAwLDkgKzYwMCw3IEBACiBCT09MMzIgV0lOQVBJIEdldFByb2Nlc3NXb3JraW5nU2V0U2l6ZShIQU5ETEUzMiBoUHJvY2VzcyxMUERXT1JEIG1pbnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbWF4c2V0KQogewotCWZwcmludGYoc3RkZXJyLCJTZXRQcm9jZXNzV29ya2luZ1NldFNpemUoMHglMDh4LCVwLCVwKSwgU1RVQiFcbiIsCi0JCWhQcm9jZXNzLG1pbnNldCxtYXhzZXQKLQkpOworCUZJWE1FKHByb2Nlc3MsIigweCUwOHgsJXAsJXApOiBzdHViXG4iLGhQcm9jZXNzLG1pbnNldCxtYXhzZXQpOwogCS8qIDMyIE1CIHdvcmtpbmcgc2V0IHNpemUgKi8KIAlpZiAobWluc2V0KSAqbWluc2V0ID0gMzIqMTAyNCoxMDI0OwogCWlmIChtYXhzZXQpICptYXhzZXQgPSAzMioxMDI0KjEwMjQ7CkBAIC02MTQsMTAgKzYxMiw4IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgU2V0UHJvY2Vzc1NodXRkb3duUGFyYW1ldGVycyhEV09SRCBsZXZlbCxEV09SRCBmbGFncykKIHsKLQlmcHJpbnRmKHN0ZGVyciwiU2V0UHJvY2Vzc1NodXRkb3duUGFyYW1ldGVycyglbGQsMHglMDhseCksIFNUVUIhXG4iLAotCQlsZXZlbCxmbGFncwotCSk7Ci0JcmV0dXJuIFRSVUU7CisgICAgRklYTUUocHJvY2VzcywiKCVsZCwweCUwOGx4KTogc3R1YlxuIixsZXZlbCxmbGFncyk7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjU0LDcgKzY1MCw3IEBACiAgKi8KIEhBTkRMRTMyIFdJTkFQSSBDb252ZXJ0VG9HbG9iYWxIYW5kbGUoSEFORExFMzIgaCkKIHsKLQlmcHJpbnRmKHN0ZGVyciwiQ29udmVydFRvR2xvYmFsSGFuZGxlKCVkKSxzdHViIVxuIixoKTsKKwlGSVhNRShwcm9jZXNzLCIoJWQpOiBzdHViXG4iLGgpOwogCXJldHVybiBoOwogfQogCmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvc3luY2hyby5jIGIvc2NoZWR1bGVyL3N5bmNocm8uYwppbmRleCAwMjIwNTAzLi5iYjRhMTEwIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvc3luY2hyby5jCisrKyBiL3NjaGVkdWxlci9zeW5jaHJvLmMKQEAgLTYsNyArNiw2IEBACiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSAiazMyb2JqLmgiCkBAIC0yNDUsNyArMjQ0LDEwIEBACiAgICAgICAgIGlmIChTWU5DX0NoZWNrQ29uZGl0aW9uKCAmdGhkYi0+d2FpdF9zdHJ1Y3QsIFRIREJfVE9fVEhSRUFEX0lEKHRoZGIpICkpCiAgICAgICAgIHsKICAgICAgICAgICAgIFRSQUNFKHdpbjMyLCAid2FraW5nIHVwICUwNHhcbiIsIHRoZGItPnRlYl9zZWwgKTsKLSAgICAgICAgICAgIGtpbGwoIHRoZGItPnVuaXhfcGlkLCBTSUdVU1IxICk7CisgICAgICAgICAgICBpZiAodGhkYi0+dW5peF9waWQpCisJICAgIAlraWxsKCB0aGRiLT51bml4X3BpZCwgU0lHVVNSMSApOworCSAgICBlbHNlCisJICAgIAlGSVhNRSh3aW4zMiwiaGF2ZSBnb3QgdW5peF9waWQgMFxuIik7CiAgICAgICAgICAgICBpZiAoIS0tbWF4KSBicmVhazsKICAgICAgICAgfQogICAgICAgICBpZiAoZW50cnkgPT0gKndhaXRfcXVldWUpIGJyZWFrOwpAQCAtMzAwLDggKzMwMiw3IEBACiAgICAgfQogCiAgICAgaWYgKGFsZXJ0YWJsZSkKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLAotICAgICAgICAgICAgICAgICAiV2FpdEZvck11bHRpcGxlT2JqZWN0RXg6IGFsZXJ0YWJsZSBub3QgaW1wbGVtZW50ZWRcbiIgKTsKKyAgICAgICAgRklYTUUod2luMzIsICJhbGVydGFibGUgbm90IGltcGxlbWVudGVkXG4iICk7CiAKICAgICBTWVNURU1fTE9DSygpOwogICAgIGlmICghU1lOQ19CdWlsZFdhaXRTdHJ1Y3QoIGNvdW50LCBoYW5kbGVzLCB3YWl0X2FsbCwgd2FpdCApKQpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3N5c2RlcHMuYyBiL3NjaGVkdWxlci9zeXNkZXBzLmMKaW5kZXggYjFhN2M1Ni4uODU5OWM1ZiAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL3N5c2RlcHMuYworKysgYi9zY2hlZHVsZXIvc3lzZGVwcy5jCkBAIC05OSw3ICs5OSw3IEBACiAgICAgICAgICAgICAgICBDTE9ORV9WTSB8IENMT05FX0ZTIHwgQ0xPTkVfRklMRVMgfCBTSUdDSExELCB0aHJlYWQgKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKICNlbHNlCi0gICAgZnByaW50Ziggc3RkZXJyLCAiQ3JlYXRlVGhyZWFkOiBzdHViXG4iICk7CisgICAgRklYTUUodGhyZWFkLCAiQ3JlYXRlVGhyZWFkOiBzdHViXG4iICk7CiAjZW5kaWYgIC8qIF9fbGludXhfXyAqLwogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3RocmVhZC5jIGIvc2NoZWR1bGVyL3RocmVhZC5jCmluZGV4IDVlMDY1ZmYuLmU5ZDI3YjEgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci90aHJlYWQuYworKysgYi9zY2hlZHVsZXIvdGhyZWFkLmMKQEAgLTUsNyArNSw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSAidGhyZWFkLmgiCkBAIC0xNjcsNyArMTY2LDcgQEAKICAgICBpZiAoc3RhY2tfc2l6ZTwxMDI0KjEwMjQpCiAgICAgCXN0YWNrX3NpemUgPSAxMDI0ICogMTAyNDsKICAgICBpZiAoc3RhY2tfc2l6ZSA+PSAxNioxMDI0KjEwMjQpCi0gICAgCWZwcmludGYoc3RkZXJyLCJXYXJuaW5nOlRocmVhZCBzdGFjayBzaXplIGlzICVsZCBNQi5cbiIsc3RhY2tfc2l6ZS8xMDI0LzEwMjQpOworICAgIAlXQVJOKHRocmVhZCwiVGhyZWFkIHN0YWNrIHNpemUgaXMgJWxkIE1CLlxuIixzdGFja19zaXplLzEwMjQvMTAyNCk7CiAgICAgdGhkYi0+c3RhY2tfYmFzZSA9IFZpcnR1YWxBbGxvYyhOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tfc2l6ZSArIChhbGxvY19zdGFjazE2ID8gMHgxMDAwMCA6IDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVNX0NPTU1JVCwgUEFHRV9FWEVDVVRFX1JFQURXUklURSApOwpAQCAtNTY2LDYgKzU2NSwyNCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2V0VGhyZWFkQ29udGV4dCBbS0VSTkVMMzIuNjcwXSAgU2V0cyBjb250ZXh0IG9mIHRocmVhZC4KKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBUUlVFCisgKiAgICBGYWlsdXJlOiBGQUxTRQorICovCitCT09MMzIgV0lOQVBJIFNldFRocmVhZENvbnRleHQoCisgICAgSEFORExFMzIgaGFuZGxlLCAgLyogW2luXSAgSGFuZGxlIHRvIHRocmVhZCB3aXRoIGNvbnRleHQgKi8KKyAgICBDT05URVhUICpjb250ZXh0KSAvKiBbb3V0XSBBZGRyZXNzIG9mIGNvbnRleHQgc3RydWN0dXJlICovCit7CisgICAgVEhEQiAqdGhyZWFkID0gVEhSRUFEX0dldFB0ciggaGFuZGxlLCBUSFJFQURfR0VUX0NPTlRFWFQgKTsKKyAgICBpZiAoIXRocmVhZCkgcmV0dXJuIEZBTFNFOworICAgICpjb250ZXh0ID0gdGhyZWFkLT5jb250ZXh0OworICAgIEszMk9CSl9EZWNDb3VudCggJnRocmVhZC0+aGVhZGVyICk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogR2V0VGhyZWFkQ29udGV4dCBbS0VSTkVMMzIuMjk0XSAgUmV0cmlldmVzIGNvbnRleHQgb2YgdGhyZWFkLgogICoKICAqIFJFVFVSTlMKZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkLmMgYi90b29scy9idWlsZC5jCmluZGV4IDMxOWI2ZTcuLmJjMzYyOTQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2J1aWxkLmMKKysrIGIvdG9vbHMvYnVpbGQuYwpAQCAtOTcxLDcgKzk3MSw3IEBACiBzdGF0aWMgaW50IEJ1aWxkU3BlYzMyRmlsZSggY2hhciAqIHNwZWNmaWxlLCBGSUxFICpvdXRmaWxlICkKIHsKICAgICBPUkRERUYgKm9kcDsKLSAgICBpbnQgaSwgbmJfbmFtZXMsIG5iX3JlZ19mdW5jcyA9IDA7CisgICAgaW50IGksIG5iX25hbWVzOwogCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIi8qIEZpbGUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSAlczsgZG8gbm90IGVkaXQhICovXG5cbiIsCiAgICAgICAgICAgICAgc3BlY2ZpbGUgKTsKQEAgLTk4OCw2ICs5ODgsMjUgQEAKICAgICAgICAgICAgICAgICAgaSwgRExMTmFtZSwgaSApOwogICAgIH0KIAorICAgIC8qIE91dHB1dCBjb2RlIGZvciBhbGwgcmVnaXN0ZXIgZnVuY3Rpb25zICovCisKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiI2lmZGVmIF9faTM4Nl9fXG4iICk7CisgICAgZm9yIChpID0gQmFzZSwgb2RwID0gT3JkaW5hbERlZmluaXRpb25zICsgQmFzZTsgaSA8PSBMaW1pdDsgaSsrLCBvZHArKykKKyAgICB7CisgICAgICAgIGlmIChvZHAtPnR5cGUgIT0gVFlQRV9SRUdJU1RFUikgY29udGludWU7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsCisgICAgICAgICAgICAgICAgICJfX2FzbV9fKFwiLmFsaWduIDRcXG5cXHRcIlxuIgorICAgICAgICAgICAgICAgICAiICAgICAgICBcIi5nbG9ibCAiIFBSRUZJWCAiJXNcXG5cXHRcIlxuIgorICAgICAgICAgICAgICAgICAiICAgICAgICBcIi50eXBlICIgUFJFRklYICIlcyxAZnVuY3Rpb25cXG5cXHRcIlxuIgorICAgICAgICAgICAgICAgICAiICAgICAgICBcIiVzOlxcblxcdFwiXG4iCisgICAgICAgICAgICAgICAgICIgICAgICAgIFwicHVzaGwgJCIgUFJFRklYICJfX3JlZ3NfJXNcXG5cXHRcIlxuIgorICAgICAgICAgICAgICAgICAiICAgICAgICBcInB1c2hsICQiIFBSRUZJWCAiQ0FMTDMyX1JlZ3NcXG5cXHRcIlxuIgorICAgICAgICAgICAgICAgICAiICAgICAgICBcInJldFwiKTtcbiIsCisgICAgICAgICAgICAgICAgIG9kcC0+dS5mdW5jLmxpbmtfbmFtZSwgb2RwLT51LmZ1bmMubGlua19uYW1lLAorICAgICAgICAgICAgICAgICBvZHAtPnUuZnVuYy5saW5rX25hbWUsIG9kcC0+dS5mdW5jLmxpbmtfbmFtZSApOworICAgIH0KKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiI2VuZGlmXG4iICk7CisKICAgICAvKiBPdXRwdXQgdGhlIERMTCBmdW5jdGlvbnMgcHJvdG90eXBlcyAqLwogCiAgICAgZm9yIChpID0gQmFzZSwgb2RwID0gT3JkaW5hbERlZmluaXRpb25zICsgQmFzZTsgaSA8PSBMaW1pdDsgaSsrLCBvZHArKykKQEAgLTExMDYsNyArMTEyNSw2IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUWVBFX1JFR0lTVEVSOgogICAgICAgICAgICAgYXJncyA9IDB4ZmU7Ci0gICAgICAgICAgICBuYl9yZWdfZnVuY3MrKzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYXJncyA9IDB4ZmY7CkBAIC0xMTI1LDcgKzExNDMsNiBAQAogICAgIGZwcmludGYoIG91dGZpbGUsICIgICAgJWQsXG4iLCBCYXNlICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIiAgICAlZCxcbiIsIExpbWl0IC0gQmFzZSArIDEgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiICAgICVkLFxuIiwgbmJfbmFtZXMgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiICAgICVkLFxuIiwgbmJfcmVnX2Z1bmNzICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwKICAgICAgICAgICAgICAiICAgIEZ1bmN0aW9ucyxcbiIKICAgICAgICAgICAgICAiICAgIEZ1bmNOYW1lcyxcbiIKZGlmZiAtLWdpdCBhL3Rvb2xzL21ha2VkZXAuYyBiL3Rvb2xzL21ha2VkZXAuYwppbmRleCAxMWY3N2QzLi5jNDVlYjBjIDEwMDY0NAotLS0gYS90b29scy9tYWtlZGVwLmMKKysrIGIvdG9vbHMvbWFrZWRlcC5jCkBAIC0yNzksNyArMjc5LDcgQEAKICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCggZXh0LCAiLnJjIiApKSAgLyogcmVzb3VyY2UgZmlsZSAqLwogICAgICAgICB7CiAgICAgICAgICAgICAqZXh0ID0gJ1wwJzsKLSAgICAgICAgICAgIGZwcmludGYoIGZpbGUsICIlcy5jICVzLmg6ICVzIiwgb2JqLCBvYmosIHBGaWxlLT5maWxlbmFtZSApOworICAgICAgICAgICAgZnByaW50ZiggZmlsZSwgIiVzLnM6ICVzIiwgb2JqLCBwRmlsZS0+ZmlsZW5hbWUgKTsKICAgICAgICAgICAgICpjb2x1bW4gKz0gMiAqIHN0cmxlbihvYmopICsgc3RybGVuKHBGaWxlLT5maWxlbmFtZSkgKyA3OwogICAgICAgICB9CiAgICAgICAgIGVsc2UKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3RydW4gYi90b29scy90ZXN0cnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5OWUxMzQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0cnVuCkBAIC0wLDAgKzEsMjc0IEBACisjIS91c3IvYmluL3BlcmwKKyMgQ29weXJpZ2h0IDE5OTYtMTk5OCBNYXJjdXMgTWVpc3NuZXIKKyMgSVBDIHJlbW92ZSBjb2RlIENvcHlyaWdodCAxOTk1IE1pY2hhZWwgVmVrc2xlcgorIworIyBUaGlzIHBlcmwgc2NyaXB0IGF1dG9tYXRpY2FsbHkgdGVzdCBydW5zIEFMTCB3aW5kb3dzIC5leGUgYW5kIC5zY3IgYmluYXJpZXMKKyMgaXQgZmluZHMgKGFuZCBjYW4gYWNjZXNzKSBvbiB5b3VyIGNvbXB1dGVyLiBJdCBjcmVhdGVzIGEgc3ViZGlyZWN0b3J5IGNhbGxlZAorIyBydW5zLyBhbmQgc3RvcmVzIHRoZSBvdXRwdXQgdGhlcmUuIEl0IGFsc28gZG9lcyAodW5pcXVlKSBkaWZmcyBiZXR3ZWVuIHJ1bnMuCisjCisjIEl0IG9ubHkgcmVydW5zIHRoZSB0ZXN0IGlmIENoYW5nZUxvZyBvciB0aGUgZXhlY3V0ZWFibGUgaXMgTkVXRVIgdGhhbiB0aGUKKyMgcnVuIGZpbGUuIChJZiB5b3Ugd2FudCB0byByZXJ1biBldmVyeXRoaW5nIGluYmV0d2VlbiByZWxlYXNlcywgdG91Y2gKKyMgQ2hhbmdlTG9nLikKKworIworIyBCRUdJTiBPRiBVU0VSIENPTkZJR1VSQVRJT04KKyMKKyMgUGF0aCB0byBXSU5FIGV4ZWN1dGVhYmxlLiBJZiBub3Qgc3BlY2lmaWVkLCAnd2luZScgaXMgc2VhcmNoZWQgaW4gdGhlIHBhdGguCisjCiskd2luZSA9ICd3aW5lJzsKKyMKKyMgV0lORSBvcHRpb25zLiAtbWFuYWdlZCB3aGVuIHVzaW5nIGEgd2luZG93bWFuYWdlciBpcyBwcm9iYWJseSBub3QgZ29vZCBpbgorIyBhdXRvbWF0aWMgdGVzdHJ1bnMuCisjCiskd2luZW9wdGlvbnM9Jyc7CisjCisjIFBhdGggdG8gV0lORSBDaGFuZ2VMb2cuIFVzZWQgYXMgdGltZXN0YW1wIGZvciBuZXcgcmVsZWFzZXMuLi4KKyMKKyRjaGFuZ2Vsb2cgPSAnL2hvbWUvbWFyY3VzL3dpbmUvQ2hhbmdlTG9nJzsKKyMgCisjIEhvdyBsb25nIGJlZm9yZSBhdXRvbWF0aWNhbGx5IGtpbGxpbmcgYWxsIHN1YnByb2Nlc3NlcworIyAzMCBpcyBnb29kIGZvciBhdXRvbWF0aWMgdGVzdGluZywgMzAwIG9yIG1vcmUgZm9yIGludGVyYWN0aXZlIHRlc3RpbmcuCisjCiskd2FpdHRpbWUgPSAzMDsKKyMKKyNkaWZmIGNvbW1hbmQKKyMKKyRkaWZmPSdkaWZmIC11JzsKKyMKKyMgdHJ1bmNhdGUgYXQgaG93LW11Y2gtbGluZXMKKyMKKyR0cnVuY2xpbmVzPTIwMDsKKyMKKyQ8fHxkaWUgIlJ1bm5pbmcgdGhpcyBzY3JpcHQgdW5kZXIgVUlEIDAgaXMgYSBncmVhdCBzZWN1cml0eSByaXNrIChhbmQgcmlzayBmb3IgZXhpc3Rpbmcgd2luZG93cyBpbnN0YWxsYXRpb25zIG9uIG1vdW50ZWQgRE9TL1c5NSBwYXJ0aXRpb25zKS4gSWYgeW91IHJlYWxseSB3YW50IHRvLCBjb21tZW50IG91dCB0aGlzIGxpbmUuXG4iOworIworIyBFTkQgT0YgVVNFUiBDT05GSUdVUkFUSU9OCisjCisKK2lmICghIC1kICJydW5zIikgeyBkaWUgIm5vIHN1YmRpcmVjdG9yeSBydW5zLyBmb3VuZCBpbiAkY3dkLiBQbGVhc2UgY3JlYXRlIG9uZSBmaXJzdCFcbiI7fQorCisjIGxvb2sgZm9yIHRoZSBleGFjdCBwYXRoIHRvIHdpbmUgZXhlY3V0ZWFibGUgaW4gY2FzZSB3ZSBuZWVkIGl0IGZvciBhIAorIyByZXBsYWNlbWVudCBjaGFuZ2Vsb2cuCitpZiAoISAoJHdpbmUgPX4gL1wvLykpIHsgIyBubyBwYXRoIHNwZWNpZmllZC4gTG9vayBpdCB1cC4KKwlAcGF0aHMgPSBzcGxpdCgvOi8sJEVOVnsnUEFUSCd9KTsKKwlmb3JlYWNoICRwYXRoIChAcGF0aHMpIHsKKwkJaWYgKC1lICIkcGF0aC8kd2luZSIgJiYgLXggIiRwYXRoLyR3aW5lIikgeworCQkJJHdpbmUgPSAiJHBhdGgvJHdpbmUiOworCQkJbGFzdDsKKwkJfQorCX0KK30KKworIyBpZiB3ZSBkb24ndCBoYXZlIGEgY2hhbmdlbG9nIHVzZSB0aGUgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlIFdJTkUgZXhlY3V0ZWFibGUKK2lmICghIC1lICRjaGFuZ2Vsb2cpIHsKKwkkY2hhbmdlbG9nID0gJHdpbmU7Cit9CisKKyMgc2FuaXR5IGNoZWNrIHNvIHdlIGp1c3QgZmlsbCBydW5zLyB3aXRoIGVycm9ycy4KKygteCAkd2luZSkgIHx8IGRpZSAibm8gJHdpbmUgZXhlY3V0YWJsZSBmb3VuZCFcbiI7CisjIGRpdG8uIHdpbGwgcHJpbnQgdXNhZ2UKK3N5c3RlbSgiJHdpbmUgLWggPi9kZXYvbnVsbCIpfHxkaWUgIndpbmUgY2FsbCBmYWlsZWQ6JCFcbiI7CisKK3ByaW50ICJVc2luZyAkd2luZSBhcyBXSU5FIGV4ZWN1dGVhYmxlLlxuIjsKK3ByaW50ICJVc2luZyAkY2hhbmdlbG9nIGFzIHRlc3RydW4gdGltZXJlZmVyZW5jZS5cbiI7CisKK2Nob21wKCRjd2QgPSBgcHdkYCk7CisKKyMgRmluZCBvdXQgYWxsIHByZXNlbnQgc2VtYXBob3JlcyBzbyB3ZSBkb24ndCByZW1vdmUgdGhlbSBsYXRlci4KKyRJUENfUk1JRD0wOworJFVTRVI9JEVOVnsnVVNFUid9Oworb3BlbihJUENTLCJpcGNzfCIpOword2hpbGUoPElQQ1M+KSB7CisgICAgc3BsaXQ7CisgICAgIyB0cnkgdG8gZmluZCBvdXQgdGhlIElQQy1JRCwgYXNzdW1lIGl0IGlzIHRoZSBmaXJzdCBudW1iZXIuCisgICAgZm9yZWFjaCAoQF8pIHsKKwkkXyBuZSBpbnQoJF8pICYmIG5leHQ7CSMgbm90IGEgZGVjaW1hbCBudW1iZXIKKwkkbnVtPSRfOworCWxhc3Q7CisgICAgfQorICAgIGlmICgvc2VtL2kgLi4gL15ccyokLyApIHsKKwlpbmRleCgkXywkVVNFUik+PTAgfHwgbmV4dDsKKwkkc2VtX3VzZWR7JG51bX09MTsKKwlwcmludCAiZm91bmQgJG51bVxuIjsKKyAgICB9Cit9CitjbG9zZShJUENTKTsKKworc3ViIGtpbGxfc3VicHJvY2Vzc2VzIHsKKwlsb2NhbCgka2lsbGVkYWxyZWFkeSwlcGFyZW50b2YsJWtpZHMsJGNoYW5nZWQsJWNtZGxpbmUpOworCisJIyBGSVhNRTogTGludXggcHMgZGVwZW5kZW5kLi4uCisJIworCW9wZW4oUFNBVVgsInBzIC0tZm9ybWF0IHBpZCxwcGlkLGNvbW18Iik7CisJIyBsb29rdXAgYWxsIHByb2Nlc3NlcywgcmVtZW1iZXIgdGhlaXIgcGFyZW50cyBhbmQgY21kbGluZXMuCisJJXBhcmVudG9mPSgpOworCXdoaWxlICg8UFNBVVg+KSB7CisJCWlmICgvXHMqKFxkKilccyooXGQqKVxzKihcUyopLykgeworCQkJJHBhcmVudG9meyQxfT0kMjsKKwkJCSRjbWRsaW5leyQxfT0kMzsKKwkJfQorCX0KKwljbG9zZShQU0FVWCk7CisKKwkjIGZpbmQgb3V0IGFsbCBraWRzIG9mIHRoaXMgcGVybHNjcmlwdAorCSVraWRzID0gKCk7CisJJGtpZHN7JCR9ID0gMTsKKwkkY2hhbmdlZCA9IDE7CisJd2hpbGUgKCRjaGFuZ2VkKSB7CisJCSRjaGFuZ2VkID0gMDsKKwkJZm9yZWFjaCAoa2V5cyAlcGFyZW50b2YpIHsKKwkJCW5leHQgaWYgKCRraWRzeyRffSk7CisJCQlpZiAoJGtpZHN7JHBhcmVudG9meyRffX0pIHsKKwkJCQkkY2hhbmdlZCA9IDE7CisJCQkJJGtpZHN7JF99PTE7CisJCQl9CisJCX0KKwl9CisJIyAuLiBidXQgZG8gbm90IGNvbnNpZGVyIHVzIGZvciBraWxsaW5nCisJZGVsZXRlICRraWRzeyQkfTsKKwkjIHJlbW92ZSBhbGwgcHJvY2Vzc2VzIGtpbGxlZCBpbiB0aGUgbWVhbnRpbWUgZnJvbSAla2lsbGVkYWxyZWFkeS4KKwlmb3JlYWNoICRwaWQgKGtleXMgJWtpbGxlZGFscmVhZHkpIHsKKwkJZGVsZXRlICRraWxsZWRhbHJlYWR5eyRwaWR9IGlmICghJGtpZHN7JHBpZH0gKTsKKwl9CisJIyBraWxsIGFsbCBzdWJwcm9jZXNzZXMgY2FsbGVkICd3aW5lJy4gRG8gbm90IGtpbGwgZmluZCwgZGlmZiwgc2gKKwkjIGFuZCBmcmllbmRzLCB3aGljaCBhcmUgYWxzbyBzdWJwcm9jZXNzZXMgb2YgdXMuCisJZm9yZWFjaCAoa2V5cyAla2lkcykgeworCQluZXh0IHVubGVzcyAoJGNtZGxpbmV7JF99ID1+IC93aW5lLyk7CisJCSMgaWYgd2UgaGF2ZSBhbHJlYWR5IGtpbGxlZCBpdCB1c2luZyAtVEVSTSwgdXNlIC1LSUxMCisJCWlmICgka2lsbGVkYWxyZWFkeXskX30pIHsKKwkJCWtpbGwoOSwkXyk7CSMgRklYTUU6IHVzZSBjb3JyZWN0IG51bWJlcj8KKwkJfSBlbHNlIHsKKwkJCWtpbGwoMTUsJF8pOwkjIEZJWE1FOiB1c2UgY29ycmVjdCBudW1iZXI/CisJCX0KKwkJJGtpbGxlZGFscmVhZHl7JF99PTE7CisJfQorCWFsYXJtKCR3YWl0dGltZSk7CQkjIHdhaXQgYWdhaW4uLi4KK307CisKKyMgYm9ycm93ZWQgZnJvbSB0b29scy9pcGNsLiBTZWUgY29tbWVudHMgdGhlcmUuCisjIGtpbGxpbmcgd2luZSBzdWJwcm9jZXNzZXMgdW5sdWNraWx5IGxlYXZlcyBhbGwgb2YgdGhlaXIgSVBDIHN0dWZmIGx5aW5nCisjIGFyb3VuZC4gV2UgaGF2ZSB0byB3aXBlIGl0IG9yIHdlIHJ1biBvdXQgb2YgaXQuCitzdWIgY2xlYW51cF93aW5lX2lwYyB7CisJb3BlbihJUENTLCJpcGNzfCIpOworCXdoaWxlKDxJUENTPikgeworCSAgICBzcGxpdDsKKwkgICAgIyB0cnkgdG8gZmluZCBvdXQgdGhlIElQQy1JRCwgYXNzdW1lIGl0IGlzIHRoZSBmaXJzdCBudW1iZXIuCisJICAgIGZvcmVhY2ggKEBfKSB7CisJCSRfIG5lIGludCgkXykgJiYgbmV4dDsJIyBub3QgYSBkZWNpbWFsIG51bWJlcgorCQkkbnVtPSRfOworCQlsYXN0OworCSAgICB9CisJICAgICMgd2FzIHRoZXJlIGJlZm9yZSBzdGFydCBvZiB0aGlzIHNjcmlwdCwgc2tpcCBpdC4KKwkgICAgIworCSAgICAjIEZJWE1FOiB0aGlzIGRvZXNuJ3Qgd29yayBmb3IgcHJvZ3JhbXMgc3RhcnRlZCBkdXJpbmcgdGhlIHRlc3RydW4uCisJICAgICMKKwkgICAgaWYgKC9zZW0vaSAuLiAvXlxzKiQvICkgeworCQlpbmRleCgkXywkVVNFUik+PTAgfHwgbmV4dDsKKwkJcHVzaChAc2VtLCRudW0pOworCSAgICB9CisJfQorCWZvcmVhY2ggKEBzZW0pIHsKKwkgICAgJHNlbV91c2VkeyRffSAmJiBuZXh0OworCSAgICBzZW1jdGwoJF8sIDAsICRJUENfUk1JRCwwKTsKKwl9CisJY2xvc2UoSVBDUyk7Cit9CisKKyMga2lsbCBhbGwgc3Vid2luZXByb2Nlc3NlcyBmb3IgYXV0b21hdGljIHJ1bnMuCitzdWIgYWxhcm1oYW5kbGVyIHsKKwlwcmludCAidGltZXIgdHJpZ2dlcmVkLlxuIjsKKwkma2lsbF9zdWJwcm9jZXNzZXM7Cit9CisKKyRTSUd7J0FMUk0nfSA9ICJhbGFybWhhbmRsZXIiOworCisjIE5PVEU6IGZvbGxvd2luZyBmaW5kIHdpbGwgYWxzbyBjcm9zcyBORlMgbW91bnRzLCBzbyBiZSBzdXJlIHRvIGhhdmUgbm90aGluZworIyBtb3VudGVkIHRoYXQncyBub3Qgb24gY2FtcHVzIG9yIGFkZCByZWxldmFudCAhIC1mc3R5cGUgbmZzIG9yIHNpbWlsYXIuCisjCisKK29wZW4oRklORCwiZmluZCAvIC10eXBlIGYgIFxcKCAtbmFtZSBcIiouRVhFXCIgLW8gLW5hbWUgXCIqLmV4ZVwiIC1vIC1uYW1lIFwiKi5zY3JcIiAtbyAtbmFtZSBcIiouU0NSXCIgXFwpIC1wcmludHwiKTsKK3doaWxlICgkZXhlPTxGSU5EPikgeworCWNob3AoJGV4ZSk7CisKKwkjIFRoaXMgY291bGQgY2hhbmdlIGR1cmluZyBhIHRlc3RydW4gKGJ5IGRvaW5nICdtYWtlJyBmb3IgaW5zdGFuY2UpCisJIyBGSVhNRTogZG9lc24ndCBoYW5kbGUgbWlzc2luZyBsaWJ3aW5lLnNvIGR1cmluZyBjb21waWxlLi4uCisJKC14ICR3aW5lKSAgfHwgZGllICJubyAkd2luZSBleGVjdXRhYmxlIGZvdW5kIVxuIjsKKworCSMgU2tpcCBhbGwgbXNzZXR1cCwgYWNtc2V0dXAgLCBpbnN0YWxsc2hpZWxkIHdoYXRldmVyIGV4ZXMuIAorCSMgdGhleSBzZWVtIHRvIHdvcmssIG1vc3RseSBhbmQgc3RhcnRpbmcgdGhlbSBpcyBqdXN0IGFubm95aW5nLgorCW5leHQgaWYgKCRleGUgPX4gL2FjbXNldHVwLyk7CisJbmV4dCBpZiAoJGV4ZSA9fiAvdW53aXNlLyk7CisJbmV4dCBpZiAoJGV4ZSA9fiAvdGVzdGV4aXQvKTsKKwluZXh0IGlmICgkZXhlID1+IC9fbXNzZXQvKTsKKwluZXh0IGlmICgkZXhlID1+IC9pc3VuL2kpOworCW5leHQgaWYgKCRleGUgPX4gL3N0NHUvKTsKKwluZXh0IGlmICgkZXhlID1+IC9zdDV1Lyk7CisJbmV4dCBpZiAoJGV4ZSA9fiAvX21zdGVzdC8pOworCW5leHQgaWYgKCRleGUgPX4gL19pc2RlbC8pOworCW5leHQgaWYgKCRleGUgPX4gL21zLXNldHVwLyk7CisJbmV4dCBpZiAoJGV4ZSA9fiAvfm1zcy8pOworCW5leHQgaWYgKCRleGUgPX4gL3VuaW4vKTsKKworCSRydW5maWxlID0gJGV4ZTsKKwkkcnVuZmlsZSA9fiBzL1tcLyBdL18vZzsKKwkkcnVuZmlsZSA9fiBzL1wuZXhlJC8vZzsKKwkkcnVuZmlsZSA9fiBzL1wuc2NyJC8vaWc7CisJJGZsYWc9MDsKKwkjCisJIyBDaGVjayBpZiBjaGFuZ2Vsb2cgaXMgbmV3ZXIsIGlmIG5vdCwgY29udGludWUKKwkjCisJaWYgKAktZSAicnVucy8ke3J1bmZpbGV9Lm91dCIgJiYgCisJCSgtTSAkY2hhbmdlbG9nID4gLU0gInJ1bnMvJHtydW5maWxlfS5vdXQiKSAmJiAKKwkJKC1NICRleGUgPiAtTSAicnVucy8ke3J1bmZpbGV9Lm91dCIpCisJKSB7CisJCSNwcmludCAic2tpcHBpbmcgJGV4ZSwgYWxyZWFkeSBkb25lLlxuIjsKKwkJbmV4dDsKKwl9CisKKwkjIGNoZWNrIHJ1bmZpbGUgaWYgdGhlIGV4ZSBpcyBhIERPUyBleGVjdXRlYWJsZSBvciAKKwkjIG9mIGRpZmZlcmVudCBhcmNoaXRlY3R1cmUgKHdpbjMyKQorCWlmIChvcGVuKFJVTkZJTEUsInJ1bnMvJHJ1bmZpbGUub3V0IikpIHsKKwkJd2hpbGUgKCR4cnVuPTxSVU5GSUxFPikgeworCQkJY2hvcCgkeHJ1bik7CisJCQlpZiAoJHhydW49fiAvTG9hZE1vZHVsZTouKmVycm9yPTExJC8pIHsKKwkJCQkkZmxhZz0xOworCQkJCWxhc3Q7CisJCQl9CisJCQlpZiAoJHhydW49fiAvTG9hZE1vZHVsZTouKmVycm9yPTIxJC8pIHsKKwkJCQkkZmxhZz0yOworCQkJCWxhc3Q7CisJCQl9CisJCX0KKwkJY2xvc2UoUlVORklMRSk7CisJCWlmICgkZmxhZz09MSkgeworCQkJI3ByaW50ICJza2lwcGluZyAkZXhlLCBzZWVtcyB0byBiZSBhIERPUyBleGVjdXRhYmxlLlxuIjsKKwkJCW5leHQ7CisJCX0KKwkJaWYgKCRmbGFnPT0yKSB7CisJCQkjcHJpbnQgInNraXBwaW5nICRleGUsIHNlZW1zIHRvIGJlIGEgbm9uIGkzODYgZXhlY3V0YWJsZS5cbiI7CisJCQluZXh0OworCQl9CisJfQorCSMgbm93IHRlc3RydW4uLi4KKwlwcmludCAiJGV4ZTpcbiI7CisJJGRpciA9ICRleGU7CisJJGRpciA9fiBzL14oLiopXC9bXlwvXSokLyQxLzsgI2N1dCBvZiB0aGUgYmFzZW5hbWUuCisKKwlhbGFybSgkd2FpdHRpbWUpOworCisJY2hkaXIoJGRpcil8fGRpZSAiJGRpcjokISI7CisJaWYgKCRleGUgPX4gL1wuc2NyL2kpIHsKKwkJc3lzdGVtKCJlY2hvIHF1aXR8JHdpbmUgJHdpbmVvcHRpb25zIFwiJGV4ZSAvc1wiID4kY3dkLyR7cnVuZmlsZX0ub3V0IDI+JjEiKTsKKwl9IGVsc2UgeworCQlzeXN0ZW0oImVjaG8gcXVpdHwkd2luZSAkd2luZW9wdGlvbnMgXCIkZXhlXCIgPiRjd2QvJHtydW5maWxlfS5vdXQgMj4mMSIpOworCX0KKwlhbGFybSgxMDAwKTsjIHNvIGl0IGRvZXNuJ3QgdHJpZ2dlciBpbiB0aGUgZGlmZiwga2lsbCBvciBmaW5kLgorCisJc3lzdGVtKCJ0b3VjaCAkY3dkL3J1bnMvJHtydW5maWxlfS5vdXQiKTsKKwlzeXN0ZW0oIiRkaWZmICRjd2QvcnVucy8ke3J1bmZpbGV9Lm91dCAkY3dkLyR7cnVuZmlsZX0ub3V0Iik7CisJc3lzdGVtKCJoZWFkIC0kdHJ1bmNsaW5lcyAkY3dkLyR7cnVuZmlsZX0ub3V0ID4kY3dkL3J1bnMvJHtydW5maWxlfS5vdXQiKTsKKwl1bmxpbmsoIiRjd2QvJHtydW5maWxlfS5vdXQiKTsKKwkma2lsbF9zdWJwcm9jZXNzZXM7CisJJmNsZWFudXBfd2luZV9pcGM7CisJY2hkaXIoJGN3ZCk7Cit9CitjbG9zZShGSU5EKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3VuaW1hcC5wbCBiL3Rvb2xzL3VuaW1hcC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjMyODJmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdW5pbWFwLnBsCkBAIC0wLDAgKzEsMTIxIEBACisjIS91c3IvYmluL3BlcmwKKyMKKyMgUmVhZHMgdGhlIFVuaWNvZGUgMi4wICJ1bmlkYXRhMi50eHQiIGZpbGUgYW5kIHNlbGVjdHMgZW5jb2RpbmdzCisjIGZvciBjYXNlIHBhaXJzLCB0aGVuIGJ1aWxkcyBhbiBpbmNsdWRlIGZpbGUgImNhc2VtYXAuaCIgZm9yIHRoZQorIyBjYXNlIGNvbnZlcnNpb24gcm91dGluZXMuIAorCit1c2UgaW50ZWdlcgorCiskSU5GSUxFCT0gInVuaWRhdGEyLnR4dCI7CiskT1VUCT0gIj5jYXNlbWFwLmgiOworJFRFU1QJPSAiPmFsbGNvZGVzIjsKKworIyBPcGVuIHRoZSBkYXRhIGZpbGUgLi4uCitvcGVuIElORklMRQlvciBkaWUgIkNhbid0IG9wZW4gaW5wdXQgZmlsZSAkSU5GSUxFIVxuIjsKK29wZW4gT1VUCW9yIGRpZSAiQ2FuJ3Qgb3BlbiBvdXRwdXQgZmlsZSAkT1VUIVxuIjsKK29wZW4gVEVTVAlvciBkaWUgIkNhbid0IG9wZW4gb3V0cHV0IGZpbGUgJE9VVCFcbiI7CisKKyNJbml0aWFsaXplIHRoZSB1cHBlciBhbmQgbG93ZXIgaGFzaGVzCislbHdydGFibGUgPSAoKTsKKyV1cHJ0YWJsZSA9ICgpOworQGxvdyA9ICgiMCIpIHggMjU2OworQHVwciA9ICgiMCIpIHggMjU2OworCit3aGlsZSAoJGxpbmUgPSA8SU5GSUxFPiApCit7CisJIyBEZWNvZGUgdGhlIGZpZWxkcyAuLi4KKwkoJGNvZGUsICRuYW1lLCAkY2F0LCAkY29tYiwgJGJpZGksIAorCSAkZGVjb21wLCAkZGVjLCAkZGlnLCAkbnVtLCAkbWlycm9yLCAKKwkgJG9sZG5hbWUsICRjb21tZW50LCAkdXBwZXIsICRsb3dlciwgJHRpdGxlKSA9IHNwbGl0IC87LywgJGxpbmU7CisKKwkjR2V0IHRoZSBoaWdoIGJ5dGUgb2YgdGhlIGNvZGUKKwkkaGlnaCA9IHN1YnN0ciAkY29kZSwgMCwgMjsKKwlpZiAoJGxvd2VyIG5lICIiKSB7CisJCSRsb3dbaGV4ICRoaWdoXSA9ICJsYmxrIiAuICRoaWdoOworCQkkbHdydGFibGV7JGNvZGV9ID0gJGxvd2VyOworCX0KKwlpZiAoJHVwcGVyIG5lICIiKSB7CisJCSR1cHJbaGV4ICRoaWdoXSA9ICJ1YmxrIiAuICRoaWdoOworCQkkdXBydGFibGV7JGNvZGV9ID0gJHVwcGVyOworCX0KKwkjV3JpdGUgZXZlcnl0aGluZyB0byB0aGUgdGVzdCBmaWxlCisJcHJpbnRmIFRFU1QgIiVzICVzICVzXG4iLCAkY29kZSwgCisJCSR1cHBlciBuZSAiIiA/ICR1cHBlciA6ICIwMDAwIiwKKwkJJGxvd2VyIG5lICIiID8gJGxvd2VyIDogIjAwMDAiOworCit9CitjbG9zZShGSUxFKTsKK2Nsb3NlIFRFU1Q7CisKKyNHZW5lcmF0ZSB0aGUgaGVhZGVyIGZpbGUKK3ByaW50IE9VVCAiLypcbiI7CitwcmludCBPVVQgIiAqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGUgLS0gZG8gbm90IGVkaXQhXG4iOworcHJpbnQgT1VUICIgKiAoVXNlIHRvb2xzL3VuaW1hcC5wbCBmb3IgZ2VuZXJhdGlvbilcbiI7CitwcmludCBPVVQgIiAqXG4iOworcHJpbnQgT1VUICIgKiBNYXBwaW5nIHRhYmxlcyBmb3IgVW5pY29kZSBjYXNlIGNvbnZlcnNpb25cbiI7CitwcmludCBPVVQgIiAqL1xuXG4iOworCisjV3JpdGUgb3V0IHRoZSBub24tdHJpdmlhbCBtYXBwaW5ncworZm9yICgkaGlnaCA9IDA7ICRoaWdoIDwgMjU2OyAkaGlnaCsrKSB7CisJI0NoZWNrIHdoZXRoZXIgdGhlIHRhYmxlIGlzIG5lZWRlZAorCWlmIChsZW5ndGggJGxvd1skaGlnaF0gPCA2KSB7CisJCW5leHQ7CisJfQorCXByaW50ZiBPVVQgIi8qIExvd2VyY2FzZSBtYXBwaW5ncyAlMDJYMDAgLSAlMDJYRkYgKi9cbiIsCisJCSRoaWdoLCAkaGlnaDsKKwlwcmludGYgT1VUICJzdGF0aWMgY29uc3QgV0NIQVIgbGJsayUwMlhbMjU2XSA9IHtcbiIsICRoaWdoOworCWZvciAoJGxvdyA9IDA7ICRsb3cgPCAyNTY7ICRsb3cgKz0gOCkgeworCQlAcGF0Y2ggPSAoKTsKKwkJZm9yICgkaSA9IDA7ICRpIDwgODsgJGkrKykgeworCQkJJGNvZGUgPSBzcHJpbnRmICIlMDJYJTAyWCIsICRoaWdoLCAkbG93ICsgJGk7CisJCQkkbWFwID0gJGx3cnRhYmxleyRjb2RlfTsKKwkJCWlmICgkbWFwIGVxICIiKSB7CisJCQkJJG1hcCA9ICRjb2RlOworCQkJfQorCQkJJHBhdGNoWyRpXSA9ICIweCIgLiAkbWFwOworCQl9CisJCXByaW50ZiBPVVQgIlx0JXMsICVzLCAlcywgJXMsICVzLCAlcywgJXMsICVzLFxuIiwKKwkJCUBwYXRjaDsKKwl9CisJcHJpbnQgT1VUICJ9O1xuXG4iOworfQorcHJpbnQgT1VUICJzdGF0aWMgY29uc3QgV0NIQVIgKiBjb25zdCBsd3J0YWJsZVsyNTZdID0ge1xuIjsKK2ZvciAoJGkgPSAwOyAkaSA8IDI1NjsgJGkgKz0gOCkgeworCUBwYXRjaCA9IEBsb3dbJGkrMCAuLiAkaSs3XTsKKwlwcmludGYgT1VUICJcdCUwNnMsICUwNnMsICUwNnMsICUwNnMsICUwNnMsICUwNnMsICUwNnMsICUwNnMsXG4iLAorCQlAcGF0Y2g7Cit9CitwcmludCBPVVQgIn07XG5cbiI7CisKK2ZvciAoJGhpZ2ggPSAwOyAkaGlnaCA8IDI1NjsgJGhpZ2grKykgeworCSNDaGVjayB3aGV0aGVyIHRoZSB0YWJsZSBpcyBuZWVkZWQKKwlpZiAobGVuZ3RoICR1cHJbJGhpZ2hdIDwgNikgeworCQluZXh0OworCX0KKwlwcmludGYgT1VUICIvKiBVcHBlcmNhc2UgbWFwcGluZ3MgJTAyWDAwIC0gJTAyWEZGICovXG4iLAorCQkkaGlnaCwgJGhpZ2g7CisJcHJpbnRmIE9VVCAic3RhdGljIGNvbnN0IFdDSEFSIHVibGslMDJYWzI1Nl0gPSB7XG4iLCAkaGlnaDsKKwlmb3IgKCRsb3cgPSAwOyAkbG93IDwgMjU2OyAkbG93ICs9IDgpIHsKKwkJQHBhdGNoID0gKCk7CisJCWZvciAoJGkgPSAwOyAkaSA8IDg7ICRpKyspIHsKKwkJCSRjb2RlID0gc3ByaW50ZiAiJTAyWCUwMlgiLCAkaGlnaCwgJGxvdyArICRpOworCQkJJG1hcCA9ICR1cHJ0YWJsZXskY29kZX07CisJCQlpZiAoJG1hcCBlcSAiIikgeworCQkJCSRtYXAgPSAkY29kZTsKKwkJCX0KKwkJCSRwYXRjaFskaV0gPSAiMHgiIC4gJG1hcDsKKwkJfQorCQlwcmludGYgT1VUICJcdCVzLCAlcywgJXMsICVzLCAlcywgJXMsICVzLCAlcyxcbiIsCisJCQlAcGF0Y2g7CisJfQorCXByaW50IE9VVCAifTtcblxuIjsKK30KK3ByaW50IE9VVCAic3RhdGljIGNvbnN0IFdDSEFSICogY29uc3QgdXBydGFibGVbMjU2XSA9IHtcbiI7Citmb3IgKCRpID0gMDsgJGkgPCAyNTY7ICRpICs9IDgpIHsKKwlAcGF0Y2ggPSBAdXByWyRpKzAgLi4gJGkrN107CisJcHJpbnRmIE9VVCAiXHQlMDZzLCAlMDZzLCAlMDZzLCAlMDZzLCAlMDZzLCAlMDZzLCAlMDZzLCAlMDZzLFxuIiwKKwkJQHBhdGNoOworfQorcHJpbnQgT1VUICJ9O1xuXG4iOworCitjbG9zZShPVVQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvd3JjL01ha2VmaWxlLmluIGIvdG9vbHMvd3JjL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZWFlNjMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy93cmMvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw0MSBAQAorREVGUyAgICAgID0gLURfX1dJTkVfXworVE9QU1JDRElSID0gQHRvcF9zcmNkaXJACitUT1BPQkpESVIgPSAuLi8uLgorU1JDRElSICAgID0gQHNyY2RpckAKK1ZQQVRIICAgICA9IEBzcmNkaXJACisKK1BST0dSQU1TID0gd3JjQFBST0dFWFRACitNT0RVTEUgICA9IG5vbmUKKworQ19TUkNTID0gXAorCWR1bXByZXMuYyBcCisJZ2VucmVzLmMgXAorCW5ld3N0cnVjLmMgXAorCXByZXByb2MuYyBcCisJcmVhZHJlcy5jIFwKKwl1dGlscy5jIFwKKwl3cmMuYyBcCisJd3JpdGVyZXMuYworCitFWFRSQV9TUkNTID0gcGFyc2VyLnkgcGFyc2VyLmwKK0VYVFJBX09CSlMgPSB5LnRhYi5vIGxleC55eS5vCisKK2FsbDogJChQUk9HUkFNUykKKworZGVwZW5kOjogeS50YWIuaAorCitATUFLRV9SVUxFU0AKKword3JjQFBST0dFWFRAOiAkKE9CSlMpCisJJChDQykgJChDRkxBR1MpIC1vIHdyY0BQUk9HRVhUQCAkKE9CSlMpICQoTEVYTElCKQorCit5LnRhYi5jIHkudGFiLmg6IHBhcnNlci55CisJJChZQUNDKSAtZCAtdCAkKFNSQ0RJUikvcGFyc2VyLnkKKworbGV4Lnl5LmM6IHBhcnNlci5sCisJJChMRVgpIC04ICQoU1JDRElSKS9wYXJzZXIubAorCitjbGVhbjo6CisJJChSTSkgeS50YWIuYyB5LnRhYi5oIGxleC55eS5jCisKKyMjIyBEZXBlbmRlbmNpZXM6CmRpZmYgLS1naXQgYS90b29scy93cmMvUkVBRE1FLndyYyBiL3Rvb2xzL3dyYy9SRUFETUUud3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMmI0N2EKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy93cmMvUkVBRE1FLndyYwpAQCAtMCwwICsxLDI1OCBAQAorVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZSAoMS4wLjAgKDI4LU1heS0xOTk4KSkgb2YgdGhlIG5ldyByZXNvdXJjZSBjb21waWxlcgorJ3dyYycuIEl0IGltcHJvdmVzIHRoZSB3aW5lcmMgaW1wbGVtZW50YXRpb24gYnkgdGhlc2UgZmVhdHVyZXM6CisKKy0gc291cmNlIHByZXByb2Nlc3NpbmcKKy0gMTYgYW5kIDMyIGJpdCBzdXBwb3J0CistIExBTkdVQUdFIHN1cHBvcnQgKDMyIGJpdCBvbmx5KQorLSBhbG1vc3QgYWxsIHJlc291cmNlIHR5cGVzIGFyZSBzdXBwb3J0ZWQKKy0gZW5oYW5jZWQgZXhwcmVzc2lvbiBjYXBhYmlsaXRpZXMgYW5kIHJlc291cmNlIG5hbWluZworLSBpbmRpcmVjdCBsb2FkYWJsZSByZXNvdXJjZXMKKy0gTkUvUEUgcmVzb3VyY2UgZGlyZWN0b3J5IGdlbmVyYXRpb24KKy0gYmluYXJ5IC5yZXMgZmlsZSBnZW5lcmF0aW9uL3JlYWRpbmcKKworV3JjIGdlbmVyYXRlcyBhbiBhc3NlbWJseSBmaWxlIHRoYXQgY2FuIGJlIGFzc2VtYmxlZCB3aXRoIEdOVSdzIGdhcywgb3IKK3Bhc3NlZCB0byBnY2MuIFRoZSBhc3NlbWJseSBiZWNhbWUgbmVjZXNzYXJ5IGZvciB0d28gcmVhc29ucy4gRmlyc3QsIEMgZG9lcworbm90IGVuc3VyZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiBkZWNsYXJlZCBkYXRhLiBTZWNvbmRseSwgQyBjb21wbGFpbnRzIGFib3V0Citjb21wbGV4IGluaXRpYWxpemF0aW9uIHNjaGVtZXMgdGhhdCBiZWNhbWUgbmVjZXNzYXJ5IHdpdGggdGhlIE5FL1BFCitkaXJlY3RvcnkgZ2VuZXJhdGlvbi4KKworCitXcmMgY29tbWFuZC1saW5lCistLS0tLS0tLS0tLS0tLS0tCitZb3UgY2FuIGdldCB0aGlzIG1lc3NhZ2UgYnkgdHlwaW5nICd3cmMgLT8nOgorCitVc2FnZTogd3JjIFtvcHRpb25zLi4uXSBbaW5maWxlWy5yY3wucmVzXV0KKyAgIC1hIG4gICAgICAgIEFsaWdubWVudCBvZiByZXNvdXJjZSAod2luMTYgb25seSwgZGVmYXVsdCBpcyA0KQorICAgLWIgICAgICAgICAgQ3JlYXRlIGEgQyBhcnJheSBmcm9tIGEgYmluYXJ5IC5yZXMgZmlsZQorICAgLWMgICAgICAgICAgQWRkICdjb25zdCcgcHJlZml4IHRvIEMgY29uc3RhbnRzCisgICAtQyBjcCAgICAgICBTZXQgdGhlIHJlc291cmNlJ3MgY29kZXBhZ2UgdG8gY3AgKGRlZmF1bHQgaXMgMCkKKyAgIC1kIG4gICAgICAgIFNldCBkZWJ1ZyBsZXZlbCB0byAnbicKKyAgIC1EIGlkWz12YWxdIERlZmluZSBwcmVwcm9jZXNzb3IgaWRlbnRpZmllciBpZD12YWwKKyAgIC1lICAgICAgICAgIERpc2FibGUgcmVjb2duaXRpb24gb2Ygd2luMzIga2V5d29yZHMgaW4gMTZiaXQgY29tcGlsZQorICAgLWcgICAgICAgICAgQWRkIHN5bWJvbHMgdG8gdGhlIGdsb2JhbCBjIG5hbWVzcGFjZQorICAgLWggICAgICAgICAgQWxzbyBnZW5lcmF0ZSBhIC5oIGZpbGUKKyAgIC1IIGZpbGUgICAgIFNhbWUgYXMgLWggYnV0IHdyaXR0ZW4gdG8gZmlsZQorICAgLUkgcGF0aCAgICAgU2V0IGluY2x1ZGUgc2VhcmNoIGRpciB0byBwYXRoIChtdWx0aXBsZSAtSSBhbGxvd2VkKQorICAgLWwgbGFuICAgICAgU2V0IGRlZmF1bHQgbGFuZ3VhZ2UgdG8gbGFuIChkZWZhdWx0IGlzIG5ldXRyYWwgezB9KQorICAgLW4gICAgICAgICAgRG8gbm90IGdlbmVyYXRlIC5zIGZpbGUKKyAgIC1vIGZpbGUgICAgIE91dHB1dCB0byBmaWxlIChkZWZhdWx0IGlzIGluZmlsZS5bcmVzfHN8aF0KKyAgIC1wIHByZWZpeCAgIEdpdmUgYSBwcmVmaXggZm9yIHRoZSBnZW5lcmF0ZWQgbmFtZXMKKyAgIC1yICAgICAgICAgIENyZWF0ZSBiaW5hcnkgLnJlcyBmaWxlIChjb21waWxlIG9ubHkpCisgICAtcyAgICAgICAgICBBZGQgc3RydWN0dXJlIHdpdGggd2luMzIvMTYgKFBFL05FKSByZXNvdXJjZSBkaXJlY3RvcnkKKyAgIC10ICAgICAgICAgIEdlbmVyYXRlIGluZGlyZWN0IGxvYWRhYmxlIHJlc291cmNlIHRhYmxlcworICAgLVQgICAgICAgICAgR2VuZXJhdGUgb25seSBpbmRpcmVjdCBsb2FkYWJsZSByZXNvdXJjZXMgdGFibGVzCisgICAtViAgICAgICAgICBQcmludCB2ZXJzaW9uIGVuZCBleGl0CisgICAtdyAxNnwzMiAgICBTZWxlY3Qgd2luMTYgb3Igd2luMzIgb3V0cHV0IChkZWZhdWx0IGlzIHdpbjMyKQorICAgLVcgICAgICAgICAgRW5hYmxlIHBlZGFudGljIHdhcm5pbmdzCisKK0lucHV0IGlzIHRha2VuIGZyb20gc3RkaW4gaWYgbm8gc291cmNlZmlsZSBzcGVjaWZpZWQuCisKK0RlYnVnIGxldmVsICduJyBpcyBhIGJpdG1hc2sgd2l0aCBmb2xsb3dpbmcgbWVhbmluZzoKKyAgICAqIDB4MDEgVGVsbCB3aGljaCByZXNvdXJjZSBpcyBwYXJzZWQgKHZlcmJvc2UgbW9kZSkKKyAgICAqIDB4MDIgRHVtcCBpbnRlcm5hbCBzdHJ1Y3R1cmVzCisgICAgKiAweDA0IENyZWF0ZSBhIHBhcnNlciB0cmFjZSAoeXlkZWJ1Zz0xKQorCitUaGUgLW8gb3B0aW9uIG9ubHkgYXBwbGllcyB0byB0aGUgZmluYWwgZGVzdGluYXRpb24gZmlsZSwgd2hpY2ggaXMKK2luIGNhc2Ugb2Ygbm9ybWFsIGNvbXBpbGUgYSAucyBmaWxlLiBZb3UgbXVzdCB1c2UgdGhlICctSCBoZWFkZXIuaCcKK29wdGlvbiB0byBvdmVycmlkZSB0aGUgaGVhZGVyLWZpbGVuYW1lLgorSWYgbm8gaW5wdXQgZmlsZW5hbWUgaXMgZ2l2ZW4gYW5kIHRoZSBvdXRwdXQgbmFtZSBpcyBub3Qgb3ZlcnJpZGRlbgord2l0aCAtbyBhbmQvb3IgLUgsIHRoZW4gdGhlIG91dHB1dCBpcyB3cml0dGVuIHRvICJ3cmMudGFiLltzaF0iCisKKworUHJlcHJvY2Vzc2luZworLS0tLS0tLS0tLS0tLQorVGhlIGJ1aWxkLWluIHByZXByb2Nlc3NvciBpcyBub3QgYSBmdWxsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDIGNvdW50ZXJwYXJ0LgorV3JjIGRvZXMgbm90IHVuZGVyc3RhbmQgZnVuY3Rpb24tdHlwZSBtYWNyb3MuIFRoZXNlIGFyZSBkaXNjYXJkZWQgYXMgdGhleQorYXJlIHNjYW5uZWQuIFRoaXMgd2lsbCBiZSBhIGZ1dHVyZSBwcm9qZWN0LiBXcmMgZG9lcyB1bmRlcnN0YW5kIHRoZXNlOgorI2RlZmluZQorI2lmCisjaWZkZWYKKyNpZm5kZWYKKyNlbGlmCisjZWxzZQorI2VuZGlmCisjZXJyb3IKKworQWxzbyAnZGVmaW5lZCcgaXMgc3VwcG9ydGVkIGFzIG9wZXJhdG9yIChib3RoIHdpdGggYW5kIHdpdGhvdXQgcGFyZW50aGVzaXMpLgorJyNpZicgZXhwcmVzc2lvbnMgY2FuIGJlIGFueXRoaW5nIHZhbGlkIHRoYXQgZXZhbHVhdGVzIHRvIGFuIGludGVnZXIKK2V4cHJlc3Npb24gKHdoZXJlIDAgaXMgZmFsc2UgYW5kIGFueXRoaW5nIGVsc2UgaXMgdHJ1ZSkuIE90aGVycyAoI3ByYWdtYSwKKyNsaW5lKSBhcmUgaWdub3JlZC4gQSBzcGVjaWFsIGNhc2UgJyMnIGdlbmVyYXRlcyBhbiBlcnJvci4gVGhpcyBpcyBkdWUgdG8KK3RoZSBpbXBsZW1lbnRhdGlvbiB0byBlbmFibGUgZ2VuZXJhdGlvbiBvZiBlcnJvcnMgb24gcHJlcHJvY2Vzc2luZyBhbmQgd2lsbAorYmUgaW1wcm92ZWQgaW4gdGhlIGZ1dHVyZS4KKworCisxNiBhbmQgMzIgYml0IHN1cHBvcnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQWxsIG9mIHdyYyBpcyBsYXllZCBvdXQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGVuYWJsZXMgY29tcGlsYXRpb24gb2YgYm90aCAxNgorYW5kIDMyIGJpdCByZXNvdXJjZXMuIFRoZXkgbWFpbmx5IGRpZmZlciBpbiBjb2RlLWdlbmVyYXRpb24gYW5kIGV4dHJhCitrZXl3b3Jkcy4gV2luMzIga2V5d29yZHMgYXJlIHJlY29nbml6ZWQgYnkgZGVmYXVsdCBpbiAxNiBiaXQgY29tcGlsZS4gWW91CitjYW4gZGlzYWJsZSByZWNvZ25pdGlvbiBvZiB3aW4zMiByZXNlcnZlZCBrZXl3b3JkcyBieSB1c2luZyB0aGUgJy1lJyBvcHRpb24sCitpZiB5b3UgZW5jb3VudGVyIC5yYy1maWxlcyB0aGF0IHVzZSB3aW4zMiByZXNlcnZlZCBrZXl3b3JkcyAoSSBzdHJvbmdseQorcmVjb21tZW5kIHRoYXQgeW91IGp1c3QgcmVuYW1lIHRoaW5ncyBpbiB0aGUgc291cmNlKS4KKworCitMYW5ndWFnZSBzdXBwb3J0CistLS0tLS0tLS0tLS0tLS0tCitXcmMgYWxzbyB1bmRlcnN0YW5kcyB0aGUgTEFOR1VBR0Uga2V5d29yZCAod2luMzIgb25seSkgZm9yIGJvdGggZ2xvYmFsIGFuZAorbG9jYWwgZGVmaW5pdGlvbnMgb2YgbGFuZ3VhZ2UuIFRoZXJlIGFyZSBkaWZmZXJlbmNlcyB3aXRoIHJlc3BlY3QgdG8gTVMnIGFuZAorQm9ybGFuZCdzIGltcGxlbWVudGF0aW9uLiBXcmMgdXNlcyAwLDAgYXMgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgaWYgbm9uIGlzCitzcGVjaWZpZWQuIEJvdGggTVMgYW5kIEJvcmxhbmQgdXNlIHRoZSBsYW5ndWFnZSBvZiB0aGUgc3lzdGVtIHRoYXQgdGhlCitjb21waWxlciBydW5zIG9uLgorCitOb3QgYWxsIHJlc291cmNlLXR5cGVzIGNhbiBoYXZlIGxvY2FsIGxhbmd1YWdlIGtleXdvcmRzIGF0dGFjaGVkIHlldAorKG5vdGFibHk6IEJJVE1BUCwgQ1VSU09SLCBJQ09OIGFuZCB1c2VydHlwZSkuIFRoaXMgaXMgZHVlIHRvIGltcGxlbWVudGF0aW9uCitvZiBmaWxlbmFtZS1zY2FubmluZyBhbmQgdGhlIGNvbXBsZXhpdHkgdGhhdCBpdCBwb3Nlcy4gVGhpcyB3aWxsIGJlIGNoYW5nZWQKK2luIHRoZSBuZXh0IHJlbGVhc2UuCisKKworUmVzb3VyY2UgdHlwZXMgc3VwcG9ydGVkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FsbCB0eXBlcyBhcmUgc3VwcG9ydGVkIGV4Y2VwdCBmb3I6CistIEZPTlQKKy0gTUVTU0FHRVRBQkxFCistIGV4dGVuc2lvbnMgbGlrZSBUT09MQkFSIGFuZCB0aGUgbGlrZQorCitUaGVzZSB0eXBlcyB3aWxsIGJlIGltcGxlbWVudGVkIGFzIHNvb24gYXMgSSBnZXQgYSBwcm9wZXIgc3BlY2lmaWNhdGlvbiBvZgordGhlIGxheW91dC4KKworTm90ZTogVXNlcnR5cGUgcmVzb3VyY2VzIHdpdGggY2hhcmFjdGVyIHN0cmluZ3MgYXMgdHlwZXMgaGF2ZSBhIGRpZmZlcmVudAorbGF5b3V0IGFuZCBkbyBub3QgYWNjZXB0IGV4cHJlc3Npb25zIHdoZW4gYSBudW1lcmljYWwgdHlwZSBpcyBzcGVjaWZpZWQuIFRoZQorbXVzdCBiZSBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzLiBUaGVzZSBhcmUgZXhhbXBsZXMgb2YgdmFsaWQgdXNlcnR5cGUKK3Jlc291cmNlczoKKworTXlOYW1lICJNeVR5cGUiIG15ZGF0YS5iaW4KK015TmFtZSAxMjM0NSBteWRhdGEuYmluCitNeU5hbWUgIk15VHlwZSIgIm15ZGF0YS5iaW4iCitNeU5hbWUgMTIzNDUgIm15ZGF0YS5iaW4iCisKK015TmFtZSAiTXlUeXBlIgoreworICAuLi4sIGRhdGEsIC4uLgorfQorCitvcgorCitNeU5hbWUgMTIzNDUKK3sKKyAuLi4sIGRhdGEsIC4uLgorfQorCisKK0V4cHJlc3Npb24gY2FwYWJpbGl0aWVzIGFuZCByZXNvdXJjZSBuYW1lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitZb3UgY2FuIHVzZSBhbiBleHByZXNzaW9uIGluIG1vc3QgcGxhY2VzIHdoZXJlIHRoZSByZXNvdXJjZSBkZWZpbml0aW9uCitleHBlY3RzIGEgbnVtYmVyIChleGNlcHQgdXNlcnR5cGUgdHlwZSkuIE9wZXJhdG9ycyBzdXBwb3J0ZWQ6IAorKCkJcGFyZW50aGVzaXMKKyoJbXVsdGlwbHkKKy8JZGl2aWRlCisrCWFkZAorLQltaW51cy9zdWJzdHJhY3QKK3wJYmluYXJ5IG9yCismCWJpbmFyeSBhbmQKK34JYmluYXJ5IG5vdCAodW5hcnkgb3BlcmF0b3IgdGhvdWdoKQorTk9UCS4uLiAoc2lnaCkKKworTWludXMgKC0pIGNhbiBib3RoIGJlIHVuYXJ5IGFuZCBiaW5hcnkuIFRoZSBOT1Qgb3BlcmF0b3IgaXMgKHByaW1hcmlseSkKK3VzZWQgdG8gZGlzYWJsZSB3aW5kb3cgc3R5bGVzIGJ1dCBJIHN0cm9uZ2x5IHN1Z2dlc3QgdG8gcmVmcmFpbiBmcm9tIHVzaW5nCit0aGlzIG9wZXJhdG9yLgorVGhlcmUgaXMgYSBzaGlmdC9yZWR1Y2UgY29uZmxpY3Qgb24gdGhlIHVuYXJ5IG1pbnVzLCBidXQgdGhpcyBpcyBub3QKK3Byb2JsZW1hdGljLiBJIHdhcyB0b28gbGF6eSB0byBtYWtlIGEgbmV3IGV4cHJlc3Npb24gcGFyc2VyIChuZXh0IHZlcnNpb24gb3IKK3NvKS4gVW5hcnkgcGx1cyAoKykgd291bGQgY2F1c2UgYW5vdGhlciBjb25maWxjdCwgc28gSSBsZXQgaXQgb3V0IGZvciBub3cuCisKK1Jlc291cmNlIG5hbWVzIGNhbiBiZSBib3RoIG51bWVyaWNhbCAoZXhwcmVzc2lvbnMpIGFuZCBjaGFyYWN0ZXIgdHlwZWQuIFdyYworZG9lcyBzdXBwb3J0cyB0aGlzIGluc2FuZSAoZGVlcCBzaWdoKSBjb25zdHJ1Y3Q6CisKK01FTlUgTUVOVQoreworIC4uLgorfQorCitJdCBpcyBfT05MWV8gc3VwcG9ydGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBzbyB0aGF0IG9sZCBzb3VyY2VzIGNhbgorYmUgY29tcGlsZWQgd2l0aCB3aW5lbGliLiBETyBOT1QgVVNFIElUIElOIE5FVyBSRVNPVVJDRVMsIFBMRUFTRSEKKworCitJbmRpcmVjdCBsb2FkYWJsZSByZXNvdXJjZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXcmMgY2FuIGdlbmVyYXRlIHRhYmxlcyBmb3IgaW5kaXJlY3QgcmVzb3VyY2UgbG9hZGluZyBsaWtlIHdpbmVyYyBkaWQuIFRoZXJlCithcmUgdHdvIG5ldyBzdHJ1Y3R1cmVzIGRlZmluZWQgaW4gJ3dpbmUtYmFzZS1kaXIvaW5jbHVkZS93cmNfcnNjLmgnOgorCit0eXBlZGVmIHN0cnVjdCB3cmNfcmVzb3VyY2UxNgoreworICAgICAgICBJTlQzMiAgIHJlc2lkOyAgICAgICAgICAvKiBUaGUgcmVzb3VyY2UgaWQgaWYgcmVzbmFtZSA9PSBOVUxMICovCisgICAgICAgIExQU1RSICAgcmVzbmFtZTsKKyAgICAgICAgSU5UMzIgICByZXN0eXBlOyAgICAgICAgLyogVGhlIHJlc291cmNlIHR5cGUtaWQgaWYgdHlwZW5hbWUgPT0gTlVMTCAqLworICAgICAgICBMUFNUUiAgIHR5cGVuYW1lOworICAgICAgICBMUEJZVEUgIGRhdGE7ICAgICAgICAgICAvKiBBY3R1YWwgcmVzb3VyY2UgZGF0YSAqLworICAgICAgICBVSU5UMzIgIGRhdGFzaXplOyAgICAgICAvKiBUaGUgc2l6ZSBvZiB0aGUgcmVzb3VyY2UgKi8KK30gd3JjX3Jlc291cmNlMTZfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgd3JjX3Jlc291cmNlMzIKK3sKKyAgICAgICAgSU5UMzIgICByZXNpZDsgICAgICAgICAgLyogVGhlIHJlc291cmNlIGlkIGlmIHJlc25hbWUgPT0gTlVMTCAqLworICAgICAgICBMUFdTVFIgIHJlc25hbWU7CisgICAgICAgIElOVDMyICAgcmVzdHlwZTsgICAgICAgIC8qIFRoZSByZXNvdXJjZSB0eXBlLWlkIGlmIHR5cGVuYW1lID09IE5VTEwgKi8KKyAgICAgICAgTFBXU1RSICB0eXBlbmFtZTsKKyAgICAgICAgTFBCWVRFICBkYXRhOyAgICAgICAgICAgLyogQWN0dWFsIHJlc291cmNlIGRhdGEgKi8KKyAgICAgICAgVUlOVDMyICBkYXRhc2l6ZTsgICAgICAgLyogVGhlIHNpemUgb2YgdGhlIHJlc291cmNlICovCit9IHdyY19yZXNvdXJjZTMyX3Q7CisKK1RoZSBleHRlbnNpb24gdG8gd2luZXJjIGxpZXMgaW4gdGhlIGFkZGl0aW9uIG9mIHRoZSAndHlwZW5hbWUnIGZpZWxkIHRvCitzdXBwb3J0IHVzZXJ0eXBlIHJlc291cnNlYyB3aXRoIG5hbWVzIGZvciB0eXBlcy4KKworTm90ZSB0aGF0IF9BTExfIG5hbWVzIGdlbmVyYXRlZCBieSB3cmMgYW5kIHRvIGJlIHVzZWQgaW4gaW50ZXJmYWNpbmcgd2l0aAord2luZSBhcmUgUEFTQ0FMLXN0eWxlIHN0cmluZ3MsIHVubGlrZSB3aW5lcmMuIFRoZSBmaXJzdCBlbGVtZW50IGNvbnRhaW5zIHRoZQorbGVuZ3RoIGFuZCB0aGUgc3RyaW5ncyBhcmUgX25vdF8gJ1wwJy10ZXJtaW5hdGVkIQorCitZb3UgY2FuIGFsc28gZ2VuZXJhdGUgaGVhZGVyIGZpbGVzIHdpdGggd3JjIHdoZW4gc3BlY2lmeWluZyB0aGUgJy1oJyBvcgorJy1IPGZpbGVuYW1lPicgb3B0aW9uLgorCisKK05FL1BFIHJlc291cmNlIGRpcmVjdG9yeSBnZW5lcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQSB3aW5kb3dzIGV4ZWN1dGFibGUgaGFzIGEgdGFibGUvZGlyZWN0b3J5IG9mIHJlc291cmNlcyBhdmFsYWJsZSBpbiB0aGF0Cittb2R1bGUuIFdyYyB3aWxsIGdlbmVyYXRlIHRoaXMgZGlyZWN0b3J5IHdpdGggdGhlICctcycgb3B0aW9uIGFuZCBwbGFjZSBpdAoraW4gdGhlIGFzc2VtYmx5IG91dHB1dCAoYW5kIGhlYWRlci1maWxlKS4gVGhpcyB3aWxsIGVuYWJsZSB0aGUgc2VwYXJhdGlvbgorb2YgZGlmZmVyZW50IG1vZHVsZXMgKGRsbHMpIGluIHdpbmUsIHdoaWNoIGlzIHRoZSBuZXh0IHByb2plY3QgYWZ0ZXIgd3JjLgorCitUaGUgbGF5b3V0IG9mIHRoZSBQRSBkaXJlY3Rvcnkgc2hvdWxkIGJlIGV4YWN0bHkgbGlrZSB0aGUgZXhlY3V0YWJsZSBmaWxlLgorVGhlIE5FLWRpcmVjdG9yeSBsYXlvdXQgX0RJRkZFUlNfIGZyb20gdGhlIHJlYWwgTkUtZXhlY3V0YWJsZSBpbiBzdWNoIHdheQordGhhdCBhbGwgb2Zmc2V0cyB0byBhY3R1YWwgcmVzb3VyY2UtZGF0YSBpcyByZWxhdGl2ZSB0byB0aGUgTkUtZGlyZWN0b3J5IGFuZAorX05PVF8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKworCitCaW5hcnkgLnJlcyBmaWxlIGdlbmVyYXRpb24vcmVhZGluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1dyYyBjYW4gYm90aCBnZW5lcmF0ZSAoMzIgYW5kIDE2IGJpdCkgYW5kIHJlYWQgKDMyIGJpdCBvbmx5KSAucmVzLWZpbGVzLgorVGhlc2UgY2FuIGJlIHVzZWQgYXMgaW50ZXJtZWRpYXRlIGZpbGVzIG9yIGJpbmFyeSBmaWxlcyBjYW4gYmUgaW1wb3J0ZWQgZnJvbQorb3RoZXIgc291cmNlcy4gVGhlIHJlYWRpbmcgb2YgMTYgYml0IC5yZXMtZmlsZXMgaXMgb24gdGhlIGxpc3QgZm9yIHRoZSBuZXh0CityZWxlYXNlLgorCitZb3UgY2Fubm90IGNvbnZlcnQgMzIgYml0IC5yZXMtZmlsZXMgaW50byAxNiBiaXQgb3V0cHV0IG9yIHZpY2UgdmVyc2EuIEkKK21pZ2h0IGltcGxlbWVudCAxNiBiaXQgcmVzIGludG8gMzIgYml0IG91dHB1dCBpbiB0aGUgZnV0dXJlLCBidXQgSSBzdHJvbmx5CitvcHBvc2UgdG8gdGhlIG90aGVyIHdheSBhcnJvdW5kLgorCisKK0J1Z3MKKy0tLS0KK0luaGVyZW50IHRvIHByb2dyYW1zIHlvdSBoYXZlIGJ1Z3MuIFRoZXNlIEkga25vdyBhcmUgdGhlcmUsIHBsdXMgYSBmZXcKK3RoaW5ncyB0aGF0IEkgbm90ZWQgaW4gdGhlIGFib3ZlIHRleHQgKG1vcmUgbGFjayBvZiBpbXBsZW1lbnRhdGlvbiB0aGFuIGJ1ZwordGhvdWdoKToKKy0gTm8gY29kZXBhZ2UgdHJhbnNsYXRpb24KKy0gVU5JQ09ERSB0cmFuc2xhdGlvbnMgYXJlIG5vdC9ub3QgY29ycmVjdCBpbXBsZW1lbnRlZAorLSBObyBkb2N1bWVudGF0aW9uICgnd3JjIC0/JyBnaXZlcyBjb21tYW5kLWxpbmUgb3B0aW9ucyB0aG91Z2gpCistIGdyZXAgZm9yIEZJWE1FIGluIHRoZSBzb3VyY2UKKworCitSZXBvcnRpbmcgYnVncyBhbmQgcGF0Y2hlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NlbmQgcHJvYmxlbXMgdG8gdGhlIHdpbmUgbmV3c2dyb3VwIG9yLCBwcmVmZXJyYWJseSwgIGRpcmVjdGx5IHRvIG1lIGF0OgorCitiZXJ0aG9AYWtocGhkLmF1LmRrCisKK1BsZWFzZSBzZW5kIHRoZSBwcm9ibGVtYXRpYyByYy1zb3VyY2Ugd2l0aCB0aGUgYnVnIHNvIEkgY2FuIHJlcHJvZHVjZSBpdC4KK1BhdGNoZXMgc2hvdWxkIF9ub3RfIGJlIHNlbmQgdG8gQWxleGFuZHJlIGJ1dCB0byBtZS4gSSB3aWxsIHRoZW4gcmV2aWV3IHRoZQorY2hhbmdlIGFuZCBzZW5kIGEgZnVsbCBwYXRjaCB0byBiZSBpbmNsdWRlZCBpbnRvIHRoZSBuZXcgd2luZSByZWxlYXNlIChJCitwcmVmZXIgJ2RpZmYgLXUnIGZvcm1hdCkuIFlvdSBjYW4gYWx3YXlzIHVwbG9hZCBzdWdnZXN0aW9ucyB0byB3aW5lCitoZWFkcXVhcnRlcnMsIGJ1dCBiZSBzdXJlIHRvIHNlbmQgbWUgYSBjb3B5LgorCmRpZmYgLS1naXQgYS90b29scy93cmMvZHVtcHJlcy5jIGIvdG9vbHMvd3JjL2R1bXByZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2MwOWY0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvd3JjL2R1bXByZXMuYwpAQCAtMCwwICsxLDkwNyBAQAorLyoKKyAqIENvcHlyaWdudCAxOTk4IEJlcnRobyBBLiBTdHVsdGllbnMgKEJTKQorICoKKyAqIDE2LUFwci0xOTk4IEJTCS0gWWVhaCwgZHVtcCBpdCB0byBzdGRvdXQuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJ3cmMuaCIKKyNpbmNsdWRlICJkdW1wcmVzLmgiCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogZ2V0X3R5cGVuYW1lCisgKiBTeW50YXgJOiBjaGFyICpnZXRfdHlwZW5hbWUocmVzb3VyY2VfdCogcikKKyAqIElucHV0CToKKyAqCXIJLSBSZXNvdXJjZSBkZXNjcmlwdGlvbgorICogT3V0cHV0CTogQSBwb2ludGVyIHRvIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcmVzb3VyY2UgdHlwZQorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitjaGFyICpnZXRfdHlwZW5hbWUocmVzb3VyY2VfdCogcikKK3sKKwlzd2l0Y2goci0+dHlwZSl7CisJY2FzZSByZXNfYWNjOglyZXR1cm4gIkFDQ0VMRVJBVE9SIjsKKwljYXNlIHJlc19ibXA6CXJldHVybiAiQklUTUFQIjsKKwljYXNlIHJlc19jdXI6CXJldHVybiAiQ1VSU09SIjsKKwljYXNlIHJlc19jdXJnOglyZXR1cm4gIkdST1VQX0NVUlNPUiI7CisJY2FzZSByZXNfZGxnOglyZXR1cm4gIkRJQUxPRyI7CisJY2FzZSByZXNfZGxnZXg6CXJldHVybiAiRElBTE9HRVgiOworCWNhc2UgcmVzX2ZudDoJcmV0dXJuICJGT05UIjsKKwljYXNlIHJlc19pY286CXJldHVybiAiSUNPTiI7CisJY2FzZSByZXNfaWNvZzoJcmV0dXJuICJHUk9VUF9JQ09OIjsKKwljYXNlIHJlc19tZW46CXJldHVybiAiTUVOVSI7CisJY2FzZSByZXNfbWVuZXg6CXJldHVybiAiTUVOVUVYIjsKKwljYXNlIHJlc19yZHQ6CXJldHVybiAiUkNEQVRBIjsKKwljYXNlIHJlc19zdHQ6CXJldHVybiAiU1RSSU5HVEFCTEUiOworCWNhc2UgcmVzX3VzcjogICByZXR1cm4gIlVzZXJSZXNvdXJjZSI7CisJY2FzZSByZXNfbXNnOglyZXR1cm4gIk1FU1NBR0VUQUJMRSI7CisJY2FzZSByZXNfdmVyOglyZXR1cm4gIlZFUlNJT05JTkZPIjsKKwlkZWZhdWx0OiAJcmV0dXJuICJVbmtub3duIjsKKwl9Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogc3RybmNweVd0b0EKKyAqIFN5bnRheAk6IGNoYXIgKnN0cm5jcHlXdG9BKGNoYXIgKmNzLCBzaG9ydCAqd3MsIGludCBtYXhsZW4pCisgKiBJbnB1dAk6CisgKgljcwktIFBvaW50ZXIgdG8gYnVmZmVyIHRvIHJlY2VpdmUgcmVzdWx0CisgKgl3cwktIFNvdXJjZSB3aWRlLXN0cmluZworICoJbWF4bGVuCS0gTWF4IGNoYXJzIHRvIGNvcHkKKyAqIE91dHB1dAk6ICdjcycKKyAqIERlc2NyaXB0aW9uCTogQ29weSBhIHVuaWNvZGUgc3RyaW5nIHRvIGFzY2lpLiBDb3B5aW5nIHN0b3BzIGFmdGVyIHRoZQorICoJCSAgZmlyc3Qgb2NjdXJpbmcgJ1wwJyBvciB3aGVuIG1heGxlbi0xIGNoYXJzIGFyZSBjb3BpZWQuIFRoZQorICoJCSAgU3RyaW5nIGlzIGFsd2F5cyBudWwgdGVybWluYXRlZC4KKyAqIFJlbWFya3MJOiBObyBjb2RlcGFnZSB0cmFuc2xhdGlvbiBpcyBkb25lLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworY2hhciAqc3RybmNweVd0b0EoY2hhciAqY3MsIHNob3J0ICp3cywgaW50IG1heGxlbikKK3sKKwljaGFyICpjcHRyID0gY3M7CisJd2hpbGUoKndzICYmIG1heGxlbi0xKQorCXsKKwkJaWYoKndzIDwgLTEyOCB8fCAqd3MgPiAxMjcpCisJCQlwcmludGYoIioqKldhcm5pbmc6IFVuaWNvZGUgc3RyaW5nIGNvbnRhaW5zIG5vbi1wcmludGFibGUgY2hhcnMqKioiKTsKKwkJKmNwdHIrKyA9IChjaGFyKSp3cysrOworCQltYXhsZW4tLTsKKwl9CisJKmNwdHIgPSAnXDAnOworCXJldHVybiBjczsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBwcmludF9zdHJpbmcKKyAqIFN5bnRheAk6IHZvaWQgcHJpbnRfc3RyaW5nKHN0cmluZ190ICpzdHIpCisgKiBJbnB1dAk6CisgKiBPdXRwdXQJOgorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCit2b2lkIHByaW50X3N0cmluZyhzdHJpbmdfdCAqc3RyKQoreworCWNoYXIgYnVmZmVyWzUxMl07CisJaWYoIXN0cikKKwkJcHJpbnRmKCI8bm9uZT4iKTsKKwllbHNlIGlmKHN0ci0+dHlwZSA9PSBzdHJfY2hhcikKKwkJcHJpbnRmKCJcIiVzXCIiLCBzdHItPnN0ci5jc3RyKTsKKwllbHNlCisJeworCQlzdHJuY3B5V3RvQShidWZmZXIsIHN0ci0+c3RyLndzdHIsIHNpemVvZihidWZmZXIpKTsKKwkJcHJpbnRmKCJMXCIlc1wiIiwgYnVmZmVyKTsKKwl9Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogZ2V0X25hbWVpZF9zdHIKKyAqIFN5bnRheAk6IGNoYXIgKmdldF9uYW1laWRfc3RyKG5hbWVfaWRfdCAqbikKKyAqIElucHV0CToKKyAqCW4JLSBuYW1laWQgdG8gY29udmVydCB0byB0ZXh0CisgKiBPdXRwdXQJOiBBIHBvaW50ZXIgdG8gdGhlIG5hbWUuCisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCTogTm90IHJlZW50cmFudCBiZWNhdXNlIG9mIHN0YXRpYyBidWZmZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK2NoYXIgKmdldF9uYW1laWRfc3RyKG5hbWVfaWRfdCAqbikKK3sKKwlzdGF0aWMgY2hhciBidWZmZXJbMjU2XTsKKworCWlmKCFuKQorCQlyZXR1cm4gIjxub25lPiI7CisKKwlpZihuLT50eXBlID09IG5hbWVfb3JkKQorCXsKKwkJc3ByaW50ZihidWZmZXIsICIlZCIsIG4tPm5hbWUuaV9uYW1lKTsKKwkJcmV0dXJuIGJ1ZmZlcjsKKwl9CisJZWxzZSBpZihuLT50eXBlID09IG5hbWVfc3RyKQorCXsKKwkJaWYobi0+bmFtZS5zX25hbWUtPnR5cGUgPT0gc3RyX2NoYXIpCisJCQlyZXR1cm4gbi0+bmFtZS5zX25hbWUtPnN0ci5jc3RyOworCQllbHNlCisJCXsKKwkJCXN0cm5jcHlXdG9BKGJ1ZmZlciwgbi0+bmFtZS5zX25hbWUtPnN0ci53c3RyLCBzaXplb2YoYnVmZmVyKSk7CisJCQlyZXR1cm4gYnVmZmVyOworCQl9CisJfQorCWVsc2UKKwkJcmV0dXJuICJIb29vbywgcmVwb3J0IHRoaXM6IHdyb25nIHR5cGUgaW4gbmFtZWlkIjsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBkdW1wX21lbW9wdAorICogU3ludGF4CTogdm9pZCBkdW1wX21lbW9wdChEV09SRCBtZW1vcHQpCisgKiBJbnB1dAk6CisgKgltZW1vcHQJLSBmbGFnIGJpdHMgb2YgdGhlIG9wdGlvbnMgc2V0CisgKiBPdXRwdXQJOgorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCit2b2lkIGR1bXBfbWVtb3B0KERXT1JEIG1lbW9wdCkKK3sKKwlwcmludGYoIk1lbW9yeS9sb2FkIG9wdGlvbnM6ICIpOworCWlmKG1lbW9wdCAmIDB4MDA0MCkKKwkJcHJpbnRmKCJQUkVMT0FEICIpOworCWVsc2UKKwkJcHJpbnRmKCJMT0FET05DQUxMICIpOworCWlmKG1lbW9wdCAmIDB4MDAxMCkKKwkJcHJpbnRmKCJNT1ZFQUJMRSAiKTsKKwllbHNlCisJCXByaW50ZigiRklYRUQgIik7CisJaWYobWVtb3B0ICYgMHgwMDIwKQorCQlwcmludGYoIlBVUkUgIik7CisJZWxzZQorCQlwcmludGYoIklNUFVSRSAiKTsKKwlpZihtZW1vcHQgJiAweDEwMDApCisJCXByaW50ZigiRElTQ0FSREFCTEUiKTsKKwlwcmludGYoIlxuIik7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogZHVtcF9sdmMKKyAqIFN5bnRheAk6IHZvaWQgZHVtcF9sdmMobHZjX3QgKmwpCisgKiBJbnB1dAk6CisgKglsCS0gcG9pbnRlciB0byBsdmMgc3RydWN0dXJlCisgKiBPdXRwdXQJOgorICogRGVzY3JpcHRpb24JOiBEdW1wIGxhbmd1YWdlLCB2ZXJzaW9uIGFuZCBjaGFyYWN0ZXJpc3RpY3MKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordm9pZCBkdW1wX2x2YyhsdmNfdCAqbCkKK3sKKwlpZihsLT5sYW5ndWFnZSkKKwkJcHJpbnRmKCJMQU5HVUFHRSAlMDR4LCAlMDR4XG4iLCBsLT5sYW5ndWFnZS0+aWQsIGwtPmxhbmd1YWdlLT5zdWIpOworCWVsc2UKKwkJcHJpbnRmKCJMQU5HVUFHRSA8bm90IHNldD5cbiIpOworCisJaWYobC0+dmVyc2lvbikKKwkJcHJpbnRmKCJWRVJTSU9OICUwOGx4XG4iLCAqKGwtPnZlcnNpb24pKTsKKwllbHNlCisJCXByaW50ZigiVkVSU0lPTiA8bm90IHNldD5cbiIpOworCisJaWYobC0+Y2hhcmFjdHMpCisJCXByaW50ZigiQ0hBUkFDVEVSSVNUSUNTICUwOGx4XG4iLCAqKGwtPmNoYXJhY3RzKSk7CisJZWxzZQorCQlwcmludGYoIkNIQVJBQ1RFUklTVElDUyA8bm90IHNldD5cbiIpOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IGR1bXBfcmF3X2RhdGEKKyAqIFN5bnRheAk6IHZvaWQgZHVtcF9yYXdfZGF0YShyYXdfZGF0YV90ICpkKQorICogSW5wdXQJOgorICoJZAktIFJhdyBkYXRhIGRlc2NyaXB0b3IKKyAqIE91dHB1dAk6CisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3ZvaWQgZHVtcF9yYXdfZGF0YShyYXdfZGF0YV90ICpkKQoreworCWludCBuOworCWludCBpOworCWludCBqOworCisJaWYoIWQpCisJeworCQlwcmludGYoIjxub25lPiIpOworCQlyZXR1cm47CisJfQorCXByaW50ZigiUmF3ZGF0YSBzaXplOiAlZFxuIiwgZC0+c2l6ZSk7CisJaWYoZGVidWdsZXZlbCA8IDIpCisJCXJldHVybjsKKworCWZvcihuID0gMDsgbiA8IGQtPnNpemU7IG4rKykKKwl7CisJCWlmKChuICUgMTYpID09IDApCisJCQlpZihuKQorCQkJeworCQkJCXByaW50ZigiLSAiKTsKKwkJCQlmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQkJCQlwcmludGYoIiVjIiwgaXNwcmludChkLT5kYXRhW24tMTYraV0pID8gZC0+ZGF0YVtuLTE2K2ldIDogJy4nKTsKKwkJCQlwcmludGYoIlxuJTA4eDogIiwgbik7CisJCQl9CisJCQllbHNlCisJCQkJcHJpbnRmKCIlMDh4OiAiLCBuKTsKKwkJcHJpbnRmKCIlMDJ4ICIsIGQtPmRhdGFbbl0gJiAweGZmKTsKKwl9CisJcHJpbnRmKCItICIpOworCWogPSBkLT5zaXplICUgMTY7CisJaWYoIWopCisJCWogPSAxNjsKKwlmb3IoaSA9IDA7IGkgPCBqOyBpKyspCisJCXByaW50ZigiJWMiLCBpc3ByaW50KGQtPmRhdGFbbi1qK2ldKSA/IGQtPmRhdGFbbi1qK2ldIDogJy4nKTsKKwlwcmludGYoIlxuIik7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogZHVtcF9hY2NlbGVyYXRvcgorICogU3ludGF4CTogdm9pZCBkdW1wX2FjY2VsZXJhdG9yKHJlc291cmNlX3QgKmFjYykKKyAqIElucHV0CToKKyAqCWFjYwktIEFjY2VsZXJhdG9yIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqIE91dHB1dAk6IG5vcAorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCit2b2lkIGR1bXBfYWNjZWxlcmF0b3IoYWNjZWxlcmF0b3JfdCAqYWNjKQoreworCWV2ZW50X3QgKmV2ID0gYWNjLT5ldmVudHM7CisKKwlkdW1wX21lbW9wdChhY2MtPm1lbW9wdCk7CisJZHVtcF9sdmMoJihhY2MtPmx2YykpOworCisJcHJpbnRmKCJFdmVudHM6ICVzXG4iLCBldiA/ICIiIDogIjxub25lPiIpOworCXdoaWxlKGV2KQorCXsKKwkJcHJpbnRmKCJLZXk9Iik7CisJCWlmKGlzcHJpbnQoZXYtPmtleSkpCisJCQlwcmludGYoIlwiJWNcIiIsIGV2LT5rZXkpOworCQllbHNlIGlmKGlzY250cmwoZXYtPmtleSkpCisJCQlwcmludGYoIlwiXiVjXCIiLCBldi0+a2V5ICsnQCcpOworCQllbHNlCisJCQlwcmludGYoIlxceCUwMngiLCBldi0+a2V5ICYgMHhmZik7CisKKwkJcHJpbnRmKCIgSWQ9JWQgZmxhZ3M9JTA0eFxuIiwgZXYtPmlkLCBldi0+ZmxhZ3MpOworCQlldiA9IGV2LT5uZXh0OworCX0KK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBkdW1wX2N1cnNvcgorICogU3ludGF4CTogdm9pZCBkdW1wX2N1cnNvcihjdXJzb3JfdCAqY3VyKQorICogSW5wdXQJOgorICoJY3VyCS0gQ3Vyc29yIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqIE91dHB1dAk6IG5vcAorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCit2b2lkIGR1bXBfY3Vyc29yKGN1cnNvcl90ICpjdXIpCit7CisJcHJpbnRmKCJJZDogJWRcbiIsIGN1ci0+aWQpOworCXByaW50ZigiV2lkdGg6ICVkXG4iLCBjdXItPndpZHRoKTsKKwlwcmludGYoIkhlaWdodDogJWRcbiIsIGN1ci0+aGVpZ2h0KTsKKwlwcmludGYoIlggSG90c3BvdDogJWRcbiIsIGN1ci0+eGhvdCk7CisJcHJpbnRmKCJZIEhvdHNwb3Q6ICVkXG4iLCBjdXItPnlob3QpOworCWR1bXBfcmF3X2RhdGEoY3VyLT5kYXRhKTsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBkdW1wX2N1cnNvcl9ncm91cAorICogU3ludGF4CTogdm9pZCBkdW1wX2N1cnNvcl9ncm91cChjdXJzb3JfZ3JvdXBfdCAqY3VyKQorICogSW5wdXQJOgorICoJY3VyCS0gQ3Vyc29yIGdyb3VwIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqIE91dHB1dAk6IG5vcAorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCit2b2lkIGR1bXBfY3Vyc29yX2dyb3VwKGN1cnNvcl9ncm91cF90ICpjdXJnKQoreworCWR1bXBfbWVtb3B0KGN1cmctPm1lbW9wdCk7CisJcHJpbnRmKCJUaGVyZSBhcmUgJWQgY3Vyc29ycyBpbiB0aGlzIGdyb3VwXG4iLCBjdXJnLT5uY3Vyc29yKTsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBkdW1wX2ljb24KKyAqIFN5bnRheAk6IHZvaWQgZHVtcF9pY29uKGljb25fdCAqaWNvKQorICogSW5wdXQJOgorICoJaWNvCS0gSWNvbiByZXNvdXJjZSBkZXNjcmlwdG9yCisgKiBPdXRwdXQJOiBub3AKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordm9pZCBkdW1wX2ljb24oaWNvbl90ICppY28pCit7CisJcHJpbnRmKCJJZDogJWRcbiIsIGljby0+aWQpOworCXByaW50ZigiV2lkdGg6ICVkXG4iLCBpY28tPndpZHRoKTsKKwlwcmludGYoIkhlaWdodDogJWRcbiIsIGljby0+aGVpZ2h0KTsKKwlwcmludGYoIk5Db2xvcjogJWRcbiIsIGljby0+bmNscik7CisJcHJpbnRmKCJOUGxhbmVzOiAlZFxuIiwgaWNvLT5wbGFuZXMpOworCXByaW50ZigiTkJpdHM6ICVkXG4iLCBpY28tPmJpdHMpOworCWR1bXBfcmF3X2RhdGEoaWNvLT5kYXRhKTsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBkdW1wX2ljb25fZ3JvdXAKKyAqIFN5bnRheAk6IHZvaWQgZHVtcF9pY29uX2dyb3VwKGljb25fZ3JvdXBfdCAqaWNvKQorICogSW5wdXQJOgorICoJaWNvCS0gSWNvbiBncm91cCByZXNvdXJjZSBkZXNjcmlwdG9yCisgKiBPdXRwdXQJOiBub3AKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordm9pZCBkdW1wX2ljb25fZ3JvdXAoaWNvbl9ncm91cF90ICppY29nKQoreworCWR1bXBfbWVtb3B0KGljb2ctPm1lbW9wdCk7CisJcHJpbnRmKCJUaGVyZSBhcmUgJWQgaWNvbnMgaW4gdGhpcyBncm91cFxuIiwgaWNvZy0+bmljb24pOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IGR1bXBfZm9udAorICogU3ludGF4CTogdm9pZCBkdW1wX2ZvbnQoZm9udF90ICpmbnQpCisgKiBJbnB1dAk6CisgKglmbnQJLSBGb250IHJlc291cmNlIGRlc2NyaXB0b3IKKyAqIE91dHB1dAk6IG5vcAorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCit2b2lkIGR1bXBfZm9udChmb250X3QgKmZudCkKK3sKKwlkdW1wX21lbW9wdChmbnQtPm1lbW9wdCk7CisJZHVtcF9yYXdfZGF0YShmbnQtPmRhdGEpOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IGR1bXBfYml0bWFwCisgKiBTeW50YXgJOiB2b2lkIGR1bXBfYml0bWFwKGJpdG1hcF90ICpibXApCisgKiBJbnB1dAk6CisgKglibXAJLSBCaXRtYXAgcmVzb3VyY2UgZGVzY3JpcHRvcgorICogT3V0cHV0CTogbm9wCisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3ZvaWQgZHVtcF9iaXRtYXAoYml0bWFwX3QgKmJtcCkKK3sKKwlkdW1wX21lbW9wdChibXAtPm1lbW9wdCk7CisJZHVtcF9yYXdfZGF0YShibXAtPmRhdGEpOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IGR1bXBfcmNkYXRhCisgKiBTeW50YXgJOiB2b2lkIGR1bXBfcmNkYXRhKHJjZGF0YV90ICpyZHQpCisgKiBJbnB1dAk6CisgKglyZHQJLSBSQ0RhdGEgcmVzb3VyY2UgZGVzY3JpcHRvcgorICogT3V0cHV0CTogbm9wCisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3ZvaWQgZHVtcF9yY2RhdGEocmNkYXRhX3QgKnJkdCkKK3sKKwlkdW1wX21lbW9wdChyZHQtPm1lbW9wdCk7CisJZHVtcF9yYXdfZGF0YShyZHQtPmRhdGEpOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IGR1bXBfdXNlcgorICogU3ludGF4CTogdm9pZCBkdW1wX3VzZXIodXNlcl90ICp1c3IpCisgKiBJbnB1dAk6CisgKgl1c3IJLSBVc2VyIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqIE91dHB1dAk6IG5vcAorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCit2b2lkIGR1bXBfdXNlcih1c2VyX3QgKnVzcikKK3sKKwlkdW1wX21lbW9wdCh1c3ItPm1lbW9wdCk7CisJcHJpbnRmKCJDbGFzcyAlc1xuIiwgZ2V0X25hbWVpZF9zdHIodXNyLT50eXBlKSk7CisJZHVtcF9yYXdfZGF0YSh1c3ItPmRhdGEpOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IGR1bXBfbWVzc2FnZXRhYmxlCisgKiBTeW50YXgJOiB2b2lkIGR1bXBfbWVzc2FnZXRhYmxlKG1lc3NhZ2V0YWJsZV90ICptc2cpCisgKiBJbnB1dAk6CisgKgltc2cJLSBNZXNzYWdldGFibGUgcmVzb3VyY2UgZGVzY3JpcHRvcgorICogT3V0cHV0CTogbm9wCisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3ZvaWQgZHVtcF9tZXNzYWdldGFibGUobWVzc2FnZXRhYmxlX3QgKm1zZykKK3sKKwlkdW1wX3Jhd19kYXRhKG1zZy0+ZGF0YSk7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogZHVtcF9zdHJpbmd0YWJsZQorICogU3ludGF4CTogdm9pZCBkdW1wX3N0cmluZ3RhYmxlKHN0cmluZ3RhYmxlX3QgKnN0dCkKKyAqIElucHV0CToKKyAqCXN0dAktIFN0cmluZ3RhYmxlIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqIE91dHB1dAk6IG5vcAorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCit2b2lkIGR1bXBfc3RyaW5ndGFibGUoc3RyaW5ndGFibGVfdCAqc3R0KQoreworCWludCBpOworCWZvcig7IHN0dDsgc3R0ID0gc3R0LT5uZXh0KQorCXsKKwkJcHJpbnRmKCJ7XG4iKTsKKwkJZHVtcF9tZW1vcHQoc3R0LT5tZW1vcHQpOworCQlkdW1wX2x2YygmKHN0dC0+bHZjKSk7CisJCWZvcihpID0gMDsgaSA8IHN0dC0+bmVudHJpZXM7IGkrKykKKwkJeworCQkJcHJpbnRmKCJJZD0lLTVkICglZCkgIiwgc3R0LT5pZGJhc2UraSwgc3R0LT5lbnRyaWVzW2ldLmlkKTsKKwkJCWlmKHN0dC0+ZW50cmllc1tpXS5zdHIpCisJCQkJcHJpbnRfc3RyaW5nKHN0dC0+ZW50cmllc1tpXS5zdHIpOworCQkJZWxzZQorCQkJCXByaW50ZigiPG5vbmU+Iik7CisJCQlwcmludGYoIlxuIik7CisJCX0KKwkJcHJpbnRmKCJ9XG4iKTsKKwl9Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogZHVtcF9jb250cm9sCisgKiBTeW50YXgJOiB2b2lkIGR1bXBfY29udHJvbChjb250cm9sX3QgKmN0cmwpCisgKiBJbnB1dAk6CisgKgljdHJsCS0gQ29udHJvbCByZXNvdXJjZSBkZXNjcmlwdG9yCisgKiBPdXRwdXQJOgorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCit2b2lkIGR1bXBfY29udHJvbChjb250cm9sX3QgKmN0cmwpCit7CisJcHJpbnRmKCJDb250cm9sIHtcblx0Q2xhc3M6ICVzXG4iLCBnZXRfbmFtZWlkX3N0cihjdHJsLT5jdGxjbGFzcykpOworCXByaW50ZigiXHRUZXh0OiAiKTsgcHJpbnRfc3RyaW5nKGN0cmwtPnRpdGxlKTsgcHJpbnRmKCJcbiIpOworCXByaW50ZigiXHRJZDogJWRcbiIsIGN0cmwtPmlkKTsKKwlwcmludGYoIlx0eCwgeSwgdywgaDogJWQsICVkLCAlZCwgJWRcbiIsIGN0cmwtPngsIGN0cmwtPnksIGN0cmwtPndpZHRoLCBjdHJsLT5oZWlnaHQpOworCWlmKGN0cmwtPmdvdHN0eWxlKQorCQlwcmludGYoIlx0U3R5bGU6ICUwOGx4XG4iLCBjdHJsLT5zdHlsZSk7CisJaWYoY3RybC0+Z290ZXhzdHlsZSkKKwkJcHJpbnRmKCJcdEV4U3R5bGU6ICUwOGx4XG4iLCBjdHJsLT5leHN0eWxlKTsKKwlpZihjdHJsLT5nb3RoZWxwaWQpCisJCXByaW50ZigiXHRIZWxwaWQ6ICVsZFxuIiwgY3RybC0+aGVscGlkKTsKKwlpZihjdHJsLT5leHRyYSkKKwl7CisJCXByaW50ZigiXHQiKTsKKwkJZHVtcF9yYXdfZGF0YShjdHJsLT5leHRyYSk7CisJfQorCXByaW50ZigifVxuIik7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogZHVtcF9kaWFsb2cKKyAqIFN5bnRheAk6IHZvaWQgZHVtcF9kaWFsb2coZGlhbG9nX3QgKmRsZykKKyAqIElucHV0CToKKyAqCWRsZwktIERpYWxvZyByZXNvdXJjZSBkZXNjcmlwdG9yCisgKiBPdXRwdXQJOgorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCit2b2lkIGR1bXBfZGlhbG9nKGRpYWxvZ190ICpkbGcpCit7CisJY29udHJvbF90ICpjID0gZGxnLT5jb250cm9sczsKKworCWR1bXBfbWVtb3B0KGRsZy0+bWVtb3B0KTsKKwlkdW1wX2x2YygmKGRsZy0+bHZjKSk7CisJcHJpbnRmKCJ4LCB5LCB3LCBoOiAlZCwgJWQsICVkLCAlZFxuIiwgZGxnLT54LCBkbGctPnksIGRsZy0+d2lkdGgsIGRsZy0+aGVpZ2h0KTsKKwlpZihkbGctPmdvdHN0eWxlKQorCQlwcmludGYoIlN0eWxlOiAlMDhseFxuIiwgZGxnLT5zdHlsZSk7CisJaWYoZGxnLT5nb3RleHN0eWxlKQorCQlwcmludGYoIkV4U3R5bGU6ICUwOGx4XG4iLCBkbGctPmV4c3R5bGUpOworCXByaW50ZigiTWVudTogJXNcbiIsIGdldF9uYW1laWRfc3RyKGRsZy0+bWVudSkpOworCXByaW50ZigiQ2xhc3M6ICVzXG4iLCBnZXRfbmFtZWlkX3N0cihkbGctPmRsZ2NsYXNzKSk7CisJcHJpbnRmKCJUaXRsZTogIik7IHByaW50X3N0cmluZyhkbGctPnRpdGxlKTsgcHJpbnRmKCJcbiIpOworCXByaW50ZigiRm9udDogIik7CisJaWYoIWRsZy0+Zm9udCkKKwkJcHJpbnRmKCI8bm9uZT5cbiIpOworCWVsc2UKKwl7CisJCXByaW50ZigiJWQsICIsIGRsZy0+Zm9udC0+c2l6ZSk7CisJCXByaW50X3N0cmluZyhkbGctPmZvbnQtPm5hbWUpOworCQlwcmludGYoIlxuIik7CisJfQorCXdoaWxlKGMpCisJeworCQlkdW1wX2NvbnRyb2woYyk7CisJCWMgPSBjLT5uZXh0OworCX0KK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBkdW1wX2RpYWxvZ2V4CisgKiBTeW50YXgJOiB2b2lkIGR1bXBfZGlhbG9nZXgoZGlhbG9nZXhfdCAqZGxnZXgpCisgKiBJbnB1dAk6CisgKglkbGdleAktIERpYWxvZ0V4IHJlc291cmNlIGRlc2NyaXB0b3IKKyAqIE91dHB1dAk6CisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3ZvaWQgZHVtcF9kaWFsb2dleChkaWFsb2dleF90ICpkbGdleCkKK3sKKwljb250cm9sX3QgKmMgPSBkbGdleC0+Y29udHJvbHM7CisKKwlkdW1wX21lbW9wdChkbGdleC0+bWVtb3B0KTsKKwlkdW1wX2x2YygmKGRsZ2V4LT5sdmMpKTsKKwlwcmludGYoIngsIHksIHcsIGg6ICVkLCAlZCwgJWQsICVkXG4iLCBkbGdleC0+eCwgZGxnZXgtPnksIGRsZ2V4LT53aWR0aCwgZGxnZXgtPmhlaWdodCk7CisJaWYoZGxnZXgtPmdvdHN0eWxlKQorCQlwcmludGYoIlN0eWxlOiAlMDhseFxuIiwgZGxnZXgtPnN0eWxlKTsKKwlpZihkbGdleC0+Z290ZXhzdHlsZSkKKwkJcHJpbnRmKCJFeFN0eWxlOiAlMDhseFxuIiwgZGxnZXgtPmV4c3R5bGUpOworCWlmKGRsZ2V4LT5nb3RoZWxwaWQpCisJCXByaW50ZigiSGVscGlkOiAlbGRcbiIsIGRsZ2V4LT5oZWxwaWQpOworCXByaW50ZigiTWVudTogJXNcbiIsIGdldF9uYW1laWRfc3RyKGRsZ2V4LT5tZW51KSk7CisJcHJpbnRmKCJDbGFzczogJXNcbiIsIGdldF9uYW1laWRfc3RyKGRsZ2V4LT5kbGdjbGFzcykpOworCXByaW50ZigiVGl0bGU6ICIpOyBwcmludF9zdHJpbmcoZGxnZXgtPnRpdGxlKTsgcHJpbnRmKCJcbiIpOworCXByaW50ZigiRm9udDogIik7CisJaWYoIWRsZ2V4LT5mb250KQorCQlwcmludGYoIjxub25lPlxuIik7CisJZWxzZQorCXsKKwkJcHJpbnRmKCIlZCwgIiwgZGxnZXgtPmZvbnQtPnNpemUpOworCQlwcmludF9zdHJpbmcoZGxnZXgtPmZvbnQtPm5hbWUpOworCQlwcmludGYoIiwgJWQsICVkXG4iLCBkbGdleC0+Zm9udC0+d2VpZ2h0LCBkbGdleC0+Zm9udC0+aXRhbGljKTsKKwl9CisJd2hpbGUoYykKKwl7CisJCWR1bXBfY29udHJvbChjKTsKKwkJYyA9IGMtPm5leHQ7CisJfQorfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IGR1bXBfbWVudV9pdGVtCisgKiBTeW50YXgJOiB2b2lkIGR1bXBfbWVudV9pdGVtKG1lbnVfaXRlbV90ICppdGVtKQorICogSW5wdXQJOgorICogT3V0cHV0CToKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordm9pZCBkdW1wX21lbnVfaXRlbShtZW51X2l0ZW1fdCAqaXRlbSkKK3sKKwl3aGlsZShpdGVtKQorCXsKKwkJaWYoaXRlbS0+cG9wdXApCisJCXsKKwkJCXByaW50ZigiUE9QVVAgIik7CisJCQlwcmludF9zdHJpbmcoaXRlbS0+bmFtZSk7CisJCQlwcmludGYoIlxuIik7CisJCQlkdW1wX21lbnVfaXRlbShpdGVtLT5wb3B1cCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcmludGYoIk1FTlVJVEVNICIpOworCQkJaWYoaXRlbS0+bmFtZSkKKwkJCXsKKwkJCQlwcmludF9zdHJpbmcoaXRlbS0+bmFtZSk7CisJCQkJcHJpbnRmKCIsICVkLCAlMDhseCIsIGl0ZW0tPmlkLCBpdGVtLT5zdGF0ZSk7CisJCQl9CisJCQllbHNlCisJCQkJcHJpbnRmKCJTRVBBUkFUT1IiKTsKKwkJCXByaW50ZigiXG4iKTsKKwkJfQorCQlpdGVtID0gaXRlbS0+bmV4dDsKKwl9Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogZHVtcF9tZW51CisgKiBTeW50YXgJOiB2b2lkIGR1bXBfbWVudShtZW51X3QgKm1lbikKKyAqIElucHV0CToKKyAqCW1lbgktIE1lbnUgcmVzb3VyY2UgZGVzY3JpcHRvcgorICogT3V0cHV0CToKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordm9pZCBkdW1wX21lbnUobWVudV90ICptZW4pCit7CisJZHVtcF9tZW1vcHQobWVuLT5tZW1vcHQpOworCWR1bXBfbHZjKCYobWVuLT5sdmMpKTsKKwlkdW1wX21lbnVfaXRlbShtZW4tPml0ZW1zKTsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBkdW1wX21lbnVleF9pdGVtCisgKiBTeW50YXgJOiB2b2lkIGR1bXBfbWVudWV4X2l0ZW0obWVudWV4X2l0ZW1fdCAqaXRlbSkKKyAqIElucHV0CToKKyAqIE91dHB1dAk6CisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3ZvaWQgZHVtcF9tZW51ZXhfaXRlbShtZW51ZXhfaXRlbV90ICppdGVtKQoreworCXdoaWxlKGl0ZW0pCisJeworCQlpZihpdGVtLT5wb3B1cCkKKwkJeworCQkJcHJpbnRmKCJQT1BVUCAiKTsKKwkJCXByaW50X3N0cmluZyhpdGVtLT5uYW1lKTsKKwkJCWlmKGl0ZW0tPmdvdGlkKQorCQkJCXByaW50ZigiLCBJZD0lZCIsIGl0ZW0tPmlkKTsKKwkJCWlmKGl0ZW0tPmdvdHR5cGUpCisJCQkJcHJpbnRmKCIsIFR5cGU9JWxkIiwgaXRlbS0+dHlwZSk7CisJCQlpZihpdGVtLT5nb3RzdGF0ZSkKKwkJCQlwcmludGYoIiwgU3RhdGU9JTA4bHgiLCBpdGVtLT5zdGF0ZSk7CisJCQlpZihpdGVtLT5nb3RoZWxwaWQpCisJCQkJcHJpbnRmKCIsIEhlbHBJZD0lZCIsIGl0ZW0tPmhlbHBpZCk7CisJCQlwcmludGYoIlxuIik7CisJCQlkdW1wX21lbnVleF9pdGVtKGl0ZW0tPnBvcHVwKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50ZigiTUVOVUlURU0gIik7CisJCQlpZihpdGVtLT5uYW1lKQorCQkJeworCQkJCXByaW50X3N0cmluZyhpdGVtLT5uYW1lKTsKKwkJCQlpZihpdGVtLT5nb3RpZCkKKwkJCQkJcHJpbnRmKCIsIElkPSVkIiwgaXRlbS0+aWQpOworCQkJCWlmKGl0ZW0tPmdvdHR5cGUpCisJCQkJCXByaW50ZigiLCBUeXBlPSVsZCIsIGl0ZW0tPnR5cGUpOworCQkJCWlmKGl0ZW0tPmdvdHN0YXRlKQorCQkJCQlwcmludGYoIiwgU3RhdGU9JTA4bHgiLCBpdGVtLT5zdGF0ZSk7CisJCQkJaWYoaXRlbS0+Z290aGVscGlkKQorCQkJCQlwcmludGYoIiwgSGVscElkPSVkIiwgaXRlbS0+aGVscGlkKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlwcmludGYoIlNFUEFSQVRPUiIpOworCQkJcHJpbnRmKCJcbiIpOworCQl9CisJCWl0ZW0gPSBpdGVtLT5uZXh0OworCX0KK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBkdW1wX21lbnVleAorICogU3ludGF4CTogdm9pZCBkdW1wX21lbnVleChkaWFsb2dleF90ICptZW5leCkKKyAqIElucHV0CToKKyAqCW1lbmV4CS0gTWVudUV4IHJlc291cmNlIGRlc2NyaXB0b3IKKyAqIE91dHB1dAk6CisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3ZvaWQgZHVtcF9tZW51ZXgobWVudWV4X3QgKm1lbmV4KQoreworCWR1bXBfbWVtb3B0KG1lbmV4LT5tZW1vcHQpOworCWR1bXBfbHZjKCYobWVuZXgtPmx2YykpOworCWR1bXBfbWVudWV4X2l0ZW0obWVuZXgtPml0ZW1zKTsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBkdW1wX3Zlcl92YWx1ZQorICogU3ludGF4CTogdm9pZCBkdW1wX3Zlcl92YWx1ZSh2ZXJfdmFsdWVfdCAqdmFsKQorICogSW5wdXQJOgorICogT3V0cHV0CToKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordm9pZCBkdW1wX3Zlcl92YWx1ZSh2ZXJfdmFsdWVfdCAqdmFsKQoreworCWV4dGVybiB2b2lkIGR1bXBfdmVyX2Jsb2NrKHZlcl9ibG9ja190ICopOworCWlmKHZhbC0+dHlwZSA9PSB2YWxfc3RyKQorCXsKKwkJcHJpbnRmKCJWQUxVRSAiKTsKKwkJcHJpbnRfc3RyaW5nKHZhbC0+a2V5KTsKKwkJcHJpbnRmKCIgIik7CisJCXByaW50X3N0cmluZyh2YWwtPnZhbHVlLnN0cik7CisJCXByaW50ZigiXG4iKTsKKwl9CisJZWxzZSBpZih2YWwtPnR5cGUgPT0gdmFsX3dvcmRzKQorCXsKKwkJaW50IGk7CisJCXByaW50ZigiVkFMVUUiKTsKKwkJcHJpbnRfc3RyaW5nKHZhbC0+a2V5KTsKKwkJZm9yKGkgPSAwOyBpIDwgdmFsLT52YWx1ZS53b3Jkcy0+bndvcmRzOyBpKyspCisJCQlwcmludGYoIiAlMDR4IiwgdmFsLT52YWx1ZS53b3Jkcy0+d29yZHNbaV0pOworCQlwcmludGYoIlxuIik7CisJfQorCWVsc2UgaWYodmFsLT50eXBlID09IHZhbF9ibG9jaykKKwl7CisJCWR1bXBfdmVyX2Jsb2NrKHZhbC0+dmFsdWUuYmxvY2spOworCX0KK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBkdW1wX3Zlcl9ibG9jaworICogU3ludGF4CTogdm9pZCBkdW1wX3Zlcl9ibG9jayh2ZXJfYmxvY2tfdCAqYmxrKQorICogSW5wdXQJOgorICogT3V0cHV0CToKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordm9pZCBkdW1wX3Zlcl9ibG9jayh2ZXJfYmxvY2tfdCAqYmxrKQoreworCXZlcl92YWx1ZV90ICp2YWwgPSBibGstPnZhbHVlczsKKwlwcmludGYoIkJMT0NLICIpOworCXByaW50X3N0cmluZyhibGstPm5hbWUpOworCXByaW50ZigiXG57XG4iKTsKKwl3aGlsZSh2YWwpCisJeworCQlkdW1wX3Zlcl92YWx1ZSh2YWwpOworCQl2YWwgPSB2YWwtPm5leHQ7CisJfQorCXByaW50ZigifVxuIik7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogZHVtcF92ZXJzaW9uaW5mbworICogU3ludGF4CTogdm9pZCBkdW1wX3ZlcnNpb25pbmZvKHZlcnNpb25pbmZvX3QgKnZlcikKKyAqIElucHV0CToKKyAqCXZlcgktIFZlcnNpb25pbmZvIHJlc291cmNlIGRlc2NyaXB0b3IKKyAqIE91dHB1dAk6CisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3ZvaWQgZHVtcF92ZXJzaW9uaW5mbyh2ZXJzaW9uaW5mb190ICp2ZXIpCit7CisJdmVyX2Jsb2NrX3QgKmJsayA9IHZlci0+YmxvY2tzOworCisJaWYodmVyLT5nb3RpdC5mdikKKwkJcHJpbnRmKCJGSUxFVkVSU0lPTiAlMDR4LCAlMDR4LCAlMDR4LCAlMDR4XG4iLAorCQkJdmVyLT5maWxldmVyX21hajEsCisJCQl2ZXItPmZpbGV2ZXJfbWFqMiwKKwkJCXZlci0+ZmlsZXZlcl9taW4xLAorCQkJdmVyLT5maWxldmVyX21pbjIpOworCWlmKHZlci0+Z290aXQucHYpCisJCXByaW50ZigiUFJPRFVDVFZFUlNJT04gJTA0eCwgJTA0eCwgJTA0eCwgJTA0eFxuIiwKKwkJCXZlci0+cHJvZHZlcl9tYWoxLAorCQkJdmVyLT5wcm9kdmVyX21hajIsCisJCQl2ZXItPnByb2R2ZXJfbWluMSwKKwkJCXZlci0+cHJvZHZlcl9taW4yKTsKKwlpZih2ZXItPmdvdGl0LmZvKQorCQlwcmludGYoIkZJTEVPUyAlMDh4XG4iLCB2ZXItPmZpbGVvcyk7CisJaWYodmVyLT5nb3RpdC5mZikKKwkJcHJpbnRmKCJGSUxFRkxBR1MgJTA4eFxuIiwgdmVyLT5maWxlZmxhZ3MpOworCWlmKHZlci0+Z290aXQuZmZtKQorCQlwcmludGYoIkZJTEVGTEFHU01BU0sgJTA4eFxuIiwgdmVyLT5maWxlZmxhZ3NtYXNrKTsKKwlpZih2ZXItPmdvdGl0LmZ0KQorCQlwcmludGYoIkZJTEVUWVBFICUwOHhcbiIsIHZlci0+ZmlsZXR5cGUpOworCWlmKHZlci0+Z290aXQuZnN0KQorCQlwcmludGYoIkZJTEVTVUJUWVBFICUwOHhcbiIsIHZlci0+ZmlsZXN1YnR5cGUpOworCXdoaWxlKGJsaykKKwl7CisJCWR1bXBfdmVyX2Jsb2NrKGJsayk7CisJCWJsayA9IGJsay0+bmV4dDsKKwl9Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCToKKyAqIFN5bnRheAk6CisgKiBJbnB1dAk6CisgKiBPdXRwdXQJOgorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IGR1bXBfcmVzb3VyY2VzCisgKiBTeW50YXgJOiB2b2lkIGR1bXBfcmVzb3VyY2VzKHJlc291cmNlX3QgKnRvcCkKKyAqIElucHV0CToKKyAqCXRvcAktIFRvcCBvZiB0aGUgcmVzb3VyY2UgdHJlZQorICogT3V0cHV0CToKKyAqCW5vcAorICogRGVzY3JpcHRpb24JOiBEdW1wIHRoZSBwYXJzZWQgcmVzb3VyY2UtdHJlZSB0byBzdGRvdXQKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordm9pZCBkdW1wX3Jlc291cmNlcyhyZXNvdXJjZV90ICp0b3ApCit7CisJcHJpbnRmKCJJbnRlcm5hbCByZXNvdXJjZS10cmVlIGR1bXA6XG4iKTsKKwl3aGlsZSh0b3ApCisJeworCQlwcmludGYoIlJlc291cmNlOiAlc1xuSWQ6ICVzXG4iLAorCQkgICAgICAgZ2V0X3R5cGVuYW1lKHRvcCksCisJCSAgICAgICBnZXRfbmFtZWlkX3N0cih0b3AtPm5hbWUpKTsKKwkJc3dpdGNoKHRvcC0+dHlwZSkKKwkJeworCQljYXNlIHJlc19hY2M6CisJCQlkdW1wX2FjY2VsZXJhdG9yKHRvcC0+cmVzLmFjYyk7CisJCQlicmVhazsKKwkJY2FzZSByZXNfYm1wOgorCQkJZHVtcF9iaXRtYXAodG9wLT5yZXMuYm1wKTsKKwkJCWJyZWFrOworCQljYXNlIHJlc19jdXI6CisJCQlkdW1wX2N1cnNvcih0b3AtPnJlcy5jdXIpOworCQkJYnJlYWs7CisJCWNhc2UgcmVzX2N1cmc6CisJCQlkdW1wX2N1cnNvcl9ncm91cCh0b3AtPnJlcy5jdXJnKTsKKwkJCWJyZWFrOworCQljYXNlIHJlc19kbGc6CisJCQlkdW1wX2RpYWxvZyh0b3AtPnJlcy5kbGcpOworCQkJYnJlYWs7CisJCWNhc2UgcmVzX2RsZ2V4OgorCQkJZHVtcF9kaWFsb2dleCh0b3AtPnJlcy5kbGdleCk7CisJCQlicmVhazsKKwkJY2FzZSByZXNfZm50OgorCQkJZHVtcF9mb250KHRvcC0+cmVzLmZudCk7CisJCQlicmVhazsKKwkJY2FzZSByZXNfaWNvZzoKKwkJCWR1bXBfaWNvbl9ncm91cCh0b3AtPnJlcy5pY29nKTsKKwkJCWJyZWFrOworCQljYXNlIHJlc19pY286CisJCQlkdW1wX2ljb24odG9wLT5yZXMuaWNvKTsKKwkJCWJyZWFrOworCQljYXNlIHJlc19tZW46CisJCQlkdW1wX21lbnUodG9wLT5yZXMubWVuKTsKKwkJCWJyZWFrOworCQljYXNlIHJlc19tZW5leDoKKwkJCWR1bXBfbWVudWV4KHRvcC0+cmVzLm1lbmV4KTsKKwkJCWJyZWFrOworCQljYXNlIHJlc19yZHQ6CisJCQlkdW1wX3JjZGF0YSh0b3AtPnJlcy5yZHQpOworCQkJYnJlYWs7CisJCWNhc2UgcmVzX3N0dDoKKwkJCWR1bXBfc3RyaW5ndGFibGUodG9wLT5yZXMuc3R0KTsKKwkJCWJyZWFrOworCQljYXNlIHJlc191c3I6CisJCQlkdW1wX3VzZXIodG9wLT5yZXMudXNyKTsKKwkJCWJyZWFrOworCQljYXNlIHJlc19tc2c6CisJCQlkdW1wX21lc3NhZ2V0YWJsZSh0b3AtPnJlcy5tc2cpOworCQkJYnJlYWs7CisJCWNhc2UgcmVzX3ZlcjoKKwkJCWR1bXBfdmVyc2lvbmluZm8odG9wLT5yZXMudmVyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJSZXBvcnQgdGhpczogVW5rbm93biByZXNvdXJjZSB0eXBlIHBhcnNlZCAlMDh4XG4iLCB0b3AtPnR5cGUpOworCQl9CisJCXByaW50ZigiXG4iKTsKKwkJdG9wID0gdG9wLT5uZXh0OworCX0KK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvd3JjL2R1bXByZXMuaCBiL3Rvb2xzL3dyYy9kdW1wcmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlOTY1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3dyYy9kdW1wcmVzLmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIER1bXAgcmVzb3VyY2UgcHJvdG90eXBlcworICoKKyAqIENvcHlyaWdodCAxOTk4IEJlcnRobyBBLiBTdHVsdGllbnMgKEJTKQorICoKKyAqLworCisjaWZuZGVmIF9fV1JDX0RVTVBSRVNfSAorI2RlZmluZSBfX1dSQ19EVU1QUkVTX0gKKworI2lmbmRlZiBfX1dSQ19XUkNUWVBFU19ICisjaW5jbHVkZSAid3JjdHlwZXMuaCIKKyNlbmRpZgorCitjaGFyICpnZXRfdHlwZW5hbWUocmVzb3VyY2VfdCogcik7Cit2b2lkIGR1bXBfcmVzb3VyY2VzKHJlc291cmNlX3QgKnRvcCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvd3JjL2dlbnJlcy5jIGIvdG9vbHMvd3JjL2dlbnJlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZTgzMWMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy93cmMvZ2VucmVzLmMKQEAgLTAsMCArMSwxNjY4IEBACisvKgorICogR2VuZXJhdGUgLnJlcyBmb3JtYXQgZnJvbSBhIHJlc291cmNlLXRyZWUKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBCZXJ0aG8gQS4gU3R1bHRpZW5zCisgKgorICogMjUtTWF5LTE5OTggQlMJLSBBZGRlZCBzaW1wbGUgdW5pY29kZSAtPiBjaGFyIGNvbnZlcnNpb24gZm9yIHJlc291cmNlCisgKgkJCSAgbmFtZXMgaW4gLnMgYW5kIC5oIGZpbGVzLiAgCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgIndyYy5oIgorI2luY2x1ZGUgImdlbnJlcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKyNkZWZpbmUgU2V0UmVzU2l6ZShyZXMsIHRhZykJKihEV09SRCAqKSYoKHJlcyktPmRhdGFbKHRhZyldKSA9IFwKKwkJCQkocmVzKS0+c2l6ZSAtICooRFdPUkQgKikmKChyZXMpLT5kYXRhWyh0YWcpXSkKKworcmVzX3QgKm5ld19yZXModm9pZCkKK3sKKwlyZXNfdCAqcjsKKwlyID0gKHJlc190ICopeG1hbGxvYyhzaXplb2YocmVzX3QpKTsKKwlyLT5hbGxvY3NpemUgPSBSRVNfQkxPQ0tTSVpFOworCXItPnNpemUgPSAwOworCXItPmRhdGEgPSAoY2hhciAqKXhtYWxsb2MoUkVTX0JMT0NLU0laRSk7CisJcmV0dXJuIHI7Cit9CisKK3Jlc190ICpncm93X3JlcyhyZXNfdCAqciwgaW50IGFkZCkKK3sKKwlyLT5hbGxvY3NpemUgKz0gYWRkOworCXItPmRhdGEgPSAoY2hhciAqKXhyZWFsbG9jKHItPmRhdGEsIHItPmFsbG9jc2l6ZSk7CisJcmV0dXJuIHI7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogcHV0X2J5dGUKKyAqCQkgIHB1dF93b3JkCisgKgkJICBwdXRfZHdvcmQKKyAqIFN5bnRheAk6IHZvaWQgcHV0X2J5dGUocmVzX3QgKnJlcywgdW5zaWduZWQgYykKKyAqCQkgIHZvaWQgcHV0X3dvcmQocmVzX3QgKnJlcywgdW5zaWduZWQgdykKKyAqCQkgIHZvaWQgcHV0X2R3b3JkKHJlc190ICpyZXMsIHVuc2lnbmVkIGQpCisgKiBJbnB1dAk6CisgKglyZXMJLSBCaW5hcnkgcmVzb3VyY2UgdG8gcHV0IHRoZSBkYXRhIGluCisgKgljLCB3LCBkCS0gRGF0YSB0byBwdXQKKyAqIE91dHB1dAk6IG5vcAorICogRGVzY3JpcHRpb24JOiBQdXQgcHJpbWl0aXZlcyB0aGF0IHB1dCBhbiBpdGVtIGluIHRoZSBiaW5hcnkgcmVzb3VyY2UuCisgKgkJICBUaGUgZGF0YSBhcnJheSBncm93cyBhdXRvbWF0aWNhbGx5LgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCit2b2lkIHB1dF9ieXRlKHJlc190ICpyZXMsIHVuc2lnbmVkIGMpCit7CisJaWYocmVzLT5hbGxvY3NpemUgLSByZXMtPnNpemUgPCBzaXplb2YoY2hhcikpCisJCWdyb3dfcmVzKHJlcywgUkVTX0JMT0NLU0laRSk7CisJKihjaGFyICopJihyZXMtPmRhdGFbcmVzLT5zaXplXSkgPSAoY2hhciljOworCXJlcy0+c2l6ZSArPSBzaXplb2YoY2hhcik7Cit9CisKK3ZvaWQgcHV0X3dvcmQocmVzX3QgKnJlcywgdW5zaWduZWQgdykKK3sKKwlpZihyZXMtPmFsbG9jc2l6ZSAtIHJlcy0+c2l6ZSA8IHNpemVvZihXT1JEKSkKKwkJZ3Jvd19yZXMocmVzLCBSRVNfQkxPQ0tTSVpFKTsKKwkqKFdPUkQgKikmKHJlcy0+ZGF0YVtyZXMtPnNpemVdKSA9IChXT1JEKXc7CisJcmVzLT5zaXplICs9IHNpemVvZihXT1JEKTsKK30KKwordm9pZCBwdXRfZHdvcmQocmVzX3QgKnJlcywgdW5zaWduZWQgZCkKK3sKKwlpZihyZXMtPmFsbG9jc2l6ZSAtIHJlcy0+c2l6ZSA8IHNpemVvZihEV09SRCkpCisJCWdyb3dfcmVzKHJlcywgUkVTX0JMT0NLU0laRSk7CisJKihEV09SRCAqKSYocmVzLT5kYXRhW3Jlcy0+c2l6ZV0pID0gKERXT1JEKWQ7CisJcmVzLT5zaXplICs9IHNpemVvZihEV09SRCk7Cit9CisKK3ZvaWQgcHV0X3BhZChyZXNfdCAqcmVzKQoreworCXdoaWxlKHJlcy0+c2l6ZSAmIDB4MykKKwkJcHV0X2J5dGUocmVzLCAwKTsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBzdHJpbmdfdG9fdXBwZXIKKyAqIFN5bnRheAk6IHZvaWQgc3RyaW5nX3RvX3VwcGVyKHN0cmluZ190ICpzdHIpCisgKiBJbnB1dAk6CisgKiBPdXRwdXQJOgorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6IEZJWE1FOiBjb2RlcGFnZXMuLi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3ZvaWQgc3RyaW5nX3RvX3VwcGVyKHN0cmluZ190ICpzdHIpCit7CisJaWYoc3RyLT50eXBlID09IHN0cl9jaGFyKQorCXsKKwkJY2hhciAqY3B0ciA9IHN0ci0+c3RyLmNzdHI7CisJCWZvcig7ICpjcHRyOyBjcHRyKyspCisJCQkqY3B0ciA9IChjaGFyKXRvdXBwZXIoKmNwdHIpOworCX0KKwllbHNlIGlmKHN0ci0+dHlwZSA9PSBzdHJfdW5pY29kZSkKKwl7CisJCXNob3J0ICpzcHRyID0gc3RyLT5zdHIud3N0cjsKKwkJZm9yKDsgKnNwdHI7IHNwdHIrKykKKwkJCWlmKGlzYWxwaGEoKnNwdHIpKQorCQkJCSpzcHRyID0gKHNob3J0KXRvdXBwZXIoKnNwdHIpOworCX0KKwllbHNlCisJeworCQlpbnRlcm5hbF9lcnJvcihfX0ZJTEVfXywgX19MSU5FX18sICJJbnZhbGlkIHN0cmluZyB0eXBlICVkIiwgc3RyLT50eXBlKTsKKwl9Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogcHV0X3N0cmluZworICogU3ludGF4CTogdm9pZCBwdXRfc3RyaW5nKHJlc190ICpyZXMsIHN0cmluZ190ICpzdHIsIGVudW0gc3RyX2UgdHlwZSwKKyAqCQkJCSAgaW50IGlzdGVybSkKKyAqIElucHV0CToKKyAqCXJlcwktIEJpbmFyeSByZXNvdXJjZSB0byBwdXQgdGhlIGRhdGEgaW4KKyAqCXN0cgktIFN0cmluZyB0byBwdXQKKyAqCXR5cGUJLSBEYXRhIGhhcyB0byBiZSB3cml0dGVuIGluIGVpdGhlciBzdHJfY2hhciBvciBzdHJfdW5pY29kZQorICoJaXN0ZXJtCS0gVGhlIHN0cmluZyBpcyAnXDAnIHRlcm1pbmF0ZWQgKGRpc3JlZ2FyZCB0aGUgc3RyaW5nJ3MKKyAqCQkgIHNpemUgbWVtYmVyKQorICogT3V0cHV0CTogbm9wCisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3ZvaWQgcHV0X3N0cmluZyhyZXNfdCAqcmVzLCBzdHJpbmdfdCAqc3RyLCBlbnVtIHN0cl9lIHR5cGUsIGludCBpc3Rlcm0pCit7CisJaW50IGNudDsKKwlpbnQgYyA9ICEwOworCWFzc2VydChyZXMgIT0gTlVMTCk7CisJYXNzZXJ0KHN0ciAhPSBOVUxMKTsKKwlpZighaXN0ZXJtICYmIHN0ci0+c2l6ZSA9PSAwKQorCXsKKwkJd2FybmluZygiU3RyaW5nIGxlbmd0aCBpcyB6ZXJvLCBub3Qgd3JpdHRlbiIpOworCQlyZXR1cm47CisJfQorCisJaWYoc3RyLT50eXBlID09IHN0cl91bmljb2RlICYmIHR5cGUgPT0gc3RyX3VuaWNvZGUpCisJeworCQlmb3IoY250ID0gMDsgY250IDwgc3RyLT5zaXplOyBjbnQrKykKKwkJeworCQkJYyA9IHN0ci0+c3RyLndzdHJbY250XTsKKwkJCXB1dF93b3JkKHJlcywgYyk7CisJCQlpZihpc3Rlcm0gJiYgIWMpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYoaXN0ZXJtICYmIChzdHItPnNpemUgPT0gMCB8fCAoY250ID09IHN0ci0+c2l6ZSAmJiBjKSkpCisJCQlwdXRfd29yZChyZXMsIDApOworCX0KKwllbHNlIGlmKHN0ci0+dHlwZSA9PSBzdHJfY2hhciAmJiB0eXBlID09IHN0cl9jaGFyKQorCXsKKwkJZm9yKGNudCA9IDA7IGNudCA8IHN0ci0+c2l6ZTsgY250KyspCisJCXsKKwkJCWMgPSBzdHItPnN0ci5jc3RyW2NudF07CisJCQlwdXRfYnl0ZShyZXMsIGMpOworCQkJaWYoaXN0ZXJtICYmICFjKQorCQkJCWJyZWFrOworCQl9CisJCWlmKGlzdGVybSAmJiAoc3RyLT5zaXplID09IDAgfHwgKGNudCA9PSBzdHItPnNpemUgJiYgYykpKQorCQkJcHV0X2J5dGUocmVzLCAwKTsKKwl9CisJZWxzZSBpZihzdHItPnR5cGUgPT0gc3RyX3VuaWNvZGUgJiYgdHlwZSA9PSBzdHJfY2hhcikKKwl7CisJCWZvcihjbnQgPSAwOyBjbnQgPCBzdHItPnNpemU7IGNudCsrKQorCQl7CisJCQljID0gc3RyLT5zdHIud3N0cltjbnRdOworCQkJcHV0X2J5dGUocmVzLCBjKTsKKwkJCWlmKGlzdGVybSAmJiAhYykKKwkJCQlicmVhazsKKwkJfQorCQlpZihpc3Rlcm0gJiYgKHN0ci0+c2l6ZSA9PSAwIHx8IChjbnQgPT0gc3RyLT5zaXplICYmIGMpKSkKKwkJCXB1dF9ieXRlKHJlcywgMCk7CisJfQorCWVsc2UgLyogc3RyLT50eXBlID09IHN0cl9jaGFyICYmIHR5cGUgPT0gc3RyX3VuaWNvZGUgKi8KKwl7CisJCWZvcihjbnQgPSAwOyBjbnQgPCBzdHItPnNpemU7IGNudCsrKQorCQl7CisJCQljID0gc3RyLT5zdHIuY3N0cltjbnRdOworCQkJcHV0X3dvcmQocmVzLCBjICYgMHhmZik7CisJCQlpZihpc3Rlcm0gJiYgIWMpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYoaXN0ZXJtICYmIChzdHItPnNpemUgPT0gMCB8fCAoY250ID09IHN0ci0+c2l6ZSAmJiBjKSkpCisJCQlwdXRfd29yZChyZXMsIDApOworCX0KK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBwdXRfbmFtZV9pZAorICogU3ludGF4CTogdm9pZCBwdXRfbmFtZV9pZChyZXNfdCAqcmVzLCBuYW1lX2lkX3QgKm5pZCwgaW50IHVwY2FzZSkKKyAqIElucHV0CToKKyAqIE91dHB1dAk6CisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3ZvaWQgcHV0X25hbWVfaWQocmVzX3QgKnJlcywgbmFtZV9pZF90ICpuaWQsIGludCB1cGNhc2UpCit7CisJaWYobmlkLT50eXBlID09IG5hbWVfb3JkKQorCXsKKwkJaWYod2luMzIpCisJCQlwdXRfd29yZChyZXMsIDB4ZmZmZik7CisJCWVsc2UKKwkJCXB1dF9ieXRlKHJlcywgMHhmZik7CisJCXB1dF93b3JkKHJlcywgKFdPUkQpbmlkLT5uYW1lLmlfbmFtZSk7CisJfQorCWVsc2UgaWYobmlkLT50eXBlID09IG5hbWVfc3RyKQorCXsKKwkJaWYodXBjYXNlKQorCQkJc3RyaW5nX3RvX3VwcGVyKG5pZC0+bmFtZS5zX25hbWUpOworCQlwdXRfc3RyaW5nKHJlcywgbmlkLT5uYW1lLnNfbmFtZSwgd2luMzIgPyBzdHJfdW5pY29kZSA6IHN0cl9jaGFyLCBUUlVFKTsKKwl9CisJZWxzZQorCXsKKwkJaW50ZXJuYWxfZXJyb3IoX19GSUxFX18sIF9fTElORV9fLCAiSW52YWxpZCBuYW1lX2lkIHR5cGUgJWQiLCBuaWQtPnR5cGUpOworCX0KK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBwdXRfbHZjCisgKiBTeW50YXgJOiB2b2lkIHB1dF9sdmMocmVzX3QgKnJlcywgbHZjX3QgKmx2YykKKyAqIElucHV0CToKKyAqIE91dHB1dAk6CisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3ZvaWQgcHV0X2x2YyhyZXNfdCAqcmVzLCBsdmNfdCAqbHZjKQoreworCWlmKGx2YyAmJiBsdmMtPmxhbmd1YWdlKQorCQlwdXRfd29yZChyZXMsIE1BS0VMQU5HSUQobHZjLT5sYW5ndWFnZS0+aWQsIGx2Yy0+bGFuZ3VhZ2UtPnN1YikpOworCWVsc2UKKwkJcHV0X3dvcmQocmVzLCAwKTsJLyogTmV1dHJhbCAqLworCWlmKGx2YyAmJiBsdmMtPnZlcnNpb24pCisJCXB1dF9kd29yZChyZXMsICoobHZjLT52ZXJzaW9uKSk7CisJZWxzZQorCQlwdXRfZHdvcmQocmVzLCAwKTsKKwlpZihsdmMgJiYgbHZjLT5jaGFyYWN0cykKKwkJcHV0X2R3b3JkKHJlcywgKihsdmMtPmNoYXJhY3RzKSk7CisJZWxzZQorCQlwdXRfZHdvcmQocmVzLCAwKTsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBwdXRfcmF3X2RhdGEKKyAqIFN5bnRheAk6IHZvaWQgcHV0X3Jhd19kYXRhKHJlc190ICpyZXMsIHJhd19kYXRhX3QgKnJhdywgaW50IG9mZnNldCkKKyAqIElucHV0CToKKyAqIE91dHB1dAk6CisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3ZvaWQgcHV0X3Jhd19kYXRhKHJlc190ICpyZXMsIHJhd19kYXRhX3QgKnJhdywgaW50IG9mZnNldCkKK3sKKwlpbnQgd3NpemUgPSByYXctPnNpemUgLSBvZmZzZXQ7CisJaWYocmVzLT5hbGxvY3NpemUgLSByZXMtPnNpemUgPCB3c2l6ZSkKKwkJZ3Jvd19yZXMocmVzLCB3c2l6ZSk7CisJbWVtY3B5KCYocmVzLT5kYXRhW3Jlcy0+c2l6ZV0pLCByYXctPmRhdGEgKyBvZmZzZXQsIHdzaXplKTsKKwlyZXMtPnNpemUgKz0gd3NpemU7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogcHV0X3Jlc19oZWFkZXIKKyAqIFN5bnRheAk6IGludHB1dF9yZXNfaGVhZGVyKHJlc190ICpyZXMsIGludCB0eXBlLCBuYW1lX2lkX3QgKm50eXBlLAorICoJCQkJICAgIG5hbWVfaWRfdCAqbmFtZSwgRFdPUkQgbWVtb3B0LCBsdmNfdCAqbHZjKQorICoKKyAqIElucHV0CToKKyAqCXJlcwktIEJpbmFyeSByZXNvdXJjZSBkZXNjcmlwdG9yIHRvIHdyaXRlIHRvCisgKgl0eXBlCS0gUmVzb3VyY2UgaWRlbnRpZmllciAoaWYgbnR5cGUgPT0gTlVMTCkKKyAqCW50eXBlCS0gTmFtZSBpZCBvZiB0eXBlCisgKgluYW1lCS0gUmVzb3VyY2UncyBuYW1lCisgKgltZW1vcHQJLSBSZXNvdXJjZSdzIG1lbW9yeSBvcHRpb25zIHRvIHdyaXRlCisgKglsdmMJLSBMYW5ndWFnZSwgdmVyc2lvbiBhbmQgY2hhcmFjdGVyaXN0aWNzICh3aW4zMiBvbmx5KQorICogT3V0cHV0CTogQW4gaW5kZXggdG8gdGhlIHJlc291cmNlIHNpemUgZmllbGQuIFRoZSByZXNvdXJjZSBzaXplIGZpZWxkCisgKgkJICBjb250YWlucyB0aGUgaGVhZGVyIHNpemUgdXBvbiBleGl0LgorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitpbnQgcHV0X3Jlc19oZWFkZXIocmVzX3QgKnJlcywgaW50IHR5cGUsIG5hbWVfaWRfdCAqbnR5cGUsIG5hbWVfaWRfdCAqbmFtZSwKKwkJICAgICAgRFdPUkQgbWVtb3B0LCBsdmNfdCAqbHZjKQoreworCWlmKHdpbjMyKQorCXsKKwkJcHV0X2R3b3JkKHJlcywgMCk7CQkvKiBXZSB3aWxsIG92ZXJ3cml0ZSB0aGVzZSBsYXRlciAqLworCQlwdXRfZHdvcmQocmVzLCAwKTsKKwkJaWYoIW50eXBlKQorCQl7CisJCQlwdXRfd29yZChyZXMsIDB4ZmZmZik7CQkvKiBSZXNUeXBlICovCisJCQlwdXRfd29yZChyZXMsIHR5cGUpOworCQl9CisJCWVsc2UKKwkJCXB1dF9uYW1lX2lkKHJlcywgbnR5cGUsIFRSVUUpOworCQlwdXRfbmFtZV9pZChyZXMsIG5hbWUsIFRSVUUpOwkvKiBSZXNOYW1lICovCisJCXB1dF9wYWQocmVzKTsKKwkJcHV0X2R3b3JkKHJlcywgMCk7CQkvKiBEYXRhVmVyc2lvbiAqLworCQlwdXRfd29yZChyZXMsIG1lbW9wdCk7CQkvKiBNZW1vcnkgb3B0aW9ucyAqLworCQlwdXRfbHZjKHJlcywgbHZjKTsJCS8qIExhbmd1YWdlLCB2ZXJzaW9uIGFuZCBjaGFyYWN0cyAqLworCQkoKERXT1JEICopcmVzLT5kYXRhKVswXSA9IHJlcy0+c2l6ZTsJLyogU2V0IHByZWxpbWluYXJ5IHJlc291cmNlICovCisJCSgoRFdPUkQgKilyZXMtPmRhdGEpWzFdID0gcmVzLT5zaXplOwkvKiBTZXQgSGVhZGVyU2l6ZSAqLworCQlyZXMtPmRhdGFpZHggPSByZXMtPnNpemU7CisJCXJldHVybiAwOworCX0KKwllbHNlIC8qIHdpbjE2ICovCisJeworCQlpbnQgdGFnOworCQlpZighbnR5cGUpCisJCXsKKwkJCXB1dF9ieXRlKHJlcywgMHhmZik7CQkvKiBSZXNUeXBlICovCisJCQlwdXRfd29yZChyZXMsIHR5cGUpOworCQl9CisJCWVsc2UKKwkJCXB1dF9uYW1lX2lkKHJlcywgbnR5cGUsIFRSVUUpOworCQlwdXRfbmFtZV9pZChyZXMsIG5hbWUsIFRSVUUpOwkvKiBSZXNOYW1lICovCisJCXB1dF93b3JkKHJlcywgbWVtb3B0KTsJCS8qIE1lbW9yeSBvcHRpb25zICovCisJCXRhZyA9IHJlcy0+c2l6ZTsKKwkJcHV0X2R3b3JkKHJlcywgMCk7CQkvKiBSZXNTaXplIG92ZXJ3cml0dGVuIGxhdGVyKi8KKwkJKihEV09SRCAqKSYocmVzLT5kYXRhW3RhZ10pID0gcmVzLT5zaXplOworCQlyZXMtPmRhdGFpZHggPSByZXMtPnNpemU7CisJCXJldHVybiB0YWc7CisJfQorfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IGFjY2VsZXJhdG9yMnJlcworICogU3ludGF4CTogcmVzX3QgKmFjY2VsZXJhdG9yMnJlcyhuYW1lX2lkX3QgKm5hbWUsIGFjY2VsZXJhdG9yX3QgKmFjYykKKyAqIElucHV0CToKKyAqCW5hbWUJLSBOYW1lL29yZGluYWwgb2YgdGhlIHJlc291cmNlCisgKglhY2MJLSBUaGUgYWNjZWxlcmF0b3IgZGVzY3JpcHRvcgorICogT3V0cHV0CTogTmV3IC5yZXMgZm9ybWF0IHN0cnVjdHVyZQorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCityZXNfdCAqYWNjZWxlcmF0b3IycmVzKG5hbWVfaWRfdCAqbmFtZSwgYWNjZWxlcmF0b3JfdCAqYWNjKQoreworCWludCByZXN0YWc7CisJcmVzX3QgKnJlczsKKwlldmVudF90ICpldjsKKwlhc3NlcnQobmFtZSAhPSBOVUxMKTsKKwlhc3NlcnQoYWNjICE9IE5VTEwpOworCisJZXYgPSBhY2MtPmV2ZW50czsKKwlyZXMgPSBuZXdfcmVzKCk7CisJaWYod2luMzIpCisJeworCQlyZXN0YWcgPSBwdXRfcmVzX2hlYWRlcihyZXMsIFdSQ19SVF9BQ0NFTEVSQVRPUiwgTlVMTCwgbmFtZSwgYWNjLT5tZW1vcHQsICYoYWNjLT5sdmMpKTsKKwkJd2hpbGUoZXYpCisJCXsKKwkJCXB1dF93b3JkKHJlcywgZXYtPmZsYWdzIHwgKGV2LT5uZXh0ID8gMCA6IDB4ODApKTsKKwkJCXB1dF93b3JkKHJlcywgZXYtPmtleSk7CisJCQlwdXRfd29yZChyZXMsIGV2LT5pZCk7CisJCQlwdXRfd29yZChyZXMsIDApOwkvKiBQYWRkaW5nICovCisJCQlldiA9IGV2LT5uZXh0OworCQl9CisJCXB1dF9wYWQocmVzKTsKKwl9CisJZWxzZSAvKiB3aW4xNiAqLworCXsKKwkJcmVzdGFnID0gcHV0X3Jlc19oZWFkZXIocmVzLCBXUkNfUlRfQUNDRUxFUkFUT1IsIE5VTEwsIG5hbWUsIGFjYy0+bWVtb3B0LCBOVUxMKTsKKwkJd2hpbGUoZXYpCisJCXsKKwkJCXB1dF9ieXRlKHJlcywgZXYtPmZsYWdzIHwgKGV2LT5uZXh0ID8gMCA6IDB4ODApKTsKKwkJCXB1dF93b3JkKHJlcywgZXYtPmtleSk7CisJCQlwdXRfd29yZChyZXMsIGV2LT5pZCk7CisJCQlldiA9IGV2LT5uZXh0OworCQl9CisJfQorCS8qIFNldCBSZXNvdXJjZVNpemUgKi8KKwlTZXRSZXNTaXplKHJlcywgcmVzdGFnKTsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IGRpYWxvZzJyZXMKKyAqIFN5bnRheAk6IHJlc190ICpkaWFsb2cycmVzKG5hbWVfaWRfdCAqbmFtZSwgZGlhbG9nX3QgKmRsZykKKyAqIElucHV0CToKKyAqCW5hbWUJLSBOYW1lL29yZGluYWwgb2YgdGhlIHJlc291cmNlCisgKglkbGcJLSBUaGUgZGlhbG9nIGRlc2NyaXB0b3IKKyAqIE91dHB1dAk6IE5ldyAucmVzIGZvcm1hdCBzdHJ1Y3R1cmUKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworcmVzX3QgKmRpYWxvZzJyZXMobmFtZV9pZF90ICpuYW1lLCBkaWFsb2dfdCAqZGxnKQoreworCWludCByZXN0YWc7CisJcmVzX3QgKnJlczsKKwljb250cm9sX3QgKmN0cmw7CisJaW50IHRhZ19uY3RybDsKKwlpbnQgbmN0cmwgPSAwOworCWFzc2VydChuYW1lICE9IE5VTEwpOworCWFzc2VydChkbGcgIT0gTlVMTCk7CisKKwljdHJsID0gZGxnLT5jb250cm9sczsKKwlyZXMgPSBuZXdfcmVzKCk7CisJaWYod2luMzIpCisJeworCQlyZXN0YWcgPSBwdXRfcmVzX2hlYWRlcihyZXMsIFdSQ19SVF9ESUFMT0csIE5VTEwsIG5hbWUsIGRsZy0+bWVtb3B0LCAmKGRsZy0+bHZjKSk7CisKKwkJcHV0X2R3b3JkKHJlcywgZGxnLT5zdHlsZSk7CisJCXB1dF9kd29yZChyZXMsIGRsZy0+Z290ZXhzdHlsZSA/IGRsZy0+ZXhzdHlsZSA6IDApOworCQl0YWdfbmN0cmwgPSByZXMtPnNpemU7CisJCXB1dF93b3JkKHJlcywgMCk7CQkvKiBOdW1iZXIgb2YgY29udHJvbHMgKi8KKwkJcHV0X3dvcmQocmVzLCBkbGctPngpOworCQlwdXRfd29yZChyZXMsIGRsZy0+eSk7CisJCXB1dF93b3JkKHJlcywgZGxnLT53aWR0aCk7CisJCXB1dF93b3JkKHJlcywgZGxnLT5oZWlnaHQpOworCQlpZihkbGctPm1lbnUpCisJCQlwdXRfbmFtZV9pZChyZXMsIGRsZy0+bWVudSwgVFJVRSk7CisJCWVsc2UKKwkJCXB1dF93b3JkKHJlcywgMCk7CisJCWlmKGRsZy0+ZGxnY2xhc3MpCisJCQlwdXRfbmFtZV9pZChyZXMsIGRsZy0+ZGxnY2xhc3MsIFRSVUUpOworCQllbHNlCisJCQlwdXRfd29yZChyZXMsIDApOworCQlpZihkbGctPnRpdGxlKQorCQkJcHV0X3N0cmluZyhyZXMsIGRsZy0+dGl0bGUsIHN0cl91bmljb2RlLCBUUlVFKTsKKwkJZWxzZQorCQkJcHV0X3dvcmQocmVzLCAwKTsKKwkJaWYoZGxnLT5mb250KQorCQl7CisJCQlwdXRfd29yZChyZXMsIGRsZy0+Zm9udC0+c2l6ZSk7CisJCQlwdXRfc3RyaW5nKHJlcywgZGxnLT5mb250LT5uYW1lLCBzdHJfdW5pY29kZSwgVFJVRSk7CisJCX0KKworCQlwdXRfcGFkKHJlcyk7CisJCXdoaWxlKGN0cmwpCisJCXsKKwkJCS8qIEZJWE1FOiB3aGF0IGlzIGRlZmF1bHQgY29udHJvbCBzdHlsZT8gKi8KKwkJCXB1dF9kd29yZChyZXMsIGN0cmwtPmdvdHN0eWxlID8gY3RybC0+c3R5bGUgOiBXU19DSElMRCk7CisJCQlwdXRfZHdvcmQocmVzLCBjdHJsLT5nb3RleHN0eWxlID8gY3RybC0+ZXhzdHlsZSA6IDApOworCQkJcHV0X3dvcmQocmVzLCBjdHJsLT54KTsKKwkJCXB1dF93b3JkKHJlcywgY3RybC0+eSk7CisJCQlwdXRfd29yZChyZXMsIGN0cmwtPndpZHRoKTsKKwkJCXB1dF93b3JkKHJlcywgY3RybC0+aGVpZ2h0KTsKKwkJCXB1dF93b3JkKHJlcywgY3RybC0+aWQpOworCQkJaWYoY3RybC0+Y3RsY2xhc3MpCisJCQkJcHV0X25hbWVfaWQocmVzLCBjdHJsLT5jdGxjbGFzcywgVFJVRSk7CisJCQllbHNlCisJCQkJaW50ZXJuYWxfZXJyb3IoX19GSUxFX18sIF9fTElORV9fLCAiQ29udHJvbCBoYXMgbm8gY29udHJvbC1jbGFzcyIpOworCQkJaWYoY3RybC0+dGl0bGUpCisJCQkJcHV0X3N0cmluZyhyZXMsIGN0cmwtPnRpdGxlLCBzdHJfdW5pY29kZSwgVFJVRSk7CisJCQllbHNlCisJCQkJcHV0X3dvcmQocmVzLCAwKTsKKwkJCWlmKGN0cmwtPmV4dHJhKQorCQkJeworCQkJCXB1dF93b3JkKHJlcywgY3RybC0+ZXh0cmEtPnNpemUrMik7CisJCQkJcHV0X3BhZChyZXMpOworCQkJCXB1dF9yYXdfZGF0YShyZXMsIGN0cmwtPmV4dHJhLCAwKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlwdXRfd29yZChyZXMsIDApOworCisJCQlpZihjdHJsLT5uZXh0KQorCQkJCXB1dF9wYWQocmVzKTsKKwkJCW5jdHJsKys7CisJCQljdHJsID0gY3RybC0+bmV4dDsKKwkJfQorCQkvKiBTZXQgbnVtYmVyIG9mIGNvbnRyb2xzICovCisJCSooV09SRCAqKSYoKGNoYXIgKilyZXMtPmRhdGEpW3RhZ19uY3RybF0gPSAoV09SRCluY3RybDsKKwl9CisJZWxzZSAvKiB3aW4xNiAqLworCXsKKwkJcmVzdGFnID0gcHV0X3Jlc19oZWFkZXIocmVzLCBXUkNfUlRfRElBTE9HLCBOVUxMLCBuYW1lLCBkbGctPm1lbW9wdCwgTlVMTCk7CisKKwkJcHV0X2R3b3JkKHJlcywgZGxnLT5nb3RzdHlsZSA/IGRsZy0+c3R5bGUgOiBXU19QT1BVUFdJTkRPVyk7CisJCXRhZ19uY3RybCA9IHJlcy0+c2l6ZTsKKwkJcHV0X2J5dGUocmVzLCAwKTsJCS8qIE51bWJlciBvZiBjb250cm9scyAqLworCQlwdXRfd29yZChyZXMsIGRsZy0+eCk7CisJCXB1dF93b3JkKHJlcywgZGxnLT55KTsKKwkJcHV0X3dvcmQocmVzLCBkbGctPndpZHRoKTsKKwkJcHV0X3dvcmQocmVzLCBkbGctPmhlaWdodCk7CisJCWlmKGRsZy0+bWVudSkKKwkJCXB1dF9uYW1lX2lkKHJlcywgZGxnLT5tZW51LCBUUlVFKTsKKwkJZWxzZQorCQkJcHV0X2J5dGUocmVzLCAwKTsKKwkJaWYoZGxnLT5kbGdjbGFzcykKKwkJCXB1dF9uYW1lX2lkKHJlcywgZGxnLT5kbGdjbGFzcywgVFJVRSk7CisJCWVsc2UKKwkJCXB1dF9ieXRlKHJlcywgMCk7CisJCWlmKGRsZy0+dGl0bGUpCisJCQlwdXRfc3RyaW5nKHJlcywgZGxnLT50aXRsZSwgc3RyX2NoYXIsIFRSVUUpOworCQllbHNlCisJCQlwdXRfYnl0ZShyZXMsIDApOworCQlpZihkbGctPmZvbnQpCisJCXsKKwkJCXB1dF93b3JkKHJlcywgZGxnLT5mb250LT5zaXplKTsKKwkJCXB1dF9zdHJpbmcocmVzLCBkbGctPmZvbnQtPm5hbWUsIHN0cl9jaGFyLCBUUlVFKTsKKwkJfQorCisJCXdoaWxlKGN0cmwpCisJCXsKKwkJCXB1dF93b3JkKHJlcywgY3RybC0+eCk7CisJCQlwdXRfd29yZChyZXMsIGN0cmwtPnkpOworCQkJcHV0X3dvcmQocmVzLCBjdHJsLT53aWR0aCk7CisJCQlwdXRfd29yZChyZXMsIGN0cmwtPmhlaWdodCk7CisJCQlwdXRfd29yZChyZXMsIGN0cmwtPmlkKTsKKwkJCXB1dF9kd29yZChyZXMsIGN0cmwtPmdvdHN0eWxlID8gY3RybC0+c3R5bGUgOiBXU19DSElMRCk7CisJCQlpZihjdHJsLT5jdGxjbGFzcykKKwkJCXsKKwkJCQlpZihjdHJsLT5jdGxjbGFzcy0+dHlwZSA9PSBuYW1lX29yZAorCQkJCSYmIGN0cmwtPmN0bGNsYXNzLT5uYW1lLmlfbmFtZSA+PSAweDgwCisJCQkJJiYgY3RybC0+Y3RsY2xhc3MtPm5hbWUuaV9uYW1lIDw9IDB4ODUpCisJCQkJCXB1dF9ieXRlKHJlcywgY3RybC0+Y3RsY2xhc3MtPm5hbWUuaV9uYW1lKTsKKwkJCQllbHNlIGlmKGN0cmwtPmN0bGNsYXNzLT50eXBlID09IG5hbWVfc3RyKQorCQkJCQlwdXRfbmFtZV9pZChyZXMsIGN0cmwtPmN0bGNsYXNzLCBGQUxTRSk7CisJCQkJZWxzZQorCQkJCQllcnJvcigiVW5rbm93biBjb250cm9sLWNsYXNzICUwNHgiLCBjdHJsLT5jdGxjbGFzcy0+bmFtZS5pX25hbWUpOworCQkJfQorCQkJZWxzZQorCQkJCWludGVybmFsX2Vycm9yKF9fRklMRV9fLCBfX0xJTkVfXywgIkNvbnRyb2wgaGFzIG5vIGNvbnRyb2wtY2xhc3MiKTsKKwkJCWlmKGN0cmwtPnRpdGxlKQorCQkJCXB1dF9zdHJpbmcocmVzLCBjdHJsLT50aXRsZSwgc3RyX2NoYXIsIFRSVUUpOworCQkJZWxzZQorCQkJCXB1dF9ieXRlKHJlcywgMCk7CisKKwkJCS8qIEZJWE1FOiBXaGF0IGlzIHRoaXMgZXh0cmEgYnl0ZSBkb2luZyBoZXJlPyAqLworCQkJcHV0X2J5dGUocmVzLCAwKTsKKwkJCQorCQkJbmN0cmwrKzsKKwkJCWN0cmwgPSBjdHJsLT5uZXh0OworCQl9CisJCS8qIFNldCBudW1iZXIgb2YgY29udHJvbHMgKi8KKwkJKChjaGFyICopcmVzLT5kYXRhKVt0YWdfbmN0cmxdID0gKGNoYXIpbmN0cmw7CisJfQorCS8qIFNldCBSZXNvdXJjZVNpemUgKi8KKwlTZXRSZXNTaXplKHJlcywgcmVzdGFnKTsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IGRpYWxvZ2V4MnJlcworICogU3ludGF4CTogcmVzX3QgKmRpYWxvZ2V4MnJlcyhuYW1lX2lkX3QgKm5hbWUsIGRpYWxvZ2V4X3QgKmRsZ2V4KQorICogSW5wdXQJOgorICoJbmFtZQktIE5hbWUvb3JkaW5hbCBvZiB0aGUgcmVzb3VyY2UKKyAqCWRsZ2V4CS0gVGhlIGRpYWxvZ2V4IGRlc2NyaXB0b3IKKyAqIE91dHB1dAk6IE5ldyAucmVzIGZvcm1hdCBzdHJ1Y3R1cmUKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworcmVzX3QgKmRpYWxvZ2V4MnJlcyhuYW1lX2lkX3QgKm5hbWUsIGRpYWxvZ2V4X3QgKmRsZ2V4KQoreworCWludCByZXN0YWc7CisJcmVzX3QgKnJlczsKKwljb250cm9sX3QgKmN0cmw7CisJaW50IHRhZ19uY3RybDsKKwlpbnQgbmN0cmwgPSAwOworCWFzc2VydChuYW1lICE9IE5VTEwpOworCWFzc2VydChkbGdleCAhPSBOVUxMKTsKKworCWN0cmwgPSBkbGdleC0+Y29udHJvbHM7CisJcmVzID0gbmV3X3JlcygpOworCWlmKHdpbjMyKQorCXsKKwkJcmVzdGFnID0gcHV0X3Jlc19oZWFkZXIocmVzLCBXUkNfUlRfRElBTE9HLCBOVUxMLCBuYW1lLCBkbGdleC0+bWVtb3B0LCAmKGRsZ2V4LT5sdmMpKTsKKworCQkvKiBGSVhNRTogTVMgZG9jIHNheXMgdGhldCB0aGUgZmlyc3Qgd29yZCBtdXN0IGNvbnRhaW4gMHhmZmZmCisJCSAqIGFuZCB0aGUgc2Vjb25kIDB4MDAwMSB0byBzaWduYWwgYSBETEdURU1QTEFURUVYLiBCb3JsYW5kJ3MKKwkJICogY29tcGlsZXIgcmV2ZXJzZXMgdGhlIHR3byB3b3Jkcy4KKwkJICogSSBkb24ndCBrbm93IHdoaWNoIG9uZSB0byBjaG9vc2UsIGJ1dCBJIHdyaXRlIGl0IGFzIE1yLiBCCisJCSAqIHdyaXRlcyBpdC4KKwkJICovCisJCXB1dF93b3JkKHJlcywgMSk7CQkvKiBTaWduYXR1cmUgKi8KKwkJcHV0X3dvcmQocmVzLCAweGZmZmYpOwkJLyogRGxnVmVyICovCisJCXB1dF9kd29yZChyZXMsIGRsZ2V4LT5nb3RoZWxwaWQgPyBkbGdleC0+aGVscGlkIDogMCk7CisJCXB1dF9kd29yZChyZXMsIGRsZ2V4LT5nb3RleHN0eWxlID8gZGxnZXgtPmV4c3R5bGUgOiAwKTsKKwkJcHV0X2R3b3JkKHJlcywgZGxnZXgtPmdvdHN0eWxlID8gZGxnZXgtPnN0eWxlIDogV1NfUE9QVVBXSU5ET1cpOworCQl0YWdfbmN0cmwgPSByZXMtPnNpemU7CisJCXB1dF93b3JkKHJlcywgMCk7CQkvKiBOdW1iZXIgb2YgY29udHJvbHMgKi8KKwkJcHV0X3dvcmQocmVzLCBkbGdleC0+eCk7CisJCXB1dF93b3JkKHJlcywgZGxnZXgtPnkpOworCQlwdXRfd29yZChyZXMsIGRsZ2V4LT53aWR0aCk7CisJCXB1dF93b3JkKHJlcywgZGxnZXgtPmhlaWdodCk7CisJCWlmKGRsZ2V4LT5tZW51KQorCQkJcHV0X25hbWVfaWQocmVzLCBkbGdleC0+bWVudSwgVFJVRSk7CisJCWVsc2UKKwkJCXB1dF93b3JkKHJlcywgMCk7CisJCWlmKGRsZ2V4LT5kbGdjbGFzcykKKwkJCXB1dF9uYW1lX2lkKHJlcywgZGxnZXgtPmRsZ2NsYXNzLCBUUlVFKTsKKwkJZWxzZQorCQkJcHV0X3dvcmQocmVzLCAwKTsKKwkJaWYoZGxnZXgtPnRpdGxlKQorCQkJcHV0X3N0cmluZyhyZXMsIGRsZ2V4LT50aXRsZSwgc3RyX3VuaWNvZGUsIFRSVUUpOworCQllbHNlCisJCQlwdXRfd29yZChyZXMsIDApOworCQlpZihkbGdleC0+Zm9udCkKKwkJeworCQkJcHV0X3dvcmQocmVzLCBkbGdleC0+Zm9udC0+c2l6ZSk7CisJCQlwdXRfd29yZChyZXMsIGRsZ2V4LT5mb250LT53ZWlnaHQpOworCQkJLyogRklYTUU6ID8gVFJVRSBzaG91bGQgYmUgc3VmZmljaWVudCB0byBzYXkgdGhhdCBpdHMKKwkJCSAqIGl0YWxpYywgYnV0IEJvcmxhbmQncyBjb21waWxlciBzYXlzIGl0cyAweDAxMDEuCisJCQkgKiBJIGp1c3QgY29weSBpdCBoZXJlLCBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuCisJCQkgKi8KKwkJCXB1dF93b3JkKHJlcywgZGxnZXgtPmZvbnQtPml0YWxpYyA/IDB4MDEwMSA6IDApOworCQkJcHV0X3N0cmluZyhyZXMsIGRsZ2V4LT5mb250LT5uYW1lLCBzdHJfdW5pY29kZSwgVFJVRSk7CisJCX0KKworCQlwdXRfcGFkKHJlcyk7CisJCXdoaWxlKGN0cmwpCisJCXsKKwkJCXB1dF9kd29yZChyZXMsIGN0cmwtPmdvdGhlbHBpZCA/IGN0cmwtPmhlbHBpZCA6IDApOworCQkJcHV0X2R3b3JkKHJlcywgY3RybC0+Z290ZXhzdHlsZSA/IGN0cmwtPmV4c3R5bGUgOiAwKTsKKwkJCS8qIEZJWE1FOiB3aGF0IGlzIGRlZmF1bHQgY29udHJvbCBzdHlsZT8gKi8KKwkJCXB1dF9kd29yZChyZXMsIGN0cmwtPmdvdHN0eWxlID8gY3RybC0+c3R5bGUgOiBXU19DSElMRCB8IFdTX1ZJU0lCTEUpOworCQkJcHV0X3dvcmQocmVzLCBjdHJsLT54KTsKKwkJCXB1dF93b3JkKHJlcywgY3RybC0+eSk7CisJCQlwdXRfd29yZChyZXMsIGN0cmwtPndpZHRoKTsKKwkJCXB1dF93b3JkKHJlcywgY3RybC0+aGVpZ2h0KTsKKwkJCXB1dF93b3JkKHJlcywgY3RybC0+aWQpOworCQkJLyogRklYTUU6IFBhZCBpcyBfTk9UXyBkb2N1bWVudGVkIT8hICovCisJCQlwdXRfcGFkKHJlcyk7CisJCQlpZihjdHJsLT5jdGxjbGFzcykKKwkJCQlwdXRfbmFtZV9pZChyZXMsIGN0cmwtPmN0bGNsYXNzLCBUUlVFKTsKKwkJCWVsc2UKKwkJCQlpbnRlcm5hbF9lcnJvcihfX0ZJTEVfXywgX19MSU5FX18sICJDb250cm9sIGhhcyBubyBjb250cm9sLWNsYXNzIik7CisJCQlpZihjdHJsLT50aXRsZSkKKwkJCQlwdXRfc3RyaW5nKHJlcywgY3RybC0+dGl0bGUsIHN0cl91bmljb2RlLCBUUlVFKTsKKwkJCWVsc2UKKwkJCQlwdXRfd29yZChyZXMsIDApOworCQkJaWYoY3RybC0+ZXh0cmEpCisJCQl7CisJCQkJcHV0X3BhZChyZXMpOworCQkJCXB1dF93b3JkKHJlcywgY3RybC0+ZXh0cmEtPnNpemUpOworCQkJCXB1dF9yYXdfZGF0YShyZXMsIGN0cmwtPmV4dHJhLCAwKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlwdXRfd29yZChyZXMsIDApOworCisJCQlwdXRfcGFkKHJlcyk7CisJCQluY3RybCsrOworCQkJY3RybCA9IGN0cmwtPm5leHQ7CisJCX0KKwkJLyogU2V0IG51bWJlciBvZiBjb250cm9scyAqLworCQkqKFdPUkQgKikmKChjaGFyICopcmVzLT5kYXRhKVt0YWdfbmN0cmxdID0gKFdPUkQpbmN0cmw7CisJCS8qIFNldCBSZXNvdXJjZVNpemUgKi8KKwkJU2V0UmVzU2l6ZShyZXMsIHJlc3RhZyk7CisJCXB1dF9wYWQocmVzKTsKKwl9CisJZWxzZSAvKiB3aW4xNiAqLworCXsKKwkJLyogRG8gbm90IGdlbmVyYXRlIGFueXRoaW5nIGluIDE2LWJpdCBtb2RlICovCisJCWZyZWUocmVzLT5kYXRhKTsKKwkJZnJlZShyZXMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBtZW51aXRlbTJyZXMKKyAqIFN5bnRheAk6IHZvaWQgbWVudWl0ZW0ycmVzKHJlc190ICpyZXMsIG1lbnVfaXRlbV90ICppdGVtKQorICogSW5wdXQJOgorICogT3V0cHV0CToKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOiBTZWxmIHJlY3Vyc2l2ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordm9pZCBtZW51aXRlbTJyZXMocmVzX3QgKnJlcywgbWVudV9pdGVtX3QgKm1lbml0ZW0pCit7CisJbWVudV9pdGVtX3QgKml0bSA9IG1lbml0ZW07CisJaWYod2luMzIpCisJeworCQl3aGlsZShpdG0pCisJCXsKKwkJCXB1dF93b3JkKHJlcywgaXRtLT5zdGF0ZSB8IChpdG0tPnBvcHVwID8gTUZfUE9QVVAgOiAwKSB8ICghaXRtLT5uZXh0ID8gTUZfRU5EIDogMCkpOworCQkJaWYoIWl0bS0+cG9wdXApCisJCQkJcHV0X3dvcmQocmVzLCBpdG0tPmlkKTsKKwkJCWlmKGl0bS0+bmFtZSkKKwkJCQlwdXRfc3RyaW5nKHJlcywgaXRtLT5uYW1lLCBzdHJfdW5pY29kZSwgVFJVRSk7CisJCQllbHNlCisJCQkJcHV0X3dvcmQocmVzLCAwKTsKKwkJCWlmKGl0bS0+cG9wdXApCisJCQkJbWVudWl0ZW0ycmVzKHJlcywgaXRtLT5wb3B1cCk7CisJCQlpdG0gPSBpdG0tPm5leHQ7CisJCX0KKwl9CisJZWxzZSAvKiB3aW4xNiAqLworCXsKKwkJd2hpbGUoaXRtKQorCQl7CisJCQlwdXRfd29yZChyZXMsIGl0bS0+c3RhdGUgfCAoaXRtLT5wb3B1cCA/IE1GX1BPUFVQIDogMCkgfCAoIWl0bS0+bmV4dCA/IE1GX0VORCA6IDApKTsKKwkJCWlmKCFpdG0tPnBvcHVwKQorCQkJCXB1dF93b3JkKHJlcywgaXRtLT5pZCk7CisJCQlpZihpdG0tPm5hbWUpCisJCQkJcHV0X3N0cmluZyhyZXMsIGl0bS0+bmFtZSwgc3RyX2NoYXIsIFRSVUUpOworCQkJZWxzZQorCQkJCXB1dF9ieXRlKHJlcywgMCk7CisJCQlpZihpdG0tPnBvcHVwKQorCQkJCW1lbnVpdGVtMnJlcyhyZXMsIGl0bS0+cG9wdXApOworCQkJaXRtID0gaXRtLT5uZXh0OworCQl9CisJfQorCit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogbWVudTJyZXMKKyAqIFN5bnRheAk6IHJlc190ICptZW51MnJlcyhuYW1lX2lkX3QgKm5hbWUsIG1lbnVfdCAqbWVuKQorICogSW5wdXQJOgorICoJbmFtZQktIE5hbWUvb3JkaW5hbCBvZiB0aGUgcmVzb3VyY2UKKyAqCW1lbgktIFRoZSBtZW51IGRlc2NyaXB0b3IKKyAqIE91dHB1dAk6IE5ldyAucmVzIGZvcm1hdCBzdHJ1Y3R1cmUKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworcmVzX3QgKm1lbnUycmVzKG5hbWVfaWRfdCAqbmFtZSwgbWVudV90ICptZW4pCit7CisJaW50IHJlc3RhZzsKKwlyZXNfdCAqcmVzOworCWFzc2VydChuYW1lICE9IE5VTEwpOworCWFzc2VydChtZW4gIT0gTlVMTCk7CisKKwlyZXMgPSBuZXdfcmVzKCk7CisJcmVzdGFnID0gcHV0X3Jlc19oZWFkZXIocmVzLCBXUkNfUlRfTUVOVSwgTlVMTCwgbmFtZSwgbWVuLT5tZW1vcHQsIHdpbjMyID8gJihtZW4tPmx2YykgOiBOVUxMKTsKKworCXB1dF9kd29yZChyZXMsIDApOwkJLyogTWVudWhlYWRlcjogVmVyc2lvbiBhbmQgSGVhZGVyU2l6ZSAqLworCW1lbnVpdGVtMnJlcyhyZXMsIG1lbi0+aXRlbXMpOworCS8qIFNldCBSZXNvdXJjZVNpemUgKi8KKwlTZXRSZXNTaXplKHJlcywgcmVzdGFnKTsKKwlpZih3aW4zMikKKwkJcHV0X3BhZChyZXMpOworCXJldHVybiByZXM7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogbWVudWV4aXRlbTJyZXMKKyAqIFN5bnRheAk6IHZvaWQgbWVudWV4aXRlbTJyZXMocmVzX3QgKnJlcywgbWVudWV4X2l0ZW1fdCAqaXRlbSkKKyAqIElucHV0CToKKyAqIE91dHB1dAk6IG5vcAorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6IFNlbGYgcmVjdXJzaXZlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCit2b2lkIG1lbnVleGl0ZW0ycmVzKHJlc190ICpyZXMsIG1lbnVleF9pdGVtX3QgKm1lbml0ZW0pCit7CisJbWVudWV4X2l0ZW1fdCAqaXRtID0gbWVuaXRlbTsKKwlhc3NlcnQod2luMzIgIT0gMCk7CisJd2hpbGUoaXRtKQorCXsKKwkJcHV0X2R3b3JkKHJlcywgaXRtLT5nb3R0eXBlID8gaXRtLT50eXBlIDogMCk7CisJCXB1dF9kd29yZChyZXMsIGl0bS0+Z290c3RhdGUgPyBpdG0tPnN0YXRlIDogMCk7CisJCXB1dF9kd29yZChyZXMsIGl0bS0+Z290aWQgPyBpdG0tPmlkIDogMCk7CS8qIEZJWE1FOiBEb2N1LiBzYXlzIHdvcmQgKi8KKwkJcHV0X3dvcmQocmVzLCAoaXRtLT5wb3B1cCA/IDB4MDEgOiAwKSB8ICghaXRtLT5uZXh0ID8gTUZfRU5EIDogMCkpOworCQlpZihpdG0tPm5hbWUpCisJCQlwdXRfc3RyaW5nKHJlcywgaXRtLT5uYW1lLCBzdHJfdW5pY29kZSwgVFJVRSk7CisJCWVsc2UKKwkJCXB1dF93b3JkKHJlcywgMCk7CisJCXB1dF9wYWQocmVzKTsKKwkJaWYoaXRtLT5wb3B1cCkKKwkJeworCQkJcHV0X2R3b3JkKHJlcywgaXRtLT5nb3RoZWxwaWQgPyBpdG0tPmhlbHBpZCA6IDApOworCQkJbWVudWV4aXRlbTJyZXMocmVzLCBpdG0tPnBvcHVwKTsKKwkJfQorCQlpdG0gPSBpdG0tPm5leHQ7CisJfQorCit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogbWVudWV4MnJlcworICogU3ludGF4CTogcmVzX3QgKm1lbnVleDJyZXMobmFtZV9pZF90ICpuYW1lLCBtZW51ZXhfdCAqbWVuZXgpCisgKiBJbnB1dAk6CisgKgluYW1lCS0gTmFtZS9vcmRpbmFsIG9mIHRoZSByZXNvdXJjZQorICoJbWVuZXgJLSBUaGUgbWVudWV4IGRlc2NyaXB0b3IKKyAqIE91dHB1dAk6IE5ldyAucmVzIGZvcm1hdCBzdHJ1Y3R1cmUKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworcmVzX3QgKm1lbnVleDJyZXMobmFtZV9pZF90ICpuYW1lLCBtZW51ZXhfdCAqbWVuZXgpCit7CisJaW50IHJlc3RhZzsKKwlyZXNfdCAqcmVzOworCWFzc2VydChuYW1lICE9IE5VTEwpOworCWFzc2VydChtZW5leCAhPSBOVUxMKTsKKworCXJlcyA9IG5ld19yZXMoKTsKKwlpZih3aW4zMikKKwl7CisJCS8qIEZJWE1FOiBCb3JsYW5kJ3MgcmMgY29tcGlsZXIgd3JpdGVzIHRoZSBkZWZhdWx0IHN5c3RlbSdzCisJCSAqIGxhbmd1YWdlIGlmIG5vbmUgc3BlY2lmaWVkICgweDQwNiBmb3IgbWUgdGhhdCBpcykuIEkgYmVsaWV2ZQorCQkgKiB0aGF0IHRoaXMgaXMgYSBCb3JsYW5kIGJ1ZyAoYnJjMzIgdmVyLiA1LjAxKSwgYXMgdGhlIGRlZmF1bHQKKwkJICogc2hvdWxkIGJlIDAgKHN5c3RlbSBkZWZhdWx0KS4KKwkJICovCisJCXJlc3RhZyA9IHB1dF9yZXNfaGVhZGVyKHJlcywgV1JDX1JUX01FTlUsIE5VTEwsIG5hbWUsIG1lbmV4LT5tZW1vcHQsICYobWVuZXgtPmx2YykpOworCisJCXB1dF93b3JkKHJlcywgMSk7CQkvKiBNZW51aGVhZGVyOiBWZXJzaW9uICovCisJCXB1dF93b3JkKHJlcywgNCk7CQkvKiBPZmZzZXQgKi8KKwkJcHV0X2R3b3JkKHJlcywgMCk7CQkvKiBIZWxwSWQgKi8KKwkJcHV0X3BhZChyZXMpOworCQltZW51ZXhpdGVtMnJlcyhyZXMsIG1lbmV4LT5pdGVtcyk7CisJCS8qIFNldCBSZXNvdXJjZVNpemUgKi8KKwkJU2V0UmVzU2l6ZShyZXMsIHJlc3RhZyk7CisJCXB1dF9wYWQocmVzKTsKKwl9CisJZWxzZSAvKiB3aW4xNiAqLworCXsKKwkJLyogRG8gbm90IGdlbmVyYXRlIGFueXRoaW5nIGluIDE2LWJpdCBtb2RlICovCisJCWZyZWUocmVzLT5kYXRhKTsKKwkJZnJlZShyZXMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBjdXJzb3Jncm91cDJyZXMKKyAqIFN5bnRheAk6IHJlc190ICpjdXJzb3Jncm91cDJyZXMobmFtZV9pZF90ICpuYW1lLCBjdXJzb3JfZ3JvdXBfdCAqY3VyZykKKyAqIElucHV0CToKKyAqCW5hbWUJLSBOYW1lL29yZGluYWwgb2YgdGhlIHJlc291cmNlCisgKgljdXJnCS0gVGhlIGN1cnNvciBkZXNjcmlwdG9yCisgKiBPdXRwdXQJOiBOZXcgLnJlcyBmb3JtYXQgc3RydWN0dXJlCisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3Jlc190ICpjdXJzb3Jncm91cDJyZXMobmFtZV9pZF90ICpuYW1lLCBjdXJzb3JfZ3JvdXBfdCAqY3VyZykKK3sKKwlpbnQgcmVzdGFnOworCXJlc190ICpyZXM7CisJY3Vyc29yX3QgKmN1cjsKKwlhc3NlcnQobmFtZSAhPSBOVUxMKTsKKwlhc3NlcnQoY3VyZyAhPSBOVUxMKTsKKworCXJlcyA9IG5ld19yZXMoKTsKKwlyZXN0YWcgPSBwdXRfcmVzX2hlYWRlcihyZXMsIFdSQ19SVF9HUk9VUF9DVVJTT1IsIE5VTEwsIG5hbWUsIGN1cmctPm1lbW9wdCwgTlVMTCk7CisJaWYod2luMzIpCisJeworCQkvKiBGSVhNRTogQm9ybGFuZCdzIHJjIGNvbXBpbGVyIHdyaXRlcyB0aGUgZGVmYXVsdCBzeXN0ZW0ncworCQkgKiBsYW5ndWFnZSBpZiBub25lIHNwZWNpZmllZCAoMHg0MDYgZm9yIG1lIHRoYXQgaXMpLiBJIGJlbGlldmUKKwkJICogdGhhdCB0aGlzIGlzIGEgQm9ybGFuZCBidWcgKGJyYzMyIHZlci4gNS4wMSksIGFzIHRoZSBkZWZhdWx0CisJCSAqIHNob3VsZCBiZSAwIChzeXN0ZW0gZGVmYXVsdCkuCisJCSAqLworCisJCXB1dF93b3JkKHJlcywgMCk7CS8qIFJlc2VydmVkICovCisJCS8qIEZJWE1FOiBUaGUgUmVzVHlwZSBpbiB0aGUgTkVXSEVBREVSIHN0cnVjdHVyZSBzaG91bGQKKwkJICogY29udGFpbiAxNCBhY2NvcmRpbmcgdG8gdGhlIE1TIHdpbjMyIGRvYy4gVGhpcyBpcworCQkgKiBub3QgdGhlIGNhc2Ugd2l0aCB0aGUgQlJDIGNvbXBpbGVyIGFuZCBJIHJlYWxseSBkb3VidAorCQkgKiB0aGUgbGF0dGVyLiBQdXR0aW5nIG9uZSBoZXJlIGlzIGNvbXBsaWFudCB0byB3aW4xNiBzcGVjLAorCQkgKiBidXQgd2hvIGtub3dzIHRoZSB0cnVlIHZhbHVlPworCQkgKi8KKwkJcHV0X3dvcmQocmVzLCAyKTsJLyogUmVzVHlwZSAqLworCQlwdXRfd29yZChyZXMsIGN1cmctPm5jdXJzb3IpOworI2lmIDAKKwkJZm9yKGN1ciA9IGN1cmctPmN1cnNvcmxpc3Q7IGN1cjsgY3VyID0gY3VyLT5uZXh0KQorI2Vsc2UKKwkJY3VyID0gY3VyZy0+Y3Vyc29ybGlzdDsKKwkJd2hpbGUoY3VyLT5uZXh0KQorCQkJY3VyID0gY3VyLT5uZXh0OworCQlmb3IoOyBjdXI7IGN1ciA9IGN1ci0+cHJldikKKyNlbmRpZgorCQl7CisJCQlwdXRfd29yZChyZXMsIGN1ci0+d2lkdGgpOworCQkJLyogRklYTUU6IFRoZSBoZWlnaHQgb2YgYSBjdXJzb3IgaXMgaGFsZiB0aGUgc2l6ZSBvZgorCQkJICogdGhlIGJpdG1hcCdzIGhlaWdodC4gQlJDIHB1dHMgdGhlIGhlaWdodCBmcm9tIHRoZQorCQkJICogQklUTUFQSU5GT0hFQURFUiBoZXJlIGluc3RlYWQgb2YgdGhlIGN1cnNvcmZpbGUncworCQkJICogaGVpZ2h0LiBNUyBkb2Vzbid0IHNlZW0gdG8gY2FyZS4uLgorCQkJICovCisJCQlwdXRfd29yZChyZXMsIGN1ci0+aGVpZ2h0KTsKKwkJCS8qIEZJWE1FOiBUaGUgbmV4dCB0d28gYXJlIHJldmVyc2VkIGluIEJSQyBhbmQgSSBkb24ndAorCQkJICoga25vdyB3aHkuIFByb2JhYmx5IGEgYnVnLiBCdXQsIHdlIGNhbiBzYWZlbHkgaWdub3JlCisJCQkgKiBpdCBiZWNhdXNlIHdpbjE2IGRvZXMgbm90IHN1cHBvcnQgY29sb3IgY3Vyc29ycy4KKwkJCSAqIEEgd2FybmluZyBzaG91bGQgaGF2ZSBiZWVuIGdlbmVyYXRlZCBieSB0aGUgcGFyc2VyLgorCQkJICovCisJCQlwdXRfd29yZChyZXMsIGN1ci0+cGxhbmVzKTsKKwkJCXB1dF93b3JkKHJlcywgY3VyLT5iaXRzKTsKKwkJCS8qIEZJWE1FOiBUaGUgKzQgaXMgdGhlIGhvdHNwb3QgaW4gdGhlIGN1cnNvciByZXNvdXJjZS4KKwkJCSAqIEhvd2V2ZXIsIEkgY291bmQgbm90IGZpbmQgdGhpcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKwkJCSAqIFRoZSBob3RzcG90IGJ5dGVzIG11c3QgZWl0aGVyIGJlIGluY2x1ZGVkIG9yIE1TCisJCQkgKiBkb2Vzbid0IGNhcmUuCisJCQkgKi8KKwkJCXB1dF9kd29yZChyZXMsIGN1ci0+ZGF0YS0+c2l6ZSArNCk7CisJCQlwdXRfd29yZChyZXMsIGN1ci0+aWQpOworCQl9CisJfQorCWVsc2UgLyogd2luMTYgKi8KKwl7CisJCXB1dF93b3JkKHJlcywgMCk7CS8qIFJlc2VydmVkICovCisJCXB1dF93b3JkKHJlcywgMik7CS8qIFJlc1R5cGUgKi8KKwkJcHV0X3dvcmQocmVzLCBjdXJnLT5uY3Vyc29yKTsKKyNpZiAwCisJCWZvcihjdXIgPSBjdXJnLT5jdXJzb3JsaXN0OyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkKKyNlbHNlCisJCWN1ciA9IGN1cmctPmN1cnNvcmxpc3Q7CisJCXdoaWxlKGN1ci0+bmV4dCkKKwkJCWN1ciA9IGN1ci0+bmV4dDsKKwkJZm9yKDsgY3VyOyBjdXIgPSBjdXItPnByZXYpCisjZW5kaWYKKwkJeworCQkJcHV0X3dvcmQocmVzLCBjdXItPndpZHRoKTsKKwkJCS8qIEZJWE1FOiBUaGUgaGVpZ2h0IG9mIGEgY3Vyc29yIGlzIGhhbGYgdGhlIHNpemUgb2YKKwkJCSAqIHRoZSBiaXRtYXAncyBoZWlnaHQuIEJSQyBwdXRzIHRoZSBoZWlnaHQgZnJvbSB0aGUKKwkJCSAqIEJJVE1BUElORk9IRUFERVIgaGVyZSBpbnN0ZWFkIG9mIHRoZSBjdXJzb3JmaWxlJ3MKKwkJCSAqIGhlaWdodC4gTVMgZG9lc24ndCBzZWVtIHRvIGNhcmUuLi4KKwkJCSAqLworCQkJcHV0X3dvcmQocmVzLCBjdXItPmhlaWdodCk7CisJCQkvKiBGSVhNRTogVGhlIG5leHQgdHdvIGFyZSByZXZlcnNlZCBpbiBCUkMgYW5kIEkgZG9uJ3QKKwkJCSAqIGtub3cgd2h5LiBQcm9iYWJseSBhIGJ1Zy4gQnV0LCB3ZSBjYW4gc2FmZWx5IGlnbm9yZQorCQkJICogaXQgYmVjYXVzZSB3aW4xNiBkb2VzIG5vdCBzdXBwb3J0IGNvbG9yIGN1cnNvcnMuCisJCQkgKiBBIHdhcm5pbmcgc2hvdWxkIGhhdmUgYmVlbiBnZW5lcmF0ZWQgYnkgdGhlIHBhcnNlci4KKwkJCSAqLworCQkJcHV0X3dvcmQocmVzLCBjdXItPnBsYW5lcyk7CisJCQlwdXRfd29yZChyZXMsIGN1ci0+Yml0cyk7CisJCQkvKiBGSVhNRTogVGhlICs0IGlzIHRoZSBob3RzcG90IGluIHRoZSBjdXJzb3IgcmVzb3VyY2UuCisJCQkgKiBIb3dldmVyLCBJIGNvdW5kIG5vdCBmaW5kIHRoaXMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisJCQkgKiBUaGUgaG90c3BvdCBieXRlcyBtdXN0IGVpdGhlciBiZSBpbmNsdWRlZCBvciBNUworCQkJICogZG9lc24ndCBjYXJlLgorCQkJICovCisJCQlwdXRfZHdvcmQocmVzLCBjdXItPmRhdGEtPnNpemUgKzQpOworCQkJcHV0X3dvcmQocmVzLCBjdXItPmlkKTsKKwkJfQorCX0KKwlTZXRSZXNTaXplKHJlcywgcmVzdGFnKTsJLyogU2V0IFJlc291cmNlU2l6ZSAqLworCWlmKHdpbjMyKQorCQlwdXRfcGFkKHJlcyk7CisKKwlyZXR1cm4gcmVzOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IGN1cnNvcjJyZXMKKyAqIFN5bnRheAk6IHJlc190ICpjdXJzb3IycmVzKGN1cnNvcl90ICpjdXIpCisgKiBJbnB1dAk6CisgKgljdXIJLSBUaGUgY3Vyc29yIGRlc2NyaXB0b3IKKyAqIE91dHB1dAk6IE5ldyAucmVzIGZvcm1hdCBzdHJ1Y3R1cmUKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworcmVzX3QgKmN1cnNvcjJyZXMoY3Vyc29yX3QgKmN1cikKK3sKKwlpbnQgcmVzdGFnOworCXJlc190ICpyZXM7CisJbmFtZV9pZF90IG5hbWU7CisKKwlhc3NlcnQoY3VyICE9IE5VTEwpOworCisJcmVzID0gbmV3X3JlcygpOworCW5hbWUudHlwZSA9IG5hbWVfb3JkOworCW5hbWUubmFtZS5pX25hbWUgPSBjdXItPmlkOworCS8qIEZJWE1FOiBCb3JsYW5kJ3MgcmMgY29tcGlsZXIgd3JpdGVzIHRoZSBkZWZhdWx0IHN5c3RlbSdzCisJICogbGFuZ3VhZ2UgaWYgbm9uZSBzcGVjaWZpZWQgKDB4NDA2IGZvciBtZSB0aGF0IGlzKS4gSSBiZWxpZXZlCisJICogdGhhdCB0aGlzIGlzIGEgQm9ybGFuZCBidWcgKGJyYzMyIHZlci4gNS4wMSksIGFzIHRoZSBkZWZhdWx0CisJICogc2hvdWxkIGJlIDAgKHN5c3RlbSBkZWZhdWx0KS4KKwkgKi8KKwlyZXN0YWcgPSBwdXRfcmVzX2hlYWRlcihyZXMsIFdSQ19SVF9DVVJTT1IsIE5VTEwsICZuYW1lLCBXUkNfTU9fTU9WRUFCTEUgfCBXUkNfTU9fRElTQ0FSREFCTEUsIE5VTEwpOworCXB1dF93b3JkKHJlcywgY3VyLT54aG90KTsKKwlwdXRfd29yZChyZXMsIGN1ci0+eWhvdCk7CisJcHV0X3Jhd19kYXRhKHJlcywgY3VyLT5kYXRhLCAwKTsKKworCVNldFJlc1NpemUocmVzLCByZXN0YWcpOwkvKiBTZXQgUmVzb3VyY2VTaXplICovCisJaWYod2luMzIpCisJCXB1dF9wYWQocmVzKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogaWNvbmdyb3VwMnJlcworICogU3ludGF4CTogcmVzX3QgKmljb25ncm91cDJyZXMobmFtZV9pZF90ICpuYW1lLCBpY29uX2dyb3VwX3QgKmljb2cpCisgKiBJbnB1dAk6CisgKgluYW1lCS0gTmFtZS9vcmRpbmFsIG9mIHRoZSByZXNvdXJjZQorICoJaWNvZwktIFRoZSBpY29uIGdyb3VwIGRlc2NyaXB0b3IKKyAqIE91dHB1dAk6IE5ldyAucmVzIGZvcm1hdCBzdHJ1Y3R1cmUKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworcmVzX3QgKmljb25ncm91cDJyZXMobmFtZV9pZF90ICpuYW1lLCBpY29uX2dyb3VwX3QgKmljb2cpCit7CisJaW50IHJlc3RhZzsKKwlyZXNfdCAqcmVzOworCWljb25fdCAqaWNvOworCWFzc2VydChuYW1lICE9IE5VTEwpOworCWFzc2VydChpY29nICE9IE5VTEwpOworCisJcmVzID0gbmV3X3JlcygpOworCXJlc3RhZyA9IHB1dF9yZXNfaGVhZGVyKHJlcywgV1JDX1JUX0dST1VQX0lDT04sIE5VTEwsIG5hbWUsIGljb2ctPm1lbW9wdCwgTlVMTCk7CisJaWYod2luMzIpCisJeworCQkvKiBGSVhNRTogQm9ybGFuZCdzIHJjIGNvbXBpbGVyIHdyaXRlcyB0aGUgZGVmYXVsdCBzeXN0ZW0ncworCQkgKiBsYW5ndWFnZSBpZiBub25lIHNwZWNpZmllZCAoMHg0MDYgZm9yIG1lIHRoYXQgaXMpLiBJIGJlbGlldmUKKwkJICogdGhhdCB0aGlzIGlzIGEgQm9ybGFuZCBidWcgKGJyYzMyIHZlci4gNS4wMSksIGFzIHRoZSBkZWZhdWx0CisJCSAqIHNob3VsZCBiZSAwIChzeXN0ZW0gZGVmYXVsdCkuCisJCSAqLworCisJCXB1dF93b3JkKHJlcywgMCk7CS8qIFJlc2VydmVkICovCisJCS8qIEZJWE1FOiBUaGUgUmVzVHlwZSBpbiB0aGUgTkVXSEVBREVSIHN0cnVjdHVyZSBzaG91bGQKKwkJICogY29udGFpbiAxNCBhY2NvcmRpbmcgdG8gdGhlIE1TIHdpbjMyIGRvYy4gVGhpcyBpcworCQkgKiBub3QgdGhlIGNhc2Ugd2l0aCB0aGUgQlJDIGNvbXBpbGVyIGFuZCBJIHJlYWxseSBkb3VidAorCQkgKiB0aGUgbGF0dGVyLiBQdXR0aW5nIG9uZSBoZXJlIGlzIGNvbXBsaWFudCB0byB3aW4xNiBzcGVjLAorCQkgKiBidXQgd2hvIGtub3dzIHRoZSB0cnVlIHZhbHVlPworCQkgKi8KKwkJcHV0X3dvcmQocmVzLCAxKTsJLyogUmVzVHlwZSAqLworCQlwdXRfd29yZChyZXMsIGljb2ctPm5pY29uKTsKKwkJZm9yKGljbyA9IGljb2ctPmljb25saXN0OyBpY287IGljbyA9IGljby0+bmV4dCkKKwkJeworCQkJcHV0X2J5dGUocmVzLCBpY28tPndpZHRoKTsKKwkJCXB1dF9ieXRlKHJlcywgaWNvLT5oZWlnaHQpOworCQkJcHV0X2J5dGUocmVzLCBpY28tPm5jbHIpOworCQkJcHV0X2J5dGUocmVzLCAwKTsJLyogUmVzZXJ2ZWQgKi8KKwkJCXB1dF93b3JkKHJlcywgaWNvLT5wbGFuZXMpOworCQkJcHV0X3dvcmQocmVzLCBpY28tPmJpdHMpOworCQkJcHV0X2R3b3JkKHJlcywgaWNvLT5kYXRhLT5zaXplKTsKKwkJCXB1dF93b3JkKHJlcywgaWNvLT5pZCk7CisJCX0KKwl9CisJZWxzZSAvKiB3aW4xNiAqLworCXsKKwkJcHV0X3dvcmQocmVzLCAwKTsJLyogUmVzZXJ2ZWQgKi8KKwkJcHV0X3dvcmQocmVzLCAxKTsJLyogUmVzVHlwZSAqLworCQlwdXRfd29yZChyZXMsIGljb2ctPm5pY29uKTsKKwkJZm9yKGljbyA9IGljb2ctPmljb25saXN0OyBpY287IGljbyA9IGljby0+bmV4dCkKKwkJeworCQkJcHV0X2J5dGUocmVzLCBpY28tPndpZHRoKTsKKwkJCXB1dF9ieXRlKHJlcywgaWNvLT5oZWlnaHQpOworCQkJcHV0X2J5dGUocmVzLCBpY28tPm5jbHIpOworCQkJcHV0X2J5dGUocmVzLCAwKTsJLyogUmVzZXJ2ZWQgKi8KKwkJCXB1dF93b3JkKHJlcywgaWNvLT5wbGFuZXMpOworCQkJcHV0X3dvcmQocmVzLCBpY28tPmJpdHMpOworCQkJcHV0X2R3b3JkKHJlcywgaWNvLT5kYXRhLT5zaXplKTsKKwkJCXB1dF93b3JkKHJlcywgaWNvLT5pZCk7CisJCX0KKwl9CisJU2V0UmVzU2l6ZShyZXMsIHJlc3RhZyk7CS8qIFNldCBSZXNvdXJjZVNpemUgKi8KKwlpZih3aW4zMikKKwkJcHV0X3BhZChyZXMpOworCisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBpY29uMnJlcworICogU3ludGF4CTogcmVzX3QgKmljb24ycmVzKGljb25fdCAqaWNvKQorICogSW5wdXQJOgorICoJaWNvCS0gVGhlIGljb24gZGVzY3JpcHRvcgorICogT3V0cHV0CTogTmV3IC5yZXMgZm9ybWF0IHN0cnVjdHVyZQorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCityZXNfdCAqaWNvbjJyZXMoaWNvbl90ICppY28pCit7CisJaW50IHJlc3RhZzsKKwlyZXNfdCAqcmVzOworCW5hbWVfaWRfdCBuYW1lOworCisJYXNzZXJ0KGljbyAhPSBOVUxMKTsKKworCXJlcyA9IG5ld19yZXMoKTsKKwluYW1lLnR5cGUgPSBuYW1lX29yZDsKKwluYW1lLm5hbWUuaV9uYW1lID0gaWNvLT5pZDsKKwkvKiBGSVhNRTogQm9ybGFuZCdzIHJjIGNvbXBpbGVyIHdyaXRlcyB0aGUgZGVmYXVsdCBzeXN0ZW0ncworCSAqIGxhbmd1YWdlIGlmIG5vbmUgc3BlY2lmaWVkICgweDQwNiBmb3IgbWUgdGhhdCBpcykuIEkgYmVsaWV2ZQorCSAqIHRoYXQgdGhpcyBpcyBhIEJvcmxhbmQgYnVnIChicmMzMiB2ZXIuIDUuMDEpLCBhcyB0aGUgZGVmYXVsdAorCSAqIHNob3VsZCBiZSAwIChzeXN0ZW0gZGVmYXVsdCkuCisJICovCisJcmVzdGFnID0gcHV0X3Jlc19oZWFkZXIocmVzLCBXUkNfUlRfSUNPTiwgTlVMTCwgJm5hbWUsIFdSQ19NT19NT1ZFQUJMRSB8IFdSQ19NT19ESVNDQVJEQUJMRSwgTlVMTCk7CisJcHV0X3Jhd19kYXRhKHJlcywgaWNvLT5kYXRhLCAwKTsKKworCVNldFJlc1NpemUocmVzLCByZXN0YWcpOwkvKiBTZXQgUmVzb3VyY2VTaXplICovCisJaWYod2luMzIpCisJCXB1dF9wYWQocmVzKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogYml0bWFwMnJlcworICogU3ludGF4CTogcmVzX3QgKmJpdG1hcDJyZXMobmFtZV9pZF90ICpuYW1lLCBiaXRtYXBfdCAqYm1wKQorICogSW5wdXQJOgorICoJbmFtZQktIE5hbWUvb3JkaW5hbCBvZiB0aGUgcmVzb3VyY2UKKyAqCWJtcAktIFRoZSBiaXRtYXAgZGVzY3JpcHRvcgorICogT3V0cHV0CTogTmV3IC5yZXMgZm9ybWF0IHN0cnVjdHVyZQorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCityZXNfdCAqYml0bWFwMnJlcyhuYW1lX2lkX3QgKm5hbWUsIGJpdG1hcF90ICpibXApCit7CisJaW50IHJlc3RhZzsKKwlyZXNfdCAqcmVzOworCWFzc2VydChuYW1lICE9IE5VTEwpOworCWFzc2VydChibXAgIT0gTlVMTCk7CisKKwlIRUFQQ0hFQ0soKTsKKwlyZXMgPSBuZXdfcmVzKCk7CisJSEVBUENIRUNLKCk7CisJcmVzdGFnID0gcHV0X3Jlc19oZWFkZXIocmVzLCBXUkNfUlRfQklUTUFQLCBOVUxMLCBuYW1lLCBibXAtPm1lbW9wdCwgTlVMTCk7CisJSEVBUENIRUNLKCk7CisJaWYoYm1wLT5kYXRhLT5kYXRhWzBdID09ICdCJworCSYmIGJtcC0+ZGF0YS0+ZGF0YVsxXSA9PSAnTScKKwkmJiAoKEJJVE1BUEZJTEVIRUFERVIgKilibXAtPmRhdGEtPmRhdGEpLT5iZlNpemUgPT0gYm1wLT5kYXRhLT5zaXplCisJJiYgYm1wLT5kYXRhLT5zaXplID49IHNpemVvZihCSVRNQVBGSUxFSEVBREVSKSkKKwl7CisJCS8qIFRoZSBGaWxlIGhlYWRlciBpcyBzdGlsbCBhdHRhY2hlZCwgZG9uJ3Qgd3JpdGUgaXQgKi8KKwkJcHV0X3Jhd19kYXRhKHJlcywgYm1wLT5kYXRhLCBzaXplb2YoQklUTUFQRklMRUhFQURFUikpOworCX0KKwllbHNlCisJeworCQlwdXRfcmF3X2RhdGEocmVzLCBibXAtPmRhdGEsIDApOworCX0KKwlIRUFQQ0hFQ0soKTsKKwkvKiBTZXQgUmVzb3VyY2VTaXplICovCisJU2V0UmVzU2l6ZShyZXMsIHJlc3RhZyk7CisJSEVBUENIRUNLKCk7CisJaWYod2luMzIpCisJCXB1dF9wYWQocmVzKTsKKwlIRUFQQ0hFQ0soKTsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IGZvbnQycmVzCisgKiBTeW50YXgJOiByZXNfdCAqZm9udDJyZXMobmFtZV9pZF90ICpuYW1lLCBmb250X3QgKmZudCkKKyAqIElucHV0CToKKyAqCW5hbWUJLSBOYW1lL29yZGluYWwgb2YgdGhlIHJlc291cmNlCisgKglmbnQJLSBUaGUgZm9udCBkZXNjcmlwdG9yCisgKiBPdXRwdXQJOiBOZXcgLnJlcyBmb3JtYXQgc3RydWN0dXJlCisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3Jlc190ICpmb250MnJlcyhuYW1lX2lkX3QgKm5hbWUsIGZvbnRfdCAqZm50KQoreworCWFzc2VydChuYW1lICE9IE5VTEwpOworCWFzc2VydChmbnQgIT0gTlVMTCk7CisJd2FybmluZygiRm9udHMgbm90IHlldCBpbXBsZW1lbnRlZCIpOworCXJldHVybiBOVUxMOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IHJjZGF0YTJyZXMKKyAqIFN5bnRheAk6IHJlc190ICpyY2RhdGEycmVzKG5hbWVfaWRfdCAqbmFtZSwgcmNkYXRhX3QgKnJkdCkKKyAqIElucHV0CToKKyAqCW5hbWUJLSBOYW1lL29yZGluYWwgb2YgdGhlIHJlc291cmNlCisgKglyZHQJLSBUaGUgcmNkYXRhIGRlc2NyaXB0b3IKKyAqIE91dHB1dAk6IE5ldyAucmVzIGZvcm1hdCBzdHJ1Y3R1cmUKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworcmVzX3QgKnJjZGF0YTJyZXMobmFtZV9pZF90ICpuYW1lLCByY2RhdGFfdCAqcmR0KQoreworCWludCByZXN0YWc7CisJcmVzX3QgKnJlczsKKwlhc3NlcnQobmFtZSAhPSBOVUxMKTsKKwlhc3NlcnQocmR0ICE9IE5VTEwpOworCisJcmVzID0gbmV3X3JlcygpOworCXJlc3RhZyA9IHB1dF9yZXNfaGVhZGVyKHJlcywgV1JDX1JUX1JDREFUQSwgTlVMTCwgbmFtZSwgcmR0LT5tZW1vcHQsIE5VTEwpOworCXB1dF9yYXdfZGF0YShyZXMsIHJkdC0+ZGF0YSwgMCk7CisJLyogU2V0IFJlc291cmNlU2l6ZSAqLworCVNldFJlc1NpemUocmVzLCByZXN0YWcpOworCWlmKHdpbjMyKQorCQlwdXRfcGFkKHJlcyk7CisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBtZXNzYWdldGFibGUycmVzCisgKiBTeW50YXgJOiByZXNfdCAqbWVzc2FnZXRhYmxlMnJlcyhuYW1lX2lkX3QgKm5hbWUsIG1lc3NhZ2V0YWJsZV90ICptc2cpCisgKiBJbnB1dAk6CisgKgluYW1lCS0gTmFtZS9vcmRpbmFsIG9mIHRoZSByZXNvdXJjZQorICoJbXNnCS0gVGhlIG1lc3NhZ2V0YWJsZSBkZXNjcmlwdG9yCisgKiBPdXRwdXQJOiBOZXcgLnJlcyBmb3JtYXQgc3RydWN0dXJlCisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3Jlc190ICptZXNzYWdldGFibGUycmVzKG5hbWVfaWRfdCAqbmFtZSwgbWVzc2FnZXRhYmxlX3QgKm1zZykKK3sKKwlhc3NlcnQobmFtZSAhPSBOVUxMKTsKKwlhc3NlcnQobXNnICE9IE5VTEwpOworCXdhcm5pbmcoIk1lc3NhZ2V0YWJsZSBub3QgeWV0IGltcGxlbWVudGVkIik7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogc3RyaW5ndGFibGUycmVzCisgKiBTeW50YXgJOiByZXNfdCAqc3RyaW5ndGFibGUycmVzKHN0cmluZ3RhYmxlX3QgKnN0dCkKKyAqIElucHV0CToKKyAqCXN0dAktIFRoZSBzdHJpbmd0YWJsZSBkZXNjcmlwdG9yCisgKiBPdXRwdXQJOiBOZXcgLnJlcyBmb3JtYXQgc3RydWN0dXJlCisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3Jlc190ICpzdHJpbmd0YWJsZTJyZXMoc3RyaW5ndGFibGVfdCAqc3R0KQoreworCXJlc190ICpyZXM7CisJbmFtZV9pZF90IG5hbWU7CisJaW50IGk7CisJaW50IHJlc3RhZzsKKwlEV09SRCBsYXN0c2l6ZSA9IDA7CisKKwlhc3NlcnQoc3R0ICE9IE5VTEwpOworCXJlcyA9IG5ld19yZXMoKTsKKworCWZvcig7IHN0dDsgc3R0ID0gc3R0LT5uZXh0KQorCXsKKwkJaWYoIXN0dC0+bmVudHJpZXMpCisJCXsKKwkJCXdhcm5pbmcoIkVtcHR5IGludGVybmFsIHN0cmluZ3RhYmxlIik7CisJCQljb250aW51ZTsKKwkJfQorCQluYW1lLnR5cGUgPSBuYW1lX29yZDsKKwkJbmFtZS5uYW1lLmlfbmFtZSA9IChzdHQtPmlkYmFzZSA+PiA0KSArIDE7CisJCXJlc3RhZyA9IHB1dF9yZXNfaGVhZGVyKHJlcywgV1JDX1JUX1NUUklORywgTlVMTCwgJm5hbWUsIHN0dC0+bWVtb3B0LCB3aW4zMiA/ICYoc3R0LT5sdmMpIDogTlVMTCk7CisJCWZvcihpID0gMDsgaSA8IHN0dC0+bmVudHJpZXM7IGkrKykKKwkJeworCQkJaWYoc3R0LT5lbnRyaWVzW2ldLnN0cikKKwkJCXsKKwkJCQlpZih3aW4zMikKKwkJCQkJcHV0X3dvcmQocmVzLCBzdHQtPmVudHJpZXNbaV0uc3RyLT5zaXplKTsKKwkJCQllbHNlCisJCQkJCXB1dF9ieXRlKHJlcywgc3R0LT5lbnRyaWVzW2ldLnN0ci0+c2l6ZSk7CisJCQkJcHV0X3N0cmluZyhyZXMsIHN0dC0+ZW50cmllc1tpXS5zdHIsIHdpbjMyID8gc3RyX3VuaWNvZGUgOiBzdHJfY2hhciwgRkFMU0UpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKHdpbjMyKQorCQkJCQlwdXRfd29yZChyZXMsIDApOworCQkJCWVsc2UKKwkJCQkJcHV0X2J5dGUocmVzLCAwKTsKKwkJCX0KKwkJfQorCQkvKiBTZXQgUmVzb3VyY2VTaXplICovCisJCVNldFJlc1NpemUocmVzLCByZXN0YWcgLSBsYXN0c2l6ZSk7CisJCWlmKHdpbjMyKQorCQkJcHV0X3BhZChyZXMpOworCQlsYXN0c2l6ZSA9IHJlcy0+c2l6ZTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiB1c2VyMnJlcworICogU3ludGF4CTogcmVzX3QgKnVzZXIycmVzKG5hbWVfaWRfdCAqbmFtZSwgdXNlcl90ICp1c3IpCisgKiBJbnB1dAk6CisgKgluYW1lCS0gTmFtZS9vcmRpbmFsIG9mIHRoZSByZXNvdXJjZQorICoJdXNyCS0gVGhlIHVzZXJyZXNvdXJjZSBkZXNjcmlwdG9yCisgKiBPdXRwdXQJOiBOZXcgLnJlcyBmb3JtYXQgc3RydWN0dXJlCisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3Jlc190ICp1c2VyMnJlcyhuYW1lX2lkX3QgKm5hbWUsIHVzZXJfdCAqdXNyKQoreworCWludCByZXN0YWc7CisJcmVzX3QgKnJlczsKKwlhc3NlcnQobmFtZSAhPSBOVUxMKTsKKwlhc3NlcnQodXNyICE9IE5VTEwpOworCisJcmVzID0gbmV3X3JlcygpOworCXJlc3RhZyA9IHB1dF9yZXNfaGVhZGVyKHJlcywgMCwgdXNyLT50eXBlLCBuYW1lLCB1c3ItPm1lbW9wdCwgTlVMTCk7CisJcHV0X3Jhd19kYXRhKHJlcywgdXNyLT5kYXRhLCAwKTsKKwkvKiBTZXQgUmVzb3VyY2VTaXplICovCisJU2V0UmVzU2l6ZShyZXMsIHJlc3RhZyk7CisJaWYod2luMzIpCisJCXB1dF9wYWQocmVzKTsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IHZlcnNpb25ibG9jazJyZXMKKyAqIFN5bnRheAk6IHZvaWQgdmVyc2lvbmJsb2NrMnJlcyhyZXNfdCAqcmVzLCB2ZXJfYmxvY2tfdCAqYmxrKQorICogSW5wdXQJOgorICoJcmVzCS0gQmluYXJ5IHJlc291cmNlIHRvIHdyaXRlIHRvCisgKglibGsJLSBUaGUgdmVyc2lvbiBibG9jayB0byBiZSB3cml0dGVuCisgKiBPdXRwdXQJOgorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6IFNlbGYgcmVjdXJzaXZlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCit2b2lkIHZlcnNpb25ibG9jazJyZXMocmVzX3QgKnJlcywgdmVyX2Jsb2NrX3QgKmJsaywgaW50IGxldmVsKQoreworCXZlcl92YWx1ZV90ICp2YWw7CisJaW50IGJsa3NpemV0YWc7CisJaW50IHZhbGJsa3NpemV0YWc7CisJaW50IHZhbHZhbHNpemV0YWc7CisJaW50IHRhZzsKKwlpbnQgaTsKKworCWJsa3NpemV0YWcgPSByZXMtPnNpemU7CisJcHV0X3dvcmQocmVzLCAwKTsJLyogV2lsbCBiZSBvdmVyd3JpdHRlbiBsYXRlciAqLworCXB1dF93b3JkKHJlcywgMCk7CisJaWYod2luMzIpCisJCXB1dF93b3JkKHJlcywgMCk7CS8qIGxldmVsID8gKi8KKwlwdXRfc3RyaW5nKHJlcywgYmxrLT5uYW1lLCB3aW4zMiA/IHN0cl91bmljb2RlIDogc3RyX2NoYXIsIFRSVUUpOworCXB1dF9wYWQocmVzKTsKKwlmb3IodmFsID0gYmxrLT52YWx1ZXM7IHZhbDsgdmFsID0gdmFsLT5uZXh0KQorCXsKKwkJaWYodmFsLT50eXBlID09IHZhbF9zdHIpCisJCXsKKwkJCXZhbGJsa3NpemV0YWcgPSByZXMtPnNpemU7CisJCQlwdXRfd29yZChyZXMsIDApOwkvKiBXaWxsIGJlIG92ZXJ3cml0dGVuIGxhdGVyICovCisJCQl2YWx2YWxzaXpldGFnID0gcmVzLT5zaXplOworCQkJcHV0X3dvcmQocmVzLCAwKTsJLyogV2lsbCBiZSBvdmVyd3JpdHRlbiBsYXRlciAqLworCQkJaWYod2luMzIpCisJCQl7CisJCQkJcHV0X3dvcmQocmVzLCBsZXZlbCk7CisJCQl9CisJCQlwdXRfc3RyaW5nKHJlcywgdmFsLT5rZXksIHdpbjMyID8gc3RyX3VuaWNvZGUgOiBzdHJfY2hhciwgVFJVRSk7CisJCQlwdXRfcGFkKHJlcyk7CisJCQl0YWcgPSByZXMtPnNpemU7CisJCQlwdXRfc3RyaW5nKHJlcywgdmFsLT52YWx1ZS5zdHIsIHdpbjMyID8gc3RyX3VuaWNvZGUgOiBzdHJfY2hhciwgVFJVRSk7CisJCQlpZih3aW4zMikKKwkJCQkqKFdPUkQgKikmKHJlcy0+ZGF0YVt2YWx2YWxzaXpldGFnXSkgPSAoV09SRCkoKHJlcy0+c2l6ZSAtIHRhZykgPj4gMSk7CisJCQllbHNlCisJCQkJKihXT1JEICopJihyZXMtPmRhdGFbdmFsdmFsc2l6ZXRhZ10pID0gKFdPUkQpKHJlcy0+c2l6ZSAtIHRhZyk7CisJCQkqKFdPUkQgKikmKHJlcy0+ZGF0YVt2YWxibGtzaXpldGFnXSkgPSAoV09SRCkocmVzLT5zaXplIC0gdmFsYmxrc2l6ZXRhZyk7CisJCQlwdXRfcGFkKHJlcyk7CisJCX0KKwkJZWxzZSBpZih2YWwtPnR5cGUgPT0gdmFsX3dvcmRzKQorCQl7CisJCQl2YWxibGtzaXpldGFnID0gcmVzLT5zaXplOworCQkJcHV0X3dvcmQocmVzLCAwKTsJLyogV2lsbCBiZSBvdmVyd3JpdHRlbiBsYXRlciAqLworCQkJdmFsdmFsc2l6ZXRhZyA9IHJlcy0+c2l6ZTsKKwkJCXB1dF93b3JkKHJlcywgMCk7CS8qIFdpbGwgYmUgb3ZlcndyaXR0ZW4gbGF0ZXIgKi8KKwkJCWlmKHdpbjMyKQorCQkJeworCQkJCXB1dF93b3JkKHJlcywgbGV2ZWwpOworCQkJfQorCQkJcHV0X3N0cmluZyhyZXMsIHZhbC0+a2V5LCB3aW4zMiA/IHN0cl91bmljb2RlIDogc3RyX2NoYXIsIFRSVUUpOworCQkJcHV0X3BhZChyZXMpOworCQkJdGFnID0gcmVzLT5zaXplOworCQkJZm9yKGkgPSAwOyBpIDwgdmFsLT52YWx1ZS53b3Jkcy0+bndvcmRzOyBpKyspCisJCQl7CisJCQkJcHV0X3dvcmQocmVzLCB2YWwtPnZhbHVlLndvcmRzLT53b3Jkc1tpXSk7CisJCQl9CisJCQkqKFdPUkQgKikmKHJlcy0+ZGF0YVt2YWx2YWxzaXpldGFnXSkgPSAoV09SRCkocmVzLT5zaXplIC0gdGFnKTsKKwkJCSooV09SRCAqKSYocmVzLT5kYXRhW3ZhbGJsa3NpemV0YWddKSA9IChXT1JEKShyZXMtPnNpemUgLSB2YWxibGtzaXpldGFnKTsKKwkJCXB1dF9wYWQocmVzKTsKKwkJfQorCQllbHNlIGlmKHZhbC0+dHlwZSA9PSB2YWxfYmxvY2spCisJCXsKKwkJCXZlcnNpb25ibG9jazJyZXMocmVzLCB2YWwtPnZhbHVlLmJsb2NrLCBsZXZlbCsxKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWludGVybmFsX2Vycm9yKF9fRklMRV9fLCBfX0xJTkVfXywgIkludmFsaWQgdmFsdWUgaW5kaWNhdG9yICVkIGluIFZFUlNJT05JTkZPIiwgdmFsLT50eXBlKTsKKwkJfQorCX0KKworCS8qIFNldCBibG9ja3NpemUgKi8KKwkqKFdPUkQgKikmKHJlcy0+ZGF0YVtibGtzaXpldGFnXSkgPSAoV09SRCkocmVzLT5zaXplIC0gYmxrc2l6ZXRhZyk7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogdmVyc2lvbmluZm8ycmVzCisgKiBTeW50YXgJOiByZXNfdCAqdmVyc2lvbmluZm8ycmVzKG5hbWVfaWRfdCAqbmFtZSwgdmVyc2lvbmluZm9fdCAqdmVyKQorICogSW5wdXQJOgorICoJbmFtZQktIE5hbWUvb3JkaW5hbCBvZiB0aGUgcmVzb3VyY2UKKyAqCXZlcgktIFRoZSB2ZXJzaW9uaW5mbyBkZXNjcmlwdG9yCisgKiBPdXRwdXQJOiBOZXcgLnJlcyBmb3JtYXQgc3RydWN0dXJlCisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3Jlc190ICp2ZXJzaW9uaW5mbzJyZXMobmFtZV9pZF90ICpuYW1lLCB2ZXJzaW9uaW5mb190ICp2ZXIpCit7CisJaW50IHJlc3RhZzsKKwlpbnQgcm9vdGJsb2Nrc2l6ZXRhZzsKKwlpbnQgdmFsc2l6ZXRhZzsKKwlpbnQgdGFnOworCXJlc190ICpyZXM7CisJc3RyaW5nX3QgdnN2aTsKKwl2ZXJfYmxvY2tfdCAqYmxrOworCisJYXNzZXJ0KG5hbWUgIT0gTlVMTCk7CisJYXNzZXJ0KHZlciAhPSBOVUxMKTsKKworCXZzdmkudHlwZSA9IHN0cl9jaGFyOworCXZzdmkuc3RyLmNzdHIgPSAiVlNfVkVSU0lPTl9JTkZPIjsKKwl2c3ZpLnNpemUgPSAxNTsgLyogRXhjbC4gdGVybWluYXRpb24gKi8KKworCXJlcyA9IG5ld19yZXMoKTsKKwlyZXN0YWcgPSBwdXRfcmVzX2hlYWRlcihyZXMsIFdSQ19SVF9WRVJTSU9OLCBOVUxMLCBuYW1lLCBXUkNfTU9fTU9WRUFCTEUgfCBXUkNfTU9fUFVSRSwgTlVMTCk7CisJcm9vdGJsb2Nrc2l6ZXRhZyA9IHJlcy0+c2l6ZTsKKwlwdXRfd29yZChyZXMsIDApOwkvKiBCbG9ja1NpemUgZmlsbGVkIGluIGxhdGVyICovCisJdmFsc2l6ZXRhZyA9IHJlcy0+c2l6ZTsKKwlwdXRfd29yZChyZXMsIDApOwkvKiBWYWx1ZVNpemUgZmlsbGVkIGluIGxhdGVyKi8KKwlpZih3aW4zMikKKwkJcHV0X3dvcmQocmVzLCAwKTsJLyogVHJlZS1sZXZlbCA/ICovCisJcHV0X3N0cmluZyhyZXMsICZ2c3ZpLCB3aW4zMiA/IHN0cl91bmljb2RlIDogc3RyX2NoYXIsIFRSVUUpOworCWlmKHdpbjMyKQorCQlwdXRfcGFkKHJlcyk7CisJdGFnID0gcmVzLT5zaXplOworCXB1dF9kd29yZChyZXMsIFZTX0ZGSV9TSUdOQVRVUkUpOworCXB1dF9kd29yZChyZXMsIFZTX0ZGSV9TVFJVQ1ZFUlNJT04pOworCXB1dF9kd29yZChyZXMsICh2ZXItPmZpbGV2ZXJfbWFqMSA8PCAxNikgKyAodmVyLT5maWxldmVyX21hajIgJiAweGZmZmYpKTsKKwlwdXRfZHdvcmQocmVzLCAodmVyLT5maWxldmVyX21pbjEgPDwgMTYpICsgKHZlci0+ZmlsZXZlcl9taW4yICYgMHhmZmZmKSk7CisJcHV0X2R3b3JkKHJlcywgKHZlci0+cHJvZHZlcl9tYWoxIDw8IDE2KSArICh2ZXItPnByb2R2ZXJfbWFqMiAmIDB4ZmZmZikpOworCXB1dF9kd29yZChyZXMsICh2ZXItPnByb2R2ZXJfbWluMSA8PCAxNikgKyAodmVyLT5wcm9kdmVyX21pbjIgJiAweGZmZmYpKTsKKwlwdXRfZHdvcmQocmVzLCB2ZXItPmZpbGVmbGFnc21hc2spOworCXB1dF9kd29yZChyZXMsIHZlci0+ZmlsZWZsYWdzKTsKKwlwdXRfZHdvcmQocmVzLCB2ZXItPmZpbGVvcyk7CisJcHV0X2R3b3JkKHJlcywgdmVyLT5maWxldHlwZSk7CisJcHV0X2R3b3JkKHJlcywgdmVyLT5maWxlc3VidHlwZSk7CisJcHV0X2R3b3JkKHJlcywgMCk7CQkvKiBGaWxlRGF0ZU1TICovCisJcHV0X2R3b3JkKHJlcywgMCk7CQkvKiBGaWxlRGF0ZUxTICovCisJLyogU2V0IFZhbHVlU2l6ZSAqLworCSooV09SRCAqKSYocmVzLT5kYXRhW3ZhbHNpemV0YWddKSA9IChXT1JEKShyZXMtPnNpemUgLSB0YWcpOworCS8qIERlc2NlbmQgaW50byB0aGUgYmxvY2tzICovCisJZm9yKGJsayA9IHZlci0+YmxvY2tzOyBibGs7IGJsayA9IGJsay0+bmV4dCkKKwkJdmVyc2lvbmJsb2NrMnJlcyhyZXMsIGJsaywgMCk7CisJLyogU2V0IHJvb3QgYmxvY2sncyBzaXplICovCisJKihXT1JEICopJihyZXMtPmRhdGFbcm9vdGJsb2Nrc2l6ZXRhZ10pID0gKFdPUkQpKHJlcy0+c2l6ZSAtIHJvb3RibG9ja3NpemV0YWcpOworCisJU2V0UmVzU2l6ZShyZXMsIHJlc3RhZyk7CisJaWYod2luMzIpCisJCXB1dF9wYWQocmVzKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogcHJlcF9uaWRfZm9yX2xhYmVsCisgKiBTeW50YXgJOiBjaGFyICpwcmVwX25pZF9mb3JfbGFiZWwobmFtZV9pZF90ICpuaWQpCisgKiBJbnB1dAk6CisgKiBPdXRwdXQJOgorICogRGVzY3JpcHRpb24JOiBDb252ZXJ0cyBhIHJlc291cmNlIG5hbWUgaW50byB0aGUgZmlyc3QgMzIgKG9yIGxlc3MpCisgKgkJICBjaGFyYWN0ZXJzIG9mIHRoZSBuYW1lIHdpdGggY29udmVyc2lvbnMuCisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKyNkZWZpbmUgTUFYTkFNRUxFTgkzMgorY2hhciAqcHJlcF9uaWRfZm9yX2xhYmVsKG5hbWVfaWRfdCAqbmlkKQoreworCXN0YXRpYyBjaGFyIGJ1ZltNQVhOQU1FTEVOKzFdOworCisJYXNzZXJ0KG5pZCAhPSBOVUxMKTsKKworCWlmKG5pZC0+dHlwZSA9PSBuYW1lX3N0ciAmJiBuaWQtPm5hbWUuc19uYW1lLT50eXBlID09IHN0cl91bmljb2RlKQorCXsKKwkJc2hvcnQgKnNwdHI7CisJCWludCBpOworCQlzcHRyID0gbmlkLT5uYW1lLnNfbmFtZS0+c3RyLndzdHI7CisJCWJ1ZlswXSA9ICdcMCc7CisJCWZvcihpID0gMDsgKnNwdHIgJiYgaSA8IE1BWE5BTUVMRU47IGkrKykKKwkJeworCQkJaWYoKHVuc2lnbmVkKSpzcHRyIDwgMHg4MCAmJiBpc3ByaW50KChjaGFyKSpzcHRyKSkKKwkJCQlidWZbaV0gPSAqc3B0cisrOworCQkJZWxzZQorCQkJCXdhcm5pbmcoIlJlc291cmNlbmFtZSAoc3RyX3VuaWNvZGUpIGNvbnRhaW4gdW5wcmludGFibGUgY2hhcmFjdGVycyBvciBpbnZhbGlkIHRyYW5zbGF0aW9uLCBpZ25vcmVkIik7CisJCX0KKwkJYnVmW2ldID0gJ1wwJzsKKwl9CisJZWxzZSBpZihuaWQtPnR5cGUgPT0gbmFtZV9zdHIgJiYgbmlkLT5uYW1lLnNfbmFtZS0+dHlwZSA9PSBzdHJfY2hhcikKKwl7CisJCWNoYXIgKmNwdHI7CisJCWludCBpOworCQljcHRyID0gbmlkLT5uYW1lLnNfbmFtZS0+c3RyLmNzdHI7CisJCWJ1ZlswXSA9ICdcMCc7CisJCWZvcihpID0gMDsgKmNwdHIgJiYgaSA8IE1BWE5BTUVMRU47IGkrKykKKwkJeworCQkJaWYoKHVuc2lnbmVkKSpjcHRyIDwgMHg4MCAmJiBpc3ByaW50KCpjcHRyKSkKKwkJCQlidWZbaV0gPSAqY3B0cisrOworCQkJZWxzZQorCQkJCXdhcm5pbmcoIlJlc291cmNlbmFtZSAoc3RyX2NoYXIpIGNvbnRhaW4gdW5wcmludGFibGUgY2hhcmFjdGVycywgaWdub3JlZCIpOworCQl9CisJCWJ1ZltpXSA9ICdcMCc7CisJfQorCWVsc2UgaWYobmlkLT50eXBlID09IG5hbWVfb3JkKQorCXsKKwkJc3ByaW50ZihidWYsICIldSIsIG5pZC0+bmFtZS5pX25hbWUpOworCX0KKwllbHNlCisJeworCQlpbnRlcm5hbF9lcnJvcihfX0ZJTEVfXywgX19MSU5FX18sICJSZXNvdXJjZSBuYW1lX2lkIHdpdGggaW52YWxpZCB0eXBlICVkIiwgbmlkLT50eXBlKTsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKyN1bmRlZiBNQVhOQU1FTEVOCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogbWFrZV9jX25hbWUKKyAqIFN5bnRheAk6IGNoYXIgKm1ha2VfY19uYW1lKGNoYXIgKmJhc2UsIG5hbWVfaWRfdCAqbmlkLCBsYW5ndWFnZV90ICpsYW4pCisgKiBJbnB1dAk6CisgKiBPdXRwdXQJOgorICogRGVzY3JpcHRpb24JOiBDb252ZXJ0cyBhIHJlc291cmNlIG5hbWUgaW50byBhIHZhbGlkIGMtaWRlbnRpZmllciBpbiB0aGUKKyAqCQkgIGZvcm0gIl9iYXNlX25pZCIuCisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK2NoYXIgKm1ha2VfY19uYW1lKGNoYXIgKmJhc2UsIG5hbWVfaWRfdCAqbmlkLCBsYW5ndWFnZV90ICpsYW4pCit7CisJaW50IG5sZW47CisJY2hhciAqYnVmOworCWNoYXIgKnJldDsKKwljaGFyIGxhbmJ1Zls2XTsKKworCXNwcmludGYobGFuYnVmLCAiJWQiLCBsYW4gPyBNQUtFTEFOR0lEKGxhbi0+aWQsIGxhbi0+c3ViKSA6IDApOworCWJ1ZiA9IHByZXBfbmlkX2Zvcl9sYWJlbChuaWQpOworCW5sZW4gPSBzdHJsZW4oYnVmKSArIHN0cmxlbihsYW5idWYpOworCW5sZW4gKz0gc3RybGVuKGJhc2UpICsgNDsgLyogdGhyZWUgdGltZSAnXycgYW5kICdcMCcgKi8KKwlyZXQgPSAoY2hhciAqKXhtYWxsb2Mobmxlbik7CisJc3RyY3B5KHJldCwgIl8iKTsKKwlzdHJjYXQocmV0LCBiYXNlKTsKKwlzdHJjYXQocmV0LCAiXyIpOworCXN0cmNhdChyZXQsIGJ1Zik7CisJc3RyY2F0KHJldCwgIl8iKTsKKwlzdHJjYXQocmV0LCBsYW5idWYpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogZ2V0X2NfdHlwZW5hbWUKKyAqIFN5bnRheAk6IGNoYXIgKmdldF9jX3R5cGVuYW1lKGVudW0gcmVzX2UgdHlwZSkKKyAqIElucHV0CToKKyAqIE91dHB1dAk6CisgKiBEZXNjcmlwdGlvbgk6IENvbnZlcnQgcmVzb3VyY2UgZW51bSB0byBjaGFyIHN0cmluZyB0byBiZSB1c2VkIGluIGMtbmFtZQorICoJCSAgY3JlYXRpb24uCisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK2NoYXIgKmdldF9jX3R5cGVuYW1lKGVudW0gcmVzX2UgdHlwZSkKK3sKKwlzd2l0Y2godHlwZSkKKwl7CisJY2FzZSByZXNfYWNjOglyZXR1cm4gIkFjYyI7CisJY2FzZSByZXNfYm1wOglyZXR1cm4gIkJtcCI7CisJY2FzZSByZXNfY3VyOglyZXR1cm4gIkN1ciI7CisJY2FzZSByZXNfY3VyZzoJcmV0dXJuICJDdXJHcnAiOworCWNhc2UgcmVzX2RsZzoKKwljYXNlIHJlc19kbGdleDoJcmV0dXJuICJEbGciOworCWNhc2UgcmVzX2ZudDoJcmV0dXJuICJGbnQiOworCWNhc2UgcmVzX2ljbzoJcmV0dXJuICJJY28iOworCWNhc2UgcmVzX2ljb2c6CXJldHVybiAiSWNvR3JwIjsKKwljYXNlIHJlc19tZW46CisJY2FzZSByZXNfbWVuZXg6CXJldHVybiAiTWVuIjsKKwljYXNlIHJlc19yZHQ6CXJldHVybiAiUkNEYXQiOworCWNhc2UgcmVzX3N0dDoJcmV0dXJuICJTdHJUYWIiOworCWNhc2UgcmVzX3VzcjoJcmV0dXJuICJVc3IiOworCWNhc2UgcmVzX21zZzoJcmV0dXJuICJNc2dUYWIiOworCWNhc2UgcmVzX3ZlcjoJcmV0dXJuICJWZXJJbmYiOworCWRlZmF1bHQ6CXJldHVybiAiT29wcyI7CisJfQorfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IHJlc291cmNlczJyZXMKKyAqIFN5bnRheAk6IHZvaWQgcmVzb3VyY2VzMnJlcyhyZXNvdXJjZV90ICp0b3ApCisgKiBJbnB1dAk6CisgKgl0b3AJLSBUaGUgcmVzb3VyY2UtdHJlZSB0byBjb252ZXJ0CisgKiBPdXRwdXQJOgorICogRGVzY3JpcHRpb24JOiBDb252ZXJ0IGxvZ2ljYWwgcmVzb3VyY2UgZGVzY3JpcHRvcnMgaW50byBiaW5hcnkgZGF0YQorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCit2b2lkIHJlc291cmNlczJyZXMocmVzb3VyY2VfdCAqdG9wKQoreworCXdoaWxlKHRvcCkKKwl7CisJCXN3aXRjaCh0b3AtPnR5cGUpCisJCXsKKwkJY2FzZSByZXNfYWNjOgorCQkJaWYoIXRvcC0+YmlucmVzKQorCQkJCXRvcC0+YmlucmVzID0gYWNjZWxlcmF0b3IycmVzKHRvcC0+bmFtZSwgdG9wLT5yZXMuYWNjKTsKKwkJCWJyZWFrOworCQljYXNlIHJlc19ibXA6CisJCQlpZighdG9wLT5iaW5yZXMpCisJCQkJdG9wLT5iaW5yZXMgPSBiaXRtYXAycmVzKHRvcC0+bmFtZSwgdG9wLT5yZXMuYm1wKTsKKwkJCWJyZWFrOworCQljYXNlIHJlc19jdXI6CisJCQlpZighdG9wLT5iaW5yZXMpCisJCQkJdG9wLT5iaW5yZXMgPSBjdXJzb3IycmVzKHRvcC0+cmVzLmN1cik7CisJCQlicmVhazsKKwkJY2FzZSByZXNfY3VyZzoKKwkJCWlmKCF0b3AtPmJpbnJlcykKKwkJCQl0b3AtPmJpbnJlcyA9IGN1cnNvcmdyb3VwMnJlcyh0b3AtPm5hbWUsIHRvcC0+cmVzLmN1cmcpOworCQkJYnJlYWs7CisJCWNhc2UgcmVzX2RsZzoKKwkJCWlmKCF0b3AtPmJpbnJlcykKKwkJCQl0b3AtPmJpbnJlcyA9IGRpYWxvZzJyZXModG9wLT5uYW1lLCB0b3AtPnJlcy5kbGcpOworCQkJYnJlYWs7CisJCWNhc2UgcmVzX2RsZ2V4OgorCQkJaWYoIXRvcC0+YmlucmVzKQorCQkJCXRvcC0+YmlucmVzID0gZGlhbG9nZXgycmVzKHRvcC0+bmFtZSwgdG9wLT5yZXMuZGxnZXgpOworCQkJYnJlYWs7CisJCWNhc2UgcmVzX2ZudDoKKwkJCWlmKCF0b3AtPmJpbnJlcykKKwkJCQl0b3AtPmJpbnJlcyA9IGZvbnQycmVzKHRvcC0+bmFtZSwgdG9wLT5yZXMuZm50KTsKKwkJCWJyZWFrOworCQljYXNlIHJlc19pY286CisJCQlpZighdG9wLT5iaW5yZXMpCisJCQkJdG9wLT5iaW5yZXMgPSBpY29uMnJlcyh0b3AtPnJlcy5pY28pOworCQkJYnJlYWs7CisJCWNhc2UgcmVzX2ljb2c6CisJCQlpZighdG9wLT5iaW5yZXMpCisJCQkJdG9wLT5iaW5yZXMgPSBpY29uZ3JvdXAycmVzKHRvcC0+bmFtZSwgdG9wLT5yZXMuaWNvZyk7CisJCQlicmVhazsKKwkJY2FzZSByZXNfbWVuOgorCQkJaWYoIXRvcC0+YmlucmVzKQorCQkJCXRvcC0+YmlucmVzID0gbWVudTJyZXModG9wLT5uYW1lLCB0b3AtPnJlcy5tZW4pOworCQkJYnJlYWs7CisJCWNhc2UgcmVzX21lbmV4OgorCQkJaWYoIXRvcC0+YmlucmVzKQorCQkJCXRvcC0+YmlucmVzID0gbWVudWV4MnJlcyh0b3AtPm5hbWUsIHRvcC0+cmVzLm1lbmV4KTsKKwkJCWJyZWFrOworCQljYXNlIHJlc19yZHQ6CisJCQlpZighdG9wLT5iaW5yZXMpCisJCQkJdG9wLT5iaW5yZXMgPSByY2RhdGEycmVzKHRvcC0+bmFtZSwgdG9wLT5yZXMucmR0KTsKKwkJCWJyZWFrOworCQljYXNlIHJlc19zdHQ6CisJCQlpZighdG9wLT5iaW5yZXMpCisJCQkJdG9wLT5iaW5yZXMgPSBzdHJpbmd0YWJsZTJyZXModG9wLT5yZXMuc3R0KTsKKwkJCWJyZWFrOworCQljYXNlIHJlc191c3I6CisJCQlpZighdG9wLT5iaW5yZXMpCisJCQkJdG9wLT5iaW5yZXMgPSB1c2VyMnJlcyh0b3AtPm5hbWUsIHRvcC0+cmVzLnVzcik7CisJCQlicmVhazsKKwkJY2FzZSByZXNfbXNnOgorCQkJaWYoIXRvcC0+YmlucmVzKQorCQkJCXRvcC0+YmlucmVzID0gbWVzc2FnZXRhYmxlMnJlcyh0b3AtPm5hbWUsIHRvcC0+cmVzLm1zZyk7CisJCQlicmVhazsKKwkJY2FzZSByZXNfdmVyOgorCQkJaWYoIXRvcC0+YmlucmVzKQorCQkJCXRvcC0+YmlucmVzID0gdmVyc2lvbmluZm8ycmVzKHRvcC0+bmFtZSwgdG9wLT5yZXMudmVyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaW50ZXJuYWxfZXJyb3IoX19GSUxFX18sIF9fTElORV9fLCAiVW5rbm93biByZXNvdXJjZSB0eXBlIGVuY291bnRlcmVkICVkIGluIGJpbmFyeSByZXMgZ2VuZXJhdGlvbiIsIHRvcC0+dHlwZSk7CisJCX0KKwkJdG9wLT5jX25hbWUgPSBtYWtlX2NfbmFtZShnZXRfY190eXBlbmFtZSh0b3AtPnR5cGUpLCB0b3AtPm5hbWUsIHRvcC0+bGFuKTsKKwkJdG9wID0gdG9wLT5uZXh0OworCX0KK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvd3JjL2dlbnJlcy5oIGIvdG9vbHMvd3JjL2dlbnJlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNGQ5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy93cmMvZ2VucmVzLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIEdlbmVyYXRlIHJlc291cmNlIHByb3RvdHlwZXMKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBCZXJ0aG8gQS4gU3R1bHRpZW5zIChCUykKKyAqCisgKi8KKworI2lmbmRlZiBfX1dSQ19HRU5SRVNfSAorI2RlZmluZSBfX1dSQ19HRU5SRVNfSAorCisjaWZuZGVmIF9fV1JDX1dSQ1RZUEVTX0gKKyNpbmNsdWRlICJ3cmN0eXBlcy5oIgorI2VuZGlmCisKK3Jlc190ICpuZXdfcmVzKHZvaWQpOworcmVzX3QgKmdyb3dfcmVzKHJlc190ICpyLCBpbnQgYWRkKTsKK3ZvaWQgcHV0X2J5dGUocmVzX3QgKnJlcywgdW5zaWduZWQgYyk7Cit2b2lkIHB1dF93b3JkKHJlc190ICpyZXMsIHVuc2lnbmVkIHcpOwordm9pZCBwdXRfZHdvcmQocmVzX3QgKnJlcywgdW5zaWduZWQgZCk7Cit2b2lkIHJlc291cmNlczJyZXMocmVzb3VyY2VfdCAqdG9wKTsKK2NoYXIgKmdldF9jX3R5cGVuYW1lKGVudW0gcmVzX2UgdHlwZSk7CitjaGFyICptYWtlX2NfbmFtZShjaGFyICpiYXNlLCBuYW1lX2lkX3QgKm5pZCwgbGFuZ3VhZ2VfdCAqbGFuKTsKK2NoYXIgKnByZXBfbmlkX2Zvcl9sYWJlbChuYW1lX2lkX3QgKm5pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvd3JjL25ld3N0cnVjLmMgYi90b29scy93cmMvbmV3c3RydWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDMzYzRiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvd3JjL25ld3N0cnVjLmMKQEAgLTAsMCArMSwyNTEgQEAKKy8qCisgKiBDcmVhdGUgZHluYW1pYyBuZXcgc3RydWN0dXJlcyBvZiB2YXJpb3VzIHR5cGVzCisgKiBhbmQgc29tZSB1dGlscyBpbiB0aGF0IHRyZW5kLgorICoKKyAqIENvcHlyaWdodCAxOTk4IEJlcnRobyBBLiBTdHVsdGllbnMKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJ3cmMuaCIKKyNpbmNsdWRlICJuZXdzdHJ1Yy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCisKKy8qIEdlbmVyYXRlIG5ld18qIGZ1bmN0aW9ucyB0aGF0IGhhdmUgbm8gcGFyYW1ldGVycyAoTk9URTogbm8gJzsnKSAqLworX19ORVdfU1RSVUNUX0ZVTkMoZGlhbG9nKQorX19ORVdfU1RSVUNUX0ZVTkMoZGlhbG9nZXgpCitfX05FV19TVFJVQ1RfRlVOQyhuYW1lX2lkKQorX19ORVdfU1RSVUNUX0ZVTkMobWVudSkKK19fTkVXX1NUUlVDVF9GVU5DKG1lbnVleCkKK19fTkVXX1NUUlVDVF9GVU5DKG1lbnVfaXRlbSkKK19fTkVXX1NUUlVDVF9GVU5DKG1lbnVleF9pdGVtKQorX19ORVdfU1RSVUNUX0ZVTkMoY29udHJvbCkKK19fTkVXX1NUUlVDVF9GVU5DKGljb24pCitfX05FV19TVFJVQ1RfRlVOQyhjdXJzb3IpCitfX05FV19TVFJVQ1RfRlVOQyh2ZXJzaW9uaW5mbykKK19fTkVXX1NUUlVDVF9GVU5DKHZlcl92YWx1ZSkKK19fTkVXX1NUUlVDVF9GVU5DKHZlcl9ibG9jaykKK19fTkVXX1NUUlVDVF9GVU5DKHN0dF9lbnRyeSkKK19fTkVXX1NUUlVDVF9GVU5DKGFjY2VsZXJhdG9yKQorX19ORVdfU1RSVUNUX0ZVTkMoZXZlbnQpCitfX05FV19TVFJVQ1RfRlVOQyhyYXdfZGF0YSkKK19fTkVXX1NUUlVDVF9GVU5DKGx2YykKK19fTkVXX1NUUlVDVF9GVU5DKHJlc19jb3VudCkKK19fTkVXX1NUUlVDVF9GVU5DKHN0cmluZykKKworLyogTmV3IGluc3RhbmNlcyBmb3IgYWxsIHR5cGVzIG9mIHN0cnVjdHVyZXMgKi8KKy8qIFZlcnkgaW5lZmZpY2llbnQgKGluIHNpemUpLCBidXQgdmVyeSBmdW5jdGlvbmFsIDotXQorICogRXNwZWNpYWxseSBmb3IgdHlwZS1jaGVja2luZy4KKyAqLworcmVzb3VyY2VfdCAqbmV3X3Jlc291cmNlKGVudW0gcmVzX2UgdCwgdm9pZCAqcmVzLCBpbnQgbWVtb3B0LCBsYW5ndWFnZV90ICpsYW4pCit7CisJcmVzb3VyY2VfdCAqciA9IChyZXNvdXJjZV90ICopeG1hbGxvYyhzaXplb2YocmVzb3VyY2VfdCkpOworCXItPnR5cGUgPSB0OworCXItPnJlcy5vdmVybGF5ID0gcmVzOworCXItPm1lbW9wdCA9IG1lbW9wdDsKKwlyLT5sYW4gPSBsYW47CisJcmV0dXJuIHI7Cit9CisKK3ZlcnNpb25fdCAqbmV3X3ZlcnNpb24oRFdPUkQgdikKK3sKKwl2ZXJzaW9uX3QgKnZwID0gKHZlcnNpb25fdCAqKXhtYWxsb2Moc2l6ZW9mKHZlcnNpb25fdCkpOworCSp2cCA9IHY7CisJcmV0dXJuIHZwOworfQorCitjaGFyYWN0c190ICpuZXdfY2hhcmFjdHMoRFdPUkQgYykKK3sKKwljaGFyYWN0c190ICpjcCA9IChjaGFyYWN0c190ICopeG1hbGxvYyhzaXplb2YoY2hhcmFjdHNfdCkpOworCSpjcCA9IGM7CisJcmV0dXJuIGNwOworfQorCitsYW5ndWFnZV90ICpuZXdfbGFuZ3VhZ2UoaW50IGlkLCBpbnQgc3ViKQoreworCWxhbmd1YWdlX3QgKmxhbiA9IChsYW5ndWFnZV90ICopeG1hbGxvYyhzaXplb2YobGFuZ3VhZ2VfdCkpOworCWxhbi0+aWQgPSBpZDsKKwlsYW4tPnN1YiA9IHN1YjsKKwlyZXR1cm4gbGFuOworfQorCitsYW5ndWFnZV90ICpkdXBfbGFuZ3VhZ2UobGFuZ3VhZ2VfdCAqbCkKK3sKKwlpZighbCkgcmV0dXJuIE5VTEw7CisJcmV0dXJuIG5ld19sYW5ndWFnZShsLT5pZCwgbC0+c3ViKTsKK30KKwordmVyc2lvbl90ICpkdXBfdmVyc2lvbih2ZXJzaW9uX3QgKnYpCit7CisJaWYoIXYpIHJldHVybiBOVUxMOworCXJldHVybiBuZXdfdmVyc2lvbigqdik7Cit9CisKK2NoYXJhY3RzX3QgKmR1cF9jaGFyYWN0cyhjaGFyYWN0c190ICpjKQoreworCWlmKCFjKSByZXR1cm4gTlVMTDsKKwlyZXR1cm4gbmV3X2NoYXJhY3RzKCpjKTsKK30KKworcmNkYXRhX3QgKm5ld19yY2RhdGEocmF3X2RhdGFfdCAqcmQsIGludCAqbWVtb3B0KQoreworCXJjZGF0YV90ICpyYyA9IChyY2RhdGFfdCAqKXhtYWxsb2Moc2l6ZW9mKHJjZGF0YV90KSk7CisJcmMtPmRhdGEgPSByZDsKKwlpZihtZW1vcHQpCisJeworCQlyYy0+bWVtb3B0ID0gKm1lbW9wdDsKKwkJZnJlZShtZW1vcHQpOworCX0KKwllbHNlCisJCXJjLT5tZW1vcHQgPSBXUkNfTU9fTU9WRUFCTEUgfCBXUkNfTU9fUFVSRTsKKwlyZXR1cm4gcmM7Cit9CisKK2ZvbnRfaWRfdCAqbmV3X2ZvbnRfaWQoaW50IHNpemUsIHN0cmluZ190ICpmYWNlLCBpbnQgd2VpZ2h0LCBpbnQgaXRhbGljKQoreworCWZvbnRfaWRfdCAqZmlkID0gKGZvbnRfaWRfdCAqKXhtYWxsb2Moc2l6ZW9mKGZvbnRfaWRfdCkpOworCWZpZC0+bmFtZSA9IGZhY2U7CisJZmlkLT5zaXplID0gc2l6ZTsKKwlmaWQtPndlaWdodCA9IHdlaWdodDsKKwlmaWQtPml0YWxpYyA9IGl0YWxpYzsKKwlyZXR1cm4gZmlkOworfQorCit1c2VyX3QgKm5ld191c2VyKG5hbWVfaWRfdCAqdHlwZSwgcmF3X2RhdGFfdCAqcmQsIGludCAqbWVtb3B0KQoreworCXVzZXJfdCAqdXNyID0gKHVzZXJfdCAqKXhtYWxsb2Moc2l6ZW9mKHVzZXJfdCkpOworCXVzci0+ZGF0YSA9IHJkOworCWlmKG1lbW9wdCkKKwl7CisJCXVzci0+bWVtb3B0ID0gKm1lbW9wdDsKKwkJZnJlZShtZW1vcHQpOworCX0KKwllbHNlCisJCXVzci0+bWVtb3B0ID0gV1JDX01PX01PVkVBQkxFIHwgV1JDX01PX1BVUkU7CisJdXNyLT50eXBlID0gdHlwZTsKKwlyZXR1cm4gdXNyOworfQorCitmb250X3QgKm5ld19mb250KHJhd19kYXRhX3QgKnJkLCBpbnQgKm1lbW9wdCkKK3sKKwlmb250X3QgKmZudCA9IChmb250X3QgKil4bWFsbG9jKHNpemVvZihmb250X3QpKTsKKwlmbnQtPmRhdGEgPSByZDsKKwlpZihtZW1vcHQpCisJeworCQlmbnQtPm1lbW9wdCA9ICptZW1vcHQ7CisJCWZyZWUobWVtb3B0KTsKKwl9CisJZWxzZQorCQlmbnQtPm1lbW9wdCA9IFdSQ19NT19NT1ZFQUJMRSB8IFdSQ19NT19QVVJFOworCXJldHVybiBmbnQ7Cit9CisKK2ljb25fZ3JvdXBfdCAqbmV3X2ljb25fZ3JvdXAocmF3X2RhdGFfdCAqcmQsIGludCAqbWVtb3B0KQoreworCWljb25fZ3JvdXBfdCAqaWNvZyA9IChpY29uX2dyb3VwX3QgKil4bWFsbG9jKHNpemVvZihpY29uX2dyb3VwX3QpKTsKKwlpZihtZW1vcHQpCisJeworCQlpY29nLT5tZW1vcHQgPSAqbWVtb3B0OworCQlmcmVlKG1lbW9wdCk7CisJfQorCWVsc2UKKwkJaWNvZy0+bWVtb3B0ID0gV1JDX01PX01PVkVBQkxFIHwgV1JDX01PX1BVUkUgfCBXUkNfTU9fRElTQ0FSREFCTEU7CisJc3BsaXRfaWNvbnMocmQsIGljb2csICYoaWNvZy0+bmljb24pKTsKKwlmcmVlKHJkLT5kYXRhKTsKKwlmcmVlKHJkKTsKKwlyZXR1cm4gaWNvZzsKK30KKworY3Vyc29yX2dyb3VwX3QgKm5ld19jdXJzb3JfZ3JvdXAocmF3X2RhdGFfdCAqcmQsIGludCAqbWVtb3B0KQoreworCWN1cnNvcl9ncm91cF90ICpjdXJnID0gKGN1cnNvcl9ncm91cF90ICopeG1hbGxvYyhzaXplb2YoY3Vyc29yX2dyb3VwX3QpKTsKKwlpZihtZW1vcHQpCisJeworCQljdXJnLT5tZW1vcHQgPSAqbWVtb3B0OworCQlmcmVlKG1lbW9wdCk7CisJfQorCWVsc2UKKwkJY3VyZy0+bWVtb3B0ID0gV1JDX01PX01PVkVBQkxFIHwgV1JDX01PX1BVUkUgfCBXUkNfTU9fRElTQ0FSREFCTEU7CisJc3BsaXRfY3Vyc29ycyhyZCwgY3VyZywgJihjdXJnLT5uY3Vyc29yKSk7CisJZnJlZShyZC0+ZGF0YSk7CisJZnJlZShyZCk7CisJcmV0dXJuIGN1cmc7Cit9CisKK2JpdG1hcF90ICpuZXdfYml0bWFwKHJhd19kYXRhX3QgKnJkLCBpbnQgKm1lbW9wdCkKK3sKKwliaXRtYXBfdCAqYm1wID0gKGJpdG1hcF90ICopeG1hbGxvYyhzaXplb2YoYml0bWFwX3QpKTsKKwlibXAtPmRhdGEgPSByZDsKKwlpZihtZW1vcHQpCisJeworCQlibXAtPm1lbW9wdCA9ICptZW1vcHQ7CisJCWZyZWUobWVtb3B0KTsKKwl9CisJZWxzZQorCQlibXAtPm1lbW9wdCA9IFdSQ19NT19NT1ZFQUJMRSB8IFdSQ19NT19QVVJFOworCXJldHVybiBibXA7Cit9CisKK3Zlcl93b3Jkc190ICpuZXdfdmVyX3dvcmRzKGludCBpKQoreworCXZlcl93b3Jkc190ICp3ID0gKHZlcl93b3Jkc190ICopeG1hbGxvYyhzaXplb2YodmVyX3dvcmRzX3QpKTsKKwl3LT53b3JkcyA9IChXT1JEICopeG1hbGxvYyhzaXplb2YoV09SRCkpOworCXctPndvcmRzWzBdID0gKFdPUkQpaTsKKwl3LT5ud29yZHMgPSAxOworCXJldHVybiB3OworfQorCit2ZXJfd29yZHNfdCAqYWRkX3Zlcl93b3Jkcyh2ZXJfd29yZHNfdCAqdywgaW50IGkpCit7CisJdy0+d29yZHMgPSAoV09SRCAqKXhyZWFsbG9jKHctPndvcmRzLCAody0+bndvcmRzKzEpICogc2l6ZW9mKFdPUkQpKTsKKwl3LT53b3Jkc1t3LT5ud29yZHNdID0gKFdPUkQpaTsKKwl3LT5ud29yZHMrKzsKKwlyZXR1cm4gdzsKK30KKworbWVzc2FnZXRhYmxlX3QgKm5ld19tZXNzYWdldGFibGUocmF3X2RhdGFfdCAqcmQpCit7CisJbWVzc2FnZXRhYmxlX3QgKm1zZyA9IChtZXNzYWdldGFibGVfdCAqKXhtYWxsb2Moc2l6ZW9mKG1lc3NhZ2V0YWJsZV90KSk7CisJbXNnLT5kYXRhID0gcmQ7CisJcmV0dXJuIG1zZzsKK30KKwordm9pZCBjb3B5X3Jhd19kYXRhKHJhd19kYXRhX3QgKmRzdCwgcmF3X2RhdGFfdCAqc3JjLCBpbnQgb2ZmcywgaW50IGxlbikKK3sKKwlhc3NlcnQob2ZmcyA8PSBzcmMtPnNpemUpOworCWFzc2VydChvZmZzICsgbGVuIDw9IHNyYy0+c2l6ZSk7CisJaWYoIWRzdC0+ZGF0YSkKKwl7CisJCWRzdC0+ZGF0YSA9IChjaGFyICopeG1hbGxvYyhsZW4pOworCQlkc3QtPnNpemUgPSAwOworCX0KKwllbHNlCisJCWRzdC0+ZGF0YSA9IChjaGFyICopeHJlYWxsb2MoZHN0LT5kYXRhLCBkc3QtPnNpemUgKyBsZW4pOworCS8qIGRzdC0+c2l6ZSBob2xkcyB0aGUgb2Zmc2V0IHRvIGNvcHkgdG8gKi8KKwltZW1jcHkoZHN0LT5kYXRhICsgZHN0LT5zaXplLCBzcmMtPmRhdGEgKyBvZmZzLCBsZW4pOworCWRzdC0+c2l6ZSArPSBsZW47Cit9CisKK2ludCAqbmV3X2ludChpbnQgaSkKK3sKKwlpbnQgKmlwID0gKGludCAqKXhtYWxsb2Moc2l6ZW9mKGludCkpOworCSppcCA9IGk7CisJcmV0dXJuIGlwOworfQorCitzdHJpbmd0YWJsZV90ICpuZXdfc3RyaW5ndGFibGUobHZjX3QgKmx2YykKK3sKKwlzdHJpbmd0YWJsZV90ICpzdHQgPSAoc3RyaW5ndGFibGVfdCAqKXhtYWxsb2Moc2l6ZW9mKHN0cmluZ3RhYmxlX3QpKTsKKworCWlmKGx2YykKKwkJc3R0LT5sdmMgPSAqbHZjOworCisJcmV0dXJuIHN0dDsKK30KKworCmRpZmYgLS1naXQgYS90b29scy93cmMvbmV3c3RydWMuaCBiL3Rvb2xzL3dyYy9uZXdzdHJ1Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZDM5MDcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy93cmMvbmV3c3RydWMuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ3JlYXRlIGR5bmFtaWMgbmV3IHN0cnVjdHVyZXMgb2YgdmFyaW91cyB0eXBlcworICoKKyAqIENvcHlyaWdodCAxOTk4IEJlcnRobyBBLiBTdHVsdGllbnMKKyAqCisgKi8KKworI2lmbmRlZiBfX1dSQ19ORVdTVFJVQ19ICisjZGVmaW5lIF9fV1JDX05FV1NUUlVDX0gKKworI2lmbmRlZiBfX1dSQ19XUkNUWVBFU19ICisjaW5jbHVkZSAid3JjdHlwZXMuaCIKKyNlbmRpZgorCisjZGVmaW5lIF9fTkVXX1NUUlVDVF9GVU5DKHApCVwKKwlwIyNfdCAqbmV3XyMjcCh2b2lkKVwKKwl7XAorCQlyZXR1cm4gKHAjI190ICopeG1hbGxvYyhzaXplb2YocCMjX3QpKTtcCisJfQorCisjZGVmaW5lIF9fTkVXX1NUUlVDVF9QUk9UTyhwKQlwIyNfdCAqbmV3XyMjcCh2b2lkKQorCitfX05FV19TVFJVQ1RfUFJPVE8oZGlhbG9nKTsKK19fTkVXX1NUUlVDVF9QUk9UTyhkaWFsb2dleCk7CitfX05FV19TVFJVQ1RfUFJPVE8obmFtZV9pZCk7CitfX05FV19TVFJVQ1RfUFJPVE8obWVudSk7CitfX05FV19TVFJVQ1RfUFJPVE8obWVudWV4KTsKK19fTkVXX1NUUlVDVF9QUk9UTyhtZW51X2l0ZW0pOworX19ORVdfU1RSVUNUX1BST1RPKG1lbnVleF9pdGVtKTsKK19fTkVXX1NUUlVDVF9QUk9UTyhjb250cm9sKTsKK19fTkVXX1NUUlVDVF9QUk9UTyhpY29uKTsKK19fTkVXX1NUUlVDVF9QUk9UTyhjdXJzb3IpOworX19ORVdfU1RSVUNUX1BST1RPKHZlcnNpb25pbmZvKTsKK19fTkVXX1NUUlVDVF9QUk9UTyh2ZXJfdmFsdWUpOworX19ORVdfU1RSVUNUX1BST1RPKHZlcl9ibG9jayk7CitfX05FV19TVFJVQ1RfUFJPVE8oc3R0X2VudHJ5KTsKK19fTkVXX1NUUlVDVF9QUk9UTyhhY2NlbGVyYXRvcik7CitfX05FV19TVFJVQ1RfUFJPVE8oZXZlbnQpOworX19ORVdfU1RSVUNUX1BST1RPKHJhd19kYXRhKTsKK19fTkVXX1NUUlVDVF9QUk9UTyhsdmMpOworX19ORVdfU1RSVUNUX1BST1RPKHJlc19jb3VudCk7CitfX05FV19TVFJVQ1RfUFJPVE8oc3RyaW5nKTsKKworcmVzb3VyY2VfdCAqbmV3X3Jlc291cmNlKGVudW0gcmVzX2UgdCwgdm9pZCAqcmVzLCBpbnQgbWVtb3B0LCBsYW5ndWFnZV90ICpsYW4pOwordmVyc2lvbl90ICpuZXdfdmVyc2lvbihEV09SRCB2KTsKK2NoYXJhY3RzX3QgKm5ld19jaGFyYWN0cyhEV09SRCBjKTsKK2xhbmd1YWdlX3QgKm5ld19sYW5ndWFnZShpbnQgaWQsIGludCBzdWIpOworbGFuZ3VhZ2VfdCAqZHVwX2xhbmd1YWdlKGxhbmd1YWdlX3QgKmwpOwordmVyc2lvbl90ICpkdXBfdmVyc2lvbih2ZXJzaW9uX3QgKnYpOworY2hhcmFjdHNfdCAqZHVwX2NoYXJhY3RzKGNoYXJhY3RzX3QgKmMpOworcmNkYXRhX3QgKm5ld19yY2RhdGEocmF3X2RhdGFfdCAqcmQsIGludCAqbWVtb3B0KTsKK2ZvbnRfaWRfdCAqbmV3X2ZvbnRfaWQoaW50IHNpemUsIHN0cmluZ190ICpmYWNlLCBpbnQgd2VpZ2h0LCBpbnQgaXRhbGljKTsKK3VzZXJfdCAqbmV3X3VzZXIobmFtZV9pZF90ICp0eXBlLCByYXdfZGF0YV90ICpyZCwgaW50ICptZW1vcHQpOworZm9udF90ICpuZXdfZm9udChyYXdfZGF0YV90ICpyZCwgaW50ICptZW1vcHQpOworaWNvbl9ncm91cF90ICpuZXdfaWNvbl9ncm91cChyYXdfZGF0YV90ICpyZCwgaW50ICptZW1vcHQpOworY3Vyc29yX2dyb3VwX3QgKm5ld19jdXJzb3JfZ3JvdXAocmF3X2RhdGFfdCAqcmQsIGludCAqbWVtb3B0KTsKK2JpdG1hcF90ICpuZXdfYml0bWFwKHJhd19kYXRhX3QgKnJkLCBpbnQgKm1lbW9wdCk7Cit2ZXJfd29yZHNfdCAqbmV3X3Zlcl93b3JkcyhpbnQgaSk7Cit2ZXJfd29yZHNfdCAqYWRkX3Zlcl93b3Jkcyh2ZXJfd29yZHNfdCAqdywgaW50IGkpOworbWVzc2FnZXRhYmxlX3QgKm5ld19tZXNzYWdldGFibGUocmF3X2RhdGFfdCAqcmQpOwordm9pZCBjb3B5X3Jhd19kYXRhKHJhd19kYXRhX3QgKmRzdCwgcmF3X2RhdGFfdCAqc3JjLCBpbnQgb2ZmcywgaW50IGxlbik7CitpbnQgKm5ld19pbnQoaW50IGkpOworc3RyaW5ndGFibGVfdCAqbmV3X3N0cmluZ3RhYmxlKGx2Y190ICpsdmMpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdG9vbHMvd3JjL3BhcnNlci5oIGIvdG9vbHMvd3JjL3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMzgzNzEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy93cmMvcGFyc2VyLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4IEJlcnRobyBBLiBTdHVsdGllbnMgKEJTKQorICoKKyAqIFNoYXJlZCB0aGluZ3MgYmV0d2VlbiBwYXJzZXIubCBhbmQgcGFyc2VyLnkgYW5kIHNvbWUgb3RoZXJzCisgKi8KKworI2lmbmRlZiBfX1dSQ19QQVJTRVJfSAorI2RlZmluZSBfX1dSQ19QQVJTRVJfSAorCisvKiBGcm9tIHBhcnNlci55ICovCitleHRlcm4gaW50IHl5ZGVidWc7CitleHRlcm4gaW50IGluZGlhbG9nOwkJLyogU2V0IHdoZW4gcGFyc2luZyBkaWFsb2dzICovCitleHRlcm4gaW50IHdhbnRfcnNjbmFtZTsJLyogU2V0IHdoZW4gYSByZXNvdXJjZSdzIG5hbWUgaXMgcmVxdWlyZWQgKi8KKworaW50IHl5cGFyc2Uodm9pZCk7Cit2b2lkIHNwbGl0X2ljb25zKHJhd19kYXRhX3QgKnJkLCBpY29uX2dyb3VwX3QgKmljb2csIGludCAqbmljbyk7Cit2b2lkIHNwbGl0X2N1cnNvcnMocmF3X2RhdGFfdCAqcmQsIGN1cnNvcl9ncm91cF90ICpjdXJnLCBpbnQgKm5jdXIpOworCisvKiBGcm9tIHBhcnNlci5sICovCitleHRlcm4gRklMRSAqeXlpbjsKK2V4dGVybiBpbnQgbGluZV9udW1iZXI7CisKK2ludCB5eWxleCh2b2lkKTsKK3ZvaWQgc2V0X3l5d2Yodm9pZCk7Cit2b2lkIHNldF9wcF9pZ25vcmUoaW50IHN0YXRlKTsKK3ZvaWQgcHVzaF90byhpbnQgc3RhcnQpOwordm9pZCBwb3Bfc3RhcnQodm9pZCk7Cit2b2lkIHN0cmlwX3RpbF9zZW1pY29sb24odm9pZCk7Cit2b2lkIHN0cmlwX3RpbF9wYXJlbnRoZXNpcyh2b2lkKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3Rvb2xzL3dyYy9wYXJzZXIubCBiL3Rvb2xzL3dyYy9wYXJzZXIubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjQxMWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvd3JjL3BhcnNlci5sCkBAIC0wLDAgKzEsODYyIEBACisvKiAtKi1DLSotCisgKgorICogQ29weXJpZ2h0IDE5OTQgTWFydGluIHZvbiBMb2V3aXMKKyAqIENvcHlyaWdodCAxOTk4IEJlcnRobyBBLiBTdHVsdGllbnMgKEJTKQorICoKKyAqIDE5LU1heS0xOTk4IEJTCS0gU3RhcnRlZCB0byBidWlsZCBhIHByZXByb2Nlc3Nvci4KKyAqCQkJLSBDaGFuZ2VkIGtleXdvcmQgcHJvY2Vzc2luZyBjb21wbGV0ZWx5IHRvCisgKgkJCSAgdGFibGUtbG9va3Vwcy4KKyAqCisgKiAyMC1BcHItMTk5OCBCUwktIEFkZGVkICc7JyBjb21tZW50IHN0cmlwcGluZworICoKKyAqIDE3LUFwci0xOTk4IEJTCS0gTWFkZSB0aGUgd2luMzIga2V5d29yZHMgb3B0aW9uYWwgd2hlbiBjb21waWxpbmcgaW4KKyAqCQkJICAxNmJpdCBtb2RlCisgKgorICogMTUtQXByLTE5OTggQlMJLSBDaGFuZ2VkIHN0cmluZyBoYW5kbGluZyB0byBpbmNsdWRlIGVzY2FwZXMKKyAqCQkJLSBBZGRlZCB1bmljb2RlIHN0cmluZyBoYW5kbGluZyAobm8gY29kZXBhZ2UKKyAqCQkJICB0cmFuc2xhdGlvbiB0aG91Z2gpLgorICoJCQktICdCb3Jyb3dlZCcgdGhlIG1haW4gaWRlYSBvZiBzdHJpbmcgc2Nhbm5pbmcgZnJvbQorICoJCQkgIHRoZSBmbGV4IG1hbnVhbCBwYWdlcy4KKyAqCQkJLSBBZGRlZCBjb25kaXRpb25hbCBoYW5kbGluZyBvZiBzY2FubmluZyBkZXBlbmRpbmcKKyAqCQkJICBvbiB0aGUgc3RhdGUgb2YgdGhlIHBhcnNlci4gVGhpcyB3YXMgbWFpbmx5IHJlcXVpcmVkCisgKgkJCSAgdG8gZGlzdGluZ3Vpc2ggYSBmaWxlIHRvIGxvYWQgb3IgcmF3IGRhdGEgdGhhdAorICoJCQkgIGZvbGxvd3MuIE1TJ3MgZGVmaW5pdGlvbiBvZiBmaWxlbmFtZXMgaXMgcmF0aGVyCisgKgkJCSAgY29tcGxleC4uLiBJdCBjYW4gYmUgdW5xdW90ZWQgb3IgZG91YmxlIHF1b3RlZC4gSWYKKyAqCQkJICBkb3VibGUgcXVvdGVkLCB0aGVuIHRoZSAnXFwnIGNoYXIgaXMgbm90IGF1dG9tYXRpY2FsbHkKKyAqCQkJICBlc2NhcGVkIGFjY29yZGluZyB0byBCb3JsYW5kJ3MgcmMgY29tcGlsZXIsIGJ1dCBpdAorICoJCQkgIGFjY2VwdHMgYm90aCAiXFxwYXRoXFxmaWxlLnJjIiBhbmQgIlxwYXRoXGZpbGUucmMiLgorICoJCQkgIFRoaXMgbWFrZXMgbGlmZSB2ZXJ5IGhhcmQhIEkgZ28gZm9yIHRoZSBlc2NhcGVkCisgKgkJCSAgdmVyc2lvbiwgYXMgdGhpcyBzZWVtcyB0byBiZSB0aGUgZG9jdW1lbnRlZCB3YXkuLi4KKyAqCQkJLSBTaW5nbGUgcXVvdGVkIHN0cmluZ3MgYXJlIG5vdyBwYXJzZWQgYW5kIGNvbnZlcnRlZAorICoJCQkgIGhlcmUuCisgKgkJCS0gQWRkZWQgY29tbWVudCBzdHJpcHBpbmcuIFRoZSBpbXBsZW1lbnRhdGlvbiBpcworICoJCQkgICdib3Jyb3dlZCcgZnJvbSB0aGUgZmxleCBtYW5wYWdlcy4KKyAqCQkJLSBSZWJ1aWxkIHN0cmluZyBwcm9jZXNzaW5nIHNvIHRoYXQgaXQgbWF5IGNvbnRhaW4KKyAqCQkJICBlc2NhcGVkICdcMCcuCisgKi8KKworLyogRXhjbHVzaXZlIHJ1bGVzIHdoZW4gbG9va2luZyBmb3IgYSBmaWxlbmFtZSAqLworJXggeXl3ZgorLyogRXhjbHVzaXZlIHN0cmluZyBoYW5kbGluZyAqLworJXggeXlzdHIKKy8qIEV4Y2x1c2l2ZSB1bmljb2RlIHN0cmluZyBoYW5kbGluZyAqLworJXggeXlsc3RyCisvKiBFeGNsdXNpdmUgcmNkYXRhIHNpbmdsZSBxdW90ZWQgZGF0YSBoYW5kbGluZyAqLworJXggeXlyY2QKKy8qIEV4Y2x1c2l2ZSBjb21tZW50IGVhdGluZy4uLiAqLworJXggY29tbWVudAorLyogUHJlcHJvY2Vzc29yIGV4Y2x1c2l2ZXMgKi8KKyV4IHBwX2luY2wKKyV4IHBwX2RlZgorJXggcHBfdW5kZWYKKyV4IHBwX2lmCisleCBwcF9pZmRlZgorJXggcHBfaWZuZGVmCisleCBwcF9lbGlmCisleCBwcF9lbHNlCisleCBwcF9lbmRpZgorJXggcHBfZXJyb3IKKy8qIFNldCB3aGVuIGFjY3VtdWxhdGluZyAjZGVmaW5lJ3MgZXhwYW5zaW9uIHRleHQgKi8KKyV4IHBwX2RlZl9zCisvKiBTZXQgd2hlbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIHR5cGUgZGVmaW5lcyAqLworJXggcHBfaWdub3JlCisvKiBTZXQgd2hlbiBuZWVkIHRvIHN0cmlwIHRvIGVvbCAqLworJXggcHBfaWdub3JlX2VvbAorLyogU2V0IHdoZW4gaGFuZGxpbmcgYSBmYWxzZSAjaWYgY2FzZSAqLworJXggcHBfZmFsc2UKKy8qIFNldCB3aGVuIHN0cmlwcGluZyBjLWp1bmsgKi8KKyV4IHBwX3N0cmlwcworJXggcHBfc3RyaXBwCisleCBwcF9zdHJpcHBfZmluYWwKKworLyolb3B0aW9uIHN0YWNrKi8KKyVvcHRpb24gbmV2ZXItaW50ZXJhY3RpdmUKKy8qJW9wdGlvbiBub3l5d3JhcCAqLworLyogU29tZSBzaG9ydGN1dCBkZWZpbml0aW9ucyAqLword3MJWyBcZlx0XHJdCitjaWRlbnQJW2EtekEtWl9dWzAtOWEtekEtWl9dKgorCisleworCisvKiNkZWZpbmUgTEVYX0RFQlVHKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJ3cmMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInByZXByb2MuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJuZXdzdHJ1Yy5oIgorCisjaW5jbHVkZSAieS50YWIuaCIKKworI2RlZmluZSBZWV9VU0VfUFJPVE9TCisjZGVmaW5lIFlZX05PX1VOUFVUCisKK3Jhd19kYXRhX3QgKm5ld19yYXdfZGF0YSh2b2lkKTsKKwordm9pZCBhZGRjY2hhcihjaGFyIGMpOwordm9pZCBhZGR3Y2hhcihzaG9ydCBzKTsKK3N0cmluZ190ICpnZXRfYnVmZmVyZWRfY3N0cmluZyh2b2lkKTsKK3N0cmluZ190ICpnZXRfYnVmZmVyZWRfd3N0cmluZyh2b2lkKTsKK3N0cmluZ190ICptYWtlX3N0cmluZyhjaGFyICpzKTsKKworaW50IGxpbmVfbnVtYmVyID0gMTsKK3N0YXRpYyBjaGFyIGNidWZmZXJbMTAyNF07CS8qIEJ1ZmZlcnMgZm9yIHN0cmluZyBjb2xsZWN0aW9uICovCitzdGF0aWMgaW50IGNidWZpZHg7CitzdGF0aWMgc2hvcnQgd2J1ZmZlclsxMDI0XTsKK3N0YXRpYyBpbnQgd2J1ZmlkeDsKK3N0YXRpYyBpbnQgd2FudF9ubCA9IDA7CQkvKiBTZXQgd2hlbiBuZXdsaW5lIG5lZWRzIHRvIGdvIHRvIHBhcnNlciAqLworc3RhdGljIGludCB3YW50X2lkZW50ID0gMDsJLyogU2V0IGlzICNpZmRlZiwgI2lmbmRlZiBvciBkZWZpbmVkIGlzIHNlZW4gKi8KK3N0YXRpYyBpbnQgc3RyaXBzbGV2ZWwgPSAwOwkvKiBDb3VudCB7fSBkdXJpbmcgcHBfc3RyaXBzIG1vZGUgKi8KK3N0YXRpYyBpbnQgc3RyaXBwbGV2ZWwgPSAwOwkvKiBDb3VudCAoKSBkdXJpbmcgcHBfc3RyaXBzIG1vZGUgKi8KK3N0YXRpYyBjaGFyICpzdWJzdHRleHQgPSBOVUxMOwkvKiBIb2xkcyB0aGUgc3Vic3RpdGlvbiB0ZXh0IHdoaWxlIGdldHRpbmcgYSBkZWZpbmUgKi8KK3N0YXRpYyBpbnQgY2p1bmtfdGFnbGluZTsJLyogV2hlcmUgZGlkIHdlIHN0YXJ0IHN0cmlwcGluZyAoaGVscHMgZXJyb3IgdHJhY2tpbmcpICovCisKKyNpZmRlZiBZWV9VU0VfU1RBQ0sKK3ZvaWQgcHVzaF90byhpbnQgc3RhcnQpCXsgeXlfcHVzaF9zdGF0ZShzdGFydCk7IH0KK3ZvaWQgcG9wX3N0YXJ0KHZvaWQpCXsgeXlfcG9wX3N0YXRlKHN0YXJ0KTsgfQorI2Vsc2UKKyNkZWZpbmUgTUFYU1RBUlRTVEFDSwkzMgorc3RhdGljIGludCBzdGFydHN0YWNrW01BWFNUQVJUU1RBQ0tdOworc3RhdGljIGludCBzdGFydHN0YWNraWR4ID0gMDsKKwordm9pZCBwdXNoX3RvKGludCBzdGFydCkKK3sKKwlpZih5eWRlYnVnKQorCQlwcmludGYoInB1c2hfdG8oJWQpOiAlZCAtPiAlZFxuIiwgbGluZV9udW1iZXIsIFlZX1NUQVJULCBzdGFydCk7CisJaWYoc3RhcnRzdGFja2lkeCA+PSBNQVhTVEFSVFNUQUNLLTEpCisJCWludGVybmFsX2Vycm9yKF9fRklMRV9fLCBfX0xJTkVfXywgIlN0YXJ0IGNvbmRpdGlvbiBzdGFjayBvdmVyZmxvdyIpOworCXN0YXJ0c3RhY2tbc3RhcnRzdGFja2lkeCsrXSA9IFlZX1NUQVJUOworCUJFR0lOKHN0YXJ0KTsKK30KKwordm9pZCBwb3Bfc3RhcnQodm9pZCkKK3sKKwlpZih5eWRlYnVnKQorCQlwcmludGYoInBvcF9zdGFydCglZCk6ICVkIDwtICVkXG4iLCBsaW5lX251bWJlciwgc3RhcnRzdGFja1tzdGFydHN0YWNraWR4LTFdLCBZWV9TVEFSVCk7CisJaWYoc3RhcnRzdGFja2lkeCA8PSAwKQorCQlpbnRlcm5hbF9lcnJvcihfX0ZJTEVfXywgX19MSU5FX18sICJTdGFydCBjb25kaXRpb24gc3RhY2sgdW5kZXJmbG93Iik7CisJLS1zdGFydHN0YWNraWR4OworCUJFR0lOKHN0YXJ0c3RhY2tbc3RhcnRzdGFja2lkeF0pOworfQorI2VuZGlmCisKKworc3RydWN0IGJ1ZmZlcnN0YWNrZW50cnkgeworCVlZX0JVRkZFUl9TVEFURQlidWZmZXJzdGF0ZTsJLyogQnVmZmVyIHRvIHN3aXRjaCBiYWNrIHRvICovCisJc3RydWN0IHBwX2VudHJ5CSpkZWZpbmU7CS8qIFBvaW50cyB0byBleHBhbmRpbmcgZGVmaW5lCisJCQkJCSAgIG9yIE5VTEwgaWYgaGFuZGxpbmcgaW5jbHVkZXMKKwkJCQkJICovCisJaW50IGxpbmVfbnVtYmVyOwkJLyogTGluZSB0aGF0IHdlIHdlcmUgaGFuZGxpbmcgKi8KKwljaGFyICpmaWxlbmFtZTsJCQkvKiBGaWxlbmFtZSB0aGF0IHdlIHdlcmUgaGFuZGxpbmcgKi8KK307CisKKyNkZWZpbmUgTUFYQlVGRkVSU1RBQ0sgMTI4CitzdGF0aWMgc3RydWN0IGJ1ZmZlcnN0YWNrZW50cnkgYnVmZmVyc3RhY2tbTUFYQlVGRkVSU1RBQ0tdOworc3RhdGljIGludCBidWZmZXJzdGFja2lkeCA9IDA7CisKK3ZvaWQgcHVzaF9idWZmZXIoWVlfQlVGRkVSX1NUQVRFIGJ1Ziwgc3RydWN0IHBwX2VudHJ5ICpwcHAsIGNoYXIgKmZpbGVuYW1lKQoreworCWlmKHl5ZGVidWcpCisJCXByaW50ZigicHVzaF9idWZmZXI6ICVwICVwICVwXG4iLCBidWYsIHBwcCwgZmlsZW5hbWUpOworCWlmKGJ1ZmZlcnN0YWNraWR4ID49IE1BWEJVRkZFUlNUQUNLLTEpCisJCWludGVybmFsX2Vycm9yKF9fRklMRV9fLCBfX0xJTkVfXywgIkJ1ZmZlciBzdGFjayBvdmVyZmxvdyIpOworCW1lbXNldCgmYnVmZmVyc3RhY2tbYnVmZmVyc3RhY2tpZHhdLCAwLCBzaXplb2YoYnVmZmVyc3RhY2tbMF0pKTsKKwlidWZmZXJzdGFja1tidWZmZXJzdGFja2lkeF0uYnVmZmVyc3RhdGUgPSBidWY7CisJYnVmZmVyc3RhY2tbYnVmZmVyc3RhY2tpZHhdLmRlZmluZSA9IHBwcDsKKwlpZihwcHApCisJCXBwcC0+ZXhwYW5kaW5nID0gMTsKKwllbHNlIGlmKGZpbGVuYW1lKQorCXsKKwkJLyogVGhlc2Ugd2lsbCB0cmFjayB0aGUgeXllcnJvciB0byB0aGUgY29ycmVjdCBmaWxlIGFuZCBsaW5lICovCisJCWJ1ZmZlcnN0YWNrW2J1ZmZlcnN0YWNraWR4XS5saW5lX251bWJlciA9IGxpbmVfbnVtYmVyOworCQlsaW5lX251bWJlciA9IDE7CisJCWJ1ZmZlcnN0YWNrW2J1ZmZlcnN0YWNraWR4XS5maWxlbmFtZSA9IGlucHV0X25hbWU7CisJCWlucHV0X25hbWUgPSBmaWxlbmFtZTsKKwl9CisJZWxzZQorCQlpbnRlcm5hbF9lcnJvcihfX0ZJTEVfXywgX19MSU5FX18sICJQdXNoaW5nIGJ1ZmZlciB3aXRob3V0IGtub3dpbmcgd2hlcmUgdG8gZ28gdG8iKTsKKwlidWZmZXJzdGFja2lkeCsrOworfQorCitZWV9CVUZGRVJfU1RBVEUgcG9wX2J1ZmZlcih2b2lkKQoreworCWlmKGJ1ZmZlcnN0YWNraWR4IDw9IDApCisJCXJldHVybiAoWVlfQlVGRkVSX1NUQVRFKTA7CisJYnVmZmVyc3RhY2tpZHgtLTsKKwlpZihidWZmZXJzdGFja1tidWZmZXJzdGFja2lkeF0uZGVmaW5lKQorCQlidWZmZXJzdGFja1tidWZmZXJzdGFja2lkeF0uZGVmaW5lLT5leHBhbmRpbmcgPSAwOworCWVsc2UKKwl7CisJCWxpbmVfbnVtYmVyID0gYnVmZmVyc3RhY2tbYnVmZmVyc3RhY2tpZHhdLmxpbmVfbnVtYmVyOworCQlpbnB1dF9uYW1lID0gYnVmZmVyc3RhY2tbYnVmZmVyc3RhY2tpZHhdLmZpbGVuYW1lOworCQlmY2xvc2UoeXlpbik7CisJfQorCWlmKHl5ZGVidWcpCisJCXByaW50ZigicG9wX2J1ZmZlcjogJXAgJXAgKCVkKSAlcFxuIiwKKwkJCWJ1ZmZlcnN0YWNrW2J1ZmZlcnN0YWNraWR4XS5idWZmZXJzdGF0ZSwKKwkJCWJ1ZmZlcnN0YWNrW2J1ZmZlcnN0YWNraWR4XS5kZWZpbmUsCisJCQlidWZmZXJzdGFja1tidWZmZXJzdGFja2lkeF0ubGluZV9udW1iZXIsCisJCQlidWZmZXJzdGFja1tidWZmZXJzdGFja2lkeF0uZmlsZW5hbWUpOworCXl5X3N3aXRjaF90b19idWZmZXIoYnVmZmVyc3RhY2tbYnVmZmVyc3RhY2tpZHhdLmJ1ZmZlcnN0YXRlKTsKKwlyZXR1cm4gYnVmZmVyc3RhY2tbYnVmZmVyc3RhY2tpZHhdLmJ1ZmZlcnN0YXRlOworfQorCit2b2lkIGRvX2luY2x1ZGUoY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pCit7CisJY2hhciAqY3B5ID0gKGNoYXIgKil4bWFsbG9jKG5hbWVsZW4pOworCXN0cmNweShjcHksIG5hbWUrMSk7CS8qIHN0cmlwIGxlYWRpbmcgIiBvciA8ICovCisJY3B5W25hbWVsZW4tMl0gPSAnXDAnOwkvKiBzdHJpcCB0cmFpbGluZyAiIG9yID4gKi8KKwlpZigoeXlpbiA9IG9wZW5faW5jbHVkZShjcHksIG5hbWVbMF0gPT0gJyInKSkgPT0gTlVMTCkKKwkJeXllcnJvcigiVW5hYmxlIHRvIG9wZW4gaW5jbHVkZSBmaWxlICVzIiwgY3B5KTsKKwlwdXNoX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiwgTlVMTCwgY3B5KTsKKwl5eV9zd2l0Y2hfdG9fYnVmZmVyKHl5X2NyZWF0ZV9idWZmZXIoeXlpbiwgWVlfQlVGX1NJWkUpKTsKK30KKworCitzdHJ1Y3Qga2V5d29yZCB7CisJY2hhcgkqa2V5d29yZDsKKwlpbnQJdG9rZW47CisJaW50CWlzZXh0ZW5zaW9uOworCWludAluZWVkY2FzZTsKKwlpbnQJYWx3YXlza2V5d29yZDsKK307CisKK3N0YXRpYyBzdHJ1Y3Qga2V5d29yZCBrZXl3b3Jkc1tdID0geworCXsgIkFDQ0VMRVJBVE9SUyIsIEFDQ0VMRVJBVE9SUywgMCwgMCwgMH0sCisJeyAiQUxUIiwgQUxULCAwLCAwLCAwfSwKKwl7ICJBU0NJSSIsIEFTQ0lJLCAwLCAwLCAwfSwKKwl7ICJBVVRPM1NUQVRFIiwgQVVUTzNTVEFURSwgMSwgMCwgMH0sCisJeyAiQVVUT0NIRUNLQk9YIiwgQVVUT0NIRUNLQk9YLCAxLCAwLCAwfSwKKwl7ICJBVVRPUkFESU9CVVRUT04iLCBBVVRPUkFESU9CVVRUT04sIDEsIDAsIDB9LAorCXsgIkJFR0lOIiwgdEJFR0lOLCAwLCAwLCAxfSwKKwl7ICJCSVRNQVAiLCB0QklUTUFQLCAwLCAwLCAwfSwKKwl7ICJCTE9DSyIsIEJMT0NLLCAwLCAwLCAxfSwKKwl7ICJDQVBUSU9OIiwgQ0FQVElPTiwgMCwgMCwgMH0sCisJeyAiQ0hBUkFDVEVSSVNUSUNTIiwgQ0hBUkFDVEVSSVNUSUNTLCAxLCAwLCAwfSwKKwl7ICJDSEVDS0JPWCIsIENIRUNLQk9YLCAwLCAwLCAwfSwKKwl7ICJDSEVDS0VEIiwgQ0hFQ0tFRCwgMCwgMCwgMH0sCisJeyAiQ0xBU1MiLCBDTEFTUywgMCwgMCwgMH0sCisJeyAiQ09NQk9CT1giLCBDT01CT0JPWCwgMCwgMCwgMH0sCisJeyAiQ09OVFJPTCIsIENPTlRST0wsIDAsIDAsIDB9LAorCXsgIkNURVhUIiwgQ1RFWFQsIDAsIDAsIDB9LAorCXsgIkNVUlNPUiIsIENVUlNPUiwgMCwgMCwgMH0sCisJeyAiZGVmaW5lZCIsIHRERUZJTkVELCAwLCAxLCAxfSwKKwl7ICJERUZQVVNIQlVUVE9OIiwgREVGUFVTSEJVVFRPTiwgMCwgMCwgMX0sCisJeyAiRElBTE9HIiwgRElBTE9HLCAwLCAwLCAwfSwKKwl7ICJESUFMT0dFWCIsIERJQUxPR0VYLCAxLCAwLCAwfSwKKwl7ICJESVNDQVJEQUJMRSIsIERJU0NBUkRBQkxFLCAwLCAwLCAwfSwKKwl7ICJFRElUVEVYVCIsIEVESVRURVhULCAwLCAwLCAwfSwKKwl7ICJFTkQiLCB0RU5ELCAwLCAwLCAxfSwKKwl7ICJFWFNUWUxFIiwgRVhTVFlMRSwgMCwgMCwgMH0sCisJeyAiZXh0ZXJuIiwgdEVYVEVSTiwgMCwgMSwgMX0sCisJeyAiRklMRUZMQUdTIiwgRklMRUZMQUdTLCAwLCAwLCAwfSwKKwl7ICJGSUxFRkxBR1NNQVNLIiwgRklMRUZMQUdTTUFTSywgMCwgMCwgMH0sCisJeyAiRklMRU9TIiwgRklMRU9TLCAwLCAwLCAwfSwKKwl7ICJGSUxFU1VCVFlQRSIsIEZJTEVTVUJUWVBFLCAwLCAwLCAwfSwKKwl7ICJGSUxFVFlQRSIsIEZJTEVUWVBFLCAwLCAwLCAwfSwKKwl7ICJGSUxFVkVSU0lPTiIsIEZJTEVWRVJTSU9OLCAwLCAwLCAwfSwKKwl7ICJGSVhFRCIsIHRGSVhFRCwgMCwgMCwgMH0sCisJeyAiRk9OVCIsIEZPTlQsIDAsIDAsIDB9LAorCXsgIkdSQVlFRCIsIEdSQVlFRCwgMCwgMCwgMH0sCisJeyAiR1JPVVBCT1giLCBHUk9VUEJPWCwgMCwgMCwgMH0sCisJeyAiSEVMUCIsIEhFTFAsIDAsIDAsIDB9LAorCXsgIklDT04iLCBJQ09OLCAwLCAwLCAwfSwKKwl7ICJJTVBVUkUiLCBJTVBVUkUsIDAsIDAsIDB9LAorCXsgIklOQUNUSVZFIiwgSU5BQ1RJVkUsIDAsIDAsIDB9LAorCXsgIkxBTkdVQUdFIiwgTEFOR1VBR0UsIDEsIDAsIDF9LAorCXsgIkxJU1RCT1giLCBMSVNUQk9YLCAwLCAwLCAwfSwKKwl7ICJMT0FET05DQUxMIiwgTE9BRE9OQ0FMTCwgMCwgMCwgMH0sCisJeyAiTFRFWFQiLCBMVEVYVCwgMCwgMCwgMH0sCisJeyAiTUVOVSIsIE1FTlUsIDAsIDAsIDB9LAorCXsgIk1FTlVCQVJCUkVBSyIsIE1FTlVCQVJCUkVBSywgMCwgMCwgMH0sCisJeyAiTUVOVUJSRUFLIiwgTUVOVUJSRUFLLCAwLCAwLCAwfSwKKwl7ICJNRU5VRVgiLCBNRU5VRVgsIDEsIDAsIDB9LAorCXsgIk1FTlVJVEVNIiwgTUVOVUlURU0sIDAsIDAsIDB9LAorCXsgIk1FU1NBR0VUQUJMRSIsIE1FU1NBR0VUQUJMRSwgMSwgMCwgMH0sCisJeyAiTU9WRUFCTEUiLCBNT1ZFQUJMRSwgMCwgMCwgMH0sCisJeyAiTk9JTlZFUlQiLCBOT0lOVkVSVCwgMCwgMCwgMH0sCisJeyAiTk9UIiwgTk9ULCAwLCAwLCAwfSwKKwl7ICJQT1BVUCIsIFBPUFVQLCAwLCAwLCAwfSwKKwl7ICJQUkVMT0FEIiwgUFJFTE9BRCwgMCwgMCwgMH0sCisJeyAiUFJPRFVDVFZFUlNJT04iLCBQUk9EVUNUVkVSU0lPTiwgMCwgMCwgMH0sCisJeyAiUFVSRSIsIHRQVVJFLCAwLCAwLCAwfSwKKwl7ICJQVVNIQlVUVE9OIiwgUFVTSEJVVFRPTiwgMCwgMCwgMH0sCisJeyAiUkFESU9CVVRUT04iLCBSQURJT0JVVFRPTiwgMCwgMCwgMH0sCisJeyAiUkNEQVRBIiwgUkNEQVRBLCAwLCAwLCAwfSwKKwl7ICJSVEVYVCIsIFJURVhULCAwLCAwLCAwfSwKKwl7ICJTQ1JPTExCQVIiLCBTQ1JPTExCQVIsIDAsIDAsIDB9LAorCXsgIlNFUEFSQVRPUiIsIFNFUEFSQVRPUiwgMCwgMCwgMH0sCisJeyAiU0hJRlQiLCBTSElGVCwgMCwgMCwgMH0sCisJeyAiU1RBVEUzIiwgU1RBVEUzLCAxLCAwLCAwfSwKKwl7ICJTVFJJTkciLCB0U1RSSU5HLCAwLCAwLCAwfSwKKwl7ICJTVFJJTkdUQUJMRSIsIFNUUklOR1RBQkxFLCAwLCAwLCAxfSwKKwl7ICJTVFlMRSIsIFNUWUxFLCAwLCAwLCAwfSwKKwl7ICJ0eXBlZGVmIiwgdFRZUEVERUYsIDAsIDEsIDF9LAorCXsgIlZBTFVFIiwgVkFMVUUsIDAsIDAsIDB9LAorCXsgIlZFUlNJT04iLCBWRVJTSU9OLCAxLCAwLCAwfSwKKwl7ICJWRVJTSU9OSU5GTyIsIFZFUlNJT05JTkZPLCAwLCAwLCAwfSwKKwl7ICJWSVJUS0VZIiwgVklSVEtFWSwgMCwgMCwgMH0KK307CisKKyNkZWZpbmUgTktFWVdPUkRTCShzaXplb2Yoa2V5d29yZHMpL3NpemVvZihrZXl3b3Jkc1swXSkpCisjZGVmaW5lIEtXUChwKQkJKChzdHJ1Y3Qga2V5d29yZCAqKShwKSkKK2ludCBrd19jbXBfZnVuYyhjb25zdCB2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIpCit7CisJaW50IHJldDsKKwlyZXQgPSBzdHJpY21wKEtXUChzMSktPmtleXdvcmQsIEtXUChzMiktPmtleXdvcmQpOworCWlmKCFyZXQgJiYgKEtXUChzMSktPm5lZWRjYXNlIHx8IEtXUChzMiktPm5lZWRjYXNlKSkKKwkJcmV0dXJuIHN0cmNtcChLV1AoczEpLT5rZXl3b3JkLCBLV1AoczIpLT5rZXl3b3JkKTsKKwllbHNlCisJCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgS1dfQlNFQVJDSAorI2RlZmluZSBET19TT1JUCitzdHJ1Y3Qga2V5d29yZCAqaXNrZXl3b3JkKGNoYXIgKmt3KQoreworCXN0cnVjdCBrZXl3b3JkICprd3A7CisJc3RydWN0IGtleXdvcmQga2V5OworCWtleS5rZXl3b3JkID0ga3c7CisJa2V5Lm5lZWRjYXNlID0gMDsKKyNpZmRlZiBET19TT1JUCisJeworCQkvKiBNYWtlIHN1cmUgdGhhdCBpdCBpcyBzb3J0ZWQgZm9yIGJzZWFyc2ggKi8KKwkJc3RhdGljIGludCBzb3J0ZWQgPSAwOworCQlpZighc29ydGVkKQorCQl7CisJCQlxc29ydChrZXl3b3JkcywgTktFWVdPUkRTLCBzaXplb2Yoa2V5d29yZHNbMF0pLCBrd19jbXBfZnVuYyk7CisJCQlzb3J0ZWQgPSAxOworCQl9CisJfQorI2VuZGlmCisjaWZkZWYgS1dfQlNFQVJDSAorCWt3cCA9IGJzZWFyY2goJmtleSwga2V5d29yZHMsIE5LRVlXT1JEUywgc2l6ZW9mKGtleXdvcmRzWzBdKSwga3dfY21wX2Z1bmMpOworI2Vsc2UKKwl7CisJCWludCBpOworCQlmb3IoaSA9IDA7IGkgPCBOS0VZV09SRFM7IGkrKykKKwkJeworCQkJaWYoIWt3X2NtcF9mdW5jKCZrZXksICZrZXl3b3Jkc1tpXSkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYoaSA8IE5LRVlXT1JEUykKKwkJCWt3cCA9ICZrZXl3b3Jkc1tpXTsKKwkJZWxzZQorCQkJa3dwID0gTlVMTDsKKwl9CisjZW5kaWYKKworI2lmZGVmIExFWF9ERUJVRworCWlmKGt3cCAmJiAhc3RyY21wKGt3cC0+a2V5d29yZCwgIkxBTkdVQUdFIikpCisJCXByaW50ZigiR290IExhbmd1YWdlXG4iKTsKKyNlbmRpZgorCWlmKGt3cCA9PSBOVUxMIHx8IChrd3AtPmlzZXh0ZW5zaW9uICYmICFleHRlbnNpb25zKSkKKwkJcmV0dXJuIE5VTEw7CisJZWxzZQorCQlyZXR1cm4ga3dwOworfQorCit2b2lkIGFkZF90b19zdWJzdHRleHQoY2hhciAqdGV4dCwgaW50IGxlbikKK3sKKwlpZighc3Vic3R0ZXh0KQorCXsKKwkJc3Vic3R0ZXh0ID0geHN0cmR1cCh0ZXh0KTsKKwl9CisJZWxzZQorCXsKKwkJc3Vic3R0ZXh0ID0gKGNoYXIgKil4cmVhbGxvYyhzdWJzdHRleHQsIHN0cmxlbihzdWJzdHRleHQpK2xlbisxKTsKKwkJc3RyY2F0KHN1YnN0dGV4dCwgdGV4dCk7CisJfQorfQorCislfQorCislJQorCS8qICNpbmNsdWRlIGhhbmRsaW5nICovCitee3dzfSoje3dzfSppbmNsdWRle3dzfSoJcHVzaF90byhwcF9pbmNsKTsKKzxwcF9pbmNsPlw8W15cblw+XStcPgkJZG9faW5jbHVkZSh5eXRleHQsIHl5bGVuZyk7IHBvcF9zdGFydCgpOworPHBwX2luY2w+XCJbXlxuXD5dK1wiCQlkb19pbmNsdWRlKHl5dGV4dCwgeXlsZW5nKTsgcG9wX3N0YXJ0KCk7Cis8cHBfaW5jbD4uCQl5eWVycm9yKCJNYWxmb3JtZWQgI2luY2x1ZGUiKTsKKworCS8qICNkZWZpbmUgaGFuZGxpbmcgKi8KK157d3N9KiN7d3N9KmRlZmluZXt3c30qCXB1c2hfdG8ocHBfZGVmKTsKKzxwcF9kZWY+e2NpZGVudH0JeworCQkJCXNldF9kZWZpbmUoeXl0ZXh0KTsKKwkJCQlwdXNoX3RvKHBwX2RlZl9zKTsKKwkJCX0KKzxwcF9kZWY+e2NpZGVudH1cKAlwdXNoX3RvKHBwX2lnbm9yZSk7IC8qIElnbm9yZSBmdW5jdGlvbi1saWtlIGRlZmluZXMgZm9yIG5vdyovCis8cHBfZGVmPi4JCXl5ZXJyb3IoIk1hbGZvcm1lZCAjZGVmaW5lIik7CisKKzxwcF9pZ25vcmUscHBfZGVmX3M+W15cL1xcXG5dKgl7CisJCQlpZihZWV9TVEFSVCA9PSBwcF9kZWZfcykKKwkJCQlhZGRfdG9fc3Vic3R0ZXh0KHl5dGV4dCwgeXlsZW5nKTsKKwkJfQorPHBwX2lnbm9yZSxwcF9kZWZfcz5cL1teXC9cKl1bXlwvXFxcbl0qCXsgLyogQ29tbWVudCBpcyBoYW5kbGVkIGluIG5vcm1hbCBoYW5kbGluZyAqLworCQkJaWYoWVlfU1RBUlQgPT0gcHBfZGVmX3MpCisJCQkJYWRkX3RvX3N1YnN0dGV4dCh5eXRleHQsIHl5bGVuZyk7CisJCX0KKzxwcF9pZ25vcmUscHBfZGVmX3M+XFx7d3N9KlxuCWxpbmVfbnVtYmVyKys7CS8qIExpbmUgY29udGludWF0aW9uICovCis8cHBfaWdub3JlLHBwX2RlZl9zPlxuCQl7CisJCQlpZihZWV9TVEFSVCA9PSBwcF9kZWZfcykKKwkJCXsKKwkJCQlhZGRfZGVmaW5lKHN1YnN0dGV4dCA/IHN1YnN0dGV4dCA6ICIiKTsKKwkJCQlmcmVlKHN1YnN0dGV4dCk7CisJCQkJc3Vic3R0ZXh0ID0gTlVMTDsKKwkJCX0KKwkJCWxpbmVfbnVtYmVyKys7CisJCQlwb3Bfc3RhcnQoKTsKKwkJCXBvcF9zdGFydCgpOworCQl9CisKKwkvKiAjdW5kZWYgaGFuZGxpbmcgKi8KK157d3N9KiN7d3N9KnVuZGVme3dzfSoJcHVzaF90byhwcF91bmRlZik7Cis8cHBfdW5kZWY+e2NpZGVudH0JeworCQkJCWRlbF9kZWZpbmUoeXl0ZXh0KTsKKwkJCQlwb3Bfc3RhcnQoKTsKKwkJCQkvKnB1c2hfdG8ocHBfaWdub3JlKTsqLworCQkJfQorCisJLyogQ29uZGl0aW9uYWwgaGFuZGxpbmcgKi8KKzxJTklUSUFMLHBwX3N0cmlwcyxwcF9zdHJpcHAscHBfZmFsc2U+Xnt3c30qI3t3c30qaWZ7d3N9Kgl7CisJCQlpZihZWV9TVEFSVCA9PSBwcF9mYWxzZSkKKwkJCXsKKwkJCQlpZih5eWRlYnVnKQorCQkJCQlwcmludGYoIiglZCkjaWYgaWdub3JlZFxuIiwgbGluZV9udW1iZXIpOworCQkJCXB1c2hfaWYoMCwgMCwgMSk7CisJCQkJcHVzaF90byhwcF9pZ25vcmVfZW9sKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwdXNoX3RvKElOSVRJQUwpOworCQkJCXdhbnRfbmwgPSAxOworCQkJCXJldHVybiB0SUY7CisJCQl9CisJCX0KKzxJTklUSUFMLHBwX3N0cmlwcyxwcF9zdHJpcHAscHBfZmFsc2U+Xnt3c30qI3t3c30qaWZkZWZ7d3N9Kgl7CisJCQlpZihZWV9TVEFSVCA9PSBwcF9mYWxzZSkKKwkJCXsKKwkJCQlpZih5eWRlYnVnKQorCQkJCQlwcmludGYoIiglZCkjaWZkZWYgaWdub3JlZFxuIiwgbGluZV9udW1iZXIpOworCQkJCXB1c2hfaWYoMCwgMCwgMSk7CisJCQkJcHVzaF90byhwcF9pZ25vcmVfZW9sKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwdXNoX3RvKElOSVRJQUwpOworCQkJCXdhbnRfbmwgPSAxOworCQkJCXdhbnRfaWRlbnQgPSAxOworCQkJCXJldHVybiB0SUZERUY7CisJCQl9CisJCX0KKzxJTklUSUFMLHBwX3N0cmlwcyxwcF9zdHJpcHAscHBfZmFsc2U+Xnt3c30qI3t3c30qaWZuZGVme3dzfSoJeworCQkJaWYoWVlfU1RBUlQgPT0gcHBfZmFsc2UpCisJCQl7CisJCQkJaWYoeXlkZWJ1ZykKKwkJCQkJcHJpbnRmKCIoJWQpI2lmbmRlZiBpZ25vcmVkXG4iLCBsaW5lX251bWJlcik7CisJCQkJcHVzaF9pZigwLCAwLCAxKTsKKwkJCQlwdXNoX3RvKHBwX2lnbm9yZV9lb2wpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXB1c2hfdG8oSU5JVElBTCk7CisJCQkJd2FudF9ubCA9IDE7CisJCQkJd2FudF9pZGVudCA9IDE7CisJCQkJcmV0dXJuIHRJRk5ERUY7CisJCQl9CisJCX0KKzxJTklUSUFMLHBwX3N0cmlwcyxwcF9zdHJpcHAscHBfZmFsc2U+Xnt3c30qI3t3c30qZWxpZnt3c30qCXsKKwkJCWlmKCFpc25ldmVydHJ1ZV9pZigpKQorCQkJeworCQkJCXB1c2hfdG8oSU5JVElBTCk7CisJCQkJd2FudF9ubCA9IDE7CisJCQkJcmV0dXJuIHRFTElGOworCQkJfQorCQkJZWxzZSBpZihZWV9TVEFSVCA9PSBwcF9mYWxzZSkKKwkJCQlwdXNoX3RvKHBwX2lnbm9yZV9lb2wpOworCQkJaWYoeXlkZWJ1ZykKKwkJCQlwcmludGYoIiglZCkjZWxpZiBpZ25vcmVkXG4iLCBsaW5lX251bWJlcik7CisJCX0KKzxJTklUSUFMLHBwX3N0cmlwcyxwcF9zdHJpcHAscHBfZmFsc2U+Xnt3c30qI3t3c30qZWxzZXt3c30qCXsKKwkJCWlmKCFpc25ldmVydHJ1ZV9pZigpKQorCQkJeworCQkJCXB1c2hfdG8oSU5JVElBTCk7CisJCQkJd2FudF9ubCA9IDE7CisJCQkJcmV0dXJuIHRFTFNFOworCQkJfQorCQkJaWYoeXlkZWJ1ZykKKwkJCQlwcmludGYoIiglZCkjZWxzZSBpZ25vcmVkXG4iLCBsaW5lX251bWJlcik7CisJCX0KKzxJTklUSUFMLHBwX3N0cmlwcyxwcF9zdHJpcHAscHBfZmFsc2U+Xnt3c30qI3t3c30qZW5kaWZ7d3N9Kgl7CisJCQlpZighaXNuZXZlcnRydWVfaWYoKSkKKwkJCXsKKwkJCQl3YW50X25sID0gMTsKKwkJCQlyZXR1cm4gdEVORElGOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmKHl5ZGVidWcpCisJCQkJCXByaW50ZigiKCVkKSNlbmRpZiBpZ25vcmVkXG4iLCBsaW5lX251bWJlcik7CisJCQkJcG9wX2lmKCk7CisJCQl9CisJCX0KKworCS8qIFRoZSBlcnJvciBkaXJlY3RpdmUgKi8KK157d3N9KiN7d3N9KmVycm9ye3dzfSoJcHVzaF90byhwcF9lcnJvcik7Cis8cHBfZXJyb3I+W15cbl0qCXl5ZXJyb3IoIkVycm9yIGRpcmVjdGl2ZTogJXMiLCB5eXRleHQpOworCisJLyogcHJlcHJvY2Vzc29yIGp1bmsgKi8KK157d3N9KiN7d3N9KnByYWdtYVteXG5dKgk7CS8qIElnbm9yZSAjcHJhZ21hICovCitee3dzfSoje3dzfSpsaW5lW15cbl0qCQk7CS8qIElnbm9yZSAjbGluZSAqLworIC8qIFdlJ2xsIGdldCBhbiBlcnJvciBvbiBtYWxmb3JtZWQgI3h4eCBzdGF0ZW1lbnRzCisgICogYnkgbm90IHJlY29nbmlzaW5nICcjJyBhdCBhbGwuIFRoaXMgaGVscHMgdHJhY2tpbmcKKyAgKiBwcmVwcm9jZXNzb3IgZXJyb3JzLgorICAqLworIC8qXnt3c30qI3t3c30qCQkJOwkgSWdub3JlICMgKi8KKworPHBwX3N0cmlwcz5cewkJc3RyaXBzbGV2ZWwrKzsKKzxwcF9zdHJpcHM+XH0JCXN0cmlwc2xldmVsLS07Cis8cHBfc3RyaXBzPjsJCWlmKCFzdHJpcHNsZXZlbCkgcG9wX3N0YXJ0KCk7Cis8cHBfc3RyaXBzPlteXHtcfTtcbiNdKgk7IC8qIElnbm9yZSByZXN0ICovCisKKzxwcF9zdHJpcHA+XCgJCXN0cmlwcGxldmVsKys7Cis8cHBfc3RyaXBwPlwpCQl7CisJCQkJc3RyaXBwbGV2ZWwtLTsKKwkJCQlpZighc3RyaXBwbGV2ZWwpCisJCQkJeworCQkJCQlwb3Bfc3RhcnQoKTsKKwkJCQkJcHVzaF90byhwcF9zdHJpcHBfZmluYWwpOworCQkJCX0KKwkJCX0KKzxwcF9zdHJpcHA+W15cKFwpO1xuI10qCTsgLyogSWdub3JlIHJlc3QgKi8KKworPHBwX3N0cmlwcF9maW5hbD57d3N9Kgk7IC8qIElnbm9yZSAqLworPHBwX3N0cmlwcF9maW5hbD47CXBvcF9zdGFydCgpOyAvKiBLaWxsIHRoZSBzZW1pY29sb24gKi8KKzxwcF9zdHJpcHBfZmluYWw+XG4JbGluZV9udW1iZXIrKzsgcG9wX3N0YXJ0KCk7Cis8cHBfc3RyaXBwX2ZpbmFsPi4JeXlsZXNzKDApOyBwb3Bfc3RhcnQoKTsKKworPHBwX2ZhbHNlPi4JCTsJLyogSWdub3JlIGV2ZXJ5dGhpbmcgZXhjZXB0ICN4eHggZHVyaW5nIGZhbHNlICNpZiBzdGF0ZSAqLworCis8cHBfaWdub3JlX2VvbD5bXlxuXSoJcG9wX3N0YXJ0KCk7CisKKyAvKiBUaGVzZSBhcmUgc3BlY2lhbCBjYXNlcyBkdWUgdG8gZmlsZW5hbWUgc2Nhbm5pbmcgKi8KKzx5eXdmPltEZF1bSWldW1NzXVtDY11bQWFdW1JyXVtEZF1bQWFdW0JiXVtMbF1bRWVdCXJldHVybiBESVNDQVJEQUJMRTsKKzx5eXdmPltGZl1bSWldW1h4XVtFZV1bRGRdCQkJCXJldHVybiB0RklYRUQ7Cis8eXl3Zj5bSWldW01tXVtQcF1bVXVdW1JyXVtFZV0JCQkJcmV0dXJuIElNUFVSRTsKKzx5eXdmPltNbV1bT29dW1Z2XVtFZV1bQWFdW0JiXVtMbF1bRWVdCQkJcmV0dXJuIE1PVkVBQkxFOworPHl5d2Y+W0xsXVtPb11bQWFdW0RkXVtPb11bTm5dW0NjXVtBYV1bTGxdW0xsXQkJcmV0dXJuIExPQURPTkNBTEw7Cis8eXl3Zj5bUHBdW1JyXVtFZV1bTGxdW09vXVtBYV1bRGRdCQkJcmV0dXJuIFBSRUxPQUQ7Cis8eXl3Zj5bUHBdW1V1XVtScl1bRWVdCQkJCQlyZXR1cm4gdFBVUkU7CisKK1x7CQkJcmV0dXJuIHRCRUdJTjsKK1x9CQkJcmV0dXJuIHRFTkQ7CisKK1swLTldK1tsTF0/CQl7IHl5bHZhbC5udW0gPSBhdG9pKHl5dGV4dCk7IHJldHVybiBOVU1CRVI7IH0KKzBbeFhdWzAtOUEtRmEtZl0rW2xMXT8JeyB5eWx2YWwubnVtID0gc3RydG91bCh5eXRleHQsMCwxNik7IHJldHVybiBOVU1CRVI7IH0KKzBbb09dWzAtN10rCQl7IHl5bHZhbC5udW0gPSBzdHJ0b3VsKHl5dGV4dCsyLDAsOCk7IHJldHVybiBOVU1CRVI7IH0KK1tBLVphLXpfMC05XSsJCXsKKwkJCQlzdHJ1Y3Qga2V5d29yZCAqdG9rZW47CisJCQkJc3RydWN0IHBwX2VudHJ5ICpwcHA7CisKKwkJCQl3YW50X3JzY25hbWUgPSAwOworCQkJCQorCQkJCWlmKHdhbnRfaWRlbnQpCisJCQkJeworCQkJCQkvKiBQcmV2ZW50IHByZXByb2Nlc3NvciBzdWJzdCAqLworCQkJCQl3YW50X2lkZW50ID0gMDsKKwkJCQkJeXlsdmFsLnN0ciA9IG1ha2Vfc3RyaW5nKHl5dGV4dCk7CisJCQkJI2lmZGVmIExFWF9ERUJVRworCQkJCQlwcmludGYoIndhbnQgSURFTlQgKCVzLCAlZCk6IDwlcz5cbiIsIGlucHV0X25hbWUsIGxpbmVfbnVtYmVyLCB5eXRleHQpOworCQkJCSNlbmRpZgorCQkJCQlyZXR1cm4gSURFTlQ7CisJCQkJfQorCQkJCWVsc2UgaWYoKHBwcCA9IHBwX2xvb2t1cCh5eXRleHQpKSAhPSBOVUxMKQorCQkJCXsKKwkJCQkJLyogRG8gcHJlcHJvY2Vzc29yIHN1YnN0aXR1dGlvbiwKKwkJCQkJICogYnV0IGV4cGFuZCBvbmx5IGlmIG1hY3JvIGlzIG5vdAorCQkJCQkgKiBhbHJlYWR5IGV4cGFuZGluZy4KKwkJCQkJICovCisJCQkJCWlmKCFwcHAtPmV4cGFuZGluZykKKwkJCQkJeworCQkJCSNpZmRlZiBMRVhfREVCVUcKKwkJCQkJCXByaW50ZigiZXhwYW5kIElERU5UICglcywgJWQpOiA8JXM+XG4iLCBpbnB1dF9uYW1lLCBsaW5lX251bWJlciwgeXl0ZXh0KTsKKwkJCQkjZW5kaWYKKwkJCQkJCXB1c2hfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSLCBwcHAsIE5VTEwpOworCQkJCQkJeXlfc2Nhbl9zdHJpbmcocHBwLT5zdWJzdCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZigodG9rZW4gPSBpc2tleXdvcmQoeXl0ZXh0KSkgIT0gTlVMTAorCQkJCSAgJiYgISghdG9rZW4tPmFsd2F5c2tleXdvcmQgJiYgd2FudF9yc2NuYW1lKSkKKwkJCQl7CisJCQkJCXN3aXRjaCh0b2tlbi0+dG9rZW4pCisJCQkJCXsKKwkJCQkJY2FzZSB0REVGSU5FRDoKKwkJCQkJCXdhbnRfaWRlbnQgPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCS8qY2FzZSBSQ0RBVEE6Ki8KKwkJCQkJY2FzZSBDVVJTT1I6CisJCQkJCWNhc2UgdEJJVE1BUDoKKwkJCQkJY2FzZSBNRVNTQUdFVEFCTEU6CisJCQkJCQlwdXNoX3RvKHl5d2YpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgRk9OVDoKKwkJCQkJY2FzZSBJQ09OOgorCQkJCQkJaWYoIWluZGlhbG9nKQorCQkJCQkJCXB1c2hfdG8oeXl3Zik7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBESUFMT0c6CisJCQkJCWNhc2UgRElBTE9HRVg6CisJCQkJCQlpbmRpYWxvZyA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlyZXR1cm4gdG9rZW4tPnRva2VuOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl5eWx2YWwuc3RyID0gbWFrZV9zdHJpbmcoeXl0ZXh0KTsKKwkJCQkjaWZkZWYgTEVYX0RFQlVHCisJCQkJCXByaW50ZigiJXMgSURFTlQgKCVzLCAlZCk6IDwlcz5cbiIsCisJCQkJCQl3YW50X3JzY25hbWUgPyAicnNjbmFtZSIgOiAianVzdCIsCisJCQkJCQlpbnB1dF9uYW1lLAorCQkJCQkJbGluZV9udW1iZXIsCisJCQkJCQl5eXRleHQpOworCQkJCSNlbmRpZgorCQkJCQlyZXR1cm4gSURFTlQ7CisJCQkJfQorCQkJfQorXHxcfAkJCXJldHVybiBMT0dPUjsKK1wmXCYJCQlyZXR1cm4gTE9HQU5EOworXD1cPQkJCXJldHVybiBFUTsKK1whXD0JCQlyZXR1cm4gTkU7CitcPFw9CQkJcmV0dXJuIExURTsKK1w+XD0JCQlyZXR1cm4gR1RFOworCis8eXl3Zj5bXiBcZlx0XHJcbl0qCXsgcG9wX3N0YXJ0KCk7IHl5bHZhbC5zdHIgPSBtYWtlX3N0cmluZyh5eXRleHQpOyByZXR1cm4gRklMRU5BTUU7IH0KKzx5eXdmPlwiW15cIl0qXCIJeyBwb3Bfc3RhcnQoKTsgeXlsdmFsLnN0ciA9IG1ha2Vfc3RyaW5nKHl5dGV4dCk7IHJldHVybiBGSUxFTkFNRTsgfQorCitMXCIJCQl7CisJCQkJcHVzaF90byh5eWxzdHIpOworCQkJCXdidWZpZHggPSAwOworCQkJCWlmKCF3aW4zMikKKwkJCQkJeXl3YXJuaW5nKCIxNmJpdCByZXNvdXJjZSBjb250YWlucyB1bmljb2RlIHN0cmluZ3NcbiIpOworCQkJfQorPHl5bHN0cj5cIgkJeworCQkJCXBvcF9zdGFydCgpOworCQkJCXl5bHZhbC5zdHIgPSBnZXRfYnVmZmVyZWRfd3N0cmluZygpOworCQkJCXJldHVybiB0U1RSSU5HOworCQkJfQorPHl5bHN0cj5cbgkJeXllcnJvcigiVW50ZXJtaW5hdGVkIHN0cmluZyIpOworPHl5bHN0cj5cXFswLTddezEsNn0JeyAvKiBvY3RhbCBlc2NhcGUgc2VxdWVuY2UgKi8KKwkJCQlpbnQgcmVzdWx0OworCQkJCXJlc3VsdCA9IHN0cnRvbCh5eXRleHQrMSwgMCwgOCk7CisJCQkJaWYgKCByZXN1bHQgPiAweGZmZmYgKQorCQkJCQl5eWVycm9yKCJDaGFyYWN0ZXIgY29uc3RhbnQgb3V0IG9mIHJhbmdlIik7CisJCQkJYWRkd2NoYXIoKHNob3J0KXJlc3VsdCk7CisJCQl9Cis8eXlsc3RyPlxceFswLTlhLWZBLUZdezR9IHsgIC8qIGhleCBlc2NhcGUgc2VxdWVuY2UgKi8KKwkJCQlpbnQgcmVzdWx0OworCQkJCXJlc3VsdCA9IHN0cnRvbCh5eXRleHQrMiwgMCwgMTYpOworCQkJCWFkZHdjaGFyKChzaG9ydClyZXN1bHQpOworCQkJfQorPHl5bHN0cj5cXFswLTldKwl5eWVycm9yKCJCYWQgZXNjYXBlIHNlY3VlbmNlIik7Cis8eXlsc3RyPlxcYQkJYWRkd2NoYXIoJ1xhJyk7Cis8eXlsc3RyPlxcYgkJYWRkd2NoYXIoJ1xiJyk7Cis8eXlsc3RyPlxcZgkJYWRkd2NoYXIoJ1xmJyk7Cis8eXlsc3RyPlxcbgkJYWRkd2NoYXIoJ1xuJyk7Cis8eXlsc3RyPlxccgkJYWRkd2NoYXIoJ1xyJyk7Cis8eXlsc3RyPlxcdAkJYWRkd2NoYXIoJ1x0Jyk7Cis8eXlsc3RyPlxcdgkJYWRkd2NoYXIoJ1x2Jyk7Cis8eXlsc3RyPlxcKC58XG4pCWFkZHdjaGFyKHl5dGV4dFsxXSk7Cis8eXlsc3RyPlteXFxcblwiXSsJeworCQkJCWNoYXIgKnlwdHIgPSB5eXRleHQ7CisJCQkJd2hpbGUoKnlwdHIpCS8qIEZJWE1FOiBjb2RlcGFnZSB0cmFuc2xhdGlvbiAqLworCQkJCQlhZGR3Y2hhcigqeXB0cisrICYgMHhmZik7CisJCQl9CisKK1wiCQkJeworCQkJCXB1c2hfdG8oeXlzdHIpOworCQkJCWNidWZpZHggPSAwOworCQkJfQorPHl5c3RyPlwiCQl7CisJCQkJcG9wX3N0YXJ0KCk7CisJCQkJeXlsdmFsLnN0ciA9IGdldF9idWZmZXJlZF9jc3RyaW5nKCk7CisJCQkJcmV0dXJuIHRTVFJJTkc7CisJCQl9Cis8eXlzdHI+XG4JCXl5ZXJyb3IoIlVudGVybWluYXRlZCBzdHJpbmciKTsKKzx5eXN0cj5cXFswLTddezEsM30JeyAvKiBvY3RhbCBlc2NhcGUgc2VxdWVuY2UgKi8KKwkJCQlpbnQgcmVzdWx0OworCQkJCXJlc3VsdCA9IHN0cnRvbCh5eXRleHQrMSwgMCwgOCk7CisJCQkJaWYgKCByZXN1bHQgPiAweGZmICkKKwkJCQkJeXllcnJvcigiQ2hhcmFjdGVyIGNvbnN0YW50IG91dCBvZiByYW5nZSIpOworCQkJCWFkZGNjaGFyKChjaGFyKXJlc3VsdCk7CisJCQl9Cis8eXlzdHI+XFx4WzAtOWEtZkEtRl17Mn0geyAgLyogaGV4IGVzY2FwZSBzZXF1ZW5jZSAqLworCQkJCWludCByZXN1bHQ7CisJCQkJcmVzdWx0ID0gc3RydG9sKHl5dGV4dCsyLCAwLCAxNik7CisJCQkJYWRkY2NoYXIoKGNoYXIpcmVzdWx0KTsKKwkJCX0KKzx5eXN0cj5cXFswLTldKwkJeXllcnJvcigiQmFkIGVzY2FwZSBzZWN1ZW5jZSIpOworPHl5c3RyPlxcYQkJYWRkY2NoYXIoJ1xhJyk7Cis8eXlzdHI+XFxiCQlhZGRjY2hhcignXGInKTsKKzx5eXN0cj5cXGYJCWFkZGNjaGFyKCdcZicpOworPHl5c3RyPlxcbgkJYWRkY2NoYXIoJ1xuJyk7Cis8eXlzdHI+XFxyCQlhZGRjY2hhcignXHInKTsKKzx5eXN0cj5cXHQJCWFkZGNjaGFyKCdcdCcpOworPHl5c3RyPlxcdgkJYWRkY2NoYXIoJ1x2Jyk7Cis8eXlzdHI+XFwoLnxcbikJCWFkZGNjaGFyKHl5dGV4dFsxXSk7Cis8eXlzdHI+W15cXFxuXCJdKwl7CisJCQkJY2hhciAqeXB0ciA9IHl5dGV4dDsKKwkJCQl3aGlsZSgqeXB0cikKKwkJCQkJYWRkY2NoYXIoKnlwdHIrKyk7CisJCQl9CisKKworCitcJwkJCXsKKwkJCQlwdXNoX3RvKHl5cmNkKTsKKwkJCQljYnVmaWR4ID0gMDsKKwkJCX0KKzx5eXJjZD5cJwkJeworCQkJCXBvcF9zdGFydCgpOworCQkJCXl5bHZhbC5yYXcgPSBuZXdfcmF3X2RhdGEoKTsKKwkJCQl5eWx2YWwucmF3LT5zaXplID0gY2J1ZmlkeDsKKwkJCQl5eWx2YWwucmF3LT5kYXRhID0geG1hbGxvYyh5eWx2YWwucmF3LT5zaXplKTsKKwkJCQltZW1jcHkoeXlsdmFsLnJhdy0+ZGF0YSwgY2J1ZmZlciwgeXlsdmFsLnJhdy0+c2l6ZSk7CisJCQkJcmV0dXJuIFJBV0RBVEE7CisJCQl9Cis8eXlyY2Q+WzAtOWEtZkEtRl17Mn0JeworCQkJCWludCByZXN1bHQ7CisJCQkJcmVzdWx0ID0gc3RydG9sKHl5dGV4dCwgMCwgMTYpOworCQkJCWFkZGNjaGFyKChjaGFyKXJlc3VsdCk7CisJCQl9Cis8eXlyY2Q+e3dzfSsJCTsJLyogSWdub3JlIHNwYWNlICovCis8eXlyY2Q+LgkJeXllcnJvcigiTWFsZm9ybWVkIGRhdGEtbGluZSIpOworCis8SU5JVElBTCxwcF9pZ25vcmUscHBfZGVmX3M+Ii8qIglwdXNoX3RvKGNvbW1lbnQpOwkvKiBFYXQgY29tbWVudCAqLworPGNvbW1lbnQ+W14qXG5dKgk7Cis8Y29tbWVudD4iKiIrW14qL1xuXSoJOworPGNvbW1lbnQ+XG4JCWxpbmVfbnVtYmVyKys7Cis8Y29tbWVudD4iKiIrIi8iCXBvcF9zdGFydCgpOworCis7W15cbl0qCQkJOyAvKiBFYXQgY29tbWVudCAqLworPElOSVRJQUwscHBfaWdub3JlLHBwX2RlZl9zPiIvLyJbXlxuXSoJCTsgLyogRWF0IGNvbW1lbnQgKi8KKworPElOSVRJQUwseXl3ZixwcF9mYWxzZSxwcF9zdHJpcHMscHBfc3RyaXBwPlxuCXsKKwkJCQlpZihZWV9TVEFSVCA9PSB5eXdmKQorCQkJCQlwb3Bfc3RhcnQoKTsKKwkJCQlsaW5lX251bWJlcisrOworCQkJCWlmKHdhbnRfbmwpCisJCQkJeworCQkJCQl3YW50X25sID0gMDsKKwkJCQkJcmV0dXJuIHROTDsKKwkJCQl9CisJCQl9Cis8SU5JVElBTCx5eXdmPnt3c30rCTsJLyogRWF0IHdoaXRlc3BhY2UgKi8KKworPElOSVRJQUw+LgkJcmV0dXJuIHl5dGV4dFswXTsKKzw8RU9GPj4JCQl7CisJCQkJWVlfQlVGRkVSX1NUQVRFIGIgPSBZWV9DVVJSRU5UX0JVRkZFUjsKKwkJCQlpZighcG9wX2J1ZmZlcigpKQorCQkJCQlpZihZWV9TVEFSVCA9PSBwcF9zdHJpcHMgfHwgWVlfU1RBUlQgPT0gcHBfc3RyaXBwIHx8IFlZX1NUQVJUID09IHBwX3N0cmlwcF9maW5hbCkKKwkJCQkJCXl5ZXJyb3IoIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgZHVyaW5nIGMtanVuayBzY2FubmluZyAoc3RhcnRlZCBhdCAlZCkiLCBjanVua190YWdsaW5lKTsKKwkJCQkJZWxzZQorCQkJCQkJeXl0ZXJtaW5hdGUoKTsKKwkJCQl5eV9kZWxldGVfYnVmZmVyKGIpOworCQkJfQorJSUKKworI2lmbmRlZiB5eXdyYXAKK2ludCB5eXdyYXAodm9pZCkKK3sKKy8vCWlmKGJ1ZmZlcnN0YWNraWR4ID4gMCkKKy8vCXsKKy8vCQlyZXR1cm4gMDsKKy8vCX0KKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCisvKiBUaGVzZSBkdXAgZnVuY3Rpb25zIGNvcHkgdGhlIGVuY2xvc2VkICdcMCcgZnJvbQorICogdGhlIHJlc291cmNlIHN0cmluZy4KKyAqLwordm9pZCBhZGRjY2hhcihjaGFyIGMpCit7CisJaWYoY2J1ZmlkeCA+PSBzaXplb2YoY2J1ZmZlcikpCisJCWludGVybmFsX2Vycm9yKF9fRklMRV9fLCBfX0xJTkVfXywgIkNoYXJhY3RlciBidWZmZXIgb3ZlcmZsb3ciKTsKKwljYnVmZmVyW2NidWZpZHgrK10gPSBjOworfQorCit2b2lkIGFkZHdjaGFyKHNob3J0IHMpCit7CisJaWYod2J1ZmlkeCA+PSBzaXplb2Yod2J1ZmZlcikpCisJCWludGVybmFsX2Vycm9yKF9fRklMRV9fLCBfX0xJTkVfXywgIldpZGUgY2hhcmFjdGVyIGJ1ZmZlciBvdmVyZmxvdyIpOworCXdidWZmZXJbd2J1ZmlkeCsrXSA9IChzaG9ydCkocyAmIDB4ZmYpOworfQorCitzdHJpbmdfdCAqZ2V0X2J1ZmZlcmVkX2NzdHJpbmcodm9pZCkKK3sKKwlzdHJpbmdfdCAqc3RyID0gbmV3X3N0cmluZygpOworCXN0ci0+c2l6ZSA9IGNidWZpZHg7CisJc3RyLT50eXBlID0gc3RyX2NoYXI7CisJc3RyLT5zdHIuY3N0ciA9IChjaGFyICopeG1hbGxvYyhjYnVmaWR4KzEpOworCW1lbWNweShzdHItPnN0ci5jc3RyLCBjYnVmZmVyLCBjYnVmaWR4KTsKKwlzdHItPnN0ci5jc3RyW2NidWZpZHhdID0gJ1wwJzsKKy8qCXByaW50ZigiZ290IGNzdHJpbmcgXCIlc1wiXG4iLCBzdHItPnN0ci5jc3RyKTsgKi8KKwlyZXR1cm4gc3RyOworfQorCitzdHJpbmdfdCAqZ2V0X2J1ZmZlcmVkX3dzdHJpbmcodm9pZCkKK3sKKwlzdHJpbmdfdCAqc3RyID0gbmV3X3N0cmluZygpOworCXN0ci0+c2l6ZSA9IHdidWZpZHg7CisJc3RyLT50eXBlID0gc3RyX3VuaWNvZGU7CisJc3RyLT5zdHIud3N0ciA9IChzaG9ydCAqKXhtYWxsb2MoMiood2J1ZmlkeCsxKSk7CisJbWVtY3B5KHN0ci0+c3RyLndzdHIsIHdidWZmZXIsIHdidWZpZHgpOworCXN0ci0+c3RyLndzdHJbd2J1ZmlkeF0gPSAwOworCXJldHVybiBzdHI7Cit9CisKK3N0cmluZ190ICptYWtlX3N0cmluZyhjaGFyICpzKQoreworCXN0cmluZ190ICpzdHIgPSBuZXdfc3RyaW5nKCk7CisJc3RyLT5zaXplID0gc3RybGVuKHMpOworCXN0ci0+dHlwZSA9IHN0cl9jaGFyOworCXN0ci0+c3RyLmNzdHIgPSAoY2hhciAqKXhtYWxsb2Moc3RyLT5zaXplKzEpOworCW1lbWNweShzdHItPnN0ci5jc3RyLCBzLCBzdHItPnNpemUrMSk7CisJcmV0dXJuIHN0cjsKK30KKworLyogQ2FsbGVkIGZyb20gdGhlIHBhcnNlciB0byBzaWduYWwgZmlsZW5hbWUgcmVxdWVzdCAqLwordm9pZCBzZXRfeXl3Zih2b2lkKQoreworCXB1c2hfdG8oeXl3Zik7Cit9CisKKy8qIENhbGxlZCBmcm9tIHRoZSBwYXJzZXIgdG8gc2lnbmFsIHByZXByb2Nlc3NvciBpZiBjYXNlICovCit2b2lkIHNldF9wcF9pZ25vcmUoaW50IHN0YXRlKQoreworCWlmKHN0YXRlKQorCQlwdXNoX3RvKHBwX2ZhbHNlKTsKKwllbHNlCisJCXBvcF9zdGFydCgpOworfQorCisvKiBDYWxsZWQgZnJvbSB0aGUgcGFyc2VyIHRvIGtpbGwgYy1qdW5rICovCit2b2lkIHN0cmlwX3RpbF9zZW1pY29sb24odm9pZCkKK3sKKwljanVua190YWdsaW5lID0gbGluZV9udW1iZXI7CisJcHVzaF90byhwcF9zdHJpcHMpOworfQorCit2b2lkIHN0cmlwX3RpbF9wYXJlbnRoZXNpcyh2b2lkKQoreworCWNqdW5rX3RhZ2xpbmUgPSBsaW5lX251bWJlcjsKKwlzdHJpcHBsZXZlbCA9IDE7CS8qIE9uZSBzY2FubmVkIGFscmVhZHkgKi8KKwlwdXNoX3RvKHBwX3N0cmlwcCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvdG9vbHMvd3JjL3BhcnNlci55IGIvdG9vbHMvd3JjL3BhcnNlci55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxODZkYTkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy93cmMvcGFyc2VyLnkKQEAgLTAsMCArMSwyMjY0IEBACisleworLyoKKyAqIENvcHlyaWdodCAgTWFydGluIHZvbiBMb2V3aXMsIDE5OTQKKyAqIENvcHlyaWdodCAxOTk4IEJlcnRobyBBLiBTdHVsdGllbnMgKEJTKQorICoKKyAqIDI1LU1heS0xOTk4IEJTCS0gRm91bmQgb3V0IHRoYXQgSSBuZWVkIHRvIHN1cHBvcnQgbGFuZ3VhZ2UsIHZlcnNpb24KKyAqCQkJICBhbmQgY2hhcmFjdGVyaXN0aWNzIGluIGlubGluZSByZXNvdXJjZXMgKGJpdG1hcCwKKyAqCQkJICBjdXJzb3IsIGV0YykgYnV0IHRoZXkgY2FuIGFsc28gYmUgc3BlY2lmaWVkIHdpdGgKKyAqCQkJICBhIGZpbGVuYW1lLiBUaGlzIHJlbmRlcnMgbXkgZmlsZW5hbWUtc2Nhbm5pbmcgc2NoZW1lCisgKgkJCSAgd29ydGhsZXNzLiBOZWVkIHRvIGJ1aWxkIG5ld2xpbmUgcGFyc2luZyB0byBzb2x2ZQorICoJCQkgIHRoaXMgb25lLgorICoJCQkgIEl0IHdpbGwgY29tZSB3aXRoIHZlcnNpb24gMS4xLjAgKHNpZ2gpLgorICoKKyAqIDE5LU1heS0xOTk4IEJTCS0gU3RhcnRlZCB0byBidWlsZCBhIGJ1aWx0aW4gcHJlcHJvY2Vzc29yCisgKgorICogMzAtQXByLTE5OTggQlMJLSBSZWRpZCB0aGUgc3RyaW5ndGFibGUgcGFyc2luZy9oYW5kbGluZy4gTXkgcHJldmlvdXMKKyAqCQkJICBpZGVhcyBoYWQgc29tZSBzZXJpb3VzIGZsYXdzLgorICoKKyAqIDI3LUFwci0xOTk4IEJTCS0gUmVtb3ZlZCBhIGxvdCBvZiBkZWFkIGNvbW1lbnRzIGFuZCBwdXQgaXQgaW4gYSBkb2MKKyAqCQkJICBmaWxlLgorICoKKyAqIDIxLUFwci0xOTk4IEJTCS0gQWRkZWQgY29ycmVjdCBiZWhhdmlvciBmb3IgY3Vyc29ycyBhbmQgaWNvbnMuCisgKgkJCS0gVGhpcyBmaWxlIGlzIGdyb3dpbmcgdG9vIGJpZy4gSXQgaXMgdGltZSB0byBzdHJpcAorICoJCQkgIHRoaW5ncyBhbmQgcHV0IGl0IGluIGEgc3VwcG9ydCBmaWxlLgorICoKKyAqIDE5LUFwci0xOTk4IEJTCS0gVGFnZ2VkIHRoZSBzdHJpbmd0YWJsZSByZXNvdXJjZSBzbyB0aGF0IG9ubHkgb25lCisgKgkJCSAgcmVzb3VyY2Ugd2lsbCBiZSBjcmVhdGVkLiBUaGlzIGJlY2F1c2UgdGhlIHRhYmxlCisgKgkJCSAgaGFzIGEgZGlmZmVyZW50IGxheW91dCB0aGFuIG90aGVyIHJlc291cmNlcy4gVGhlCisgKgkJCSAgdGFibGUgaGFzIHRvIGJlIHNvcnRlZCwgYW5kIGRpdmlkZWQgaW50byBzbWFsbGVyCisgKgkJCSAgcmVzb3VyY2UgZW50cmllcyAoc2VlIGNvbW1lbnQgaW4gc291cmNlKS4KKyAqCisgKiAxNy1BcHItMTk5OCBCUwktIEFsbW9zdCBhbGwgc3RyaW5ncywgaW5jbHVkaW5nIGlkZW50aWZpZXJzLCBhcmUgcGFyc2VkCisgKgkJCSAgYXMgc3RyaW5nX3Qgd2hpY2ggaW5jbHVkZSB1bmljb2RlIHN0cmluZ3MgdXBvbgorICoJCQkgIGlucHV0LgorICoJCQktIFBhcnNlciBub3cgZW1pdHMgYSB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIHdpbjMyCisgKgkJCSAgZXh0ZW5zaW9ucyBpbiB3aW4xNiBtb2RlLgorICoKKyAqIDE2LUFwci0xOTk4IEJTCS0gUmF3IGRhdGEgZWxlbWVudHMgYXJlIG5vdyAqb3B0aW9uYWxseSogc2VwZXJhdGVkCisgKgkJCSAgYnkgY29tbWFzLiBSZWFkIHRoZSBjb21tZW50cyBpbiBmaWxlIHNxMmRxLmwuCisgKgkJCS0gRklYTUU6IHRoZXJlIGFyZSBpbnN0YW5jZXMgaW4gdGhlIHNvdXJjZSB0aGF0IHJlbHkKKyAqCQkJICBvbiB0aGUgZmFjdCB0aGF0IGludD09MzJiaXQgYW5kIHBvaW50ZXJzIGFyZSBpbnQgc2l6ZS4KKyAqCQkJLSBGaXhlZCB0aGUgY29uZmxpY3QgaW4gbWVudWV4IGJ5IGNoYW5naW5nIGEgcnVsZQorICoJCQkgIGJhY2sgaW50byByaWdodCByZWN1cnNpb24uIFNlZSBub3RlIGluIHNvdXJjZS4KKyAqCQkJLSBVc2VyVHlwZSByZXNvdXJjZXMgY2Fubm90IGhhdmUgYW4gZXhwcmVzc2lvbiBhcyBpdHMKKyAqCQkJICB0eXBlY2xhc3MuIFNlZSBub3RlIGluIHNvdXJjZS4KKyAqCisgKiAxNS1BcHItMTk5OCBCUwktIENoYW5nZWQgYWxsIHJpZ2h0IHJlY3Vyc2lvbiBpbnRvIGxlZnQgcmVjdXJzaW9uIHRvCisgKgkJCSAgZ2V0IHJlZHVjdGlvbiBvZiB0aGUgcGFyc2VzdGFjay4KKyAqCQkJICBUaGlzIGFsc28gaGVscHMgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGJpc29uIGFuZCBmbGV4LgorICoJCQkgIE1haW4gYWR2YW50YWdlIGlzIHRoYXQgdGhlIEVtcHR5IHJ1bGUgZ2V0cyByZWR1Y2VkCisgKgkJCSAgZmlyc3QsIHdoaWNoIGlzIHVzZWQgdG8gYWxsb2NhdGUvbGluayB0aGluZ3MuCisgKgkJCSAgSXQgYWxzbyBhZGRlZCBhIHNoaWZ0L3JlZHVjZSBjb25mbGljdCBpbiB0aGUgbWVudWV4CisgKgkJCSAgaGFuZGxpbmcsIGR1ZSB0byBleHByZXNzaW9uL29wdGlvbiBwb3NzaWJpbGl0eSwKKyAqCQkJICBhbHRob3VnaCBub3Qgc2VyaW91cy4KKyAqCisgKiAxNC1BcHItMTk5OCBCUwktIFJlZG9uZSBhbG1vc3QgdGhlIGVudGlyZSBwYXJzZXIuIFdlJ3JlIG5vdCB0YWxraW5nCisgKgkJCSAgYWJvdXQgbWFraW5nIGl0IG1vcmUgZWZmaWNpZW50LCBidXQgcmVhZGFibGUgKGZvciBtZSkKKyAqCQkJICBhbmQgc2xpZ2h0bHkgZWFzaWVyIHRvIGV4cGFuZC9jaGFuZ2UuCisgKgkJCSAgVGhpcyBpcyBkb25lIHByaW1hcmlseSBieSB1c2luZyBtb3JlIHJlZHVjZSBzdGF0ZXMKKyAqCQkJICB3aXRoIG1hbnkgKGludHVpdGl2ZSkgdHlwZXMgZm9yIHRoZSB2YXJpb3VzIHJlc291cmNlCisgKgkJCSAgc3RhdGVtZW50cy4KKyAqCQkJLSBBZGRlZCBleHByZXNzaW9uIGhhbmRsaW5nIGZvciBhbGwgcmVzb3VyY2VzIHdoZXJlIGEKKyAqCQkJICBudW1iZXIgaXMgYWNjZXB0ZWQgKG5vdCBvbmx5IGZvciB3aW4zMikuIEFsc28gYWRkZWQKKyAqCQkJICBtdWx0aXBseSBhbmQgZGl2aXNpb24gKG5vdCBNUyBjb21wYXRpYmxlLCBidXQgaGFuZHkpLgorICoJCQkgIFVuYXJ5IG1pbnVzIGludHJvZHVjZWQgYSBzaGlmdC9yZWR1Y2UgY29uZmxpY3QsIGJ1dAorICoJCQkgIGl0IGlzIG5vdCBzZXJpb3VzLgorICoKKyAqIDEzLUFwci0xOTk4IEJTCS0gUmVvcmRlcmVkIGEgbG90IG9mIHRoaW5ncworICoJCQktIE1hZGUgdGhlIHNvdXJjZSBtb3JlIHJlYWRhYmxlCisgKgkJCS0gQWRkZWQgV2luMzIgcmVzb3VyY2UgZGVmaW5pdGlvbnMKKyAqCQkJLSBDb3JyZWN0ZWQgc3ludGF4IHByb2JsZW1zIHdpdGggYW4gb2xkIHlhY2MgKDspCisgKgkJCS0gQWRkZWQgZXh0cmEgY29tbWVudCBhYm91dCBncmFtbWFyCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJ3cmMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgIm5ld3N0cnVjLmgiCisjaW5jbHVkZSAiZHVtcHJlcy5oIgorI2luY2x1ZGUgInByZXByb2MuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKworI2lmZGVmIF9fQk9STEFORENfXworI3ByYWdtYSB3YXJuIC1zaWcKKyNlbmRpZgorCitEV09SRCBhbmRtYXNrOwkJLyogVXNlZCB0byBwYXJzZSAnTk9UIE5VTUJFUicgZXhwcmVzc2lvbnMgKi8KK2ludCBpbmRpYWxvZyA9IDA7CS8qIFNpZ25hbCBmbGV4IHRoYXQgd2UncmUgcGFyc2luZyBhIGRpYWxvZyAqLworaW50IHdhbnRfcnNjbmFtZSA9IDA7CS8qIFNldCB3aGVuIGEgcmVzb3VyY2UncyBuYW1lIGlzIHJlcXVpcmVkICovCitzdHJpbmd0YWJsZV90ICp0YWdzdHQ7CS8qIFN0cmluZ3RhYmxlIHRhZy4KKwkJCSAqIEl0IGlzIHNldCB3aGlsZSBwYXJzaW5nIGEgc3RyaW5ndGFibGUgdG8gb25lIG9mCisJCQkgKiB0aGUgc3RyaW5ndGFibGVzIGluIHRoZSBzdHRyZXMgbGlzdCBvciBhIG5ldyBvbmUKKwkJCSAqIGlmIHRoZSBsYW5ndWFnZSB3YXMgbm90IHBhcnNlZCBiZWZvcmUuCisJCQkgKi8KK3N0cmluZ3RhYmxlX3QgKnN0dHJlczsJLyogU3RyaW5ndGFibGUgcmVzb3VyY2VzLiBUaGlzIGhvbGRzIHRoZSBsaXN0IG9mCisJCQkgKiBzdHJpbmd0YWJsZXMgd2l0aCBkaWZmZXJlbnQgbGFudWFnZXMKKwkJCSAqLworLyogU2V0IHRvIHRoZSBjdXJyZW50IG9wdGlvbnMgb2YgdGhlIGN1cnJlbnRseSBzY2FubmluZyBzdHJpbmd0YWJsZSAqLworc3RhdGljIGludCAqdGFnc3R0X21lbW9wdDsKK3N0YXRpYyBjaGFyYWN0c190ICp0YWdzdHRfY2hhcmFjdHM7CitzdGF0aWMgdmVyc2lvbl90ICp0YWdzdHRfdmVyc2lvbjsKKworLyogUHJvdG90eXBlcyBvZiBoZXJlIGRlZmluZWQgZnVuY3Rpb25zICovCit2b2lkIHNwbGl0X2N1cnNvcnMocmF3X2RhdGFfdCAqcmQsIGN1cnNvcl9ncm91cF90ICpjdXJnLCBpbnQgKm5jdXIpOwordm9pZCBzcGxpdF9pY29ucyhyYXdfZGF0YV90ICpyZCwgaWNvbl9ncm91cF90ICppY29nLCBpbnQgKm5pY28pOworaW50IGFsbG9jX2N1cnNvcl9pZCh2b2lkKTsKK2ludCBhbGxvY19pY29uX2lkKHZvaWQpOwordm9pZCBpbnNfc3R0X2VudHJ5KHN0dF9lbnRyeV90ICpzdGUpOworaW50IGNoZWNrX3N0dF9lbnRyeShzdHJpbmd0YWJsZV90ICp0YWJzLCBzdHRfZW50cnlfdCAqc3RlKTsKK2V2ZW50X3QgKmdldF9ldmVudF9oZWFkKGV2ZW50X3QgKnApOworY29udHJvbF90ICpnZXRfY29udHJvbF9oZWFkKGNvbnRyb2xfdCAqcCk7Cit2ZXJfdmFsdWVfdCAqZ2V0X3Zlcl92YWx1ZV9oZWFkKHZlcl92YWx1ZV90ICpwKTsKK3Zlcl9ibG9ja190ICpnZXRfdmVyX2Jsb2NrX2hlYWQodmVyX2Jsb2NrX3QgKnApOworcmVzb3VyY2VfdCAqZ2V0X3Jlc291cmNlX2hlYWQocmVzb3VyY2VfdCAqcCk7CittZW51ZXhfaXRlbV90ICpnZXRfaXRlbWV4X2hlYWQobWVudWV4X2l0ZW1fdCAqcCk7CittZW51X2l0ZW1fdCAqZ2V0X2l0ZW1faGVhZChtZW51X2l0ZW1fdCAqcCk7CityYXdfZGF0YV90ICptZXJnZV9yYXdfZGF0YV9zdHIocmF3X2RhdGFfdCAqcjEsIHN0cmluZ190ICpzdHIpOworcmF3X2RhdGFfdCAqbWVyZ2VfcmF3X2RhdGFfaW50KHJhd19kYXRhX3QgKnIxLCBpbnQgaSk7CityYXdfZGF0YV90ICptZXJnZV9yYXdfZGF0YShyYXdfZGF0YV90ICpyMSwgcmF3X2RhdGFfdCAqcjIpOworcmF3X2RhdGFfdCAqc3RyMnJhd19kYXRhKHN0cmluZ190ICpzdHIpOworcmF3X2RhdGFfdCAqaW50MnJhd19kYXRhKGludCBpKTsKK3Jhd19kYXRhX3QgKmxvYWRfZmlsZShzdHJpbmdfdCAqbmFtZSk7CitpdGVtZXhfb3B0X3QgKm5ld19pdGVtZXhfb3B0KGludCBpZCwgaW50IHR5cGUsIGludCBzdGF0ZSwgaW50IGhlbHBpZCk7CitldmVudF90ICphZGRfc3RyaW5nX2V2ZW50KHN0cmluZ190ICprZXksIGludCBpZCwgaW50IGZsYWdzLCBldmVudF90ICpwcmV2KTsKK2V2ZW50X3QgKmFkZF9ldmVudChpbnQga2V5LCBpbnQgaWQsIGludCBmbGFncywgZXZlbnRfdCAqcHJldik7CitkaWFsb2dleF90ICpkaWFsb2dleF92ZXJzaW9uKHZlcnNpb25fdCAqdiwgZGlhbG9nZXhfdCAqZGxnKTsKK2RpYWxvZ2V4X3QgKmRpYWxvZ2V4X2NoYXJhY3RlcmlzdGljcyhjaGFyYWN0c190ICpjLCBkaWFsb2dleF90ICpkbGcpOworZGlhbG9nZXhfdCAqZGlhbG9nZXhfbGFuZ3VhZ2UobGFuZ3VhZ2VfdCAqbCwgZGlhbG9nZXhfdCAqZGxnKTsKK2RpYWxvZ2V4X3QgKmRpYWxvZ2V4X21lbnUobmFtZV9pZF90ICptLCBkaWFsb2dleF90ICpkbGcpOworZGlhbG9nZXhfdCAqZGlhbG9nZXhfY2xhc3MobmFtZV9pZF90ICpuLCBkaWFsb2dleF90ICpkbGcpOworZGlhbG9nZXhfdCAqZGlhbG9nZXhfZm9udChmb250X2lkX3QgKmYsIGRpYWxvZ2V4X3QgKmRsZyk7CitkaWFsb2dleF90ICpkaWFsb2dleF9jYXB0aW9uKHN0cmluZ190ICpzLCBkaWFsb2dleF90ICpkbGcpOworZGlhbG9nZXhfdCAqZGlhbG9nZXhfZXhzdHlsZShpbnQgc3QsIGRpYWxvZ2V4X3QgKmRsZyk7CitkaWFsb2dleF90ICpkaWFsb2dleF9zdHlsZShpbnQgc3QsIGRpYWxvZ2V4X3QgKmRsZyk7CituYW1lX2lkX3QgKmNvbnZlcnRfY3RsY2xhc3MobmFtZV9pZF90ICpjbHMpOworY29udHJvbF90ICppbnNfY3RybChpbnQgdHlwZSwgaW50IHN0eWxlLCBjb250cm9sX3QgKmN0cmwsIGNvbnRyb2xfdCAqcHJldik7CitkaWFsb2dfdCAqZGlhbG9nX3ZlcnNpb24odmVyc2lvbl90ICp2LCBkaWFsb2dfdCAqZGxnKTsKK2RpYWxvZ190ICpkaWFsb2dfY2hhcmFjdGVyaXN0aWNzKGNoYXJhY3RzX3QgKmMsIGRpYWxvZ190ICpkbGcpOworZGlhbG9nX3QgKmRpYWxvZ19sYW5ndWFnZShsYW5ndWFnZV90ICpsLCBkaWFsb2dfdCAqZGxnKTsKK2RpYWxvZ190ICpkaWFsb2dfbWVudShuYW1lX2lkX3QgKm0sIGRpYWxvZ190ICpkbGcpOworZGlhbG9nX3QgKmRpYWxvZ19jbGFzcyhuYW1lX2lkX3QgKm4sIGRpYWxvZ190ICpkbGcpOworZGlhbG9nX3QgKmRpYWxvZ19mb250KGZvbnRfaWRfdCAqZiwgZGlhbG9nX3QgKmRsZyk7CitkaWFsb2dfdCAqZGlhbG9nX2NhcHRpb24oc3RyaW5nX3QgKnMsIGRpYWxvZ190ICpkbGcpOworZGlhbG9nX3QgKmRpYWxvZ19leHN0eWxlKGludCBzdCwgZGlhbG9nX3QgKmRsZyk7CitkaWFsb2dfdCAqZGlhbG9nX3N0eWxlKGludCBzdCwgZGlhbG9nX3QgKmRsZyk7CityZXNvdXJjZV90ICpidWlsZF9zdHRfcmVzb3VyY2VzKHN0cmluZ3RhYmxlX3QgKnN0dGhlYWQpOworc3RyaW5ndGFibGVfdCAqZmluZF9zdHJpbmd0YWJsZShsdmNfdCAqbHZjKTsKKworJX0KKyV1bmlvbnsKKwlzdHJpbmdfdAkqc3RyOworCWludAkJbnVtOworCWludAkJKmlwdHI7CisJcmVzb3VyY2VfdAkqcmVzOworCWFjY2VsZXJhdG9yX3QJKmFjYzsKKwliaXRtYXBfdAkqYm1wOworCWN1cnNvcl90CSpjdXI7CisJY3Vyc29yX2dyb3VwX3QJKmN1cmc7CisJZGlhbG9nX3QJKmRsZzsKKwlkaWFsb2dleF90CSpkbGdleDsKKwlmb250X3QJCSpmbnQ7CisJaWNvbl90CQkqaWNvOworCWljb25fZ3JvdXBfdAkqaWNvZzsKKwltZW51X3QJCSptZW47CisJbWVudWV4X3QJKm1lbmV4OworCXJjZGF0YV90CSpyZHQ7CisJc3RyaW5ndGFibGVfdAkqc3R0OworCXN0dF9lbnRyeV90CSpzdHRlOworCXVzZXJfdAkJKnVzcjsKKwltZXNzYWdldGFibGVfdAkqbXNnOworCXZlcnNpb25pbmZvX3QJKnZlcmk7CisJY29udHJvbF90CSpjdGw7CisJbmFtZV9pZF90CSpuaWQ7CisJZm9udF9pZF90CSpmbnRpZDsKKwlsYW5ndWFnZV90CSpsYW47CisJdmVyc2lvbl90CSp2ZXI7CisJY2hhcmFjdHNfdAkqY2hhcnM7CisJZXZlbnRfdAkJKmV2ZW50OworCW1lbnVfaXRlbV90CSptZW5pdG07CisJbWVudWV4X2l0ZW1fdAkqbWVuZXhpdG07CisJaXRlbWV4X29wdF90CSpleG9wdDsKKwlyYXdfZGF0YV90CSpyYXc7CisJbHZjX3QJCSpsdmM7CisJdmVyX3ZhbHVlX3QJKnZhbDsKKwl2ZXJfYmxvY2tfdAkqYmxrOworCXZlcl93b3Jkc190CSp2ZXJ3OworfQorCisldG9rZW4gdElGIHRJRkRFRiB0SUZOREVGIHRFTFNFIHRFTElGIHRFTkRJRiB0REVGSU5FRCB0TkwKKyV0b2tlbiB0VFlQRURFRiB0RVhURVJOCisldG9rZW4gPG51bT4gTlVNQkVSCisldG9rZW4gPHN0cj4gdFNUUklORyBJREVOVCBGSUxFTkFNRQorJXRva2VuIDxyYXc+IFJBV0RBVEEKKyV0b2tlbiBBQ0NFTEVSQVRPUlMgdEJJVE1BUCBDVVJTT1IgRElBTE9HIERJQUxPR0VYIE1FTlUgTUVOVUVYIE1FU1NBR0VUQUJMRQorJXRva2VuIFJDREFUQSBWRVJTSU9OSU5GTyBTVFJJTkdUQUJMRSBGT05UIElDT04KKyV0b2tlbiBBVVRPM1NUQVRFIEFVVE9DSEVDS0JPWCBBVVRPUkFESU9CVVRUT04gQ0hFQ0tCT1ggREVGUFVTSEJVVFRPTgorJXRva2VuIFBVU0hCVVRUT04gUkFESU9CVVRUT04gU1RBVEUzIC8qIFBVU0hCT1ggKi8KKyV0b2tlbiBHUk9VUEJPWCBDT01CT0JPWCBMSVNUQk9YIFNDUk9MTEJBUgorJXRva2VuIENPTlRST0wgRURJVFRFWFQKKyV0b2tlbiBSVEVYVCBDVEVYVCBMVEVYVAorJXRva2VuIEJMT0NLIFZBTFVFCisldG9rZW4gU0hJRlQgQUxUIEFTQ0lJIFZJUlRLRVkgR1JBWUVEIENIRUNLRUQgSU5BQ1RJVkUgTk9JTlZFUlQKKyV0b2tlbiB0UFVSRSBJTVBVUkUgRElTQ0FSREFCTEUgTE9BRE9OQ0FMTCBQUkVMT0FEIHRGSVhFRCBNT1ZFQUJMRQorJXRva2VuIENMQVNTIENBUFRJT04gQ0hBUkFDVEVSSVNUSUNTIEVYU1RZTEUgU1RZTEUgVkVSU0lPTiBMQU5HVUFHRQorJXRva2VuIEZJTEVWRVJTSU9OIFBST0RVQ1RWRVJTSU9OIEZJTEVGTEFHU01BU0sgRklMRU9TIEZJTEVUWVBFIEZJTEVGTEFHUyBGSUxFU1VCVFlQRQorJXRva2VuIE1FTlVCQVJCUkVBSyBNRU5VQlJFQUsgTUVOVUlURU0gUE9QVVAgU0VQQVJBVE9SCisldG9rZW4gSEVMUAorJXRva2VuIHRTVFJJTkcgSURFTlQgUkFXREFUQQorJXRva2VuIHRCRUdJTiB0RU5ECislbGVmdCBMT0dPUgorJWxlZnQgTE9HQU5ECislbGVmdCAnfCcKKyVsZWZ0ICdeJworJWxlZnQgJyYnCislbGVmdCBFUSBORQorJWxlZnQgJzwnIExURSAnPicgR1RFCislbGVmdCAnKycgJy0nCislbGVmdCAnKicgJy8nCislcmlnaHQgJ34nICchJyBOT1QKKworJXR5cGUgPHJlcz4gCXJlc291cmNlX2ZpbGUgcmVzb3VyY2UgcmVzb3VyY2VzIHJlc291cmNlX2RlZmluaXRpb24KKyV0eXBlIDxzdHQ+CXN0cmluZ3RhYmxlIHN0cmluZ3MKKyV0eXBlIDxmbnQ+CWZvbnQKKyV0eXBlIDxpY29nPglpY29uCisldHlwZSA8YWNjPiAJYWNjZWxlcmF0b3JzCisldHlwZSA8ZXZlbnQ+IAlldmVudHMKKyV0eXBlIDxibXA+IAliaXRtYXAKKyV0eXBlIDxjdXJnPiAJY3Vyc29yCisldHlwZSA8ZGxnPiAJZGlhbG9nIGRsZ19hdHRyaWJ1dGVzCisldHlwZSA8Y3RsPiAJY3RybHMgZ2VuX2N0cmwgbGFiX2N0cmwgY3RybF9kZXNjIGljb25pbmZvCisldHlwZSA8aXB0cj4Jb3B0aW9uYWxfc3R5bGUgaGVscGlkCisldHlwZSA8ZGxnZXg+IAlkaWFsb2dleCBkbGdleF9hdHRyaWJzCisldHlwZSA8Y3RsPglleGN0cmxzIGdlbl9leGN0cmwgbGFiX2V4Y3RybCBleGN0cmxfZGVzYworJXR5cGUgPHJkdD4gCXJjZGF0YQorJXR5cGUgPHJhdz4JcmF3X2RhdGEgcmF3X2VsZW1lbnRzIG9wdF9kYXRhCisldHlwZSA8dmVyaT4gCXZlcnNpb25pbmZvIGZpeF92ZXJzaW9uCisldHlwZSA8dmVydz4JdmVyX3dvcmRzCisldHlwZSA8YmxrPgl2ZXJfYmxvY2tzIHZlcl9ibG9jaworJXR5cGUgPHZhbD4JdmVyX3ZhbHVlcyB2ZXJfdmFsdWUKKyV0eXBlIDxtZW4+IAltZW51CisldHlwZSA8bWVuaXRtPglpdGVtX2RlZmluaXRpb25zIG1lbnVfYm9keQorJXR5cGUgPG1lbmV4PgltZW51ZXgKKyV0eXBlIDxtZW5leGl0bT4gaXRlbWV4X2RlZmluaXRpb25zIG1lbnVleF9ib2R5CisldHlwZSA8ZXhvcHQ+CWl0ZW1leF9wX29wdGlvbnMgaXRlbWV4X29wdGlvbnMKKyV0eXBlIDxtc2c+IAltZXNzYWdldGFibGUKKyV0eXBlIDx1c3I+IAl1c2VycmVzCisldHlwZSA8bnVtPiAJaXRlbV9vcHRpb25zCisldHlwZSA8bmlkPiAJbmFtZWlkIGN0bGNsYXNzIHVzZXJ0eXBlCisldHlwZSA8bnVtPiAJYWNjX29wdAorJXR5cGUgPGlwdHI+CWxvYWRtZW1vcHRzIGxhbW8gbGFtYQorJXR5cGUgPGZudGlkPglvcHRfZm9udCBvcHRfZXhmb250CisldHlwZSA8bHZjPglvcHRfbHZjCisldHlwZSA8bGFuPglvcHRfbGFuZ3VhZ2UKKyV0eXBlIDxjaGFycz4Jb3B0X2NoYXJhY3RzCisldHlwZSA8dmVyPglvcHRfdmVyc2lvbgorJXR5cGUgPG51bT4JZXhwciB4cHIgZHVtbXkKKyV0eXBlIDxpcHRyPgllX2V4cHIKKyV0eXBlIDxpcHRyPglwcF9leHByIHBwX2NvbnN0YW50CisKKyUlCisKK3Jlc291cmNlX2ZpbGUKKwk6IHJlc291cmNlcyB7CisJCXJlc291cmNlX3QgKnJzYzsKKwkJLyogRmlyc3QgYWRkIHN0cmluZ3RhYmxlcyB0byB0aGUgcmVzb3VyY2UtbGlzdCAqLworCQlyc2MgPSBidWlsZF9zdHRfcmVzb3VyY2VzKHN0dHJlcyk7CisJCS8qICdidWlsZF9zdHRfcmVzb3VyY2VzJyByZXR1cm5zIGEgaGVhZCBhbmQgJDEgaXMgYSB0YWlsICovCisJCWlmKCQxKQorCQl7CisJCQkkMS0+bmV4dCA9IHJzYzsKKwkJCWlmKHJzYykKKwkJCQlyc2MtPnByZXYgPSAkMTsKKwkJfQorCQllbHNlCisJCQkkMSA9IHJzYzsKKwkJLyogRmluYWwgc3RhdGVtZW50IGJlZm9yZSB3ZXJlIGRvbmUgKi8KKwkJcmVzb3VyY2VfdG9wID0gZ2V0X3Jlc291cmNlX2hlYWQoJDEpOworCQl9CisJOworCisvKiBSZXNvdXJjZXMgYXJlIHB1dCBpbnRvIGEgbGlua2VkIGxpc3QgKi8KK3Jlc291cmNlcworCTogLyogRW1wdHkgKi8JCXsgJCQgPSBOVUxMOyB3YW50X3JzY25hbWUgPSAxOyB9CisJfCByZXNvdXJjZXMgcmVzb3VyY2UJeworCQlpZigkMikKKwkJeworCQkJcmVzb3VyY2VfdCAqdGFpbCA9ICQyOworCQkJcmVzb3VyY2VfdCAqaGVhZCA9ICQyOworCQkJd2hpbGUodGFpbC0+bmV4dCkKKwkJCQl0YWlsID0gdGFpbC0+bmV4dDsKKwkJCXdoaWxlKGhlYWQtPnByZXYpCisJCQkJaGVhZCA9IGhlYWQtPnByZXY7CisJCQloZWFkLT5wcmV2ID0gJDE7CisJCQlpZigkMSkKKwkJCQkkMS0+bmV4dCA9IGhlYWQ7CisJCQkkJCA9IHRhaWw7CisJCX0KKwkJZWxzZSBpZigkMSkKKwkJeworCQkJcmVzb3VyY2VfdCAqdGFpbCA9ICQxOworCQkJd2hpbGUodGFpbC0+bmV4dCkKKwkJCQl0YWlsID0gdGFpbC0+bmV4dDsKKwkJCSQkID0gdGFpbDsKKwkJfQorCQllbHNlCisJCQkkJCA9IE5VTEw7CisJCXdhbnRfcnNjbmFtZSA9IDE7CisJCX0KKwl8IHJlc291cmNlcyBwcmVwcm9jZXNzb3IJCXsgJCQgPSAkMTsgd2FudF9yc2NuYW1lID0gMTsgfQorCXwgcmVzb3VyY2VzIGNqdW5rCQkJeyAkJCA9ICQxOyB3YW50X3JzY25hbWUgPSAxOyB9CisJOworCisvKiBUaGUgYnVpbGRpbiBwcmVwcm9jZXNzb3IgKi8KK3ByZXByb2Nlc3NvcgorCTogdElGIHBwX2V4cHIgdE5MCXsgcG9wX3N0YXJ0KCk7IHB1c2hfaWYoJDIgPyAqKCQyKSA6IDAsIDAsIDApOyBpZigkMikgZnJlZSgkMik7fQorCXwgdElGREVGIElERU5UIHROTAl7IHBvcF9zdGFydCgpOyBwdXNoX2lmKHBwX2xvb2t1cCgkMi0+c3RyLmNzdHIpICE9IE5VTEwsIDAsIDApOyB9CisJfCB0SUZOREVGIElERU5UIHROTAl7IHBvcF9zdGFydCgpOyBwdXNoX2lmKHBwX2xvb2t1cCgkMi0+c3RyLmNzdHIpID09IE5VTEwsIDAsIDApOyB9CisJfCB0RUxJRiBwcF9leHByIHROTAl7IHBvcF9zdGFydCgpOyBwdXNoX2lmKCQyID8gKigkMikgOiAwLCBwb3BfaWYoKSwgMCk7IGlmKCQyKSBmcmVlKCQyKTsgfQorCXwgdEVMU0UgdE5MCQl7IHBvcF9zdGFydCgpOyBwdXNoX2lmKDEsIHBvcF9pZigpLCAwKTsgfQorCXwgdEVORElGIHROTAkJeyBwb3BfaWYoKTsgfQorCTsKKworcHBfZXhwcgk6IHBwX2NvbnN0YW50CQkJeyAkJCA9ICQxOyB9CisJfCBwcF9leHByIExPR09SIHBwX2V4cHIJCXsgJCQgPSBuZXdfaW50KCQxICYmICQzID8gKCokMSB8fCAqJDMpIDogMCk7IGlmKCQxKSBmcmVlKCQxKTsgaWYoJDMpIGZyZWUoJDMpOyB9CisJfCBwcF9leHByIExPR0FORCBwcF9leHByCXsgJCQgPSBuZXdfaW50KCQxICYmICQzID8gKCokMSAmJiAqJDMpIDogMCk7IGlmKCQxKSBmcmVlKCQxKTsgaWYoJDMpIGZyZWUoJDMpOyB9CisJfCBwcF9leHByICcrJyBwcF9leHByCQl7ICQkID0gbmV3X2ludCgkMSAmJiAkMyA/ICgqJDEgICsgKiQzKSA6IDApOyBpZigkMSkgZnJlZSgkMSk7IGlmKCQzKSBmcmVlKCQzKTsgfQorCXwgcHBfZXhwciAnLScgcHBfZXhwcgkJeyAkJCA9IG5ld19pbnQoJDEgJiYgJDMgPyAoKiQxICAtICokMykgOiAwKTsgaWYoJDEpIGZyZWUoJDEpOyBpZigkMykgZnJlZSgkMyk7IH0KKwl8IHBwX2V4cHIgJ14nIHBwX2V4cHIJCXsgJCQgPSBuZXdfaW50KCQxICYmICQzID8gKCokMSAgXiAqJDMpIDogMCk7IGlmKCQxKSBmcmVlKCQxKTsgaWYoJDMpIGZyZWUoJDMpOyB9CisJfCBwcF9leHByIEVRIHBwX2V4cHIJCXsgJCQgPSBuZXdfaW50KCQxICYmICQzID8gKCokMSA9PSAqJDMpIDogMCk7IGlmKCQxKSBmcmVlKCQxKTsgaWYoJDMpIGZyZWUoJDMpOyB9CisJfCBwcF9leHByIE5FIHBwX2V4cHIJCXsgJCQgPSBuZXdfaW50KCQxICYmICQzID8gKCokMSAhPSAqJDMpIDogMCk7IGlmKCQxKSBmcmVlKCQxKTsgaWYoJDMpIGZyZWUoJDMpOyB9CisJfCBwcF9leHByICc8JyBwcF9leHByCQl7ICQkID0gbmV3X2ludCgkMSAmJiAkMyA/ICgqJDEgIDwgKiQzKSA6IDApOyBpZigkMSkgZnJlZSgkMSk7IGlmKCQzKSBmcmVlKCQzKTsgfQorCXwgcHBfZXhwciAnPicgcHBfZXhwcgkJeyAkJCA9IG5ld19pbnQoJDEgJiYgJDMgPyAoKiQxICA+ICokMykgOiAwKTsgaWYoJDEpIGZyZWUoJDEpOyBpZigkMykgZnJlZSgkMyk7IH0KKwl8IHBwX2V4cHIgTFRFIHBwX2V4cHIJCXsgJCQgPSBuZXdfaW50KCQxICYmICQzID8gKCokMSA8PSAqJDMpIDogMCk7IGlmKCQxKSBmcmVlKCQxKTsgaWYoJDMpIGZyZWUoJDMpOyB9CisJfCBwcF9leHByIEdURSBwcF9leHByCQl7ICQkID0gbmV3X2ludCgkMSAmJiAkMyA/ICgqJDEgPj0gKiQzKSA6IDApOyBpZigkMSkgZnJlZSgkMSk7IGlmKCQzKSBmcmVlKCQzKTsgfQorCXwgJ34nIHBwX2V4cHIJCQl7ICQkID0gJDI7IGlmKCQyKSAqJDIgPSB+KCokMik7IH0KKwl8ICcrJyBwcF9leHByCQkJeyAkJCA9ICQyOyB9CisJfCAnLScgcHBfZXhwcgkJCXsgJCQgPSAkMjsgaWYoJDIpICokMiA9IC0oKiQyKTsgfQorCXwgJyEnIHBwX2V4cHIJCQl7ICQkID0gJDI7IGlmKCQyKSAqJDIgPSAhKCokMik7IH0KKwl8ICcoJyBwcF9leHByICcpJwkJeyAkJCA9ICQyOyB9CisJOworCitwcF9jb25zdGFudAorCTogTlVNQkVSCQkJeyAkJCA9IG5ld19pbnQoJDEpOyB9CisJfCBJREVOVAkJCQl7ICQkID0gTlVMTDsgfQorCXwgdERFRklORUQgSURFTlQJCXsgJCQgPSBuZXdfaW50KHBwX2xvb2t1cCgkMi0+c3RyLmNzdHIpICE9IE5VTEwpOyB9CisJfCB0REVGSU5FRCAnKCcgSURFTlQgJyknCXsgJCQgPSBuZXdfaW50KHBwX2xvb2t1cCgkMy0+c3RyLmNzdHIpICE9IE5VTEwpOyB9CisJOworCisvKiBDIGlnbm9yZSBzdHVmZiAqLworY2p1bmsJOiB0VFlQRURFRgkJCXsgc3RyaXBfdGlsX3NlbWljb2xvbigpOyB9CisJfCB0RVhURVJOCQkJeyBzdHJpcF90aWxfc2VtaWNvbG9uKCk7IH0KKwl8IElERU5UIElERU5UCQkJeyBzdHJpcF90aWxfc2VtaWNvbG9uKCk7IH0KKwl8IElERU5UICcoJwkJCXsgc3RyaXBfdGlsX3BhcmVudGhlc2lzKCk7IH0KKwl8IElERU5UICcqJwkJCXsgc3RyaXBfdGlsX3NlbWljb2xvbigpOyB9CisJOworCisvKiBQYXJzZSB0b3AgbGV2ZWwgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZXRjLiAqLworcmVzb3VyY2UKKwk6IG5hbWVpZCByZXNvdXJjZV9kZWZpbml0aW9uIHsKKwkJJCQgPSAkMjsKKwkJaWYoJCQpCisJCXsKKwkJCSQkLT5uYW1lID0gJDE7CisJCQlpZigkMS0+dHlwZSA9PSBuYW1lX29yZCkKKwkJCXsKKwkJCQljaGF0KCJHb3QgJXMgKCVkKSIsZ2V0X3R5cGVuYW1lKCQyKSwkMS0+bmFtZS5pX25hbWUpOworCQkJfQorCQkJZWxzZSBpZigkMS0+dHlwZSA9PSBuYW1lX3N0cikKKwkJCXsKKwkJCQljaGF0KCJHb3QgJXMgKCVzKSIsZ2V0X3R5cGVuYW1lKCQyKSwkMS0+bmFtZS5zX25hbWUtPnN0ci5jc3RyKTsKKwkJCX0KKwkJfQorCQl9CisJfCBzdHJpbmd0YWJsZSB7CisJCS8qIERvbid0IGRvIGFueXRoaW5nLCBzdHJpbmd0YWJsZXMgYXJlIGNvbnZlcnRlZCB0bworCQkgKiByZXNvdXJjZV90IHN0cnVjdHVyZXMgd2hlbiB3ZSBhcmUgZmluaXNoZWQgcGFyc2luZyBhbmQKKwkJICogdGhlIGZpbmFsIHJ1bGUgb2YgdGhlIHBhcnNlciBpcyByZWR1Y2VkIChzZWUgYWJvdmUpCisJCSAqLworCQkkJCA9IE5VTEw7CisJCWNoYXQoIkdvdCBTVFJJTkdUQUJMRSIpOworCQl9CisJfCBvcHRfbGFuZ3VhZ2UgeworCQlpZighd2luMzIpCisJCQl5eXdhcm5pbmcoIkxBTkdVQUdFIG5vdCBzdXBwb3J0ZWQgaW4gMTYtYml0IG1vZGUiKTsKKwkJaWYoY3VycmVudGxhbmd1YWdlKQorCQkJZnJlZShjdXJyZW50bGFuZ3VhZ2UpOworCQljdXJyZW50bGFuZ3VhZ2UgPSAkMTsKKwkJJCQgPSBOVUxMOworCQl9CisJOworCisvKiBGSVhNRToKKyAqIFRoZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCBNRU5VIE1FTlUgey4uLn0gaXMgYSB2YWxpZCAoISkgcmVzb3VyY2UuCisgKiBUaGUgbmFtZS1pZGVudGlmaWVyIGlzICJNRU5VIi4gV2UgY2Fubm90IHBhcnNlIHRoaXMgd2l0aG91dCBnZW5lcmF0aW5nCisgKiBhbiBlcnJvci4gSXQgd291bGQgbWVhbiB0aGF0IGEgbGlzdCBvZiBrZXl3b3JkcyBtdXN0IGJlIGFkZGVkIGhlcmUKKyAqIGFuZCBjb252ZXJ0ZWQgaW50byBhIHZhbGlkIG5hbWVfaWRfdCBzdHJ1Y3R1cmUuCisgKi8KK25hbWVpZAk6IGV4cHIJeworCQkkJCA9IG5ld19uYW1lX2lkKCk7CisJCSQkLT50eXBlID0gbmFtZV9vcmQ7CisJCSQkLT5uYW1lLmlfbmFtZSA9ICQxOworCQl3YW50X3JzY25hbWUgPSAwOworCQl9CisJfCBJREVOVAl7CisJCSQkID0gbmV3X25hbWVfaWQoKTsKKwkJJCQtPnR5cGUgPSBuYW1lX3N0cjsKKwkJJCQtPm5hbWUuc19uYW1lID0gJDE7CisJCXdhbnRfcnNjbmFtZSA9IDA7CisJCX0KKwk7CisKKy8qIGdldCB0aGUgdmFsdWUgZm9yIGEgc2luZ2xlIHJlc291cmNlKi8KK3Jlc291cmNlX2RlZmluaXRpb24KKwk6IGFjY2VsZXJhdG9ycwl7ICQkID0gbmV3X3Jlc291cmNlKHJlc19hY2MsICQxLCAkMS0+bWVtb3B0LCAkMS0+bHZjLmxhbmd1YWdlKTsgfQorCXwgYml0bWFwCXsgJCQgPSBuZXdfcmVzb3VyY2UocmVzX2JtcCwgJDEsICQxLT5tZW1vcHQsIGN1cnJlbnRsYW5ndWFnZSk7IH0KKwl8IGN1cnNvciB7CisJCXJlc291cmNlX3QgKnJzYzsKKwkJY3Vyc29yX3QgKmN1cjsKKwkJJCQgPSByc2MgPSBuZXdfcmVzb3VyY2UocmVzX2N1cmcsICQxLCAkMS0+bWVtb3B0LCBjdXJyZW50bGFuZ3VhZ2UpOworCQlmb3IoY3VyID0gJDEtPmN1cnNvcmxpc3Q7IGN1cjsgY3VyID0gY3VyLT5uZXh0KQorCQl7CisJCQlyc2MtPnByZXYgPSBuZXdfcmVzb3VyY2UocmVzX2N1ciwgY3VyLCAkMS0+bWVtb3B0LCBjdXJyZW50bGFuZ3VhZ2UpOworCQkJcnNjLT5wcmV2LT5uZXh0ID0gcnNjOworCQkJcnNjID0gcnNjLT5wcmV2OworCQkJcnNjLT5uYW1lID0gbmV3X25hbWVfaWQoKTsKKwkJCXJzYy0+bmFtZS0+dHlwZSA9IG5hbWVfb3JkOworCQkJcnNjLT5uYW1lLT5uYW1lLmlfbmFtZSA9IGN1ci0+aWQ7CisJCX0KKwkJfQorCXwgZGlhbG9nCXsgJCQgPSBuZXdfcmVzb3VyY2UocmVzX2RsZywgJDEsICQxLT5tZW1vcHQsICQxLT5sdmMubGFuZ3VhZ2UpOyB9CisJfCBkaWFsb2dleCB7CisJCWlmKHdpbjMyKQorCQkJJCQgPSBuZXdfcmVzb3VyY2UocmVzX2RsZ2V4LCAkMSwgJDEtPm1lbW9wdCwgJDEtPmx2Yy5sYW5ndWFnZSk7CisJCWVsc2UKKwkJCSQkID0gTlVMTDsKKwkJfQorCXwgZm9udAkJeyAkJD1uZXdfcmVzb3VyY2UocmVzX2ZudCwgJDEsICQxLT5tZW1vcHQsIGN1cnJlbnRsYW5ndWFnZSk7IH0KKwl8IGljb24geworCQlyZXNvdXJjZV90ICpyc2M7CisJCWljb25fdCAqaWNvOworCQkkJCA9IHJzYyA9IG5ld19yZXNvdXJjZShyZXNfaWNvZywgJDEsICQxLT5tZW1vcHQsIGN1cnJlbnRsYW5ndWFnZSk7CisJCWZvcihpY28gPSAkMS0+aWNvbmxpc3Q7IGljbzsgaWNvID0gaWNvLT5uZXh0KQorCQl7CisJCQlyc2MtPnByZXYgPSBuZXdfcmVzb3VyY2UocmVzX2ljbywgaWNvLCAkMS0+bWVtb3B0LCBjdXJyZW50bGFuZ3VhZ2UpOworCQkJcnNjLT5wcmV2LT5uZXh0ID0gcnNjOworCQkJcnNjID0gcnNjLT5wcmV2OworCQkJcnNjLT5uYW1lID0gbmV3X25hbWVfaWQoKTsKKwkJCXJzYy0+bmFtZS0+dHlwZSA9IG5hbWVfb3JkOworCQkJcnNjLT5uYW1lLT5uYW1lLmlfbmFtZSA9IGljby0+aWQ7CisJCX0KKwkJfQorCXwgbWVudQkJeyAkJCA9IG5ld19yZXNvdXJjZShyZXNfbWVuLCAkMSwgJDEtPm1lbW9wdCwgJDEtPmx2Yy5sYW5ndWFnZSk7IH0KKwl8IG1lbnVleCB7CisJCWlmKHdpbjMyKQorCQkJJCQgPSBuZXdfcmVzb3VyY2UocmVzX21lbmV4LCAkMSwgJDEtPm1lbW9wdCwgJDEtPmx2Yy5sYW5ndWFnZSk7CisJCWVsc2UKKwkJCSQkID0gTlVMTDsKKwkJfQorCXwgbWVzc2FnZXRhYmxlCXsgJCQgPSBuZXdfcmVzb3VyY2UocmVzX21zZywgJDEsIFdSQ19NT19NT1ZFQUJMRSB8IFdSQ19NT19ESVNDQVJEQUJMRSwgY3VycmVudGxhbmd1YWdlKTsgfQorCXwgcmNkYXRhCXsgJCQgPSBuZXdfcmVzb3VyY2UocmVzX3JkdCwgJDEsICQxLT5tZW1vcHQsICQxLT5sdmMubGFuZ3VhZ2UpOyB9CisJfCB1c2VycmVzCXsgJCQgPSBuZXdfcmVzb3VyY2UocmVzX3VzciwgJDEsICQxLT5tZW1vcHQsIGN1cnJlbnRsYW5ndWFnZSk7IH0KKwl8IHZlcnNpb25pbmZvCXsgJCQgPSBuZXdfcmVzb3VyY2UocmVzX3ZlciwgJDEsIFdSQ19NT19NT1ZFQUJMRSB8IFdSQ19NT19ESVNDQVJEQUJMRSwgY3VycmVudGxhbmd1YWdlKTsgfQorCTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJpdG1hcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2JpdG1hcAk6IHRCSVRNQVAgbG9hZG1lbW9wdHMgRklMRU5BTUUJeyAkJCA9IG5ld19iaXRtYXAobG9hZF9maWxlKCQzKSwgJDIpOyB9CisJfCB0QklUTUFQIGxvYWRtZW1vcHRzIHJhd19kYXRhCXsgJCQgPSBuZXdfYml0bWFwKCQzLCAkMik7IH0KKwk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDdXJzb3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitjdXJzb3IJOiBDVVJTT1IgbG9hZG1lbW9wdHMgRklMRU5BTUUJeyAkJCA9IG5ld19jdXJzb3JfZ3JvdXAobG9hZF9maWxlKCQzKSwgJDIpOyB9CisJfCBDVVJTT1IgbG9hZG1lbW9wdHMgcmF3X2RhdGEJeyAkJCA9IG5ld19jdXJzb3JfZ3JvdXAoJDMsICQyKTsgfQorCTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZvbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBGSVhNRTogU2hvdWxkIHdlIGFsbG93IHJhd19kYXRhIGhlcmU/ICovCitmb250CTogRk9OVCBsb2FkbWVtb3B0cyBGSUxFTkFNRQl7ICQkID0gbmV3X2ZvbnQobG9hZF9maWxlKCQzKSwgJDIpOyB9CisJOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSWNvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2ljb24JOiBJQ09OIGxvYWRtZW1vcHRzIEZJTEVOQU1FCXsgJCQgPSBuZXdfaWNvbl9ncm91cChsb2FkX2ZpbGUoJDMpLCAkMik7IH0KKwl8IElDT04gbG9hZG1lbW9wdHMgcmF3X2RhdGEJeyAkJCA9IG5ld19pY29uX2dyb3VwKCQzLCAkMik7IH0KKwk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNZXNzYWdlVGFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBJdCBtaWdodCBiZSBpbnRlcmVzdGluZyB0byBpbXBsZW1lbnQgdGhlIE1TIE1lc3NhZ2UgY29tcGlsZXIgaGVyZSBhcyB3ZWxsCisgKiB0byBnZXQgZXZlcnl0aGluZyBpbiBvbmUgc291cmNlLiBNaWdodCBiZSBhIGZ1dHVyZSBwcm9qZWN0LgorICovCittZXNzYWdldGFibGUKKwk6IE1FU1NBR0VUQUJMRSBGSUxFTkFNRQl7CisJCWlmKCF3aW4zMikKKwkJCXl5d2FybmluZygiTUVTU0FHRVRBQkxFIG5vdCBzdXBwb3J0ZWQgaW4gMTYtYml0IG1vZGUiKTsKKwkJJCQgPSBuZXdfbWVzc2FnZXRhYmxlKGxvYWRfZmlsZSgkMikpOworCQl9CisJOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUkNEYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworcmNkYXRhCTogUkNEQVRBIGxvYWRtZW1vcHRzIG9wdF9sdmMgcmF3X2RhdGEgeworCQkkJCA9IG5ld19yY2RhdGEoJDQsICQyKTsKKwkJaWYoJDMpCisJCXsKKwkJCSQkLT5sdmMgPSAqKCQzKTsKKwkJCWZyZWUoJDMpOworCQl9CisJCWlmKCEkJC0+bHZjLmxhbmd1YWdlKQorCQkJJCQtPmx2Yy5sYW5ndWFnZSA9IGR1cF9sYW5ndWFnZShjdXJyZW50bGFuZ3VhZ2UpOworCQl9CisJOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVXNlclR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit1c2VycmVzCTogdXNlcnR5cGUgbG9hZG1lbW9wdHMgRklMRU5BTUUJeyAkJCA9IG5ld191c2VyKCQxLCBsb2FkX2ZpbGUoJDMpLCAkMik7IH0KKwl8IHVzZXJ0eXBlIGxvYWRtZW1vcHRzIHJhd19kYXRhCXsgJCQgPSBuZXdfdXNlcigkMSwgJDMsICQyKTsgfQorCTsKKworLyogTk9URTogVGhpcyBoZXJlIGlzIGFuIGV4Y2VwdGlvbiB3aGVyZSBJIGRvIG5vdCBhbGxvdyBhbiBleHByZXNzaW9uLgorICogUmVhc29uIGZvciB0aGlzIGlzIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHNldCB0aGUgJ3l5d2YnIGNvbmRpdGlvbgorICogZm9yIGZsZXggaWYgbG9hZG1lbW9wdHMgaXMgZW1wdHkuIFJlYWRpbmcgYW4gZXhwcmVzc2lvbiByZXF1aXJlcyBhCisgKiBsb29rYWhlYWQgdG8gZGV0ZXJtaW5lIGl0cyBlbmQuIEluIHRoaXMgY2FzZSBoZXJlLCB0aGF0IHdvdWxkIG1lYW4gdGhhdAorICogdGhlIGZpbGVuYW1lIGhhcyBiZWVuIHJlYWQgYXMgSURFTlQgb3IgdFNUUklORywgd2hpY2ggaXMgaW5jb3JyZWN0LgorICogTm90ZSBhbHNvIHRoYXQgSURFTlQgY2Fubm90IGJlIHVzZWQgYXMgYSBmaWxlLW5hbWUgYmVjYXVzZSBpdCBpcyBsYWNraW5nCisgKiB0aGUgJy4nLgorICovCisKKy8qIEkgYWxzbyBhbGxvdyBzdHJpbmcgaWRlbnRpZmllcnMgYXMgY2xhc3N0eXBlcy4gTm90IE1TIGltcGxlbWVudGVkLCBidXQKKyAqIHNlZW1zIHRvIGJlIHJlYXNvbmFibGUgdG8gaW1wbGVtZW50LgorICovCisvKiBBbGxvd2luZyBhbnl0aGluZyBlbHNlIHRoYW4gTlVNQkVSIG1ha2VzIGl0IHZlcnkgaGFyZCB0byBnZXQgcmlkIG9mCisgKiBwcm90b3R5cGVzLiBTbywgSSByZW1vdmUgSURFTlQgdG8gYmUgYWJsZSB0byBnZXQgcHJvdG90eXBlcyBvdXQgb2YgdGhlCisgKiB3b3JsZC4KKyAqLwordXNlcnR5cGU6IE5VTUJFUiB7CisJCSQkID0gbmV3X25hbWVfaWQoKTsKKwkJJCQtPnR5cGUgPSBuYW1lX29yZDsKKwkJJCQtPm5hbWUuaV9uYW1lID0gJDE7CisJCXNldF95eXdmKCk7CisJCX0KKy8qCXwgSURFTlQgeworCQkkJCA9IG5ld19uYW1lX2lkKCk7CisJCSQkLT50eXBlID0gbmFtZV9zdHI7CisJCSQkLT5uYW1lLnNfbmFtZSA9ICQxOworCQlzZXRfeXl3ZigpOworCQl9CisqLwl8IHRTVFJJTkcgeworCQkkJCA9IG5ld19uYW1lX2lkKCk7CisJCSQkLT50eXBlID0gbmFtZV9zdHI7CisJCSQkLT5uYW1lLnNfbmFtZSA9ICQxOworCQlzZXRfeXl3ZigpOworCQl9CisJOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQWNjZWxlcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCithY2NlbGVyYXRvcnMKKwk6IEFDQ0VMRVJBVE9SUyBsb2FkbWVtb3B0cyBvcHRfbHZjIHRCRUdJTiBldmVudHMgdEVORCB7CisJCSQkID0gbmV3X2FjY2VsZXJhdG9yKCk7CisJCWlmKCQyKQorCQl7CisJCQkkJC0+bWVtb3B0ID0gKigkMik7CisJCQlmcmVlKCQyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCSQkLT5tZW1vcHQgPSBXUkNfTU9fTU9WRUFCTEUgfCBXUkNfTU9fUFVSRTsKKwkJfQorCQlpZighJDUpCisJCQl5eWVycm9yKCJBY2NlbGVyYXRvciB0YWJsZSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGVudHJ5Iik7CisJCSQkLT5ldmVudHMgPSBnZXRfZXZlbnRfaGVhZCgkNSk7CisJCWlmKCQzKQorCQl7CisJCQkkJC0+bHZjID0gKigkMyk7CisJCQlmcmVlKCQzKTsKKwkJfQorCQlpZighJCQtPmx2Yy5sYW5ndWFnZSkKKwkJCSQkLT5sdmMubGFuZ3VhZ2UgPSBkdXBfbGFuZ3VhZ2UoY3VycmVudGxhbmd1YWdlKTsKKwkJfQorCTsKKworZXZlbnRzCTogLyogRW1wdHkgKi8gCQkJCXsgJCQ9TlVMTDsgfQorCXwgZXZlbnRzIHRTVFJJTkcgJywnIGV4cHIgYWNjX29wdAl7ICQkPWFkZF9zdHJpbmdfZXZlbnQoJDIsICQ0LCAkNSwgJDEpOyB9CisJfCBldmVudHMgZXhwciAnLCcgZXhwciBhY2Nfb3B0CQl7ICQkPWFkZF9ldmVudCgkMiwgJDQsICQ1LCAkMSk7IH0KKwk7CisKK2FjY19vcHQJOiAvKiBFbXB0eSAqLwkJeyAkJD0wOyB9CisJfCBhY2Nfb3B0ICcsJyBOT0lOVkVSVCAJeyAkJD0kMSB8IFdSQ19BRl9OT0lOVkVSVDsgfQorCXwgYWNjX29wdCAnLCcgU0hJRlQJeyAkJD0kMSB8IFdSQ19BRl9TSElGVDsgfQorCXwgYWNjX29wdCAnLCcgQ09OVFJPTAl7ICQkPSQxIHwgV1JDX0FGX0NPTlRST0w7IH0KKwl8IGFjY19vcHQgJywnIEFMVAl7ICQkPSQxIHwgV1JDX0FGX0FMVDsgfQorCXwgYWNjX29wdCAnLCcgQVNDSUkJeyAkJD0kMSB8IFdSQ19BRl9BU0NJSTsgfQorCXwgYWNjX29wdCAnLCcgVklSVEtFWQl7ICQkPSQxIHwgV1JDX0FGX1ZJUlRLRVk7IH0KKwk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEaWFsb2cgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBGSVhNRTogU3VwcG9ydCBFWFNUWUxFIGluIHRoZSBkaWFsb2cgbGluZSBpdHNlbGYgKi8KK2RpYWxvZwk6IERJQUxPRyBsb2FkbWVtb3B0cyBleHByICcsJyBleHByICcsJyBleHByICcsJyBleHByIGRsZ19hdHRyaWJ1dGVzCisJICB0QkVHSU4gIGN0cmxzIHRFTkQgeworCQlpZigkMikKKwkJeworCQkJJDEwLT5tZW1vcHQgPSAqKCQyKTsKKwkJCWZyZWUoJDIpOworCQl9CisJCWVsc2UKKwkJCSQxMC0+bWVtb3B0ID0gV1JDX01PX01PVkVBQkxFIHwgV1JDX01PX1BVUkUgfCBXUkNfTU9fRElTQ0FSREFCTEU7CisJCSQxMC0+eCA9ICQzOworCQkkMTAtPnkgPSAkNTsKKwkJJDEwLT53aWR0aCA9ICQ3OworCQkkMTAtPmhlaWdodCA9ICQ5OworCQkkMTAtPmNvbnRyb2xzID0gZ2V0X2NvbnRyb2xfaGVhZCgkMTIpOworCQkkJCA9ICQxMDsKKwkJaWYoISQkLT5nb3RzdHlsZSkKKwkJeworCQkJJCQtPnN0eWxlID0gV1NfUE9QVVA7CisJCQkkJC0+Z290c3R5bGUgPSBUUlVFOworCQl9CisJCWlmKCQkLT50aXRsZSkKKwkJCSQkLT5zdHlsZSB8PSBXU19DQVBUSU9OOworCQlpZigkJC0+Zm9udCkKKwkJCSQkLT5zdHlsZSB8PSBEU19TRVRGT05UOworCQlpbmRpYWxvZyA9IEZBTFNFOworCQlpZighJCQtPmx2Yy5sYW5ndWFnZSkKKwkJCSQkLT5sdmMubGFuZ3VhZ2UgPSBkdXBfbGFuZ3VhZ2UoY3VycmVudGxhbmd1YWdlKTsKKwkJfQorCTsKKworZGxnX2F0dHJpYnV0ZXMKKwk6IC8qIEVtcHR5ICovCQkJeyAkJD1uZXdfZGlhbG9nKCk7IH0KKwl8IGRsZ19hdHRyaWJ1dGVzIFNUWUxFIGV4cHIJeyAkJD1kaWFsb2dfc3R5bGUoJDMsJDEpOyB9CisJfCBkbGdfYXR0cmlidXRlcyBFWFNUWUxFIGV4cHIJeyAkJD1kaWFsb2dfZXhzdHlsZSgkMywkMSk7IH0KKwl8IGRsZ19hdHRyaWJ1dGVzIENBUFRJT04gdFNUUklORyB7ICQkPWRpYWxvZ19jYXB0aW9uKCQzLCQxKTsgfQorCXwgZGxnX2F0dHJpYnV0ZXMgb3B0X2ZvbnQJeyAkJD1kaWFsb2dfZm9udCgkMiwkMSk7IH0KKwl8IGRsZ19hdHRyaWJ1dGVzIENMQVNTIG5hbWVpZAl7ICQkPWRpYWxvZ19jbGFzcygkMywkMSk7IH0KKwl8IGRsZ19hdHRyaWJ1dGVzIE1FTlUgbmFtZWlkCXsgJCQ9ZGlhbG9nX21lbnUoJDMsJDEpOyB9CisJfCBkbGdfYXR0cmlidXRlcyBvcHRfbGFuZ3VhZ2UJeyAkJD1kaWFsb2dfbGFuZ3VhZ2UoJDIsJDEpOyB9CisJfCBkbGdfYXR0cmlidXRlcyBvcHRfY2hhcmFjdHMJeyAkJD1kaWFsb2dfY2hhcmFjdGVyaXN0aWNzKCQyLCQxKTsgfQorCXwgZGxnX2F0dHJpYnV0ZXMgb3B0X3ZlcnNpb24JeyAkJD1kaWFsb2dfdmVyc2lvbigkMiwkMSk7IH0KKwk7CisKK2N0cmxzCTogLyogRW1wdHkgKi8JCQkJeyAkJCA9IE5VTEw7IH0KKwl8IGN0cmxzIENPTlRST0wJCWdlbl9jdHJsCXsgJCQ9aW5zX2N0cmwoLTEsIDAsICQzLCAkMSk7IH0KKwl8IGN0cmxzIEVESVRURVhUCWN0cmxfZGVzYwl7ICQkPWluc19jdHJsKENUX0VESVQsIDAsICQzLCAkMSk7IH0KKwl8IGN0cmxzIExJU1RCT1gJCWN0cmxfZGVzYwl7ICQkPWluc19jdHJsKENUX0xJU1RCT1gsIDAsICQzLCAkMSk7IH0KKwl8IGN0cmxzIENPTUJPQk9YCWN0cmxfZGVzYwl7ICQkPWluc19jdHJsKENUX0NPTUJPQk9YLCAwLCAkMywgJDEpOyB9CisJfCBjdHJscyBTQ1JPTExCQVIJY3RybF9kZXNjCXsgJCQ9aW5zX2N0cmwoQ1RfU0NST0xMQkFSLCAwLCAkMywgJDEpOyB9CisJfCBjdHJscyBDSEVDS0JPWAlsYWJfY3RybAl7ICQkPWluc19jdHJsKENUX0JVVFRPTiwgQlNfQ0hFQ0tCT1gsICQzLCAkMSk7IH0KKwl8IGN0cmxzIERFRlBVU0hCVVRUT04JbGFiX2N0cmwJeyAkJD1pbnNfY3RybChDVF9CVVRUT04sIEJTX0RFRlBVU0hCVVRUT04sICQzLCAkMSk7IH0KKwl8IGN0cmxzIEdST1VQQk9YCWxhYl9jdHJsCXsgJCQ9aW5zX2N0cmwoQ1RfQlVUVE9OLCBCU19HUk9VUEJPWCwgJDMsICQxKTt9CisJfCBjdHJscyBQVVNIQlVUVE9OCWxhYl9jdHJsCXsgJCQ9aW5zX2N0cmwoQ1RfQlVUVE9OLCBCU19QVVNIQlVUVE9OLCAkMywgJDEpOyB9CisvKgl8IGN0cmxzIFBVU0hCT1gJCWxhYl9jdHJsCXsgJCQ9aW5zX2N0cmwoQ1RfQlVUVE9OLCBCU19QVVNIQk9YLCAkMywgJDEpOyB9ICovCisJfCBjdHJscyBSQURJT0JVVFRPTglsYWJfY3RybAl7ICQkPWluc19jdHJsKENUX0JVVFRPTiwgQlNfUkFESU9CVVRUT04sICQzLCAkMSk7IH0KKwl8IGN0cmxzIEFVVE8zU1RBVEUJbGFiX2N0cmwJeyAkJD1pbnNfY3RybChDVF9CVVRUT04sIEJTX0FVVE8zU1RBVEUsICQzLCAkMSk7IH0KKwl8IGN0cmxzIFNUQVRFMwkJbGFiX2N0cmwJeyAkJD1pbnNfY3RybChDVF9CVVRUT04sIEJTXzNTVEFURSwgJDMsICQxKTsgfQorCXwgY3RybHMgQVVUT0NIRUNLQk9YCWxhYl9jdHJsCXsgJCQ9aW5zX2N0cmwoQ1RfQlVUVE9OLCBCU19BVVRPQ0hFQ0tCT1gsICQzLCAkMSk7IH0KKwl8IGN0cmxzIEFVVE9SQURJT0JVVFRPTiBsYWJfY3RybAl7ICQkPWluc19jdHJsKENUX0JVVFRPTiwgQlNfQVVUT1JBRElPQlVUVE9OLCAkMywgJDEpOyB9CisJfCBjdHJscyBMVEVYVAkJbGFiX2N0cmwJeyAkJD1pbnNfY3RybChDVF9TVEFUSUMsIFNTX0xFRlQsICQzLCAkMSk7IH0KKwl8IGN0cmxzIENURVhUCQlsYWJfY3RybAl7ICQkPWluc19jdHJsKENUX1NUQVRJQywgU1NfQ0VOVEVSLCAkMywgJDEpOyB9CisJfCBjdHJscyBSVEVYVAkJbGFiX2N0cmwJeyAkJD1pbnNfY3RybChDVF9TVEFUSUMsIFNTX1JJR0hULCAkMywgJDEpOyB9CisJLyogc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGljb25zLCBhcyB0aGUgZXh0ZW50IGlzIG9wdGlvbmFsICovCisJfCBjdHJscyBJQ09OIHRTVFJJTkcgJywnIGV4cHIgJywnIGV4cHIgJywnIGV4cHIgaWNvbmluZm8geworCQkkMTAtPnRpdGxlID0gJDM7CisJCSQxMC0+aWQgPSAkNTsKKwkJJDEwLT54ID0gJDc7CisJCSQxMC0+eSA9ICQ5OworCQkkJCA9IGluc19jdHJsKENUX1NUQVRJQywgU1NfSUNPTiwgJDEwLCAkMSk7CisJCX0KKwk7CisKK2xhYl9jdHJsCisJOiB0U1RSSU5HICcsJyBleHByICcsJyBleHByICcsJyBleHByICcsJyBleHByICcsJyBleHByIG9wdGlvbmFsX3N0eWxlIHsKKwkJJCQ9bmV3X2NvbnRyb2woKTsKKwkJJCQtPnRpdGxlID0gJDE7CisJCSQkLT5pZCA9ICQzOworCQkkJC0+eCA9ICQ1OworCQkkJC0+eSA9ICQ3OworCQkkJC0+d2lkdGggPSAkOTsKKwkJJCQtPmhlaWdodCA9ICQxMTsKKwkJaWYoJDEyKQorCQl7CisJCQkkJC0+c3R5bGUgPSAqKCQxMik7CisJCQkkJC0+Z290c3R5bGUgPSBUUlVFOworCQkJZnJlZSgkMTIpOworCQl9CisJCX0KKwk7CisKK2N0cmxfZGVzYworCTogZXhwciAnLCcgZXhwciAnLCcgZXhwciAnLCcgZXhwciAnLCcgZXhwciBvcHRpb25hbF9zdHlsZSB7CisJCSQkID0gbmV3X2NvbnRyb2woKTsKKwkJJCQtPmlkID0gJDE7CisJCSQkLT54ID0gJDM7CisJCSQkLT55ID0gJDU7CisJCSQkLT53aWR0aCA9ICQ3OworCQkkJC0+aGVpZ2h0ID0gJDk7CisJCWlmKCQxMCkKKwkJeworCQkJJCQtPnN0eWxlID0gKigkMTApOworCQkJJCQtPmdvdHN0eWxlID0gVFJVRTsKKwkJCWZyZWUoJDEwKTsKKwkJfQorCQl9CisJOworCitpY29uaW5mbzogLyogRW1wdHkgKi8KKwkJeyAkJCA9IG5ld19jb250cm9sKCk7IH0KKworCXwgJywnIGV4cHIgJywnIGV4cHIgeworCQkkJCA9IG5ld19jb250cm9sKCk7CisJCSQkLT53aWR0aCA9ICQyOworCQkkJC0+aGVpZ2h0ID0gJDQ7CisJCX0KKwl8ICcsJyBleHByICcsJyBleHByICcsJyBleHByIHsKKwkJJCQgPSBuZXdfY29udHJvbCgpOworCQkkJC0+d2lkdGggPSAkMjsKKwkJJCQtPmhlaWdodCA9ICQ0OworCQkkJC0+c3R5bGUgPSAkNjsKKwkJJCQtPmdvdHN0eWxlID0gVFJVRTsKKwkJfQorCXwgJywnIGV4cHIgJywnIGV4cHIgJywnIGV4cHIgJywnIGV4cHIgeworCQkkJCA9IG5ld19jb250cm9sKCk7CisJCSQkLT53aWR0aCA9ICQyOworCQkkJC0+aGVpZ2h0ID0gJDQ7CisJCSQkLT5zdHlsZSA9ICQ2OworCQkkJC0+Z290c3R5bGUgPSBUUlVFOworCQkkJC0+ZXhzdHlsZSA9ICQ4OworCQkkJC0+Z290ZXhzdHlsZSA9IFRSVUU7CisJCX0KKwk7CisKK2dlbl9jdHJsOiB0U1RSSU5HICcsJyBleHByICcsJyBjdGxjbGFzcyAnLCcgZXhwciAnLCcgZXhwciAnLCcgZXhwciAnLCcgZXhwciAnLCcgZXhwciAnLCcgZXhwciB7CisJCSQkPW5ld19jb250cm9sKCk7CisJCSQkLT50aXRsZSA9ICQxOworCQkkJC0+aWQgPSAkMzsKKwkJJCQtPmN0bGNsYXNzID0gY29udmVydF9jdGxjbGFzcygkNSk7CisJCSQkLT5zdHlsZSA9ICQ3OworCQkkJC0+Z290c3R5bGUgPSBUUlVFOworCQkkJC0+eCA9ICQ5OworCQkkJC0+eSA9ICQxMTsKKwkJJCQtPndpZHRoID0gJDEzOworCQkkJC0+aGVpZ2h0ID0gJDE1OworCQkkJC0+ZXhzdHlsZSA9ICQxNzsKKwkJJCQtPmdvdGV4c3R5bGUgPSBUUlVFOworCQl9CisJfCB0U1RSSU5HICcsJyBleHByICcsJyBjdGxjbGFzcyAnLCcgZXhwciAnLCcgZXhwciAnLCcgZXhwciAnLCcgZXhwciAnLCcgZXhwciB7CisJCSQkPW5ld19jb250cm9sKCk7CisJCSQkLT50aXRsZSA9ICQxOworCQkkJC0+aWQgPSAkMzsKKwkJJCQtPmN0bGNsYXNzID0gY29udmVydF9jdGxjbGFzcygkNSk7CisJCSQkLT5zdHlsZSA9ICQ3OworCQkkJC0+Z290c3R5bGUgPSBUUlVFOworCQkkJC0+eCA9ICQ5OworCQkkJC0+eSA9ICQxMTsKKwkJJCQtPndpZHRoID0gJDEzOworCQkkJC0+aGVpZ2h0ID0gJDE1OworCQl9CisJOworCitvcHRfZm9udAorCTogRk9OVCBleHByICcsJyB0U1RSSU5HCXsgJCQgPSBuZXdfZm9udF9pZCgkMiwgJDQsIDAsIDApOyB9CisJOworCitvcHRpb25hbF9zdHlsZQkJLyogQWJidXNlZCBvbmNlIHRvIGdldCBvcHRpb25hbCBFeFN0eWxlICovCisJOiAvKiBFbXB0eSAqLwl7ICQkID0gTlVMTDsgfQorCXwgJywnIGV4cHIJeyAkJCA9IG5ld19pbnQoJDIpOyB9CisJOworCitjdGxjbGFzcworCTogZXhwcgl7CisJCSQkID0gbmV3X25hbWVfaWQoKTsKKwkJJCQtPnR5cGUgPSBuYW1lX29yZDsKKwkJJCQtPm5hbWUuaV9uYW1lID0gJDE7CisJCX0KKwl8IHRTVFJJTkcgeworCQkkJCA9IG5ld19uYW1lX2lkKCk7CisJCSQkLT50eXBlID0gbmFtZV9zdHI7CisJCSQkLT5uYW1lLnNfbmFtZSA9ICQxOworCQl9CisJOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGlhbG9nRXggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitkaWFsb2dleDogRElBTE9HRVggbG9hZG1lbW9wdHMgZXhwciAnLCcgZXhwciAnLCcgZXhwciAnLCcgZXhwciBoZWxwaWQgZGxnZXhfYXR0cmlicworCSAgdEJFR0lOICBleGN0cmxzIHRFTkQgeworCQlpZighd2luMzIpCisJCQl5eXdhcm5pbmcoIkRJQUxPR0VYIG5vdCBzdXBwb3J0ZWQgaW4gMTYtYml0IG1vZGUiKTsKKwkJaWYoJDIpCisJCXsKKwkJCSQxMS0+bWVtb3B0ID0gKigkMik7CisJCQlmcmVlKCQyKTsKKwkJfQorCQllbHNlCisJCQkkMTEtPm1lbW9wdCA9IFdSQ19NT19NT1ZFQUJMRSB8IFdSQ19NT19QVVJFIHwgV1JDX01PX0RJU0NBUkRBQkxFOworCQkkMTEtPnggPSAkMzsKKwkJJDExLT55ID0gJDU7CisJCSQxMS0+d2lkdGggPSAkNzsKKwkJJDExLT5oZWlnaHQgPSAkOTsKKwkJaWYoJDEwKQorCQl7CisJCQkkMTEtPmhlbHBpZCA9ICooJDEwKTsKKwkJCSQxMS0+Z290aGVscGlkID0gVFJVRTsKKwkJCWZyZWUoJDEwKTsKKwkJfQorCQkkMTEtPmNvbnRyb2xzID0gZ2V0X2NvbnRyb2xfaGVhZCgkMTMpOworCQkkJCA9ICQxMTsKKwkJaWYoISQkLT5nb3RzdHlsZSkKKwkJeworCQkJJCQtPnN0eWxlID0gV1NfUE9QVVA7CisJCQkkJC0+Z290c3R5bGUgPSBUUlVFOworCQl9CisJCWlmKCQkLT50aXRsZSkKKwkJCSQkLT5zdHlsZSB8PSBXU19DQVBUSU9OOworCQlpZigkJC0+Zm9udCkKKwkJCSQkLT5zdHlsZSB8PSBEU19TRVRGT05UOworCQlpbmRpYWxvZyA9IEZBTFNFOworCQlpZighJCQtPmx2Yy5sYW5ndWFnZSkKKwkJCSQkLT5sdmMubGFuZ3VhZ2UgPSBkdXBfbGFuZ3VhZ2UoY3VycmVudGxhbmd1YWdlKTsKKwkJfQorCTsKKworZGxnZXhfYXR0cmlicworCTogLyogRW1wdHkgKi8JCQl7ICQkPW5ld19kaWFsb2dleCgpOyB9CisJfCBkbGdleF9hdHRyaWJzIFNUWUxFIGV4cHIJeyAkJD1kaWFsb2dleF9zdHlsZSgkMywkMSk7IH0KKwl8IGRsZ2V4X2F0dHJpYnMgRVhTVFlMRSBleHByCXsgJCQ9ZGlhbG9nZXhfZXhzdHlsZSgkMywkMSk7IH0KKwl8IGRsZ2V4X2F0dHJpYnMgQ0FQVElPTiB0U1RSSU5HIHsgJCQ9ZGlhbG9nZXhfY2FwdGlvbigkMywkMSk7IH0KKwl8IGRsZ2V4X2F0dHJpYnMgb3B0X2V4Zm9udAl7ICQkPWRpYWxvZ2V4X2ZvbnQoJDIsJDEpOyB9CisJfCBkbGdleF9hdHRyaWJzIENMQVNTIG5hbWVpZAl7ICQkPWRpYWxvZ2V4X2NsYXNzKCQzLCQxKTsgfQorCXwgZGxnZXhfYXR0cmlicyBNRU5VIG5hbWVpZAl7ICQkPWRpYWxvZ2V4X21lbnUoJDMsJDEpOyB9CisJfCBkbGdleF9hdHRyaWJzIG9wdF9sYW5ndWFnZQl7ICQkPWRpYWxvZ2V4X2xhbmd1YWdlKCQyLCQxKTsgfQorCXwgZGxnZXhfYXR0cmlicyBvcHRfY2hhcmFjdHMJeyAkJD1kaWFsb2dleF9jaGFyYWN0ZXJpc3RpY3MoJDIsJDEpOyB9CisJfCBkbGdleF9hdHRyaWJzIG9wdF92ZXJzaW9uCXsgJCQ9ZGlhbG9nZXhfdmVyc2lvbigkMiwkMSk7IH0KKwk7CisKK2V4Y3RybHMJOiAvKiBFbXB0eSAqLwkJCQl7ICQkID0gTlVMTDsgfQorCXwgZXhjdHJscyBDT05UUk9MCWdlbl9leGN0cmwJeyAkJD1pbnNfY3RybCgtMSwgMCwgJDMsICQxKTsgfQorCXwgZXhjdHJscyBFRElUVEVYVAlleGN0cmxfZGVzYwl7ICQkPWluc19jdHJsKENUX0VESVQsIDAsICQzLCAkMSk7IH0KKwl8IGV4Y3RybHMgTElTVEJPWAlleGN0cmxfZGVzYwl7ICQkPWluc19jdHJsKENUX0xJU1RCT1gsIDAsICQzLCAkMSk7IH0KKwl8IGV4Y3RybHMgQ09NQk9CT1gJZXhjdHJsX2Rlc2MJeyAkJD1pbnNfY3RybChDVF9DT01CT0JPWCwgMCwgJDMsICQxKTsgfQorCXwgZXhjdHJscyBTQ1JPTExCQVIJZXhjdHJsX2Rlc2MJeyAkJD1pbnNfY3RybChDVF9TQ1JPTExCQVIsIDAsICQzLCAkMSk7IH0KKwl8IGV4Y3RybHMgQ0hFQ0tCT1gJbGFiX2V4Y3RybAl7ICQkPWluc19jdHJsKENUX0JVVFRPTiwgQlNfQ0hFQ0tCT1gsICQzLCAkMSk7IH0KKwl8IGV4Y3RybHMgREVGUFVTSEJVVFRPTglsYWJfZXhjdHJsCXsgJCQ9aW5zX2N0cmwoQ1RfQlVUVE9OLCBCU19ERUZQVVNIQlVUVE9OLCAkMywgJDEpOyB9CisJfCBleGN0cmxzIEdST1VQQk9YCWxhYl9leGN0cmwJeyAkJD1pbnNfY3RybChDVF9CVVRUT04sIEJTX0dST1VQQk9YLCAkMywgJDEpO30KKwl8IGV4Y3RybHMgUFVTSEJVVFRPTglsYWJfZXhjdHJsCXsgJCQ9aW5zX2N0cmwoQ1RfQlVUVE9OLCBCU19QVVNIQlVUVE9OLCAkMywgJDEpOyB9CisvKgl8IGV4Y3RybHMgUFVTSEJPWAlsYWJfZXhjdHJsCXsgJCQ9aW5zX2N0cmwoQ1RfQlVUVE9OLCBCU19QVVNIQk9YLCAkMywgJDEpOyB9ICovCisJfCBleGN0cmxzIFJBRElPQlVUVE9OCWxhYl9leGN0cmwJeyAkJD1pbnNfY3RybChDVF9CVVRUT04sIEJTX1JBRElPQlVUVE9OLCAkMywgJDEpOyB9CisJfCBleGN0cmxzIEFVVE8zU1RBVEUJbGFiX2V4Y3RybAl7ICQkPWluc19jdHJsKENUX0JVVFRPTiwgQlNfQVVUTzNTVEFURSwgJDMsICQxKTsgfQorCXwgZXhjdHJscyBTVEFURTMJbGFiX2V4Y3RybAl7ICQkPWluc19jdHJsKENUX0JVVFRPTiwgQlNfM1NUQVRFLCAkMywgJDEpOyB9CisJfCBleGN0cmxzIEFVVE9DSEVDS0JPWAlsYWJfZXhjdHJsCXsgJCQ9aW5zX2N0cmwoQ1RfQlVUVE9OLCBCU19BVVRPQ0hFQ0tCT1gsICQzLCAkMSk7IH0KKwl8IGV4Y3RybHMgQVVUT1JBRElPQlVUVE9OIGxhYl9leGN0cmwJeyAkJD1pbnNfY3RybChDVF9CVVRUT04sIEJTX0FVVE9SQURJT0JVVFRPTiwgJDMsICQxKTsgfQorCXwgZXhjdHJscyBMVEVYVAkJbGFiX2V4Y3RybAl7ICQkPWluc19jdHJsKENUX1NUQVRJQywgU1NfTEVGVCwgJDMsICQxKTsgfQorCXwgZXhjdHJscyBDVEVYVAkJbGFiX2V4Y3RybAl7ICQkPWluc19jdHJsKENUX1NUQVRJQywgU1NfQ0VOVEVSLCAkMywgJDEpOyB9CisJfCBleGN0cmxzIFJURVhUCQlsYWJfZXhjdHJsCXsgJCQ9aW5zX2N0cmwoQ1RfU1RBVElDLCBTU19SSUdIVCwgJDMsICQxKTsgfQorCS8qIHNwZWNpYWwgdHJlYXRtZW50IGZvciBpY29ucywgYXMgdGhlIGV4dGVudCBpcyBvcHRpb25hbCAqLworCXwgZXhjdHJscyBJQ09OIHRTVFJJTkcgJywnIGV4cHIgJywnIGV4cHIgJywnIGV4cHIgaWNvbmluZm8geworCQkkMTAtPnRpdGxlID0gJDM7CisJCSQxMC0+aWQgPSAkNTsKKwkJJDEwLT54ID0gJDc7CisJCSQxMC0+eSA9ICQ5OworCQkkJCA9IGluc19jdHJsKENUX1NUQVRJQywgU1NfSUNPTiwgJDEwLCAkMSk7CisJCX0KKwk7CisKK2dlbl9leGN0cmwKKwk6IHRTVFJJTkcgJywnIGV4cHIgJywnIGN0bGNsYXNzICcsJyBleHByICcsJyBleHByICcsJyBleHByICcsJyBleHByICcsJworCSAgZXhwciAnLCcgZV9leHByIGhlbHBpZCBvcHRfZGF0YSB7CisJCSQkPW5ld19jb250cm9sKCk7CisJCSQkLT50aXRsZSA9ICQxOworCQkkJC0+aWQgPSAkMzsKKwkJJCQtPmN0bGNsYXNzID0gY29udmVydF9jdGxjbGFzcygkNSk7CisJCSQkLT5zdHlsZSA9ICQ3OworCQkkJC0+Z290c3R5bGUgPSBUUlVFOworCQkkJC0+eCA9ICQ5OworCQkkJC0+eSA9ICQxMTsKKwkJJCQtPndpZHRoID0gJDEzOworCQkkJC0+aGVpZ2h0ID0gJDE1OworCQlpZigkMTcpCisJCXsKKwkJCSQkLT5leHN0eWxlID0gKigkMTcpOworCQkJJCQtPmdvdGV4c3R5bGUgPSBUUlVFOworCQkJZnJlZSgkMTcpOworCQl9CisJCWlmKCQxOCkKKwkJeworCQkJJCQtPmhlbHBpZCA9ICooJDE4KTsKKwkJCSQkLT5nb3RoZWxwaWQgPSBUUlVFOworCQkJZnJlZSgkMTgpOworCQl9CisJCSQkLT5leHRyYSA9ICQxOTsKKwkJfQorCXwgdFNUUklORyAnLCcgZXhwciAnLCcgY3RsY2xhc3MgJywnIGV4cHIgJywnIGV4cHIgJywnIGV4cHIgJywnIGV4cHIgJywnIGV4cHIgb3B0X2RhdGEgeworCQkkJD1uZXdfY29udHJvbCgpOworCQkkJC0+dGl0bGUgPSAkMTsKKwkJJCQtPmlkID0gJDM7CisJCSQkLT5zdHlsZSA9ICQ3OworCQkkJC0+Z290c3R5bGUgPSBUUlVFOworCQkkJC0+Y3RsY2xhc3MgPSBjb252ZXJ0X2N0bGNsYXNzKCQ1KTsKKwkJJCQtPnggPSAkOTsKKwkJJCQtPnkgPSAkMTE7CisJCSQkLT53aWR0aCA9ICQxMzsKKwkJJCQtPmhlaWdodCA9ICQxNTsKKwkJJCQtPmV4dHJhID0gJDE2OworCQl9CisJOworCitsYWJfZXhjdHJsCisJOiB0U1RSSU5HICcsJyBleHByICcsJyBleHByICcsJyBleHByICcsJyBleHByICcsJyBleHByIG9wdGlvbmFsX3N0eWxlIG9wdF9kYXRhIHsKKwkJJCQ9bmV3X2NvbnRyb2woKTsKKwkJJCQtPnRpdGxlID0gJDE7CisJCSQkLT5pZCA9ICQzOworCQkkJC0+eCA9ICQ1OworCQkkJC0+eSA9ICQ3OworCQkkJC0+d2lkdGggPSAkOTsKKwkJJCQtPmhlaWdodCA9ICQxMTsKKwkJaWYoJDEyKQorCQl7CisJCQkkJC0+c3R5bGUgPSAqKCQxMik7CisJCQkkJC0+Z290c3R5bGUgPSBUUlVFOworCQkJZnJlZSgkMTIpOworCQl9CisJCSQkLT5leHRyYSA9ICQxMzsKKwkJfQorCTsKKworZXhjdHJsX2Rlc2MKKwk6IGV4cHIgJywnIGV4cHIgJywnIGV4cHIgJywnIGV4cHIgJywnIGV4cHIgb3B0aW9uYWxfc3R5bGUgb3B0X2RhdGEgeworCQkkJCA9IG5ld19jb250cm9sKCk7CisJCSQkLT5pZCA9ICQxOworCQkkJC0+eCA9ICQzOworCQkkJC0+eSA9ICQ1OworCQkkJC0+d2lkdGggPSAkNzsKKwkJJCQtPmhlaWdodCA9ICQ5OworCQlpZigkMTApCisJCXsKKwkJCSQkLT5zdHlsZSA9ICooJDEwKTsKKwkJCSQkLT5nb3RzdHlsZSA9IFRSVUU7CisJCQlmcmVlKCQxMCk7CisJCX0KKwkJJCQtPmV4dHJhID0gJDExOworCQl9CisJOworCitvcHRfZGF0YTogLyogRW1wdHkgKi8JeyAkJCA9IE5VTEw7IH0KKwl8IHJhd19kYXRhCXsgJCQgPSAkMTsgfQorCTsKKworaGVscGlkCTogLyogRW1wdHkgKi8JeyAkJCA9IE5VTEw7IH0KKwl8ICcsJyBleHByCXsgJCQgPSBuZXdfaW50KCQyKTsgfQorCTsKKworb3B0X2V4Zm9udAorCTogRk9OVCBleHByICcsJyB0U1RSSU5HICcsJyBleHByICcsJyBleHByCXsgJCQgPSBuZXdfZm9udF9pZCgkMiwgJDQsICQ2LCAkOCk7IH0KKwk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNZW51IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworbWVudQk6IE1FTlUgbG9hZG1lbW9wdHMgb3B0X2x2YyBtZW51X2JvZHkgeworCQlpZighJDQpCisJCQl5eWVycm9yKCJNZW51IG11c3QgY29udGFpbiBpdGVtcyIpOworCQkkJCA9IG5ld19tZW51KCk7CisJCWlmKCQyKQorCQl7CisJCQkkJC0+bWVtb3B0ID0gKigkMik7CisJCQlmcmVlKCQyKTsKKwkJfQorCQllbHNlCisJCQkkJC0+bWVtb3B0ID0gV1JDX01PX01PVkVBQkxFIHwgV1JDX01PX1BVUkUgfCBXUkNfTU9fRElTQ0FSREFCTEU7CisJCSQkLT5pdGVtcyA9IGdldF9pdGVtX2hlYWQoJDQpOworCQlpZigkMykKKwkJeworCQkJJCQtPmx2YyA9ICooJDMpOworCQkJZnJlZSgkMyk7CisJCX0KKwkJaWYoISQkLT5sdmMubGFuZ3VhZ2UpCisJCQkkJC0+bHZjLmxhbmd1YWdlID0gZHVwX2xhbmd1YWdlKGN1cnJlbnRsYW5ndWFnZSk7CisJCX0KKwk7CisKK21lbnVfYm9keQorCTogdEJFR0lOIGl0ZW1fZGVmaW5pdGlvbnMgdEVORAl7ICQkID0gJDI7IH0KKwk7CisKK2l0ZW1fZGVmaW5pdGlvbnMKKwk6IC8qIEVtcHR5ICovCXskJCA9IE5VTEw7fQorCXwgaXRlbV9kZWZpbml0aW9ucyBNRU5VSVRFTSB0U1RSSU5HICcsJyBleHByIGl0ZW1fb3B0aW9ucyB7CisJCSQkPW5ld19tZW51X2l0ZW0oKTsKKwkJJCQtPnByZXYgPSAkMTsKKwkJaWYoJDEpCisJCQkkMS0+bmV4dCA9ICQkOworCQkkJC0+aWQgPSAgJDU7CisJCSQkLT5zdGF0ZSA9ICQ2OworCQkkJC0+bmFtZSA9ICQzOworCQl9CisJfCBpdGVtX2RlZmluaXRpb25zIE1FTlVJVEVNIFNFUEFSQVRPUiB7CisJCSQkPW5ld19tZW51X2l0ZW0oKTsKKwkJJCQtPnByZXYgPSAkMTsKKwkJaWYoJDEpCisJCQkkMS0+bmV4dCA9ICQkOworCQl9CisJfCBpdGVtX2RlZmluaXRpb25zIFBPUFVQIHRTVFJJTkcgaXRlbV9vcHRpb25zIG1lbnVfYm9keSB7CisJCSQkID0gbmV3X21lbnVfaXRlbSgpOworCQkkJC0+cHJldiA9ICQxOworCQlpZigkMSkKKwkJCSQxLT5uZXh0ID0gJCQ7CisJCSQkLT5wb3B1cCA9IGdldF9pdGVtX2hlYWQoJDUpOworCQkkJC0+bmFtZSA9ICQzOworCQl9CisJOworCisvKiBOT1RFOiBpdGVtX29wdGlvbnMgaXMgcmlnaHQgcmVjdXJzaXZlIGJlY2F1c2UgaXQgd291bGQgaW50cm9kdWNlCisgKiBhIHNoaWZ0L3JlZHVjZSBjb25mbGljdCBvbiAnLCcgaW4gaXRlbWV4X29wdGlvbnMgZHVlIHRvIHRoZQorICogZW1wdHkgcnVsZSBoZXJlLiBUaGUgcGFyc2VyIGlzIG5vdyBmb3JjZWQgdG8gbG9vayBiZXlvbmQgdGhlICcsJworICogYmVmb3JlIHJlZHVjaW5nIChmb3JjZSBzaGlmdCkuCisgKiBSaWdodCByZWN1cnNpb24gaGVyZSBpcyBub3QgYSBwcm9ibGVtIGJlY2F1c2Ugd2UgY2Fubm90IGV4cGVjdAorICogbW9yZSB0aGFuIDcgcGFyc2Vyc3RhY2sgcGxhY2VzIHRvIGJlIG9jY3VwaWVkIHdoaWxlIHBhcnNpbmcgdGhpcworICogKHdobyB3b3VsZCB3YW50IHRvIHNwZWNpZnkgYSBNRl94IGZsYWcgdHdpY2U/KS4KKyAqLworaXRlbV9vcHRpb25zCisJOiAvKiBFbXB0eSAqLwkJCXsgJCQgPSAwOyB9CisJfCAnLCcgQ0hFQ0tFRAlpdGVtX29wdGlvbnMJeyAkJCA9ICQzIHwgTUZfQ0hFQ0tFRDsgfQorCXwgJywnIEdSQVlFRAlpdGVtX29wdGlvbnMJeyAkJCA9ICQzIHwgTUZfR1JBWUVEOyB9CisJfCAnLCcgSEVMUAlpdGVtX29wdGlvbnMJeyAkJCA9ICQzIHwgTUZfSEVMUDsgfQorCXwgJywnIElOQUNUSVZFCWl0ZW1fb3B0aW9ucwl7ICQkID0gJDMgfCBNRl9ESVNBQkxFRDsgfQorCXwgJywnIE1FTlVCQVJCUkVBSyBpdGVtX29wdGlvbnMJeyAkJCA9ICQzIHwgTUZfTUVOVUJBUkJSRUFLOyB9CisJfCAnLCcgTUVOVUJSRUFLCWl0ZW1fb3B0aW9ucwl7ICQkID0gJDMgfCBNRl9NRU5VQlJFQUs7IH0KKwk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNZW51RXggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCittZW51ZXgJOiBNRU5VRVggbG9hZG1lbW9wdHMgb3B0X2x2YyBtZW51ZXhfYm9keQl7CisJCWlmKCF3aW4zMikKKwkJCXl5d2FybmluZygiTUVOVUVYIG5vdCBzdXBwb3J0ZWQgaW4gMTYtYml0IG1vZGUiKTsKKwkJaWYoISQ0KQorCQkJeXllcnJvcigiTWVudUV4IG11c3QgY29udGFpbiBpdGVtcyIpOworCQkkJCA9IG5ld19tZW51ZXgoKTsKKwkJaWYoJDIpCisJCXsKKwkJCSQkLT5tZW1vcHQgPSAqKCQyKTsKKwkJCWZyZWUoJDIpOworCQl9CisJCWVsc2UKKwkJCSQkLT5tZW1vcHQgPSBXUkNfTU9fTU9WRUFCTEUgfCBXUkNfTU9fUFVSRSB8IFdSQ19NT19ESVNDQVJEQUJMRTsKKwkJJCQtPml0ZW1zID0gZ2V0X2l0ZW1leF9oZWFkKCQ0KTsKKwkJaWYoJDMpCisJCXsKKwkJCSQkLT5sdmMgPSAqKCQzKTsKKwkJCWZyZWUoJDMpOworCQl9CisJCWlmKCEkJC0+bHZjLmxhbmd1YWdlKQorCQkJJCQtPmx2Yy5sYW5ndWFnZSA9IGR1cF9sYW5ndWFnZShjdXJyZW50bGFuZ3VhZ2UpOworCQl9CisJOworCittZW51ZXhfYm9keQorCTogdEJFR0lOIGl0ZW1leF9kZWZpbml0aW9ucyB0RU5EIHsgJCQgPSAkMjsgfQorCTsKKworaXRlbWV4X2RlZmluaXRpb25zCisJOiAvKiBFbXB0eSAqLwl7JCQgPSBOVUxMOyB9CisJfCBpdGVtZXhfZGVmaW5pdGlvbnMgTUVOVUlURU0gdFNUUklORyBpdGVtZXhfb3B0aW9ucyB7CisJCSQkID0gbmV3X21lbnVleF9pdGVtKCk7CisJCSQkLT5wcmV2ID0gJDE7CisJCWlmKCQxKQorCQkJJDEtPm5leHQgPSAkJDsKKwkJJCQtPm5hbWUgPSAkMzsKKwkJJCQtPmlkID0gJDQtPmlkOworCQkkJC0+dHlwZSA9ICQ0LT50eXBlOworCQkkJC0+c3RhdGUgPSAkNC0+c3RhdGU7CisJCSQkLT5oZWxwaWQgPSAkNC0+aGVscGlkOworCQkkJC0+Z290aWQgPSAkNC0+Z290aWQ7CisJCSQkLT5nb3R0eXBlID0gJDQtPmdvdHR5cGU7CisJCSQkLT5nb3RzdGF0ZSA9ICQ0LT5nb3RzdGF0ZTsKKwkJJCQtPmdvdGhlbHBpZCA9ICQ0LT5nb3RoZWxwaWQ7CisJCWZyZWUoJDQpOworCQl9CisJfCBpdGVtZXhfZGVmaW5pdGlvbnMgTUVOVUlURU0gU0VQQVJBVE9SIHsKKwkJJCQgPSBuZXdfbWVudWV4X2l0ZW0oKTsKKwkJJCQtPnByZXYgPSAkMTsKKwkJaWYoJDEpCisJCQkkMS0+bmV4dCA9ICQkOworCQl9CisJfCBpdGVtZXhfZGVmaW5pdGlvbnMgUE9QVVAgdFNUUklORyBpdGVtZXhfcF9vcHRpb25zIG1lbnVleF9ib2R5IHsKKwkJJCQgPSBuZXdfbWVudWV4X2l0ZW0oKTsKKwkJJCQtPnByZXYgPSAkMTsKKwkJaWYoJDEpCisJCQkkMS0+bmV4dCA9ICQkOworCQkkJC0+cG9wdXAgPSBnZXRfaXRlbWV4X2hlYWQoJDUpOworCQkkJC0+bmFtZSA9ICQzOworCQkkJC0+aWQgPSAkNC0+aWQ7CisJCSQkLT50eXBlID0gJDQtPnR5cGU7CisJCSQkLT5zdGF0ZSA9ICQ0LT5zdGF0ZTsKKwkJJCQtPmhlbHBpZCA9ICQ0LT5oZWxwaWQ7CisJCSQkLT5nb3RpZCA9ICQ0LT5nb3RpZDsKKwkJJCQtPmdvdHR5cGUgPSAkNC0+Z290dHlwZTsKKwkJJCQtPmdvdHN0YXRlID0gJDQtPmdvdHN0YXRlOworCQkkJC0+Z290aGVscGlkID0gJDQtPmdvdGhlbHBpZDsKKwkJZnJlZSgkNCk7CisJCX0KKwk7CisKK2l0ZW1leF9vcHRpb25zCisJOiAvKiBFbXB0eSAqLwkJCXsgJCQgPSBuZXdfaXRlbWV4X29wdCgwLCAwLCAwLCAwKTsgfQorCXwgJywnIGV4cHIgeworCQkkJCA9IG5ld19pdGVtZXhfb3B0KCQyLCAwLCAwLCAwKTsKKwkJJCQtPmdvdGlkID0gVFJVRTsKKwkJfQorCXwgJywnIGVfZXhwciAnLCcgZV9leHByIGl0ZW1fb3B0aW9ucyB7CisJCSQkID0gbmV3X2l0ZW1leF9vcHQoJDIgPyAqKCQyKSA6IDAsICQ0ID8gKigkNCkgOiAwLCAkNSwgMCk7CisJCSQkLT5nb3RpZCA9IFRSVUU7CisJCSQkLT5nb3R0eXBlID0gVFJVRTsKKwkJJCQtPmdvdHN0YXRlID0gVFJVRTsKKwkJaWYoJDIpIGZyZWUoJDIpOworCQlpZigkNCkgZnJlZSgkNCk7CisJCX0KKwl8ICcsJyBlX2V4cHIgJywnIGVfZXhwciAnLCcgZXhwciB7CisJCSQkID0gbmV3X2l0ZW1leF9vcHQoJDIgPyAqKCQyKSA6IDAsICQ0ID8gKigkNCkgOiAwLCAkNiwgMCk7CisJCSQkLT5nb3RpZCA9IFRSVUU7CisJCSQkLT5nb3R0eXBlID0gVFJVRTsKKwkJJCQtPmdvdHN0YXRlID0gVFJVRTsKKwkJaWYoJDIpIGZyZWUoJDIpOworCQlpZigkNCkgZnJlZSgkNCk7CisJCX0KKwk7CisKK2l0ZW1leF9wX29wdGlvbnMKKwk6IC8qIEVtcHR5ICovCQkJeyAkJCA9IG5ld19pdGVtZXhfb3B0KDAsIDAsIDAsIDApOyB9CisJfCAnLCcgZXhwciB7CisJCSQkID0gbmV3X2l0ZW1leF9vcHQoJDIsIDAsIDAsIDApOworCQkkJC0+Z290aWQgPSBUUlVFOworCQl9CisJfCAnLCcgZV9leHByICcsJyBleHByIHsKKwkJJCQgPSBuZXdfaXRlbWV4X29wdCgkMiA/ICooJDIpIDogMCwgJDQsIDAsIDApOworCQlpZigkMikgZnJlZSgkMik7CisJCSQkLT5nb3RpZCA9IFRSVUU7CisJCSQkLT5nb3R0eXBlID0gVFJVRTsKKwkJfQorCXwgJywnIGVfZXhwciAnLCcgZV9leHByICcsJyBleHByIHsKKwkJJCQgPSBuZXdfaXRlbWV4X29wdCgkMiA/ICooJDIpIDogMCwgJDQgPyAqKCQ0KSA6IDAsICQ2LCAwKTsKKwkJaWYoJDIpIGZyZWUoJDIpOworCQlpZigkNCkgZnJlZSgkNCk7CisJCSQkLT5nb3RpZCA9IFRSVUU7CisJCSQkLT5nb3R0eXBlID0gVFJVRTsKKwkJJCQtPmdvdHN0YXRlID0gVFJVRTsKKwkJfQorCXwgJywnIGVfZXhwciAnLCcgZV9leHByICcsJyBlX2V4cHIgJywnIGV4cHIgeworCQkkJCA9IG5ld19pdGVtZXhfb3B0KCQyID8gKigkMikgOiAwLCAkNCA/ICooJDQpIDogMCwgJDYgPyAqKCQ2KSA6IDAsICQ4KTsKKwkJaWYoJDIpIGZyZWUoJDIpOworCQlpZigkNCkgZnJlZSgkNCk7CisJCWlmKCQ2KSBmcmVlKCQ2KTsKKwkJJCQtPmdvdGlkID0gVFJVRTsKKwkJJCQtPmdvdHR5cGUgPSBUUlVFOworCQkkJC0+Z290c3RhdGUgPSBUUlVFOworCQkkJC0+Z290aGVscGlkID0gVFJVRTsKKwkJfQorCTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0cmluZ1RhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogU3RyaW5ndGFibGVzIGFyZSBwYXJzZWQgZGlmZmVyZW50bHkgdGhhbiBvdGhlciByZXNvdXJjZXMgYmVjYXVzZSB0aGVpcgorICogbGF5b3V0IGlzIHN1YnN0YW50aWFsbHkgZGlmZmVyZW50IGZyb20gb3RoZXIgcmVzb3VyY2VzLgorICogVGhlIHRhYmxlIGlzIHBhcnNlZCB0aHJvdWdoIGEgX2dsb2JhbF8gdmFyaWFibGUgJ3RhZ3N0dCcgd2hpY2ggaG9sZHMgdGhlCisgKiBjdXJyZW50IHN0cmluZ3RhYmxlIGRlc2NyaXB0b3IgKHN0cmluZ3RhYmxlX3QgKikgYW5kICdzdHRyZXMnIHRoYXQgaG9sZHMgYQorICogbGlzdCBvZiBzdHJpbmd0YWJsZXMgb2YgZGlmZmVyZW50IGxhbmd1YWdlcy4KKyAqLworc3RyaW5ndGFibGUKKwk6IHN0dF9oZWFkIHRCRUdJTiBzdHJpbmdzIHRFTkQgeworCQlpZighJDMpCisJCXsKKwkJCXl5ZXJyb3IoIlN0cmluZ3RhYmxlIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZW50cnkiKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXN0cmluZ3RhYmxlX3QgKnN0dDsKKwkJCS8qIENoZWNrIGlmIHdlIGFkZGVkIHRvIGEgbGFuZ3VhZ2UgdGFibGUgb3IgY3JlYXRlZAorCQkJICogYSBuZXcgb25lLgorCQkJICovCisJCQkgZm9yKHN0dCA9IHN0dHJlczsgc3R0OyBzdHQgPSBzdHQtPm5leHQpCisJCQkgeworCQkJCWlmKHN0dCA9PSB0YWdzdHQpCisJCQkJCWJyZWFrOworCQkJIH0KKwkJCSBpZighc3R0KQorCQkJIHsKKwkJCQkvKiBJdCBpcyBhIG5ldyBvbmUgKi8KKwkJCQlpZihzdHRyZXMpCisJCQkJeworCQkJCQlzdHRyZXMtPnByZXYgPSB0YWdzdHQ7CisJCQkJCXRhZ3N0dC0+bmV4dCA9IHN0dHJlczsKKwkJCQkJc3R0cmVzID0gdGFnc3R0OworCQkJCX0KKwkJCQllbHNlCisJCQkJCXN0dHJlcyA9IHRhZ3N0dDsKKwkJCSB9CisJCQkgLyogRWxzZSB3ZXJlIGRvbmUgKi8KKwkJfQorCQlpZih0YWdzdHRfbWVtb3B0KQorCQl7CisJCQlmcmVlKHRhZ3N0dF9tZW1vcHQpOworCQkJdGFnc3R0X21lbW9wdCA9IE5VTEw7CisJCX0KKworCQkkJCA9IHRhZ3N0dDsKKwkJfQorCTsKKworLyogVGhpcyBpcyB0byBnZXQgdGhlIGxhbmd1YWdlIG9mIHRoZSBjdXJyZW50bHkgcGFyc2VkIHN0cmluZ3RhYmxlICovCitzdHRfaGVhZDogU1RSSU5HVEFCTEUgbG9hZG1lbW9wdHMgb3B0X2x2YyB7CisJCWlmKCh0YWdzdHQgPSBmaW5kX3N0cmluZ3RhYmxlKCQzKSkgPT0gTlVMTCkKKwkJCXRhZ3N0dCA9IG5ld19zdHJpbmd0YWJsZSgkMyk7CisJCXRhZ3N0dF9tZW1vcHQgPSAkMjsKKwkJdGFnc3R0X3ZlcnNpb24gPSAkMy0+dmVyc2lvbjsKKwkJdGFnc3R0X2NoYXJhY3RzID0gJDMtPmNoYXJhY3RzOworCQlpZigkMykKKwkJCWZyZWUoJDMpOworCQl9CisJOworCitzdHJpbmdzCTogLyogRW1wdHkgKi8JeyAkJCA9IE5VTEw7IH0KKwl8IHN0cmluZ3MgZXhwciBvcHRfY29tbWEgdFNUUklORyB7CisJCWludCBpOworCQlhc3NlcnQodGFnc3R0ICE9IE5VTEwpOworCQkvKiBTZWFyY2ggZm9yIHRoZSBJRCAqLworCQlmb3IoaSA9IDA7IGkgPCB0YWdzdHQtPm5lbnRyaWVzOyBpKyspCisJCXsKKwkJCWlmKHRhZ3N0dC0+ZW50cmllc1tpXS5pZCA9PSAkMikKKwkJCQl5eWVycm9yKCJTdHJpbmd0YWJsZSBJRCAlZCBhbHJlYWR5IGluIHVzZSIsICQyKTsKKwkJfQorCQkvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlbiB3ZSBoYXZlIGEgbmV3IHVuaXF1ZSBlbnRyeSAqLworCQl0YWdzdHQtPm5lbnRyaWVzKys7CisJCXRhZ3N0dC0+ZW50cmllcyA9IHhyZWFsbG9jKHRhZ3N0dC0+ZW50cmllcywgc2l6ZW9mKHRhZ3N0dC0+ZW50cmllc1swXSkgKiB0YWdzdHQtPm5lbnRyaWVzKTsKKwkJdGFnc3R0LT5lbnRyaWVzW3RhZ3N0dC0+bmVudHJpZXMtMV0uaWQgPSAkMjsKKwkJdGFnc3R0LT5lbnRyaWVzW3RhZ3N0dC0+bmVudHJpZXMtMV0uc3RyID0gJDQ7CisJCWlmKHRhZ3N0dF9tZW1vcHQpCisJCQl0YWdzdHQtPmVudHJpZXNbdGFnc3R0LT5uZW50cmllcy0xXS5tZW1vcHQgPSAqdGFnc3R0X21lbW9wdDsKKwkJZWxzZQorCQkJdGFnc3R0LT5lbnRyaWVzW3RhZ3N0dC0+bmVudHJpZXMtMV0ubWVtb3B0ID0gV1JDX01PX01PVkVBQkxFIHwgV1JDX01PX0RJU0NBUkRBQkxFIHwgV1JDX01PX1BVUkU7CisJCXRhZ3N0dC0+ZW50cmllc1t0YWdzdHQtPm5lbnRyaWVzLTFdLnZlcnNpb24gPSB0YWdzdHRfdmVyc2lvbjsKKwkJdGFnc3R0LT5lbnRyaWVzW3RhZ3N0dC0+bmVudHJpZXMtMV0uY2hhcmFjdHMgPSB0YWdzdHRfY2hhcmFjdHM7CisKKwkJaWYoIXdpbjMyICYmICQ0LT5zaXplID4gMjU0KQorCQkJeXllcnJvcigiU3RyaW5ndGFibGUgZW50cnkgbW9yZSB0aGFuIDI1NCBjaGFyYWN0ZXJzIik7CisJCWlmKHdpbjMyICYmICQ0LT5zaXplID4gNjU1MzQpIC8qIEhtbS4uLiwgZG9lcyB0aGlzIGhhcHBlbj8gKi8KKwkJCXl5ZXJyb3IoIlN0cmluZ3RhYmxlIGVudHJ5IG1vcmUgdGhhbiA2NTUzNCBjaGFyYWN0ZXJzIChwcm9iYWJseSBzb21ldGhpbmcgZWxzZSB0aGF0IHdlbnQgd3JvbmcpIik7CisJCSQkID0gdGFnc3R0OworCQl9CisJOworCitvcHRfY29tbWEJLyogVGhlcmUgc2VlbSB0byBiZSB0d28gd2F5cyB0byBzcGVjaWZ5IGEgc3RyaW5ndGFibGUuLi4gKi8KKwk6IC8qIEVtcHR5ICovCisJfCAnLCcKKwk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWZXJzaW9uSW5mbyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZlcnNpb25pbmZvCisJOiBWRVJTSU9OSU5GTyBmaXhfdmVyc2lvbiB0QkVHSU4gdmVyX2Jsb2NrcyB0RU5EIHsKKwkJJCQgPSAkMjsKKwkJJDItPmJsb2NrcyA9IGdldF92ZXJfYmxvY2tfaGVhZCgkNCk7CisJCX0KKwk7CisKK2ZpeF92ZXJzaW9uCisJOiAvKiBFbXB0eSAqLwkJCXsgJCQgPSBuZXdfdmVyc2lvbmluZm8oKTsgfQorCXwgZml4X3ZlcnNpb24gRklMRVZFUlNJT04gZXhwciAnLCcgZXhwciAnLCcgZXhwciAnLCcgZXhwciB7CisJCWlmKCQxLT5nb3RpdC5mdikKKwkJCXl5ZXJyb3IoIkZJTEVWRVJTSU9OIGFscmVhZHkgZGVmaW5lZCIpOworCQkkJCA9ICQxOworCQkkJC0+ZmlsZXZlcl9tYWoxID0gJDM7CisJCSQkLT5maWxldmVyX21hajIgPSAkNTsKKwkJJCQtPmZpbGV2ZXJfbWluMSA9ICQ3OworCQkkJC0+ZmlsZXZlcl9taW4yID0gJDk7CisJCSQkLT5nb3RpdC5mdiA9IDE7CisJCX0KKwl8IGZpeF92ZXJzaW9uIFBST0RVQ1RWRVJTSU9OIGV4cHIgJywnIGV4cHIgJywnIGV4cHIgJywnIGV4cHIgeworCQlpZigkMS0+Z290aXQucHYpCisJCQl5eWVycm9yKCJQUk9EVUNUVkVSU0lPTiBhbHJlYWR5IGRlZmluZWQiKTsKKwkJJCQgPSAkMTsKKwkJJCQtPnByb2R2ZXJfbWFqMSA9ICQzOworCQkkJC0+cHJvZHZlcl9tYWoyID0gJDU7CisJCSQkLT5wcm9kdmVyX21pbjEgPSAkNzsKKwkJJCQtPnByb2R2ZXJfbWluMiA9ICQ5OworCQkkJC0+Z290aXQucHYgPSAxOworCQl9CisJfCBmaXhfdmVyc2lvbiBGSUxFRkxBR1MgZXhwciB7CisJCWlmKCQxLT5nb3RpdC5mZikKKwkJCXl5ZXJyb3IoIkZJTEVGTEFHUyBhbHJlYWR5IGRlZmluZWQiKTsKKwkJJCQgPSAkMTsKKwkJJCQtPmZpbGVmbGFncyA9ICQzOworCQkkJC0+Z290aXQuZmYgPSAxOworCQl9CisJfCBmaXhfdmVyc2lvbiBGSUxFRkxBR1NNQVNLIGV4cHIgeworCQlpZigkMS0+Z290aXQuZmZtKQorCQkJeXllcnJvcigiRklMRUZMQUdTTUFTSyBhbHJlYWR5IGRlZmluZWQiKTsKKwkJJCQgPSAkMTsKKwkJJCQtPmZpbGVmbGFnc21hc2sgPSAkMzsKKwkJJCQtPmdvdGl0LmZmbSA9IDE7CisJCX0KKwl8IGZpeF92ZXJzaW9uIEZJTEVPUyBleHByIHsKKwkJaWYoJDEtPmdvdGl0LmZvKQorCQkJeXllcnJvcigiRklMRU9TIGFscmVhZHkgZGVmaW5lZCIpOworCQkkJCA9ICQxOworCQkkJC0+ZmlsZW9zID0gJDM7CisJCSQkLT5nb3RpdC5mbyA9IDE7CisJCX0KKwl8IGZpeF92ZXJzaW9uIEZJTEVUWVBFIGV4cHIgeworCQlpZigkMS0+Z290aXQuZnQpCisJCQl5eWVycm9yKCJGSUxFVFlQRSBhbHJlYWR5IGRlZmluZWQiKTsKKwkJJCQgPSAkMTsKKwkJJCQtPmZpbGV0eXBlID0gJDM7CisJCSQkLT5nb3RpdC5mdCA9IDE7CisJCX0KKwl8IGZpeF92ZXJzaW9uIEZJTEVTVUJUWVBFIGV4cHIgeworCQlpZigkMS0+Z290aXQuZnN0KQorCQkJeXllcnJvcigiRklMRVNVQlRZUEUgYWxyZWFkeSBkZWZpbmVkIik7CisJCSQkID0gJDE7CisJCSQkLT5maWxlc3VidHlwZSA9ICQzOworCQkkJC0+Z290aXQuZnN0ID0gMTsKKwkJfQorCTsKKwordmVyX2Jsb2NrcworCTogLyogRW1wdHkgKi8JCQl7ICQkID0gTlVMTDsgfQorCXwgdmVyX2Jsb2NrcyB2ZXJfYmxvY2sgeworCQkkJCA9ICQyOworCQkkJC0+cHJldiA9ICQxOworCQlpZigkMSkKKwkJCSQxLT5uZXh0ID0gJCQ7CisJCX0KKwk7CisKK3Zlcl9ibG9jaworCTogQkxPQ0sgdFNUUklORyB0QkVHSU4gdmVyX3ZhbHVlcyB0RU5EIHsKKwkJJCQgPSBuZXdfdmVyX2Jsb2NrKCk7CisJCSQkLT5uYW1lID0gJDI7CisJCSQkLT52YWx1ZXMgPSBnZXRfdmVyX3ZhbHVlX2hlYWQoJDQpOworCQl9CisJOworCit2ZXJfdmFsdWVzCisJOiAvKiBFbXB0eSAqLwkJCXsgJCQgPSBOVUxMOyB9CisJfCB2ZXJfdmFsdWVzIHZlcl92YWx1ZSB7CisJCSQkID0gJDI7CisJCSQkLT5wcmV2ID0gJDE7CisJCWlmKCQxKQorCQkJJDEtPm5leHQgPSAkJDsKKwkJfQorCTsKKwordmVyX3ZhbHVlCisJOiB2ZXJfYmxvY2sgeworCQkkJCA9IG5ld192ZXJfdmFsdWUoKTsKKwkJJCQtPnR5cGUgPSB2YWxfYmxvY2s7CisJCSQkLT52YWx1ZS5ibG9jayA9ICQxOworCQl9CisJfCBWQUxVRSB0U1RSSU5HICcsJyB0U1RSSU5HIHsKKwkJJCQgPSBuZXdfdmVyX3ZhbHVlKCk7CisJCSQkLT50eXBlID0gdmFsX3N0cjsKKwkJJCQtPmtleSA9ICQyOworCQkkJC0+dmFsdWUuc3RyID0gJDQ7CisJCX0KKwl8IFZBTFVFIHRTVFJJTkcgJywnIHZlcl93b3JkcyB7CisJCSQkID0gbmV3X3Zlcl92YWx1ZSgpOworCQkkJC0+dHlwZSA9IHZhbF93b3JkczsKKwkJJCQtPmtleSA9ICQyOworCQkkJC0+dmFsdWUud29yZHMgPSAkNDsKKwkJfQorCTsKKwordmVyX3dvcmRzCisJOiBleHByCQkJeyAkJCA9IG5ld192ZXJfd29yZHMoJDEpOyB9CisJfCB2ZXJfd29yZHMgJywnIGV4cHIJeyAkJCA9IGFkZF92ZXJfd29yZHMoJDEsICQzKTsgfQorCTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1lbW9yeSBvcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworbG9hZG1lbW9wdHMKKwk6IC8qIEVtcHR5ICovCQl7ICQkID0gTlVMTDsgfQorCXwgbG9hZG1lbW9wdHMgbGFtbyB7CisJCWlmKCQxKQorCQl7CisJCQkqKCQxKSB8PSAqKCQyKTsKKwkJCSQkID0gJDE7CisJCQlmcmVlKCQyKTsKKwkJfQorCQllbHNlCisJCQkkJCA9ICQyOworCQl9CisJfCBsb2FkbWVtb3B0cyBsYW1hIHsKKwkJaWYoJDEpCisJCXsKKwkJCSooJDEpICY9ICooJDIpOworCQkJJCQgPSAkMTsKKwkJCWZyZWUoJDIpOworCQl9CisJCWVsc2UKKwkJeworCQkJKiQyICY9IFdSQ19NT19NT1ZFQUJMRSB8IFdSQ19NT19ESVNDQVJEQUJMRSB8IFdSQ19NT19QVVJFOworCQkJJCQgPSAkMjsKKwkJfQorCQl9CisJOworCitsYW1vCTogUFJFTE9BRAl7ICQkID0gbmV3X2ludChXUkNfTU9fUFJFTE9BRCk7IH0KKwl8IE1PVkVBQkxFCXsgJCQgPSBuZXdfaW50KFdSQ19NT19NT1ZFQUJMRSk7IH0KKwl8IERJU0NBUkRBQkxFCXsgJCQgPSBuZXdfaW50KFdSQ19NT19ESVNDQVJEQUJMRSk7IH0KKwl8IHRQVVJFCQl7ICQkID0gbmV3X2ludChXUkNfTU9fUFVSRSk7IH0KKwk7CisKK2xhbWEJOiBMT0FET05DQUxMCXsgJCQgPSBuZXdfaW50KH5XUkNfTU9fUFJFTE9BRCk7IH0KKwl8IHRGSVhFRAl7ICQkID0gbmV3X2ludCh+V1JDX01PX01PVkVBQkxFKTsgfQorCXwgSU1QVVJFCXsgJCQgPSBuZXdfaW50KH5XUkNfTU9fUFVSRSk7IH0KKwk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXaW4zMiBvcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworb3B0X2x2Ywk6IC8qIEVtcHR5ICovCQl7ICQkID0gbmV3X2x2YygpOyB9CisJfCBvcHRfbHZjIG9wdF9sYW5ndWFnZSB7CisJCWlmKCF3aW4zMikKKwkJCXl5d2FybmluZygiTEFOR1VBR0Ugbm90IHN1cHBvcnRlZCBpbiAxNi1iaXQgbW9kZSIpOworCQlpZigkMS0+bGFuZ3VhZ2UpCisJCQl5eWVycm9yKCJMYW5ndWFnZSBhbHJlYWR5IGRlZmluZWQiKTsKKwkJJCQgPSAkMTsKKwkJJDEtPmxhbmd1YWdlID0gJDI7CisJCX0KKwl8IG9wdF9sdmMgb3B0X2NoYXJhY3RzIHsKKwkJaWYoIXdpbjMyKQorCQkJeXl3YXJuaW5nKCJDSEFSQUNURVJJU1RJQ1Mgbm90IHN1cHBvcnRlZCBpbiAxNi1iaXQgbW9kZSIpOworCQlpZigkMS0+Y2hhcmFjdHMpCisJCQl5eWVycm9yKCJDaGFyYWN0ZXJpc3RpY3MgYWxyZWFkeSBkZWZpbmVkIik7CisJCSQkID0gJDE7CisJCSQxLT5jaGFyYWN0cyA9ICQyOworCQl9CisJfCBvcHRfbHZjIG9wdF92ZXJzaW9uIHsKKwkJaWYoIXdpbjMyKQorCQkJeXl3YXJuaW5nKCJWRVJTSU9OIG5vdCBzdXBwb3J0ZWQgaW4gMTYtYml0IG1vZGUiKTsKKwkJaWYoJDEtPnZlcnNpb24pCisJCQl5eWVycm9yKCJWZXJzaW9uIGFscmVhZHkgZGVmaW5lZCIpOworCQkkJCA9ICQxOworCQkkMS0+dmVyc2lvbiA9ICQyOworCQl9CisJOworCitvcHRfbGFuZ3VhZ2UKKwk6IExBTkdVQUdFIGV4cHIgJywnIGV4cHIJeyAkJCA9IG5ld19sYW5ndWFnZSgkMiwgJDQpOyB9CisJOworCitvcHRfY2hhcmFjdHMKKwk6IENIQVJBQ1RFUklTVElDUyBleHByCQl7ICQkID0gbmV3X2NoYXJhY3RzKCQyKTsgfQorCTsKKworb3B0X3ZlcnNpb24KKwk6IFZFUlNJT04gZXhwcgkJCXsgJCQgPSBuZXdfdmVyc2lvbigkMik7IH0KKwk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSYXcgZGF0YSBoYW5ka2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3Jhd19kYXRhOiB0QkVHSU4gcmF3X2VsZW1lbnRzIHRFTkQJeyAkJCA9ICQyOyB9CisJOworCityYXdfZWxlbWVudHMKKwk6IFJBV0RBVEEJCQl7ICQkID0gJDE7IH0KKwl8IE5VTUJFUgkJCXsgJCQgPSBpbnQycmF3X2RhdGEoJDEpOyB9CisJfCB0U1RSSU5HCQkJeyAkJCA9IHN0cjJyYXdfZGF0YSgkMSk7IH0KKwl8IHJhd19lbGVtZW50cyBvcHRfY29tbWEgUkFXREFUQSAgIHsgJCQgPSBtZXJnZV9yYXdfZGF0YSgkMSwgJDMpOyBmcmVlKCQzLT5kYXRhKTsgZnJlZSgkMyk7IH0KKwl8IHJhd19lbGVtZW50cyBvcHRfY29tbWEgTlVNQkVSCSAgIHsgJCQgPSBtZXJnZV9yYXdfZGF0YV9pbnQoJDEsICQzKTsgfQorCXwgcmF3X2VsZW1lbnRzIG9wdF9jb21tYSB0U1RSSU5HICAgeyAkJCA9IG1lcmdlX3Jhd19kYXRhX3N0cigkMSwgJDMpOyB9CisJOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2luMzIgZXhwcmVzc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBBbGwgd2luMTYgbnVtYmVycyBhcmUgYWxzbyBoYW5kbGVkIGhlcmUuIFRoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggTVMnCisgKiByZXNvdXJjZSBjb21waWxlciwgYnV0IHdoYXQgdGhlIGhlY2ssIGl0cyBqdXN0IGhhbmR5IHRvIGhhdmUuCisgKi8KK2VfZXhwcgk6IC8qIEVtcHR5ICovCXsgJCQgPSAwOyB9CisJfCBleHByCQl7ICQkID0gbmV3X2ludCgkMSk7IH0KKwk7CitleHByCTogZHVtbXkgeHByCXsgJCQgPSAoJDIpICYgYW5kbWFzazsgfQorCTsKKworZHVtbXkJOiAvKiBFbXB0eSAqLwl7ICQkID0gMDsgYW5kbWFzayA9IC0xOyB9CisJOworCit4cHIJOiB4cHIgJysnIHhwcgl7ICQkID0gKCQxKSArICgkMyk7IH0KKwl8IHhwciAnLScgeHByCXsgJCQgPSAoJDEpIC0gKCQzKTsgfQorCXwgeHByICd8JyB4cHIJeyAkJCA9ICgkMSkgfCAoJDMpOyB9CisJfCB4cHIgJyYnIHhwcgl7ICQkID0gKCQxKSAmICgkMyk7IH0KKwl8IHhwciAnKicgeHByCXsgJCQgPSAoJDEpICogKCQzKTsgfQorCXwgeHByICcvJyB4cHIJeyAkJCA9ICgkMSkgLyAoJDMpOyB9CisJfCAnficgeHByCXsgJCQgPSB+KCQyKTsgfQorCXwgJy0nIHhwcgl7ICQkID0gLSgkMik7IH0JCS8qIEZJWE1FOiBzaGlmdC9yZWR1Y2UgY29uZmxpY3QgKi8KKy8qCXwgJysnIHhwcgl7ICQkID0gJDI7IH0gKi8KKwl8ICcoJyB4cHIgJyknCXsgJCQgPSAkMjsgfQorCXwgTlVNQkVSCXsgJCQgPSAkMTsgd2FudF9yc2NuYW1lID0gMDsgfQorCXwgTk9UIE5VTUJFUgl7ICQkID0gMDsgYW5kbWFzayAmPSB+KCQyKTsgfQorCTsKKyUlCisvKiBEaWFsb2cgc3BlY2lmaWMgZnVuY3Rpb25zICovCitkaWFsb2dfdCAqZGlhbG9nX3N0eWxlKGludCBzdCwgZGlhbG9nX3QgKmRsZykKK3sKKwlEV09SRCBzID0gMDsKKwlhc3NlcnQoZGxnICE9IE5VTEwpOworCWlmKGRsZy0+Z290c3R5bGUpCisJeworCQl5eXdhcm5pbmcoIlN0eWxlIGFscmVhZHkgZGVmaW5lZCwgb3ItaW5nIHRvZ2V0aGVyIik7CisJCXMgPSBkbGctPnN0eWxlOworCX0KKwlkbGctPnN0eWxlID0gc3QgfCBzOworCWRsZy0+Z290c3R5bGUgPSBUUlVFOworCXJldHVybiBkbGc7Cit9CisKK2RpYWxvZ190ICpkaWFsb2dfZXhzdHlsZShpbnQgc3QsIGRpYWxvZ190ICpkbGcpCit7CisJRFdPUkQgcyA9IDA7CisJYXNzZXJ0KGRsZyAhPSBOVUxMKTsKKwlpZihkbGctPmdvdGV4c3R5bGUpCisJeworCQl5eXdhcm5pbmcoIkV4U3R5bGUgYWxyZWFkeSBkZWZpbmVkLCBvci1pbmcgdG9nZXRoZXIiKTsKKwkJcyA9IGRsZy0+c3R5bGU7CisJfQorCWRsZy0+ZXhzdHlsZSA9IHN0IHwgczsKKwlkbGctPmdvdGV4c3R5bGUgPSBUUlVFOworCXJldHVybiBkbGc7Cit9CisKK2RpYWxvZ190ICpkaWFsb2dfY2FwdGlvbihzdHJpbmdfdCAqcywgZGlhbG9nX3QgKmRsZykKK3sKKwlhc3NlcnQoZGxnICE9IE5VTEwpOworCWlmKGRsZy0+dGl0bGUpCisJCXl5ZXJyb3IoIkNhcHRpb24gYWxyZWFkeSBkZWZpbmVkIik7CisJZGxnLT50aXRsZSA9IHM7CisJcmV0dXJuIGRsZzsKK30KKworZGlhbG9nX3QgKmRpYWxvZ19mb250KGZvbnRfaWRfdCAqZiwgZGlhbG9nX3QgKmRsZykKK3sKKwlhc3NlcnQoZGxnICE9IE5VTEwpOworCWlmKGRsZy0+Zm9udCkKKwkJeXllcnJvcigiRm9udCBhbHJlYWR5IGRlZmluZWQiKTsKKwlkbGctPmZvbnQgPSBmOworCXJldHVybiBkbGc7Cit9CisKK2RpYWxvZ190ICpkaWFsb2dfY2xhc3MobmFtZV9pZF90ICpuLCBkaWFsb2dfdCAqZGxnKQoreworCWFzc2VydChkbGcgIT0gTlVMTCk7CisJaWYoZGxnLT5kbGdjbGFzcykKKwkJeXllcnJvcigiQ2xhc3MgYWxyZWFkeSBkZWZpbmVkIik7CisJZGxnLT5kbGdjbGFzcyA9IG47CisJcmV0dXJuIGRsZzsKK30KKworZGlhbG9nX3QgKmRpYWxvZ19tZW51KG5hbWVfaWRfdCAqbSwgZGlhbG9nX3QgKmRsZykKK3sKKwlhc3NlcnQoZGxnICE9IE5VTEwpOworCWlmKGRsZy0+bWVudSkKKwkJeXllcnJvcigiTWVudSBhbHJlYWR5IGRlZmluZWQiKTsKKwlkbGctPm1lbnUgPSBtOworCXJldHVybiBkbGc7Cit9CisKK2RpYWxvZ190ICpkaWFsb2dfbGFuZ3VhZ2UobGFuZ3VhZ2VfdCAqbCwgZGlhbG9nX3QgKmRsZykKK3sKKwlhc3NlcnQoZGxnICE9IE5VTEwpOworCWlmKGRsZy0+bHZjLmxhbmd1YWdlKQorCQl5eWVycm9yKCJMYW5ndWFnZSBhbHJlYWR5IGRlZmluZWQiKTsKKwlkbGctPmx2Yy5sYW5ndWFnZSA9IGw7CisJcmV0dXJuIGRsZzsKK30KKworZGlhbG9nX3QgKmRpYWxvZ19jaGFyYWN0ZXJpc3RpY3MoY2hhcmFjdHNfdCAqYywgZGlhbG9nX3QgKmRsZykKK3sKKwlhc3NlcnQoZGxnICE9IE5VTEwpOworCWlmKGRsZy0+bHZjLmNoYXJhY3RzKQorCQl5eWVycm9yKCJDaGFyYWN0ZXJpc3RpY3MgYWxyZWFkeSBkZWZpbmVkIik7CisJZGxnLT5sdmMuY2hhcmFjdHMgPSBjOworCXJldHVybiBkbGc7Cit9CisKK2RpYWxvZ190ICpkaWFsb2dfdmVyc2lvbih2ZXJzaW9uX3QgKnYsIGRpYWxvZ190ICpkbGcpCit7CisJYXNzZXJ0KGRsZyAhPSBOVUxMKTsKKwlpZihkbGctPmx2Yy52ZXJzaW9uKQorCQl5eWVycm9yKCJWZXJzaW9uIGFscmVhZHkgZGVmaW5lZCIpOworCWRsZy0+bHZjLnZlcnNpb24gPSB2OworCXJldHVybiBkbGc7Cit9CisKKy8qIENvbnRyb2xzIHNwZWNpZmljIGZ1bmN0aW9ucyAqLworY29udHJvbF90ICppbnNfY3RybChpbnQgdHlwZSwgaW50IHN0eWxlLCBjb250cm9sX3QgKmN0cmwsIGNvbnRyb2xfdCAqcHJldikKK3sKKwlhc3NlcnQoY3RybCAhPSBOVUxMKTsKKwljdHJsLT5wcmV2ID0gcHJldjsKKwlpZihwcmV2KQorCQlwcmV2LT5uZXh0ID0gY3RybDsKKwlpZih0eXBlICE9IC0xKQorCXsKKwkJY3RybC0+Y3RsY2xhc3MgPSBuZXdfbmFtZV9pZCgpOworCQljdHJsLT5jdGxjbGFzcy0+dHlwZSA9IG5hbWVfb3JkOworCQljdHJsLT5jdGxjbGFzcy0+bmFtZS5pX25hbWUgPSB0eXBlOworCX0KKworCS8qIEhtLi4uIHRoaXMgc2VlbXMgdG8gYmUgamFtbWVkIGluIGF0IGFsbCB0aW1lLi4uICovCisJY3RybC0+c3R5bGUgfD0gV1NfQ0hJTEQgfCBXU19WSVNJQkxFOworCXN3aXRjaCh0eXBlKQorCXsKKwljYXNlIENUX0JVVFRPTjoKKwkJY3RybC0+c3R5bGUgfD0gc3R5bGU7CisJCWlmKHN0eWxlICE9IEJTX0dST1VQQk9YICYmIHN0eWxlICE9IEJTX1JBRElPQlVUVE9OKQorCQkJY3RybC0+c3R5bGUgfD0gV1NfVEFCU1RPUDsKKwkJYnJlYWs7CisJY2FzZSBDVF9FRElUOgorCQljdHJsLT5zdHlsZSB8PSBXU19UQUJTVE9QIHwgV1NfQk9SREVSOworCQlicmVhazsKKwljYXNlIENUX0xJU1RCT1g6CisJCWN0cmwtPnN0eWxlIHw9IExCU19OT1RJRlkgfCBXU19CT1JERVI7CisJCWJyZWFrOworCWNhc2UgQ1RfQ09NQk9CT1g6CisJCWN0cmwtPnN0eWxlIHw9IENCU19TSU1QTEU7CisJCWJyZWFrOworCWNhc2UgQ1RfU1RBVElDOgorCQljdHJsLT5zdHlsZSB8PSBzdHlsZTsKKwkJaWYoc3R5bGUgPT0gU1NfQ0VOVEVSIHx8IHN0eWxlID09IFNTX0xFRlQgfHwgc3R5bGUgPT0gU1NfUklHSFQpCisJCQljdHJsLT5zdHlsZSB8PSBXU19HUk9VUDsKKwkJYnJlYWs7CisJfQorCisJaWYoIWN0cmwtPmdvdHN0eWxlKQkvKiBIYW5kbGUgZGVmYXVsdCBzdHlsZSBzZXR0aW5nICovCisJeworCQlzd2l0Y2godHlwZSkKKwkJeworCQljYXNlIENUX0VESVQ6CisJCQljdHJsLT5zdHlsZSB8PSBFU19MRUZUOworCQkJYnJlYWs7CisJCWNhc2UgQ1RfTElTVEJPWDoKKwkJCWN0cmwtPnN0eWxlIHw9IExCU19OT1RJRlk7CisJCQlicmVhazsKKwkJY2FzZSBDVF9DT01CT0JPWDoKKwkJCWN0cmwtPnN0eWxlIHw9IENCU19TSU1QTEUgfCBXU19UQUJTVE9QOworCQkJYnJlYWs7CisJCWNhc2UgQ1RfU0NST0xMQkFSOgorCQkJY3RybC0+c3R5bGUgfD0gU0JTX0hPUlo7CisJCQlicmVhazsKKwkJY2FzZSBDVF9CVVRUT046CisJCQlzd2l0Y2goc3R5bGUpCisJCQl7CisJCQljYXNlIEJTX0NIRUNLQk9YOgorCQkJY2FzZSBCU19ERUZQVVNIQlVUVE9OOgorCQkJY2FzZSBCU19QVVNIQlVUVE9OOgorCQkJY2FzZSBCU19HUk9VUEJPWDoKKy8qCQkJY2FzZSBCU19QVVNIQk9YOgkqLworCQkJY2FzZSBCU19BVVRPUkFESU9CVVRUT046CisJCQljYXNlIEJTX0FVVE8zU1RBVEU6CisJCQljYXNlIEJTXzNTVEFURToKKwkJCWNhc2UgQlNfQVVUT0NIRUNLQk9YOgorCQkJCWN0cmwtPnN0eWxlIHw9IFdTX1RBQlNUT1A7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXl5d2FybmluZygiVW5rbm93biBkZWZhdWx0IGJ1dHRvbiBjb250cm9sLXN0eWxlIDB4JTA4eCIsIHN0eWxlKTsKKwkJCWNhc2UgQlNfUkFESU9CVVRUT046CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIENUX1NUQVRJQzoKKwkJCXN3aXRjaChzdHlsZSkKKwkJCXsKKwkJCWNhc2UgU1NfTEVGVDoKKwkJCWNhc2UgU1NfUklHSFQ6CisJCQljYXNlIFNTX0NFTlRFUjoKKwkJCQljdHJsLT5zdHlsZSB8PSBXU19HUk9VUDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1NfSUNPTjoJLyogU3BlY2lhbCBjYXNlICovCisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXl5d2FybmluZygiVW5rbm93biBkZWZhdWx0IHN0YXRpYyBjb250cm9sLXN0eWxlIDB4JTA4eCIsIHN0eWxlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIC0xOgkvKiBHZW5lcmljIGNvbnRyb2wgKi8KKwkJCWdvdG8gYnllYnllOworCisJCWRlZmF1bHQ6CisJCQl5eWVycm9yKCJJbnRlcm5hbCBlcnJvciAocmVwb3J0IHRoaXMpOiBHb3Qgd2VpcmQgY29udHJvbCB0eXBlIDB4JTA4eCIsIHR5cGUpOworCQl9CisJfQorCisJLyogVGhlIFNTX0lDT04gZmxhZyBpcyBhbHdheXMgZm9yY2VkIGluIGZvciBpY29uIGNvbnRyb2xzICovCisJaWYodHlwZSA9PSBDVF9TVEFUSUMgJiYgc3R5bGUgPT0gU1NfSUNPTikKKwkJY3RybC0+c3R5bGUgfD0gU1NfSUNPTjsKKworCWN0cmwtPmdvdHN0eWxlID0gVFJVRTsKK2J5ZWJ5ZToKKwlyZXR1cm4gY3RybDsKK30KKworbmFtZV9pZF90ICpjb252ZXJ0X2N0bGNsYXNzKG5hbWVfaWRfdCAqY2xzKQoreworCWNoYXIgKmNjOworCWludCBpY2xhc3M7CisKKwlpZihjbHMtPnR5cGUgPT0gbmFtZV9vcmQpCisJCXJldHVybiBjbHM7CisJYXNzZXJ0KGNscy0+dHlwZSA9PSBuYW1lX3N0cik7CisJaWYoY2xzLT50eXBlID09IHN0cl91bmljb2RlKQorCXsKKwkJeXllcnJvcigiRG9uJ3QgeWV0IHN1cHBvcnQgdW5pY29kZSBjbGFzcyBjb21wYXJpc29uIik7CisJfQorCWVsc2UKKwkJY2MgPSBjbHMtPm5hbWUuc19uYW1lLT5zdHIuY3N0cjsKKworCWlmKCFzdHJpY21wKCJCVVRUT04iLCBjYykpCisJCWljbGFzcyA9IENUX0JVVFRPTjsKKwllbHNlIGlmKCFzdHJpY21wKCJDT01CT0JPWCIsIGNjKSkKKwkJaWNsYXNzID0gQ1RfQ09NQk9CT1g7CisJZWxzZSBpZighc3RyaWNtcCgiTElTVEJPWCIsIGNjKSkKKwkJaWNsYXNzID0gQ1RfTElTVEJPWDsKKwllbHNlIGlmKCFzdHJpY21wKCJFRElUIiwgY2MpKQorCQlpY2xhc3MgPSBDVF9FRElUOworCWVsc2UgaWYoIXN0cmljbXAoIlNUQVRJQyIsIGNjKSkKKwkJaWNsYXNzID0gQ1RfU1RBVElDOworCWVsc2UgaWYoIXN0cmljbXAoIlNDUk9MTEJBUiIsIGNjKSkKKwkJaWNsYXNzID0gQ1RfU0NST0xMQkFSOworCWVsc2UKKwkJcmV0dXJuIGNsczsJLyogTm8gZGVmYXVsdCwgcmV0dXJuIHVzZXIgY29udHJvbGNsYXNzICovCisKKwlmcmVlKGNscy0+bmFtZS5zX25hbWUtPnN0ci5jc3RyKTsKKwlmcmVlKGNscy0+bmFtZS5zX25hbWUpOworCWNscy0+dHlwZSA9IG5hbWVfb3JkOworCWNscy0+bmFtZS5pX25hbWUgPSBpY2xhc3M7CisJcmV0dXJuIGNsczsKK30KKworLyogRGlhbG9nRXggc3BlY2lmaWMgZnVuY3Rpb25zICovCitkaWFsb2dleF90ICpkaWFsb2dleF9zdHlsZShpbnQgc3QsIGRpYWxvZ2V4X3QgKmRsZykKK3sKKwlEV09SRCBzID0gMDsKKwlhc3NlcnQoZGxnICE9IE5VTEwpOworCWlmKGRsZy0+Z290c3R5bGUpCisJeworCQl5eXdhcm5pbmcoIlN0eWxlIGFscmVhZHkgZGVmaW5lZCwgb3ItaW5nIHRvZ2V0aGVyIik7CisJCXMgPSBkbGctPnN0eWxlOworCX0KKwlkbGctPnN0eWxlID0gc3QgfCBzOworCWRsZy0+Z290c3R5bGUgPSBUUlVFOworCXJldHVybiBkbGc7Cit9CisKK2RpYWxvZ2V4X3QgKmRpYWxvZ2V4X2V4c3R5bGUoaW50IHN0LCBkaWFsb2dleF90ICpkbGcpCit7CisJRFdPUkQgcyA9IDA7CisJYXNzZXJ0KGRsZyAhPSBOVUxMKTsKKwlpZihkbGctPmdvdGV4c3R5bGUpCisJeworCQl5eXdhcm5pbmcoIkV4U3R5bGUgYWxyZWFkeSBkZWZpbmVkLCBvci1pbmcgdG9nZXRoZXIiKTsKKwkJcyA9IGRsZy0+ZXhzdHlsZTsKKwl9CisJZGxnLT5leHN0eWxlID0gc3QgfCBzOworCWRsZy0+Z290ZXhzdHlsZSA9IFRSVUU7CisJcmV0dXJuIGRsZzsKK30KKworZGlhbG9nZXhfdCAqZGlhbG9nZXhfY2FwdGlvbihzdHJpbmdfdCAqcywgZGlhbG9nZXhfdCAqZGxnKQoreworCWFzc2VydChkbGcgIT0gTlVMTCk7CisJaWYoZGxnLT50aXRsZSkKKwkJeXllcnJvcigiQ2FwdGlvbiBhbHJlYWR5IGRlZmluZWQiKTsKKwlkbGctPnRpdGxlID0gczsKKwlyZXR1cm4gZGxnOworfQorCitkaWFsb2dleF90ICpkaWFsb2dleF9mb250KGZvbnRfaWRfdCAqZiwgZGlhbG9nZXhfdCAqZGxnKQoreworCWFzc2VydChkbGcgIT0gTlVMTCk7CisJaWYoZGxnLT5mb250KQorCQl5eWVycm9yKCJGb250IGFscmVhZHkgZGVmaW5lZCIpOworCWRsZy0+Zm9udCA9IGY7CisJcmV0dXJuIGRsZzsKK30KKworZGlhbG9nZXhfdCAqZGlhbG9nZXhfY2xhc3MobmFtZV9pZF90ICpuLCBkaWFsb2dleF90ICpkbGcpCit7CisJYXNzZXJ0KGRsZyAhPSBOVUxMKTsKKwlpZihkbGctPmRsZ2NsYXNzKQorCQl5eWVycm9yKCJDbGFzcyBhbHJlYWR5IGRlZmluZWQiKTsKKwlkbGctPmRsZ2NsYXNzID0gbjsKKwlyZXR1cm4gZGxnOworfQorCitkaWFsb2dleF90ICpkaWFsb2dleF9tZW51KG5hbWVfaWRfdCAqbSwgZGlhbG9nZXhfdCAqZGxnKQoreworCWFzc2VydChkbGcgIT0gTlVMTCk7CisJaWYoZGxnLT5tZW51KQorCQl5eWVycm9yKCJNZW51IGFscmVhZHkgZGVmaW5lZCIpOworCWRsZy0+bWVudSA9IG07CisJcmV0dXJuIGRsZzsKK30KKworZGlhbG9nZXhfdCAqZGlhbG9nZXhfbGFuZ3VhZ2UobGFuZ3VhZ2VfdCAqbCwgZGlhbG9nZXhfdCAqZGxnKQoreworCWFzc2VydChkbGcgIT0gTlVMTCk7CisJaWYoZGxnLT5sdmMubGFuZ3VhZ2UpCisJCXl5ZXJyb3IoIkxhbmd1YWdlIGFscmVhZHkgZGVmaW5lZCIpOworCWRsZy0+bHZjLmxhbmd1YWdlID0gbDsKKwlyZXR1cm4gZGxnOworfQorCitkaWFsb2dleF90ICpkaWFsb2dleF9jaGFyYWN0ZXJpc3RpY3MoY2hhcmFjdHNfdCAqYywgZGlhbG9nZXhfdCAqZGxnKQoreworCWFzc2VydChkbGcgIT0gTlVMTCk7CisJaWYoZGxnLT5sdmMuY2hhcmFjdHMpCisJCXl5ZXJyb3IoIkNoYXJhY3RlcmlzdGljcyBhbHJlYWR5IGRlZmluZWQiKTsKKwlkbGctPmx2Yy5jaGFyYWN0cyA9IGM7CisJcmV0dXJuIGRsZzsKK30KKworZGlhbG9nZXhfdCAqZGlhbG9nZXhfdmVyc2lvbih2ZXJzaW9uX3QgKnYsIGRpYWxvZ2V4X3QgKmRsZykKK3sKKwlhc3NlcnQoZGxnICE9IE5VTEwpOworCWlmKGRsZy0+bHZjLnZlcnNpb24pCisJCXl5ZXJyb3IoIlZlcnNpb24gYWxyZWFkeSBkZWZpbmVkIik7CisJZGxnLT5sdmMudmVyc2lvbiA9IHY7CisJcmV0dXJuIGRsZzsKK30KKworLyogQWNjZWxlcmF0b3Igc3BlY2lmaWMgZnVuY3Rpb25zICovCitldmVudF90ICphZGRfZXZlbnQoaW50IGtleSwgaW50IGlkLCBpbnQgZmxhZ3MsIGV2ZW50X3QgKnByZXYpCit7CisJZXZlbnRfdCAqZXYgPSBuZXdfZXZlbnQoKTsKKworCWlmKChmbGFncyAmIChXUkNfQUZfVklSVEtFWSB8IFdSQ19BRl9BU0NJSSkpID09IChXUkNfQUZfVklSVEtFWSB8IFdSQ19BRl9BU0NJSSkpCisJCXl5ZXJyb3IoIkNhbm5vdCB1c2UgYm90aCBBU0NJSSBhbmQgVklSVEtFWSIpOworCisJZXYtPmtleSA9IGtleTsKKwlldi0+aWQgPSBpZDsKKwlldi0+ZmxhZ3MgPSBmbGFncyAmIH5XUkNfQUZfQVNDSUk7CisJZXYtPnByZXYgPSBwcmV2OworCWlmKHByZXYpCisJCXByZXYtPm5leHQgPSBldjsKKwlyZXR1cm4gZXY7Cit9CisKK2V2ZW50X3QgKmFkZF9zdHJpbmdfZXZlbnQoc3RyaW5nX3QgKmtleSwgaW50IGlkLCBpbnQgZmxhZ3MsIGV2ZW50X3QgKnByZXYpCit7CisJaW50IGtleWNvZGU7CisJZXZlbnRfdCAqZXYgPSBuZXdfZXZlbnQoKTsKKworCWlmKGtleS0+dHlwZSAhPSBzdHJfY2hhcikKKwkJeXllcnJvcigiS2V5IGNvZGUgbXVzdCBiZSBhbiBhc2NpaSBzdHJpbmciKTsKKworCWlmKChmbGFncyAmIFdSQ19BRl9WSVJUS0VZKSAmJiAoIWlzdXBwZXIoa2V5LT5zdHIuY3N0clswXSkgfHwgIWlzZGlnaXQoa2V5LT5zdHIuY3N0clswXSkpKQorCQl5eWVycm9yKCJWSVJUS0VZIGNvZGUgaXMgbm90IGVxdWFsIHRvIGFzY2lpIHZhbHVlIik7CisKKwlpZihrZXktPnN0ci5jc3RyWzBdID09ICdeJykKKwl7CisJCWtleWNvZGUgPSB0b3VwcGVyKGtleS0+c3RyLmNzdHJbMV0pIC0gJ0AnOworCQlpZihrZXljb2RlID49ICcgJykKKwkJCXl5ZXJyb3IoIkNvbnRyb2wtY29kZSBvdXQgb2YgcmFuZ2UiKTsKKwl9CisJZWxzZQorCQlrZXljb2RlID0ga2V5LT5zdHIuY3N0clswXTsKKwlldi0+a2V5ID0ga2V5Y29kZTsKKwlldi0+aWQgPSBpZDsKKwlldi0+ZmxhZ3MgPSBmbGFncyAmIH5XUkNfQUZfQVNDSUk7CisJZXYtPnByZXYgPSBwcmV2OworCWlmKHByZXYpCisJCXByZXYtPm5leHQgPSBldjsKKwlyZXR1cm4gZXY7Cit9CisKKy8qIE1lbnVFeCBzcGVjaWZpYyBmdW5jdGlvbnMgKi8KK2l0ZW1leF9vcHRfdCAqbmV3X2l0ZW1leF9vcHQoaW50IGlkLCBpbnQgdHlwZSwgaW50IHN0YXRlLCBpbnQgaGVscGlkKQoreworCWl0ZW1leF9vcHRfdCAqb3B0ID0gKGl0ZW1leF9vcHRfdCAqKXhtYWxsb2Moc2l6ZW9mKGl0ZW1leF9vcHRfdCkpOworCW9wdC0+aWQgPSBpZDsKKwlvcHQtPnR5cGUgPSB0eXBlOworCW9wdC0+c3RhdGUgPSBzdGF0ZTsKKwlvcHQtPmhlbHBpZCA9IGhlbHBpZDsKKwlyZXR1cm4gb3B0OworfQorCisvKiBSYXcgZGF0YSBmdW5jdGlvbnMgKi8KK3Jhd19kYXRhX3QgKmxvYWRfZmlsZShzdHJpbmdfdCAqbmFtZSkKK3sKKwlGSUxFICpmcDsKKwlyYXdfZGF0YV90ICpyZDsKKwlpZihuYW1lLT50eXBlICE9IHN0cl9jaGFyKQorCQl5eWVycm9yKCJGaWxlbmFtZSBtdXN0IGJlIEFTQ0lJIHN0cmluZyIpOworCQkKKwlmcCA9IGZvcGVuKG5hbWUtPnN0ci5jc3RyLCAicmIiKTsKKwlpZighZnApCisJCXl5ZXJyb3IoIkNhbm5vdCBvcGVuIGZpbGUgJXMiLCBuYW1lKTsKKwlyZCA9IG5ld19yYXdfZGF0YSgpOworCWZzZWVrKGZwLCAwLCBTRUVLX0VORCk7CisJcmQtPnNpemUgPSBmdGVsbChmcCk7CisJZnNlZWsoZnAsIDAsIFNFRUtfU0VUKTsKKwlyZC0+ZGF0YSA9IChjaGFyICopeG1hbGxvYyhyZC0+c2l6ZSk7CisJZnJlYWQocmQtPmRhdGEsIHJkLT5zaXplLCAxLCBmcCk7CisJZmNsb3NlKGZwKTsKKwlIRUFQQ0hFQ0soKTsKKwlyZXR1cm4gcmQ7Cit9CisKK3Jhd19kYXRhX3QgKmludDJyYXdfZGF0YShpbnQgaSkKK3sKKwlyYXdfZGF0YV90ICpyZDsKKwlyZCA9IG5ld19yYXdfZGF0YSgpOworCXJkLT5zaXplID0gc2l6ZW9mKHNob3J0KTsKKwlyZC0+ZGF0YSA9IChjaGFyICopeG1hbGxvYyhyZC0+c2l6ZSk7CisJKihzaG9ydCAqKShyZC0+ZGF0YSkgPSAoc2hvcnQpaTsKKwlyZXR1cm4gcmQ7Cit9CisKK3Jhd19kYXRhX3QgKnN0cjJyYXdfZGF0YShzdHJpbmdfdCAqc3RyKQoreworCXJhd19kYXRhX3QgKnJkOworCXJkID0gbmV3X3Jhd19kYXRhKCk7CisJcmQtPnNpemUgPSBzdHItPnNpemUgKiAoc3RyLT50eXBlID09IHN0cl9jaGFyID8gMSA6IDIpOworCXJkLT5kYXRhID0gKGNoYXIgKil4bWFsbG9jKHJkLT5zaXplKTsKKwltZW1jcHkocmQtPmRhdGEsIHN0ci0+c3RyLmNzdHIsIHJkLT5zaXplKTsKKwlyZXR1cm4gcmQ7Cit9CisKK3Jhd19kYXRhX3QgKm1lcmdlX3Jhd19kYXRhKHJhd19kYXRhX3QgKnIxLCByYXdfZGF0YV90ICpyMikKK3sKKwlyMS0+ZGF0YSA9IHhyZWFsbG9jKHIxLT5kYXRhLCByMS0+c2l6ZSArIHIyLT5zaXplKTsKKwltZW1jcHkocjEtPmRhdGEgKyByMS0+c2l6ZSwgcjItPmRhdGEsIHIyLT5zaXplKTsKKwlyMS0+c2l6ZSArPSByMi0+c2l6ZTsKKwlyZXR1cm4gcjE7Cit9CisKK3Jhd19kYXRhX3QgKm1lcmdlX3Jhd19kYXRhX2ludChyYXdfZGF0YV90ICpyMSwgaW50IGkpCit7CisJcmF3X2RhdGFfdCAqdCA9IGludDJyYXdfZGF0YShpKTsKKwltZXJnZV9yYXdfZGF0YShyMSwgdCk7CisJZnJlZSh0LT5kYXRhKTsKKwlmcmVlKHQpOworCXJldHVybiByMTsKK30KKworcmF3X2RhdGFfdCAqbWVyZ2VfcmF3X2RhdGFfc3RyKHJhd19kYXRhX3QgKnIxLCBzdHJpbmdfdCAqc3RyKQoreworCXJhd19kYXRhX3QgKnQgPSBzdHIycmF3X2RhdGEoc3RyKTsKKwltZXJnZV9yYXdfZGF0YShyMSwgdCk7CisJZnJlZSh0LT5kYXRhKTsKKwlmcmVlKHQpOworCXJldHVybiByMTsKK30KKworLyogRnVuY3Rpb24gdGhlIGdvIGJhY2sgaW4gYSBsaXN0IHRvIGdldCB0aGUgaGVhZCAqLworbWVudV9pdGVtX3QgKmdldF9pdGVtX2hlYWQobWVudV9pdGVtX3QgKnApCit7CisJaWYoIXApCisJCXJldHVybiBOVUxMOworCXdoaWxlKHAtPnByZXYpCisJCXAgPSBwLT5wcmV2OworCXJldHVybiBwOworfQorCittZW51ZXhfaXRlbV90ICpnZXRfaXRlbWV4X2hlYWQobWVudWV4X2l0ZW1fdCAqcCkKK3sKKwlpZighcCkKKwkJcmV0dXJuIE5VTEw7CisJd2hpbGUocC0+cHJldikKKwkJcCA9IHAtPnByZXY7CisJcmV0dXJuIHA7Cit9CisKK3Jlc291cmNlX3QgKmdldF9yZXNvdXJjZV9oZWFkKHJlc291cmNlX3QgKnApCit7CisJaWYoIXApCisJCXJldHVybiBOVUxMOworCXdoaWxlKHAtPnByZXYpCisJCXAgPSBwLT5wcmV2OworCXJldHVybiBwOworfQorCit2ZXJfYmxvY2tfdCAqZ2V0X3Zlcl9ibG9ja19oZWFkKHZlcl9ibG9ja190ICpwKQoreworCWlmKCFwKQorCQlyZXR1cm4gTlVMTDsKKwl3aGlsZShwLT5wcmV2KQorCQlwID0gcC0+cHJldjsKKwlyZXR1cm4gcDsKK30KKwordmVyX3ZhbHVlX3QgKmdldF92ZXJfdmFsdWVfaGVhZCh2ZXJfdmFsdWVfdCAqcCkKK3sKKwlpZighcCkKKwkJcmV0dXJuIE5VTEw7CisJd2hpbGUocC0+cHJldikKKwkJcCA9IHAtPnByZXY7CisJcmV0dXJuIHA7Cit9CisKK2NvbnRyb2xfdCAqZ2V0X2NvbnRyb2xfaGVhZChjb250cm9sX3QgKnApCit7CisJaWYoIXApCisJCXJldHVybiBOVUxMOworCXdoaWxlKHAtPnByZXYpCisJCXAgPSBwLT5wcmV2OworCXJldHVybiBwOworfQorCitldmVudF90ICpnZXRfZXZlbnRfaGVhZChldmVudF90ICpwKQoreworCWlmKCFwKQorCQlyZXR1cm4gTlVMTDsKKwl3aGlsZShwLT5wcmV2KQorCQlwID0gcC0+cHJldjsKKwlyZXR1cm4gcDsKK30KKworLyogRmluZCBhIHN0cmluZ3RhYmxlIHdpdGggZ2l2ZW4gbGFuZ3VhZ2UgKi8KK3N0cmluZ3RhYmxlX3QgKmZpbmRfc3RyaW5ndGFibGUobHZjX3QgKmx2YykKK3sKKwlzdHJpbmd0YWJsZV90ICpzdHQ7CisKKwlhc3NlcnQobHZjICE9IE5VTEwpOworCisJaWYoIWx2Yy0+bGFuZ3VhZ2UpCisJCWx2Yy0+bGFuZ3VhZ2UgPSBjdXJyZW50bGFuZ3VhZ2U7CisKKwlmb3Ioc3R0ID0gc3R0cmVzOyBzdHQ7IHN0dCA9IHN0dC0+bmV4dCkKKwl7CisJCWlmKHN0dC0+bHZjLmxhbmd1YWdlLT5pZCA9PSBsdmMtPmxhbmd1YWdlLT5pZAorCQkmJiBzdHQtPmx2Yy5sYW5ndWFnZS0+aWQgPT0gbHZjLT5sYW5ndWFnZS0+aWQpCisJCXsKKwkJCS8qIEZvdW5kIGEgdGFibGUgd2l0aCB0aGUgc2FtZSBsYW5ndWFnZSAqLworCQkJLyogVGhlIHZlcnNpb24gYW5kIGNoYXJhY3RlcmlzdGljcyBhcmUgbm93IGhhbmRsZWQKKwkJCSAqIGluIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBpbmRpdmlkdWFsIHN0cmluZ3RhYmxlcy4KKwkJCSAqIFRoaXMgZW5hYmxlcyBsb2NhbGl6ZWQgYW5hbHlzaXMuCisJCQlpZigoc3R0LT5sdmMudmVyc2lvbiAmJiBsdmMtPnZlcnNpb24gJiYgKihzdHQtPmx2Yy52ZXJzaW9uKSAhPSAqKGx2Yy0+dmVyc2lvbikpCisJCQl8fCAoIXN0dC0+bHZjLnZlcnNpb24gJiYgbHZjLT52ZXJzaW9uKQorCQkJfHwgKHN0dC0+bHZjLnZlcnNpb24gJiYgIWx2Yy0+dmVyc2lvbikpCisJCQkJeXl3YXJuaW5nKCJTdHJpbmd0YWJsZSdzIHZlcnNpb25zIGFyZSBub3QgdGhlIHNhbWUsIHVzaW5nIGZpcnN0IGRlZmluaXRpb24iKTsKKworCQkJaWYoKHN0dC0+bHZjLmNoYXJhY3RzICYmIGx2Yy0+Y2hhcmFjdHMgJiYgKihzdHQtPmx2Yy5jaGFyYWN0cykgIT0gKihsdmMtPmNoYXJhY3RzKSkKKwkJCXx8ICghc3R0LT5sdmMuY2hhcmFjdHMgJiYgbHZjLT5jaGFyYWN0cykKKwkJCXx8IChzdHQtPmx2Yy5jaGFyYWN0cyAmJiAhbHZjLT5jaGFyYWN0cykpCisJCQkJeXl3YXJuaW5nKCJTdHJpbmd0YWJsZSdzIGNoYXJhY3RlcmlzdGljcyBhcmUgbm90IHRoZSBzYW1lLCB1c2luZyBmaXJzdCBkZWZpbml0aW9uIik7CisJCQkqLworCQkJcmV0dXJuIHN0dDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogcXNvcnQgc29ydGluZyBmdW5jdGlvbiBmb3Igc3RyaW5nIHRhYmxlIGVudHJpZXMgKi8KKyNkZWZpbmUgU1RFKHApCSgoc3R0X2VudHJ5X3QgKikocCkpCitpbnQgc29ydF9zdHRfZW50cnkoY29uc3Qgdm9pZCAqZTEsIGNvbnN0IHZvaWQgKmUyKQoreworCXJldHVybiBTVEUoZTEpLT5pZCAtIFNURShlMiktPmlkOworfQorI3VuZGVmIFNURQorCityZXNvdXJjZV90ICpidWlsZF9zdHRfcmVzb3VyY2VzKHN0cmluZ3RhYmxlX3QgKnN0dGhlYWQpCit7CisJc3RyaW5ndGFibGVfdCAqc3R0OworCXN0cmluZ3RhYmxlX3QgKm5ld3N0dDsKKwlyZXNvdXJjZV90ICpyc2M7CisJcmVzb3VyY2VfdCAqcnNjbGlzdCA9IE5VTEw7CisJcmVzb3VyY2VfdCAqcnNjdGFpbCA9IE5VTEw7CisJaW50IGk7CisJaW50IGo7CisJRFdPUkQgYW5kc3VtOworCURXT1JEIG9yc3VtOworCWNoYXJhY3RzX3QgKmNoYXJhY3RzOworCXZlcnNpb25fdCAqdmVyc2lvbjsKKworCWlmKCFzdHRoZWFkKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEZvciBhbGwgbGFuZ3VhZ2VzIGRlZmluZWQgKi8KKwlmb3Ioc3R0ID0gc3R0aGVhZDsgc3R0OyBzdHQgPSBzdHQtPm5leHQpCisJeworCQlhc3NlcnQoc3R0LT5uZW50cmllcyA+IDApOworCisJCS8qIFNvcnQgdGhlIGVudHJpZXMgKi8KKwkJaWYoc3R0LT5uZW50cmllcyA+IDEpCisJCQlxc29ydChzdHQtPmVudHJpZXMsIHN0dC0+bmVudHJpZXMsIHNpemVvZihzdHQtPmVudHJpZXNbMF0pLCBzb3J0X3N0dF9lbnRyeSk7CisKKwkJZm9yKGkgPSAwOyBpIDwgc3R0LT5uZW50cmllczsgKQorCQl7CisJCQluZXdzdHQgPSBuZXdfc3RyaW5ndGFibGUoJnN0dC0+bHZjKTsKKwkJCW5ld3N0dC0+ZW50cmllcyA9IChzdHRfZW50cnlfdCAqKXhtYWxsb2MoMTYgKiBzaXplb2Yoc3R0X2VudHJ5X3QpKTsKKwkJCW5ld3N0dC0+bmVudHJpZXMgPSAxNjsKKwkJCW5ld3N0dC0+aWRiYXNlID0gc3R0LT5lbnRyaWVzW2ldLmlkICYgfjB4ZjsKKwkJCWZvcihqID0gMDsgaiA8IDE2ICYmIGkgPCBzdHQtPm5lbnRyaWVzOyBqKyspCisJCQl7CisJCQkJaWYoc3R0LT5lbnRyaWVzW2ldLmlkIC0gbmV3c3R0LT5pZGJhc2UgPT0gaikKKwkJCQl7CisJCQkJCW5ld3N0dC0+ZW50cmllc1tqXSA9IHN0dC0+ZW50cmllc1tpXTsKKwkJCQkJaSsrOworCQkJCX0KKwkJCX0KKwkJCWFuZHN1bSA9IH4wOworCQkJb3JzdW0gPSAwOworCQkJY2hhcmFjdHMgPSBOVUxMOworCQkJdmVyc2lvbiA9IE5VTEw7CisJCQkvKiBDaGVjayBpbmRpdmlkdWFsIG1lbW9yeSBvcHRpb25zIGFuZCBnZXQKKwkJCSAqIHRoZSBmaXJzdCBjaGFyYWN0ZXJpc3RpY3MvdmVyc2lvbgorCQkJICovCisJCQlmb3IoaiA9IDA7IGogPCAxNjsgaisrKQorCQkJeworCQkJCWlmKCFuZXdzdHQtPmVudHJpZXNbal0uc3RyKQorCQkJCQljb250aW51ZTsKKwkJCQlhbmRzdW0gJj0gbmV3c3R0LT5lbnRyaWVzW2pdLm1lbW9wdDsKKwkJCQlvcnN1bSB8PSBuZXdzdHQtPmVudHJpZXNbal0ubWVtb3B0OworCQkJCWlmKCFjaGFyYWN0cykKKwkJCQkJY2hhcmFjdHMgPSBuZXdzdHQtPmVudHJpZXNbal0uY2hhcmFjdHM7CisJCQkJaWYoIXZlcnNpb24pCisJCQkJCXZlcnNpb24gPSBuZXdzdHQtPmVudHJpZXNbal0udmVyc2lvbjsKKwkJCX0KKwkJCWlmKGFuZHN1bSAhPSBvcnN1bSkKKwkJCXsKKwkJCQl3YXJuaW5nKCJTdHJpbmd0YWJsZSdzIG1lbW9yeSBvcHRpb25zIGFyZSBub3QgZXF1YWwgKGlkYmFzZTogJWQpIiwgbmV3c3R0LT5pZGJhc2UpOworCQkJfQorCQkJLyogQ2hlY2sgdmVyc2lvbiBhbmQgY2hhcmFjdGVyaXN0aWNzICovCisJCQlmb3IoaiA9IDA7IGogPCAxNjsgaisrKQorCQkJeworCQkJCWlmKGNoYXJhY3RzCisJCQkJJiYgbmV3c3R0LT5lbnRyaWVzW2pdLmNoYXJhY3RzCisJCQkJJiYgKm5ld3N0dC0+ZW50cmllc1tqXS5jaGFyYWN0cyAhPSAqY2hhcmFjdHMpCisJCQkJCXdhcm5pbmcoIlN0cmluZ3RhYmxlJ3MgY2hhcmFjdGVyaXN0aWNzIGFyZSBub3QgdGhlIHNhbWUgKGlkYmFzZTogJWQpIiwgbmV3c3R0LT5pZGJhc2UpOworCQkJCWlmKHZlcnNpb24KKwkJCQkmJiBuZXdzdHQtPmVudHJpZXNbal0udmVyc2lvbgorCQkJCSYmICpuZXdzdHQtPmVudHJpZXNbal0udmVyc2lvbiAhPSAqdmVyc2lvbikKKwkJCQkJd2FybmluZygiU3RyaW5ndGFibGUncyB2ZXJzaW9ucyBhcmUgbm90IHRoZSBzYW1lIChpZGJhc2U6ICVkKSIsIG5ld3N0dC0+aWRiYXNlKTsKKwkJCX0KKwkJCXJzYyA9IG5ld19yZXNvdXJjZShyZXNfc3R0LCBuZXdzdHQsIG5ld3N0dC0+bWVtb3B0LCBuZXdzdHQtPmx2Yy5sYW5ndWFnZSk7CisJCQlyc2MtPm5hbWUgPSBuZXdfbmFtZV9pZCgpOworCQkJcnNjLT5uYW1lLT50eXBlID0gbmFtZV9vcmQ7CisJCQlyc2MtPm5hbWUtPm5hbWUuaV9uYW1lID0gKG5ld3N0dC0+aWRiYXNlID4+IDQpICsgMTsKKwkJCXJzYy0+bWVtb3B0ID0gYW5kc3VtOyAvKiBTZXQgdG8gbGVhc3QgY29tbW9uIGRlbm9taW5hdG9yICovCisJCQluZXdzdHQtPm1lbW9wdCA9IGFuZHN1bTsKKwkJCW5ld3N0dC0+bHZjLmNoYXJhY3RzID0gY2hhcmFjdHM7CisJCQluZXdzdHQtPmx2Yy52ZXJzaW9uID0gdmVyc2lvbjsKKwkJCWlmKCFyc2NsaXN0KQorCQkJeworCQkJCXJzY2xpc3QgPSByc2M7CisJCQkJcnNjdGFpbCA9IHJzYzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyc2N0YWlsLT5uZXh0ID0gcnNjOworCQkJCXJzYy0+cHJldiA9IHJzY3RhaWw7CisJCQkJcnNjdGFpbCA9IHJzYzsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcnNjbGlzdDsKK30KKworLyogQ3Vyc29yIGFuZCBpY29uIHNwbGl0dGVyIGZ1bmN0aW9ucyAqLworaW50IGFsbG9jX2ljb25faWQodm9pZCkKK3sKKwlzdGF0aWMgaW50IGljb25faWQgPSAxOworCXJldHVybiBpY29uX2lkKys7Cit9CisKK2ludCBhbGxvY19jdXJzb3JfaWQodm9pZCkKK3sKKwlzdGF0aWMgaW50IGN1cnNvcl9pZCA9IDE7CisJcmV0dXJuIGN1cnNvcl9pZCsrOworfQorCisjZGVmaW5lIEJQVFIoYmFzZSkJKChjaGFyICopKHJkLT5kYXRhICsgKGJhc2UpKSkKKyNkZWZpbmUgV1BUUihiYXNlKQkoKFdPUkQgKikocmQtPmRhdGEgKyAoYmFzZSkpKQorI2RlZmluZSBEUFRSKGJhc2UpCSgoRFdPUkQgKikocmQtPmRhdGEgKyAoYmFzZSkpKQordm9pZCBzcGxpdF9pY29ucyhyYXdfZGF0YV90ICpyZCwgaWNvbl9ncm91cF90ICppY29nLCBpbnQgKm5pY28pCit7CisJaW50IGNudDsKKwlpbnQgaTsKKwlpY29uX2Rpcl9lbnRyeV90ICppZGU7CisJaWNvbl90ICppY287CisJaWNvbl90ICpsaXN0ID0gTlVMTDsKKworCS8qIEZJWE1FOiBEaXN0aW5ndWlzaCBiZXR3ZWVuIG5vcm1hbCBhbmQgYW5pbWF0ZWQgaWNvbnMgKFJJRkYgZm9ybWF0KSAqLworCWlmKFdQVFIoMClbMV0gIT0gMSkKKwkJeXllcnJvcigiSWNvbiByZXNvdXJjZSBkYXRhIGhhcyBpbnZhbGlkIHR5cGUgaWQgJWQiLCBXUFRSKDApWzFdKTsKKwljbnQgPSBXUFRSKDApWzJdOworCWlkZSA9IChpY29uX2Rpcl9lbnRyeV90ICopJihXUFRSKDApWzNdKTsKKwlmb3IoaSA9IDA7IGkgPCBjbnQ7IGkrKykKKwl7CisJCWljbyA9IG5ld19pY29uKCk7CisJCWljby0+aWQgPSBhbGxvY19pY29uX2lkKCk7CisJCWlmKGlkZVtpXS5vZmZzZXQgPiByZC0+c2l6ZQorCQl8fCBpZGVbaV0ub2Zmc2V0ICsgaWRlW2ldLnJlc3NpemUgPiByZC0+c2l6ZSkKKwkJCXl5ZXJyb3IoIkljb24gcmVzb3VyY2UgZGF0YSBjb3JydXB0Iik7CisJCWljby0+d2lkdGggPSBpZGVbaV0ud2lkdGg7CisJCWljby0+aGVpZ2h0ID0gaWRlW2ldLmhlaWdodDsKKwkJaWNvLT5uY2xyID0gaWRlW2ldLm5jbHI7CisJCWljby0+cGxhbmVzID0gaWRlW2ldLnBsYW5lczsKKwkJaWNvLT5iaXRzID0gaWRlW2ldLmJpdHM7CisJCWlmKCFpY28tPnBsYW5lcykKKwkJeworCQkJLyogQXJnaCEgVGhleSBkaWQgbm90IGZpbGwgb3V0IHRoZSByZXNkaXIgc3RydWN0dXJlICovCisJCQlpY28tPnBsYW5lcyA9ICgoQklUTUFQSU5GT0hFQURFUiAqKUJQVFIoaWRlW2ldLm9mZnNldCkpLT5iaVBsYW5lczsKKwkJfQorCQlpZighaWNvLT5iaXRzKQorCQl7CisJCQkvKiBBcmdoISBUaGV5IGRpZCBub3QgZmlsbCBvdXQgdGhlIHJlc2RpciBzdHJ1Y3R1cmUgKi8KKwkJCWljby0+Yml0cyA9ICgoQklUTUFQSU5GT0hFQURFUiAqKUJQVFIoaWRlW2ldLm9mZnNldCkpLT5iaUJpdENvdW50OworCQl9CisJCWljby0+ZGF0YSA9IG5ld19yYXdfZGF0YSgpOworCQljb3B5X3Jhd19kYXRhKGljby0+ZGF0YSwgcmQsIGlkZVtpXS5vZmZzZXQsIGlkZVtpXS5yZXNzaXplKTsKKwkJaWYoIWxpc3QpCisJCXsKKwkJCWxpc3QgPSBpY287CisJCX0KKwkJZWxzZQorCQl7CisJCQlpY28tPm5leHQgPSBsaXN0OworCQkJbGlzdC0+cHJldiA9IGljbzsKKwkJCWxpc3QgPSBpY287CisJCX0KKwl9CisJaWNvZy0+aWNvbmxpc3QgPSBsaXN0OworCSpuaWNvID0gY250OworfQorCit2b2lkIHNwbGl0X2N1cnNvcnMocmF3X2RhdGFfdCAqcmQsIGN1cnNvcl9ncm91cF90ICpjdXJnLCBpbnQgKm5jdXIpCit7CisJaW50IGNudDsKKwlpbnQgaTsKKwljdXJzb3JfZGlyX2VudHJ5X3QgKmNkZTsKKwljdXJzb3JfdCAqY3VyOworCWN1cnNvcl90ICpsaXN0ID0gTlVMTDsKKworCS8qIEZJWE1FOiBEaXN0aW5ndWlzaCBiZXR3ZWVuIG5vcm1hbCBhbmQgYW5pbWF0ZWQgY3Vyc29ycyAoUklGRiBmb3JtYXQpKi8KKwlpZihXUFRSKDApWzFdICE9IDIpCisJCXl5ZXJyb3IoIkN1cnNvciByZXNvdXJjZSBkYXRhIGhhcyBpbnZhbGlkIHR5cGUgaWQgJWQiLCBXUFRSKDApWzFdKTsKKwljbnQgPSBXUFRSKDApWzJdOworCWNkZSA9IChjdXJzb3JfZGlyX2VudHJ5X3QgKikmKFdQVFIoMClbM10pOworCWZvcihpID0gMDsgaSA8IGNudDsgaSsrKQorCXsKKwkJY3VyID0gbmV3X2N1cnNvcigpOworCQljdXItPmlkID0gYWxsb2NfY3Vyc29yX2lkKCk7CisJCWlmKGNkZVtpXS5vZmZzZXQgPiByZC0+c2l6ZQorCQl8fCBjZGVbaV0ub2Zmc2V0ICsgY2RlW2ldLnJlc3NpemUgPiByZC0+c2l6ZSkKKwkJCXl5ZXJyb3IoIkN1cnNvciByZXNvdXJjZSBkYXRhIGNvcnJ1cHQiKTsKKwkJY3VyLT53aWR0aCA9IGNkZVtpXS53aWR0aDsKKwkJY3VyLT5oZWlnaHQgPSBjZGVbaV0uaGVpZ2h0OworCQljdXItPm5jbHIgPSBjZGVbaV0ubmNscjsKKwkJLyogVGhlIG5leHQgdHdvIGFyZSB0byBzdXBwb3J0IGNvbG9yIGN1cnNvcnMgKi8KKwkJY3VyLT5wbGFuZXMgPSAoKEJJVE1BUElORk9IRUFERVIgKilCUFRSKGNkZVtpXS5vZmZzZXQpKS0+YmlQbGFuZXM7CisJCWN1ci0+Yml0cyA9ICgoQklUTUFQSU5GT0hFQURFUiAqKUJQVFIoY2RlW2ldLm9mZnNldCkpLT5iaUJpdENvdW50OworCQlpZighd2luMzIgJiYgKGN1ci0+cGxhbmVzICE9IDEgfHwgY3VyLT5iaXRzICE9IDEpKQorCQkJeXl3YXJuaW5nKCJXaW4xNiBjdXJzb3IgY29udGFpbnMgY29sb3JzIik7CisJCWN1ci0+eGhvdCA9IGNkZVtpXS54aG90OworCQljdXItPnlob3QgPSBjZGVbaV0ueWhvdDsKKwkJY3VyLT5kYXRhID0gbmV3X3Jhd19kYXRhKCk7CisJCWNvcHlfcmF3X2RhdGEoY3VyLT5kYXRhLCByZCwgY2RlW2ldLm9mZnNldCwgY2RlW2ldLnJlc3NpemUpOworCQlpZighbGlzdCkKKwkJeworCQkJbGlzdCA9IGN1cjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWN1ci0+bmV4dCA9IGxpc3Q7CisJCQlsaXN0LT5wcmV2ID0gY3VyOworCQkJbGlzdCA9IGN1cjsKKwkJfQorCX0KKwljdXJnLT5jdXJzb3JsaXN0ID0gbGlzdDsKKwkqbmN1ciA9IGNudDsKK30KKworI3VuZGVmCUJQVFIKKyN1bmRlZglXUFRSCisjdW5kZWYJRFBUUgorCisKZGlmZiAtLWdpdCBhL3Rvb2xzL3dyYy9wcmVwcm9jLmMgYi90b29scy93cmMvcHJlcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MjNiYzUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy93cmMvcHJlcHJvYy5jCkBAIC0wLDAgKzEsMjgxIEBACisvKgorICogQ29weXJpZ2h0IDE5OTggQmVydGhvIEEuIFN0dWx0aWVucyAoQlMpCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSAid3JjLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJwcmVwcm9jLmgiCisjaW5jbHVkZSAicGFyc2VyLmgiCisKKworZXh0ZXJuIHZvaWQgc2V0X3BwX2lnbm9yZShpbnQpOwkvKiBGcm9tIHBhcnNlci5sICovCisKK3N0YXRpYyBjaGFyICpjdXJyZW50X2RlZmluZTsKKworI2RlZmluZSBIQVNIS0VZCQkyMDM5CitzdGF0aWMgc3RydWN0IHBwX2VudHJ5ICpwcF9kZWZpbmVzW0hBU0hLRVldOworCisjZGVmaW5lIE1BWElGU1RBQ0sJNjQKK3N0YXRpYyBzdHJ1Y3QgaWZfc3RhdGUgaWZzdGFja1tNQVhJRlNUQUNLXTsKK3N0YXRpYyBpbnQgaWZzdGFja2lkeCA9IDA7CisKKyNpZiAwCit2b2lkIHBwX3N0YXR1cyh2b2lkKQoreworCWludCBpOworCWludCBzdW07CisJaW50IHRvdGFsID0gMDsKKwlzdHJ1Y3QgcHBfZW50cnkgKnBwcDsKKworCXByaW50ZigiRGVmaW5lcyBzdGF0aXN0aWNzOlxuIik7CisJZm9yKGkgPSAwOyBpIDwgSEFTSEtFWTsgaSsrKQorCXsKKwkJc3VtID0gMDsKKwkJZm9yKHBwcCA9IHBwX2RlZmluZXNbaV07IHBwcDsgcHBwID0gcHBwLT5uZXh0KQorCQkJc3VtKys7CisJCXRvdGFsICs9IHN1bTsKKwkJcHJpbnRmKCIlNGQsICUzZFxuIiwgaSwgc3VtKTsKKwl9CisJcHJpbnRmKCJUb3RhbCBkZWZpbmVzOiAlZFxuIiwgdG90YWwpOworfQorI3ByYWdtYSBleGl0IHBwX3N0YXR1cworI2VuZGlmCisKKy8qIERvbid0IGNvbW1lbnQgb24gdGhlIGhhc2gsIGl0cyBwcmltaXRpdmUgYnV0IGZ1bmN0aW9uYWwuLi4gKi8KK2ludCBwcF9oYXNoKGNoYXIgKnN0cikKK3sKKwlpbnQgc3VtID0gMDsKKwl3aGlsZSgqc3RyKQorCQlzdW0gKz0gKnN0cisrOworCXJldHVybiBzdW0gJSBIQVNIS0VZOworfQorCitzdHJ1Y3QgcHBfZW50cnkgKnBwX2xvb2t1cChjaGFyICppZGVudCkKK3sKKwlpbnQgaW5kZXggPSBwcF9oYXNoKGlkZW50KTsKKwlzdHJ1Y3QgcHBfZW50cnkgKnBwcDsKKwlmb3IocHBwID0gcHBfZGVmaW5lc1tpbmRleF07IHBwcDsgcHBwID0gcHBwLT5uZXh0KQorCXsKKwkJaWYoIXN0cmNtcChpZGVudCwgcHBwLT5pZGVudCkpCisJCQlyZXR1cm4gcHBwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBzZXRfZGVmaW5lKGNoYXIgKm5hbWUpCit7CisJY3VycmVudF9kZWZpbmUgPSB4c3RyZHVwKG5hbWUpOworfQorCit2b2lkIGRlbF9kZWZpbmUoY2hhciAqbmFtZSkKK3sKKwlpbnQgaW5kZXg7CisJc3RydWN0IHBwX2VudHJ5ICpwcHA7CisKKwlpZigocHBwID0gcHBfbG9va3VwKG5hbWUpKSA9PSBOVUxMKQorCXsKKwkJaWYocGVkYW50aWMpCisJCQl5eXdhcm5pbmcoIiVzIHdhcyBub3QgZGVmaW5lZCIsIG5hbWUpOworCQlyZXR1cm47CisJfQorCisJaW5kZXggPSBwcF9oYXNoKG5hbWUpOworCWlmKHBwX2RlZmluZXNbaW5kZXhdID09IHBwcCkKKwl7CisJCXBwX2RlZmluZXNbaW5kZXhdID0gcHBwLT5uZXh0OworCQlpZihwcF9kZWZpbmVzW2luZGV4XSkKKwkJCXBwX2RlZmluZXNbaW5kZXhdLT5wcmV2ID0gTlVMTDsKKwl9CisJZWxzZQorCXsKKwkJcHBwLT5wcmV2LT5uZXh0ID0gcHBwLT5uZXh0OworCQlpZihwcHAtPm5leHQpCisJCQlwcHAtPm5leHQtPnByZXYgPSBwcHAtPnByZXY7CisJfQorCWZyZWUocHBwKTsKK30KKwordm9pZCBhZGRfZGVmaW5lKGNoYXIgKnRleHQpCit7CisJaW50IGxlbjsKKwljaGFyICpjcHRyOworCWludCBpbmRleCA9IHBwX2hhc2goY3VycmVudF9kZWZpbmUpOworCXN0cnVjdCBwcF9lbnRyeSAqcHBwOworCWlmKHBwX2xvb2t1cChjdXJyZW50X2RlZmluZSkgIT0gTlVMTCkKKwl7CisJCWlmKHBlZGFudGljKQorCQkJeXl3YXJuaW5nKCJSZWRlZmluaXRpb24gb2YgJXMiLCBjdXJyZW50X2RlZmluZSk7CisJCWRlbF9kZWZpbmUoY3VycmVudF9kZWZpbmUpOworCX0KKwlwcHAgPSAoc3RydWN0IHBwX2VudHJ5ICopeG1hbGxvYyhzaXplb2Yoc3RydWN0IHBwX2VudHJ5KSk7CisJcHBwLT5pZGVudCA9IGN1cnJlbnRfZGVmaW5lOworCXBwcC0+c3Vic3QgPSB4c3RyZHVwKHRleHQpOworCXBwcC0+bmV4dCA9IHBwX2RlZmluZXNbaW5kZXhdOworCXBwX2RlZmluZXNbaW5kZXhdID0gcHBwOworCWlmKHBwcC0+bmV4dCkKKwkJcHBwLT5uZXh0LT5wcmV2ID0gcHBwOworCS8qIFN0cmlwIHRyYWlsaW5nIHdoaXRlIHNwYWNlIGZyb20gc3Vic3QgdGV4dCAqLworCWxlbiA9IHN0cmxlbihwcHAtPnN1YnN0KTsKKwl3aGlsZShsZW4gJiYgc3RyY2hyKCIgXHRcclxuIiwgcHBwLT5zdWJzdFtsZW4tMV0pKQorCXsKKwkJcHBwLT5zdWJzdFstLWxlbl0gPSAnXDAnOworCX0KKwkvKiBTdHJpcCBsZWFkaW5nIHdoaXRlIHNwYWNlIGZyb20gc3Vic3QgdGV4dCAqLworCWZvcihjcHRyID0gcHBwLT5zdWJzdDsgKmNwdHIgJiYgc3RyY2hyKCIgXHRcciIsICpjcHRyKTsgY3B0cisrKQorCQk7CisJaWYocHBwLT5zdWJzdCAhPSBjcHRyKQorCQltZW1tb3ZlKHBwcC0+c3Vic3QsIGNwdHIsIHN0cmxlbihjcHRyKSsxKTsKKwlpZih5eWRlYnVnKQorCQlwcmludGYoIkFkZGVkICglcywgJWQpIDwlcz4gdG8gPCVzPlxuIiwgaW5wdXRfbmFtZSwgbGluZV9udW1iZXIsIHBwcC0+aWRlbnQsIHBwcC0+c3Vic3QpOworfQorCit2b2lkIGFkZF9jbWRsaW5lX2RlZmluZShjaGFyICpzZXQpCit7CisJY2hhciAqY3B5ID0geHN0cmR1cChzZXQpOwkvKiBCZWNhdXNlIGdjYyBwYXNzZXMgYSBSL08gc3RyaW5nICovCisJY2hhciAqY3B0ciA9IHN0cmNocihjcHksICc9Jyk7CisJaWYoY3B0cikKKwkJKmNwdHIgPSAnXDAnOworCXNldF9kZWZpbmUoY3B5KTsKKwlhZGRfZGVmaW5lKGNwdHIgPyBjcHRyKzEgOiAiIik7CisJZnJlZShjcHkpOworfQorCisjaWYgZGVmaW5lZChfV2luZG93cykgfHwgZGVmaW5lZChfX01TRE9TX18pCisjZGVmaW5lIElOQ0xVREVTRVBBUkFUT1IJIjsiCisjZWxzZQorI2RlZmluZSBJTkNMVURFU0VQQVJBVE9SCSI6IgorI2VuZGlmCisKK3N0YXRpYyBjaGFyICoqaW5jbHVkZXBhdGg7CitzdGF0aWMgaW50IG5pbmNsdWRlcGF0aCA9IDA7CisKK3ZvaWQgYWRkX2luY2x1ZGVfcGF0aChjaGFyICpwYXRoKQoreworCWNoYXIgKnRvazsKKwljaGFyICpjcHkgPSB4c3RyZHVwKHBhdGgpOworCisJdG9rID0gc3RydG9rKGNweSwgSU5DTFVERVNFUEFSQVRPUik7CisJd2hpbGUodG9rKQorCXsKKwkJY2hhciAqZGlyOworCQljaGFyICpjcHRyOworCQlpZihzdHJsZW4odG9rKSA9PSAwKQorCQkJY29udGludWU7CisJCWRpciA9IHhzdHJkdXAodG9rKTsKKwkJZm9yKGNwdHIgPSBkaXI7ICpjcHRyOyBjcHRyKyspCisJCXsKKwkJCS8qIENvbnZlcnQgdG8gZm9yd2FyZCBzbGFzaCAqLworCQkJaWYoKmNwdHIgPT0gJ1xcJykKKwkJCQkqY3B0ciA9ICcvJzsKKwkJfQorCQkvKiBLaWxsIGV2ZW50dWFsIHRyYWlsaW5nICcvJyAqLworCQlpZigqKGNwdHIgPSBkaXIgKyBzdHJsZW4oZGlyKS0xKSA9PSAnLycpCisJCQkqY3B0ciA9ICdcMCc7CisKKwkJLyogQWRkIHRvIGxpc3QgKi8KKwkJbmluY2x1ZGVwYXRoKys7CisJCWluY2x1ZGVwYXRoID0gKGNoYXIgKiopeHJlYWxsb2MoaW5jbHVkZXBhdGgsIG5pbmNsdWRlcGF0aCAqIHNpemVvZigqaW5jbHVkZXBhdGgpKTsKKwkJaW5jbHVkZXBhdGhbbmluY2x1ZGVwYXRoLTFdID0gZGlyOworCQl0b2sgPSBzdHJ0b2soTlVMTCwgSU5DTFVERVNFUEFSQVRPUik7CisJfQorCWZyZWUoY3B5KTsKK30KKworRklMRSAqb3Blbl9pbmNsdWRlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBzZWFyY2gpCit7CisJY2hhciAqY3B5ID0geHN0cmR1cChuYW1lKTsKKwljaGFyICpjcHRyOworCUZJTEUgKmZwOworCWludCBpOworCisJZm9yKGNwdHIgPSBjcHk7ICpjcHRyOyBjcHRyKyspCisJeworCQkvKiBraWxsIGRvdWJsZSBiYWNrc2xhc2ggKi8KKwkJaWYoKmNwdHIgPT0gJ1xcJyAmJiAqKGNwdHIrMSkgPT0gJ1xcJykKKwkJCW1lbW1vdmUoY3B0ciwgY3B0cisxLCBzdHJsZW4oY3B0cikpOworCQkvKiBDb252ZXJ0IHRvIGZvcndhcmQgc2xhc2ggKi8KKwkJaWYoKmNwdHIgPT0gJ1xcJykKKwkJCSpjcHRyID0gJy8nOworCX0KKworCWlmKHNlYXJjaCkKKwl7CisJCS8qIFNlYXJjaCBjdXJyZW50IGRpciBhbmQgdGhlbiAtSSBwYXRoICovCisJCWZwID0gZm9wZW4obmFtZSwgInJ0Iik7CisJCWlmKGZwKQorCQl7CisJCQlpZih5eWRlYnVnKQorCQkJCXByaW50ZigiR29pbmcgdG8gaW5jbHVkZSA8JXM+XG4iLCBuYW1lKTsKKwkJCWZyZWUoY3B5KTsKKwkJCXJldHVybiBmcDsKKwkJfQorCX0KKwkvKiBTZWFyY2ggLUkgcGF0aCAqLworCWZvcihpID0gMDsgaSA8IG5pbmNsdWRlcGF0aDsgaSsrKQorCXsKKwkJY2hhciAqcGF0aDsKKwkJcGF0aCA9IChjaGFyICopeG1hbGxvYyhzdHJsZW4oaW5jbHVkZXBhdGhbaV0pICsgc3RybGVuKGNweSkgKyAyKTsKKwkJc3RyY3B5KHBhdGgsIGluY2x1ZGVwYXRoW2ldKTsKKwkJc3RyY2F0KHBhdGgsICIvIik7CisJCXN0cmNhdChwYXRoLCBjcHkpOworCQlmcCA9IGZvcGVuKHBhdGgsICJydCIpOworCQlpZihmcCAmJiB5eWRlYnVnKQorCQkJcHJpbnRmKCJHb2luZyB0byBpbmNsdWRlIDwlcz5cbiIsIHBhdGgpOworCQlmcmVlKHBhdGgpOworCQlpZihmcCkKKwkJeworCQkJZnJlZShjcHkpOworCQkJcmV0dXJuIGZwOworCQl9CisKKwl9CisJZnJlZShjcHkpOworCXJldHVybiBOVUxMOworfQorCit2b2lkIHB1c2hfaWYoaW50IHRydWVjYXNlLCBpbnQgd2FzdHJ1ZSwgaW50IG5ldmVydHJ1ZSkKK3sKKwlpZihpZnN0YWNraWR4ID49IE1BWElGU1RBQ0stMSkKKwkJaW50ZXJuYWxfZXJyb3IoX19GSUxFX18sIF9fTElORV9fLCAiI2lmIHN0YWNrIG92ZXJmbG93Iik7CisJaWZzdGFja1tpZnN0YWNraWR4XS5jdXJyZW50ID0gdHJ1ZWNhc2UgJiYgIXdhc3RydWU7CisJaWZzdGFja1tpZnN0YWNraWR4XS5oYXNiZWVudHJ1ZSA9IHdhc3RydWU7CisJaWZzdGFja1tpZnN0YWNraWR4XS5uZXZlcnRydWUgPSBuZXZlcnRydWU7CisJaWYobmV2ZXJ0cnVlIHx8ICEodHJ1ZWNhc2UgJiYgIXdhc3RydWUpKQorCQlzZXRfcHBfaWdub3JlKDEpOworCWlmKHl5ZGVidWcpCisJCXByaW50ZigicHVzaF9pZjogJWQgJWQgJWQgKCVkICVkICVkKVxuIiwKKwkJCXRydWVjYXNlLAorCQkJd2FzdHJ1ZSwKKwkJCW5ldmVydHJ1ZSwKKwkJCWlmc3RhY2tbaWZzdGFja2lkeF0uY3VycmVudCwKKwkJCWlmc3RhY2tbaWZzdGFja2lkeF0uaGFzYmVlbnRydWUsCisJCQlpZnN0YWNrW2lmc3RhY2tpZHhdLm5ldmVydHJ1ZSk7CisJaWZzdGFja2lkeCsrOworfQorCitpbnQgcG9wX2lmKHZvaWQpCit7CisJaWYoaWZzdGFja2lkeCA8PSAwKQorCQl5eWVycm9yKCIjZW5kaWYgd2l0aG91dCAjaWZ8I2lmZGVmfCNpZm5kZWYgKCNpZiBzdGFjayB1bmRlcmZsb3cpIik7CisJaWZzdGFja2lkeC0tOworCWlmKHl5ZGVidWcpCisJCXByaW50ZigicG9wX2lmOiAlZCAlZCAlZFxuIiwKKwkJCWlmc3RhY2tbaWZzdGFja2lkeF0uY3VycmVudCwKKwkJCWlmc3RhY2tbaWZzdGFja2lkeF0uaGFzYmVlbnRydWUsCisJCQlpZnN0YWNrW2lmc3RhY2tpZHhdLm5ldmVydHJ1ZSk7CisJaWYoaWZzdGFja1tpZnN0YWNraWR4XS5uZXZlcnRydWUgfHwgIWlmc3RhY2tbaWZzdGFja2lkeF0uY3VycmVudCkKKwkJc2V0X3BwX2lnbm9yZSgwKTsKKwlyZXR1cm4gaWZzdGFja1tpZnN0YWNraWR4XS5oYXNiZWVudHJ1ZSB8fCBpZnN0YWNrW2lmc3RhY2tpZHhdLmN1cnJlbnQ7Cit9CisKK2ludCBpc25ldmVydHJ1ZV9pZih2b2lkKQoreworCXJldHVybiBpZnN0YWNraWR4ID4gMCAmJiBpZnN0YWNrW2lmc3RhY2tpZHgtMV0ubmV2ZXJ0cnVlOworfQorCmRpZmYgLS1naXQgYS90b29scy93cmMvcHJlcHJvYy5oIGIvdG9vbHMvd3JjL3ByZXByb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGYxM2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvd3JjL3ByZXByb2MuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IDE5OTggQmVydGhvIEEuIFN0dWx0aWVucyAoQlMpCisgKgorICovCisKKyNpZm5kZWYgX19XUkNfUFJFUFJPQ19ICisjZGVmaW5lIF9fV1JDX1BSRVBST0NfSAorCitzdHJ1Y3QgcHBfZW50cnkgeworCXN0cnVjdCBwcF9lbnRyeSAqbmV4dDsKKwlzdHJ1Y3QgcHBfZW50cnkgKnByZXY7CisJY2hhcgkqaWRlbnQ7CisJY2hhcgkqc3Vic3Q7CisJaW50CWV4cGFuZGluZzsKK307CisKK3N0cnVjdCBpZl9zdGF0ZSB7CisJaW50CWN1cnJlbnQ7CisJaW50CWhhc2JlZW50cnVlOworCWludAluZXZlcnRydWU7Cit9OworCitzdHJ1Y3QgcHBfZW50cnkgKnBwX2xvb2t1cChjaGFyICppZGVudCk7Cit2b2lkIHNldF9kZWZpbmUoY2hhciAqbmFtZSk7Cit2b2lkIGRlbF9kZWZpbmUoY2hhciAqbmFtZSk7Cit2b2lkIGFkZF9kZWZpbmUoY2hhciAqdGV4dCk7Cit2b2lkIGFkZF9jbWRsaW5lX2RlZmluZShjaGFyICpzZXQpOworRklMRSAqb3Blbl9pbmNsdWRlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBzZWFyY2gpOwordm9pZCBhZGRfaW5jbHVkZV9wYXRoKGNoYXIgKnBhdGgpOwordm9pZCBwdXNoX2lmKGludCB0cnVlY2FzZSwgaW50IHdhc3RydWUsIGludCBuZXZlcnRydWUpOworaW50IHBvcF9pZih2b2lkKTsKK2ludCBpc25ldmVydHJ1ZV9pZih2b2lkKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3Rvb2xzL3dyYy9yZWFkcmVzLmMgYi90b29scy93cmMvcmVhZHJlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZmRjNmQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy93cmMvcmVhZHJlcy5jCkBAIC0wLDAgKzEsMzY5IEBACisvKgorICogUmVhZCBhIC5yZXMgZmlsZSBhbmQgY3JlYXRlIGEgcmVzb3VyY2UtdHJlZQorICoKKyAqIENvcHlyaWdodCAxOTk4IEJlcnRobyBBLiBTdHVsdGllbnMKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJ3cmMuaCIKKyNpbmNsdWRlICJyZWFkcmVzLmgiCisjaW5jbHVkZSAibmV3c3RydWMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImdlbnJlcy5oIgorCitzdHJ1Y3QgcmVzaGVhZGVyMzIgeworCURXT1JECXJlc3NpemU7CS8qIDAgKi8KKwlEV09SRAloZHJzaXplOwkvKiAweDIwICovCisJV09SRAlyZXN0eXBlMTsJLyogMHhmZmZmICovCisJV09SRAlyZXN0eXBlMjsJLyogMCAqLworCVdPUkQJcmVzbmFtZTE7CS8qIDB4ZmZmZiAqLworCVdPUkQJcmVzbmFtZTI7CS8qIDAgKi8KKwlEV09SRAlkdmVyc2lvbjsJLyogMCAqLworCVdPUkQJbWVtb3B0OwkJLyogMCAqLworCVdPUkQJbGFuZ3VhZ2U7CS8qIDAgKi8KKwlEV09SRAl2ZXJzaW9uOwkvKiAwICovCisJRFdPUkQJY2hhcmFjdHM7CS8qIDAgKi8KK30gZW1wdHloZWFkZXIgPSB7MCwgMHgyMCwgMHhmZmZmLCAwLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDB9OworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6CisgKiBTeW50YXgJOgorICogSW5wdXQJOgorICogT3V0cHV0CToKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOgorICogU3ludGF4CToKKyAqIElucHV0CToKKyAqIE91dHB1dAk6CisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCToKKyAqIFN5bnRheAk6CisgKiBJbnB1dAk6CisgKiBPdXRwdXQJOgorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCitpbnQgcmVhZF9kYXRhKEZJTEUgKmZwLCBzaXplX3Qgc2l6ZSwgdm9pZCAqYnVmKQoreworCWludCByOworCWludCBwb3MgPSBmdGVsbChmcCk7CisJciA9IGZyZWFkKGJ1ZiwgMSwgc2l6ZSwgZnApOworCWlmKHIgPT0gc2l6ZSkKKwkJcmV0dXJuIDA7CisJaWYociA9PSAwICYmIGZ0ZWxsKGZwKSAtIHBvcyA+IDApCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6CisgKiBTeW50YXgJOgorICogSW5wdXQJOgorICogT3V0cHV0CToKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworZW51bSByZXNfZSByZXNfdHlwZV9mcm9tX2lkKG5hbWVfaWRfdCAqbmlkKQoreworCWlmKG5pZC0+dHlwZSA9PSBuYW1lX3N0cikKKwkJcmV0dXJuIHJlc191c3I7CisKKwlpZihuaWQtPnR5cGUgIT0gbmFtZV9vcmQpCisJCWludGVybmFsX2Vycm9yKF9fRklMRV9fLCBfX0xJTkVfXywgIkludmFsaWQgbmFtZV9pZCBkZXNjcmlwdG9yICVkIiwgbmlkLT50eXBlKTsKKworCXN3aXRjaChuaWQtPm5hbWUuaV9uYW1lKQorCXsKKwljYXNlIFdSQ19SVF9DVVJTT1I6CQlyZXR1cm4gcmVzX2N1cjsKKwljYXNlIFdSQ19SVF9CSVRNQVA6CQlyZXR1cm4gcmVzX2JtcDsKKwljYXNlIFdSQ19SVF9JQ09OOgkJcmV0dXJuIHJlc19pY287CisJY2FzZSBXUkNfUlRfTUVOVToJCXJldHVybiByZXNfbWVuOworCWNhc2UgV1JDX1JUX0RJQUxPRzoJCXJldHVybiByZXNfZGxnOworCWNhc2UgV1JDX1JUX1NUUklORzoJCXJldHVybiByZXNfc3R0OworCWNhc2UgV1JDX1JUX0ZPTlRESVI6CQlyZXR1cm4gcmVzX2ZudGRpcjsKKwljYXNlIFdSQ19SVF9GT05UOgkJcmV0dXJuIHJlc19mbnQ7CisJY2FzZSBXUkNfUlRfQUNDRUxFUkFUT1I6CXJldHVybiByZXNfYWNjOworCWNhc2UgV1JDX1JUX1JDREFUQToJCXJldHVybiByZXNfcmR0OworCWNhc2UgV1JDX1JUX01FU1NBR0VUQUJMRToJcmV0dXJuIHJlc19tc2c7CisJY2FzZSBXUkNfUlRfR1JPVVBfQ1VSU09SOglyZXR1cm4gcmVzX2N1cmc7CisJY2FzZSBXUkNfUlRfR1JPVVBfSUNPTjoJCXJldHVybiByZXNfaWNvZzsKKwljYXNlIFdSQ19SVF9WRVJTSU9OOgkJcmV0dXJuIHJlc192ZXI7CisKKwlkZWZhdWx0OgorCWNhc2UgV1JDX1JUX0RMR0lOQ0xVREU6CisJY2FzZSBXUkNfUlRfUExVR1BMQVk6CisJY2FzZSBXUkNfUlRfVlhEOgorCWNhc2UgV1JDX1JUX0FOSUNVUlNPUjoKKwljYXNlIFdSQ19SVF9BTklJQ09OOgorCQl3YXJuaW5nKCJDYW5ub3QgYmUgc3VyZSBvZiByZXNvdXJjZSB0eXBlLCB1c2luZyB1c2VydHlwZSBzZXR0aW5ncyIpOworCQlyZXR1cm4gcmVzX3VzcjsKKwl9Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCToKKyAqIFN5bnRheAk6CisgKiBJbnB1dAk6CisgKiBPdXRwdXQJOgorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisjZGVmaW5lIGdldF93b3JkKGlkeCkJKCooKFdPUkQgKikoJnJlcy0+ZGF0YVtpZHhdKSkpCisjZGVmaW5lIGdldF9kd29yZChpZHgpCSgqKChEV09SRCAqKSgmcmVzLT5kYXRhW2lkeF0pKSkKKworcmVzb3VyY2VfdCAqcmVhZF9yZXMzMihGSUxFICpmcCkKK3sKKwlzdGF0aWMgY2hhciB3cm9uZ19mb3JtYXRbXSA9ICJXcm9uZyByZXNmaWxlIGZvcm1hdCAoMzJiaXQpIjsKKwlEV09SRCByZXNzaXplOworCURXT1JEIGhkcnNpemU7CisJRFdPUkQgdG90c2l6ZTsKKwlXT1JEIG1lbW9wdDsKKwlXT1JEIGxhbmd1YWdlOworCWludCBlcnI7CisJcmVzX3QgKnJlczsKKwlyZXNvdXJjZV90ICpyc2M7CisJcmVzb3VyY2VfdCAqdGFpbCA9IE5VTEw7CisJcmVzb3VyY2VfdCAqbGlzdCA9IE5VTEw7CisJbmFtZV9pZF90ICp0eXBlID0gTlVMTDsKKwluYW1lX2lkX3QgKm5hbWUgPSBOVUxMOworCWludCBpZHg7CisJZW51bSByZXNfZSByZXNfdHlwZTsKKwl1c2VyX3QgKnVzcnJlczsKKworCXdoaWxlKDEpCisJeworCQkvKiBHZXQgaGVhZGVyc2l6ZSBhbmQgcmVzb3VyY2Ugc2l6ZSAqLworCQllcnIgPSByZWFkX2RhdGEoZnAsIHNpemVvZihyZXNzaXplKSwgJnJlc3NpemUpOworCQlpZihlcnIgPCAwKQorCQkJYnJlYWs7CisJCWVsc2UgaWYoZXJyID4gMCkKKwkJCWVycm9yKHdyb25nX2Zvcm1hdCk7CisJCWVyciA9IHJlYWRfZGF0YShmcCwgc2l6ZW9mKGhkcnNpemUpLCAmaGRyc2l6ZSk7CisJCWlmKGVycikKKwkJCWVycm9yKHdyb25nX2Zvcm1hdCk7CisKKwkJLyogQWxpZ24gc2l6ZXMgYW5kIGNvbXB1dGUgdG90YWwgc2l6ZSAqLworCQl0b3RzaXplID0gaGRyc2l6ZTsKKwkJaWYoaGRyc2l6ZSAmIDMpCisJCXsKKwkJCXdhcm5pbmcoIkh1PyAucmVzIGhlYWRlciBuZWVkZWQgYWxpZ25tZW50IChhbnl0aGluZyBjYW4gaGFwcGVuIG5vdykiKTsKKwkJCXRvdHNpemUgKz0gNCAtIChoZHJzaXplICYgMyk7CisJCX0KKwkJdG90c2l6ZSArPSByZXNzaXplOworCQlpZihyZXNzaXplICYgMykKKwkJCXRvdHNpemUgKz0gNCAtIChyZXNzaXplICYgMyk7CisKKwkJLyogUmVhZCBpbiBlbnRpcmUgZGF0YS1ibG9jayAqLworCQlmc2VlayhmcCwgLTgsIFNFRUtfQ1VSKTsKKwkJcmVzID0gbmV3X3JlcygpOworCQlpZihyZXMtPmFsbG9jc2l6ZSA8IHRvdHNpemUpCisJCQlncm93X3JlcyhyZXMsIHRvdHNpemUgLSByZXMtPmFsbG9jc2l6ZSArIDgpOworCQllcnIgPSByZWFkX2RhdGEoZnAsIHRvdHNpemUsIHJlcy0+ZGF0YSk7CisJCWlmKGVycikKKwkJCWVycm9yKHdyb25nX2Zvcm1hdCk7CisKKwkJcmVzLT5kYXRhaWR4ID0gaGRyc2l6ZTsKKwkJcmVzLT5zaXplID0gaGRyc2l6ZSArIHJlc3NpemU7CisKKwkJLyogQW5hbHlzZSB0aGUgY29udGVudCBvZiB0aGUgaGVhZGVyICovCisJCWlkeCA9IDg7CisJCS8qIEdldCByZXN0eXBlICovCisJCWlmKGdldF93b3JkKGlkeCkgPT0gMHhmZmZmKQorCQl7CisJCQlpZHggKz0gc2l6ZW9mKFdPUkQpOworCQkJdHlwZSA9IG5ld19uYW1lX2lkKCk7CisJCQl0eXBlLT50eXBlID0gbmFtZV9vcmQ7CisJCQl0eXBlLT5uYW1lLmlfbmFtZSA9IGdldF93b3JkKGlkeCk7CisJCQlpZHggKz0gc2l6ZW9mKFdPUkQpOworCQl9CisJCWVsc2UgaWYoZ2V0X3dvcmQoaWR4KSA9PSAwKQorCQl7CisJCQllcnJvcigiUmVzVHlwZSBuYW1lIGhhcyB6ZXJvIGxlbmd0aCAoMzIgYml0KSIpOworCQl9CisJCWVsc2UKKwkJeworCQkJaW50IHRhZyA9IGlkeDsKKwkJCXN0cmluZ190ICpzdHI7CisJCQl3aGlsZSgxKQorCQkJeworCQkJCWlkeCArPSBzaXplb2YoV09SRCk7CisJCQkJaWYoIWdldF93b3JkKGlkeCkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWR4ICs9IHNpemVvZihXT1JEKTsKKwkJCXN0ciA9IG5ld19zdHJpbmcoKTsKKwkJCXN0ci0+dHlwZSA9IHN0cl91bmljb2RlOworCQkJc3RyLT5zaXplID0gKGlkeCAtIHRhZykgLyAyOworCQkJc3RyLT5zdHIud3N0ciA9IChzaG9ydCAqKXhtYWxsb2MoaWR4LXRhZysyKTsKKwkJCW1lbWNweShzdHItPnN0ci53c3RyLCAmcmVzLT5kYXRhW3RhZ10sIGlkeC10YWcpOworCQkJc3RyLT5zdHIud3N0cltzdHItPnNpemVdID0gMDsKKwkJCXR5cGUgPSBuZXdfbmFtZV9pZCgpOworCQkJdHlwZS0+dHlwZSA9IG5hbWVfc3RyOworCQkJdHlwZS0+bmFtZS5zX25hbWUgPSBzdHI7CisJCX0KKwkJLyogR2V0IHJlc25hbWUgKi8KKwkJaWYoZ2V0X3dvcmQoaWR4KSA9PSAweGZmZmYpCisJCXsKKwkJCWlkeCArPSBzaXplb2YoV09SRCk7CisJCQluYW1lID0gbmV3X25hbWVfaWQoKTsKKwkJCW5hbWUtPnR5cGUgPSBuYW1lX29yZDsKKwkJCW5hbWUtPm5hbWUuaV9uYW1lID0gZ2V0X3dvcmQoaWR4KTsKKwkJCWlkeCArPSBzaXplb2YoV09SRCk7CisJCX0KKwkJZWxzZSBpZihnZXRfd29yZChpZHgpID09IDApCisJCXsKKwkJCWVycm9yKCJSZXNOYW1lIG5hbWUgaGFzIHplcm8gbGVuZ3RoICgzMiBiaXQpIik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpbnQgdGFnID0gaWR4OworCQkJc3RyaW5nX3QgKnN0cjsKKwkJCXdoaWxlKDEpCisJCQl7CisJCQkJaWR4ICs9IHNpemVvZihXT1JEKTsKKwkJCQlpZighZ2V0X3dvcmQoaWR4KSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZHggKz0gc2l6ZW9mKFdPUkQpOworCQkJc3RyID0gbmV3X3N0cmluZygpOworCQkJc3RyLT50eXBlID0gc3RyX3VuaWNvZGU7CisJCQlzdHItPnNpemUgPSAoaWR4IC0gdGFnKSAvIDI7CisJCQlzdHItPnN0ci53c3RyID0gKHNob3J0ICopeG1hbGxvYyhpZHgtdGFnKzIpOworCQkJbWVtY3B5KHN0ci0+c3RyLndzdHIsICZyZXMtPmRhdGFbdGFnXSwgaWR4LXRhZyk7CisJCQlzdHItPnN0ci53c3RyW3N0ci0+c2l6ZV0gPSAwOworCQkJbmFtZSA9IG5ld19uYW1lX2lkKCk7CisJCQluYW1lLT50eXBlID0gbmFtZV9zdHI7CisJCQluYW1lLT5uYW1lLnNfbmFtZSA9IHN0cjsKKwkJfQorCisJCS8qIGFsaWduICovCisJCWlmKGlkeCAmIDB4MykKKwkJCWlkeCArPSA0IC0gKGlkeCAmIDMpOworCisJCWlkeCArPSBzaXplb2YoRFdPUkQpOwkvKiBTa2lwIERhdGFWZXJzaW9uICovCisJCW1lbW9wdCA9IGdldF93b3JkKGlkeCk7CisJCWlkeCArPSBzaXplb2YoV09SRCk7CisJCWxhbmd1YWdlID0gZ2V0X3dvcmQoaWR4KTsKKworCQkvKiBCdWlsZCBhIHJlc291cmNlX3QgbGlzdCAqLworCQlyZXNfdHlwZSA9IHJlc190eXBlX2Zyb21faWQodHlwZSk7CisJCWlmKHJlc190eXBlID09IHJlc191c3IpCisJCXsKKwkJCS8qIFVzZXItdHlwZSBoYXMgY3VzdG9tIFJlc1R5cGUgZm9yIC5bc3xoXSBnZW5lcmF0aW9uICovCisJCQl1c3JyZXMgPSBuZXdfdXNlcih0eXBlLCBOVUxMLCBuZXdfaW50KG1lbW9wdCkpOworCQl9CisJCWVsc2UKKwkJCXVzcnJlcyA9IE5VTEw7CisJCXJzYyA9IG5ld19yZXNvdXJjZShyZXNfdHlwZSwKKwkJCQkgICB1c3JyZXMsCisJCQkJICAgbWVtb3B0LAorCQkJCSAgIG5ld19sYW5ndWFnZShQUklNQVJZTEFOR0lEKGxhbmd1YWdlKSwKKwkJCQkJCVNVQkxBTkdJRChsYW5ndWFnZSkpKTsKKwkJcnNjLT5iaW5yZXMgPSByZXM7CisJCXJzYy0+bmFtZSA9IG5hbWU7CisJCXJzYy0+Y19uYW1lID0gbWFrZV9jX25hbWUoZ2V0X2NfdHlwZW5hbWUocmVzX3R5cGUpLCBuYW1lLCByc2MtPmxhbik7CisJCWlmKCFsaXN0KQorCQl7CisJCQlsaXN0ID0gcnNjOworCQkJdGFpbCA9IHJzYzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJzYy0+cHJldiA9IHRhaWw7CisJCQl0YWlsLT5uZXh0ID0gcnNjOworCQkJdGFpbCA9IHJzYzsKKwkJfQorCX0KKwlyZXR1cm4gbGlzdDsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOgorICogU3ludGF4CToKKyAqIElucHV0CToKKyAqIE91dHB1dAk6CisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK3Jlc291cmNlX3QgKnJlYWRfcmVzMTYoRklMRSAqZnApCit7CisJaW50ZXJuYWxfZXJyb3IoX19GSUxFX18sIF9fTElORV9fLCAiQ2FuJ3QgeWV0IHJlYWQgMTYgYml0IC5yZXMgZmlsZXMiKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiByZWFkX3Jlc2ZpbGUKKyAqIFN5bnRheAk6IHJlc291cmNlX3QgKnJlYWRfcmVzZmlsZShjaGFyICppbm5hbWUpCisgKiBJbnB1dAk6CisgKiBPdXRwdXQJOgorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCityZXNvdXJjZV90ICpyZWFkX3Jlc2ZpbGUoY2hhciAqaW5uYW1lKQoreworCUZJTEUgKmZwOworCXN0cnVjdCByZXNoZWFkZXIzMiByaDsKKwlpbnQgaXMzMmJpdDsKKwlyZXNvdXJjZV90ICp0b3A7CisKKwlmcCA9IGZvcGVuKGlubmFtZSwgInJiIik7CisJaWYoIWZwKQorCQllcnJvcigiQ291bGQgbm90IG9wZW4gaW5wdXRmaWxlICVzIiwgaW5uYW1lKTsKKworCS8qIERldGVybWluZSAxNiBvciAzMiBiaXQgLnJlcyBmaWxlICovCisJaWYoZnJlYWQoJnJoLCAxLCBzaXplb2YocmgpLCBmcCkgIT0gc2l6ZW9mKHJoKSkKKwkJaXMzMmJpdCA9IDA7CisJZWxzZQorCXsKKwkJaWYoIW1lbWNtcCgmZW1wdHloZWFkZXIsICZyaCwgc2l6ZW9mKHJoKSkpCisJCQlpczMyYml0ID0gMTsKKwkJZWxzZQorCQkJaXMzMmJpdCA9IDA7CisJfQorCisJaWYoaXMzMmJpdCAmJiAhd2luMzIpCisJCWVycm9yKCJDYW5ub3QgY29udmVydCAzMi1iaXQgLnJlcy1maWxlIGludG8gMTYtYml0IHJlc291cmNlcyAoYW5kIHdpbGwsIGhvcGVmdWxseSBuZXZlciwgaW1wbGVtZW50IGl0KSIpOworCisJaWYoIWlzMzJiaXQgJiYgd2luMzIpCisJCWVycm9yKCJDYW5ub3QgKHlldCkgY29udmVydCAxNi1iaXQgLnJlcy1maWxlIGludG8gMzItYml0IHJlc291cmNlcyIpOworCisJaWYoIWlzMzJiaXQpCisJeworCQlmc2VlayhmcCwgMCwgU0VFS19TRVQpOworCQl0b3AgPSByZWFkX3JlczE2KGZwKTsKKwl9CisJZWxzZQorCXsKKwkJdG9wID0gcmVhZF9yZXMzMihmcCk7CisJfQorCisJZmNsb3NlKGZwKTsKKworCXJldHVybiB0b3A7Cit9CmRpZmYgLS1naXQgYS90b29scy93cmMvcmVhZHJlcy5oIGIvdG9vbHMvd3JjL3JlYWRyZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODdkYTUxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvd3JjL3JlYWRyZXMuaApAQCAtMCwwICsxLDE3IEBACisvKgorICogUmVhZCBiaW5hcnkgcmVzb3VyY2UgcHJvdG90eXBlcworICoKKyAqIENvcHlyaWdodCAxOTk4IEJlcnRobyBBLiBTdHVsdGllbnMgKEJTKQorICoKKyAqLworCisjaWZuZGVmIF9fV1JDX1JFQURSRVNfSAorI2RlZmluZSBfX1dSQ19SRUFEUkVTX0gKKworI2lmbmRlZiBfX1dSQ19XUkNUWVBFU19ICisjaW5jbHVkZSAid3JjdHlwZXMuaCIKKyNlbmRpZgorCityZXNvdXJjZV90ICpyZWFkX3Jlc2ZpbGUoY2hhciAqaW5uYW1lKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy93cmMvdXRpbHMuYyBiL3Rvb2xzL3dyYy91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMjgzMmYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy93cmMvdXRpbHMuYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy93cmMvdXRpbHMuaCBiL3Rvb2xzL3dyYy91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNjYxM2EKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy93cmMvdXRpbHMuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogVXRpbGl0eSByb3V0aW5lcycgcHJvdG90eXBlcyBldGMuCisgKgorICogQ29weXJpZ2h0IDE5OTggQmVydGhvIEEuIFN0dWx0aWVucyAoQlMpCisgKgorICovCisKKyNpZm5kZWYgX19XUkNfVVRJTFNfSAorI2RlZmluZSBfX1dSQ19VVElMU19ICisKKyNpZm5kZWYgX19XUkNfV1JDVFlQRVNfSAorI2luY2x1ZGUgIndyY3R5cGVzLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgkvKiBzaXplX3QgKi8KKwordm9pZCAqeG1hbGxvYyhzaXplX3QpOwordm9pZCAqeHJlYWxsb2Modm9pZCAqLCBzaXplX3QpOworY2hhciAqeHN0cmR1cChjb25zdCBjaGFyICpzdHIpOworCitpbnQgeXllcnJvcihjb25zdCBjaGFyICpzLCAuLi4pOworaW50IHl5d2FybmluZyhjb25zdCBjaGFyICpzLCAuLi4pOwordm9pZCBpbnRlcm5hbF9lcnJvcihjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqcywgLi4uKTsKK3ZvaWQgZXJyb3IoY29uc3QgY2hhciAqcywgLi4uKTsKK3ZvaWQgd2FybmluZyhjb25zdCBjaGFyICpzLCAuLi4pOwordm9pZCBjaGF0KGNvbnN0IGNoYXIgKnMsIC4uLik7CisKK2NoYXIgKmR1cF9iYXNlbmFtZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpleHQpOworaW50IHN0cmluZ19jb21wYXJlKGNvbnN0IHN0cmluZ190ICpzMSwgY29uc3Qgc3RyaW5nX3QgKnMyKTsKK2ludCB3c3RybGVuKGNvbnN0IHNob3J0ICpzKTsKK3Nob3J0ICp3c3RyY3B5KHNob3J0ICpkc3QsIGNvbnN0IHNob3J0ICpzcmMpOworaW50IHdzdHJpY21wKGNvbnN0IHNob3J0ICpzMSwgY29uc3Qgc2hvcnQgKnMyKTsKK2NoYXIgKmR1cHdzdHIyY3N0cihjb25zdCBzaG9ydCAqc3RyKTsKK3Nob3J0ICpkdXBjc3RyMndzdHIoY29uc3QgY2hhciAqc3RyKTsKKworI2lmbmRlZiBIQVZFX1NUUklDTVAKK2ludCBzdHJpY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy93cmMvd3JjLmMgYi90b29scy93cmMvd3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwY2YxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3dyYy93cmMuYwpAQCAtMCwwICsxLDQ5MiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgIE1hcnRpbiB2b24gTG9ld2lzLCAxOTk0CisgKiBDb3B5cmlnbnQgMTk5OCBCZXJ0aG8gQS4gU3R1bHRpZW5zIChCUykKKyAqCisgKiAyMS1NYXktMTk5OCBCUwktIFJlbW92ZWQgdGhlIENQUCBvcHRpb24uIEl0cyBpbnRlcm5hbCBub3cuCisgKgkJCS0gQWRkZWQgaW1wbGVtZW50YXRpb25zIGZvciBkZWZpbmVzIGFuZCBpbmNsdWRlcworICoJCQkgIG9uIHRoZSBjb21tYW5kbGluZS4KKyAqCisgKiAzMC1BcHItMTk5OCBCUwktIFRoZSBvcHRpb25zIG5vdyBjb250YWluIG5lYXJseSB0aGUgZW50aXJlIGFscGhhYmV0LgorICoJCQkgIFNlZW1zIHRvIGJlIGEgc2lnbiBmb3IgdG9vIG11Y2ggZnJlZWRvbS4gSSBpbXBsZW1ldGVkCisgKgkJCSAgbW9zdCBvZiB0aGVtIGFzIGEgdXNlciBjaG9pY2UgcG9zc2liaWxpdHkgZm9yIHRoaW5ncworICoJCQkgIHRoYXQgSSBkbyBub3Qga25vdyB3aGF0IHRvIHB1dCB0aGVyZSBieSBkZWZhdWx0LgorICoJCQktIC1sIGFuZCAtTCBvcHRpb25zIGFyZSBub3cga25vd24gYXMgLXQgYW5kIC1ULgorICoKKyAqIDIzLUFwci0xOTk4IEJTCS0gRmluYWxseSBnYXZlIHVwIG9uIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb24gdGhlCisgKgkJCSAgY29tbWFuZGxpbmUgKGFmdGVyIGEgYmxlc3NpbmcgZnJvbSB0aGUgbmV3c2dyb3VwKS4KKyAqCQkJICBTbywgSSBjaGFuZ2VkIHRoZSBsb3QuCisgKgorICogMTctQXByLTE5OTggQlMJLSBBZGRlZCBtYW55IG5ldyBjb21tYW5kLWxpbmUgb3B0aW9ucyBidXQgdG9vayBjYXJlCisgKgkJCSAgdGhhdCBpdCB3b3VsZCBub3QgYnJlYWsgb2xkIHNjcmlwdHMgKHNpZ2gpLgorICoKKyAqIDE2LUFwci0xOTk4IEJTCS0gVGhlcmUgaXMgbm90IG11Y2ggbGVmdCBvZiB0aGUgb3JpZ2luYWwgc291cmNlLi4uCisgKgkJCSAgSSBoYWQgdG8gcmV3cml0ZSBtb3N0IG9mIGl0IGJlY2F1c2UgdGhlIHBhcnNlcgorICoJCQkgIGNoYW5nZWQgY29tcGxldGVseSB3aXRoIGFsbCB0aGUgdHlwZXMgZXRjLi4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgIndyYy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAid3JpdGVyZXMuaCIKKyNpbmNsdWRlICJyZWFkcmVzLmgiCisjaW5jbHVkZSAiZHVtcHJlcy5oIgorI2luY2x1ZGUgImdlbnJlcy5oIgorI2luY2x1ZGUgIm5ld3N0cnVjLmgiCisjaW5jbHVkZSAicHJlcHJvYy5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorCitjaGFyIHVzYWdlW10gPSAiVXNhZ2U6IHdyYyBbb3B0aW9ucy4uLl0gW2luZmlsZVsucmN8LnJlc11dXG4iCisJIiAgIC1hIG4gICAgICAgIEFsaWdubWVudCBvZiByZXNvdXJjZSAod2luMTYgb25seSwgZGVmYXVsdCBpcyA0KVxuIgorCSIgICAtYiAgICAgICAgICBDcmVhdGUgYSBDIGFycmF5IGZyb20gYSBiaW5hcnkgLnJlcyBmaWxlXG4iCisJIiAgIC1jICAgICAgICAgIEFkZCAnY29uc3QnIHByZWZpeCB0byBDIGNvbnN0YW50c1xuIgorCSIgICAtQyBjcCAgICAgICBTZXQgdGhlIHJlc291cmNlJ3MgY29kZXBhZ2UgdG8gY3AgKGRlZmF1bHQgaXMgMClcbiIKKwkiICAgLWQgbiAgICAgICAgU2V0IGRlYnVnIGxldmVsIHRvICduJ1xuIgorCSIgICAtRCBpZFs9dmFsXSBEZWZpbmUgcHJlcHJvY2Vzc29yIGlkZW50aWZpZXIgaWQ9dmFsXG4iCisJIiAgIC1lICAgICAgICAgIERpc2FibGUgcmVjb2duaXRpb24gb2Ygd2luMzIga2V5d29yZHMgaW4gMTZiaXQgY29tcGlsZVxuIgorCSIgICAtZyAgICAgICAgICBBZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGMgbmFtZXNwYWNlXG4iCisJIiAgIC1oICAgICAgICAgIEFsc28gZ2VuZXJhdGUgYSAuaCBmaWxlXG4iCisJIiAgIC1IIGZpbGUgICAgIFNhbWUgYXMgLWggYnV0IHdyaXR0ZW4gdG8gZmlsZVxuIgorCSIgICAtSSBwYXRoICAgICBTZXQgaW5jbHVkZSBzZWFyY2ggZGlyIHRvIHBhdGggKG11bHRpcGxlIC1JIGFsbG93ZWQpXG4iCisJIiAgIC1sIGxhbiAgICAgIFNldCBkZWZhdWx0IGxhbmd1YWdlIHRvIGxhbiAoZGVmYXVsdCBpcyBuZXV0cmFsIHswfSlcbiIKKwkiICAgLW4gICAgICAgICAgRG8gbm90IGdlbmVyYXRlIC5zIGZpbGVcbiIKKwkiICAgLW8gZmlsZSAgICAgT3V0cHV0IHRvIGZpbGUgKGRlZmF1bHQgaXMgaW5maWxlLltyZXN8c3xoXVxuIgorCSIgICAtcCBwcmVmaXggICBHaXZlIGEgcHJlZml4IGZvciB0aGUgZ2VuZXJhdGVkIG5hbWVzXG4iCisJIiAgIC1yICAgICAgICAgIENyZWF0ZSBiaW5hcnkgLnJlcyBmaWxlIChjb21waWxlIG9ubHkpXG4iCisJIiAgIC1zICAgICAgICAgIEFkZCBzdHJ1Y3R1cmUgd2l0aCB3aW4zMi8xNiAoUEUvTkUpIHJlc291cmNlIGRpcmVjdG9yeVxuIgorCSIgICAtdCAgICAgICAgICBHZW5lcmF0ZSBpbmRpcmVjdCBsb2FkYWJsZSByZXNvdXJjZSB0YWJsZXNcbiIKKwkiICAgLVQgICAgICAgICAgR2VuZXJhdGUgb25seSBpbmRpcmVjdCBsb2FkYWJsZSByZXNvdXJjZXMgdGFibGVzXG4iCisJIiAgIC1WICAgICAgICAgIFByaW50IHZlcnNpb24gZW5kIGV4aXRcbiIKKwkiICAgLXcgMTZ8MzIgICAgU2VsZWN0IHdpbjE2IG9yIHdpbjMyIG91dHB1dCAoZGVmYXVsdCBpcyB3aW4zMilcbiIKKwkiICAgLVcgICAgICAgICAgRW5hYmxlIHBlZGFudGljIHdhcm5pbmdzXG4iCisJIklucHV0IGlzIHRha2VuIGZyb20gc3RkaW4gaWYgbm8gc291cmNlZmlsZSBzcGVjaWZpZWQuXG4iCisJIkRlYnVnIGxldmVsICduJyBpcyBhIGJpdG1hc2sgd2l0aCBmb2xsb3dpbmcgbWVhbmluZzpcbiIKKwkiICAgICogMHgwMSBUZWxsIHdoaWNoIHJlc291cmNlIGlzIHBhcnNlZCAodmVyYm9zZSBtb2RlKVxuIgorCSIgICAgKiAweDAyIER1bXAgaW50ZXJuYWwgc3RydWN0dXJlc1xuIgorCSIgICAgKiAweDA0IENyZWF0ZSBhIHBhcnNlciB0cmFjZSAoeXlkZWJ1Zz0xKVxuIgorCSJUaGUgLW8gb3B0aW9uIG9ubHkgYXBwbGllcyB0byB0aGUgZmluYWwgZGVzdGluYXRpb24gZmlsZSwgd2hpY2ggaXNcbiIKKwkiaW4gY2FzZSBvZiBub3JtYWwgY29tcGlsZSBhIC5zIGZpbGUuIFlvdSBtdXN0IHVzZSB0aGUgJy1IIGhlYWRlci5oJ1xuIgorCSJvcHRpb24gdG8gb3ZlcnJpZGUgdGhlIGhlYWRlci1maWxlbmFtZS5cbiIKKwkiSWYgbm8gaW5wdXQgZmlsZW5hbWUgaXMgZ2l2ZW4gYW5kIHRoZSBvdXRwdXQgbmFtZSBpcyBub3Qgb3ZlcnJpZGRlblxuIgorCSJ3aXRoIC1vIGFuZC9vciAtSCwgdGhlbiB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gXCJ3cmMudGFiLltzaF1cIlxuIgorCTsKKworY2hhciB2ZXJzaW9uX3N0cmluZ1tdID0gIldpbmUgUmVzb3VyY2UgQ29tcGlsZXIgVmVyc2lvbiAiIFdSQ19GVUxMVkVSU0lPTiAiXG4iCisJCQkiQ29weXJpZ2h0IDE5OTggQmVydGhvIEEuIFN0dWx0aWVuc1xuIgorCQkJIiAgICAgICAgICAxOTk0IE1hcnRpbiB2b24gTG9ld2lzXG4iOworCisvKgorICogRGVmYXVsdCBwcmVmaXggZm9yIHJlc291cmNlIG5hbWVzIHVzZWQgaW4gdGhlIEMgYXJyYXkuCisgKiBPcHRpb24gJy1wIG5hbWUnIHNldHMgaXQgdG8gJ25hbWUnCisgKi8KK2NoYXIgKnByZWZpeCA9ICJfUmVzb3VyY2UiOworCisvKgorICogU2V0IGlmIGNvbXBpbGluZyBpbiAzMmJpdCBtb2RlIChkZWZhdWx0KS4KKyAqLworaW50IHdpbjMyID0gMTsKKworLyoKKyAqIFNldCB3aGVuIGdlbmVyYXRlZCBDIHZhcmlhYmxlcyBzaG91bGQgYmUgcHJlZml4ZWQgd2l0aCAnY29uc3QnCisgKi8KK2ludCBjb25zdGFudCA9IDA7CisKKy8qCisgKiBDcmVhdGUgYSAucmVzIGZpbGUgZnJvbSB0aGUgc291cmNlIGFuZCBleGl0ICgtciBvcHRpb24pLgorICogVGhlIGNvbXBpbGVyIGFjdHVhbGx5IGFsd2F5cyBjcmVhdGVzIHRoaXMgZmlsZSwgYW5kIHRoZW4KKyAqIGNvbnZlcnRzIGl0IGludG8gd2hhdGV2ZXIgaXMgcmVxdWVzdGVkLiBUaGUgY29tcGlsZXIganVzdAorICogc3RvcHMgYWZ0ZXIgdGhlIHJlcy1maWxlIHdoZW4gY3JlYXRlX3JlcyBpcyBzZXQuCisgKi8KK2ludCBjcmVhdGVfcmVzID0gMDsKKworLyoKKyAqIGRlYnVnbGV2ZWwgPT0gREVCVUdMRVZFTF9OT05FCURvbid0IGJvdGhlcgorICogZGVidWdsZXZlbCAmIERFQlVHTEVWRUxfQ0hBVAkJU2F5IHdoYXRzIGRvbmUKKyAqIGRlYnVnbGV2ZWwgJiBERUJVR0xFVkVMX0RVTVAJCUR1bXAgaW50ZXJuYWwgc3RydWN0dXJlcworICogZGVidWdsZXZlbCAmIERFQlVHTEVWRUxfVFJBQ0UJQ3JlYXRlIHBhcnNlciB0cmFjZQorICovCitpbnQgZGVidWdsZXZlbCA9IERFQlVHTEVWRUxfTk9ORTsKKworLyoKKyAqIFJlY29nbml6ZSB3aW4zMiBrZXl3b3JkcyBpZiBzZXQgKC13IDMyIGVuZm9yY2VzIHRoaXMpLAorICogb3RoZXJ3aXNlIHNldCB3aXRoIC1lIG9wdGlvbi4KKyAqLworaW50IGV4dGVuc2lvbnMgPSAxOworCisvKgorICogU2V0IHdoZW4gY3JlYXRpbmcgQyBhcnJheSBmcm9tIC5yZXMgZmlsZSAoLWIgb3B0aW9uKS4KKyAqLworaW50IGJpbmFyeSA9IDA7CisKKy8qCisgKiBTZXQgd2hlbiBhbiBhZGRpdGlvbmFsIEMtaGVhZGVyIGlzIHRvIGJlIGNyZWF0ZWQgaW4gY29tcGlsZSAoLWggb3B0aW9uKS4KKyAqLworaW50IGNyZWF0ZV9oZWFkZXIgPSAwOworCisvKgorICogU2V0IHdoZW4gdGhlIE5FL1BFIHJlc291cmNlIGRpcmVjdG9yeSBzaG91bGQgYmUgZHVtcGVkIGludG8KKyAqIHRoZSBvdXRwdXQgZmlsZS4KKyAqLworaW50IGNyZWF0ZV9kaXIgPSAwOworCisvKgorICogU2V0IHdoZW4gYWxsIHN5bWJvbHMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlICgtZyBvcHRpb24pCisgKi8KK2ludCBnbG9iYWwgPSAwOworCisvKgorICogU2V0IHdoZW4gaW5kaXJlY3QgbG9hZGFibGUgcmVzb3VyY2UgdGFibGVzIHNob3VsZCBiZSBjcmVhdGVkICgtdCkKKyAqLworaW50IGluZGlyZWN0ID0gMDsKKworLyoKKyAqIFNldCB3aGVuIF9vbmx5XyBpbmRpcmVjdCBsb2FkYWJsZSByZXNvdXJjZSB0YWJsZXMgc2hvdWxkIGJlIGNyZWF0ZWQgKC1UKQorICovCitpbnQgaW5kaXJlY3Rfb25seSA9IDA7CisKKy8qCisgKiBORSBzZWdtZW50IHJlc291cmNlIGFsaWdtZW50ICgtYSBvcHRpb24pCisgKi8KK2ludCBhbGlnbm1lbnQgPSA0OworaW50IGFsaWdubWVudF9wd3I7CisKKy8qCisgKiBDbGVhcmVkIHdoZW4gdGhlIGFzc2VtYmx5IGZpbGUgbXVzdCBiZSBzdXBwcmVzc2VkICgtbiBvcHRpb24pCisgKi8KK2ludCBjcmVhdGVfcyA9IDE7CisKKy8qCisgKiBMYW5ndWFnZSBzZXR0aW5nIGZvciByZXNvdXJjZXMgKC1sIG9wdGlvbikKKyAqLworbGFuZ3VhZ2VfdCAqY3VycmVudGxhbmd1YWdlID0gTlVMTDsKKworLyoKKyAqIFRoZSBjb2RlcGFnZSB0byB3cml0ZSBpbiB3aW4zMiBQRSByZXNvdXJjZSBzZWdtZW50ICgtQyBvcHRpb24pCisgKi8KK0RXT1JEIGNvZGVwYWdlID0gMDsKKworLyoKKyAqIFNldCB3aGVuIGV4dHJhIHdhcm5pbmdzIHNob3VsZCBiZSBnZW5lcmF0ZWQgKC1XIG9wdGlvbikKKyAqLworaW50IHBlZGFudGljID0gMDsKKworY2hhciAqb3V0cHV0X25hbWU7CQkvKiBUaGUgbmFtZSBnaXZlbiBieSB0aGUgLW8gb3B0aW9uICovCitjaGFyICppbnB1dF9uYW1lOwkJLyogVGhlIG5hbWUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQtbGluZSAqLworY2hhciAqaGVhZGVyX25hbWU7CQkvKiBUaGUgbmFtZSBnaXZlbiBieSB0aGUgLUggb3B0aW9uICovCisKK2NoYXIgKmNtZGxpbmU7CQkJLyogVGhlIGVudGlyZSBjb21tYW5kbGluZSAqLworCityZXNvdXJjZV90ICpyZXNvdXJjZV90b3A7CS8qIFRoZSB0b3Agb2YgdGhlIHBhcnNlZCByZXNvdXJjZXMgKi8KKworaW50IGdldG9wdCAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LCBjb25zdCBjaGFyICpvcHRzdHJpbmcpOworCitpbnQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pCit7CisJZXh0ZXJuIGNoYXIqIG9wdGFyZzsKKwlleHRlcm4gaW50ICAgb3B0aW5kOworCWludCBvcHRjOworCWludCBsb3NlID0gMDsKKwlpbnQgcmV0OworCWludCBhOworCWludCBpOworCWludCBjbWRsZW47CisKKwkvKiBGaXJzdCByZWJ1aWxkIHRoZSBjb21tYW5kbGluZSB0byBwdXQgaW4gZGVzdGluYXRpb24gKi8KKwkvKiBDb3VsZCBiZSBkb25lIHRocm91Z2ggZW52W10sIGJ1dCBub3QgYWxsIE9TLWVzIHN1cHBvcnQgaXQgKi8KKwljbWRsZW4gPSA0OyAvKiBmb3IgIndyYyAiICovCisJZm9yKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorCQljbWRsZW4gKz0gc3RybGVuKGFyZ3ZbaV0pICsgMTsKKwljbWRsaW5lID0gKGNoYXIgKil4bWFsbG9jKGNtZGxlbik7CisJc3RyY3B5KGNtZGxpbmUsICJ3cmMgIik7CisJZm9yKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorCXsKKwkJc3RyY2F0KGNtZGxpbmUsIGFyZ3ZbaV0pOworCQlpZihpIDwgYXJnYy0xKQorCQkJc3RyY2F0KGNtZGxpbmUsICIgIik7CisJfQorCisJd2hpbGUoKG9wdGMgPSBnZXRvcHQoYXJnYywgYXJndiwgImE6YmNDOmQ6RDplZ2hIOkk6bDpubzpwOnJzdFRWdzpXIikpICE9IEVPRikKKwl7CisJCXN3aXRjaChvcHRjKQorCQl7CisJCWNhc2UgJ2EnOgorCQkJYWxpZ25tZW50ID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ2InOgorCQkJYmluYXJ5ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWNvbnN0YW50ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdDJzoKKwkJCWNvZGVwYWdlID0gc3RydG9sKG9wdGFyZywgTlVMTCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlkZWJ1Z2xldmVsID0gc3RydG9sKG9wdGFyZywgTlVMTCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSAnRCc6CisJCQlhZGRfY21kbGluZV9kZWZpbmUob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdlJzoKKwkJCWV4dGVuc2lvbnMgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ2cnOgorCQkJZ2xvYmFsID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdIJzoKKwkJCWhlYWRlcl9uYW1lID0gc3RyZHVwKG9wdGFyZyk7CisJCQkvKiBGYWxsIHRocm91Z2ggKi8KKwkJY2FzZSAnaCc6CisJCQljcmVhdGVfaGVhZGVyID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdJJzoKKwkJCWFkZF9pbmNsdWRlX3BhdGgob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCXsKKwkJCQlpbnQgbGFuOworCQkJCWxhbiA9IHN0cnRvbChvcHRhcmcsIE5VTEwsIDApOworCQkJCWN1cnJlbnRsYW5ndWFnZSA9IG5ld19sYW5ndWFnZShQUklNQVJZTEFOR0lEKGxhbiksIFNVQkxBTkdJRChsYW4pKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCWNyZWF0ZV9zID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdvJzoKKwkJCW91dHB1dF9uYW1lID0gc3RyZHVwKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlwcmVmaXggPSBzdHJkdXAob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCWNyZWF0ZV9yZXMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJY3JlYXRlX2RpciA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnVCc6CisJCQlpbmRpcmVjdF9vbmx5ID0gMTsKKwkJCS8qIEZhbGwgdGhyb3VnaCAqLworCQljYXNlICd0JzoKKwkJCWluZGlyZWN0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdWJzoKKwkJCXByaW50Zih2ZXJzaW9uX3N0cmluZyk7CisJCQlleGl0KDApOworCQkJYnJlYWs7CisJCWNhc2UgJ3cnOgorCQkJaWYoIXN0cmNtcChvcHRhcmcsICIxNiIpKQorCQkJCXdpbjMyID0gMDsKKwkJCWVsc2UgaWYoIXN0cmNtcChvcHRhcmcsICIzMiIpKQorCQkJCXdpbjMyID0gMTsKKwkJCWVsc2UKKwkJCQlsb3NlKys7CisJCQlicmVhazsKKwkJY2FzZSAnVyc6CisJCQlwZWRhbnRpYyA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWxvc2UrKzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYobG9zZSkKKwl7CisJCWZwcmludGYoc3RkZXJyLCB1c2FnZSk7CisJCXJldHVybiAxOworCX0KKworCS8qIENoZWNrIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgaW52YWxpZCBjb21iaW5hdGlvbnMgKi8KKwlpZih3aW4zMikKKwl7CisJCWlmKCFleHRlbnNpb25zKQorCQl7CisJCQl3YXJuaW5nKCJPcHRpb24gLWUgaWdub3JlZCB3aXRoIDMyYml0IGNvbXBpbGVcbiIpOworCQkJZXh0ZW5zaW9ucyA9IDE7CisJCX0KKwl9CisKKwlpZihjcmVhdGVfcmVzKQorCXsKKwkJaWYoY29uc3RhbnQpCisJCXsKKwkJCXdhcm5pbmcoIk9wdGlvbiAtYyBpZ25vcmVkIHdpdGggY29tcGlsZSB0byAucmVzXG4iKTsKKwkJCWNvbnN0YW50ID0gMDsKKwkJfQorCisJCWlmKGNyZWF0ZV9oZWFkZXIpCisJCXsKKwkJCXdhcm5pbmcoIk9wdGlvbiAtW2h8SF0gaWdub3JlZCB3aXRoIGNvbXBpbGUgdG8gLnJlc1xuIik7CisJCQljcmVhdGVfaGVhZGVyID0gMDsKKwkJfQorCisJCWlmKGluZGlyZWN0KQorCQl7CisJCQl3YXJuaW5nKCJPcHRpb24gLWwgaWdub3JlZCB3aXRoIGNvbXBpbGUgdG8gLnJlc1xuIik7CisJCQlpbmRpcmVjdCA9IDA7CisJCX0KKworCQlpZihpbmRpcmVjdF9vbmx5KQorCQl7CisJCQl3YXJuaW5nKCJPcHRpb24gLUwgaWdub3JlZCB3aXRoIGNvbXBpbGUgdG8gLnJlc1xuIik7CisJCQlpbmRpcmVjdF9vbmx5ID0gMDsKKwkJfQorCisJCWlmKGdsb2JhbCkKKwkJeworCQkJd2FybmluZygiT3B0aW9uIC1nIGlnbm9yZWQgd2l0aCBjb21waWxlIHRvIC5yZXNcbiIpOworCQkJZ2xvYmFsID0gMDsKKwkJfQorCisJCWlmKGNyZWF0ZV9kaXIpCisJCXsKKwkJCWVycm9yKCJPcHRpb24gLXIgYW5kIC1zIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iKTsKKwkJfQorCisJCWlmKGJpbmFyeSkKKwkJeworCQkJZXJyb3IoIk9wdGlvbiAtciBhbmQgLWIgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXJcbiIpOworCQl9CisJfQorCisJLyogU2V0IGFsaWdubWVudCBwb3dlciAqLworCWEgPSBhbGlnbm1lbnQ7CisJZm9yKGFsaWdubWVudF9wd3IgPSAwOyBhbGlnbm1lbnRfcHdyIDwgMTAgJiYgYSA+IDE7IGFsaWdubWVudF9wd3IrKykKKwl7CisJCWEgPj49IDE7CisJfQorCWlmKGEgIT0gMSkKKwl7CisJCWVycm9yKCJBbGlnbm1lbnQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDEwMjQiKTsKKwl9CisJaWYoKDEgPDwgYWxpZ25tZW50X3B3cikgIT0gYWxpZ25tZW50KQorCXsKKwkJZXJyb3IoIkFsaWdubWVudCBtdXN0IGJlIGEgcG93ZXIgb2YgMiIpOworCX0KKworCS8qIEtpbGwgaW8gYnVmZmVyaW5nIHdoZW4gc29tZSBraW5kIG9mIGRlYnVnbGV2ZWwgaXMgZW5hYmxlZCAqLworCWlmKGRlYnVnbGV2ZWwpCisJeworCQlzZXRidWYoc3Rkb3V0LDApOworCQlzZXRidWYoc3RkZXJyLDApOworCX0KKworCXl5ZGVidWcgPSBkZWJ1Z2xldmVsICYgREVCVUdMRVZFTF9UUkFDRSA/IDEgOiAwOworCisJLyogU2V0IHRoZSBkZWZhdWx0IGRlZmluZWQgc3R1ZmYgKi8KKwlhZGRfY21kbGluZV9kZWZpbmUoIlJDX0lOVk9LRUQ9MSIpOworCWFkZF9jbWRsaW5lX2RlZmluZSgiX19XUkNfXz0xIik7CisJaWYod2luMzIpCisJeworCQlhZGRfY21kbGluZV9kZWZpbmUoIl9fV0lOMzJfXz0xIik7CisJCWFkZF9jbWRsaW5lX2RlZmluZSgiX19GTEFUX189MSIpOworCX0KKworCS8qIENoZWNrIGlmIHRoZSB1c2VyIHNldCBhIGxhbmd1YWdlLCBlbHNlIHNldCBkZWZhdWx0ICovCisJaWYoIWN1cnJlbnRsYW5ndWFnZSkKKwkJY3VycmVudGxhbmd1YWdlID0gbmV3X2xhbmd1YWdlKDAsIDApOworCisJLyogQ2hlY2sgZm9yIGlucHV0IGZpbGUgb24gY29tbWFuZC1saW5lICovCisJaWYob3B0aW5kIDwgYXJnYykKKwl7CisJCWlucHV0X25hbWUgPSBhcmd2W29wdGluZF07CisJCXl5aW4gPSBmb3BlbihpbnB1dF9uYW1lLCAicmIiKTsKKwkJaWYoIXl5aW4pCisJCXsKKwkJCWVycm9yKCJDb3VsZCBub3Qgb3BlbiAlc1xuIiwgaW5wdXRfbmFtZSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJeXlpbiA9IHN0ZGluOworCX0KKworCWlmKGJpbmFyeSAmJiAhaW5wdXRfbmFtZSkKKwl7CisJCWVycm9yKCJCaW5hcnkgbW9kZSByZXF1aXJlcyAucmVzIGZpbGUgYXMgaW5wdXQiKTsKKwl9CisKKwlpZighb3V0cHV0X25hbWUpCisJeworCQlvdXRwdXRfbmFtZSA9IGR1cF9iYXNlbmFtZShpbnB1dF9uYW1lLCBiaW5hcnkgPyAiLnJlcyIgOiAiLnJjIik7CisJCXN0cmNhdChvdXRwdXRfbmFtZSwgY3JlYXRlX3JlcyA/ICIucmVzIiA6ICIucyIpOworCX0KKworCWlmKCFoZWFkZXJfbmFtZSAmJiAhY3JlYXRlX3JlcykKKwl7CisJCWhlYWRlcl9uYW1lID0gZHVwX2Jhc2VuYW1lKGlucHV0X25hbWUsIGJpbmFyeSA/ICIucmVzIiA6ICIucmMiKTsKKwkJc3RyY2F0KGhlYWRlcl9uYW1lLCAiLmgiKTsKKwl9CisKKwlpZighYmluYXJ5KQorCXsKKwkJLyogR28gZnJvbSAucmMgdG8gLnJlcyBvciAucyAqLworCQljaGF0KCJTdGFydGluZyBwYXJzZSIpOworCQlyZXQgPSB5eXBhcnNlKCk7CisKKwkJaWYoaW5wdXRfbmFtZSkKKwkJCWZjbG9zZSh5eWluKTsKKworCQlpZihyZXQpCisJCXsKKwkJCS8qIEVycm9yIGR1cmluZyBwYXJzZSAqLworCQkJZXhpdCgxKTsKKwkJfQorCisJCWlmKGRlYnVnbGV2ZWwgJiBERUJVR0xFVkVMX0RVTVApCisJCQlkdW1wX3Jlc291cmNlcyhyZXNvdXJjZV90b3ApOworCisJCS8qIENvbnZlcnQgdGhlIGludGVybmFsIGxpc3RzIHRvIGJpbmFyeSBkYXRhICovCisJCXJlc291cmNlczJyZXMocmVzb3VyY2VfdG9wKTsKKworCQlpZihjcmVhdGVfcmVzKQorCQl7CisJCQljaGF0KCJXcml0aW5nIC5yZXMtZmlsZSIpOworCQkJd3JpdGVfcmVzZmlsZShvdXRwdXRfbmFtZSwgcmVzb3VyY2VfdG9wKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmKGNyZWF0ZV9zKQorCQkJeworCQkJCWNoYXQoIldyaXRpbmcgLnMtZmlsZSIpOworCQkJCXdyaXRlX3NfZmlsZShvdXRwdXRfbmFtZSwgcmVzb3VyY2VfdG9wKTsKKwkJCX0KKwkJCWlmKGNyZWF0ZV9oZWFkZXIpCisJCQl7CisJCQkJY2hhdCgiV3JpdGluZyAuaC1maWxlIik7CisJCQkJd3JpdGVfaF9maWxlKGhlYWRlcl9uYW1lLCByZXNvdXJjZV90b3ApOworCQkJfQorCQl9CisKKwl9CisJZWxzZQorCXsKKwkJLyogR28gZnJvbSAucmVzIHRvIC5zICovCisJCWNoYXQoIlJlYWRpbmcgLnJlcy1maWxlIik7CisJCXJlc291cmNlX3RvcCA9IHJlYWRfcmVzZmlsZShpbnB1dF9uYW1lKTsKKwkJaWYoY3JlYXRlX3MpCisJCXsKKwkJCWNoYXQoIldyaXRpbmcgLnMtZmlsZSIpOworCQkJd3JpdGVfc19maWxlKG91dHB1dF9uYW1lLCByZXNvdXJjZV90b3ApOworCQl9CisJCWlmKGNyZWF0ZV9oZWFkZXIpCisJCXsKKwkJCWNoYXQoIldyaXRpbmcgLmgtZmlsZSIpOworCQkJd3JpdGVfaF9maWxlKGhlYWRlcl9uYW1lLCByZXNvdXJjZV90b3ApOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworCisKZGlmZiAtLWdpdCBhL3Rvb2xzL3dyYy93cmMuZG9jIGIvdG9vbHMvd3JjL3dyYy5kb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4NDZhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3dyYy93cmMuZG9jCkBAIC0wLDAgKzEsMTc0IEBACisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICogV2luMzIgUmVzb3VyY2UgZmlsZXMgZ3JhbW1hcjoKKyAqCisgKiBUb3AgbGV2ZWwga2V5d29yZHMvcmVzb3VyY2UgaXRlbXM6CisgKgluYW1lSUQgQUNDRUxFUkFUT1IKKyAqCVtDSEFSQUNURVJJU1RJQ1MgZHdvcmRdCisgKglbTEFOR1VBR0UgbGFuZ3VhZ2UsIHN1Ymxhbmd1YWdlXQorICoJW1ZFUlNJT04gZHdvcmRdCisgKglCRUdJTgorICoJCWV2ZW50LCBJRHZhbHVlIFssIHR5cGVdIFtvcHRpb25zXQorICoJCS4uLgorICoJRU5ECisgKi0tLS0tLS0tLS0tLS0KKyAqCW5hbWVJRCBCSVRNQVAgW2xvYWRtZW1dIGZpbGVuYW1lCisgKi0tLS0tLS0tLS0tLS0KKyAqCW5hbWVJRCBCSVRNQVAgW2xvYWRtZW1dCisgKglCRUdJTgorICoJCXJhd2RhdGEKKyAqCUVORAorICotLS0tLS0tLS0tLS0tCisgKgluYW1lSUQgQ1VSU09SIFtsb2FkbWVtXSBmaWxlbmFtZQorICotLS0tLS0tLS0tLS0tCisgKgluYW1lSUQgQ1VSU09SIFtsb2FkbWVtXQorICoJQkVHSU4KKyAqCQlyYXdkYXRhCisgKglFTkQKKyAqLS0tLS0tLS0tLS0tLQorICoJbmFtZUlEIERJQUxPRyBbbG9hZG1lbV0gW0VYU1RZTEU9ZXh0ZW5kZWQtc3R5bGVzXSB4LCB5LCB3aWR0aCwgaGVpZ2h0CisgKglbQ0FQVElPTiAidGV4dCJdCisgKglbQ0hBUkFDVEVSSVNUSUNTIGR3b3JkXQorICoJW0NMQVNTIGNsYXNzXQorICoJW0VYU1RZTEU9ZXh0ZW5kZWQtc3R5bGVzXQorICoJW0ZPTlQgcG9pbnRzaXplLCBmYWNlXQorICoJW0xBTkdVQUdFIGxhbmd1YWdlLCBzdWJsYW5ndWFnZV0KKyAqCVtNRU5VIG1lbnVuYW1lXQorICoJW1NUWUxFIHN0eWxlc10KKyAqCVtWRVJTSU9OIGR3b3JkXQorICoJQkVHSU4KKyAqCQlbY29udHJvbHNdCisgKglFTkQKKyAqLS0tLS0tLS0tLS0tLQorICoJbmFtZUlEIERJQUxPR0VYIFtsb2FkbWVtXSB4LCB5LCB3aWR0aCwgaGVpZ2h0IFssIGhlbHBJRF0KKyAqCVtDQVBUSU9OICJ0ZXh0Il0KKyAqCVtDSEFSQUNURVJJU1RJQ1MgZHdvcmRdCisgKglbQ0xBU1MgY2xhc3NdCisgKglbRVhTVFlMRT1leHRlbmRlZC1zdHlsZXNdCisgKglbRk9OVCBwb2ludHNpemUsIGZhY2UsIHdlaWdodCwgaXRhbGljXQorICoJW0xBTkdVQUdFIGxhbmd1YWdlLCBzdWJsYW5ndWFnZV0KKyAqCVtNRU5VIG1lbnVuYW1lXQorICoJW1NUWUxFIHN0eWxlc10KKyAqCVtWRVJTSU9OIGR3b3JkXQorICoJQkVHSU4KKyAqCQlbY29udHJvbHNdCisgKglFTkQKKyAqLS0tLS0tLS0tLS0tLQorICoJbmFtZUlEIEZPTlQgW2xvYWRtZW1dIGZpbGVuYW1lCisgKi0tLS0tLS0tLS0tLS0KKyAqCW5hbWVJRCBJQ09OIFtsb2FkbWVtXSBmaWxlbmFtZQorICotLS0tLS0tLS0tLS0tCisgKgluYW1lSUQgSUNPTiBbbG9hZG1lbV0KKyAqCUJFR0lOCisgKgkJcmF3ZGF0YQorICoJRU5ECisgKi0tLS0tLS0tLS0tLS0KKyAqCUxBTkdVQUdFIGxhbmd1YWdlSUQsIHN1Ymxhbmd1YWdlSUQKKyAqLS0tLS0tLS0tLS0tLQorICoJbmFtZUlEIE1FTlUgW2xvYWRtZW1dCisgKglbQ0hBUkFDVEVSSVNUSUNTIGR3b3JkXQorICoJW0xBTkdVQUdFIGxhbmd1YWdlLCBzdWJsYW5ndWFnZV0KKyAqCVtWRVJTSU9OIGR3b3JkXQorICoJQkVHSU4KKyAqCQlbbWVudWl0ZW1zXQorICoJRU5ECisgKi0tLS0tLS0tLS0tLS0KKyAqCW5hbWVJRCBNRU5VRVggW2xvYWRtZW1dCisgKglbQ0hBUkFDVEVSSVNUSUNTIGR3b3JkXQorICoJW0xBTkdVQUdFIGxhbmd1YWdlLCBzdWJsYW5ndWFnZV0KKyAqCVtWRVJTSU9OIGR3b3JkXQorICoJQkVHSU4KKyAqCQlbbWVudWV4aXRlbXNdCisgKglFTkQKKyAqLS0tLS0tLS0tLS0tLQorICoJbmFtZUlEIE1FU1NBR0VUQUJMRSBbbG9hZG1lbV0gZmlsZW5hbWUKKyAqLS0tLS0tLS0tLS0tLQorICoJbmFtZUlEIFJDREFUQSBbbG9hZG1lbV0KKyAqCVtDSEFSQUNURVJJU1RJQ1MgZHdvcmRdCisgKglbTEFOR1VBR0UgbGFuZ3VhZ2UsIHN1Ymxhbmd1YWdlXQorICoJW1ZFUlNJT04gZHdvcmRdCisgKglCRUdJTgorICoJCVtyYXctZGF0YV0KKyAqCUVORAorICotLS0tLS0tLS0tLS0tCisgKglTVFJJTkdUQUJMRSBbbG9hZG1lbV0KKyAqCVtDSEFSQUNURVJJU1RJQ1MgZHdvcmRdCisgKglbTEFOR1VBR0UgbGFuZ3VhZ2UsIHN1Ymxhbmd1YWdlXQorICoJW1ZFUlNJT04gZHdvcmRdCisgKglCRUdJTgorICoJCVtzdHJpbmdJRCwgInRleHQiXQorICoJCS4uLgorICoJRU5ECisgKi0tLS0tLS0tLS0tLS0KKyAqCXZlcnNpb25JRCBWRVJTSU9OSU5GTworICoJRklMRVZFUlNJT04JbWFqMSwgbWFqMiwgbWluMSwgbWluMgorICoJUFJPRFVDVFZFUlNJT04JbWFqMSwgbWFqMiwgbWluMSwgbWluMgorICoJRklMRUZMQUdTTUFTSwkoVlNfRkZJX0ZJTEVGTEFHTUFTSykKKyAqCUZJTEVPUwkJKFZPU18qKQorICoJRklMRVRZUEUJKFZGVF8qKQorICoJRklMRUZMQUdTCShWU19GRl8qKQorICoJRklMRVNVQlRZUEUJKFZGVDJfKikKKyAqCUJFR0lOCisgKgkJQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICoJCUJFR0lOCisgKgkJCUJMT0NLICJsYW5ndWFnZS1jaGFyc2V0IgorICoJCQlCRUdJTgorICoJCQkJW1ZBTFVFICJDb21tZW50cyIsICJ5ZXBcMCJdCisgKgkJCQlWQUxVRSAiQ29tcGFueU5hbWUiLCAiV2luZSBEZXZlbG9wZXIgVGVhbVwwIgorICoJCQkJVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJSZXNvdXJjZSBjb21waWxlclwwIgorICoJCQkJVkFMVUUgIkZpbGVWZXJzaW9uIiwgIjAuMDEgYWxwaGFcMCIKKyAqCQkJCVZBTFVFICJJbnRlcm5hbE5hbWUiLCAid2luZXJjXDAiCisgKgkJCQlbVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIkNvcHlyaWdodCAoYykgQi5BLiBTdHVsdGllbnMgMTk5OFwwIl0KKyAqCQkJCVtWQUxVRSAiTGVnYWxUcmFkZW1hcmtzIiwgIi4uLlwwIl0KKyAqCQkJCVZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgIndpbmVyY1wwIgorICoJCQkJW1ZBTFVFICJQcml2YXRlQnVpbGQiLCAiWWVzIGFsd2F5cyFcMCIKKyAqCQkJCVZBTFVFICJQcm9kdWN0TmFtZSIsICJXaW5lXDAiCisgKgkJCQlWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAiMC4wMSBhbHBoYVwwIgorICoJCQkJW1ZBTFVFICJTcGVjaWFsQnVpbGQiLCAiTm8gbmV2ZXIhIFdlbGwsIG1heWJlLlwwIgorICoJCQlFTkQKKyAqCQlFTkQKKyAqCQlCTE9DSyAiVmFyRmlsZUluZm8iCisgKgkJQkVHSU4KKyAqCQkJVkFMVUUgIlRyYW5zbGF0aW9uIiwgbGFuZ3VhZ2VJRCwgY2hhcnNldElECisgKgkJRU5ECisgKglFTkQKKyAqLS0tLS0tLS0tLS0tLQorICoJbmFtZUlEIHR5cGVJRCBbbG9hZG1lbV0gZmlsZW5hbWUKKyAqLS0tLS0tLS0tLS0tLQorICoJbmFtZUlEIHR5cGVJRCBbbG9hZG1lbV0KKyAqCUJFR0lOCisgKgkJW3Jhdy1kYXRhXQorICoJRU5ECisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRGlhbG9nIGNvbnRyb2xzOgorICoJQ09OVFJPTAkJdGV4dCwgSUQsIGNsYXNzLCBzdHlsZSwgeCwgeSwgd2lkdGgsIGhlaWdodCBbLCBleHN0eWxlXQorICoKKyAqCUxURVhUCQl0ZXh0LCBJRCwgeCwgeSwgd2lkdGgsIGhlaWdodCBbLCBzdHlsZSBbLCBleHN0eWxlXV0KKyAqCUNURVhUCQl0ZXh0LCBJRCwgeCwgeSwgd2lkdGgsIGhlaWdodCBbLCBzdHlsZSBbLCBleHN0eWxlXV0KKyAqCVJURVhUCQl0ZXh0LCBJRCwgeCwgeSwgd2lkdGgsIGhlaWdodCBbLCBzdHlsZSBbLCBleHN0eWxlXV0KKyAqCisgKglJQ09OCQl0ZXh0LCBJRCwgeCwgeSwgW3dpZHRoLCBoZWlnaHQgLCBzdHlsZSBbLCBleHN0eWxlXV0KKyAqCisgKglFRElUVEVYVAlJRCwgeCwgeSwgd2lkdGgsIGhlaWdodCBbLCBzdHlsZSBbLCBleHN0eWxlXV0KKyAqCisgKglBVVRPM1NUQVRFCXRleHQsIElELCB4LCB5LCB3aWR0aCwgaGVpZ2h0IFssIHN0eWxlIFssIGV4c3R5bGVdXQorICoJQVVUT0NIRUNLQk9YCXRleHQsIElELCB4LCB5LCB3aWR0aCwgaGVpZ2h0IFssIHN0eWxlIFssIGV4c3R5bGVdXQorICoJQVVUT1JBRElPQlVUVE9OCXRleHQsIElELCB4LCB5LCB3aWR0aCwgaGVpZ2h0IFssIHN0eWxlIFssIGV4c3R5bGVdXQorICoJU1RBVEUzCQl0ZXh0LCBJRCwgeCwgeSwgd2lkdGgsIGhlaWdodCBbLCBzdHlsZSBbLCBleHN0eWxlXV0KKyAqCUNIRUNLQk9YCXRleHQsIElELCB4LCB5LCB3aWR0aCwgaGVpZ2h0IFssIHN0eWxlIFssIGV4c3R5bGVdXQorICoJUFVTSEJVVFRPTgl0ZXh0LCBJRCwgeCwgeSwgd2lkdGgsIGhlaWdodCBbLCBzdHlsZSBbLCBleHN0eWxlXV0KKyAqCVJBRElPQlVUVE9OCXRleHQsIElELCB4LCB5LCB3aWR0aCwgaGVpZ2h0IFssIHN0eWxlIFssIGV4c3R5bGVdXQorICoJREVGUFVTSEJVVFRPTgl0ZXh0LCBJRCwgeCwgeSwgd2lkdGgsIGhlaWdodCBbLCBzdHlsZSBbLCBleHN0eWxlXV0KKyAqCisgKglDT01CT0JPWAl0ZXh0LCBJRCwgeCwgeSwgd2lkdGgsIGhlaWdodCBbLCBzdHlsZSBbLCBleHN0eWxlXV0KKyAqCUdST1VQQk9YCXRleHQsIElELCB4LCB5LCB3aWR0aCwgaGVpZ2h0IFssIHN0eWxlIFssIGV4c3R5bGVdXQorICoJTElTVEJPWAkJdGV4dCwgSUQsIHgsIHksIHdpZHRoLCBoZWlnaHQgWywgc3R5bGUgWywgZXhzdHlsZV1dCisgKglTQ1JPTExCQVIJdGV4dCwgSUQsIHgsIHksIHdpZHRoLCBoZWlnaHQgWywgc3R5bGUgWywgZXhzdHlsZV1dCisgKgorICogRklYTUU6IFRoaXMgaXMgZG9jdW1lbnRlZCwgYnV0IEkgZG9uJ3Qga25vdyB0aGUgQlNfUFVTSEJPWCBzdHlsZQorICoJUFVTSEJPWAkJdGV4dCwgSUQsIHgsIHksIHdpZHRoLCBoZWlnaHQgWywgc3R5bGUgWywgZXhzdHlsZV1dCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL3Rvb2xzL3dyYy93cmMuaCBiL3Rvb2xzL3dyYy93cmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2FkMjllCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvd3JjL3dyYy5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBNYWluIGRlZmluaXRpb25zIGFuZCBleHRlcm5hbHMKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBCZXJ0aG8gQS4gU3R1bHRpZW5zIChCUykKKyAqCisgKi8KKworI2lmbmRlZiBfX1dSQ19XUkNfSAorI2RlZmluZSBfX1dSQ19XUkNfSAorCisjaWZuZGVmIF9fV1JDX1dSQ1RZUEVTX0gKKyNpbmNsdWRlICJ3cmN0eXBlcy5oIgorI2VuZGlmCisKKyNkZWZpbmUgV1JDX1ZFUlNJT04JIjEuMC4wIgorI2RlZmluZSBXUkNfUkVMRUFTRURBVEUJIigyOC1NYXktMTk5OCkiCisjZGVmaW5lIFdSQ19GVUxMVkVSU0lPTiBXUkNfVkVSU0lPTiAiICIgV1JDX1JFTEVBU0VEQVRFCisKKy8qIE9ubHkgdXNlZCBpbiBoZWF2eSBkZWJ1Z2dpbmcgc2Vzc2lvbnMgKi8KKyNkZWZpbmUgSEVBUENIRUNLKCkKKworLyogTWVtb3J5L2xvYWQgZmxhZ3MgKi8KKyNkZWZpbmUgV1JDX01PX01PVkVBQkxFCQkweDAwMTAKKyNkZWZpbmUgV1JDX01PX1BVUkUJCTB4MDAyMAorI2RlZmluZSBXUkNfTU9fUFJFTE9BRAkJMHgwMDQwCisjZGVmaW5lIFdSQ19NT19ESVNDQVJEQUJMRQkweDEwMDAKKworLyogUmVzb3VyY2UgdHlwZSBJRHMgKi8KKyNkZWZpbmUgV1JDX1JUX0NVUlNPUgkJKDEpCisjZGVmaW5lIFdSQ19SVF9CSVRNQVAJCSgyKQorI2RlZmluZSBXUkNfUlRfSUNPTgkJKDMpCisjZGVmaW5lIFdSQ19SVF9NRU5VCQkoNCkKKyNkZWZpbmUgV1JDX1JUX0RJQUxPRwkJKDUpCisjZGVmaW5lIFdSQ19SVF9TVFJJTkcJCSg2KQorI2RlZmluZSBXUkNfUlRfRk9OVERJUgkJKDcpCisjZGVmaW5lIFdSQ19SVF9GT05UCQkoOCkKKyNkZWZpbmUgV1JDX1JUX0FDQ0VMRVJBVE9SCSg5KQorI2RlZmluZSBXUkNfUlRfUkNEQVRBCQkoMTApCisjZGVmaW5lIFdSQ19SVF9NRVNTQUdFVEFCTEUJKDExKQorI2RlZmluZSBXUkNfUlRfR1JPVVBfQ1VSU09SCSgxMikKKyNkZWZpbmUgV1JDX1JUX0dST1VQX0lDT04JKDE0KQorI2RlZmluZSBXUkNfUlRfVkVSU0lPTgkJKDE2KQorI2RlZmluZSBXUkNfUlRfRExHSU5DTFVERQkoMTcpCisjZGVmaW5lIFdSQ19SVF9QTFVHUExBWQkJKDE5KQorI2RlZmluZSBXUkNfUlRfVlhECQkoMjApCisjZGVmaW5lIFdSQ19SVF9BTklDVVJTT1IJKDIxKQorI2RlZmluZSBXUkNfUlRfQU5JSUNPTgkJKDIyKQorCisvKiBEZWZhdWx0IGNsYXNzIHR5cGUgSURzICovCisjZGVmaW5lIENUX0JVVFRPTgkweDgwCisjZGVmaW5lIENUX0VESVQJCTB4ODEKKyNkZWZpbmUgQ1RfU1RBVElDIAkweDgyCisjZGVmaW5lIENUX0xJU1RCT1gJMHg4MworI2RlZmluZSBDVF9TQ1JPTExCQVIJMHg4NAorI2RlZmluZSBDVF9DT01CT0JPWAkweDg1CisKKy8qIEZyb20gd3JjLmMgKi8KK2V4dGVybiBpbnQgZGVidWdsZXZlbDsKKyNkZWZpbmUgREVCVUdMRVZFTF9OT05FCQkweDAwMDAKKyNkZWZpbmUgREVCVUdMRVZFTF9DSEFUCQkweDAwMDEKKyNkZWZpbmUgREVCVUdMRVZFTF9EVU1QCQkweDAwMDIKKyNkZWZpbmUgREVCVUdMRVZFTF9UUkFDRQkweDAwMDQKKworZXh0ZXJuIGludCB3aW4zMjsKK2V4dGVybiBpbnQgY29uc3RhbnQ7CitleHRlcm4gaW50IGNyZWF0ZV9yZXM7CitleHRlcm4gaW50IGV4dGVuc2lvbnM7CitleHRlcm4gaW50IGJpbmFyeTsKK2V4dGVybiBpbnQgY3JlYXRlX2hlYWRlcjsKK2V4dGVybiBpbnQgY3JlYXRlX2RpcjsKK2V4dGVybiBpbnQgZ2xvYmFsOworZXh0ZXJuIGludCBpbmRpcmVjdDsKK2V4dGVybiBpbnQgaW5kaXJlY3Rfb25seTsKK2V4dGVybiBpbnQgYWxpZ25tZW50OworZXh0ZXJuIGludCBhbGlnbm1lbnRfcHdyOworZXh0ZXJuIGludCBjcmVhdGVfczsKK2V4dGVybiBEV09SRCBjb2RlcGFnZTsKK2V4dGVybiBpbnQgcGVkYW50aWM7CisKK2V4dGVybiBjaGFyICpwcmVmaXg7CitleHRlcm4gY2hhciAqb3V0cHV0X25hbWU7CitleHRlcm4gY2hhciAqaW5wdXRfbmFtZTsKK2V4dGVybiBjaGFyICpoZWFkZXJfbmFtZTsKK2V4dGVybiBjaGFyICpjbWRsaW5lOwkJCQorCitleHRlcm4gcmVzb3VyY2VfdCAqcmVzb3VyY2VfdG9wOworZXh0ZXJuIGxhbmd1YWdlX3QgKmN1cnJlbnRsYW5ndWFnZTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy93cmMvd3JjdHlwZXMuaCBiL3Rvb2xzL3dyYy93cmN0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMDc1ZGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy93cmMvd3JjdHlwZXMuaApAQCAtMCwwICsxLDQ2NyBAQAorLyoKKyAqIEdlbmVyYWwgdHlwZSBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAxOTk4IEJlcnRobyBBLiBTdHVsdGllbnMgKEJTKQorICoKKyAqLworCisjaWZuZGVmIF9fV1JDX1dSQ1RZUEVTX0gKKyNkZWZpbmUgX19XUkNfV1JDVFlQRVNfSAorCisvKiBGaXJzdCBpcyBNUyBzdHlsZSwgc2Vjb25kIHdpbmUgc3R5bGUgKi8KKyNpZiAhZGVmaW5lZChfSU5DX1dJTkRPV1MpICYmICFkZWZpbmVkKF9fV0lORV9XSU5ET1dTX0gpCisjaW5jbHVkZSAid2luZG93cy5oIgorI2VuZGlmCisKKyNpZm5kZWYgTUFLRUxBTkdJRAorI2luY2x1ZGUgIndpbm5scy5oIgorI2VuZGlmCisKKyNpZm5kZWYgVlNfRkZJX1NJR05BVFVSRQorI2luY2x1ZGUgInZlci5oIgorI2VuZGlmCisKKworLyogQmluYXJ5IHJlc291cmNlIHN0cnVjdHVyZSAqLworI2RlZmluZSBSRVNfQkxPQ0tTSVpFCTUxMgorCit0eXBlZGVmIHN0cnVjdCByZXMgeworCWludAlhbGxvY3NpemU7CS8qIEFsbG9jYXRlZCBkYXRhYmxvY2sgc2l6ZSAqLworCWludAlzaXplOwkJLyogQWN0dWFsIHNpemUgb2YgZGF0YSAqLworCWludAlkYXRhaWR4OwkvKiBUYWcgYmVoaW5kIHRoZSByZXNvdXJjZS1oZWFkZXIgKi8KKwljaGFyCSpkYXRhOworfSByZXNfdDsKKworLyogUmVzb3VyY2Ugc3RyaW5ncyBhcmUgc2xpZ2h0bHkgbW9yZSBjb21wbGV4IGJlY2F1c2UgdGhleSBpbmNsdWRlICdcMCcgKi8KK2VudW0gc3RyX2Uge3N0cl9jaGFyLCBzdHJfdW5pY29kZX07CisKK3R5cGVkZWYgc3RydWN0IHN0cmluZyB7CisJaW50IAkJc2l6ZTsKKwllbnVtIHN0cl9lCXR5cGU7CisJdW5pb24geworCQljaGFyICpjc3RyOworCQlzaG9ydCAqd3N0cjsKKwl9IHN0cjsKK30gc3RyaW5nX3Q7CisKKy8qIFJlc291cmNlcyBhcmUgaWRlbnRpZmllZCBlaXRoZXIgYnkgbmFtZSBvciBieSBudW1iZXIgKi8KK2VudW0gbmFtZV9lIHtuYW1lX3N0ciwgbmFtZV9vcmR9OworCit0eXBlZGVmIHN0cnVjdCBuYW1lX2lkIHsKKwl1bmlvbiB7CisJCXN0cmluZ190ICpzX25hbWU7CisJCWludAlpX25hbWU7CisJfSBuYW1lOworCWVudW0gbmFtZV9lIHR5cGU7Cit9IG5hbWVfaWRfdDsKKworLyogTGFuZ3VhZ2UgZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0IGxhbmd1YWdlIHsKKwlpbnQJaWQ7CisJaW50CXN1YjsKK30gbGFuZ3VhZ2VfdDsKKwordHlwZWRlZiBEV09SRCBjaGFyYWN0c190OwordHlwZWRlZiBEV09SRCB2ZXJzaW9uX3Q7CisKK3R5cGVkZWYgc3RydWN0IGx2YyB7CisJbGFuZ3VhZ2VfdAkqbGFuZ3VhZ2U7CisJdmVyc2lvbl90CSp2ZXJzaW9uOworCWNoYXJhY3RzX3QJKmNoYXJhY3RzOworfSBsdmNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZm9udF9pZCB7CisJc3RyaW5nX3QJKm5hbWU7CisJaW50CQlzaXplOworCWludAkJd2VpZ2h0OworCWludAkJaXRhbGljOworfSBmb250X2lkX3Q7CisKKy8qIHJlc291cmNlIHR5cGVzICovCisvKiBUaGVzZSBhcmUgaW4gdGhlIHNhbWUgb3JkZXIgKGFuZCBvcmRpbmFsKSBhcyB0aGUgUlRfeHh4CisgKiBkZWZpbmVzLiBUaGlzIGlzIF9yZXF1aXJlZF8uCisgKiBJIHJvbGxlZCBteSBvd24gbnVtYmVycyBmb3IgdGhlIHdpbjMyIGV4dGVuc2lvbiB0aGF0IGFyZQorICogZG9jdW1lbnRlZCwgYnV0IGdlbmVyYXRlIGVpdGhlciBvbGQgUlRfeHh4IG51bWJlcnMsIG9yCisgKiBkb24ndCBoYXZlIGFuIG9yZGluYWwgYXNzb2NpYXRlZCAodXNlciB0eXBlKS4KKyAqIEkgZG9uJ3Qga25vdyBhbnkgc3BlY3MgZm9yIHRob3NlIG5vdGVkIHN1Y2gsIGZvciB0aGF0IG1hdHRlciwKKyAqIEkgZG9uJ3QgZXZlbiBrbm93IHdoZXRoZXIgdGhleSBjYW4gYmUgZ2VuZXJhdGVkIG90aGVyIHRoYW4gYnkKKyAqIHVzaW5nIGEgdXNlci10eXBlIHJlc291cmNlLgorICovCitlbnVtIHJlc19lIHsKKwlyZXNfMCA9IDAsCisJcmVzX2N1ciwKKwlyZXNfaWNvLAorCXJlc19ibXAsCisJcmVzX21lbiwKKwlyZXNfZGxnLAorCXJlc19zdHQsCisJcmVzX2ZudGRpciwKKwlyZXNfZm50LAorCXJlc19hY2MsCisJcmVzX3JkdCwKKwlyZXNfbXNnLAorCXJlc19jdXJnLAorCXJlc18xMywJCS8qIEhtLCB3b25kZXIgd2h5IGl0cyBub3QgdXNlZC4uLiAqLworCXJlc19pY29nLAorCXJlc18xNSwKKwlyZXNfdmVyLAorCXJlc19kbGdpbmMsCS8qIE5vdCBpbXBsZW1lbnRlZCwgbm8gbGF5b3V0IGF2YWlsYWJsZSAqLworCXJlc18xOCwKKwlyZXNfcG5wLAkvKiBOb3QgaW1wbGVtZW50ZWQsIG5vIGxheW91dCBhdmFpbGFibGUgKi8KKwlyZXNfdnhkLAkvKiBOb3QgaW1wbGVtZW50ZWQsIG5vIGxheW91dCBhdmFpbGFibGUgKi8KKwlyZXNfYW5pY3VyLAkvKiBOb3QgaW1wbGVtZW50ZWQsIG5vIGxheW91dCBhdmFpbGFibGUgKi8KKwlyZXNfYW5paWNvLAkvKiBOb3QgaW1wbGVtZW50ZWQsIG5vIGxheW91dCBhdmFpbGFibGUgKi8KKworCXJlc19tZW5leCA9IDI1NiArIDQsCisJcmVzX2RsZ2V4LAorCXJlc191c3IsCit9OworCisvKiBSYXcgYnl0ZXMgaW4gYSByb3cuLi4gKi8KK3R5cGVkZWYgc3RydWN0IHJhd19kYXRhIHsKKwlpbnQJc2l6ZTsKKwljaGFyCSpkYXRhOworfSByYXdfZGF0YV90OworCisvKiBEaWFsb2cgc3RydWN0dXJlcyAqLwordHlwZWRlZiBzdHJ1Y3QgY29udHJvbCB7CisJc3RydWN0IGNvbnRyb2wJKm5leHQ7CQkvKiBMaXN0IG9mIGNvbnRyb2xzICovCisJc3RydWN0IGNvbnRyb2wJKnByZXY7CisJbmFtZV9pZF90CSpjdGxjbGFzczsJLyogQ29udHJvbENsYXNzICovCisJc3RyaW5nX3QJKnRpdGxlOwkJLyogVGl0bGUgb2YgY29udHJvbCAqLworCWludAkJaWQ7CisJaW50CQl4OwkJLyogUG9zaXRpb24gKi8KKwlpbnQJCXk7CisJaW50CQl3aWR0aDsJCS8qIFNpemUgKi8KKwlpbnQJCWhlaWdodDsKKwlEV09SRAkJc3R5bGU7CQkvKiBTdHlsZSAqLworCURXT1JECQlleHN0eWxlOworCURXT1JECQloZWxwaWQ7CQkvKiBFWDogKi8KKwlpbnQJCWdvdHN0eWxlOwkvKiBVc2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBkZWZhdWx0ICovCisJaW50CQlnb3RleHN0eWxlOwkvKiBzdHlsZXMgbXVzdCBiZSBzZXQgKi8KKwlpbnQJCWdvdGhlbHBpZDsKKwlyYXdfZGF0YV90CSpleHRyYTsJCS8qIEVYOiBudW1iZXIgb2YgZXh0cmEgYnl0ZXMgaW4gcmVzb3VyY2UgKi8KK30gY29udHJvbF90OworCit0eXBlZGVmIHN0cnVjdCBkaWFsb2cgeworCURXT1JECQltZW1vcHQ7CisJaW50CQl4OwkJLyogUG9zaXRpb24gKi8KKwlpbnQJCXk7CisJaW50CQl3aWR0aDsJCS8qIFNpemUgKi8KKwlpbnQJCWhlaWdodDsKKwlEV09SRAkJc3R5bGU7CQkvKiBTdHlsZSAqLworCURXT1JECQlleHN0eWxlOworCWludAkJZ290c3R5bGU7CS8qIFVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlZmF1bHQgKi8KKwlpbnQJCWdvdGV4c3R5bGU7CS8qIHN0eWxlcyBtdXN0IGJlIHNldCAqLworCW5hbWVfaWRfdAkqbWVudTsKKwluYW1lX2lkX3QJKmRsZ2NsYXNzOworCXN0cmluZ190CSp0aXRsZTsKKwlmb250X2lkX3QJKmZvbnQ7CisJbHZjX3QJCWx2YzsKKwljb250cm9sX3QJKmNvbnRyb2xzOworfSBkaWFsb2dfdDsKKworLyogRGlhbG9nRXggc3RydWN0dXJlcyAqLwordHlwZWRlZiBzdHJ1Y3QgZGlhbG9nZXggeworCURXT1JECQltZW1vcHQ7CisJaW50CQl4OwkJLyogUG9zaXRpb24gKi8KKwlpbnQJCXk7CisJaW50CQl3aWR0aDsJCS8qIFNpemUgKi8KKwlpbnQJCWhlaWdodDsKKwlEV09SRAkJc3R5bGU7CQkvKiBTdHlsZSAqLworCURXT1JECQlleHN0eWxlOworCURXT1JECQloZWxwaWQ7CQkvKiBFWDogKi8KKwlpbnQJCWdvdHN0eWxlOwkvKiBVc2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBkZWZhdWx0ICovCisJaW50CQlnb3RleHN0eWxlOwkvKiBzdHlsZXMgbXVzdCBiZSBzZXQgKi8KKwlpbnQJCWdvdGhlbHBpZDsKKwluYW1lX2lkX3QJKm1lbnU7CisJbmFtZV9pZF90CSpkbGdjbGFzczsKKwlzdHJpbmdfdAkqdGl0bGU7CisJZm9udF9pZF90CSpmb250OworCWx2Y190CQlsdmM7CisJY29udHJvbF90CSpjb250cm9sczsKK30gZGlhbG9nZXhfdDsKKworLyogTWVudSBzdHJ1Y3R1cmVzICovCit0eXBlZGVmIHN0cnVjdCBtZW51X2l0ZW0geworCXN0cnVjdCBtZW51X2l0ZW0gKm5leHQ7CisJc3RydWN0IG1lbnVfaXRlbSAqcHJldjsKKwlzdHJ1Y3QgbWVudV9pdGVtICpwb3B1cDsKKwlpbnQJCWlkOworCURXT1JECQlzdGF0ZTsKKwlzdHJpbmdfdAkqbmFtZTsKK30gbWVudV9pdGVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lbnUgeworCURXT1JECQltZW1vcHQ7CisJbHZjX3QJCWx2YzsKKwltZW51X2l0ZW1fdAkqaXRlbXM7Cit9IG1lbnVfdDsKKworLyogTWVudUV4IHN0cnVjdHVyZXMgKi8KK3R5cGVkZWYgc3RydWN0IG1lbnVleF9pdGVtIHsKKwlzdHJ1Y3QgbWVudWV4X2l0ZW0gKm5leHQ7CisJc3RydWN0IG1lbnVleF9pdGVtICpwcmV2OworCXN0cnVjdCBtZW51ZXhfaXRlbSAqcG9wdXA7CisJaW50CQlpZDsKKwlEV09SRAkJdHlwZTsKKwlEV09SRAkJc3RhdGU7CisJaW50CQloZWxwaWQ7CisJc3RyaW5nX3QJKm5hbWU7CisJaW50CQlnb3RpZDsKKwlpbnQJCWdvdHR5cGU7CisJaW50CQlnb3RzdGF0ZTsKKwlpbnQJCWdvdGhlbHBpZDsKK30gbWVudWV4X2l0ZW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWVudWV4IHsKKwlEV09SRAkJbWVtb3B0OworCWx2Y190CQlsdmM7CisJbWVudWV4X2l0ZW1fdAkqaXRlbXM7Cit9IG1lbnVleF90OworCit0eXBlZGVmIHN0cnVjdCBpdGVtZXhfb3B0Cit7CisJaW50CWlkOworCURXT1JECXR5cGU7CisJRFdPUkQJc3RhdGU7CisJaW50CWhlbHBpZDsKKwlpbnQJZ290aWQ7CisJaW50CWdvdHR5cGU7CisJaW50CWdvdHN0YXRlOworCWludAlnb3RoZWxwaWQ7Cit9IGl0ZW1leF9vcHRfdDsKKworLyogUkMgc3RydWN0dXJlcyBmb3IgdHlwZXMgcmVhZCBmcm9tIGZpbGUgb3Igc3VwcGxpZWQgYmluYXJ5ICovCit0eXBlZGVmIHN0cnVjdCBmb250IHsKKwlEV09SRAkJbWVtb3B0OworCXJhd19kYXRhX3QJKmRhdGE7Cit9IGZvbnRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaWNvbl9kaXJfZW50cnkgeworICAgIEJZVEUgIHdpZHRoOwkvKiBGcm9tIHRoZSBTS0QgZG9jLiAqLworICAgIEJZVEUgIGhlaWdodDsKKyAgICBCWVRFICBuY2xyOworICAgIEJZVEUgIHJlc2VydmVkOworICAgIFdPUkQgIHBsYW5lczsKKyAgICBXT1JEICBiaXRzOworICAgIERXT1JEIHJlc3NpemU7CisgICAgRFdPUkQgb2Zmc2V0OworfSBpY29uX2Rpcl9lbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCBpY29uIHsKKwlzdHJ1Y3QgaWNvbgkqbmV4dDsKKwlzdHJ1Y3QgaWNvbgkqcHJldjsKKwlpbnQJCWlkOwkvKiBVbmlxdWUgaWNvbiBpZCB3aXRoaW4gcmVzb3VyY2UgZmlsZSAqLworCWludAkJd2lkdGg7CS8qIEZpZWxkIGZyb20gdGhlIEljb25EaXJFbnRyeSAqLworCWludAkJaGVpZ2h0OworCWludAkJbmNscjsKKwlpbnQJCXBsYW5lczsKKwlpbnQJCWJpdHM7CisJcmF3X2RhdGFfdAkqZGF0YTsKK30gaWNvbl90OworCit0eXBlZGVmIHN0cnVjdCBpY29uX2dyb3VwIHsKKwlEV09SRAkJbWVtb3B0OworCWljb25fdAkJKmljb25saXN0OworCWludAkJbmljb247Cit9IGljb25fZ3JvdXBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgY3Vyc29yX2Rpcl9lbnRyeSB7CisgICAgQllURSAgd2lkdGg7CS8qIEZyb20gdGhlIFNLRCBkb2MuICovCisgICAgQllURSAgaGVpZ2h0OworICAgIEJZVEUgIG5jbHI7CisgICAgQllURSAgcmVzZXJ2ZWQ7CisgICAgV09SRCAgeGhvdDsKKyAgICBXT1JEICB5aG90OworICAgIERXT1JEIHJlc3NpemU7CisgICAgRFdPUkQgb2Zmc2V0OworfSBjdXJzb3JfZGlyX2VudHJ5X3Q7CisKK3R5cGVkZWYgc3RydWN0IGN1cnNvciB7CisJc3RydWN0IGN1cnNvcgkqbmV4dDsKKwlzdHJ1Y3QgY3Vyc29yCSpwcmV2OworCWludAkJaWQ7CS8qIFVuaXF1ZSBpY29uIGlkIHdpdGhpbiByZXNvdXJjZSBmaWxlICovCisJaW50CQl3aWR0aDsJLyogRmllbGQgZnJvbSB0aGUgQ3Vyc29yRGlyRW50cnkgKi8KKwlpbnQJCWhlaWdodDsKKwlpbnQJCW5jbHI7CisJaW50CQlwbGFuZXM7CisJaW50CQliaXRzOworCWludAkJeGhvdDsKKwlpbnQJCXlob3Q7CisJcmF3X2RhdGFfdAkqZGF0YTsKK30gY3Vyc29yX3Q7CisKK3R5cGVkZWYgc3RydWN0IGN1cnNvcl9ncm91cCB7CisJRFdPUkQJCW1lbW9wdDsKKwljdXJzb3JfdAkqY3Vyc29ybGlzdDsKKwlpbnQJCW5jdXJzb3I7Cit9IGN1cnNvcl9ncm91cF90OworCit0eXBlZGVmIHN0cnVjdCBiaXRtYXAgeworCURXT1JECQltZW1vcHQ7CisJcmF3X2RhdGFfdAkqZGF0YTsKK30gYml0bWFwX3Q7CisKK3R5cGVkZWYgc3RydWN0IHJjZGF0YSB7CisJRFdPUkQJCW1lbW9wdDsKKwlsdmNfdAkJbHZjOworCXJhd19kYXRhX3QJKmRhdGE7Cit9IHJjZGF0YV90OworCit0eXBlZGVmIHN0cnVjdCB1c2VyIHsKKwlEV09SRAkJbWVtb3B0OworCW5hbWVfaWRfdAkqdHlwZTsKKwlyYXdfZGF0YV90CSpkYXRhOworfSB1c2VyX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1lc3NhZ2V0YWJsZSB7CisJcmF3X2RhdGFfdAkqZGF0YTsKK30gbWVzc2FnZXRhYmxlX3Q7CisKKy8qIFN0cmluZ1RhYmxlIHN0cnVjdHVyZXMgKi8KK3R5cGVkZWYgc3RydWN0IHN0dF9lbnRyeSB7CisJc3RyaW5nX3QJCSpzdHI7CisJaW50CQkJaWQ7CisJRFdPUkQJCQltZW1vcHQ7CisJY2hhcmFjdHNfdAkJKmNoYXJhY3RzOworCXZlcnNpb25fdAkJKnZlcnNpb247Cit9IHN0dF9lbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCBzdHJpbmd0YWJsZSB7CisJc3RydWN0IHN0cmluZ3RhYmxlCSpuZXh0OworCXN0cnVjdCBzdHJpbmd0YWJsZQkqcHJldjsKKwlEV09SRAkJCW1lbW9wdDsKKwlsdmNfdAkJCWx2YzsKKwlpbnQJCQlpZGJhc2U7CisJaW50CQkJbmVudHJpZXM7CisJc3R0X2VudHJ5X3QJCSplbnRyaWVzOworfSBzdHJpbmd0YWJsZV90OworCisvKiBWZXJzaW9uSW5mbyBzdHJ1Y3R1cmVzICovCitlbnVtIHZlcl92YWxfZSB7dmFsX3N0ciwgdmFsX3dvcmRzLCB2YWxfYmxvY2t9OworCitzdHJ1Y3QgdmVyX2Jsb2NrOwkvKiBGb3J3YXJkIHJlZiAqLworCit0eXBlZGVmIHN0cnVjdCB2ZXJfd29yZHMgeworCVdPUkQJKndvcmRzOworCWludAlud29yZHM7Cit9IHZlcl93b3Jkc190OworCit0eXBlZGVmIHN0cnVjdCB2ZXJfdmFsdWUgeworCXN0cnVjdCB2ZXJfdmFsdWUJKm5leHQ7CisJc3RydWN0IHZlcl92YWx1ZQkqcHJldjsKKwlzdHJpbmdfdAkJKmtleTsKKwl1bmlvbiB7CisJCXN0cmluZ190CQkqc3RyOworCQl2ZXJfd29yZHNfdAkJKndvcmRzOworCQlzdHJ1Y3QgdmVyX2Jsb2NrCSpibG9jazsKKwl9IHZhbHVlOworCWVudW0gdmVyX3ZhbF9lCQl0eXBlOworfSB2ZXJfdmFsdWVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgdmVyX2Jsb2NrIHsKKwlzdHJ1Y3QgdmVyX2Jsb2NrCSpuZXh0OworCXN0cnVjdCB2ZXJfYmxvY2sJKnByZXY7CisJc3RyaW5nX3QJCSpuYW1lOworCXZlcl92YWx1ZV90CQkqdmFsdWVzOworfSB2ZXJfYmxvY2tfdDsKKwordHlwZWRlZiBzdHJ1Y3QgdmVyc2lvbmluZm8geworCWludAlmaWxldmVyX21hajE7CisJaW50CWZpbGV2ZXJfbWFqMjsKKwlpbnQJZmlsZXZlcl9taW4xOworCWludAlmaWxldmVyX21pbjI7CisJaW50CXByb2R2ZXJfbWFqMTsKKwlpbnQJcHJvZHZlcl9tYWoyOworCWludAlwcm9kdmVyX21pbjE7CisJaW50CXByb2R2ZXJfbWluMjsKKwlpbnQJZmlsZW9zOworCWludAlmaWxlZmxhZ3M7CisJaW50CWZpbGVmbGFnc21hc2s7CisJaW50CWZpbGV0eXBlOworCWludAlmaWxlc3VidHlwZTsKKwlzdHJ1Y3QgeworCQlpbnQgZnY6MTsKKwkJaW50IHB2OjE7CisJCWludCBmbzoxOworCQlpbnQgZmY6MTsKKwkJaW50IGZmbToxOworCQlpbnQgZnQ6MTsKKwkJaW50IGZzdDoxOworCX0gZ290aXQ7CisJdmVyX2Jsb2NrX3QJKmJsb2NrczsKK30gdmVyc2lvbmluZm9fdDsKKworLyogQWNjZWxlcmF0b3Igc3RydWN0dXJlcyAqLworI2RlZmluZSBXUkNfQUZfVklSVEtFWQkweDAwMDEKKyNkZWZpbmUgV1JDX0FGX05PSU5WRVJUCTB4MDAwMgorI2RlZmluZSBXUkNfQUZfU0hJRlQJMHgwMDA0CisjZGVmaW5lIFdSQ19BRl9DT05UUk9MCTB4MDAwOAorI2RlZmluZSBXUkNfQUZfQUxUCTB4MDAxMAorI2RlZmluZSBXUkNfQUZfQVNDSUkJMHg0MDAwCisKK3R5cGVkZWYgc3RydWN0IGV2ZW50IHsKKwlzdHJ1Y3QgZXZlbnQJKm5leHQ7CisJc3RydWN0IGV2ZW50CSpwcmV2OworCWludAkJZmxhZ3M7CisJaW50CQlrZXk7CisJaW50CQlpZDsKK30gZXZlbnRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgYWNjZWxlcmF0b3IgeworCURXT1JECQltZW1vcHQ7CisJbHZjX3QJCWx2YzsKKwlldmVudF90CQkqZXZlbnRzOworfSBhY2NlbGVyYXRvcl90OworCisvKiBBIHRvcC1sZXZlbCByZXNvdXJjZSBub2RlICovCit0eXBlZGVmIHN0cnVjdCByZXNvdXJjZSB7CisJc3RydWN0IHJlc291cmNlCSpuZXh0OworCXN0cnVjdCByZXNvdXJjZSAqcHJldjsKKwllbnVtIHJlc19lCXR5cGU7CisJbmFtZV9pZF90CSpuYW1lOwkvKiByZXNvdXJjZSdzIG5hbWUgKi8KKwlsYW5ndWFnZV90CSpsYW47CS8qIE9ubHkgdXNlZCBhcyBhIHNvcnRpbmcga2V5IGFuZCBjLW5hbWUgY3JlYXRpb24qLworCXVuaW9uIHsKKwkJYWNjZWxlcmF0b3JfdAkqYWNjOworCQliaXRtYXBfdAkqYm1wOworCQljdXJzb3JfdAkqY3VyOworCQljdXJzb3JfZ3JvdXBfdAkqY3VyZzsKKwkJZGlhbG9nX3QJKmRsZzsKKwkJZGlhbG9nZXhfdAkqZGxnZXg7CisJCWZvbnRfdAkJKmZudDsKKwkJaWNvbl90CQkqaWNvOworCQlpY29uX2dyb3VwX3QJKmljb2c7CisJCW1lbnVfdAkJKm1lbjsKKwkJbWVudWV4X3QJKm1lbmV4OworCQltZXNzYWdldGFibGVfdAkqbXNnOworCQlyY2RhdGFfdAkqcmR0OworCQlzdHJpbmd0YWJsZV90CSpzdHQ7CisJCXVzZXJfdAkJKnVzcjsKKwkJdmVyc2lvbmluZm9fdAkqdmVyOworCQl2b2lkCQkqb3ZlcmxheTsgLyogVG8gY2F0Y2ggYWxsIHR5cGVzIGF0IG9uY2UuLi4gKi8KKwl9IHJlczsKKwlyZXNfdAkJKmJpbnJlczsJLyogVG8gYmluYXJ5IGNvbnZlcnRlZCByZXNvdXJjZSAqLworCWNoYXIJCSpjX25hbWU7CS8qIEJhc2VOYW1lIGluIG91dHB1dCAqLworCURXT1JECQltZW1vcHQ7Cit9IHJlc291cmNlX3Q7CisKKy8qIFJlc291cmNlIGNvdW50ICovCit0eXBlZGVmIHN0cnVjdCByZXMzMl9jb3VudCB7CisJaW50CQkJY291bnQ7CisJcmVzb3VyY2VfdAkJKipyc2M7Cit9IHJlczMyX2NvdW50X3Q7CisKK3R5cGVkZWYgc3RydWN0IHJlc19jb3VudCB7CisJbmFtZV9pZF90CQl0eXBlOworCWludAkJCWNvdW50OwkJLyogd2luMTYgbW9kZSAqLworCXJlc291cmNlX3QJCSoqcnNjYXJyYXk7CisJaW50CQkJY291bnQzMjsKKwlyZXMzMl9jb3VudF90CQkqcnNjMzJhcnJheTsJLyogd2luMzIgbW9kZSAqLworCWludAkJCW5faWRfZW50cmllczsKKwlpbnQJCQluX25hbWVfZW50cmllczsKK30gcmVzX2NvdW50X3Q7CisKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL3Rvb2xzL3dyYy93cml0ZXJlcy5jIGIvdG9vbHMvd3JjL3dyaXRlcmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwODRmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3dyYy93cml0ZXJlcy5jCkBAIC0wLDAgKzEsMTEzNCBAQAorLyoKKyAqIFdyaXRlIC5yZXMsIC5zIGFuZCAuaCBmaWxlKHMpIGZyb20gYSByZXNvdXJjZS10cmVlCisgKgorICogQ29weXJpZ2h0IDE5OTggQmVydGhvIEEuIFN0dWx0aWVucworICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlICJ3cmMuaCIKKyNpbmNsdWRlICJ3cml0ZXJlcy5oIgorI2luY2x1ZGUgImdlbnJlcy5oIgorI2luY2x1ZGUgIm5ld3N0cnVjLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworY2hhciBzX2ZpbGVfaGVhZF9zdHJbXSA9CisJIiNcbiIKKwkiIyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIHdpdGggd3JjIHZlcnNpb24gIiBXUkNfRlVMTFZFUlNJT04gIi4gRG8gbm90IGVkaXQhXG4iCisJIiMgU291cmNlIDogJXNcbiIKKwkiIyBDbWRsaW5lOiAlc1xuIgorCSIjIERhdGUgICA6ICVzIgorCSIjXG5cbiIKKwkiXHQuZGF0YVxuXG4iCisJOworCitjaGFyIHNfZmlsZV90YWlsX3N0cltdID0KKwkiIyA8ZW9mPlxuXG4iCisJOworCitjaGFyIGhfZmlsZV9oZWFkX3N0cltdID0KKwkiLypcbiIKKwkiICogVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCB3aXRoIHdyYyB2ZXJzaW9uICIgV1JDX0ZVTExWRVJTSU9OICIuIERvIG5vdCBlZGl0IVxuIgorCSIgKiBTb3VyY2UgOiAlc1xuIgorCSIgKiBDbWRsaW5lOiAlc1xuIgorCSIgKiBEYXRlICAgOiAlcyIKKwkiICovXG5cbiIKKwkiI2lmbmRlZiBfXyUwOHhfSFxuIgkvKiBUaGlzIGJlY29tZXMgdGhlIGRhdGEgb2YgY29tcGlsZSAqLworCSIjZGVmaW5lIF9fJTA4eF9IXG5cbiIKKwkiI2lmbmRlZiBfX1dSQ19SU0NfSFxuIgorCSIjaW5jbHVkZSA8d3JjX3JzYy5oPlxuIgorCSIjZW5kaWZcblxuIgorCTsKKworY2hhciBoX2ZpbGVfdGFpbF9zdHJbXSA9CisJIiNlbmRpZlxuIgorCSIvKiA8ZW9mPiAqL1xuXG4iCisJOworCitjaGFyIF9ORVJlc1RhYltdID0gIl9ORVJlc1RhYiI7CitjaGFyIF9QRVJlc1RhYltdID0gIl9QRVJlc1RhYiI7CitjaGFyIF9SZXNUYWJsZVtdID0gIl9SZXNUYWJsZSI7CisKK3Jlc19jb3VudF90ICpyY2FycmF5ID0gTlVMTDsKK2ludCByY2NvdW50ID0gMDsKK2ludCBuX2lkX2VudHJpZXMgPSAwOworaW50IG5fbmFtZV9lbnRyaWVzID0gMDsKKwordGltZV90IG5vdzsKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiB3cml0ZV9yZXNmaWxlCisgKiBTeW50YXgJOiB2b2lkIHdyaXRlX3Jlc2ZpbGUoY2hhciAqb3V0bmFtZSwgcmVzb3VyY2VfdCAqdG9wKQorICogSW5wdXQJOgorICoJb3V0bmFtZQktIEZpbGVuYW1lIHRvIHdyaXRlIHRvCisgKgl0b3AJLSBUaGUgcmVzb3VyY2UtdHJlZSB0byBjb252ZXJ0CisgKiBPdXRwdXQJOgorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCit2b2lkIHdyaXRlX3Jlc2ZpbGUoY2hhciAqb3V0bmFtZSwgcmVzb3VyY2VfdCAqdG9wKQoreworCUZJTEUgKmZvOworCWludCByZXQ7CisJY2hhciB6ZXJvc1szXSA9IHswLCAwLCAwfTsKKworCWZvID0gZm9wZW4ob3V0bmFtZSwgIndiIik7CisJaWYoIWZvKQorCXsKKwkJZXJyb3IoIkNvdWxkIG5vdCBvcGVuICVzXG4iLCBvdXRuYW1lKTsKKwl9CisKKwlpZih3aW4zMikKKwl7CisJCS8qIFB1dCBhbiBlbXB0eSByZXNvdXJjZSBmaXJzdCB0byBzaWduYWwgd2luMzIgZm9ybWF0ICovCisJCXJlc190ICpyZXMgPSBuZXdfcmVzKCk7CisJCXB1dF9kd29yZChyZXMsIDApOwkJLyogUmVzU2l6ZSAqLworCQlwdXRfZHdvcmQocmVzLCAweDAwMDAwMDIwKTsJLyogSGVhZGVyU2l6ZSAqLworCQlwdXRfd29yZChyZXMsIDB4ZmZmZik7CQkvKiBSZXNUeXBlICovCisJCXB1dF93b3JkKHJlcywgMCk7CisJCXB1dF93b3JkKHJlcywgMHhmZmZmKTsJCS8qIFJlc05hbWUgKi8KKwkJcHV0X3dvcmQocmVzLCAwKTsKKwkJcHV0X2R3b3JkKHJlcywgMCk7CQkvKiBEYXRhVmVyc2lvbiAqLworCQlwdXRfd29yZChyZXMsIDApOwkJLyogTWVtb3J5IG9wdGlvbnMgKi8KKwkJcHV0X3dvcmQocmVzLCAwKTsJCS8qIExhbmd1YWdlICovCisJCXB1dF9kd29yZChyZXMsIDApOwkJLyogVmVyc2lvbiAqLworCQlwdXRfZHdvcmQocmVzLCAwKTsJCS8qIENoYXJhdGVyaXN0aWNzICovCisJCXJldCA9IGZ3cml0ZShyZXMtPmRhdGEsIDEsIHJlcy0+c2l6ZSwgZm8pOworCQlpZihyZXQgIT0gcmVzLT5zaXplKQorCQl7CisJCQlmY2xvc2UoZm8pOworCQkJZXJyb3IoIkVycm9yIHdyaXRpbmcgJXMiLCBvdXRuYW1lKTsKKwkJfQorCQlmcmVlKHJlcyk7CisJfQorCisJZm9yKDsgdG9wOyB0b3AgPSB0b3AtPm5leHQpCisJeworCQlpZighdG9wLT5iaW5yZXMpCisJCQljb250aW51ZTsKKworCQlyZXQgPSBmd3JpdGUodG9wLT5iaW5yZXMtPmRhdGEsIDEsIHRvcC0+YmlucmVzLT5zaXplLCBmbyk7CisJCWlmKHJldCAhPSB0b3AtPmJpbnJlcy0+c2l6ZSkKKwkJeworCQkJZmNsb3NlKGZvKTsKKwkJCWVycm9yKCJFcnJvciB3cml0aW5nICVzIiwgb3V0bmFtZSk7CisJCX0KKwkJaWYod2luMzIgJiYgKHRvcC0+YmlucmVzLT5zaXplICYgMHgwMykpCisJCXsKKwkJCS8qIFdyaXRlIHBhZGRpbmcgKi8KKwkJCXJldCA9IGZ3cml0ZSh6ZXJvcywgMSwgNCAtICh0b3AtPmJpbnJlcy0+c2l6ZSAmIDB4MDMpLCBmbyk7CisJCQlpZihyZXQgIT0gNCAtICh0b3AtPmJpbnJlcy0+c2l6ZSAmIDB4MDMpKQorCQkJeworCQkJCWZjbG9zZShmbyk7CisJCQkJZXJyb3IoIkVycm9yIHdyaXRpbmcgJXMiLCBvdXRuYW1lKTsKKwkJCX0KKwkJfQorCX0KKwlmY2xvc2UoZm8pOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IHdyaXRlX3NfcmVzCisgKiBTeW50YXgJOiB2b2lkIHdyaXRlX3NfcmVzKEZJTEUgKmZwLCByZXNfdCAqcmVzKQorICogSW5wdXQJOgorICogT3V0cHV0CToKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworI2RlZmluZSBCWVRFU1BFUkxJTkUJOAordm9pZCB3cml0ZV9zX3JlcyhGSUxFICpmcCwgcmVzX3QgKnJlcykKK3sKKwlpbnQgaWR4ID0gcmVzLT5kYXRhaWR4OworCWludCBlbmQgPSByZXMtPnNpemU7CisJaW50IHJlc3QgPSAoZW5kIC0gaWR4KSAlIEJZVEVTUEVSTElORTsKKwlpbnQgbGluZXMgPSAoZW5kIC0gaWR4KSAvIEJZVEVTUEVSTElORTsKKwlpbnQgaSwgajsKKworCWZvcihpID0gMCA7IGkgPCBsaW5lczsgaSsrKQorCXsKKwkJZnByaW50ZihmcCwgIlx0LmJ5dGVcdCIpOworCQlmb3IoaiA9IDA7IGogPCBCWVRFU1BFUkxJTkU7IGorKywgaWR4KyspCisJCXsKKwkJCWZwcmludGYoZnAsICIweCUwMnglcyIsIHJlcy0+ZGF0YVtpZHhdICYgMHhmZiwKKwkJCQkJaiA9PSBCWVRFU1BFUkxJTkUtMSA/ICIiIDogIiwgIik7CisJCX0KKwkJZnByaW50ZihmcCwgIlxuIik7CisJfQorCWlmKHJlc3QpCisJeworCQlmcHJpbnRmKGZwLCAiXHQuYnl0ZVx0Iik7CisJCWZvcihqID0gMDsgaiA8IHJlc3Q7IGorKywgaWR4KyspCisJCXsKKwkJCWZwcmludGYoZnAsICIweCUwMnglcyIsIHJlcy0+ZGF0YVtpZHhdICYgMHhmZiwKKwkJCQkJaiA9PSByZXN0LTEgPyAiIiA6ICIsICIpOworCQl9CisJCWZwcmludGYoZnAsICJcbiIpOworCX0KK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiB3cml0ZV9uYW1lX3N0cgorICogU3ludGF4CTogdm9pZCB3cml0ZV9uYW1lX3N0cihGSUxFICpmcCwgbmFtZV9pZF90ICpuaWQpCisgKiBJbnB1dAk6CisgKiBPdXRwdXQJOgorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6IE9uZSBsZXZlbCBzZWxmIHJlY3Vyc2l2ZSBmb3Igc3RyaW5nIHR5cGUgY29udmVyc2lvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordm9pZCB3cml0ZV9uYW1lX3N0cihGSUxFICpmcCwgbmFtZV9pZF90ICpuaWQpCit7CisJcmVzX3QgcmVzOworCWFzc2VydChuaWQtPnR5cGUgPT0gbmFtZV9zdHIpOworCisJaWYoIXdpbjMyICYmIG5pZC0+bmFtZS5zX25hbWUtPnR5cGUgPT0gc3RyX2NoYXIpCisJeworCQlyZXMuc2l6ZSA9IHN0cmxlbihuaWQtPm5hbWUuc19uYW1lLT5zdHIuY3N0cikgKyAxOworCQlpZihyZXMuc2l6ZSA+IDI1NCkKKwkJCWVycm9yKCJDYW4ndCB3cml0ZSBzdHJpbmdzIGxhcmdlciB0aGFuIDI1NCBieXRlcyIpOworCQlpZihyZXMuc2l6ZSA9PSAwKQorCQkJaW50ZXJuYWxfZXJyb3IoX19GSUxFX18sIF9fTElORV9fLCAiQXR0ZW1wdCB0byB3cml0ZSBlbXB0eSBzdHJpbmciKTsKKwkJcmVzLmRhdGFpZHggPSAwOworCQlyZXMuZGF0YSA9IChjaGFyICopeG1hbGxvYyhyZXMuc2l6ZSk7CisJCXJlcy5kYXRhWzBdID0gKGNoYXIpcmVzLnNpemU7CisJCXN0cmNweShyZXMuZGF0YSsxLCBuaWQtPm5hbWUuc19uYW1lLT5zdHIuY3N0cik7CisJCXdyaXRlX3NfcmVzKGZwLCAmcmVzKTsKKwkJZnJlZShyZXMuZGF0YSk7CisJfQorCWVsc2UgaWYoIXdpbjMyICYmIG5pZC0+bmFtZS5zX25hbWUtPnR5cGUgPT0gc3RyX3VuaWNvZGUpCisJeworCQluYW1lX2lkX3QgbG5pZDsKKwkJc3RyaW5nX3Qgc3RyOworCisJCWxuaWQudHlwZSA9IG5hbWVfc3RyOworCQlsbmlkLm5hbWUuc19uYW1lID0gJnN0cjsKKwkJc3RyLnR5cGUgPSBzdHJfY2hhcjsKKwkJc3RyLnN0ci5jc3RyID0gZHVwd3N0cjJjc3RyKG5pZC0+bmFtZS5zX25hbWUtPnN0ci53c3RyKTsKKwkJd3JpdGVfbmFtZV9zdHIoZnAsICZsbmlkKTsKKwkJZnJlZShzdHIuc3RyLmNzdHIpOworCX0KKwllbHNlIGlmKHdpbjMyICYmIG5pZC0+bmFtZS5zX25hbWUtPnR5cGUgPT0gc3RyX2NoYXIpCisJeworCQluYW1lX2lkX3QgbG5pZDsKKwkJc3RyaW5nX3Qgc3RyOworCisJCWxuaWQudHlwZSA9IG5hbWVfc3RyOworCQlsbmlkLm5hbWUuc19uYW1lID0gJnN0cjsKKwkJc3RyLnR5cGUgPSBzdHJfdW5pY29kZTsKKwkJc3RyLnN0ci53c3RyID0gZHVwY3N0cjJ3c3RyKG5pZC0+bmFtZS5zX25hbWUtPnN0ci5jc3RyKTsKKwkJd3JpdGVfbmFtZV9zdHIoZnAsICZsbmlkKTsKKwkJZnJlZShzdHIuc3RyLndzdHIpOworCX0KKwllbHNlICBpZih3aW4zMiAmJiBuaWQtPm5hbWUuc19uYW1lLT50eXBlID09IHN0cl91bmljb2RlKQorCXsKKwkJcmVzLnNpemUgPSB3c3RybGVuKG5pZC0+bmFtZS5zX25hbWUtPnN0ci53c3RyKSArIDE7CisJCWlmKHJlcy5zaXplID4gNjU1MzQpCisJCQllcnJvcigiQ2FuJ3Qgd3JpdGUgc3RyaW5ncyBsYXJnZXIgdGhhbiA2NTUzNCBieXRlcyIpOworCQlpZihyZXMuc2l6ZSA9PSAwKQorCQkJaW50ZXJuYWxfZXJyb3IoX19GSUxFX18sIF9fTElORV9fLCAiQXR0ZW1wdCB0byB3cml0ZSBlbXB0eSBzdHJpbmciKTsKKwkJcmVzLmRhdGFpZHggPSAwOworCQlyZXMuZGF0YSA9IChjaGFyICopeG1hbGxvYyhyZXMuc2l6ZSAqIDIpOworCQkoKHNob3J0ICopcmVzLmRhdGEpWzBdID0gKGNoYXIpcmVzLnNpemU7CisJCXdzdHJjcHkoKHNob3J0ICopKHJlcy5kYXRhKzIpLCBuaWQtPm5hbWUuc19uYW1lLT5zdHIud3N0cik7CisJCXJlcy5zaXplICo9IDI7IC8qIEZ1bmN0aW9uIHdyaXRlcyBieXRlcywgbm90IHNob3J0cy4uLiAqLworCQl3cml0ZV9zX3JlcyhmcCwgJnJlcyk7CisJCWZyZWUocmVzLmRhdGEpOworCX0KKwllbHNlCisJeworCQlpbnRlcm5hbF9lcnJvcihfX0ZJTEVfXywgX19MSU5FX18sICJIbW0sIHJlcXVlc3RlZCB0byB3cml0ZSBhIHN0cmluZyBvZiB1bmtub3duIHR5cGUgJWQiLAorCQkJCW5pZC0+bmFtZS5zX25hbWUtPnR5cGUpOworCX0KK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBjb21wYXJlX25hbWVfaWQKKyAqIFN5bnRheAk6IGludCBjb21wYXJlX25hbWVfaWQobmFtZV9pZF90ICpuMSwgbmFtZV9pZF90ICpuMikKKyAqIElucHV0CToKKyAqIE91dHB1dAk6CisgKiBEZXNjcmlwdGlvbgk6CisgKiBSZW1hcmtzCToKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KK2ludCBjb21wYXJlX25hbWVfaWQobmFtZV9pZF90ICpuMSwgbmFtZV9pZF90ICpuMikKK3sKKwlpZihuMS0+dHlwZSA9PSBuYW1lX29yZCAmJiBuMi0+dHlwZSA9PSBuYW1lX29yZCkKKwl7CisJCXJldHVybiBuMS0+bmFtZS5pX25hbWUgLSBuMi0+bmFtZS5pX25hbWU7CisJfQorCWVsc2UgaWYobjEtPnR5cGUgPT0gbmFtZV9zdHIgJiYgbjItPnR5cGUgPT0gbmFtZV9zdHIpCisJeworCQlpZihuMS0+bmFtZS5zX25hbWUtPnR5cGUgPT0gc3RyX2NoYXIKKwkJJiYgbjItPm5hbWUuc19uYW1lLT50eXBlID09IHN0cl9jaGFyKQorCQl7CisJCQlyZXR1cm4gc3RyaWNtcChuMS0+bmFtZS5zX25hbWUtPnN0ci5jc3RyLCBuMi0+bmFtZS5zX25hbWUtPnN0ci5jc3RyKTsKKwkJfQorCQllbHNlIGlmKG4xLT5uYW1lLnNfbmFtZS0+dHlwZSA9PSBzdHJfdW5pY29kZQorCQkmJiBuMi0+bmFtZS5zX25hbWUtPnR5cGUgPT0gc3RyX3VuaWNvZGUpCisJCXsKKwkJCXJldHVybiB3c3RyaWNtcChuMS0+bmFtZS5zX25hbWUtPnN0ci53c3RyLCBuMi0+bmFtZS5zX25hbWUtPnN0ci53c3RyKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWludGVybmFsX2Vycm9yKF9fRklMRV9fLCBfX0xJTkVfXywgIkNhbid0IHlldCBjb21wYXJlIHN0cmluZ3Mgb2YgbWl4ZWQgdHlwZSIpOworCQl9CisJfQorCWVsc2UgaWYobjEtPnR5cGUgPT0gbmFtZV9vcmQgJiYgbjItPnR5cGUgPT0gbmFtZV9zdHIpCisJCXJldHVybiAtMTsKKwllbHNlIGlmKG4xLT50eXBlID09IG5hbWVfc3RyICYmIG4yLT50eXBlID09IG5hbWVfb3JkKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCWludGVybmFsX2Vycm9yKF9fRklMRV9fLCBfX0xJTkVfXywgIkNvbXBhcmluZyBuYW1lLWlkcyB3aXRoIHVua25vd24gdHlwZXMgKCVkLCAlZCkiLAorCQkJCW4xLT50eXBlLCBuMi0+dHlwZSk7CisKKwlyZXR1cm4gMDsgLyogS2VlcCB0aGUgY29tcGlsZXIgaGFwcHkgKi8KK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBmaW5kX2NvdW50ZXIKKyAqIFN5bnRheAk6IHJlc19jb3VudF90ICpmaW5kX2NvdW50ZXIobmFtZV9pZF90ICp0eXBlKQorICogSW5wdXQJOgorICogT3V0cHV0CToKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworcmVzX2NvdW50X3QgKmZpbmRfY291bnRlcihuYW1lX2lkX3QgKnR5cGUpCit7CisJaW50IGk7CisJZm9yKGkgPSAwOyBpIDwgcmNjb3VudDsgaSsrKQorCXsKKwkJaWYoIWNvbXBhcmVfbmFtZV9pZCh0eXBlLCAmKHJjYXJyYXlbaV0udHlwZSkpKQorCQkJcmV0dXJuICZyY2FycmF5W2ldOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiBjb3VudF9yZXNvdXJjZXMKKyAqIFN5bnRheAk6IHJlc19jb3VudF90ICpjb3VudF9yZXNvdXJjZXMocmVzb3VyY2VfdCAqdG9wKQorICogSW5wdXQJOgorICogT3V0cHV0CToKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOiBUaGUgd2hvbGUgbG90IGlzIGNvbnZlcnRlZCBpbnRvIGFycmF5cyBiZWNhdXNlIHRoZXkgYXJlCisgKgkJICBlYXN5IHNvcnRhYmxlLiBNYWtlcyB0aGUgbG90IGFsbW9zdCB1bnJlYWRhYmxlLCBidXQgaXQKKyAqCQkgIHdvcmtzIChJIGhvcGUpLiBCYXNpY2FsbHkgeW91IGhhdmUgdG8ga2VlcCBpbiBtaW5kIHRoYXQKKyAqCQkgIHRoZSBsb3QgaXMgYSB0aHJlZS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZm9yIHdpbjMyIGFuZCBhCisgKgkJICB0d28tZGltZW5zaW9uYWwgc3RydWN0dXJlIGZvciB3aW4xNi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKyNkZWZpbmUgUkNUKHYpCSgqKChyZXNvdXJjZV90ICoqKSh2KSkpCisvKiBxc29ydCBzb3J0aW5nIGZ1bmN0aW9uICovCitpbnQgc29ydF9uYW1lX2lkKGNvbnN0IHZvaWQgKmUxLCBjb25zdCB2b2lkICplMikKK3sKKwlyZXR1cm4gY29tcGFyZV9uYW1lX2lkKFJDVChlMSktPm5hbWUsIFJDVChlMiktPm5hbWUpOworfQorCitpbnQgc29ydF9sYW5ndWFnZShjb25zdCB2b2lkICplMSwgY29uc3Qgdm9pZCAqZTIpCit7CisJYXNzZXJ0KChSQ1QoZTEpLT5sYW4pICE9IE5VTEwpOworCWFzc2VydCgoUkNUKGUyKS0+bGFuKSAhPSBOVUxMKTsKKworCXJldHVybiBNQUtFTEFOR0lEKFJDVChlMSktPmxhbi0+aWQsIFJDVChlMSktPmxhbi0+c3ViKQorCSAgICAgLSBNQUtFTEFOR0lEKFJDVChlMiktPmxhbi0+aWQsIFJDVChlMiktPmxhbi0+c3ViKTsKK30KKyN1bmRlZiBSQ1QKKyNkZWZpbmUgUkNUKHYpCSgocmVzX2NvdW50X3QgKikodikpCitpbnQgc29ydF90eXBlKGNvbnN0IHZvaWQgKmUxLCBjb25zdCB2b2lkICplMikKK3sKKwlyZXR1cm4gY29tcGFyZV9uYW1lX2lkKCYoUkNUKGUxKS0+dHlwZSksICYoUkNUKGUyKS0+dHlwZSkpOworfQorI3VuZGVmIFJDVAorCit2b2lkIGNvdW50X3Jlc291cmNlcyhyZXNvdXJjZV90ICp0b3ApCit7CisJcmVzb3VyY2VfdCAqcnNjOworCXJlc19jb3VudF90ICpyY3A7CisJbmFtZV9pZF90IG5pZDsKKwlpbnQgaSwgajsKKworCWZvcihyc2MgPSB0b3A7IHJzYzsgcnNjID0gcnNjLT5uZXh0KQorCXsKKwkJaWYoIXJzYy0+YmlucmVzKQorCQkJY29udGludWU7CisJCXN3aXRjaChyc2MtPnR5cGUpCisJCXsKKwkJY2FzZSByZXNfZGxnZXg6CisJCQluaWQubmFtZS5pX25hbWUgPSBXUkNfUlRfRElBTE9HOworCQkJbmlkLnR5cGUgPSBuYW1lX29yZDsKKwkJCWJyZWFrOworCQljYXNlIHJlc19tZW5leDoKKwkJCW5pZC5uYW1lLmlfbmFtZSA9IFdSQ19SVF9NRU5VOworCQkJbmlkLnR5cGUgPSBuYW1lX29yZDsKKwkJCWJyZWFrOworCQljYXNlIHJlc191c3I6CisJCQluaWQgPSAqKHJzYy0+cmVzLnVzci0+dHlwZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW5pZC5uYW1lLmlfbmFtZSA9IHJzYy0+dHlwZTsKKwkJCW5pZC50eXBlID0gbmFtZV9vcmQ7CisJCX0KKworCQlpZigocmNwID0gZmluZF9jb3VudGVyKCZuaWQpKSA9PSBOVUxMKQorCQl7CisJCQkvKiBDb3VudCB0aGUgbnVtYmVyIG9mIHVuaXEgaWRzIGFuZCBuYW1lcyAqLworCisJCQlpZihuaWQudHlwZSA9PSBuYW1lX29yZCkKKwkJCQluX2lkX2VudHJpZXMrKzsKKwkJCWVsc2UKKwkJCQluX25hbWVfZW50cmllcysrOworCisJCQlpZighcmNhcnJheSkKKwkJCXsKKwkJCQlyY2FycmF5ID0gKHJlc19jb3VudF90ICopeG1hbGxvYyhzaXplb2YocmVzX2NvdW50X3QpKTsKKwkJCQlyY2NvdW50ID0gMTsKKwkJCQlyY2FycmF5WzBdLmNvdW50ID0gMTsKKwkJCQlyY2FycmF5WzBdLnR5cGUgPSBuaWQ7CisJCQkJcmNhcnJheVswXS5yc2NhcnJheSA9IChyZXNvdXJjZV90ICoqKXhtYWxsb2Moc2l6ZW9mKHJlc291cmNlX3QgKikpOworCQkJCXJjYXJyYXlbMF0ucnNjYXJyYXlbMF0gPSByc2M7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmNjb3VudCsrOworCQkJCXJjYXJyYXkgPSAocmVzX2NvdW50X3QgKil4cmVhbGxvYyhyY2FycmF5LCByY2NvdW50ICogc2l6ZW9mKHJlc19jb3VudF90KSk7CisJCQkJcmNhcnJheVtyY2NvdW50LTFdLmNvdW50ID0gMTsKKwkJCQlyY2FycmF5W3JjY291bnQtMV0udHlwZSA9IG5pZDsKKwkJCQlyY2FycmF5W3JjY291bnQtMV0ucnNjYXJyYXkgPSAocmVzb3VyY2VfdCAqKil4bWFsbG9jKHNpemVvZihyZXNvdXJjZV90ICopKTsKKwkJCQlyY2FycmF5W3JjY291bnQtMV0ucnNjYXJyYXlbMF0gPSByc2M7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlyY3AtPmNvdW50Kys7CisJCQlyY3AtPnJzY2FycmF5ID0gKHJlc291cmNlX3QgKiopeHJlYWxsb2MocmNwLT5yc2NhcnJheSwgcmNwLT5jb3VudCAqIHNpemVvZihyZXNvdXJjZV90ICopKTsKKwkJCXJjcC0+cnNjYXJyYXlbcmNwLT5jb3VudC0xXSA9IHJzYzsKKwkJfQorCX0KKworCWlmKCF3aW4zMikKKwl7CisJCS8qIFdlJ3JlIGRvbmUsIHdpbjE2IHJlcXVpcmVzIG5vIHNwZWNpYWwgc29ydGluZyAqLworCQlyZXR1cm47CisJfQorCisJLyogV2Ugbm93IGhhdmUgYSB1bnNvcnRlZCBsaXN0IG9mIHR5cGVzIHdpdGggYW4gYXJyYXkgb2YgcmVzX2NvdW50X3QKKwkgKiBpbiByY2FycmF5WzAuLnJjY291bnQtMV0uIEFuZCB3ZSBoYXZlIG5hbWVzIG9mIG9uZSB0eXBlIGluIHRoZQorCSAqIHJjYXJyYXlbeF0ucnNjWzAuLnJjYXJyYXlbeF0uY291bnQtMV0gYXJyYXlzLgorCSAqIFRoZSBsaXN0IG5lZWRzIHRvIGJlIHNvcnRlZCBmb3Igd2luMzIncyB0b3AgbGV2ZWwgdHJlZSBzdHJ1Y3R1cmUuCisJICovCisKKwkvKiBTb3J0IHRoZSB0eXBlcyAqLworCWlmKHJjY291bnQgPiAxKQorCQlxc29ydChyY2FycmF5LCByY2NvdW50LCBzaXplb2YocmNhcnJheVswXSksIHNvcnRfdHlwZSk7CisKKwkvKiBOb3cgc29ydCB0aGUgbmFtZS1pZCBhcnJheXMgKi8KKwlmb3IoaSA9IDA7IGkgPCByY2NvdW50OyBpKyspCisJeworCQlpZihyY2FycmF5W2ldLmNvdW50ID4gMSkKKwkJCXFzb3J0KHJjYXJyYXlbaV0ucnNjYXJyYXksIHJjYXJyYXlbaV0uY291bnQsIHNpemVvZihyY2FycmF5WzBdLnJzY2FycmF5WzBdKSwgc29ydF9uYW1lX2lkKTsKKwl9CisKKwkvKiBOb3cgc3BsaXQgdGhlIG5hbWUtaWQgYXJyYXlzIGludG8gbmFtZS9sYW5ndWFnZQorCSAqIHN1YnMuIERvbid0IGxvb2sgYXQgdGhlIGF3ZnVsbCBleHByZXNzaW9ucy4uLgorCSAqIFdlIGRvIHRoaXMgYnkgdGFraW5nIHRoZSBhcnJheSBlbGVtZW50cyBvdXQgb2YgcnNjYXJyYXkgYW5kIHB1dHRpbmcKKwkgKiB0b2dldGhlciBhIG5ldyBhcnJheSBpbiByc2MzMmFycmF5LgorCSAqLworCWZvcihpID0gMDsgaSA8IHJjY291bnQ7IGkrKykKKwl7CisJCXJlc19jb3VudF90ICpyY2FwOworCisJCWFzc2VydChyY2FycmF5W2ldLmNvdW50ID49IDEpOworCisJCS8qIHJjYXAgcG9pbnRzIHRvIHRoZSBjdXJyZW50IHR5cGUgd2UgYXJlIGRlYWxpbmcgd2l0aCAqLworCQlyY2FwID0gJihyY2FycmF5W2ldKTsKKworCQkvKiBJbnNlcnQgdGhlIGZpcnN0IG5hbWUtaWQgKi8KKwkJcmNhcC0+cnNjMzJhcnJheSA9IChyZXMzMl9jb3VudF90ICopeG1hbGxvYyhzaXplb2YocmVzMzJfY291bnRfdCkpOworCQlyY2FwLT5jb3VudDMyID0gMTsKKwkJcmNhcC0+cnNjMzJhcnJheVswXS5yc2MgPSAocmVzb3VyY2VfdCAqKil4bWFsbG9jKHNpemVvZihyZXNvdXJjZV90ICopKTsKKwkJcmNhcC0+cnNjMzJhcnJheVswXS5jb3VudCA9IDE7CisJCXJjYXAtPnJzYzMyYXJyYXlbMF0ucnNjWzBdID0gcmNhcC0+cnNjYXJyYXlbMF07CisJCWlmKHJjYXAtPnJzY2FycmF5WzBdLT5uYW1lLT50eXBlID09IG5hbWVfb3JkKQorCQl7CisJCQlyY2FwLT5uX2lkX2VudHJpZXMgPSAxOworCQkJcmNhcC0+bl9uYW1lX2VudHJpZXMgPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJcmNhcC0+bl9pZF9lbnRyaWVzID0gMDsKKwkJCXJjYXAtPm5fbmFtZV9lbnRyaWVzID0gMTsKKwkJfQorCisJCS8qIE5vdyBsb29wIG92ZXIgdGhlIHJlc3RpbmcgcmVzb3VyY2VzIG9mIHRoZSBjdXJyZW50IHR5cGUKKwkJICogdG8gZmluZCBkdXBsaWNhdGUgbmFtZXMgKHdoaWNoIHNob3VsZCBoYXZlIGRpZmZlcmVudAorCQkgKiBsYW5ndWFnZXMpLgorCQkgKi8KKwkJZm9yKGogPSAxOyBqIDwgcmNhcC0+Y291bnQ7IGorKykKKwkJeworCQkJcmVzMzJfY291bnRfdCAqcjMyY3A7CisKKwkJCS8qIHIzMmNwIHBvaW50cyB0byB0aGUgY3VycmVudCByZXMzMl9jb3VudCBzdHJ1Y3R1cmUKKwkJCSAqIHRoYXQgaG9sZHMgdGhlIHJlc291cmNlIG5hbWUgd2UgYXJlIHByb2Nlc3NpbmcuCisJCQkgKi8KKwkJCXIzMmNwID0gJihyY2FwLT5yc2MzMmFycmF5W3JjYXAtPmNvdW50MzItMV0pOworCisJCQlpZighY29tcGFyZV9uYW1lX2lkKHIzMmNwLT5yc2NbMF0tPm5hbWUsIHJjYXJyYXlbaV0ucnNjYXJyYXlbal0tPm5hbWUpKQorCQkJeworCQkJCS8qIE5hbWVzIGFyZSB0aGUgc2FtZSwgYWRkIHRvIGxpc3QgKi8KKwkJCQlyMzJjcC0+Y291bnQrKzsKKwkJCQlyMzJjcC0+cnNjID0gKHJlc291cmNlX3QgKiopeHJlYWxsb2MocjMyY3AtPnJzYywgcjMyY3AtPmNvdW50ICogc2l6ZW9mKHJlc291cmNlX3QgKikpOworCQkJCXIzMmNwLT5yc2NbcjMyY3AtPmNvdW50LTFdID0gcmNhcC0+cnNjYXJyYXlbal07CisKKwkJCQlpZihyY2FwLT5yc2NhcnJheVtqXS0+bmFtZS0+dHlwZSA9PSBuYW1lX29yZCkKKwkJCQl7CisJCQkJCXJjYXAtPm5faWRfZW50cmllcyA9IDE7CisJCQkJCXJjYXAtPm5fbmFtZV9lbnRyaWVzID0gMDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmNhcC0+bl9pZF9lbnRyaWVzID0gMDsKKwkJCQkJcmNhcC0+bl9uYW1lX2VudHJpZXMgPSAxOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBOZXcgbmFtZS1pZCwgc29ydCB0aGUgb2xkIG9uZSBieQorCQkJCSAqIGxhbmd1YWdlIGFuZCBjcmVhdGUgbmV3IGxpc3QKKwkJCQkgKi8KKwkJCQlpZihyMzJjcC0+Y291bnQgPiAxKQorCQkJCQlxc29ydChyMzJjcC0+cnNjLCByMzJjcC0+Y291bnQsIHNpemVvZihyMzJjcC0+cnNjWzBdKSwgc29ydF9sYW5ndWFnZSk7CisJCQkJcmNhcC0+Y291bnQzMisrOworCQkJCXJjYXAtPnJzYzMyYXJyYXkgPSAocmVzMzJfY291bnRfdCopeHJlYWxsb2MocmNhcC0+cnNjMzJhcnJheSwgcmNhcC0+Y291bnQzMiAqIHNpemVvZihyZXMzMl9jb3VudF90KSk7CisJCQkJcmNhcC0+cnNjMzJhcnJheVtyY2FwLT5jb3VudDMyLTFdLnJzYyA9IChyZXNvdXJjZV90ICoqKXhtYWxsb2Moc2l6ZW9mKHJlc291cmNlX3QgKikpOworCQkJCXJjYXAtPnJzYzMyYXJyYXlbcmNhcC0+Y291bnQzMi0xXS5jb3VudCA9IDE7CisJCQkJcmNhcC0+cnNjMzJhcnJheVtyY2FwLT5jb3VudDMyLTFdLnJzY1swXSA9IHJjYXAtPnJzY2FycmF5W2pdOworCisJCQkJaWYocmNhcC0+cnNjYXJyYXlbal0tPm5hbWUtPnR5cGUgPT0gbmFtZV9vcmQpCisJCQkJCXJjYXAtPm5faWRfZW50cmllcysrOworCQkJCWVsc2UKKwkJCQkJcmNhcC0+bl9uYW1lX2VudHJpZXMrKzsKKwkJCX0KKwkJfQorCQkvKiBBbHNvIHNvcnQgdGhlIGxhbmd1YWdlcyBvZiB0aGUgbGFzdCBuYW1lIGdyb3VwICovCisJCWlmKHJjYXAtPnJzYzMyYXJyYXlbcmNhcC0+Y291bnQzMi0xXS5jb3VudCA+IDEpCisJCQlxc29ydChyY2FwLT5yc2MzMmFycmF5W3JjYXAtPmNvdW50MzItMV0ucnNjLAorCQkJICAgICAgcmNhcC0+cnNjMzJhcnJheVtyY2FwLT5jb3VudDMyLTFdLmNvdW50LAorCQkJICAgICAgc2l6ZW9mKHJjYXAtPnJzYzMyYXJyYXlbcmNhcC0+Y291bnQzMi0xXS5yc2NbMF0pLAorCQkJICAgICAgc29ydF9sYW5ndWFnZSk7CisJfQorfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IHdyaXRlX3BlX3NlZ21lbnQKKyAqIFN5bnRheAk6IHZvaWQgd3JpdGVfcGVfc2VnbWVudChGSUxFICpmcCwgcmVzb3VyY2VfdCAqdG9wKQorICogSW5wdXQJOgorICogT3V0cHV0CToKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordm9pZCB3cml0ZV9wZV9zZWdtZW50KEZJTEUgKmZwLCByZXNvdXJjZV90ICp0b3ApCit7CisJaW50IGk7CisKKwlmcHJpbnRmKGZwLCAiXHQuYWxpZ25cdDRcbiIpOworCWZwcmludGYoZnAsICIlcyVzOlxuIiwgcHJlZml4LCBfUEVSZXNUYWIpOworCWZwcmludGYoZnAsICJcdC5nbG9ibFx0JXMlc1xuIiwgcHJlZml4LCBfUEVSZXNUYWIpOworCS8qIEZsYWdzICovCisJZnByaW50ZihmcCwgIlx0LmxvbmdcdDBcbiIpOworCS8qIFRpbWUvRGF0ZSBzdGFtcCAqLworCWZwcmludGYoZnAsICJcdC5sb25nXHQweCUwOGx4XG4iLCBub3cpOworCS8qIFZlcnNpb24gKi8KKwlmcHJpbnRmKGZwLCAiXHQubG9uZ1x0MFxuIik7CS8qIEZJWE1FOiBtdXN0IHZlcnNpb24gYmUgZmlsbGVkIG91dD8gKi8KKwkvKiAjIG9mIGlkIGVudHJpZXMsICMgb2YgbmFtZSBlbnRyaWVzICovCisJZnByaW50ZihmcCwgIlx0LnNob3J0XHQlZCwgJWRcbiIsIG5fbmFtZV9lbnRyaWVzLCBuX2lkX2VudHJpZXMpOworCisJLyogV3JpdGUgdGhlIHR5cGUgbGV2ZWwgb2YgdGhlIHRyZWUgKi8KKwlmb3IoaSA9IDA7IGkgPCByY2NvdW50OyBpKyspCisJeworCQlyZXNfY291bnRfdCAqcmNwOworCQljaGFyICpsYWJlbDsKKworCQlyY3AgPSAmcmNhcnJheVtpXTsKKworCQkvKiBUeXBlSWQgKi8KKwkJaWYocmNwLT50eXBlLnR5cGUgPT0gbmFtZV9vcmQpCisJCQlmcHJpbnRmKGZwLCAiXHQubG9uZ1x0JWRcbiIsIHJjcC0+dHlwZS5uYW1lLmlfbmFtZSk7CisJCWVsc2UKKwkJeworCQkJY2hhciAqbmFtZSA9IHByZXBfbmlkX2Zvcl9sYWJlbCgmKHJjcC0+dHlwZSkpOworCQkJZnByaW50ZihmcCwgIlx0LmxvbmdcdCglc18lc190eXBlbmFtZSAtICVzJXMpIHwgMHg4MDAwMDAwMFxuIiwKKwkJCQlwcmVmaXgsCisJCQkJbmFtZSwKKwkJCQlwcmVmaXgsCisJCQkJX1BFUmVzVGFiKTsKKwkJfQorCQkvKiBPZmZzZXQgKi8KKwkJbGFiZWwgPSBwcmVwX25pZF9mb3JfbGFiZWwoJihyY3AtPnR5cGUpKTsKKwkJZnByaW50ZihmcCwgIlx0LmxvbmdcdCguTCVzIC0gJXMlcykgfCAweDgwMDAwMDAwXG4iLAorCQkJbGFiZWwsCisJCQlwcmVmaXgsCisJCQlfUEVSZXNUYWIpOworCX0KKworCS8qIFdyaXRlIHRoZSBuYW1lIGxldmVsIG9mIHRoZSB0cmVlICovCisKKwlmb3IoaSA9IDA7IGkgPCByY2NvdW50OyBpKyspCisJeworCQlyZXNfY291bnRfdCAqcmNwOworCQljaGFyICp0eXBlbGFiZWw7CisJCWNoYXIgKm5hbWVsYWJlbDsKKwkJaW50IGo7CisKKwkJcmNwID0gJnJjYXJyYXlbaV07CisKKwkJdHlwZWxhYmVsID0geHN0cmR1cChwcmVwX25pZF9mb3JfbGFiZWwoJihyY3AtPnR5cGUpKSk7CisJCWZwcmludGYoZnAsICIuTCVzOlxuIiwgdHlwZWxhYmVsKTsKKworCQlmcHJpbnRmKGZwLCAiXHQubG9uZ1x0MFxuIik7CQkvKiBGbGFncyAqLworCQlmcHJpbnRmKGZwLCAiXHQubG9uZ1x0MHglMDhseFxuIiwgbm93KTsJLyogVGltZURhdGUgKi8KKwkJZnByaW50ZihmcCwgIlx0LmxvbmdcdDBcbiIpOwkvKiBGSVhNRTogbXVzdCB2ZXJzaW9uIGJlIGZpbGxlZCBvdXQ/ICovCisJCWZwcmludGYoZnAsICJcdC5zaG9ydFx0JWQsICVkXG4iLCByY3AtPm5fbmFtZV9lbnRyaWVzLCByY3AtPm5faWRfZW50cmllcyk7CisJCWZvcihqID0gMDsgaiA8IHJjcC0+Y291bnQzMjsgaisrKQorCQl7CisJCQlyZXNvdXJjZV90ICpyc2MgPSByY3AtPnJzYzMyYXJyYXlbal0ucnNjWzBdOworCQkJLyogTmFtZUlkICovCisJCQlpZihyc2MtPm5hbWUtPnR5cGUgPT0gbmFtZV9vcmQpCisJCQkJZnByaW50ZihmcCwgIlx0LmxvbmdcdCVkXG4iLCByc2MtPm5hbWUtPm5hbWUuaV9uYW1lKTsKKwkJCWVsc2UKKwkJCXsKKwkJCQlmcHJpbnRmKGZwLCAiXHQubG9uZ1x0KCVzJXNfbmFtZSAtICVzJXMpIHwgMHg4MDAwMDAwMFxuIiwKKwkJCQkJcHJlZml4LAorCQkJCQlyc2MtPmNfbmFtZSwKKwkJCQkJcHJlZml4LAorCQkJCQlfUEVSZXNUYWIpOworCQkJfQorCQkJLyogTWF5YmUgRklYTUU6IFVuZXNjYXBlIHRoZSB0cmVlIChvbW1pdCAweDgwMDAwMDAwKSBhbmQKKwkJCSAqIHB1dCB0aGUgb2Zmc2V0IHRvIHRoZSByZXNvdXJjZSBkYXRhIGVudHJ5LgorCQkJICogPz8gSXMgdW5lc2NhcGluZyB3b3J0aCB3aGlsZSA/PworCQkJICovCisJCQkvKiBPZmZzZXQgKi8KKwkJCW5hbWVsYWJlbCA9IHByZXBfbmlkX2Zvcl9sYWJlbChyc2MtPm5hbWUpOworCQkJZnByaW50ZihmcCwgIlx0LmxvbmdcdCguTCVzXyVzIC0gJXMlcykgfCAweDgwMDAwMDAwXG4iLAorCQkJCXR5cGVsYWJlbCwKKwkJCQluYW1lbGFiZWwsCisJCQkJcHJlZml4LAorCQkJCV9QRVJlc1RhYik7CisJCX0KKwkJZnJlZSh0eXBlbGFiZWwpOworCX0KKworCS8qIFdyaXRlIHRoZSBsYW5ndWFnZSBsZXZlbCBvZiB0aGUgdHJlZSAqLworCisJZm9yKGkgPSAwOyBpIDwgcmNjb3VudDsgaSsrKQorCXsKKwkJcmVzX2NvdW50X3QgKnJjcDsKKwkJY2hhciAqbmFtZWxhYmVsOworCQljaGFyICp0eXBlbGFiZWw7CisJCWludCBqOworCisJCXJjcCA9ICZyY2FycmF5W2ldOworCQl0eXBlbGFiZWwgPSB4c3RyZHVwKHByZXBfbmlkX2Zvcl9sYWJlbCgmKHJjcC0+dHlwZSkpKTsKKworCQlmb3IoaiA9IDA7IGogPCByY3AtPmNvdW50MzI7IGorKykKKwkJeworCQkJcmVzMzJfY291bnRfdCAqcjMyY3AgPSAmKHJjcC0+cnNjMzJhcnJheVtqXSk7CisJCQlpbnQgazsKKworCQkJbmFtZWxhYmVsID0geHN0cmR1cChwcmVwX25pZF9mb3JfbGFiZWwocjMyY3AtPnJzY1swXS0+bmFtZSkpOworCQkJZnByaW50ZihmcCwgIi5MJXNfJXM6XG4iLCB0eXBlbGFiZWwsIG5hbWVsYWJlbCk7CisKKwkJCWZwcmludGYoZnAsICJcdC5sb25nXHQwXG4iKTsJCS8qIEZsYWdzICovCisJCQlmcHJpbnRmKGZwLCAiXHQubG9uZ1x0MHglMDhseFxuIiwgbm93KTsJLyogVGltZURhdGUgKi8KKwkJCWZwcmludGYoZnAsICJcdC5sb25nXHQwXG4iKTsJLyogRklYTUU6IG11c3QgdmVyc2lvbiBiZSBmaWxsZWQgb3V0PyAqLworCQkJZnByaW50ZihmcCwgIlx0LnNob3J0XHQwLCAlZFxuIiwgcjMyY3AtPmNvdW50KTsKKworCQkJZm9yKGsgPSAwOyBrIDwgcjMyY3AtPmNvdW50OyBrKyspCisJCQl7CisJCQkJcmVzb3VyY2VfdCAqcnNjID0gcjMyY3AtPnJzY1trXTsKKwkJCQlhc3NlcnQocnNjLT5sYW4gIT0gTlVMTCk7CisJCQkJLyogTGFuZ3VhZ2VJZCAqLworCQkJCWZwcmludGYoZnAsICJcdC5sb25nXHQweCUwOHhcbiIsIHJzYy0+bGFuID8gTUFLRUxBTkdJRChyc2MtPmxhbi0+aWQsIHJzYy0+bGFuLT5zdWIpIDogMCk7CisJCQkJLyogT2Zmc2V0ICovCisJCQkJZnByaW50ZihmcCwgIlx0LmxvbmdcdC5MJXNfJXNfJWQgLSAlcyVzXG4iLAorCQkJCQl0eXBlbGFiZWwsCisJCQkJCW5hbWVsYWJlbCwKKwkJCQkJcnNjLT5sYW4gPyBNQUtFTEFOR0lEKHJzYy0+bGFuLT5pZCwgcnNjLT5sYW4tPnN1YikgOiAwLAorCQkJCQlwcmVmaXgsCisJCQkJCV9QRVJlc1RhYik7CisJCQl9CisJCQlmcmVlKG5hbWVsYWJlbCk7CisJCX0KKwkJZnJlZSh0eXBlbGFiZWwpOworCX0KKworCS8qIFdyaXRlIHRoZSByZXNvdXJjZSB0YWJsZSBpdHNlbGYgKi8KKworCWZvcihpID0gMDsgaSA8IHJjY291bnQ7IGkrKykKKwl7CisJCXJlc19jb3VudF90ICpyY3A7CisJCWNoYXIgKm5hbWVsYWJlbDsKKwkJY2hhciAqdHlwZWxhYmVsOworCQlpbnQgajsKKworCQlyY3AgPSAmcmNhcnJheVtpXTsKKwkJdHlwZWxhYmVsID0geHN0cmR1cChwcmVwX25pZF9mb3JfbGFiZWwoJihyY3AtPnR5cGUpKSk7CisKKwkJZm9yKGogPSAwOyBqIDwgcmNwLT5jb3VudDMyOyBqKyspCisJCXsKKwkJCXJlczMyX2NvdW50X3QgKnIzMmNwID0gJihyY3AtPnJzYzMyYXJyYXlbal0pOworCQkJaW50IGs7CisKKwkJCW5hbWVsYWJlbCA9IHhzdHJkdXAocHJlcF9uaWRfZm9yX2xhYmVsKHIzMmNwLT5yc2NbMF0tPm5hbWUpKTsKKworCQkJZm9yKGsgPSAwOyBrIDwgcjMyY3AtPmNvdW50OyBrKyspCisJCQl7CisJCQkJcmVzb3VyY2VfdCAqcnNjID0gcjMyY3AtPnJzY1trXTsKKworCQkJCWFzc2VydChyc2MtPmxhbiAhPSBOVUxMKTsKKworCQkJCWZwcmludGYoZnAsICIuTCVzXyVzXyVkOlxuIiwKKwkJCQkJdHlwZWxhYmVsLAorCQkJCQluYW1lbGFiZWwsCisJCQkJCXJzYy0+bGFuID8gTUFLRUxBTkdJRChyc2MtPmxhbi0+aWQsIHJzYy0+bGFuLT5zdWIpIDogMCk7CisKKwkJCQkvKiBEYXRhIFJWQSAqLworCQkJCWZwcmludGYoZnAsICJcdC5sb25nXHQlcyVzX2RhdGEgLSAlcyVzXG4iLAorCQkJCQlwcmVmaXgsCisJCQkJCXJzYy0+Y19uYW1lLAorCQkJCQlwcmVmaXgsCisJCQkJCV9QRVJlc1RhYik7CisJCQkJLyogU2l6ZSAqLworCQkJCWZwcmludGYoZnAsICJcdC5sb25nXHQlZFxuIiwKKwkJCQkJcnNjLT5iaW5yZXMtPnNpemUgLSByc2MtPmJpbnJlcy0+ZGF0YWlkeCk7CisJCQkJLyogQ29kZVBhZ2UgKi8KKwkJCQlmcHJpbnRmKGZwLCAiXHQubG9uZ1x0JWxkXG4iLCBjb2RlcGFnZSk7CisJCQkJLyogUmVzZXJ2ZWQgKi8KKwkJCQlmcHJpbnRmKGZwLCAiXHQubG9uZ1x0MFxuIik7CisJCQl9CisJCQlmcmVlKG5hbWVsYWJlbCk7CisJCX0KKwkJZnJlZSh0eXBlbGFiZWwpOworCX0KKworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IHdyaXRlX25lX3NlZ21lbnQKKyAqIFN5bnRheAk6IHZvaWQgd3JpdGVfbmVfc2VnbWVudChGSUxFICpmcCwgcmVzb3VyY2VfdCAqdG9wKQorICogSW5wdXQJOgorICogT3V0cHV0CToKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordm9pZCB3cml0ZV9uZV9zZWdtZW50KEZJTEUgKmZwLCByZXNvdXJjZV90ICp0b3ApCit7CisJaW50IGksIGo7CisKKwlmcHJpbnRmKGZwLCAiXHQuYWxpZ25cdDRcbiIpOworCWZwcmludGYoZnAsICIlcyVzOlxuIiwgcHJlZml4LCBfTkVSZXNUYWIpOworCWZwcmludGYoZnAsICJcdC5nbG9ibFx0JXMlc1xuIiwgcHJlZml4LCBfTkVSZXNUYWIpOworCisJLyogQWxpZ25tZW50U2hpZnQgKi8KKwlmcHJpbnRmKGZwLCAiXHQuc2hvcnRcdCVkXG4iLCBhbGlnbm1lbnRfcHdyKTsKKworCS8qIFR5cGVJbmZvICovCisJZm9yKGkgPSAwOyBpIDwgcmNjb3VudDsgaSsrKQorCXsKKwkJcmVzX2NvdW50X3QgKnJjcCA9ICZyY2FycmF5W2ldOworCisJCS8qIFR5cGVJZCAqLworCQlpZihyY3AtPnR5cGUudHlwZSA9PSBuYW1lX29yZCkKKwkJCWZwcmludGYoZnAsICJcdC5zaG9ydFx0MHglMDR4XG4iLCByY3AtPnR5cGUubmFtZS5pX25hbWUgfCAweDgwMDApOworCQllbHNlCisJCQlmcHJpbnRmKGZwLCAiXHQuc2hvcnRcdCVzXyVzX3R5cGVuYW1lIC0gJXMlc1xuIiwKKwkJCQlwcmVmaXgsCisJCQkJcmNwLT50eXBlLm5hbWUuc19uYW1lLT5zdHIuY3N0ciwKKwkJCQlwcmVmaXgsCisJCQkJX05FUmVzVGFiKTsKKwkJLyogUmVzb3VyY2VDb3VudCAqLworCQlmcHJpbnRmKGZwLCAiXHQuc2hvcnRcdCVkXG4iLCByY3AtPmNvdW50KTsKKwkJLyogUmVzZXJ2ZWQgKi8KKwkJZnByaW50ZihmcCwgIlx0LmxvbmdcdDBcbiIpOworCQkvKiBOYW1lSW5mbyAqLworCQlmb3IoaiA9IDA7IGogPCByY3AtPmNvdW50OyBqKyspCisJCXsKKwkJCS8qIEZJWE1FOiBkaXZpZGluZyBieSBgYWxpZ25tZW50YCBkb2Vzbid0IHNlZW0gdG8KKwkJCSAqIHdvcmsgd2l0aCBhcyAoR0FTKS4gU2hpZnRpbmcgcmVzdWx0cyBpbiB0aGUKKwkJCSAqIGNvcnJlY3QgYmVoYXZpb3VyLiBNYXliZSBhbiBhcyBidWcgb3IganVzdCBteQorCQkJICogbGFjayBvZiBrbm93aW5nIGFzIGV4cHJlc3Npb24tc3ludGF4LgorCQkJICovCisJCQkvKiBPZmZzZXQgKi8KKy8qCisgKiBWRVJZIElNUE9SVEFOVDoKKyAqIFRoZSBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgTkUgcmVzb3VyY2Ugc2VnbWVudAorICogYW5kIF9OT1RfIHRvIHRoZSBmaWxlLWJlZ2lubmluZy4gVGhpcyBpcyBiZWNhdXNlIHdlIGRvIG5vdCBoYXZlIGEKKyAqIGZpbGUgYmFzZWQgcmVzb3VyY2UsIGJ1dCBhIHNpbXVsYXRlZCBORSBzZWdtZW50LiBUaGUgb2Zmc2V0IF9pc18KKyAqIHNjYWxlZCBieSB0aGUgQWxpZ25TaGlmdCBmaWVsZC4KKyAqIEFsbCBvdGhlciB0aGluZ3MgYXJlIGFzIHRoZSBNUyBkb2MgZGVzY3JpYmVzIChhbGlnbm1lbnQgZXRjLikKKyAqLworCQkJZnByaW50ZihmcCwgIlx0LnNob3J0XHQoJXMlc19kYXRhIC0gJXMlcykgPj4gJWRcbiIsCisJCQkJcHJlZml4LAorCQkJCXJjcC0+cnNjYXJyYXlbal0tPmNfbmFtZSwKKwkJCQlwcmVmaXgsCisJCQkJX05FUmVzVGFiLAorCQkJCWFsaWdubWVudF9wd3IpOworCQkJLyogTGVuZ3RoICovCisJCQlmcHJpbnRmKGZwLCAiXHQuc2hvcnRcdCVkXG4iLAorCQkJCXJjcC0+cnNjYXJyYXlbal0tPmJpbnJlcy0+c2l6ZSAtIHJjcC0+cnNjYXJyYXlbal0tPmJpbnJlcy0+ZGF0YWlkeCk7CisJCQkvKiBGbGFncyAqLworCQkJZnByaW50ZihmcCwgIlx0LnNob3J0XHQweCUwNHhcbiIsIChXT1JEKXJjcC0+cnNjYXJyYXlbal0tPm1lbW9wdCk7CisJCQkvKiBJZCAqLworCQkJaWYocmNwLT5yc2NhcnJheVtqXS0+bmFtZS0+dHlwZSA9PSBuYW1lX29yZCkKKwkJCQlmcHJpbnRmKGZwLCAiXHQuc2hvcnRcdDB4JTA0eFxuIiwgcmNwLT5yc2NhcnJheVtqXS0+bmFtZS0+bmFtZS5pX25hbWUgfCAweDgwMDApOworCQkJZWxzZQorCQkJCWZwcmludGYoZnAsICJcdC5zaG9ydFx0JXMlc19uYW1lIC0gJXMlc1xuIiwKKwkJCQlwcmVmaXgsCisJCQkJcmNwLT5yc2NhcnJheVtqXS0+Y19uYW1lLAorCQkJCXByZWZpeCwKKwkJCQlfTkVSZXNUYWIpOworCQkJLyogSGFuZGxlIGFuZCBVc2FnZSAqLworCQkJZnByaW50ZihmcCwgIlx0LnNob3J0XHQwLCAwXG4iKTsKKwkJfQorCX0KKwkvKiBFbmRUeXBlcyAqLworCWZwcmludGYoZnAsICJcdC5zaG9ydFx0MFxuIik7Cit9CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uCTogd3JpdGVfcnNjX25hbWVzCisgKiBTeW50YXgJOiB2b2lkIHdyaXRlX3JzY19uYW1lcyhGSUxFICpmcCwgcmVzb3VyY2VfdCAqdG9wKQorICogSW5wdXQJOgorICogT3V0cHV0CToKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordm9pZCB3cml0ZV9yc2NfbmFtZXMoRklMRSAqZnAsIHJlc291cmNlX3QgKnRvcCkKK3sKKwlpbnQgaSwgajsKKwkKKwlpZih3aW4zMikKKwl7CisJCS8qIFdyaXRlIHRoZSBuYW1lcyAqLworCisJCWZvcihpID0gMDsgaSA8IHJjY291bnQ7IGkrKykKKwkJeworCQkJcmVzX2NvdW50X3QgKnJjcDsKKworCQkJcmNwID0gJnJjYXJyYXlbaV07CisKKwkJCWlmKHJjcC0+dHlwZS50eXBlID09IG5hbWVfc3RyKQorCQkJeworCQkJCWNoYXIgKm5hbWUgPSBwcmVwX25pZF9mb3JfbGFiZWwoJihyY3AtPnR5cGUpKTsKKwkJCQlmcHJpbnRmKGZwLCAiJXNfJXNfdHlwZW5hbWU6XG4iLAorCQkJCQlwcmVmaXgsCisJCQkJCW5hbWUpOworCQkJCXdyaXRlX25hbWVfc3RyKGZwLCAmKHJjcC0+dHlwZSkpOworCQkJfQorCisJCQlmb3IoaiA9IDA7IGogPCByY3AtPmNvdW50MzI7IGorKykKKwkJCXsKKwkJCQlyZXNvdXJjZV90ICpyc2MgPSByY3AtPnJzYzMyYXJyYXlbal0ucnNjWzBdOworCisJCQkJaWYocnNjLT5uYW1lLT50eXBlID09IG5hbWVfc3RyKQorCQkJCXsKKwkJCQkJZnByaW50ZihmcCwgIiVzJXNfbmFtZTpcbiIsCisJCQkJCQlwcmVmaXgsCisJCQkJCQlyc2MtPmNfbmFtZSk7CisJCQkJCXdyaXRlX25hbWVfc3RyKGZwLCByc2MtPm5hbWUpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQkvKiBSZXNvdXJjZU5hbWVzICovCisJCWZvcihpID0gMDsgaSA8IHJjY291bnQ7IGkrKykKKwkJeworCQkJcmVzX2NvdW50X3QgKnJjcCA9ICZyY2FycmF5W2ldOworCisJCQlmb3IoaiA9IDA7IGogPCByY3AtPmNvdW50OyBqKyspCisJCQl7CisJCQkJaWYocmNwLT50eXBlLnR5cGUgPT0gbmFtZV9zdHIpCisJCQkJeworCQkJCQlmcHJpbnRmKGZwLCAiJXNfJXNfdHlwZW5hbWU6XG4iLAorCQkJCQkJcHJlZml4LAorCQkJCQkJcmNwLT50eXBlLm5hbWUuc19uYW1lLT5zdHIuY3N0cik7CisJCQkJCXdyaXRlX25hbWVfc3RyKGZwLCAmKHJjcC0+dHlwZSkpOworCQkJCX0KKwkJCQlpZihyY3AtPnJzY2FycmF5W2pdLT5uYW1lLT50eXBlID09IG5hbWVfc3RyKQorCQkJCXsKKwkJCQkJZnByaW50ZihmcCwgIiVzJXNfbmFtZTpcbiIsCisJCQkJCQlwcmVmaXgsCisJCQkJCQlyY3AtPnJzY2FycmF5W2pdLT5jX25hbWUpOworCQkJCQl3cml0ZV9uYW1lX3N0cihmcCwgcmNwLT5yc2NhcnJheVtqXS0+bmFtZSk7CisJCQkJfQorCQkJfQorCQl9CisJCS8qIEVuZE5hbWVzICovCisJCQorCQkvKiBUaGlzIGlzIHRvIGVuZCB0aGUgTkUgcmVzb3VyY2UgdGFibGUgKi8KKwkJaWYoY3JlYXRlX2RpcikKKwkJCWZwcmludGYoZnAsICJcdC5ieXRlXHQwXG4iKTsKKwl9CisKKwlmcHJpbnRmKGZwLCAiXG4iKTsKK30KKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24JOiB3cml0ZV9zX2ZpbGUKKyAqIFN5bnRheAk6IHZvaWQgd3JpdGVfc19maWxlKGNoYXIgKm91dG5hbWUsIHJlc291cmNlX3QgKnRvcCkKKyAqIElucHV0CToKKyAqCW91dG5hbWUJLSBGaWxlbmFtZSB0byB3cml0ZSB0bworICoJdG9wCS0gVGhlIHJlc291cmNlLXRyZWUgdG8gY29udmVydAorICogT3V0cHV0CToKKyAqIERlc2NyaXB0aW9uCToKKyAqIFJlbWFya3MJOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLwordm9pZCB3cml0ZV9zX2ZpbGUoY2hhciAqb3V0bmFtZSwgcmVzb3VyY2VfdCAqdG9wKQoreworCUZJTEUgKmZvOworCXJlc291cmNlX3QgKnJzYzsKKworCWZvID0gZm9wZW4ob3V0bmFtZSwgInd0Iik7CisJaWYoIWZvKQorCXsKKwkJZXJyb3IoIkNvdWxkIG5vdCBvcGVuICVzXG4iLCBvdXRuYW1lKTsKKwl9CisKKwlub3cgPSB0aW1lKE5VTEwpOworCWZwcmludGYoZm8sIHNfZmlsZV9oZWFkX3N0ciwgaW5wdXRfbmFtZSwgY21kbGluZSwgY3RpbWUoJm5vdykpOworCisJLyogR2V0IGFuIGlkZWEgaG93IG1hbnkgd2UgaGF2ZSBhbmQgcmVzdHJ1Y3R1cmUgdGhlIHRhYmxlcyAqLworCWNvdW50X3Jlc291cmNlcyh0b3ApOworCisJLyogRmlyc3Qgd3JpdGUgdGhlIHNlZ21lbnQgdGFibGVzICovCisJaWYoY3JlYXRlX2RpcikKKwl7CisJCWlmKHdpbjMyKQorCQkJd3JpdGVfcGVfc2VnbWVudChmbywgdG9wKTsKKwkJZWxzZQorCQkJd3JpdGVfbmVfc2VnbWVudChmbywgdG9wKTsKKwl9CisKKwkvKiBEdW1wIHRoZSBuYW1lcyAqLworCXdyaXRlX3JzY19uYW1lcyhmbywgdG9wKTsKKwkKKwlpZighaW5kaXJlY3Rfb25seSkKKwl7CisJCS8qIFdyaXRlIHRoZSByZXNvdXJjZSBkYXRhICovCisJCWZwcmludGYoZm8sICIjXG4jIFJlc291cmNlIGJpbmFyeSBkYXRhXG4jXG4iKTsKKwkJZm9yKHJzYyA9IHRvcDsgcnNjOyByc2MgPSByc2MtPm5leHQpCisJCXsKKwkJCWlmKCFyc2MtPmJpbnJlcykKKwkJCQljb250aW51ZTsKKworCQkJZnByaW50ZihmbywgIlx0LmFsaWduXHQlZFxuIiwgd2luMzIgPyA0IDogYWxpZ25tZW50KTsKKwkJCWZwcmludGYoZm8sICIlcyVzX2RhdGE6XG4iLCBwcmVmaXgsIHJzYy0+Y19uYW1lKTsKKwkJCWlmKGdsb2JhbCkKKwkJCQlmcHJpbnRmKGZvLCAiXHQuZ2xvYmxcdCVzJXNfZGF0YVxuIiwgcHJlZml4LCByc2MtPmNfbmFtZSk7CisKKwkJCXdyaXRlX3NfcmVzKGZvLCByc2MtPmJpbnJlcyk7CisKKwkJCWZwcmludGYoZm8sICJcbiIpOworCQl9CisJfQorCisJaWYoaW5kaXJlY3QpCisJeworCQkvKiBXcml0ZSB0aGUgaW5kaXJlY3Rpb24gc3RydWN0dXJlcyAqLworCQlmcHJpbnRmKGZvLCAiXG4jXG4jIFJlc291cmNlIGluZGlyZWN0aW9uIHN0cnVjdHVyZXNcbiNcbiIpOworCQlmcHJpbnRmKGZvLCAiXHQuYWxpZ25cdDRcbiIpOworCQlmb3IocnNjID0gdG9wOyByc2M7IHJzYyA9IHJzYy0+bmV4dCkKKwkJeworCQkJaW50IHR5cGU7CisJCQljaGFyICp0eXBlX25hbWUgPSBOVUxMOworCisJCQlpZighcnNjLT5iaW5yZXMpCisJCQkJY29udGludWU7CisKKwkJCXN3aXRjaChyc2MtPnR5cGUpCisJCQl7CisJCQljYXNlIHJlc19tZW5leDoKKwkJCQl0eXBlID0gV1JDX1JUX01FTlU7CisJCQkJYnJlYWs7CisJCQljYXNlIHJlc19kbGdleDoKKwkJCQl0eXBlID0gV1JDX1JUX0RJQUxPRzsKKwkJCQlicmVhazsKKwkJCWNhc2UgcmVzX3VzcjoKKwkJCQlhc3NlcnQocnNjLT5yZXMudXNyLT50eXBlICE9IE5VTEwpOworCQkJCXR5cGVfbmFtZSA9IHByZXBfbmlkX2Zvcl9sYWJlbChyc2MtPnJlcy51c3ItPnR5cGUpOworCQkJCXR5cGUgPSAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl0eXBlID0gcnNjLT50eXBlOworCQkJfQorCisJCQkvKgorCQkJICogVGhpcyBmb2xsb3dzIGEgc3RydWN0dXJlIGxpa2U6CisJCQkgKiBzdHJ1Y3Qgd3JjX3Jlc291cmNlIHsKKwkJCSAqIAlJTlQzMglpZDsKKwkJCSAqCVJTQ05BTUUJKnJlc25hbWU7CisJCQkgKglJTlQzMglyZXN0eXBlOworCQkJICoJUlNDTkFNRQkqdHlwZW5hbWU7CisJCQkgKgl2b2lkCSpkYXRhOworCQkJICoJVUlOVDMyCWRhdGFzaXplOworCQkJICogfTsKKwkJCSAqIFRoZSAnUlNDTkFNRScgaXMgYSBwYXNjYWwtc3R5bGUgc3RyaW5nIHdoZXJlIHRoZQorCQkJICogZmlyc3QgYnl0ZS93b3JkIGRlbm90ZXMgdGhlIHNpemUgYW5kIHRoZSByZXN0IHRoZSBzdHJpbmcKKwkJCSAqIGl0c2VsZi4KKwkJCSAqLworCQkJZnByaW50ZihmbywgIiVzJXM6XG4iLCBwcmVmaXgsIHJzYy0+Y19uYW1lKTsKKwkJCWlmKGdsb2JhbCkKKwkJCQlmcHJpbnRmKGZvLCAiXHQuZ2xvYmxcdCVzJXNcbiIsIHByZWZpeCwgcnNjLT5jX25hbWUpOworCQkJZnByaW50ZihmbywgIlx0LmxvbmdcdCVkLCAlcyVzJXMsICVkLCAlcyVzJXMlcywgJXMlc19kYXRhLCAlZFxuIiwKKwkJCQlyc2MtPm5hbWUtPnR5cGUgPT0gbmFtZV9vcmQgPyByc2MtPm5hbWUtPm5hbWUuaV9uYW1lIDogMCwKKwkJCQlyc2MtPm5hbWUtPnR5cGUgPT0gbmFtZV9vcmQgPyAiMCIgOiBwcmVmaXgsCisJCQkJcnNjLT5uYW1lLT50eXBlID09IG5hbWVfb3JkID8gIiIgOiByc2MtPmNfbmFtZSwKKwkJCQlyc2MtPm5hbWUtPnR5cGUgPT0gbmFtZV9vcmQgPyAiIiA6ICJfbmFtZSIsCisJCQkJdHlwZSwKKwkJCQl0eXBlID8gIjAiIDogcHJlZml4LAorCQkJCXR5cGUgPyAiIiA6ICJfIiwKKwkJCQl0eXBlID8gIiIgOiB0eXBlX25hbWUsCisJCQkJdHlwZSA/ICIiIDogIl90eXBlbmFtZSIsCisJCQkJcHJlZml4LAorCQkJCXJzYy0+Y19uYW1lLAorCQkJCXJzYy0+YmlucmVzLT5zaXplIC0gcnNjLT5iaW5yZXMtPmRhdGFpZHgpOworCQkJZnByaW50ZihmbywgIlxuIik7CisJCX0KKwkJZnByaW50ZihmbywgIlxuIik7CisKKwkJLyogV3JpdGUgdGhlIGluZGlyZWN0aW9uIHRhYmxlICovCisJCWZwcmludGYoZm8sICIjXG4jIFJlc291cmNlIGluZGlyZWN0aW9uIHRhYmxlXG4jXG4iKTsKKwkJZnByaW50ZihmbywgIlx0LmFsaWduXHQ0XG4iKTsKKwkJZnByaW50ZihmbywgIiVzJXM6XG4iLCBwcmVmaXgsIF9SZXNUYWJsZSk7CisJCWZwcmludGYoZm8sICJcdC5nbG9ibFx0JXMlc1xuIiwgcHJlZml4LCBfUmVzVGFibGUpOworCQlmb3IocnNjID0gdG9wOyByc2M7IHJzYyA9IHJzYy0+bmV4dCkKKwkJeworCQkJZnByaW50ZihmbywgIlx0LmxvbmdcdCVzJXNcbiIsIHByZWZpeCwgcnNjLT5jX25hbWUpOworCQl9CisJCWZwcmludGYoZm8sICJcdC5sb25nXHQwXG4iKTsKKwkJZnByaW50ZihmbywgIlxuIik7CisJfQorCisJZnByaW50Zihmbywgc19maWxlX3RhaWxfc3RyKTsKKwlmY2xvc2UoZm8pOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbgk6IHdyaXRlX2hfZmlsZQorICogU3ludGF4CTogdm9pZCB3cml0ZV9oX2ZpbGUoY2hhciAqb3V0bmFtZSwgcmVzb3VyY2VfdCAqdG9wKQorICogSW5wdXQJOgorICoJb3V0bmFtZQktIEZpbGVuYW1lIHRvIHdyaXRlIHRvCisgKgl0b3AJLSBUaGUgcmVzb3VyY2UtdHJlZSB0byBjb252ZXJ0CisgKiBPdXRwdXQJOgorICogRGVzY3JpcHRpb24JOgorICogUmVtYXJrcwk6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCit2b2lkIHdyaXRlX2hfZmlsZShjaGFyICpvdXRuYW1lLCByZXNvdXJjZV90ICp0b3ApCit7CisJRklMRSAqZm87CisJcmVzb3VyY2VfdCAqcnNjOworCWNoYXIgKmhfcHJlZml4OworCWludCBjbmFtZWlkeDsKKworCWlmKHByZWZpeFswXSA9PSAnXycpCisJeworCQloX3ByZWZpeCA9IHByZWZpeCArIDE7CisJCWNuYW1laWR4ID0gMDsKKwl9CisJZWxzZSBpZihwcmVmaXhbMF0gPT0gJ1wwJykKKwl7CisJCWhfcHJlZml4ID0gcHJlZml4OworCQljbmFtZWlkeCA9IDE7CisJfQorCWVsc2UKKwl7CisJCWhfcHJlZml4ID0gcHJlZml4OworCQljbmFtZWlkeCA9IDA7CisJCXdhcm5pbmcoIlJlc291cmNlcyBtaWdodCBub3QgYmUgdmlzaWJsZSBpbiBjLW5hbWVzcGFjZSAobWlzc2luZyAnXycgaW4gcHJlZml4KVxuIik7CisJfQorCisJZm8gPSBmb3BlbihvdXRuYW1lLCAid3QiKTsKKwlpZighZm8pCisJeworCQllcnJvcigiQ291bGQgbm90IG9wZW4gJXNcbiIsIG91dG5hbWUpOworCX0KKworCXRpbWUoJm5vdyk7CisJZnByaW50ZihmbywgaF9maWxlX2hlYWRfc3RyLCBpbnB1dF9uYW1lLCBjbWRsaW5lLCBjdGltZSgmbm93KSwgbm93LCBub3cpOworCisJLyogRmlyc3Qgd3JpdGUgdGhlIHNlZ21lbnQgdGFibGVzIHJlZmVyZW5jZSAqLworCWlmKGNyZWF0ZV9kaXIpCisJeworCQlmcHJpbnRmKGZvLCAiZXh0ZXJuICVzY2hhciAlcyVzW107XG5cbiIsCisJCQljb25zdGFudCA/ICJjb25zdCAiIDogIiIsCisJCQloX3ByZWZpeCwKKwkJCSh3aW4zMiA/IF9QRVJlc1RhYiA6IF9ORVJlc1RhYikgKyBjbmFtZWlkeCk7CisJfQorCisJLyogV3JpdGUgdGhlIHJlc291cmNlIGRhdGEgKi8KKwlmb3IocnNjID0gdG9wOyBnbG9iYWwgJiYgcnNjOyByc2MgPSByc2MtPm5leHQpCisJeworCQlpZighcnNjLT5iaW5yZXMpCisJCQljb250aW51ZTsKKworCQlmcHJpbnRmKGZvLCAiZXh0ZXJuICVzY2hhciAlcyVzX2RhdGFbXTtcbiIsCisJCQljb25zdGFudCA/ICJjb25zdCAiIDogIiIsCisJCQloX3ByZWZpeCwKKwkJCXJzYy0+Y19uYW1lICsgY25hbWVpZHgpOworCX0KKworCWlmKGluZGlyZWN0KQorCXsKKwkJaWYoZ2xvYmFsKQorCQkJZnByaW50ZihmbywgIlxuIik7CisKKwkJLyogV3JpdGUgdGhlIGluZGlyZWN0aW9uIHN0cnVjdHVyZXMgKi8KKwkJZm9yKHJzYyA9IHRvcDsgZ2xvYmFsICYmIHJzYzsgcnNjID0gcnNjLT5uZXh0KQorCQl7CisJCQlmcHJpbnRmKGZvLCAiZXh0ZXJuICVzd3JjX3Jlc291cmNlJWRfdCAlcyVzO1xuIiwKKwkJCQljb25zdGFudCA/ICJjb25zdCAiIDogIiIsCisJCQkJd2luMzIgPyAzMiA6IDE2LAorCQkJCWhfcHJlZml4LAorCQkJCXJzYy0+Y19uYW1lICsgY25hbWVpZHgpOworCQl9CisKKwkJaWYoZ2xvYmFsKQorCQkJZnByaW50ZihmbywgIlxuIik7CisKKwkJLyogV3JpdGUgdGhlIGluZGlyZWN0aW9uIHRhYmxlICovCisJCWZwcmludGYoZm8sICJleHRlcm4gJXN3cmNfcmVzb3VyY2UlZF90ICVzJXNbXTtcblxuIiwKKwkJCWNvbnN0YW50ID8gImNvbnN0ICIgOiAiIiwKKwkJCXdpbjMyID8gMzIgOiAxNiwKKwkJCWhfcHJlZml4LAorCQkJX1Jlc1RhYmxlICsgY25hbWVpZHgpOworCX0KKworCWZwcmludGYoZm8sIGhfZmlsZV90YWlsX3N0cik7CisJZmNsb3NlKGZvKTsKK30KKworCmRpZmYgLS1naXQgYS90b29scy93cmMvd3JpdGVyZXMuaCBiL3Rvb2xzL3dyYy93cml0ZXJlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZGExYjIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy93cmMvd3JpdGVyZXMuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogV3JpdGUgcmVzb3VyY2UgcHJvdG90eXBlcworICoKKyAqIENvcHlyaWdodCAxOTk4IEJlcnRobyBBLiBTdHVsdGllbnMgKEJTKQorICoKKyAqLworCisjaWZuZGVmIF9fV1JDX1dSSVRFUkVTX0gKKyNkZWZpbmUgX19XUkNfV1JJVEVSRVNfSAorCisjaWZuZGVmIF9fV1JDX1dSQ1RZUEVTX0gKKyNpbmNsdWRlICJ3cmN0eXBlcy5oIgorI2VuZGlmCisKK3ZvaWQgd3JpdGVfcmVzZmlsZShjaGFyICpvdXRuYW1lLCByZXNvdXJjZV90ICp0b3ApOwordm9pZCB3cml0ZV9zX2ZpbGUoY2hhciAqb3V0bmFtZSwgcmVzb3VyY2VfdCAqdG9wKTsKK3ZvaWQgd3JpdGVfaF9maWxlKGNoYXIgKm91dG5hbWUsIHJlc291cmNlX3QgKnRvcCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvd2luMzIvYWR2YXBpLmMgYi93aW4zMi9hZHZhcGkuYwppbmRleCBjZWUyNjc1Li4wYjM5ZDBhIDEwMDY0NAotLS0gYS93aW4zMi9hZHZhcGkuYworKysgYi93aW4zMi9hZHZhcGkuYwpAQCAtNCw3ICs0LDYgQEAKICAqIENvcHlyaWdodCAxOTk1IFN2ZW4gVmVyZG9vbGFlZ2UKICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgpkaWZmIC0tZ2l0IGEvd2luMzIvY29kZV9wYWdlLmMgYi93aW4zMi9jb2RlX3BhZ2UuYwppbmRleCBmNzMwMTIxLi5lYzE4NDc5IDEwMDY0NAotLS0gYS93aW4zMi9jb2RlX3BhZ2UuYworKysgYi93aW4zMi9jb2RlX3BhZ2UuYwpAQCAtNCw3ICs0LDYgQEAKICAqIENvcHlyaWdodCAxOTk1IE1hcnRpbiB2b24gTG9ld2lzIGFuZCBDYW1lcm9uIEhlaWRlCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCmRpZmYgLS1naXQgYS93aW4zMi9jb25zb2xlLmMgYi93aW4zMi9jb25zb2xlLmMKaW5kZXggMThjYjE1OC4uNTA1YmZlYSAxMDA2NDQKLS0tIGEvd2luMzIvY29uc29sZS5jCisrKyBiL3dpbjMyL2NvbnNvbGUuYwpAQCAtNiw3ICs2LDYgQEAKICAqIENvcHlyaWdodCAxOTk4IEpvaG4gUmljaGFyZHNvbgogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHRlcm1pb3MuaD4KQEAgLTExMjYsMyArMTEyNSwxNyBAQAogICAgIHJldHVybiBUUlVFOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSZWFkQ29uc29sZU91dHB1dENoYXJhY3RlcjMyQSBbS0VSTkVMMzIuNTczXQorICogCisgKiBCVUdTCisgKiAgIFVuaW1wbGVtZW50ZWQKKyAqLworQk9PTDMyIFdJTkFQSSBSZWFkQ29uc29sZU91dHB1dENoYXJhY3RlcjMyQShIQU5ETEUzMiBoQ29uc29sZU91dHB1dCwgCisJICAgICAgTFBTVFIgbHBzdHIsIERXT1JEIGR3b3JkLCBDT09SRCBjb29yZCwgTFBEV09SRCBscGR3b3JkKQoreworICAgIEZJWE1FKGNvbnNvbGUsICIoJWQsJXAsJWxkLCVkeCVkLCVwKTogc3R1YlxuIiwgaENvbnNvbGVPdXRwdXQsbHBzdHIsCisJICBkd29yZCxjb29yZC54LGNvb3JkLnksbHBkd29yZCk7CisgICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CmRpZmYgLS1naXQgYS93aW4zMi9lcnJvci5jIGIvd2luMzIvZXJyb3IuYwppbmRleCAzOWQyODMyLi4zYzJlZTExIDEwMDY0NAotLS0gYS93aW4zMi9lcnJvci5jCisrKyBiL3dpbjMyL2Vycm9yLmMKQEAgLTQsNyArNCw2IEBACiAgKiBDb3B5cmlnaHQgMTk5NSBNYXJ0aW4gdm9uIExvZXdpcyBhbmQgQ2FtZXJvbiBIZWlkZQogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCmRpZmYgLS1naXQgYS93aW4zMi9leGNlcHQuYyBiL3dpbjMyL2V4Y2VwdC5jCmluZGV4IGZlZGQ0MGIuLjYzNjc0ZGIgMTAwNjQ0Ci0tLSBhL3dpbjMyL2V4Y2VwdC5jCisrKyBiL3dpbjMyL2V4Y2VwdC5jCkBAIC0zMiw3ICszMiw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAibGR0LmgiCkBAIC00MCw2ICszOSw3IEBACiAjaW5jbHVkZSAidGhyZWFkLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJleGNlcHQuaCIKKyNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCiAKICNkZWZpbmUgVEVCX0VYQ0VQVElPTl9GUkFNRShwY29udGV4dCkgXAogICAgICgoUEVYQ0VQVElPTl9GUkFNRSkoKFRFQiAqKUdFVF9TRUxfQkFTRSgocGNvbnRleHQpLT5TZWdGcykpLT5leGNlcHQpCkBAIC00OSwxNiArNDksMjcgQEAKICAqCiAgKiAgVGhpcyBmdW5jdGlvbiBpcyB1bmRvY3VtZW50ZWQuIFRoaXMgaXMgdGhlIGdlbmVyYWwgaWRlYSBvZiAKICAqICBSdGxVbndpbmQsIHRob3VnaC4gTm90ZSB0aGF0IGVycm9yIGhhbmRsaW5nIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisgKgorICogVGhlIHJlYWwgcHJvdG90eXBlIGlzOgorICogdm9pZCBXSU5BUEkgRVhDX1J0bFVud2luZCggUEVYQ0VQVElPTl9GUkFNRSBwRW5kRnJhbWUsIExQVk9JRCB1bnVzZWRFaXAsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVYQ0VQVElPTl9SRUNPUkQgcFJlY29yZCwgRFdPUkQgcmV0dXJuRWF4ICk7CiAgKi8KLXZvaWQgV0lOQVBJIFJ0bFVud2luZCggUEVYQ0VQVElPTl9GUkFNRSBwRW5kRnJhbWUsIExQVk9JRCB1bnVzZWRFaXAsIAotICAgICAgICAgICAgICAgICAgICAgICBQRVhDRVBUSU9OX1JFQ09SRCBwUmVjb3JkLCBEV09SRCByZXR1cm5FYXgsCi0gICAgICAgICAgICAgICAgICAgICAgIFBDT05URVhUIHBjb250ZXh0IC8qIFdpbmUgYWRkaXRpb25hbCBwYXJhbWV0ZXIgKi8gKQoteyAgIAotICAgRVhDRVBUSU9OX1JFQ09SRCByZWNvcmQ7Ci0gICBEV09SRCAgICAgICAgICAgIGRpc3BhdGNoOwotICAgaW50ICAgICAgICAgICAgICByZXR2YWw7Ci0gIAotICAgRUFYX3JlZyhwY29udGV4dCkgPSByZXR1cm5FYXg7CitSRUdTX0VOVFJZUE9JTlQoUnRsVW53aW5kKQoreworICAgIEVYQ0VQVElPTl9SRUNPUkQgcmVjb3JkOworICAgIERXT1JEICAgICAgICAgICAgZGlzcGF0Y2g7CisgICAgaW50ICAgICAgICAgICAgICByZXR2YWw7CisgICAgUEVYQ0VQVElPTl9GUkFNRSBwRW5kRnJhbWU7CisgICAgUEVYQ0VQVElPTl9SRUNPUkQgcFJlY29yZDsKKworICAgIC8qIGdldCB0aGUgYXJndW1lbnRzIGZyb20gdGhlIHN0YWNrICovCisKKyAgICBEV09SRCByZXQgICAgICAgID0gU1RBQ0szMl9QT1AoY29udGV4dCk7ICAvKiByZXR1cm4gYWRkciAqLworICAgIHBFbmRGcmFtZSAgICAgICAgPSAoUEVYQ0VQVElPTl9GUkFNRSlTVEFDSzMyX1BPUChjb250ZXh0KTsKKyAgICAodm9pZClTVEFDSzMyX1BPUChjb250ZXh0KTsgIC8qIHVudXNlZCBhcmcgKi8KKyAgICBwUmVjb3JkICAgICAgICAgID0gKFBFWENFUFRJT05fUkVDT1JEKVNUQUNLMzJfUE9QKGNvbnRleHQpOworICAgIEVBWF9yZWcoY29udGV4dCkgPSBTVEFDSzMyX1BPUChjb250ZXh0KTsKKyAgICBTVEFDSzMyX1BVU0goY29udGV4dCxyZXQpOyAgLyogcmVzdG9yZSByZXR1cm4gYWRkciAqLwogICAgCiAgICAvKiBidWlsZCBhbiBleGNlcHRpb24gcmVjb3JkLCBpZiB3ZSBkbyBub3QgaGF2ZSBvbmUgKi8KICAgIGlmKCFwUmVjb3JkKQpAQCAtNjYsNyArNzcsNyBAQAogICAgICByZWNvcmQuRXhjZXB0aW9uQ29kZSAgICA9IFNUQVRVU19JTlZBTElEX0RJU1BPU0lUSU9OOwogICAgICByZWNvcmQuRXhjZXB0aW9uRmxhZ3MgICA9IDA7CiAgICAgIHJlY29yZC5FeGNlcHRpb25SZWNvcmQgID0gTlVMTDsKLSAgICAgcmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MgPSAoTFBWT0lEKUVJUF9yZWcocGNvbnRleHQpOyAKKyAgICAgcmVjb3JkLkV4Y2VwdGlvbkFkZHJlc3MgPSAoTFBWT0lEKUVJUF9yZWcoY29udGV4dCk7IAogICAgICByZWNvcmQuTnVtYmVyUGFyYW1ldGVycyA9IDA7CiAgICAgIHBSZWNvcmQgPSAmcmVjb3JkOwogICAgfQpAQCAtNzcsNjcgKzg4LDY4IEBACiAgICAgIHBSZWNvcmQtPkV4Y2VwdGlvbkZsYWdzfD1FSF9VTldJTkRJTkcgfCBFSF9FWElUX1VOV0lORDsKICAgCiAgICAvKiBnZXQgY2hhaW4gb2YgZXhjZXB0aW9uIGZyYW1lcyAqLyAgICAgIAotICAgd2hpbGUgKChURUJfRVhDRVBUSU9OX0ZSQU1FKHBjb250ZXh0KSAhPSBOVUxMKSAmJgotICAgICAgICAgIChURUJfRVhDRVBUSU9OX0ZSQU1FKHBjb250ZXh0KSAhPSAoKHZvaWQgKikweGZmZmZmZmZmKSkgJiYKLSAgICAgICAgICAoVEVCX0VYQ0VQVElPTl9GUkFNRShwY29udGV4dCkgIT0gcEVuZEZyYW1lKSkKKyAgIHdoaWxlICgoVEVCX0VYQ0VQVElPTl9GUkFNRShjb250ZXh0KSAhPSBOVUxMKSAmJgorICAgICAgICAgIChURUJfRVhDRVBUSU9OX0ZSQU1FKGNvbnRleHQpICE9ICgodm9pZCAqKTB4ZmZmZmZmZmYpKSAmJgorICAgICAgICAgIChURUJfRVhDRVBUSU9OX0ZSQU1FKGNvbnRleHQpICE9IHBFbmRGcmFtZSkpCiAgICB7CiAgICAgICAgVFJBQ0Uod2luMzIsICJjYWxsaW5nIGV4Y2VwdGlvbiBoYW5kbGVyIGF0IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgKGludClURUJfRVhDRVBUSU9OX0ZSQU1FKHBjb250ZXh0KS0+SGFuZGxlciApOworICAgICAgICAgICAgICAgICAgICAgIChpbnQpVEVCX0VYQ0VQVElPTl9GUkFNRShjb250ZXh0KS0+SGFuZGxlciApOwogCiAgICAgICAgZGlzcGF0Y2g9MDsgICAgICAgCi0gICAgICAgcmV0dmFsID0gVEVCX0VYQ0VQVElPTl9GUkFNRShwY29udGV4dCktPkhhbmRsZXIoIHBSZWNvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURUJfRVhDRVBUSU9OX0ZSQU1FKHBjb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjb250ZXh0LCAmZGlzcGF0Y2gpOworICAgICAgIHJldHZhbCA9IFRFQl9FWENFUFRJT05fRlJBTUUoY29udGV4dCktPkhhbmRsZXIoIHBSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURUJfRVhDRVBUSU9OX0ZSQU1FKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgJmRpc3BhdGNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgVFJBQ0Uod2luMzIsImV4Y2VwdGlvbiBoYW5kbGVyIHJldHVybnMgMHgleCwgZGlzcGF0Y2g9MHgleFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCwgKGludCkgZGlzcGF0Y2gpOwogICAKICAgICAgICBpZiAoCShyZXR2YWwgPT0gRXhjZXB0aW9uQ29sbGlkZWRVbndpbmQpICYmCi0gICAgICAgICAgIAkoVEVCX0VYQ0VQVElPTl9GUkFNRShwY29udGV4dCkgIT0gKExQVk9JRClkaXNwYXRjaCkKKyAgICAgICAgICAgCShURUJfRVhDRVBUSU9OX0ZSQU1FKGNvbnRleHQpICE9IChMUFZPSUQpZGlzcGF0Y2gpCiAgICAgICAgKQotICAgICAgICAgICBURUJfRVhDRVBUSU9OX0ZSQU1FKHBjb250ZXh0KSA9IChMUFZPSUQpZGlzcGF0Y2g7Ci0gICAgICAgZWxzZSBpZiAoCShURUJfRVhDRVBUSU9OX0ZSQU1FKHBjb250ZXh0KSAhPSBwRW5kRnJhbWUpICYmCi0gICAgICAgICAgIAkJKFRFQl9FWENFUFRJT05fRlJBTUUocGNvbnRleHQpICE9IFRFQl9FWENFUFRJT05fRlJBTUUocGNvbnRleHQpLT5QcmV2KQorICAgICAgICAgICBURUJfRVhDRVBUSU9OX0ZSQU1FKGNvbnRleHQpID0gKExQVk9JRClkaXNwYXRjaDsKKyAgICAgICBlbHNlIGlmICgJKFRFQl9FWENFUFRJT05fRlJBTUUoY29udGV4dCkgIT0gcEVuZEZyYW1lKSAmJgorICAgICAgICAgICAJCShURUJfRVhDRVBUSU9OX0ZSQU1FKGNvbnRleHQpICE9IFRFQl9FWENFUFRJT05fRlJBTUUoY29udGV4dCktPlByZXYpCiAgICAgICAgKQotICAgICAgICAgICBURUJfRVhDRVBUSU9OX0ZSQU1FKHBjb250ZXh0KSA9IFRFQl9FWENFUFRJT05fRlJBTUUocGNvbnRleHQpLT5QcmV2OworICAgICAgICAgICBURUJfRVhDRVBUSU9OX0ZSQU1FKGNvbnRleHQpID0gVEVCX0VYQ0VQVElPTl9GUkFNRShjb250ZXh0KS0+UHJldjsKICAgICAgICBlbHNlCiAgICAgICAgICAgYnJlYWs7ICAKICAgIH0KIH0KIAotLyogVGhpcyBpcyB0aGUgcmVhbCBlbnRyeSBwb2ludCBjYWxsZWQgYnkgcmVsYXkgZGVidWdnaW5nIGNvZGUgKi8KLXZvaWQgRVhDX1J0bFVud2luZCggQ09OVEVYVCAqY29udGV4dCApCi17Ci0gICAgLyogUmV0cmlldmUgdGhlIGFyZ3VtZW50cyAoYXJnc1swXSBpcyByZXR1cm4gYWRkciwgYXJnc1sxXSBpcyBmaXJzdCBhcmcpICovCi0gICAgRFdPUkQgKmFyZ3MgPSAoRFdPUkQgKilFU1BfcmVnKGNvbnRleHQpOwotICAgIEVTUF9yZWcoY29udGV4dCkgKz0gNCAqIHNpemVvZihEV09SRCk7ICAvKiBQb3AgdGhlIGFyZ3VtZW50cyAqLwotICAgIFJ0bFVud2luZCggKFBFWENFUFRJT05fRlJBTUUpYXJnc1sxXSwgKExQVk9JRClhcmdzWzJdLAotICAgICAgICAgICAgICAgKFBFWENFUFRJT05fUkVDT1JEKWFyZ3NbM10sIGFyZ3NbNF0sIGNvbnRleHQgKTsKLX0KLQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICBSYWlzZUV4Y2VwdGlvbiAgKEtFUk5FTDMyLjQxOCkKKyAqCisgKiBUaGUgcmVhbCBwcm90b3R5cGUgaXM6CisgKiB2b2lkIFdJTkFQSSBFWENfUmFpc2VFeGNlcHRpb24oRFdPUkQgZHdFeGNlcHRpb25Db2RlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RXhjZXB0aW9uRmxhZ3MsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgY0FyZ3VtZW50cywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMUERXT1JEIGxwQXJndW1lbnRzICk7CiAgKi8KLXZvaWQgV0lOQVBJIFJhaXNlRXhjZXB0aW9uKERXT1JEIGR3RXhjZXB0aW9uQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RXhjZXB0aW9uRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBjQXJndW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFBEV09SRCBscEFyZ3VtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDT05URVhUIHBjb250ZXh0IC8qIFdpbmUgYWRkaXRpb25hbCBwYXJhbWV0ZXIgKi8gKQorUkVHU19FTlRSWVBPSU5UKFJhaXNlRXhjZXB0aW9uKQogewogICAgIFBFWENFUFRJT05fRlJBTUUgICAgcGZyYW1lOyAKICAgICBFWENFUFRJT05fUkVDT1JEICAgIHJlY29yZDsKICAgICBEV09SRCAgICAgICAgICAgICAgIGRpc3BhdGNoOyAvKiBpcyB0aGlzIHVzZWQgaW4gcmFpc2luZyBleGNlcHRpb25zID8/ICovCiAgICAgaW50ICAgICAgICAgICAgICAgICByZXR2YWw7CiAgICAgaW50ICAgICAgICAgICAgICAgICBpOwotICAgIAorCisgICAgLyogR2V0IHRoZSBhcmd1bWVudHMgZnJvbSB0aGUgc3RhY2sgKi8KKworICAgIERXT1JEIHJldCAgICAgICAgICAgICAgICAgPSBTVEFDSzMyX1BPUChjb250ZXh0KTsgIC8qIHJldHVybiBhZGRyICovCisgICAgRFdPUkQgZHdFeGNlcHRpb25Db2RlICAgICA9IFNUQUNLMzJfUE9QKGNvbnRleHQpOworICAgIERXT1JEIGR3RXhjZXB0aW9uRmxhZ3MgICAgPSBTVEFDSzMyX1BPUChjb250ZXh0KTsKKyAgICBEV09SRCBjQXJndW1lbnRzICAgICAgICAgID0gU1RBQ0szMl9QT1AoY29udGV4dCk7CisgICAgY29uc3QgTFBEV09SRCBscEFyZ3VtZW50cyA9IChMUERXT1JEKVNUQUNLMzJfUE9QKGNvbnRleHQpOworICAgIFNUQUNLMzJfUFVTSChjb250ZXh0LHJldCk7ICAvKiBSZXN0b3JlIHRoZSByZXR1cm4gYWRkcmVzcyAqLworCiAgICAgLyogY29tcG9zZSBhbiBleGNlcHRpb24gcmVjb3JkICovIAogICAgIAogICAgIHJlY29yZC5FeGNlcHRpb25Db2RlICAgICAgID0gZHdFeGNlcHRpb25Db2RlOyAgIAogICAgIHJlY29yZC5FeGNlcHRpb25GbGFncyAgICAgID0gZHdFeGNlcHRpb25GbGFnczsKICAgICByZWNvcmQuRXhjZXB0aW9uUmVjb3JkICAgICA9IE5VTEw7CiAgICAgcmVjb3JkLk51bWJlclBhcmFtZXRlcnMgICAgPSBjQXJndW1lbnRzOwotICAgIHJlY29yZC5FeGNlcHRpb25BZGRyZXNzICAgID0gKExQVk9JRClFSVBfcmVnKHBjb250ZXh0KTsKKyAgICByZWNvcmQuRXhjZXB0aW9uQWRkcmVzcyAgICA9IChMUFZPSUQpRUlQX3JlZyhjb250ZXh0KTsKICAgICAKICAgICBpZiAobHBBcmd1bWVudHMpIGZvciggaSA9IDA7IGkgPCBjQXJndW1lbnRzOyBpKyspCiAgICAgICAgIHJlY29yZC5FeGNlcHRpb25JbmZvcm1hdGlvbltpXSA9IGxwQXJndW1lbnRzW2ldOwpAQCAtMTQ1LDcgKzE1Nyw3IEBACiAgICAgLyogZ2V0IGNoYWluIG9mIGV4Y2VwdGlvbiBmcmFtZXMgKi8gICAgCiAgICAgCiAgICAgcmV0dmFsID0gRXhjZXB0aW9uQ29udGludWVTZWFyY2g7ICAgIAotICAgIHBmcmFtZSA9IFRFQl9FWENFUFRJT05fRlJBTUUoIHBjb250ZXh0ICk7CisgICAgcGZyYW1lID0gVEVCX0VYQ0VQVElPTl9GUkFNRSggY29udGV4dCApOwogICAgIAogICAgIHdoaWxlKChwZnJhbWUhPU5VTEwpJiYocGZyYW1lIT0oKHZvaWQgKikweEZGRkZGRkZGKSkpCiAgICAgewpAQCAtMTUzLDggKzE2NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBwZnJhbWUtPkhhbmRsZXIpOwogICAgICAgIGRpc3BhdGNoPTA7ICAKICAgICAgICBUUkFDRShyZWxheSwiKGV4Y2VwdD0lcCxyZWNvcmQ9JXAsZnJhbWU9JXAsY29udGV4dD0lcCxkaXNwYXRjaD0lcClcbiIsCi0gICAgICAgICAgICAgICAgICAgICBwZnJhbWUtPkhhbmRsZXIsICZyZWNvcmQsIHBmcmFtZSwgcGNvbnRleHQsICZkaXNwYXRjaCApOwotICAgICAgIHJldHZhbD1wZnJhbWUtPkhhbmRsZXIoJnJlY29yZCxwZnJhbWUscGNvbnRleHQsJmRpc3BhdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgIHBmcmFtZS0+SGFuZGxlciwgJnJlY29yZCwgcGZyYW1lLCBjb250ZXh0LCAmZGlzcGF0Y2ggKTsKKyAgICAgICByZXR2YWw9cGZyYW1lLT5IYW5kbGVyKCZyZWNvcmQscGZyYW1lLGNvbnRleHQsJmRpc3BhdGNoKTsKICAKICAgICAgICBUUkFDRSh3aW4zMiwiZXhjZXB0aW9uIGhhbmRsZXIgcmV0dXJucyAweCV4LCBkaXNwYXRjaD0weCV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsLCAoaW50KSBkaXNwYXRjaCk7CkBAIC0xNzIsMTQgKzE4NCw2IEBACiAgICB9CiB9CiAKLS8qIFRoaXMgaXMgdGhlIHJlYWwgZW50cnkgcG9pbnQgY2FsbGVkIGJ5IHJlbGF5IGRlYnVnZ2luZyBjb2RlICovCi12b2lkIEVYQ19SYWlzZUV4Y2VwdGlvbiggQ09OVEVYVCAqY29udGV4dCApCi17Ci0gICAgLyogUmV0cmlldmUgdGhlIGFyZ3VtZW50cyAoYXJnc1swXSBpcyByZXR1cm4gYWRkciwgYXJnc1sxXSBpcyBmaXJzdCBhcmcpICovCi0gICAgRFdPUkQgKmFyZ3MgPSAoRFdPUkQgKilFU1BfcmVnKGNvbnRleHQpOwotICAgIEVTUF9yZWcoY29udGV4dCkgKz0gNCAqIHNpemVvZihEV09SRCk7ICAvKiBQb3AgdGhlIGFyZ3VtZW50cyAqLwotICAgIFJhaXNlRXhjZXB0aW9uKCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCAoTFBEV09SRClhcmdzWzRdLCBjb250ZXh0ICk7Ci19CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlciAgIChLRVJORUwzMi41MzcpCmRpZmYgLS1naXQgYS93aW4zMi9maWxlLmMgYi93aW4zMi9maWxlLmMKaW5kZXggYzk5OWZiMy4uNDlhMmQ3NyAxMDA2NDQKLS0tIGEvd2luMzIvZmlsZS5jCisrKyBiL3dpbjMyL2ZpbGUuYwpAQCAtNSw3ICs1LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvd2luMzIvaW5pdC5jIGIvd2luMzIvaW5pdC5jCmluZGV4IDBiNjExNTMuLjZhNjQ2Y2IgMTAwNjQ0Ci0tLSBhL3dpbjMyL2luaXQuYworKysgYi93aW4zMi9pbml0LmMKQEAgLTUsNyArNSw2IEBACiAgKi8KIAogI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgpkaWZmIC0tZ2l0IGEvd2luMzIva2VybmVsMzIuYyBiL3dpbjMyL2tlcm5lbDMyLmMKaW5kZXggMTMzZDZhMC4uYjAxYTQwYyAxMDA2NDQKLS0tIGEvd2luMzIva2VybmVsMzIuYworKysgYi93aW4zMi9rZXJuZWwzMi5jCkBAIC01LDcgKzUsNiBAQAogICogQ29weXJpZ2h0IDE5OTggICAgICBVbHJpY2ggV2VpZ2FuZAogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgogI2luY2x1ZGUgInJlc291cmNlLmgiCkBAIC0yMCw2ICsxOSw4IEBACiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiZmxhdHRodW5rLmgiCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKQEAgLTc1LDExMCArNzYsNiBAQAogCS8qIHNob3VsZCBmaWxsIHRoZSByZXN0IG9mIHRoZSAzMiBieXRlcyB3aXRoIDB4Q0MgKi8KIH0KIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRodW5rQ29ubmVjdCBkYXRhIHN0cnVjdHVyZXMKLSAqLwotCi1zdHJ1Y3QgVGh1bmtEYXRhQ29tbW9uCi17Ci0gICAgY2hhciAgICAgICAgICAgICAgICAgICBtYWdpY1s0XTsgICAgICAgICAvKiAwMCAqLwotICAgIERXT1JEICAgICAgICAgICAgICAgICAgY2hlY2tzdW07ICAgICAgICAgLyogMDQgKi8KLX07Ci0KLXN0cnVjdCBUaHVua0RhdGFMUzE2Ci17Ci0gICAgc3RydWN0IFRodW5rRGF0YUNvbW1vbiBjb21tb247ICAgICAgICAgICAvKiAwMCAqLwotICAgIFNFR1BUUiAgICAgICAgICAgICAgICAgdGFyZ2V0VGFibGU7ICAgICAgLyogMDggKi8KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgIGZpcnN0VGltZTsgICAgICAgIC8qIDBDICovCi19OwotCi1zdHJ1Y3QgVGh1bmtEYXRhTFMzMgotewotICAgIHN0cnVjdCBUaHVua0RhdGFDb21tb24gY29tbW9uOyAgICAgICAgICAgLyogMDAgKi8KLSAgICBEV09SRCAqICAgICAgICAgICAgICAgIHRhcmdldFRhYmxlOyAgICAgIC8qIDA4ICovCi0gICAgY2hhciAgICAgICAgICAgICAgICAgICBsYXRlQmluZGluZ1s0XTsgICAvKiAwQyAqLwotICAgIERXT1JEICAgICAgICAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgICAgLyogMTAgKi8KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgIHJlc2VydmVkMTsgICAgICAgIC8qIDE0ICovCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICByZXNlcnZlZDI7ICAgICAgICAvKiAxOCAqLwotICAgIERXT1JEICAgICAgICAgICAgICAgICAgb2Zmc2V0UVRUaHVuazsgICAgLyogMUMgKi8KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgIG9mZnNldEZUUHJvbG9nOyAgIC8qIDIwICovCi19OwotCi1zdHJ1Y3QgVGh1bmtEYXRhU0wxNgotewotICAgIHN0cnVjdCBUaHVua0RhdGFDb21tb24gY29tbW9uOyAgICAgICAgICAgIC8qIDAwICovCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICBmbGFnczE7ICAgICAgICAgICAgLyogMDggKi8KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgIHJlc2VydmVkMTsgICAgICAgICAvKiAwQyAqLwotICAgIHN0cnVjdCBUaHVua0RhdGFTTCAqICAgZnBEYXRhOyAgICAgICAgICAgIC8qIDEwICovCi0gICAgU0VHUFRSICAgICAgICAgICAgICAgICBzcERhdGE7ICAgICAgICAgICAgLyogMTQgKi8KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgIHJlc2VydmVkMjsgICAgICAgICAvKiAxOCAqLwotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgbGF0ZUJpbmRpbmdbNF07ICAgIC8qIDFDICovCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICBmbGFnczI7ICAgICAgICAgICAgLyogMjAgKi8KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgIHJlc2VydmVkMzsgICAgICAgICAvKiAyMCAqLwotICAgIFNFR1BUUiAgICAgICAgICAgICAgICAgYXBpRGF0YWJhc2U7ICAgICAgIC8qIDI4ICovCi19OwotCi1zdHJ1Y3QgVGh1bmtEYXRhU0wzMgotewotICAgIHN0cnVjdCBUaHVua0RhdGFDb21tb24gY29tbW9uOyAgICAgICAgICAgIC8qIDAwICovCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICByZXNlcnZlZDE7ICAgICAgICAgLyogMDggKi8KLSAgICBzdHJ1Y3QgVGh1bmtEYXRhU0wgKiAgIGRhdGE7ICAgICAgICAgICAgICAvKiAwQyAqLwotICAgIGNoYXIgICAgICAgICAgICAgICAgICAgbGF0ZUJpbmRpbmdbNF07ICAgIC8qIDEwICovCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgICAgLyogMTQgKi8KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgIHJlc2VydmVkMjsgICAgICAgICAvKiAxOCAqLwotICAgIERXT1JEICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQzOyAgICAgICAgIC8qIDFDICovCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICBvZmZzZXRUYXJnZXRUYWJsZTsgLyogMjAgKi8KLX07Ci0KLXN0cnVjdCBUaHVua0RhdGFTTAotewotI2lmIDAKLSAgICBUaGlzIHN0cnVjdHVyZSBkaWZmZXJzIGZyb20gdGhlIFdpbjk1IG9yaWdpbmFsLAotICAgIGJ1dCB0aGlzIHNob3VsZCBub3QgbWF0dGVyIHNpbmNlIGl0IGlzIHN0cmljdGx5IGludGVybmFsIHRvIAotICAgIHRoZSB0aHVuayBoYW5kbGluZyByb3V0aW5lcyBpbiBLUk5MMzg2IC8gS0VSTkVMMzIuCi0KLSAgICBGb3IgcmVmZXJlbmNlLCBoZXJlIGlzIHRoZSBXaW45NSBsYXlvdXQ6Ci0KLSAgICBzdHJ1Y3QgVGh1bmtEYXRhQ29tbW9uIGNvbW1vbjsgICAgICAgICAgICAvKiAwMCAqLwotICAgIERXT1JEICAgICAgICAgICAgICAgICAgZmxhZ3MxOyAgICAgICAgICAgIC8qIDA4ICovCi0gICAgU0VHUFRSICAgICAgICAgICAgICAgICBhcGlEYXRhYmFzZTsgICAgICAgLyogMEMgKi8KLSAgICBXT1JEICAgICAgICAgICAgICAgICAgIGV4ZVB0cjsgICAgICAgICAgICAvKiAxMCAqLwotICAgIFdPUkQgICAgICAgICAgICAgICAgICAgc2VnTUJBOyAgICAgICAgICAgIC8qIDEyICovCi0gICAgRFdPUkQgICAgICAgICAgICAgICAgICBsZW5NQkFUb3RhbDsgICAgICAgLyogMTQgKi8KLSAgICBEV09SRCAgICAgICAgICAgICAgICAgIGxlbk1CQVVzZWQ7ICAgICAgICAvKiAxOCAqLwotICAgIERXT1JEICAgICAgICAgICAgICAgICAgZmxhZ3MyOyAgICAgICAgICAgIC8qIDFDICovCi0gICAgY2hhciAgICAgICAgICAgICAgICAgICBwc3pEbGwxNlsyNTZdOyAgICAgLyogMjAgKi8KLSAgICBjaGFyICAgICAgICAgICAgICAgICAgIHBzekRsbDMyWzI1Nl07ICAgICAvKjEyMCAqLwotICAKLSAgICBXZSBkbyBpdCBkaWZmZXJlbnRseSBzaW5jZSBhbGwgb3VyIHRodW5rIGhhbmRsaW5nIGlzIGRvbmUKLSAgICBieSAzMi1iaXQgY29kZS4gVGhlcmVmb3JlIHdlIGRvIG5vdCBuZWVkIGRvIHByb3ZpZGUKLSAgICBlYXN5IGFjY2VzcyB0byB0aGlzIGRhdGEsIGVzcGVjaWFsbHkgdGhlIHByb2Nlc3MgdGFyZ2V0Ci0gICAgdGFibGUgZGF0YWJhc2UsIGZvciAxNi1iaXQgY29kZS4KLSNlbmRpZgotICAgIAotICAgIHN0cnVjdCBUaHVua0RhdGFDb21tb24gY29tbW9uOwotICAgIERXT1JEICAgICAgICAgICAgICAgICAgZmxhZ3MxOwotICAgIHN0cnVjdCBTTEFwaURCICogICAgICAgYXBpREI7Ci0gICAgc3RydWN0IFNMVGFyZ2V0REIgKiAgICB0YXJnZXREQjsKLSAgICBEV09SRCAgICAgICAgICAgICAgICAgIGZsYWdzMjsKLSAgICBjaGFyICAgICAgICAgICAgICAgICAgIHBzekRsbDE2WzI1Nl07Ci0gICAgY2hhciAgICAgICAgICAgICAgICAgICBwc3pEbGwzMlsyNTZdOwotfTsKLQotc3RydWN0IFNMVGFyZ2V0REIKLXsKLSAgICAgc3RydWN0IFNMVGFyZ2V0REIgKiAgIG5leHQ7Ci0gICAgIFBEQjMyICogICAgICAgICAgICAgICBwcm9jZXNzOwotICAgICBEV09SRCAqICAgICAgICAgICAgICAgdGFyZ2V0VGFibGU7Ci19OwotCi1zdHJ1Y3QgU0xBcGlEQgotewotICAgIERXT1JEICAgICAgICAgICAgICAgICAgbnJBcmdCeXRlczsKLSAgICBEV09SRCAgICAgICAgICAgICAgICAgIGVycm9yUmV0dXJuVmFsdWU7Ci19OwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRUaHVua1N0dWZmICAgIChLRVJORUwzMi41MykKICAqLwpAQCAtMjkyLDkzICsxODksNiBAQAogICAgIHJldHVybiAxOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQlUaHVua0Nvbm5lY3QxNgkJKEtFUk5FTC42NTEpCi0gKiBDb25uZWN0cyBhIDMyYml0IGFuZCBhIDE2Yml0IHRodW5rYnVmZmVyLgotICovCi1VSU5UMzIgV0lOQVBJIFRodW5rQ29ubmVjdDE2KCAKLQlMUFNUUiBtb2R1bGUxNiwgICAgICAgICAgICAgIC8qIFtpbl0gbmFtZSBvZiB3aW4xNiBkbGwgKi8KLQlMUFNUUiBtb2R1bGUzMiwgICAgICAgICAgICAgIC8qIFtpbl0gbmFtZSBvZiB3aW4zMiBkbGwgKi8KLQlISU5TVEFOQ0UxNiBoSW5zdDE2LCAgICAgICAgIC8qIFtpbl0gaEluc3Qgb2Ygd2luMTYgZGxsICovCi0JRFdPUkQgZHdSZWFzb24sICAgICAgICAgICAgICAvKiBbaW5dIGluaXRpYWxpc2F0aW9uIGFyZ3VtZW50ICovCi0Jc3RydWN0IFRodW5rRGF0YUNvbW1vbiAqVEQsICAvKiBbaW4vb3V0XSB0aHVua2J1ZmZlciAqLwotCUxQU1RSIHRodW5rZnVuMzIsICAgICAgICAgICAgLyogW2luXSB3aW4zMiB0aHVua2Z1bmN0aW9uICovCi0gICAgICAgIFdPUkQgQ1MgICAgICAgICAgICAgICAgICAgICAgLyogW2luXSBDUyBvZiB3aW4xNiBkbGwgKi8KLSkgewotICAgIEJPT0wzMiBkaXJlY3Rpb25TTDsKLQotICAgIGlmICghbHN0cm5jbXAzMkEoVEQtPm1hZ2ljLCAiU0wwMSIsIDQpKQotICAgIHsKLSAgICAgICAgZGlyZWN0aW9uU0wgPSBUUlVFOwotCi0gICAgICAgIFRSQUNFKHRodW5rLCAiU0wwMSB0aHVuayAlcyAoJWx4KSAtPiAlcyAoJXMpLCBSZWFzb246ICVsZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgIG1vZHVsZTE2LCAoRFdPUkQpVEQsIG1vZHVsZTMyLCB0aHVua2Z1bjMyLCBkd1JlYXNvbik7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFsc3RybmNtcDMyQShURC0+bWFnaWMsICJMUzAxIiwgNCkpCi0gICAgewotICAgICAgICBkaXJlY3Rpb25TTCA9IEZBTFNFOwotCi0gICAgICAgIFRSQUNFKHRodW5rLCAiTFMwMSB0aHVuayAlcyAoJWx4KSA8LSAlcyAoJXMpLCBSZWFzb246ICVsZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgIG1vZHVsZTE2LCAoRFdPUkQpVEQsIG1vZHVsZTMyLCB0aHVua2Z1bjMyLCBkd1JlYXNvbik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEVSUih0aHVuaywgIkludmFsaWQgbWFnaWMgJWMlYyVjJWNcbiIsIAotICAgICAgICAgICAgICAgICAgIFRELT5tYWdpY1swXSwgVEQtPm1hZ2ljWzFdLCBURC0+bWFnaWNbMl0sIFRELT5tYWdpY1szXSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICBzd2l0Y2ggKGR3UmVhc29uKQotICAgIHsKLSAgICAgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6Ci0gICAgICAgICAgICBpZiAoZGlyZWN0aW9uU0wpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IFRodW5rRGF0YVNMMTYgKlNMMTYgPSAoc3RydWN0IFRodW5rRGF0YVNMMTYgKilURDsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgVGh1bmtEYXRhU0wgICAqU0wgICA9IFNMMTYtPmZwRGF0YTsKLQotICAgICAgICAgICAgICAgIGlmIChTTCA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU0wgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKCpTTCkpOwotCi0gICAgICAgICAgICAgICAgICAgIFNMLT5jb21tb24gICA9IFNMMTYtPmNvbW1vbjsKLSAgICAgICAgICAgICAgICAgICAgU0wtPmZsYWdzMSAgID0gU0wxNi0+ZmxhZ3MxOwotICAgICAgICAgICAgICAgICAgICBTTC0+ZmxhZ3MyICAgPSBTTDE2LT5mbGFnczI7Ci0KLSAgICAgICAgICAgICAgICAgICAgU0wtPmFwaURCICAgID0gUFRSX1NFR19UT19MSU4oU0wxNi0+YXBpRGF0YWJhc2UpOwotICAgICAgICAgICAgICAgICAgICBTTC0+dGFyZ2V0REIgPSBOVUxMOwotCi0gICAgICAgICAgICAgICAgICAgIGxzdHJjcHluMzJBKFNMLT5wc3pEbGwxNiwgbW9kdWxlMTYsIDI1NSk7Ci0gICAgICAgICAgICAgICAgICAgIGxzdHJjcHluMzJBKFNMLT5wc3pEbGwzMiwgbW9kdWxlMzIsIDI1NSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogV2Ugc2hvdWxkIGNyZWF0ZSBhIFNFR1BUUiB0byB0aGUgVGh1bmtEYXRhU0wsCi0gICAgICAgICAgICAgICAgICAgICAgIGJ1dCBzaW5jZSB0aGUgY29udGVudHMgYXJlIG5vdCBpbiB0aGUgb3JpZ2luYWwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICBhbnkgYWNjZXNzIHRvIHRoaXMgYnkgMTYtYml0IGNvZGUgd291bGQgY3Jhc2ggYW55d2F5LiAqLwotICAgICAgICAgICAgICAgICAgICBTTDE2LT5zcERhdGEgPSAwOwotICAgICAgICAgICAgICAgICAgICBTTDE2LT5mcERhdGEgPSBTTDsKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIGlmIChTTC0+ZmxhZ3MyICYgMHg4MDAwMDAwMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFRSQUNFKHRodW5rLCAiUHJlbG9hZGluZyAzMi1iaXQgbGlicmFyeVxuIik7Ci0gICAgICAgICAgICAgICAgICAgIExvYWRMaWJyYXJ5MzJBKG1vZHVsZTMyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogbm90aGluZyB0byBkbyAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6Ci0gICAgICAgICAgICAvKiBGSVhNRTogY2xlYW51cCAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJUVRfVGh1bmsJCQkoS0VSTkVMMzIpCiAgKgpAQCAtMzg3LDcgKzE5Nyw3IEBACiAgKiBUaGUgbnVtYmVyIG9mIDE2Yml0IGFyZ3VtZW50Ynl0ZXMgaXMgRUJQLUVTUC0weDQ0ICg2OCBCeXRlIHRodW5rc2V0dXApLgogICogW29rXQogICovCi1WT0lEIFdJTkFQSSBRVF9UaHVuayhDT05URVhUICpjb250ZXh0KQorUkVHU19FTlRSWVBPSU5UKFFUX1RodW5rKQogewogICAgIENPTlRFWFQgY29udGV4dDE2OwogICAgIERXT1JEIGFyZ3NpemU7CkBAIC00NTMsMTYgKzI2MywxMyBAQAogICogICAgICAgICAKICAqLwogCi0jZGVmaW5lIFBPUF9EV09SRChjdHgpCQkoKigoRFdPUkQgKilFU1BfcmVnKGN0eCkpKyspCi0jZGVmaW5lIFBVU0hfRFdPUkQoY3R4LCB2YWwpIAkqLS0oKERXT1JEICopRVNQX3JlZyhjdHgpKSA9ICh2YWwpCi0KLVZPSUQgV0lOQVBJIEZUX1Byb2xvZyhDT05URVhUICpjb250ZXh0KQorUkVHU19FTlRSWVBPSU5UKEZUX1Byb2xvZykKIHsKICAgICAvKiBQb3AgcmV0dXJuIGFkZHJlc3MgdG8gdGh1bmsgY29kZSAqLwotICAgIEVJUF9yZWcoY29udGV4dCkgPSBQT1BfRFdPUkQoY29udGV4dCk7CisgICAgRUlQX3JlZyhjb250ZXh0KSA9IFNUQUNLMzJfUE9QKGNvbnRleHQpOwogCiAgICAgLyogQnVpbGQgc3RhY2sgZnJhbWUgKi8KLSAgICBQVVNIX0RXT1JEKGNvbnRleHQsIEVCUF9yZWcoY29udGV4dCkpOworICAgIFNUQUNLMzJfUFVTSChjb250ZXh0LCBFQlBfcmVnKGNvbnRleHQpKTsKICAgICBFQlBfcmVnKGNvbnRleHQpID0gRVNQX3JlZyhjb250ZXh0KTsKIAogICAgIC8qIEFsbG9jYXRlIDY0LWJ5dGUgVGh1bmsgQnVmZmVyICovCkBAIC00ODAsNyArMjg3LDcgQEAKICAgICAqKERXT1JEICopKEVCUF9yZWcoY29udGV4dCkgLSA1MikgPSBFRFhfcmVnKGNvbnRleHQpOwogICAgIAogICAgIC8qIFB1c2ggcmV0dXJuIGFkZHJlc3MgYmFjayBvbnRvIHN0YWNrICovCi0gICAgUFVTSF9EV09SRChjb250ZXh0LCBFSVBfcmVnKGNvbnRleHQpKTsKKyAgICBTVEFDSzMyX1BVU0goY29udGV4dCwgRUlQX3JlZyhjb250ZXh0KSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01MDQsNyArMzExLDcgQEAKICAqICAgICAgICBzdWZmaWNpZW50IC4uLgogICovCiAKLVZPSUQgV0lOQVBJIEZUX1RodW5rKENPTlRFWFQgKmNvbnRleHQpCitSRUdTX0VOVFJZUE9JTlQoRlRfVGh1bmspCiB7CiAgICAgRFdPUkQgbWFwRVNQcmVsYXRpdmUgPSAqKERXT1JEICopKEVCUF9yZWcoY29udGV4dCkgLSAyMCk7CiAgICAgRFdPUkQgY2FsbFRhcmdldCAgICAgPSAqKERXT1JEICopKEVCUF9yZWcoY29udGV4dCkgLSA1Mik7CkBAIC01NDksNyArMzU2LDcgQEAKICAqIHRoZSBnaXZlbiBudW1iZXIgb2YgYXJndW1lbnRzIGZyb20gdGhlIGNhbGxlcidzIHN0YWNrKS4KICAqLwogCi1WT0lEIFdJTkFQSSBGVF9FeGl0KENPTlRFWFQgKmNvbnRleHQsIGludCBuUG9wQXJncykKK3N0YXRpYyB2b2lkIEZUX0V4aXQoQ09OVEVYVCAqY29udGV4dCwgaW50IG5Qb3BBcmdzKQogewogICAgIC8qIFJldHVybiB2YWx1ZSBpcyBpbiBFQlggKi8KICAgICBFQVhfcmVnKGNvbnRleHQpID0gRUJYX3JlZyhjb250ZXh0KTsKQEAgLTU2MSwzMSArMzY4LDMxIEBACiAKICAgICAvKiBDbGVhbiB1cCBzdGFjayBmcmFtZSAqLwogICAgIEVTUF9yZWcoY29udGV4dCkgPSBFQlBfcmVnKGNvbnRleHQpOwotICAgIEVCUF9yZWcoY29udGV4dCkgPSBQT1BfRFdPUkQoY29udGV4dCk7CisgICAgRUJQX3JlZyhjb250ZXh0KSA9IFNUQUNLMzJfUE9QKGNvbnRleHQpOwogCiAgICAgLyogUG9wIHJldHVybiBhZGRyZXNzIHRvIENBTExFUiBvZiB0aHVuayBjb2RlICovCi0gICAgRUlQX3JlZyhjb250ZXh0KSA9IFBPUF9EV09SRChjb250ZXh0KTsKKyAgICBFSVBfcmVnKGNvbnRleHQpID0gU1RBQ0szMl9QT1AoY29udGV4dCk7CiAgICAgLyogUmVtb3ZlIGFyZ3VtZW50cyAqLwogICAgIEVTUF9yZWcoY29udGV4dCkgKz0gblBvcEFyZ3M7CiAgICAgLyogUHVzaCByZXR1cm4gYWRkcmVzcyBiYWNrIG9udG8gc3RhY2sgKi8KLSAgICBQVVNIX0RXT1JEKGNvbnRleHQsIEVJUF9yZWcoY29udGV4dCkpOworICAgIFNUQUNLMzJfUFVTSChjb250ZXh0LCBFSVBfcmVnKGNvbnRleHQpKTsKIH0KIAotVk9JRCBXSU5BUEkgRlRfRXhpdDAgKENPTlRFWFQgKmNvbnRleHQpIHsgRlRfRXhpdChjb250ZXh0LCAgMCk7IH0KLVZPSUQgV0lOQVBJIEZUX0V4aXQ0IChDT05URVhUICpjb250ZXh0KSB7IEZUX0V4aXQoY29udGV4dCwgIDQpOyB9Ci1WT0lEIFdJTkFQSSBGVF9FeGl0OCAoQ09OVEVYVCAqY29udGV4dCkgeyBGVF9FeGl0KGNvbnRleHQsICA4KTsgfQotVk9JRCBXSU5BUEkgRlRfRXhpdDEyKENPTlRFWFQgKmNvbnRleHQpIHsgRlRfRXhpdChjb250ZXh0LCAxMik7IH0KLVZPSUQgV0lOQVBJIEZUX0V4aXQxNihDT05URVhUICpjb250ZXh0KSB7IEZUX0V4aXQoY29udGV4dCwgMTYpOyB9Ci1WT0lEIFdJTkFQSSBGVF9FeGl0MjAoQ09OVEVYVCAqY29udGV4dCkgeyBGVF9FeGl0KGNvbnRleHQsIDIwKTsgfQotVk9JRCBXSU5BUEkgRlRfRXhpdDI0KENPTlRFWFQgKmNvbnRleHQpIHsgRlRfRXhpdChjb250ZXh0LCAyNCk7IH0KLVZPSUQgV0lOQVBJIEZUX0V4aXQyOChDT05URVhUICpjb250ZXh0KSB7IEZUX0V4aXQoY29udGV4dCwgMjgpOyB9Ci1WT0lEIFdJTkFQSSBGVF9FeGl0MzIoQ09OVEVYVCAqY29udGV4dCkgeyBGVF9FeGl0KGNvbnRleHQsIDMyKTsgfQotVk9JRCBXSU5BUEkgRlRfRXhpdDM2KENPTlRFWFQgKmNvbnRleHQpIHsgRlRfRXhpdChjb250ZXh0LCAzNik7IH0KLVZPSUQgV0lOQVBJIEZUX0V4aXQ0MChDT05URVhUICpjb250ZXh0KSB7IEZUX0V4aXQoY29udGV4dCwgNDApOyB9Ci1WT0lEIFdJTkFQSSBGVF9FeGl0NDQoQ09OVEVYVCAqY29udGV4dCkgeyBGVF9FeGl0KGNvbnRleHQsIDQ0KTsgfQotVk9JRCBXSU5BUEkgRlRfRXhpdDQ4KENPTlRFWFQgKmNvbnRleHQpIHsgRlRfRXhpdChjb250ZXh0LCA0OCk7IH0KLVZPSUQgV0lOQVBJIEZUX0V4aXQ1MihDT05URVhUICpjb250ZXh0KSB7IEZUX0V4aXQoY29udGV4dCwgNTIpOyB9Ci1WT0lEIFdJTkFQSSBGVF9FeGl0NTYoQ09OVEVYVCAqY29udGV4dCkgeyBGVF9FeGl0KGNvbnRleHQsIDU2KTsgfQorUkVHU19FTlRSWVBPSU5UKEZUX0V4aXQwKSAgeyBGVF9FeGl0KGNvbnRleHQsICAwKTsgfQorUkVHU19FTlRSWVBPSU5UKEZUX0V4aXQ0KSAgeyBGVF9FeGl0KGNvbnRleHQsICA0KTsgfQorUkVHU19FTlRSWVBPSU5UKEZUX0V4aXQ4KSAgeyBGVF9FeGl0KGNvbnRleHQsICA4KTsgfQorUkVHU19FTlRSWVBPSU5UKEZUX0V4aXQxMikgeyBGVF9FeGl0KGNvbnRleHQsIDEyKTsgfQorUkVHU19FTlRSWVBPSU5UKEZUX0V4aXQxNikgeyBGVF9FeGl0KGNvbnRleHQsIDE2KTsgfQorUkVHU19FTlRSWVBPSU5UKEZUX0V4aXQyMCkgeyBGVF9FeGl0KGNvbnRleHQsIDIwKTsgfQorUkVHU19FTlRSWVBPSU5UKEZUX0V4aXQyNCkgeyBGVF9FeGl0KGNvbnRleHQsIDI0KTsgfQorUkVHU19FTlRSWVBPSU5UKEZUX0V4aXQyOCkgeyBGVF9FeGl0KGNvbnRleHQsIDI4KTsgfQorUkVHU19FTlRSWVBPSU5UKEZUX0V4aXQzMikgeyBGVF9FeGl0KGNvbnRleHQsIDMyKTsgfQorUkVHU19FTlRSWVBPSU5UKEZUX0V4aXQzNikgeyBGVF9FeGl0KGNvbnRleHQsIDM2KTsgfQorUkVHU19FTlRSWVBPSU5UKEZUX0V4aXQ0MCkgeyBGVF9FeGl0KGNvbnRleHQsIDQwKTsgfQorUkVHU19FTlRSWVBPSU5UKEZUX0V4aXQ0NCkgeyBGVF9FeGl0KGNvbnRleHQsIDQ0KTsgfQorUkVHU19FTlRSWVBPSU5UKEZUX0V4aXQ0OCkgeyBGVF9FeGl0KGNvbnRleHQsIDQ4KTsgfQorUkVHU19FTlRSWVBPSU5UKEZUX0V4aXQ1MikgeyBGVF9FeGl0KGNvbnRleHQsIDUyKTsgfQorUkVHU19FTlRSWVBPSU5UKEZUX0V4aXQ1NikgeyBGVF9FeGl0KGNvbnRleHQsIDU2KTsgfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03MTEsNyArNTE4LDcgQEAKICAqICAgICAgICAoVGhvc2UgdHdvIHZhbHVlcyBzaG91bGQgYmUgZXF1YWwgYW55d2F5IC4uLj8pCiAgKiAKICAqLwotVk9JRCBXSU5BUEkgQ29tbW9uMzJUaGtMUyhDT05URVhUICpjb250ZXh0KQorUkVHU19FTlRSWVBPSU5UKENvbW1vbjMyVGhrTFMpCiB7CiAgICAgQ09OVEVYVCBjb250ZXh0MTY7CiAgICAgRFdPUkQgYXJnc2l6ZTsKQEAgLTczNCw5ICs1NDEsOSBAQAogCiAgICAgLyogQ2xlYW4gdXAgY2FsbGVyJ3Mgc3RhY2sgZnJhbWUgKi8KIAotICAgIEVJUF9yZWcoY29udGV4dCkgPSBQT1BfRFdPUkQoY29udGV4dCk7CisgICAgRUlQX3JlZyhjb250ZXh0KSA9IFNUQUNLMzJfUE9QKGNvbnRleHQpOwogICAgIEVTUF9yZWcoY29udGV4dCkgKz0gYXJnc2l6ZTsKLSAgICBQVVNIX0RXT1JEKGNvbnRleHQsIEVJUF9yZWcoY29udGV4dCkpOworICAgIFNUQUNLMzJfUFVTSChjb250ZXh0LCBFSVBfcmVnKGNvbnRleHQpKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03NjYsNyArNTczLDcgQEAKICAqIChOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBzZWVtcyBvbmx5IHRvIGJlIHVzZWQgZm9yCiAgKiAgT0xFQ0xJMzIgLT4gT0xFQ0xJIGFuZCBPTEVTVlIzMiAtPiBPTEVTVlIgdGh1bmtpbmcuKQogICovCi1WT0lEIFdJTkFQSSBPVF8zMlRoa0xTRihDT05URVhUICpjb250ZXh0KQorUkVHU19FTlRSWVBPSU5UKE9UXzMyVGhrTFNGKQogewogICAgIENPTlRFWFQgY29udGV4dDE2OwogICAgIERXT1JEIGFyZ3NpemU7CkBAIC04OTEsMTAgKzY5OCwxMCBAQAogICogTm90ZTogVGhlIHR3byBEV09SRCBhcmd1bWVudHMgZ2V0IHBvcHBlZCBmcm9tIHRoZSBzdGFjay4KICAqICAgICAgICAKICAqLwotVk9JRCBXSU5BUEkgRlRfUHJvbG9nUHJpbWUoQ09OVEVYVCAqY29udGV4dCkKK1JFR1NfRU5UUllQT0lOVChGVF9Qcm9sb2dQcmltZSkKIHsKLSAgICBEV09SRCAgdGFyZ2V0VGFibGVPZmZzZXQgPSBQT1BfRFdPUkQoY29udGV4dCk7Ci0gICAgTFBCWVRFIHJlbGF5Q29kZSA9IChMUEJZVEUpUE9QX0RXT1JEKGNvbnRleHQpOworICAgIERXT1JEICB0YXJnZXRUYWJsZU9mZnNldCA9IFNUQUNLMzJfUE9QKGNvbnRleHQpOworICAgIExQQllURSByZWxheUNvZGUgPSAoTFBCWVRFKVNUQUNLMzJfUE9QKGNvbnRleHQpOwogICAgIERXT1JEICp0YXJnZXRUYWJsZSA9ICooRFdPUkQgKiopKHJlbGF5Q29kZSt0YXJnZXRUYWJsZU9mZnNldCk7CiAgICAgRFdPUkQgIHRhcmdldE5yID0gTE9CWVRFKEVDWF9yZWcoY29udGV4dCkpOwogCkBAIC05MDMsNyArNzEwLDcgQEAKICAgICAvKiBXZSBzaG91bGQgYWN0dWFsbHkgY2FsbCB0aGUgcmVsYXkgY29kZSBub3csICovCiAgICAgLyogYnV0IHdlIHNraXAgaXQgYW5kIGdvIGRpcmVjdGx5IHRvIEZUX1Byb2xvZyAqLwogICAgIEVEWF9yZWcoY29udGV4dCkgPSB0YXJnZXRUYWJsZVt0YXJnZXROcl07Ci0gICAgRlRfUHJvbG9nKGNvbnRleHQpOworICAgIF9fcmVnc19GVF9Qcm9sb2coY29udGV4dCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTE3LDcgKzcyNCw3IEBACiAgKiAgICAgICAgIEVBWCAgICBzdGFydCBvZiByZWxheSBjb2RlCiAgKiAgICAgIAogICovCi1WT0lEIFdJTkFQSSBRVF9UaHVua1ByaW1lKENPTlRFWFQgKmNvbnRleHQpCitSRUdTX0VOVFJZUE9JTlQoUVRfVGh1bmtQcmltZSkKIHsKICAgICBEV09SRCAgdGFyZ2V0VGFibGVPZmZzZXQgPSBFRFhfcmVnKGNvbnRleHQpOwogICAgIExQQllURSByZWxheUNvZGUgPSAoTFBCWVRFKUVBWF9yZWcoY29udGV4dCk7CkBAIC05MjksNyArNzM2LDcgQEAKICAgICAvKiBXZSBzaG91bGQgYWN0dWFsbHkgY2FsbCB0aGUgcmVsYXkgY29kZSBub3csICovCiAgICAgLyogYnV0IHdlIHNraXAgaXQgYW5kIGdvIGRpcmVjdGx5IHRvIFFUX1RodW5rICovCiAgICAgRURYX3JlZyhjb250ZXh0KSA9IHRhcmdldFRhYmxlW3RhcmdldE5yXTsKLSAgICBRVF9UaHVuayhjb250ZXh0KTsKKyAgICBfX3JlZ3NfUVRfVGh1bmsoY29udGV4dCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTA0MCw3ICs4NDcsNyBAQAogICAgIGNhc2UgNDg6CXJldCA9IGZ1bihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSxhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XSxhcmdzWzldLGFyZ3NbMTBdLGFyZ3NbMTFdKTsKIAkJYnJlYWs7CiAgICAgZGVmYXVsdDoKLQlmcHJpbnRmKHN0ZGVyciwiX0tFUk5FTDMyXzg4OiB1bnN1cHBvcnRlZCBuciBvZiBhcmd1bWVudHMsICVsZFxuIixucik7CisJV0FSTih0aHVuaywiVW5zdXBwb3J0ZWQgbnIgb2YgYXJndW1lbnRzLCAlbGRcbiIsbnIpOwogCXJldCA9IDA7CiAJYnJlYWs7CiAKQEAgLTEwNTUsNyArODYyLDcgQEAKICAqLwogV09SRCBXSU5BUEkgX0tFUk5FTF82MTkoV09SRCB4LERXT1JEIHksRFdPUkQgeikKIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwiS0VSTkVMXzYxOSgweCUwNHgsMHglMDhseCwweCUwOGx4KVxuIix4LHkseik7CisgICAgRklYTUUodGh1bmssIigweCUwNHgsMHglMDhseCwweCUwOGx4KTogc3R1YlxuIix4LHkseik7CiAgICAgcmV0dXJuIHg7CiB9CiAKQEAgLTExNjgsNyArOTc1LDcgQEAKIEZyZWVTTENhbGxiYWNrKAogCURXT1JEIHgJLyogW2luXSAxNiBiaXQgY2FsbGJhY2sgKHNlZ21lbnRlZCBwb2ludGVyPykgKi8KICkgewotCWZwcmludGYoc3RkZXJyLCJGcmVlU0xDYWxsYmFjaygweCUwOGx4KVxuIix4KTsKKwlGSVhNRSh3aW4zMiwiKDB4JTA4bHgpOiBzdHViXG4iLHgpOwogfQogCiAKQEAgLTExOTAsNyArOTk3LDcgQEAKICAqLwogVk9JRCBXSU5BUEkKIF9LRVJORUxfNDcyKENPTlRFWFQgKmNvbnRleHQpIHsKLQlmcHJpbnRmKHN0ZGVyciwiX0tFUk5FTF80NzIoMHglMDhseCksc3R1YlxuIixFQVhfcmVnKGNvbnRleHQpKTsKKwlGSVhNRSh3aW4zMiwiKDB4JTA4bHgpOiBzdHViXG4iLEVBWF9yZWcoY29udGV4dCkpOwogCWlmICghRUFYX3JlZyhjb250ZXh0KSkgewogCQlUREIgKnBUYXNrID0gKFREQiopR2xvYmFsTG9jazE2KEdldEN1cnJlbnRUYXNrKCkpOwogCQlBWF9yZWcoY29udGV4dCk9cFRhc2stPmhJbnN0YW5jZTsKQEAgLTEyMjksNyArMTAzNiw3IEBACiAJCXJldHVybiBGQUxTRTsKIAl9CiAJaWYgKG16aC5lX21hZ2ljIT1JTUFHRV9ET1NfU0lHTkFUVVJFKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJmaWxlIGhhcyBub3QgZ290IGRvcyBzaWduYXR1cmUhXG4iKTsKKwkJV0FSTihkb3NtZW0sIkZpbGUgaGFzIG5vdCBnb3QgZG9zIHNpZ25hdHVyZSFcbiIpOwogCQlfbGNsb3NlMzIoaGYpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQpAQCAtMTI1NCwxNTggKzEwNjEsMTQgQEAKIAlXT1JEIGhhbmRsZSwJCS8qIFtpbl0gd2luMTYgaGFuZGxlICovCiAJV09XX0hBTkRMRV9UWVBFIHR5cGUJLyogW2luXSBoYW5kbGUgdHlwZSAqLwogKSB7Ci0JZnByaW50ZihzdGRlcnIsIldPV0hhbmRsZTMyKDB4JTA0eCwlZClcbiIsaGFuZGxlLHR5cGUpOworCVRSQUNFKHdpbjMyLCIoMHglMDR4LCVkKVxuIixoYW5kbGUsdHlwZSk7CiAJcmV0dXJuIChIQU5ETEUzMiloYW5kbGU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEMxNlRoa1NMCQkJCShLRVJORUwuNjMwKQotICovCi0KLXZvaWQgV0lOQVBJIEMxNlRoa1NMKENPTlRFWFQgKmNvbnRleHQpCi17Ci0gICAgZXh0ZXJuIHZvaWQgQ2FsbEZyb20xNl90X2xvbmdfKHZvaWQpOwotICAgIExQQllURSBzdHViID0gUFRSX1NFR19UT19MSU4oRUFYX3JlZyhjb250ZXh0KSksIHggPSBzdHViOwotICAgIFdPUkQgY3MsIGRzOwotICAgIEdFVF9DUyhjcyk7Ci0gICAgR0VUX0RTKGRzKTsKLQotICAgIC8qIFdlIHByb2R1Y2UgdGhlIGZvbGxvd2luZyBjb2RlOgotICAgICAqCi0gICAgICogICBtb3YgYXgsIF9fRkxBVERTCi0gICAgICogICBtb3YgZXMsIGF4Ci0gICAgICogICBtb3Z6eCBlY3gsIGN4Ci0gICAgICogICBtb3YgZWR4LCBlczpbZWN4ICsgJEVEWF0KLSAgICAgKiAgIHB1c2ggYnAKLSAgICAgKiAgIHB1c2ggZWR4Ci0gICAgICogICBjYWxsIF9fRkxBVENTOkNhbGxGcm9tMTZfdF9sb25nXwotICAgICAqLwotCi0gICAgKngrKyA9IDB4Qjg7ICooKFdPUkQgKil4KSsrID0gZHM7Ci0gICAgKngrKyA9IDB4OEU7ICp4KysgPSAweEMwOwotICAgICp4KysgPSAweDYwOyAqeCsrID0gMHgwRjsgKngrKyA9IDB4Qjc7ICp4KysgPSAweEM5OwotICAgICp4KysgPSAweDY3OyAqeCsrID0gMHg2NjsgKngrKyA9IDB4MjY7ICp4KysgPSAweDhCOwotICAgICAgICAgICAgICAgICAqeCsrID0gMHg5MTsgKigoRFdPUkQgKil4KSsrID0gRURYX3JlZyhjb250ZXh0KTsKLQotICAgICp4KysgPSAweDU1OwotICAgICp4KysgPSAweDY2OyAqeCsrID0gMHg1MjsKLSAgICAqeCsrID0gMHg2NjsgKngrKyA9IDB4OUE7ICooKERXT1JEICopeCkrKyA9IChEV09SRClDYWxsRnJvbTE2X3RfbG9uZ187Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChXT1JEICopeCkrKyA9IGNzOwotCi0gICAgLyogSnVtcCB0byB0aGUgc3R1YiBjb2RlIGp1c3QgY3JlYXRlZCAqLwotICAgIElQX3JlZyhjb250ZXh0KSA9IExPV09SRChFQVhfcmVnKGNvbnRleHQpKTsKLSAgICBDU19yZWcoY29udGV4dCkgPSBISVdPUkQoRUFYX3JlZyhjb250ZXh0KSk7Ci0KLSAgICAvKiBTaW5jZSBDMTZUaGtTTCBnb3QgY2FsbGVkIGJ5IGEgam1wLCB3ZSBuZWVkIHRvIGxlYXZlIHRoZQotICAgICAgIG9yZ2luYWwgcmV0dXJuIGFkZHJlc3Mgb24gdGhlIHN0YWNrICovCi0gICAgU1BfcmVnKGNvbnRleHQpIC09IDQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEMxNlRoa1NMMDEJCQkJKEtFUk5FTC42MzEpCi0gKi8KLQotdm9pZCBXSU5BUEkgQzE2VGhrU0wwMShDT05URVhUICpjb250ZXh0KQotewotICAgIExQQllURSBzdHViID0gUFRSX1NFR19UT19MSU4oRUFYX3JlZyhjb250ZXh0KSksIHggPSBzdHViOwotCi0gICAgaWYgKHN0dWIpCi0gICAgewotICAgICAgICBzdHJ1Y3QgVGh1bmtEYXRhU0wxNiAqU0wxNiA9IFBUUl9TRUdfVE9fTElOKEVEWF9yZWcoY29udGV4dCkpOwotICAgICAgICBzdHJ1Y3QgVGh1bmtEYXRhU0wgKnRkID0gU0wxNi0+ZnBEYXRhOwotCi0gICAgICAgIGV4dGVybiB2b2lkIENhbGxGcm9tMTZfdF9sb25nXyh2b2lkKTsKLSAgICAgICAgRFdPUkQgcHJvY0FkZHJlc3MgPSAoRFdPUkQpR2V0UHJvY0FkZHJlc3MxNihHZXRNb2R1bGVIYW5kbGUxNigiS0VSTkVMIiksIDYzMSk7Ci0gICAgICAgIFdPUkQgY3M7Ci0gICAgICAgIEdFVF9DUyhjcyk7Ci0KLSAgICAgICAgaWYgKCF0ZCkKLSAgICAgICAgewotICAgICAgICAgICAgRVJSKHRodW5rLCAiVGh1bmtDb25uZWN0MTYgd2FzIG5vdCBjYWxsZWQhXG4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFRSQUNFKHRodW5rLCAiQ3JlYXRpbmcgc3R1YiBmb3IgVGh1bmtEYXRhU0wgJTA4bHhcbiIsIChEV09SRCl0ZCk7Ci0KLQotICAgICAgICAvKiBXZSBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgY29kZToKLSAgICAgICAgICoKLSAgICAgICAgICogICB4b3IgZWF4LCBlYXgKLSAgICAgICAgICogICBtb3YgZWR4LCAkdGQKLSAgICAgICAgICogICBjYWxsIEMxNlRoa1NMMDEKLSAgICAgICAgICogICBwdXNoIGJwCi0gICAgICAgICAqICAgcHVzaCBlZHgKLSAgICAgICAgICogICBjYWxsIF9fRkxBVENTOkNhbGxGcm9tMTZfdF9sb25nXwotICAgICAgICAgKi8KLQotICAgICAgICAqeCsrID0gMHg2NjsgKngrKyA9IDB4MzM7ICp4KysgPSAweEMwOwotICAgICAgICAqeCsrID0gMHg2NjsgKngrKyA9IDB4QkE7ICooKERXT1JEICopeCkrKyA9IChEV09SRCl0ZDsKLSAgICAgICAgKngrKyA9IDB4OUE7ICooKERXT1JEICopeCkrKyA9IHByb2NBZGRyZXNzOwotCi0gICAgICAgICp4KysgPSAweDU1OwotICAgICAgICAqeCsrID0gMHg2NjsgKngrKyA9IDB4NTI7Ci0gICAgICAgICp4KysgPSAweDY2OyAqeCsrID0gMHg5QTsgKigoRFdPUkQgKil4KSsrID0gKERXT1JEKUNhbGxGcm9tMTZfdF9sb25nXzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChXT1JEICopeCkrKyA9IGNzOwotICAgICAgICAKLSAgICAgICAgLyogSnVtcCB0byB0aGUgc3R1YiBjb2RlIGp1c3QgY3JlYXRlZCAqLwotICAgICAgICBJUF9yZWcoY29udGV4dCkgPSBMT1dPUkQoRUFYX3JlZyhjb250ZXh0KSk7Ci0gICAgICAgIENTX3JlZyhjb250ZXh0KSA9IEhJV09SRChFQVhfcmVnKGNvbnRleHQpKTsKLQotICAgICAgICAvKiBTaW5jZSBDMTZUaGtTTDAxIGdvdCBjYWxsZWQgYnkgYSBqbXAsIHdlIG5lZWQgdG8gbGVhdmUgdGhlCi0gICAgICAgICAgIG9yZ2luYWwgcmV0dXJuIGFkZHJlc3Mgb24gdGhlIHN0YWNrICovCi0gICAgICAgIFNQX3JlZyhjb250ZXh0KSAtPSA0OwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAKLSAgICAgICAgc3RydWN0IFRodW5rRGF0YVNMICp0ZCA9IChzdHJ1Y3QgVGh1bmtEYXRhU0wgKilFRFhfcmVnKGNvbnRleHQpOwotICAgICAgICBEV09SRCB0YXJnZXROciA9IENYX3JlZyhjb250ZXh0KSAvIDQ7Ci0gICAgICAgIHN0cnVjdCBTTFRhcmdldERCICp0ZGI7Ci0KLSAgICAgICAgVFJBQ0UodGh1bmssICJQcm9jZXNzICUwOGx4IGNhbGxpbmcgdGFyZ2V0ICVsZCBvZiBUaHVua0RhdGFTTCAlMDhseFxuIiwgCi0gICAgICAgICAgICAgICAgICAgICAoRFdPUkQpUFJPQ0VTU19DdXJyZW50KCksIHRhcmdldE5yLCAoRFdPUkQpdGQpOwotCi0gICAgICAgIGZvciAodGRiID0gdGQtPnRhcmdldERCOyB0ZGI7IHRkYiA9IHRkYi0+bmV4dCkKLSAgICAgICAgICAgIGlmICh0ZGItPnByb2Nlc3MgPT0gUFJPQ0VTU19DdXJyZW50KCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKCF0ZGIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRSQUNFKHRodW5rLCAiTG9hZGluZyAzMi1iaXQgbGlicmFyeSAlc1xuIiwgdGQtPnBzekRsbDMyKTsKLSAgICAgICAgICAgIExvYWRMaWJyYXJ5MzJBKHRkLT5wc3pEbGwzMik7Ci0KLSAgICAgICAgICAgIGZvciAodGRiID0gdGQtPnRhcmdldERCOyB0ZGI7IHRkYiA9IHRkYi0+bmV4dCkKLSAgICAgICAgICAgICAgICBpZiAodGRiLT5wcm9jZXNzID09IFBST0NFU1NfQ3VycmVudCgpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0ZGIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVEWF9yZWcoY29udGV4dCkgPSB0ZGItPnRhcmdldFRhYmxlW3RhcmdldE5yXTsKLQotICAgICAgICAgICAgVFJBQ0UodGh1bmssICJDYWxsIHRhcmdldCBpcyAlMDhseFxuIiwgRURYX3JlZyhjb250ZXh0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBXT1JEICpzdGFjayA9IFBUUl9TRUdfT0ZGX1RPX0xJTihTU19yZWcoY29udGV4dCksIFNQX3JlZyhjb250ZXh0KSk7Ci0gICAgICAgICAgICBEWF9yZWcoY29udGV4dCkgPSBISVdPUkQodGQtPmFwaURCW3RhcmdldE5yXS5lcnJvclJldHVyblZhbHVlKTsKLSAgICAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IExPV09SRCh0ZC0+YXBpREJbdGFyZ2V0TnJdLmVycm9yUmV0dXJuVmFsdWUpOwotICAgICAgICAgICAgSVBfcmVnKGNvbnRleHQpID0gc3RhY2tbMl07Ci0gICAgICAgICAgICBDU19yZWcoY29udGV4dCkgPSBzdGFja1szXTsKLSAgICAgICAgICAgIFNQX3JlZyhjb250ZXh0KSArPSB0ZC0+YXBpREJbdGFyZ2V0TnJdLm5yQXJnQnl0ZXMgKyA0OwotCi0gICAgICAgICAgICAvKiBXaW45NSBhbGxvd3MgZGVsYXllZCBsb2FkaW5nIG9mIHRoZSAzMi1iaXQgRExMLgotICAgICAgICAgICAgICAgV2UgZG9uJ3QgZG8gdGhhdCBhdCB0aGUgbW9tZW50LiAqLwotICAgICAgICAgICAgRVJSKHRodW5rLCAiUHJvY2VzcyAlMDhseCBkaWQgbm90IFRodW5rQ29ubmVjdDMyICVzIHRvICVzXG4iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKVBST0NFU1NfQ3VycmVudCgpLCB0ZC0+cHN6RGxsMzIsIHRkLT5wc3pEbGwxNik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSzMyVGhrMTYzMlByb2xvZwkJCShLRVJORUwzMi40OTIpCiAgKi8KLVZPSUQgV0lOQVBJIEszMlRoazE2MzJQcm9sb2coQ09OVEVYVCAqY29udGV4dCkKK1JFR1NfRU5UUllQT0lOVChLMzJUaGsxNjMyUHJvbG9nKQogewogICAgTFBCWVRFIGNvZGUgPSAoTFBCWVRFKUVJUF9yZWcoY29udGV4dCkgLSA1OwogCkBAIC0xNDYzLDcgKzExMjYsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSzMyVGhrMTYzMkVwaWxvZwkJCShLRVJORUwzMi40OTEpCiAgKi8KLVZPSUQgV0lOQVBJIEszMlRoazE2MzJFcGlsb2coQ09OVEVYVCAqY29udGV4dCkKK1JFR1NfRU5UUllQT0lOVChLMzJUaGsxNjMyRXBpbG9nKQogewogICAgTFBCWVRFIGNvZGUgPSAoTFBCWVRFKUVJUF9yZWcoY29udGV4dCkgLSAxMzsKIApAQCAtMTQ5MiwzICsxMTU1LDExIEBACiAgICAgICAgICAgICAgICAgICAgRUJQX3JlZyhjb250ZXh0KSwgRVNQX3JlZyhjb250ZXh0KSwgdGhkYi0+Y3VyX3N0YWNrKTsKICAgIH0KIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVnhEQ2FsbAkJCShLRVJORUwzMi4xLTgpCisgKi8KK0RXT1JEIFdJTkFQSSBWeERDYWxsKERXT1JEIHgpIHsKKwlGSVhNRSh2eGQsIigweCUwOGx4KSwgc3R1YiFcbiIseCk7CisJcmV0dXJuIDB4ZmZmZmZmZmY7Cit9CmRpZmYgLS1naXQgYS93aW4zMi9uZXdmbnMuYyBiL3dpbjMyL25ld2Zucy5jCmluZGV4IGE4YzBhNjMuLjM3NmY0YTEgMTAwNjQ0Ci0tLSBhL3dpbjMyL25ld2Zucy5jCisrKyBiL3dpbjMyL25ld2Zucy5jCkBAIC03LDcgKzcsNiBAQAogLyogTWlzYy4gbmV3IGZ1bmN0aW9ucyAtIHRoZXkgc2hvdWxkIGJlIG1vdmVkIGludG8gYXBwcm9wcmlhdGUgZmlsZXMKIGF0IGEgbGF0ZXIgZGF0ZS4gKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTI4LDcgKzI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAvKkZBUlBST0MqLyBMUFZPSUQgcGZuVVQzMkNhbGxCYWNrLAogICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscEJ1ZmYpCiB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJVVFJlZ2lzdGVyKCUjeCwuLi4pOiBzdHViIVxuIixoTW9kdWxlKTsKKyAgICBGSVhNRSh1cGRvd24sICIoJSN4LC4uLik6IHN0dWJcbiIsaE1vZHVsZSk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTM3LDcgKzM2LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBVVFVuUmVnaXN0ZXIoSE1PRFVMRTMyIGhNb2R1bGUpCiB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJVVFVuUmVnaXN0ZXIoJSN4OiBzdHViIVxuIiwgaE1vZHVsZSk7CisgICAgRklYTUUodXBkb3duLCAiKCUjeC4uLik6IHN0dWJcbiIsIGhNb2R1bGUpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC02Niw2ICs2NSwxMSBAQAogCXJldHVybiBGQUxTRTsKIH0KIAorQk9PTDMyIFdJTkFQSSBGaW5kQ2xvc2VDaGFuZ2VOb3RpZmljYXRpb24oSEFORExFMzIgZmNuaGFuZGxlKSB7CisJRklYTUUoZmlsZSwiKCUwOHgpOiBzdHViIVxuIixmY25oYW5kbGUpOworCXJldHVybiBGQUxTRTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQlRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5IChLRVJORUwzMi41NjUpCiAgKi8KQEAgLTM1NywzICszNjEsOCBAQAogICAgIHJldHVybiBUUlVFOwogfQogCisKK0JPT0wzMiBXSU5BUEkgRW51bVBvcnRzMzJBKExQU1RSIG5hbWUsRFdPUkQgbGV2ZWwsTFBCWVRFIHBvcnRzLERXT1JEIGJ1ZnNpemUsTFBEV09SRCBidWZuZWVkZWQsTFBEV09SRCBidWZyZXR1cm5lZCkgeworCUZJWE1FKHdpbjMyLCIoJXMsJWQsJXAsJWQsJXAsJXApLCBzdHViIVxuIixuYW1lLGxldmVsLHBvcnRzLGJ1ZnNpemUsYnVmbmVlZGVkLGJ1ZnJldHVybmVkKTsKKwlyZXR1cm4gRkFMU0U7Cit9CmRpZmYgLS1naXQgYS93aW4zMi9vcmRpbmFscy5jIGIvd2luMzIvb3JkaW5hbHMuYwppbmRleCBjNTBiYWM1Li5lMGUwOGY3IDEwMDY0NAotLS0gYS93aW4zMi9vcmRpbmFscy5jCisrKyBiL3dpbjMyL29yZGluYWxzLmMKQEAgLTQsNyArNCw2IEBACiAgKiBDb3B5cmlnaHQgMTk5NyBNYXJjdXMgTWVpc3NuZXIKICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgImhlYXAuaCIKQEAgLTMyLDggKzMxLDUzIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIF9Db25maXJtV2luMTZMb2NrICAgIChLRVJORUwzMi45NikKKyAqLworRFdPUkQgX0NvbmZpcm1XaW4xNkxvY2sodm9pZCkKK3sKKyAgICBGSVhNRSh3aW4zMiwgIigpXG4iKTsKKyAgICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgX0VudGVyU3lzTGV2ZWwgICAgKEtFUk5FTDMyLjk3KQorICovCitWT0lEIF9FbnRlclN5c0xldmVsKENSSVRJQ0FMX1NFQ1RJT04gKmxvY2spCit7CisgICAgRklYTUUod2luMzIsICIoJXApXG4iLCBsb2NrKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgX0VudGVyU3lzTGV2ZWwgICAgKEtFUk5FTDMyLjk4KQorICovCitWT0lEIF9MZWF2ZVN5c0xldmVsKENSSVRJQ0FMX1NFQ1RJT04gKmxvY2spCit7CisgICAgRklYTUUod2luMzIsICIoJXApXG4iLCBsb2NrKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUmVsZWFzZVRodW5rTG9jayAgICAoS0VSTkVMMzIuNDgpCisgKi8KK1ZPSUQgUmVsZWFzZVRodW5rTG9jayhEV09SRCAqbXV0ZXhfY291bnQpCit7CisgICAgX0xlYXZlU3lzTGV2ZWwoJldpbjE2TXV0ZXgpOworCisgICAgKm11dGV4X2NvdW50ID0gKERXT1JEKSBOdEN1cnJlbnRUZWIoKS0+bXV0ZXhfY291bnQ7CisgICAgTnRDdXJyZW50VGViKCktPm11dGV4X2NvdW50ID0gMHhGRkZGOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBSZXN0b3JlVGh1bmtMb2NrICAgIChLRVJORUwzMi40OSkKKyAqLworVk9JRCBSZXN0b3JlVGh1bmtMb2NrKERXT1JEIG11dGV4X2NvdW50KQoreworICAgIE50Q3VycmVudFRlYigpLT5tdXRleF9jb3VudCA9IChXT1JEKW11dGV4X2NvdW50OworCisgICAgX0VudGVyU3lzTGV2ZWwoJldpbjE2TXV0ZXgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRQSzE2U3lzVmFyICAgIChLRVJORUwzMi45MikKLSAqIFJldHVybiB0aGUgaW5mYW1vdXMgV2luMTZNdXRleC4KICAqLwogTFBWT0lEIFdJTkFQSSBHZXRQSzE2U3lzVmFyKHZvaWQpCiB7CkBAIC02NSw3ICsxMDksNyBAQAogCVREQgkqcFRhc2s7CiAKIAlhY3Rpb24rPTU2OwotCWZwcmludGYoc3RkZXJyLCJLRVJORUwzMl8xOCglbGQsJWxkKzB4MzgpXG4iLHByb2Nlc3NpZCxhY3Rpb24pOworCVRSQUNFKHdpbjMyLCIoJWxkLCVsZCsweDM4KVxuIixwcm9jZXNzaWQsYWN0aW9uKTsKIAlpZiAoIXByb2Nlc3MgfHwgYWN0aW9uPjU2KQogCQlyZXR1cm4gMDsKIAlzd2l0Y2ggKGFjdGlvbikgewpAQCAtMTIxLDcgKzE2NSw3IEBACiAJY2FzZSA1NjovKiB1bmV4cGxvcmVkICovCiAJCXJldHVybiAwOwogCWRlZmF1bHQ6Ci0JCWZwcmludGYoc3RkZXJyLCJfS0VSTkVMMzJfMTg6dW5rbm93biBvZmZzZXQgKCVsZClcbiIsYWN0aW9uKTsKKwkJV0FSTih3aW4zMiwiVW5rbm93biBvZmZzZXQgKCVsZClcbiIsYWN0aW9uKTsKIAkJcmV0dXJuIDA7CiAJfQogCS8qIHNob3VsZG4ndCBjb21lIGhlcmUgKi8KQEAgLTEzNCwxNyArMTc4LDE3IEBACiAgKi8KIERXT1JEIFdJTkFQSSBHZXRXaW4xNkRPU0VudigpCiB7Ci0JZnByaW50ZihzdGRlcnIsIkdldFdpbjE2RE9TRW52KCksIFNUVUIgcmV0dXJuaW5nIDBcbiIpOworCUZJWE1FKGRvc21lbSwic3R1YiwgcmV0dXJuaW5nIDBcbiIpOwogCXJldHVybiAwOwogfQogCiBCT09MMzIgV0lOQVBJIF9LRVJORUwzMl8xMDAoSEFORExFMzIgdGhyZWFkaWQsRFdPUkQgZXhpdGNvZGUsRFdPUkQgeCkgewotCWZwcmludGYoc3RkZXJyLCJLRVJORUwzMl8xMDAoJWQsJWxkLDB4JTA4bHgpLHN0dWJcbiIsdGhyZWFkaWQsZXhpdGNvZGUseCk7CisJRklYTUUodGhyZWFkLCIoJWQsJWxkLDB4JTA4bHgpOiBzdHViXG4iLHRocmVhZGlkLGV4aXRjb2RlLHgpOwogCXJldHVybiBUUlVFOwogfQogCiBEV09SRCBXSU5BUEkgX0tFUk5FTDMyXzk5KERXT1JEIHgpIHsKLQlmcHJpbnRmKHN0ZGVyciwiS0VSTkVMMzJfOTkoMHglMDhseCksc3R1YlxuIix4KTsKKwlGSVhNRSh3aW4zMiwiKDB4JTA4bHgpOiBzdHViXG4iLHgpOwogCXJldHVybiAxOwogfQogCmRpZmYgLS1naXQgYS93aW4zMi9wcm9jZXNzLmMgYi93aW4zMi9wcm9jZXNzLmMKaW5kZXggMTVkMjczNC4uYzRjMTYzNSAxMDA2NDQKLS0tIGEvd2luMzIvcHJvY2Vzcy5jCisrKyBiL3dpbjMyL3Byb2Nlc3MuYwpAQCAtNCw3ICs0LDYgQEAKICAqIENvcHlyaWdodCAxOTk1IE1hcnRpbiB2b24gTG9ld2lzCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CkBAIC02OCw3ICs2Nyw4IEBACiAJaWYgKCF0aGRiKSAKIAkJcmV0dXJuIEZBTFNFOwogCWlmIChkd1RocmVhZEFmZmluaXR5TWFzayE9MSkgewotCQlmcHJpbnRmKHN0ZGVyciwiU2V0VGhyZWFkQWZmaW5pdHlNYXNrKCVkLCVsZCksIG9ubHkgMSBwcm9jZXNzb3Igc3VwcG9ydGVkLlxuIiwoaW50KWhUaHJlYWQsZHdUaHJlYWRBZmZpbml0eU1hc2spOworCQlXQVJOKHRocmVhZCwiKCVkLCVsZCk6IG9ubHkgMSBwcm9jZXNzb3Igc3VwcG9ydGVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgKGludCloVGhyZWFkLGR3VGhyZWFkQWZmaW5pdHlNYXNrKTsKIAkJSzMyT0JKX0RlY0NvdW50KChLMzJPQkoqKXRoZGIpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQpAQCAtNzYsNiArNzYsOSBAQAogCXJldHVybiBUUlVFOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENyZWF0ZVByb2Nlc3MzMkEgW0tFUk5FTDMyLjE3MV0KKyAqLwogQk9PTDMyIFdJTkFQSSBDcmVhdGVQcm9jZXNzMzJBKAogCUxQQ1NUUiBhcHBuYW1lLExQU1RSIGNtZGxpbmUsTFBTRUNVUklUWV9BVFRSSUJVVEVTIHByb2Nlc3NhdHRyaWJ1dGVzLAogICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgdGhyZWFkYXR0cmlidXRlcyxCT09MMzIgaW5oZXJpdGhhbmRsZXMsCkBAIC05NiwxMyArOTksMTYgQEAKICNlbmRpZgogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIENyZWF0ZVByb2Nlc3MzMlcgW0tFUk5FTDMyLjE3Ml0KKyAqLwogQk9PTDMyIFdJTkFQSSBDcmVhdGVQcm9jZXNzMzJXKAogCUxQQ1dTVFIgYXBwbmFtZSxMUFdTVFIgY21kbGluZSxMUFNFQ1VSSVRZX0FUVFJJQlVURVMgcHJvY2Vzc2F0dHJpYnV0ZXMsCiAgICAgICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyB0aHJlYWRhdHRyaWJ1dGVzLEJPT0wzMiBpbmhlcml0aGFuZGxlcywKIAlEV09SRCBjcmVhdGlvbmZsYWdzLExQVk9JRCBlbnYsTFBDV1NUUiBjdXJkaXIsCiAJTFBTVEFSVFVQSU5GTzMyVyBzdGFydHVwaW5mbyxMUFBST0NFU1NfSU5GT1JNQVRJT04gcHJvY2Vzc2luZm8pCiB7Ci0gICAgZnByaW50ZihzdGRlcnIsIkNyZWF0ZVByb2Nlc3NXKCVwLCVwLCVwLCVwLCVkLCUwOGx4LCVwLCVwLCVwLCVwKSBzdHViXG4iLAorICAgIEZJWE1FKHdpbjMyLCIoJXAsJXAsJXAsJXAsJWQsJTA4bHgsJXAsJXAsJXAsJXApOiBzdHViXG4iLAogICAgICAgICAgICAgYXBwbmFtZSxjbWRsaW5lLHByb2Nlc3NhdHRyaWJ1dGVzLHRocmVhZGF0dHJpYnV0ZXMsCiAgICAgICAgICAgICBpbmhlcml0aGFuZGxlcyxjcmVhdGlvbmZsYWdzLGVudixjdXJkaXIsc3RhcnR1cGluZm8scHJvY2Vzc2luZm8gKTsKICAgICAvKiBtYWtlIGZyb20gbGNjIHVzZXMgc3lzdGVtIGFzIGZhbGxiYWNrIGlmIENyZWF0ZVByb2Nlc3MgcmV0dXJucwpAQCAtMTEwLDggKzExNiwxMSBAQAogICAgIHJldHVybiBGQUxTRTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBDb250aW51ZURlYnVnRXZlbnQgW0tFUk5FTDMyLjE0Nl0KKyAqLwogQk9PTDMyIFdJTkFQSSBDb250aW51ZURlYnVnRXZlbnQoRFdPUkQgcGlkLERXT1JEIHRpZCxEV09SRCBjb250c3RhdHVzKSB7Ci0JZnByaW50ZihzdGRlcnIsIkNvbnRpbnVlRGVidWdFdmVudCglbGQsJWxkLCVsZCkgc3R1YlxuIixwaWQsdGlkLGNvbnRzdGF0dXMpOworICAgIEZJWE1FKHdpbjMyLCIoJWxkLCVsZCwlbGQpOiBzdHViXG4iLHBpZCx0aWQsY29udHN0YXR1cyk7CiAJcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbjMyL3NlY3VyaXR5LmMgYi93aW4zMi9zZWN1cml0eS5jCmluZGV4IGFjZmVjODcuLjk2YTk0OTYgMTAwNjQ0Ci0tLSBhL3dpbjMyL3NlY3VyaXR5LmMKKysrIGIvd2luMzIvc2VjdXJpdHkuYwpAQCAtMSw0ICsxLDMgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCmRpZmYgLS1naXQgYS93aW4zMi9zdHJ1Y3QzMi5jIGIvd2luMzIvc3RydWN0MzIuYwppbmRleCAxOWI3YTM2Li4zNWNjMDFiIDEwMDY0NAotLS0gYS93aW4zMi9zdHJ1Y3QzMi5jCisrKyBiL3dpbjMyL3N0cnVjdDMyLmMKQEAgLTQsNyArNCw2IEBACiAgKiBDb3B5cmlnaHQgMTk5NiBNYXJ0aW4gdm9uIExvZXdpcwogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgInN0cnVjdDMyLmgiCmRpZmYgLS1naXQgYS93aW4zMi90aHJlYWQuYyBiL3dpbjMyL3RocmVhZC5jCmluZGV4IGZmMGI4MjQuLmNkZjQ2YWIgMTAwNjQ0Ci0tLSBhL3dpbjMyL3RocmVhZC5jCisrKyBiL3dpbjMyL3RocmVhZC5jCkBAIC01LDcgKzUsNiBAQAogICogQ29weXJpZ2h0IDE5OTcgT25ubyBIb3ZlcnMKICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCmRpZmYgLS1naXQgYS93aW4zMi91c2VyMzIuYyBiL3dpbjMyL3VzZXIzMi5jCmluZGV4IGEzN2M1OTkuLjJhMWZkYTEgMTAwNjQ0Ci0tLSBhL3dpbjMyL3VzZXIzMi5jCisrKyBiL3dpbjMyL3VzZXIzMi5jCkBAIC04LDcgKzgsNiBAQAogICAgc3R1YnMuICdSZWFsJyBpbXBsZW1lbnRhdGlvbnMgZ28gaW50byBjb250ZXh0IHNwZWNpZmljIGZpbGVzICovCiAKICNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgpkaWZmIC0tZ2l0IGEvd2luZG93cy9jbGFzcy5jIGIvd2luZG93cy9jbGFzcy5jCmluZGV4IGZhNTUwNGUuLmIzMzYwNmQgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvY2xhc3MuYworKysgYi93aW5kb3dzL2NsYXNzLmMKQEAgLTksNyArOSw2IEBACiAgKi8KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAiY2xhc3MuaCIKICNpbmNsdWRlICJoZWFwLmgiCkBAIC0zNywxNSArMzYsMTQgQEAKIAogICAgIGlmIChwdHItPm1hZ2ljICE9IENMQVNTX01BR0lDKQogICAgIHsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJXAgaXMgbm90IGEgY2xhc3NcbiIsIHB0ciApOworICAgICAgICBEVU1QKCIlcCBpcyBub3QgYSBjbGFzc1xuIiwgcHRyICk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBHbG9iYWxHZXRBdG9tTmFtZTMyQSggcHRyLT5hdG9tTmFtZSwgY2xhc3NOYW1lLCBzaXplb2YoY2xhc3NOYW1lKSApOwogCi0gICAgZnByaW50Ziggc3RkZXJyLCAiQ2xhc3MgJXA6XG4iLCBwdHIgKTsKLSAgICBmcHJpbnRmKCBzdGRlcnIsCi0gICAgICAgICAgICAgIm5leHQ9JXAgIG5hbWU9JTA0eCAnJXMnICBzdHlsZT0lMDh4ICB3bmRQcm9jPSUwOHhcbiIKKyAgICBEVU1QKCAiQ2xhc3MgJXA6XG4iLCBwdHIgKTsKKyAgICBEVU1QKCAibmV4dD0lcCAgbmFtZT0lMDR4ICclcycgIHN0eWxlPSUwOHggIHduZFByb2M9JTA4eFxuIgogICAgICAgICAgICAgICJpbnN0PSUwNHggIGRjZT0lMDh4ICBpY29uPSUwNHggIGN1cnNvcj0lMDR4ICBia2duZD0lMDR4XG4iCiAgICAgICAgICAgICAgImNsc0V4dHJhPSVkICB3aW5FeHRyYT0lZCAgI3dpbmRvd3M9JWRcbiIsCiAgICAgICAgICAgICAgcHRyLT5uZXh0LCBwdHItPmF0b21OYW1lLCBjbGFzc05hbWUsIHB0ci0+c3R5bGUsCkBAIC01NCwxMiArNTIsMTIgQEAKICAgICAgICAgICAgICBwdHItPmNiQ2xzRXh0cmEsIHB0ci0+Y2JXbmRFeHRyYSwgcHRyLT5jV2luZG93cyApOwogICAgIGlmIChwdHItPmNiQ2xzRXh0cmEpCiAgICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJleHRyYSBieXRlczoiICk7CisgICAgICAgIERVTVAoICJleHRyYSBieXRlczoiICk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwdHItPmNiQ2xzRXh0cmE7IGkrKykKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiAlMDJ4IiwgKigoQllURSAqKXB0ci0+d0V4dHJhK2kpICk7Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOworICAgICAgICAgICAgRFVNUCggIiAlMDJ4IiwgKigoQllURSAqKXB0ci0+d0V4dHJhK2kpICk7CisgICAgICAgIERVTVAoICJcbiIgKTsKICAgICB9Ci0gICAgZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CisgICAgRFVNUCggIlxuIiApOwogfQogCiAKQEAgLTczLDE0ICs3MSwxNCBAQAogICAgIENMQVNTICpwdHI7CiAgICAgY2hhciBjbGFzc05hbWVbODBdOwogCi0gICAgZnByaW50Ziggc3RkZXJyLCAiIENsYXNzICAgTmFtZSAgICAgICAgICAgICAgICAgIFN0eWxlICAgV25kUHJvY1xuIiApOworICAgIERVTVAoICIgQ2xhc3MgICBOYW1lICAgICAgICAgICAgICAgICAgU3R5bGUgICBXbmRQcm9jXG4iICk7CiAgICAgZm9yIChwdHIgPSBmaXJzdENsYXNzOyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkKICAgICB7CiAgICAgICAgIEdsb2JhbEdldEF0b21OYW1lMzJBKCBwdHItPmF0b21OYW1lLCBjbGFzc05hbWUsIHNpemVvZihjbGFzc05hbWUpICk7Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiUwOHggJS0yMC4yMHMgJTA4eCAlMDh4XG4iLCAoVUlOVDMyKXB0ciwgY2xhc3NOYW1lLAorICAgICAgICBEVU1QKCAiJTA4eCAlLTIwLjIwcyAlMDh4ICUwOHhcbiIsIChVSU5UMzIpcHRyLCBjbGFzc05hbWUsCiAgICAgICAgICAgICAgICAgIHB0ci0+c3R5bGUsIChVSU5UMzIpcHRyLT53aW5wcm9jICk7CiAgICAgfQotICAgIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOworICAgIERVTVAoICJcbiIgKTsKIH0KIAogCkBAIC0xNzMsNyArMTcxLDcgQEAKICAgICAgICAgaWYgKCpwcENsYXNzID09IGNsYXNzUHRyKSBicmVhazsKICAgICBpZiAoISpwcENsYXNzKQogICAgIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogQ2xhc3MgbGlzdCBjb3JydXB0ZWRcbiIgKTsKKyAgICAgICAgRVJSKCBjbGFzcywgIkNsYXNzIGxpc3QgY29ycnVwdGVkXG4iICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgKnBwQ2xhc3MgPSBjbGFzc1B0ci0+bmV4dDsKQEAgLTI2NSwxMCArMjYzLDEwIEBACiAKICAgICBpZiAoY2xhc3NFeHRyYSA8IDApIGNsYXNzRXh0cmEgPSAwOwogICAgIGVsc2UgaWYgKGNsYXNzRXh0cmEgPiA0MCkgIC8qIEV4dHJhIGJ5dGVzIGFyZSBsaW1pdGVkIHRvIDQwIGluIFdpbjMyICovCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogY2xhc3MgZXh0cmEgYnl0ZXMgJWQgaXMgPiA0MFxuIiwgY2xhc3NFeHRyYSk7CisgICAgICAgIFdBUk4oY2xhc3MsICJDbGFzcyBleHRyYSBieXRlcyAlZCBpcyA+IDQwXG4iLCBjbGFzc0V4dHJhKTsKICAgICBpZiAod2luRXh0cmEgPCAwKSB3aW5FeHRyYSA9IDA7CiAgICAgZWxzZSBpZiAod2luRXh0cmEgPiA0MCkgICAgLyogRXh0cmEgYnl0ZXMgYXJlIGxpbWl0ZWQgdG8gNDAgaW4gV2luMzIgKi8KLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiV2FybmluZzogd2luIGV4dHJhIGJ5dGVzICVkIGlzID4gNDBcbiIsIHdpbkV4dHJhICk7CisgICAgICAgIFdBUk4oY2xhc3MsICJXaW4gZXh0cmEgYnl0ZXMgJWQgaXMgPiA0MFxuIiwgd2luRXh0cmEgKTsKIAogICAgIC8qIENyZWF0ZSB0aGUgY2xhc3MgKi8KIApAQCAtNTg1LDcgKzU4Myw3IEBACiAgICAgICAgIGNhc2UgR0NXX0hNT0RVTEU6CiAgICAgICAgICAgICByZXR1cm4gKFdPUkQpR2V0Q2xhc3NMb25nMzJBKCBod25kLCBvZmZzZXQgKTsKICAgICB9Ci0gICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBpbnZhbGlkIG9mZnNldCAlZCBmb3IgR2V0Q2xhc3NXb3JkKClcbiIsIG9mZnNldCk7CisgICAgV0FSTihjbGFzcywgIkludmFsaWQgb2Zmc2V0ICVkXG4iLCBvZmZzZXQpOwogICAgIHJldHVybiAwOwogfQogCkBAIC02NDEsNyArNjM5LDcgQEAKICAgICAgICAgY2FzZSBHQ0xfSElDT05TTToKICAgICAgICAgICAgIHJldHVybiBHZXRDbGFzc1dvcmQzMiggaHduZCwgb2Zmc2V0ICk7CiAgICAgfQotICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogaW52YWxpZCBvZmZzZXQgJWQgZm9yIEdldENsYXNzTG9uZygpXG4iLCBvZmZzZXQpOworICAgIFdBUk4oY2xhc3MsICJJbnZhbGlkIG9mZnNldCAlZFxuIiwgb2Zmc2V0KTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNjkyLDggKzY5MCw3IEBACiAgICAgICAgICAgICBwdHIgPSAoKGNoYXIgKil3bmRQdHItPmNsYXNzLT53RXh0cmEpICsgb2Zmc2V0OwogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IGludmFsaWQgb2Zmc2V0ICVkIGZvciBTZXRDbGFzc1dvcmQoKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCApOworICAgICAgICAgICAgV0FSTiggY2xhc3MsICJJbnZhbGlkIG9mZnNldCAlZFxuIiwgb2Zmc2V0ICk7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgIH0KQEAgLTcxMCw4ICs3MDcsNyBAQAogICAgICAgICBjYXNlIEdDV19ISUNPTlNNOiAgICAgICBwdHIgPSAmd25kUHRyLT5jbGFzcy0+aEljb25TbTsgYnJlYWs7CiAgICAgICAgIGNhc2UgR0NXX0FUT006ICAgICAgICAgIHB0ciA9ICZ3bmRQdHItPmNsYXNzLT5hdG9tTmFtZTsgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBpbnZhbGlkIG9mZnNldCAlZCBmb3IgU2V0Q2xhc3NXb3JkKClcbiIsCi0gICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgICAgICAgICAgV0FSTiggY2xhc3MsICJJbnZhbGlkIG9mZnNldCAlZFxuIiwgb2Zmc2V0KTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICByZXR2YWwgPSBHRVRfV09SRChwdHIpOwpAQCAtNzYwLDggKzc1Niw3IEBACiAgICAgICAgICAgICBwdHIgPSAoKGNoYXIgKil3bmRQdHItPmNsYXNzLT53RXh0cmEpICsgb2Zmc2V0OwogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IGludmFsaWQgb2Zmc2V0ICVkIGZvciBTZXRDbGFzc0xvbmcoKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCApOworICAgICAgICAgICAgV0FSTiggY2xhc3MsICJJbnZhbGlkIG9mZnNldCAlZFxuIiwgb2Zmc2V0ICk7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgIH0KQEAgLTc4Niw4ICs3ODEsNyBAQAogICAgICAgICBjYXNlIEdDTF9DQkNMU0VYVFJBOiBwdHIgPSAmd25kUHRyLT5jbGFzcy0+Y2JDbHNFeHRyYTsgYnJlYWs7CiAgICAgICAgIGNhc2UgR0NMX0hNT0RVTEU6ICAgIHB0ciA9ICZ3bmRQdHItPmNsYXNzLT5oSW5zdGFuY2U7IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiV2FybmluZzogaW52YWxpZCBvZmZzZXQgJWQgZm9yIFNldENsYXNzTG9uZygpXG4iLAotICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICAgICAgICAgIFdBUk4oIGNsYXNzLCAiSW52YWxpZCBvZmZzZXQgJWRcbiIsIG9mZnNldCApOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIHJldHZhbCA9IEdFVF9EV09SRChwdHIpOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9jbGlwYm9hcmQuYyBiL3dpbmRvd3MvY2xpcGJvYXJkLmMKaW5kZXggZWQwNGM2ZC4uOGIwYTUxZCAxMDA2NDQKLS0tIGEvd2luZG93cy9jbGlwYm9hcmQuYworKysgYi93aW5kb3dzL2NsaXBib2FyZC5jCkBAIC03LDcgKzcsNiBAQAogICovCiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KQEAgLTQ0Miw3ICs0NDEsNyBAQAogICovCiBIQU5ETEUzMiBXSU5BUEkgU2V0Q2xpcGJvYXJkRGF0YTMyKCBVSU5UMzIgd0Zvcm1hdCwgSEFORExFMzIgaERhdGEgKQogewotICAgIGZwcmludGYoIHN0ZGVyciwgIlNldENsaXBib2FyZERhdGE6IGVtcHR5IHN0dWJcbiIgKTsKKyAgICBGSVhNRShjbGlwYm9hcmQsICIoJWQsJWQpOiBzdHViXG4iLCB3Rm9ybWF0LCBoRGF0YSApOwogICAgIHJldHVybiAwOwogfQogCkBAIC01NDcsNyArNTQ2LDcgQEAKICAqLwogSEFORExFMzIgV0lOQVBJIEdldENsaXBib2FyZERhdGEzMiggVUlOVDMyIHdGb3JtYXQgKQogewotICAgIGZwcmludGYoIHN0ZGVyciwgIkdldENsaXBib2FyZERhdGEzMjogZW1wdHkgc3R1YlxuIiApOworICAgIEZJWE1FKGNsaXBib2FyZCwgIiglZCk6IHN0dWJcbiIsIHdGb3JtYXQgKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtODY2LDggKzg2NSw3IEBACiAgKi8KIElOVDE2IFdJTkFQSSBHZXRQcmlvcml0eUNsaXBib2FyZEZvcm1hdDE2KCBVSU5UMTYgKmxwUHJpb3JpdHlMaXN0LCBJTlQxNiBuQ291bnQpCiB7Ci0gICAgZnByaW50Ziggc3RkZXJyLCAiR2V0UHJpb3JpdHlDbGlwYm9hcmRGb3JtYXQxNiglcCwgJWQpOiBzdHViXG4iLAotICAgICAgICAgICAgIGxwUHJpb3JpdHlMaXN0LCBuQ291bnQgKTsKKyAgICBGSVhNRShjbGlwYm9hcmQsICIoJXAsJWQpOiBzdHViXG4iLCBscFByaW9yaXR5TGlzdCwgbkNvdW50ICk7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmd25kLmMgYi93aW5kb3dzL2RlZnduZC5jCmluZGV4IGJkZDM1ZmIuLmVjMGFkZTggMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGVmd25kLmMKKysrIGIvd2luZG93cy9kZWZ3bmQuYwpAQCAtNiw3ICs2LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgpkaWZmIC0tZ2l0IGEvd2luZG93cy9kaWFsb2cuYyBiL3dpbmRvd3MvZGlhbG9nLmMKaW5kZXggYTFiNjdmOS4uNTNlODkxZSAxMDA2NDQKLS0tIGEvd2luZG93cy9kaWFsb2cuYworKysgYi93aW5kb3dzL2RpYWxvZy5jCkBAIC04LDcgKzgsNiBAQAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKQEAgLTI5OCw3ICsyOTcsNyBAQAogICAgICAgICAgICAgICAgICAgICBkbGdJbmZvLT5oRGlhbG9nSGVhcCA9IEdsb2JhbEFsbG9jMTYoR01FTV9GSVhFRCwgMHgxMDAwMCk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghZGxnSW5mby0+aERpYWxvZ0hlYXApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkNyZWF0ZURpYWxvZ0luZGlyZWN0UGFyYW06IEluc3VmZmljaWVudCBtZW1vcnkgdG8gY3JlYXRlIGhlYXAgZm9yIGVkaXQgY29udHJvbFxuIiApOworICAgICAgICAgICAgICAgICAgICAgICAgRVJSKGRpYWxvZywgIkluc3VmZmljaWVudCBtZW1vcnkgdG8gY3JlYXRlIGhlYXAgZm9yIGVkaXQgY29udHJvbFxuIiApOwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgTG9jYWxJbml0KGRsZ0luZm8tPmhEaWFsb2dIZWFwLCAwLCAweGZmZmYpOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9kaW5wdXQuYyBiL3dpbmRvd3MvZGlucHV0LmMKaW5kZXggZTAzNGFlYi4uYzJjNzJkNCAxMDA2NDQKLS0tIGEvd2luZG93cy9kaW5wdXQuYworKysgYi93aW5kb3dzL2RpbnB1dC5jCkBAIC0xNSw3ICsxNSw2IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CkBAIC00MSw4ICs0MCwxMSBAQAogc3RhdGljIElEaXJlY3RJbnB1dERldmljZUFfVlRhYmxlIFN5c0tleWJvYXJkQXZ0Owogc3RhdGljIElEaXJlY3RJbnB1dERldmljZUFfVlRhYmxlIFN5c01vdXNlQXZ0OwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglEaXJlY3RJbnB1dENyZWF0ZTMyQQorICovCiBIUkVTVUxUIFdJTkFQSSBEaXJlY3RJbnB1dENyZWF0ZTMyQShISU5TVEFOQ0UzMiBoaW5zdCwgRFdPUkQgZHdWZXJzaW9uLCBMUERJUkVDVElOUFVUMzJBICpwcERJLCBMUFVOS05PV04gcHVua091dGVyKSB7Ci0JZnByaW50ZihzdGRlcnIsIkRpcmVjdElucHV0Q3JlYXRlMzJBKDB4JTA4bHgsJTA0bHgsJXAsJXApXG4iLAorCVRSQUNFKGRpbnB1dCwgIigweCUwOGx4LCUwNGx4LCVwLCVwKVxuIiwKIAkJKERXT1JEKWhpbnN0LGR3VmVyc2lvbixwcERJLHB1bmtPdXRlcgogCSk7CiAJKCpwcERJKSA9IChMUERJUkVDVElOUFVUMzJBKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKElEaXJlY3RJbnB1dDMyQSkpOwpAQCAtNTEsMTMgKzUzLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJSURpcmVjdElucHV0QQorICoJSURpcmVjdElucHV0QV9FbnVtRGV2aWNlcwogICovCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdElucHV0QV9FbnVtRGV2aWNlcygKIAlMUERJUkVDVElOUFVUMzJBIHRoaXMsRFdPUkQgZHdGbGFncyxMUERJRU5VTURFVklDRVNDQUxMQkFDSzMyQSBjYiwKIAlMUFZPSUQgY29udGV4dCxEV09SRCB4CiApIHsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdElucHV0QSglcCktPkVudW1EZXZpY2VzKDB4JTA4bHgsJXAsJXAsMHglMDhseCksc3R1YiFcbiIsdGhpcyxkd0ZsYWdzLGNiLGNvbnRleHQseCk7CisJRklYTUUoZGlucHV0LCIodGhpcz0lcCwweCUwOGx4LCVwLCVwLDB4JTA4bHgpOiBzdHViXG4iLHRoaXMsZHdGbGFncyxjYixjb250ZXh0LHgpOwogCXJldHVybiAwOwogfQogCkBAIC04MCw3ICs4Miw3IEBACiAJY2hhcgl4YnVmWzUwXTsKIAkKIAlXSU5FX1N0cmluZ0Zyb21DTFNJRChyZ3VpZCx4YnVmKTsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdElucHV0QSglcCktPkNyZWF0ZURldmljZSglcywlcCwlcCksc3R1YiFcbiIsdGhpcyx4YnVmLHBkZXYscHVuayk7CisJRklYTUUoZGlucHV0LCIodGhpcz0lcCwlcywlcCwlcCk6IHN0dWJcbiIsdGhpcyx4YnVmLHBkZXYscHVuayk7CiAJaWYgKCFtZW1jbXAoJkdVSURfU3lzS2V5Ym9hcmQscmd1aWQsc2l6ZW9mKEdVSURfU3lzS2V5Ym9hcmQpKSkgewogCQkqcGRldiA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksc2l6ZW9mKFN5c0tleWJvYXJkMzJBKSk7CiAJCSgqcGRldiktPnJlZiA9IDE7CkBAIC0xMDUsNyArMTA3LDcgQEAKIAljaGFyCXhidWZbNTBdOwogCiAJV0lORV9TdHJpbmdGcm9tQ0xTSUQocmlpZCx4YnVmKTsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdElucHV0QSglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhidWYscHBvYmopOworCVRSQUNFKGRpbnB1dCwiKHRoaXM9JXAsJXMsJXApXG4iLHRoaXMseGJ1ZixwcG9iaik7CiAJaWYgKCFtZW1jbXAoJklJRF9JVW5rbm93bixyaWlkLHNpemVvZigqcmlpZCkpKSB7CiAJCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CiAJCSpwcG9iaiA9IHRoaXM7CkBAIC0xNDQsMTMgKzE0NiwxMyBAQAogKSB7CiAJLyoKIAlpbnQgaTsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdElucHV0RGV2aWNlQSglcCktPlNldERhdGFGb3JtYXQoJXApXG4iLHRoaXMsZGYpOworCVRSQUNFKGRpbnB1dCwiKHRoaXM9JXAsJXApXG4iLHRoaXMsZGYpOwogCi0JZnByaW50ZihzdGRlcnIsImRmLmR3U2l6ZSAlbGRcbiIsZGYtPmR3U2l6ZSk7Ci0JZnByaW50ZihzdGRlcnIsImRmLmR3T2Jqc2l6ZSAlbGRcbiIsZGYtPmR3T2JqU2l6ZSk7Ci0JZnByaW50ZihzdGRlcnIsImRmLmR3RmxhZ3MgMHglMDhseFxuIixkZi0+ZHdGbGFncyk7Ci0JZnByaW50ZihzdGRlcnIsImRmLmR3RGF0YVNpemUgJWxkXG4iLGRmLT5kd0RhdGFTaXplKTsKLQlmcHJpbnRmKHN0ZGVyciwiZGYuZHdOdW1PYmpzICVsZFxuIixkZi0+ZHdOdW1PYmpzKTsKKwlUUkFDRShkaW5wdXQsImRmLmR3U2l6ZT0lbGRcbiIsZGYtPmR3U2l6ZSk7CisJVFJBQ0UoZGlucHV0LCIoZGYuZHdPYmpzaXplPSVsZClcbiIsZGYtPmR3T2JqU2l6ZSk7CisJVFJBQ0UoZGlucHV0LCIoZGYuZHdGbGFncz0weCUwOGx4KVxuIixkZi0+ZHdGbGFncyk7CisJVFJBQ0UoZGlucHV0LCIoZGYuZHdEYXRhU2l6ZT0lbGQpXG4iLGRmLT5kd0RhdGFTaXplKTsKKwlUUkFDRShkaW5wdXQsIihkZi5kd051bU9ianM9JWxkKVxuIixkZi0+ZHdOdW1PYmpzKTsKIAogCWZvciAoaT0wO2k8ZGYtPmR3TnVtT2JqcztpKyspIHsKIAkJY2hhcgl4YnVmWzUwXTsKQEAgLTE1OSwxMCArMTYxLDEwIEBACiAJCQlXSU5FX1N0cmluZ0Zyb21DTFNJRChkZi0+cmdvZGZbaV0ucGd1aWQseGJ1Zik7CiAJCWVsc2UKIAkJCXN0cmNweSh4YnVmLCI8bm8gZ3VpZD4iKTsKLQkJZnByaW50ZihzdGRlcnIsImRmLnJnb2RmWyVkXS5ndWlkICVzXG4iLGkseGJ1Zik7Ci0JCWZwcmludGYoc3RkZXJyLCJkZi5yZ29kZlslZF0uZHdPZnMgJWxkXG4iLGksZGYtPnJnb2RmW2ldLmR3T2ZzKTsKLQkJZnByaW50ZihzdGRlcnIsIglkd1R5cGUgMHglMDJseCxkd0luc3RhbmNlICVsZFxuIixESURGVF9HRVRUWVBFKGRmLT5yZ29kZltpXS5kd1R5cGUpLERJREZUX0dFVElOU1RBTkNFKGRmLT5yZ29kZltpXS5kd1R5cGUpKTsKLQkJZnByaW50ZihzdGRlcnIsImRmLnJnb2RmWyVkXS5kd0ZsYWdzIDB4JTA4bHhcbiIsaSxkZi0+cmdvZGZbaV0uZHdGbGFncyk7CisJCVRSQUNFKGRpbnB1dCwiZGYucmdvZGZbJWRdLmd1aWQgJXNcbiIsaSx4YnVmKTsKKwkJVFJBQ0UoZGlucHV0LCJkZi5yZ29kZlslZF0uZHdPZnMgJWxkXG4iLGksZGYtPnJnb2RmW2ldLmR3T2ZzKTsKKwkJVFJBQ0UoZGlucHV0LCJkd1R5cGUgMHglMDJseCxkd0luc3RhbmNlICVsZFxuIixESURGVF9HRVRUWVBFKGRmLT5yZ29kZltpXS5kd1R5cGUpLERJREZUX0dFVElOU1RBTkNFKGRmLT5yZ29kZltpXS5kd1R5cGUpKTsKKwkJVFJBQ0UoZGlucHV0LCJkZi5yZ29kZlslZF0uZHdGbGFncyAweCUwOGx4XG4iLGksZGYtPnJnb2RmW2ldLmR3RmxhZ3MpOwogCX0KIAkqLwogCXJldHVybiAwOwpAQCAtMTcxLDcgKzE3Myw3IEBACiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdElucHV0RGV2aWNlQV9TZXRDb29wZXJhdGl2ZUxldmVsKAogCUxQRElSRUNUSU5QVVRERVZJQ0UzMkEgdGhpcyxIV05EMzIgaHduZCxEV09SRCBkd2ZsYWdzCiApIHsKLQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdElucHV0RGV2aWNlQSglcCktPlNldENvb3BlcmF0aXZlTGV2ZWwoMHglMDhseCwweCUwOGx4KVxuIix0aGlzLChEV09SRClod25kLGR3ZmxhZ3MpOworCUZJWE1FKGRpbnB1dCwiKHRoaXM9JXAsMHglMDhseCwweCUwOGx4KTogc3R1YlxuIix0aGlzLChEV09SRClod25kLGR3ZmxhZ3MpOwogCXJldHVybiAwOwogfQogCkBAIC0xODQsMTcgKzE4NiwxNyBAQAogCQlXSU5FX1N0cmluZ0Zyb21DTFNJRChyZ3VpZCx4YnVmKTsKIAllbHNlCiAJCXNwcmludGYoeGJ1ZiwiPHNwZWNpYWwgZ3VpZCAlbGQ+IiwoRFdPUkQpcmd1aWQpOwotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0SW5wdXREZXZpY2VBKCVwKS0+U2V0UHJvcGVydHkoJXMsJXApXG4iLHRoaXMseGJ1ZixwaCk7CisJVFJBQ0UoZGlucHV0LCIodGhpcz0lcCwlcywlcClcbiIsdGhpcyx4YnVmLHBoKTsKIAlpZiAoIUhJV09SRChyZ3VpZCkpIHsKIAkJc3dpdGNoICgoRFdPUkQpcmd1aWQpIHsKIAkJY2FzZSBESVBST1BfQlVGRkVSU0laRTogewogCQkJTFBDRElQUk9QRFdPUkQJcGQgPSAoTFBDRElQUk9QRFdPUkQpcGg7CiAKLQkJCWZwcmludGYoc3RkZXJyLCIJYnVmZmVyc2l6ZSA9ICVsZFxuIixwZC0+ZHdEYXRhKTsKKwkJCVRSQUNFKGRpbnB1dCwiYnVmZmVyc2l6ZSA9ICVsZFxuIixwZC0+ZHdEYXRhKTsKIAkJCWJyZWFrOwogCQl9CiAJCWRlZmF1bHQ6Ci0JCQlmcHJpbnRmKHN0ZGVyciwiCXVua25vd24gdHlwZSAlbGRcbiIsKERXT1JEKXJndWlkKTsKKwkJCVdBUk4oZGlucHV0LCJVbmtub3duIHR5cGUgJWxkXG4iLChEV09SRClyZ3VpZCk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTIwNCw3ICsyMDYsNyBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RJbnB1dERldmljZUFfU2V0RXZlbnROb3RpZmljYXRpb24oCiAJTFBESVJFQ1RJTlBVVERFVklDRTMyQSB0aGlzLEhBTkRMRTMyIGhuZAogKSB7Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3RJbnB1dERldmljZUEoJXApLT5TZXRFdmVudE5vdGlmaWNhdGlvbigweCUwOGx4KVxuIix0aGlzLChEV09SRClobmQpOworCUZJWE1FKGRpbnB1dCwiKHRoaXM9JXAsMHglMDhseCk6IHN0dWJcbiIsdGhpcywoRFdPUkQpaG5kKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjEyLDE4ICsyMTQsMTggQEAKIAlMUERJUkVDVElOUFVUREVWSUNFMzJBIHRoaXMsRFdPUkQgZG9kc2l6ZSxMUERJREVWSUNFT0JKRUNUREFUQSBkb2QsCiAJTFBEV09SRCBlbnRyaWVzLERXT1JEIGZsYWdzCiApIHsKLS8qCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0SW5wdXREZXZpY2VBKCVwKS0+R2V0RGV2aWNlRGF0YSglbGQsJXAsJXAoMHglMDhseCksMHglMDhseClcbiIsdGhpcyxkb2RzaXplLGRvZCxlbnRyaWVzLCplbnRyaWVzLGZsYWdzKTsqLworLyoJVFJBQ0UoZGlucHV0LCJJRGlyZWN0SW5wdXREZXZpY2VBKCVwKS0+R2V0RGV2aWNlRGF0YSglbGQsJXAsJXAoMHglMDhseCksMHglMDhseClcbiIsdGhpcyxkb2RzaXplLGRvZCxlbnRyaWVzLCplbnRyaWVzLGZsYWdzKTsqLwogCXJldHVybiAwOwogfQogCiAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0SW5wdXREZXZpY2VBX0FjcXVpcmUoTFBESVJFQ1RJTlBVVERFVklDRTMyQSB0aGlzKSB7Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3RJbnB1dERldmljZUEoJXApLT5BcXVpcmUoKVxuIix0aGlzKTsKKwlGSVhNRShkaW5wdXQsIih0aGlzPSVwKTogc3R1YlxuIix0aGlzKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RJbnB1dERldmljZUFfVW5hY3F1aXJlKExQRElSRUNUSU5QVVRERVZJQ0UzMkEgdGhpcykgewotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0SW5wdXREZXZpY2VBKCVwKS0+VW5hcXVpcmUoKVxuIix0aGlzKTsKKwlGSVhNRShkaW5wdXQsIih0aGlzPSVwKTogc3R1YlxuIix0aGlzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQ0LDE4ICsyNDYsMTkgQEAKIAkJV0lORV9TdHJpbmdGcm9tQ0xTSUQocmd1aWQseGJ1Zik7CiAJZWxzZQogCQlzcHJpbnRmKHhidWYsIjxzcGVjaWFsIGd1aWQgJWxkPiIsKERXT1JEKXJndWlkKTsKLQlmcHJpbnRmKHN0ZGVyciwiU3lzS2V5Ym9hcmRBKCVwKS0+U2V0UHJvcGVydHkoJXMsJXApXG4iLHRoaXMseGJ1ZixwaCk7Ci0JZnByaW50ZihzdGRlcnIsIglzaXplIGlzICVsZCwgaGVhZGVyc2l6ZSBpcyAlbGQsb2JqIGlzICVsZCxob3cgaXMgJWxkXG4iLHBoLT5kd1NpemUscGgtPmR3SGVhZGVyU2l6ZSxwaC0+ZHdPYmoscGgtPmR3SG93KTsKKwlUUkFDRShkaW5wdXQsIih0aGlzPSVwLCVzLCVwKVxuIix0aGlzLHhidWYscGgpOworCVRSQUNFKGRpbnB1dCwiKHNpemU9JWxkLGhlYWRlcnNpemU9JWxkLG9iaj0lbGQsaG93PSVsZFxuIiwKKyAgICAgICAgICAgIHBoLT5kd1NpemUscGgtPmR3SGVhZGVyU2l6ZSxwaC0+ZHdPYmoscGgtPmR3SG93KTsKIAlpZiAoIUhJV09SRChyZ3VpZCkpIHsKIAkJc3dpdGNoICgoRFdPUkQpcmd1aWQpIHsKIAkJY2FzZSBESVBST1BfQlVGRkVSU0laRTogewogCQkJTFBDRElQUk9QRFdPUkQJcGQgPSAoTFBDRElQUk9QRFdPUkQpcGg7CiAKLQkJCWZwcmludGYoc3RkZXJyLCIJYnVmZmVyc2l6ZSA9ICVsZFxuIixwZC0+ZHdEYXRhKTsKKwkJCVRSQUNFKGRpbnB1dCwiKGJ1ZmZlcnNpemU9JWxkKVxuIixwZC0+ZHdEYXRhKTsKIAkJCWJyZWFrOwogCQl9CiAJCWRlZmF1bHQ6Ci0JCQlmcHJpbnRmKHN0ZGVyciwiCXVua25vd24gdHlwZSAlbGRcbiIsKERXT1JEKXJndWlkKTsKKwkJCVdBUk4oZGlucHV0LCJVbmtub3duIHR5cGUgJWxkXG4iLChEV09SRClyZ3VpZCk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTI3Niw3ICsyNzksNyBAQAogCQkJfQogCQlyZXR1cm4gMDsKIAl9Ci0JZnByaW50ZihzdGRlcnIsIndob29wcywgU3lzS2V5Ym9hcmRBX0dldERldmljZVN0YXRlIGdvdCBsZW4gJWxkP1xuIixsZW4pOworCVdBUk4oZGlucHV0LCJ3aG9vcHMsIFN5c0tleWJvYXJkQV9HZXREZXZpY2VTdGF0ZSBnb3QgbGVuICVsZD9cbiIsbGVuKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjg3LDcgKzI5MCw4IEBACiAJaW50CQkJaSxuLHhlbnRyaWVzOwogCUxQU1lTS0VZQk9BUkQzMkEJa3RoaXMgPSAoTFBTWVNLRVlCT0FSRDMyQSl0aGlzOwogCi0vKglmcHJpbnRmKHN0ZGVyciwiU3lzS2V5Ym9hcmRBKCVwKS0+R2V0RGV2aWNlRGF0YSglbGQsJXAsJXAoJWxkKSwweCUwOGx4KVxuIix0aGlzLGRvZHNpemUsZG9kLGVudHJpZXMsZW50cmllcz8qZW50cmllczowLGZsYWdzKTsqLworCVRSQUNFKGRpbnB1dCwiKHRoaXM9JXAsJWxkLCVwLCVwKCVsZCkpLDB4JTA4bHgpXG4iLAorICAgIAkJdGhpcyxkb2RzaXplLGRvZCxlbnRyaWVzLGVudHJpZXM/KmVudHJpZXM6MCxmbGFncyk7CiAJaWYgKGVudHJpZXMpCiAJCXhlbnRyaWVzID0gKmVudHJpZXM7IAogCWVsc2UKQEAgLTMxMiwxMiArMzE2LDEyIEBACiB9CiAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBTeXNLZXlib2FyZEFfQWNxdWlyZShMUERJUkVDVElOUFVUREVWSUNFMzJBIHRoaXMpIHsKLQlmcHJpbnRmKHN0ZGVyciwiU3lzS2V5Ym9hcmRBKCVwKS0+QXF1aXJlKClcbiIsdGhpcyk7CisJRklYTUUoZGlucHV0LCIodGhpcz0lcCk6IHN0dWJcbiIsdGhpcyk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBTeXNLZXlib2FyZEFfVW5hY3F1aXJlKExQRElSRUNUSU5QVVRERVZJQ0UzMkEgdGhpcykgewotCWZwcmludGYoc3RkZXJyLCJTeXNLZXlib2FyZEEoJXApLT5VbmFxdWlyZSgpXG4iLHRoaXMpOworCUZJWE1FKGRpbnB1dCwiKHRoaXM9JXApOiBzdHViXG4iLHRoaXMpOwogCXJldHVybiAwOwogfQogCkBAIC0zMjUsOSArMzI5LDcgQEAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0SW5wdXREZXZpY2VBX0dldERldmljZVN0YXRlKAogCUxQRElSRUNUSU5QVVRERVZJQ0UzMkEgdGhpcyxEV09SRCBsZW4sTFBWT0lEIHB0cgogKSB7Ci0JZnByaW50ZihzdGRlcnIsIklEaXJlY3RJbnB1dERldmljZUEoJXApLT5HZXREZXZpY2VTdGF0ZSgweCUwOGx4LCVwKVxuIiwKLQkJdGhpcyxsZW4scHRyCi0JKTsKKwlGSVhNRShkaW5wdXQsIih0aGlzPSVwLDB4JTA4bHgsJXApOiBzdHViXG4iLHRoaXMsbGVuLHB0cik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMzNyw3ICszMzksNyBAQAogCWNoYXIJeGJ1Zls1MF07CiAKIAlXSU5FX1N0cmluZ0Zyb21DTFNJRChyaWlkLHhidWYpOwotCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0SW5wdXRBKCVwKS0+UXVlcnlJbnRlcmZhY2UoJXMsJXApXG4iLHRoaXMseGJ1ZixwcG9iaik7CisJVFJBQ0UoZGlucHV0LCIodGhpcz0lcCwlcywlcClcbiIsdGhpcyx4YnVmLHBwb2JqKTsKIAlpZiAoIW1lbWNtcCgmSUlEX0lVbmtub3duLHJpaWQsc2l6ZW9mKCpyaWlkKSkpIHsKIAkJdGhpcy0+bHB2dGJsLT5mbkFkZFJlZih0aGlzKTsKIAkJKnBwb2JqID0gdGhpczsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZHJpdmVyLmMgYi93aW5kb3dzL2RyaXZlci5jCmluZGV4IGEwNTFiZDkuLjc5MzMzZmEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZHJpdmVyLmMKKysrIGIvd2luZG93cy9kcml2ZXIuYwpAQCAtNCw3ICs0LDYgQEAKICAqIENvcHlyaWdodCAxOTk0IE1hcnRpbiBBeW90dGUKICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgpAQCAtMTQsNyArMTMsMTAgQEAKIAogTFBEUklWRVJJVEVNIGxwRHJ2SXRlbUxpc3QgPSBOVUxMOwogCi12b2lkIExvYWRTdGFydHVwRHJpdmVycyh2b2lkKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglMb2FkU3RhcnR1cERyaXZlcnMKKyAqLworc3RhdGljIHZvaWQgTG9hZFN0YXJ0dXBEcml2ZXJzKHZvaWQpCiB7CiAgICAgSERSVlIxNiBoRHJ2OwogICAgIGNoYXIgIHN0clsyNTZdOwpAQCAtMjMsOCArMjUsNyBAQAogICAgIGlmIChHZXRQcml2YXRlUHJvZmlsZVN0cmluZzMyQSggImRyaXZlcnMiLCBOVUxMLCAiIiwgc3RyLCBzaXplb2Yoc3RyKSwKIAkJCQkgIlNZU1RFTS5JTkkiICkgPCAyKQogICAgIHsKLSAgICAJZnByaW50Ziggc3RkZXJyLAotCQkgIkxvYWRTdGFydHVwRHJpdmVycyAvLyBjYW4ndCBmaW5kIGRyaXZlcnMgc2VjdGlvbiBpbiBzeXN0ZW0uaW5pXG4iICk7CisgICAgCUVSUiggZHJpdmVyLCJDYW4ndCBmaW5kIGRyaXZlcnMgc2VjdGlvbiBpbiBzeXN0ZW0uaW5pXG4iICk7CiAJcmV0dXJuOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvd2luZG93cy9ldmVudC5jIGIvd2luZG93cy9ldmVudC5jCmluZGV4IDM4NzdhMGUuLjMyNTdkM2QgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZXZlbnQuYworKysgYi93aW5kb3dzL2V2ZW50LmMKQEAgLTgsNyArOCw2IEBACiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CkBAIC0zOSw2ICszOCw3IEBACiAjaW5jbHVkZSAia2V5Ym9hcmQuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImRkZV9wcm9jLmgiCisjaW5jbHVkZSAid2luc29jay5oIgogCiAKICNkZWZpbmUgTkJfQlVUVE9OUyAgICAgIDMgICAgIC8qIFdpbmRvd3MgY2FuIGhhbmRsZSAzIGJ1dHRvbnMgKi8KQEAgLTEwNiwxMCArMTA2LDYgQEAKIHN0YXRpYyB2b2lkIEVWRU5UX0VudGVyTm90aWZ5KCBXTkQgKnBXbmQsIFhDcm9zc2luZ0V2ZW50ICpldmVudCApOwogKi8KIAotZXh0ZXJuIHZvaWQgRk9DVVNfU2V0WEZvY3VzKCBIV05EMzIgKTsKLWV4dGVybiBCT09MMTYgRFJBR19RdWVyeVVwZGF0ZSggSFdORDE2LCBTRUdQVFIsIEJPT0wzMiApOwotZXh0ZXJuIEJPT0wzMiBXSU5TT0NLX0hhbmRsZUlPKCBpbnQqIG1heF9mZCwgaW50IG51bV9wZW5kaW5nLCBmZF9zZXQgcFszXSwgZmRfc2V0IGVbM10gKTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRVZFTlRfSW5pdAogICoKQEAgLTEzMCwxMyArMTI2LDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgIEVWRU5UX0FkZElPIAogICovCi12b2lkIEVWRU5UX0FkZElPKCBpbnQgZmQsIGludCBpb190eXBlICkKK3ZvaWQgRVZFTlRfQWRkSU8oIGludCBmZCwgdW5zaWduZWQgaW9fdHlwZSApCiB7CiAgICAgRkRfU0VUKCBmZCwgJl9fZXZlbnRfaW9fc2V0W2lvX3R5cGVdICk7CiAgICAgaWYoIF9fZXZlbnRfbWF4X2ZkIDw9IGZkICkgX19ldmVudF9tYXhfZmQgPSBmZCArIDE7CiB9CiAKLXZvaWQgRVZFTlRfRGVsZXRlSU8oIGludCBmZCwgaW50IGlvX3R5cGUgKQordm9pZCBFVkVOVF9EZWxldGVJTyggaW50IGZkLCB1bnNpZ25lZCBpb190eXBlICkKIHsKICAgICBGRF9DTFIoIGZkLCAmX19ldmVudF9pb19zZXRbaW9fdHlwZV0gKTsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3Mva2V5Ym9hcmQuYyBiL3dpbmRvd3Mva2V5Ym9hcmQuYwppbmRleCAwNmRlMWY3Li4xZTIwMzM5IDEwMDY0NAotLS0gYS93aW5kb3dzL2tleWJvYXJkLmMKKysrIGIvd2luZG93cy9rZXlib2FyZC5jCkBAIC00LDExICs0LDExIEBACiAgKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogICogQ29weXJpZ2h0IDE5OTYgQWxicmVjaHQgS2xlaW5lIAogICogQ29weXJpZ2h0IDE5OTcgRGF2aWQgRmF1cmUKKyAqIENvcHlyaWdodCAxOTk4IE1vcnRlbiBXZWxpbmRlcgogICoKICAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPFgxMS9rZXlzeW0uaD4KQEAgLTIwOSw3ICsyMDksNyBAQAogICAgIGUyLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgIGUyLnN0YXRlID0gMDsKIAotICAgIE9FTXZrZXkgPSAweGI5OyAvKiBmaXJzdCBPRU0gdmlydHVhbCBrZXkgYXZhaWxhYmxlIGlzIGJhICovCisgICAgT0VNdmtleSA9IFZLX09FTV83OyAvKiBuZXh0IGlzIGF2YWlsYWJsZS4gICovCiAgICAgZm9yIChlMi5rZXljb2RlPW1pbl9rZXljb2RlOyBlMi5rZXljb2RlPD1tYXhfa2V5Y29kZTsgZTIua2V5Y29kZSsrKQogICAgIHsKICAgICAgICAgVFNYTG9va3VwU3RyaW5nKCZlMiwgTlVMTCwgMCwgJmtleXN5bSwgTlVMTCk7CkBAIC0yNzAsNiArMjcwLDI1IEBACiAJCSAgICB2a2V5ID0ga2V5c3ltOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZXlzeW0gPSBUU1hMb29rdXBLZXlzeW0oJmUyLCBpKTsKKwkJc3dpdGNoIChrZXlzeW0pCisJCXsKKwkJY2FzZSAnOyc6IGNhc2UgJzonOiAgIHZrZXkgPSBWS19PRU1fMTsgYnJlYWs7CisJCWNhc2UgJy8nOiBjYXNlICc/JzogICB2a2V5ID0gVktfT0VNXzI7IGJyZWFrOworCQljYXNlICdgJzogY2FzZSAnfic6ICAgdmtleSA9IFZLX09FTV8zOyBicmVhazsKKwkJY2FzZSAnWyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNDsgYnJlYWs7CisJCWNhc2UgJ1xcJzogICAgICAgICAgICB2a2V5ID0gVktfT0VNXzU7IGJyZWFrOworCQljYXNlICddJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV82OyBicmVhazsKKwkJY2FzZSAnXCcnOiBjYXNlICdcIic6IHZrZXkgPSBWS19PRU1fNzsgYnJlYWs7CisJCWNhc2UgJywnOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNX0NPTU1BOyBicmVhazsKKwkJY2FzZSAnLic6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fUEVSSU9EOyBicmVhazsKKwkJY2FzZSAnLSc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fTUlOVVM7IGJyZWFrOworCQljYXNlICcrJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV9QTFVTOyBicmVhazsKKwkJfQorCSAgICB9CisKICAgICAgICAgICAgIGlmICghdmtleSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKiBPdGhlcnMga2V5czogbGV0J3MgYXNzaWduIE9FTSB2aXJ0dWFsIGtleSBjb2RlcyBpbiB0aGUgYWxsb3dlZCByYW5nZSwKQEAgLTI3OCw3ICsyOTcsNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBjYXNlIDB4YzEgOiBPRU12a2V5PTB4ZGI7IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMHhlNSA6IE9FTXZrZXk9MHhlOTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweGY2IDogT0VNdmtleT0weGY1OyBmcHJpbnRmKHN0ZGVyciwiTm8gbW9yZSBPRU0gdmtleSBhdmFpbGFibGUhXG4iKTsKKyAgICAgICAgICAgICAgICBjYXNlIDB4ZjYgOiBPRU12a2V5PTB4ZjU7IFdBUk4oa2V5Ym9hcmQsIk5vIG1vcmUgT0VNIHZrZXkgYXZhaWxhYmxlIVxuIik7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgdmtleSA9IE9FTXZrZXk7CkBAIC0yODcsOCArMzA2LDggQEAKICAgICAgICAgICAgICAgICB7CiAJCSAgICBkYmdfZGVjbF9zdHIoa2V5Ym9hcmQsIDEwMjQpOwogCi0gICAgICAgICAgICAgICAgICAgIFRSQUNFKGtleWJvYXJkLCAiT0VNIHNwZWNpZmljIHZpcnR1YWwga2V5ICVYIGFzc2lnbmVkIgotCQkJCSAidG8ga2V5Y29kZSAlWCA6XG4iLCBPRU12a2V5LCBlMi5rZXljb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgVFJBQ0Uoa2V5Ym9hcmQsICJPRU0gc3BlY2lmaWMgdmlydHVhbCBrZXkgJVggYXNzaWduZWQgIgorCQkJCSAidG8ga2V5Y29kZSAlWDpcbiIsIE9FTXZrZXksIGUyLmtleWNvZGUpOwogICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5c3ltc19wZXJfa2V5Y29kZTsgaSArPSAxKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyCSprc25hbWU7CkBAIC04NjQsMTEgKzg4MywxMSBAQAogCSAgICAgIGlmIChUU1hLZXljb2RlVG9LZXlzeW0oZGlzcGxheSxrZXljb2RlLGkpPT1rZXlzeW0pIGluZGV4PWk7CiAJICAgIHN3aXRjaCAoaW5kZXgpIHsKIAkgICAgY2FzZSAtMSA6Ci0JICAgICAgZnByaW50ZihzdGRlcnIsIktleXN5bSAlbHggbm90IGZvdW5kIHdoaWxlIHBhcnNpbmcgdGhlIGtleWNvZGUgdGFibGVcbiIsa2V5c3ltKTsgYnJlYWs7CisJICAgICAgV0FSTihrZXlib2FyZCwiS2V5c3ltICVseCBub3QgZm91bmQgd2hpbGUgcGFyc2luZyB0aGUga2V5Y29kZSB0YWJsZVxuIixrZXlzeW0pOyBicmVhazsKIAkgICAgY2FzZSAwIDogYnJlYWs7CiAJICAgIGNhc2UgMSA6IGhpZ2hieXRlID0gMHgwMTAwOyBicmVhazsKIAkgICAgY2FzZSAyIDogaGlnaGJ5dGUgPSAwWDA2MDA7IGJyZWFrOwotCSAgICBkZWZhdWx0IDogZnByaW50ZihzdGRlcnIsImluZGV4ICVkIGZvdW5kIGJ5IFhLZXljb2RlVG9LZXlzeW0uIHBsZWFzZSByZXBvcnQhIFxuIixpbmRleCk7CisJICAgIGRlZmF1bHQgOiBFUlIoa2V5Ym9hcmQsImluZGV4ICVkIGZvdW5kIGJ5IFhLZXljb2RlVG9LZXlzeW0uIHBsZWFzZSByZXBvcnQhIFxuIixpbmRleCk7CiAJICAgIH0KIAkgICAgLyoKIAkgICAgICBpbmRleCA6IDAgICAgIGFkZHMgMHgwMDAwCkBAIC05MjQsNyArOTQzLDcgQEAKICAgICAgIHJldHVybiAxMjsgICAvKiBXZSdyZSBkb2luZyBhbiAxMDEgZm9yIG5vdywgc28gcmV0dXJuIDEyIEYta2V5cyAqLwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDogICAgIAotICAgICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIHR5cGUgb24gR2V0S2V5Ym9hcmRUeXBlXG4iKTsKKyAgICAgIFdBUk4oa2V5Ym9hcmQsICJVbmtub3duIHR5cGVcbiIpOwogICAgICAgcmV0dXJuIDA7ICAgIC8qIFRoZSBib29rIHNheXMgMCBoZXJlLCBzbyAwICovCiAgICAgfQogfQpAQCAtOTg3LDcgKzEwMDYsNyBAQAogCQkJcmV0dXJuIDA7CiAJCQl9CiAJCWRlZmF1bHQ6IC8qIHJlc2VydmVkICovCi0JCQlmcHJpbnRmKHN0ZGVyciwgIk1hcFZpcnR1YWxLZXk6IHVua25vd24gd01hcFR5cGUgJWQgIVxuIiwKKwkJCVdBUk4oa2V5Ym9hcmQsICJVbmtub3duIHdNYXBUeXBlICVkICFcbiIsCiAJCQkJd01hcFR5cGUpOwogCQkJcmV0dXJuIDA7CQogCX0KQEAgLTExMDUsNyArMTEyNCw3IEBACiAgICAgICB9CiAgICAgaWYgKCFlLmtleWNvZGUpCiAgICAgICB7Ci0JZnByaW50ZihzdGRlcnIsIlRvQXNjaWkgOiBVbmtub3duIHZpcnR1YWwga2V5ICVYICEhISBcbiIsdmlydEtleSk7CisJV0FSTihrZXlib2FyZCwiVW5rbm93biB2aXJ0dWFsIGtleSAlWCAhISEgXG4iLHZpcnRLZXkpOwogCXJldHVybiB2aXJ0S2V5OyAvKiB3aGF0ZXZlciAqLwogICAgICAgfQogICAgIGUuc3RhdGUgPSAwOwpAQCAtMTIyOCw5ICsxMjQ3LDkgQEAKIAkJa3NuYW1lID0gIk5vIE5hbWUiOwogCSAgICBpZiAoKGtleXN5bSA+PiA4KSAhPSAweGZmKQogCQl7Ci0JCWZwcmludGYoc3RkZXJyLCAiUGxlYXNlIHJlcG9ydCA6IG5vIGNoYXIgZm9yIGtleXN5bSAlMDRsWCAoJXMpIDpcbiIsCisJCUVSUihrZXlib2FyZCwgIlBsZWFzZSByZXBvcnQ6IG5vIGNoYXIgZm9yIGtleXN5bSAlMDRsWCAoJXMpIDpcbiIsCiAJCQlrZXlzeW0sIGtzbmFtZSk7Ci0JCWZwcmludGYoc3RkZXJyLCAiICB2aXJ0S2V5ID0gJVgsIHNjYW5Db2RlID0gJVgsIGtleWNvZGUgPSAlWCwgc3RhdGUgPSAlWFxuIiwKKwkJRVJSKGtleWJvYXJkLCAiKHZpcnRLZXk9JVgsc2NhbkNvZGU9JVgsa2V5Y29kZT0lWCxzdGF0ZT0lWClcbiIsCiAJCQl2aXJ0S2V5LCBzY2FuQ29kZSwgZS5rZXljb2RlLCBlLnN0YXRlKTsKIAkJfQogCSAgICB9CkBAIC0xMjQ2LDcgKzEyNjUsNyBAQAogICovCiBIS0wzMiBXSU5BUEkgR2V0S2V5Ym9hcmRMYXlvdXQoRFdPUkQgZHdMYXlvdXQpCiB7Ci0JZnByaW50ZihzdGRlcnIsIkdldEtleWJvYXJkTGF5b3V0KCVsZCksU1RVQiFcbiIsZHdMYXlvdXQpOworCUZJWE1FKGtleWJvYXJkLCIoJWxkKTogc3R1YlxuIixkd0xheW91dCk7CiAJcmV0dXJuICgweGNhZmU8PDE2KXxHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOyAvKiBGSVhNRSAqLwogfQogCkBAIC0xMjU2LDcgKzEyNzUsNyBAQAogICovCiBJTlQzMiBXSU5BUEkgR2V0S2V5Ym9hcmRMYXlvdXRMaXN0KElOVDMyIG5CdWZmLEhLTDMyICpsYXlvdXRzKQogewotCWZwcmludGYoc3RkZXJyLCJHZXRLZXlib2FyZExheW91dExpc3QoJWQsJXApLFNUVUIhXG4iLG5CdWZmLGxheW91dHMpOworCUZJWE1FKGtleWJvYXJkLCIoJWQsJXApOiBzdHViXG4iLG5CdWZmLGxheW91dHMpOwogCWlmIChsYXlvdXRzKQogCQlsYXlvdXRzWzBdID0gR2V0S2V5Ym9hcmRMYXlvdXQoMCk7CiAJcmV0dXJuIDE7CkBAIC0xMjY3LDcgKzEyODYsNyBAQAogICogICAgICAgICAgIFJlZ2lzdGVySG90S2V5CQkJKFVTRVIzMi40MzMpCiAgKi8KIEJPT0wzMiBXSU5BUEkgUmVnaXN0ZXJIb3RLZXkoSFdORDMyIGh3bmQsSU5UMzIgaWQsVUlOVDMyIG1vZGlmaWVycyxVSU5UMzIgdmspIHsKLQlmcHJpbnRmKHN0ZGVyciwiUmVnaXN0ZXJIb3RLZXkoJTA4eCwlZCwlMDh4LCVkKSwgU1RVQiFcbiIsCisJRklYTUUoa2V5Ym9hcmQsIiglMDh4LCVkLCUwOHgsJWQpOiBzdHViXG4iLAogCQlod25kLGlkLG1vZGlmaWVycyx2awogCSk7CiAJcmV0dXJuIFRSVUU7CkBAIC0xMjc3LDYgKzEyOTYsNiBAQAogICogICAgICAgICAgIFVucmVnaXN0ZXJIb3RLZXkJCQkoVVNFUjMyLjU2NSkKICAqLwogQk9PTDMyIFdJTkFQSSBVbnJlZ2lzdGVySG90S2V5KEhXTkQzMiBod25kLElOVDMyIGlkKSB7Ci0JZnByaW50ZihzdGRlcnIsIlVucmVnaXN0ZXJIb3RLZXkoJTA4eCwlZCksc3R1YiFcbiIsaHduZCxpZCk7CisJRklYTUUoa2V5Ym9hcmQsIiglMDh4LCVkKTogc3R1YlxuIixod25kLGlkKTsKIAlyZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWRpLmMgYi93aW5kb3dzL21kaS5jCmluZGV4IDM5NGI0YzMuLjE4NWM3Y2UgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbWRpLmMKKysrIGIvd2luZG93cy9tZGkuYwpAQCAtMTQsNyArMTQsNiBAQAogCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbi5oIgpkaWZmIC0tZ2l0IGEvd2luZG93cy9tZXNzYWdlLmMgYi93aW5kb3dzL21lc3NhZ2UuYwppbmRleCBmNmJiYzBlLi5lZTU3Njk2IDEwMDY0NAotLS0gYS93aW5kb3dzL21lc3NhZ2UuYworKysgYi93aW5kb3dzL21lc3NhZ2UuYwpAQCAtMzcsOCArMzcsNiBAQAogZXh0ZXJuIE1FU1NBR0VRVUVVRSAqcEN1cnNvclF1ZXVlOwkJCSAvKiBxdWV1ZS5jICovCiBleHRlcm4gTUVTU0FHRVFVRVVFICpwQWN0aXZlUXVldWU7CiAKLWV4dGVybiB2b2lkIGpveVNlbmRNZXNzYWdlcyh2b2lkKTsKLQogRFdPUkQgTVNHX1dpbmVTdGFydFRpY2tzOyAvKiBUaWNrcyBhdCBXaW5lIHN0YXJ0dXAgKi8KIAogc3RhdGljIFVJTlQzMiBkb3VibGVDbGlja1NwZWVkID0gNDUyOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9tc2dib3guYyBiL3dpbmRvd3MvbXNnYm94LmMKaW5kZXggNWViZjVlMi4uNmMwODRlNCAxMDA2NDQKLS0tIGEvd2luZG93cy9tc2dib3guYworKysgYi93aW5kb3dzL21zZ2JveC5jCkBAIC00LDcgKzQsNiBAQAogICogQ29weXJpZ2h0IDE5OTUgQmVybmQgU2NobWlkdAogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJkbGdzLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgpkaWZmIC0tZ2l0IGEvd2luZG93cy9ub25jbGllbnQuYyBiL3dpbmRvd3Mvbm9uY2xpZW50LmMKaW5kZXggNzUyZjJjYy4uOGVhNDBjMiAxMDA2NDQKLS0tIGEvd2luZG93cy9ub25jbGllbnQuYworKysgYi93aW5kb3dzL25vbmNsaWVudC5jCkBAIC03NSw4ICs3NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBleFN0eWxlICkKIHsKICAgICBpZihUV0VBS19XaW45NUxvb2spCi0JZnByaW50Ziggc3RkZGViLCAiTkNfQWRqdXN0UmVjdCB3YXMgY2FsbGVkIGluIFdpbjk1IG1vZGUuICBBaWVlISAgIgotCQkgIlBsZWFzZSByZXBvcnQgdGhpcy5cbiIgKTsKKwlFUlIobm9uY2xpZW50LCAiQ2FsbGVkIGluIFdpbjk1IG1vZGUuIEFpZWUhIFBsZWFzZSByZXBvcnQgdGhpcy5cbiIgKTsKIAogICAgIGlmKHN0eWxlICYgV1NfSUNPTklDKSByZXR1cm47CiAgICAgLyogRGVjaWRlIGlmIHRoZSB3aW5kb3cgd2lsbCBiZSBtYW5hZ2VkIChzZWUgQ3JlYXRlV2luZG93RXgpICovCkBAIC0xNjAsMTIgKzE1OSwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRHJhd0NhcHRpb25UZW1wQSAgICAoVVNFUjMyLjU5OSkKICAqLwotRFdPUkQKLURyYXdDYXB0aW9uVGVtcDMyQShIV05EMzIgaHduZCxIREMzMiBoZGMsTFBSRUNUMzIgcmVjdCxIRk9OVDMyIGhmb250LERXT1JEIHgxLExQQ1NUUiBzdHIsRFdPUkQgeDIpIHsKLQlmcHJpbnRmKHN0ZGVyciwiRHJhd0NhcHRpb25UZW1wQSglMDh4LCUwOHgsJXAsJTA4eCwlMDhseCxcIiVzXCIsJTA4bHgpLHR1YiFcbiIsCi0JCWh3bmQsaGRjLHJlY3QsaGZvbnQseDEsc3RyLHgyCi0JKTsKLQlyZXR1cm4gMDsKK0RXT1JEIERyYXdDYXB0aW9uVGVtcDMyQShIV05EMzIgaHduZCxIREMzMiBoZGMsTFBSRUNUMzIgcmVjdCwKKyAgICBIRk9OVDMyIGhmb250LERXT1JEIHgxLExQQ1NUUiBzdHIsRFdPUkQgeDIpCit7CisgICAgRklYTUUobm9uY2xpZW50LCIoJTA4eCwlMDh4LCVwLCUwOHgsJTA4bHgsXCIlc1wiLCUwOGx4KTogc3R1YlxuIiwKKyAgICAgICAgaHduZCxoZGMscmVjdCxoZm9udCx4MSxzdHIseDIpOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTY2OSw4ICs2NjgsNyBAQAogICAgIElOVDMyIHdpZHRoLCBoZWlnaHQ7CiAKICAgICBpZihUV0VBS19XaW45NUxvb2spCi0JZnByaW50Ziggc3RkZGViLCAiTkNfRHJhd0ZyYW1lIHdhcyBjYWxsZWQgaW4gV2luOTUgbW9kZS4gIEFpZWUhICAiCi0JCSAiUGxlYXNlIHJlcG9ydCB0aGlzLlxuIiApOworCUVSUihub25jbGllbnQsICJDYWxsZWQgaW4gV2luOTUgbW9kZS4gQWllZSEgUGxlYXNlIHJlcG9ydCB0aGlzLlxuIiApOwogCiAgICAgaWYgKGRsZ0ZyYW1lKQogICAgIHsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvcGFpbnRpbmcuYyBiL3dpbmRvd3MvcGFpbnRpbmcuYwppbmRleCA1YmZlZWQyLi5kMzVlOTkxIDEwMDY0NAotLS0gYS93aW5kb3dzL3BhaW50aW5nLmMKKysrIGIvd2luZG93cy9wYWludGluZy5jCkBAIC04LDcgKzgsNiBAQAogICoJICB3aW5kb3cgY29vcmRzIGFzIHdlbGwsIGxvb2t1cCAndGhlIHBhaW4nIGNvbW1lbnQgaW4gdGhlIHdpbnBvcy5jKS4KICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJxdWV1ZS5oIgogI2luY2x1ZGUgImdkaS5oIgpAQCAtMTM1LDcgKzEzNCw3IEBACiAKICAgICBpZiAoIWxwcy0+aGRjKQogICAgIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJHZXREQ0V4KCkgZmFpbGVkIGluIEJlZ2luUGFpbnQoKSwgaHduZD0lMDR4XG4iLCBod25kKTsKKyAgICAgICAgV0FSTih3aW4sICJHZXREQ0V4KCkgZmFpbGVkIGluIEJlZ2luUGFpbnQoKSwgaHduZD0lMDR4XG4iLCBod25kKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCmRpZmYgLS1naXQgYS93aW5kb3dzL3F1ZXVlLmMgYi93aW5kb3dzL3F1ZXVlLmMKaW5kZXggYTM0ZTQ2MC4uYjQ1YmJlMiAxMDA2NDQKLS0tIGEvd2luZG93cy9xdWV1ZS5jCisrKyBiL3dpbmRvd3MvcXVldWUuYwpAQCAtNDAsMTIgKzQwLDExIEBACiAgICAgaWYgKCEocHEgPSAoTUVTU0FHRVFVRVVFKikgR2xvYmFsTG9jazE2KCBoUXVldWUgKSkgfHwKICAgICAgICAgR2xvYmFsU2l6ZTE2KGhRdWV1ZSkgPCBzaXplb2YoTUVTU0FHRVFVRVVFKStwcS0+cXVldWVTaXplKnNpemVvZihRTVNHKSkKICAgICB7Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiUwNHggaXMgbm90IGEgcXVldWUgaGFuZGxlXG4iLCBoUXVldWUgKTsKKyAgICAgICAgV0FSTihtc2csICIlMDR4IGlzIG5vdCBhIHF1ZXVlIGhhbmRsZVxuIiwgaFF1ZXVlICk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBmcHJpbnRmKCBzdGRlcnIsCi0gICAgICAgICAgICAgIm5leHQ6ICUxMi40eCAgSW50ZXJ0YXNrIFNlbmRNZXNzYWdlOlxuIgorICAgIERVTVAoICAgICJuZXh0OiAlMTIuNHggIEludGVydGFzayBTZW5kTWVzc2FnZTpcbiIKICAgICAgICAgICAgICAiaFRhc2s6ICUxMS40eCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgogICAgICAgICAgICAgICJtc2dTaXplOiAlOS40eCAgaFduZDogJTEwLjR4XG4iCiAgICAgICAgICAgICAgIm1zZ0NvdW50OiAlOC40eCAgbXNnOiAlMTEuNHhcbiIKQEAgLTc1LDIyICs3NCwyMiBAQAogICAgIGNoYXIgbW9kdWxlWzEwXTsKICAgICBIUVVFVUUxNiBoUXVldWUgPSBoRmlyc3RRdWV1ZTsKIAotICAgIGZwcmludGYoIHN0ZGVyciwgIlF1ZXVlIFNpemUgTXNncyBUYXNrXG4iICk7CisgICAgRFVNUCggIlF1ZXVlIFNpemUgTXNncyBUYXNrXG4iICk7CiAgICAgd2hpbGUgKGhRdWV1ZSkKICAgICB7CiAgICAgICAgIE1FU1NBR0VRVUVVRSAqcXVldWUgPSAoTUVTU0FHRVFVRVVFICopR2xvYmFsTG9jazE2KCBoUXVldWUgKTsKICAgICAgICAgaWYgKCFxdWV1ZSkKICAgICAgICAgewotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiKioqIEJhZCBxdWV1ZSBoYW5kbGUgJTA0eFxuIiwgaFF1ZXVlICk7CisgICAgICAgICAgICBXQVJOKCBtc2csICJCYWQgcXVldWUgaGFuZGxlICUwNHhcbiIsIGhRdWV1ZSApOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGlmICghR2V0TW9kdWxlTmFtZSggcXVldWUtPmhUYXNrLCBtb2R1bGUsIHNpemVvZihtb2R1bGUgKSkpCiAgICAgICAgICAgICBzdHJjcHkoIG1vZHVsZSwgIj8/PyIgKTsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJTA0eCAlNWQgJTRkICUwNHggJXNcbiIsIGhRdWV1ZSwgcXVldWUtPm1zZ1NpemUsCisgICAgICAgIERVTVAoICIlMDR4ICU1ZCAlNGQgJTA0eCAlc1xuIiwgaFF1ZXVlLCBxdWV1ZS0+bXNnU2l6ZSwKICAgICAgICAgICAgICAgICAgcXVldWUtPm1zZ0NvdW50LCBxdWV1ZS0+aFRhc2ssIG1vZHVsZSApOwogICAgICAgICBoUXVldWUgPSBxdWV1ZS0+bmV4dDsKICAgICB9Ci0gICAgZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CisgICAgRFVNUCggIlxuIiApOwogfQogCiAKQEAgLTQyMSw3ICs0MjAsNyBAQAogICAgIGlmICgocG9zID09IG1zZ1F1ZXVlLT5uZXh0TWVzc2FnZSkgJiYgKG1zZ1F1ZXVlLT5tc2dDb3VudCA+IDApKQogICAgIHsKIAlTSUdOQUxfTWFza0FzeW5jRXZlbnRzKCBGQUxTRSApOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiTVNHX0FkZE1zZyAvLyBxdWV1ZSBpcyBmdWxsICFcbiIpOworICAgICAgICBXQVJOKCBtc2csIlF1ZXVlIGlzIGZ1bGwhXG4iICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvc2Nyb2xsLmMgYi93aW5kb3dzL3Njcm9sbC5jCmluZGV4IDg4NTk2OGMuLjNhY2VmNDggMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvc2Nyb2xsLmMKKysrIGIvd2luZG93cy9zY3JvbGwuYwpAQCAtMTgsOSArMTgsNiBAQAogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCi1leHRlcm4gSFdORDMyIENBUkVUX0dldEh3bmQoKTsJCQkvKiB3aW5kb3dzL2NhcmV0LmMgKi8KLWV4dGVybiB2b2lkICAgQ0FSRVRfR2V0UmVjdChMUFJFQ1QzMik7Ci1leHRlcm4gdm9pZCBDTElQUElOR19VcGRhdGVHQ1JlZ2lvbihEQyogKTsJLyogb2JqZWN0cy9jbGlwcGluZy5jICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICBTY3JvbGxXaW5kb3cxNiAgIChVU0VSLjYxKQpkaWZmIC0tZ2l0IGEvd2luZG93cy9zeXNjb2xvci5jIGIvd2luZG93cy9zeXNjb2xvci5jCmluZGV4IDRhZjQ3N2IuLmMwOGFkYzcgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvc3lzY29sb3IuYworKysgYi93aW5kb3dzL3N5c2NvbG9yLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImdkaS5oIgogI2luY2x1ZGUgInR3ZWFrLmgiCiAKQEAgLTE5OSw3ICsyMDAsNyBAQAogewogICAgIGlmICgwIDw9IGluZGV4ICYmIGluZGV4IDwgTlVNX1NZU19DT0xPUlMpCiAgICAgICAgIHJldHVybiBTeXNDb2xvckJydXNoZXNbaW5kZXhdOwotICAgIGZwcmludGYoIHN0ZGVyciwgIkdldFN5c0NvbG9yQnJ1c2gzMjogVW5rbm93biBpbmRleCglZClcbiIsIGluZGV4ICk7CisgICAgV0FSTihzeXNjb2xvciwgIlVua25vd24gaW5kZXgoJWQpXG4iLCBpbmRleCApOwogICAgIHJldHVybiBHZXRTdG9ja09iamVjdDMyKExUR1JBWV9CUlVTSCk7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvdXNlci5jIGIvd2luZG93cy91c2VyLmMKaW5kZXggZjBkOTIwZS4uZDBjZDdlZCAxMDA2NDQKLS0tIGEvd2luZG93cy91c2VyLmMKKysrIGIvd2luZG93cy91c2VyLmMKQEAgLTUsNyArNSw2IEBACiAgKgkgICAgIDE5OTYgQWxleCBLb3JvYmthIAogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJyZXNvdXJjZS5oIgpAQCAtMTYsMTcgKzE1LDE2IEBACiAjaW5jbHVkZSAicXVldWUuaCIKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJjbGlwYm9hcmQuaCIKKyNpbmNsdWRlICJtZW51LmgiCiAjaW5jbHVkZSAiaG9vay5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAidG9vbGhlbHAuaCIKICNpbmNsdWRlICJtZXNzYWdlLmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAibWlzY2VtdS5oIgorI2luY2x1ZGUgInF1ZXVlLmgiCiAjaW5jbHVkZSAic2hlbGwuaCIKIAotZXh0ZXJuIEJPT0wzMiBNRU5VX1BhdGNoUmVzaWRlbnRQb3B1cCggSFFVRVVFMTYsIFdORCogKTsKLWV4dGVybiB2b2lkIFFVRVVFX0ZsdXNoTWVzc2FnZXMoSFFVRVVFMTYpOwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRGcmVlU3lzdGVtUmVzb3VyY2VzICAgKFVTRVIuMjg0KQogICovCkBAIC0yNDQsNyArMjQyLDcgQEAKIAkgICAgIGJyZWFrOwogCiAJZGVmYXVsdDoKLQkgICAgIGZwcmludGYoc3RkZXJyLCJVbmltcGxlbWVudGVkIFVTRVIgc2lnbmFsOiAlaVxuIiwgKGludCl1Q29kZSApOworCSAgICAgRklYTUUobXNnLCJVbmltcGxlbWVudGVkIFVTRVIgc2lnbmFsOiAlaVxuIiwgKGludCl1Q29kZSApOwogICAgIH0KIH0KIApAQCAtMjYzLDcgKzI2MSw3IEBACiAgKi8KIEJPT0wxNiBXSU5BUEkgRXhpdFdpbmRvd3NFeGVjMTYoIExQQ1NUUiBscHN6RXhlLCBMUENTVFIgbHBzelBhcmFtcyApCiB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJFeGl0V2luZG93c0V4ZWMoKSA6IFNob3VsZCBydW4gdGhlIGZvbGxvd2luZyBpbiBET1MtbW9kZSA6XG5cdFwiJXMgJXNcIlxuIiwKKyAgICBUUkFDRShzeXN0ZW0sICJTaG91bGQgcnVuIHRoZSBmb2xsb3dpbmcgaW4gRE9TLW1vZGU6IFwiJXMgJXNcIlxuIiwKIAlscHN6RXhlLCBscHN6UGFyYW1zKTsKICAgICByZXR1cm4gRXhpdFdpbmRvd3NFeCggRVdYX0xPR09GRiwgMHhmZmZmZmZmZiApOwogfQpAQCAtMzEwLDcgKzMwOCw3IEBACiAgKiAgICAgICAgICAgRW51bURpc3BsYXlTZXR0aW5nc0EgICAoVVNFUjMyLjU5MikKICAqLwogQk9PTDMyIFdJTkFQSSBFbnVtRGlzcGxheVNldHRpbmdzMzJBKExQQ1NUUiBuYW1lLERXT1JEIG4sTFBERVZNT0RFMzJBIGRldm1vZGUpIHsKLQlmcHJpbnRmKHN0ZGVyciwiRW51bURpc3BsYXlTZXR0aW5nczMyQSglcywlbGQsJXApXG4iLG5hbWUsbixkZXZtb2RlKTsKKwlUUkFDRShzeXN0ZW0sIiglcywlbGQsJXApXG4iLG5hbWUsbixkZXZtb2RlKTsKIAlpZiAobj09MCkgewogCQlkZXZtb2RlLT5kbUJpdHNQZXJQZWwgPSBEZWZhdWx0RGVwdGhPZlNjcmVlbihzY3JlZW4pOwogCQlkZXZtb2RlLT5kbVBlbHNIZWlnaHQgPSBzY3JlZW5IZWlnaHQ7CkBAIC0zMjgsNyArMzI2LDcgQEAKICAqLwogRkFSUFJPQzE2IFNldEV2ZW50SG9vayhGQVJQUk9DMTYgbHBmbkV2ZW50SG9vaykKIHsKLQlmcHJpbnRmKHN0ZGVyciwgIlNldEV2ZW50SG9vayhscGZuRXZlbnRIb29rID0gJTA4eCk6IHN0dWIgIVxuIiwgKFVJTlQzMilscGZuRXZlbnRIb29rKTsKKwlGSVhNRShob29rLCAiKGxwZm5FdmVudEhvb2s9JTA4eCk6IHN0dWJcbiIsIChVSU5UMzIpbHBmbkV2ZW50SG9vayk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2luLmMgYi93aW5kb3dzL3dpbi5jCmluZGV4IDU1NjNhNzYuLmFmMjkxN2QgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2luLmMKKysrIGIvd2luZG93cy93aW4uYwpAQCAtNSw3ICs1LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxYMTEvWGF0b20uaD4KIApAQCAtNDAsMTEgKzM5LDYgQEAKIHN0YXRpYyBXT1JEIHdEcmFnV2lkdGggPSA0Owogc3RhdGljIFdPUkQgd0RyYWdIZWlnaHQ9IDM7CiAKLWV4dGVybiBCT09MMzIgSUNPTlRJVExFX0luaXQodm9pZCk7Ci1leHRlcm4gQk9PTDMyIE1FTlVfUGF0Y2hSZXNpZGVudFBvcHVwKCBIUVVFVUUxNiwgV05EKiApOwotZXh0ZXJuIEhXTkQzMiBDQVJFVF9HZXRId25kKHZvaWQpOwotZXh0ZXJuIEJPT0wzMiBFVkVOVF9DaGVja0ZvY3VzKHZvaWQpOwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBXSU5fRmluZFduZFB0cgogICoKQEAgLTU5LDcgKzUzLDcgQEAKICAgICBpZiAocHRyLT5kd01hZ2ljICE9IFdORF9NQUdJQykgcmV0dXJuIE5VTEw7CiAgICAgaWYgKHB0ci0+aHduZFNlbGYgIT0gaHduZCkKICAgICB7Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkNhbid0IGhhcHBlbjogaHduZCAlMDR4IHNlbGYgcG9pbnRlciBpcyAlMDR4XG4iLAorICAgICAgICBFUlIoIHdpbiwgIkNhbid0IGhhcHBlbjogaHduZCAlMDR4IHNlbGYgcG9pbnRlciBpcyAlMDR4XG4iLAogICAgICAgICAgICAgICAgICBod25kLCBwdHItPmh3bmRTZWxmICk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTgwLDE2ICs3NCwxNSBAQAogCiAgICAgaWYgKCEocHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpCiAgICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIlMDR4IGlzIG5vdCBhIHdpbmRvdyBoYW5kbGVcbiIsIGh3bmQgKTsKKyAgICAgICAgV0FSTiggd2luLCAiJTA0eCBpcyBub3QgYSB3aW5kb3cgaGFuZGxlXG4iLCBod25kICk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBpZiAoIUdldENsYXNzTmFtZTMyQSggaHduZCwgY2xhc3NOYW1lLCBzaXplb2YoY2xhc3NOYW1lICkgKSkKICAgICAgICAgc3RyY3B5KCBjbGFzc05hbWUsICIjTlVMTCMiICk7CiAKLSAgICBmcHJpbnRmKCBzdGRlcnIsICJXaW5kb3cgJTA0eCAoJXApOlxuIiwgaHduZCwgcHRyICk7Ci0gICAgZnByaW50Ziggc3RkZXJyLAotICAgICAgICAgICAgICJuZXh0PSVwICBjaGlsZD0lcCAgcGFyZW50PSVwICBvd25lcj0lcCAgY2xhc3M9JXAgJyVzJ1xuIgorICAgIFRSQUNFKCB3aW4sICJXaW5kb3cgJTA0eCAoJXApOlxuIiwgaHduZCwgcHRyICk7CisgICAgRFVNUCggICAgIm5leHQ9JXAgIGNoaWxkPSVwICBwYXJlbnQ9JXAgIG93bmVyPSVwICBjbGFzcz0lcCAnJXMnXG4iCiAgICAgICAgICAgICAgImluc3Q9JTA0eCAgdGFza1E9JTA0eCAgdXBkUmduPSUwNHggIGFjdGl2ZT0lMDR4IGRjZT0lcCAgaWRtZW51PSUwOHhcbiIKICAgICAgICAgICAgICAic3R5bGU9JTA4bHggIGV4c3R5bGU9JTA4bHggIHduZHByb2M9JTA4eCAgdGV4dD0nJXMnXG4iCiAgICAgICAgICAgICAgImNsaWVudD0lZCwlZC0lZCwlZCAgd2luZG93PSVkLCVkLSVkLCVkIgpAQCAtMTA2LDEyICs5OSwxMiBAQAogCiAgICAgaWYgKHB0ci0+Y2xhc3MtPmNiV25kRXh0cmEpCiAgICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJleHRyYSBieXRlczoiICk7CisgICAgICAgIERVTVAoICJleHRyYSBieXRlczoiICk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwdHItPmNsYXNzLT5jYlduZEV4dHJhOyBpKyspCi0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIgJTAyeCIsICooKEJZVEUqKXB0ci0+d0V4dHJhK2kpICk7Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOworICAgICAgICAgICAgRFVNUCggIiAlMDJ4IiwgKigoQllURSopcHRyLT53RXh0cmEraSkgKTsKKyAgICAgICAgRFVNUCggIlxuIiApOwogICAgIH0KLSAgICBmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKKyAgICBEVU1QKCAiXG4iICk7CiB9CiAKIApAQCAtMTI4LDIxICsxMjEsMjEgQEAKICAgICBwdHIgPSBod25kID8gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSA6IHBXbmREZXNrdG9wOwogICAgIGlmICghcHRyKQogICAgIHsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiKioqIEludmFsaWQgd2luZG93IGhhbmRsZSAlMDR4XG4iLCBod25kICk7CisgICAgICAgIFdBUk4oIHdpbiwgIkludmFsaWQgd2luZG93IGhhbmRsZSAlMDR4XG4iLCBod25kICk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBpZiAoIWluZGVudCkgIC8qIGZpcnN0IHRpbWUgYXJvdW5kICovCi0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiUtMTYuMTZzICUtOC44cyAlLTYuNnMgJS0xNy4xN3MgJS04LjhzICVzXG4iLAorICAgICAgIERVTVAoICIlLTE2LjE2cyAlLTguOHMgJS02LjZzICUtMTcuMTdzICUtOC44cyAlc1xuIiwKICAgICAgICAgICAgICAgICAgImh3bmQiLCAiIHduZFB0ciIsICJxdWV1ZSIsICJDbGFzcyBOYW1lIiwgIiBTdHlsZSIsICIgV25kUHJvYyIpOwogCiAgICAgd2hpbGUgKHB0cikKICAgICB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJSpzJTA0eCUqcyIsIGluZGVudCwgIiIsIHB0ci0+aHduZFNlbGYsIDEzLWluZGVudCwiIik7CisgICAgICAgIERVTVAoICIlKnMlMDR4JSpzIiwgaW5kZW50LCAiIiwgcHRyLT5od25kU2VsZiwgMTMtaW5kZW50LCIiKTsKIAogICAgICAgICBHbG9iYWxHZXRBdG9tTmFtZTE2KHB0ci0+Y2xhc3MtPmF0b21OYW1lLGNsYXNzTmFtZSxzaXplb2YoY2xhc3NOYW1lKSk7CiAgICAgICAgIAotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIlMDhseCAlLTYuNHggJS0xNy4xN3MgJTA4eCAlMDh4XG4iLAorICAgICAgICBEVU1QKCAiJTA4bHggJS02LjR4ICUtMTcuMTdzICUwOHggJTA4eFxuIiwKICAgICAgICAgICAgICAgICAgKERXT1JEKXB0ciwgcHRyLT5obWVtVGFza1EsIGNsYXNzTmFtZSwKICAgICAgICAgICAgICAgICAgKFVJTlQzMilwdHItPmR3U3R5bGUsIChVSU5UMzIpcHRyLT53aW5wcm9jICk7CiAgICAgICAgIApAQCAtNDgwLDExICs0NzMsMTEgQEAKIAkvKiBNYWtlIHN1cmUgcGFyZW50IGlzIHZhbGlkICovCiAgICAgICAgIGlmICghSXNXaW5kb3czMiggY3MtPmh3bmRQYXJlbnQgKSkKICAgICAgICAgewotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiQ3JlYXRlV2luZG93RXg6IGJhZCBwYXJlbnQgJTA0eFxuIiwgY3MtPmh3bmRQYXJlbnQgKTsKKyAgICAgICAgICAgIFdBUk4oIHdpbiwgIkJhZCBwYXJlbnQgJTA0eFxuIiwgY3MtPmh3bmRQYXJlbnQgKTsKIAkgICAgcmV0dXJuIDA7CiAJfQogICAgIH0gZWxzZSBpZiAoKGNzLT5zdHlsZSAmIFdTX0NISUxEKSAmJiAhKGNzLT5zdHlsZSAmIFdTX1BPUFVQKSkgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJDcmVhdGVXaW5kb3dFeDogbm8gcGFyZW50IGZvciBjaGlsZCB3aW5kb3dcbiIgKTsKKyAgICAgICAgV0FSTiggd2luLCAiTm8gcGFyZW50IGZvciBjaGlsZCB3aW5kb3dcbiIgKTsKICAgICAgICAgcmV0dXJuIDA7ICAvKiBXU19DSElMRCBuZWVkcyBhIHBhcmVudCwgYnV0IFdTX1BPUFVQIGRvZXNuJ3QgKi8KICAgICB9CiAKQEAgLTQ5Myw3ICs0ODYsNyBAQAogICAgIHsKICAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKICAgICAgICAgR2xvYmFsR2V0QXRvbU5hbWUzMkEoIGNsYXNzQXRvbSwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSApOwotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJDcmVhdGVXaW5kb3dFeDogYmFkIGNsYXNzICclcydcbiIsIGJ1ZmZlciApOworICAgICAgICBXQVJOKCB3aW4sICJCYWQgY2xhc3MgJyVzJ1xuIiwgYnVmZmVyICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtOTE0LDExICs5MDcsMTEgQEAKICAgICAJaWYgKEhJV09SRChjbGFzc05hbWUpKQogICAgICAgICB7CiAgICAgICAgICAgICBMUFNUUiBjbiA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY2xhc3NOYW1lICk7Ci0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJDcmVhdGVXaW5kb3dFeDMyVzogYmFkIGNsYXNzIG5hbWUgJyVzJ1xuIixjbik7CisgICAgICAgICAgICBXQVJOKCB3aW4sICJCYWQgY2xhc3MgbmFtZSAnJXMnXG4iLGNuKTsKICAgICAgICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBjbiApOwogCX0KICAgICAgICAgZWxzZQotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiQ3JlYXRlV2luZG93RXgzMlc6IGJhZCBjbGFzcyBuYW1lICVwXG4iLCBjbGFzc05hbWUgKTsKKyAgICAgICAgICAgIFdBUk4oIHdpbiwgIkJhZCBjbGFzcyBuYW1lICVwXG4iLCBjbGFzc05hbWUgKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0xNDAxLDcgKzEzOTQsNyBAQAogICAgIHsKICAgICAgICAgaWYgKG9mZnNldCArIHNpemVvZihXT1JEKSA+IHduZFB0ci0+Y2xhc3MtPmNiV25kRXh0cmEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkdldFdpbmRvd1dvcmQ6IGludmFsaWQgb2Zmc2V0ICVkXG4iLCBvZmZzZXQgKTsKKyAgICAgICAgICAgIFdBUk4oIHdpbiwgIkludmFsaWQgb2Zmc2V0ICVkXG4iLCBvZmZzZXQgKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAqKFdPUkQgKikoKChjaGFyICopd25kUHRyLT53RXh0cmEpICsgb2Zmc2V0KTsKQEAgLTE0MTAsMTYgKzE0MDMsMTggQEAKICAgICB7CiAgICAgY2FzZSBHV1dfSUQ6ICAgICAgICAgCiAgICAgCWlmIChISVdPUkQod25kUHRyLT53SURtZW51KSkKLSAgICAJCWZwcmludGYoc3RkZXJyLCJHZXRXaW5kb3dXb3JkMzIoR1dXX0lEKSBkaXNjYXJkcyBoaWdoIGJpdHMgb2YgMHglMDh4IVxuIix3bmRQdHItPndJRG1lbnUpOworICAgIAkJV0FSTiggd2luLCJHV1dfSUQ6IGRpc2NhcmRzIGhpZ2ggYml0cyBvZiAweCUwOHghXG4iLAorICAgICAgICAgICAgICAgICAgICB3bmRQdHItPndJRG1lbnUpOwogICAgIAlyZXR1cm4gKFdPUkQpd25kUHRyLT53SURtZW51OwogICAgIGNhc2UgR1dXX0hXTkRQQVJFTlQ6IHJldHVybiB3bmRQdHItPnBhcmVudCA/CiAJCQl3bmRQdHItPnBhcmVudC0+aHduZFNlbGYgOiB3bmRQdHItPm93bmVyLT5od25kU2VsZjsKICAgICBjYXNlIEdXV19ISU5TVEFOQ0U6ICAKICAgICAJaWYgKEhJV09SRCh3bmRQdHItPmhJbnN0YW5jZSkpCi0gICAgCQlmcHJpbnRmKHN0ZGVyciwiR2V0V2luZG93V29yZDMyKEdXV19ISU5TVEFOQ0UpIGRpc2NhcmRzIGhpZ2ggYml0cyBvZiAweCUwOHghXG4iLHduZFB0ci0+aEluc3RhbmNlKTsKKyAgICAJCVdBUk4od2luLCJHV1dfSElOU1RBTkNFOiBkaXNjYXJkcyBoaWdoIGJpdHMgb2YgMHglMDh4IVxuIiwKKyAgICAgICAgICAgICAgICAgICAgd25kUHRyLT5oSW5zdGFuY2UpOwogICAgCXJldHVybiAoV09SRCl3bmRQdHItPmhJbnN0YW5jZTsKICAgICBkZWZhdWx0OgotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJHZXRXaW5kb3dXb3JkOiBpbnZhbGlkIG9mZnNldCAlZFxuIiwgb2Zmc2V0ICk7CisgICAgICAgIFdBUk4oIHdpbiwgIkludmFsaWQgb2Zmc2V0ICVkXG4iLCBvZmZzZXQgKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogfQpAQCAtMTQ1Nyw3ICsxNDUyLDcgQEAKICAgICB7CiAgICAgICAgIGlmIChvZmZzZXQgKyBzaXplb2YoV09SRCkgPiB3bmRQdHItPmNsYXNzLT5jYlduZEV4dHJhKQogICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTZXRXaW5kb3dXb3JkOiBpbnZhbGlkIG9mZnNldCAlZFxuIiwgb2Zmc2V0ICk7CisgICAgICAgICAgICBXQVJOKCB3aW4sICJJbnZhbGlkIG9mZnNldCAlZFxuIiwgb2Zmc2V0ICk7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgICAgICBwdHIgPSAoV09SRCAqKSgoKGNoYXIgKil3bmRQdHItPndFeHRyYSkgKyBvZmZzZXQpOwpAQCAtMTQ2OCw3ICsxNDYzLDcgQEAKIAljYXNlIEdXV19ISU5TVEFOQ0U6IHB0ciA9IChXT1JEICopJnduZFB0ci0+aEluc3RhbmNlOyBicmVhazsKIAljYXNlIEdXV19IV05EUEFSRU5UOiByZXR1cm4gU2V0UGFyZW50MzIoIGh3bmQsIG5ld3ZhbCApOwogCWRlZmF1bHQ6Ci0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTZXRXaW5kb3dXb3JkOiBpbnZhbGlkIG9mZnNldCAlZFxuIiwgb2Zmc2V0ICk7CisgICAgICAgICAgICBXQVJOKCB3aW4sICJJbnZhbGlkIG9mZnNldCAlZFxuIiwgb2Zmc2V0ICk7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgcmV0dmFsID0gKnB0cjsKQEAgLTE0OTEsNyArMTQ4Niw3IEBACiAgICAgewogICAgICAgICBpZiAob2Zmc2V0ICsgc2l6ZW9mKExPTkcpID4gd25kUHRyLT5jbGFzcy0+Y2JXbmRFeHRyYSkKICAgICAgICAgewotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiR2V0V2luZG93TG9uZzogaW52YWxpZCBvZmZzZXQgJWRcbiIsIG9mZnNldCApOworICAgICAgICAgICAgV0FSTiggd2luLCAiSW52YWxpZCBvZmZzZXQgJWRcbiIsIG9mZnNldCApOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgcmV0dmFsID0gKihMT05HICopKCgoY2hhciAqKXduZFB0ci0+d0V4dHJhKSArIG9mZnNldCk7CkBAIC0xNTEyLDcgKzE1MDcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChIV05EMzIpd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmIDogMDsKICAgICAgICAgY2FzZSBHV0xfSElOU1RBTkNFOiAgcmV0dXJuIHduZFB0ci0+aEluc3RhbmNlOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiR2V0V2luZG93TG9uZzogdW5rbm93biBvZmZzZXQgJWRcbiIsIG9mZnNldCApOworICAgICAgICAgICAgV0FSTiggd2luLCAiVW5rbm93biBvZmZzZXQgJWRcbiIsIG9mZnNldCApOwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KQEAgLTE1MzQsNyArMTUyOSw3IEBACiAgICAgewogICAgICAgICBpZiAob2Zmc2V0ICsgc2l6ZW9mKExPTkcpID4gd25kUHRyLT5jbGFzcy0+Y2JXbmRFeHRyYSkKICAgICAgICAgewotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiU2V0V2luZG93TG9uZzogaW52YWxpZCBvZmZzZXQgJWRcbiIsIG9mZnNldCApOworICAgICAgICAgICAgV0FSTiggd2luLCAiSW52YWxpZCBvZmZzZXQgJWRcbiIsIG9mZnNldCApOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgcHRyID0gKExPTkcgKikoKChjaGFyICopd25kUHRyLT53RXh0cmEpICsgb2Zmc2V0KTsKQEAgLTE1NzEsNyArMTU2Niw3IEBACiAgICAgICAgIGNhc2UgR1dMX1VTRVJEQVRBOiBwdHIgPSAmd25kUHRyLT51c2VyZGF0YTsgYnJlYWs7CiAgICAgICAgIGNhc2UgR1dMX0VYU1RZTEU6ICBwdHIgPSAmd25kUHRyLT5kd0V4U3R5bGU7IGJyZWFrOwogCWRlZmF1bHQ6Ci0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTZXRXaW5kb3dMb25nOiBpbnZhbGlkIG9mZnNldCAlZFxuIiwgb2Zmc2V0ICk7CisgICAgICAgICAgICBXQVJOKCB3aW4sICJJbnZhbGlkIG9mZnNldCAlZFxuIiwgb2Zmc2V0ICk7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgcmV0dmFsID0gKnB0cjsKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2luaGVscC5jIGIvd2luZG93cy93aW5oZWxwLmMKaW5kZXggMmVmMzA1Yi4uM2E4ZWEyZSAxMDA2NDQKLS0tIGEvd2luZG93cy93aW5oZWxwLmMKKysrIGIvd2luZG93cy93aW5oZWxwLmMKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAibGR0LmgiCkBAIC04MCw3ICs4MSw3IEBACiAJCQlkc2l6ZSA9ICgoTFBIRUxQV0lOSU5GTylkd0RhdGEpLT53U3RydWN0U2l6ZTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJZnByaW50ZihzdGRlcnIsIlVua25vd24gaGVscCBjb21tYW5kICVkXG4iLHdDb21tYW5kKTsKKwkJCVdBUk4oIHdpbiwiVW5rbm93biBoZWxwIGNvbW1hbmQgJWRcbiIsd0NvbW1hbmQpOwogCQkJcmV0dXJuIEZBTFNFOwogCX0KIAlpZihscEhlbHBGaWxlKQpkaWZmIC0tZ2l0IGEvd2luZG93cy93aW5wb3MuYyBiL3dpbmRvd3Mvd2lucG9zLmMKaW5kZXggMDQzY2Y3NS4uNzM4MGRiOSAxMDA2NDQKLS0tIGEvd2luZG93cy93aW5wb3MuYworKysgYi93aW5kb3dzL3dpbnBvcy5jCkBAIC00OSwxMSArNDksNiBAQAogI2RlZmluZSBTTUNfRFJBV0ZSQU1FCQkweDAwMDQKICNkZWZpbmUgU01DX1NFVFhQT1MJCTB4MDAwOAogCi0vKiAtLS0tLSBleHRlcm5hbCBmdW5jdGlvbnMgLS0tLS0gKi8KLQotZXh0ZXJuIHZvaWQgCUZPQ1VTX1N3aXRjaEZvY3VzKCBIV05EMzIgLCBIV05EMzIgKTsKLWV4dGVybiBIV05EMzIJQ0FSRVRfR2V0SHduZCgpOwotCiAvKiAtLS0tLSBpbnRlcm5hbCB2YXJpYWJsZXMgLS0tLS0gKi8KIAogc3RhdGljIEhXTkQzMiBod25kQWN0aXZlICAgICAgPSAwOyAgLyogQ3VycmVudGx5IGFjdGl2ZSB3aW5kb3cgKi8KZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2lucHJvYy5jIGIvd2luZG93cy93aW5wcm9jLmMKaW5kZXggN2Y3NzdjZi4uMDNmZGVmZiAxMDA2NDQKLS0tIGEvd2luZG93cy93aW5wcm9jLmMKKysrIGIvd2luZG93cy93aW5wcm9jLmMKQEAgLTUsNyArNSw2IEBACiAgKiBDb3B5cmlnaHQgMTk5NiBBbGV4YW5kcmUgSnVsbGlhcmQKICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJoZWFwLmgiCkBAIC05OSw3ICs5OCw3IEBACiAgICAgV2luUHJvY0hlYXAgPSBIZWFwQ3JlYXRlKCBIRUFQX1dJTkVfU0VHUFRSIHwgSEVBUF9XSU5FX0NPREVTRUcsIDAsIDAgKTsKICAgICBpZiAoIVdpblByb2NIZWFwKQogICAgIHsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiVW5hYmxlIHRvIGNyZWF0ZSB3aW5wcm9jIGhlYXBcbiIgKTsKKyAgICAgICAgV0FSTihyZWxheSwgIlVuYWJsZSB0byBjcmVhdGUgd2lucHJvYyBoZWFwXG4iICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CkBAIC00MzksOCArNDM4LDcgQEAKICAgICBjYXNlIFdNX1BBSU5UQ0xJUEJPQVJEOgogICAgIGNhc2UgV01fU0laRUNMSVBCT0FSRDoKICAgICBjYXNlIFdNX1dJTklOSUNIQU5HRToKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiTWFwTXNnMzJBVG8zMlc6IG1lc3NhZ2UgJTA0eCBuZWVkcyB0cmFuc2xhdGlvblxuIiwKLSAgICAgICAgICAgICAgICAgbXNnICk7CisgICAgICAgIFRSQUNFKG1zZywgIm1lc3NhZ2UgJTA0eCBuZWVkcyB0cmFuc2xhdGlvblxuIiwgbXNnICk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICBkZWZhdWx0OiAgLyogTm8gdHJhbnNsYXRpb24gbmVlZGVkICovCiAgICAgICAgIHJldHVybiAwOwpAQCAtNTUwLDggKzU0OCw3IEBACiAgICAgY2FzZSBXTV9QQUlOVENMSVBCT0FSRDoKICAgICBjYXNlIFdNX1NJWkVDTElQQk9BUkQ6CiAgICAgY2FzZSBXTV9XSU5JTklDSEFOR0U6Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIk1hcE1zZzMyV1RvMzJBOiBtZXNzYWdlICUwNHggbmVlZHMgdHJhbnNsYXRpb25cbiIsCi0gICAgICAgICAgICAgICAgIG1zZyApOworICAgICAgICBXQVJOKG1zZywgIm1lc3NhZ2UgJTA0eCBuZWVkcyB0cmFuc2xhdGlvblxuIixtc2cgKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIGRlZmF1bHQ6ICAvKiBObyB0cmFuc2xhdGlvbiBuZWVkZWQgKi8KICAgICAgICAgcmV0dXJuIDA7CkBAIC04MTEsOCArODA4LDcgQEAKICAgICBjYXNlIFdNX1BBSU5UQ0xJUEJPQVJEOgogICAgIGNhc2UgV01fU0laRUNMSVBCT0FSRDoKICAgICBjYXNlIFdNX1dJTklOSUNIQU5HRToKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiTWFwTXNnMTZUbzMyQTogbWVzc2FnZSAlMDR4IG5lZWRzIHRyYW5zbGF0aW9uXG4iLAotICAgICAgICAgICAgICAgICBtc2cxNiApOworICAgICAgICBXQVJOKCBtc2csICJtZXNzYWdlICUwNHggbmVlZHMgdHJhbnNsYXRpb25cbiIsbXNnMTYgKTsKICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgZGVmYXVsdDogIC8qIE5vIHRyYW5zbGF0aW9uIG5lZWRlZCAqLwpAQCAtMTQzMiw4ICsxNDI4LDcgQEAKICAgICBjYXNlIFdNX1BBSU5UQ0xJUEJPQVJEOgogICAgIGNhc2UgV01fU0laRUNMSVBCT0FSRDoKICAgICBjYXNlIFdNX1dJTklOSUNIQU5HRToKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiTWFwTXNnMzJBVG8xNjogbWVzc2FnZSAlMDR4IG5lZWRzIHRyYW5zbGF0aW9uXG4iLAotICAgICAgICAgICAgICAgICBtc2czMiApOworICAgICAgICBXQVJOKCBtc2csICJtZXNzYWdlICUwNHggbmVlZHMgdHJhbnNsYXRpb25cbiIsIG1zZzMyICk7CiAgICAgICAgIHJldHVybiAtMTsKIAogICAgIGRlZmF1bHQ6ICAvKiBObyB0cmFuc2xhdGlvbiBuZWVkZWQgKi8KQEAgLTE4NTYsNyArMTg1MSw3IEBACiAgICAgICAgIHJldHVybiBXSU5QUk9DX0NhbGxQcm9jMTZUbzMyVyggaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jLT50aHVuay50X2Zyb20xNi5wcm9jICk7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiQ2FsbFdpbmRvd1Byb2MxNjogaW52YWxpZCBwcm9jICVwXG4iLCBwcm9jICk7CisgICAgICAgIFdBUk4oIHJlbGF5LCAiSW52YWxpZCBwcm9jICVwXG4iLCBwcm9jICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIH0KQEAgLTE4OTIsNyArMTg4Nyw3IEBACiAgICAgICAgIHJldHVybiBXSU5QUk9DX0NhbGxQcm9jMzJBVG8zMlcoIHByb2MtPnRodW5rLnRfZnJvbTE2LnByb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKICAgICBkZWZhdWx0OgotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJDYWxsV2luZG93UHJvYzMyQTogaW52YWxpZCBwcm9jICVwXG4iLCBwcm9jICk7CisgICAgICAgIFdBUk4oIHJlbGF5LCAiSW52YWxpZCBwcm9jICVwXG4iLCBwcm9jICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIH0KQEAgLTE5MjgsNyArMTkyMyw3IEBACiAgICAgICAgIHJldHVybiBXSU5QUk9DX0NhbGxXbmRQcm9jMzIoIHByb2MtPnRodW5rLnRfZnJvbTE2LnByb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKICAgICBkZWZhdWx0OgotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJDYWxsV2luZG93UHJvYzMyVzogaW52YWxpZCBwcm9jICVwXG4iLCBwcm9jICk7CisgICAgICAgIFdBUk4oIHJlbGF5LCAiSW52YWxpZCBwcm9jICVwXG4iLCBwcm9jICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIH0K