ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggMDAyYmU2OS4uNzhlZTQ4YyAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTQgKzEsMTQgQEAKLVRoaXMgaXMgcmVsZWFzZSA5ODAzMjkgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5ODA0MTMgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk4MDMyOTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBNb3JlIEltYWdlTGlzdHMgc3VwcG9ydC4KLQktIE1vcmUgV2luMzIgbWV0YWZpbGUgc3VwcG9ydC4KLQktIFN0aWxsIHNvbWUgZGVidWdnaW5nIG91dHB1dCBjaGFuZ2VzLgorV0hBVCdTIE5FVyB3aXRoIFdpbmUtOTgwNDEzOiAoc2VlIENoYW5nZUxvZyBmb3IgZGV0YWlscykKKwktIEZsYXQgdGh1bmtzIHN1cHBvcnQuCisJLSBNYW55IG1vcmUgYXV0b2NvbmYgY2hlY2tzIGZvciBiZXR0ZXIgcG9ydGFiaWxpdHkuCisJLSBESUFMT0dFWCByZXNvdXJjZSBzdXBwb3J0LgogCS0gTG90cyBvZiBidWcgZml4ZXMuCiAKIFNlZSB0aGUgUkVBRE1FIGZpbGUgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KQEAgLTE3LDEwICsxNywxMCBAQAogdGhlIHJlbGVhc2UgaXMgYXZhaWxhYmxlIGF0IHRoZSBmdHAgc2l0ZXMuICBUaGUgc291cmNlcyB3aWxsIGJlIGF2YWlsYWJsZQogZnJvbSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKIAotICBmdHA6Ly9zdW5zaXRlLnVuYy5lZHUvcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODAzMjkudGFyLmd6Ci0gIGZ0cDovL3RzeC0xMS5taXQuZWR1L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwMzI5LnRhci5negotICBmdHA6Ly9mdHAuaW5mb21hZ2ljLmNvbS9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTgwMzI5LnRhci5negotICBmdHA6Ly9mdHAucHJvZ3NvYy51dHMuZWR1LmF1L3B1Yi9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwMzI5LnRhci5negorICBmdHA6Ly9zdW5zaXRlLnVuYy5lZHUvcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODA0MTMudGFyLmd6CisgIGZ0cDovL3RzeC0xMS5taXQuZWR1L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwNDEzLnRhci5negorICBmdHA6Ly9mdHAuaW5mb21hZ2ljLmNvbS9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTgwNDEzLnRhci5negorICBmdHA6Ly9mdHAucHJvZ3NvYy51dHMuZWR1LmF1L3B1Yi9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwNDEzLnRhci5negogCiBJdCBzaG91bGQgYWxzbyBiZSBhdmFpbGFibGUgZnJvbSBhbnkgc2l0ZSB0aGF0IG1pcnJvcnMgdHN4LTExIG9yIHN1bnNpdGUuCiAKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCBkYzYxOGM1Li42MTE5ZjYzIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDQgKzEsMjE4IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTdW4gQXByIDEyIDEyOjIyOjIzIDE5OTcgIEFuZHJlYXMgTW9ociA8MTAwLjMwOTM2QGdlcm1hbnkubmV0PgorCisJKiBbZmlsZXMvZHJpdmUuY10KKwlGaXhlZCAibm8gZnJlZSBzcGFjZSIgcHJvYmxlbSB3aXRoIHBhcnRpdGlvbiBzaXplcyBiZXR3ZWVuIDEgYW5kIDIgR0IKKwkoY2x1c3Rlcl9zZWN0b3JzIG1heSBub3QgZXhjZWVkIDB4NDApLgorCisJKiBbd2luZG93cy9tc2dib3guY10gW2lmMTYzMi91c2VyLnNwZWNdIFtpbmNsdWRlL3dpbmRvd3MuaF0KKwlJbXBsZW1lbnRlZCBNZXNzYWdlQm94SW5kaXJlY3QxNiwgY29ycmVjdGVkIE1TR0JPWFBBUkFNUzE2LgorCisJKiBbbG9hZGVyL3Rhc2suY10KKwlET1MgZW52aXJvbm1lbnQgc3RyaW5ncyBtYXkgbmV2ZXIgZXhjZWVkIDEyNyBjaGFycworCS0+IHRydW5jYXRlIFVuaXggZW52aXJvbm1lbnQgc3RyaW5ncyBpZiBuZWNlc3NhcnkuCisKK1N1biBBcHIgMTIgMDI6NTE6NDQgMTk5OCAgRGltaXRyaWUgTy4gUGF1biAgPGRpbWlAbWFpbC5jcy50b3JvbnRvLmVkdT4KKworCSogW2ZpbGVzLyouY10KKwlBbGwgZnByaW50ZiBzdGF0ZW1lbnRzIHdlcmUgY29udmVydGVkIHRvIGFwcHJvcHJpYXRlIGRlYnVnCisJbWVzc2FnZXMuCisKKwkqIFt0b29scy9maW5kX2RlYnVnX2NoYW5uZWxzXQorCVVwZGF0ZWQgY29tbWVudHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKworU2F0IEFwciAxMSAxNToyNzoyMSAxOTk4ICBBbGV4YW5kcmUgSnVsbGlhcmQgIDxqdWxsaWFyZEBscmMuZXBmbC5jaD4KKworCSogW2xvYWRlci9tb2R1bGUuY10gW2xvYWRlci90YXNrLmNdIFtzY2hlZHVsZXIvcHJvY2Vzcy5jXQorCU1vdmVkIHNvbWUgY29kZSBhcm91bmQgdG8gcHJlcGFyZSB0aGUgZ3JvdW5kIGZvciBDcmVhdGVQcm9jZXNzKCkuCisKKwkqIFttZW1vcnkvZW52aXJvbi5jXSBbbG9hZGVyL3Rhc2suY10KKwlNb3ZlZCBXaW4zMiBlbnZpcm9ubWVudCBzdHJpbmdzIGZ1bmN0aW9ucyB0byBlbnZpcm9uLmMuCisJVW5pZmllZCBXaW4xNiBhbmQgV2luMzIgZW52aXJvbm1lbnQgbWFuYWdlbWVudC4KKworCSogW3NjaGVkdWxlci9oYW5kbGUuY10gW3NjaGVkdWxlci9rMzJvYmouY10gW3NjaGVkdWxlci8qLmNdCisJSW1wbGVtZW50ZWQgaGFuZGxlIGluaGVyaXRhbmNlIGFuZCBEdXBsaWNhdGVIYW5kbGUoKS4KKworCSogW3NjaGVkdWxlci90aHJlYWQuY10KKwlDcmVhdGUgYSAxNi1iaXQgc3RhY2sgZm9yIGFsbCB0aHJlYWRzLgorCisJKiBbd2luZG93cy9kaWFsb2cuY10KKwlJbXBsZW1lbnRlZCBESUFMT0dFWCByZXNvdXJjZSBmb3JtYXQuCisKK0ZyaSBBcHIgMTAgMjA6MjE6NTEgMTk5OCAgTWFyY3VzIE1laXNzbmVyIDxtYXJjdXNAbXVkLmRlPgorCisJKiBbY29uZmlndXJlLmluXVtpbmNsdWRlL2FjY29uZmlnLmhdWyovKl1bbXVsdGltZWRpYS8qXQorCUNsZWFuZWQgdXAgdGhlIE9TUyBkZXRlY3Rpb24gc3R1ZmYsIGFkZGVkIHNvbWUgbW9yZSBjaGVja3MgZm9yCisJaGVhZGVyZmlsZXMvZnVuY3Rpb25zLgorCVJlbW92ZWQgYSBsb3Qgb2YgT1Mgc3BlY2lmaWMgI2lmZGVmcy4KKwlMb3RzIG9mIGRlcGVuZGVuZCBtdWx0aW1lZGlhIGNsZWFudXBzLgorCisJKiBbbG9hZGVyL3BlX2ltYWdlLmNdCisJRW5oYW5jZWQgY29tbWVudCwgYWRkZWQgbWlzc2luZyByZWZlcmVuY2UgY291bnQgaW5jcmVhc2UuCisKKwkqIFtvbGUvY29tcG9iai5jXQorCVJlcGxhY2VkIGJyb2tlbiBTdHJpbmdGcm9tR1VJRDIgYnkgd29ya2luZyBvbmUuCisKKwkqIFttaXNjL3dpbnNvY2suY10KKwlTT19MSU5HRVIgdXNlcyB1bnNpZ25lZCAxNiBiaXQgaW4gV2luMTYgYW5kIFdpbjMyLCBidXQgdW5zaWduZWQKKwlpbnQgKDMyYml0KSBmb3IgVU5JWC4KKworCSogW21lbW9yeS9nbG9iYWwuY10KKwlBbGxvdyByZWFsbG9jIGZvciBsb2NrY291bnQgMSB0b28uCisKK0ZyaSBBcHIgMTAgMTU6Mjc6MzQgMTk5OCAgTW9ydGVuIFdlbGluZGVyICA8dGVycmFAZGlrdS5kaz4KKworCSogW2dyYXBoaWNzL3gxMWRydi90ZXh0LmNdCisJSGFuZGxlIGNvbnRyb2wgY2hhcmFjdGVycyBpbiB0cmFjZS4gIElnbm9yZSB0ZXJtaW5hdGluZyBuZXdsaW5lLgorCisJKiBbbXVsdGltZWRpYS9pbml0LmNdCisJKE1VTFRJTUVESUFfSW5pdCk6IENvcnJlY3QgYWxsb2NhdGlvbnMuCisKKwkqIFt0b29scy9leGFtaW5lLXJlbGF5XQorIAlUaWR5IHVwLgorCisJKiBbd2luZG93cy9zeXNjb2xvci5jXQorCUNoYW5nZSBoaWdobGlnaHQgY29sb3VyIGZyb20gbGlnaHRibHVlIHRvIGxpZ2h0Z3JheS4gIFRoaXMKKwlsb29rcyBjb3JyZWN0IGZvciBtZW51cy4KKworRnJpIEFwciAxMCAwMTo0OTo1OCAxOTk4ICBEb3VnbGFzIFJpZGd3YXkgIDxyaWRnd2F5QHdpbmVocS5jb20+CisKKwkqIFtjb25maWd1cmUuaW5dIFtNYWtlLnJ1bGVzLmluXQorCUFkZCBjaGVjayBmb3IgYzJtYW4gYmVmb3JlIHVzaW5nIGl0LgorCitGcmkgQXByIDEwIDAyOjU5OjIxIDE5OTggIERvdWdsYXMgUmlkZ3dheSAgPHJpZGd3YXlAd2luZWhxLmNvbT4KKworCSogW0RFVkVMT1BFUlMtSElOVFNdCisJU2ltcGxlIGRlc2NyaXB0aW9uIG9mIGFkZGluZyBBUEkgY2FsbHMuCisKKwkqIFtpbmNsdWRlL3dpbnR5cGVzLmhdIFtpbmNsdWRlL3dpbmRvd3MuaF0KKwlHZXQgcmlkIG9mIFdpbmVsaWIxNiwgYXZvaWQgZGVjbGFyaW5nIHNvbWUgaWxsZWdhbCBmdW5jdGlvbnMgaW4KKwlXaW5lbGliLCBhZGQgcHJvdG90eXBlcyBmb3Igc29tZSBlbmhhbmNlZCBtZXRhZmlsZSBmdW5jdGlvbnMsIGZpeAorCUdldFRleHRFeHRlbnRQb2ludDMyIGRlY2xhcmF0aW9ucy4KKworCSogW3JlbGF5MzIvZ2RpMzIuc3BlY10gW29iamVjdHMvZW5obWV0YWZpbGUuY10KKwlDb3NtZXRpYyBhbmQgZnVuY3Rpb25hbCBpbXByb3ZlbWVudHMuCisKKwkqIFtpbmNsdWRlL3dpbmNvbi5oXSBbcHJvZ3JhbXMvdmlldy8qXQorCUZpeGVzLCBpbXByb3ZlZCBjb21wYXRpYmlsaXR5IHdpdGggbmF0aXZlIGNvbXBpbGVycy4KKworVGh1IEFwciAgOSAxNTo0ODo0OSAxOTk4ICBVbHJpY2ggV2VpZ2FuZCA8d2VpZ2FuZEBpbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4KKworCSogW3dpbjMyL2tlcm5lbDMyLmNdCisJSW1wbGVtZW50ZWQgRlRfVGh1bmsgLyBGVF9Qcm9sb2cgLyBGVF9FeGl0IC8gRlRfUHJvbG9nUHJpbWUuCisJRml4ZWQgQ29tbW9uMzJUaGtMUyB0aHVuayBmdW5jdGlvbi4KKworCSogW3Rvb2xzL2J1aWxkLmNdIFtyZWxheTMyL3JlbGF5Mzg2LmNdIFtpZjE2MzIvcmVsYXkuY10KKwlDaGFuZ2VkIHJlbGF5IGNvZGUgdG8gYWxsb3cgcmVnaXN0ZXIgZnVuY3Rpb25zIHRvIG1vZGlmeSBzdGFjayBsYXlvdXQuCisKKwkqIFttZW1vcnkvc2VsZWN0b3IuY10KKwlJbXBsZW1lbnRlZCBBbGxvY01hcHBlZEJ1ZmZlciAvIEZyZWVNYXBwZWRCdWZmZXIuCisKKwkqIFtyZWxheTMyL2tlcm5lbDMyLnNwZWNdIFtpZjE2MzIva2VybmVsLnNwZWNdIFt3aW4zMi9vcmRpbmFscy5jXQorCUFkZGVkIG5hbWVzIGZvciB1bmRvY3VtZW50ZWQgZnVuY3Rpb25zLgorCisJKiBbbG9hZGVyL21vZHVsZS5jXQorCUJ1Z2ZpeDogTG9hZExpYnJhcnkxNiBzaG91bGQgKm5vdCogc2lsZW50bHkgbG9hZCAzMi1iaXQgRExMLgorCitUaHUgQXByICA5IDAzOjU0OjU4IDE5OTggIEppbSBQZXRlcnNvbiA8anNwZXRlckBiaXJjaC5lZS52dC5lZHU+CisKKwkqIFt3aW5kb3dzL2tleWJvYXJkLmNdCisJRml4IGFuIGVycm9uZW91cyB0ZXN0IGluIFRyYW5zbGF0ZUFjY2VsZXJhdG9yezE2LDMyfSBmb3IgdGhlIGVuZAorCW9mIHRoZSBhY2NlbGVyYXRvciB0YWJsZS4KKworVGh1IEFwciAgOCAyMDozNjoyOCAxOTk4ICBVd2UgQm9ubmVzIDxib25AZWxla3Ryb24uaWtwLnBoeXNpay50dS1kYXJtc3RhZHQuZGU+IAorCisJKiBbbWlzYy9jcnRkbGwuY10KKwlJbXBsZW1lbnQgZ2V0ZW52LgorCisJKiBbbWlzYy9jb21tZGxnLmNdCisJTWFrZSBHZXRbU2F2ZS9PcGVuXUZpbGVOYW1lIHdvcmsgaW4gbW9zdCBzaXR1YXRpb25zLgorCisJKiBbbWlzYy9sc3RyLmNdCisJVXNlIHd2c3ByaW50ZjMyQSBpbnN0ZWFkIG9mIHZzcHJpbnRmIGluIEZvcm1hdE1lc3NhZ2UzMlgKKworCSogW21pc2MvdmVyc2lvbl0KKwlNYWtlIE5UMy41MCBhIHJlY29nbmlzZWQgdmVyc2lvbgorCisJKiBbZ3JhcGhpY3MveDExZHJ2L2dyYXBoaWNzLmNdCisJQ2hhbmdlIHRoZSBhbGdvcml0aG1lIHRvIGRyYXcgYXJjcworCisJKiBbbG9hZGVyL3Jlc291cmNlLmNdCisJUmV0dXJuIGFuIGVtcHR5IGJ1ZmZlciBpbiBMb2FkU3RyaW5nMzJBIGlmIG5vIHJlc291cmNlIGZvdW5kLgorCisJKiBbd2luMzIvY29kZV9wYWdlLmNdCisJVHJ5IGhhcmRlciB0byBnZXQgdGhlIHJpZ2h0IHNpemUgaW4gTXVsdGlCeXRlVG9XaWRlQ2hhci4KKworCSogW3dpbjMyL3Byb2Nlc3MuY10KKwlDYWxsIFdpbkV4ZWMzMiBmb3IgQ3JlYXRlUHJvY2VzczMyQS4KKworCSogW3dpbmRvd3MvdXNlci5jXQorCUluc3RhbGwgZGVmYXVsdCBJbnQwIEhhbmRsZXIgaW4gSW5pdEFwcCgpLgorCitUaHUgQXByICA4IDE5OjI5OjQ4IDE5OTggIEVyaWMgS29obCA8ZWtvaGxAYWJvLnJoZWluLXplaXR1bmcuZGU+CisKKwkqIFttaXNjL2ltYWdlbGlzdC5jXQorCVByZWxpbWluYXJ5IGZpeCBmb3IgZHJhd2luZyBzZWxlY3RlZCBpbWFnZXMuCisJVmFyaW91cyBpbXByb3ZlbWVudHMuCisKKwkqIFtjb250cm9scy9wcm9ncmVzcy5jXVtpbmNsdWRlL3Byb2dyZXNzLmNdW2luY2x1ZGUvY29tbWN0cmwuaF0KKwlBZGRlZCBwcm9ncmVzcyBiYXIgbWVzc2FnZXMgYW5kIHN0eWxlcyBmb3IgSUU0LjAxIChkbGwgdmVyc2lvbiA0LjcyKQorCWNvbXBhdGliaWxpdHkuCisJRml4ZWQgbGVkIHNpemUgcHJvYmxlbS4KKworCSogW2NvbnRyb2xzL3VwZG93bi5jXVtpbmNsdWRlL2NvbW1jdHJsLmhdCisJQWRkZWQgVURNX0dFVFJBTkdFMzIgYW5kIFVETV9TRVRSQU5HRTMyLgorCisJKiBbb2JqZWN0cy9vZW1iaXRtYXBzLmNdW2luY2x1ZGUvd2luZG93cy5oXVtpbmNsdWRlL2JpdG1hcHMvKl0KKwlBZGRlZCBXaW45NSBpY29ucyBhbmQgZml4ZWQgV2luOTUgY3Vyc29yIGFuZCByZXN0b3JlIGJ1dHRvbiBidWcuCisJTm93IHRoZXkgc2hvdWxkIGJlIHZpc2libGUuIFNvcnJ5ISEhCisKKwkqIFtyZWxheTMyL2NvbWN0bDMyLnNwZWNdCisJQWRkZWQgbW9zdCBtaXNzaW5nIGZ1bmN0aW9uIG5hbWVzLgorCitUdWUgQXByICA2IDE4OjQ4OjM2IDE5OTggIE1hdHRoZXcgQmVja2VyIDxtYmVja2VyQGdsYXNzY2l0eS5uZXQ+CisKKwkqIFtvYmplY3RzL2ZvbnQuY10gW2lmMTYzMi9nZGkuc3BlY10KKwlHZXRPdXRsaW5lVGV4dE1ldHJpY3M6IHN0dWIKKworCSogW29iamVjdHMvdGV4dC5jXQorCUdldFRleHRDaGFyc2V0IHNob3VsZCBqdXN0IGNhbGwgR2V0VGV4dENoYXJzZXRJbmZvLgorCisJKiBbbWlzYy9tcHIuY10gW3JlbGF5MzIvbXByLnNwZWNdCisJV05ldENhY2hlUGFzc3dvcmQ6IHN0dWIKKworCSogW3NjaGVkdWxlci90aHJlYWQuY10gW3JlbGF5MzIvdXNlcjMyLnNwZWNdCisJQXR0YWNoVGhyZWFkSW5wdXQ6IHN0dWIKKwlVcGRhdGVkIGRvY3VtZW50YXRpb24uCisKKwkqIFtvYmplY3RzL3BhbGV0dGUuY10KKwlVcGRhdGVkIGRvY3VtZW50YXRpb24uCisKK1R1ZSBNYXIgMzEgMTc6MDY6MzAgMTk5OCAgSmFtZXMgSnVyYW4gPGpyajEyMEBwc3UuZWR1PgorCisJKiBbKi8qLmNdCisJRmluaXNoZWQgZml4aW5nIFVTRVIzMiBvcmRpbmFsIG51bWJlcnMgaW4gZnVuY3Rpb24gZG9jdW1lbnRhdGlvbi4KKworTW9uIE1hciAzMCAyMDoyNzozOCAxOTk4ICBNb3J0ZW4gV2VsaW5kZXIgIDx0ZXJyYUBkaWt1LmRrPgorCisJKiBbbWlzYy9kZWJ1Z3N0ci5jXSBbaW5jbHVkZS9kZWJ1Z3N0ci5oXQorCU1vdmVkIF9kdW1wc3RyIGZyb20gcmVsYXkzMi9yZWxheTM4Ni5jLiAgSW1wcm92ZWQgY29udHJvbAorCWNoYXJhY3RlciBoYW5kbGluZy4KKworCSogW21zZG9zL2ludDIxLmNdCisJSW1wbGVtZW50IDIxNUUwMCAtLSBnZXQgbWFjaGluZSBuYW1lLgorCisJKiBbd2luZG93cy93aW5wb3MuY10KKwlTZXRXaW5kb3dQb3MzMjogTWFrZSBhbiBleHRyYSBzeW5jIHdoZW4gbWFwcGluZyBtYW5hZ2VkCisJd2luZG93cy4gIFRoaXMgbWFrZXMgc3VyZSB0aGUgcmVjb25maWd1cmUgZXZlbnQgaGFzIGJlZW4KKwloYW5kbGVkLiAgU2VlIE1zaGVhcnRzJyB3aGF0J3MteW91ci1uYW1lIHdpbmRvdy4KKworTW9uIE1hciAzMCAwMToxMzo1MCAxOTk4ICBBbGV4YW5kZXIgVi4gTHVreWFub3YgPGxhdkBsb25nLnlhci5ydT4KKworCSogW01ha2VmaWxlLmluXQorCUluc3RhbGwgaW5jbHVkZXMgZnJvbSBUT1BTUkNESVIuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFN1biBNYXIgMjkgMTU6MTg6NTcgMTk5OCAgVXdlIEJvbm5lcyA8ZWxla3Ryb24uaWtwLnBoeXNpay50dS1kYXJtc3RhZHQuZGU+CiAKIAkqIFttc2Rvcy9pbnQyMS5jXQpkaWZmIC0tZ2l0IGEvREVWRUxPUEVSUy1ISU5UUyBiL0RFVkVMT1BFUlMtSElOVFMKaW5kZXggNDBjY2I2YS4uMzA3MGU4ZCAxMDA2NDQKLS0tIGEvREVWRUxPUEVSUy1ISU5UUworKysgYi9ERVZFTE9QRVJTLUhJTlRTCkBAIC02MCw2ICs2MCw2MCBAQAogCXByb2dyYW1zLwkJLSB1dGlsaXRpZXMgKFByb2dtYW4sIFdpbkhlbHApCiAJbGlidGVzdC8JCS0gV2luZWxpYiB0ZXN0IHNhbXBsZXMKIAorSU1QTEVNRU5USU5HIE5FVyBBUEkgQ0FMTFMKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgaXMgdGhlIHNpbXBsZSB2ZXJzaW9uLCBhbmQgY292ZXJzIG9ubHkgV2luMzIuIFdpbjE2IGlzIHNsaWdodGx5IHVnbGllciwKK2JlY2F1c2Ugb2YgdGhlIFBhc2NhbCBoZXJpdGFnZSBhbmQgdGhlIHNlZ21lbnRlZCBtZW1vcnkgbW9kZWwuCisKK0FsbCBvZiB0aGUgV2luMzIgQVBJcyBrbm93biB0byBXaW5lIGFyZSBsaXN0ZWQgaW4gW3JlbGF5MzIvKi5zcGVjXS4gQW4KK3VuaW1wbGVtZW50ZWQgY2FsbCB3aWxsIGxvb2sgbGlrZSAoZnJvbSBnZGkzMi5zcGVjKQorICAyNjkgc3R1YiBQb2x5QmV6aWVyVG8KK1RvIGltcGxlbWVudCB0aGlzIGNhbGwsIHlvdSBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmcgZm91ciB0aGluZ3MuCisKKzEuIEZpbmQgdGhlIGFwcHJvcHJpYXRlIHBhcmFtZXRlcnMgZm9yIHRoZSBjYWxsLCBhbmQgYWRkIGEgcHJvdG90eXBlIHRvCitbaW5jbHVkZS93aW5kb3dzLmhdLiBJbiB0aGlzIGNhc2UsIGl0IG1pZ2h0IGxvb2sgbGlrZQorICBCT09MMzIgV0lOQVBJIFBvbHlCZXppZXJUbzMyKEhEQzMyLCBMUENWT0lELCBEV09SRCk7CisgICNkZWZpbmUgICAgICAgUG9seUJlemllclRvIFdJTkVMSUJfTkFNRShQb2x5QmV6aWVyVG8pCitOb3RlIHRoZSB1c2Ugb2YgdGhlICNkZWZpbmUgZm9yIFdpbmVsaWIuIFNlZSBiZWxvdyBmb3IgZGlzY3Vzc2lvbiBvZgorZnVuY3Rpb24gbmFtaW5nIGNvbnZlbnRpb25zLgorICAKKzIuIE1vZGlmeSB0aGUgLnNwZWMgZmlsZSB0byB0ZWxsIFdpbmUgdGhhdCB0aGUgZnVuY3Rpb24gaGFzIGFuCitpbXBsZW1lbnRhdGlvbiwgd2hhdCB0aGUgcGFyYW1ldGVycyBsb29rIGxpa2UgYW5kIHdoYXQgV2luZSBmdW5jdGlvbgordG8gdXNlIGZvciB0aGUgaW1wbGVtZW50YXRpb24uIEluIFdpbjMyLCB0aGluZ3MgYXJlIHNpbXBsZS0tZXZlcnl0aGluZworaXMgMzItYml0cy4gSG93ZXZlciwgdGhlIHJlbGF5IGNvZGUgaGFuZGxlcyBwb2ludGVycyBhbmQgcG9pbnRlcnMgdG8KK3N0cmluZ3Mgc2xpZ2h0bHkgZGlmZmVyZW50bHksIHNvIHlvdSBzaG91bGQgdXNlICdzdHInIGFuZCAnd3N0cicgZm9yCitzdHJpbmdzLCAncHRyJyBmb3Igb3RoZXIgcG9pbnRlciB0eXBlcywgYW5kICdsb25nJyBmb3IgZXZlcnl0aGluZyBlbHNlLgorICAyNjkgc3RkY2FsbCBQb2x5QmV6aWVyVG8obG9uZyBwdHIgbG9uZykgUG9seUJlemllclRvMzIKK1RoZSAnUG9seUJlemllclRvMzInIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgaXMgd2hpY2ggV2luZSBmdW5jdGlvbiB0byB1c2UKK2ZvciB0aGUgaW1wbGVtZW50YXRpb24uCisKKzMuIEltcGxlbWVudCB0aGUgZnVuY3Rpb24gYXMgYSBzdHViLiBPbmNlIHlvdSBhZGQgdGhlIGZ1bmN0aW9uIHRvIHRoZSAuc3BlYworZmlsZSwgeW91IG11c3QgYWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgV2luZSBzb3VyY2UgYmVmb3JlIGl0IHdpbGwgbGluay4KK0FkZCBhIGZ1bmN0aW9uIGNhbGxlZCAnUG9seUJlemllclRvMzInIHNvbWV3aGVyZS4gR29vZCB0aGluZ3MgdG8gcHV0CitpbnRvIGEgc3R1YjoKKyAgbyBhIGNvcnJlY3QgcHJvdG90eXBlLCBpbmNsdWRpbmcgdGhlIFdJTkFQSQorICBvIGhlYWRlciBjb21tZW50cywgaW5jbHVkaW5nIGZ1bGwgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGZ1bmN0aW9uIGFuZAorICAgIGFyZ3VtZW50cworICBvIEEgRklYTUUgbWVzc2FnZSBhbmQgYW4gYXBwcm9wcmlhdGUgcmV0dXJuIHZhbHVlIGFyZSBnb29kIHRoaW5ncyB0bworICAgIHB1dCBpbiBhIHN0dWIuCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKiAgUG9seUJlemllclRvMzIgICAoR0RJMzIuMjY5KSAgRHJhdyBtYW55IEJlemllciBjdXJ2ZXMKKyAgICoKKyAgICogQlVHUworICAgKiAgIFVuaW1wbGVtZW50ZWQKKyAgICovCisgICBCT09MMzIgV0lOQVBJIFBvbHlCZXppZXJUbzMyKEhEQzMyIGhkYywgTFBDVk9JRCBwLCBEV09SRCBjb3VudCkgeworCS8qIHRlbGwgdGhlIHVzZXIgdGhleSd2ZSBnb3QgYSBzdWJzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiAqLworICAgICAgRklYTUUoZ2RpLCAiOigleCwlcCwlZCk6IHN0dWJcbiIsIGhkYywgcCwgY291bnQpOworCS8qIHNvbWUgcHJvZ3JhbXMgbWF5IGJlIGFibGUgdG8gY29tcGVuc2F0ZSwgCisgICAgICAgICAgIGlmIHRoZXkga25vdyB3aGF0IGhhcHBlbmVkICovCisgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOyAgCisgICAgICByZXR1cm4gRkFMU0U7ICAgIC8qIGVycm9yIHZhbHVlICovCisgICB9CisKKzQuIEltcGxlbWVudCBhbmQgdGVzdCB0aGUgZnVuY3Rpb24uCiAKIE1FTU9SWSBBTkQgU0VHTUVOVFMKID09PT09PT09PT09PT09PT09PT0KQEAgLTE0Nyw4ICsyMDEsMTAgQEAKIGVtdWxhdG9yLCAneHh4JyBpcyBfbm90XyBkZWZpbmVkLCBtZWFuaW5nIHRoYXQgeW91IG11c3QgYWx3YXlzIHNwZWNpZnkKIGV4cGxpY2l0bHkgd2hldGhlciB5b3Ugd2FudCB0aGUgMTYtYml0IG9yIDMyLWJpdCB2ZXJzaW9uLgogCi1Ob3RlOiBpZiAneHh4JyBpcyB0aGUgc2FtZSBpbiBXaW4xNiBhbmQgV2luMzIsIHlvdSBjYW4gc2ltcGx5IHVzZSB0aGUKLXNhbWUgbmFtZSBhcyBXaW5kb3dzLgorSWYgJ3h4eCcgaXMgdGhlIHNhbWUgaW4gV2luMTYgYW5kIFdpbjMyLCBvciBpZiAneHh4JyBpcyBXaW4xNiBvbmx5LAoreW91IGNhbiBzaW1wbHkgdXNlIHRoZSBzYW1lIG5hbWUgYXMgV2luZG93cywgaS5lLiBqdXN0ICd4eHgnLiAgSWYKKyd4eHgnIGlzIFdpbjMyIG9ubHksIHlvdSBjYW4gdXNlICd4eHgnIGlmIHRoZXJlIGFyZSBubyBzdHJpbmdzCitpbnZvbHZlZCwgb3RoZXJ3aXNlIHlvdSBtdXN0IHVzZSB0aGUgJ3h4eDMyQScgYW5kICd4eHgzMlcnIGZvcm1zLgogCiBFeGFtcGxlczoKIApAQCAtMTczLDcgKzIyOSw3IEBACiAgICAgUmVnaXN0ZXJDbGFzcyggJndjICk7CiAKIGFuZCB0aGlzIHdpbGwgdXNlIHRoZSBjb3JyZWN0IGRlY2xhcmF0aW9uIGRlcGVuZGluZyBvbiB0aGUgZGVmaW5pdGlvbgotb2YgdGhlIHN5bWJvbHMgV0lORUxJQjE2LCBXSU5FTElCMzIgYW5kIFVOSUNPREUuCitvZiB0aGUgc3ltYm9scyBXSU5FTElCIGFuZCBVTklDT0RFLgogCiAKIEFQSSBFTlRSWSBQT0lOVFMKZGlmZiAtLWdpdCBhL01ha2UucnVsZXMuaW4gYi9NYWtlLnJ1bGVzLmluCmluZGV4IDAwMDZmY2UuLmQ4ZTZlOTMgMTAwNjQ0Ci0tLSBhL01ha2UucnVsZXMuaW4KKysrIGIvTWFrZS5ydWxlcy5pbgpAQCAtMzYsNyArMzYsNyBAQAogQVIgICAgICAgID0gYXIgcmMKIFJNICAgICAgICA9IHJtIC1mCiBNS0RJUiAgICAgPSBta2RpcgotQzJNQU4gICAgID0gYzJtYW4KK0MyTUFOICAgICA9IEBDMk1BTkAKIEJVSUxEICAgICA9ICQoVE9QT0JKRElSKS90b29scy9idWlsZEBQUk9HRVhUQAogTUFLRURFUCAgID0gJChUT1BPQkpESVIpL3Rvb2xzL21ha2VkZXBAUFJPR0VYVEAKIFdJTkVSQyAgICA9ICQoVE9QT0JKRElSKS9yYy93aW5lcmNAUFJPR0VYVEAKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KaW5kZXggMmI2NWZhZS4uMDAzNjM3YyAxMDA2NDQKLS0tIGEvTWFrZWZpbGUuaW4KKysrIGIvTWFrZWZpbGUuaW4KQEAgLTEyOCw3ICsxMjgsNyBAQAogCiBpbnN0YWxsX2luY2x1ZGVzOiBkdW1teQogCWlmIFsgLWQgJChpbmNsdWRlZGlyKSBdOyB0aGVuIDogOyBlbHNlICQoTUtESVIpICQoaW5jbHVkZWRpcik7IGZpIAotCWNkIGluY2x1ZGU7ICQoSU5TVEFMTF9EQVRBKSB3aW5kb3dzLmggd2ludHlwZXMuaCAkKGluY2x1ZGVkaXIpCisJY2QgJChUT1BTUkNESVIpL2luY2x1ZGU7ICQoSU5TVEFMTF9EQVRBKSB3aW5kb3dzLmggd2ludHlwZXMuaCAkKGluY2x1ZGVkaXIpCiAKICQoQUxMU1VCRElSUyk6IGR1bW15CiAJQGNkICRAOyAkKFNVQk1BS0UpCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKaW5kZXggZjFhMmU2Zi4uMWQzMmIxYyAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZpZ3VyZQpAQCAtMTg5NiwxMCArMTg5NiwzOSBAQAogICBlY2hvICIkYWNfdCIibm8iIDE+JjYKIGZpCiAKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYzJtYW4iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGMybWFuOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5MDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DMk1BTicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDMk1BTiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DMk1BTj0iJEMyTUFOIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgYWNfY3ZfcHJvZ19DMk1BTj0iYzJtYW4iCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIHRlc3QgLXogIiRhY19jdl9wcm9nX0MyTUFOIiAmJiBhY19jdl9wcm9nX0MyTUFOPSJ0cnVlIgorZmkKK2ZpCitDMk1BTj0iJGFjX2N2X3Byb2dfQzJNQU4iCitpZiB0ZXN0IC1uICIkQzJNQU4iOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQzJNQU4iIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGkzODZfc2V0X2xkdCBpbiAtbGkzODYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MDM6IGNoZWNraW5nIGZvciBpMzg2X3NldF9sZHQgaW4gLWxpMzg2IiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxOTMyOiBjaGVja2luZyBmb3IgaTM4Nl9zZXRfbGR0IGluIC1saTM4NiIgPiY1CiBhY19saWJfdmFyPWBlY2hvIGkzODYnXydpMzg2X3NldF9sZHQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTE5MDcsNyArMTkzNiw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbGkzODYgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTkxMSAiY29uZmlndXJlIgorI2xpbmUgMTk0MCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtMTkxOCw3ICsxOTQ3LDcgQEAKIGkzODZfc2V0X2xkdCgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTkyMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5NTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xOTQ2LDcgKzE5NzUsNyBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlzd2FsbnVtIGluIC1sdyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk1MDogY2hlY2tpbmcgZm9yIGlzd2FsbnVtIGluIC1sdyIgPiY1CitlY2hvICJjb25maWd1cmU6MTk3OTogY2hlY2tpbmcgZm9yIGlzd2FsbnVtIGluIC1sdyIgPiY1CiBhY19saWJfdmFyPWBlY2hvIHcnXydpc3dhbG51bSB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTk1NCw3ICsxOTgzLDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sdyAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTU4ICJjb25maWd1cmUiCisjbGluZSAxOTg3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xOTY1LDcgKzE5OTQsNyBAQAogaXN3YWxudW0oKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5Njk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTk4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTk5Myw3ICsyMDIyLDcgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBYRjg2REdBUXVlcnlFeHRlbnNpb24gaW4gLWxYeGY4NmRnYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk5NzogY2hlY2tpbmcgZm9yIFhGODZER0FRdWVyeUV4dGVuc2lvbiBpbiAtbFh4Zjg2ZGdhIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMDI2OiBjaGVja2luZyBmb3IgWEY4NkRHQVF1ZXJ5RXh0ZW5zaW9uIGluIC1sWHhmODZkZ2EiID4mNQogYWNfbGliX3Zhcj1gZWNobyBYeGY4NmRnYSdfJ1hGODZER0FRdWVyeUV4dGVuc2lvbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMjAwMSw3ICsyMDMwLDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sWHhmODZkZ2EgJFhfTElCUyAtbFhleHQgLWxYMTEgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDA1ICJjb25maWd1cmUiCisjbGluZSAyMDM0ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0yMDEyLDcgKzIwNDEsNyBAQAogWEY4NkRHQVF1ZXJ5RXh0ZW5zaW9uKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDE2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA0NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTIwMzYsMTggKzIwNjUsNjYgQEAKIGZpCiAKIAorZm9yIGFjX2hkciBpbiBzeXMvc291bmRjYXJkLmggbWFjaGluZS9zb3VuZGNhcmQuaAorZG8KK2FjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIwNzM6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyMDc4ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDwkYWNfaGRyPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDgzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2hkciAxCitFT0YKKyAKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorZG9uZQorCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3IgT3BlbiBTb3VuZCBTeXN0ZW0iIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDQyOiBjaGVja2luZyAiZm9yIE9wZW4gU291bmQgU3lzdGVtIiIgPiY1CitlY2hvICJjb25maWd1cmU6MjExMTogY2hlY2tpbmcgImZvciBPcGVuIFNvdW5kIFN5c3RlbSIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjA0NyAiY29uZmlndXJlIgorI2xpbmUgMjExNiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3NvdW5kY2FyZC5oPgorCisJI2lmZGVmIEhBVkVfU1lTX1NPVU5EQ0FSRF9ICisJCSNpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+CisJI2VuZGlmCisJI2lmZGVmIEhBVkVfTUFDSElORV9TT1VORENBUkRfSAorCQkjaW5jbHVkZSA8bWFjaGluZS9zb3VuZGNhcmQuaD4KKwkjZW5kaWYKKwkKIGludCBtYWluKCkgewogCisKIC8qIGNoZWNrIGZvciBvbmUgb2YgdGhlIE9wZW4gU291bmQgU3lzdGVtIHNwZWNpZmljIFNORENUTF8gZGVmaW5lcyAqLwogI2lmICFkZWZpbmVkKFNORENUTF9EU1BfU1RFUkVPKQogI2Vycm9yIE5vIG9wZW4gc291bmQgc3lzdGVtCkBAIC0yMDU1LDc1ICsyMTMyLDMzIEBACiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDU5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMzY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX29wZW5zb3VuZHN5c3RlbT0ieWVzIgorCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBIQVZFX09TUyAxCitFT0YKKwogZWxzZQogICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQogICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX29wZW5zb3VuZHN5c3RlbT0ibm8iCisKIGZpCiBybSAtZiBjb25mdGVzdCoKIGZpCiAKIGVjaG8gIiRhY190IiIkYWNfY3ZfY19vcGVuc291bmRzeXN0ZW0iIDE+JjYKIAotZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciBPcGVuIFNvdW5kIFN5c3RlbSBvbiAqQlNEIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA3NDogY2hlY2tpbmcgImZvciBPcGVuIFNvdW5kIFN5c3RlbSBvbiAqQlNEIiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19vcGVuc291bmRzeXN0ZW1fYnNkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjA3OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bWFjaGluZS9zb3VuZGNhcmQuaD4KLWludCBtYWluKCkgewotCi0vKiBjaGVjayBmb3Igb25lIG9mIHRoZSBPcGVuIFNvdW5kIFN5c3RlbSBzcGVjaWZpYyBTTkRDVExfIGRlZmluZXMgKi8KLSNpZiAhZGVmaW5lZChTTkRDVExfRFNQX1NURVJFTykKLSNlcnJvciBObyBvcGVuIHNvdW5kIHN5c3RlbQotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDkxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19vcGVuc291bmRzeXN0ZW1fYnNkPSJ5ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtX2JzZD0ibm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtX2JzZCIgMT4mNgotCi1pZiB0ZXN0ICIkYWNfY3ZfY19vcGVuc291bmRzeXN0ZW0iID0gInllcyIgLW8gIiRhY19jdl9jX29wZW5zb3VuZHN5c3RlbV9ic2QiID0gInllcyIKLXRoZW4KLSAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9PU1MgMQotRU9GCi0KLSAgICBpZiB0ZXN0ICIkYWNfY3ZfY19vcGVuc291bmRzeXN0ZW1fYnNkIiA9ICJ5ZXMiCi0gICAgdGhlbgotICAgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NQUNISU5FX1NPVU5EQ0FSRF9IIDEKLUVPRgotCi0gICAgZmkKLWZpCi0KIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciB1bmlvbiBzZW11biIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMjI6IGNoZWNraW5nICJmb3IgdW5pb24gc2VtdW4iIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMTU3OiBjaGVja2luZyAiZm9yIHVuaW9uIHNlbXVuIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY191bmlvbl9zZW11bicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMjcgImNvbmZpZ3VyZSIKKyNsaW5lIDIxNjIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zZW0uaD4KQEAgLTIxMzEsNyArMjE2Niw3IEBACiB1bmlvbiBzZW11biBmb28KIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTM1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxNzA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX3VuaW9uX3NlbXVuPSJ5ZXMiCiBlbHNlCkBAIC0yMTU5LDcgKzIxOTQsNyBAQAogdGhlbgogICBDRkxBR1M9IiRDRkxBR1MgLVdhbGwiCiAgIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3IgZ2NjIHN0cmVuZ3RoLXJlZHVjZSBidWciIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTYzOiBjaGVja2luZyAiZm9yIGdjYyBzdHJlbmd0aC1yZWR1Y2UgYnVnIiIgPiY1CitlY2hvICJjb25maWd1cmU6MjE5ODogY2hlY2tpbmcgImZvciBnY2Mgc3RyZW5ndGgtcmVkdWNlIGJ1ZyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfZ2NjX3N0cmVuZ3RoX2J1Zycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0yMTY3LDcgKzIyMDIsNyBAQAogICBhY19jdl9jX2djY19zdHJlbmd0aF9idWc9InllcyIKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE3MSAiY29uZmlndXJlIgorI2xpbmUgMjIwNiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKHZvaWQpIHsKQEAgLTIxNzgsNyArMjIxMyw3IEBACiAgIGV4aXQoIEFycmF5WzFdICE9IC0yICk7CiB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE4MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjE3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIGFjX2N2X2NfZ2NjX3N0cmVuZ3RoX2J1Zz0ibm8iCiBlbHNlCkBAIC0yMjAxLDcgKzIyMzYsNyBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIGV4dGVybmFsIHN5bWJvbHMgbmVlZCBhbiB1bmRlcnNjb3JlIHByZWZpeCIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIyMDU6IGNoZWNraW5nICJ3aGV0aGVyIGV4dGVybmFsIHN5bWJvbHMgbmVlZCBhbiB1bmRlcnNjb3JlIHByZWZpeCIiID4mNQorZWNobyAiY29uZmlndXJlOjIyNDA6IGNoZWNraW5nICJ3aGV0aGVyIGV4dGVybmFsIHN5bWJvbHMgbmVlZCBhbiB1bmRlcnNjb3JlIHByZWZpeCIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfZXh0ZXJuX3ByZWZpeCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0yMjEzLDE0ICsyMjQ4LDE0IEBACiAJLmxvbmcgMAogRU9GCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjE3ICJjb25maWd1cmUiCisjbGluZSAyMjUyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIGV4dGVybiBpbnQgYWNfdGVzdDsKIGludCBtYWluKCkgewogaWYgKGFjX3Rlc3QpIHJldHVybiAxCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIyNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfZXh0ZXJuX3ByZWZpeD0ieWVzIgogZWxzZQpAQCAtMjI0NCw3ICsyMjc5LDcgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyAid2hldGhlciBhc3NlbWJsZXIgYWNjZXB0cyAuc3RyaW5nIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI0ODogY2hlY2tpbmcgIndoZXRoZXIgYXNzZW1ibGVyIGFjY2VwdHMgLnN0cmluZyIiID4mNQorZWNobyAiY29uZmlndXJlOjIyODM6IGNoZWNraW5nICJ3aGV0aGVyIGFzc2VtYmxlciBhY2NlcHRzIC5zdHJpbmciIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2FzbV9zdHJpbmcnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMjI1NCwxNCArMjI4OSwxNCBAQAogCS5zdHJpbmcgInRlc3QiCiBFT0YKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyNTggImNvbmZpZ3VyZSIKKyNsaW5lIDIyOTMgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzAwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX2FzbV9zdHJpbmc9InllcyIKIGVsc2UKQEAgLTIyODgsMjEgKzIzMjMsMjEgQEAKIGlmIHRlc3QgIiRMSUJfVEFSR0VUIiA9ICJsaWJ3aW5lLnNvLjEuMCIKIHRoZW4KICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgd2UgY2FuIGJ1aWxkIGEgZGxsIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI5MjogY2hlY2tpbmcgIndoZXRoZXIgd2UgY2FuIGJ1aWxkIGEgZGxsIiIgPiY1CitlY2hvICJjb25maWd1cmU6MjMyNzogY2hlY2tpbmcgIndoZXRoZXIgd2UgY2FuIGJ1aWxkIGEgZGxsIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19kbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBzYXZlZF9jZmxhZ3M9JENGTEFHUwogICBDRkxBR1M9IiRDRkxBR1MgLWZQSUMgLXNoYXJlZCAtV2wsLXNvbmFtZSxjb25mdGVzdC5zby4xLjAiCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyOTkgImNvbmZpZ3VyZSIKKyNsaW5lIDIzMzQgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIHJldHVybiAxCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMwNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfZGxsPSJ5ZXMiCiBlbHNlCkBAIC0yMzI4LDcgKzIzNjMsNyBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3IgcmVlbnRyYW50IFggbGlicmFyaWVzIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMzMjogY2hlY2tpbmcgImZvciByZWVudHJhbnQgWCBsaWJyYXJpZXMiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMzY3OiBjaGVja2luZyAiZm9yIHJlZW50cmFudCBYIGxpYnJhcmllcyIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3dpbmVfY3ZfeF9yZWVudHJhbnQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMjM2OSwxNSArMjQwNCwxNSBAQAogZmkKIAogCi1mb3IgYWNfZnVuYyBpbiBjbG9uZSBtZW1tb3ZlIHN0cmVycm9yIHRjZ2V0YXR0ciB0aW1lZ20gdXNsZWVwIHdhaXQ0IHdhaXRwaWQKK2ZvciBhY19mdW5jIGluIGNsb25lIGdldHBhZ2VzaXplIG1lbW1vdmUgc2lnYWx0c3RhY2sgc3RyZXJyb3IgdGNnZXRhdHRyIHRpbWVnbSB1c2xlZXAgd2FpdDQgd2FpdHBpZAogZG8KIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM3NjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyNDExOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzgxICJjb25maWd1cmUiCisjbGluZSAyNDE2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KQEAgLTI0MDAsNyArMjQzNSw3IEBACiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQzOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCiBlbHNlCkBAIC0yNDI0LDIxICsyNDU5LDIxIEBACiBmaQogZG9uZQogCi1mb3IgYWNfaGRyIGluIHdjdHlwZS5oCitmb3IgYWNfaGRyIGluIHdjdHlwZS5oIHN5cy9zeXNjYWxsLmggc3lzY2FsbC5oIHN5cy9wYXJhbS5oIHN5cy92ZnMuaCBzeXMvbW91bnQuaCBzeXMvc3RhdGZzLmggZmxvYXQuaCBsaW51eC9jZHJvbS5oIHN5cy9jZGlvLmggc3lzL2ZpbGlvLmgKIGRvCiBhY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDMyOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitlY2hvICJjb25maWd1cmU6MjQ2NzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MzcgImNvbmZpZ3VyZSIKKyNsaW5lIDI0NzIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPCRhY19oZHI+CiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0NDI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjI0Nzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKQEAgLTI0NjUsMTIgKzI1MDAsMTIgQEAKIGRvbmUKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ2OTogY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIgPiY1CitlY2hvICJjb25maWd1cmU6MjUwNDogY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0YXRfYnJva2VuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ3NCAiY29uZmlndXJlIgorI2xpbmUgMjUwOSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KQEAgLTI1MjEsMTIgKzI1NTYsMTIgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTI1OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CitlY2hvICJjb25maWd1cmU6MjU2MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTMwICJjb25maWd1cmUiCisjbGluZSAyNTY1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7CkBAIC0yNTc1LDcgKzI2MTAsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU3OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjE0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19jb25zdD15ZXMKIGVsc2UKQEAgLTI1OTYsMTIgKzI2MzEsMTIgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjAwOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitlY2hvICJjb25maWd1cmU6MjYzNTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjYwNSAiY29uZmlndXJlIgorI2xpbmUgMjY0MCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CkBAIC0yNjA5LDcgKzI2NDQsNyBAQAogI2luY2x1ZGUgPGZsb2F0Lmg+CiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI2MTM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjI2NDg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKQEAgLTI2MjYsNyArMjY2MSw3IEBACiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgogICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjMwICJjb25maWd1cmUiCisjbGluZSAyNjY1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzdHJpbmcuaD4KIEVPRgpAQCAtMjY0NCw3ICsyNjc5LDcgQEAKIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCiAgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2NDggImNvbmZpZ3VyZSIKKyNsaW5lIDI2ODMgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogRU9GCkBAIC0yNjY1LDcgKzI3MDAsNyBAQAogICA6CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2NjkgImNvbmZpZ3VyZSIKKyNsaW5lIDI3MDQgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPGN0eXBlLmg+CiAjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKQEAgLTI2NzYsNyArMjcxMSw3IEBACiBleGl0ICgwKTsgfQogCiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY4MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzE1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIDoKIGVsc2UKQEAgLTI3MDAsMTIgKzI3MzUsMTIgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MDQ6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQorZWNobyAiY29uZmlndXJlOjI3Mzk6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjcwOSAiY29uZmlndXJlIgorI2xpbmUgMjc0NCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaWYgU1REQ19IRUFERVJTCkBAIC0yNzMyLDYgKzI3NjcsMTYwIEBACiAKIGZpCiAKK2VjaG8gJGFjX24gImNoZWNraW5nIHNpemUgb2YgbG9uZyBsb25nIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyNzcyOiBjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZyIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9MAorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyNzgwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorbWFpbigpCit7CisgIEZJTEUgKmY9Zm9wZW4oImNvbmZ0ZXN0dmFsIiwgInciKTsKKyAgaWYgKCFmKSBleGl0KDEpOworICBmcHJpbnRmKGYsICIlZFxuIiwgc2l6ZW9mKGxvbmcgbG9uZykpOworICBleGl0KDApOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3OTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZz1gY2F0IGNvbmZ0ZXN0dmFsYAorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBhY19jdl9zaXplb2ZfbG9uZ19sb25nPTAKK2ZpCitybSAtZnIgY29uZnRlc3QqCitmaQorCitmaQorZWNobyAiJGFjX3QiIiRhY19jdl9zaXplb2ZfbG9uZ19sb25nIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorI2RlZmluZSBTSVpFT0ZfTE9OR19MT05HICRhY19jdl9zaXplb2ZfbG9uZ19sb25nCitFT0YKKworCisKK2VjaG8gJGFjX24gImNoZWNraW5nICJmb3Igc3RhdGZzLmZfYmF2YWlsIiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjgxMjogY2hlY2tpbmcgImZvciBzdGF0ZnMuZl9iYXZhaWwiIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneyd3aW5lX2N2X3N0YXRmc19iYXZhaWwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgaWYgdGVzdCAieCRzdGF0ZnNfYmF2YWlsIiA9ICJ4bm8iCisgICAgdGhlbgorICAgICAgICB3aW5lX2N2X3N0YXRmc19iYXZhaWw9bm8KKyAgICBlbHNlCisgICAgCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDI4MjEgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisJI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKwkjIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorCSNlbmRpZgorCSNpZmRlZiBIQVZFX1NZU19TVEFURlNfSAorCSMgaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgorCSNlbmRpZgorCSNpZmRlZiBIQVZFX1NZU19NT1VOVF9ICisJIyBpbmNsdWRlIDxzeXMvbW91bnQuaD4KKwkjZW5kaWYKKwkjaWZkZWYgSEFWRV9TWVNfVkZTX0gKKwkjIGluY2x1ZGUgPHN5cy92ZnMuaD4KKwkjZW5kaWYKKwkKK2ludCBtYWluKCkgeworCisJCXN0cnVjdCBzdGF0ZnMgc3RmczsKKworCQlzdGZzLmZfYmF2YWlsKys7CisJCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg0NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIHdpbmVfY3Zfc3RhdGZzX2JhdmFpbD15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgd2luZV9jdl9zdGF0ZnNfYmF2YWlsPW5vCisJCitmaQorcm0gLWYgY29uZnRlc3QqCisgICAgZmkgIAorZmkKKworZWNobyAiJGFjX3QiIiR3aW5lX2N2X3N0YXRmc19iYXZhaWwiIDE+JjYKK2lmIHRlc3QgIiR3aW5lX2N2X3N0YXRmc19iYXZhaWwiID0gInllcyIKK3RoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNUQVRGU19IQVNfQkFWQUlMIDEKK0VPRgorCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyAiZm9yIHN0YXRmcy5mX2JmcmVlIiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjg2OTogY2hlY2tpbmcgImZvciBzdGF0ZnMuZl9iZnJlZSIiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3dpbmVfY3Zfc3RhdGZzX2JmcmVlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgIGlmIHRlc3QgIngkc3RhdGZzX2JmcmVlIiA9ICJ4bm8iCisgICAgdGhlbgorICAgICAgICB3aW5lX2N2X3N0YXRmc19iZnJlZT1ubworICAgIGVsc2UKKyAgICAJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjg3OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKwkjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorCSMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisJI2VuZGlmCisJI2lmZGVmIEhBVkVfU1lTX1NUQVRGU19ICisJIyBpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CisJI2VuZGlmCisJI2lmZGVmIEhBVkVfU1lTX01PVU5UX0gKKwkjIGluY2x1ZGUgPHN5cy9tb3VudC5oPgorCSNlbmRpZgorCSNpZmRlZiBIQVZFX1NZU19WRlNfSAorCSMgaW5jbHVkZSA8c3lzL3Zmcy5oPgorCSNlbmRpZgorCQoraW50IG1haW4oKSB7CisKKwkJc3RydWN0IHN0YXRmcyBzdGZzOworCisJCXN0ZnMuZl9iZnJlZSsrOworCQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5MDI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICB3aW5lX2N2X3N0YXRmc19iZnJlZT15ZXMKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgd2luZV9jdl9zdGF0ZnNfYmZyZWU9bm8KKwkKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgICBmaSAgCitmaQorCitlY2hvICIkYWNfdCIiJHdpbmVfY3Zfc3RhdGZzX2JmcmVlIiAxPiY2CitpZiB0ZXN0ICIkd2luZV9jdl9zdGF0ZnNfYmZyZWUiID0gInllcyIKK3RoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIFNUQVRGU19IQVNfQkZSRUUgMQorRU9GCisKK2ZpCisKIAogCiBNQUtFX1JVTEVTPU1ha2UucnVsZXMKQEAgLTI5MjMsNiArMzExMiw3IEBACiBzJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwogcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKIHMlQExOX1NAJSRMTl9TJWcKK3MlQEMyTUFOQCUkQzJNQU4lZwogcyVARExMRkxBR1NAJSRETExGTEFHUyVnCiAvQE1BS0VfUlVMRVNAL3IgJE1BS0VfUlVMRVMKIHMlQE1BS0VfUlVMRVNAJSVnCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuaW4KaW5kZXggNzhhMmM5Ni4uNWRiYTZmYSAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmluCisrKyBiL2NvbmZpZ3VyZS5pbgpAQCAtNDYsNiArNDYsNyBAQAogQUNfUFJPR19SQU5MSUIKIEFDX1BST0dfSU5TVEFMTAogQUNfUFJPR19MTl9TCitBQ19DSEVDS19QUk9HKEMyTUFOLGMybWFuLGMybWFuLHRydWUpCiAKIGRubCAqKioqIENoZWNrIGZvciBzb21lIGxpYnJhcmllcyAqKioqCiAKQEAgLTU3LDMzICs1OCwyOCBAQAogQUNfQ0hFQ0tfTElCKFh4Zjg2ZGdhLFhGODZER0FRdWVyeUV4dGVuc2lvbixBQ19ERUZJTkUoSEFWRV9MSUJYWEY4NkRHQSkgWF9QUkVfTElCUz0iJFhfUFJFX0xJQlMgLWxYeGY4NmRnYSIsLCRYX0xJQlMgLWxYZXh0IC1sWDExKQogCiBkbmwgKioqKiBDaGVjayBmb3IgT3BlbiBTb3VuZCBTeXN0ZW0gKioqKgorQUNfQ0hFQ0tfSEVBREVSUyhzeXMvc291bmRjYXJkLmggbWFjaGluZS9zb3VuZGNhcmQuaCkKIAogQUNfQ0FDSEVfQ0hFQ0soImZvciBPcGVuIFNvdW5kIFN5c3RlbSIsCiAJYWNfY3ZfY19vcGVuc291bmRzeXN0ZW0sCi0JQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+XSxbCisJQUNfVFJZX0NPTVBJTEUoWworCSNpZmRlZiBIQVZFX1NZU19TT1VORENBUkRfSAorCQkjaW5jbHVkZSA8c3lzL3NvdW5kY2FyZC5oPgorCSNlbmRpZgorCSNpZmRlZiBIQVZFX01BQ0hJTkVfU09VTkRDQVJEX0gKKwkJI2luY2x1ZGUgPG1hY2hpbmUvc291bmRjYXJkLmg+CisJI2VuZGlmCisJXSxbCisKIC8qIGNoZWNrIGZvciBvbmUgb2YgdGhlIE9wZW4gU291bmQgU3lzdGVtIHNwZWNpZmljIFNORENUTF8gZGVmaW5lcyAqLwogI2lmICFkZWZpbmVkKFNORENUTF9EU1BfU1RFUkVPKQogI2Vycm9yIE5vIG9wZW4gc291bmQgc3lzdGVtCiAjZW5kaWYKLV0sYWNfY3ZfY19vcGVuc291bmRzeXN0ZW09InllcyIsYWNfY3ZfY19vcGVuc291bmRzeXN0ZW09Im5vIikpCi0KLUFDX0NBQ0hFX0NIRUNLKCJmb3IgT3BlbiBTb3VuZCBTeXN0ZW0gb24gKkJTRCIsCi0JYWNfY3ZfY19vcGVuc291bmRzeXN0ZW1fYnNkLAotCUFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8bWFjaGluZS9zb3VuZGNhcmQuaD5dLFsKLS8qIGNoZWNrIGZvciBvbmUgb2YgdGhlIE9wZW4gU291bmQgU3lzdGVtIHNwZWNpZmljIFNORENUTF8gZGVmaW5lcyAqLwotI2lmICFkZWZpbmVkKFNORENUTF9EU1BfU1RFUkVPKQotI2Vycm9yIE5vIG9wZW4gc291bmQgc3lzdGVtCi0jZW5kaWYKLV0sYWNfY3ZfY19vcGVuc291bmRzeXN0ZW1fYnNkPSJ5ZXMiLGFjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtX2JzZD0ibm8iKSkKLQotaWYgdGVzdCAiJGFjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtIiA9ICJ5ZXMiIC1vICIkYWNfY3ZfY19vcGVuc291bmRzeXN0ZW1fYnNkIiA9ICJ5ZXMiCi10aGVuCi0gICAgQUNfREVGSU5FKEhBVkVfT1NTKQotICAgIGlmIHRlc3QgIiRhY19jdl9jX29wZW5zb3VuZHN5c3RlbV9ic2QiID0gInllcyIKLSAgICB0aGVuCi0gICAgICAgIEFDX0RFRklORShIQVZFX01BQ0hJTkVfU09VTkRDQVJEX0gpCi0gICAgZmkKLWZpCitdLAorCWFjX2N2X2Nfb3BlbnNvdW5kc3lzdGVtPSJ5ZXMiCisJQUNfREVGSU5FKEhBVkVfT1NTKSwKKwlhY19jdl9jX29wZW5zb3VuZHN5c3RlbT0ibm8iCispKQogCiBkbmwgKioqKiBDaGVjayBmb3IgdW5pb24gc2VtdW4gKioqKgogCkBAIC0yMTcsMTEgKzIxMyw3NCBAQAogCiBkbmwgKioqKiBDaGVjayBmb3IgZnVuY3Rpb25zIGFuZCBoZWFkZXIgZmlsZXMgKioqKgogCi1BQ19DSEVDS19GVU5DUyhjbG9uZSBtZW1tb3ZlIHN0cmVycm9yIHRjZ2V0YXR0ciB0aW1lZ20gdXNsZWVwIHdhaXQ0IHdhaXRwaWQpCi1BQ19DSEVDS19IRUFERVJTKHdjdHlwZS5oKQorQUNfQ0hFQ0tfRlVOQ1MoY2xvbmUgZ2V0cGFnZXNpemUgbWVtbW92ZSBzaWdhbHRzdGFjayBzdHJlcnJvciB0Y2dldGF0dHIgdGltZWdtIHVzbGVlcCB3YWl0NCB3YWl0cGlkKQorQUNfQ0hFQ0tfSEVBREVSUyh3Y3R5cGUuaCBzeXMvc3lzY2FsbC5oIHN5c2NhbGwuaCBzeXMvcGFyYW0uaCBzeXMvdmZzLmggc3lzL21vdW50Lmggc3lzL3N0YXRmcy5oIGZsb2F0LmggbGludXgvY2Ryb20uaCBzeXMvY2Rpby5oIHN5cy9maWxpby5oKQogQUNfSEVBREVSX1NUQVQoKQogQUNfQ19DT05TVCgpCiBBQ19UWVBFX1NJWkVfVCgpCitBQ19DSEVDS19TSVpFT0YobG9uZyBsb25nLDApCisKK2RubCAqKioqIERlcGVuZGVudCBjaGVja3MgKioqKgorQUNfQ0FDSEVfQ0hFQ0soICJmb3Igc3RhdGZzLmZfYmF2YWlsIiwgd2luZV9jdl9zdGF0ZnNfYmF2YWlsLAorICBbIGlmIHRlc3QgIngkc3RhdGZzX2JhdmFpbCIgPSAieG5vIgorICAgIHRoZW4KKyAgICAgICAgd2luZV9jdl9zdGF0ZnNfYmF2YWlsPW5vCisgICAgZWxzZQorICAgIAlBQ19UUllfQ09NUElMRShbCisJI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKwkjIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorCSNlbmRpZgorCSNpZmRlZiBIQVZFX1NZU19TVEFURlNfSAorCSMgaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgorCSNlbmRpZgorCSNpZmRlZiBIQVZFX1NZU19NT1VOVF9ICisJIyBpbmNsdWRlIDxzeXMvbW91bnQuaD4KKwkjZW5kaWYKKwkjaWZkZWYgSEFWRV9TWVNfVkZTX0gKKwkjIGluY2x1ZGUgPHN5cy92ZnMuaD4KKwkjZW5kaWYKKwldLFsKKwkJc3RydWN0IHN0YXRmcyBzdGZzOworCisJCXN0ZnMuZl9iYXZhaWwrKzsKKwldLHdpbmVfY3Zfc3RhdGZzX2JhdmFpbD15ZXMsd2luZV9jdl9zdGF0ZnNfYmF2YWlsPW5vCisJKQorICAgIGZpIF0gKQoraWYgdGVzdCAiJHdpbmVfY3Zfc3RhdGZzX2JhdmFpbCIgPSAieWVzIgordGhlbgorICBBQ19ERUZJTkUoU1RBVEZTX0hBU19CQVZBSUwpCitmaQorCitBQ19DQUNIRV9DSEVDSyggImZvciBzdGF0ZnMuZl9iZnJlZSIsIHdpbmVfY3Zfc3RhdGZzX2JmcmVlLAorICBbIGlmIHRlc3QgIngkc3RhdGZzX2JmcmVlIiA9ICJ4bm8iCisgICAgdGhlbgorICAgICAgICB3aW5lX2N2X3N0YXRmc19iZnJlZT1ubworICAgIGVsc2UKKyAgICAJQUNfVFJZX0NPTVBJTEUoWworCSNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICisJIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKwkjZW5kaWYKKwkjaWZkZWYgSEFWRV9TWVNfU1RBVEZTX0gKKwkjIGluY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KKwkjZW5kaWYKKwkjaWZkZWYgSEFWRV9TWVNfTU9VTlRfSAorCSMgaW5jbHVkZSA8c3lzL21vdW50Lmg+CisJI2VuZGlmCisJI2lmZGVmIEhBVkVfU1lTX1ZGU19ICisJIyBpbmNsdWRlIDxzeXMvdmZzLmg+CisJI2VuZGlmCisJXSxbCisJCXN0cnVjdCBzdGF0ZnMgc3RmczsKKworCQlzdGZzLmZfYmZyZWUrKzsKKwldLHdpbmVfY3Zfc3RhdGZzX2JmcmVlPXllcyx3aW5lX2N2X3N0YXRmc19iZnJlZT1ubworCSkKKyAgICBmaSBdICkKK2lmIHRlc3QgIiR3aW5lX2N2X3N0YXRmc19iZnJlZSIgPSAieWVzIgordGhlbgorICBBQ19ERUZJTkUoU1RBVEZTX0hBU19CRlJFRSkKK2ZpCisKIAogZG5sICoqKiogR2VuZXJhdGUgb3V0cHV0IGZpbGVzICoqKioKIApkaWZmIC0tZ2l0IGEvY29udHJvbHMvYnV0dG9uLmMgYi9jb250cm9scy9idXR0b24uYwppbmRleCAxNmU2ZTk3Li4wNDY2MzM5IDEwMDY0NAotLS0gYS9jb250cm9scy9idXR0b24uYworKysgYi9jb250cm9scy9idXR0b24uYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgICAgIGlmICghaGJpdG1hcENoZWNrQm94ZXMpCiAgICAgICAgIHsKICAgICAgICAgICAgIEJJVE1BUDMyIGJtcDsKLSAgICAgICAgICAgIGhiaXRtYXBDaGVja0JveGVzID0gTG9hZEJpdG1hcDMyQSgwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX0NIRUNLQk9YRVMpKTsKKyAgICAgICAgICAgIGhiaXRtYXBDaGVja0JveGVzID0gTG9hZEJpdG1hcDMyQSgwLCBNQUtFSU5UUkVTT1VSQ0UzMkEoT0JNX0NIRUNLQk9YRVMpKTsKICAgICAgICAgICAgIEdldE9iamVjdDMyQSggaGJpdG1hcENoZWNrQm94ZXMsIHNpemVvZihibXApLCAmYm1wICk7CiAgICAgICAgICAgICBjaGVja0JveFdpZHRoICA9IGJtcC5ibVdpZHRoIC8gNDsKICAgICAgICAgICAgIGNoZWNrQm94SGVpZ2h0ID0gYm1wLmJtSGVpZ2h0IC8gMzsKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2NvbWJvLmMgYi9jb250cm9scy9jb21iby5jCmluZGV4IDMwMDFiNWIuLmRiMjRlYzMgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2NvbWJvLmMKKysrIGIvY29udHJvbHMvY29tYm8uYwpAQCAtNTIsNyArNTIsNyBAQAogICBpZiggKGhEQyA9IENyZWF0ZUNvbXBhdGlibGVEQzMyKDApKSApCiAgIHsKICAgICBCT09MMzIJYlJldCA9IEZBTFNFOwotICAgIGlmKCAoaENvbWJvQm1wID0gTG9hZEJpdG1hcDMyQSgwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX0NPTUJPKSkpICkKKyAgICBpZiggKGhDb21ib0JtcCA9IExvYWRCaXRtYXAzMkEoMCwgTUFLRUlOVFJFU09VUkNFMzJBKE9CTV9DT01CTykpKSApCiAgICAgewogICAgICAgQklUTUFQMzIgICAgICBibTsKICAgICAgIEhCSVRNQVAzMiAgICAgaFByZXZCOwpkaWZmIC0tZ2l0IGEvY29udHJvbHMvY29tbWN0cmwuYyBiL2NvbnRyb2xzL2NvbW1jdHJsLmMKaW5kZXggZjk0MDBmZC4uYTcyMDY2MCAxMDA2NDQKLS0tIGEvY29udHJvbHMvY29tbWN0cmwuYworKysgYi9jb250cm9scy9jb21tY3RybC5jCkBAIC0xMTQsNyArMTE0LDcgQEAKIEhXTkQzMiBXSU5BUEkgQ3JlYXRlU3RhdHVzV2luZG93MzJXKCBJTlQzMiBzdHlsZSwgTFBDV1NUUiB0ZXh0LCBIV05EMzIgcGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiB3aWQgKQogewotICAgIHJldHVybiBDcmVhdGVXaW5kb3czMlcoU1RBVFVTQ0xBU1NOQU1FMzJXLCB0ZXh0LCBzdHlsZSwgCisgICAgcmV0dXJuIENyZWF0ZVdpbmRvdzMyVygoTFBDV1NUUilTVEFUVVNDTEFTU05BTUUzMlcsIHRleHQsIHN0eWxlLCAKIAkJCSAgIENXX1VTRURFRkFVTFQzMiwgQ1dfVVNFREVGQVVMVDMyLAogCQkJICAgQ1dfVVNFREVGQVVMVDMyLCBDV19VU0VERUZBVUxUMzIsIAogCQkJICAgcGFyZW50LCB3aWQsIDAsIDApOwpAQCAtMTU2LDcgKzE1Niw3IEBACiAgICAgICAgIG9sZF9uYW1lID0gY2xhc3MzMi0+bHBzekNsYXNzTmFtZTsKICAgICAgICAgc3RyY3B5KCBuYW1lLCAoY2hhciAqKWNsYXNzMzItPmxwc3pDbGFzc05hbWUgKTsKICAgICAgICAgY2xhc3MzMi0+bHBzekNsYXNzTmFtZSA9IG5hbWU7Ci0gICAgICAgIGNsYXNzMzItPmhDdXJzb3IgPSBMb2FkQ3Vyc29yMzJBKCAwLCAoTFBDU1RSKUlEQ19BUlJPVyApOworICAgICAgICBjbGFzczMyLT5oQ3Vyc29yID0gTG9hZEN1cnNvcjMyQSggMCwgSURDX0FSUk9XMzJBICk7CiAgICAgICAgIFJlZ2lzdGVyQ2xhc3MzMkEoIGNsYXNzMzIgKTsKICAgICAgICAgY2xhc3MzMi0+bHBzekNsYXNzTmFtZSA9IG9sZF9uYW1lOwkKICAgICB9CmRpZmYgLS1naXQgYS9jb250cm9scy9kZXNrdG9wLmMgYi9jb250cm9scy9kZXNrdG9wLmMKaW5kZXggMTUzNWI5YS4uNTIwYmI1NiAxMDA2NDQKLS0tIGEvY29udHJvbHMvZGVza3RvcC5jCisrKyBiL2NvbnRyb2xzL2Rlc2t0b3AuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAJRXhpdFdpbmRvd3MxNiggMCwgMCApOyAKIAogICAgIGNhc2UgV01fU0VUQ1VSU09SOgotICAgICAgICByZXR1cm4gKExSRVNVTFQpU2V0Q3Vyc29yMTYoIExvYWRDdXJzb3IxNiggMCwgSURDX0FSUk9XICkgKTsKKyAgICAgICAgcmV0dXJuIChMUkVTVUxUKVNldEN1cnNvcjE2KCBMb2FkQ3Vyc29yMTYoIDAsIElEQ19BUlJPVzE2ICkgKTsKICAgICB9CiAgICAgCiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9jb250cm9scy9tZW51LmMgYi9jb250cm9scy9tZW51LmMKaW5kZXggMzUwOGQ0ZC4uZjllZmJmOCAxMDA2NDQKLS0tIGEvY29udHJvbHMvbWVudS5jCisrKyBiL2NvbnRyb2xzL21lbnUuYwpAQCAtMzI5LDkgKzMyOSw5IEBACiAJCQkJCSAgICAweDU1LCAwLCAweEFBLCAwIH07CiAKICAgICAvKiBMb2FkIG1lbnUgYml0bWFwcyAqLwotICAgIGhTdGRDaGVjayA9IExvYWRCaXRtYXAzMkEoMCwgKExQU1RSKU1BS0VJTlRSRVNPVVJDRShPQk1fQ0hFQ0spKTsKLSAgICBoU3RkUmFkaW9DaGVjayA9IExvYWRCaXRtYXAzMkEoMCwgKExQU1RSKU1BS0VJTlRSRVNPVVJDRShPQk1fUkFESU9DSEVDSykpOwotICAgIGhTdGRNbkFycm93ID0gTG9hZEJpdG1hcDMyQSgwLCAoTFBTVFIpTUFLRUlOVFJFU09VUkNFKE9CTV9NTkFSUk9XKSk7CisgICAgaFN0ZENoZWNrID0gTG9hZEJpdG1hcDMyQSgwLCBNQUtFSU5UUkVTT1VSQ0UzMkEoT0JNX0NIRUNLKSk7CisgICAgaFN0ZFJhZGlvQ2hlY2sgPSBMb2FkQml0bWFwMzJBKDAsIE1BS0VJTlRSRVNPVVJDRTMyQShPQk1fUkFESU9DSEVDSykpOworICAgIGhTdGRNbkFycm93ID0gTG9hZEJpdG1hcDMyQSgwLCBNQUtFSU5UUkVTT1VSQ0UzMkEoT0JNX01OQVJST1cpKTsKIAogICAgIGlmIChoU3RkQ2hlY2spCiAgICAgewpAQCAtMjU0Miw3ICsyNTQyLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFRyYWNrUG9wdXBNZW51MzIgICAoVVNFUjMyLjU0OCkKKyAqICAgICAgICAgICBUcmFja1BvcHVwTWVudTMyICAgKFVTRVIzMi41NDkpCiAgKi8KIEJPT0wzMiBXSU5BUEkgVHJhY2tQb3B1cE1lbnUzMiggSE1FTlUzMiBoTWVudSwgVUlOVDMyIHdGbGFncywgSU5UMzIgeCwgSU5UMzIgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIG5SZXNlcnZlZCwgSFdORDMyIGhXbmQsIGNvbnN0IFJFQ1QzMiAqbHBSZWN0ICkKQEAgLTI1NTgsNyArMjU1OCw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgVHJhY2tQb3B1cE1lbnVFeCAgIChVU0VSMzIuNTQ5KQorICogICAgICAgICAgIFRyYWNrUG9wdXBNZW51RXggICAoVVNFUjMyLjU1MCkKICAqLwogQk9PTDMyIFdJTkFQSSBUcmFja1BvcHVwTWVudUV4KCBITUVOVTMyIGhNZW51LCBVSU5UMzIgd0ZsYWdzLCBJTlQzMiB4LCBJTlQzMiB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV05EMzIgaFduZCwgTFBUUE1QQVJBTVMgbHBUcG0gKQpAQCAtMjcwMiw3ICsyNzAyLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBDaGFuZ2VNZW51MzJBICAgIChVU0VSMzIuMjIpCisgKiAgICAgICAgIENoYW5nZU1lbnUzMkEgICAgKFVTRVIzMi4yMykKICAqLwogQk9PTDMyIFdJTkFQSSBDaGFuZ2VNZW51MzJBKCBITUVOVTMyIGhNZW51LCBVSU5UMzIgcG9zLCBMUENTVFIgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGlkLCBVSU5UMzIgZmxhZ3MgKQpAQCAtMjcyMyw3ICsyNzIzLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBDaGFuZ2VNZW51MzJXICAgIChVU0VSMzIuMjMpCisgKiAgICAgICAgIENoYW5nZU1lbnUzMlcgICAgKFVTRVIzMi4yNCkKICAqLwogQk9PTDMyIFdJTkFQSSBDaGFuZ2VNZW51MzJXKCBITUVOVTMyIGhNZW51LCBVSU5UMzIgcG9zLCBMUENXU1RSIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBpZCwgVUlOVDMyIGZsYWdzICkKQEAgLTI3NTMsNyArMjc1Myw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgQ2hlY2tNZW51SXRlbTMyICAgIChVU0VSMzIuNDUpCisgKiAgICAgICAgIENoZWNrTWVudUl0ZW0zMiAgICAoVVNFUjMyLjQ2KQogICovCiBEV09SRCBXSU5BUEkgQ2hlY2tNZW51SXRlbTMyKCBITUVOVTMyIGhNZW51LCBVSU5UMzIgaWQsIFVJTlQzMiBmbGFncyApCiB7CkBAIC0yNzc5LDcgKzI3NzksNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIEVuYWJsZU1lbnVJdGVtMzIgICAgKFVTRVIzMi4xNjkpCisgKiAgICAgICAgIEVuYWJsZU1lbnVJdGVtMzIgICAgKFVTRVIzMi4xNzApCiAgKi8KIEJPT0wzMiBXSU5BUEkgRW5hYmxlTWVudUl0ZW0zMiggSE1FTlUzMiBoTWVudSwgVUlOVDMyIHdJdGVtSUQsIFVJTlQzMiB3RmxhZ3MgKQogewpAQCAtMjgyNyw3ICsyODI3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBHZXRNZW51U3RyaW5nMzJBICAgIChVU0VSMzIuMjY3KQorICogICAgICAgICBHZXRNZW51U3RyaW5nMzJBICAgIChVU0VSMzIuMjY4KQogICovCiBJTlQzMiBXSU5BUEkgR2V0TWVudVN0cmluZzMyQSggSE1FTlUzMiBoTWVudSwgVUlOVDMyIHdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgc3RyLCBJTlQzMiBuTWF4U2l6LCBVSU5UMzIgd0ZsYWdzICkKQEAgLTI4NDcsNyArMjg0Nyw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgR2V0TWVudVN0cmluZzMyVyAgICAoVVNFUjMyLjI2OCkKKyAqICAgICAgICAgR2V0TWVudVN0cmluZzMyVyAgICAoVVNFUjMyLjI2OSkKICAqLwogSU5UMzIgV0lOQVBJIEdldE1lbnVTdHJpbmczMlcoIEhNRU5VMzIgaE1lbnUsIFVJTlQzMiB3SXRlbUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV1NUUiBzdHIsIElOVDMyIG5NYXhTaXosIFVJTlQzMiB3RmxhZ3MgKQpAQCAtMjg3Niw3ICsyODc2LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBIaWxpdGVNZW51SXRlbTMyICAgIChVU0VSMzIuMzE3KQorICogICAgICAgICBIaWxpdGVNZW51SXRlbTMyICAgIChVU0VSMzIuMzE4KQogICovCiBCT09MMzIgV0lOQVBJIEhpbGl0ZU1lbnVJdGVtMzIoIEhXTkQzMiBoV25kLCBITUVOVTMyIGhNZW51LCBVSU5UMzIgd0l0ZW1JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIHdIaWxpdGUgKQpAQCAtMjkwMyw3ICsyOTAzLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBHZXRNZW51U3RhdGUzMiAgICAoVVNFUjMyLjI2NikKKyAqICAgICAgICAgR2V0TWVudVN0YXRlMzIgICAgKFVTRVIzMi4yNjcpCiAgKi8KIFVJTlQzMiBXSU5BUEkgR2V0TWVudVN0YXRlMzIoIEhNRU5VMzIgaE1lbnUsIFVJTlQzMiB3SXRlbUlELCBVSU5UMzIgd0ZsYWdzICkKIHsKQEAgLTI5NDIsNyArMjk0Miw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgR2V0TWVudUl0ZW1Db3VudDMyICAgIChVU0VSMzIuMjYxKQorICogICAgICAgICBHZXRNZW51SXRlbUNvdW50MzIgICAgKFVTRVIzMi4yNjIpCiAgKi8KIElOVDMyIFdJTkFQSSBHZXRNZW51SXRlbUNvdW50MzIoIEhNRU5VMzIgaE1lbnUgKQogewpAQCAtMjk2OSw3ICsyOTY5LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBHZXRNZW51SXRlbUlEMzIgICAgKFVTRVIzMi4yNjIpCisgKiAgICAgICAgIEdldE1lbnVJdGVtSUQzMiAgICAoVVNFUjMyLjI2MykKICAqLwogVUlOVDMyIFdJTkFQSSBHZXRNZW51SXRlbUlEMzIoIEhNRU5VMzIgaE1lbnUsIElOVDMyIG5Qb3MgKQogewpAQCAtMjk5Nyw3ICsyOTk3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBJbnNlcnRNZW51MzJBICAgIChVU0VSMzIuMzIxKQorICogICAgICAgICBJbnNlcnRNZW51MzJBICAgIChVU0VSMzIuMzIyKQogICovCiBCT09MMzIgV0lOQVBJIEluc2VydE1lbnUzMkEoIEhNRU5VMzIgaE1lbnUsIFVJTlQzMiBwb3MsIFVJTlQzMiBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGlkLCBMUENTVFIgc3RyICkKQEAgLTMwMzAsNyArMzAzMCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgSW5zZXJ0TWVudTMyVyAgICAoVVNFUjMyLjMyNCkKKyAqICAgICAgICAgSW5zZXJ0TWVudTMyVyAgICAoVVNFUjMyLjMyNSkKICAqLwogQk9PTDMyIFdJTkFQSSBJbnNlcnRNZW51MzJXKCBITUVOVTMyIGhNZW51LCBVSU5UMzIgcG9zLCBVSU5UMzIgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBpZCwgTFBDV1NUUiBzdHIgKQpAQCAtMzA1OCw3ICszMDU4LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBBcHBlbmRNZW51MzJBICAgIChVU0VSMzIuNCkKKyAqICAgICAgICAgQXBwZW5kTWVudTMyQSAgICAoVVNFUjMyLjUpCiAgKi8KIEJPT0wzMiBXSU5BUEkgQXBwZW5kTWVudTMyQSggSE1FTlUzMiBoTWVudSwgVUlOVDMyIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgaWQsIExQQ1NUUiBkYXRhICkKQEAgLTMwNjgsNyArMzA2OCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgQXBwZW5kTWVudTMyVyAgICAoVVNFUjMyLjUpCisgKiAgICAgICAgIEFwcGVuZE1lbnUzMlcgICAgKFVTRVIzMi42KQogICovCiBCT09MMzIgV0lOQVBJIEFwcGVuZE1lbnUzMlcoIEhNRU5VMzIgaE1lbnUsIFVJTlQzMiBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGlkLCBMUENXU1RSIGRhdGEgKQpAQCAtMzA4Nyw3ICszMDg3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBSZW1vdmVNZW51MzIgICAgKFVTRVIzMi40NDApCisgKiAgICAgICAgIFJlbW92ZU1lbnUzMiAgICAoVVNFUjMyLjQ0MSkKICAqLwogQk9PTDMyIFdJTkFQSSBSZW1vdmVNZW51MzIoIEhNRU5VMzIgaE1lbnUsIFVJTlQzMiBuUG9zLCBVSU5UMzIgd0ZsYWdzICkKIHsKQEAgLTMxMzIsNyArMzEzMiw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgRGVsZXRlTWVudTMyICAgIChVU0VSMzIuMTI4KQorICogICAgICAgICBEZWxldGVNZW51MzIgICAgKFVTRVIzMi4xMjkpCiAgKi8KIEJPT0wzMiBXSU5BUEkgRGVsZXRlTWVudTMyKCBITUVOVTMyIGhNZW51LCBVSU5UMzIgblBvcywgVUlOVDMyIHdGbGFncyApCiB7CkBAIC0zMTU5LDcgKzMxNTksNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIE1vZGlmeU1lbnUzMkEgICAgKFVTRVIzMi4zOTYpCisgKiAgICAgICAgIE1vZGlmeU1lbnUzMkEgICAgKFVTRVIzMi4zOTcpCiAgKi8KIEJPT0wzMiBXSU5BUEkgTW9kaWZ5TWVudTMyQSggSE1FTlUzMiBoTWVudSwgVUlOVDMyIHBvcywgVUlOVDMyIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgaWQsIExQQ1NUUiBzdHIgKQpAQCAtMzE4NCw3ICszMTg0LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBNb2RpZnlNZW51MzJXICAgIChVU0VSMzIuMzk3KQorICogICAgICAgICBNb2RpZnlNZW51MzJXICAgIChVU0VSMzIuMzk4KQogICovCiBCT09MMzIgV0lOQVBJIE1vZGlmeU1lbnUzMlcoIEhNRU5VMzIgaE1lbnUsIFVJTlQzMiBwb3MsIFVJTlQzMiBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGlkLCBMUENXU1RSIHN0ciApCkBAIC0zMjEyLDcgKzMyMTIsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIENyZWF0ZVBvcHVwTWVudTMyICAgIChVU0VSMzIuODEpCisgKiAgICAgICAgIENyZWF0ZVBvcHVwTWVudTMyICAgIChVU0VSMzIuODIpCiAgKi8KIEhNRU5VMzIgV0lOQVBJIENyZWF0ZVBvcHVwTWVudTMyKHZvaWQpCiB7CkBAIC0zMjI3LDcgKzMyMjcsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIEdldE1lbnVDaGVja01hcmtEaW1lbnNpb25zICAgIChVU0VSLjQxNykgKFVTRVIzMi4yNTcpCisgKiAgICAgICAgIEdldE1lbnVDaGVja01hcmtEaW1lbnNpb25zICAgIChVU0VSLjQxNykgKFVTRVIzMi4yNTgpCiAgKi8KIERXT1JEIFdJTkFQSSBHZXRNZW51Q2hlY2tNYXJrRGltZW5zaW9ucyh2b2lkKQogewpAQCAtMzI0Niw3ICszMjQ2LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBTZXRNZW51SXRlbUJpdG1hcHMzMiAgICAoVVNFUjMyLjQ4OSkKKyAqICAgICAgICAgU2V0TWVudUl0ZW1CaXRtYXBzMzIgICAgKFVTRVIzMi40OTApCiAgKi8KIEJPT0wzMiBXSU5BUEkgU2V0TWVudUl0ZW1CaXRtYXBzMzIoIEhNRU5VMzIgaE1lbnUsIFVJTlQzMiBuUG9zLCBVSU5UMzIgd0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEJJVE1BUDMyIGhOZXdVbkNoZWNrLCBIQklUTUFQMzIgaE5ld0NoZWNrKQpAQCAtMzI4MCw3ICszMjgwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBDcmVhdGVNZW51MzIgICAgKFVTRVIzMi44MCkKKyAqICAgICAgICAgQ3JlYXRlTWVudTMyICAgIChVU0VSMzIuODEpCiAgKi8KIEhNRU5VMzIgV0lOQVBJIENyZWF0ZU1lbnUzMih2b2lkKQogewpAQCAtMzMxMiw3ICszMzEyLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBEZXN0cm95TWVudTMyICAgIChVU0VSMzIuMTMzKQorICogICAgICAgICBEZXN0cm95TWVudTMyICAgIChVU0VSMzIuMTM0KQogICovCiBCT09MMzIgV0lOQVBJIERlc3Ryb3lNZW51MzIoIEhNRU5VMzIgaE1lbnUgKQogewpAQCAtMzM2NCw3ICszMzY0LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBHZXRTeXN0ZW1NZW51MzIgICAgKFVTRVIzMi4yOTApCisgKiAgICAgICAgIEdldFN5c3RlbU1lbnUzMiAgICAoVVNFUjMyLjI5MSkKICAqLwogSE1FTlUzMiBXSU5BUEkgR2V0U3lzdGVtTWVudTMyKCBIV05EMzIgaFduZCwgQk9PTDMyIGJSZXZlcnQgKQogewpAQCAtMzQwOCw3ICszNDA4LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBTZXRTeXN0ZW1NZW51MzIgICAgKFVTRVIzMi41MDcpCisgKiAgICAgICAgIFNldFN5c3RlbU1lbnUzMiAgICAoVVNFUjMyLjUwOCkKICAqLwogQk9PTDMyIFdJTkFQSSBTZXRTeXN0ZW1NZW51MzIoIEhXTkQzMiBod25kLCBITUVOVTMyIGhNZW51ICkKIHsKQEAgLTM0MzcsNyArMzQzNyw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgR2V0TWVudTMyICAgIChVU0VSMzIuMjU2KQorICogICAgICAgICBHZXRNZW51MzIgICAgKFVTRVIzMi4yNTcpCiAgKi8KIEhNRU5VMzIgV0lOQVBJIEdldE1lbnUzMiggSFdORDMyIGhXbmQgKSAKIHsgCkBAIC0zNDU4LDcgKzM0NTgsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIFNldE1lbnUzMiAgICAoVVNFUjMyLjQ4NikKKyAqICAgICAgICAgU2V0TWVudTMyICAgIChVU0VSMzIuNDg3KQogICovCiBCT09MMzIgV0lOQVBJIFNldE1lbnUzMiggSFdORDMyIGhXbmQsIEhNRU5VMzIgaE1lbnUgKQogewpAQCAtMzUwMCw3ICszNTAwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBHZXRTdWJNZW51MzIgICAgKFVTRVIzMi4yODcpCisgKiAgICAgICAgIEdldFN1Yk1lbnUzMiAgICAoVVNFUjMyLjI4OCkKICAqLwogSE1FTlUzMiBXSU5BUEkgR2V0U3ViTWVudTMyKCBITUVOVTMyIGhNZW51LCBJTlQzMiBuUG9zICkKIHsKQEAgLTM1MjMsNyArMzUyMyw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgRHJhd01lbnVCYXIzMiAgICAoVVNFUjMyLjE2MCkKKyAqICAgICAgICAgRHJhd01lbnVCYXIzMiAgICAoVVNFUjMyLjE2MSkKICAqLwogQk9PTDMyIFdJTkFQSSBEcmF3TWVudUJhcjMyKCBIV05EMzIgaFduZCApCiB7CkBAIC0zNTQ0LDcgKzM1NDQsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEVuZE1lbnUgICAoVVNFUi4xODcpIChVU0VSMzIuMTc0KQorICogICAgICAgICAgIEVuZE1lbnUgICAoVVNFUi4xODcpIChVU0VSMzIuMTc1KQogICovCiB2b2lkIFdJTkFQSSBFbmRNZW51KHZvaWQpCiB7CkBAIC0zNTg5LDcgKzM1ODksNyBAQAogICAgICAgICByZXR1cm4gTG9hZE1lbnUzMkEoaW5zdGFuY2UsUFRSX1NFR19UT19MSU4obmFtZSkpOwogICAgIGluc3RhbmNlID0gR2V0RXhlUHRyKCBpbnN0YW5jZSApOwogCi0gICAgaWYgKCEoaFJzcmMgPSBGaW5kUmVzb3VyY2UxNiggaW5zdGFuY2UsIG5hbWUsIFJUX01FTlUgKSkpIHJldHVybiAwOworICAgIGlmICghKGhSc3JjID0gRmluZFJlc291cmNlMTYoIGluc3RhbmNlLCBuYW1lLCBSVF9NRU5VMTYgKSkpIHJldHVybiAwOwogICAgIGlmICghKGhhbmRsZSA9IExvYWRSZXNvdXJjZTE2KCBpbnN0YW5jZSwgaFJzcmMgKSkpIHJldHVybiAwOwogICAgIGhNZW51ID0gTG9hZE1lbnVJbmRpcmVjdDE2KExvY2tSZXNvdXJjZTE2KGhhbmRsZSkpOwogICAgIEZyZWVSZXNvdXJjZTE2KCBoYW5kbGUgKTsKQEAgLTM2MDIsMTggKzM2MDIsMTggQEAKICAqLwogSE1FTlUzMiBXSU5BUEkgTG9hZE1lbnUzMkEoIEhJTlNUQU5DRTMyIGluc3RhbmNlLCBMUENTVFIgbmFtZSApCiB7Ci0gICAgSFJTUkMzMiBocnNyYyA9IEZpbmRSZXNvdXJjZTMyQSggaW5zdGFuY2UsIG5hbWUsIChMUFNUUilSVF9NRU5VICk7CisgICAgSFJTUkMzMiBocnNyYyA9IEZpbmRSZXNvdXJjZTMyQSggaW5zdGFuY2UsIG5hbWUsIFJUX01FTlUzMkEgKTsKICAgICBpZiAoIWhyc3JjKSByZXR1cm4gMDsKICAgICByZXR1cm4gTG9hZE1lbnVJbmRpcmVjdDMyQSggKExQQ1ZPSUQpTG9hZFJlc291cmNlMzIoIGluc3RhbmNlLCBocnNyYyApKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICBMb2FkTWVudTMyVyAgIChVU0VSMzIuMzcyKQorICogICAgICAgIExvYWRNZW51MzJXICAgKFVTRVIzMi4zNzMpCiAgKi8KIEhNRU5VMzIgV0lOQVBJIExvYWRNZW51MzJXKCBISU5TVEFOQ0UzMiBpbnN0YW5jZSwgTFBDV1NUUiBuYW1lICkKIHsKLSAgICBIUlNSQzMyIGhyc3JjID0gRmluZFJlc291cmNlMzJXKCBpbnN0YW5jZSwgbmFtZSwgKExQV1NUUilSVF9NRU5VICk7CisgICAgSFJTUkMzMiBocnNyYyA9IEZpbmRSZXNvdXJjZTMyVyggaW5zdGFuY2UsIG5hbWUsIFJUX01FTlUzMlcgKTsKICAgICBpZiAoIWhyc3JjKSByZXR1cm4gMDsKICAgICByZXR1cm4gTG9hZE1lbnVJbmRpcmVjdDMyVyggKExQQ1ZPSUQpTG9hZFJlc291cmNlMzIoIGluc3RhbmNlLCBocnNyYyApKTsKIH0KQEAgLTM2NDksNyArMzY0OSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICBMb2FkTWVudUluZGlyZWN0MzJBICAgIChVU0VSMzIuMzcwKQorICoJICAgIExvYWRNZW51SW5kaXJlY3QzMkEgICAgKFVTRVIzMi4zNzEpCiAgKi8KIEhNRU5VMzIgV0lOQVBJIExvYWRNZW51SW5kaXJlY3QzMkEoIExQQ1ZPSUQgdGVtcGxhdGUgKQogewpAQCAtMzY5MCw3ICszNjkwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgIExvYWRNZW51SW5kaXJlY3QzMlcgICAgKFVTRVIzMi4zNzEpCisgKgkgICAgTG9hZE1lbnVJbmRpcmVjdDMyVyAgICAoVVNFUjMyLjM3MikKICAqLwogSE1FTlUzMiBXSU5BUEkgTG9hZE1lbnVJbmRpcmVjdDMyVyggTFBDVk9JRCB0ZW1wbGF0ZSApCiB7CkBAIC0zNzEwLDcgKzM3MTAsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJSXNNZW51MzIgICAgKFVTRVIzMi4zNDUpCisgKgkJSXNNZW51MzIgICAgKFVTRVIzMi4zNDYpCiAgKi8KIEJPT0wzMiBXSU5BUEkgSXNNZW51MzIoSE1FTlUzMiBobWVudSkKIHsKQEAgLTM3NzUsNyArMzc3NSw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJR2V0TWVudUl0ZW1JbmZvMzJBICAgIChVU0VSMzIuMjYzKQorICoJCUdldE1lbnVJdGVtSW5mbzMyQSAgICAoVVNFUjMyLjI2NCkKICAqLwogQk9PTDMyIFdJTkFQSSBHZXRNZW51SXRlbUluZm8zMkEoIEhNRU5VMzIgaG1lbnUsIFVJTlQzMiBpdGVtLCBCT09MMzIgYnlwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBNRU5VSVRFTUlORk8zMkEgbHBtaWkpCkBAIC0zNzg0LDcgKzM3ODQsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCUdldE1lbnVJdGVtSW5mbzMyVyAgICAoVVNFUjMyLjI2NCkKKyAqCQlHZXRNZW51SXRlbUluZm8zMlcgICAgKFVTRVIzMi4yNjUpCiAgKi8KIEJPT0wzMiBXSU5BUEkgR2V0TWVudUl0ZW1JbmZvMzJXKCBITUVOVTMyIGhtZW51LCBVSU5UMzIgaXRlbSwgQk9PTDMyIGJ5cG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQTUVOVUlURU1JTkZPMzJXIGxwbWlpKQpAQCAtMzg0MCw3ICszODQwLDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQlTZXRNZW51SXRlbUluZm8zMkEgICAgKFVTRVIzMi40OTApCisgKgkJU2V0TWVudUl0ZW1JbmZvMzJBICAgIChVU0VSMzIuNDkxKQogICovCiBCT09MMzIgV0lOQVBJIFNldE1lbnVJdGVtSW5mbzMyQShITUVOVTMyIGhtZW51LCBVSU5UMzIgaXRlbSwgQk9PTDMyIGJ5cG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUVOVUlURU1JTkZPMzJBICpscG1paSkgCkBAIC0zODUwLDcgKzM4NTAsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCVNldE1lbnVJdGVtSW5mbzMyVyAgICAoVVNFUjMyLjQ5MSkKKyAqCQlTZXRNZW51SXRlbUluZm8zMlcgICAgKFVTRVIzMi40OTIpCiAgKi8KIEJPT0wzMiBXSU5BUEkgU2V0TWVudUl0ZW1JbmZvMzJXKEhNRU5VMzIgaG1lbnUsIFVJTlQzMiBpdGVtLCBCT09MMzIgYnlwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRU5VSVRFTUlORk8zMlcgKmxwbWlpKQpAQCAtMzg2MCw3ICszODYwLDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQlTZXRNZW51RGVmYXVsdEl0ZW0zMiAgICAoVVNFUjMyLjQ4OCkKKyAqCQlTZXRNZW51RGVmYXVsdEl0ZW0zMiAgICAoVVNFUjMyLjQ4OSkKICAqLwogQk9PTDMyIFdJTkFQSSBTZXRNZW51RGVmYXVsdEl0ZW0zMihITUVOVTMyIGhtZW51LCBVSU5UMzIgaXRlbSwgQk9PTDMyIGJ5cG9zKQogewpAQCAtMzkwMCw3ICszOTAwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCUluc2VydE1lbnVJdGVtMzJBICAgIChVU0VSMzIuMzIyKQorICoJCUluc2VydE1lbnVJdGVtMzJBICAgIChVU0VSMzIuMzIzKQogICovCiBCT09MMzIgV0lOQVBJIEluc2VydE1lbnVJdGVtMzJBKEhNRU5VMzIgaE1lbnUsIFVJTlQzMiB1SXRlbSwgQk9PTDMyIGJ5cG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRU5VSVRFTUlORk8zMkEgKmxwbWlpKQpAQCAtMzkxMSw3ICszOTExLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCUluc2VydE1lbnVJdGVtMzJXICAgIChVU0VSMzIuMzIzKQorICoJCUluc2VydE1lbnVJdGVtMzJXICAgIChVU0VSMzIuMzI0KQogICovCiBCT09MMzIgV0lOQVBJIEluc2VydE1lbnVJdGVtMzJXKEhNRU5VMzIgaE1lbnUsIFVJTlQzMiB1SXRlbSwgQk9PTDMyIGJ5cG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRU5VSVRFTUlORk8zMlcgKmxwbWlpKQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvcHJvZ3Jlc3MuYyBiL2NvbnRyb2xzL3Byb2dyZXNzLmMKaW5kZXggMzg4MTJhMC4uODBhMmZjNCAxMDA2NDQKLS0tIGEvY29udHJvbHMvcHJvZ3Jlc3MuYworKysgYi9jb250cm9scy9wcm9ncmVzcy5jCkBAIC01LDggKzUsNiBAQAogICoKICAqIFRPRE86CiAgKiAgIC0gSSBkbyBub3Qga25vdyB3aGF0IHRvIHRvIG9uIFdNX1tTR11FVF9GT05UCi0gKiBQcm9ibGVtczoKLSAqICAgLSBJIHRoaW5rIEkgZG8gbm90IGNvbXB1dGUgY29ycmVjdGx5IHRoZSBudW1lciBvZiBsZWRzIHRvIGJlIGRyYXduCiAgKi8KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMjEsNyArMTksNiBAQAogCiAvKiBDb250cm9sIGNvbmZpZ3VyYXRpb24gY29uc3RhbnRzICovCiAKLSNkZWZpbmUgTEVEX1dJRFRIICA4CiAjZGVmaW5lIExFRF9HQVAgICAgMgogCiAvKiBXb3JrIGNvbnN0YW50cyAqLwpAQCAtNDEsOCArMzgsOCBAQAogc3RhdGljIHZvaWQgUFJPR1JFU1NfUGFpbnQoV05EICp3bmRQdHIsIEhEQzMyIGRjKQogewogICBQUk9HUkVTU19JTkZPICppbmZvUHRyID0gUFJPR1JFU1NfR2V0SW5mb1B0cih3bmRQdHIpOwotICBIQlJVU0gzMiBsZWRCcnVzaDsKLSAgaW50IHJpZ2h0QmFyLCByaWdodE1vc3Q7CisgIEhCUlVTSDMyIGhickJhciwgaGJyQms7CisgIGludCByaWdodEJhciwgcmlnaHRNb3N0LCBsZWRXaWR0aDsKICAgUEFJTlRTVFJVQ1QzMiBwczsKICAgUkVDVDMyIHJlY3Q7CiAgIEhEQzMyIGhkYzsKQEAgLTUzLDI5ICs1MCw5MCBAQAogICAvKiBnZXQgYSBkYyAqLwogICBoZGMgPSBkYz09MCA/IEJlZ2luUGFpbnQzMih3bmRQdHItPmh3bmRTZWxmLCAmcHMpIDogZGM7CiAKLSAgLyogZ2V0IHRoZSByZXF1aXJlZCBicnVzaCAqLwotICBsZWRCcnVzaCA9IEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9ISUdITElHSFQpOworICAvKiBnZXQgdGhlIHJlcXVpcmVkIGJhciBicnVzaCAqLworICBpZiAoaW5mb1B0ci0+Q29sb3JCYXIgPT0gQ0xSX0RFRkFVTFQpCisgICAgaGJyQmFyID0gR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0hJR0hMSUdIVCk7CisgIGVsc2UKKyAgICBoYnJCYXIgPSBDcmVhdGVTb2xpZEJydXNoMzIgKGluZm9QdHItPkNvbG9yQmFyKTsKKworICAvKiBnZXQgdGhlIHJlcXVpcmVkIGJhY2tncm91bmQgYnJ1c2ggKi8KKyAgaWYgKGluZm9QdHItPkNvbG9yQmsgIT0gQ0xSX0RFRkFVTFQpCisgICAgaGJyQmsgPSBDcmVhdGVTb2xpZEJydXNoMzIgKGluZm9QdHItPkNvbG9yQmspOworICBlbHNlCisgICAgaGJyQmsgPSAwOyAvKiB0byBrZWVwIHRoZSBjb21waWxlciBoYXBweSA7LSkgKi8KIAogICAvKiBnZXQgcmVjdCBmb3IgdGhlIGJhciwgYWRqdXN0ZWQgZm9yIHRoZSBib3JkZXIgKi8KLSAgR2V0Q2xpZW50UmVjdDMyKHduZFB0ci0+aHduZFNlbGYsICZyZWN0KTsKKyAgR2V0Q2xpZW50UmVjdDMyICh3bmRQdHItPmh3bmRTZWxmLCAmcmVjdCk7CisKKyAgLyogSGFjayBiZWNhdXNlIG9mIG1pc3NpbmcgdG9wIGJvcmRlciAqLworICByZWN0LnRvcCsrOwogCiAgIC8qIGRyYXcgdGhlIGJvcmRlciAqLwotICBEcmF3RWRnZTMyKGhkYywgJnJlY3QsIEJEUl9TVU5LRU5PVVRFUiwgQkZfUkVDVHxCRl9BREpVU1R8QkZfTUlERExFKTsKKyAgaWYgKGluZm9QdHItPkNvbG9yQmsgPT0gQ0xSX0RFRkFVTFQpCisgICAgRHJhd0VkZ2UzMihoZGMsICZyZWN0LCBCRFJfU1VOS0VOT1VURVIsIEJGX1JFQ1R8QkZfQURKVVNUfEJGX01JRERMRSk7CisgIGVsc2UKKyAgeworICAgIERyYXdFZGdlMzIoaGRjLCAmcmVjdCwgQkRSX1NVTktFTk9VVEVSLCBCRl9SRUNUfEJGX0FESlVTVCk7CisgICAgRmlsbFJlY3QzMihoZGMsICZyZWN0LCBoYnJCayk7CisgIH0KICAgcmVjdC5sZWZ0Kys7IHJlY3QucmlnaHQtLTsgcmVjdC50b3ArKzsgcmVjdC5ib3R0b20tLTsKLSAgcmlnaHRNb3N0ID0gcmVjdC5yaWdodDsKIAogICAvKiBjb21wdXRlIGV4dGVudCBvZiBwcm9ncmVzcyBiYXIgKi8KLSAgcmlnaHRCYXIgPSByZWN0LmxlZnQgKyAKLSAgICBNdWxEaXYzMihpbmZvUHRyLT5DdXJWYWwtaW5mb1B0ci0+TWluVmFsLAotCSAgICAgcmVjdC5yaWdodCAtIHJlY3QubGVmdCwKLQkgICAgIGluZm9QdHItPk1heFZhbC1pbmZvUHRyLT5NaW5WYWwpOworICBpZiAod25kUHRyLT5kd1N0eWxlICYgUEJTX1ZFUlRJQ0FMKQorICB7CisgICAgcmlnaHRCYXIgPSByZWN0LmJvdHRvbSAtIAorICAgICAgTXVsRGl2MzIoaW5mb1B0ci0+Q3VyVmFsLWluZm9QdHItPk1pblZhbCwKKwkgICAgICAgcmVjdC5ib3R0b20gLSByZWN0LnRvcCwKKwkgICAgICAgaW5mb1B0ci0+TWF4VmFsLWluZm9QdHItPk1pblZhbCk7CisgICAgbGVkV2lkdGggPSBNdWxEaXYzMiAoKHJlY3QucmlnaHQgLSByZWN0LmxlZnQpLCAyLCAzKTsKKyAgICByaWdodE1vc3QgPSByZWN0LnRvcDsKKyAgfQorICBlbHNlCisgIHsKKyAgICByaWdodEJhciA9IHJlY3QubGVmdCArIAorICAgICAgTXVsRGl2MzIoaW5mb1B0ci0+Q3VyVmFsLWluZm9QdHItPk1pblZhbCwKKwkgICAgICAgcmVjdC5yaWdodCAtIHJlY3QubGVmdCwKKwkgICAgICAgaW5mb1B0ci0+TWF4VmFsLWluZm9QdHItPk1pblZhbCk7CisgICAgbGVkV2lkdGggPSBNdWxEaXYzMiAoKHJlY3QuYm90dG9tIC0gcmVjdC50b3ApLCAyLCAzKTsKKyAgICByaWdodE1vc3QgPSByZWN0LnJpZ2h0OworICB9CiAKICAgLyogbm93IGRyYXcgdGhlIGJhciAqLwotICB3aGlsZShyZWN0LmxlZnQgPCByaWdodEJhcikgeyAKLSAgICByZWN0LnJpZ2h0ID0gcmVjdC5sZWZ0K0xFRF9XSURUSDsKLSAgICBGaWxsUmVjdDMyKGhkYywgJnJlY3QsIGxlZEJydXNoKTsKLSAgICByZWN0LmxlZnQgID0gcmVjdC5yaWdodCtMRURfR0FQOworICBpZiAod25kUHRyLT5kd1N0eWxlICYgUEJTX1NNT09USCkKKyAgeworICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBQQlNfVkVSVElDQUwpCisgICAgICByZWN0LnRvcCA9IHJpZ2h0QmFyOworICAgIGVsc2UKKyAgICAgIHJlY3QucmlnaHQgPSByaWdodEJhcjsKKyAgICBGaWxsUmVjdDMyKGhkYywgJnJlY3QsIGhickJhcik7CiAgIH0KKyAgZWxzZQorICB7CisgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFBCU19WRVJUSUNBTCkKKyAgICAgIHdoaWxlKHJlY3QuYm90dG9tID4gcmlnaHRCYXIpIHsgCisgICAgICAgIHJlY3QudG9wID0gcmVjdC5ib3R0b20tbGVkV2lkdGg7CisgICAgICAgIGlmIChyZWN0LnRvcCA8IHJpZ2h0TW9zdCkKKyAgICAgICAgICByZWN0LnRvcCA9IHJpZ2h0TW9zdDsKKyAgICAgICAgRmlsbFJlY3QzMihoZGMsICZyZWN0LCBoYnJCYXIpOworICAgICAgICByZWN0LmJvdHRvbSA9IHJlY3QudG9wLUxFRF9HQVA7CisgICAgICB9CisgICAgZWxzZQorICAgICAgd2hpbGUocmVjdC5sZWZ0IDwgcmlnaHRCYXIpIHsgCisgICAgICAgIHJlY3QucmlnaHQgPSByZWN0LmxlZnQrbGVkV2lkdGg7CisgICAgICAgIGlmIChyZWN0LnJpZ2h0ID4gcmlnaHRNb3N0KQorICAgICAgICAgIHJlY3QucmlnaHQgPSByaWdodE1vc3Q7CisgICAgICAgIEZpbGxSZWN0MzIoaGRjLCAmcmVjdCwgaGJyQmFyKTsKKyAgICAgICAgcmVjdC5sZWZ0ICA9IHJlY3QucmlnaHQrTEVEX0dBUDsKKyAgICAgIH0KKyAgfQorCisgIC8qIGRlbGV0ZSBiYXIgYnJ1c2ggKi8KKyAgaWYgKGluZm9QdHItPkNvbG9yQmFyICE9IENMUl9ERUZBVUxUKQorICAgICAgRGVsZXRlT2JqZWN0MzIgKGhickJhcik7CisKKyAgLyogZGVsZXRlIGJhY2tncm91bmQgYnJ1c2ggKi8KKyAgaWYgKGluZm9QdHItPkNvbG9yQmsgIT0gQ0xSX0RFRkFVTFQpCisgICAgICBEZWxldGVPYmplY3QzMiAoaGJyQmspOwogCiAgIC8qIGNsZWFuLXVwICovICAKICAgaWYoIWRjKQpAQCAtMTE0LDYgKzE3Miw4IEBACiAgICAgICBpbmZvUHRyLT5NYXhWYWw9MTAwOwogICAgICAgaW5mb1B0ci0+Q3VyVmFsPTA7IAogICAgICAgaW5mb1B0ci0+U3RlcD0xMDsKKyAgICAgIGluZm9QdHItPkNvbG9yQmFyPUNMUl9ERUZBVUxUOworICAgICAgaW5mb1B0ci0+Q29sb3JCaz1DTFJfREVGQVVMVDsKICAgICAgIFRSQUNFKHVwZG93biwgIlByb2dyZXNzIEN0cmwgY3JlYXRpb24sIGh3bmQ9JTA0eFxuIiwgaHduZCk7CiAgICAgICBicmVhazsKICAgICAKQEAgLTE0NSw3ICsyMDUsOSBAQAogICAgICAgaWYod1BhcmFtICE9IDApewogCWluZm9QdHItPkN1clZhbCArPSAoVUlOVDE2KXdQYXJhbTsKIAlQUk9HUkVTU19Db2VyY2VQb3Mod25kUHRyKTsKLQlQUk9HUkVTU19QYWludCh3bmRQdHIsIDApOworICAgICAgICBJbnZhbGlkYXRlUmVjdDMyIChod25kLCBOVUxMLCBGQUxTRSk7CisgICAgICAgIFVwZGF0ZVdpbmRvdzMyIChod25kKTsKKy8vCVBST0dSRVNTX1BhaW50KHduZFB0ciwgMCk7CiAgICAgICB9CiAgICAgICByZXR1cm4gdGVtcDsKIApAQCAtMTU2LDcgKzIxOCw4IEBACiAgICAgICBpZih0ZW1wICE9IHdQYXJhbSl7CiAJaW5mb1B0ci0+Q3VyVmFsID0gKFVJTlQxNil3UGFyYW07CiAJUFJPR1JFU1NfQ29lcmNlUG9zKHduZFB0cik7Ci0JUFJPR1JFU1NfUGFpbnQod25kUHRyLCAwKTsKKyAgICAgICAgSW52YWxpZGF0ZVJlY3QzMiAoaHduZCwgTlVMTCwgRkFMU0UpOworICAgICAgICBVcGRhdGVXaW5kb3czMiAoaHduZCk7CiAgICAgICB9CiAgICAgICByZXR1cm4gdGVtcDsgICAgICAgICAgCiAgICAgICAKQEAgLTE3MCw3ICsyMzMsOCBAQAogCWlmKGluZm9QdHItPk1heFZhbCA8PSBpbmZvUHRyLT5NaW5WYWwpCiAJICBpbmZvUHRyLT5NYXhWYWwgPSBpbmZvUHRyLT5NaW5WYWwrMTsKIAlQUk9HUkVTU19Db2VyY2VQb3Mod25kUHRyKTsKLQlQUk9HUkVTU19QYWludCh3bmRQdHIsIDApOworICAgICAgICBJbnZhbGlkYXRlUmVjdDMyIChod25kLCBOVUxMLCBGQUxTRSk7CisgICAgICAgIFVwZGF0ZVdpbmRvdzMyIChod25kKTsKICAgICAgIH0KICAgICAgIHJldHVybiB0ZW1wOwogCkBAIC0xODksOSArMjUzLDU0IEBACiAgICAgICBpZihpbmZvUHRyLT5DdXJWYWwgPiBpbmZvUHRyLT5NYXhWYWwpCiAJaW5mb1B0ci0+Q3VyVmFsID0gaW5mb1B0ci0+TWluVmFsOwogICAgICAgaWYodGVtcCAhPSBpbmZvUHRyLT5DdXJWYWwpCi0JUFJPR1JFU1NfUGFpbnQod25kUHRyLCAwKTsKKyAgICAgIHsKKyAgICAgICAgSW52YWxpZGF0ZVJlY3QzMiAoaHduZCwgTlVMTCwgRkFMU0UpOworICAgICAgICBVcGRhdGVXaW5kb3czMiAoaHduZCk7CisgICAgICB9CisgICAgICByZXR1cm4gdGVtcDsKKworICAgIGNhc2UgUEJNX1NFVFJBTkdFMzI6CisgICAgICB0ZW1wID0gTUFLRUxPTkcoaW5mb1B0ci0+TWluVmFsLCBpbmZvUHRyLT5NYXhWYWwpOworICAgICAgaWYoKGluZm9QdHItPk1pblZhbCAhPSAoSU5UMzIpd1BhcmFtKSB8fAorICAgICAgICAgKGluZm9QdHItPk1heFZhbCAhPSAoSU5UMzIpbFBhcmFtKSkgeworCWluZm9QdHItPk1pblZhbCA9IChJTlQzMil3UGFyYW07CisJaW5mb1B0ci0+TWF4VmFsID0gKElOVDMyKWxQYXJhbTsKKwlpZihpbmZvUHRyLT5NYXhWYWwgPD0gaW5mb1B0ci0+TWluVmFsKQorCSAgaW5mb1B0ci0+TWF4VmFsID0gaW5mb1B0ci0+TWluVmFsKzE7CisJUFJPR1JFU1NfQ29lcmNlUG9zKHduZFB0cik7CisgICAgICAgIEludmFsaWRhdGVSZWN0MzIgKGh3bmQsIE5VTEwsIEZBTFNFKTsKKyAgICAgICAgVXBkYXRlV2luZG93MzIgKGh3bmQpOworICAgICAgfQogICAgICAgcmV0dXJuIHRlbXA7CiAgICAgCisgICAgY2FzZSBQQk1fR0VUUkFOR0U6CisgICAgICBpZiAobFBhcmFtKXsKKyAgICAgICAgKChQUEJSQU5HRSlsUGFyYW0pLT5pTG93ID0gaW5mb1B0ci0+TWluVmFsOworICAgICAgICAoKFBQQlJBTkdFKWxQYXJhbSktPmlIaWdoID0gaW5mb1B0ci0+TWF4VmFsOworICAgICAgfQorICAgICAgcmV0dXJuICh3UGFyYW0pID8gaW5mb1B0ci0+TWluVmFsIDogaW5mb1B0ci0+TWF4VmFsOworCisgICAgY2FzZSBQQk1fR0VUUE9TOgorICAgICAgaWYgKHdQYXJhbSB8fCBsUGFyYW0pCisJVU5LTk9XTl9QQVJBTShQQk1fU1RFUElULCB3UGFyYW0sIGxQYXJhbSk7CisgICAgICByZXR1cm4gKGluZm9QdHItPkN1clZhbCk7CisKKyAgICBjYXNlIFBCTV9TRVRCQVJDT0xPUjoKKyAgICAgIGlmICh3UGFyYW0pCisJVU5LTk9XTl9QQVJBTShQQk1fU0VUQkFSQ09MT1IsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgIGluZm9QdHItPkNvbG9yQmFyID0gKENPTE9SUkVGKWxQYXJhbTsgICAgIAorICAgICAgSW52YWxpZGF0ZVJlY3QzMiAoaHduZCwgTlVMTCwgRkFMU0UpOworICAgICAgVXBkYXRlV2luZG93MzIgKGh3bmQpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBCTV9TRVRCS0NPTE9SOgorICAgICAgaWYgKHdQYXJhbSkKKwlVTktOT1dOX1BBUkFNKFBCTV9TRVRCS0NPTE9SLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgICBpbmZvUHRyLT5Db2xvckJrID0gKENPTE9SUkVGKWxQYXJhbTsKKyAgICAgIEludmFsaWRhdGVSZWN0MzIgKGh3bmQsIE5VTEwsIEZBTFNFKTsKKyAgICAgIFVwZGF0ZVdpbmRvdzMyIChod25kKTsKKyAgICAgIGJyZWFrOworCiAgICAgZGVmYXVsdDogCiAgICAgICBpZiAobWVzc2FnZSA+PSBXTV9VU0VSKSAKIAlFUlIocHJvZ3Jlc3MsICJ1bmtub3duIG1zZyAlMDR4IHdwPSUwNHggbHA9JTA4bHhcbiIsIApAQCAtMjAyLDUgKzMxMSwzIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLQotCmRpZmYgLS1naXQgYS9jb250cm9scy9zY3JvbGwuYyBiL2NvbnRyb2xzL3Njcm9sbC5jCmluZGV4IDhlNWEzNjYuLmVjNzFlYjQgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3Njcm9sbC5jCisrKyBiL2NvbnRyb2xzL3Njcm9sbC5jCkBAIC04MSwxOCArODEsMTggQEAKICAqLwogc3RhdGljIHZvaWQgU0NST0xMX0xvYWRCaXRtYXBzKHZvaWQpCiB7Ci0gICAgaFVwQXJyb3cgID0gTG9hZEJpdG1hcDMyQSggMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9VUEFSUk9XKSApOwotICAgIGhEbkFycm93ICA9IExvYWRCaXRtYXAzMkEoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fRE5BUlJPVykgKTsKLSAgICBoTGZBcnJvdyAgPSBMb2FkQml0bWFwMzJBKCAwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX0xGQVJST1cpICk7Ci0gICAgaFJnQXJyb3cgID0gTG9hZEJpdG1hcDMyQSggMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9SR0FSUk9XKSApOwotICAgIGhVcEFycm93RCA9IExvYWRCaXRtYXAzMkEoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fVVBBUlJPV0QpICk7Ci0gICAgaERuQXJyb3dEID0gTG9hZEJpdG1hcDMyQSggMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9ETkFSUk9XRCkgKTsKLSAgICBoTGZBcnJvd0QgPSBMb2FkQml0bWFwMzJBKCAwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX0xGQVJST1dEKSApOwotICAgIGhSZ0Fycm93RCA9IExvYWRCaXRtYXAzMkEoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fUkdBUlJPV0QpICk7Ci0gICAgaFVwQXJyb3dJID0gTG9hZEJpdG1hcDMyQSggMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9VUEFSUk9XSSkgKTsKLSAgICBoRG5BcnJvd0kgPSBMb2FkQml0bWFwMzJBKCAwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX0ROQVJST1dJKSApOwotICAgIGhMZkFycm93SSA9IExvYWRCaXRtYXAzMkEoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fTEZBUlJPV0kpICk7Ci0gICAgaFJnQXJyb3dJID0gTG9hZEJpdG1hcDMyQSggMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9SR0FSUk9XSSkgKTsKKyAgICBoVXBBcnJvdyAgPSBMb2FkQml0bWFwMzJBKCAwLCBNQUtFSU5UUkVTT1VSQ0UzMkEoT0JNX1VQQVJST1cpICk7CisgICAgaERuQXJyb3cgID0gTG9hZEJpdG1hcDMyQSggMCwgTUFLRUlOVFJFU09VUkNFMzJBKE9CTV9ETkFSUk9XKSApOworICAgIGhMZkFycm93ICA9IExvYWRCaXRtYXAzMkEoIDAsIE1BS0VJTlRSRVNPVVJDRTMyQShPQk1fTEZBUlJPVykgKTsKKyAgICBoUmdBcnJvdyAgPSBMb2FkQml0bWFwMzJBKCAwLCBNQUtFSU5UUkVTT1VSQ0UzMkEoT0JNX1JHQVJST1cpICk7CisgICAgaFVwQXJyb3dEID0gTG9hZEJpdG1hcDMyQSggMCwgTUFLRUlOVFJFU09VUkNFMzJBKE9CTV9VUEFSUk9XRCkgKTsKKyAgICBoRG5BcnJvd0QgPSBMb2FkQml0bWFwMzJBKCAwLCBNQUtFSU5UUkVTT1VSQ0UzMkEoT0JNX0ROQVJST1dEKSApOworICAgIGhMZkFycm93RCA9IExvYWRCaXRtYXAzMkEoIDAsIE1BS0VJTlRSRVNPVVJDRTMyQShPQk1fTEZBUlJPV0QpICk7CisgICAgaFJnQXJyb3dEID0gTG9hZEJpdG1hcDMyQSggMCwgTUFLRUlOVFJFU09VUkNFMzJBKE9CTV9SR0FSUk9XRCkgKTsKKyAgICBoVXBBcnJvd0kgPSBMb2FkQml0bWFwMzJBKCAwLCBNQUtFSU5UUkVTT1VSQ0UzMkEoT0JNX1VQQVJST1dJKSApOworICAgIGhEbkFycm93SSA9IExvYWRCaXRtYXAzMkEoIDAsIE1BS0VJTlRSRVNPVVJDRTMyQShPQk1fRE5BUlJPV0kpICk7CisgICAgaExmQXJyb3dJID0gTG9hZEJpdG1hcDMyQSggMCwgTUFLRUlOVFJFU09VUkNFMzJBKE9CTV9MRkFSUk9XSSkgKTsKKyAgICBoUmdBcnJvd0kgPSBMb2FkQml0bWFwMzJBKCAwLCBNQUtFSU5UUkVTT1VSQ0UzMkEoT0JNX1JHQVJST1dJKSApOwogfQogCiAKQEAgLTEwMTgsNyArMTAxOCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRTY3JvbGxJbmZvMzIgICAoVVNFUjMyLjI4MykKKyAqICAgICAgICAgICBHZXRTY3JvbGxJbmZvMzIgICAoVVNFUjMyLjI4NCkKICAqLwogQk9PTDMyIFdJTkFQSSBHZXRTY3JvbGxJbmZvMzIoIEhXTkQzMiBod25kLCBJTlQzMiBuQmFyLCBMUFNDUk9MTElORk8gaW5mbyApCiB7CkBAIC0xMDgyLDcgKzEwODIsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0U2Nyb2xsUG9zMzIgICAoVVNFUjMyLjI4NCkKKyAqICAgICAgICAgICBHZXRTY3JvbGxQb3MzMiAgIChVU0VSMzIuMjg1KQogICovCiBJTlQzMiBXSU5BUEkgR2V0U2Nyb2xsUG9zMzIoIEhXTkQzMiBod25kLCBJTlQzMiBuQmFyICkKIHsKQEAgLTExNzEsNyArMTE3MSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRTY3JvbGxSYW5nZTMyICAgKFVTRVIzMi4yODUpCisgKiAgICAgICAgICAgR2V0U2Nyb2xsUmFuZ2UzMiAgIChVU0VSMzIuMjg2KQogICovCiBCT09MMzIgV0lOQVBJIEdldFNjcm9sbFJhbmdlMzIoIEhXTkQzMiBod25kLCBJTlQzMiBuQmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUElOVDMyIGxwTWluLCBMUElOVDMyIGxwTWF4KQpAQCAtMTIwMCw3ICsxMjAwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNob3dTY3JvbGxCYXIzMiAgIChVU0VSMzIuNTMxKQorICogICAgICAgICAgIFNob3dTY3JvbGxCYXIzMiAgIChVU0VSMzIuNTMyKQogICovCiBCT09MMzIgV0lOQVBJIFNob3dTY3JvbGxCYXIzMiggSFdORDMyIGh3bmQsIElOVDMyIG5CYXIsIEJPT0wzMiBmU2hvdyApCiB7CkBAIC0xMjc2LDcgKzEyNzYsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRW5hYmxlU2Nyb2xsQmFyMzIgICAoVVNFUjMyLjE3MCkKKyAqICAgICAgICAgICBFbmFibGVTY3JvbGxCYXIzMiAgIChVU0VSMzIuMTcxKQogICovCiBCT09MMzIgV0lOQVBJIEVuYWJsZVNjcm9sbEJhcjMyKCBIV05EMzIgaHduZCwgSU5UMzIgbkJhciwgVUlOVDMyIGZsYWdzICkKIHsKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3VpdG9vbHMuYyBiL2NvbnRyb2xzL3VpdG9vbHMuYwppbmRleCA0MzU0NDI2Li5kZDU4NjY4IDEwMDY0NAotLS0gYS9jb250cm9scy91aXRvb2xzLmMKKysrIGIvY29udHJvbHMvdWl0b29scy5jCkBAIC01NTgsNyArNTU4LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgIERyYXdFZGdlMzIgICAoVVNFUjMyLjE1NCkKKyAqICAgICAgICAgIERyYXdFZGdlMzIgICAoVVNFUjMyLjE1NSkKICAqLwogQk9PTDMyIFdJTkFQSSBEcmF3RWRnZTMyKCBIREMzMiBoZGMsIExQUkVDVDMyIHJjLCBVSU5UMzIgZWRnZSwgVUlOVDMyIGZsYWdzICkKIHsKQEAgLTEzNjQsNyArMTM2NCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgIERyYXdGcmFtZUNvbnRyb2wzMiAgKFVTRVIzMi4xNTcpCisgKiAgICAgICAgICBEcmF3RnJhbWVDb250cm9sMzIgIChVU0VSMzIuMTU4KQogICovCiBCT09MMzIgV0lOQVBJIERyYXdGcmFtZUNvbnRyb2wzMiggSERDMzIgaGRjLCBMUFJFQ1QzMiByYywgVUlOVDMyIHVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiB1U3RhdGUgKQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvdXBkb3duLmMgYi9jb250cm9scy91cGRvd24uYwppbmRleCBlM2I5NWNiLi44M2UyYTZkIDEwMDY0NAotLS0gYS9jb250cm9scy91cGRvd24uYworKysgYi9jb250cm9scy91cGRvd24uYwpAQCAtMTA1LDcgKzEwNSw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFVQRE9XTl9HZXRBcnJhd1JlY3QKKyAqICAgICAgICAgICBVUERPV05fR2V0QXJyb3dSZWN0CiAgKiB3bmRQdHIgICAtIHBvaW50ZXIgdG8gdGhlIHVwLWRvd24gd25kCiAgKiByZWN0ICAgICAtIHdpbGwgaG9sZCB0aGUgcmVjdGFuZ2xlCiAgKiBpbmNyICAgICAtIFRSVUUgIGdldCB0aGUgImluY3JlbWVudCIgcmVjdCAodXAgb3IgcmlnaHQpCkBAIC03NTksNiArNzU5LDIyIEBACiAJCSAgICAgaW5mb1B0ci0+TWluVmFsLCBpbmZvUHRyLT5NYXhWYWwsIGh3bmQpOwogICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAorICAgIGNhc2UgVURNX0dFVFJBTkdFMzI6CisgICAgICBpZiAod1BhcmFtKQorCSooTFBJTlQzMil3UGFyYW0gPSBpbmZvUHRyLT5NaW5WYWw7CisgICAgICBpZiAobFBhcmFtKQorCSooTFBJTlQzMilsUGFyYW0gPSBpbmZvUHRyLT5NYXhWYWw7CisgICAgICBicmVhazsKKworICAgIGNhc2UgVURNX1NFVFJBTkdFMzI6CisgICAgICBpbmZvUHRyLT5NaW5WYWwgPSAoSU5UMzIpd1BhcmFtOworICAgICAgaW5mb1B0ci0+TWF4VmFsID0gKElOVDMyKWxQYXJhbTsKKyAgICAgIGlmIChpbmZvUHRyLT5NYXhWYWwgPD0gaW5mb1B0ci0+TWluVmFsKQorCWluZm9QdHItPk1heFZhbCA9IGluZm9QdHItPk1pblZhbCArIDE7CisgICAgICBUUkFDRSh1cGRvd24sICJVcERvd24gQ3RybCBuZXcgcmFuZ2UoJWQgdG8gJWQpLCBod25kPSUwNHhcbiIsIAorCQkgICAgIGluZm9QdHItPk1pblZhbCwgaW5mb1B0ci0+TWF4VmFsLCBod25kKTsKKyAgICAgIGJyZWFrOworCiAgICAgZGVmYXVsdDogCiAgICAgICBpZiAobWVzc2FnZSA+PSBXTV9VU0VSKSAKIAlXQVJOKHVwZG93biwgInVua25vd24gbXNnICUwNHggd3A9JTA0eCBscD0lMDhseFxuIiwgCmRpZmYgLS1naXQgYS9jb250cm9scy93aWRnZXRzLmMgYi9jb250cm9scy93aWRnZXRzLmMKaW5kZXggYjhmY2ZjNC4uZGFhODlkOSAxMDA2NDQKLS0tIGEvY29udHJvbHMvd2lkZ2V0cy5jCisrKyBiL2NvbnRyb2xzL3dpZGdldHMuYwpAQCAtMzgsNDAgKzM4LDQ1IEBACiB7CiAgICAgLyogQklDMzJfQlVUVE9OICovCiAgICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX0RCTENMS1MgfCBDU19WUkVEUkFXIHwgQ1NfSFJFRFJBVyB8IENTX1BBUkVOVERDLAotICAgICAgQnV0dG9uV25kUHJvYywgMCwgc2l6ZW9mKEJVVFRPTklORk8pLCAwLCAwLCBJRENfQVJST1csIDAsIDAsICJCdXR0b24iIH0sCisgICAgICBCdXR0b25XbmRQcm9jLCAwLCBzaXplb2YoQlVUVE9OSU5GTyksIDAsIDAsCisgICAgICAoSENVUlNPUjMyKUlEQ19BUlJPVzMyQSwgMCwgMCwgIkJ1dHRvbiIgfSwKICAgICAvKiBCSUMzMl9FRElUICovCiAgICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX0RCTENMS1MgLyp8IENTX1BBUkVOVERDKi8sCi0gICAgICBFZGl0V25kUHJvYywgMCwgc2l6ZW9mKHZvaWQgKiksIDAsIDAsIElEQ19JQkVBTSwgMCwgMCwgIkVkaXQiIH0sCisgICAgICBFZGl0V25kUHJvYywgMCwgc2l6ZW9mKHZvaWQgKiksIDAsIDAsCisgICAgICAoSENVUlNPUjMyKUlEQ19JQkVBTTMyQSwgMCwgMCwgIkVkaXQiIH0sCiAgICAgLyogQklDMzJfTElTVEJPWCAqLwogICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19EQkxDTEtTIC8qfCBDU19QQVJFTlREQyovLAotICAgICAgTGlzdEJveFduZFByb2MsIDAsIHNpemVvZih2b2lkICopLCAwLCAwLCBJRENfQVJST1csIDAsIDAsICJMaXN0Qm94IiB9LAorICAgICAgTGlzdEJveFduZFByb2MsIDAsIHNpemVvZih2b2lkICopLCAwLCAwLAorICAgICAgKEhDVVJTT1IzMilJRENfQVJST1czMkEsIDAsIDAsICJMaXN0Qm94IiB9LAogICAgIC8qIEJJQzMyX0NPTUJPICovCiAgICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX1BBUkVOVERDIHwgQ1NfREJMQ0xLUywgCi0gICAgICBDb21ib1duZFByb2MsIDAsIHNpemVvZih2b2lkICopLCAwLCAwLCBJRENfQVJST1csIDAsIDAsICJDb21ib0JveCIgfSwKKyAgICAgIENvbWJvV25kUHJvYywgMCwgc2l6ZW9mKHZvaWQgKiksIDAsIDAsCisgICAgICAoSENVUlNPUjMyKUlEQ19BUlJPVzMyQSwgMCwgMCwgIkNvbWJvQm94IiB9LAogICAgIC8qIEJJQzMyX0NPTUJPTEIgKi8KLSAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfREJMQ0xLUyB8IENTX1NBVkVCSVRTLAotICAgICAgQ29tYm9MQlduZFByb2MsIDAsIHNpemVvZih2b2lkICopLCAwLCAwLCBJRENfQVJST1csIDAsIDAsICJDb21ib0xCb3giIH0sCisgICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX0RCTENMS1MgfCBDU19TQVZFQklUUywgQ29tYm9MQlduZFByb2MsCisgICAgICAwLCBzaXplb2Yodm9pZCAqKSwgMCwgMCwgKEhDVVJTT1IzMilJRENfQVJST1czMkEsIDAsIDAsICJDb21ib0xCb3giIH0sCiAgICAgLyogQklDMzJfUE9QVVBNRU5VICovCi0gICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX1NBVkVCSVRTLCBQb3B1cE1lbnVXbmRQcm9jLCAwLAotICAgICAgc2l6ZW9mKEhNRU5VMzIpLCAwLCAwLCBJRENfQVJST1csIE5VTExfQlJVU0gsIDAsIFBPUFVQTUVOVV9DTEFTU19OQU1FIH0sCisgICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX1NBVkVCSVRTLCBQb3B1cE1lbnVXbmRQcm9jLCAwLCBzaXplb2YoSE1FTlUzMiksCisgICAgICAwLCAwLCAoSENVUlNPUjMyKUlEQ19BUlJPVzMyQSwgTlVMTF9CUlVTSCwgMCwgUE9QVVBNRU5VX0NMQVNTX05BTUUgfSwKICAgICAvKiBCSUMzMl9TVEFUSUMgKi8KICAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfUEFSRU5UREMsIFN0YXRpY1duZFByb2MsCi0gICAgICAwLCBzaXplb2YoU1RBVElDSU5GTyksIDAsIDAsIElEQ19BUlJPVywgMCwgMCwgIlN0YXRpYyIgfSwKKyAgICAgIDAsIHNpemVvZihTVEFUSUNJTkZPKSwgMCwgMCwgKEhDVVJTT1IzMilJRENfQVJST1czMkEsIDAsIDAsICJTdGF0aWMiIH0sCiAgICAgLyogQklDMzJfU0NST0xMICovCiAgICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX0RCTENMS1MgfCBDU19WUkVEUkFXIHwgQ1NfSFJFRFJBVyB8IENTX1BBUkVOVERDLAotICAgICAgU2Nyb2xsQmFyV25kUHJvYywgMCwgc2l6ZW9mKFNDUk9MTEJBUl9JTkZPKSwgMCwgMCwgSURDX0FSUk9XLCAwLCAwLCAiU2Nyb2xsQmFyIn0sCisgICAgICBTY3JvbGxCYXJXbmRQcm9jLCAwLCBzaXplb2YoU0NST0xMQkFSX0lORk8pLCAwLCAwLAorICAgICAgKEhDVVJTT1IzMilJRENfQVJST1czMkEsIDAsIDAsICJTY3JvbGxCYXIifSwKICAgICAvKiBCSUMzMl9NRElDTElFTlQgKi8KICAgICB7IENTX0dMT0JBTENMQVNTLCBNRElDbGllbnRXbmRQcm9jLAogICAgICAgMCwgc2l6ZW9mKE1ESUNMSUVOVElORk8pLCAwLCAwLCAwLCBTVE9DS19MVEdSQVlfQlJVU0gsIDAsICJNRElDbGllbnQiIH0sCiAgICAgLyogQklDMzJfREVTS1RPUCAqLwogICAgIHsgQ1NfR0xPQkFMQ0xBU1MsIERlc2t0b3BXbmRQcm9jLCAwLCBzaXplb2YoREVTS1RPUElORk8pLAotICAgICAgMCwgMCwgSURDX0FSUk9XLCAwLCAwLCBERVNLVE9QX0NMQVNTX05BTUUgfSwKKyAgICAgIDAsIDAsIChIQ1VSU09SMzIpSURDX0FSUk9XMzJBLCAwLCAwLCBERVNLVE9QX0NMQVNTX05BTUUgfSwKICAgICAvKiBCSUMzMl9ESUFMT0cgKi8KICAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfU0FWRUJJVFMsIERlZkRsZ1Byb2MzMkEsIDAsIERMR1dJTkRPV0VYVFJBLAotICAgICAgMCwgMCwgSURDX0FSUk9XLCAwLCAwLCBESUFMT0dfQ0xBU1NfTkFNRSB9LAorICAgICAgMCwgMCwgKEhDVVJTT1IzMilJRENfQVJST1czMkEsIDAsIDAsIERJQUxPR19DTEFTU19OQU1FIH0sCiAgICAgLyogQklDMzJfSUNPTlRJVExFICovCiAgICAgeyBDU19HTE9CQUxDTEFTUywgSWNvblRpdGxlV25kUHJvYywgMCwgMCwgCi0gICAgICAwLCAwLCBJRENfQVJST1csIDAsIDAsIElDT05USVRMRV9DTEFTU19OQU1FIH0KKyAgICAgIDAsIDAsIChIQ1VSU09SMzIpSURDX0FSUk9XMzJBLCAwLCAwLCBJQ09OVElUTEVfQ0xBU1NfTkFNRSB9CiB9OwogCiBzdGF0aWMgQVRPTSBiaWNBdG9tVGFibGVbQklDMzJfTkJfQ0xBU1NFU107CmRpZmYgLS1naXQgYS9kb2N1bWVudGF0aW9uL2RlYnVnZ2luZyBiL2RvY3VtZW50YXRpb24vZGVidWdnaW5nCmluZGV4IDcxNDIxNzkuLjNlMmI1YTIgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vZGVidWdnaW5nCisrKyBiL2RvY3VtZW50YXRpb24vZGVidWdnaW5nCkBAIC04Myw3ICs4Myw5IEBACiAgNi4gSWYgdGhhdCBpc24ndCBlbm91Z2ggYWRkIG1vcmUgZGVidWcgb3V0cHV0IGZvciB5b3Vyc2VsZiBpbnRvIHRoZQogICAgIGZ1bmN0aW9ucyB5b3UgZmluZCByZWxldmFudC4KICAgICBZb3UgbWlnaHQgYWxzbyB0cnkgdG8gcnVuIHRoZSBwcm9ncmFtIGluIGdkYiBpbnN0ZWFkIG9mIHVzaW5nIHRoZQotICAgIFdJTkUtZGVidWdnZXIuCisgICAgV0lORS1kZWJ1Z2dlci4gSWYgeW91IGRvbid0IHVzZSB0aGUgIi1kZXNrdG9wIiBvciAiLW1hbmFnZWQiIG9wdGlvbiwKKyAgICBzdGFydCB0aGUgV0lORSBwcm9jZXNzIHdpdGggIi1zeW5jIiwgb3IgY2hhbmNlcyBhcmUgZ29vZCB0byBnZXQgWCBpbnRvCisgICAgYW4gdW51c2FibGUgc3RhdGUuCiAgIAogIDcuIFlvdSBjYW4gYWxzbyBzZXQgYSBicmVha3BvaW50IGZvciB0aGF0IGZ1bmN0aW9uLiBTdGFydCB3aW5lIHdpdGggdGhlCiAgICAgIi1kZWJ1ZyIgb3B0aW9uIGFkZGVkIHRvIHRoZSBjb21tYW5kbGluZS4gQWZ0ZXIgbG9hZGluZyB0aGUgZXhlY3V0YWJsZQpkaWZmIC0tZ2l0IGEvZmlsZXMvZGlyZWN0b3J5LmMgYi9maWxlcy9kaXJlY3RvcnkuYwppbmRleCAxMmMyOTAyLi5hNzgwZTM2IDEwMDY0NAotLS0gYS9maWxlcy9kaXJlY3RvcnkuYworKysgYi9maWxlcy9kaXJlY3RvcnkuYwpAQCAtNCw2ICs0LDcgQEAKICAqIENvcHlyaWdodCAxOTk1IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKKyNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtMjAsMTggKzIxLDkgQEAKICNpbmNsdWRlICJvcHRpb25zLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotI2RlZmluZSBNQVhfUEFUSF9FTEVNRU5UUyAyMAorc3RhdGljIERPU19GVUxMX05BTUUgRElSX1dpbmRvd3M7CitzdGF0aWMgRE9TX0ZVTExfTkFNRSBESVJfU3lzdGVtOwogCi1zdGF0aWMgY2hhciAqRElSX1dpbmRvd3NEb3NEaXI7Ci1zdGF0aWMgY2hhciAqRElSX1dpbmRvd3NVbml4RGlyOwotc3RhdGljIGNoYXIgKkRJUl9TeXN0ZW1Eb3NEaXI7Ci1zdGF0aWMgY2hhciAqRElSX1N5c3RlbVVuaXhEaXI7Ci1zdGF0aWMgY2hhciAqRElSX1RlbXBEb3NEaXI7Ci1zdGF0aWMgY2hhciAqRElSX1RlbXBVbml4RGlyOwotCi1zdGF0aWMgY2hhciAqRElSX0Rvc1BhdGhbTUFYX1BBVEhfRUxFTUVOVFNdOyAgLyogUGF0aCBpbiBET1MgZm9ybWF0ICovCi1zdGF0aWMgY2hhciAqRElSX1VuaXhQYXRoW01BWF9QQVRIX0VMRU1FTlRTXTsgLyogUGF0aCBpbiBVbml4IGZvcm1hdCAqLwotc3RhdGljIGludCBESVJfUGF0aEVsZW1lbnRzID0gMDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRElSX0dldFBhdGgKQEAgLTM5LDc4ICszMSwzMCBAQAogICogR2V0IGEgcGF0aCBuYW1lIGZyb20gdGhlIHdpbmUuaW5pIGZpbGUgYW5kIG1ha2Ugc3VyZSBpdCBpcyB2YWxpZC4KICAqLwogc3RhdGljIGludCBESVJfR2V0UGF0aCggY29uc3QgY2hhciAqa2V5bmFtZSwgY29uc3QgY2hhciAqZGVmdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmRvc19wYXRoLCBjaGFyICoqdW5peF9wYXRoICkKKyAgICAgICAgICAgICAgICAgICAgICAgIERPU19GVUxMX05BTUUgKmZ1bGxfbmFtZSApCiB7CiAgICAgY2hhciBwYXRoW01BWF9QQVRITkFNRV9MRU5dOwotICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOwotCiAgICAgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gaW5mbzsKIAogICAgIFBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggIndpbmUiLCBrZXluYW1lLCBkZWZ2YWwsIHBhdGgsIHNpemVvZihwYXRoKSApOwotICAgIGlmICghRE9TRlNfR2V0RnVsbE5hbWUoIHBhdGgsIFRSVUUsICZmdWxsX25hbWUgKSB8fAotICAgICAgICAhRklMRV9TdGF0KCBmdWxsX25hbWUubG9uZ19uYW1lLCAmaW5mbyApIHx8CisgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggcGF0aCwgVFJVRSwgZnVsbF9uYW1lICkgfHwKKyAgICAgICAgIUZJTEVfU3RhdCggZnVsbF9uYW1lLT5sb25nX25hbWUsICZpbmZvICkgfHwKICAgICAgICAgIShpbmZvLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpKQogICAgIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHBhdGggJyVzJyBmb3IgJXMgZGlyZWN0b3J5XG4iLCBwYXRoLCBrZXluYW1lKTsKKyAgICAgICAgTVNHKCJJbnZhbGlkIHBhdGggJyVzJyBmb3IgJXMgZGlyZWN0b3J5XG4iLCBwYXRoLCBrZXluYW1lKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgICp1bml4X3BhdGggPSBIRUFQX3N0cmR1cEEoIFN5c3RlbUhlYXAsIDAsIGZ1bGxfbmFtZS5sb25nX25hbWUgKTsKLSAgICAqZG9zX3BhdGggID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLCBmdWxsX25hbWUuc2hvcnRfbmFtZSApOwogICAgIHJldHVybiAxOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERJUl9QYXJzZVdpbmRvd3NQYXRoCi0gKi8KLXZvaWQgRElSX1BhcnNlV2luZG93c1BhdGgoIGNoYXIgKnBhdGggKQotewotICAgIGNoYXIgKnA7Ci0gICAgRE9TX0ZVTExfTkFNRSBmdWxsX25hbWU7Ci0gICAgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gaW5mbzsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoIDsgcGF0aCAmJiAqcGF0aDsgcGF0aCA9IHApCi0gICAgewotICAgICAgICBwID0gc3RyY2hyKCBwYXRoLCAnOycgKTsKLSAgICAgICAgaWYgKHApIHdoaWxlICgqcCA9PSAnOycpICpwKysgPSAnXDAnOwotCi0gICAgICAgIGlmIChESVJfUGF0aEVsZW1lbnRzID49IE1BWF9QQVRIX0VMRU1FTlRTKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBwYXRoIGhhcyBtb3JlIHRoYW4gJWQgZWxlbWVudHMuXG4iLAotICAgICAgICAgICAgICAgICAgICAgTUFYX1BBVEhfRUxFTUVOVFMgKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICghRE9TRlNfR2V0RnVsbE5hbWUoIHBhdGgsIFRSVUUsICZmdWxsX25hbWUgKSB8fAotICAgICAgICAgICAgIUZJTEVfU3RhdCggZnVsbF9uYW1lLmxvbmdfbmFtZSwgJmluZm8gKSB8fAotICAgICAgICAgICAgIShpbmZvLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiV2FybmluZzogaW52YWxpZCBkaXIgJyVzJyBpbiBwYXRoLCBkZWxldGluZyBpdC5cbiIsCi0gICAgICAgICAgICAgICAgICAgIHBhdGggKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIERJUl9Vbml4UGF0aFtESVJfUGF0aEVsZW1lbnRzXSA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX25hbWUubG9uZ19uYW1lICk7Ci0gICAgICAgIERJUl9Eb3NQYXRoW0RJUl9QYXRoRWxlbWVudHNdICA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX25hbWUuc2hvcnRfbmFtZSApOwotICAgICAgICBESVJfUGF0aEVsZW1lbnRzKys7Ci0gICAgfQotCi0gICAgaWYgKFRSQUNFX09OKGRvc2ZzKSkKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IERJUl9QYXRoRWxlbWVudHM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVFJBQ0UoZG9zZnMsICJQYXRoWyVkXTogJXMgPSAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIERJUl9Eb3NQYXRoW2ldLCBESVJfVW5peFBhdGhbaV0gKTsKLSAgICAgICAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERJUl9Jbml0CiAgKi8KIGludCBESVJfSW5pdCh2b2lkKQogewotICAgIGNoYXIgcGF0aFtNQVhfUEFUSE5BTUVfTEVOXSwgKmVudl9wOworICAgIGNoYXIgcGF0aFtNQVhfUEFUSE5BTUVfTEVOXTsKKyAgICBET1NfRlVMTF9OQU1FIHRtcF9kaXI7CiAgICAgaW50IGRyaXZlOwogICAgIGNvbnN0IGNoYXIgKmN3ZDsKIApAQCAtMTIyLDggKzY2LDggQEAKICAgICBjd2QgPSBwYXRoOwogICAgIGlmICgoZHJpdmUgPSBEUklWRV9GaW5kRHJpdmVSb290KCAmY3dkICkpID09IC0xKQogICAgIHsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiV2FybmluZzogY291bGQgbm90IGZpbmQgRE9TIGRyaXZlIGZvciBjd2QgJXM7IHN0YXJ0aW5nIGluIHdpbmRvd3MgZGlyZWN0b3J5LlxuIiwKLSAgICAgICAgICAgICAgICAgY3dkICk7CisgICAgICAgIE1TRygiV2FybmluZzogY291bGQgbm90IGZpbmQgRE9TIGRyaXZlIGZvciBjd2QgJXM7ICIKKwkgICAgInN0YXJ0aW5nIGluIHdpbmRvd3MgZGlyZWN0b3J5LlxuIiwgY3dkICk7CiAgICAgfQogICAgIGVsc2UKICAgICB7CkBAIC0xMzEsNTAgKzc1LDQ3IEBACiAgICAgICAgIERSSVZFX0NoZGlyKCBkcml2ZSwgY3dkICk7CiAgICAgfQogCi0gICAgaWYgKCEoRElSX0dldFBhdGgoICJ3aW5kb3dzIiwgImM6XFx3aW5kb3dzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgJkRJUl9XaW5kb3dzRG9zRGlyLCAmRElSX1dpbmRvd3NVbml4RGlyICkpKSByZXR1cm4gMDsKLSAgICBpZiAoIShESVJfR2V0UGF0aCggInN5c3RlbSIsICJjOlxcd2luZG93c1xcc3lzdGVtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgJkRJUl9TeXN0ZW1Eb3NEaXIsICZESVJfU3lzdGVtVW5peERpciApKSkgcmV0dXJuIDA7Ci0gICAgaWYgKCEoRElSX0dldFBhdGgoICJ0ZW1wIiwgImM6XFx3aW5kb3dzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgJkRJUl9UZW1wRG9zRGlyLCAmRElSX1RlbXBVbml4RGlyICkpKSByZXR1cm4gMDsKLSAgICBpZiAoLTE9PWFjY2VzcyhESVJfVGVtcFVuaXhEaXIsV19PSykpIHsKKyAgICBpZiAoIShESVJfR2V0UGF0aCggIndpbmRvd3MiLCAiYzpcXHdpbmRvd3MiLCAmRElSX1dpbmRvd3MgKSkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghKERJUl9HZXRQYXRoKCAic3lzdGVtIiwgImM6XFx3aW5kb3dzXFxzeXN0ZW0iLCAmRElSX1N5c3RlbSApKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCEoRElSX0dldFBhdGgoICJ0ZW1wIiwgImM6XFx3aW5kb3dzIiwgJnRtcF9kaXIgKSkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICgtMSA9PSBhY2Nlc3MoIHRtcF9kaXIubG9uZ19uYW1lLCBXX09LICkpCisgICAgewogICAgIAlpZiAoZXJybm89PUVBQ0NFUykKLQkJZnByaW50ZihzdGRlcnIsIldhcm5pbmc6IFRoZSBUZW1wb3JhcnkgRGlyZWN0b3J5IChhcyBzcGVjaWZpZWQgaW4gd2luZS5jb25mKSBpcyBOT1Qgd3JpdGVhYmxlLiBQbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uLlxuIik7CisJCU1TRygiV2FybmluZzogVGhlIFRlbXBvcmFyeSBEaXJlY3RvcnkgKGFzIHNwZWNpZmllZCBpbiB3aW5lLmNvbmYpIGlzIE5PVCB3cml0ZWFibGUuIFBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24uXG4iKTsKIAllbHNlCi0JCWZwcmludGYoc3RkZXJyLCJXYXJuaW5nOiBBY2Nlc3MgdG8gVGVtcG9yYXJ5IERpcmVjdG9yeSBmYWlsZWQgKCVzKS5cbiIsc3RyZXJyb3IoZXJybm8pKTsKKwkJTVNHKCJXYXJuaW5nOiBBY2Nlc3MgdG8gVGVtcG9yYXJ5IERpcmVjdG9yeSBmYWlsZWQgKCVzKS5cbiIsCisJCSAgICBzdHJlcnJvcihlcnJubykpOwogICAgIH0KLSAgIAorCiAgICAgaWYgKGRyaXZlID09IC0xKQogICAgIHsKLSAgICAgICAgZHJpdmUgPSBESVJfV2luZG93c0Rvc0RpclswXSAtICdBJzsKKyAgICAgICAgZHJpdmUgPSBESVJfV2luZG93cy5kcml2ZTsKICAgICAgICAgRFJJVkVfU2V0Q3VycmVudERyaXZlKCBkcml2ZSApOwotICAgICAgICBEUklWRV9DaGRpciggZHJpdmUsIERJUl9XaW5kb3dzRG9zRGlyICsgMiApOworICAgICAgICBEUklWRV9DaGRpciggZHJpdmUsIERJUl9XaW5kb3dzLnNob3J0X25hbWUgKyAyICk7CiAgICAgfQogCiAgICAgUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCJ3aW5lIiwgInBhdGgiLCAiYzpcXHdpbmRvd3M7YzpcXHdpbmRvd3NcXHN5c3RlbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIHNpemVvZihwYXRoKSApOwotICAgIERJUl9QYXJzZVdpbmRvd3NQYXRoKCBwYXRoICk7CiAKLSAgICBUUkFDRShkb3NmcywgIldpbmRvd3NEaXIgPSAlc1xuIiwgRElSX1dpbmRvd3NEb3NEaXIpOwotICAgIFRSQUNFKGRvc2ZzLCAiU3lzdGVtRGlyICA9ICVzXG4iLCBESVJfU3lzdGVtRG9zRGlyKTsKLSAgICBUUkFDRShkb3NmcywgIlRlbXBEaXIgICAgPSAlc1xuIiwgRElSX1RlbXBEb3NEaXIpOworICAgIC8qIFNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzICovCisKKyAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJBKCAiUEFUSCIsIHBhdGggKTsKKyAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJBKCAiVEVNUCIsIHRtcF9kaXIuc2hvcnRfbmFtZSApOworICAgIFNldEVudmlyb25tZW50VmFyaWFibGUzMkEoICJ3aW5kaXIiLCBESVJfV2luZG93cy5zaG9ydF9uYW1lICk7CisgICAgU2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyQSggIndpbnN5c2RpciIsIERJUl9TeXN0ZW0uc2hvcnRfbmFtZSApOworCisgICAgVFJBQ0UoZG9zZnMsICJXaW5kb3dzRGlyID0gJXMgKCVzKVxuIiwKKyAgICAgICAgICBESVJfV2luZG93cy5zaG9ydF9uYW1lLCBESVJfV2luZG93cy5sb25nX25hbWUgKTsKKyAgICBUUkFDRShkb3NmcywgIlN5c3RlbURpciAgPSAlcyAoJXMpXG4iLAorICAgICAgICAgIERJUl9TeXN0ZW0uc2hvcnRfbmFtZSwgRElSX1N5c3RlbS5sb25nX25hbWUgKTsKKyAgICBUUkFDRShkb3NmcywgIlRlbXBEaXIgICAgPSAlcyAoJXMpXG4iLAorICAgICAgICAgIHRtcF9kaXIuc2hvcnRfbmFtZSwgdG1wX2Rpci5sb25nX25hbWUgKTsKKyAgICBUUkFDRShkb3NmcywgIlBhdGggICAgICAgPSAlc1xuIiwgcGF0aCApOwogICAgIFRSQUNFKGRvc2ZzLCAiQ3dkICAgICAgICA9ICVjOlxcJXNcbiIsCi0JCSAnQScgKyBkcml2ZSwgRFJJVkVfR2V0RG9zQ3dkKCBkcml2ZSApICk7Ci0KLSAgICAvKiBQdXQgdGhlIHRlbXAgYW5kIFdpbmRvd3MgYW5kIHN5c3RlbSBkaXJlY3RvcmllcyBpbnRvIHRoZSBlbnZpcm9ubWVudCAqLwotCi0gICAgZW52X3AgPSBIRUFQX3hhbGxvYyggU3lzdGVtSGVhcCwgMCwgc3RybGVuKERJUl9UZW1wRG9zRGlyKSArIDYgKTsKLSAgICBzdHJjcHkoIGVudl9wLCAiVEVNUD0iICk7Ci0gICAgc3RyY3B5KCBlbnZfcCArIDUsIERJUl9UZW1wRG9zRGlyICk7Ci0gICAgcHV0ZW52KCBlbnZfcCApOwotICAgIGVudl9wID0gSEVBUF94YWxsb2MoIFN5c3RlbUhlYXAsIDAsIHN0cmxlbihESVJfV2luZG93c0Rvc0RpcikgKyA4ICk7Ci0gICAgc3RyY3B5KCBlbnZfcCwgIndpbmRpcj0iICk7Ci0gICAgc3RyY3B5KCBlbnZfcCArIDcsIERJUl9XaW5kb3dzRG9zRGlyICk7Ci0gICAgcHV0ZW52KCBlbnZfcCApOwotICAgIGVudl9wID0gSEVBUF94YWxsb2MoIFN5c3RlbUhlYXAsIDAsIHN0cmxlbihESVJfU3lzdGVtRG9zRGlyKSArIDExICk7Ci0gICAgc3RyY3B5KCBlbnZfcCwgIndpbnN5c2Rpcj0iICk7Ci0gICAgc3RyY3B5KCBlbnZfcCArIDEwLCBESVJfU3lzdGVtRG9zRGlyICk7Ci0gICAgcHV0ZW52KCBlbnZfcCApOworICAgICAgICAgICdBJyArIGRyaXZlLCBEUklWRV9HZXREb3NDd2QoIGRyaXZlICkgKTsKIAogICAgIHJldHVybiAxOwogfQpAQCAtMTg1LDggKzEyNiwxMSBAQAogICovCiBVSU5UMzIgV0lOQVBJIEdldFRlbXBQYXRoMzJBKCBVSU5UMzIgY291bnQsIExQU1RSIHBhdGggKQogewotICAgIGlmIChwYXRoKSBsc3RyY3B5bjMyQSggcGF0aCwgRElSX1RlbXBEb3NEaXIsIGNvdW50ICk7Ci0gICAgcmV0dXJuIHN0cmxlbiggRElSX1RlbXBEb3NEaXIgKTsKKyAgICBVSU5UMzIgcmV0OworICAgIGlmICghKHJldCA9IEdldEVudmlyb25tZW50VmFyaWFibGUzMkEoICJUTVAiLCBwYXRoLCBjb3VudCApKSkKKyAgICAgICAgaWYgKCEocmV0ID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyQSggIlRFTVAiLCBwYXRoLCBjb3VudCApKSkKKyAgICAgICAgICAgIHJldCA9IEdldEN1cnJlbnREaXJlY3RvcnkzMkEoIGNvdW50LCBwYXRoICk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogCkBAIC0xOTUsMTggKzEzOSwxMyBAQAogICovCiBVSU5UMzIgV0lOQVBJIEdldFRlbXBQYXRoMzJXKCBVSU5UMzIgY291bnQsIExQV1NUUiBwYXRoICkKIHsKLSAgICBpZiAocGF0aCkgbHN0cmNweW5BdG9XKCBwYXRoLCBESVJfVGVtcERvc0RpciwgY291bnQgKTsKLSAgICByZXR1cm4gc3RybGVuKCBESVJfVGVtcERvc0RpciApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERJUl9HZXRUZW1wVW5peERpcgotICovCi1VSU5UMzIgRElSX0dldFRlbXBVbml4RGlyKCBMUFNUUiBwYXRoLCBVSU5UMzIgY291bnQgKQotewotICAgIGlmIChwYXRoKSBsc3RyY3B5bjMyQSggcGF0aCwgRElSX1RlbXBVbml4RGlyLCBjb3VudCApOwotICAgIHJldHVybiBzdHJsZW4oIERJUl9UZW1wVW5peERpciApOworICAgIHN0YXRpYyBjb25zdCBXQ0hBUiB0bXBbXSAgPSB7ICdUJywgJ00nLCAnUCcsIDAgfTsKKyAgICBzdGF0aWMgY29uc3QgV0NIQVIgdGVtcFtdID0geyAnVCcsICdFJywgJ00nLCAnUCcsIDAgfTsKKyAgICBVSU5UMzIgcmV0OworICAgIGlmICghKHJldCA9IEdldEVudmlyb25tZW50VmFyaWFibGUzMlcoIHRtcCwgcGF0aCwgY291bnQgKSkpCisgICAgICAgIGlmICghKHJldCA9IEdldEVudmlyb25tZW50VmFyaWFibGUzMlcoIHRlbXAsIHBhdGgsIGNvdW50ICkpKQorICAgICAgICAgICAgcmV0ID0gR2V0Q3VycmVudERpcmVjdG9yeTMyVyggY291bnQsIHBhdGggKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAKQEAgLTIxNSw4ICsxNTQsOCBAQAogICovCiBVSU5UMzIgRElSX0dldFdpbmRvd3NVbml4RGlyKCBMUFNUUiBwYXRoLCBVSU5UMzIgY291bnQgKQogewotICAgIGlmIChwYXRoKSBsc3RyY3B5bjMyQSggcGF0aCwgRElSX1dpbmRvd3NVbml4RGlyLCBjb3VudCApOwotICAgIHJldHVybiBzdHJsZW4oIERJUl9XaW5kb3dzVW5peERpciApOworICAgIGlmIChwYXRoKSBsc3RyY3B5bjMyQSggcGF0aCwgRElSX1dpbmRvd3MubG9uZ19uYW1lLCBjb3VudCApOworICAgIHJldHVybiBzdHJsZW4oIERJUl9XaW5kb3dzLmxvbmdfbmFtZSApOwogfQogCiAKQEAgLTIyNSwxOSArMTY0LDggQEAKICAqLwogVUlOVDMyIERJUl9HZXRTeXN0ZW1Vbml4RGlyKCBMUFNUUiBwYXRoLCBVSU5UMzIgY291bnQgKQogewotICAgIGlmIChwYXRoKSBsc3RyY3B5bjMyQSggcGF0aCwgRElSX1N5c3RlbVVuaXhEaXIsIGNvdW50ICk7Ci0gICAgcmV0dXJuIHN0cmxlbiggRElSX1N5c3RlbVVuaXhEaXIgKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBESVJfR2V0RG9zUGF0aAotICovCi1VSU5UMzIgRElSX0dldERvc1BhdGgoIElOVDMyIGVsZW1lbnQsIExQU1RSIHBhdGgsIFVJTlQzMiBjb3VudCApCi17Ci0gICAgaWYgKChlbGVtZW50IDwgMCkgfHwgKGVsZW1lbnQgPj0gRElSX1BhdGhFbGVtZW50cykpIHJldHVybiAwOwotICAgIGlmIChwYXRoKSBsc3RyY3B5bjMyQSggcGF0aCwgRElSX0Rvc1BhdGhbZWxlbWVudF0sIGNvdW50ICk7Ci0gICAgcmV0dXJuIHN0cmxlbiggRElSX0Rvc1BhdGhbZWxlbWVudF0gKTsKKyAgICBpZiAocGF0aCkgbHN0cmNweW4zMkEoIHBhdGgsIERJUl9TeXN0ZW0ubG9uZ19uYW1lLCBjb3VudCApOworICAgIHJldHVybiBzdHJsZW4oIERJUl9TeXN0ZW0ubG9uZ19uYW1lICk7CiB9CiAKIApAQCAtMjQ2LDggKzE3NCwxMCBAQAogICovCiBCWVRFIFdJTkFQSSBHZXRUZW1wRHJpdmUoIEJZVEUgaWdub3JlZCApCiB7CisgICAgY2hhciBidWZmZXJbMl07CiAgICAgLyogRklYTUU6IGFwcGFyZW50bHkgV2luZG93cyBkb2VzIHNvbWV0aGluZyB3aXRoIHRoZSBpZ25vcmVkIGJ5dGUgKi8KLSAgICByZXR1cm4gRElSX1RlbXBEb3NEaXJbMF07CisgICAgaWYgKCFHZXRUZW1wUGF0aDMyQSggc2l6ZW9mKGJ1ZmZlciksIGJ1ZmZlciApKSBidWZmZXJbMF0gPSAnQyc7CisgICAgcmV0dXJuIHRvdXBwZXIoYnVmZmVyWzBdKSAtICdBJzsKIH0KIAogCkBAIC0yNzksOCArMjA5LDggQEAKICAqLwogVUlOVDMyIFdJTkFQSSBHZXRXaW5kb3dzRGlyZWN0b3J5MzJBKCBMUFNUUiBwYXRoLCBVSU5UMzIgY291bnQgKQogewotICAgIGlmIChwYXRoKSBsc3RyY3B5bjMyQSggcGF0aCwgRElSX1dpbmRvd3NEb3NEaXIsIGNvdW50ICk7Ci0gICAgcmV0dXJuIHN0cmxlbiggRElSX1dpbmRvd3NEb3NEaXIgKTsKKyAgICBpZiAocGF0aCkgbHN0cmNweW4zMkEoIHBhdGgsIERJUl9XaW5kb3dzLnNob3J0X25hbWUsIGNvdW50ICk7CisgICAgcmV0dXJuIHN0cmxlbiggRElSX1dpbmRvd3Muc2hvcnRfbmFtZSApOwogfQogCiAKQEAgLTI4OSw4ICsyMTksOCBAQAogICovCiBVSU5UMzIgV0lOQVBJIEdldFdpbmRvd3NEaXJlY3RvcnkzMlcoIExQV1NUUiBwYXRoLCBVSU5UMzIgY291bnQgKQogewotICAgIGlmIChwYXRoKSBsc3RyY3B5bkF0b1coIHBhdGgsIERJUl9XaW5kb3dzRG9zRGlyLCBjb3VudCApOwotICAgIHJldHVybiBzdHJsZW4oIERJUl9XaW5kb3dzRG9zRGlyICk7CisgICAgaWYgKHBhdGgpIGxzdHJjcHluQXRvVyggcGF0aCwgRElSX1dpbmRvd3Muc2hvcnRfbmFtZSwgY291bnQgKTsKKyAgICByZXR1cm4gc3RybGVuKCBESVJfV2luZG93cy5zaG9ydF9uYW1lICk7CiB9CiAKIApAQCAtMzA4LDggKzIzOCw4IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgR2V0U3lzdGVtRGlyZWN0b3J5MzJBKCBMUFNUUiBwYXRoLCBVSU5UMzIgY291bnQgKQogewotICAgIGlmIChwYXRoKSBsc3RyY3B5bjMyQSggcGF0aCwgRElSX1N5c3RlbURvc0RpciwgY291bnQgKTsKLSAgICByZXR1cm4gc3RybGVuKCBESVJfU3lzdGVtRG9zRGlyICk7CisgICAgaWYgKHBhdGgpIGxzdHJjcHluMzJBKCBwYXRoLCBESVJfU3lzdGVtLnNob3J0X25hbWUsIGNvdW50ICk7CisgICAgcmV0dXJuIHN0cmxlbiggRElSX1N5c3RlbS5zaG9ydF9uYW1lICk7CiB9CiAKIApAQCAtMzE4LDggKzI0OCw4IEBACiAgKi8KIFVJTlQzMiBXSU5BUEkgR2V0U3lzdGVtRGlyZWN0b3J5MzJXKCBMUFdTVFIgcGF0aCwgVUlOVDMyIGNvdW50ICkKIHsKLSAgICBpZiAocGF0aCkgbHN0cmNweW5BdG9XKCBwYXRoLCBESVJfU3lzdGVtRG9zRGlyLCBjb3VudCApOwotICAgIHJldHVybiBzdHJsZW4oIERJUl9TeXN0ZW1Eb3NEaXIgKTsKKyAgICBpZiAocGF0aCkgbHN0cmNweW5BdG9XKCBwYXRoLCBESVJfU3lzdGVtLnNob3J0X25hbWUsIGNvdW50ICk7CisgICAgcmV0dXJuIHN0cmxlbiggRElSX1N5c3RlbS5zaG9ydF9uYW1lICk7CiB9CiAKIApAQCAtNDQzLDExICszNzMsMTEgQEAKICAqCiAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIERJUl9TZWFyY2hQYXRoLgogICovCi1zdGF0aWMgQk9PTDMyIERJUl9UcnlQYXRoKCBMUENTVFIgdW5peF9kaXIsIExQQ1NUUiBkb3NfZGlyLCBMUENTVFIgbmFtZSwKK3N0YXRpYyBCT09MMzIgRElSX1RyeVBhdGgoIGNvbnN0IERPU19GVUxMX05BTUUgKmRpciwgTFBDU1RSIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBET1NfRlVMTF9OQU1FICpmdWxsX25hbWUgKQogewotICAgIExQU1RSIHBfbCA9IGZ1bGxfbmFtZS0+bG9uZ19uYW1lICsgc3RybGVuKHVuaXhfZGlyKSArIDE7Ci0gICAgTFBTVFIgcF9zID0gZnVsbF9uYW1lLT5zaG9ydF9uYW1lICsgc3RybGVuKGRvc19kaXIpICsgMTsKKyAgICBMUFNUUiBwX2wgPSBmdWxsX25hbWUtPmxvbmdfbmFtZSArIHN0cmxlbihkaXItPmxvbmdfbmFtZSkgKyAxOworICAgIExQU1RSIHBfcyA9IGZ1bGxfbmFtZS0+c2hvcnRfbmFtZSArIHN0cmxlbihkaXItPnNob3J0X25hbWUpICsgMTsKIAogICAgIGlmICgocF9zID49IGZ1bGxfbmFtZS0+c2hvcnRfbmFtZSArIHNpemVvZihmdWxsX25hbWUtPnNob3J0X25hbWUpIC0gMTQpIHx8CiAgICAgICAgIChwX2wgPj0gZnVsbF9uYW1lLT5sb25nX25hbWUgKyBzaXplb2YoZnVsbF9uYW1lLT5sb25nX25hbWUpIC0gMSkpCkBAIC00NTUsMTkgKzM4NSw1NyBAQAogICAgICAgICBET1NfRVJST1IoIEVSX1BhdGhOb3RGb3VuZCwgRUNfTm90Rm91bmQsIFNBX0Fib3J0LCBFTF9EaXNrICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaWYgKCFET1NGU19GaW5kVW5peE5hbWUoIHVuaXhfZGlyLCBuYW1lLCBwX2wsCisgICAgaWYgKCFET1NGU19GaW5kVW5peE5hbWUoIGRpci0+bG9uZ19uYW1lLCBuYW1lLCBwX2wsCiAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZ1bGxfbmFtZS0+bG9uZ19uYW1lKSAtIChwX2wgLSBmdWxsX25hbWUtPmxvbmdfbmFtZSksCi0gICAgICAgICAgICAgICAgICAgcF9zLCBEUklWRV9HZXRGbGFncyggZG9zX2RpclswXSAtICdBJyApICkpCisgICAgICAgICAgICAgICAgICAgcF9zLCBEUklWRV9HZXRGbGFncyggZGlyLT5kcml2ZSApICkpCiAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBzdHJjcHkoIGZ1bGxfbmFtZS0+bG9uZ19uYW1lLCB1bml4X2RpciApOworICAgIHN0cmNweSggZnVsbF9uYW1lLT5sb25nX25hbWUsIGRpci0+bG9uZ19uYW1lICk7CiAgICAgcF9sWy0xXSA9ICcvJzsKLSAgICBzdHJjcHkoIGZ1bGxfbmFtZS0+c2hvcnRfbmFtZSwgZG9zX2RpciApOworICAgIHN0cmNweSggZnVsbF9uYW1lLT5zaG9ydF9uYW1lLCBkaXItPnNob3J0X25hbWUgKTsKICAgICBwX3NbLTFdID0gJ1xcJzsKICAgICByZXR1cm4gVFJVRTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBESVJfVHJ5RW52aXJvbm1lbnRQYXRoCisgKgorICogSGVscGVyIGZ1bmN0aW9uIGZvciBESVJfU2VhcmNoUGF0aC4KKyAqLworc3RhdGljIEJPT0wzMiBESVJfVHJ5RW52aXJvbm1lbnRQYXRoKCBMUENTVFIgbmFtZSwgRE9TX0ZVTExfTkFNRSAqZnVsbF9uYW1lICkKK3sKKyAgICBMUFNUUiBwYXRoLCBuZXh0LCBidWZmZXI7CisgICAgQk9PTDMyIHJldCA9IEZBTFNFOworICAgIElOVDMyIGxlbiA9IHN0cmxlbihuYW1lKTsKKyAgICBEV09SRCBzaXplID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyQSggIlBBVEgiLCBOVUxMLCAwICk7CisKKyAgICBpZiAoIXNpemUpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIShwYXRoID0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplICkpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFHZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJBKCAiUEFUSCIsIHBhdGgsIHNpemUgKSkgZ290byBkb25lOworICAgIG5leHQgPSBwYXRoOworICAgIHdoaWxlICghcmV0ICYmIG5leHQpCisgICAgeworICAgICAgICBMUFNUUiBjdXIgPSBuZXh0OworICAgICAgICB3aGlsZSAoKmN1ciA9PSAnOycpIGN1cisrOworICAgICAgICBpZiAoISpjdXIpIGJyZWFrOworICAgICAgICBuZXh0ID0gc3RyY2hyKCBjdXIsICc7JyApOworICAgICAgICBpZiAobmV4dCkgKm5leHQrKyA9ICdcMCc7CisgICAgICAgIGlmICghKGJ1ZmZlciA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3RybGVuKGN1cikgKyBsZW4gKyAyKSkpCisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIHN0cmNweSggYnVmZmVyLCBjdXIgKTsKKyAgICAgICAgc3RyY2F0KCBidWZmZXIsICJcXCIgKTsKKyAgICAgICAgc3RyY2F0KCBidWZmZXIsIG5hbWUgKTsKKyAgICAgICAgcmV0ID0gRE9TRlNfR2V0RnVsbE5hbWUoIGJ1ZmZlciwgVFJVRSwgZnVsbF9uYW1lICk7CisgICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWZmZXIgKTsKKyAgICB9CisKK2RvbmU6CisgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHBhdGggKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERJUl9UcnlNb2R1bGVQYXRoCiAgKgogICogSGVscGVyIGZ1bmN0aW9uIGZvciBESVJfU2VhcmNoUGF0aC4KQEAgLTUwMSw3ICs0NjksNiBAQAogewogICAgIERXT1JEIGxlbjsKICAgICBMUENTVFIgcDsKLSAgICBpbnQgaTsKICAgICBMUFNUUiB0bXAgPSBOVUxMOwogICAgIEJPT0wzMiByZXQgPSBUUlVFOwogCkBAIC01NTgsMTIgKzUyNSwxMiBAQAogCiAgICAgLyogVHJ5IHRoZSBXaW5kb3dzIGRpcmVjdG9yeSAqLwogCi0gICAgaWYgKERJUl9UcnlQYXRoKCBESVJfV2luZG93c1VuaXhEaXIsIERJUl9XaW5kb3dzRG9zRGlyLCBuYW1lLCBmdWxsX25hbWUgKSkKKyAgICBpZiAoRElSX1RyeVBhdGgoICZESVJfV2luZG93cywgbmFtZSwgZnVsbF9uYW1lICkpCiAgICAgICAgIGdvdG8gZG9uZTsKIAogICAgIC8qIFRyeSB0aGUgV2luZG93cyBzeXN0ZW0gZGlyZWN0b3J5ICovCiAKLSAgICBpZiAoRElSX1RyeVBhdGgoIERJUl9TeXN0ZW1Vbml4RGlyLCBESVJfU3lzdGVtRG9zRGlyLCBuYW1lLCBmdWxsX25hbWUgKSkKKyAgICBpZiAoRElSX1RyeVBhdGgoICZESVJfU3lzdGVtLCBuYW1lLCBmdWxsX25hbWUgKSkKICAgICAgICAgZ290byBkb25lOwogCiAgICAgLyogVHJ5IHRoZSBwYXRoIG9mIHRoZSBjdXJyZW50IGV4ZWN1dGFibGUgKGZvciBXaW4xNiBzZWFyY2ggb3JkZXIpICovCkBAIC01NzIsMTMgKzUzOSw4IEBACiAKICAgICAvKiBUcnkgYWxsIGRpcmVjdG9yaWVzIGluIHBhdGggKi8KIAotICAgIGZvciAoaSA9IDA7IGkgPCBESVJfUGF0aEVsZW1lbnRzOyBpKyspCi0gICAgewotICAgICAgICBpZiAoRElSX1RyeVBhdGgoIERJUl9Vbml4UGF0aFtpXSwgRElSX0Rvc1BhdGhbaV0sIG5hbWUsIGZ1bGxfbmFtZSApKQotICAgICAgICAgICAgZ290byBkb25lOwotICAgIH0KKyAgICByZXQgPSBESVJfVHJ5RW52aXJvbm1lbnRQYXRoKCBuYW1lLCBmdWxsX25hbWUgKTsKIAotICAgIHJldCA9IEZBTFNFOwogZG9uZToKICAgICBpZiAodG1wKSBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdG1wICk7CiAgICAgcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2ZpbGVzL2Rvc19mcy5jIGIvZmlsZXMvZG9zX2ZzLmMKaW5kZXggOGNhM2ZiOS4uZTdiNWE0ZiAxMDA2NDQKLS0tIGEvZmlsZXMvZG9zX2ZzLmMKKysrIGIvZmlsZXMvZG9zX2ZzLmMKQEAgLTUsNiArNSw3IEBACiAgKiBDb3B5cmlnaHQgMTk5NiBBbGV4YW5kcmUgSnVsbGlhcmQKICAqLwogCisjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KQEAgLTE3LDggKzE4LDggQEAKICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaWYgZGVmaW5lZChfX3N2cjRfXykgfHwgZGVmaW5lZChfU0NPX0RTKQotI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KKyNpZmRlZiBIQVZFX1NZU19TVEFURlNfSAorIyBpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CiAjZW5kaWYKIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKQEAgLTY0Niw4ICs2NDcsNyBAQAogICAgIHsKICAgICAgICAgaWYgKChkcml2ZSA9IERSSVZFX0ZpbmREcml2ZVJvb3QoIG5hbWUgKSkgPT0gLTEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6ICVzIG5vdCBhY2Nlc3NpYmxlIGZyb20gYSBET1MgZHJpdmVcbiIsCi0gICAgICAgICAgICAgICAgICAgICAqbmFtZSApOworICAgICAgICAgICAgTVNHKCJXYXJuaW5nOiAlcyBub3QgYWNjZXNzaWJsZSBmcm9tIGEgRE9TIGRyaXZlXG4iLCAqbmFtZSApOwogICAgICAgICAgICAgLyogQXNzdW1lIGl0IHJlYWxseSB3YXMgYSBET1MgbmFtZSAqLwogICAgICAgICAgICAgZHJpdmUgPSBEUklWRV9HZXRDdXJyZW50RHJpdmUoKTsgICAgICAgICAgICAKICAgICAgICAgfQpAQCAtMTMzNSw3ICsxMzM1LDcgQEAKICAgICAgICBDbGF1cyBGaXNjaGVyLCBmaXNjaGVyQGl1ZS50dXdpZW4uYWMuYXQKICAgICAgICAqLwogCi0jaWYgX19HTlVDX18KKyNpZiAoU0laRU9GX0xPTkdfTE9ORyA+PSA4KQogIyAgZGVmaW5lIFVTRV9MT05HX0xPTkcgMQogI2Vsc2UKICMgIGRlZmluZSBVU0VfTE9OR19MT05HIDAKZGlmZiAtLWdpdCBhL2ZpbGVzL2RyaXZlLmMgYi9maWxlcy9kcml2ZS5jCmluZGV4IDY4ZGZlYjYuLjQ3YjU0M2QgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2RyaXZlLmMKKysrIGIvZmlsZXMvZHJpdmUuYwpAQCAtNSw2ICs1LDggQEAKICAqIENvcHlyaWdodCAxOTk2IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKKyNpbmNsdWRlICJjb25maWcuaCIKKwogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0xMiwxNyArMTQsMTkgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KIAotI2lmIGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKHN1bikgfHwgZGVmaW5lZChocHV4KQotI2luY2x1ZGUgPHN5cy92ZnMuaD4KKyNpZmRlZiBIQVZFX1NZU19WRlNfSAorIyBpbmNsdWRlIDxzeXMvdmZzLmg+CiAjZW5kaWYKLSNpZiBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL21vdW50Lmg+Ci0jaW5jbHVkZSA8c3lzL2Vycm5vLmg+CisjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KICNlbmRpZgotI2lmIGRlZmluZWQoX19zdnI0X18pIHx8IGRlZmluZWQoX1NDT19EUykgfHwgZGVmaW5lZChfX0VNWF9fKQotI2luY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KKyNpZmRlZiBIQVZFX1NZU19NT1VOVF9ICisjIGluY2x1ZGUgPHN5cy9tb3VudC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfU1RBVEZTX0gKKyMgaW5jbHVkZSA8c3lzL3N0YXRmcy5oPgogI2VuZGlmCiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCkBAIC05OCw4ICsxMDIsNyBAQAogICAgIHsKICAgICAgICAgaWYgKCFsc3RyY21waTMyQSggYnVmZmVyLCBEUklWRV9UeXBlc1tpXSApKSByZXR1cm4gKERSSVZFVFlQRSlpOwogICAgIH0KLSAgICBmcHJpbnRmKCBzdGRlcnIsICIlczogdW5rbm93biB0eXBlICclcycsIGRlZmF1bHRpbmcgdG8gJ2hkJy5cbiIsCi0gICAgICAgICAgICAgbmFtZSwgYnVmZmVyICk7CisgICAgTVNHKCIlczogdW5rbm93biB0eXBlICclcycsIGRlZmF1bHRpbmcgdG8gJ2hkJy5cbiIsIG5hbWUsIGJ1ZmZlciApOwogICAgIHJldHVybiBUWVBFX0hEOwogfQogCkBAIC0xMTMsOCArMTE2LDggQEAKIAogICAgIGZvciAoZGVzY3IgPSBEUklWRV9GaWxlc3lzdGVtczsgZGVzY3ItPm5hbWU7IGRlc2NyKyspCiAgICAgICAgIGlmICghbHN0cmNtcGkzMkEoIHZhbHVlLCBkZXNjci0+bmFtZSApKSByZXR1cm4gZGVzY3ItPmZsYWdzOwotICAgIGZwcmludGYoIHN0ZGVyciwgIiVzOiB1bmtub3duIGZpbGVzeXN0ZW0gdHlwZSAnJXMnLCBkZWZhdWx0aW5nIHRvICd1bml4Jy5cbiIsCi0gICAgICAgICAgICAgbmFtZSwgdmFsdWUgKTsKKyAgICBNU0coIiVzOiB1bmtub3duIGZpbGVzeXN0ZW0gdHlwZSAnJXMnLCBkZWZhdWx0aW5nIHRvICd1bml4Jy5cbiIsCisJbmFtZSwgdmFsdWUgKTsKICAgICByZXR1cm4gRFJJVkVfQ0FTRV9TRU5TSVRJVkUgfCBEUklWRV9DQVNFX1BSRVNFUlZJTkc7CiB9CiAKQEAgLTE0MywxNCArMTQ2LDEzIEBACiAKICAgICAgICAgICAgIGlmIChzdGF0KCBwYXRoLCAmZHJpdmVfc3RhdF9idWZmZXIgKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJDb3VsZCBub3Qgc3RhdCAlcywgaWdub3JpbmcgZHJpdmUgJWM6XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsICdBJyArIGkgKTsKKyAgICAgICAgICAgICAgICBNU0coIkNvdWxkIG5vdCBzdGF0ICVzLCBpZ25vcmluZyBkcml2ZSAlYzpcbiIsIHBhdGgsICdBJyArIGkgKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghU19JU0RJUihkcml2ZV9zdGF0X2J1ZmZlci5zdF9tb2RlKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIlcyBpcyBub3QgYSBkaXJlY3RvcnksIGlnbm9yaW5nIGRyaXZlICVjOlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCAnQScgKyBpICk7CisgICAgICAgICAgICAgICAgTVNHKCIlcyBpcyBub3QgYSBkaXJlY3RvcnksIGlnbm9yaW5nIGRyaXZlICVjOlxuIiwKKwkJICAgIHBhdGgsICdBJyArIGkgKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIApAQCAtMjAzLDcgKzIwNSw3IEBACiAKICAgICBpZiAoIWNvdW50KSAKICAgICB7Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IG5vIHZhbGlkIERPUyBkcml2ZSBmb3VuZCwgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGZpbGUuXG4iICk7CisgICAgICAgIE1TRygiV2FybmluZzogbm8gdmFsaWQgRE9TIGRyaXZlIGZvdW5kLCBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiIgKTsKICAgICAgICAgLyogQ3JlYXRlIGEgQyBkcml2ZSBwb2ludGluZyB0byBVbml4IHJvb3QgZGlyICovCiAgICAgICAgIERPU0RyaXZlc1syXS5yb290ICAgICA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwgIi8iICk7CiAgICAgICAgIERPU0RyaXZlc1syXS5kb3NfY3dkICA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwgIiIgKTsKQEAgLTU4Myw2ICs1ODUsNyBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKy8qIEZJWE1FOiBhZGQgYXV0b2NvbmYgY2hlY2sgZm9yIHRoaXMgKi8KICNpZiBkZWZpbmVkKF9fc3ZyNF9fKSB8fCBkZWZpbmVkKF9TQ09fRFMpCiAgICAgaWYgKHN0YXRmcyggRE9TRHJpdmVzW2RyaXZlXS5yb290LCAmaW5mbywgMCwgMCkgPCAwKQogI2Vsc2UKQEAgLTU5MCwxNSArNTkzLDE5IEBACiAjZW5kaWYKICAgICB7CiAgICAgICAgIEZJTEVfU2V0RG9zRXJyb3IoKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsImRvc2ZzOiBjYW5ub3QgZG8gc3RhdGZzKCVzKVxuIiwgRE9TRHJpdmVzW2RyaXZlXS5yb290KTsKKyAgICAgICAgV0FSTihkb3NmcywgImNhbm5vdCBkbyBzdGF0ZnMoJXMpXG4iLCBET1NEcml2ZXNbZHJpdmVdLnJvb3QpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKICAgICAqc2l6ZSA9IGluZm8uZl9ic2l6ZSAqIGluZm8uZl9ibG9ja3M7Ci0jaWYgZGVmaW5lZChfX3N2cjRfXykgfHwgZGVmaW5lZChfU0NPX0RTKSB8fCBkZWZpbmVkKF9fRU1YX18pCi0gICAgKmF2YWlsYWJsZSA9IGluZm8uZl9iZnJlZSAqIGluZm8uZl9ic2l6ZTsKLSNlbHNlCisjaWZkZWYgU1RBVEZTX0hBU19CQVZBSUwKICAgICAqYXZhaWxhYmxlID0gaW5mby5mX2JhdmFpbCAqIGluZm8uZl9ic2l6ZTsKKyNlbHNlCisjIGlmZGVmIFNUQVRGU19IQVNfQkZSRUUKKyAgICAqYXZhaWxhYmxlID0gaW5mby5mX2JmcmVlICogaW5mby5mX2JzaXplOworIyBlbHNlCisjICBlcnJvciAic3RhdGZzIGhhcyBubyBiZnJlZS9iYXZhaWwgbWVtYmVyISIKKyMgZW5kaWYKICNlbmRpZgogICAgIHJldHVybiAxOwogfQpAQCAtNjMxLDcgKzYzOCw3IEBACiAgICAgewogICAgICAgICBpZiAoKHJvb3RbMV0pICYmICgocm9vdFsxXSAhPSAnOicpIHx8IChyb290WzJdICE9ICdcXCcpKSkKICAgICAgICAgewotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiR2V0RGlza0ZyZWVTcGFjZUE6IGludmFsaWQgcm9vdCAnJXMnXG4iLCByb290ICk7CisgICAgICAgICAgICBXQVJOKGRvc2ZzLCAiaW52YWxpZCByb290ICclcydcbiIsIHJvb3QgKTsKICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBkcml2ZSA9IHRvdXBwZXIocm9vdFswXSkgLSAnQSc7CkBAIC02NTMsNyArNjYwLDcgQEAKICAgICB9CiAgICAgLyogZml4bWU6IHByb2JhYmx5IGhhdmUgdG8gYWRqdXN0IHRob3NlIHZhcmlhYmxlcyB0b28gZm9yIENERlMgKi8KICAgICAqY2x1c3Rlcl9zZWN0b3JzID0gMTsKLSAgICB3aGlsZSAoKmNsdXN0ZXJfc2VjdG9ycyAqIDY1NTMwIDwgc2l6ZSkgKmNsdXN0ZXJfc2VjdG9ycyAqPSAyOworICAgIHdoaWxlICgqY2x1c3Rlcl9zZWN0b3JzICogNjU1MzYgPCBzaXplKSAqY2x1c3Rlcl9zZWN0b3JzICo9IDI7CiAgICAgKmZyZWVfY2x1c3RlcnMgICA9IGF2YWlsYWJsZS8gKmNsdXN0ZXJfc2VjdG9yczsKICAgICAqdG90YWxfY2x1c3RlcnMgID0gc2l6ZS8gKmNsdXN0ZXJfc2VjdG9yczsKICAgICByZXR1cm4gVFJVRTsKQEAgLTY5NCw4ICs3MDEsNyBAQAogICAgIHsKICAgICAgICAgaWYgKChyb290WzFdKSAmJiAoKHJvb3RbMV0gIT0gJzonKSB8fCAocm9vdFsyXSAhPSAnXFwnKSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkdldERpc2tGcmVlU3BhY2VFeEE6IGludmFsaWQgcm9vdCAnJXMnXG4iLAotCQkgICAgIHJvb3QgKTsKKyAgICAgICAgICAgIFdBUk4oZG9zZnMsICJpbnZhbGlkIHJvb3QgJyVzJ1xuIiwgcm9vdCApOwogICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGRyaXZlID0gdG91cHBlcihyb290WzBdKSAtICdBJzsKQEAgLTc1NSw3ICs3NjEsNyBAQAogICAgIFRSQUNFKGRvc2ZzLCAiKCVzKVxuIiwgcm9vdCApOwogICAgIGlmICgocm9vdFsxXSkgJiYgKHJvb3RbMV0gIT0gJzonKSkKICAgICB7Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkdldERyaXZlVHlwZTMyQTogaW52YWxpZCByb290ICclcydcbiIsIHJvb3QgKTsKKyAgICAgICAgV0FSTihkb3NmcywgImludmFsaWQgcm9vdCAnJXMnXG4iLCByb290ICk7CiAgICAgICAgIHJldHVybiBEUklWRV9ET0VTTk9URVhJU1Q7CiAgICAgfQogICAgIHN3aXRjaChEUklWRV9HZXRUeXBlKHRvdXBwZXIocm9vdFswXSkgLSAnQScpKQpAQCAtOTQ5LDcgKzk1NSw3IEBACiAgICAgewogICAgICAgICBpZiAoKHJvb3RbMV0pICYmIChyb290WzFdICE9ICc6JykpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkdldFZvbHVtZUluZm9ybWF0aW9uOiBpbnZhbGlkIHJvb3QgJyVzJ1xuIixyb290KTsKKyAgICAgICAgICAgIFdBUk4oZG9zZnMsICJpbnZhbGlkIHJvb3QgJyVzJ1xuIixyb290KTsKICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgfQogICAgICAgICBkcml2ZSA9IHRvdXBwZXIocm9vdFswXSkgLSAnQSc7CmRpZmYgLS1naXQgYS9maWxlcy9maWxlLmMgYi9maWxlcy9maWxlLmMKaW5kZXggMWQ2Yjk3ZS4uNzIxZjExYSAxMDA2NDQKLS0tIGEvZmlsZXMvZmlsZS5jCisrKyBiL2ZpbGVzL2ZpbGUuYwpAQCAtODksOCArODksOSBAQAogICAgICgqZmlsZSktPnVuaXhfbmFtZSA9IE5VTEw7CiAgICAgKCpmaWxlKS0+dHlwZSA9IEZJTEVfVFlQRV9ESVNLOwogCi0gICAgaGFuZGxlID0gSEFORExFX0FsbG9jKCAmKCpmaWxlKS0+aGVhZGVyLCBGSUxFX0FMTF9BQ0NFU1MgfCBHRU5FUklDX1JFQUQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19XUklURSB8IEdFTkVSSUNfRVhFQ1VURSAvKkZJWE1FKi8sIEZBTFNFICk7CisgICAgaGFuZGxlID0gSEFORExFX0FsbG9jKCBQUk9DRVNTX0N1cnJlbnQoKSwgJigqZmlsZSktPmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfQUxMX0FDQ0VTUyB8IEdFTkVSSUNfUkVBRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1dSSVRFIHwgR0VORVJJQ19FWEVDVVRFIC8qRklYTUUqLywgVFJVRSApOwogICAgIC8qIElmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZCwgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGRlc3Ryb3llZCAqLwogICAgIGlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikgKmZpbGUgPSBOVUxMOwogICAgIHJldHVybiBoYW5kbGU7CkBAIC0xODcsNyArMTg4LDggQEAKICAqLwogc3RhdGljIEZJTEVfT0JKRUNUICpGSUxFX0dldEZpbGUoIEhGSUxFMzIgaGFuZGxlICkKIHsKLSAgICByZXR1cm4gKEZJTEVfT0JKRUNUICopSEFORExFX0dldE9ialB0ciggaGFuZGxlLCBLMzJPQkpfRklMRSwgMCAvKkZJWE1FKi8gKTsKKyAgICByZXR1cm4gKEZJTEVfT0JKRUNUICopSEFORExFX0dldE9ialB0ciggUFJPQ0VTU19DdXJyZW50KCksIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX0ZJTEUsIDAgLypGSVhNRSovICk7CiB9CiAKIApAQCAtMzU5LDcgKzM2MSw3IEBACiAJCXJldHVybiByZXQ7CiAKIAkvKiBEbyBub3Qgc2lsZW5jZSB0aGlzIHBsZWFzZS4gSXQgaXMgYSBjcml0aWNhbCBlcnJvci4gLU1NICovCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRklMRV9PcGVuOiBDb3VsZG4ndCBvcGVuIGRldmljZSAnJXMnIVxuIixwYXRoKTsKKyAgICAgICAgRVJSKGZpbGUsICJDb3VsZG4ndCBvcGVuIGRldmljZSAnJXMnIVxuIixwYXRoKTsKICAgICAgICAgRE9TX0VSUk9SKCBFUl9GaWxlTm90Rm91bmQsIEVDX05vdEZvdW5kLCBTQV9BYm9ydCwgRUxfRGlzayApOwogICAgICAgICByZXR1cm4gSEZJTEVfRVJST1IzMjsKIAkKQEAgLTM4OSw3ICszOTEsNyBAQAogCiAgICAgaWYgKERPU0ZTX0lzRGV2aWNlKCBwYXRoICkpCiAgICAgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZJTEVfQ3JlYXRlOiBjYW5ub3QgY3JlYXRlIERPUyBkZXZpY2UgJyVzJyFcbiIsIHBhdGgpOworICAgICAgICBXQVJOKGZpbGUsICJjYW5ub3QgY3JlYXRlIERPUyBkZXZpY2UgJyVzJyFcbiIsIHBhdGgpOwogICAgICAgICBET1NfRVJST1IoIEVSX0FjY2Vzc0RlbmllZCwgRUNfTm90Rm91bmQsIFNBX0Fib3J0LCBFTF9EaXNrICk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTMyOwogICAgIH0KQEAgLTU3OSwxMyArNTgxLDEyIEBACiAgKi8KIEhGSUxFMzIgRklMRV9EdXAoIEhGSUxFMzIgaEZpbGUgKQogewotICAgIEZJTEVfT0JKRUNUICpmaWxlOwogICAgIEhGSUxFMzIgaGFuZGxlOwogCiAgICAgVFJBQ0UoZmlsZSwgIkZJTEVfRHVwIGZvciBoYW5kbGUgJWRcbiIsIGhGaWxlICk7Ci0gICAgaWYgKCEoZmlsZSA9IEZJTEVfR2V0RmlsZSggaEZpbGUgKSkpIHJldHVybiBIRklMRV9FUlJPUjMyOwotICAgIGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggJmZpbGUtPmhlYWRlciwgRklMRV9BTExfQUNDRVNTIC8qRklYTUUqLywgRkFMU0UgKTsKLSAgICBGSUxFX1JlbGVhc2VGaWxlKCBmaWxlICk7CisgICAgaWYgKCFEdXBsaWNhdGVIYW5kbGUoIEdldEN1cnJlbnRQcm9jZXNzKCksIGhGaWxlLCBHZXRDdXJyZW50UHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlLCBGSUxFX0FMTF9BQ0NFU1MgLyogRklYTUUgKi8sIEZBTFNFLCAwICkpCisgICAgICAgIGhhbmRsZSA9IEhGSUxFX0VSUk9SMzI7CiAgICAgVFJBQ0UoZmlsZSwgIkZJTEVfRHVwIHJldHVybiBoYW5kbGUgJWRcbiIsIGhhbmRsZSApOwogICAgIHJldHVybiBoYW5kbGU7CiB9CkBAIC02MDMsNyArNjA0LDggQEAKICAgICBUUkFDRShmaWxlLCAiRklMRV9EdXAyIGZvciBoYW5kbGUgJWRcbiIsIGhGaWxlMSApOwogICAgIC8qIEZJWE1FOiBzaG91bGQgdXNlIER1cGxpY2F0ZUhhbmRsZSAqLwogICAgIGlmICghKGZpbGUgPSBGSUxFX0dldEZpbGUoIGhGaWxlMSApKSkgcmV0dXJuIEhGSUxFX0VSUk9SMzI7Ci0gICAgaWYgKCFIQU5ETEVfU2V0T2JqUHRyKCBoRmlsZTIsICZmaWxlLT5oZWFkZXIsIDAgKSkgaEZpbGUyID0gSEZJTEVfRVJST1IzMjsKKyAgICBpZiAoIUhBTkRMRV9TZXRPYmpQdHIoIFBST0NFU1NfQ3VycmVudCgpLCBoRmlsZTIsICZmaWxlLT5oZWFkZXIsIDAgKSkKKyAgICAgICAgaEZpbGUyID0gSEZJTEVfRVJST1IzMjsKICAgICBGSUxFX1JlbGVhc2VGaWxlKCBmaWxlICk7CiAgICAgcmV0dXJuIGhGaWxlMjsKIH0KQEAgLTYyNCw4ICs2MjYsNyBAQAogICAgICAgICAhRFJJVkVfSXNWYWxpZCggdG91cHBlcihkcml2ZSAmIH5URl9GT1JDRURSSVZFKSAtICdBJyApKQogICAgIHsKICAgICAgICAgZHJpdmUgJj0gflRGX0ZPUkNFRFJJVkU7Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IEdldFRlbXBGaWxlTmFtZTogaW52YWxpZCBkcml2ZSAlZCBzcGVjaWZpZWRcbiIsCi0gICAgICAgICAgICAgICAgIGRyaXZlICk7CisgICAgICAgIFdBUk4oZmlsZSwgImludmFsaWQgZHJpdmUgJWQgc3BlY2lmaWVkXG4iLCBkcml2ZSApOwogICAgIH0KIAogICAgIGlmIChkcml2ZSAmIFRGX0ZPUkNFRFJJVkUpCkBAIC02OTEsMTAgKzY5Miw4IEBACiAgICAgICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgd3JpdGUgYWNjZXNzIGluIHRoZSBkaXJlY3RvcnkgKi8KICAgICAgICAgaWYgKChwID0gc3RycmNociggZnVsbF9uYW1lLmxvbmdfbmFtZSwgJy8nICkpKSAqcCA9ICdcMCc7CiAgICAgICAgIGlmIChhY2Nlc3MoIGZ1bGxfbmFtZS5sb25nX25hbWUsIFdfT0sgKSA9PSAtMSkKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwKLSAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiBHZXRUZW1wRmlsZU5hbWUgcmV0dXJucyAnJXMnLCB3aGljaCBkb2Vzbid0IHNlZW0gdG8gYmUgd3JpdGVhYmxlLlxuIgotICAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZSBpZiB0aGlzIGdlbmVyYXRlcyBhIGZhaWx1cmUuXG4iLAotICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKTsKKyAgICAgICAgICAgIFdBUk4oZmlsZSwgInJldHVybnMgJyVzJywgd2hpY2ggZG9lc24ndCBzZWVtIHRvIGJlIHdyaXRlYWJsZS5cbiIsCisJCSBidWZmZXIpOwogICAgIH0KICAgICBUUkFDRShmaWxlLCAicmV0dXJuaW5nICVzXG4iLCBidWZmZXIgKTsKICAgICByZXR1cm4gdW5pcXVlID8gdW5pcXVlIDogbnVtOwpAQCAtNzQ1LDggKzc0NCw3IEBACiAgICAgaWYgKG1vZGUgJiBPRl9SRU9QRU4pIG5hbWUgPSBvZnMtPnN6UGF0aE5hbWU7CiAKICAgICBpZiAoIW5hbWUpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBGSUxFX0RvT3BlbkZpbGUoKSBjYWxsZWQgd2l0aCBgbmFtZScgc2V0IHRvIE5VTEwgISBQbGVhc2UgZGVidWcuXG4iKTsKLSAKKwlFUlIoZmlsZSwgImNhbGxlZCB3aXRoIGBuYW1lJyBzZXQgdG8gTlVMTCAhIFBsZWFzZSBkZWJ1Zy5cbiIpOwogCXJldHVybiBIRklMRV9FUlJPUjMyOwogICAgIH0KIApAQCAtOTMwLDcgKzkyOCw4IEBACiAgICAgQk9PTDMyIHJlc3VsdCA9IEZBTFNFOwogCiAgICAgVFJBQ0UoIGZpbGUsICIlZCAlcCAlZFxuIiwgaGFuZGxlLCBidWZmZXIsIGNvdW50KTsKLSAgICBpZiAoIShwdHIgPSBIQU5ETEVfR2V0T2JqUHRyKCBoYW5kbGUsIEszMk9CSl9VTktOT1dOLCAwKSkpIHJldHVybiAtMTsKKyAgICBpZiAoIShwdHIgPSBIQU5ETEVfR2V0T2JqUHRyKCBQUk9DRVNTX0N1cnJlbnQoKSwgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9VTktOT1dOLCAwKSkpIHJldHVybiAtMTsKICAgICBpZiAoSzMyT0JKX09QUyhwdHIpLT5yZWFkKQogICAgICAgICByZXN1bHQgPSBLMzJPQkpfT1BTKHB0ciktPnJlYWQocHRyLCBidWZmZXIsIGNvdW50LCAmbnVtV3JpdHRlbiwgTlVMTCk7CiAgICAgSzMyT0JKX0RlY0NvdW50KCBwdHIgKTsKQEAgLTk5MiwxMiArOTkxLDEyIEBACiAKICAgICBpZiAoaGlnaHdvcmQgJiYgKmhpZ2h3b3JkKQogICAgIHsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiU2V0RmlsZVBvaW50ZXI6IDY0LWJpdCBvZmZzZXRzIG5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKKyAgICAgICAgRklYTUUoZmlsZSwgIjY0LWJpdCBvZmZzZXRzIG5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKICAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiApOwogICAgICAgICByZXR1cm4gMHhmZmZmZmZmZjsKICAgICB9CiAgICAgVFJBQ0UoZmlsZSwgImhhbmRsZSAlZCBvZmZzZXQgJWxkIG9yaWdpbiAlbGRcbiIsCi0gICAgICAgICAgICAgICAgICBoRmlsZSwgZGlzdGFuY2UsIG1ldGhvZCApOworCSAgaEZpbGUsIGRpc3RhbmNlLCBtZXRob2QgKTsKIAogICAgIGlmICghKGZpbGUgPSBGSUxFX0dldEZpbGUoIGhGaWxlICkpKSByZXR1cm4gMHhmZmZmZmZmZjsKICAgICBzd2l0Y2gobWV0aG9kKQpAQCAtMTE0Myw3ICsxMTQyLDggQEAKIAkJfQogCX0KIAkKLQlpZiAoIShpb3B0ciA9IEhBTkRMRV9HZXRPYmpQdHIoIGhhbmRsZSwgSzMyT0JKX1VOS05PV04sIDAgKSkpCisJaWYgKCEoaW9wdHIgPSBIQU5ETEVfR2V0T2JqUHRyKCBQUk9DRVNTX0N1cnJlbnQoKSwgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9VTktOT1dOLCAwICkpKQogICAgICAgICAgICAgcmV0dXJuIEhGSUxFX0VSUk9SMzI7CiAgICAgICAgIGlmIChLMzJPQkpfT1BTKGlvcHRyKS0+d3JpdGUpCiAgICAgICAgICAgICBzdGF0dXMgPSBLMzJPQkpfT1BTKGlvcHRyKS0+d3JpdGUoaW9wdHIsIGJ1ZmZlciwgY291bnQsICZyZXN1bHQsIE5VTEwpOwpAQCAtMTI3Niw3ICsxMjc2LDcgQEAKIAogICAgIGlmIChET1NGU19Jc0RldmljZSggcGF0aCApKQogICAgIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJEZWxldGVGaWxlOiBjYW5ub3QgcmVtb3ZlIERPUyBkZXZpY2UgJyVzJyFcbiIsIHBhdGgpOworICAgICAgICBXQVJOKGZpbGUsICJjYW5ub3QgcmVtb3ZlIERPUyBkZXZpY2UgJyVzJyFcbiIsIHBhdGgpOwogICAgICAgICBET1NfRVJST1IoIEVSX0ZpbGVOb3RGb3VuZCwgRUNfTm90Rm91bmQsIFNBX0Fib3J0LCBFTF9EaXNrICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CkBAIC0xMzQ3LDcgKzEzNDcsNyBAQAogICAgIExQVk9JRCByZXQ7CiAKICAgICBpZiAoc2l6ZV9oaWdoIHx8IG9mZnNldF9oaWdoKQotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJGSUxFX21tYXA6IG9mZnNldHMgbGFyZ2VyIHRoYW4gNEdiIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICBGSVhNRShmaWxlLCAib2Zmc2V0cyBsYXJnZXIgdGhhbiA0R2Igbm90IHN1cHBvcnRlZFxuIik7CiAKICAgICBpZiAoIWZpbGUpCiAgICAgewpAQCAtMTQyMCw3ICsxNDIwLDcgQEAKIGludCBGSUxFX211bm1hcCggTFBWT0lEIHN0YXJ0LCBEV09SRCBzaXplX2hpZ2gsIERXT1JEIHNpemVfbG93ICkKIHsKICAgICBpZiAoc2l6ZV9oaWdoKQotICAgICAgZnByaW50Ziggc3RkZXJyLCAiRklMRV9tdW5tYXA6IG9mZnNldHMgbGFyZ2VyIHRoYW4gNEdiIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgRklYTUUoZmlsZSwgIm9mZnNldHMgbGFyZ2VyIHRoYW4gNEdiIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgIHJldHVybiBtdW5tYXAoIHN0YXJ0LCBzaXplX2xvdyApOwogfQogCkBAIC0xNDcwLDggKzE0NzAsNyBAQAogICAgIGVsc2UgLyogZm4yID09IE5VTEwgbWVhbnMgZGVsZXRlIHNvdXJjZSAqLwogICAgICAgaWYgKGZsYWcgJiBNT1ZFRklMRV9ERUxBWV9VTlRJTF9SRUJPT1QpIHsKIAlpZiAoZmxhZyAmIE1PVkVGSUxFX0NPUFlfQUxMT1dFRCkgeyAgCi0JICBmcHJpbnRmKCBzdGRlcnIsCi0JCSAgICJNb3ZlRmlsZUV4MzJBOiBJbGxlZ2FsIGZsYWdcbiIpOworCSAgV0FSTihmaWxlLCAiSWxsZWdhbCBmbGFnXG4iKTsKIAkgIERPU19FUlJPUiggRVJfR2VuZXJhbEZhaWx1cmUsIEVDX1N5c3RlbUZhaWx1cmUsIFNBX0Fib3J0LAogCQkgICAgIEVMX1Vua25vd24gKTsKIAkgIHJldHVybiBGQUxTRTsKQEAgLTE0ODAsMTEgKzE0NzksOCBAQAogCSAgIFBlcmhhcHMgd2Ugc2hvdWxkIHF1ZXVlIHRoZXNlIGNvbW1hbmQgYW5kIGV4ZWN1dGUgaXQgCiAJICAgd2hlbiBleGl0aW5nLi4uIFdoYXQgYWJvdXQgdXNpbmcgb25fZXhpdCgyKQogCSAgICovCi0JZnByaW50Ziggc3RkZXJyLCJNb3ZlRmlsZUV4MzJBOiBQbGVhc2UgZGVsZXRlIGZpbGUgJXNcbiIsCi0JCSBmdWxsX25hbWUxLmxvbmdfbmFtZSk7Ci0JZnByaW50Ziggc3RkZXJyLCIgICAgICAgICAgICAgICB3aGVuIFdpbmUgaGFzIGZpbmlzaGVkXG4iKTsKLQlmcHJpbnRmKCBzdGRlcnIsIiAgICAgICAgICAgICAgIGxpa2UgXCJybSAlc1wiXG4iLAotCQkgZnVsbF9uYW1lMS5sb25nX25hbWUpOworCUZJWE1FKGZpbGUsICJQbGVhc2UgZGVsZXRlIGZpbGUgJyVzJyB3aGVuIFdpbmUgaGFzIGZpbmlzaGVkXG4iLAorCSAgICAgIGZ1bGxfbmFtZTEubG9uZ19uYW1lKTsKIAlyZXR1cm4gVFJVRTsKICAgICAgIH0KICAgICAgIGVsc2UgaWYgKHVubGluayggZnVsbF9uYW1lMS5sb25nX25hbWUgKSA9PSAtMSkKQEAgLTE0OTksMTMgKzE0OTUsOSBAQAogCSAgIFBlcmhhcHMgd2Ugc2hvdWxkIHF1ZXVlIHRoZXNlIGNvbW1hbmQgYW5kIGV4ZWN1dGUgaXQgCiAJICAgd2hlbiBleGl0aW5nLi4uIFdoYXQgYWJvdXQgdXNpbmcgb25fZXhpdCgyKQogCSAgICovCi0JZnByaW50Ziggc3RkZXJyLCJNb3ZlRmlsZUV4MzJBOiBQbGVhc2UgbW92ZSBleGlzdGluZyBmaWxlICVzXG4iCi0JCSAsZnVsbF9uYW1lMS5sb25nX25hbWUpOwotCWZwcmludGYoIHN0ZGVyciwiICAgICAgICAgICAgICAgdG8gZmlsZSAlc1xuIgotCQkgLGZ1bGxfbmFtZTIubG9uZ19uYW1lKTsKLQlmcHJpbnRmKCBzdGRlcnIsIiAgICAgICAgICAgICAgIHdoZW4gV2luZSBoYXMgZmluaXNoZWRcbiIpOwotCWZwcmludGYoIHN0ZGVyciwiICAgICAgICAgICAgICAgbGlrZSBcIiBtdiAlcyAlc1wiXG4iLAotCQkgZnVsbF9uYW1lMS5sb25nX25hbWUsZnVsbF9uYW1lMi5sb25nX25hbWUpOworCUZJWE1FKGZpbGUsIlBsZWFzZSBtb3ZlIGV4aXN0aW5nIGZpbGUgJyVzJyB0byBmaWxlICclcyciCisJICAgICAgIndoZW4gV2luZSBoYXMgZmluaXNoZWRcbiIsIAorCSAgICAgIGZ1bGxfbmFtZTEubG9uZ19uYW1lLCBmdWxsX25hbWUyLmxvbmdfbmFtZSk7CiAJcmV0dXJuIFRSVUU7CiAgICAgfQogCmRpZmYgLS1naXQgYS9maWxlcy9wcm9maWxlLmMgYi9maWxlcy9wcm9maWxlLmMKaW5kZXggMjllMmYwNi4uMTIzYWI5MSAxMDA2NDQKLS0tIGEvZmlsZXMvcHJvZmlsZS5jCisrKyBiL2ZpbGVzL3Byb2ZpbGUuYwpAQCAtMTg0LDggKzE4NCw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghKHAyID0gc3RycmNociggcCwgJ10nICkpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlBST0ZJTEVfTG9hZDogSW52YWxpZCBzZWN0aW9uIGhlYWRlciBhdCBsaW5lICVkOiAnJXMnXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIHAgKTsKKyAgICAgICAgICAgICAgICBXQVJOKHByb2ZpbGUsICJJbnZhbGlkIHNlY3Rpb24gaGVhZGVyIGF0IGxpbmUgJWQ6ICclcydcbiIsCisJCSAgICAgbGluZSwgcCApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewpAQCAtMzUyLDEzICszNTIsMTEgQEAKICAgICAKICAgICBpZiAoIWZpbGUpCiAgICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBjb3VsZCBub3Qgc2F2ZSBwcm9maWxlIGZpbGUgJXNcbiIsCi0gICAgICAgICAgICAgICAgIEN1clByb2ZpbGUuZG9zX25hbWUgKTsKKyAgICAgICAgV0FSTihwcm9maWxlLCAiY291bGQgbm90IHNhdmUgcHJvZmlsZSBmaWxlICVzXG4iLCBDdXJQcm9maWxlLmRvc19uYW1lKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAotICAgIFRSQUNFKHByb2ZpbGUsICJTYXZpbmcgJyVzJyBpbnRvICclcydcbiIsCi0gICAgICAgICAgICAgICAgICAgICBDdXJQcm9maWxlLmRvc19uYW1lLCB1bml4X25hbWUgKTsKKyAgICBUUkFDRShwcm9maWxlLCAiU2F2aW5nICclcycgaW50byAnJXMnXG4iLCBDdXJQcm9maWxlLmRvc19uYW1lLCB1bml4X25hbWUgKTsKICAgICBQUk9GSUxFX1NhdmUoIGZpbGUsIEN1clByb2ZpbGUuc2VjdGlvbiApOwogICAgIGZjbG9zZSggZmlsZSApOwogICAgIEN1clByb2ZpbGUuY2hhbmdlZCA9IEZBTFNFOwpAQCAtNDUyLDcgKzQ1MCw3IEBACiAgICAgZWxzZQogICAgIHsKICAgICAgICAgLyogRG9lcyBub3QgZXhpc3QgeWV0LCB3ZSB3aWxsIGNyZWF0ZSBpdCBpbiBQUk9GSUxFX0ZsdXNoRmlsZSAqLwotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBwcm9maWxlIGZpbGUgJXMgbm90IGZvdW5kXG4iLCBuZXdkb3NfbmFtZSApOworICAgICAgICBXQVJOKHByb2ZpbGUsICJwcm9maWxlIGZpbGUgJXMgbm90IGZvdW5kXG4iLCBuZXdkb3NfbmFtZSApOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTQ3OSw2ICs0NzcsMTMgQEAKICAgICAgICAgICAgICAgICBQUk9GSUxFX0NvcHlFbnRyeSggYnVmZmVyLCBrZXktPm5hbWUsIGxlbiAtIDEsIGhhbmRsZV9lbnYgKTsKICAgICAgICAgICAgICAgICBsZW4gLT0gc3RybGVuKGJ1ZmZlcikgKyAxOwogICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBzdHJsZW4oYnVmZmVyKSArIDE7CisgICAgICAgICAgICAgICAgaWYgKGtleS0+dmFsdWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBidWZmZXJbLTFdID0gJz0nOworICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX0NvcHlFbnRyeShidWZmZXIsIGtleS0+dmFsdWUsIGxlbiAtIDEsIGhhbmRsZV9lbnYpOworICAgICAgICAgICAgICAgICAgICBsZW4gLT0gc3RybGVuKGJ1ZmZlcikgKyAxOyAKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyICs9IHN0cmxlbihidWZmZXIpICsgMTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqYnVmZmVyID0gJ1wwJzsKICAgICAgICAgICAgIHJldHVybiBvbGRsZW4gLSBsZW4gKyAxOwpAQCAtNzM4LDcgKzc0Myw3IEBACiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgfQogICAgIH0KLSAgICBlbHNlIGZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IGNvdWxkIG5vdCBnZXQgJEhPTUUgdmFsdWUgZm9yIGNvbmZpZyBmaWxlLlxuIiApOworICAgIGVsc2UgV0FSTihwcm9maWxlLCAiY291bGQgbm90IGdldCAkSE9NRSB2YWx1ZSBmb3IgY29uZmlnIGZpbGUuXG4iICk7CiAKICAgICAvKiBUcnkgZ2xvYmFsIGZpbGUgKi8KIApAQCAtNzQ4LDggKzc1Myw4IEBACiAgICAgICAgIGZjbG9zZSggZiApOwogICAgICAgICByZXR1cm4gMTsKICAgICB9Ci0gICAgZnByaW50Ziggc3RkZXJyLCAiQ2FuJ3Qgb3BlbiBjb25maWd1cmF0aW9uIGZpbGUgJXMgb3IgJEhPTUUlc1xuIiwKLSAgICAgICAgICAgICBXSU5FX0lOSV9HTE9CQUwsIFBST0ZJTEVfV2luZUluaU5hbWUgKTsKKyAgICBXQVJOKHByb2ZpbGUsICJDYW4ndCBvcGVuIGNvbmZpZ3VyYXRpb24gZmlsZSAlcyBvciAkSE9NRSVzXG4iLAorCSBXSU5FX0lOSV9HTE9CQUwsIFBST0ZJTEVfV2luZUluaU5hbWUgKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvcGFpbnRpbmcuYyBiL2dyYXBoaWNzL3BhaW50aW5nLmMKaW5kZXggYjZhYzdkOC4uYjM0MzAyMyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvcGFpbnRpbmcuYworKysgYi9ncmFwaGljcy9wYWludGluZy5jCkBAIC0yNjcsNyArMjY3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBGaWxsUmVjdDMyICAgIChVU0VSMzIuMTk2KQorICogICAgICAgICAgIEZpbGxSZWN0MzIgICAgKFVTRVIzMi4xOTcpCiAgKi8KIElOVDMyIFdJTkFQSSBGaWxsUmVjdDMyKCBIREMzMiBoZGMsIGNvbnN0IFJFQ1QzMiAqcmVjdCwgSEJSVVNIMzIgaGJydXNoICkKIHsKQEAgLTI5Miw3ICsyOTIsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEludmVydFJlY3QzMiAgICAoVVNFUjMyLjMyOSkKKyAqICAgICAgICAgICBJbnZlcnRSZWN0MzIgICAgKFVTRVIzMi4zMzApCiAgKi8KIHZvaWQgV0lOQVBJIEludmVydFJlY3QzMiggSERDMzIgaGRjLCBjb25zdCBSRUNUMzIgKnJlY3QgKQogewpAQCAtMzM3LDcgKzMzNyw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRnJhbWVSZWN0MzIgICAgKFVTRVIzMi4yMDIpCisgKiAgICAgICAgICAgRnJhbWVSZWN0MzIgICAgKFVTRVIzMi4yMDMpCiAgKi8KIElOVDMyIFdJTkFQSSBGcmFtZVJlY3QzMiggSERDMzIgaGRjLCBjb25zdCBSRUNUMzIgKnJlY3QsIEhCUlVTSDMyIGhicnVzaCApCiB7CkBAIC01MTAsNyArNTEwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBEcmF3Rm9jdXNSZWN0MzIgICAgKFVTRVIzMi4xNTUpCisgKiAgICAgICAgICAgRHJhd0ZvY3VzUmVjdDMyICAgIChVU0VSMzIuMTU2KQogICoKICAqIEZJWE1FOiBQYXRCbHQoUEFUSU5WRVJUKSB3aXRoIGJhY2tncm91bmQgYnJ1c2guCiAgKi8KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L3BydGRydi5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmMKaW5kZXggYjdmZTVmZi4uOWE3YmRlMSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvcHJ0ZHJ2LmMKQEAgLTI2LDcgKzI2LDcgQEAKIHN0YXRpYyB2b2lkIEdldFByaW50ZXJEcml2ZXJGdW5jdGlvbnMoSElOU1RBTkNFMTYgaEluc3QsIExPQURFRF9QUklOVEVSX0RSSVZFUiAqcExQRCkKIHsKICNkZWZpbmUgTG9hZFByaW50ZXJEcnZGdW5jKEEpIHBMUEQtPmZuW0ZVTkNfIyNBXSA9IFwKLSAgICAgIEdldFByb2NBZGRyZXNzMTYoaEluc3QsIE1BS0VJTlRSRVNPVVJDRShPUkRfIyNBKSkKKyAgICAgIEdldFByb2NBZGRyZXNzMTYoaEluc3QsIE1BS0VJTlRSRVNPVVJDRTE2KE9SRF8jI0EpKQogCiAgICAgICBMb2FkUHJpbnRlckRydkZ1bmMoQklUQkxUKTsKICAgICAgIExvYWRQcmludGVyRHJ2RnVuYyhDT0xPUklORk8pOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L2dyYXBoaWNzLmMgYi9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYwppbmRleCAwODNjNmJhLi5iYThlYzhhIDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYworKysgYi9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYwpAQCAtNSw4ICs1LDggQEAKICAqLwogCiAjaW5jbHVkZSA8bWF0aC5oPgotI2lmIGRlZmluZWQoX19FTVhfXykKLSNpbmNsdWRlIDxmbG9hdC5oPgorI2lmZGVmIEhBVkVfRkxPQVRfSAorIyBpbmNsdWRlIDxmbG9hdC5oPgogI2VuZGlmCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAidHNfeGxpYi5oIgpAQCAtOTIsMTcgKzkyLDMyIEBACiAgICAgeWVuZCAgID0gWUxQVE9EUCggZGMsIHllbmQgKTsKICAgICBpZiAoKGxlZnQgPT0gcmlnaHQpIHx8ICh0b3AgPT0gYm90dG9tKSkgcmV0dXJuIEZBTFNFOwogCisgICAgaWYgKGxlZnQgPiByaWdodCkgeyB0bXA9bGVmdDsgbGVmdD1yaWdodDsgcmlnaHQ9dG1wOyB9CisgICAgaWYgKHRvcCA+IGJvdHRvbSkgeyB0bXA9dG9wOyB0b3A9Ym90dG9tOyBib3R0b209dG1wOyB9IAogICAgIHhjZW50ZXIgPSAocmlnaHQgKyBsZWZ0KSAvIDI7CiAgICAgeWNlbnRlciA9IChib3R0b20gKyB0b3ApIC8gMjsKICAgICBzdGFydF9hbmdsZSA9IGF0YW4yKCAoZG91YmxlKSh5Y2VudGVyLXlzdGFydCkqKHJpZ2h0LWxlZnQpLAogCQkJIChkb3VibGUpKHhzdGFydC14Y2VudGVyKSooYm90dG9tLXRvcCkgKTsKICAgICBlbmRfYW5nbGUgICA9IGF0YW4yKCAoZG91YmxlKSh5Y2VudGVyLXllbmQpKihyaWdodC1sZWZ0KSwKIAkJCSAoZG91YmxlKSh4ZW5kLXhjZW50ZXIpKihib3R0b20tdG9wKSApOworICAgIGlmICgoeHN0YXJ0PT14ZW5kKSYmKHlzdGFydD09eWVuZCkpCisgICAgICB7IC8qIEEgbGF6eSBwcm9ncmFtIGRlbGl2ZXJzIHhzdGFydD14ZW5kPXlzdGFydD15ZW5kPTApICovCisJc3RhcnRfYW5nbGUgPSAwOworCWVuZF9hbmdsZSA9IDIqIFBJOworICAgICAgfQorICAgIGVsc2UgLyogbm90b3Jpb3VzIGNhc2VzICovCisgICAgICBpZiAoKHN0YXJ0X2FuZ2xlID09IFBJKSYmKCBlbmRfYW5nbGUgPDApKQorCXN0YXJ0X2FuZ2xlID0gLSBQSTsKKyAgICBlbHNlCisgICAgICBpZiAoKGVuZF9hbmdsZSA9PSBQSSkmJiggc3RhcnRfYW5nbGUgPDApKQorCWVuZF9hbmdsZSA9IC0gUEk7CiAgICAgaXN0YXJ0X2FuZ2xlID0gKElOVDMyKShzdGFydF9hbmdsZSAqIDE4MCAqIDY0IC8gUEkpOwogICAgIGlkaWZmX2FuZ2xlICA9IChJTlQzMikoKGVuZF9hbmdsZSAtIHN0YXJ0X2FuZ2xlKSAqIDE4MCAqIDY0IC8gUEkgKTsKLSAgICBpZiAoaWRpZmZfYW5nbGUgPD0gMCkgaWRpZmZfYW5nbGUgKz0gMzYwICogNjQ7Ci0gICAgaWYgKGxlZnQgPiByaWdodCkgeyB0bXA9bGVmdDsgbGVmdD1yaWdodDsgcmlnaHQ9dG1wOyB9Ci0gICAgaWYgKHRvcCA+IGJvdHRvbSkgeyB0bXA9dG9wOyB0b3A9Ym90dG9tOyBib3R0b209dG1wOyB9CisgICAgaWYgKGlkaWZmX2FuZ2xlIDwgMCkgCisgICAgICB7CisJaXN0YXJ0X2FuZ2xlKz0gaWRpZmZfYW5nbGU7CisJaWRpZmZfYW5nbGUgPSBhYnMoaWRpZmZfYW5nbGUpOworICAgICAgfQogCiAgICAgICAvKiBGaWxsIGFyYyB3aXRoIGJydXNoIGlmIENob3JkKCkgb3IgUGllKCkgKi8KIApAQCAtMjI3LDEyICsyNDIsMTQgQEAKIAogICAgIGlmICgobGVmdCA9PSByaWdodCkgfHwgKHRvcCA9PSBib3R0b20pKQogICAgIHsKKyNpZiAwCiAJaWYgKERDX1NldHVwR0NGb3JQZW4oIGRjICkpCiAJICAgIFRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIAogCQkgIGRjLT53LkRDT3JnWCArIGxlZnQsCiAJCSAgZGMtPncuRENPcmdZICsgdG9wLAogCQkgIGRjLT53LkRDT3JnWCArIHJpZ2h0LAogCQkgIGRjLT53LkRDT3JnWSArIGJvdHRvbSk7CisjZW5kaWYKIAlyZXR1cm4gVFJVRTsKICAgICB9CiAgICAgd2lkdGggPSBkYy0+dS54LnBlbi53aWR0aDsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi90ZXh0LmMgYi9ncmFwaGljcy94MTFkcnYvdGV4dC5jCmluZGV4IGEwNTZkOTUuLmY0YTI0M2MgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi90ZXh0LmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L3RleHQuYwpAQCAtMTMsNiArMTMsNyBAQAogLyojaW5jbHVkZSAiY2FsbGJhY2suaCIqLwogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJ4MTFmb250LmgiCisjaW5jbHVkZSAiZGVidWdzdHIuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAjZGVmaW5lIFNXQVBfSU5UKGEsYikgIHsgaW50IHQgPSBhOyBhID0gYjsgYiA9IHQ7IH0KQEAgLTQzLDEwICs0NCwxNiBAQAogICAgIGxmVW5kZXJsaW5lID0gKHBmby0+Zm9fZmxhZ3MgJiBGT19TWU5USF9VTkRFUkxJTkUpID8gMSA6IDA7CiAgICAgbGZTdHJpa2VPdXQgPSAocGZvLT5mb19mbGFncyAmIEZPX1NZTlRIX1NUUklLRU9VVCkgPyAxIDogMDsKIAotICAgIFRSQUNFKHRleHQsImhkYz0lMDR4IGRmPSUwNHggJWQsJWQgJyUuKnMnLCAlZCAgZmxhZ3M9JWRcbiIsCi0gICAgICAgICAgICAgICAgIGRjLT5oU2VsZiwgKFVJTlQxNikoZGMtPnUueC5mb250KSwgeCwgeSwgKGludCljb3VudCwgc3RyLCBjb3VudCwgZmxhZ3MpOworICAgIFRSQUNFKHRleHQsImhkYz0lMDR4IGRmPSUwNHggJWQsJWQgJXMsICVkICBmbGFncz0lZFxuIiwKKwkgIGRjLT5oU2VsZiwgKFVJTlQxNikoZGMtPnUueC5mb250KSwgeCwgeSwKKwkgIGRlYnVnc3RyX2FuIChzdHIsIGNvdW50KSwgY291bnQsIGZsYWdzKTsKIAotICAgIGlmIChscHJlY3QgIT0gTlVMTCkgVFJBQ0UodGV4dCwgIlx0cmVjdD0oJWQsJWQtICVkLCVkKVxuIiwKKyAgICAvKiBzb21lIHN0cmluZ3Mgc2VudCBoZXJlIGVuZCBpbiBhIG5ld2xpbmUgZm9yIHdoYXRldmVyIHJlYXNvbi4gIEkgaGF2ZSBubworICAgICAgIGNsdWUgd2hhdCB0aGUgcmlnaHQgdHJlYXRtZW50IHNob3VsZCBiZSBpbiBnZW5lcmFsLCBidXQgaWdub3JpbmcKKyAgICAgICB0ZXJtaW5hdGluZyBuZXdsaW5lcyBzZWVtcyBvay4gIE1XLCBBcHJpbCAxOTk4LiAgKi8KKyAgICBpZiAoY291bnQgPiAwICYmIHN0cltjb3VudCAtIDFdID09ICdcbicpIGNvdW50LS07CisKKyAgICBpZiAobHByZWN0ICE9IE5VTEwpIFRSQUNFKHRleHQsICJcdHJlY3Q9KCVkLCVkIC0gJWQsJWQpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwcmVjdC0+bGVmdCwgbHByZWN0LT50b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHByZWN0LT5yaWdodCwgbHByZWN0LT5ib3R0b20gKTsKICAgICAgIC8qIFNldHVwIGNvb3JkaW5hdGVzICovCkBAIC04NSw3ICs5Miw3IEBACiAgICAgeCA9IFhMUFRPRFAoIGRjLCB4ICk7CiAgICAgeSA9IFlMUFRPRFAoIGRjLCB5ICk7CiAKLSAgICBUUkFDRSh0ZXh0LCJcdHJlYWwgY29vcmQ6IHg9JWksIHk9JWksIHJlY3Q9KCVkLCVkLSVkLCVkKVxuIiwKKyAgICBUUkFDRSh0ZXh0LCJcdHJlYWwgY29vcmQ6IHg9JWksIHk9JWksIHJlY3Q9KCVkLCVkIC0gJWQsJWQpXG4iLAogCQkJICB4LCB5LCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CiAKICAgICAgIC8qIERyYXcgdGhlIHJlY3RhbmdsZSAqLwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L3hmb250LmMgYi9ncmFwaGljcy94MTFkcnYveGZvbnQuYwppbmRleCAwMWM1NDdkLi41ODA5M2IwIDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYveGZvbnQuYworKysgYi9ncmFwaGljcy94MTFkcnYveGZvbnQuYwpAQCAtMjEwNSw5ICsyMTA1LDYgQEAKIH0KIAogCi1zdGF0aWMgY2hhciogdGVzdF9zdHJpbmcgPSAiQWJjIERlZiBHaGkgSmtsIE1ubyBQcXIgU3R1IFZ3eCBZeiI7Ci0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgWDExRFJWX0dldFRleHRFeHRlbnRQb2ludAogICovCkBAIC0yMjEzLDcgKzIyMTAsNyBAQAogICovCiBJTlQzMiBXSU5BUEkgQWRkRm9udFJlc291cmNlMzJBKCBMUENTVFIgc3RyICkKIHsKLSAgICBGSVhNRShmb250LCAiKCVzKTogc3R1YlxuIiwgZGVidWdyZXMoc3RyKSk7CisgICAgRklYTUUoZm9udCwgIiglcyk6IHN0dWJcbiIsIGRlYnVncmVzX2Eoc3RyKSk7CiAgICAgcmV0dXJuIDE7CiB9CiAKQEAgLTIyMjMsNyArMjIyMCw3IEBACiAgKi8KIElOVDMyIFdJTkFQSSBBZGRGb250UmVzb3VyY2UzMlcoIExQQ1dTVFIgc3RyICkKIHsKLSAgICBGSVhNRShmb250LCAiKCVwKTogc3R1YlxuIiwgc3RyICk7CisgICAgRklYTUUoZm9udCwgIiglcyk6IHN0dWJcbiIsIGRlYnVncmVzX3coc3RyKSApOwogICAgIHJldHVybiAxOwogfQogCkBAIC0yMjMyLDcgKzIyMjksNyBAQAogICovCiBCT09MMTYgV0lOQVBJIFJlbW92ZUZvbnRSZXNvdXJjZTE2KCBTRUdQVFIgc3RyICkKIHsKLSAgICBGSVhNRShmb250LCAiKCVzKTogc3R1YlxuIiwJZGVidWdyZXMoUFRSX1NFR19UT19MSU4oc3RyKSkpOworICAgIEZJWE1FKGZvbnQsICIoJXMpOiBzdHViXG4iLAlkZWJ1Z3Jlc19hKFBUUl9TRUdfVE9fTElOKHN0cikpKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMjI0Miw3ICsyMjM5LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBSZW1vdmVGb250UmVzb3VyY2UzMkEoIExQQ1NUUiBzdHIgKQogewotICAgIEZJWE1FKGZvbnQsICIoJXMpOiBzdHViXG4iLCBkZWJ1Z3JlcyhzdHIpKTsKKyAgICBGSVhNRShmb250LCAiKCVzKTogc3R1YlxuIiwgZGVidWdyZXNfYShzdHIpKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMjI1Miw3ICsyMjQ5LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBSZW1vdmVGb250UmVzb3VyY2UzMlcoIExQQ1dTVFIgc3RyICkKIHsKLSAgICBGSVhNRShmb250LCAiKCVwKTogc3R1YlxuIiwgc3RyICk7CisgICAgRklYTUUoZm9udCwgIiglcyk6IHN0dWJcbiIsIGRlYnVncmVzX3coc3RyKSApOwogICAgIHJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS9pZjE2MzIvY29tbWRsZy5zcGVjIGIvaWYxNjMyL2NvbW1kbGcuc3BlYwppbmRleCA5ZjhiZTYyLi5hZWM1ZmZkIDEwMDY0NAotLS0gYS9pZjE2MzIvY29tbWRsZy5zcGVjCisrKyBiL2lmMTYzMi9jb21tZGxnLnNwZWMKQEAgLTgsMTAgKzgsMTAgQEAKIDcgICBwYXNjYWwgICBGaWxlU2F2ZURsZ1Byb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgRmlsZVNhdmVEbGdQcm9jCiA4ICAgcGFzY2FsICAgQ29sb3JEbGdQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIENvbG9yRGxnUHJvYwogIzkgICBwYXNjYWwgIExPQURBTFRFUkJJVE1BUCBleHBvcnRlZCwgc2hhcmVkIGRhdGEKLTExICBwYXNjYWwxNiBGaW5kVGV4dChzZWdwdHIpIEZpbmRUZXh0Ci0xMiAgcGFzY2FsMTYgUmVwbGFjZVRleHQoc2VncHRyKSBSZXBsYWNlVGV4dAotMTMgIHBhc2NhbCAgIEZpbmRUZXh0RGxnUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBGaW5kVGV4dERsZ1Byb2MKLTE0ICBwYXNjYWwgICBSZXBsYWNlVGV4dERsZ1Byb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgUmVwbGFjZVRleHREbGdQcm9jCisxMSAgcGFzY2FsMTYgRmluZFRleHQoc2VncHRyKSBGaW5kVGV4dDE2CisxMiAgcGFzY2FsMTYgUmVwbGFjZVRleHQoc2VncHRyKSBSZXBsYWNlVGV4dDE2CisxMyAgcGFzY2FsICAgRmluZFRleHREbGdQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIEZpbmRUZXh0RGxnUHJvYzE2CisxNCAgcGFzY2FsICAgUmVwbGFjZVRleHREbGdQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIFJlcGxhY2VUZXh0RGxnUHJvYzE2CiAxNSAgcGFzY2FsMTYgQ2hvb3NlRm9udChwdHIpIENob29zZUZvbnQKIDE2ICBwYXNjYWwxNiBGb3JtYXRDaGFyRGxnUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBGb3JtYXRDaGFyRGxnUHJvYwogMTggIHBhc2NhbDE2IEZvbnRTdHlsZUVudW1Qcm9jKHB0ciBwdHIgd29yZCBsb25nKSAgIEZvbnRTdHlsZUVudW1Qcm9jCmRpZmYgLS1naXQgYS9pZjE2MzIvZ2RpLnNwZWMgYi9pZjE2MzIvZ2RpLnNwZWMKaW5kZXggMmI2Yzk2Mi4uMDJiYmJlZiAxMDA2NDQKLS0tIGEvaWYxNjMyL2dkaS5zcGVjCisrKyBiL2lmMTYzMi9nZGkuc3BlYwpAQCAtMjE4LDcgKzIxOCw3IEBACiAzMDUgc3R1YiBFTkdJTkVHRVRHTFlQSEJNUAogMzA2IHN0dWIgRU5HSU5FTUFLRUZPTlRESVIKIDMwNyBwYXNjYWwxNiBHZXRDaGFyQUJDV2lkdGhzKHdvcmQgd29yZCB3b3JkIHB0cikgR2V0Q2hhckFCQ1dpZHRoczE2Ci0zMDggc3R1YiBHZXRPdXRMaW5lVGV4dE1ldHJpY3MKKzMwOCBwYXNjYWwgICBHZXRPdXRsaW5lVGV4dE1ldHJpY3Mod29yZCB3b3JkIHB0cikgR2V0T3V0bGluZVRleHRNZXRyaWNzCiAzMDkgcGFzY2FsICAgR2V0R2x5cGhPdXRsaW5lKHdvcmQgd29yZCB3b3JkIHB0ciBsb25nIHB0ciBwdHIpIEdldEdseXBoT3V0bGluZTE2CiAzMTAgcGFzY2FsMTYgQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2Uod29yZCBzdHIgc3RyIHN0cikgQ3JlYXRlU2NhbGFibGVGb250UmVzb3VyY2UxNgogMzExIHN0dWIgR2V0Rm9udERhdGEKZGlmZiAtLWdpdCBhL2lmMTYzMi9rZXJuZWwuc3BlYyBiL2lmMTYzMi9rZXJuZWwuc3BlYwppbmRleCBhYjBlYmRkLi4zZTRhYjlkIDEwMDY0NAotLS0gYS9pZjE2MzIva2VybmVsLnNwZWMKKysrIGIvaWYxNjMyL2tlcm5lbC5zcGVjCkBAIC0yNzgsOCArMjc4LDggQEAKIDM1NSBwYXNjYWwxNiBHZXRXaW5EZWJ1Z0luZm8ocHRyIHdvcmQpIEdldFdpbkRlYnVnSW5mbwogMzU2IHBhc2NhbDE2IFNldFdpbkRlYnVnSW5mbyhwdHIpIFNldFdpbkRlYnVnSW5mbwogMzU3IHN0dWIgS0VSTkVMXzM1NwotMzU4IHBhc2NhbCBLRVJORUxfMzU4KGxvbmcpIF9LRVJORUxfMzU4Ci0zNTkgcGFzY2FsIEtFUk5FTF8zNTkobG9uZykgX0tFUk5FTF8zNTkKKzM1OCBwYXNjYWwgTWFwTFMobG9uZykgTWFwTFMKKzM1OSBwYXNjYWwgVW5NYXBMUyhwdHIpIFVuTWFwTFMKIDM2MCBzdHViIE9wZW5GaWxlRXgKICMzNjEgUElHTEVUXzM2MQogMzY1IHN0dWIgS0VSTkVMXzM2NQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3JlbGF5LmMgYi9pZjE2MzIvcmVsYXkuYwppbmRleCAwOTc1ZTA4Li42YTQwYWVmIDEwMDY0NAotLS0gYS9pZjE2MzIvcmVsYXkuYworKysgYi9pZjE2MzIvcmVsYXkuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKICNpbmNsdWRlICJ0YXNrLmgiCisjaW5jbHVkZSAiZGVidWdzdHIuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAjaWYgMApAQCAtMzMsOCArMzQsMTAgQEAKIAogICAgIGV4dGVybiB2b2lkIENBTExUTzE2X1N0YXJ0KCksIENBTExUTzE2X0VuZCgpOwogICAgIGV4dGVybiB2b2lkIENBTExUTzE2X1JldF93b3JkKCksIENBTExUTzE2X1JldF9sb25nKCk7CisgICAgZXh0ZXJuIHZvaWQgQ0FMTFRPMTZfUmV0X2VheCgpOwogICAgIGV4dGVybiBEV09SRCBDQUxMVE8xNl9SZXRBZGRyX3dvcmQ7CiAgICAgZXh0ZXJuIERXT1JEIENBTExUTzE2X1JldEFkZHJfbG9uZzsKKyAgICBleHRlcm4gRFdPUkQgQ0FMTFRPMTZfUmV0QWRkcl9lYXg7CiAKICAgICBjb2Rlc2VsID0gR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX0ZJWEVELCAodm9pZCAqKUNBTExUTzE2X1N0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KUNBTExUTzE2X0VuZCAtIChpbnQpQ0FMTFRPMTZfU3RhcnQsCkBAIC00Nyw2ICs1MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2VsICk7CiAgICAgQ0FMTFRPMTZfUmV0QWRkcl9sb25nPU1BS0VMT05HKCAoaW50KUNBTExUTzE2X1JldF9sb25nLShpbnQpQ0FMTFRPMTZfU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2VsICk7CisgICAgQ0FMTFRPMTZfUmV0QWRkcl9lYXggPU1BS0VMT05HKCAoaW50KUNBTExUTzE2X1JldF9lYXggLShpbnQpQ0FMTFRPMTZfU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2VsICk7CiAKICAgICAvKiBDcmVhdGUgYnVpbHQtaW4gbW9kdWxlcyAqLwogICAgIGlmICghQlVJTFRJTl9Jbml0KCkpIHJldHVybiBGQUxTRTsKQEAgLTU2LDE5ICs2MSw2IEBACiB9CiAKIAotIAotc3RhdGljIHZvaWQgUkVMQVlfZHVtcHN0ciggdW5zaWduZWQgY2hhciAqcyApCi17Ci0gICAgZnB1dGMoICdcIicsIHN0ZG91dCApOwotICAgIGZvciAoIDsgKnM7IHMrKykKLSAgICB7Ci0gICAgICAgIGlmICgqcyA8ICcgJykgcHJpbnRmKCAiXFwweCUwMngiLCAqcyApOwotICAgICAgICBlbHNlIGlmICgqcyA9PSAnXFwnKSBmcHV0cyggIlxcXFwiLCBzdGRvdXQgKTsKLSAgICAgICAgZWxzZSBmcHV0YyggKnMsIHN0ZG91dCApOwotICAgIH0KLSAgICBmcHV0YyggJ1wiJywgc3Rkb3V0ICk7Ci19Ci0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgUkVMQVlfRGVidWdDYWxsRnJvbTE2CkBAIC0xMDcsNyArOTksNyBAQAogICAgICAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgICAgICAgcHJpbnRmKCAiJTA0eDolMDR4IiwgKihXT1JEICopKGFyZ3MxNisyKSwgKihXT1JEICopYXJnczE2ICk7CiAgICAgICAgICAgICAgICAgaWYgKEhJV09SRCgqKFNFR1BUUiAqKWFyZ3MxNikpCi0gICAgICAgICAgICAgICAgICAgIFJFTEFZX2R1bXBzdHIoIChMUEJZVEUpUFRSX1NFR19UT19MSU4oKihTRUdQVFIgKilhcmdzMTYgKSk7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnX2R1bXBzdHIoIChMUFNUUilQVFJfU0VHX1RPX0xJTigqKFNFR1BUUiAqKWFyZ3MxNiApKTsKICAgICAgICAgICAgICAgICBhcmdzMTYgKz0gNDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ3AnOgpAQCAtMTE3LDcgKzEwOSw3IEBACiAgICAgICAgICAgICBjYXNlICdUJzoKICAgICAgICAgICAgICAgICBwcmludGYoICIlMDR4OiUwNHgiLCAqKFdPUkQgKikoYXJnczE2KzIpLCAqKFdPUkQgKilhcmdzMTYgKTsKICAgICAgICAgICAgICAgICBpZiAoSElXT1JEKCAqKFNFR1BUUiAqKWFyZ3MxNiApKQotICAgICAgICAgICAgICAgICAgICBSRUxBWV9kdW1wc3RyKCAoTFBCWVRFKVBUUl9TRUdfVE9fTElOKCooU0VHUFRSICopYXJnczE2ICkpOworICAgICAgICAgICAgICAgICAgICBkZWJ1Z19kdW1wc3RyKCAoTFBTVFIpUFRSX1NFR19UT19MSU4oKihTRUdQVFIgKilhcmdzMTYgKSk7CiAgICAgICAgICAgICAgICAgYXJnczE2ICs9IDQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xNjIsNyArMTU0LDcgQEAKICAgICAgICAgICAgICAgICBhcmdzMTYgLT0gNDsKICAgICAgICAgICAgICAgICBwcmludGYoICIweCUwOHgiLCAqKGludCAqKWFyZ3MxNiApOwogICAgICAgICAgICAgICAgIGlmIChISVdPUkQoKihTRUdQVFIgKilhcmdzMTYpKQotICAgICAgICAgICAgICAgICAgICBSRUxBWV9kdW1wc3RyKCAoTFBCWVRFKVBUUl9TRUdfVE9fTElOKCooU0VHUFRSICopYXJnczE2ICkpOworICAgICAgICAgICAgICAgICAgICBkZWJ1Z19kdW1wc3RyKCAoTFBTVFIpUFRSX1NFR19UT19MSU4oKihTRUdQVFIgKilhcmdzMTYgKSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlICdwJzoKICAgICAgICAgICAgICAgICBhcmdzMTYgLT0gNDsKQEAgLTE3Miw3ICsxNjQsNyBAQAogICAgICAgICAgICAgICAgIGFyZ3MxNiAtPSA0OwogICAgICAgICAgICAgICAgIHByaW50ZiggIiUwNHg6JTA0eCIsICooV09SRCAqKShhcmdzMTYrMiksICooV09SRCAqKWFyZ3MxNiApOwogICAgICAgICAgICAgICAgIGlmIChISVdPUkQoICooU0VHUFRSICopYXJnczE2ICkpCi0gICAgICAgICAgICAgICAgICAgIFJFTEFZX2R1bXBzdHIoIChMUEJZVEUpUFRSX1NFR19UT19MSU4oKihTRUdQVFIgKilhcmdzMTYgKSk7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnX2R1bXBzdHIoIChMUFNUUilQVFJfU0VHX1RPX0xJTigqKFNFR1BUUiAqKWFyZ3MxNiApKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFyZ3MrKzsKZGlmZiAtLWdpdCBhL2lmMTYzMi9zaWduYWwuYyBiL2lmMTYzMi9zaWduYWwuYwppbmRleCAwNmEzNmQzLi40MzE1NjVhIDEwMDY0NAotLS0gYS9pZjE2MzIvc2lnbmFsLmMKKysrIGIvaWYxNjMyL3NpZ25hbC5jCkBAIC0xNywxNSArMTcsNiBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKLSNpZiBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19zdnI0X18pIHx8IGRlZmluZWQoX1NDT19EUykgfHwgZGVmaW5lZChfX0VNWF9fKQotIyBpZiAhZGVmaW5lZChfU0NPX0RTKSAmJiAhZGVmaW5lZChfX0VNWF9fKQotIyAgaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KLSMgZW5kaWYKLSMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzeXNjYWxsLmg+Ci0jZW5kaWYKLQogI2luY2x1ZGUgImRlYnVnZ2VyLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgInNpZ19jb250ZXh0LmgiCmRpZmYgLS1naXQgYS9pZjE2MzIvdXNlci5zcGVjIGIvaWYxNjMyL3VzZXIuc3BlYwppbmRleCAyMzM1YmRiLi44NGIzMmU1IDEwMDY0NAotLS0gYS9pZjE2MzIvdXNlci5zcGVjCisrKyBiL2lmMTYzMi91c2VyLnNwZWMKQEAgLTUyMSwxMCArNTIxLDEwIEBACiA4MjEgc3R1YiBUcmFuc2xhdGVNZXNzYWdlMzIJCiAjODIxIHN0dWIgSXNEaWFsb2dNZXNzYWdlMzIJCSMgRklYTUU6IHR3byBvcmRpbmFsIDgyMT8/PwogODIyIHN0dWIgRGlzcGF0Y2hNZXNzYWdlMzIKKzgyMyBzdHViIENhbGxNc2dGaWx0ZXIzMgogODI1IHN0dWIgUG9zdE1lc3NhZ2UzMgogODI2IHN0dWIgUG9zdFRocmVhZE1lc3NhZ2UzMgotODI3IHN0dWIgTWVzc2FnZUJveEluZGlyZWN0Ci04MjMgc3R1YiBDYWxsTXNnRmlsdGVyMzIKKzgyNyBwYXNjYWwxNiBNZXNzYWdlQm94SW5kaXJlY3QocHRyKSBNZXNzYWdlQm94SW5kaXJlY3QxNgogODUxIHN0dWIgTXNnVGhrQ29ubmVjdGlvbkRhdGFMUwogODUzIHN0dWIgRlRfVVNSRlRIS1RIS0NPTk5FQ1RJT05EQVRBCiA4NTQgc3R1YiBGVF9fVVNSRjJUSEtUSEtDT05ORUNUSU9OREFUQQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3dwcm9jcy5zcGVjIGIvaWYxNjMyL3dwcm9jcy5zcGVjCmluZGV4IGVlMjQyMjkuLjQwZmE5YjUgMTAwNjQ0Ci0tLSBhL2lmMTYzMi93cHJvY3Muc3BlYworKysgYi9pZjE2MzIvd3Byb2NzLnNwZWMKQEAgLTQsOCArNCw4IEBACiAxNCBwYXNjYWwgRmlsZU9wZW5EbGdQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIEZpbGVPcGVuRGxnUHJvYwogMTUgcGFzY2FsIEZpbGVTYXZlRGxnUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBGaWxlU2F2ZURsZ1Byb2MKIDE2IHBhc2NhbCBDb2xvckRsZ1Byb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgQ29sb3JEbGdQcm9jCi0xNyBwYXNjYWwgRmluZFRleHREbGdQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIEZpbmRUZXh0RGxnUHJvYwotMTggcGFzY2FsIFJlcGxhY2VUZXh0RGxnUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBSZXBsYWNlVGV4dERsZ1Byb2MKKzE3IHBhc2NhbCBGaW5kVGV4dERsZ1Byb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgRmluZFRleHREbGdQcm9jMTYKKzE4IHBhc2NhbCBSZXBsYWNlVGV4dERsZ1Byb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgUmVwbGFjZVRleHREbGdQcm9jMTYKIDE5IHBhc2NhbCBQcmludFNldHVwRGxnUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBQcmludFNldHVwRGxnUHJvYwogMjAgcGFzY2FsIFByaW50RGxnUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBQcmludERsZ1Byb2MKIDI0IHBhc2NhbDE2IFRBU0tfUmVzY2hlZHVsZSgpIFRBU0tfUmVzY2hlZHVsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY2NvbmZpZy5oIGIvaW5jbHVkZS9hY2NvbmZpZy5oCmluZGV4IDUxMjM2NGIuLjQ1NDg5ZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNjb25maWcuaAorKysgYi9pbmNsdWRlL2FjY29uZmlnLmgKQEAgLTIxLDUgKzIxLDggQEAKIC8qIERlZmluZSBpZiBYIGxpYnJhcmllcyBhcmUgbm90IHJlZW50cmFudCAoY29tcGlsZWQgd2l0aG91dCAtRF9SRUVOVFJBTlQpLiAgKi8KICN1bmRlZiBOT19SRUVOVFJBTlRfWDExCiAKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBtYWNoaW5lL3NvdW5kY2FyZC5oIGluc3RlYWQgb2Ygc3lzL3NvdW5kY2FyZC5oLiAgKi8KLSN1bmRlZiBIQVZFX01BQ0hJTkVfU09VTkRDQVJEX0gKKy8qIERlZmluZSBpZiB0aGUgc3RydWN0IHN0YXRmcyBoYXMgdGhlIG1lbWJlciBiYXZhaWwgKi8KKyN1bmRlZiBTVEFURlNfSEFTX0JBVkFJTAorCisvKiBEZWZpbmUgaWYgdGhlIHN0cnVjdCBzdGF0ZnMgaGFzIHRoZSBtZW1iZXIgYmZyZWUgKi8KKyN1bmRlZiBTVEFURlNfSEFTX0JGUkVFCmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpdG1hcHMvb2ljX2JhbmdfOTUgYi9pbmNsdWRlL2JpdG1hcHMvb2ljX2JhbmdfOTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIzM2NmMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYml0bWFwcy9vaWNfYmFuZ185NQpAQCAtMCwwICsxLDQxIEBACisvKiBYUE0gKi8KK3N0YXRpYyBjaGFyICogb2ljX2JhbmdfOTVbXSA9IHsKKyIzMiAzMiA2IDEiLAorIiAJcyBOb25lCQljIE5vbmUiLAorIi4JcyBibGFjawkJYyBibGFjayIsCisiWAlzIHllbGxvdwljIHllbGxvdyIsCisieAlzIGRrZ3JlZW4JYyAjMDA4MDAwIiwKKyJvCXMgbHRncmF5CWMgI2MwYzBjMCIsCisiTwlzIGRrZ3JheQljICM4MDgwODAiLAorIiAgICAgICAgICAgICB4eHggICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICB4WFhvLiAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICB4WFhYWG8uTyAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgeFhYWFhYLk9PICAgICAgICAgICAgIiwKKyIgICAgICAgICAgeFhYWFhYWG8uT08gICAgICAgICAgICIsCisiICAgICAgICAgIHhYWFhYWFhYLk9PICAgICAgICAgICAiLAorIiAgICAgICAgIHhYWFhYWFhYWG8uT08gICAgICAgICAgIiwKKyIgICAgICAgICB4WFhYWFhYWFhYLk9PICAgICAgICAgICIsCisiICAgICAgICB4WFhYWFhYWFhYWG8uT08gICAgICAgICAiLAorIiAgICAgICAgeFhYWG8uLi5vWFhYLk9PICAgICAgICAgIiwKKyIgICAgICAgeFhYWFguLi4uLlhYWG8uT08gICAgICAgICIsCisiICAgICAgIHhYWFhYLi4uLi5YWFhYLk9PICAgICAgICAiLAorIiAgICAgIHhYWFhYWC4uLi4uWFhYWG8uT08gICAgICAgIiwKKyIgICAgICB4WFhYWFguLi4uLlhYWFhYLk9PICAgICAgICIsCisiICAgICB4WFhYWFhYLi4uLi5YWFhYWG8uT08gICAgICAiLAorIiAgICAgeFhYWFhYWHguLi54WFhYWFhYLk9PICAgICAgIiwKKyIgICAgeFhYWFhYWFhvLi4ub1hYWFhYWG8uT08gICAgICIsCisiICAgIHhYWFhYWFhYWC4uLlhYWFhYWFhYLk9PICAgICAiLAorIiAgIHhYWFhYWFhYWFh4LnhYWFhYWFhYWG8uT08gICAgIiwKKyIgICB4WFhYWFhYWFhYby5vWFhYWFhYWFhYLk9PICAgICIsCisiICB4WFhYWFhYWFhYWFguWFhYWFhYWFhYWG8uT08gICAiLAorIiAgeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYLk9PICAgIiwKKyIgeFhYWFhYWFhYWFhYby4ub1hYWFhYWFhYWG8uT08gICIsCisiIHhYWFhYWFhYWFhYWC4uLi5YWFhYWFhYWFhYLk9PICAiLAorInhYWFhYWFhYWFhYWFguLi4uWFhYWFhYWFhYWG8uT08gIiwKKyJ4WFhYWFhYWFhYWFhYby4ub1hYWFhYWFhYWFhYLk9PICIsCisieFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWC5PT08iLAorInhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWG8uT09PIiwKKyIgeFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWG8uT09PTyIsCisiICB4Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uT09PT08iLAorIiAgICBPT09PT09PT09PT09PT09PT09PT09PT09PT08gIiwKKyIgICAgIE9PT09PT09PT09PT09PT09PT09PT09PT08gICJ9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaXRtYXBzL29pY19oYW5kXzk1IGIvaW5jbHVkZS9iaXRtYXBzL29pY19oYW5kXzk1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNjVhNjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2JpdG1hcHMvb2ljX2hhbmRfOTUKQEAgLTAsMCArMSw0MCBAQAorLyogWFBNICovCitzdGF0aWMgY2hhciAqIG9pY19oYW5kXzk1W10gPSB7CisiMzIgMzIgNSAxIiwKKyIgCXMgTm9uZQkgYyBOb25lIiwKKyJvCXMgd2hpdGUJIGMgd2hpdGUiLAorIk8JcyBka2dyYXkgYyAjODA4MDgwIiwKKyIrCXMgZGtyZWQgIGMgIzgwMDAwMCIsCisiWAlzIHJlZAkgYyByZWQiLAorIiAgICAgICAgICAgKysrKysrKysgICAgICAgICAgICAgIiwKKyIgICAgICAgICsrK1hYWFhYWFhYKysrICAgICAgICAgICIsCisiICAgICAgICtYWFhYWFhYWFhYWFhYWCsgICAgICAgICAiLAorIiAgICAgKytYWFhYWFhYWFhYWFhYWFhYKysgICAgICAgIiwKKyIgICAgK1hYWFhYWFhYWFhYWFhYWFhYWFhYKyAgICAgICIsCisiICAgK1hYWFhYWFhYWFhYWFhYWFhYWFhYWFgrICAgICAiLAorIiAgICtYWFhYWFhYWFhYWFhYWFhYWFhYWFhYK08gICAgIiwKKyIgICtYWFhYWFhvWFhYWFhYWFhYWG9YWFhYWFgrTyAgICIsCisiICtYWFhYWFhvb29YWFhYWFhYWG9vb1hYWFhYWCsgICAiLAorIiArWFhYWFhvb29vb1hYWFhYWG9vb29vWFhYWFgrTyAgIiwKKyIgK1hYWFhYWG9vb29vWFhYWG9vb29vWFhYWFhYK09PICIsCisiK1hYWFhYWFhYb29vb29YWG9vb29vWFhYWFhYWFgrTyAiLAorIitYWFhYWFhYWFhvb29vb29vb29vWFhYWFhYWFhYK08gIiwKKyIrWFhYWFhYWFhYWG9vb29vb29vWFhYWFhYWFhYWCtPTyIsCisiK1hYWFhYWFhYWFhYb29vb29vWFhYWFhYWFhYWFgrT08iLAorIitYWFhYWFhYWFhYWG9vb29vb1hYWFhYWFhYWFhYK09PIiwKKyIrWFhYWFhYWFhYWG9vb29vb29vWFhYWFhYWFhYWCtPTyIsCisiK1hYWFhYWFhYWG9vb29vb29vb29YWFhYWFhYWFgrT08iLAorIitYWFhYWFhYWG9vb29vWFhvb29vb1hYWFhYWFhYK09PIiwKKyIgK1hYWFhYWG9vb29vWFhYWG9vb29vWFhYWFhYK09PTyIsCisiICtYWFhYWG9vb29vWFhYWFhYb29vb29YWFhYWCtPT08iLAorIiArWFhYWFhYb29vWFhYWFhYWFhvb29YWFhYWFgrT08gIiwKKyIgICtYWFhYWFhvWFhYWFhYWFhYWG9YWFhYWFgrT09PICIsCisiICAgK1hYWFhYWFhYWFhYWFhYWFhYWFhYWFgrT09PTyAiLAorIiAgICtYWFhYWFhYWFhYWFhYWFhYWFhYWFhYK09PTyAgIiwKKyIgICAgK1hYWFhYWFhYWFhYWFhYWFhYWFhYK09PTyAgICIsCisiICAgICArK1hYWFhYWFhYWFhYWFhYWFgrK09PT08gICAiLAorIiAgICAgIE8rWFhYWFhYWFhYWFhYWFgrT09PT08gICAgIiwKKyIgICAgICAgTysrK1hYWFhYWFhYKysrT09PT08gICAgICIsCisiICAgICAgICAgT08rKysrKysrK09PT09PTyAgICAgICAiLAorIiAgICAgICAgICBPT09PT09PT09PT09PTyAgICAgICAgIiwKKyIgICAgICAgICAgICAgT09PT09PT08gICAgICAgICAgICJ9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaXRtYXBzL29pY19ub3RlXzk1IGIvaW5jbHVkZS9iaXRtYXBzL29pY19ub3RlXzk1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiODAyMDcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2JpdG1hcHMvb2ljX25vdGVfOTUKQEAgLTAsMCArMSw0MSBAQAorLyogWFBNICovCitzdGF0aWMgY2hhciAqIG9pY19ub3RlXzk1W10gPSB7CisiMzIgMzIgNiAxIiwKKyIgCXMgTm9uZQkgYyBOb25lIiwKKyIuCXMgYmxhY2sJIGMgYmxhY2siLAorIlgJcyB3aGl0ZQkgYyB3aGl0ZSIsCisibwlzIGx0Z3JheSBjICNjMGMwYzAiLAorIk8JcyBka2dyYXkgYyAjODA4MDgwIiwKKyJ4CXMgYmx1ZSAgIGMgYmx1ZSIsCisiICAgICAgICAgICBPT09PT09PTyAgICAgICAgICAgICAiLAorIiAgICAgICAgT09Pb1hYWFhYWG9PT08gICAgICAgICAgIiwKKyIgICAgICBPT29YWFhYWFhYWFhYWFhvT08gICAgICAgICIsCisiICAgICBPb1hYWFhYWFhYWFhYWFhYWFhvTyAgICAgICAiLAorIiAgICBPWFhYWFhYWFhYWFhYWFhYWFhYWFguICAgICAgIiwKKyIgICBPWFhYWFhYWFhveHh4eG9YWFhYWFhYWC4gICAgICIsCisiICBPWFhYWFhYWFhYeHh4eHh4WFhYWFhYWFhYLiAgICAiLAorIiBPb1hYWFhYWFhYWHh4eHh4eFhYWFhYWFhYWG8uICAgIiwKKyIgT1hYWFhYWFhYWFhveHh4eG9YWFhYWFhYWFhYLk8gICIsCisiT29YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWG8uTyAiLAorIk9YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYLk8gIiwKKyJPWFhYWFhYWFhYWHh4eHh4eHhYWFhYWFhYWFhYWC5PTyIsCisiT1hYWFhYWFhYWFhYWHh4eHh4WFhYWFhYWFhYWFguT08iLAorIk9YWFhYWFhYWFhYWFh4eHh4eFhYWFhYWFhYWFhYLk9PIiwKKyJPWFhYWFhYWFhYWFhYeHh4eHhYWFhYWFhYWFhYWC5PTyIsCisiT1hYWFhYWFhYWFhYWHh4eHh4WFhYWFhYWFhYWG8uT08iLAorIiBPWFhYWFhYWFhYWFh4eHh4eFhYWFhYWFhYWFguT09PIiwKKyIgT29YWFhYWFhYWFhYeHh4eHhYWFhYWFhYWFhvLk9PTyIsCisiICBPWFhYWFhYWFhYWHh4eHh4WFhYWFhYWFhYLk9PTyAiLAorIiAgIC5YWFhYWFhYeHh4eHh4eHh4WFhYWFhYLk9PT08gIiwKKyIgICAgLlhYWFhYWFhYWFhYWFhYWFhYWFhYLk9PT08gICIsCisiICAgICAub1hYWFhYWFhYWFhYWFhYWFhvLk9PT08gICAiLAorIiAgICAgIC4ub1hYWFhYWFhYWFhYWG8uLk9PT08gICAgIiwKKyIgICAgICAgTy4uLm9YWFhYWFhvLi4uT09PTyAgICAgICIsCisiICAgICAgICBPT08uLi5vWFhYLk9PT09PTyAgICAgICAiLAorIiAgICAgICAgICBPT09PLlhYWC5PT09PTyAgICAgICAgIiwKKyIgICAgICAgICAgICAgTy5YWFguT08gICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgLlhYLk9PICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAuWC5PTyAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgIC4uT08gICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgT09PICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICBPTyAgICAgICAgICAgIn07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpdG1hcHMvb2ljX3F1ZXNfOTUgYi9pbmNsdWRlL2JpdG1hcHMvb2ljX3F1ZXNfOTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhODc0ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYml0bWFwcy9vaWNfcXVlc185NQpAQCAtMCwwICsxLDQxIEBACisvKiBYUE0gKi8KK3N0YXRpYyBjaGFyICogb2ljX3F1ZXNfOTVbXSA9IHsKKyIzMiAzMiA2IDEiLAorIiAJcyBOb25lCSBjIE5vbmUiLAorIi4JcyBibGFjawkgYyBibGFjayIsCisiWAlzIHdoaXRlCSBjIHdoaXRlIiwKKyJvCXMgbHRncmF5IGMgI2MwYzBjMCIsCisiTwlzIGRrZ3JheSBjICM4MDgwODAiLAorIngJcyBibHVlICAgYyBibHVlIiwKKyIgICAgICAgICAgIE9PT09PT09PICAgICAgICAgICAgICIsCisiICAgICAgICBPT09vWFhYWFhYb09PTyAgICAgICAgICAiLAorIiAgICAgIE9Pb1hYWFhYWFhYWFhYWG9PTyAgICAgICAgIiwKKyIgICAgIE9vWFhYWFhYWFhYWFhYWFhYWG9PICAgICAgICIsCisiICAgIE9YWFhYWFhYWFhYWFhYWFhYWFhYWC4gICAgICAiLAorIiAgIE9YWFhYWFhYb3h4eHh4eG9YWFhYWFhYLiAgICAgIiwKKyIgIE9YWFhYWFhYb3hvWFh4eHh4b1hYWFhYWFguICAgICIsCisiIE9vWFhYWFhYWHh4WFhYWHh4eHhYWFhYWFhYby4gICAiLAorIiBPWFhYWFhYWFh4eHh4WFh4eHh4WFhYWFhYWFguTyAgIiwKKyJPb1hYWFhYWFhYeHh4eFhYeHh4eFhYWFhYWFhYby5PICIsCisiT1hYWFhYWFhYWG94eG9YeHh4eFhYWFhYWFhYWFguTyAiLAorIk9YWFhYWFhYWFhYWFhYb3h4eFhYWFhYWFhYWFhYLk9PIiwKKyJPWFhYWFhYWFhYWFhYWHh4eFhYWFhYWFhYWFhYWC5PTyIsCisiT1hYWFhYWFhYWFhYWFh4eG9YWFhYWFhYWFhYWFguT08iLAorIk9YWFhYWFhYWFhYWFhYeHhYWFhYWFhYWFhYWFhYLk9PIiwKKyJPWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYby5PTyIsCisiIE9YWFhYWFhYWFhYWG94eG9YWFhYWFhYWFhYWC5PT08iLAorIiBPb1hYWFhYWFhYWFh4eHh4WFhYWFhYWFhYWG8uT09PIiwKKyIgIE9YWFhYWFhYWFhYeHh4eFhYWFhYWFhYWFguT09PICIsCisiICAgLlhYWFhYWFhYWG94eG9YWFhYWFhYWFguT09PTyAiLAorIiAgICAuWFhYWFhYWFhYWFhYWFhYWFhYWFguT09PTyAgIiwKKyIgICAgIC5vWFhYWFhYWFhYWFhYWFhYWG8uT09PTyAgICIsCisiICAgICAgLi5vWFhYWFhYWFhYWFhYby4uT09PTyAgICAiLAorIiAgICAgICBPLi4ub1hYWFhYWG8uLi5PT09PICAgICAgIiwKKyIgICAgICAgIE9PTy4uLm9YWFguT09PT09PICAgICAgICIsCisiICAgICAgICAgIE9PT08uWFhYLk9PT09PICAgICAgICAiLAorIiAgICAgICAgICAgICBPLlhYWC5PTyAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAuWFguT08gICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgIC5YLk9PICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgLi5PTyAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICBPT08gICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgIE9PICAgICAgICAgICAifTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29tbWN0cmwuaCBiL2luY2x1ZGUvY29tbWN0cmwuaAppbmRleCAzMzQwNGY1Li4yZWQ5NWY2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbW1jdHJsLmgKKysrIGIvaW5jbHVkZS9jb21tY3RybC5oCkBAIC0yNCw2ICsyNCwxMyBAQAogI2RlZmluZSBDQ1NfTk9NT1ZFWCAgICAgICAgIChDQ1NfVkVSVHxDQ1NfTk9NT1ZFWSkKIAogCisvKiBjb21tb24gY29udHJvbCBzaGFyZWQgbWVzc2FnZXMgKi8KKworI2RlZmluZSBDQ01fRklSU1QgICAgICAgICAgIDB4MjAwMAorCisjZGVmaW5lIENDTV9TRVRCS0NPTE9SICAgICAgKENDTV9GSVJTVCsxKSAgICAgLy8gbFBhcmFtID0gYmtDb2xvcgorCisKIC8qIFN0YXR1c1dpbmRvdyAqLwogCiAjZGVmaW5lIFNUQVRVU0NMQVNTTkFNRTE2ICAgICAibXNjdGxzX3N0YXR1c2JhciIKQEAgLTkzLDYgKzEwMCw5IEBACiAjZGVmaW5lIFVETV9HRVRBQ0NFTCAgICAgICAoV01fVVNFUisxMDgpCiAjZGVmaW5lIFVETV9TRVRCQVNFICAgICAgICAoV01fVVNFUisxMDkpCiAjZGVmaW5lIFVETV9HRVRCQVNFICAgICAgICAoV01fVVNFUisxMTApCisjZGVmaW5lIFVETV9TRVRSQU5HRTMyICAgICAoV01fVVNFUisxMTEpCisjZGVmaW5lIFVETV9HRVRSQU5HRTMyICAgICAoV01fVVNFUisxMTIpCisKIAogLyogUHJvZ3Jlc3MgQmFyICovCiAKQEAgLTEwNyw2ICsxMTcsMjEgQEAKICNkZWZpbmUgUEJNX0RFTFRBUE9TICAgICAgICAoV01fVVNFUiszKQogI2RlZmluZSBQQk1fU0VUU1RFUCAgICAgICAgIChXTV9VU0VSKzQpCiAjZGVmaW5lIFBCTV9TVEVQSVQgICAgICAgICAgKFdNX1VTRVIrNSkKKyNkZWZpbmUgUEJNX1NFVFJBTkdFMzIgICAgICAoV01fVVNFUis2KQorI2RlZmluZSBQQk1fR0VUUkFOR0UgICAgICAgIChXTV9VU0VSKzcpCisjZGVmaW5lIFBCTV9HRVRQT1MgICAgICAgICAgKFdNX1VTRVIrOCkKKyNkZWZpbmUgUEJNX1NFVEJBUkNPTE9SICAgICAoV01fVVNFUis5KQorI2RlZmluZSBQQk1fU0VUQktDT0xPUiAgICAgIENDTV9TRVRCS0NPTE9SCisKKyNkZWZpbmUgUEJTX1NNT09USCAgICAgICAgICAweDAxCisjZGVmaW5lIFBCU19WRVJUSUNBTCAgICAgICAgMHgwNAorCit0eXBlZGVmIHN0cnVjdAoreworICBJTlQzMiBpTG93OworICBJTlQzMiBpSGlnaDsKK30gUEJSQU5HRSwgKlBQQlJBTkdFOworCiAgCiAvKiBGdW5jdGlvbnMgcHJvdG90eXBlcyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbW1kbGcuaCBiL2luY2x1ZGUvY29tbWRsZy5oCmluZGV4IGU1Y2E0ZjYuLjEyNmI5NDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29tbWRsZy5oCisrKyBiL2luY2x1ZGUvY29tbWRsZy5oCkBAIC0xNTAsOSArMTUwLDQxIEBACiAJTFBBUkFNIAkJbEN1c3REYXRhOyAgICAgICAgICAgICAgLyogZGF0YSBwYXNzZWQgdG8gaG9vayBmbi4gICovCiAgICAgICAgIFdORFBST0MxNiAgICAgICBscGZuSG9vazsKIAlTRUdQVFIgCQlscFRlbXBsYXRlTmFtZTsgICAgICAgICAvKiBjdXN0b20gdGVtcGxhdGUgbmFtZSAgICAgKi8KLQl9IEZJTkRSRVBMQUNFOwotdHlwZWRlZiBGSU5EUkVQTEFDRSAqTFBGSU5EUkVQTEFDRTsKKwl9IEZJTkRSRVBMQUNFMTYsICpMUEZJTkRSRVBMQUNFMTY7CiAKK3R5cGVkZWYgc3RydWN0IHsKKwlEV09SRAkJbFN0cnVjdFNpemU7CisJSFdORDMyCQlod25kT3duZXI7CisJSElOU1RBTkNFMzIJaEluc3RhbmNlOworCisJRFdPUkQJCUZsYWdzOworCUxQU1RSCQlscHN0ckZpbmRXaGF0OworCUxQU1RSCQlscHN0clJlcGxhY2VXaXRoOworCVdPUkQJCXdGaW5kV2hhdExlbjsKKwlXT1JEIAkJd1JlcGxhY2VXaXRoTGVuOworCUxQQVJBTSAJCWxDdXN0RGF0YTsKKyAgICAgICAgV05EUFJPQzMyICAgICAgIGxwZm5Ib29rOworCUxQQ1NUUiAJCWxwVGVtcGxhdGVOYW1lOworCX0gRklORFJFUExBQ0UzMkEsICpMUEZJTkRSRVBMQUNFMzJBOworCit0eXBlZGVmIHN0cnVjdCB7CisJRFdPUkQJCWxTdHJ1Y3RTaXplOworCUhXTkQzMgkJaHduZE93bmVyOworCUhJTlNUQU5DRTMyCWhJbnN0YW5jZTsKKworCURXT1JECQlGbGFnczsKKwlMUFdTVFIJCWxwc3RyRmluZFdoYXQ7CisJTFBXU1RSCQlscHN0clJlcGxhY2VXaXRoOworCVdPUkQJCXdGaW5kV2hhdExlbjsKKwlXT1JEIAkJd1JlcGxhY2VXaXRoTGVuOworCUxQQVJBTSAJCWxDdXN0RGF0YTsKKyAgICAgICAgV05EUFJPQzMyICAgICAgIGxwZm5Ib29rOworCUxQQ1dTVFIJCWxwVGVtcGxhdGVOYW1lOworCX0gRklORFJFUExBQ0UzMlcsICpMUEZJTkRSRVBMQUNFMzJXOworCQorREVDTF9XSU5FTElCX1RZUEVfQVcoRklORFJFUExBQ0UpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTFBGSU5EUkVQTEFDRSk7CisJCiAjZGVmaW5lIEZSX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQogI2RlZmluZSBGUl9XSE9MRVdPUkQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKICNkZWZpbmUgRlJfTUFUQ0hDQVNFICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CkBAIC0zOTMsNyArNDI1LDEwIEBACiAKIEJPT0wxNiAgV0lOQVBJIENob29zZUNvbG9yKExQQ0hPT1NFQ09MT1IgbHBDaENvbCk7CiBEV09SRCAgIFdJTkFQSSBDb21tRGxnRXh0ZW5kZWRFcnJvcih2b2lkKTsKLUhXTkQxNiAgV0lOQVBJIEZpbmRUZXh0KCBTRUdQVFIgZmluZCk7CitIV05EMTYgIFdJTkFQSSBGaW5kVGV4dDE2KCBTRUdQVFIgZmluZCk7CitIV05EMzIgIFdJTkFQSSBGaW5kVGV4dDMyQShMUEZJTkRSRVBMQUNFMzJBIGxwRmluZCk7CitIV05EMzIgIFdJTkFQSSBGaW5kVGV4dDMyVyhMUEZJTkRSRVBMQUNFMzJXIGxwRmluZCk7CisjZGVmaW5lIEZpbmRUZXh0IFdJTkVMSUJfTkFNRV9BVyhGaW5kVGV4dCkKIElOVDE2ICAgV0lOQVBJIEdldEZpbGVUaXRsZTE2KExQQ1NUUiBscEZpbGUsIExQU1RSIGxwVGl0bGUsIFVJTlQxNiBjYkJ1Zik7CiBJTlQxNiAgIFdJTkFQSSBHZXRGaWxlVGl0bGUzMkEoTFBDU1RSIGxwRmlsZSwgTFBTVFIgbHBUaXRsZSwgVUlOVDMyIGNiQnVmKTsKIElOVDE2ICAgV0lOQVBJIEdldEZpbGVUaXRsZTMyVyhMUENXU1RSIGxwRmlsZSwgTFBXU1RSIGxwVGl0bGUsIFVJTlQzMiBjYkJ1Zik7CkBAIC00MDcsMTMgKzQ0MiwyMiBAQAogQk9PTDMyICBXSU5BUEkgR2V0U2F2ZUZpbGVOYW1lMzJXKExQT1BFTkZJTEVOQU1FMzJXIG9mbik7CiAjZGVmaW5lIEdldFNhdmVGaWxlTmFtZSBXSU5FTElCX05BTUVfQVcoR2V0U2F2ZUZpbGVOYW1lKQogQk9PTDE2ICBXSU5BUEkgUHJpbnREbGcoIFNFR1BUUiBwcmludCk7Ci1IV05EMTYgIFdJTkFQSSBSZXBsYWNlVGV4dCggU0VHUFRSIGZpbmQpOworSFdORDE2ICBXSU5BUEkgUmVwbGFjZVRleHQxNiggU0VHUFRSIGZpbmQpOworSFdORDMyICBXSU5BUEkgUmVwbGFjZVRleHQzMkEoIExQRklORFJFUExBQ0UzMkEgbHBGaW5kKTsKK0hXTkQzMiAgV0lOQVBJIFJlcGxhY2VUZXh0MzJXKCBMUEZJTkRSRVBMQUNFMzJXIGxwRmluZCk7CisjZGVmaW5lIFJlcGxhY2VUZXh0IFdJTkVMSUJfTkFNRV9BVyhSZXBsYWNlVGV4dCkKIEJPT0wxNiAgV0lOQVBJIENob29zZUZvbnQoTFBDSE9PU0VGT05UIGxwQ2hGb250KTsKIExSRVNVTFQgV0lOQVBJIEZpbGVPcGVuRGxnUHJvYyhIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBMUkVTVUxUIFdJTkFQSSBGaWxlU2F2ZURsZ1Byb2MoSFdORDE2IGhXbmQsIFVJTlQxNiB3TXNnLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogTFJFU1VMVCBXSU5BUEkgQ29sb3JEbGdQcm9jKEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKLUxSRVNVTFQgV0lOQVBJIEZpbmRUZXh0RGxnUHJvYyhIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1MUkVTVUxUIFdJTkFQSSBSZXBsYWNlVGV4dERsZ1Byb2MoSFdORDE2IGhXbmQsIFVJTlQxNiB3TXNnLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworTFJFU1VMVCBXSU5BUEkgRmluZFRleHREbGdQcm9jMTYoSFdORDE2IGhXbmQsIFVJTlQxNiB3TXNnLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworTFJFU1VMVCBXSU5BUEkgRmluZFRleHREbGdQcm9jMzJBKEhXTkQzMiBoV25kLCBVSU5UMzIgd01zZywgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK0xSRVNVTFQgV0lOQVBJIEZpbmRUZXh0RGxnUHJvYzMyVyhIV05EMzIgaFduZCwgVUlOVDMyIHdNc2csIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CisjZGVmaW5lIEZpbmRUZXh0RGxnUHJvYyBXSU5FTElCX05BTUVfQVcoRmluZFRleHREbGdQcm9jKQorTFJFU1VMVCBXSU5BUEkgUmVwbGFjZVRleHREbGdQcm9jMTYoSFdORDE2IGhXbmQsIFVJTlQxNiB3TXNnLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworTFJFU1VMVCBXSU5BUEkgUmVwbGFjZVRleHREbGdQcm9jMzJBKEhXTkQzMiBoV25kLCBVSU5UMzIgd01zZywgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK0xSRVNVTFQgV0lOQVBJIFJlcGxhY2VUZXh0RGxnUHJvYzMyVyhIV05EMzIgaFduZCwgVUlOVDMyIHdNc2csIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CisjZGVmaW5lIFJlcGxhY2VUZXh0UHJvYyBXSU5FTElCX05BTUVfQVcoUmVwbGFjZVRleHREbGdQcm9jKQogTFJFU1VMVCBXSU5BUEkgUHJpbnREbGdQcm9jKEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIExSRVNVTFQgV0lOQVBJIFByaW50U2V0dXBEbGdQcm9jKEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIExSRVNVTFQgV0lOQVBJIEZvcm1hdENoYXJEbGdQcm9jKEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29tcG9iai5oIGIvaW5jbHVkZS9jb21wb2JqLmgKaW5kZXggNjkyNWIxZS4uZWNkNTdlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb21wb2JqLmgKKysrIGIvaW5jbHVkZS9jb21wb2JqLmgKQEAgLTI0LDggKzI0LDcgQEAKIAogT0xFU1RBVFVTIFdJTkFQSSBXSU5FX1N0cmluZ0Zyb21DTFNJRChjb25zdCBDTFNJRCAqaWQsIExQU1RSKTsKIAotT0xFU1RBVFVTIFdJTkFQSSBTdHJpbmdGcm9tR1VJRDIoY29uc3QgUkVGR1VJRCAqaWQsIExQT0xFU1RSMzIgKnN0ciwgSU5UMzIgY21heCk7Ci0vLyAjZGVmaW5lIFN0cmluZ0Zyb21HVUlEMiBXSU5FTElCX05BTUUoU3RyaW5nRnJvbUdVSUQyKQorSU5UMzIgV0lOQVBJIFN0cmluZ0Zyb21HVUlEMihSRUZHVUlEIGlkLCBMUE9MRVNUUjMyIHN0ciwgSU5UMzIgY21heCk7CiAKIAogI2lmZGVmIElOSVRHVUlECmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZy5oLmluIGIvaW5jbHVkZS9jb25maWcuaC5pbgppbmRleCBkZTNlYzY1Li4yNmYwYThmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZy5oLmluCisrKyBiL2luY2x1ZGUvY29uZmlnLmguaW4KQEAgLTMzLDE1ICszMywyNyBAQAogLyogRGVmaW5lIGlmIFggbGlicmFyaWVzIGFyZSBub3QgcmVlbnRyYW50IChjb21waWxlZCB3aXRob3V0IC1EX1JFRU5UUkFOVCkuICAqLwogI3VuZGVmIE5PX1JFRU5UUkFOVF9YMTEKIAotLyogRGVmaW5lIGlmIHlvdSBoYXZlIG1hY2hpbmUvc291bmRjYXJkLmggaW5zdGVhZCBvZiBzeXMvc291bmRjYXJkLmguICAqLwotI3VuZGVmIEhBVkVfTUFDSElORV9TT1VORENBUkRfSAorLyogRGVmaW5lIGlmIHRoZSBzdHJ1Y3Qgc3RhdGZzIGhhcyB0aGUgbWVtYmVyIGJhdmFpbCAqLworI3VuZGVmIFNUQVRGU19IQVNfQkFWQUlMCisKKy8qIERlZmluZSBpZiB0aGUgc3RydWN0IHN0YXRmcyBoYXMgdGhlIG1lbWJlciBiZnJlZSAqLworI3VuZGVmIFNUQVRGU19IQVNfQkZSRUUKKworLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiBhIGxvbmcgbG9uZy4gICovCisjdW5kZWYgU0laRU9GX0xPTkdfTE9ORwogCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGNsb25lIGZ1bmN0aW9uLiAgKi8KICN1bmRlZiBIQVZFX0NMT05FCiAKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1tb3ZlIGZ1bmN0aW9uLiAgKi8KICN1bmRlZiBIQVZFX01FTU1PVkUKIAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzaWdhbHRzdGFjayBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9TSUdBTFRTVEFDSworCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmVycm9yIGZ1bmN0aW9uLiAgKi8KICN1bmRlZiBIQVZFX1NUUkVSUk9SCiAKQEAgLTYwLDYgKzcyLDQyIEBACiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHdhaXRwaWQgZnVuY3Rpb24uICAqLwogI3VuZGVmIEhBVkVfV0FJVFBJRAogCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxmbG9hdC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9GTE9BVF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L2Nkcm9tLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0xJTlVYX0NEUk9NX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFjaGluZS9zb3VuZGNhcmQuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfTUFDSElORV9TT1VORENBUkRfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvY2Rpby5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfQ0RJT19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxpby5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfRklMSU9fSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvbW91bnQuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX01PVU5UX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zb3VuZGNhcmQuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1NPVU5EQ0FSRF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0ZnMuaD4gaGVhZGVyIGZpbGUuICAqLworI3VuZGVmIEhBVkVfU1lTX1NUQVRGU19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zeXNjYWxsLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NZU19TWVNDQUxMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Zmcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNfVkZTX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzY2FsbC5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9TWVNDQUxMX0gKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8d2N0eXBlLmg+IGhlYWRlciBmaWxlLiAgKi8KICN1bmRlZiBIQVZFX1dDVFlQRV9ICiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGRyYXcuaCBiL2luY2x1ZGUvZGRyYXcuaAppbmRleCBmMjJmYjM2Li5mMTdmMDM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RkcmF3LmgKKysrIGIvaW5jbHVkZS9kZHJhdy5oCkBAIC0xMDQ5LDQ4ICsxMDQ5LDQ5IEBACiAKIHR5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZTNfVlRhYmxlIHsKICAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLwotICAgIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkgKFRISVNfIFJFRklJRCByaWlkLCBMUFZPSUQgRkFSICogcHB2T2JqKSBQVVJFOwotICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAoVEhJUykgIFBVUkU7Ci0gICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKSAoVEhJUykgUFVSRTsKKy8qMDAqL1NURE1FVEhPRChRdWVyeUludGVyZmFjZSkgKFRISVNfIFJFRklJRCByaWlkLCBMUFZPSUQgRkFSICogcHB2T2JqKSBQVVJFOworLyowNCovU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpIChUSElTKSAgUFVSRTsKKy8qMDgqL1NURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkgKFRISVMpIFBVUkU7CiAgICAgLyoqKiBJRGlyZWN0RHJhd1N1cmZhY2UgbWV0aG9kcyAqKiovCi0gICAgU1RETUVUSE9EKEFkZEF0dGFjaGVkU3VyZmFjZSkoVEhJU18gTFBESVJFQ1REUkFXU1VSRkFDRTMpIFBVUkU7Ci0gICAgU1RETUVUSE9EKEFkZE92ZXJsYXlEaXJ0eVJlY3QpKFRISVNfIExQUkVDVDMyKSBQVVJFOwotICAgIFNURE1FVEhPRChCbHQpKFRISVNfIExQUkVDVDMyLExQRElSRUNURFJBV1NVUkZBQ0UzLCBMUFJFQ1QzMixEV09SRCwgTFBEREJMVEZYKSBQVVJFOwotICAgIFNURE1FVEhPRChCbHRCYXRjaCkoVEhJU18gTFBEREJMVEJBVENILCBEV09SRCwgRFdPUkQgKSBQVVJFOwotICAgIFNURE1FVEhPRChCbHRGYXN0KShUSElTXyBEV09SRCxEV09SRCxMUERJUkVDVERSQVdTVVJGQUNFMywgTFBSRUNUMzIsRFdPUkQpIFBVUkU7Ci0gICAgU1RETUVUSE9EKERlbGV0ZUF0dGFjaGVkU3VyZmFjZSkoVEhJU18gRFdPUkQsTFBESVJFQ1REUkFXU1VSRkFDRTMpIFBVUkU7Ci0gICAgU1RETUVUSE9EKEVudW1BdHRhY2hlZFN1cmZhY2VzKShUSElTXyBMUFZPSUQsTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLKSBQVVJFOyAgICBTVERNRVRIT0QoRW51bU92ZXJsYXlaT3JkZXJzKShUSElTXyBEV09SRCxMUFZPSUQsTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLKSBQVVJFOwotICAgIFNURE1FVEhPRChGbGlwKShUSElTXyBMUERJUkVDVERSQVdTVVJGQUNFMywgRFdPUkQpIFBVUkU7Ci0gICAgU1RETUVUSE9EKEdldEF0dGFjaGVkU3VyZmFjZSkoVEhJU18gTFBERFNDQVBTLCBMUERJUkVDVERSQVdTVVJGQUNFMyBGQVIgKikgUFVSRTsKLSAgICBTVERNRVRIT0QoR2V0Qmx0U3RhdHVzKShUSElTXyBEV09SRCkgUFVSRTsKLSAgICBTVERNRVRIT0QoR2V0Q2FwcykoVEhJU18gTFBERFNDQVBTKSBQVVJFOwotICAgIFNURE1FVEhPRChHZXRDbGlwcGVyKShUSElTXyBMUERJUkVDVERSQVdDTElQUEVSIEZBUiopIFBVUkU7Ci0gICAgU1RETUVUSE9EKEdldENvbG9yS2V5KShUSElTXyBEV09SRCwgTFBERENPTE9SS0VZKSBQVVJFOwotICAgIFNURE1FVEhPRChHZXREQykoVEhJU18gSERDMzIgRkFSICopIFBVUkU7Ci0gICAgU1RETUVUSE9EKEdldEZsaXBTdGF0dXMpKFRISVNfIERXT1JEKSBQVVJFOwotICAgIFNURE1FVEhPRChHZXRPdmVybGF5UG9zaXRpb24pKFRISVNfIExQTE9ORywgTFBMT05HICkgUFVSRTsKLSAgICBTVERNRVRIT0QoR2V0UGFsZXR0ZSkoVEhJU18gTFBESVJFQ1REUkFXUEFMRVRURSBGQVIqKSBQVVJFOwotICAgIFNURE1FVEhPRChHZXRQaXhlbEZvcm1hdCkoVEhJU18gTFBERFBJWEVMRk9STUFUKSBQVVJFOwotICAgIFNURE1FVEhPRChHZXRTdXJmYWNlRGVzYykoVEhJU18gTFBERFNVUkZBQ0VERVNDKSBQVVJFOwotICAgIFNURE1FVEhPRChJbml0aWFsaXplKShUSElTXyBMUERJUkVDVERSQVcsIExQRERTVVJGQUNFREVTQykgUFVSRTsKLSAgICBTVERNRVRIT0QoSXNMb3N0KShUSElTKSBQVVJFOwotICAgIFNURE1FVEhPRChMb2NrKShUSElTXyBMUFJFQ1QzMixMUEREU1VSRkFDRURFU0MsRFdPUkQsSEFORExFMzIpIFBVUkU7Ci0gICAgU1RETUVUSE9EKFJlbGVhc2VEQykoVEhJU18gSERDMzIpIFBVUkU7Ci0gICAgU1RETUVUSE9EKFJlc3RvcmUpKFRISVMpIFBVUkU7Ci0gICAgU1RETUVUSE9EKFNldENsaXBwZXIpKFRISVNfIExQRElSRUNURFJBV0NMSVBQRVIpIFBVUkU7Ci0gICAgU1RETUVUSE9EKFNldENvbG9yS2V5KShUSElTXyBEV09SRCwgTFBERENPTE9SS0VZKSBQVVJFOwotICAgIFNURE1FVEhPRChTZXRPdmVybGF5UG9zaXRpb24pKFRISVNfIExPTkcsIExPTkcgKSBQVVJFOwotICAgIFNURE1FVEhPRChTZXRQYWxldHRlKShUSElTXyBMUERJUkVDVERSQVdQQUxFVFRFKSBQVVJFOwotICAgIFNURE1FVEhPRChVbmxvY2spKFRISVNfIExQVk9JRCkgUFVSRTsKLSAgICBTVERNRVRIT0QoVXBkYXRlT3ZlcmxheSkoVEhJU18gTFBSRUNUMzIsIExQRElSRUNURFJBV1NVUkZBQ0UzLExQUkVDVDMyLERXT1JELCBMUERET1ZFUkxBWUZYKSBQVVJFOwotICAgIFNURE1FVEhPRChVcGRhdGVPdmVybGF5RGlzcGxheSkoVEhJU18gRFdPUkQpIFBVUkU7Ci0gICAgU1RETUVUSE9EKFVwZGF0ZU92ZXJsYXlaT3JkZXIpKFRISVNfIERXT1JELCBMUERJUkVDVERSQVdTVVJGQUNFMykgUFVSRTsKKy8qMGMqL1NURE1FVEhPRChBZGRBdHRhY2hlZFN1cmZhY2UpKFRISVNfIExQRElSRUNURFJBV1NVUkZBQ0UzKSBQVVJFOworLyoxMCovU1RETUVUSE9EKEFkZE92ZXJsYXlEaXJ0eVJlY3QpKFRISVNfIExQUkVDVDMyKSBQVVJFOworLyoxNCovU1RETUVUSE9EKEJsdCkoVEhJU18gTFBSRUNUMzIsTFBESVJFQ1REUkFXU1VSRkFDRTMsIExQUkVDVDMyLERXT1JELCBMUEREQkxURlgpIFBVUkU7CisvKjE4Ki9TVERNRVRIT0QoQmx0QmF0Y2gpKFRISVNfIExQRERCTFRCQVRDSCwgRFdPUkQsIERXT1JEICkgUFVSRTsKKy8qMWMqL1NURE1FVEhPRChCbHRGYXN0KShUSElTXyBEV09SRCxEV09SRCxMUERJUkVDVERSQVdTVVJGQUNFMywgTFBSRUNUMzIsRFdPUkQpIFBVUkU7CisvKjIwKi9TVERNRVRIT0QoRGVsZXRlQXR0YWNoZWRTdXJmYWNlKShUSElTXyBEV09SRCxMUERJUkVDVERSQVdTVVJGQUNFMykgUFVSRTsKKy8qMjQqL1NURE1FVEhPRChFbnVtQXR0YWNoZWRTdXJmYWNlcykoVEhJU18gTFBWT0lELExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSykgUFVSRTsgICAgCisvKjI4Ki9TVERNRVRIT0QoRW51bU92ZXJsYXlaT3JkZXJzKShUSElTXyBEV09SRCxMUFZPSUQsTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLKSBQVVJFOworLyoyYyovU1RETUVUSE9EKEZsaXApKFRISVNfIExQRElSRUNURFJBV1NVUkZBQ0UzLCBEV09SRCkgUFVSRTsKKy8qMzAqL1NURE1FVEhPRChHZXRBdHRhY2hlZFN1cmZhY2UpKFRISVNfIExQRERTQ0FQUywgTFBESVJFQ1REUkFXU1VSRkFDRTMgRkFSICopIFBVUkU7CisvKjM0Ki9TVERNRVRIT0QoR2V0Qmx0U3RhdHVzKShUSElTXyBEV09SRCkgUFVSRTsKKy8qMzgqL1NURE1FVEhPRChHZXRDYXBzKShUSElTXyBMUEREU0NBUFMpIFBVUkU7CisvKjNjKi9TVERNRVRIT0QoR2V0Q2xpcHBlcikoVEhJU18gTFBESVJFQ1REUkFXQ0xJUFBFUiBGQVIqKSBQVVJFOworLyo0MCovU1RETUVUSE9EKEdldENvbG9yS2V5KShUSElTXyBEV09SRCwgTFBERENPTE9SS0VZKSBQVVJFOworLyo0NCovU1RETUVUSE9EKEdldERDKShUSElTXyBIREMzMiBGQVIgKikgUFVSRTsKKy8qNDgqL1NURE1FVEhPRChHZXRGbGlwU3RhdHVzKShUSElTXyBEV09SRCkgUFVSRTsKKy8qNGMqL1NURE1FVEhPRChHZXRPdmVybGF5UG9zaXRpb24pKFRISVNfIExQTE9ORywgTFBMT05HICkgUFVSRTsKKy8qNTAqL1NURE1FVEhPRChHZXRQYWxldHRlKShUSElTXyBMUERJUkVDVERSQVdQQUxFVFRFIEZBUiopIFBVUkU7CisvKjU0Ki9TVERNRVRIT0QoR2V0UGl4ZWxGb3JtYXQpKFRISVNfIExQRERQSVhFTEZPUk1BVCkgUFVSRTsKKy8qNTgqL1NURE1FVEhPRChHZXRTdXJmYWNlRGVzYykoVEhJU18gTFBERFNVUkZBQ0VERVNDKSBQVVJFOworLyo1YyovU1RETUVUSE9EKEluaXRpYWxpemUpKFRISVNfIExQRElSRUNURFJBVywgTFBERFNVUkZBQ0VERVNDKSBQVVJFOworLyo2MCovU1RETUVUSE9EKElzTG9zdCkoVEhJUykgUFVSRTsKKy8qNjQqL1NURE1FVEhPRChMb2NrKShUSElTXyBMUFJFQ1QzMixMUEREU1VSRkFDRURFU0MsRFdPUkQsSEFORExFMzIpIFBVUkU7CisvKjY4Ki9TVERNRVRIT0QoUmVsZWFzZURDKShUSElTXyBIREMzMikgUFVSRTsKKy8qNmMqL1NURE1FVEhPRChSZXN0b3JlKShUSElTKSBQVVJFOworLyo3MCovU1RETUVUSE9EKFNldENsaXBwZXIpKFRISVNfIExQRElSRUNURFJBV0NMSVBQRVIpIFBVUkU7CisvKjc0Ki9TVERNRVRIT0QoU2V0Q29sb3JLZXkpKFRISVNfIERXT1JELCBMUEREQ09MT1JLRVkpIFBVUkU7CisvKjc4Ki9TVERNRVRIT0QoU2V0T3ZlcmxheVBvc2l0aW9uKShUSElTXyBMT05HLCBMT05HICkgUFVSRTsKKy8qN2MqL1NURE1FVEhPRChTZXRQYWxldHRlKShUSElTXyBMUERJUkVDVERSQVdQQUxFVFRFKSBQVVJFOworLyo4MCovU1RETUVUSE9EKFVubG9jaykoVEhJU18gTFBWT0lEKSBQVVJFOworLyo4NCovU1RETUVUSE9EKFVwZGF0ZU92ZXJsYXkpKFRISVNfIExQUkVDVDMyLCBMUERJUkVDVERSQVdTVVJGQUNFMyxMUFJFQ1QzMixEV09SRCwgTFBERE9WRVJMQVlGWCkgUFVSRTsKKy8qODgqL1NURE1FVEhPRChVcGRhdGVPdmVybGF5RGlzcGxheSkoVEhJU18gRFdPUkQpIFBVUkU7CisvKjhjKi9TVERNRVRIT0QoVXBkYXRlT3ZlcmxheVpPcmRlcikoVEhJU18gRFdPUkQsIExQRElSRUNURFJBV1NVUkZBQ0UzKSBQVVJFOwogICAgIC8qKiogQWRkZWQgaW4gdGhlIHYyIGludGVyZmFjZSAqKiovCi0gICAgU1RETUVUSE9EKEdldERESW50ZXJmYWNlKShUSElTXyBMUFZPSUQgRkFSICopIFBVUkU7Ci0gICAgU1RETUVUSE9EKFBhZ2VMb2NrKShUSElTXyBEV09SRCkgUFVSRTsKLSAgICBTVERNRVRIT0QoUGFnZVVubG9jaykoVEhJU18gRFdPUkQpIFBVUkU7CisvKjkwKi9TVERNRVRIT0QoR2V0RERJbnRlcmZhY2UpKFRISVNfIExQVk9JRCBGQVIgKikgUFVSRTsKKy8qOTQqL1NURE1FVEhPRChQYWdlTG9jaykoVEhJU18gRFdPUkQpIFBVUkU7CisvKjk4Ki9TVERNRVRIT0QoUGFnZVVubG9jaykoVEhJU18gRFdPUkQpIFBVUkU7CiAgICAgLyoqKiBBZGRlZCBpbiB0aGUgVjMgaW50ZXJmYWNlICoqKi8KLSAgICBTVERNRVRIT0QoU2V0U3VyZmFjZURlc2MpKFRISVNfIExQRERTVVJGQUNFREVTQywgRFdPUkQpIFBVUkU7CisvKjljKi9TVERNRVRIT0QoU2V0U3VyZmFjZURlc2MpKFRISVNfIExQRERTVVJGQUNFREVTQywgRFdPUkQpIFBVUkU7CiB9ICpMUERJUkVDVERSQVdTVVJGQUNFM19WVEFCTEUsSURpcmVjdERyYXdTdXJmYWNlM19WVGFibGU7CiAKIHN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2UzIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVidWdzdHIuaCBiL2luY2x1ZGUvZGVidWdzdHIuaAppbmRleCA3YmIzOTk2Li40NDgzMjgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RlYnVnc3RyLmgKKysrIGIvaW5jbHVkZS9kZWJ1Z3N0ci5oCkBAIC0xMSw4ICsxMSw4IEBACiBMUFNUUiBkZWJ1Z3N0cl9hIChMUENTVFIgcyk7CiBMUFNUUiBkZWJ1Z3N0cl93biAoTFBDV1NUUiBzLCBpbnQgbik7CiBMUFNUUiBkZWJ1Z3N0cl93IChMUENXU1RSIHMpOwotTFBTVFIgZGVidWdyZXMgKGNvbnN0IHZvaWQgKnJlcyk7CitMUFNUUiBkZWJ1Z3Jlc19hIChMUENTVFIgcmVzKTsKK0xQU1RSIGRlYnVncmVzX3cgKExQQ1dTVFIgcmVzKTsKK3ZvaWQgZGVidWdfZHVtcHN0ciAoTFBDU1RSIHMpOwogCiAjZW5kaWYgLyogX19XSU5FX0RFQlVHU1RSX0ggKi8KLQotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlYnVndG9vbHMuaCBiL2luY2x1ZGUvZGVidWd0b29scy5oCmluZGV4IDhkZWM0YWMuLmI2YjUwZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGVidWd0b29scy5oCisrKyBiL2luY2x1ZGUvZGVidWd0b29scy5oCkBAIC0yLDYgKzIsOCBAQAogI2lmbmRlZiBfX1dJTkVfREVCVUdUT09MU19ICiAjZGVmaW5lIF9fV0lORV9ERUJVR1RPT0xTX0gKIAorI2lmZGVmIF9fV0lORV9fICAvKiBEZWJ1Z2dpbmcgaW50ZXJmYWNlIGlzIGludGVybmFsIHRvIFdpbmUgKi8KKwogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAiZGVidWdzdHIuaCIKIApAQCAtNTAsNCArNTIsNiBAQAogI2RlZmluZSBXQVJOX09OKGNoKSAgIERFQlVHR0lORyh3YXJuLCBjaCkKICNkZWZpbmUgVFJBQ0VfT04oY2gpICBERUJVR0dJTkcodHJhY2UsIGNoKQogCisjZW5kaWYgIC8qIF9fV0lORV9fICovCisKICNlbmRpZiAgLyogX19XSU5FX0RFQlVHVE9PTFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9maWxlLmggYi9pbmNsdWRlL2ZpbGUuaAppbmRleCA3YjljNmU0Li43YmEwYzBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZpbGUuaAorKysgYi9pbmNsdWRlL2ZpbGUuaApAQCAtNTgsOSArNTgsNiBAQAogZXh0ZXJuIGludCBESVJfSW5pdCh2b2lkKTsKIGV4dGVybiBVSU5UMzIgRElSX0dldFdpbmRvd3NVbml4RGlyKCBMUFNUUiBwYXRoLCBVSU5UMzIgY291bnQgKTsKIGV4dGVybiBVSU5UMzIgRElSX0dldFN5c3RlbVVuaXhEaXIoIExQU1RSIHBhdGgsIFVJTlQzMiBjb3VudCApOwotZXh0ZXJuIFVJTlQzMiBESVJfR2V0VGVtcFVuaXhEaXIoIExQU1RSIHBhdGgsIFVJTlQzMiBjb3VudCApOwotZXh0ZXJuIFVJTlQzMiBESVJfR2V0RG9zUGF0aCggSU5UMzIgZWxlbWVudCwgTFBTVFIgcGF0aCwgVUlOVDMyIGNvdW50ICk7Ci1leHRlcm4gVUlOVDMyIERJUl9HZXRVbml4UGF0aCggSU5UMzIgZWxlbWVudCwgTFBTVFIgcGF0aCwgVUlOVDMyIGNvdW50ICk7CiBleHRlcm4gRFdPUkQgRElSX1NlYXJjaFBhdGgoIExQQ1NUUiBwYXRoLCBMUENTVFIgbmFtZSwgTFBDU1RSIGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9TX0ZVTExfTkFNRSAqZnVsbF9uYW1lLCBCT09MMzIgd2luMzIgKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9nbG9iYWwuaCBiL2luY2x1ZGUvZ2xvYmFsLmgKaW5kZXggZGM4YzkzOS4uN2FjYjZhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9nbG9iYWwuaAorKysgYi9pbmNsdWRlL2dsb2JhbC5oCkBAIC0xNiw2ICsxNiw3IEBACiAgICAgaW50IHNobWlkOwogfSBTSE1EQVRBOwogCisvKiBtZW1vcnkvZ2xvYmFsLmMgKi8KIGV4dGVybiBIR0xPQkFMMTYgR0xPQkFMX0NyZWF0ZUJsb2NrKCBVSU5UMTYgZmxhZ3MsIGNvbnN0IHZvaWQgKnB0ciwgRFdPUkQgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIR0xPQkFMMTYgaE93bmVyLCBCT09MMTYgaXNDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wxNiBpczMyQml0LCBCT09MMTYgaXNSZWFkT25seSwKQEAgLTI2LDQgKzI3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMTYgaXNSZWFkT25seSApOwogZXh0ZXJuIFdPUkQgR2xvYmFsSGFuZGxlVG9TZWwoIEhHTE9CQUwxNiBoYW5kbGUgKTsKIAorLyogbWVtb3J5L3ZpcnR1YWwuYyAqLworZXh0ZXJuIERXT1JEIFZJUlRVQUxfR2V0UGFnZVNpemUodm9pZCk7CitleHRlcm4gRFdPUkQgVklSVFVBTF9HZXRHcmFudWxhcml0eSh2b2lkKTsKKwogI2VuZGlmICAvKiBfX1dJTkVfR0xPQkFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaW1hZ2VsaXN0LmggYi9pbmNsdWRlL2ltYWdlbGlzdC5oCmluZGV4IDM2MmNlNGIuLmNlMDdhNmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaW1hZ2VsaXN0LmgKKysrIGIvaW5jbHVkZS9pbWFnZWxpc3QuaApAQCAtMTEsOCArMTEsOCBAQAogewogICAgIEhCSVRNQVAzMiBoYm1JbWFnZTsKICAgICBIQklUTUFQMzIgaGJtTWFzazsKLSAgICBIQlJVU0gzMiAgaGJydXNoQmxlbmQyNTsKLSAgICBIQlJVU0gzMiAgaGJydXNoQmxlbmQ1MDsKKyAgICBIQlJVU0gzMiAgaGJyQmxlbmQyNTsKKyAgICBIQlJVU0gzMiAgaGJyQmxlbmQ1MDsKICAgICBDT0xPUlJFRiAgY2xyQms7CiAgICAgSU5UMzIgICAgIGNJbml0aWFsOwogICAgIElOVDMyICAgICBjR3JvdzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvazMyb2JqLmggYi9pbmNsdWRlL2szMm9iai5oCmluZGV4IDNlNGRjMjguLjBlMWRhZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvazMyb2JqLmgKKysrIGIvaW5jbHVkZS9rMzJvYmouaApAQCAtNjIsNyArNjIsOCBAQAogZXh0ZXJuIEJPT0wzMiBLMzJPQkpfSXNWYWxpZCggSzMyT0JKICpwdHIsIEszMk9CSl9UWVBFIHR5cGUgKTsKIGV4dGVybiBCT09MMzIgSzMyT0JKX0FkZE5hbWUoIEszMk9CSiAqb2JqLCBMUENTVFIgbmFtZSApOwogZXh0ZXJuIEszMk9CSiAqSzMyT0JKX0NyZWF0ZSggSzMyT0JKX1RZUEUgdHlwZSwgRFdPUkQgc2l6ZSwgTFBDU1RSIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBhY2Nlc3MsIEhBTkRMRTMyICpoYW5kbGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGFjY2VzcywgU0VDVVJJVFlfQVRUUklCVVRFUyAqc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEUzMiAqaGFuZGxlICk7CiBleHRlcm4gSzMyT0JKICpLMzJPQkpfRmluZE5hbWUoIExQQ1NUUiBuYW1lICk7CiBleHRlcm4gSzMyT0JKICpLMzJPQkpfRmluZE5hbWVUeXBlKCBMUENTVFIgbmFtZSwgSzMyT0JKX1RZUEUgdHlwZSApOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21vZHVsZS5oIGIvaW5jbHVkZS9tb2R1bGUuaAppbmRleCBlNzlhYTQ3Li4wMTdiM2MyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbW9kdWxlLmgKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlICJwZV9pbWFnZS5oIgogCiAgIC8qIEluLW1lbW9yeSBtb2R1bGUgc3RydWN0dXJlLiBTZWUgJ1dpbmRvd3MgSW50ZXJuYWxzJyBwLiAyMTkgKi8KLXR5cGVkZWYgc3RydWN0Cit0eXBlZGVmIHN0cnVjdCBfTkVfTU9EVUxFCiB7CiAgICAgV09SRCAgICBtYWdpYzsgICAgICAgICAgICAvKiAwMCAnTkUnIHNpZ25hdHVyZSAqLwogICAgIFdPUkQgICAgY291bnQ7ICAgICAgICAgICAgLyogMDIgVXNhZ2UgY291bnQgKi8KQEAgLTEyOCwxMCArMTI4LDExIEBACiBleHRlcm4gTFBTVFIgTU9EVUxFX0dldE1vZHVsZU5hbWUoIEhNT0RVTEUzMiBoTW9kdWxlICk7CiBleHRlcm4gdm9pZCBNT0RVTEVfUmVnaXN0ZXJNb2R1bGUoIE5FX01PRFVMRSAqcE1vZHVsZSApOwogZXh0ZXJuIEhNT0RVTEUzMiBNT0RVTEVfRmluZE1vZHVsZSggTFBDU1RSIHBhdGggKTsKLWV4dGVybiBISU5TVEFOQ0UxNiBNT0RVTEVfQ3JlYXRlSW5zdGFuY2UoIEhNT0RVTEUxNiBoTW9kdWxlLCBMT0FEUEFSQU1TKiBwYXJhbUJsb2NrICk7CitleHRlcm4gSElOU1RBTkNFMTYgTU9EVUxFX0NyZWF0ZUluc3RhbmNlKCBITU9EVUxFMTYgaE1vZHVsZSwgQk9PTDMyIGxpYl9vbmx5ICk7CiBleHRlcm4gSElOU1RBTkNFMTYgTU9EVUxFX0dldEluc3RhbmNlKCBITU9EVUxFMzIgaE1vZHVsZSApOwogZXh0ZXJuIEhNT0RVTEUzMiBNT0RVTEVfQ3JlYXRlRHVtbXlNb2R1bGUoIGNvbnN0IE9GU1RSVUNUICpvZnMgKTsKLWV4dGVybiBISU5TVEFOQ0UxNiBNT0RVTEVfTG9hZCggTFBDU1RSIG5hbWUsIExQVk9JRCBwYXJhbUJsb2NrLCBVSU5UMTYgZmxhZ3MgKTsKK2V4dGVybiBISU5TVEFOQ0UxNiBNT0RVTEVfTG9hZCggTFBDU1RSIG5hbWUsIFVJTlQxNiB1RmxhZ3MsIExQQ1NUUiBjbWRfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGVudiwgVUlOVDMyIHNob3dfY21kICk7CiBleHRlcm4gV09SRCBNT0RVTEVfR2V0T3JkaW5hbCggSE1PRFVMRTMyIGhNb2R1bGUsIGNvbnN0IGNoYXIgKm5hbWUgKTsKIGV4dGVybiBGQVJQUk9DMTYgTU9EVUxFX0dldEVudHJ5UG9pbnQoIEhNT0RVTEUzMiBoTW9kdWxlLCBXT1JEIG9yZGluYWwgKTsKIGV4dGVybiBCT09MMTYgTU9EVUxFX1NldEVudHJ5UG9pbnQoIEhNT0RVTEUzMiBoTW9kdWxlLCBXT1JEIG9yZGluYWwsCmRpZmYgLS1naXQgYS9pbmNsdWRlL211bHRpbWVkaWEuaCBiL2luY2x1ZGUvbXVsdGltZWRpYS5oCmluZGV4IDhjNjIwNzAuLmNiNzBkNWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbXVsdGltZWRpYS5oCisrKyBiL2luY2x1ZGUvbXVsdGltZWRpYS5oCkBAIC0yMCwxOCArMjAsMTYgQEAKICNkZWZpbmUgTUFYX01JRElPVVREUlYgCSgxNikKICNkZWZpbmUgTUFYX01DSU1JRElEUlYgCSgxKQogCi0jaWYgZGVmaW5lZCAobGludXgpCi0jZGVmaW5lIF9fSEFTX1NPVU5EQ0FSRF9IX18KLSNpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+Ci0jZWxpZiBkZWZpbmVkIChfX0ZyZWVCU0RfXykKLSNkZWZpbmUgX19IQVNfU09VTkRDQVJEX0hfXwotI2luY2x1ZGUgPG1hY2hpbmUvc291bmRjYXJkLmg+Ci0jaW5jbHVkZSA8c3lzL2Vycm5vLmg+CisjaWZkZWYgSEFWRV9TWVNfU09VTkRDQVJEX0gKKyMgaW5jbHVkZSA8c3lzL3NvdW5kY2FyZC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9NQUNISU5FX1NPVU5EQ0FSRF9ICisjIGluY2x1ZGUgPG1hY2hpbmUvc291bmRjYXJkLmg+CiAjZW5kaWYKIAotI2lmIGRlZmluZWQgKF9fSEFTX1NPVU5EQ0FSRF9IX18pCisjaW5jbHVkZSA8c3lzL2Vycm5vLmg+CiAKLSNkZWZpbmUgTUlESV9ERVYgIi9kZXYvc2VxdWVuY2VyIgorI2RlZmluZSBNSURJX0RFViAiL2Rldi9taWRpIgogCiAjaWZkZWYgU09VTkRfVkVSU0lPTgogI2RlZmluZSBJT0NUTChhLGIsYykJCWlvY3RsKGEsYiwmYykKQEAgLTc1LDcgKzczLDQgQEAKIAlITE9DQUwxNgloTWlkaUhkcjsKIAlXT1JECWR3U3RhdHVzOwogfSBMSU5VWF9NQ0lNSURJOwotCi0jZW5kaWYKLQogI2VuZGlmIC8qIF9fV0lORV9NVUxUSU1FRElBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGVfaW1hZ2UuaCBiL2luY2x1ZGUvcGVfaW1hZ2UuaAppbmRleCBjZWFiMDg2Li42MWM1OTEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BlX2ltYWdlLmgKKysrIGIvaW5jbHVkZS9wZV9pbWFnZS5oCkBAIC00Miw2ICs0Miw4IEBACiBleHRlcm4gRFdPUkQgUEVfU2l6ZW9mUmVzb3VyY2UzMihISU5TVEFOQ0UzMixIUlNSQzMyKTsKIGV4dGVybiBITU9EVUxFMzIgUEVfTG9hZExpYnJhcnlFeDMyQShMUENTVFIsc3RydWN0IF9QREIzMiosSEZJTEUzMixEV09SRCk7CiBleHRlcm4gSEdMT0JBTDMyIFBFX0xvYWRSZXNvdXJjZTMyKEhJTlNUQU5DRTMyLEhSU1JDMzIpOworZXh0ZXJuIEhJTlNUQU5DRTE2IFBFX0xvYWRNb2R1bGUoIEhGSUxFMzIgaEZpbGUsIE9GU1RSVUNUICpvZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGNtZF9saW5lLCBMUENTVFIgZW52LCBVSU5UMTYgc2hvd0NtZCk7CiAKIHN0cnVjdCBfUERCMzI7IC8qIGZvcndhcmQgZGVmaW5pdGlvbiAqLwogc3RydWN0IF9USERCOyAvKiBmb3J3YXJkIGRlZmluaXRpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJvY2Vzcy5oIGIvaW5jbHVkZS9wcm9jZXNzLmgKaW5kZXggMDMyM2E5OC4uNTRjNjk5ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcm9jZXNzLmgKKysrIGIvaW5jbHVkZS9wcm9jZXNzLmgKQEAgLTEyLDcgKzEyLDggQEAKICNpbmNsdWRlICJ3aW5udC5oIgogI2luY2x1ZGUgImszMm9iai5oIgogI2luY2x1ZGUgInBlX2ltYWdlLmgiCi0jaW5jbHVkZSAidGFzay5oIgorCitzdHJ1Y3QgX05FX01PRFVMRTsKIAogLyogUHJvY2VzcyBoYW5kbGUgZW50cnkgKi8KIHR5cGVkZWYgc3RydWN0CkBAIC0zMSwyMSArMzIsMjUgQEAKIC8qIFdpbjMyIHByb2Nlc3MgZW52aXJvbm1lbnQgZGF0YWJhc2UgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgTFBTVFIgICAgICAgICAgIGVudmlyb247ICAgICAgICAgIC8qIDAwIFByb2Nlc3MgZW52aXJvbm1lbnQgc3RyaW5ncyAqLwotICAgIERXT1JEICAgICAgICAgICBlbnZfc2l6ZTsgICAgICAgICAvKiAwNCBFbnZpcm9ubWVudCBzaXplICh3YXM6IFVua25vd24pICovCi0gICAgTFBTVFIgICAgICAgICAgIGNtZF9saW5lOyAgICAgICAgIC8qIDA4IENvbW1hbmQgbGluZSAqLwotICAgIExQU1RSICAgICAgICAgICBjdXJfZGlyOyAgICAgICAgICAvKiAwYyBDdXJyZW50IGRpcmVjdG9yeSAqLwotICAgIFNUQVJUVVBJTkZPMzJBICpzdGFydHVwX2luZm87ICAgICAvKiAxMCBTdGFydHVwIGluZm9ybWF0aW9uICovCi0gICAgSEFORExFMzIgICAgICAgIGhTdGRpbjsgICAgICAgICAgIC8qIDE0IEhhbmRsZSBmb3Igc3RhbmRhcmQgaW5wdXQgKi8KLSAgICBIQU5ETEUzMiAgICAgICAgaFN0ZG91dDsgICAgICAgICAgLyogMTggSGFuZGxlIGZvciBzdGFuZGFyZCBvdXRwdXQgKi8KLSAgICBIQU5ETEUzMiAgICAgICAgaFN0ZGVycjsgICAgICAgICAgLyogMWMgSGFuZGxlIGZvciBzdGFuZGFyZCBlcnJvciAqLwotICAgIERXT1JEICAgICAgICAgICB1bmtub3duMjsgICAgICAgICAvKiAyMCBVbmtub3duICovCi0gICAgRFdPUkQgICAgICAgICAgIGluaGVyaXRfY29uc29sZTsgIC8qIDI0IEluaGVyaXQgY29uc29sZSBmbGFnICovCi0gICAgRFdPUkQgICAgICAgICAgIGJyZWFrX3R5cGU7ICAgICAgIC8qIDI4IENvbnNvbGUgZXZlbnRzIGZsYWcgKi8KLSAgICBLMzJPQkogICAgICAgICAqYnJlYWtfc2VtOyAgICAgICAgLyogMmMgU2V0Q29uc29sZUN0cmxIYW5kbGVyIHNlbWFwaG9yZSAqLwotICAgIEszMk9CSiAgICAgICAgICpicmVha19ldmVudDsgICAgICAvKiAzMCBTZXRDb25zb2xlQ3RybEhhbmRsZXIgZXZlbnQgKi8KLSAgICBLMzJPQkogICAgICAgICAqYnJlYWtfdGhyZWFkOyAgICAgLyogMzQgU2V0Q29uc29sZUN0cmxIYW5kbGVyIHRocmVhZCAqLwotICAgIHZvaWQgICAgICAgICAgICpicmVha19oYW5kbGVyczsgICAvKiAzOCBMaXN0IG9mIGNvbnNvbGUgaGFuZGxlcnMgKi8KKyAgICBMUFNUUiAgICAgICAgICAgIGVudmlyb247ICAgICAgICAgIC8qIDAwIFByb2Nlc3MgZW52aXJvbm1lbnQgc3RyaW5ncyAqLworICAgIERXT1JEICAgICAgICAgICAgdW5rbm93bjE7ICAgICAgICAgLyogMDQgVW5rbm93biAqLworICAgIExQU1RSICAgICAgICAgICAgY21kX2xpbmU7ICAgICAgICAgLyogMDggQ29tbWFuZCBsaW5lICovCisgICAgTFBTVFIgICAgICAgICAgICBjdXJfZGlyOyAgICAgICAgICAvKiAwYyBDdXJyZW50IGRpcmVjdG9yeSAqLworICAgIFNUQVJUVVBJTkZPMzJBICAqc3RhcnR1cF9pbmZvOyAgICAgLyogMTAgU3RhcnR1cCBpbmZvcm1hdGlvbiAqLworICAgIEhBTkRMRTMyICAgICAgICAgaFN0ZGluOyAgICAgICAgICAgLyogMTQgSGFuZGxlIGZvciBzdGFuZGFyZCBpbnB1dCAqLworICAgIEhBTkRMRTMyICAgICAgICAgaFN0ZG91dDsgICAgICAgICAgLyogMTggSGFuZGxlIGZvciBzdGFuZGFyZCBvdXRwdXQgKi8KKyAgICBIQU5ETEUzMiAgICAgICAgIGhTdGRlcnI7ICAgICAgICAgIC8qIDFjIEhhbmRsZSBmb3Igc3RhbmRhcmQgZXJyb3IgKi8KKyAgICBEV09SRCAgICAgICAgICAgIHVua25vd24yOyAgICAgICAgIC8qIDIwIFVua25vd24gKi8KKyAgICBEV09SRCAgICAgICAgICAgIGluaGVyaXRfY29uc29sZTsgIC8qIDI0IEluaGVyaXQgY29uc29sZSBmbGFnICovCisgICAgRFdPUkQgICAgICAgICAgICBicmVha190eXBlOyAgICAgICAvKiAyOCBDb25zb2xlIGV2ZW50cyBmbGFnICovCisgICAgSzMyT0JKICAgICAgICAgICpicmVha19zZW07ICAgICAgICAvKiAyYyBTZXRDb25zb2xlQ3RybEhhbmRsZXIgc2VtYXBob3JlICovCisgICAgSzMyT0JKICAgICAgICAgICpicmVha19ldmVudDsgICAgICAvKiAzMCBTZXRDb25zb2xlQ3RybEhhbmRsZXIgZXZlbnQgKi8KKyAgICBLMzJPQkogICAgICAgICAgKmJyZWFrX3RocmVhZDsgICAgIC8qIDM0IFNldENvbnNvbGVDdHJsSGFuZGxlciB0aHJlYWQgKi8KKyAgICB2b2lkICAgICAgICAgICAgKmJyZWFrX2hhbmRsZXJzOyAgIC8qIDM4IExpc3Qgb2YgY29uc29sZSBoYW5kbGVycyAqLworICAgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIFdpbmUtc3BlY2lmaWMgZmllbGRzICovCisgICAgQ1JJVElDQUxfU0VDVElPTiBzZWN0aW9uOyAgICAgICAgICAvKiAzYyBFbnYgREIgY3JpdGljYWwgc2VjdGlvbiAqLworICAgIExQV1NUUiAgICAgICAgICAgY21kX2xpbmVXOyAgICAgICAgLyogNDAgVW5pY29kZSBjb21tYW5kIGxpbmUgKi8KKyAgICBXT1JEICAgICAgICAgICAgIGVudl9zZWw7ICAgICAgICAgIC8qIDQ0IEVudmlyb25tZW50IHN0cmluZ3Mgc2VsZWN0b3IgKi8KIH0gRU5WREI7CiAKIC8qIFdpbjMyIHByb2Nlc3MgZGF0YWJhc2UgKi8KQEAgLTEwMywxNyArMTA4LDI3IEBACiAjZGVmaW5lIFBST0NFU1NfSURfVE9fUERCKGlkKSAgKChQREIzMiAqKSgoaWQpIF4gUFJPQ0VTU19PQkZVU0NBVE9SKSkKICNkZWZpbmUgUERCX1RPX1BST0NFU1NfSUQocGRiKSAoKERXT1JEKShwZGIpIF4gUFJPQ0VTU19PQkZVU0NBVE9SKQogCisvKiBzY2hlZHVsZXIvZW52aXJvbi5jICovCitleHRlcm4gQk9PTDMyIEVOVl9CdWlsZEVudmlyb25tZW50KCBQREIzMiAqcGRiICk7CitleHRlcm4gQk9PTDMyIEVOVl9Jbmhlcml0RW52aXJvbm1lbnQoIFBEQjMyICpwZGIsIExQQ1NUUiBlbnYgKTsKK2V4dGVybiB2b2lkIEVOVl9GcmVlRW52aXJvbm1lbnQoIFBEQjMyICpwZGIgKTsKKwogLyogc2NoZWR1bGVyL2hhbmRsZS5jICovCi1leHRlcm4gSEFORExFX1RBQkxFICpIQU5ETEVfQWxsb2NUYWJsZSggUERCMzIgKnByb2Nlc3MgKTsKLWV4dGVybiBIQU5ETEUzMiBIQU5ETEVfQWxsb2MoIEszMk9CSiAqcHRyLCBEV09SRCBhY2Nlc3MsIEJPT0wzMiBpbmhlcml0ICk7Ci1leHRlcm4gSzMyT0JKICpIQU5ETEVfR2V0T2JqUHRyKCBIQU5ETEUzMiBoYW5kbGUsIEszMk9CSl9UWVBFIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBhY2Nlc3MgKTsKLWV4dGVybiBCT09MMzIgSEFORExFX1NldE9ialB0ciggSEFORExFMzIgaGFuZGxlLCBLMzJPQkogKnB0ciwgRFdPUkQgYWNjZXNzICk7CitleHRlcm4gQk9PTDMyIEhBTkRMRV9DcmVhdGVUYWJsZSggUERCMzIgKnBkYiwgQk9PTDMyIGluaGVyaXQgKTsKK2V4dGVybiBIQU5ETEUzMiBIQU5ETEVfQWxsb2MoIFBEQjMyICpwZGIsIEszMk9CSiAqcHRyLCBEV09SRCBhY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgaW5oZXJpdCApOworZXh0ZXJuIEszMk9CSiAqSEFORExFX0dldE9ialB0ciggUERCMzIgKnBkYiwgSEFORExFMzIgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX1RZUEUgdHlwZSwgRFdPUkQgYWNjZXNzICk7CitleHRlcm4gQk9PTDMyIEhBTkRMRV9TZXRPYmpQdHIoIFBEQjMyICpwZGIsIEhBTkRMRTMyIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKICpwdHIsIERXT1JEIGFjY2VzcyApOworZXh0ZXJuIHZvaWQgSEFORExFX0Nsb3NlQWxsKCBQREIzMiAqcGRiLCBLMzJPQkogKnB0ciApOwogCiAvKiBzY2hlZHVsZXIvcHJvY2Vzcy5jICovCiBleHRlcm4gUERCMzIgKlBST0NFU1NfQ3VycmVudCh2b2lkKTsKIGV4dGVybiBQREIzMiAqUFJPQ0VTU19HZXRQdHIoIEhBTkRMRTMyIGhhbmRsZSwgRFdPUkQgYWNjZXNzICk7CiBleHRlcm4gUERCMzIgKlBST0NFU1NfSWRUb1BEQiggRFdPUkQgaWQgKTsKLWV4dGVybiBQREIzMiAqUFJPQ0VTU19DcmVhdGUoIFREQiAqcFRhc2ssIExQQ1NUUiBjbWRfbGluZSApOwotZXh0ZXJuIHZvaWQgUFJPQ0VTU19DbG9zZU9iakhhbmRsZXMoUERCMzIgKnBkYiwgSzMyT0JKICpwdHIpOworZXh0ZXJuIFBEQjMyICpQUk9DRVNTX0NyZWF0ZSggc3RydWN0IF9ORV9NT0RVTEUgKnBNb2R1bGUsIExQQ1NUUiBjbWRfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBlbnYsIEhJTlNUQU5DRTE2IGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhJTlNUQU5DRTE2IGhQcmV2SW5zdGFuY2UsIFVJTlQzMiBjbWRTaG93ICk7CisKICNlbmRpZiAgLyogX19XSU5FX1BST0NFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcm9ncmVzcy5oIGIvaW5jbHVkZS9wcm9ncmVzcy5oCmluZGV4IDBhYWRiMTUuLjM2YjcwNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJvZ3Jlc3MuaAorKysgYi9pbmNsdWRlL3Byb2dyZXNzLmgKQEAgLTE2LDYgKzE2LDggQEAKICAgSU5UMzIgICAgICAgTWluVmFsOyAgICAgICAvKiBNaW5pbXVtIHByb2dyZXNzIHZhbHVlICovCiAgIElOVDMyICAgICAgIE1heFZhbDsgICAgICAgLyogTWF4aW11bSBwcm9ncmVzcyB2YWx1ZSAqLwogICBJTlQzMiAgICAgICBTdGVwOyAgICAgICAgIC8qIFN0ZXAgdG8gdXNlIG9uIFBNQl9TVEVQSVQgKi8KKyAgQ09MT1JSRUYgICAgQ29sb3JCYXI7ICAgICAvKiBCYXIgY29sb3IgKi8KKyAgQ09MT1JSRUYgICAgQ29sb3JCazsgICAgICAvKiBCYWNrZ3JvdW5kIGNvbG9yICovCiB9IFBST0dSRVNTX0lORk87CiAKIExSRVNVTFQgV0lOQVBJIFByb2dyZXNzV2luZG93UHJvYyhIV05EMzIsIFVJTlQzMiwgV1BBUkFNMzIsIExQQVJBTSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NlbGVjdG9ycy5oIGIvaW5jbHVkZS9zZWxlY3RvcnMuaAppbmRleCA4Y2E4OTdmLi5hMjAzMzU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NlbGVjdG9ycy5oCisrKyBiL2luY2x1ZGUvc2VsZWN0b3JzLmgKQEAgLTE2LDYgKzE2LDcgQEAKIGV4dGVybiBXT1JEIFNFTEVDVE9SX1JlYWxsb2NCbG9jayggV09SRCBzZWwsIGNvbnN0IHZvaWQgKmJhc2UsIERXT1JEIHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gc2VnX3R5cGUgdHlwZSwgQk9PTDMyIGlzMzJiaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiByZWFkb25seSApOworZXh0ZXJuIHZvaWQgU0VMRUNUT1JfTW92ZUJsb2NrKCBXT1JEIHNlbCwgY29uc3Qgdm9pZCAqbmV3X2Jhc2UgKTsKIGV4dGVybiB2b2lkIFNFTEVDVE9SX0ZyZWVCbG9jayggV09SRCBzZWwsIFdPUkQgY291bnQgKTsKIAogI2lmZGVmIF9faTM4Nl9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Rhc2suaCBiL2luY2x1ZGUvdGFzay5oCmluZGV4IDQ2MGY1ZGUuLjBhM2NjODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdGFzay5oCisrKyBiL2luY2x1ZGUvdGFzay5oCkBAIC01MCw2ICs1MCw3IEBACiAKIHN0cnVjdCBfVEhEQjsKIHN0cnVjdCBfV1NJTkZPOworc3RydWN0IF9ORV9NT0RVTEU7CiAKICAgLyogc2lnbmFsIHByb2MgdHlwZWRlZiAqLwogdHlwZWRlZiB2b2lkIChDQUxMQkFDSyAqVVNFUlNJR05BTFBST0MpKEhBTkRMRTE2LCBVSU5UMTYsIFVJTlQxNiwKQEAgLTEyNCwxMSArMTI1LDkgQEAKIAogI3ByYWdtYSBwYWNrKDQpCiAKLWV4dGVybiBCT09MMzIgVEFTS19Jbml0KHZvaWQpOwotZXh0ZXJuIEhUQVNLMTYgVEFTS19DcmVhdGVUYXNrKCBITU9EVUxFMTYgaE1vZHVsZSwgSElOU1RBTkNFMTYgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISU5TVEFOQ0UxNiBoUHJldkluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEUxNiBoRW52aXJvbm1lbnQsIExQQ1NUUiBjbWRMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgY21kU2hvdyApOworZXh0ZXJuIEhUQVNLMTYgVEFTS19DcmVhdGUoIHN0cnVjdCBfVEhEQiAqdGhkYiwgc3RydWN0IF9ORV9NT0RVTEUgKnBNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSElOU1RBTkNFMTYgaEluc3RhbmNlLCBISU5TVEFOQ0UxNiBoUHJldkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBjbWRTaG93ICk7CiBleHRlcm4gdm9pZCBUQVNLX0tpbGxDdXJyZW50VGFzayggSU5UMTYgZXhpdENvZGUgKTsKIGV4dGVybiBIVEFTSzE2IFRBU0tfR2V0TmV4dFRhc2soIEhUQVNLMTYgaFRhc2sgKTsKIGV4dGVybiB2b2lkIFRBU0tfUmVzY2hlZHVsZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdGhyZWFkLmggYi9pbmNsdWRlL3RocmVhZC5oCmluZGV4IDg0ZDVkYWUuLjA5MGNlNjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdGhyZWFkLmgKKysrIGIvaW5jbHVkZS90aHJlYWQuaApAQCAtMTIxLDYgKzEyMSw3IEBACiAKIC8qIHNjaGVkdWxlci90aHJlYWQuYyAqLwogZXh0ZXJuIFRIREIgKlRIUkVBRF9DcmVhdGUoIHN0cnVjdCBfUERCMzIgKnBkYiwgRFdPUkQgc3RhY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgYWxsb2Nfc3RhY2sxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRIUkVBRF9TVEFSVF9ST1VUSU5FIHN0YXJ0X2FkZHIsIExQVk9JRCBwYXJhbSApOwogZXh0ZXJuIFRIREIgKlRIUkVBRF9DdXJyZW50KHZvaWQpOwogZXh0ZXJuIFRIREIgKlRIUkVBRF9HZXRQdHIoIEhBTkRMRTMyIGhhbmRsZSwgRFdPUkQgYWNjZXNzICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Zlci5oIGIvaW5jbHVkZS92ZXIuaAppbmRleCA2MGQwZGVlLi41ZjVkZDk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Zlci5oCisrKyBiL2luY2x1ZGUvdmVyLmgKQEAgLTgsOSArOCw5IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogCiAvKiByZXNvdXJjZSBpZHMgZm9yIGRpZmZlcmVudCB2ZXJzaW9uIGluZm9zICovCi0jZGVmaW5lCVZTX0ZJTEVfSU5GTwlNQUtFSU5UUkVTT1VSQ0UoMTYpCi0jZGVmaW5lCVZTX1ZFUlNJT05fSU5GTwlNQUtFSU5UUkVTT1VSQ0UoMSkKLSNkZWZpbmUJVlNfVVNFUl9JTkZPCU1BS0VJTlRSRVNPVVJDRSgxMDApCisjZGVmaW5lCVZTX0ZJTEVfSU5GTwlNQUtFSU5UUkVTT1VSQ0UxNigxNikKKyNkZWZpbmUJVlNfVkVSU0lPTl9JTkZPCU1BS0VJTlRSRVNPVVJDRTE2KDEpCisjZGVmaW5lCVZTX1VTRVJfSU5GTwlNQUtFSU5UUkVTT1VSQ0UxNigxMDApCiAKICNkZWZpbmUJVlNfRkZJX1NJR05BVFVSRQkweGZlZWYwNGJkTAkvKiBGaWxlSW5mbyBNYWdpYyAqLwogI2RlZmluZQlWU19GRklfU1RSVUNWRVJTSU9OCTB4MDAwMTAwMDBMCS8qIHN0cnVjIHZlcnNpb24gMS4wICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZlcnNpb24uaCBiL2luY2x1ZGUvdmVyc2lvbi5oCmluZGV4IDRmY2FjZjYuLmMwOThkNjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmVyc2lvbi5oCisrKyBiL2luY2x1ZGUvdmVyc2lvbi5oCkBAIC0xICsxIEBACi0jZGVmaW5lIFdJTkVfUkVMRUFTRV9JTkZPICJXaW5lIHJlbGVhc2UgOTgwMzI5IgorI2RlZmluZSBXSU5FX1JFTEVBU0VfSU5GTyAiV2luZSByZWxlYXNlIDk4MDQxMyIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luLmggYi9pbmNsdWRlL3dpbi5oCmluZGV4IGMxZjkxODYuLmViZTQ3Y2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luLmgKKysrIGIvaW5jbHVkZS93aW4uaApAQCAtNzYsNiArNzYsNyBAQAogICAgIERXT1JEICAgICAgICAgIGR3U3R5bGU7ICAgICAgIC8qIFdpbmRvdyBzdHlsZSAoZnJvbSBDcmVhdGVXaW5kb3cpICovCiAgICAgRFdPUkQgICAgICAgICAgZHdFeFN0eWxlOyAgICAgLyogRXh0ZW5kZWQgc3R5bGUgKGZyb20gQ3JlYXRlV2luZG93RXgpICovCiAgICAgVUlOVDMyICAgICAgICAgd0lEbWVudTsgICAgICAgLyogSUQgb3IgaG1lbnUgKGZyb20gQ3JlYXRlV2luZG93KSAqLworICAgIERXT1JEICAgICAgICAgIGhlbHBDb250ZXh0OyAgIC8qIEhlbHAgY29udGV4dCBJRCAqLwogICAgIFdPUkQgICAgICAgICAgIGZsYWdzOyAgICAgICAgIC8qIE1pc2MuIGZsYWdzIChzZWUgYmVsb3cpICovCiAgICAgV2luZG93ICAgICAgICAgd2luZG93OyAgICAgICAgLyogWCB3aW5kb3cgKG9ubHkgZm9yIHRvcC1sZXZlbCB3aW5kb3dzKSAqLwogICAgIEhNRU5VMTYgICAgICAgIGhTeXNNZW51OyAgICAgIC8qIHdpbmRvdydzIGNvcHkgb2YgU3lzdGVtIE1lbnUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luYmFzZS5oIGIvaW5jbHVkZS93aW5iYXNlLmgKaW5kZXggZDFjMzAwNC4uMDk4MzI3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5iYXNlLmgKKysrIGIvaW5jbHVkZS93aW5iYXNlLmgKQEAgLTEwMCw2ICsxMDAsMTUgQEAKICNkZWZpbmUgSEFORExFX0ZMQUdfSU5IRVJJVCAgICAgICAgICAgICAweDAwMDAwMDAxCiAjZGVmaW5lIEhBTkRMRV9GTEFHX1BST1RFQ1RfRlJPTV9DTE9TRSAgMHgwMDAwMDAwMgogCisjZGVmaW5lIFRIUkVBRF9QUklPUklUWV9MT1dFU1QgICAgICAgICAgVEhSRUFEX0JBU0VfUFJJT1JJVFlfTUlOCisjZGVmaW5lIFRIUkVBRF9QUklPUklUWV9CRUxPV19OT1JNQUwgICAgKFRIUkVBRF9QUklPUklUWV9MT1dFU1QrMSkKKyNkZWZpbmUgVEhSRUFEX1BSSU9SSVRZX05PUk1BTCAgICAgICAgICAwCisjZGVmaW5lIFRIUkVBRF9QUklPUklUWV9ISUdIRVNUICAgICAgICAgVEhSRUFEX0JBU0VfUFJJT1JJVFlfTUFYCisjZGVmaW5lIFRIUkVBRF9QUklPUklUWV9BQk9WRV9OT1JNQUwgICAgKFRIUkVBRF9QUklPUklUWV9ISUdIRVNULTEpCisjZGVmaW5lIFRIUkVBRF9QUklPUklUWV9FUlJPUl9SRVRVUk4gICAgKDB4N2ZmZmZmZmYpCisjZGVmaW5lIFRIUkVBRF9QUklPUklUWV9USU1FX0NSSVRJQ0FMICAgVEhSRUFEX0JBU0VfUFJJT1JJVFlfTE9XUlQKKyNkZWZpbmUgVEhSRUFEX1BSSU9SSVRZX0lETEUgICAgICAgICAgICBUSFJFQURfQkFTRV9QUklPUklUWV9JRExFCisKIHR5cGVkZWYgc3RydWN0IAogewogICBpbnQgdHlwZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luY29uLmggYi9pbmNsdWRlL3dpbmNvbi5oCmluZGV4IGI3YzQ2ZTUuLmRhOGIyMGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luY29uLmgKKysrIGIvaW5jbHVkZS93aW5jb24uaApAQCAtNDAsOCArNDAsOCBAQAogdHlwZWRlZiBzdHJ1Y3QgdGFnU01BTExfUkVDVAogewogICAgIElOVDE2IExlZnQ7Ci0gICAgSU5UMTYgUmlnaHQ7CiAgICAgSU5UMTYgVG9wOworICAgIElOVDE2IFJpZ2h0OwogICAgIElOVDE2IEJvdHRvbTsKIH0gU01BTExfUkVDVCwqTFBTTUFMTF9SRUNUOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmRvd3MuaCBiL2luY2x1ZGUvd2luZG93cy5oCmluZGV4IDIxYmYyN2QuLmUxODYxYWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luZG93cy5oCisrKyBiL2luY2x1ZGUvd2luZG93cy5oCkBAIC0yNDYxLDQ1ICsyNDYxLDE0NyBAQAogI2RlZmluZQlXRl9XSU4zMldPVyAgICAgMHg0MDAwCS8qIHVuZG9jICovCiAjZGVmaW5lCVdGX1dMTyAgICAgICAgICAweDgwMDAKIAotI2RlZmluZSBNQUtFSU5UUkVTT1VSQ0UoaSkgKFNFR1BUUikoKERXT1JEKSgoV09SRCkoaSkpKQorI2RlZmluZSBNQUtFSU5UUkVTT1VSQ0UxNihpKSAgKFNFR1BUUikoKERXT1JEKSgoV09SRCkoaSkpKQorI2RlZmluZSBNQUtFSU5UUkVTT1VSQ0UzMkEoaSkgKExQU1RSKSgoRFdPUkQpKChXT1JEKShpKSkpCisjZGVmaW5lIE1BS0VJTlRSRVNPVVJDRTMyVyhpKSAoTFBXU1RSKSgoRFdPUkQpKChXT1JEKShpKSkpCisjZGVmaW5lIE1BS0VJTlRSRVNPVVJDRSBXSU5FTElCX05BTUVfQVcoTUFLRUlOVFJFU09VUkNFKQogCiAvKiBQcmVkZWZpbmVkIHJlc291cmNlIHR5cGVzICovCi0jZGVmaW5lIFJUX0NVUlNPUgkgICAgTUFLRUlOVFJFU09VUkNFKDEpCi0jZGVmaW5lIFJUX0JJVE1BUAkgICAgTUFLRUlOVFJFU09VUkNFKDIpCi0jZGVmaW5lIFJUX0lDT04gCSAgICBNQUtFSU5UUkVTT1VSQ0UoMykKLSNkZWZpbmUgUlRfTUVOVSAJICAgIE1BS0VJTlRSRVNPVVJDRSg0KQotI2RlZmluZSBSVF9ESUFMT0cJICAgIE1BS0VJTlRSRVNPVVJDRSg1KQotI2RlZmluZSBSVF9TVFJJTkcJICAgIE1BS0VJTlRSRVNPVVJDRSg2KQotI2RlZmluZSBSVF9GT05URElSCSAgICBNQUtFSU5UUkVTT1VSQ0UoNykKLSNkZWZpbmUgUlRfRk9OVCAJICAgIE1BS0VJTlRSRVNPVVJDRSg4KQotI2RlZmluZSBSVF9BQ0NFTEVSQVRPUgkgICAgTUFLRUlOVFJFU09VUkNFKDkpCi0jZGVmaW5lIFJUX1JDREFUQQkgICAgTUFLRUlOVFJFU09VUkNFKDEwKQotI2RlZmluZSBSVF9NRVNTQUdFTElTVCAgICAgIE1BS0VJTlRSRVNPVVJDRSgxMSkKLSNkZWZpbmUgUlRfR1JPVVBfQ1VSU09SICAgICBNQUtFSU5UUkVTT1VSQ0UoMTIpCi0jZGVmaW5lIFJUX0dST1VQX0lDT04JICAgIE1BS0VJTlRSRVNPVVJDRSgxNCkKKyNkZWZpbmUgUlRfQ1VSU09SMTYgICAgICAgICAgTUFLRUlOVFJFU09VUkNFMTYoMSkKKyNkZWZpbmUgUlRfQ1VSU09SMzJBICAgICAgICAgTUFLRUlOVFJFU09VUkNFMzJBKDEpCisjZGVmaW5lIFJUX0NVUlNPUjMyVyAgICAgICAgIE1BS0VJTlRSRVNPVVJDRTMyVygxKQorI2RlZmluZSBSVF9DVVJTT1IgICAgICAgICAgICBXSU5FTElCX05BTUVfQVcoUlRfQ1VSU09SKQorI2RlZmluZSBSVF9CSVRNQVAxNiAgICAgICAgICBNQUtFSU5UUkVTT1VSQ0UxNigyKQorI2RlZmluZSBSVF9CSVRNQVAzMkEgICAgICAgICBNQUtFSU5UUkVTT1VSQ0UzMkEoMikKKyNkZWZpbmUgUlRfQklUTUFQMzJXICAgICAgICAgTUFLRUlOVFJFU09VUkNFMzJXKDIpCisjZGVmaW5lIFJUX0JJVE1BUCAgICAgICAgICAgIFdJTkVMSUJfTkFNRV9BVyhSVF9CSVRNQVApCisjZGVmaW5lIFJUX0lDT04xNiAgICAgICAgICAgIE1BS0VJTlRSRVNPVVJDRTE2KDMpCisjZGVmaW5lIFJUX0lDT04zMkEgICAgICAgICAgIE1BS0VJTlRSRVNPVVJDRTMyQSgzKQorI2RlZmluZSBSVF9JQ09OMzJXICAgICAgICAgICBNQUtFSU5UUkVTT1VSQ0UzMlcoMykKKyNkZWZpbmUgUlRfSUNPTiAgICAgICAgICAgICAgV0lORUxJQl9OQU1FX0FXKFJUX0lDT04pCisjZGVmaW5lIFJUX01FTlUxNiAgICAgICAgICAgIE1BS0VJTlRSRVNPVVJDRTE2KDQpCisjZGVmaW5lIFJUX01FTlUzMkEgICAgICAgICAgIE1BS0VJTlRSRVNPVVJDRTMyQSg0KQorI2RlZmluZSBSVF9NRU5VMzJXICAgICAgICAgICBNQUtFSU5UUkVTT1VSQ0UzMlcoNCkKKyNkZWZpbmUgUlRfTUVOVSAgICAgICAgICAgICAgV0lORUxJQl9OQU1FX0FXKFJUX01FTlUpCisjZGVmaW5lIFJUX0RJQUxPRzE2ICAgICAgICAgIE1BS0VJTlRSRVNPVVJDRTE2KDUpCisjZGVmaW5lIFJUX0RJQUxPRzMyQSAgICAgICAgIE1BS0VJTlRSRVNPVVJDRTMyQSg1KQorI2RlZmluZSBSVF9ESUFMT0czMlcgICAgICAgICBNQUtFSU5UUkVTT1VSQ0UzMlcoNSkKKyNkZWZpbmUgUlRfRElBTE9HICAgICAgICAgICAgV0lORUxJQl9OQU1FX0FXKFJUX0RJQUxPRykKKyNkZWZpbmUgUlRfU1RSSU5HMTYgICAgICAgICAgTUFLRUlOVFJFU09VUkNFMTYoNikKKyNkZWZpbmUgUlRfU1RSSU5HMzJBICAgICAgICAgTUFLRUlOVFJFU09VUkNFMzJBKDYpCisjZGVmaW5lIFJUX1NUUklORzMyVyAgICAgICAgIE1BS0VJTlRSRVNPVVJDRTMyVyg2KQorI2RlZmluZSBSVF9TVFJJTkcgICAgICAgICAgICBXSU5FTElCX05BTUVfQVcoUlRfU1RSSU5HKQorI2RlZmluZSBSVF9GT05URElSMTYgICAgICAgICBNQUtFSU5UUkVTT1VSQ0UxNig3KQorI2RlZmluZSBSVF9GT05URElSMzJBICAgICAgICBNQUtFSU5UUkVTT1VSQ0UzMkEoNykKKyNkZWZpbmUgUlRfRk9OVERJUjMyVyAgICAgICAgTUFLRUlOVFJFU09VUkNFMzJXKDcpCisjZGVmaW5lIFJUX0ZPTlRESVIgICAgICAgICAgIFdJTkVMSUJfTkFNRV9BVyhSVF9GT05URElSKQorI2RlZmluZSBSVF9GT05UMTYgICAgICAgICAgICBNQUtFSU5UUkVTT1VSQ0UxNig4KQorI2RlZmluZSBSVF9GT05UMzJBICAgICAgICAgICBNQUtFSU5UUkVTT1VSQ0UzMkEoOCkKKyNkZWZpbmUgUlRfRk9OVDMyVyAgICAgICAgICAgTUFLRUlOVFJFU09VUkNFMzJXKDgpCisjZGVmaW5lIFJUX0ZPTlQgICAgICAgICAgICAgIFdJTkVMSUJfTkFNRV9BVyhSVF9GT05UKQorI2RlZmluZSBSVF9BQ0NFTEVSQVRPUjE2ICAgICBNQUtFSU5UUkVTT1VSQ0UxNig5KQorI2RlZmluZSBSVF9BQ0NFTEVSQVRPUjMyQSAgICBNQUtFSU5UUkVTT1VSQ0UzMkEoOSkKKyNkZWZpbmUgUlRfQUNDRUxFUkFUT1IzMlcgICAgTUFLRUlOVFJFU09VUkNFMzJXKDkpCisjZGVmaW5lIFJUX0FDQ0VMRVJBVE9SICAgICAgIFdJTkVMSUJfTkFNRV9BVyhSVF9BQ0NFTEVSQVRPUikKKyNkZWZpbmUgUlRfUkNEQVRBMTYgICAgICAgICAgTUFLRUlOVFJFU09VUkNFMTYoMTApCisjZGVmaW5lIFJUX1JDREFUQTMyQSAgICAgICAgIE1BS0VJTlRSRVNPVVJDRTMyQSgxMCkKKyNkZWZpbmUgUlRfUkNEQVRBMzJXICAgICAgICAgTUFLRUlOVFJFU09VUkNFMzJXKDEwKQorI2RlZmluZSBSVF9SQ0RBVEEgICAgICAgICAgICBXSU5FTElCX05BTUVfQVcoUlRfUkNEQVRBKQorI2RlZmluZSBSVF9NRVNTQUdFTElTVDE2ICAgICBNQUtFSU5UUkVTT1VSQ0UxNigxMSkKKyNkZWZpbmUgUlRfTUVTU0FHRUxJU1QzMkEgICAgTUFLRUlOVFJFU09VUkNFMzJBKDExKQorI2RlZmluZSBSVF9NRVNTQUdFTElTVDMyVyAgICBNQUtFSU5UUkVTT1VSQ0UzMlcoMTEpCisjZGVmaW5lIFJUX01FU1NBR0VMSVNUICAgICAgIFdJTkVMSUJfTkFNRV9BVyhSVF9NRVNTQUdFTElTVCkKKyNkZWZpbmUgUlRfR1JPVVBfQ1VSU09SMTYgICAgTUFLRUlOVFJFU09VUkNFMTYoMTIpCisjZGVmaW5lIFJUX0dST1VQX0NVUlNPUjMyQSAgIE1BS0VJTlRSRVNPVVJDRTMyQSgxMikKKyNkZWZpbmUgUlRfR1JPVVBfQ1VSU09SMzJXICAgTUFLRUlOVFJFU09VUkNFMzJXKDEyKQorI2RlZmluZSBSVF9HUk9VUF9DVVJTT1IgICAgICBXSU5FTElCX05BTUVfQVcoUlRfR1JPVVBfQ1VSU09SKQorI2RlZmluZSBSVF9HUk9VUF9JQ09OMTYgICAgICBNQUtFSU5UUkVTT1VSQ0UxNigxNCkKKyNkZWZpbmUgUlRfR1JPVVBfSUNPTjMyQSAgICAgTUFLRUlOVFJFU09VUkNFMzJBKDE0KQorI2RlZmluZSBSVF9HUk9VUF9JQ09OMzJXICAgICBNQUtFSU5UUkVTT1VSQ0UzMlcoMTQpCisjZGVmaW5lIFJUX0dST1VQX0lDT04gICAgICAgIFdJTkVMSUJfTkFNRV9BVyhSVF9HUk9VUF9JQ09OKQogCiAvKiBQcmVkZWZpbmVkIHJlc291cmNlcyAqLwotI2RlZmluZSBJRElfQVBQTElDQVRJT04gIE1BS0VJTlRSRVNPVVJDRSgzMjUxMikKLSNkZWZpbmUgSURJX0hBTkQgICAgICAgICBNQUtFSU5UUkVTT1VSQ0UoMzI1MTMpCi0jZGVmaW5lIElESV9RVUVTVElPTiAgICAgTUFLRUlOVFJFU09VUkNFKDMyNTE0KQotI2RlZmluZSBJRElfRVhDTEFNQVRJT04gIE1BS0VJTlRSRVNPVVJDRSgzMjUxNSkKLSNkZWZpbmUgSURJX0FTVEVSSVNLICAgICBNQUtFSU5UUkVTT1VSQ0UoMzI1MTYpCisjZGVmaW5lIElESV9BUFBMSUNBVElPTjE2ICBNQUtFSU5UUkVTT1VSQ0UxNigzMjUxMikKKyNkZWZpbmUgSURJX0FQUExJQ0FUSU9OMzJBIE1BS0VJTlRSRVNPVVJDRTMyQSgzMjUxMikKKyNkZWZpbmUgSURJX0FQUExJQ0FUSU9OMzJXIE1BS0VJTlRSRVNPVVJDRTMyVygzMjUxMikKKyNkZWZpbmUgSURJX0FQUExJQ0FUSU9OICAgIFdJTkVMSUJfTkFNRV9BVyhJRElfQVBQTElDQVRJT04pCisjZGVmaW5lIElESV9IQU5EMTYgICAgICAgICBNQUtFSU5UUkVTT1VSQ0UxNigzMjUxMykKKyNkZWZpbmUgSURJX0hBTkQzMkEgICAgICAgIE1BS0VJTlRSRVNPVVJDRTMyQSgzMjUxMykKKyNkZWZpbmUgSURJX0hBTkQzMlcgICAgICAgIE1BS0VJTlRSRVNPVVJDRTMyVygzMjUxMykKKyNkZWZpbmUgSURJX0hBTkQgICAgICAgICAgIFdJTkVMSUJfTkFNRV9BVyhJRElfSEFORCkKKyNkZWZpbmUgSURJX1FVRVNUSU9OMTYgICAgIE1BS0VJTlRSRVNPVVJDRTE2KDMyNTE0KQorI2RlZmluZSBJRElfUVVFU1RJT04zMkEgICAgTUFLRUlOVFJFU09VUkNFMzJBKDMyNTE0KQorI2RlZmluZSBJRElfUVVFU1RJT04zMlcgICAgTUFLRUlOVFJFU09VUkNFMzJXKDMyNTE0KQorI2RlZmluZSBJRElfUVVFU1RJT04gICAgICAgV0lORUxJQl9OQU1FX0FXKElESV9RVUVTVElPTikKKyNkZWZpbmUgSURJX0VYQ0xBTUFUSU9OMTYgIE1BS0VJTlRSRVNPVVJDRTE2KDMyNTE1KQorI2RlZmluZSBJRElfRVhDTEFNQVRJT04zMkEgTUFLRUlOVFJFU09VUkNFMzJBKDMyNTE1KQorI2RlZmluZSBJRElfRVhDTEFNQVRJT04zMlcgTUFLRUlOVFJFU09VUkNFMzJXKDMyNTE1KQorI2RlZmluZSBJRElfRVhDTEFNQVRJT04gICAgV0lORUxJQl9OQU1FX0FXKElESV9FWENMQU1BVElPTikKKyNkZWZpbmUgSURJX0FTVEVSSVNLMTYgICAgIE1BS0VJTlRSRVNPVVJDRTE2KDMyNTE2KQorI2RlZmluZSBJRElfQVNURVJJU0szMkEgICAgTUFLRUlOVFJFU09VUkNFMzJBKDMyNTE2KQorI2RlZmluZSBJRElfQVNURVJJU0szMlcgICAgTUFLRUlOVFJFU09VUkNFMzJXKDMyNTE2KQorI2RlZmluZSBJRElfQVNURVJJU0sgICAgICAgV0lORUxJQl9OQU1FX0FXKElESV9BU1RFUklTSykKIAotI2RlZmluZSBJRENfQlVNTUVSCSBNQUtFSU5UUkVTT1VSQ0UoMTAwKQotI2RlZmluZSBJRENfQVJST1cgICAgICAgIE1BS0VJTlRSRVNPVVJDRSgzMjUxMikKLSNkZWZpbmUgSURDX0lCRUFNICAgICAgICBNQUtFSU5UUkVTT1VSQ0UoMzI1MTMpCi0jZGVmaW5lIElEQ19XQUlUICAgICAgICAgTUFLRUlOVFJFU09VUkNFKDMyNTE0KQotI2RlZmluZSBJRENfQ1JPU1MgICAgICAgIE1BS0VJTlRSRVNPVVJDRSgzMjUxNSkKLSNkZWZpbmUgSURDX1VQQVJST1cgICAgICBNQUtFSU5UUkVTT1VSQ0UoMzI1MTYpCi0jZGVmaW5lIElEQ19TSVpFICAgICAgICAgTUFLRUlOVFJFU09VUkNFKDMyNjQwKQotI2RlZmluZSBJRENfSUNPTiAgICAgICAgIE1BS0VJTlRSRVNPVVJDRSgzMjY0MSkKLSNkZWZpbmUgSURDX1NJWkVOV1NFICAgICBNQUtFSU5UUkVTT1VSQ0UoMzI2NDIpCi0jZGVmaW5lIElEQ19TSVpFTkVTVyAgICAgTUFLRUlOVFJFU09VUkNFKDMyNjQzKQotI2RlZmluZSBJRENfU0laRVdFICAgICAgIE1BS0VJTlRSRVNPVVJDRSgzMjY0NCkKLSNkZWZpbmUgSURDX1NJWkVOUyAgICAgICBNQUtFSU5UUkVTT1VSQ0UoMzI2NDUpCi0jZGVmaW5lIElEQ19OTyAgICAgICAgICAgTUFLRUlOVFJFU09VUkNFKDMyNjQ4KQotI2RlZmluZSBJRENfQVBQU1RBUlRJTkcgIE1BS0VJTlRSRVNPVVJDRSgzMjY1MCkKLSNkZWZpbmUgSURDX0hFTFAgICAgICAgICBNQUtFSU5UUkVTT1VSQ0UoMzI2NTEpCisjZGVmaW5lIElEQ19CVU1NRVIxNiAgICAgICBNQUtFSU5UUkVTT1VSQ0UxNigxMDApCisjZGVmaW5lIElEQ19CVU1NRVIzMkEgICAgICBNQUtFSU5UUkVTT1VSQ0UzMkEoMTAwKQorI2RlZmluZSBJRENfQlVNTUVSMzJXICAgICAgTUFLRUlOVFJFU09VUkNFMzJXKDEwMCkKKyNkZWZpbmUgSURDX0JVTU1FUiAgICAgICAgIFdJTkVMSUJfTkFNRV9BVyhJRENfQlVNTUVSKQorI2RlZmluZSBJRENfQVJST1cxNiAgICAgICAgTUFLRUlOVFJFU09VUkNFMTYoMzI1MTIpCisjZGVmaW5lIElEQ19BUlJPVzMyQSAgICAgICBNQUtFSU5UUkVTT1VSQ0UzMkEoMzI1MTIpCisjZGVmaW5lIElEQ19BUlJPVzMyVyAgICAgICBNQUtFSU5UUkVTT1VSQ0UzMlcoMzI1MTIpCisjZGVmaW5lIElEQ19BUlJPVyAgICAgICAgICBXSU5FTElCX05BTUVfQVcoSURDX0FSUk9XKQorI2RlZmluZSBJRENfSUJFQU0xNiAgICAgICAgTUFLRUlOVFJFU09VUkNFMTYoMzI1MTMpCisjZGVmaW5lIElEQ19JQkVBTTMyQSAgICAgICBNQUtFSU5UUkVTT1VSQ0UzMkEoMzI1MTMpCisjZGVmaW5lIElEQ19JQkVBTTMyVyAgICAgICBNQUtFSU5UUkVTT1VSQ0UzMlcoMzI1MTMpCisjZGVmaW5lIElEQ19JQkVBTSAgICAgICAgICBXSU5FTElCX05BTUVfQVcoSURDX0lCRUFNKQorI2RlZmluZSBJRENfV0FJVDE2ICAgICAgICAgTUFLRUlOVFJFU09VUkNFMTYoMzI1MTQpCisjZGVmaW5lIElEQ19XQUlUMzJBICAgICAgICBNQUtFSU5UUkVTT1VSQ0UzMkEoMzI1MTQpCisjZGVmaW5lIElEQ19XQUlUMzJXICAgICAgICBNQUtFSU5UUkVTT1VSQ0UzMlcoMzI1MTQpCisjZGVmaW5lIElEQ19XQUlUICAgICAgICAgICBXSU5FTElCX05BTUVfQVcoSURDX1dBSVQpCisjZGVmaW5lIElEQ19DUk9TUzE2ICAgICAgICBNQUtFSU5UUkVTT1VSQ0UxNigzMjUxNSkKKyNkZWZpbmUgSURDX0NST1NTMzJBICAgICAgIE1BS0VJTlRSRVNPVVJDRTMyQSgzMjUxNSkKKyNkZWZpbmUgSURDX0NST1NTMzJXICAgICAgIE1BS0VJTlRSRVNPVVJDRTMyVygzMjUxNSkKKyNkZWZpbmUgSURDX0NST1NTICAgICAgICAgIFdJTkVMSUJfTkFNRV9BVyhJRENfQ1JPU1MpCisjZGVmaW5lIElEQ19VUEFSUk9XMTYgICAgICBNQUtFSU5UUkVTT1VSQ0UxNigzMjUxNikKKyNkZWZpbmUgSURDX1VQQVJST1czMkEgICAgIE1BS0VJTlRSRVNPVVJDRTMyQSgzMjUxNikKKyNkZWZpbmUgSURDX1VQQVJST1czMlcgICAgIE1BS0VJTlRSRVNPVVJDRTMyVygzMjUxNikKKyNkZWZpbmUgSURDX1VQQVJST1cgICAgICAgIFdJTkVMSUJfTkFNRV9BVyhJRENfVVBBUlJPVykKKyNkZWZpbmUgSURDX1NJWkUxNiAgICAgICAgIE1BS0VJTlRSRVNPVVJDRTE2KDMyNjQwKQorI2RlZmluZSBJRENfU0laRTMyQSAgICAgICAgTUFLRUlOVFJFU09VUkNFMzJBKDMyNjQwKQorI2RlZmluZSBJRENfU0laRTMyVyAgICAgICAgTUFLRUlOVFJFU09VUkNFMzJXKDMyNjQwKQorI2RlZmluZSBJRENfU0laRSAgICAgICAgICAgV0lORUxJQl9OQU1FX0FXKElEQ19TSVpFKQorI2RlZmluZSBJRENfSUNPTjE2ICAgICAgICAgTUFLRUlOVFJFU09VUkNFMTYoMzI2NDEpCisjZGVmaW5lIElEQ19JQ09OMzJBICAgICAgICBNQUtFSU5UUkVTT1VSQ0UzMkEoMzI2NDEpCisjZGVmaW5lIElEQ19JQ09OMzJXICAgICAgICBNQUtFSU5UUkVTT1VSQ0UzMlcoMzI2NDEpCisjZGVmaW5lIElEQ19JQ09OICAgICAgICAgICBXSU5FTElCX05BTUVfQVcoSURDX0lDT04pCisjZGVmaW5lIElEQ19TSVpFTldTRTE2ICAgICBNQUtFSU5UUkVTT1VSQ0UxNigzMjY0MikKKyNkZWZpbmUgSURDX1NJWkVOV1NFMzJBICAgIE1BS0VJTlRSRVNPVVJDRTMyQSgzMjY0MikKKyNkZWZpbmUgSURDX1NJWkVOV1NFMzJXICAgIE1BS0VJTlRSRVNPVVJDRTMyVygzMjY0MikKKyNkZWZpbmUgSURDX1NJWkVOV1NFICAgICAgIFdJTkVMSUJfTkFNRV9BVyhJRENfU0laRU5XU0UpCisjZGVmaW5lIElEQ19TSVpFTkVTVzE2ICAgICBNQUtFSU5UUkVTT1VSQ0UxNigzMjY0MykKKyNkZWZpbmUgSURDX1NJWkVORVNXMzJBICAgIE1BS0VJTlRSRVNPVVJDRTMyQSgzMjY0MykKKyNkZWZpbmUgSURDX1NJWkVORVNXMzJXICAgIE1BS0VJTlRSRVNPVVJDRTMyVygzMjY0MykKKyNkZWZpbmUgSURDX1NJWkVORVNXICAgICAgIFdJTkVMSUJfTkFNRV9BVyhJRENfU0laRU5FU1cpCisjZGVmaW5lIElEQ19TSVpFV0UxNiAgICAgICBNQUtFSU5UUkVTT1VSQ0UxNigzMjY0NCkKKyNkZWZpbmUgSURDX1NJWkVXRTMyQSAgICAgIE1BS0VJTlRSRVNPVVJDRTMyQSgzMjY0NCkKKyNkZWZpbmUgSURDX1NJWkVXRTMyVyAgICAgIE1BS0VJTlRSRVNPVVJDRTMyVygzMjY0NCkKKyNkZWZpbmUgSURDX1NJWkVXRSAgICAgICAgIFdJTkVMSUJfTkFNRV9BVyhJRENfU0laRVdFKQorI2RlZmluZSBJRENfU0laRU5TMTYgICAgICAgTUFLRUlOVFJFU09VUkNFMTYoMzI2NDUpCisjZGVmaW5lIElEQ19TSVpFTlMzMkEgICAgICBNQUtFSU5UUkVTT1VSQ0UzMkEoMzI2NDUpCisjZGVmaW5lIElEQ19TSVpFTlMzMlcgICAgICBNQUtFSU5UUkVTT1VSQ0UzMlcoMzI2NDUpCisjZGVmaW5lIElEQ19TSVpFTlMgICAgICAgICBXSU5FTElCX05BTUVfQVcoSURDX1NJWkVOUykKKyNkZWZpbmUgSURDX05PMTYgICAgICAgICAgIE1BS0VJTlRSRVNPVVJDRTE2KDMyNjQ4KQorI2RlZmluZSBJRENfTk8zMkEgICAgICAgICAgTUFLRUlOVFJFU09VUkNFMzJBKDMyNjQ4KQorI2RlZmluZSBJRENfTk8zMlcgICAgICAgICAgTUFLRUlOVFJFU09VUkNFMzJXKDMyNjQ4KQorI2RlZmluZSBJRENfTk8gICAgICAgICAgICAgV0lORUxJQl9OQU1FX0FXKElEQ19OTykKKyNkZWZpbmUgSURDX0FQUFNUQVJUSU5HMTYgIE1BS0VJTlRSRVNPVVJDRTE2KDMyNjUwKQorI2RlZmluZSBJRENfQVBQU1RBUlRJTkczMkEgTUFLRUlOVFJFU09VUkNFMzJBKDMyNjUwKQorI2RlZmluZSBJRENfQVBQU1RBUlRJTkczMlcgTUFLRUlOVFJFU09VUkNFMzJXKDMyNjUwKQorI2RlZmluZSBJRENfQVBQU1RBUlRJTkcgICAgV0lORUxJQl9OQU1FX0FXKElEQ19BUFBTVEFSVElORykKKyNkZWZpbmUgSURDX0hFTFAxNiAgICAgICAgIE1BS0VJTlRSRVNPVVJDRTE2KDMyNjUxKQorI2RlZmluZSBJRENfSEVMUDMyQSAgICAgICAgTUFLRUlOVFJFU09VUkNFMzJBKDMyNjUxKQorI2RlZmluZSBJRENfSEVMUDMyVyAgICAgICAgTUFLRUlOVFJFU09VUkNFMzJXKDMyNjUxKQorI2RlZmluZSBJRENfSEVMUCAgICAgICAgICAgV0lORUxJQl9OQU1FX0FXKElEQ19IRUxQKQogCiAvKiBPRU0gUmVzb3VyY2UgT3JkaW5hbCBOdW1iZXJzICovCiAjZGVmaW5lIE9CTV9DTE9TRSAgICAgICAgICAgMzI3NTQKQEAgLTQyNTksNiArNDM2MSw3IEBACiAjZGVmaW5lIENGX1BFTkRBVEEgICAgICAgICAgMTAKICNkZWZpbmUgQ0ZfUklGRiAgICAgICAgICAgICAxMQogI2RlZmluZSBDRl9XQVZFICAgICAgICAgICAgIDEyCisjZGVmaW5lIENGX0VOSE1FVEFGSUxFICAgICAgMTQKIAogI2RlZmluZSBDRl9PV05FUkRJU1BMQVkgICAgIDB4MDA4MAogI2RlZmluZSBDRl9EU1BURVhUICAgICAgICAgIDB4MDA4MQpAQCAtNDQzMCw2ICs0NTMzLDcgQEAKICNkZWZpbmUgTUVUQV9DUkVBVEVCSVRNQVBJTkRJUkVDVCAgICAweDAyRkQKICNkZWZpbmUgTUVUQV9DUkVBVEVCSVRNQVAgICAgICAgICAgICAweDA2RkUKICNkZWZpbmUgTUVUQV9DUkVBVEVSRUdJT04gICAgICAgICAgICAweDA2RkYKKyNkZWZpbmUgTUVUQV9VTktOT1dOICAgICAgICAgICAgICAgICAweDA1MjkgIC8qIEZJWE1FOiB1bmtub3duIG1ldGEgbWFnaWMgKi8KIAogdHlwZWRlZiBJTlQxNiAoQ0FMTEJBQ0sgKk1GRU5VTVBST0MxNikoSERDMTYsSEFORExFVEFCTEUxNiosTUVUQVJFQ09SRCosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNixMUEFSQU0pOwpAQCAtNTU4NywxMyArNTY5MSwxMyBAQAogCiB0eXBlZGVmIHN0cnVjdCAvKiBub3Qgc3VyZSBpZiB0aGUgMTZiaXQgdmVyc2lvbiBpcyBjb3JyZWN0ICovCiB7Ci0gICAgVUlOVDE2CWNiU2l6ZTsKKyAgICBVSU5UMzIJY2JTaXplOwogICAgIEhXTkQxNglod25kT3duZXI7CiAgICAgSElOU1RBTkNFMTYJaEluc3RhbmNlOwotICAgIExQQ1NUUglscHN6VGV4dDsKLSAgICBMUENTVFIJbHBzekNhcHRpb247CisgICAgU0VHUFRSCWxwc3pUZXh0OworICAgIFNFR1BUUglscHN6Q2FwdGlvbjsKICAgICBEV09SRAlkd1N0eWxlOwotICAgIExQQ1NUUglscHN6SWNvbjsKKyAgICBTRUdQVFIJbHBzekljb247CiAgICAgRFdPUkQJZHdDb250ZXh0SGVscElkOwogICAgIE1TR0JPWENBTExCQUNLCWxwZm5Nc2dCb3hDYWxsYmFjazsKICAgICBEV09SRAlkd0xhbmd1YWdlSWQ7CkBAIC01NjU5LDYgKzU3NjMsNyBAQAogCiAvKiBEZWNsYXJhdGlvbnMgZm9yIGZ1bmN0aW9ucyB0aGF0IGV4aXN0IG9ubHkgaW4gV2luMTYgKi8KIAorI2lmbmRlZiBXSU5FTElCCiBXT1JEICAgICAgICBXSU5BUEkgQWxsb2NDU3RvRFNBbGlhcyhXT1JEKTsKIFdPUkQgICAgICAgIFdJTkFQSSBBbGxvY0RTdG9DU0FsaWFzKFdPUkQpOwogV09SRCAgICAgICAgV0lOQVBJIEFsbG9jU2VsZWN0b3IoV09SRCk7CkBAIC01ODExLDcgKzU5MTYsNyBAQAogSU5UMTYgICAgICAgV0lOQVBJIFdyaXRlQ29tbShJTlQxNixMUFNUUixJTlQxNik7CiBWT0lEICAgICAgICBXSU5BUEkgV3JpdGVPdXRQcm9maWxlcyhWT0lEKTsKIFZPSUQgICAgICAgIFdJTkFQSSBobWVtY3B5KExQVk9JRCxMUENWT0lELExPTkcpOwotCisjZW5kaWYgLyogV0lORUxJQiAqLwogCiAvKiBEZWNsYXJhdGlvbnMgZm9yIGZ1bmN0aW9ucyB0aGF0IGV4aXN0IG9ubHkgaW4gV2luMzIgKi8KIApAQCAtNTgyMyw2ICs1OTI4LDggQEAKIElOVDMyICAgICAgIFdJTkFQSSBDb3B5QWNjZWxlcmF0b3JUYWJsZTMyQShIQUNDRUwzMixMUEFDQ0VMMzIsSU5UMzIpOwogSU5UMzIgICAgICAgV0lOQVBJIENvcHlBY2NlbGVyYXRvclRhYmxlMzJXKEhBQ0NFTDMyLExQQUNDRUwzMixJTlQzMik7CiAjZGVmaW5lICAgICBDb3B5QWNjZWxlcmF0b3JUYWJsZSBXSU5FTElCX05BTUVfQVcoQ29weUFjY2VsZXJhdG9yVGFibGUpCitIRU5ITUVUQUZJTEUzMiBXSU5BUEkgQ29weUVuaE1ldGFGaWxlMzJBKEhFTkhNRVRBRklMRTMyLExQQ1NUUik7CisjZGVmaW5lICAgICBDb3B5RW5oTWV0YUZpbGUgV0lORUxJQl9OQU1FX0FXKENvcHlFbmhNZXRhRmlsZSkKIEJPT0wzMiAgICAgIFdJTkFQSSBDb3B5RmlsZTMyQShMUENTVFIsTFBDU1RSLEJPT0wzMik7CiBCT09MMzIgICAgICBXSU5BUEkgQ29weUZpbGUzMlcoTFBDV1NUUixMUENXU1RSLEJPT0wzMik7CiAjZGVmaW5lICAgICBDb3B5RmlsZSBXSU5FTElCX05BTUVfQVcoQ29weUZpbGUpCkBAIC01ODQ5LDkgKzU5NTYsMTEgQEAKIEhBTkRMRTMyICAgIFdJTkFQSSBDcmVhdGVTZW1hcGhvcmUzMlcoTFBTRUNVUklUWV9BVFRSSUJVVEVTLExPTkcsTE9ORyxMUENXU1RSKTsKICNkZWZpbmUgICAgIENyZWF0ZVNlbWFwaG9yZSBXSU5FTElCX05BTUVfQVcoQ3JlYXRlU2VtYXBob3JlKQogSEFORExFMzIgICAgV0lOQVBJIENyZWF0ZVRocmVhZChMUFNFQ1VSSVRZX0FUVFJJQlVURVMsRFdPUkQsTFBUSFJFQURfU1RBUlRfUk9VVElORSxMUFZPSUQsRFdPUkQsTFBEV09SRCk7CitCT09MMzIgICAgICBXSU5BUEkgRGVsZXRlRW5oTWV0YUZpbGUoSEVOSE1FVEFGSUxFMzIpOwogQk9PTDMyICAgICAgV0lOQVBJIERlc3Ryb3lBY2NlbGVyYXRvclRhYmxlKEhBQ0NFTDMyKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBEaXNhYmxlVGhyZWFkTGlicmFyeUNhbGxzKEhNT0RVTEUzMik7CiBCT09MMzIgICAgICBXSU5BUEkgRG9zRGF0ZVRpbWVUb0ZpbGVUaW1lKFdPUkQsV09SRCxMUEZJTEVUSU1FKTsKK0JPT0wzMiAgICAgIFdJTkFQSSBEdXBsaWNhdGVIYW5kbGUoSEFORExFMzIsSEFORExFMzIsSEFORExFMzIsSEFORExFMzIqLERXT1JELEJPT0wzMixEV09SRCk7CiBJTlQzMiAgICAgICBXSU5BUEkgRW51bVByb3BzRXgzMkEoSFdORDMyLFBST1BFTlVNUFJPQ0VYMzJBLExQQVJBTSk7CiBJTlQzMiAgICAgICBXSU5BUEkgRW51bVByb3BzRXgzMlcoSFdORDMyLFBST1BFTlVNUFJPQ0VYMzJXLExQQVJBTSk7CiAjZGVmaW5lICAgICBFbnVtUHJvcHNFeCBXSU5FTElCX05BTUVfQVcoRW51bVByb3BzRXgpCkBAIC01OTIxLDYgKzYwMzAsMTAgQEAKIElOVDMyICAgICAgIFdJTkFQSSBHZXREYXRlRm9ybWF0MzJXKExDSUQsRFdPUkQsTFBTWVNURU1USU1FLExQQ1dTVFIsTFBXU1RSLElOVDMyKTsKICNkZWZpbmUgICAgIEdldERhdGVGb3JtYXQgV0lORUxJQl9OQU1FX0FXKEdldERhdGVGb3JtYXQpCiBCT09MMzIgICAgICBXSU5BUEkgR2V0RENPcmdFeChIREMzMixMUFBPSU5UMzIpOworSEVOSE1FVEFGSUxFMzIgV0lOQVBJIEdldEVuaE1ldGFGaWxlMzJBKExQQ1NUUik7CitIRU5ITUVUQUZJTEUzMiBXSU5BUEkgR2V0RW5oTWV0YUZpbGUzMlcoTFBDV1NUUik7CisjZGVmaW5lICAgICBHZXRFbmhNZXRhRmlsZSBXSU5FTElCX05BTUVfQVcoR2V0RW5oTWV0YUZpbGUpCitVSU5UMzIgICAgICBXSU5BUEkgR2V0RW5oTWV0YUZpbGVIZWFkZXIoSEVOSE1FVEFGSUxFMzIsVUlOVDMyLExQRU5ITUVUQUhFQURFUik7CiBMUFNUUiAgICAgICBXSU5BUEkgR2V0RW52aXJvbm1lbnRTdHJpbmdzMzJBKHZvaWQpOwogTFBXU1RSICAgICAgV0lOQVBJIEdldEVudmlyb25tZW50U3RyaW5nczMyVyh2b2lkKTsKICNkZWZpbmUgICAgIEdldEVudmlyb25tZW50U3RyaW5ncyBXSU5FTElCX05BTUVfQVcoR2V0RW52aXJvbm1lbnRTdHJpbmdzKQpAQCAtNTk3Niw2ICs2MDg5LDcgQEAKIEJPT0wzMiAgICAgIFdJTkFQSSBHZXRVc2VyTmFtZTMyQShMUFNUUixMUERXT1JEKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBHZXRVc2VyTmFtZTMyVyhMUFdTVFIsTFBEV09SRCk7CiAjZGVmaW5lICAgICBHZXRVc2VyTmFtZSBXSU5FTElCX05BTUVfQVcoR2V0VXNlck5hbWUpCitEV09SRCAgICAgICBXSU5BUEkgR2V0V2luZG93Q29udGV4dEhlbHBJZChIV05EMzIpOwogRFdPUkQgICAgICAgV0lOQVBJIEdldFdpbmRvd1RocmVhZFByb2Nlc3NJZChIV05EMzIsTFBEV09SRCk7CiBCT09MMzIgICAgICBXSU5BUEkgR2V0V29ybGRUcmFuc2Zvcm0oSERDMzIsTFBYRk9STSk7CiBWT0lEICAgICAgICBXSU5BUEkgR2xvYmFsTWVtb3J5U3RhdHVzKExQTUVNT1JZU1RBVFVTKTsKQEAgLTYwMjcsNiArNjE0MSw4IEBACiBIQU5ETEUzMiAgICBXSU5BUEkgT3BlblNlbWFwaG9yZTMyQShEV09SRCxCT09MMzIsTFBDU1RSKTsKIEhBTkRMRTMyICAgIFdJTkFQSSBPcGVuU2VtYXBob3JlMzJXKERXT1JELEJPT0wzMixMUENXU1RSKTsKICNkZWZpbmUgICAgIE9wZW5TZW1hcGhvcmUgV0lORUxJQl9OQU1FX0FXKE9wZW5TZW1hcGhvcmUpCitCT09MMzIgICAgICBXSU5BUEkgUGxheUVuaE1ldGFGaWxlKEhEQzMyLEhFTkhNRVRBRklMRTMyLGNvbnN0IFJFQ1QzMiopOworQk9PTDMyICAgICAgV0lOQVBJIFBsYXlFbmhNZXRhRmlsZVJlY29yZChIREMzMixMUEhBTkRMRVRBQkxFMzIsY29uc3QgRU5ITUVUQVJFQ09SRCosVUlOVDMyKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBQdWxzZUV2ZW50KEhBTkRMRTMyKTsKIERXT1JEICAgICAgIFdJTkFQSSBRdWVyeURvc0RldmljZTMyQShMUENTVFIsTFBTVFIsRFdPUkQpOwogRFdPUkQgICAgICAgV0lOQVBJIFF1ZXJ5RG9zRGV2aWNlMzJXKExQQ1dTVFIsTFBXU1RSLERXT1JEKTsKQEAgLTYwODcsMTIgKzYyMDMsMTQgQEAKIEJPT0wzMiAgICAgIFdJTkFQSSBTZXRNZW51SXRlbUluZm8zMkEoSE1FTlUzMixVSU5UMzIsQk9PTDMyLGNvbnN0IE1FTlVJVEVNSU5GTzMyQSopOwogQk9PTDMyICAgICAgV0lOQVBJIFNldE1lbnVJdGVtSW5mbzMyVyhITUVOVTMyLFVJTlQzMixCT09MMzIsY29uc3QgTUVOVUlURU1JTkZPMzJXKik7CiAjZGVmaW5lICAgICBTZXRNZW51SXRlbUluZm8gV0lORUxJQl9OQU1FX0FXKFNldE1lbnVJdGVtSW5mbykKK0hNRVRBRklMRTMyIFdJTkFQSSBTZXRNZXRhRmlsZUJpdHNFeChVSU5UMzIsY29uc3QgQllURSopOwogQk9PTDMyICAgICAgV0lOQVBJIFNldFByaW9yaXR5Q2xhc3MoSEFORExFMzIsRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIFNldFN0ZEhhbmRsZShEV09SRCxIQU5ETEUzMik7CiBCT09MMzIgICAgICBXSU5BUEkgU2V0U3lzdGVtUG93ZXJTdGF0ZShCT09MMzIsQk9PTDMyKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBTZXRTeXN0ZW1UaW1lKGNvbnN0IFNZU1RFTVRJTUUqKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBTZXRUaHJlYWRQcmlvcml0eShIQU5ETEUzMixJTlQzMik7CiBCT09MMzIgICAgICBXSU5BUEkgU2V0VGltZVpvbmVJbmZvcm1hdGlvbihjb25zdCBMUFRJTUVfWk9ORV9JTkZPUk1BVElPTik7CitCT09MMzIgICAgICBXSU5BUEkgU2V0V2luZG93Q29udGV4dEhlbHBJZChIV05EMzIsRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIFNldFdvcmxkVHJhbnNmb3JtKEhEQzMyLGNvbnN0IFhGT1JNKik7CiBWT0lEICAgICAgICBXSU5BUEkgU2xlZXAoRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIFN5c3RlbVRpbWVUb0ZpbGVUaW1lKGNvbnN0IFNZU1RFTVRJTUUqLExQRklMRVRJTUUpOwpAQCAtNjEyNiw2ICs2MjQ0LDggQEAKIEJPT0wzMiAgICAgIFdJTkFQSSBXcml0ZUNvbnNvbGUzMlcoSEFORExFMzIsTFBDVk9JRCxEV09SRCxMUERXT1JELExQVk9JRCk7CiAjZGVmaW5lICAgICBXcml0ZUNvbnNvbGUgV0lORUxJQl9OQU1FX0FXKFdyaXRlQ29uc29sZSkKIEJPT0wzMiAgICAgIFdJTkFQSSBXcml0ZUZpbGUoSEFORExFMzIsTFBDVk9JRCxEV09SRCxMUERXT1JELExQT1ZFUkxBUFBFRCk7CitWT0lEICAgICAgICBXSU5BUEkgWmVyb01lbW9yeShMUFZPSUQsVUlOVDMyKTsKKyNkZWZpbmUgICAgIFplcm9NZW1vcnkgUnRsWmVyb01lbW9yeQogCiAvKiBEZWNsYXJhdGlvbnMgZm9yIGZ1bmN0aW9ucyB0aGF0IGFyZSB0aGUgc2FtZSBpbiBXaW4xNiBhbmQgV2luMzIgKi8KIApAQCAtNzI0MCwxMCArNzM2MCwyMSBAQAogQ09MT1JSRUYgICAgV0lOQVBJIEdldFRleHRDb2xvcjE2KEhEQzE2KTsKIENPTE9SUkVGICAgIFdJTkFQSSBHZXRUZXh0Q29sb3IzMihIREMzMik7CiAjZGVmaW5lICAgICBHZXRUZXh0Q29sb3IgV0lORUxJQl9OQU1FKEdldFRleHRDb2xvcikKKy8qIHRoaXMgb25lIGlzIGRpZmZlcmVudCwgYmVjYXVzZSBXaW4zMiBoYXMgKmJvdGgqIAorICogR2V0VGV4dEV4dGVudFBvaW50IGFuZCBHZXRUZXh0RXh0ZW50UG9pbnQzMiAhCisgKi8KIEJPT0wxNiAgICAgIFdJTkFQSSBHZXRUZXh0RXh0ZW50UG9pbnQxNihIREMxNixMUENTVFIsSU5UMTYsTFBTSVpFMTYpOwogQk9PTDMyICAgICAgV0lOQVBJIEdldFRleHRFeHRlbnRQb2ludDMyQShIREMzMixMUENTVFIsSU5UMzIsTFBTSVpFMzIpOwogQk9PTDMyICAgICAgV0lOQVBJIEdldFRleHRFeHRlbnRQb2ludDMyVyhIREMzMixMUENXU1RSLElOVDMyLExQU0laRTMyKTsKLSNkZWZpbmUgICAgIEdldFRleHRFeHRlbnRQb2ludCBXSU5FTElCX05BTUVfQVcoR2V0VGV4dEV4dGVudFBvaW50KQorQk9PTDMyICAgICAgV0lOQVBJIEdldFRleHRFeHRlbnRQb2ludDMyQUJ1Z2d5KEhEQzMyLExQQ1NUUixJTlQzMixMUFNJWkUzMik7CitCT09MMzIgICAgICBXSU5BUEkgR2V0VGV4dEV4dGVudFBvaW50MzJXQnVnZ3koSERDMzIsTFBDV1NUUixJTlQzMixMUFNJWkUzMik7CisjaWZkZWYgVU5JQ09ERQorI2RlZmluZSAgICAgR2V0VGV4dEV4dGVudFBvaW50IEdldFRleHRFeHRlbnRQb2ludDMyV0J1Z2d5CisjZGVmaW5lICAgICBHZXRUZXh0RXh0ZW50UG9pbnQzMiBHZXRUZXh0RXh0ZW50UG9pbnQzMlcKKyNlbHNlCisjZGVmaW5lICAgICBHZXRUZXh0RXh0ZW50UG9pbnQgR2V0VGV4dEV4dGVudFBvaW50MzJBQnVnZ3kKKyNkZWZpbmUgICAgIEdldFRleHRFeHRlbnRQb2ludDMyIEdldFRleHRFeHRlbnRQb2ludDMyQQorI2VuZGlmCiBJTlQxNiAgICAgICBXSU5BUEkgR2V0VGV4dEZhY2UxNihIREMxNixJTlQxNixMUFNUUik7CiBJTlQzMiAgICAgICBXSU5BUEkgR2V0VGV4dEZhY2UzMkEoSERDMzIsSU5UMzIsTFBTVFIpOwogSU5UMzIgICAgICAgV0lOQVBJIEdldFRleHRGYWNlMzJXKEhEQzMyLElOVDMyLExQV1NUUik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbnR5cGVzLmggYi9pbmNsdWRlL3dpbnR5cGVzLmgKaW5kZXggM2RhYzUyZC4uMzU4NmI0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW50eXBlcy5oCisrKyBiL2luY2x1ZGUvd2ludHlwZXMuaApAQCAtMTAsMzggKzEwLDI5IEBACiAjaWZkZWYgX19XSU5FX18KICMgaW5jbHVkZSAiY29uZmlnLmgiCiAjIHVuZGVmIFdJTkVMSUIKLSMgdW5kZWYgV0lORUxJQjE2Ci0jIHVuZGVmIFdJTkVMSUIzMgogIyB1bmRlZiBVTklDT0RFCiAjZWxzZSAgLyogX19XSU5FX18gKi8KICMgaWZuZGVmIFdJTkVMSUIKICMgIGRlZmluZSBXSU5FTElCCiAjIGVuZGlmCi0jIGlmZGVmIFdJTkVMSUIxNgotIyAgdW5kZWYgV0lORUxJQjMyCi0jIGVsc2UKLSMgIGRlZmluZSBXSU5FTElCMzIKLSMgZW5kaWYKICNlbmRpZiAgLyogX19XSU5FX18gKi8KIAogLyogTWFjcm9zIHRvIG1hcCBXaW5lbGliIG5hbWVzIHRvIHRoZSBjb3JyZWN0IGltcGxlbWVudGF0aW9uIG5hbWUgKi8KLS8qIGRlcGVuZGluZyBvbiBXSU5FTElCMTYsIFdJTkVMSUIzMiBhbmQgVU5JQ09ERSBtYWNyb3MuICAgICAgICAgICovCisvKiBkZXBlbmRpbmcgb24gV0lORUxJQiBhbmQgVU5JQ09ERSBtYWNyb3MuICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTm90ZSB0aGF0IFdJTkVMSUIgaXMgcHVyZWx5IFdpbjMyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogI2lmZGVmIF9fV0lORV9fCiAjIGRlZmluZSBXSU5FTElCX05BTUUoZnVuYykgICAgICB0aGlzIGlzIGEgc3ludGF4IGVycm9yCiAjIGRlZmluZSBXSU5FTElCX05BTUVfQVcoZnVuYykgICB0aGlzIGlzIGEgc3ludGF4IGVycm9yCiAjZWxzZSAgLyogX19XSU5FX18gKi8KLSMgaWZkZWYgV0lORUxJQjMyCisjIGlmZGVmIFdJTkVMSUIKICMgIGRlZmluZSBXSU5FTElCX05BTUUoZnVuYykgICAgIGZ1bmMjIzMyCiAjICBpZmRlZiBVTklDT0RFCiAjICAgZGVmaW5lIFdJTkVMSUJfTkFNRV9BVyhmdW5jKSBmdW5jIyMzMlcKICMgIGVsc2UKICMgICBkZWZpbmUgV0lORUxJQl9OQU1FX0FXKGZ1bmMpIGZ1bmMjIzMyQQogIyAgZW5kaWYgIC8qIFVOSUNPREUgKi8KLSMgZWxzZSAgIC8qIFdJTkVMSUIzMiAqLwotIyAgZGVmaW5lIFdJTkVMSUJfTkFNRShmdW5jKSAgICAgZnVuYyMjMTYKLSMgIGRlZmluZSBXSU5FTElCX05BTUVfQVcoZnVuYykgIGZ1bmMjIzE2Ci0jIGVuZGlmICAvKiBXSU5FTElCMzIgKi8KKyMgZW5kaWYgIC8qIFdJTkVMSUIgKi8KICNlbmRpZiAgLyogX19XSU5FX18gKi8KIAogI2lmZGVmIF9fV0lORV9fCmRpZmYgLS1naXQgYS9sb2FkZXIvbWFpbi5jIGIvbG9hZGVyL21haW4uYwppbmRleCAzNWFjMDVkLi41YWIxMWRhIDEwMDY0NAotLS0gYS9sb2FkZXIvbWFpbi5jCisrKyBiL2xvYWRlci9tYWluLmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlICJtaXNjZW11LmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgInNweS5oIgotI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJ0d2Vhay5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJkY2UuaCIKQEAgLTYwLDkgKzU5LDYgQEAKICAgICAvKiBJbml0aWFsaXNlIERPUyBkaXJlY3RvcmllcyAqLwogICAgIGlmICghRElSX0luaXQoKSkgcmV0dXJuIEZBTFNFOwogCi0gICAgLyogSW5pdGlhbGl6ZSB0YXNrcyAqLwotICAgIGlmICghVEFTS19Jbml0KCkpIHJldHVybiBGQUxTRTsKLQogICAgICAgLyogSW5pdGlhbGl6ZSBldmVudCBoYW5kbGluZyAqLwogICAgIGlmICghRVZFTlRfSW5pdCgpKSByZXR1cm4gRkFMU0U7CiAKZGlmZiAtLWdpdCBhL2xvYWRlci9tb2R1bGUuYyBiL2xvYWRlci9tb2R1bGUuYwppbmRleCA2NDgyNjEwLi4xZTFkYjk0IDEwMDY0NAotLS0gYS9sb2FkZXIvbW9kdWxlLmMKKysrIGIvbG9hZGVyL21vZHVsZS5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgIm5lZXhlLmgiCisjaW5jbHVkZSAicGVfaW1hZ2UuaCIKICNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCiAjaW5jbHVkZSAicmVzb3VyY2UuaCIKQEAgLTI4LDggKzI5LDYgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAKLWV4dGVybiBISU5TVEFOQ0UxNiBQRV9Mb2FkTW9kdWxlKCBIRklMRTMyIGhmLCBPRlNUUlVDVCAqb2ZzLCBMT0FEUEFSQU1TKiBwYXJhbXMgKTsKLQogZXh0ZXJuIEJPT0wzMiBUSFJFQURfSW5pdERvbmU7CiAKIHN0YXRpYyBITU9EVUxFMTYgaEZpcnN0TW9kdWxlID0gMDsKQEAgLTM3NSw4ICszNzQsMTAgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTU9EVUxFX0NyZWF0ZUluc3RhbmNlCisgKgorICogSWYgbGliX29ubHkgaXMgVFJVRSwgaGFuZGxlIHRoZSBtb2R1bGUgbGlrZSBhIGxpYnJhcnkgZXZlbiBpZiBpdCBpcyBhIC5FWEUKICAqLwotSElOU1RBTkNFMTYgTU9EVUxFX0NyZWF0ZUluc3RhbmNlKCBITU9EVUxFMTYgaE1vZHVsZSwgTE9BRFBBUkFNUyAqcGFyYW1zICkKK0hJTlNUQU5DRTE2IE1PRFVMRV9DcmVhdGVJbnN0YW5jZSggSE1PRFVMRTE2IGhNb2R1bGUsIEJPT0wzMiBsaWJfb25seSApCiB7CiAgICAgU0VHVEFCTEVFTlRSWSAqcFNlZ21lbnQ7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwpAQCAtMzkzLDcgKzM5NCw3IEBACiAgICAgaWYgKGhQcmV2SW5zdGFuY2UpCiAgICAgewogICAgICAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfTElCTU9EVUxFKSByZXR1cm4gaFByZXZJbnN0YW5jZTsKLSAgICAgICAgaWYgKHBhcmFtcyA9PSAoTE9BRFBBUkFNUyopLTEpIHJldHVybiBoUHJldkluc3RhbmNlOworICAgICAgICBpZiAobGliX29ubHkpIHJldHVybiBoUHJldkluc3RhbmNlOwogICAgIH0KIAogICAgIG1pbnNpemUgPSBwU2VnbWVudC0+bWluc2l6ZSA/IHBTZWdtZW50LT5taW5zaXplIDogMHgxMDAwMDsKQEAgLTUzMyw2ICs1MzQsNyBAQAogICAgICAgZnByaW50ZihzdGRlcnIsICJTb3JyeSwgdGhpcyBpcyBhbiBPUy8yIGxpbmVhciBleGVjdXRhYmxlIChMWCkgZmlsZSAhXG4iKTsKICAgICAgIHJldHVybiAoSE1PRFVMRTMyKTEyOwogICAgIH0KKwogICAgIC8qIFdlIG5vdyBoYXZlIGEgdmFsaWQgTkUgaGVhZGVyICovCiAKICAgICBzaXplID0gc2l6ZW9mKE5FX01PRFVMRSkgKwpAQCAtOTI5LDEwICs5MzEsMTAgQEAKICAgICAgICAgZXh0ZXJuIExSRVNVTFQgQ29sb3JEbGdQcm9jKEhXTkQxNixVSU5UMTYsV1BBUkFNMTYsTFBBUkFNKTsKICAgICAgICAgZXh0ZXJuIExSRVNVTFQgRmlsZU9wZW5EbGdQcm9jKEhXTkQxNixVSU5UMTYsV1BBUkFNMTYsTFBBUkFNKTsKICAgICAgICAgZXh0ZXJuIExSRVNVTFQgRmlsZVNhdmVEbGdQcm9jKEhXTkQxNixVSU5UMTYsV1BBUkFNMTYsTFBBUkFNKTsKLSAgICAgICAgZXh0ZXJuIExSRVNVTFQgRmluZFRleHREbGdQcm9jKEhXTkQxNixVSU5UMTYsV1BBUkFNMTYsTFBBUkFNKTsKKyAgICAgICAgZXh0ZXJuIExSRVNVTFQgRmluZFRleHREbGdQcm9jMTYoSFdORDE2LFVJTlQxNixXUEFSQU0xNixMUEFSQU0pOwogICAgICAgICBleHRlcm4gTFJFU1VMVCBQcmludERsZ1Byb2MoSFdORDE2LFVJTlQxNixXUEFSQU0xNixMUEFSQU0pOwogICAgICAgICBleHRlcm4gTFJFU1VMVCBQcmludFNldHVwRGxnUHJvYyhIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7Ci0gICAgICAgIGV4dGVybiBMUkVTVUxUIFJlcGxhY2VUZXh0RGxnUHJvYyhIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7CisgICAgICAgIGV4dGVybiBMUkVTVUxUIFJlcGxhY2VUZXh0RGxnUHJvYzE2KEhXTkQxNixVSU5UMTYsV1BBUkFNMTYsTFBBUkFNKTsKIAogICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCJDb2xvckRsZ1Byb2MiKSkKICAgICAgICAgICAgIHJldHVybiAoRkFSUFJPQzE2KUNvbG9yRGxnUHJvYzsKQEAgLTk0MSwxMyArOTQzLDEzIEBACiAgICAgICAgIGlmICghc3RyY21wKG5hbWUsIkZpbGVTYXZlRGxnUHJvYyIpKQogICAgICAgICAgICAgcmV0dXJuIChGQVJQUk9DMTYpRmlsZVNhdmVEbGdQcm9jOwogICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCJGaW5kVGV4dERsZ1Byb2MiKSkKLSAgICAgICAgICAgIHJldHVybiAoRkFSUFJPQzE2KUZpbmRUZXh0RGxnUHJvYzsKKyAgICAgICAgICAgIHJldHVybiAoRkFSUFJPQzE2KUZpbmRUZXh0RGxnUHJvYzE2OwogICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCJQcmludERsZ1Byb2MiKSkKICAgICAgICAgICAgIHJldHVybiAoRkFSUFJPQzE2KVByaW50RGxnUHJvYzsKICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwiUHJpbnRTZXR1cERsZ1Byb2MiKSkKICAgICAgICAgICAgIHJldHVybiAoRkFSUFJPQzE2KVByaW50U2V0dXBEbGdQcm9jOwogICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCJSZXBsYWNlVGV4dERsZ1Byb2MiKSkKLSAgICAgICAgICAgIHJldHVybiAoRkFSUFJPQzE2KVJlcGxhY2VUZXh0RGxnUHJvYzsKKyAgICAgICAgICAgIHJldHVybiAoRkFSUFJPQzE2KVJlcGxhY2VUZXh0RGxnUHJvYzE2OwogICAgICAgICBmcHJpbnRmKHN0ZGVyciwid2FybmluZzogTm8gbWFwcGluZyBmb3IgJXMoKSwgYWRkIG9uZSBpbiBsaWJyYXJ5L21pc2NzdHVicy5jXG4iLG5hbWUpOwogICAgICAgICBhc3NlcnQoIEZBTFNFICk7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTEzNSwxNCArMTEzNywxOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICBNT0RVTEVfTG9hZAogICoKLSAqIEltcGxlbWVudGF0aW9uIG9mIExvYWRNb2R1bGUoKQorICogSW1wbGVtZW50YXRpb24gb2YgTG9hZE1vZHVsZSgpLgorICoKKyAqIGNtZF9saW5lIG11c3QgY29udGFpbiB0aGUgd2hvbGUgY29tbWFuZC1saW5lLCBpbmNsdWRpbmcgYXJndlswXSAoYW5kCisgKiB3aXRob3V0IGEgcHJlY2VkaW5nIGxlbmd0aCBieXRlKS4KKyAqIElmIGNtZF9saW5lIGlzIE5VTEwsIHRoZSBtb2R1bGUgaXMgbG9hZGVkIGFzIGEgbGlicmFyeSBldmVuIGlmIGl0IGlzIGEgLmV4ZQogICovCi1ISU5TVEFOQ0UxNiBNT0RVTEVfTG9hZCggTFBDU1RSIG5hbWUsIExQVk9JRCBwYXJhbUJsb2NrLCBVSU5UMTYgdUZsYWdzKQorSElOU1RBTkNFMTYgTU9EVUxFX0xvYWQoIExQQ1NUUiBuYW1lLCBVSU5UMTYgdUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBjbWRfbGluZSwgTFBDU1RSIGVudiwgVUlOVDMyIHNob3dfY21kICkKIHsKICAgICBITU9EVUxFMzIgaE1vZHVsZTsKICAgICBISU5TVEFOQ0UxNiBoSW5zdGFuY2UsIGhQcmV2SW5zdGFuY2U7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwotICAgIExPQURQQVJBTVMgKnBhcmFtcyA9IChMT0FEUEFSQU1TICopcGFyYW1CbG9jazsKICAgICBPRlNUUlVDVCBvZnM7CiAgICAgSEZJTEUzMiBoRmlsZTsKIApAQCAtMTE1Miw3ICsxMTU4LDcgQEAKICAgICAgICAgaWYgKChoTW9kdWxlID0gTU9EVUxFX0NyZWF0ZUR1bW15TW9kdWxlKCAmb2ZzICkpIDwgMzIpIHJldHVybiBoTW9kdWxlOwogICAgICAgICBwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2sxNiggaE1vZHVsZSApOwogICAgICAgICBoUHJldkluc3RhbmNlID0gMDsKLSAgICAgICAgaEluc3RhbmNlID0gTU9EVUxFX0NyZWF0ZUluc3RhbmNlKCBoTW9kdWxlLCBwYXJhbXMgKTsKKyAgICAgICAgaEluc3RhbmNlID0gTU9EVUxFX0NyZWF0ZUluc3RhbmNlKCBoTW9kdWxlLCAoY21kX2xpbmUgPT0gTlVMTCkgKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKQEAgLTExODAsOSArMTE4NiwxMCBAQAogICAgICAgICAgICAgaE1vZHVsZSA9IE1PRFVMRV9Mb2FkRXhlSGVhZGVyKCBoRmlsZSwgJm9mcyApOwogICAgICAgICAgICAgaWYgKGhNb2R1bGUgPCAzMikKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaE1vZHVsZSA9PSAyMSkKLSAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSA9IFBFX0xvYWRNb2R1bGUoIGhGaWxlLCAmb2ZzLCBwYXJhbUJsb2NrICk7Ci0gICAgICAgICAgICAgICAgZWxzZSBfbGNsb3NlMzIoIGhGaWxlICk7CisgICAgICAgICAgICAgICAgaWYgKChoTW9kdWxlID09IDIxKSAmJiBjbWRfbGluZSkKKyAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSA9IFBFX0xvYWRNb2R1bGUoIGhGaWxlLCAmb2ZzLCBjbWRfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiwgc2hvd19jbWQgKTsKKyAgICAgICAgICAgICAgICBfbGNsb3NlMzIoIGhGaWxlICk7CiAKICAgICAgICAgICAgICAgICBpZiAoaE1vZHVsZSA8IDMyKQogICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJMb2FkTW9kdWxlOiBjYW4ndCBsb2FkICclcycsIGVycm9yPSVkXG4iLApAQCAtMTE5Nyw3ICsxMjA0LDcgQEAKIAogICAgICAgICAgICAgTU9EVUxFX0NyZWF0ZVNlZ21lbnRzKCBoTW9kdWxlICk7CiAgICAgICAgICAgICBoUHJldkluc3RhbmNlID0gMDsKLSAgICAgICAgICAgIGhJbnN0YW5jZSA9IE1PRFVMRV9DcmVhdGVJbnN0YW5jZShoTW9kdWxlLChMT0FEUEFSQU1TKilwYXJhbUJsb2NrKTsKKyAgICAgICAgICAgIGhJbnN0YW5jZSA9IE1PRFVMRV9DcmVhdGVJbnN0YW5jZSggaE1vZHVsZSwgKGNtZF9saW5lID09IE5VTEwpICk7CiAKICAgICAgICAgICAgIC8qIExvYWQgdGhlIHJlZmVyZW5jZWQgRExMcyAqLwogCkBAIC0xMjI4LDcgKzEyMzUsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApOwogICAgICAgICAgICAgaFByZXZJbnN0YW5jZSA9IE1PRFVMRV9HZXRJbnN0YW5jZSggaE1vZHVsZSApOwotICAgICAgICAgICAgaEluc3RhbmNlID0gTU9EVUxFX0NyZWF0ZUluc3RhbmNlKCBoTW9kdWxlLCBwYXJhbXMgKTsKKyAgICAgICAgICAgIGhJbnN0YW5jZSA9IE1PRFVMRV9DcmVhdGVJbnN0YW5jZSggaE1vZHVsZSwgKGNtZF9saW5lID09IE5VTEwpICk7CiAgICAgICAgICAgICBpZiAoaEluc3RhbmNlICE9IGhQcmV2SW5zdGFuY2UpICAvKiBub3QgYSBsaWJyYXJ5ICovCiAgICAgICAgICAgICAgICAgTkVfTG9hZFNlZ21lbnQoIHBNb2R1bGUsIHBNb2R1bGUtPmRncm91cCApOwogICAgICAgICAgICAgcE1vZHVsZS0+Y291bnQrKzsKQEAgLTEyMzcsMjUgKzEyNDQsMTUgQEAKIAogICAgIC8qIENyZWF0ZSBhIHRhc2sgZm9yIHRoaXMgaW5zdGFuY2UgKi8KIAotICAgIGlmICghKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX0xJQk1PRFVMRSkgJiYgKHBhcmFtQmxvY2sgIT0gKExQVk9JRCktMSkpCisgICAgaWYgKGNtZF9saW5lICYmICEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfTElCTU9EVUxFKSkKICAgICB7Ci0JSFRBU0sxNiBoVGFzazsKLSAgICAgICAgV09SRAlzaG93Y21kOworICAgICAgICBQREIzMiAqcGRiOwogCiAJcE1vZHVsZS0+ZmxhZ3MgfD0gTkVfRkZMQUdTX0dVSTsKIAotCS8qIFBvd2VyUG9pbnQgcGFzc2VzIE5VTEwgYXMgc2hvd0NtZCAqLwotCWlmIChwYXJhbXMtPnNob3dDbWQpCi0JCXNob3djbWQgPSAqKChXT1JEICopUFRSX1NFR19UT19MSU4ocGFyYW1zLT5zaG93Q21kKSsxKTsKLQllbHNlCi0JCXNob3djbWQgPSAwOyAvKiBGSVhNRTogY29ycmVjdCAqLwotCi0gICAgICAgIGhUYXNrID0gVEFTS19DcmVhdGVUYXNrKCBoTW9kdWxlLCBoSW5zdGFuY2UsIGhQcmV2SW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmhFbnZpcm9ubWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQU1RSKVBUUl9TRUdfVE9fTElOKCBwYXJhbXMtPmNtZExpbmUgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3djbWQgKTsKLQotCWlmKCBoVGFzayAmJiBUQVNLX0dldE5leHRUYXNrKGhUYXNrKSkgWWllbGQxNigpOworICAgICAgICBwZGIgPSBQUk9DRVNTX0NyZWF0ZSggcE1vZHVsZSwgY21kX2xpbmUsIGVudiwgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFByZXZJbnN0YW5jZSwgc2hvd19jbWQgKTsKKyAgICAgICAgaWYgKHBkYiAmJiAoR2V0TnVtVGFza3MoKSA+IDEpKSBZaWVsZDE2KCk7CiAgICAgfQogCiAgICAgcmV0dXJuIGhJbnN0YW5jZTsKQEAgLTEyNjcsNyArMTI2NCwzNyBAQAogICovCiBISU5TVEFOQ0UxNiBMb2FkTW9kdWxlMTYoIExQQ1NUUiBuYW1lLCBMUFZPSUQgcGFyYW1CbG9jayApCiB7Ci0gICAgcmV0dXJuIE1PRFVMRV9Mb2FkKCBuYW1lLCBwYXJhbUJsb2NrLCAwICk7CisgICAgTE9BRFBBUkFNUyAqcGFyYW1zID0gKExPQURQQVJBTVMgKilwYXJhbUJsb2NrOworICAgIExQU1RSIGNtZF9saW5lID0gKExQU1RSKVBUUl9TRUdfVE9fTElOKCBwYXJhbXMtPmNtZExpbmUgKTsKKyAgICBMUFNUUiBuZXdfY21kX2xpbmU7CisgICAgVUlOVDE2IHNob3dfY21kID0gMDsKKyAgICBMUENWT0lEIGVudiA9IE5VTEw7CisgICAgSElOU1RBTkNFMTYgaEluc3RhbmNlOworCisgICAgaWYgKCFwYXJhbUJsb2NrIHx8IChwYXJhbUJsb2NrID09IChMUFZPSUQpLTEpKQorICAgICAgICByZXR1cm4gTG9hZExpYnJhcnkxNiggbmFtZSApOworCisgICAgcGFyYW1zID0gKExPQURQQVJBTVMgKilwYXJhbUJsb2NrOworICAgIGNtZF9saW5lID0gKExQU1RSKVBUUl9TRUdfVE9fTElOKCBwYXJhbXMtPmNtZExpbmUgKTsKKyAgICAvKiBQb3dlclBvaW50IHBhc3NlcyBOVUxMIGFzIHNob3dDbWQgKi8KKyAgICBpZiAocGFyYW1zLT5zaG93Q21kKQorICAgICAgICBzaG93X2NtZCA9ICooKFVJTlQxNiAqKVBUUl9TRUdfVE9fTElOKHBhcmFtcy0+c2hvd0NtZCkrMSk7CisKKyAgICBpZiAoIWNtZF9saW5lKSBjbWRfbGluZSA9ICIiOworICAgIGVsc2UgaWYgKCpjbWRfbGluZSkgY21kX2xpbmUrKzsgIC8qIHNraXAgdGhlIGxlbmd0aCBieXRlICovCisKKyAgICBpZiAoIShuZXdfY21kX2xpbmUgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oY21kX2xpbmUpICsgc3RybGVuKG5hbWUpICsgMiApKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3RyY3B5KCBuZXdfY21kX2xpbmUsIG5hbWUgKTsKKyAgICBzdHJjYXQoIG5ld19jbWRfbGluZSwgIiAiICk7CisgICAgc3RyY2F0KCBuZXdfY21kX2xpbmUsIGNtZF9saW5lICk7CisKKyAgICBpZiAocGFyYW1zLT5oRW52aXJvbm1lbnQpIGVudiA9IEdsb2JhbExvY2sxNiggcGFyYW1zLT5oRW52aXJvbm1lbnQgKTsKKyAgICBoSW5zdGFuY2UgPSBNT0RVTEVfTG9hZCggbmFtZSwgMCwgbmV3X2NtZF9saW5lLCBlbnYsIHNob3dfY21kICk7CisgICAgaWYgKHBhcmFtcy0+aEVudmlyb25tZW50KSBHbG9iYWxVbmxvY2sxNiggcGFyYW1zLT5oRW52aXJvbm1lbnQgKTsKKyAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmV3X2NtZF9saW5lICk7CisgICAgcmV0dXJuIGhJbnN0YW5jZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEyODAsOCArMTMwNyw4IEBACiAgKi8KIERXT1JEIExvYWRNb2R1bGUzMiggTFBDU1RSIG5hbWUsIExQVk9JRCBwYXJhbUJsb2NrICkgCiB7Ci0jaWZkZWYgMAotICBMT0FEUEFSQU1TMzIgKnAgPSBwYXJhbUJsb2NrOworICAgIExPQURQQVJBTVMzMiAqcGFyYW1zID0gKExPQURQQVJBTVMzMiAqKXBhcmFtQmxvY2s7CisjaWYgMAogICBTVEFSVFVQSU5GTyBzdDsKICAgUFJPQ0VTU0lORk9STUFUSU9OIHBpOwogICBzdC5jYiA9IHNpemVvZihTVEFSVFVQSU5GTyk7CkBAIC0xMjk3LDcgKzEzMjQsOCBAQAogICBDbG9zZUhhbmRsZTMyKHBpLmhUaHJlYWQpOyAKIAogI2Vsc2UKLSAgICByZXR1cm4gTU9EVUxFX0xvYWQoIG5hbWUsIHBhcmFtQmxvY2ssIDAgKTsKKyAgcmV0dXJuIE1PRFVMRV9Mb2FkKCBuYW1lLCAwLCBwYXJhbXMtPmxwQ21kTGluZSwgcGFyYW1zLT5scEVudkFkZHJlc3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgKigoVUlOVDE2ICopcGFyYW1zLT5scENtZFNob3cgKyAxKSApOwogI2VuZGlmCiB9CiAKQEAgLTE0NTUsNyArMTQ4Myw3IEBACiAgICAgSE1PRFVMRTMyIGhtb2Q7CiAgICAgCiAgICAgaG1vZCA9IFBFX0xvYWRMaWJyYXJ5RXgzMkEobGlibmFtZSxQUk9DRVNTX0N1cnJlbnQoKSxoZmlsZSxmbGFncyk7Ci0gICAgaWYgKGhtb2QgPD0gMzIpIHsKKyAgICBpZiAoaG1vZCA8IDMyKSB7CiAJY2hhciBidWZmZXJbMjU2XTsKIAogCXN0cmNweSggYnVmZmVyLCBsaWJuYW1lICk7CkBAIC0xNDYzLDcgKzE0OTEsOCBAQAogCWhtb2QgPSBQRV9Mb2FkTGlicmFyeUV4MzJBKGJ1ZmZlcixQUk9DRVNTX0N1cnJlbnQoKSxoZmlsZSxmbGFncyk7CiAgICAgfQogICAgIC8qIGluaXRpYWxpemUgYWxsIERMTHMsIHdoaWNoIGhhdmVuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXQuICovCi0gICAgUEVfSW5pdGlhbGl6ZURMTHMoIFBST0NFU1NfQ3VycmVudCgpLCBETExfUFJPQ0VTU19BVFRBQ0gsIE5VTEwpOworICAgIGlmIChobW9kID49IDMyKQorICAgICAgICBQRV9Jbml0aWFsaXplRExMcyggUFJPQ0VTU19DdXJyZW50KCksIERMTF9QUk9DRVNTX0FUVEFDSCwgTlVMTCk7CiAgICAgcmV0dXJuIGhtb2Q7CiB9CiAKQEAgLTE1MTksMTMgKzE1NDgsMTMgQEAKICAgICB9CiAgICAgVFJBQ0UobW9kdWxlLCAiKCUwOHgpICVzXG4iLCAoaW50KWxpYm5hbWUsIGxpYm5hbWUpOwogCi0gICAgaGFuZGxlID0gTU9EVUxFX0xvYWQoIGxpYm5hbWUsIChMUFZPSUQpLTEsIDAgKTsKKyAgICBoYW5kbGUgPSBNT0RVTEVfTG9hZCggbGlibmFtZSwgMCwgTlVMTCwgTlVMTCwgMCApOwogICAgIGlmIChoYW5kbGUgPT0gKEhJTlNUQU5DRTE2KTIpICAvKiBmaWxlIG5vdCBmb3VuZCAqLwogICAgIHsKICAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKICAgICAgICAgbHN0cmNweW4zMkEoIGJ1ZmZlciwgbGlibmFtZSwgMjUyICk7CiAgICAgICAgIHN0cmNhdCggYnVmZmVyLCAiLmRsbCIgKTsKLSAgICAgICAgaGFuZGxlID0gTU9EVUxFX0xvYWQoIGJ1ZmZlciwgKExQVk9JRCktMSwgMCApOworICAgICAgICBoYW5kbGUgPSBNT0RVTEVfTG9hZCggYnVmZmVyLCAwLCBOVUxMLCBOVUxMLCAwICk7CiAgICAgfQogICAgIHJldHVybiBoYW5kbGU7CiB9CkBAIC0xNTc3LDIzICsxNjA2LDEzIEBACiAgKi8KIEhJTlNUQU5DRTMyIFdJTkFQSSBXaW5FeGVjMzIoIExQQ1NUUiBscENtZExpbmUsIFVJTlQzMiBuQ21kU2hvdyApCiB7Ci0gICAgTE9BRFBBUkFNUyBwYXJhbXM7Ci0gICAgSEdMT0JBTDE2IGNtZFNob3dIYW5kbGUsIGNtZExpbmVIYW5kbGU7CiAgICAgSElOU1RBTkNFMzIgaGFuZGxlID0gMjsKLSAgICBXT1JEICpjbWRTaG93UHRyOwotICAgIGNoYXIgKnAsICpjbWRsaW5lLCBmaWxlbmFtZVsyNTZdOworICAgIGNoYXIgKnAsIGZpbGVuYW1lWzI1Nl07CiAgICAgc3RhdGljIGludCB1c2VfbG9hZF9tb2R1bGUgPSAxOwogICAgIGludCAgc3BhY2VsaW1pdCA9IDAsIGV4aGF1c3RlZCA9IDA7CiAKICAgICBpZiAoIWxwQ21kTGluZSkKICAgICAgICAgcmV0dXJuIDI7ICAvKiBGaWxlIG5vdCBmb3VuZCAqLwotICAgIGlmICghKGNtZFNob3dIYW5kbGUgPSBHbG9iYWxBbGxvYzE2KCAwLCAyICogc2l6ZW9mKFdPUkQpICkpKQotICAgICAgICByZXR1cm4gODsgIC8qIE91dCBvZiBtZW1vcnkgKi8KLSAgICBpZiAoIShjbWRMaW5lSGFuZGxlID0gR2xvYmFsQWxsb2MxNiggMCwgMjA0OCApKSkKLSAgICB7Ci0gICAgICAgIEdsb2JhbEZyZWUxNiggY21kU2hvd0hhbmRsZSApOwotICAgICAgICByZXR1cm4gODsgIC8qIE91dCBvZiBtZW1vcnkgKi8KLSAgICB9CiAKICAgICAvKiBLZWVwIHRyeWluZyB0byBsb2FkIGEgZmlsZSBieSB0cnlpbmcgZGlmZmVyZW50IGZpbGVuYW1lczsgZS5nLiwKICAgICAgICBmb3IgdGhlIGNtZGxpbmUgImFiY2QgZWZnIGhpaiIsIHRyeSAiYWJjZCIgd2l0aCBhcmdzICJlZmcgaGlqIiwKQEAgLTE2MDMsMTUgKzE2MjIsOCBAQAogICAgIHdoaWxlKCFleGhhdXN0ZWQgJiYgaGFuZGxlID09IDIpIHsKIAlpbnQgc3BhY2Vjb3VudCA9IDA7CiAKLQkvKiBTdG9yZSBuQ21kU2hvdyAqLwotCi0JY21kU2hvd1B0ciA9IChXT1JEICopR2xvYmFsTG9jazE2KCBjbWRTaG93SGFuZGxlICk7Ci0JY21kU2hvd1B0clswXSA9IDI7Ci0JY21kU2hvd1B0clsxXSA9IG5DbWRTaG93OwotCiAJLyogQnVpbGQgdGhlIGZpbGVuYW1lIGFuZCBjb21tYW5kLWxpbmUgKi8KIAotCWNtZGxpbmUgPSAoY2hhciAqKUdsb2JhbExvY2sxNiggY21kTGluZUhhbmRsZSApOwogCWxzdHJjcHluMzJBKGZpbGVuYW1lLCBscENtZExpbmUsCiAJCSAgICBzaXplb2YoZmlsZW5hbWUpIC0gNCAvKiBmb3IgZXh0ZW5zaW9uICovKTsKIApAQCAtMTYzMywxOCArMTY0NSw3IEBACiAJICAgIH0KIAl9CiAKLQlpZiAoKnApCi0JICAgIGxzdHJjcHluMzJBKCBjbWRsaW5lICsgMSwgcCArIDEsIDI1NSApOwotCWVsc2UKLQkgICAgY21kbGluZVsxXSA9ICdcMCc7Ci0KLQljbWRsaW5lWzBdID0gc3RybGVuKCBjbWRsaW5lICsgMSApOwogCSpwID0gJ1wwJzsKLQkvKiB0aGlzIGlzIGEgKGhvcGVmdWxseSBhY2NlcHRhYmxlIGhhY2sgdG8gZ2V0IHRoZSB3aG9sZQotCSAgIGNvbW1hbmRsaW5lIGZvciBQUk9DRVNTX0NyZWF0ZQotCSAgIHdlIHB1dCBpdCBhZnRlciB0aGUgcHJvY2Vzc2VkIG9uZSAqLwotCWxzdHJjcHluMzJBKGNtZGxpbmUgKyAodW5zaWduZWQgY2hhciljbWRsaW5lWzBdICsyLAotCQkgICAgbHBDbWRMaW5lLCAyMDQ4IC0gMjU2KTsKIAogCS8qIE5vdyBsb2FkIHRoZSBleGVjdXRhYmxlIGZpbGUgKi8KIApAQCAtMTY1MiwxMSArMTY1Myw3IEBACiAJewogCSAgICAvKiBXaW5lbGliOiBVc2UgTG9hZE1vZHVsZSgpIG9ubHkgZm9yIHRoZSBwcm9ncmFtIGl0c2VsZiAqLwogCSAgICBpZiAoX193aW5lbGliKSB1c2VfbG9hZF9tb2R1bGUgPSAwOwotCSAgICBwYXJhbXMuaEVudmlyb25tZW50ID0gKEhHTE9CQUwxNilTRUxFQ1RPUk9GKCBHZXRET1NFbnZpcm9ubWVudCgpICk7Ci0JICAgIHBhcmFtcy5jbWRMaW5lICA9IChTRUdQVFIpV0lOMTZfR2xvYmFsTG9jazE2KCBjbWRMaW5lSGFuZGxlICk7Ci0JICAgIHBhcmFtcy5zaG93Q21kICA9IChTRUdQVFIpV0lOMTZfR2xvYmFsTG9jazE2KCBjbWRTaG93SGFuZGxlICk7Ci0JICAgIHBhcmFtcy5yZXNlcnZlZCA9IDA7Ci0JICAgIGhhbmRsZSA9IExvYWRNb2R1bGUzMiggZmlsZW5hbWUsICZwYXJhbXMgKTsKKyAgICAgICAgICAgIGhhbmRsZSA9IE1PRFVMRV9Mb2FkKCBmaWxlbmFtZSwgMCwgbHBDbWRMaW5lLCBOVUxMLCBuQ21kU2hvdyApOwogCSAgICBpZiAoaGFuZGxlID09IDIpICAvKiBmaWxlIG5vdCBmb3VuZCAqLwogCSAgICB7CiAJCS8qIENoZWNrIHRoYXQgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZSBkaWQgbm90IGhhdmUgYSBzdWZmaXggKi8KQEAgLTE2NjYsOCArMTY2Myw5IEBACiAJCXsKIAkJICAgIHAgPSBmaWxlbmFtZSArIHN0cmxlbihmaWxlbmFtZSk7CiAJCSAgICBzdHJjcHkoIHAsICIuZXhlIiApOwotCQkgICAgaGFuZGxlID0gTG9hZE1vZHVsZTE2KCBmaWxlbmFtZSwgJnBhcmFtcyApOwotCQkgICAgKnAgPSAnXDAnOyAgLyogUmVtb3ZlIGV4dGVuc2lvbiAqLworICAgICAgICAgICAgICAgICAgICBoYW5kbGUgPSBNT0RVTEVfTG9hZCggZmlsZW5hbWUsIDAsIGxwQ21kTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIG5DbWRTaG93ICk7CisgICAgICAgICAgICAgICAgICAgICpwID0gJ1wwJzsgIC8qIFJlbW92ZSBleHRlbnNpb24gKi8KIAkJfQogCSAgICB9CiAJfQpAQCAtMTcwMyw3ICsxNzAxLDcgQEAKIAkJICAgIGFyZ3B0ciA9IGFyZ3Y7CiAJCSAgICBpZiAoaWNvbmljKSAqYXJncHRyKysgPSAiLWljb25pYyI7CiAJCSAgICAqYXJncHRyKysgPSB1bml4ZmlsZW5hbWU7Ci0JCSAgICBwID0gY21kbGluZSArIDE7CisJCSAgICBwID0gc3RyZHVwKGxwQ21kTGluZSk7CiAJCSAgICB3aGlsZSAoMSkKIAkJICAgIHsKIAkJCXdoaWxlICgqcCAmJiAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcpKSAqcCsrID0gJ1wwJzsKQEAgLTE3NDAsOCArMTczOCw2IEBACiAJfQogICAgIH0gLyogd2hpbGUgKCFleGhhdXN0ZWQgJiYgaGFuZGxlIDwgMzIpICovCiAKLSAgICBHbG9iYWxGcmVlMTYoIGNtZFNob3dIYW5kbGUgKTsKLSAgICBHbG9iYWxGcmVlMTYoIGNtZExpbmVIYW5kbGUgKTsKICAgICByZXR1cm4gaGFuZGxlOwogfQogCmRpZmYgLS1naXQgYS9sb2FkZXIvbmVfaW1hZ2UuYyBiL2xvYWRlci9uZV9pbWFnZS5jCmluZGV4IDNmMDBlMjIuLjViYjEwODggMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZV9pbWFnZS5jCisrKyBiL2xvYWRlci9uZV9pbWFnZS5jCkBAIC0yOCwxNSArMjgsMzMgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBORV9HZXRSZWxvY0FkZHJOYW1lCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpORV9HZXRSZWxvY0FkZHJOYW1lKCBCWVRFIGFkZHJfdHlwZSwgaW50IGFkZGl0aXZlICkKK3sKKyAgICBzd2l0Y2goYWRkcl90eXBlICYgMHg3ZikKKyAgICB7CisgICAgY2FzZSBORV9SQUREUl9MT1dCWVRFOiAgIHJldHVybiBhZGRpdGl2ZSA/ICJCWVRFIGFkZCIgOiAiQllURSI7CisgICAgY2FzZSBORV9SQUREUl9PRkZTRVQxNjogIHJldHVybiBhZGRpdGl2ZSA/ICJPRkZTRVQxNiBhZGQiIDogIk9GRlNFVDE2IjsKKyAgICBjYXNlIE5FX1JBRERSX1BPSU5URVIzMjogcmV0dXJuIGFkZGl0aXZlID8gIlBPSU5URVIzMiBhZGQiIDogIlBPSU5URVIzMiI7CisgICAgY2FzZSBORV9SQUREUl9TRUxFQ1RPUjogIHJldHVybiBhZGRpdGl2ZSA/ICJTRUxFQ1RPUiBhZGQiIDogIlNFTEVDVE9SIjsKKyAgICBjYXNlIE5FX1JBRERSX1BPSU5URVI0ODogcmV0dXJuIGFkZGl0aXZlID8gIlBPSU5URVI0OCBhZGQiIDogIlBPSU5URVI0OCI7CisgICAgY2FzZSBORV9SQUREUl9PRkZTRVQzMjogIHJldHVybiBhZGRpdGl2ZSA/ICJPRkZTRVQzMiBhZGQiIDogIk9GRlNFVDMyIjsKKyAgICB9CisgICAgcmV0dXJuICI/Pz8iOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE5FX0xvYWRTZWdtZW50CiAgKi8KIEJPT0wzMiBORV9Mb2FkU2VnbWVudCggTkVfTU9EVUxFICpwTW9kdWxlLCBXT1JEIHNlZ251bSApCiB7CiAgICAgU0VHVEFCTEVFTlRSWSAqcFNlZ1RhYmxlLCAqcFNlZzsKICAgICBXT1JEICpwTW9kdWxlVGFibGU7Ci0gICAgV09SRCBjb3VudCwgaSwgb2Zmc2V0OworICAgIFdPUkQgY291bnQsIGksIG9mZnNldCwgbmV4dF9vZmZzZXQ7CiAgICAgSE1PRFVMRTE2IG1vZHVsZTsKLSAgICBGQVJQUk9DMTYgYWRkcmVzczsKKyAgICBGQVJQUk9DMTYgYWRkcmVzcyA9IDA7CiAgICAgaW50IGZkOwogICAgIHN0cnVjdCByZWxvY2F0aW9uX2VudHJ5X3MgKnJlcCwgKnJlbG9jX2VudHJpZXM7CiAgICAgQllURSAqZnVuY19uYW1lOwpAQCAtMTcwLDcgKzE4OCw3IEBACiAJICAgYW5kIHRhcmdldCAqLwogCWFkZGl0aXZlID0gcmVwLT5yZWxvY2F0aW9uX3R5cGUgJiBORV9SRUxGTEFHX0FERElUSVZFOwogCXJlcC0+cmVsb2NhdGlvbl90eXBlICY9IDB4MzsKLQkKKwogCXN3aXRjaCAocmVwLT5yZWxvY2F0aW9uX3R5cGUpCiAJewogCSAgY2FzZSBORV9SRUxUWVBFX09SRElOQUw6CkBAIC0xODcsOCArMjA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZSArIDEgKTsKICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IG5vIGhhbmRsZXIgZm9yICUqLipzLiVkLCBzZXR0aW5nIHRvIDA6MFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChCWVRFICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUpLAorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBubyBoYW5kbGVyIGZvciAlLipzLiVkLCBzZXR0aW5nIHRvIDA6MFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChCWVRFICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGluYWwgKTsKQEAgLTE5NiwxMSArMjEzLDExIEBACiAgICAgICAgICAgICBpZiAoVFJBQ0VfT04oZml4dXApKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIE5FX01PRFVMRSAqcFRhcmdldCA9IE1PRFVMRV9HZXRQdHIoIG1vZHVsZSApOwotICAgICAgICAgICAgICAgIFRSQUNFKGZpeHVwLCAiJWQ6ICUqLipzLiVkPSUwNHg6JTA0eFxuIiwgaSArIDEsIAotCQkJICAgICAqKChCWVRFICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUpLAotCQkJICAgICAqKChCWVRFICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUpLAotCQkJICAgICAoY2hhciAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlICsgMSwKLQkJCSAgICAgb3JkaW5hbCwgSElXT1JEKGFkZHJlc3MpLCBMT1dPUkQoYWRkcmVzcykgKTsKKyAgICAgICAgICAgICAgICBUUkFDRSggZml4dXAsICIlZDogJS4qcy4lZD0lMDR4OiUwNHggJXNcbiIsIGkgKyAxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgIG9yZGluYWwsIEhJV09SRChhZGRyZXNzKSwgTE9XT1JEKGFkZHJlc3MpLAorICAgICAgICAgICAgICAgICAgICAgICBORV9HZXRSZWxvY0FkZHJOYW1lKCByZXAtPmFkZHJlc3NfdHlwZSwgYWRkaXRpdmUgKSApOwogICAgICAgICAgICAgfQogCSAgICBicmVhazsKIAkgICAgCkBAIC0yMTgsMTYgKzIzNSwxNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIE5FX01PRFVMRSAqcFRhcmdldCA9IE1PRFVMRV9HZXRQdHIoIG1vZHVsZSApOwogICAgICAgICAgICAgICAgIEVSUihmaXh1cCwgIldhcm5pbmc6IG5vIGhhbmRsZXIgZm9yICUuKnMuJXMsIHNldHRpbmcgdG8gMDowXG4iLAotCQkJICAgICooKEJZVEUgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSksCi0JCQkgICAgKGNoYXIgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSArIDEsIGZ1bmNfbmFtZSApOworICAgICAgICAgICAgICAgICAgICAqKChCWVRFICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUpLAorICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlICsgMSwgZnVuY19uYW1lICk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoVFJBQ0VfT04oZml4dXApKQogICAgICAgICAgICAgewogCSAgICAgICAgTkVfTU9EVUxFICpwVGFyZ2V0ID0gTU9EVUxFX0dldFB0ciggbW9kdWxlICk7Ci0gICAgICAgICAgICAgICAgVFJBQ0UoZml4dXAsICIlZDogJS4qcy4lcz0lMDR4OiUwNHhcbiIsIGkgKyAxLCAKLQkJCSAgICAgKigoQllURSAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlKSwKLQkJCSAgICAgKGNoYXIgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSArIDEsCi0JCQkgICAgIGZ1bmNfbmFtZSwgSElXT1JEKGFkZHJlc3MpLCBMT1dPUkQoYWRkcmVzcykgKTsKKyAgICAgICAgICAgICAgICBUUkFDRSggZml4dXAsICIlZDogJS4qcy4lcz0lMDR4OiUwNHggJXNcbiIsIGkgKyAxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgSElXT1JEKGFkZHJlc3MpLCBMT1dPUkQoYWRkcmVzcyksCisgICAgICAgICAgICAgICAgICAgICAgIE5FX0dldFJlbG9jQWRkck5hbWUoIHJlcC0+YWRkcmVzc190eXBlLCBhZGRpdGl2ZSApICk7CiAgICAgICAgICAgICB9CiAJICAgIGJyZWFrOwogCSAgICAKQEAgLTI0MSw4ICsyNTksOSBAQAogICAgICAgICAgICAgICAgIGFkZHJlc3MgPSAoRkFSUFJPQzE2KVBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggcFNlZ1RhYmxlW3JlcC0+dGFyZ2V0MS0xXS5zZWxlY3RvciwgcmVwLT50YXJnZXQyICk7CiAJICAgIH0KIAkgICAgCi0JICAgIFRSQUNFKGZpeHVwLCIlZDogJTA0eDolMDR4XG4iLCAKLQkJCSAgaSArIDEsIEhJV09SRChhZGRyZXNzKSwgTE9XT1JEKGFkZHJlc3MpICk7CisJICAgIFRSQUNFKCBmaXh1cCwiJWQ6ICUwNHg6JTA0eCAlc1xuIiwgCisgICAgICAgICAgICAgICAgICAgaSArIDEsIEhJV09SRChhZGRyZXNzKSwgTE9XT1JEKGFkZHJlc3MpLAorICAgICAgICAgICAgICAgICAgIE5FX0dldFJlbG9jQWRkck5hbWUoIHJlcC0+YWRkcmVzc190eXBlLCBhZGRpdGl2ZSApICk7CiAJICAgIGJyZWFrOwogCiAJICBjYXNlIE5FX1JFTFRZUEVfT1NGSVhVUDoKQEAgLTI1NCwxOCArMjczLDExIEBACiAJICAgICAqIHN1Y2Nlc3NmdWxseSBlbXVsYXRlIHRoZSBjb3Byb2Nlc3NvciBpZiBpdCBkb2Vzbid0CiAJICAgICAqIGV4aXN0LgogCSAgICAgKi8KLQkgICAgVFJBQ0UoZml4dXAsICIlZDogQUREUiBUWVBFICVkLCAgVFlQRSAlZCwgIE9GRlNFVCAlMDR4LCAgIgotCQkJICJUQVJHRVQgJTA0eCAlMDR4XG4iLCBpICsgMSwgcmVwLT5hZGRyZXNzX3R5cGUsIAotCQkJIHJlcC0+cmVsb2NhdGlvbl90eXBlLCByZXAtPm9mZnNldCwgcmVwLT50YXJnZXQxLCByZXAtPnRhcmdldDIpOworCSAgICBUUkFDRSggZml4dXAsICIlZDogVFlQRSAlZCwgT0ZGU0VUICUwNHgsIFRBUkdFVCAlMDR4ICUwNHggJXNcbiIsCisgICAgICAgICAgICAgICAgICAgaSArIDEsIHJlcC0+cmVsb2NhdGlvbl90eXBlLCByZXAtPm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICByZXAtPnRhcmdldDEsIHJlcC0+dGFyZ2V0MiwKKyAgICAgICAgICAgICAgICAgICBORV9HZXRSZWxvY0FkZHJOYW1lKCByZXAtPmFkZHJlc3NfdHlwZSwgYWRkaXRpdmUgKSApOwogCSAgICBjb250aW51ZTsKLQkgICAgCi0JICBkZWZhdWx0OgotCSAgICBXQVJOKGZpeHVwLCAiV0FSTklORzogJWQ6IEFERFIgVFlQRSAlZCwgICIKLQkJCSAgInVua25vd24gVFlQRSAlZCwgT0ZGU0VUICUwNHgsIFRBUkdFVCAlMDR4ICUwNHhcbiIsCi0JCQkgIGkgKyAxLCByZXAtPmFkZHJlc3NfdHlwZSwgcmVwLT5yZWxvY2F0aW9uX3R5cGUsIAotCQkJICByZXAtPm9mZnNldCwgcmVwLT50YXJnZXQxLCByZXAtPnRhcmdldDIpOwotCSAgICBmcmVlKHJlbG9jX2VudHJpZXMpOwotCSAgICByZXR1cm4gRkFMU0U7CiAJfQogCiAJb2Zmc2V0ICA9IHJlcC0+b2Zmc2V0OwpAQCAtMjczLDc2ICsyODUsNzYgQEAKICAgICAgICAgLyogQXBwYXJlbnRseSwgaGlnaCBiaXQgb2YgYWRkcmVzc190eXBlIGlzIHNvbWV0aW1lcyBzZXQ7ICovCiAgICAgICAgIC8qIHdlIGlnbm9yZSBpdCBmb3Igbm93ICovCiAJaWYgKHJlcC0+YWRkcmVzc190eXBlID4gTkVfUkFERFJfT0ZGU0VUMzIpCi0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXQVJOSU5HOiBtb2R1bGUgJXM6IHVua25vd24gcmVsb2MgYWRkciB0eXBlID0gMHglMDJ4LiBQbGVhc2UgcmVwb3J0LlxuIiwKLSAgICAgICAgICAgICAgICAgICAgIE1PRFVMRV9HZXRNb2R1bGVOYW1lKHBNb2R1bGUtPnNlbGYpLCByZXAtPmFkZHJlc3NfdHlwZSApOworICAgICAgICAgICAgRVJSKCBmaXh1cCwgIldBUk5JTkc6IG1vZHVsZSAlczogdW5rbm93biByZWxvYyBhZGRyIHR5cGUgPSAweCUwMnguIFBsZWFzZSByZXBvcnQuXG4iLAorICAgICAgICAgICAgICAgICBNT0RVTEVfR2V0TW9kdWxlTmFtZShwTW9kdWxlLT5zZWxmKSwgcmVwLT5hZGRyZXNzX3R5cGUgKTsKIAotCXN3aXRjaCAocmVwLT5hZGRyZXNzX3R5cGUgJiAweDdmKQotCXsKLQkgIGNhc2UgTkVfUkFERFJfTE9XQllURToKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBzcCA9IFBUUl9TRUdfT0ZGX1RPX0xJTiggcFNlZy0+c2VsZWN0b3IsIG9mZnNldCApOwotICAgICAgICAgICAgICAgIFRSQUNFKGZpeHVwLCIgICAgJTA0eDolMDR4OiUwNHggQllURSVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZy0+c2VsZWN0b3IsIG9mZnNldCwgKnNwLCBhZGRpdGl2ZSA/ICIgYWRkaXRpdmUiOiIiKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgPSAqc3A7Ci0JCWlmKGFkZGl0aXZlKQotICAgICAgICAgICAgICAgICAgICAqKHVuc2lnbmVkIGNoYXIqKXNwID0gKHVuc2lnbmVkIGNoYXIpKCgoaW50KWFkZHJlc3Mrb2Zmc2V0KSAmIDB4RkYpOwotCQllbHNlCi0gICAgICAgICAgICAgICAgICAgICoodW5zaWduZWQgY2hhciopc3AgPSAodW5zaWduZWQgY2hhcikoKGludClhZGRyZXNzICYgMHhGRik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAob2Zmc2V0ICYmIG9mZnNldCAhPSAweGZmZmYgJiYgIWFkZGl0aXZlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0JICBjYXNlIE5FX1JBRERSX09GRlNFVDE2OgotCSAgICBkbyB7Ci0gICAgICAgICAgICAgICAgc3AgPSBQVFJfU0VHX09GRl9UT19MSU4oIHBTZWctPnNlbGVjdG9yLCBvZmZzZXQgKTsKLQkJVFJBQ0UoZml4dXAsIiAgICAlMDR4OiUwNHg6JTA0eCBPRkZTRVQxNiVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZy0+c2VsZWN0b3IsIG9mZnNldCwgKnNwLCBhZGRpdGl2ZSA/ICIgYWRkaXRpdmUiIDogIiIgKTsKLQkJb2Zmc2V0ID0gKnNwOwotCQkqc3AgPSBMT1dPUkQoYWRkcmVzcyk7Ci0JCWlmIChhZGRpdGl2ZSkgKnNwICs9IG9mZnNldDsKLQkgICAgfSAKLQkgICAgd2hpbGUgKG9mZnNldCAmJiBvZmZzZXQgIT0gMHhmZmZmICYmICFhZGRpdGl2ZSk7Ci0JICAgIGJyZWFrOwotCSAgICAKLQkgIGNhc2UgTkVfUkFERFJfUE9JTlRFUjMyOgotCSAgICBkbyB7Ci0gICAgICAgICAgICAgICAgc3AgPSBQVFJfU0VHX09GRl9UT19MSU4oIHBTZWctPnNlbGVjdG9yLCBvZmZzZXQgKTsKLQkJVFJBQ0UoZml4dXAsIiAgICAlMDR4OiUwNHg6JTA0eCBQT0lOVEVSMzIlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWctPnNlbGVjdG9yLCBvZmZzZXQsICpzcCwgYWRkaXRpdmUgPyAiIGFkZGl0aXZlIiA6ICIiICk7Ci0JCW9mZnNldCA9ICpzcDsKLQkJKnNwICAgID0gTE9XT1JEKGFkZHJlc3MpOwotCQlpZiAoYWRkaXRpdmUpICpzcCArPSBvZmZzZXQ7CisgICAgICAgIGlmIChhZGRpdGl2ZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3AgPSBQVFJfU0VHX09GRl9UT19MSU4oIHBTZWctPnNlbGVjdG9yLCBvZmZzZXQgKTsKKyAgICAgICAgICAgIFRSQUNFKCBmaXh1cCwiICAgICUwNHg6JTA0eFxuIiwgb2Zmc2V0LCAqc3AgKTsKKyAgICAgICAgICAgIHN3aXRjaCAocmVwLT5hZGRyZXNzX3R5cGUgJiAweDdmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBORV9SQUREUl9MT1dCWVRFOgorICAgICAgICAgICAgICAgICooQllURSAqKXNwICs9IExPQllURSgoaW50KWFkZHJlc3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBORV9SQUREUl9PRkZTRVQxNjoKKwkJKnNwICs9IExPV09SRChhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTkVfUkFERFJfUE9JTlRFUjMyOgorCQkqc3AgKz0gTE9XT1JEKGFkZHJlc3MpOwogCQkqKHNwKzEpID0gSElXT1JEKGFkZHJlc3MpOwotCSAgICB9IAotCSAgICB3aGlsZSAob2Zmc2V0ICYmIG9mZnNldCAhPSAweGZmZmYgJiYgIWFkZGl0aXZlKTsKLQkgICAgYnJlYWs7Ci0JICAgIAotCSAgY2FzZSBORV9SQUREUl9TRUxFQ1RPUjoKLQkgICAgZG8gewotICAgICAgICAgICAgICAgIHNwID0gUFRSX1NFR19PRkZfVE9fTElOKCBwU2VnLT5zZWxlY3Rvciwgb2Zmc2V0ICk7Ci0JCVRSQUNFKGZpeHVwLCIgICAgJTA0eDolMDR4OiUwNHggU0VMRUNUT1Ilc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWctPnNlbGVjdG9yLCBvZmZzZXQsICpzcCwgYWRkaXRpdmUgPyAiIGFkZGl0aXZlIiA6ICIiICk7Ci0JCW9mZnNldCA9ICpzcDsKLQkJKnNwICAgID0gSElXT1JEKGFkZHJlc3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBORV9SQUREUl9TRUxFQ1RPUjoKIAkJLyogQm9ybGFuZCBjcmVhdGVzIGFkZGl0aXZlIHJlY29yZHMgd2l0aCBvZmZzZXQgemVyby4gU3RyYW5nZSwgYnV0IE9LICovCi0JCWlmKGFkZGl0aXZlICYmIG9mZnNldCkKLSAgICAgICAgCWZwcmludGYoc3RkZXJyLCJBZGRpdGl2ZSBzZWxlY3RvciB0byAlNC40eC5QbGVhc2UgcmVwb3J0XG4iLG9mZnNldCk7Ci0JICAgIH0gCi0JICAgIHdoaWxlIChvZmZzZXQgJiYgb2Zmc2V0ICE9IDB4ZmZmZiAmJiAhYWRkaXRpdmUpOwotCSAgICBicmVhazsKLQkgICAgCi0JICBkZWZhdWx0OgotCSAgICBXQVJOKGZpeHVwLCAiV0FSTklORzogJWQ6IHVua25vd24gQUREUiBUWVBFICVkLCAgIgotCQkJICJUWVBFICVkLCAgT0ZGU0VUICUwNHgsICBUQVJHRVQgJTA0eCAlMDR4XG4iLAotCQkJIGkgKyAxLCByZXAtPmFkZHJlc3NfdHlwZSwgcmVwLT5yZWxvY2F0aW9uX3R5cGUsIAotCQkJIHJlcC0+b2Zmc2V0LCByZXAtPnRhcmdldDEsIHJlcC0+dGFyZ2V0Mik7Ci0JICAgIGZyZWUocmVsb2NfZW50cmllcyk7Ci0JICAgIHJldHVybiBGQUxTRTsKLQl9CisgICAgICAgICAgICAgICAgaWYgKCpzcCkKKyAgICAgICAgICAgICAgICAgICAgRVJSKGZpeHVwLCJBZGRpdGl2ZSBzZWxlY3RvciB0byAlMDR4LlBsZWFzZSByZXBvcnRcbiIsKnNwKTsKKwkJZWxzZQorICAgICAgICAgICAgICAgICAgICAqc3AgPSBISVdPUkQoYWRkcmVzcyk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGdvdG8gdW5rbm93bjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlICAvKiBub24tYWRkaXRpdmUgZml4dXAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcCA9IFBUUl9TRUdfT0ZGX1RPX0xJTiggcFNlZy0+c2VsZWN0b3IsIG9mZnNldCApOworICAgICAgICAgICAgICAgIG5leHRfb2Zmc2V0ID0gKnNwOworICAgICAgICAgICAgICAgIFRSQUNFKCBmaXh1cCwiICAgICUwNHg6JTA0eFxuIiwgb2Zmc2V0LCAqc3AgKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlcC0+YWRkcmVzc190eXBlICYgMHg3ZikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBORV9SQUREUl9MT1dCWVRFOgorICAgICAgICAgICAgICAgICAgICAqKEJZVEUgKilzcCA9IExPQllURSgoaW50KWFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE5FX1JBRERSX09GRlNFVDE2OgorICAgICAgICAgICAgICAgICAgICAqc3AgPSBMT1dPUkQoYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTkVfUkFERFJfUE9JTlRFUjMyOgorICAgICAgICAgICAgICAgICAgICAqKEZBUlBST0MxNiAqKXNwID0gYWRkcmVzczsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBORV9SQUREUl9TRUxFQ1RPUjoKKyAgICAgICAgICAgICAgICAgICAgKnNwID0gU0VMRUNUT1JPRihhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZ290byB1bmtub3duOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobmV4dF9vZmZzZXQgPT0gb2Zmc2V0KSBicmVhazsgIC8qIGF2b2lkIGluZmluaXRlIGxvb3AgKi8KKyAgICAgICAgICAgICAgICBpZiAobmV4dF9vZmZzZXQgPj0gR2xvYmFsU2l6ZTE2KHBTZWctPnNlbGVjdG9yKSkgYnJlYWs7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbmV4dF9vZmZzZXQ7CisgICAgICAgICAgICB9IHdoaWxlIChvZmZzZXQgJiYgKG9mZnNldCAhPSAweGZmZmYpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGZyZWUocmVsb2NfZW50cmllcyk7CiAgICAgcmV0dXJuIFRSVUU7CisKK3Vua25vd246CisgICAgV0FSTihmaXh1cCwgIldBUk5JTkc6ICVkOiB1bmtub3duIEFERFIgVFlQRSAlZCwgICIKKyAgICAgICAgICJUWVBFICVkLCAgT0ZGU0VUICUwNHgsICBUQVJHRVQgJTA0eCAlMDR4XG4iLAorICAgICAgICAgaSArIDEsIHJlcC0+YWRkcmVzc190eXBlLCByZXAtPnJlbG9jYXRpb25fdHlwZSwgCisgICAgICAgICByZXAtPm9mZnNldCwgcmVwLT50YXJnZXQxLCByZXAtPnRhcmdldDIpOworICAgIGZyZWUocmVsb2NfZW50cmllcyk7CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiAKQEAgLTQyOSw3ICs0NDEsOCBAQAogICAgICAgICAgICAgLyogaXRzIGhhbmRsZSBpbiB0aGUgbGlzdCBvZiBETExzIHRvIGluaXRpYWxpemUuICAgKi8KICAgICAgICAgICAgIEhNT0RVTEUxNiBoRExMOwogCi0gICAgICAgICAgICBpZiAoKGhETEwgPSBNT0RVTEVfTG9hZCggYnVmZmVyLCAoTFBWT0lEKS0xLCBORV9GRkxBR1NfSU1QTElDSVQgKSkgPT0gMikKKyAgICAgICAgICAgIGlmICgoaERMTCA9IE1PRFVMRV9Mb2FkKCBidWZmZXIsIE5FX0ZGTEFHU19JTVBMSUNJVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCAwICkpID09IDIpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLyogZmlsZSBub3QgZm91bmQgKi8KICAgICAgICAgICAgICAgICBjaGFyICpwOwpAQCAtNDM5LDcgKzQ1Miw3IEBACiAgICAgICAgICAgICAgICAgaWYgKCEocCA9IHN0cnJjaHIoIGJ1ZmZlciwgJ1xcJyApKSkgcCA9IGJ1ZmZlcjsKICAgICAgICAgICAgICAgICBtZW1jcHkoIHAgKyAxLCBwc3RyICsgMSwgKnBzdHIgKTsKICAgICAgICAgICAgICAgICBzdHJjcHkoIHAgKyAxICsgKnBzdHIsICIuZGxsIiApOwotICAgICAgICAgICAgICAgIGhETEwgPSBNT0RVTEVfTG9hZCggYnVmZmVyLCAoTFBWT0lEKS0xLCBORV9GRkxBR1NfSU1QTElDSVQgKTsKKyAgICAgICAgICAgICAgICBoRExMID0gTU9EVUxFX0xvYWQoIGJ1ZmZlciwgTkVfRkZMQUdTX0lNUExJQ0lULCBOVUxMLCBOVUxMLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChoRExMIDwgMzIpCiAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9sb2FkZXIvcGVfaW1hZ2UuYyBiL2xvYWRlci9wZV9pbWFnZS5jCmluZGV4IGUxOTIzZjEuLjQzY2M3NGMgMTAwNjQ0Ci0tLSBhL2xvYWRlci9wZV9pbWFnZS5jCisrKyBiL2xvYWRlci9wZV9pbWFnZS5jCkBAIC0yMSwxNSArMjEsMjMgQEAKICAqICAgc3RhdGUgTVVTVCBiZSBjb3JyZWN0IHNpbmNlIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB3aXRoIHRoZSBTQU1FIGltYWdlCiAgKiAgIEFHQUlOLiAoVGhhdHMgcmVjdXJzaW9uIGZvciB5b3UuKSBUaGF0IG1lYW5zIE1PRFJFRi5tb2R1bGUgYW5kCiAgKiAgIE5FX01PRFVMRS5tb2R1bGUzMi4KLSAqIC0gTm8sIHlvdSBjYW5ub3QgdXNlIExpbnV4IG1tYXAoKSB0byBtbWFwKCkgdGhlIGltYWdlcyBkaXJlY3RseS4gTGludXggYWxpZ25zCi0gKiAgIHRoZW0gYXQgcGFnZXNpemUgKDQwOTYpLCBXaW4zMiByZXF1aXJlcyA1MTIgYnl0ZSBhbGlnbm1lbnQuCisgKiAtIE5vLCB5b3UgKHVzdWFsbHkpIGNhbm5vdCB1c2UgTGludXggbW1hcCgpIHRvIG1tYXAoKSB0aGUgaW1hZ2VzIGRpcmVjdGx5LgorICoKKyAqICAgVGhlIHByb2JsZW0gaXMsIHRoYXQgdGhlcmUgaXMgbm90IGRpcmVjdCAxOjEgbWFwcGluZyBmcm9tIGEgZGlza2ltYWdlIGFuZAorICogICBhIG1lbW9yeWltYWdlLiBUaGUgaGVhZGVycyBhdCB0aGUgc3RhcnQgYXJlIG1hcHBlZCBsaW5lYXIsIGJ1dCB0aGUgc2VjdGlvbnMKKyAqICAgYXJlIG5vdC4gRm9yIHg4NiB0aGUgc2VjdGlvbnMgYXJlIDUxMiBieXRlIGFsaWduZWQgaW4gZmlsZSBhbmQgNDA5NiBieXRlCisgKiAgIGFsaWduZWQgaW4gbWVtb3J5LiBMaW51eCBsaWtlcyB0aGVtIDQwOTYgYnl0ZSBhbGlnbmVkIGluIG1lbW9yeSAoZHVlIHRvCisgKiAgIHg4NiBwYWdlc2l6ZSwgdGhpcyBjYW5ub3QgYmUgZml4ZWQgd2l0aG91dCBhIHJhdGhlciBsYXJnZSBrZXJuZWwgcmV3cml0ZSkKKyAqICAgYW5kICdibG9ja3NpemUnIGZpbGUtYWxpZ25lZCAob2Zmc2V0cykuIFNpbmNlIHdlIGhhdmUgNTEyLzEwMjQvMjA0OCAoQ0RST00pCisgKiAgIGFuZCBvdGhlciBieXRlIGJsb2Nrc2l6ZXMsIHdlIGNhbid0IGRvIHRoaXMuIEhvd2V2ZXIsIHRoaXMgY291bGQgYmUgbGVzcworICogICBkaWZmaWN1bHQgdG8gc3VwcG9ydC4uLiAoU2VlIG1tL2ZpbGVtYXAuYykuCiAgKiAtIEFsbCB0aG9zZSBmdW5jdGlvbiBtYXAgdGhpbmdzIGludG8gYSBuZXcgYWRkcmVzc3BhY2UuIEZyb20gdGhlIHdyb25nCiAgKiAgIHByb2Nlc3MgYW5kIHRoZSB3cm9uZyB0aHJlYWQuIFNvIGNhbGxpbmcgb3RoZXIgQVBJIGZ1bmN0aW9ucyB3aWxsIG1lc3MgCiAgKiAgIHRoaW5ncyB1cCBiYWRseSBzb21ldGltZXMuCiAgKi8KIAotLyojaW5jbHVkZSA8Y3R5cGUuaD4qLwogI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTQ5LDkgKzU3LDcgQEAKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJnbG9iYWwuaCIKICNpbmNsdWRlICJ0YXNrLmgiCi0jaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCiAKIHN0YXRpYyB2b2lkIFBFX0luaXRETEwoUEVfTU9EUkVGKiBtb2RyZWYsIERXT1JEIHR5cGUsIExQVk9JRCBscFJlc2VydmVkKTsKIApAQCAtNzIxLDggKzcyNyw2IEBACiAgICAgICAgIHJldHVybiAxOwogfQogCi1ISU5TVEFOQ0UxNiBNT0RVTEVfQ3JlYXRlSW5zdGFuY2UoSE1PRFVMRTE2IGhNb2R1bGUsTE9BRFBBUkFNUyAqcGFyYW1zKTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogVGhlIFBFIExpYnJhcnkgTG9hZGVyIGZyb250ZW5kLiAKICAqIEZJWE1FOiBoYW5kbGUgdGhlIGZsYWdzLgpAQCAtNzQzLDExICs3NDcsMTQgQEAKIAkJCXJldHVybiBoTW9kdWxlOwogCQkvKiBjaGVjayBpZiB0aGlzIG1vZHVsZSBpcyBhbHJlYWR5IG1hcHBlZCAqLwogCQlwZW0gCT0gcHJvY2Vzcy0+bW9kcmVmX2xpc3Q7CisJCXBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKGhNb2R1bGUpOwogCQl3aGlsZSAocGVtKSB7Ci0JCQlpZiAocGVtLT5tb2R1bGUgPT0gaE1vZHVsZSkgcmV0dXJuIGhNb2R1bGU7CisJCQlpZiAocGVtLT5tb2R1bGUgPT0gaE1vZHVsZSkgeworCQkJCXBNb2R1bGUtPmNvdW50Kys7CisJCQkJcmV0dXJuIGhNb2R1bGU7CisJCQl9CiAJCQlwZW0gPSBwZW0tPm5leHQ7CiAJCX0KLQkJcE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoaE1vZHVsZSk7CiAJCWlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19CVUlMVElOKSB7CiAJCQlJTUFHRV9ET1NfSEVBREVSCSpkaDsKIAkJCUlNQUdFX05UX0hFQURFUlMJKm5oOwpAQCAtODA0LDkgKzgxMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBMb2FkIHRoZSBQRSBtYWluIC5FWEUuIEFsbCBvdGhlciBsb2FkaW5nIGlzIGRvbmUgYnkgUEVfTG9hZExpYnJhcnlFeDMyQQogICogRklYTUU6IHRoaXMgZnVuY3Rpb24gc2hvdWxkIHVzZSBQRV9Mb2FkTGlicmFyeUV4MzJBLCBidXQgY3VycmVudGx5IGNhbid0Ci0gKiBkdWUgdG8gdGhlIFRBU0tfQ3JlYXRlVGFzayBzdHVmZi4KKyAqIGR1ZSB0byB0aGUgUFJPQ0VTU19DcmVhdGUgc3R1ZmYuCiAgKi8KLUhJTlNUQU5DRTE2IFBFX0xvYWRNb2R1bGUoIEhGSUxFMzIgaEZpbGUsIE9GU1RSVUNUICpvZnMsIExPQURQQVJBTVMqIHBhcmFtcyApCitISU5TVEFOQ0UxNiBQRV9Mb2FkTW9kdWxlKCBIRklMRTMyIGhGaWxlLCBPRlNUUlVDVCAqb2ZzLCBMUENTVFIgY21kX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgZW52LCBVSU5UMTYgc2hvd19jbWQgKQogewogICAgIEhNT0RVTEUxNiBoTW9kdWxlMTY7CiAgICAgSE1PRFVMRTMyIGhNb2R1bGUzMjsKQEAgLTgxOSwxNyArODI3LDE1IEBACiAgICAgcE1vZHVsZS0+ZmxhZ3MgPSBORV9GRkxBR1NfV0lOMzI7CiAKICAgICBwTW9kdWxlLT5tb2R1bGUzMiA9IGhNb2R1bGUzMiA9IFBFX0xvYWRJbWFnZSggaEZpbGUgKTsKLSAgICBDbG9zZUhhbmRsZSggaEZpbGUgKTsKICAgICBpZiAoaE1vZHVsZTMyIDwgMzIpIHJldHVybiAyMTsKIAotICAgIGhJbnN0YW5jZSA9IE1PRFVMRV9DcmVhdGVJbnN0YW5jZSggaE1vZHVsZTE2LCBwYXJhbXMgKTsKLSAgICBpZiAoIShQRV9IRUFERVIoaE1vZHVsZTMyKS0+RmlsZUhlYWRlci5DaGFyYWN0ZXJpc3RpY3MgJiBJTUFHRV9GSUxFX0RMTCkpCisgICAgaEluc3RhbmNlID0gTU9EVUxFX0NyZWF0ZUluc3RhbmNlKCBoTW9kdWxlMTYsIChjbWRfbGluZSA9PSBOVUxMKSApOworICAgIGlmIChjbWRfbGluZSAmJgorICAgICAgICAhKFBFX0hFQURFUihoTW9kdWxlMzIpLT5GaWxlSGVhZGVyLkNoYXJhY3RlcmlzdGljcyAmIElNQUdFX0ZJTEVfRExMKSkKICAgICB7Ci0gICAgICAgIEhUQVNLMTYgaFRhc2sgPSBUQVNLX0NyZWF0ZVRhc2soIGhNb2R1bGUxNiwgaEluc3RhbmNlLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmhFbnZpcm9ubWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQU1RSKVBUUl9TRUdfVE9fTElOKCBwYXJhbXMtPmNtZExpbmUgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChXT1JEKilQVFJfU0VHX1RPX0xJTihwYXJhbXMtPnNob3dDbWQpICsgMSkgKTsKLSAgICAgICAgVERCICpwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIGhUYXNrICk7CisgICAgICAgIFBEQjMyICpwZGIgPSBQUk9DRVNTX0NyZWF0ZSggcE1vZHVsZSwgY21kX2xpbmUsIGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSW5zdGFuY2UsIDAsIHNob3dfY21kICk7CisgICAgICAgIFREQiAqcFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBwZGItPnRhc2sgKTsKICAgICAgICAgdGhkYiA9IHBUYXNrLT50aGRiOwogICAgIH0KICAgICBpZiAoIVBFX01hcEltYWdlKCAmKHBNb2R1bGUtPm1vZHVsZTMyKSwgdGhkYi0+cHJvY2Vzcywgb2ZzLCAwICkpCmRpZmYgLS1naXQgYS9sb2FkZXIvcmVzb3VyY2UuYyBiL2xvYWRlci9yZXNvdXJjZS5jCmluZGV4IDI0ZDg3ZjIuLmUzNTkxYjAgMTAwNjQ0Ci0tLSBhL2xvYWRlci9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9yZXNvdXJjZS5jCkBAIC02MSw4ICs2MSw4IEBACiAgICAgfQogCiAgICAgVFJBQ0UocmVzb3VyY2UsICJtb2R1bGU9JTA0eCBuYW1lPSVzIHR5cGU9JXNcbiIsIAotCQkgaE1vZHVsZSwgZGVidWdyZXMoUFRSX1NFR19UT19MSU4obmFtZSkpLCAKLQkJIGRlYnVncmVzKFBUUl9TRUdfVE9fTElOKHR5cGUpKSApOworCQkgaE1vZHVsZSwgZGVidWdyZXNfYShQVFJfU0VHX1RPX0xJTihuYW1lKSksIAorCQkgZGVidWdyZXNfYShQVFJfU0VHX1RPX0xJTih0eXBlKSkgKTsKIAogICAgIGlmICgocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpCiAgICAgewpAQCAtNDE0LDcgKzQxNCw2IEBACiBIQUNDRUwxNiBXSU5BUEkgTG9hZEFjY2VsZXJhdG9yczE2KEhJTlNUQU5DRTE2IGluc3RhbmNlLCBTRUdQVFIgbHBUYWJsZU5hbWUpCiB7CiAgICAgSFJTUkMxNgloUnNyYzsKLSAgICBIQUNDRUwxNiAgICBoQWNjZWw7CiAKICAgICBpZiAoSElXT1JEKGxwVGFibGVOYW1lKSkKICAgICAgICAgVFJBQ0UoYWNjZWwsICIlMDR4ICclcydcbiIsCkBAIC00MjMsNyArNDIyLDcgQEAKICAgICAgICAgVFJBQ0UoYWNjZWwsICIlMDR4ICUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLCBMT1dPUkQobHBUYWJsZU5hbWUpICk7CiAKLSAgICBpZiAoIShoUnNyYyA9IEZpbmRSZXNvdXJjZTE2KCBpbnN0YW5jZSwgbHBUYWJsZU5hbWUsIFJUX0FDQ0VMRVJBVE9SICkpKSB7CisgICAgaWYgKCEoaFJzcmMgPSBGaW5kUmVzb3VyY2UxNiggaW5zdGFuY2UsIGxwVGFibGVOYW1lLCBSVF9BQ0NFTEVSQVRPUjE2ICkpKSB7CiAgICAgICBXQVJOKGFjY2VsLCAiY291bGRuJ3QgZmluZCBhY2NlbGVyYXRvciB0YWJsZSByZXNvdXJjZVxuIik7CiAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC00NTMsOCArNDUyLDggQEAKICAgICAgICAgVFJBQ0UoYWNjZWwsICIlcCAweCUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpaW5zdGFuY2UsIExPV09SRChscFRhYmxlTmFtZSkgKTsKIAotICAgIGlmICghKGhSc3JjID0gRmluZFJlc291cmNlMzJXKCBpbnN0YW5jZSwgbHBUYWJsZU5hbWUsIAotCQkJCSAgIChMUENXU1RSKVJUX0FDQ0VMRVJBVE9SICkpKSB7CisgICAgaWYgKCEoaFJzcmMgPSBGaW5kUmVzb3VyY2UzMlcoIGluc3RhbmNlLCBscFRhYmxlTmFtZSwgUlRfQUNDRUxFUkFUT1IzMlcgKSkpCisgICAgewogICAgICAgV0FSTihhY2NlbCwgImNvdWxkbid0IGZpbmQgYWNjZWxlcmF0b3IgdGFibGUgcmVzb3VyY2VcbiIpOwogICAgICAgaFJldHZhbCA9IDA7CiAgICAgfQpAQCAtNjI1LDcgKzYyNCw3IEBACiAgICAgVFJBQ0UocmVzb3VyY2UsImluc3Q9JTA0eCBpZD0lMDR4IGJ1ZmY9JTA4eCBsZW49JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgcmVzb3VyY2VfaWQsIChpbnQpIGJ1ZmZlciwgYnVmbGVuKTsKIAotICAgIGhyc3JjID0gRmluZFJlc291cmNlMTYoIGluc3RhbmNlLCAoU0VHUFRSKSgocmVzb3VyY2VfaWQ+PjQpKzEpLCBSVF9TVFJJTkcgKTsKKyAgICBocnNyYyA9IEZpbmRSZXNvdXJjZTE2KCBpbnN0YW5jZSwgKFNFR1BUUikoKHJlc291cmNlX2lkPj40KSsxKSwgUlRfU1RSSU5HMTYgKTsKICAgICBpZiAoIWhyc3JjKSByZXR1cm4gMDsKICAgICBobWVtID0gTG9hZFJlc291cmNlMTYoIGluc3RhbmNlLCBocnNyYyApOwogICAgIGlmICghaG1lbSkgcmV0dXJuIDA7CkBAIC02NTgsNyArNjU3LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCUxvYWRTdHJpbmczMlcJCShVU0VSMzIuMzc1KQorICoJTG9hZFN0cmluZzMyVwkJKFVTRVIzMi4zNzYpCiAgKi8KIElOVDMyIFdJTkFQSSBMb2FkU3RyaW5nMzJXKCBISU5TVEFOQ0UzMiBpbnN0YW5jZSwgVUlOVDMyIHJlc291cmNlX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV1NUUiBidWZmZXIsIElOVDMyIGJ1ZmxlbiApCkBAIC02NzQsOCArNjczLDggQEAKICAgICBUUkFDRShyZXNvdXJjZSwgImluc3RhbmNlID0gJTA0eCwgaWQgPSAlMDR4LCBidWZmZXIgPSAlMDh4LCAiCiAJICAgImxlbmd0aCA9ICVkXG4iLCBpbnN0YW5jZSwgKGludClyZXNvdXJjZV9pZCwgKGludCkgYnVmZmVyLCBidWZsZW4pOwogCi0gICAgaHJzcmMgPSBGaW5kUmVzb3VyY2UzMlcoIGluc3RhbmNlLCAoTFBDV1NUUikoKHJlc291cmNlX2lkPj40KSsxKSwgCi0JCShMUENXU1RSKVJUX1NUUklORyApOworICAgIGhyc3JjID0gRmluZFJlc291cmNlMzJXKCBpbnN0YW5jZSwgKExQQ1dTVFIpKChyZXNvdXJjZV9pZD4+NCkrMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUX1NUUklORzMyVyApOwogICAgIGlmICghaHJzcmMpIHJldHVybiAwOwogICAgIGhtZW0gPSBMb2FkUmVzb3VyY2UzMiggaW5zdGFuY2UsIGhyc3JjICk7CiAgICAgaWYgKCFobWVtKSByZXR1cm4gMDsKQEAgLTcwOSw3ICs3MDgsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJTG9hZFN0cmluZzMyQQkoVVNFUjMyLjM3NCkKKyAqCUxvYWRTdHJpbmczMkEJKFVTRVIzMi4zNzUpCiAgKi8KIElOVDMyIFdJTkFQSSBMb2FkU3RyaW5nMzJBKCBISU5TVEFOQ0UzMiBpbnN0YW5jZSwgVUlOVDMyIHJlc291cmNlX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGJ1ZmZlciwgSU5UMzIgYnVmbGVuICkKQEAgLTcyNiw2ICs3MjUsOCBAQAogCSAgICBsc3RyY3B5bld0b0EoIGJ1ZmZlciwgYnVmZmVyMiwgYnVmbGVuICk7CiAJICAgIHJldHZhbCA9IGxzdHJsZW4zMkEoIGJ1ZmZlciApOwogCX0KKwllbHNlCisJICAgICpidWZmZXIgPSAwOwogCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWZmZXIyICk7CiAgICAgfQogICAgIHJldHVybiByZXR2YWw7CkBAIC03NzcsNyArNzc4LDcgQEAKICAgICBUUkFDRShyZXNvdXJjZSwgImluc3RhbmNlID0gJTA4bHgsIGlkID0gJTA4bHgsIGJ1ZmZlciA9ICVwLCBsZW5ndGggPSAlbGRcbiIsIChEV09SRClpbnN0YW5jZSwgKERXT1JEKWlkLCBidWZmZXIsIChEV09SRClidWZsZW4pOwogCiAgICAgLypGSVhNRTogSSBhbSBub3Qgc3VyZSBhYm91dCB0aGUgJzEnIC4uLiBCdXQgSSd2ZSBvbmx5IHNlZW4gdGhvc2UgZW50cmllcyovCi0gICAgaHJzcmMgPSBGaW5kUmVzb3VyY2VFeDMyVyhpbnN0YW5jZSwoTFBXU1RSKTEsKExQQ1dTVFIpUlRfTUVTU0FHRUxJU1QsbGFuZyk7CisgICAgaHJzcmMgPSBGaW5kUmVzb3VyY2VFeDMyVyhpbnN0YW5jZSwoTFBXU1RSKTEsUlRfTUVTU0FHRUxJU1QzMlcsbGFuZyk7CiAgICAgaWYgKCFocnNyYykgcmV0dXJuIDA7CiAgICAgaG1lbSA9IExvYWRSZXNvdXJjZTMyKCBpbnN0YW5jZSwgaHJzcmMgKTsKICAgICBpZiAoIWhtZW0pIHJldHVybiAwOwpAQCAtODU0LDcgKzg1NSw3IEBACiAgICAgaE1vZHVsZSA9IEdldEV4ZVB0ciggaE1vZHVsZSApOwogCiAgICAgVFJBQ0UocmVzb3VyY2UsICJtb2R1bGU9JTA0eCB0eXBlPSVzXG4iLCAKLQkJIGhNb2R1bGUsIGRlYnVncmVzKFBUUl9TRUdfVE9fTElOKHMpKSApOworCQkgaE1vZHVsZSwgZGVidWdyZXNfYShQVFJfU0VHX1RPX0xJTihzKSkgKTsKIAogICAgIGlmICgocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpCiAgICAgewpkaWZmIC0tZ2l0IGEvbG9hZGVyL3NpZ25hbC5jIGIvbG9hZGVyL3NpZ25hbC5jCmluZGV4IDkzMWE0NjEuLjA1Y2Y3MGEgMTAwNjQ0Ci0tLSBhL2xvYWRlci9zaWduYWwuYworKysgYi9sb2FkZXIvc2lnbmFsLmMKQEAgLTMsNiArMyw4IEBACiAgKgogICovCiAKKyNpbmNsdWRlICJjb25maWcuaCIKKwogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CkBAIC0xNiwxMyArMTgsMTUgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCi0jaWYgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkKF9fc3ZyNF9fKSB8fCBkZWZpbmVkKF9TQ09fRFMpIHx8IGRlZmluZWQoX19FTVhfXykKLSNpZiAhZGVmaW5lZChfU0NPX0RTKSAmJiAhZGVmaW5lZChfX0VNWF9fKQotI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KICNlbmRpZgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2lmZGVmIEhBVkVfU1lTQ0FMTF9ICisjIGluY2x1ZGUgPHN5c2NhbGwuaD4KICNlbHNlCi0jaW5jbHVkZSA8c3lzY2FsbC5oPgorIyBpZmRlZiBIQVZFX1NZU19TWVNDQUxMX0gKKyMgIGluY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjIGVuZGlmCiAjZW5kaWYKIAogI2luY2x1ZGUgIm1pc2NlbXUuaCIKQEAgLTE1NCw5ICsxNTgsNyBAQAogewogICAgIGV4dGVybiB2b2lkIFNZTkNfU2V0dXBTaWduYWxzKHZvaWQpOwogCi0gICAgc2lnZW1wdHlzZXQoJmFzeW5jX3NpZ25hbF9zZXQpOwotCi0jaWYgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkIChfX3N2cjRfXykgfHwgZGVmaW5lZChfU0NPX0RTKQorI2lmZGVmIEhBVkVfU0lHQUxUU1RBQ0sKICAgICBzdHJ1Y3Qgc2lnYWx0c3RhY2sgc3M7CiAgICAgc3Muc3Nfc3AgICAgPSBTSUdOQUxfU3RhY2s7CiAgICAgc3Muc3Nfc2l6ZSAgPSBzaXplb2YoU0lHTkFMX1N0YWNrKTsKQEAgLTE2Niw4ICsxNjgsMTAgQEAKICAgICAgICAgcGVycm9yKCJzaWdzdGFjayIpOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotI2VuZGlmICAvKiBfX0ZyZWVCU0RfXyB8fCBfX05ldEJTRF9fIHx8IF9fT3BlbkJTRF9fIHx8IF9fc3ZyNF9fIHx8IF9TQ09fRFMgKi8KKyNlbmRpZiAgLyogSEFWRV9TSUdBTFRTVEFDSyAqLwogICAgIAorICAgIHNpZ2VtcHR5c2V0KCZhc3luY19zaWduYWxfc2V0KTsKKwogICAgIFNJR05BTF9TZXRIYW5kbGVyKCBTSUdDSExELCAodm9pZCAoKikoKSlTSUdOQUxfY2hpbGQsIDEpOwogI2lmZGVmIENPTkZJR19JUEMKICAgICBzaWdhZGRzZXQoJmFzeW5jX3NpZ25hbF9zZXQsIFNJR1VTUjIpOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL3Rhc2suYyBiL2xvYWRlci90YXNrLmMKaW5kZXggMzEyMThiNi4uZjE2ODQyNyAxMDA2NDQKLS0tIGEvbG9hZGVyL3Rhc2suYworKysgYi9sb2FkZXIvdGFzay5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSAicXVldWUuaCIKICNpbmNsdWRlICJzZWxlY3RvcnMuaCIKICNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCisjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgInRocmVhZC5oIgogI2luY2x1ZGUgInRvb2xoZWxwLmgiCiAjaW5jbHVkZSAid2lubnQuaCIKQEAgLTQ2LDIxICs0Nyw4IEBACiBzdGF0aWMgSFRBU0sxNiBoVGFza1RvS2lsbCA9IDA7CiBzdGF0aWMgSFRBU0sxNiBoTG9ja2VkVGFzayA9IDA7CiBzdGF0aWMgVUlOVDE2IG5UYXNrQ291bnQgPSAwOwotc3RhdGljIEhHTE9CQUwxNiBoRE9TRW52aXJvbm1lbnQgPSAwOwogCi1zdGF0aWMgSEdMT0JBTDE2IFRBU0tfQ3JlYXRlRE9TRW52aXJvbm1lbnQodm9pZCk7Ci1zdGF0aWMgdm9pZAkgVEFTS19ZaWVsZFRvU3lzdGVtKFREQiopOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFRBU0tfSW5pdAotICovCi1CT09MMzIgVEFTS19Jbml0KHZvaWQpCi17Ci0gICAgaWYgKCEoaERPU0Vudmlyb25tZW50ID0gVEFTS19DcmVhdGVET1NFbnZpcm9ubWVudCgpKSkKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiTm90IGVub3VnaCBtZW1vcnkgZm9yIERPUyBFbnZpcm9ubWVudFxuIiApOwotICAgIHJldHVybiAoaERPU0Vudmlyb25tZW50ICE9IDApOwotfQorc3RhdGljIHZvaWQgVEFTS19ZaWVsZFRvU3lzdGVtKFREQiopOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNzYsMTE1ICs2NCw2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgVEFTS19DcmVhdGVET1NFbnZpcm9ubWVudAotICoKLSAqIENyZWF0ZSB0aGUgb3JpZ2luYWwgRE9TIGVudmlyb25tZW50LgotICovCi1zdGF0aWMgSEdMT0JBTDE2IFRBU0tfQ3JlYXRlRE9TRW52aXJvbm1lbnQodm9pZCkKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBwcm9ncmFtX25hbWVbXSA9ICJLUk5MMzg2LkVYRSI7Ci0gICAgY2hhciAqKmUsICpwOwotICAgIGludCBpbml0aWFsX3NpemUsIHNpemUsIGksIHdpbnBhdGhsZW4sIHN5c2RpcmxlbjsKLSAgICBIR0xPQkFMMTYgaGFuZGxlOwotCi0gICAgZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotCi0gICAgLyogRE9TIGVudmlyb25tZW50IGZvcm1hdDoKLSAgICAgKiBBU0NJSVogICBzdHJpbmcgMQotICAgICAqIEFTQ0lJWiAgIHN0cmluZyAyCi0gICAgICogLi4uCi0gICAgICogQVNDSUlaICAgc3RyaW5nIG4KLSAgICAgKiBBU0NJSVogICBQQVRIPXh4eAotICAgICAqIEJZVEUgICAgIDAKLSAgICAgKiBXT1JEICAgICAxCi0gICAgICogQVNDSUlaICAgcHJvZ3JhbSBuYW1lIChlLmcuIEM6XFdJTkRPV1NcU1lTVEVNXEtSTkwzODYuRVhFKQotICAgICAqLwotCi0gICAgLyogRmlyc3QgY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgZml4ZWQgcGFydCBvZiB0aGUgZW52aXJvbm1lbnQgKi8KLQotICAgIGZvciAoaSA9IHdpbnBhdGhsZW4gPSAwOyA7IGkrKykKLSAgICB7Ci0gICAgICAgIGludCBsZW4gPSBESVJfR2V0RG9zUGF0aCggaSwgTlVMTCwgMCApOwotICAgICAgICBpZiAoIWxlbikgYnJlYWs7Ci0gICAgICAgIHdpbnBhdGhsZW4gKz0gbGVuICsgMTsKLSAgICB9Ci0gICAgaWYgKCF3aW5wYXRobGVuKSB3aW5wYXRobGVuID0gMTsKLSAgICBzeXNkaXJsZW4gID0gR2V0U3lzdGVtRGlyZWN0b3J5MzJBKCBOVUxMLCAwICkgKyAxOwotICAgIGluaXRpYWxfc2l6ZSA9IDUgKyB3aW5wYXRobGVuICsgICAgICAgICAgIC8qIFBBVEg9eHh4eCAqLwotICAgICAgICAgICAgICAgICAgIDEgKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJZVEUgMCBhdCBlbmQgKi8KLSAgICAgICAgICAgICAgICAgICBzaXplb2YoV09SRCkgKyAgICAgICAgICAgICAvKiBXT1JEIDEgKi8KLSAgICAgICAgICAgICAgICAgICBzeXNkaXJsZW4gKyAgICAgICAgICAgICAgICAvKiBwcm9ncmFtIGRpcmVjdG9yeSAqLwotICAgICAgICAgICAgICAgICAgIHN0cmxlbihwcm9ncmFtX25hbWUpICsgMTsgIC8qIHByb2dyYW0gbmFtZSAqLwotCi0gICAgLyogQ29tcHV0ZSB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgVW5peCBlbnZpcm9ubWVudCAoZXhjZXB0IHBhdGgpICovCi0KLSAgICBmb3IgKGUgPSBlbnZpcm9uLCBzaXplID0gaW5pdGlhbF9zaXplOyAqZTsgZSsrKQotICAgIHsKLQlpZiAobHN0cm5jbXBpMzJBKCplLCAicGF0aD0iLCA1KSkKLQl7Ci0gICAgICAgICAgICBpbnQgbGVuID0gc3RybGVuKCplKSArIDE7Ci0gICAgICAgICAgICBpZiAoc2l6ZSArIGxlbiA+PSAzMjc2NykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBlbnZpcm9ubWVudCBsYXJnZXIgdGhhbiAzMmsuXG4iICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaXplICs9IGxlbjsKLQl9Ci0gICAgfQotCi0KLSAgICAvKiBOb3cgYWxsb2NhdGUgdGhlIGVudmlyb25tZW50ICovCi0KLSAgICBpZiAoIShoYW5kbGUgPSBHbG9iYWxBbGxvYzE2KCBHTUVNX0ZJWEVELCBzaXplICkpKSByZXR1cm4gMDsKLSAgICBwID0gKGNoYXIgKilHbG9iYWxMb2NrMTYoIGhhbmRsZSApOwotCi0gICAgLyogQW5kIGZpbGwgaXQgd2l0aCB0aGUgVW5peCBlbnZpcm9ubWVudCAqLwotCi0gICAgZm9yIChlID0gZW52aXJvbiwgc2l6ZSA9IGluaXRpYWxfc2l6ZTsgKmU7IGUrKykKLSAgICB7Ci0JaWYgKGxzdHJuY21waTMyQSgqZSwgInBhdGg9IiwgNSkpCi0JewotICAgICAgICAgICAgaW50IGxlbiA9IHN0cmxlbigqZSkgKyAxOwotICAgICAgICAgICAgaWYgKHNpemUgKyBsZW4gPj0gMzI3NjcpIGJyZWFrOwotICAgICAgICAgICAgc3RyY3B5KCBwLCAqZSApOwotICAgICAgICAgICAgc2l6ZSArPSBsZW47Ci0gICAgICAgICAgICBwICAgICs9IGxlbjsKLQl9Ci0gICAgfQotCi0gICAgLyogTm93IGFkZCB0aGUgcGF0aCAqLwotCi0gICAgc3RyY3B5KCBwLCAiUEFUSD0iICk7Ci0gICAgZm9yIChpID0gMCwgcCArPSA1OyA7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmICghRElSX0dldERvc1BhdGgoIGksIHAsIHdpbnBhdGhsZW4gKSkgYnJlYWs7Ci0gICAgICAgIHAgKz0gc3RybGVuKHApOwotICAgICAgICAqcCsrID0gJzsnOwotICAgIH0KLSAgICBpZiAocFstMV0gPT0gJzsnKSBwWy0xXSA9ICdcMCc7Ci0gICAgZWxzZSBwKys7Ci0KLSAgICAvKiBOb3cgYWRkIHRoZSBwcm9ncmFtIG5hbWUgKi8KLQotICAgICpwKysgPSAnXDAnOwotICAgIFBVVF9XT1JEKCBwLCAxICk7Ci0gICAgcCArPSBzaXplb2YoV09SRCk7Ci0gICAgR2V0U3lzdGVtRGlyZWN0b3J5MzJBKCBwLCBzeXNkaXJsZW4gKTsKLSAgICBzdHJjYXQoIHAsICJcXCIgKTsKLSAgICBzdHJjYXQoIHAsIHByb2dyYW1fbmFtZSApOwotCi0gICAgLyogRGlzcGxheSBpdCAqLwotCi0gICAgcCA9IChjaGFyICopIEdsb2JhbExvY2sxNiggaGFuZGxlICk7Ci0gICAgVFJBQ0UodGFzaywgIk1hc3RlciBET1MgZW52aXJvbm1lbnQgYXQgJXBcbiIsIHApOwotICAgIGZvciAoOyAqcDsgcCArPSBzdHJsZW4ocCkgKyAxKSBUUkFDRSh0YXNrLCAiICAgICVzXG4iLCBwKTsKLSAgICBUUkFDRSh0YXNrLCAiUHJvZ25hbWU6ICVzXG4iLCBwKzMgKTsKLQotICAgIHJldHVybiBoYW5kbGU7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVEFTS19MaW5rVGFzawogICovCiBzdGF0aWMgdm9pZCBUQVNLX0xpbmtUYXNrKCBIVEFTSzE2IGhUYXNrICkKQEAgLTM5MCw1MSArMjY5LDI4IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgVEFTS19DcmVhdGVUYXNrCisgKiAgICAgICAgICAgVEFTS19DcmVhdGUKICAqLwotSFRBU0sxNiBUQVNLX0NyZWF0ZVRhc2soIEhNT0RVTEUxNiBoTW9kdWxlLCBISU5TVEFOQ0UxNiBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSElOU1RBTkNFMTYgaFByZXZJbnN0YW5jZSwgSEFORExFMTYgaEVudmlyb25tZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBjbWRMaW5lLCBVSU5UMTYgY21kU2hvdyApCitIVEFTSzE2IFRBU0tfQ3JlYXRlKCBUSERCICp0aGRiLCBORV9NT0RVTEUgKnBNb2R1bGUsIEhJTlNUQU5DRTE2IGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgIEhJTlNUQU5DRTE2IGhQcmV2SW5zdGFuY2UsIFVJTlQxNiBjbWRTaG93KQogewogICAgIEhUQVNLMTYgaFRhc2s7CiAgICAgVERCICpwVGFzazsKLSAgICBQREIzMiAqcGRiMzI7Ci0gICAgSEdMT0JBTDE2IGhQYXJlbnRFbnY7Ci0gICAgTkVfTU9EVUxFICpwTW9kdWxlOwotICAgIFNFR1RBQkxFRU5UUlkgKnBTZWdUYWJsZTsKLSAgICBMUFNUUiBuYW1lOworICAgIExQU1RSIG5hbWUsIGNtZF9saW5lOwogICAgIFdPUkQgc3A7CiAgICAgY2hhciAqc3RhY2szMlRvcDsKICAgICBTVEFDSzE2RlJBTUUgKmZyYW1lMTY7CiAgICAgU1RBQ0szMkZSQU1FICpmcmFtZTMyOwotICAgIAotICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKLSAgICBwU2VnVGFibGUgPSBORV9TRUdfVEFCTEUoIHBNb2R1bGUgKTsKKyAgICBQREIzMiAqcGRiMzIgPSB0aGRiLT5wcm9jZXNzOworICAgIFNFR1RBQkxFRU5UUlkgKnBTZWdUYWJsZSA9IE5FX1NFR19UQUJMRSggcE1vZHVsZSApOwogCiAgICAgICAvKiBBbGxvY2F0ZSB0aGUgdGFzayBzdHJ1Y3R1cmUgKi8KIAogICAgIGhUYXNrID0gR0xPQkFMX0FsbG9jKCBHTUVNX0ZJWEVEIHwgR01FTV9aRVJPSU5JVCwgc2l6ZW9mKFREQiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcE1vZHVsZS0+c2VsZiwgRkFMU0UsIEZBTFNFLCBGQUxTRSApOwogICAgIGlmICghaFRhc2spIHJldHVybiAwOwogICAgIHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaFRhc2sgKTsKIAotICAgICAgLyogQWxsb2NhdGUgdGhlIG5ldyBlbnZpcm9ubWVudCBibG9jayAqLwotCi0gICAgaWYgKCEoaFBhcmVudEVudiA9IGhFbnZpcm9ubWVudCkpCi0gICAgewotICAgICAgICBUREIgKnBQYXJlbnQgPSAoVERCICopR2xvYmFsTG9jazE2KCBoQ3VycmVudFRhc2sgKTsKLSAgICAgICAgaFBhcmVudEVudiA9IHBQYXJlbnQgPyBwUGFyZW50LT5wZGIuZW52aXJvbm1lbnQgOiBoRE9TRW52aXJvbm1lbnQ7Ci0gICAgfQotICAgIC8qIEZJWE1FOiBkbyB3ZSByZWFsbHkgbmVlZCB0byBtYWtlIGEgY29weSBhbHNvIHdoZW4gKi8KLSAgICAvKiAgICAgICAgd2UgZG9uJ3QgdXNlIHRoZSBwYXJlbnQgZW52aXJvbm1lbnQ/ICovCi0gICAgaWYgKCEoaEVudmlyb25tZW50ID0gR2xvYmFsQWxsb2MxNiggR01FTV9GSVhFRCwgR2xvYmFsU2l6ZTE2KGhQYXJlbnRFbnYpKSkpCi0gICAgewotICAgICAgICBHbG9iYWxGcmVlMTYoIGhUYXNrICk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBtZW1jcHkoIEdsb2JhbExvY2sxNiggaEVudmlyb25tZW50ICksIEdsb2JhbExvY2sxNiggaFBhcmVudEVudiApLAotICAgICAgICAgICAgR2xvYmFsU2l6ZTE2KCBoUGFyZW50RW52ICkgKTsKLQogICAgIC8qIEZpbGwgdGhlIHRhc2sgc3RydWN0dXJlICovCiAKICAgICBwVGFzay0+bkV2ZW50cyAgICAgICA9IDE7ICAvKiBTbyB0aGUgdGFzayBjYW4gYmUgc3RhcnRlZCAqLwpAQCAtNDQ3LDEwICszMDMsMTEgQEAKICAgICBwVGFzay0+dmVyc2lvbiAgICAgICA9IHBNb2R1bGUtPmV4cGVjdGVkX3ZlcnNpb247CiAgICAgcFRhc2stPmhJbnN0YW5jZSAgICAgPSBoSW5zdGFuY2U7CiAgICAgcFRhc2stPmhQcmV2SW5zdGFuY2UgPSBoUHJldkluc3RhbmNlOwotICAgIHBUYXNrLT5oTW9kdWxlICAgICAgID0gaE1vZHVsZTsKKyAgICBwVGFzay0+aE1vZHVsZSAgICAgICA9IHBNb2R1bGUtPnNlbGY7CiAgICAgcFRhc2stPmhQYXJlbnQgICAgICAgPSBoQ3VycmVudFRhc2s7CiAgICAgcFRhc2stPm1hZ2ljICAgICAgICAgPSBUREJfTUFHSUM7CiAgICAgcFRhc2stPm5DbWRTaG93ICAgICAgPSBjbWRTaG93OworICAgIHBUYXNrLT50aGRiICAgICAgICAgID0gdGhkYjsKICAgICBwVGFzay0+Y3VyZHJpdmUgICAgICA9IERSSVZFX0dldEN1cnJlbnREcml2ZSgpIHwgMHg4MDsKICAgICBzdHJjcHkoIHBUYXNrLT5jdXJkaXIsICJcXCIgKTsKICAgICBsc3RyY3B5bjMyQSggcFRhc2stPmN1cmRpciArIDEsIERSSVZFX0dldERvc0N3ZCggRFJJVkVfR2V0Q3VycmVudERyaXZlKCkgKSwKQEAgLTQ2MiwxMyArMzE5LDEzIEBACiAKICAgICAgIC8qIENvcHkgdGhlIG1vZHVsZSBuYW1lICovCiAKLSAgICBuYW1lID0gTU9EVUxFX0dldE1vZHVsZU5hbWUoIGhNb2R1bGUgKTsKKyAgICBuYW1lID0gTU9EVUxFX0dldE1vZHVsZU5hbWUoIHBNb2R1bGUtPnNlbGYgKTsKICAgICBzdHJuY3B5KCBwVGFzay0+bW9kdWxlX25hbWUsIG5hbWUsIHNpemVvZihwVGFzay0+bW9kdWxlX25hbWUpICk7CiAKICAgICAgIC8qIEFsbG9jYXRlIGEgc2VsZWN0b3IgZm9yIHRoZSBQREIgKi8KIAogICAgIHBUYXNrLT5oUERCID0gR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX0ZJWEVELCAmcFRhc2stPnBkYiwgc2l6ZW9mKFBEQiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIE5VTEwgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb2R1bGUtPnNlbGYsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIE5VTEwgKTsKIAogICAgICAgLyogRmlsbCB0aGUgUERCICovCiAKQEAgLTQ4NCw5ICszNDEsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSYoKFBEQiAqKTApLT5maWxlSGFuZGxlcyApOwogICAgIHBUYXNrLT5wZGIuaEZpbGVIYW5kbGVzID0gMDsKICAgICBtZW1zZXQoIHBUYXNrLT5wZGIuZmlsZUhhbmRsZXMsIDB4ZmYsIHNpemVvZihwVGFzay0+cGRiLmZpbGVIYW5kbGVzKSApOwotICAgIHBUYXNrLT5wZGIuZW52aXJvbm1lbnQgICAgPSBoRW52aXJvbm1lbnQ7CisgICAgcFRhc2stPnBkYi5lbnZpcm9ubWVudCAgICA9IHBkYjMyLT5lbnZfZGItPmVudl9zZWw7CiAgICAgcFRhc2stPnBkYi5uYkZpbGVzICAgICAgICA9IDIwOwotICAgIGxzdHJjcHluMzJBKCBwVGFzay0+cGRiLmNtZExpbmUsIGNtZExpbmUsIHNpemVvZihwVGFzay0+cGRiLmNtZExpbmUpICk7CisKKyAgICAvKiBGaWxsIHRoZSBjb21tYW5kIGxpbmUgKi8KKworICAgIGNtZF9saW5lID0gcGRiMzItPmVudl9kYi0+Y21kX2xpbmU7CisgICAgd2hpbGUgKCpjbWRfbGluZSAmJiAoKmNtZF9saW5lICE9ICcgJykgJiYgKCpjbWRfbGluZSAhPSAnXHQnKSkgY21kX2xpbmUrKzsKKyAgICBsc3RyY3B5bjMyQSggcFRhc2stPnBkYi5jbWRMaW5lKzEsIGNtZF9saW5lLCBzaXplb2YocFRhc2stPnBkYi5jbWRMaW5lKS0xKTsKKyAgICBwVGFzay0+cGRiLmNtZExpbmVbMF0gPSBzdHJsZW4oIHBUYXNrLT5wZGIuY21kTGluZSArIDEgKTsKIAogICAgICAgLyogR2V0IHRoZSBjb21wYXRpYmlsaXR5IGZsYWdzICovCiAKQEAgLTUwNywzMyArMzcwLDEyIEBACiAgICAgcFRhc2stPmR0YSA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggcFRhc2stPmhQREIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSZwVGFzay0+cGRiLmNtZExpbmUgLSAoaW50KSZwVGFzay0+cGRiICk7CiAKLSAgICAvKiBDcmVhdGUgdGhlIFdpbjMyIHBhcnQgb2YgdGhlIHRhc2sgKi8KLQotICAgIHBkYjMyID0gUFJPQ0VTU19DcmVhdGUoIHBUYXNrLCBjbWRMaW5lICk7Ci0gICAgLyogRklYTUU6IGNoZWNrIGZvciBwZGIzMiA9PSBOVUxMLiAgKi8KLSAgICBwZGIzMi0+dGFzayA9IGhUYXNrOwotICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikKLSAgICB7Ci0gICAgLyoKLSAgICAgICAgTFBUSFJFQURfU1RBUlRfUk9VVElORSBzdGFydCA9Ci0gICAgICAgICAgICAoTFBUSFJFQURfU1RBUlRfUk9VVElORSkoCi0JICAgIAlQUk9DRVNTX0N1cnJlbnQoKS0+ZXhlX21vZHJlZi0+bG9hZF9hZGRyICsKLQkJUFJPQ0VTU19DdXJyZW50KCktPmV4ZV9tb2RyZWYtPnBlX21vZHVsZS0+cGVfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5BZGRyZXNzT2ZFbnRyeVBvaW50KTsKLSAgICAgKi8KLSAgICAgICAgcFRhc2stPnRoZGIgPSBUSFJFQURfQ3JlYXRlKCBwZGIzMiwKLSAgICAgICAgICBQRV9IRUFERVIocE1vZHVsZS0+bW9kdWxlMzIpLT5PcHRpb25hbEhlYWRlci5TaXplT2ZTdGFja1Jlc2VydmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHBUYXNrLT50aGRiID0gVEhSRUFEX0NyZWF0ZSggcGRiMzIsIDAsIE5VTEwsIE5VTEwgKTsKLSAgICAvKiBGSVhNRTogY2hlY2sgZm9yIHBUYXNrLT50aGRiID09IE5VTEwuICAqLwotCiAgICAgLyogQ3JlYXRlIHRoZSAxNi1iaXQgc3RhY2sgZnJhbWUgKi8KIAogICAgIGlmICghKHNwID0gcE1vZHVsZS0+c3ApKQogICAgICAgICBzcCA9IHBTZWdUYWJsZVtwTW9kdWxlLT5zcy0xXS5taW5zaXplICsgcE1vZHVsZS0+c3RhY2tfc2l6ZTsKICAgICBzcCAmPSB+MTsKLSAgICBwVGFzay0+dGhkYi0+Y3VyX3N0YWNrID0gUFRSX1NFR19PRkZfVE9fU0VHUFRSKCBoSW5zdGFuY2UsIHNwICk7CisgICAgcFRhc2stPnRoZGItPmN1cl9zdGFjayA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggcFRhc2stPmhJbnN0YW5jZSwgc3AgKTsKICAgICBwVGFzay0+dGhkYi0+Y3VyX3N0YWNrIC09IHNpemVvZihTVEFDSzE2RlJBTUUpICsgc2l6ZW9mKFNUQUNLMzJGUkFNRSAqKTsKICAgICBmcmFtZTE2ID0gKFNUQUNLMTZGUkFNRSAqKVBUUl9TRUdfVE9fTElOKCBwVGFzay0+dGhkYi0+Y3VyX3N0YWNrICk7CiAgICAgZnJhbWUxNi0+ZWJwID0gc3AgKyAoaW50KSYoKFNUQUNLMTZGUkFNRSAqKTApLT5icDsKQEAgLTU2NCw3ICs0MDYsNyBAQAogICAgIFRBU0tfTGlua1Rhc2soIGhUYXNrICk7CiAKICAgICBUUkFDRSh0YXNrLCAibW9kdWxlPSclcycgY21kbGluZT0nJXMnIHRhc2s9JTA0eFxuIiwKLSAgICAgICAgICAgICAgICAgIG5hbWUsIGNtZExpbmUsIGhUYXNrICk7CisgICAgICAgICAgbmFtZSwgY21kX2xpbmUsIGhUYXNrICk7CiAKICAgICByZXR1cm4gaFRhc2s7CiB9CkBAIC04NDAsNiArNjgyLDE0IEBACiAgICAgICAgICAqLwogICAgICAgICBFQVhfcmVnKGNvbnRleHQpID0gMTsKICAgICAgICAgRUJYX3JlZyhjb250ZXh0KSA9IHBUYXNrLT5wZGIuY21kTGluZVswXSA/IDB4ODEgOiAweDgwOworICAgICAgICAKKwlpZiAoIXBUYXNrLT5wZGIuY21kTGluZVswXSkgRUJYX3JlZyhjb250ZXh0KSA9IDB4ODA7CisJZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMUEJZVEUgcCA9ICZwVGFzay0+cGRiLmNtZExpbmVbMV07CisgICAgICAgICAgICB3aGlsZSAoKCpwID09ICcgJykgfHwgKCpwID09ICdcdCcpKSBwKys7CisgICAgICAgICAgICBFQlhfcmVnKGNvbnRleHQpID0gMHg4MCArIChwIC0gcFRhc2stPnBkYi5jbWRMaW5lKTsKKyAgICAgICAgfQogICAgICAgICBFQ1hfcmVnKGNvbnRleHQpID0gcE1vZHVsZS0+c3RhY2tfc2l6ZTsKICAgICAgICAgRURYX3JlZyhjb250ZXh0KSA9IHBUYXNrLT5uQ21kU2hvdzsKICAgICAgICAgRVNJX3JlZyhjb250ZXh0KSA9IChEV09SRClwVGFzay0+aFByZXZJbnN0YW5jZTsKQEAgLTEyOTQsNyArMTE0NCw3IEBACiAgICAgVERCICpwVGFzazsKIAogICAgIGlmICghKHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaEN1cnJlbnRUYXNrICkpKSByZXR1cm4gMDsKLSAgICByZXR1cm4gKFNFR1BUUilXSU4xNl9HbG9iYWxMb2NrMTYoIHBUYXNrLT5wZGIuZW52aXJvbm1lbnQgKTsKKyAgICByZXR1cm4gUFRSX1NFR19PRkZfVE9fU0VHUFRSKCBwVGFzay0+cGRiLmVudmlyb25tZW50LCAwICk7CiB9CiAKIApAQCAtMTQ5MSw3ICsxMzQxLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRBcHBDb21wYXRGbGFnczMyICAgKFVTRVIzMi4yMDUpCisgKiAgICAgICAgICAgR2V0QXBwQ29tcGF0RmxhZ3MzMiAgIChVU0VSMzIuMjA2KQogICovCiBEV09SRCBXSU5BUEkgR2V0QXBwQ29tcGF0RmxhZ3MzMiggSFRBU0szMiBoVGFzayApCiB7CmRpZmYgLS1naXQgYS9tZW1vcnkvTWFrZWZpbGUuaW4gYi9tZW1vcnkvTWFrZWZpbGUuaW4KaW5kZXggMDEyMzVhMi4uNTE1N2JmMCAxMDA2NDQKLS0tIGEvbWVtb3J5L01ha2VmaWxlLmluCisrKyBiL21lbW9yeS9NYWtlZmlsZS5pbgpAQCAtNyw2ICs3LDcgQEAKIAogQ19TUkNTID0gXAogCWF0b20uYyBcCisJZW52aXJvbi5jIFwKIAlnbG9iYWwuYyBcCiAJaGVhcC5jIFwKIAlsZHQuYyBcCmRpZmYgLS1naXQgYS9tZW1vcnkvZW52aXJvbi5jIGIvbWVtb3J5L2Vudmlyb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTRhMjhhCi0tLSAvZGV2L251bGwKKysrIGIvbWVtb3J5L2Vudmlyb24uYwpAQCAtMCwwICsxLDQzNyBAQAorLyoKKyAqIFByb2Nlc3MgZW52aXJvbm1lbnQgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAxOTk2LCAxOTk4IEFsZXhhbmRyZSBKdWxsaWFyZAorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJwcm9jZXNzLmgiCisjaW5jbHVkZSAiaGVhcC5oIgorI2luY2x1ZGUgInNlbGVjdG9ycy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisKKy8qIEZvcm1hdCBvZiBhbiBlbnZpcm9ubWVudCBibG9jazoKKyAqIEFTQ0lJWiAgIHN0cmluZyAxICh4eD15eSBmb3JtYXQpCisgKiAuLi4KKyAqIEFTQ0lJWiAgIHN0cmluZyBuCisgKiBCWVRFICAgICAwCisgKiBXT1JEICAgICAxCisgKiBBU0NJSVogICBwcm9ncmFtIG5hbWUgKGUuZy4gQzpcV0lORE9XU1xTWVNURU1cS1JOTDM4Ni5FWEUpCisgKgorICogTm90ZXM6CisgKiAtIGNvbnRyYXJ5IHRvIE1pY3Jvc29mdCBkb2NzLCB0aGUgZW52aXJvbm1lbnQgc3RyaW5ncyBkbyBub3QgYXBwZWFyCisgKiAgIHRvIGJlIHNvcnRlZCBvbiBXaW45NSAoYWx0aG91Z2ggdGhleSBhcmUgb24gTlQpOyBzbyB3ZSBkb24ndCBib3RoZXIKKyAqICAgdG8gc29ydCB0aGVtIGVpdGhlci4KKyAqLworCitzdGF0aWMgY29uc3QgY2hhciBFTlZfcHJvZ3JhbV9uYW1lW10gPSAiQzpcXFdJTkRPV1NcXFNZU1RFTVxcS1JOTDM4Ni5FWEUiOworCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBhbiBlbnZpcm9ubWVudCBzdHJpbmcgKGluY2x1ZGluZyBOVUxMKSAqLworI2RlZmluZSBNQVhfU1RSX0xFTiAgMTI4CisKKy8qIEV4dHJhIGJ5dGVzIHRvIHJlc2VydmUgYXQgdGhlIGVuZCBvZiBhbiBlbnZpcm9ubWVudCAqLworI2RlZmluZSBFWFRSQV9FTlZfU0laRSAoc2l6ZW9mKEJZVEUpICsgc2l6ZW9mKFdPUkQpICsgc2l6ZW9mKEVOVl9wcm9ncmFtX25hbWUpKQorCisvKiBGaWxsIHRoZSBleHRyYSBieXRlcyB3aXRoIHRoZSBwcm9ncmFtIG5hbWUgYW5kIHN0dWZmICovCisjZGVmaW5lIEZJTExfRVhUUkFfRU5WKHApIFwKKyAgICAqKHApID0gJ1wwJzsgXAorICAgIFBVVF9XT1JEKCAocCkgKyAxLCAxICk7IFwKKyAgICBzdHJjcHkoIChwKSArIDMsIEVOVl9wcm9ncmFtX25hbWUgKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBFTlZfRmluZFZhcmlhYmxlCisgKgorICogRmluZCBhIHZhcmlhYmxlIGluIHRoZSBlbnZpcm9ubWVudCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgdmFsdWUuCisgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIEdldEVudmlyb25tZW50VmFyaWFibGUgYW5kIEV4cGFuZEVudmlyb25tZW50U3RyaW5ncy4KKyAqLworc3RhdGljIExQQ1NUUiBFTlZfRmluZFZhcmlhYmxlKCBMUENTVFIgZW52LCBMUENTVFIgbmFtZSwgSU5UMzIgbGVuICkKK3sKKyAgICB3aGlsZSAoKmVudikKKyAgICB7CisgICAgICAgIGlmICghbHN0cm5jbXBpMzJBKCBuYW1lLCBlbnYsIGxlbiApICYmIChlbnZbbGVuXSA9PSAnPScpKQorICAgICAgICAgICAgcmV0dXJuIGVudiArIGxlbiArIDE7CisgICAgICAgIGVudiArPSBzdHJsZW4oZW52KSArIDE7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEVOVl9CdWlsZEVudmlyb25tZW50CisgKgorICogQnVpbGQgdGhlIGVudmlyb25tZW50IGZvciB0aGUgaW5pdGlhbCBwcm9jZXNzCisgKi8KK0JPT0wzMiBFTlZfQnVpbGRFbnZpcm9ubWVudCggUERCMzIgKnBkYiApCit7CisgICAgZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworICAgIExQU1RSIHAsICplOworICAgIGludCBzaXplLCBsZW47CisKKyAgICAvKiBDb21wdXRlIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBVbml4IGVudmlyb25tZW50ICovCisKKyAgICBzaXplID0gRVhUUkFfRU5WX1NJWkU7CisgICAgZm9yIChlID0gZW52aXJvbjsgKmU7IGUrKykKKyAgICB7CisgICAgICAgIGxlbiA9IHN0cmxlbigqZSkgKyAxOworICAgICAgICBzaXplICs9IE1JTiggbGVuLCBNQVhfU1RSX0xFTiApOworICAgIH0KKworICAgIC8qIE5vdyBhbGxvY2F0ZSB0aGUgZW52aXJvbm1lbnQgKi8KKworICAgIGlmICghKHAgPSBIZWFwQWxsb2MoIFN5c3RlbUhlYXAsIDAsIHNpemUgKSkpIHJldHVybiBGQUxTRTsKKyAgICBwZGItPmVudl9kYi0+ZW52aXJvbiA9IHA7CisgICAgcGRiLT5lbnZfZGItPmVudl9zZWwgPSBTRUxFQ1RPUl9BbGxvY0Jsb2NrKCBwLCAweDEwMDAwLCBTRUdNRU5UX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgRkFMU0UgKTsKKworICAgIC8qIEFuZCBmaWxsIGl0IHdpdGggdGhlIFVuaXggZW52aXJvbm1lbnQgKi8KKworICAgIGZvciAoZSA9IGVudmlyb247ICplOyBlKyspCisgICAgeworICAgICAgICBsc3RyY3B5bjMyQSggcCwgKmUsIE1BWF9TVFJfTEVOICk7CisgICAgICAgIHAgKz0gc3RybGVuKHApICsgMTsKKyAgICB9CisKKyAgICAvKiBOb3cgYWRkIHRoZSBwcm9ncmFtIG5hbWUgKi8KKworICAgIEZJTExfRVhUUkFfRU5WKCBwICk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRU5WX0luaGVyaXRFbnZpcm9ubWVudAorICoKKyAqIE1ha2UgYSBwcm9jZXNzIGluaGVyaXQgdGhlIGVudmlyb25tZW50IGZyb20gaXRzIHBhcmVudCBvciBmcm9tIGFuCisgKiBleHBsaWNpdCBlbnZpcm9ubWVudC4KKyAqLworQk9PTDMyIEVOVl9Jbmhlcml0RW52aXJvbm1lbnQoIFBEQjMyICpwZGIsIExQQ1NUUiBlbnYgKQoreworICAgIERXT1JEIHNpemU7CisgICAgTFBDU1RSIHA7CisKKyAgICAvKiBGSVhNRTogc2hvdWxkIGxvY2sgdGhlIHBhcmVudCBlbnZpcm9ubWVudCAqLworICAgIGlmICghZW52KSBlbnYgPSBwZGItPnBhcmVudC0+ZW52X2RiLT5lbnZpcm9uOworCisgICAgLyogQ29tcHV0ZSB0aGUgZW52aXJvbm1lbnQgc2l6ZSAqLworCisgICAgcCA9IGVudjsKKyAgICB3aGlsZSAoKnApIHAgKz0gc3RybGVuKHApICsgMTsKKyAgICBzaXplID0gKHAgLSBlbnYpOworCisgICAgLyogQ29weSB0aGUgZW52aXJvbm1lbnQgKi8KKworICAgIGlmICghKHBkYi0+ZW52X2RiLT5lbnZpcm9uID0gSGVhcEFsbG9jKCBwZGItPmhlYXAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKyBFWFRSQV9FTlZfU0laRSApKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIHBkYi0+ZW52X2RiLT5lbnZfc2VsID0gU0VMRUNUT1JfQWxsb2NCbG9jayggcGRiLT5lbnZfZGItPmVudmlyb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwLCBTRUdNRU5UX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgRkFMU0UgKTsKKyAgICBtZW1jcHkoIHBkYi0+ZW52X2RiLT5lbnZpcm9uLCBlbnYsIHNpemUgKTsKKyAgICBGSUxMX0VYVFJBX0VOViggcGRiLT5lbnZfZGItPmVudmlyb24gKyBzaXplICk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRU5WX0ZyZWVFbnZpcm9ubWVudAorICoKKyAqIEZyZWUgYSBwcm9jZXNzIGVudmlyb25tZW50LgorICovCit2b2lkIEVOVl9GcmVlRW52aXJvbm1lbnQoIFBEQjMyICpwZGIgKQoreworICAgIGlmICghcGRiLT5lbnZfZGIpIHJldHVybjsKKyAgICBpZiAocGRiLT5lbnZfZGItPmVudl9zZWwpIFNFTEVDVE9SX0ZyZWVCbG9jayggcGRiLT5lbnZfZGItPmVudl9zZWwsIDEgKTsKKyAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24oICZwZGItPmVudl9kYi0+c2VjdGlvbiApOworICAgIEhlYXBGcmVlKCBwZGItPmhlYXAsIDAsIHBkYi0+ZW52X2RiICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0Q29tbWFuZExpbmUzMkEgICAgICAoS0VSTkVMMzIuMjg5KQorICovCitMUENTVFIgV0lOQVBJIEdldENvbW1hbmRMaW5lMzJBKHZvaWQpCit7CisgICAgcmV0dXJuIFBST0NFU1NfQ3VycmVudCgpLT5lbnZfZGItPmNtZF9saW5lOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRDb21tYW5kTGluZTMyVyAgICAgIChLRVJORUwzMi4yOTApCisgKi8KK0xQQ1dTVFIgV0lOQVBJIEdldENvbW1hbmRMaW5lMzJXKHZvaWQpCit7CisgICAgUERCMzIgKnBkYiA9IFBST0NFU1NfQ3VycmVudCgpOworICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmcGRiLT5lbnZfZGItPnNlY3Rpb24gKTsKKyAgICBpZiAoIXBkYi0+ZW52X2RiLT5jbWRfbGluZVcpCisgICAgICAgIHBkYi0+ZW52X2RiLT5jbWRfbGluZVcgPSBIRUFQX3N0cmR1cEF0b1coIHBkYi0+aGVhcCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRiLT5lbnZfZGItPmNtZF9saW5lICk7CisgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZwZGItPmVudl9kYi0+c2VjdGlvbiApOworICAgIHJldHVybiBwZGItPmVudl9kYi0+Y21kX2xpbmVXOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldEVudmlyb25tZW50U3RyaW5nczMyQSAgIChLRVJORUwzMi4zMTkpIChLRVJORUwzMi4zMjApCisgKi8KK0xQU1RSIFdJTkFQSSBHZXRFbnZpcm9ubWVudFN0cmluZ3MzMkEodm9pZCkKK3sKKyAgICBQREIzMiAqcGRiID0gUFJPQ0VTU19DdXJyZW50KCk7CisgICAgcmV0dXJuIHBkYi0+ZW52X2RiLT5lbnZpcm9uOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldEVudmlyb25tZW50U3RyaW5nczMyVyAgIChLRVJORUwzMi4zMjEpCisgKi8KK0xQV1NUUiBXSU5BUEkgR2V0RW52aXJvbm1lbnRTdHJpbmdzMzJXKHZvaWQpCit7CisgICAgSU5UMzIgc2l6ZTsKKyAgICBMUFdTVFIgcmV0OworICAgIFBEQjMyICpwZGIgPSBQUk9DRVNTX0N1cnJlbnQoKTsKKworICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmcGRiLT5lbnZfZGItPnNlY3Rpb24gKTsKKyAgICBzaXplID0gSGVhcFNpemUoIHBkYi0+aGVhcCwgMCwgcGRiLT5lbnZfZGItPmVudmlyb24gKTsKKyAgICBpZiAoKHJldCA9IEhlYXBBbGxvYyggcGRiLT5oZWFwLCAwLCBzaXplICogc2l6ZW9mKFdDSEFSKSApKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgTFBTVFIgcEEgPSBwZGItPmVudl9kYi0+ZW52aXJvbjsKKyAgICAgICAgTFBXU1RSIHBXID0gcmV0OworICAgICAgICB3aGlsZSAoc2l6ZS0tKSAqcFcrKyA9IChXQ0hBUikoQllURSkqcEErKzsKKyAgICB9CisgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZwZGItPmVudl9kYi0+c2VjdGlvbiApOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRnJlZUVudmlyb25tZW50U3RyaW5nczMyQSAgIChLRVJORUwzMi4yNjgpCisgKi8KK0JPT0wzMiBXSU5BUEkgRnJlZUVudmlyb25tZW50U3RyaW5nczMyQSggTFBTVFIgcHRyICkKK3sKKyAgICBQREIzMiAqcGRiID0gUFJPQ0VTU19DdXJyZW50KCk7CisgICAgaWYgKHB0ciAhPSBwZGItPmVudl9kYi0+ZW52aXJvbikKKyAgICB7CisgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBGcmVlRW52aXJvbm1lbnRTdHJpbmdzMzJXICAgKEtFUk5FTDMyLjI2OSkKKyAqLworQk9PTDMyIFdJTkFQSSBGcmVlRW52aXJvbm1lbnRTdHJpbmdzMzJXKCBMUFdTVFIgcHRyICkKK3sKKyAgICByZXR1cm4gSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHB0ciApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldEVudmlyb25tZW50VmFyaWFibGUzMkEgICAoS0VSTkVMMzIuMzIyKQorICovCitEV09SRCBXSU5BUEkgR2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyQSggTFBDU1RSIG5hbWUsIExQU1RSIHZhbHVlLCBEV09SRCBzaXplICkKK3sKKyAgICBMUENTVFIgcDsKKyAgICBJTlQzMiByZXQgPSAwOworICAgIFBEQjMyICpwZGIgPSBQUk9DRVNTX0N1cnJlbnQoKTsKKworICAgIGlmICghbmFtZSB8fCAhKm5hbWUpCisgICAgeworICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJnBkYi0+ZW52X2RiLT5zZWN0aW9uICk7CisgICAgaWYgKChwID0gRU5WX0ZpbmRWYXJpYWJsZSggcGRiLT5lbnZfZGItPmVudmlyb24sIG5hbWUsIHN0cmxlbihuYW1lKSApKSkKKyAgICB7CisgICAgICAgIHJldCA9IHN0cmxlbihwKTsKKyAgICAgICAgaWYgKHNpemUgPD0gcmV0KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiBub3QgZW5vdWdoIHJvb20sIGluY2x1ZGUgdGhlIHRlcm1pbmF0aW5nIG51bGwKKyAgICAgICAgICAgICAqIGluIHRoZSByZXR1cm5lZCBzaXplIGFuZCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nICovCisgICAgICAgICAgICByZXQrKzsKKyAgICAgICAgICAgIGlmICh2YWx1ZSkgKnZhbHVlID0gJ1wwJzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh2YWx1ZSkgc3RyY3B5KCB2YWx1ZSwgcCApOworICAgIH0KKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJnBkYi0+ZW52X2RiLT5zZWN0aW9uICk7CisgICAgcmV0dXJuIHJldDsgIC8qIEZJWE1FOiBTZXRMYXN0RXJyb3IgKi8KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJXICAgKEtFUk5FTDMyLjMyMykKKyAqLworRFdPUkQgV0lOQVBJIEdldEVudmlyb25tZW50VmFyaWFibGUzMlcoIExQQ1dTVFIgbmFtZVcsIExQV1NUUiB2YWxXLCBEV09SRCBzaXplKQoreworICAgIExQU1RSIG5hbWUgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIG5hbWVXICk7CisgICAgTFBTVFIgdmFsICA9IHZhbFcgPyBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemUgKSA6IE5VTEw7CisgICAgRFdPUkQgcmVzICA9IEdldEVudmlyb25tZW50VmFyaWFibGUzMkEoIG5hbWUsIHZhbCwgc2l6ZSApOworICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuYW1lICk7CisgICAgaWYgKHZhbCkKKyAgICB7CisgICAgICAgIGxzdHJjcHluQXRvVyggdmFsVywgdmFsLCBzaXplICk7CisgICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB2YWwgKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJBICAgKEtFUk5FTDMyLjY0MSkKKyAqLworQk9PTDMyIFdJTkFQSSBTZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJBKCBMUENTVFIgbmFtZSwgTFBDU1RSIHZhbHVlICkKK3sKKyAgICBJTlQzMiBvbGRfc2l6ZSwgbGVuLCByZXM7CisgICAgTFBTVFIgcCwgZW52LCBuZXdfZW52OworICAgIEJPT0wzMiByZXQgPSBGQUxTRTsKKyAgICBQREIzMiAqcGRiID0gUFJPQ0VTU19DdXJyZW50KCk7CisKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJnBkYi0+ZW52X2RiLT5zZWN0aW9uICk7CisgICAgZW52ID0gcCA9IHBkYi0+ZW52X2RiLT5lbnZpcm9uOworCisgICAgLyogRmluZCBhIHBsYWNlIHRvIGluc2VydCB0aGUgc3RyaW5nICovCisKKyAgICByZXMgPSAtMTsKKyAgICBsZW4gPSBzdHJsZW4obmFtZSk7CisgICAgd2hpbGUgKCpwKQorICAgIHsKKyAgICAgICAgaWYgKCFsc3RybmNtcGkzMkEoIG5hbWUsIHAsIGxlbiApICYmIChwW2xlbl0gPT0gJz0nKSkgYnJlYWs7CisgICAgICAgIHAgKz0gc3RybGVuKHApICsgMTsKKyAgICB9CisgICAgaWYgKCF2YWx1ZSAmJiAhKnApIGdvdG8gZG9uZTsgIC8qIFZhbHVlIHRvIHJlbW92ZSBkb2Vzbid0IGV4aXN0ICovCisKKyAgICAvKiBSZWFsbG9jIHRoZSBidWZmZXIgKi8KKworICAgIGxlbiA9IHZhbHVlID8gc3RybGVuKG5hbWUpICsgc3RybGVuKHZhbHVlKSArIDIgOiAwOworICAgIGlmICgqcCkgbGVuIC09IHN0cmxlbihwKSArIDE7ICAvKiBUaGUgbmFtZSBhbHJlYWR5IGV4aXN0cyAqLworICAgIG9sZF9zaXplID0gSGVhcFNpemUoIHBkYi0+aGVhcCwgMCwgZW52ICk7CisgICAgaWYgKGxlbiA8IDApCisgICAgeworICAgICAgICBMUFNUUiBuZXh0ID0gcCArIHN0cmxlbihwKSArIDE7ICAvKiBXZSBrbm93IHRoZXJlIGlzIGEgbmV4dCBvbmUgKi8KKyAgICAgICAgbWVtbW92ZSggbmV4dCArIGxlbiwgbmV4dCwgb2xkX3NpemUgLSAobmV4dCAtIGVudikgKTsKKyAgICB9CisgICAgaWYgKCEobmV3X2VudiA9IEhlYXBSZUFsbG9jKCBwZGItPmhlYXAsIDAsIGVudiwgb2xkX3NpemUgKyBsZW4gKSkpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICBTRUxFQ1RPUl9Nb3ZlQmxvY2soIHBkYi0+ZW52X2RiLT5lbnZfc2VsLCBuZXdfZW52ICk7CisgICAgcCA9IG5ld19lbnYgKyAocCAtIGVudik7CisgICAgaWYgKGxlbiA+IDApIG1lbW1vdmUoIHAgKyBsZW4sIHAsIG9sZF9zaXplIC0gKHAgLSBuZXdfZW52KSApOworCisgICAgLyogU2V0IHRoZSBuZXcgc3RyaW5nICovCisKKyAgICBpZiAodmFsdWUpCisgICAgeworICAgICAgICBzdHJjcHkoIHAsIG5hbWUgKTsKKyAgICAgICAgc3RyY2F0KCBwLCAiPSIgKTsKKyAgICAgICAgc3RyY2F0KCBwLCB2YWx1ZSApOworICAgIH0KKyAgICBwZGItPmVudl9kYi0+ZW52aXJvbiA9IG5ld19lbnY7CisgICAgcmV0ID0gVFJVRTsKKworZG9uZToKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJnBkYi0+ZW52X2RiLT5zZWN0aW9uICk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJXICAgKEtFUk5FTDMyLjY0MikKKyAqLworQk9PTDMyIFdJTkFQSSBTZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJXKCBMUENXU1RSIG5hbWUsIExQQ1dTVFIgdmFsdWUgKQoreworICAgIExQU1RSIG5hbWVBICA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmFtZSApOworICAgIExQU1RSIHZhbHVlQSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdmFsdWUgKTsKKyAgICBCT09MMzIgcmV0ID0gU2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyQSggbmFtZUEsIHZhbHVlQSApOworICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuYW1lQSApOworICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB2YWx1ZUEgKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEV4cGFuZEVudmlyb25tZW50U3RyaW5nczMyQSAgIChLRVJORUwzMi4yMTYpCisgKgorICogTm90ZTogb3ZlcmxhcHBpbmcgYnVmZmVycyBhcmUgbm90IHN1cHBvcnRlZDsgdGhpcyBpcyBob3cgaXQgc2hvdWxkIGJlLgorICovCitEV09SRCBXSU5BUEkgRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzMzJBKCBMUENTVFIgc3JjLCBMUFNUUiBkc3QsIERXT1JEIGNvdW50ICkKK3sKKyAgICBEV09SRCBsZW4sIHRvdGFsX3NpemUgPSAxOyAgLyogMSBmb3IgdGVybWluYXRpbmcgJ1wwJyAqLworICAgIExQQ1NUUiBwLCB2YXI7CisgICAgUERCMzIgKnBkYiA9IFBST0NFU1NfQ3VycmVudCgpOworCisgICAgaWYgKCFjb3VudCkgZHN0ID0gTlVMTDsKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJnBkYi0+ZW52X2RiLT5zZWN0aW9uICk7CisKKyAgICB3aGlsZSAoKnNyYykKKyAgICB7CisgICAgICAgIGlmICgqc3JjICE9ICclJykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChwID0gc3RyY2hyKCBzcmMsICclJyApKSkgbGVuID0gcCAtIHNyYzsKKyAgICAgICAgICAgIGVsc2UgbGVuID0gc3RybGVuKHNyYyk7CisgICAgICAgICAgICB2YXIgPSBzcmM7CisgICAgICAgICAgICBzcmMgKz0gbGVuOworICAgICAgICB9CisgICAgICAgIGVsc2UgIC8qIHdlIGFyZSBhdCB0aGUgc3RhcnQgb2YgYSB2YXJpYWJsZSAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHAgPSBzdHJjaHIoIHNyYyArIDEsICclJyApKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBwIC0gc3JjIC0gMTsgIC8qIExlbmd0aCBvZiB0aGUgdmFyaWFibGUgbmFtZSAqLworICAgICAgICAgICAgICAgIGlmICgodmFyID0gRU5WX0ZpbmRWYXJpYWJsZSggcGRiLT5lbnZfZGItPmVudmlyb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgKyAxLCBsZW4gKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzcmMgKz0gbGVuICsgMjsgIC8qIFNraXAgdGhlIHZhcmlhYmxlIG5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHZhcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciA9IHNyYzsgIC8qIENvcHkgb3JpZ2luYWwgbmFtZSBpbnN0ZWFkICovCisgICAgICAgICAgICAgICAgICAgIGxlbiArPSAyOworICAgICAgICAgICAgICAgICAgICBzcmMgKz0gbGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgIC8qIHVuZmluaXNoZWQgdmFyaWFibGUgbmFtZSwgaWdub3JlIGl0ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyID0gc3JjOworICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihzcmMpOyAgLyogQ29weSB3aG9sZSBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICBzcmMgKz0gbGVuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRvdGFsX3NpemUgKz0gbGVuOworICAgICAgICBpZiAoZHN0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY291bnQgPCBsZW4pIGxlbiA9IGNvdW50OworICAgICAgICAgICAgbWVtY3B5KCBkc3QsIHZhciwgbGVuICk7CisgICAgICAgICAgICBkc3QgKz0gbGVuOworICAgICAgICAgICAgY291bnQgLT0gbGVuOworICAgICAgICB9CisgICAgfQorICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmcGRiLT5lbnZfZGItPnNlY3Rpb24gKTsKKworICAgIC8qIE51bGwtdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKyAgICBpZiAoZHN0KQorICAgIHsKKyAgICAgICAgaWYgKCFjb3VudCkgZHN0LS07CisgICAgICAgICpkc3QgPSAnXDAnOworICAgIH0KKyAgICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MzMlcgICAoS0VSTkVMMzIuMjE3KQorICovCitEV09SRCBXSU5BUEkgRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzMzJXKCBMUENXU1RSIHNyYywgTFBXU1RSIGRzdCwgRFdPUkQgbGVuICkKK3sKKyAgICBMUFNUUiBzcmNBID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmMgKTsKKyAgICBMUFNUUiBkc3RBID0gZHN0ID8gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW4gKSA6IE5VTEw7CisgICAgRFdPUkQgcmV0ICA9IEV4cGFuZEVudmlyb25tZW50U3RyaW5nczMyQSggc3JjQSwgZHN0QSwgbGVuICk7CisgICAgaWYgKGRzdEEpCisgICAgeworICAgICAgICBsc3RyY3B5QXRvVyggZHN0LCBkc3RBICk7CisgICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RBICk7CisgICAgfQorICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNBICk7CisgICAgcmV0dXJuIHJldDsKK30KKwpkaWZmIC0tZ2l0IGEvbWVtb3J5L2dsb2JhbC5jIGIvbWVtb3J5L2dsb2JhbC5jCmluZGV4IDU0YTRiNDYuLmZkYjAyMDggMTAwNjQ0Ci0tLSBhL21lbW9yeS9nbG9iYWwuYworKysgYi9tZW1vcnkvZ2xvYmFsLmMKQEAgLTI4Miw3ICsyODIsNyBAQAogICAgIEhBTkRMRTE2IG93bmVyID0gR2V0Q3VycmVudFBEQigpOwogCiAgICAgaWYgKGZsYWdzICYgR01FTV9EREVTSEFSRSkKLSAgICAgICAgb3duZXIgPSBNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYob3duZXIpOyAgLyogTWFrZSBpdCBhIG1vZHVsZSBoYW5kbGUgKi8KKyAgICAgICAgb3duZXIgPSBHZXRFeGVQdHIob3duZXIpOyAgLyogTWFrZSBpdCBhIG1vZHVsZSBoYW5kbGUgKi8KICAgICByZXR1cm4gR0xPQkFMX0FsbG9jKCBmbGFncywgc2l6ZSwgb3duZXIsIEZBTFNFLCBGQUxTRSwgRkFMU0UgKTsKIH0KIApAQCAtOTYzLDExICs5NjMsNyBAQAogICAgICAqICh1bmRlciBXaW5kb3dzKSBhbHdheXMgZmlsbHMgdGhlIHN0cnVjdHVyZSBhbmQgcmV0dXJucyB0cnVlLgogICAgICAqLwogICAgIEdsb2JhbE1lbW9yeVN0YXR1cyggJnN0YXR1cyApOwotI2lmZGVmIF9fc3ZyNF9fCi0gICAgaW5mby0+d1BhZ2VTaXplICAgICAgICAgICAgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7Ci0jZWxzZQotICAgIGluZm8tPndQYWdlU2l6ZSAgICAgICAgICAgID0gZ2V0cGFnZXNpemUoKTsKLSNlbmRpZgorICAgIGluZm8tPndQYWdlU2l6ZSAgICAgICAgICAgID0gVklSVFVBTF9HZXRQYWdlU2l6ZSgpOwogICAgIGluZm8tPmR3TGFyZ2VzdEZyZWVCbG9jayAgID0gc3RhdHVzLmR3QXZhaWxWaXJ0dWFsOwogICAgIGluZm8tPmR3TWF4UGFnZXNBdmFpbGFibGUgID0gaW5mby0+ZHdMYXJnZXN0RnJlZUJsb2NrIC8gaW5mby0+d1BhZ2VTaXplOwogICAgIGluZm8tPmR3TWF4UGFnZXNMb2NrYWJsZSAgID0gaW5mby0+ZHdNYXhQYWdlc0F2YWlsYWJsZTsKQEAgLTEyMjUsOSArMTIyMSwxMCBAQAogICAgICAgewogCSAvKiByZWFsbG9jYXRlIGEgbW92ZWFibGUgYmxvY2sgKi8KIAkgcGludGVybj1IQU5ETEVfVE9fSU5URVJOKGhtZW0pOwotCSBpZihwaW50ZXJuLT5Mb2NrQ291bnQhPTApCisJIGlmKHBpbnRlcm4tPkxvY2tDb3VudD4xKSB7CisJICAgIEVSUihnbG9iYWwsImhhbmRsZSAweCUwOGx4IGlzIHN0aWxsIGxvY2tlZCwgY2Fubm90IHJlYWxsb2MhXG4iLChEV09SRClobWVtKTsKIAkgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfSEFORExFKTsKLQkgZWxzZSBpZihzaXplIT0wKQorCSB9IGVsc2UgaWYoc2l6ZSE9MCkKIAkgewogCSAgICBobmV3PWhtZW07CiAJICAgIGlmKHBpbnRlcm4tPlBvaW50ZXIpCmRpZmYgLS1naXQgYS9tZW1vcnkvaGVhcC5jIGIvbWVtb3J5L2hlYXAuYwppbmRleCA0NDZiNjNkLi4yYzI1NTZkIDEwMDY0NAotLS0gYS9tZW1vcnkvaGVhcC5jCisrKyBiL21lbW9yeS9oZWFwLmMKQEAgLTEyMjUsNyArMTIyNSw3IEBACiAgICAgICAgICAgICAgIExQQ1ZPSUQgYmxvY2sgIC8qIFtpbl0gT3B0aW9uYWwgcG9pbnRlciB0byBtZW1vcnkgYmxvY2sgdG8gdmFsaWRhdGUgKi8KICkgewogICAgIFNVQkhFQVAgKnN1YmhlYXA7Ci0gICAgSEVBUCAqaGVhcFB0ciA9IEhFQVBfR2V0UHRyKGhlYXApOworICAgIEhFQVAgKmhlYXBQdHIgPSAoSEVBUCAqKShoZWFwKTsKIAogICAgIGlmICghaGVhcFB0ciB8fCAoaGVhcFB0ci0+bWFnaWMgIT0gSEVBUF9NQUdJQykpCiAgICAgewpkaWZmIC0tZ2l0IGEvbWVtb3J5L2xvY2FsLmMgYi9tZW1vcnkvbG9jYWwuYwppbmRleCA5MTA2NjVmLi44ZjUyMTNkIDEwMDY0NAotLS0gYS9tZW1vcnkvbG9jYWwuYworKysgYi9tZW1vcnkvbG9jYWwuYwpAQCAtMjYsMTAgKzI2LDYgQEAKICNpbmNsdWRlICJ0b29saGVscC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLS8qIG5lZWRlZCBvbmx5ICBmb3IgR0RJX0hlYXBTZWwgYW5kIFVTRVJfSGVhcFNlbCAqLwotI2luY2x1ZGUgImdkaS5oIgotI2luY2x1ZGUgInVzZXIuaCIKLQogdHlwZWRlZiBzdHJ1Y3QKIHsKIC8qIEFyZW5hIGhlYWRlciAqLwpAQCAtMTAzLDYgKzk5LDggQEAKIAogI2RlZmluZSBMT0NBTF9IRUFQX01BR0lDICAweDQ4NGMgIC8qICdMSCcgKi8KIAorV09SRCBVU0VSX0hlYXBTZWwgPSAwOyAgLyogVVNFUiBoZWFwIHNlbGVjdG9yICovCitXT1JEIEdESV9IZWFwU2VsID0gMDsgICAvKiBHREkgaGVhcCBzZWxlY3RvciAqLwogCiAgIC8qIEFsbCBsb2NhbCBoZWFwIGFsbG9jYXRpb25zIGFyZSBhbGlnbmVkIG9uIDQtYnl0ZSBib3VuZGFyaWVzICovCiAjZGVmaW5lIExBTElHTih3b3JkKSAgICAgICAgICAoKCh3b3JkKSArIDMpICYgfjMpCkBAIC0xMDk5LDcgKzEwOTcsNyBAQAogICAgIGNoYXIgKnB0ciA9IFBUUl9TRUdfT0ZGX1RPX0xJTiggZHMsIDAgKTsKICAgICBMT0NBTEhFQVBJTkZPICpwSW5mbzsKICAgICBMT0NBTEFSRU5BICpwQXJlbmEsICpwTmV4dDsKLSAgICBMT0NBTEhBTkRMRUVOVFJZICpwRW50cnk7CisgICAgTE9DQUxIQU5ETEVFTlRSWSAqcEVudHJ5ID0gTlVMTDsKICAgICBXT1JEIGFyZW5hLCBvbGRzaXplOwogICAgIEhMT0NBTDE2IGhtZW0sIGJsb2NraGFuZGxlOwogICAgIExPTkcgbmV4dGFyZW5hOwpkaWZmIC0tZ2l0IGEvbWVtb3J5L3NlbGVjdG9yLmMgYi9tZW1vcnkvc2VsZWN0b3IuYwppbmRleCBlMjc3ZWE1Li4wZmJiOWJiIDEwMDY0NAotLS0gYS9tZW1vcnkvc2VsZWN0b3IuYworKysgYi9tZW1vcnkvc2VsZWN0b3IuYwpAQCAtMTM4LDYgKzEzOCwyNSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNFTEVDVE9SX01vdmVCbG9jaworICoKKyAqIE1vdmUgYSBibG9jayBvZiBzZWxlY3RvcnMgaW4gbGluZWFyIG1lbW9yeS4KKyAqLwordm9pZCBTRUxFQ1RPUl9Nb3ZlQmxvY2soIFdPUkQgc2VsLCBjb25zdCB2b2lkICpuZXdfYmFzZSApCit7CisgICAgV09SRCBpLCBjb3VudCA9IChHRVRfU0VMX0xJTUlUKHNlbCkgPj4gMTYpICsgMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgbGR0X2VudHJ5IGVudHJ5OworICAgICAgICBMRFRfR2V0RW50cnkoIFNFTEVDVE9SX1RPX0VOVFJZKHNlbCkgKyBpLCAmZW50cnkgKTsKKyAgICAgICAgZW50cnkuYmFzZSA9ICh1bnNpZ25lZCBsb25nKW5ld19iYXNlOworICAgICAgICBMRFRfU2V0RW50cnkoIFNFTEVDVE9SX1RPX0VOVFJZKHNlbCkgKyBpLCAmZW50cnkgKTsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU0VMRUNUT1JfRnJlZUJsb2NrCiAgKgogICogRnJlZSBhIGJsb2NrIG9mIHNlbGVjdG9ycy4KQEAgLTQ5NiwxMyArNTE1LDEwIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFdpbjk1IHBvaW50ZXIgbWFwcGluZyBmdW5jdGlvbnMgKgogICoKLSAqIE5PVEU6IE1hcFNMRml4IGFuZCBVbk1hcFNMRml4QXJyYXkgYXJlIHByb2JhYmx5IG5lZWRlZCB0byBwcmV2ZW50Ci0gKiB1bmV4cGVjdGVkIGxpbmVhciBhZGRyZXNzIGNoYW5nZSB3aGVuIEdsb2JhbENvbXBhY3QoKSBzaHVmZmxlcwotICogbW92ZWFibGUgYmxvY2tzLgogICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE1hcFNMICAgKEtFUk5FTDMyLjY2MikKKyAqICAgICAgICAgICBNYXBTTCAgIChLRVJORUwzMi41MjMpCiAgKgogICogTWFwcyBmaXhlZCBzZWdtZW50ZWQgcG9pbnRlciB0byBsaW5lYXIuCiAgKi8KQEAgLTUxMSwyNyArNTI3LDUzIEBACiAgICAgcmV0dXJuIChMUFZPSUQpUFRSX1NFR19UT19MSU4oc3B0cik7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE1hcFNMRml4ICAgKEtFUk5FTDMyLjUyNCkKKyAqCisgKiBGSVhNRTogTWFwU0xGaXggYW5kIFVuTWFwU0xGaXhBcnJheSBzaG91bGQgcHJvYmFibHkgcHJldmVudAorICogdW5leHBlY3RlZCBsaW5lYXIgYWRkcmVzcyBjaGFuZ2Ugd2hlbiBHbG9iYWxDb21wYWN0KCkgc2h1ZmZsZXMKKyAqIG1vdmVhYmxlIGJsb2Nrcy4KKyAqLworCitMUFZPSUQgV0lOQVBJIE1hcFNMRml4KCBTRUdQVFIgc3B0ciApCit7CisgICAgcmV0dXJuIChMUFZPSUQpUFRSX1NFR19UT19MSU4oc3B0cik7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE1hcExTICAgKEtFUk5FTDMyLjY3OSkKKyAqICAgICAgICAgICBVbk1hcFNMRml4QXJyYXkgICAoS0VSTkVMMzIuNzAxKQorICovCisKK3ZvaWQgV0lOQVBJIFVuTWFwU0xGaXhBcnJheSggU0VHUFRSIHNwdHJbXSwgSU5UMzIgbGVuZ3RoICkKK3sKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTWFwTFMgICAoS0VSTkVMMzIuNTIyKQogICoKICAqIE1hcHMgbGluZWFyIHBvaW50ZXIgdG8gc2VnbWVudGVkLgogICovCiBTRUdQVFIgV0lOQVBJIE1hcExTKCBMUFZPSUQgcHRyICkKIHsKLSAgICBXT1JEIHNlbCA9IFNFTEVDVE9SX0FsbG9jQmxvY2soIHB0ciwgMHgxMDAwMCwgU0VHTUVOVF9EQVRBLCBGQUxTRSwgRkFMU0UgKTsKLSAgICByZXR1cm4gUFRSX1NFR19PRkZfVE9fU0VHUFRSKCBzZWwsIDAgKTsKKyAgICBpZiAoIUhJV09SRChwdHIpKQorICAgICAgICByZXR1cm4gKFNFR1BUUilwdHI7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgV09SRCBzZWwgPSBTRUxFQ1RPUl9BbGxvY0Jsb2NrKCBwdHIsIDB4MTAwMDAsIFNFR01FTlRfREFUQSwgRkFMU0UsIEZBTFNFICk7CisgICAgICAgIHJldHVybiBQVFJfU0VHX09GRl9UT19TRUdQVFIoIHNlbCwgMCApOworICAgIH0KIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBVbk1hcExTICAgKEtFUk5FTDMyLjY4MCkKKyAqICAgICAgICAgICBVbk1hcExTICAgKEtFUk5FTDMyLjcwMCkKICAqCiAgKiBGcmVlIG1hcHBlZCBzZWxlY3Rvci4KICAqLwogdm9pZCBXSU5BUEkgVW5NYXBMUyggU0VHUFRSIHNwdHIgKQogewotICAgIGlmICghX193aW5lbGliKSBTRUxFQ1RPUl9GcmVlQmxvY2soIFNFTEVDVE9ST0Yoc3B0ciksIDEgKTsKKyAgICBpZiAoU0VMRUNUT1JPRihzcHRyKSkgCisgICAgICAgIFNFTEVDVE9SX0ZyZWVCbG9jayggU0VMRUNUT1JPRihzcHRyKSwgMSApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTYyNiw2ICs2NjgsNzEgQEAKIHZvaWQgV0lOQVBJIFNVbk1hcExTX0lQX0VCUF80MChDT05URVhUICpjb250ZXh0KSB7IHhfU1VuTWFwTFNfSVBfRUJQX3goY29udGV4dCw0MCk7IH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJQWxsb2NNYXBwZWRCdWZmZXIJKEtFUk5FTDMyLjM4KQorICoKKyAqIFRoaXMgaXMgYSB1bmRvY3VtZW50ZWQgS0VSTkVMMzIgZnVuY3Rpb24gdGhhdCAKKyAqIFNNYXBMUydzIGEgR2xvYmFsQWxsb2MnZWQgYnVmZmVyLgorICoKKyAqIElucHV0OiAgIEVESSByZWdpc3Rlcjogc2l6ZSBvZiBidWZmZXIgdG8gYWxsb2NhdGUKKyAqIE91dHB1dDogIEVESSByZWdpc3RlcjogcG9pbnRlciB0byBidWZmZXIKKyAqCisgKiBOb3RlOiBUaGUgYnVmZmVyIGlzIHByZWNlZWRlZCBieSA4IGJ5dGVzOgorICogICAgICAgIC4uLgorICogICAgICAgZWRpKzAgICBidWZmZXIKKyAqICAgICAgIGVkaS00ICAgU0VHUFRSIHRvIGJ1ZmZlcgorICogICAgICAgZWRpLTggICBzb21lIG1hZ2ljIFdpbjk1IG5lZWRzIGZvciBTVW5NYXBMUworICogICAgICAgICAgICAgICAod2UgdXNlIGl0IGZvciB0aGUgbWVtb3J5IGhhbmRsZSkKKyAqCisgKiAgICAgICBUaGUgU0VHUFRSIGlzIHVzZWQgYnkgdGhlIGNhbGxlciEKKyAqLworCit2b2lkIFdJTkFQSSBBbGxvY01hcHBlZEJ1ZmZlcihDT05URVhUICpjb250ZXh0KQoreworICAgIEhHTE9CQUwzMiBoYW5kbGUgPSBHbG9iYWxBbGxvYzMyKDAsIEVESV9yZWcoY29udGV4dCkgKyA4KTsKKyAgICBEV09SRCAqYnVmZmVyID0gKERXT1JEICopR2xvYmFsTG9jazMyKGhhbmRsZSk7CisgICAgU0VHUFRSIHB0ciA9IDA7CisKKyAgICBpZiAoYnVmZmVyKQorICAgICAgICBpZiAoIShwdHIgPSBNYXBMUyhidWZmZXIgKyAyKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEdsb2JhbFVubG9jazMyKGhhbmRsZSk7CisgICAgICAgICAgICBHbG9iYWxGcmVlMzIoaGFuZGxlKTsKKyAgICAgICAgfQorCisgICAgaWYgKCFwdHIpCisgICAgICAgIEVBWF9yZWcoY29udGV4dCkgPSBFRElfcmVnKGNvbnRleHQpID0gMDsKKyAgICBlbHNlCisgICAgeworICAgICAgICBidWZmZXJbMF0gPSBoYW5kbGU7CisgICAgICAgIGJ1ZmZlclsxXSA9IHB0cjsKKworICAgICAgICBFQVhfcmVnKGNvbnRleHQpID0gKERXT1JEKSBwdHI7CisgICAgICAgIEVESV9yZWcoY29udGV4dCkgPSAoRFdPUkQpKGJ1ZmZlciArIDIpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJRnJlZU1hcHBlZEJ1ZmZlcgkoS0VSTkVMMzIuMzkpCisgKgorICogRnJlZSBhIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgQWxsb2NNYXBwZWRCdWZmZXIKKyAqCisgKiBJbnB1dDogRURJIHJlZ2lzdGVyOiBwb2ludGVyIHRvIGJ1ZmZlcgorICovCisKK3ZvaWQgV0lOQVBJIEZyZWVNYXBwZWRCdWZmZXIoQ09OVEVYVCAqY29udGV4dCkKK3sKKyAgICBpZiAoRURJX3JlZyhjb250ZXh0KSkKKyAgICB7CisgICAgICAgIERXT1JEICpidWZmZXIgPSAoRFdPUkQgKilFRElfcmVnKGNvbnRleHQpIC0gMjsKKworICAgICAgICBVbk1hcExTKGJ1ZmZlclsxXSk7CisKKyAgICAgICAgR2xvYmFsVW5sb2NrMzIoYnVmZmVyWzBdKTsKKyAgICAgICAgR2xvYmFsRnJlZTMyKGJ1ZmZlclswXSk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFdPV0dldFZETVBvaW50ZXIJKEtFUk5FTDMyLjU1KQogICogR2V0IGxpbmVhciBmcm9tIHNlZ21lbnRlZCBwb2ludGVyLiAoTVNETiBsaWIpCiAgKi8KZGlmZiAtLWdpdCBhL21lbW9yeS9zdHJpbmcuYyBiL21lbW9yeS9zdHJpbmcuYwppbmRleCA2ZTA2M2E4Li5lZTBkYjY3IDEwMDY0NAotLS0gYS9tZW1vcnkvc3RyaW5nLmMKKysrIGIvbWVtb3J5L3N0cmluZy5jCkBAIC01NDIsNyArNTQyLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDaGFyVG9PZW0zMkEgICAoVVNFUjMyLjM2KQorICogICAgICAgICAgIENoYXJUb09lbTMyQSAgIChVU0VSMzIuMzcpCiAgKi8KIEJPT0wzMiBXSU5BUEkgQ2hhclRvT2VtMzJBKCBMUENTVFIgcywgTFBTVFIgZCApCiB7CkBAIC01NTYsNyArNTU2LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDaGFyVG9PZW1CdWZmMzJBICAgKFVTRVIzMi4zNykKKyAqICAgICAgICAgICBDaGFyVG9PZW1CdWZmMzJBICAgKFVTRVIzMi4zOCkKICAqLwogQk9PTDMyIFdJTkFQSSBDaGFyVG9PZW1CdWZmMzJBKCBMUENTVFIgcywgTFBTVFIgZCwgRFdPUkQgbGVuICkKIHsKQEAgLTU2Niw3ICs1NjYsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENoYXJUb09lbUJ1ZmYzMlcgICAoVVNFUjMyLjM4KQorICogICAgICAgICAgIENoYXJUb09lbUJ1ZmYzMlcgICAoVVNFUjMyLjM5KQogICovCiBCT09MMzIgV0lOQVBJIENoYXJUb09lbUJ1ZmYzMlcoIExQQ1dTVFIgcywgTFBTVFIgZCwgRFdPUkQgbGVuICkKIHsKQEAgLTU3Niw3ICs1NzYsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENoYXJUb09lbTMyVyAgIChVU0VSMzIuMzkpCisgKiAgICAgICAgICAgQ2hhclRvT2VtMzJXICAgKFVTRVIzMi40MCkKICAqLwogQk9PTDMyIFdJTkFQSSBDaGFyVG9PZW0zMlcoIExQQ1dTVFIgcywgTFBTVFIgZCApCiB7CkBAIC01OTAsNyArNTkwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBPZW1Ub0NoYXIzMkEgICAoVVNFUjMyLjQwMSkKKyAqICAgICAgICAgICBPZW1Ub0NoYXIzMkEgICAoVVNFUjMyLjQwMikKICAqLwogQk9PTDMyIFdJTkFQSSBPZW1Ub0NoYXIzMkEoIExQQ1NUUiBzLCBMUFNUUiBkICkKIHsKQEAgLTYwMyw3ICs2MDMsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE9lbVRvQ2hhckJ1ZmYzMkEgICAoVVNFUjMyLjQwMikKKyAqICAgICAgICAgICBPZW1Ub0NoYXJCdWZmMzJBICAgKFVTRVIzMi40MDMpCiAgKi8KIEJPT0wzMiBXSU5BUEkgT2VtVG9DaGFyQnVmZjMyQSggTFBDU1RSIHMsIExQU1RSIGQsIERXT1JEIGxlbiApCiB7CkBAIC02MTQsNyArNjE0LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBPZW1Ub0NoYXJCdWZmMzJXICAgKFVTRVIzMi40MDMpCisgKiAgICAgICAgICAgT2VtVG9DaGFyQnVmZjMyVyAgIChVU0VSMzIuNDA0KQogICovCiBCT09MMzIgV0lOQVBJIE9lbVRvQ2hhckJ1ZmYzMlcoIExQQ1NUUiBzLCBMUFdTVFIgZCwgRFdPUkQgbGVuICkKIHsKQEAgLTYyNSw3ICs2MjUsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE9lbVRvQ2hhcjMyVyAgIChVU0VSMzIuNDA0KQorICogICAgICAgICAgIE9lbVRvQ2hhcjMyVyAgIChVU0VSMzIuNDA1KQogICovCiBCT09MMzIgV0lOQVBJIE9lbVRvQ2hhcjMyVyggTFBDU1RSIHMsIExQV1NUUiBkICkKIHsKZGlmZiAtLWdpdCBhL21lbW9yeS92aXJ0dWFsLmMgYi9tZW1vcnkvdmlydHVhbC5jCmluZGV4IGYxMjhjYzEuLmZhYzRlZTcgMTAwNjQ0Ci0tLSBhL21lbW9yeS92aXJ0dWFsLmMKKysrIGIvbWVtb3J5L3ZpcnR1YWwuYwpAQCAtODQsOSArODQsMTYgQEAKIAogc3RhdGljIEZJTEVfVklFVyAqVklSVFVBTF9GaXJzdFZpZXc7CiAKKyNpZmRlZiBfX2kzODZfX18KKy8qIFRoZXNlIGFyZSBhbHdheXMgdGhlIHNhbWUgb24gYW4gaTM4NiwgYW5kIGl0IHdpbGwgYmUgZmFzdGVyIHRoaXMgd2F5ICovCisjIGRlZmluZSBwYWdlX21hc2sgIDB4ZmZmCisjIGRlZmluZSBwYWdlX3NoaWZ0IDEyCisjIGRlZmluZSBncmFudWxhcml0eV9tYXNrIDB4ZmZmZgorI2Vsc2UKIHN0YXRpYyBVSU5UMzIgcGFnZV9zaGlmdDsKIHN0YXRpYyBVSU5UMzIgcGFnZV9tYXNrOwogc3RhdGljIFVJTlQzMiBncmFudWxhcml0eV9tYXNrOyAgLyogQWxsb2NhdGlvbiBncmFudWxhcml0eSAodXN1YWxseSA2NGspICovCisjZW5kaWYgIC8qIF9faTM4Nl9fICovCiAKICNkZWZpbmUgUk9VTkRfQUREUihhZGRyKSBcCiAgICAoKFVJTlQzMikoYWRkcikgJiB+cGFnZV9tYXNrKQpAQCAtNDE1LDE2ICs0MjIsMjUgQEAKICAqLwogQk9PTDMyIFZJUlRVQUxfSW5pdCh2b2lkKQogewotICAgIFNZU1RFTV9JTkZPIHN5c2luZm87Ci0gICAgR2V0U3lzdGVtSW5mbyggJnN5c2luZm8gKTsKKyNpZm5kZWYgX19pMzg2X18KKyAgICBEV09SRCBwYWdlX3NpemU7CiAKLSAgICBwYWdlX21hc2sgPSBzeXNpbmZvLmR3UGFnZVNpemUgLSAxOwotICAgIGdyYW51bGFyaXR5X21hc2sgPSBzeXNpbmZvLmR3QWxsb2NhdGlvbkdyYW51bGFyaXR5IC0gMTsKKyMgaWZkZWYgSEFWRV9HRVRQQUdFU0laRQorICAgIHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisjIGVsc2UKKyMgIGlmZGVmIF9fc3ZyNF9fCisgICAgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOworIyAgZWxzZQorIyAgIGVycm9yIENhbm5vdCBnZXQgdGhlIHBhZ2Ugc2l6ZSBvbiB0aGlzIHBsYXRmb3JtCisjICBlbmRpZgorIyBlbmRpZgorICAgIHBhZ2VfbWFzayA9IHBhZ2Vfc2l6ZSAtIDE7CisgICAgZ3JhbnVsYXJpdHlfbWFzayA9IDB4ZmZmZjsgIC8qIGhhcmQtY29kZWQgZm9yIG5vdyAqLwogICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgcG93ZXIgb2YgMiAqLwotICAgIGFzc2VydCggIShzeXNpbmZvLmR3UGFnZVNpemUgJiBwYWdlX21hc2spICk7Ci0gICAgYXNzZXJ0KCAhKHN5c2luZm8uZHdBbGxvY2F0aW9uR3JhbnVsYXJpdHkgJiBncmFudWxhcml0eV9tYXNrKSApOworICAgIGFzc2VydCggIShwYWdlX3NpemUgJiBwYWdlX21hc2spICk7CiAgICAgcGFnZV9zaGlmdCA9IDA7Ci0gICAgd2hpbGUgKCgxIDw8IHBhZ2Vfc2hpZnQpICE9IHN5c2luZm8uZHdQYWdlU2l6ZSkgcGFnZV9zaGlmdCsrOworICAgIHdoaWxlICgoMSA8PCBwYWdlX3NoaWZ0KSAhPSBwYWdlX3NpemUpIHBhZ2Vfc2hpZnQrKzsKKyNlbmRpZiAgLyogIV9faTM4Nl9fICovCiAKICNpZmRlZiBsaW51eAogICAgIHsKQEAgLTQ2OCw2ICs0ODQsMjQgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBWSVJUVUFMX0dldFBhZ2VTaXplCisgKi8KK0RXT1JEIFZJUlRVQUxfR2V0UGFnZVNpemUodm9pZCkKK3sKKyAgICByZXR1cm4gMSA8PCBwYWdlX3NoaWZ0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFZJUlRVQUxfR2V0R3JhbnVsYXJpdHkKKyAqLworRFdPUkQgVklSVFVBTF9HZXRHcmFudWxhcml0eSh2b2lkKQoreworICAgIHJldHVybiBncmFudWxhcml0eV9tYXNrICsgMTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIFZpcnR1YWxBbGxvYyAgIChLRVJORUwzMi41NDgpCiAgKiBSZXNlcnZlcyBvciBjb21taXRzIGEgcmVnaW9uIG9mIHBhZ2VzIGluIHZpcnR1YWwgYWRkcmVzcyBzcGFjZQogICoKQEAgLTEwMTMsMTUgKzEwNDcsMTYgQEAKICAqLwogSEFORExFMzIgV0lOQVBJIENyZWF0ZUZpbGVNYXBwaW5nMzJBKAogICAgICAgICAgICAgICAgIEhGSUxFMzIgaEZpbGUsICAgLyogW2luXSBIYW5kbGUgb2YgZmlsZSB0byBtYXAgKi8KLSAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgYXR0ciwgLyogW2luXSBPcHRpb25hbCBzZWN1cml0eSBhdHRyaWJ1dGVzICovCisgICAgICAgICAgICAgICAgU0VDVVJJVFlfQVRUUklCVVRFUyAqc2EsIC8qIFtpbl0gT3B0aW9uYWwgc2VjdXJpdHkgYXR0cmlidXRlcyovCiAgICAgICAgICAgICAgICAgRFdPUkQgcHJvdGVjdCwgICAvKiBbaW5dIFByb3RlY3Rpb24gZm9yIG1hcHBpbmcgb2JqZWN0ICovCiAgICAgICAgICAgICAgICAgRFdPUkQgc2l6ZV9oaWdoLCAvKiBbaW5dIEhpZ2gtb3JkZXIgMzIgYml0cyBvZiBvYmplY3Qgc2l6ZSAqLwogICAgICAgICAgICAgICAgIERXT1JEIHNpemVfbG93LCAgLyogW2luXSBMb3ctb3JkZXIgMzIgYml0cyBvZiBvYmplY3Qgc2l6ZSAqLwotICAgICAgICAgICAgICAgIExQQ1NUUiBuYW1lICAgICAgLyogW2luXSBOYW1lIG9mIGZpbGUtbWFwcGluZyBvYmplY3QgKi8KLSkgeworICAgICAgICAgICAgICAgIExQQ1NUUiBuYW1lICAgICAgLyogW2luXSBOYW1lIG9mIGZpbGUtbWFwcGluZyBvYmplY3QgKi8gKQorewogICAgIEZJTEVfTUFQUElORyAqbWFwcGluZyA9IE5VTEw7CiAgICAgSEFORExFMzIgaGFuZGxlOwogICAgIEJZVEUgdnByb3Q7CisgICAgQk9PTDMyIGluaGVyaXQgPSAoc2EgJiYgKHNhLT5uTGVuZ3RoPj1zaXplb2YoKnNhKSkgJiYgc2EtPmJJbmhlcml0SGFuZGxlKTsKIAogICAgIC8qIEZpcnN0IHNlYXJjaCBmb3IgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgbmFtZSAqLwogCkBAIC0xMDMxLDcgKzEwNjYsOCBAQAogICAgICAgICBpZiAob2JqLT50eXBlID09IEszMk9CSl9NRU1fTUFQUEVEX0ZJTEUpCiAgICAgICAgIHsKICAgICAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfQUxSRUFEWV9FWElTVFMgKTsKLSAgICAgICAgICAgIGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggb2JqLCBGSUxFX01BUF9BTExfQUNDRVNTIC8qRklYTUUqLywgRkFMU0UgKTsKKyAgICAgICAgICAgIGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggUFJPQ0VTU19DdXJyZW50KCksIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9NQVBfQUxMX0FDQ0VTUyAvKkZJWE1FKi8sIGluaGVyaXQgKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKQEAgLTEwNDUsNyArMTA4MSw3IEBACiAgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwogCiAgICAgVFJBQ0UodmlydHVhbCwiKCV4LCVwLCUwOGx4LCUwOGx4JTA4bHgsJXMpXG4iLAotICAgICAgICAgICAgICAgICAgICBoRmlsZSwgYXR0ciwgcHJvdGVjdCwgc2l6ZV9oaWdoLCBzaXplX2xvdywgbmFtZSApOworICAgICAgICAgIGhGaWxlLCBzYSwgcHJvdGVjdCwgc2l6ZV9oaWdoLCBzaXplX2xvdywgbmFtZSApOwogCiAgICAgdnByb3QgPSBWSVJUVUFMX0dldFByb3QoIHByb3RlY3QgKTsKICAgICBpZiAocHJvdGVjdCAmIFNFQ19SRVNFUlZFKQpAQCAtMTA4MCw3ICsxMTE2LDggQEAKICAgICAgICAgICAgICgocHJvdGVjdCAmIDB4ZmYpID09IFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUpIHx8CiAgICAgICAgICAgICAoKHByb3RlY3QgJiAweGZmKSA9PSBQQUdFX0VYRUNVVEVfV1JJVEVDT1BZKSkKICAgICAgICAgICAgICAgICBhY2Nlc3MgfD0gR0VORVJJQ19XUklURTsKLSAgICAgICAgaWYgKCEob2JqID0gSEFORExFX0dldE9ialB0ciggaEZpbGUsIEszMk9CSl9GSUxFLCBhY2Nlc3MgKSkpCisgICAgICAgIGlmICghKG9iaiA9IEhBTkRMRV9HZXRPYmpQdHIoIFBST0NFU1NfQ3VycmVudCgpLCBoRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX0ZJTEUsIGFjY2VzcyApKSkKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAKICAgICAgICAgaWYgKCFHZXRGaWxlSW5mb3JtYXRpb25CeUhhbmRsZSggaEZpbGUsICZpbmZvICkpIGdvdG8gZXJyb3I7CkBAIC0xMTExLDggKzExNDgsOCBAQAogICAgIG1hcHBpbmctPmZpbGUgICAgICAgICAgICA9IChGSUxFX09CSkVDVCAqKW9iajsKIAogICAgIGlmICghSzMyT0JKX0FkZE5hbWUoICZtYXBwaW5nLT5oZWFkZXIsIG5hbWUgKSkgaGFuZGxlID0gMDsKLSAgICBlbHNlIGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggJm1hcHBpbmctPmhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9NQVBfQUxMX0FDQ0VTUyAvKkZJWE1FKi8sIEZBTFNFICk7CisgICAgZWxzZSBoYW5kbGUgPSBIQU5ETEVfQWxsb2MoIFBST0NFU1NfQ3VycmVudCgpLCAmbWFwcGluZy0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX01BUF9BTExfQUNDRVNTIC8qRklYTUUqLywgaW5oZXJpdCApOwogICAgIEszMk9CSl9EZWNDb3VudCggJm1hcHBpbmctPmhlYWRlciApOwogICAgIHJldHVybiBoYW5kbGU7CiAKQEAgLTExNTcsNyArMTE5NCw3IEBACiAgICAgU1lTVEVNX0xPQ0soKTsKICAgICBpZiAoKG9iaiA9IEszMk9CSl9GaW5kTmFtZVR5cGUoIG5hbWUsIEszMk9CSl9NRU1fTUFQUEVEX0ZJTEUgKSkpCiAgICAgewotICAgICAgICBoYW5kbGUgPSBIQU5ETEVfQWxsb2MoIG9iaiwgYWNjZXNzLCBpbmhlcml0ICk7CisgICAgICAgIGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggUFJPQ0VTU19DdXJyZW50KCksIG9iaiwgYWNjZXNzLCBpbmhlcml0ICk7CiAgICAgICAgIEszMk9CSl9EZWNDb3VudCggb2JqICk7CiAgICAgfQogICAgIFNZU1RFTV9VTkxPQ0soKTsKQEAgLTEyNDQsNyArMTI4MSw4IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGlmICghKG1hcHBpbmcgPSAoRklMRV9NQVBQSU5HICopSEFORExFX0dldE9ialB0ciggaGFuZGxlLAorICAgIGlmICghKG1hcHBpbmcgPSAoRklMRV9NQVBQSU5HICopSEFORExFX0dldE9ialB0ciggUFJPQ0VTU19DdXJyZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLMzJPQkpfTUVNX01BUFBFRF9GSUxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRklYTUUgKi8gKSkpCiAgICAgICAgIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvbWlzYy9jb21tLmMgYi9taXNjL2NvbW0uYwppbmRleCAxZmIzNmM3Li4xNjlkNzMzIDEwMDY0NAotLS0gYS9taXNjL2NvbW0uYworKysgYi9taXNjL2NvbW0uYwpAQCAtMTYsNiArMTYsOCBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhd3Nvbl93aGl0bmV5QGp1bm8uY29tPgogICovCiAKKyNpbmNsdWRlICJjb25maWcuaCIKKwogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dGVybWlvcy5oPgpAQCAtMjQsOCArMjYsOCBAQAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2lmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgZGVmaW5lZChfX3N2cjRfXykKLSNpbmNsdWRlIDxzeXMvZmlsaW8uaD4KKyNpZmRlZiBIQVZFX1NZU19GSUxJT19ICisjIGluY2x1ZGUgPHN5cy9maWxpby5oPgogI2VuZGlmCiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CmRpZmYgLS1naXQgYS9taXNjL2NvbW1kbGcuYyBiL21pc2MvY29tbWRsZy5jCmluZGV4IDVlM2NhNTEuLmU3MTIyYTYgMTAwNjQ0Ci0tLSBhL21pc2MvY29tbWRsZy5jCisrKyBiL21pc2MvY29tbWRsZy5jCkBAIC0yNyw2ICsyNyw3IEBACiBzdGF0aWMgSEJJVE1BUDE2IGhIRGlzayA9IDA7CiBzdGF0aWMgSEJJVE1BUDE2IGhDRFJvbSA9IDA7CiBzdGF0aWMgSEJJVE1BUDE2IGhCaXRtYXBUVCA9IDA7CitzdGF0aWMgY29uc3QgY2hhciBkZWZhdWx0ZmlsdGVyW109IiBcMFwwIjsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJRmlsZURsZ19Jbml0CQkJW2ludGVybmFsXQpAQCAtMzYsMTEgKzM3LDExIEBACiAgICAgc3RhdGljIEJPT0wzMiBpbml0aWFsaXplZCA9IDA7CiAgICAgCiAgICAgaWYgKCFpbml0aWFsaXplZCkgewotCWlmICghaEZvbGRlcikgaEZvbGRlciA9IExvYWRCaXRtYXAxNigwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX0ZPTERFUikpOwotCWlmICghaEZvbGRlcjIpIGhGb2xkZXIyID0gTG9hZEJpdG1hcDE2KDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fRk9MREVSMikpOwotCWlmICghaEZsb3BweSkgaEZsb3BweSA9IExvYWRCaXRtYXAxNigwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX0ZMT1BQWSkpOwotCWlmICghaEhEaXNrKSBoSERpc2sgPSBMb2FkQml0bWFwMTYoMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9IRElTSykpOwotCWlmICghaENEUm9tKSBoQ0RSb20gPSBMb2FkQml0bWFwMTYoMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9DRFJPTSkpOworCWlmICghaEZvbGRlcikgaEZvbGRlciA9IExvYWRCaXRtYXAxNigwLCBNQUtFSU5UUkVTT1VSQ0UxNihPQk1fRk9MREVSKSk7CisJaWYgKCFoRm9sZGVyMikgaEZvbGRlcjIgPSBMb2FkQml0bWFwMTYoMCwgTUFLRUlOVFJFU09VUkNFMTYoT0JNX0ZPTERFUjIpKTsKKwlpZiAoIWhGbG9wcHkpIGhGbG9wcHkgPSBMb2FkQml0bWFwMTYoMCwgTUFLRUlOVFJFU09VUkNFMTYoT0JNX0ZMT1BQWSkpOworCWlmICghaEhEaXNrKSBoSERpc2sgPSBMb2FkQml0bWFwMTYoMCwgTUFLRUlOVFJFU09VUkNFMTYoT0JNX0hESVNLKSk7CisJaWYgKCFoQ0RSb20pIGhDRFJvbSA9IExvYWRCaXRtYXAxNigwLCBNQUtFSU5UUkVTT1VSQ0UxNihPQk1fQ0RST00pKTsKIAlpZiAoaEZvbGRlciA9PSAwIHx8IGhGb2xkZXIyID09IDAgfHwgaEZsb3BweSA9PSAwIHx8IAogCSAgICBoSERpc2sgPT0gMCB8fCBoQ0RSb20gPT0gMCkKIAl7CQpAQCAtNjMsNiArNjQsOCBAQAogICAgIEhXTkQzMiBod25kRGlhbG9nOwogICAgIExQT1BFTkZJTEVOQU1FMTYgbHBvZm4gPSAoTFBPUEVORklMRU5BTUUxNilQVFJfU0VHX1RPX0xJTihvZm4pOwogICAgIExQQ1ZPSUQgdGVtcGxhdGU7CisgICAgY2hhciBkZWZhdWx0b3BlbltdPSJPcGVuIEZpbGUiOworICAgIGNoYXIgKnN0cj0wLCpzdHIxPTA7CiAKICAgICBpZiAoIWxwb2ZuIHx8ICFGaWxlRGxnX0luaXQoKSkgcmV0dXJuIEZBTFNFOwogCkBAIC03OCw3ICs4MSw3IEBACiAJICAgIGVsc2UgaWYgKGxwb2ZuLT5GbGFncyAmIE9GTl9FTkFCTEVURU1QTEFURSkKIAkgICAgewogCQlpZiAoIShoUmVzSW5mbyA9IEZpbmRSZXNvdXJjZTMyQShscG9mbi0+aEluc3RhbmNlLAotCQkJCQkJUFRSX1NFR19UT19MSU4obHBvZm4tPmxwVGVtcGxhdGVOYW1lKSwgKExQU1RSKVJUX0RJQUxPRykpKQorCQkJCQkJUFRSX1NFR19UT19MSU4obHBvZm4tPmxwVGVtcGxhdGVOYW1lKSwgUlRfRElBTE9HMzJBKSkpCiAJCXsKIAkJICAgIENvbW1EbGdMYXN0RXJyb3IgPSBDREVSUl9GSU5EUkVTRkFJTFVSRTsKIAkJICAgIHJldHVybiBGQUxTRTsKQEAgLTEwNSw3ICsxMDgsOCBAQAogCSAgICBlbHNlIGlmIChscG9mbi0+RmxhZ3MgJiBPRk5fRU5BQkxFVEVNUExBVEUpCiAJICAgIHsKIAkJaWYgKCEoaFJlc0luZm8gPSBGaW5kUmVzb3VyY2UxNihscG9mbi0+aEluc3RhbmNlLAotCQkJCQkJbHBvZm4tPmxwVGVtcGxhdGVOYW1lLCBSVF9ESUFMT0cpKSkKKwkJCQkJCWxwb2ZuLT5scFRlbXBsYXRlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUX0RJQUxPRzE2KSkpCiAJCXsKIAkJICAgIENvbW1EbGdMYXN0RXJyb3IgPSBDREVSUl9GSU5EUkVTRkFJTFVSRTsKIAkJICAgIHJldHVybiBGQUxTRTsKQEAgLTEyMyw2ICsxMjcsMjMgQEAKICAgICB9CiAKICAgICBoSW5zdCA9IFdJTl9HZXRXaW5kb3dJbnN0YW5jZSggbHBvZm4tPmh3bmRPd25lciApOworCisgICAgaWYgKCEobHBvZm4tPmxwc3RyRmlsdGVyKSkKKyAgICAgIHsKKyAgICAgICBzdHIgPSBTRUdQVFJfQUxMT0Moc2l6ZW9mKGRlZmF1bHRmaWx0ZXIpKTsKKyAgICAgICBUUkFDRShjb21tZGxnLCJBbGxvYyAlcCBkZWZhdWx0IGZvciBGaWxldHlwZSBpbiBHZXRPcGVuRmlsZU5hbWVcbiIsc3RyKTsKKyAgICAgICBtZW1jcHkoc3RyLGRlZmF1bHRmaWx0ZXIsc2l6ZW9mKGRlZmF1bHRmaWx0ZXIpKTsKKyAgICAgICBscG9mbi0+bHBzdHJGaWx0ZXI9U0VHUFRSX0dFVChzdHIpOworICAgICAgfQorCisgICAgaWYgKCEobHBvZm4tPmxwc3RyVGl0bGUpKQorICAgICAgeworICAgICAgIHN0cjEgPSBTRUdQVFJfQUxMT0Moc3RybGVuKGRlZmF1bHRvcGVuKSsxKTsKKyAgICAgICBUUkFDRShjb21tZGxnLCJBbGxvYyAlcCBkZWZhdWx0IGZvciBUaXRsZSBpbiBHZXRPcGVuRmlsZU5hbWVcbiIsc3RyMSk7CisgICAgICAgc3RyY3B5KHN0cjEsZGVmYXVsdG9wZW4pOworICAgICAgIGxwb2ZuLT5scHN0clRpdGxlPVNFR1BUUl9HRVQoc3RyMSk7CisgICAgICB9CisKICAgICAvKiBGSVhNRTogZG9lc24ndCBoYW5kbGUgd2luMzIgZm9ybWF0IGNvcnJlY3RseSB5ZXQgKi8KICAgICBod25kRGlhbG9nID0gRElBTE9HX0NyZWF0ZUluZGlyZWN0KCBoSW5zdCwgdGVtcGxhdGUsIHdpbjMyRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwb2ZuLT5od25kT3duZXIsCkBAIC0xMzAsNiArMTUxLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZuLCBXSU5fUFJPQ18xNiApOwogICAgIGlmIChod25kRGlhbG9nKSBiUmV0ID0gRElBTE9HX0RvRGlhbG9nQm94KCBod25kRGlhbG9nLCBscG9mbi0+aHduZE93bmVyICk7CiAKKyAgICBpZiAoc3RyMSkKKyAgICAgIHsKKyAgICAgICBUUkFDRShjb21tZGxnLCJGcmVlaW5nICVwIGRlZmF1bHQgZm9yIFRpdGxlIGluIEdldE9wZW5GaWxlTmFtZVxuIixzdHIxKTsKKyAgICAgICAgU0VHUFRSX0ZSRUUoc3RyMSk7CisgICAgICAgbHBvZm4tPmxwc3RyVGl0bGU9MDsKKyAgICAgIH0KKworICAgIGlmIChzdHIpCisgICAgICB7CisgICAgICAgVFJBQ0UoY29tbWRsZywiRnJlZWluZyAlcCBkZWZhdWx0IGZvciBGaWxldHlwZSBpbiBHZXRPcGVuRmlsZU5hbWVcbiIsc3RyKTsKKyAgICAgICAgU0VHUFRSX0ZSRUUoc3RyKTsKKyAgICAgICBscG9mbi0+bHBzdHJGaWx0ZXI9MDsKKyAgICAgIH0KKwogICAgIGlmIChoRGxnVG1wbCkgewogCSAgICBpZiAobHBvZm4tPkZsYWdzICYgT0ZOX1dJTkUzMikKIAkJICAgIEZyZWVSZXNvdXJjZTMyKCBoRGxnVG1wbCApOwpAQCAtMTU0LDYgKzE4OSw4IEBACiAgICAgTFBPUEVORklMRU5BTUUxNiBscG9mbiA9IChMUE9QRU5GSUxFTkFNRTE2KVBUUl9TRUdfVE9fTElOKG9mbik7CiAgICAgTFBDVk9JRCB0ZW1wbGF0ZTsKICAgICBIV05EMzIgaHduZERpYWxvZzsKKyAgICBjaGFyIGRlZmF1bHRzYXZlW109IlNhdmUgYXMiOworICAgIGNoYXIgKnN0ciA9MCwqc3RyMT0wOwogCiAgICAgaWYgKCFscG9mbiB8fCAhRmlsZURsZ19Jbml0KCkpIHJldHVybiBGQUxTRTsKIApAQCAtMTcwLDcgKzIwNyw4IEBACiAJICAgIHsKIAkJSEFORExFMzIgaFJlc0luZm87CiAJCWlmICghKGhSZXNJbmZvID0gRmluZFJlc291cmNlMzJBKGxwb2ZuLT5oSW5zdGFuY2UsCi0JCQkJCQkgUFRSX1NFR19UT19MSU4obHBvZm4tPmxwVGVtcGxhdGVOYW1lKSwgKExQU1RSKVJUX0RJQUxPRykpKQorCQkJCQkJIFBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scFRlbXBsYXRlTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRfRElBTE9HMzJBKSkpCiAJCXsKIAkJICAgIENvbW1EbGdMYXN0RXJyb3IgPSBDREVSUl9GSU5EUkVTRkFJTFVSRTsKIAkJICAgIHJldHVybiBGQUxTRTsKQEAgLTE5OSw3ICsyMzcsOCBAQAogCSAgICB7CiAJCUhBTkRMRTE2IGhSZXNJbmZvOwogCQlpZiAoIShoUmVzSW5mbyA9IEZpbmRSZXNvdXJjZTE2KGxwb2ZuLT5oSW5zdGFuY2UsCi0JCQkJCQlscG9mbi0+bHBUZW1wbGF0ZU5hbWUsIFJUX0RJQUxPRykpKQorCQkJCQkJbHBvZm4tPmxwVGVtcGxhdGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRfRElBTE9HMTYpKSkKIAkJewogCQkgICAgQ29tbURsZ0xhc3RFcnJvciA9IENERVJSX0ZJTkRSRVNGQUlMVVJFOwogCQkgICAgcmV0dXJuIEZBTFNFOwpAQCAtMjE4LDEyICsyNTcsNDIgQEAKIAogICAgIGhJbnN0ID0gV0lOX0dldFdpbmRvd0luc3RhbmNlKCBscG9mbi0+aHduZE93bmVyICk7CiAKKyAgICBpZiAoIShscG9mbi0+bHBzdHJGaWx0ZXIpKQorICAgICAgeworICAgICAgIHN0ciA9IFNFR1BUUl9BTExPQyhzaXplb2YoZGVmYXVsdGZpbHRlcikpOworICAgICAgIFRSQUNFKGNvbW1kbGcsIkFsbG9jIGRlZmF1bHQgZm9yIEZpbGV0eXBlIGluIEdldFNhdmVGaWxlTmFtZVxuIik7CisgICAgICAgbWVtY3B5KHN0cixkZWZhdWx0ZmlsdGVyLHNpemVvZihkZWZhdWx0ZmlsdGVyKSk7CisgICAgICAgbHBvZm4tPmxwc3RyRmlsdGVyPVNFR1BUUl9HRVQoc3RyKTsKKyAgICAgIH0KKworICAgIGlmICghKGxwb2ZuLT5scHN0clRpdGxlKSkKKyAgICAgIHsKKyAgICAgICBzdHIxID0gU0VHUFRSX0FMTE9DKHNpemVvZihkZWZhdWx0c2F2ZSkrMSk7CisgICAgICAgVFJBQ0UoY29tbWRsZywiQWxsb2MgZGVmYXVsdCBmb3IgVGl0bGUgaW4gR2V0U2F2ZUZpbGVOYW1lXG4iKTsKKyAgICAgICBzdHJjcHkoc3RyMSxkZWZhdWx0c2F2ZSk7CisgICAgICAgbHBvZm4tPmxwc3RyVGl0bGU9U0VHUFRSX0dFVChzdHIxKTsKKyAgICAgIH0KKwogICAgIGh3bmREaWFsb2cgPSBESUFMT0dfQ3JlYXRlSW5kaXJlY3QoIGhJbnN0LCB0ZW1wbGF0ZSwgd2luMzJGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBvZm4tPmh3bmRPd25lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRExHUFJPQzE2KU1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNigiRmlsZVNhdmVEbGdQcm9jIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZuLCBXSU5fUFJPQ18xNiApOwogICAgIGlmIChod25kRGlhbG9nKSBiUmV0ID0gRElBTE9HX0RvRGlhbG9nQm94KCBod25kRGlhbG9nLCBscG9mbi0+aHduZE93bmVyICk7CiAKKyAgICBpZiAoc3RyMSkKKyAgICAgIHsKKyAgICAgICBUUkFDRShjb21tZGxnLCJGcmVlaW5nICVwIGRlZmF1bHQgZm9yIFRpdGxlIGluIEdldFNhdmVGaWxlTmFtZVxuIixzdHIxKTsKKyAgICAgICAgU0VHUFRSX0ZSRUUoc3RyMSk7CisgICAgICAgbHBvZm4tPmxwc3RyVGl0bGU9MDsKKyAgICAgIH0KKyAKKyAgICBpZiAoc3RyKQorICAgICAgeworICAgICAgIFRSQUNFKGNvbW1kbGcsIkZyZWVpbmcgJXAgZGVmYXVsdCBmb3IgRmlsZXR5cGUgaW4gR2V0U2F2ZUZpbGVOYW1lXG4iLHN0cik7CisgICAgICAgIFNFR1BUUl9GUkVFKHN0cik7CisgICAgICAgbHBvZm4tPmxwc3RyRmlsdGVyPTA7CisgICAgICB9CisgICAgCiAgICAgaWYgKGhEbGdUbXBsKSB7CiAJICAgIGlmIChscG9mbi0+RmxhZ3MgJiBPRk5fV0lORTMyKQogCQkgICAgRnJlZVJlc291cmNlMzIoIGhEbGdUbXBsICk7CkBAIC01NjEsNiArNjMwLDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFRExHX1dNQ29tbWFuZCAgICAgICAgICAgICAgIFtpbnRlcm5hbF0KICAqLworQk9PTDMyIGluX2xzdDE9RkFMU0U7CitCT09MMzIgaW5fdXBkYXRlPUZBTFNFOworCiBzdGF0aWMgTFJFU1VMVCBGSUxFRExHX1dNQ29tbWFuZChIV05EMTYgaFduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKSAKIHsKICAgTE9ORyBsUmV0OwpAQCAtNTgwLDcgKzY1MiwxMCBAQAogICAgIGNhc2UgbHN0MTogLyogZmlsZSBsaXN0ICovCiAgICAgICBGSUxFRExHX1N0cmlwRWRpdENvbnRyb2woaFduZCk7CiAgICAgICBpZiAobm90aWZpY2F0aW9uID09IExCTl9EQkxDTEspCisJeworCSAgaW5fbHN0MT1UUlVFOwogCWdvdG8gYWxtb3N0X29rOworCX0KICAgICAgIGxSZXQgPSBTZW5kRGxnSXRlbU1lc3NhZ2UxNihoV25kLCBsc3QxLCBMQl9HRVRDVVJTRUwxNiwgMCwgMCk7CiAgICAgICBpZiAobFJldCA9PSBMQl9FUlIpIHJldHVybiBUUlVFOwogICAgICAgaWYgKChwc3RyID0gU0VHUFRSX0FMTE9DKDUxMikpKQpAQCAtNjIzLDYgKzY5OCwxMCBAQAogCSAgZ290byByZXNldF9zY2FuOwogCX0KICAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgY2h4MToKKyAgICAgIHJldHVybiBUUlVFOworICAgIGNhc2UgcHNoSGVscDoKKyAgICAgIHJldHVybiBUUlVFOwogICAgIGNhc2UgY21iMjogLyogZGlzayBkcm9wIGxpc3QgKi8KICAgICAgIEZJTEVETEdfU3RyaXBFZGl0Q29udHJvbChoV25kKTsKICAgICAgIGxSZXQgPSBTZW5kRGxnSXRlbU1lc3NhZ2UxNihoV25kLCBjbWIyLCBDQl9HRVRDVVJTRUwxNiwgMCwgMEwpOwpAQCAtNjQwLDExICs3MTksNyBAQAogICAgICAgVFJBQ0UoY29tbWRsZywiU2VsZWN0ZWQgZmlsdGVyIDogJXNcbiIsIHBzdHIpOwogICAgICAgU2V0RGxnSXRlbVRleHQzMkEoIGhXbmQsIGVkdDEsIHBzdHIgKTsKICAgICAgIEZJTEVETEdfU2NhbkRpcihoV25kLCB0bXBzdHIpOwotICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgY2FzZSBjaHgxOgotICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgY2FzZSBwc2hIZWxwOgotICAgICAgcmV0dXJuIFRSVUU7CisgICAgICBpbl91cGRhdGU9VFJVRTsKICAgICBjYXNlIElET0s6CiAgICAgYWxtb3N0X29rOgogICAgICAgb2ZuMj0qbHBvZm47IC8qIGZvciBsYXRlciByZXN0b3JpbmcgKi8KQEAgLTY4NCw4ICs3NTksMTIgQEAKIAkJCQkgUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RyRmlsdGVyKSwKIAkJCQkgbFJldCksIHNpemVvZih0bXBzdHIyKSk7CiAgICAgICBTZXREbGdJdGVtVGV4dDMyQSggaFduZCwgZWR0MSwgdG1wc3RyMiApOworICAgICAgaWYgKGluX2xzdDEpCisJewogICAgICAgLyogaWYgU2NhbkRpciBzdWNjZWVkcywgd2UgaGF2ZSBjaGFuZ2VkIHRoZSBkaXJlY3RvcnkgKi8KKwkgIGluX2xzdDEgPSBGQUxTRTsKICAgICAgIGlmIChGSUxFRExHX1NjYW5EaXIoaFduZCwgdG1wc3RyKSkgcmV0dXJuIFRSVUU7CisJfQogICAgICAgLyogaWYgbm90LCB0aGlzIG11c3QgYmUgYSBmaWxlbmFtZSAqLwogICAgICAgKnBzdHIyID0gMDsKICAgICAgIGlmIChwc3RyICE9IE5VTEwpCkBAIC03MTEsOSArNzkwLDEzIEBACiAJaWYgKHN0cmxlbih0bXBzdHIyKSA+IDMpCiAJICAgc3RyY2F0KHRtcHN0cjIsICJcXCIpOwogCXN0cm5jYXQodG1wc3RyMiwgdG1wc3RyLCA1MTEtc3RybGVuKHRtcHN0cjIpKTsgdG1wc3RyMls1MTFdPTA7Ci0Jc3RyY3B5KFBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckZpbGUpLCB0bXBzdHIyKTsKKwlpZiAobHBvZm4tPmxwc3RyRmlsZSkKKwkgIHsKKwkgICAgc3RybmNweShQVFJfU0VHX1RPX0xJTihscG9mbi0+bHBzdHJGaWxlKSwgdG1wc3RyMixscG9mbi0+bk1heEZpbGUtMSk7CisJICAgICooKExQU1RSKVBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckZpbGUpK2xwb2ZuLT5uTWF4RmlsZSkgPSdcMCc7CiAgICAgICB9Ci0gICAgICBscG9mbi0+bkZpbGVPZmZzZXQgPSAwOworICAgICAgfQorICAgICAgbHBvZm4tPm5GaWxlT2Zmc2V0ID0gc3RycmNocih0bXBzdHIyLCdcXCcpIC0gdG1wc3RyMiArMTsKICAgICAgIGxwb2ZuLT5uRmlsZUV4dGVuc2lvbiA9IDA7CiAgICAgICB3aGlsZSh0bXBzdHIyW2xwb2ZuLT5uRmlsZUV4dGVuc2lvbl0gIT0gJy4nICYmIHRtcHN0cjJbbHBvZm4tPm5GaWxlRXh0ZW5zaW9uXSAhPSAnXDAnKQogICAgICAgICBscG9mbi0+bkZpbGVFeHRlbnNpb24rKzsKQEAgLTcyMSw2ICs4MDQsMTcgQEAKIAlscG9mbi0+bkZpbGVFeHRlbnNpb24gPSAwOwogICAgICAgZWxzZQogCWxwb2ZuLT5uRmlsZUV4dGVuc2lvbisrOworCisgICAgICBpZihpbl91cGRhdGUpCisgICAgICAgeworICAgICAgICAgaWYgKEZJTEVETEdfSG9va0NhbGxDaGsobHBvZm4pKQorICAgICAgICAgICBGSUxFRExHX0NhbGxXaW5kb3dQcm9jKGxwb2ZuLGhXbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMzJBKCBMQlNFTENIU1RSSU5HICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCwgTUFLRUxPTkcobFJldCxDRF9MQlNFTENIQU5HRSkpOworCisgICAgICAgICBpbl91cGRhdGUgPSBGQUxTRTsKKyAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgIH0KICAgICAgIGlmIChQVFJfU0VHX1RPX0xJTihscG9mbi0+bHBzdHJGaWxlVGl0bGUpICE9IE5VTEwpIAogCXsKIAkgIGxSZXQgPSBTZW5kRGxnSXRlbU1lc3NhZ2UxNihoV25kLCBsc3QxLCBMQl9HRVRDVVJTRUwxNiwgMCwgMCk7CkBAIC04NDMsMTMgKzkzNywxMyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEZpbmRUZXh0RGxnICAgKENPTU1ETEcuMTEpCisgKiAgICAgICAgICAgRmluZFRleHQxNiAgIChDT01NRExHLjExKQogICovCi1IV05EMTYgV0lOQVBJIEZpbmRUZXh0KCBTRUdQVFIgZmluZCApCitIV05EMTYgV0lOQVBJIEZpbmRUZXh0MTYoIFNFR1BUUiBmaW5kICkKIHsKICAgICBIQU5ETEUxNiBoSW5zdDsKICAgICBMUENWT0lEIHB0cjsKLSAgICBMUEZJTkRSRVBMQUNFIGxwRmluZCA9IChMUEZJTkRSRVBMQUNFKVBUUl9TRUdfVE9fTElOKGZpbmQpOworICAgIExQRklORFJFUExBQ0UxNiBscEZpbmQgPSAoTFBGSU5EUkVQTEFDRTE2KVBUUl9TRUdfVE9fTElOKGZpbmQpOwogCiAgICAgLyoKICAgICAgKiBGSVhNRSA6IFNob3VsZCByZXNwb25kIHRvIEZSX0VOQUJMRVRFTVBMQVRFIGFuZCBGUl9FTkFCTEVIT09LIGhlcmUKQEAgLTg2NiwxNSArOTYwLDU4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZCwgV0lOX1BST0NfMTYgKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBSZXBsYWNlVGV4dCAgIChDT01NRExHLjEyKQorICogICAgICAgICAgIEZpbmRUZXh0MzJBICAgKENPTU1ETEcuNikKICAqLwotSFdORDE2IFdJTkFQSSBSZXBsYWNlVGV4dCggU0VHUFRSIGZpbmQgKQorSFdORDMyIFdJTkFQSSBGaW5kVGV4dDMyQSggTFBGSU5EUkVQTEFDRTMyQSBscEZpbmQgKQogewogICAgIEhBTkRMRTE2IGhJbnN0OwogICAgIExQQ1ZPSUQgcHRyOwotICAgIExQRklORFJFUExBQ0UgbHBGaW5kID0gKExQRklORFJFUExBQ0UpUFRSX1NFR19UT19MSU4oZmluZCk7CisKKyAgICAvKgorICAgICAqIEZJWE1FIDogU2hvdWxkIHJlc3BvbmQgdG8gRlJfRU5BQkxFVEVNUExBVEUgYW5kIEZSX0VOQUJMRUhPT0sgaGVyZQorICAgICAqIEZvciBub3csIG9ubHkgdGhlIHN0YW5kYXJkIGRpYWxvZyB3b3Jrcy4KKyAgICAgKi8KKyAgICAvKgorICAgICAqIEZJWE1FIDogV2Ugc2hvdWxkIGRvIGVycm9yIGNoZWNraW5nIG9uIHRoZSBscEZpbmQgc3RydWN0dXJlIGhlcmUKKyAgICAgKiBhbmQgbWFrZSBDb21tRGxnRXh0ZW5kZWRFcnJvcigpIHJldHVybiB0aGUgZXJyb3IgY29uZGl0aW9uLgorICAgICAqLworICAgIHB0ciA9IFNZU1JFU19HZXRSZXNQdHIoIFNZU1JFU19ESUFMT0dfRklORF9URVhUICk7CisgICAgaEluc3QgPSBXSU5fR2V0V2luZG93SW5zdGFuY2UoIGxwRmluZC0+aHduZE93bmVyICk7CisgICAgcmV0dXJuIERJQUxPR19DcmVhdGVJbmRpcmVjdCggaEluc3QsIHB0ciwgVFJVRSwgbHBGaW5kLT5od25kT3duZXIsCisgICAgICAgICAgICAgICAgKERMR1BST0MxNilGaW5kVGV4dERsZ1Byb2MzMkEsIChMUEFSQU0pbHBGaW5kLCBXSU5fUFJPQ18zMkEgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRmluZFRleHQzMlcgICAoQ09NTURMRy43KQorICovCitIV05EMzIgV0lOQVBJIEZpbmRUZXh0MzJXKCBMUEZJTkRSRVBMQUNFMzJXIGxwRmluZCApCit7CisgICAgSEFORExFMTYgaEluc3Q7CisgICAgTFBDVk9JRCBwdHI7CisKKyAgICAvKgorICAgICAqIEZJWE1FIDogU2hvdWxkIHJlc3BvbmQgdG8gRlJfRU5BQkxFVEVNUExBVEUgYW5kIEZSX0VOQUJMRUhPT0sgaGVyZQorICAgICAqIEZvciBub3csIG9ubHkgdGhlIHN0YW5kYXJkIGRpYWxvZyB3b3Jrcy4KKyAgICAgKi8KKyAgICAvKgorICAgICAqIEZJWE1FIDogV2Ugc2hvdWxkIGRvIGVycm9yIGNoZWNraW5nIG9uIHRoZSBscEZpbmQgc3RydWN0dXJlIGhlcmUKKyAgICAgKiBhbmQgbWFrZSBDb21tRGxnRXh0ZW5kZWRFcnJvcigpIHJldHVybiB0aGUgZXJyb3IgY29uZGl0aW9uLgorICAgICAqLworICAgIHB0ciA9IFNZU1JFU19HZXRSZXNQdHIoIFNZU1JFU19ESUFMT0dfRklORF9URVhUICk7CisgICAgaEluc3QgPSBXSU5fR2V0V2luZG93SW5zdGFuY2UoIGxwRmluZC0+aHduZE93bmVyICk7CisgICAgcmV0dXJuIERJQUxPR19DcmVhdGVJbmRpcmVjdCggaEluc3QsIHB0ciwgVFJVRSwgbHBGaW5kLT5od25kT3duZXIsCisgICAgICAgICAgICAgICAgKERMR1BST0MxNilGaW5kVGV4dERsZ1Byb2MzMlcsIChMUEFSQU0pbHBGaW5kLCBXSU5fUFJPQ18zMlcgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUmVwbGFjZVRleHQxNiAgIChDT01NRExHLjEyKQorICovCitIV05EMTYgV0lOQVBJIFJlcGxhY2VUZXh0MTYoIFNFR1BUUiBmaW5kICkKK3sKKyAgICBIQU5ETEUxNiBoSW5zdDsKKyAgICBMUENWT0lEIHB0cjsKKyAgICBMUEZJTkRSRVBMQUNFMTYgbHBGaW5kID0gKExQRklORFJFUExBQ0UxNilQVFJfU0VHX1RPX0xJTihmaW5kKTsKIAogICAgIC8qCiAgICAgICogRklYTUUgOiBTaG91bGQgcmVzcG9uZCB0byBGUl9FTkFCTEVURU1QTEFURSBhbmQgRlJfRU5BQkxFSE9PSyBoZXJlCkBAIC04OTEsNDQgKzEwMjgsODcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kLCBXSU5fUFJPQ18xNiApOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBSZXBsYWNlVGV4dDMyQSAgIChDT01ETEczMi4xOSkKKyAqLworSFdORDMyIFdJTkFQSSBSZXBsYWNlVGV4dDMyQSggTFBGSU5EUkVQTEFDRTMyQSBscEZpbmQgKQoreworICAgIEhBTkRMRTE2IGhJbnN0OworICAgIExQQ1ZPSUQgcHRyOworCisgICAgLyoKKyAgICAgKiBGSVhNRSA6IFNob3VsZCByZXNwb25kIHRvIEZSX0VOQUJMRVRFTVBMQVRFIGFuZCBGUl9FTkFCTEVIT09LIGhlcmUKKyAgICAgKiBGb3Igbm93LCBvbmx5IHRoZSBzdGFuZGFyZCBkaWFsb2cgd29ya3MuCisgICAgICovCisgICAgLyoKKyAgICAgKiBGSVhNRSA6IFdlIHNob3VsZCBkbyBlcnJvciBjaGVja2luZyBvbiB0aGUgbHBGaW5kIHN0cnVjdHVyZSBoZXJlCisgICAgICogYW5kIG1ha2UgQ29tbURsZ0V4dGVuZGVkRXJyb3IoKSByZXR1cm4gdGhlIGVycm9yIGNvbmRpdGlvbi4KKyAgICAgKi8KKyAgICBwdHIgPSBTWVNSRVNfR2V0UmVzUHRyKCBTWVNSRVNfRElBTE9HX1JFUExBQ0VfVEVYVCApOworICAgIGhJbnN0ID0gV0lOX0dldFdpbmRvd0luc3RhbmNlKCBscEZpbmQtPmh3bmRPd25lciApOworICAgIHJldHVybiBESUFMT0dfQ3JlYXRlSW5kaXJlY3QoIGhJbnN0LCBwdHIsIFRSVUUsIGxwRmluZC0+aHduZE93bmVyLAorCQkoRExHUFJPQzE2KVJlcGxhY2VUZXh0RGxnUHJvYzMyQSwgKExQQVJBTSlscEZpbmQsIFdJTl9QUk9DXzMyQSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBSZXBsYWNlVGV4dDMyVyAgIChDT01ETEczMi4yMCkKKyAqLworSFdORDMyIFdJTkFQSSBSZXBsYWNlVGV4dDMyVyggTFBGSU5EUkVQTEFDRTMyVyBscEZpbmQgKQoreworICAgIEhBTkRMRTE2IGhJbnN0OworICAgIExQQ1ZPSUQgcHRyOworCisgICAgLyoKKyAgICAgKiBGSVhNRSA6IFNob3VsZCByZXNwb25kIHRvIEZSX0VOQUJMRVRFTVBMQVRFIGFuZCBGUl9FTkFCTEVIT09LIGhlcmUKKyAgICAgKiBGb3Igbm93LCBvbmx5IHRoZSBzdGFuZGFyZCBkaWFsb2cgd29ya3MuCisgICAgICovCisgICAgLyoKKyAgICAgKiBGSVhNRSA6IFdlIHNob3VsZCBkbyBlcnJvciBjaGVja2luZyBvbiB0aGUgbHBGaW5kIHN0cnVjdHVyZSBoZXJlCisgICAgICogYW5kIG1ha2UgQ29tbURsZ0V4dGVuZGVkRXJyb3IoKSByZXR1cm4gdGhlIGVycm9yIGNvbmRpdGlvbi4KKyAgICAgKi8KKyAgICBwdHIgPSBTWVNSRVNfR2V0UmVzUHRyKCBTWVNSRVNfRElBTE9HX1JFUExBQ0VfVEVYVCApOworICAgIGhJbnN0ID0gV0lOX0dldFdpbmRvd0luc3RhbmNlKCBscEZpbmQtPmh3bmRPd25lciApOworICAgIHJldHVybiBESUFMT0dfQ3JlYXRlSW5kaXJlY3QoIGhJbnN0LCBwdHIsIFRSVUUsIGxwRmluZC0+aHduZE93bmVyLAorCQkoRExHUFJPQzE2KVJlcGxhY2VUZXh0RGxnUHJvYzMyVywgKExQQVJBTSlscEZpbmQsIFdJTl9QUk9DXzMyVyApOworfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSU5ERExHX1dNSW5pdERpYWxvZyAgICAgICAgICAgIFtpbnRlcm5hbF0KICAqLwotc3RhdGljIExSRVNVTFQgRklORERMR19XTUluaXREaWFsb2coSFdORDE2IGhXbmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3N0YXRpYyBMUkVTVUxUIEZJTkRETEdfV01Jbml0RGlhbG9nKEhXTkQzMiBoV25kLCBMUEFSQU0gbFBhcmFtLCBMUERXT1JEIGxwRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBscHN0ckZpbmRXaGF0LCBCT09MMzIgZlVuaWNvZGUpCiB7Ci0gICAgTFBGSU5EUkVQTEFDRSBscGZyOwotCiAgICAgU2V0V2luZG93TG9uZzMyQShoV25kLCBEV0xfVVNFUiwgbFBhcmFtKTsKLSAgICBscGZyID0gKExQRklORFJFUExBQ0UpUFRSX1NFR19UT19MSU4obFBhcmFtKTsKLSAgICBscGZyLT5GbGFncyAmPSB+KEZSX0ZJTkRORVhUIHwgRlJfUkVQTEFDRSB8IEZSX1JFUExBQ0VBTEwgfCBGUl9ESUFMT0dURVJNKTsKKyAgICAqbHBGbGFncyAmPSB+KEZSX0ZJTkRORVhUIHwgRlJfUkVQTEFDRSB8IEZSX1JFUExBQ0VBTEwgfCBGUl9ESUFMT0dURVJNKTsKICAgICAvKgogICAgICAqIEZJWE1FIDogSWYgdGhlIGluaXRpYWwgRmluZFdoYXQgc3RyaW5nIGlzIGVtcHR5LCB3ZSBzaG91bGQgZGlzYWJsZSB0aGUKICAgICAgKiBGaW5kTmV4dCAoSURPSykgYnV0dG9uLiAgT25seSBhZnRlciB0eXBpbmcgc29tZSB0ZXh0LCB0aGUgYnV0dG9uIHNob3VsZCBiZQogICAgICAqIGVuYWJsZWQuCiAgICAgICovCi0gICAgU2V0RGxnSXRlbVRleHQxNihoV25kLCBlZHQxLCBscGZyLT5scHN0ckZpbmRXaGF0KTsKLSAgICBDaGVja1JhZGlvQnV0dG9uMzIoaFduZCwgcmFkMSwgcmFkMiwgKGxwZnItPkZsYWdzICYgRlJfRE9XTikgPyByYWQyIDogcmFkMSk7Ci0gICAgaWYgKGxwZnItPkZsYWdzICYgKEZSX0hJREVVUERPV04gfCBGUl9OT1VQRE9XTikpIHsKKyAgICBpZiAoZlVuaWNvZGUpIFNldERsZ0l0ZW1UZXh0MzJXKGhXbmQsIGVkdDEsIChMUFdTVFIpbHBzdHJGaW5kV2hhdCk7CisJZWxzZSBTZXREbGdJdGVtVGV4dDMyQShoV25kLCBlZHQxLCBscHN0ckZpbmRXaGF0KTsKKyAgICBDaGVja1JhZGlvQnV0dG9uMzIoaFduZCwgcmFkMSwgcmFkMiwgKCpscEZsYWdzICYgRlJfRE9XTikgPyByYWQyIDogcmFkMSk7CisgICAgaWYgKCpscEZsYWdzICYgKEZSX0hJREVVUERPV04gfCBGUl9OT1VQRE9XTikpIHsKIAlFbmFibGVXaW5kb3czMihHZXREbGdJdGVtMzIoaFduZCwgcmFkMSksIEZBTFNFKTsKIAlFbmFibGVXaW5kb3czMihHZXREbGdJdGVtMzIoaFduZCwgcmFkMiksIEZBTFNFKTsKICAgICB9Ci0gICAgaWYgKGxwZnItPkZsYWdzICYgRlJfSElERVVQRE9XTikgeworICAgIGlmICgqbHBGbGFncyAmIEZSX0hJREVVUERPV04pIHsKIAlTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIHJhZDEpLCBTV19ISURFKTsKIAlTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIHJhZDIpLCBTV19ISURFKTsKIAlTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIGdycDEpLCBTV19ISURFKTsKICAgICB9Ci0gICAgQ2hlY2tEbGdCdXR0b24zMihoV25kLCBjaHgxLCAobHBmci0+RmxhZ3MgJiBGUl9XSE9MRVdPUkQpID8gMSA6IDApOwotICAgIGlmIChscGZyLT5GbGFncyAmIChGUl9ISURFV0hPTEVXT1JEIHwgRlJfTk9XSE9MRVdPUkQpKQorICAgIENoZWNrRGxnQnV0dG9uMzIoaFduZCwgY2h4MSwgKCpscEZsYWdzICYgRlJfV0hPTEVXT1JEKSA/IDEgOiAwKTsKKyAgICBpZiAoKmxwRmxhZ3MgJiAoRlJfSElERVdIT0xFV09SRCB8IEZSX05PV0hPTEVXT1JEKSkKIAlFbmFibGVXaW5kb3czMihHZXREbGdJdGVtMzIoaFduZCwgY2h4MSksIEZBTFNFKTsKLSAgICBpZiAobHBmci0+RmxhZ3MgJiBGUl9ISURFV0hPTEVXT1JEKQorICAgIGlmICgqbHBGbGFncyAmIEZSX0hJREVXSE9MRVdPUkQpCiAJU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihoV25kLCBjaHgxKSwgU1dfSElERSk7Ci0gICAgQ2hlY2tEbGdCdXR0b24zMihoV25kLCBjaHgyLCAobHBmci0+RmxhZ3MgJiBGUl9NQVRDSENBU0UpID8gMSA6IDApOwotICAgIGlmIChscGZyLT5GbGFncyAmIChGUl9ISURFTUFUQ0hDQVNFIHwgRlJfTk9NQVRDSENBU0UpKQorICAgIENoZWNrRGxnQnV0dG9uMzIoaFduZCwgY2h4MiwgKCpscEZsYWdzICYgRlJfTUFUQ0hDQVNFKSA/IDEgOiAwKTsKKyAgICBpZiAoKmxwRmxhZ3MgJiAoRlJfSElERU1BVENIQ0FTRSB8IEZSX05PTUFUQ0hDQVNFKSkKIAlFbmFibGVXaW5kb3czMihHZXREbGdJdGVtMzIoaFduZCwgY2h4MiksIEZBTFNFKTsKLSAgICBpZiAobHBmci0+RmxhZ3MgJiBGUl9ISURFTUFUQ0hDQVNFKQorICAgIGlmICgqbHBGbGFncyAmIEZSX0hJREVNQVRDSENBU0UpCiAJU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihoV25kLCBjaHgyKSwgU1dfSElERSk7Ci0gICAgaWYgKCEobHBmci0+RmxhZ3MgJiBGUl9TSE9XSEVMUCkpIHsKKyAgICBpZiAoISgqbHBGbGFncyAmIEZSX1NIT1dIRUxQKSkgewogCUVuYWJsZVdpbmRvdzMyKEdldERsZ0l0ZW0zMihoV25kLCBwc2hIZWxwKSwgRkFMU0UpOwogCVNob3dXaW5kb3czMihHZXREbGdJdGVtMzIoaFduZCwgcHNoSGVscCksIFNXX0hJREUpOwogICAgIH0KQEAgLTk0MCw0MCArMTEyMCw0MyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTkRETEdfV01Db21tYW5kICAgICAgICAgICAgICAgW2ludGVybmFsXQogICovCi1zdGF0aWMgTFJFU1VMVCBGSU5ERExHX1dNQ29tbWFuZChIV05EMTYgaFduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorc3RhdGljIExSRVNVTFQgRklORERMR19XTUNvbW1hbmQoSFdORDMyIGhXbmQsIFdQQVJBTTMyIHdQYXJhbSwgCisJCQlIV05EMzIgaHduZE93bmVyLCBMUERXT1JEIGxwRmxhZ3MsCisJCQlMUFNUUiBscHN0ckZpbmRXaGF0LCBXT1JEIHdGaW5kV2hhdExlbiwgCisJCQlCT09MMzIgZlVuaWNvZGUpCiB7Ci0gICAgTFBGSU5EUkVQTEFDRSBscGZyOwogICAgIGludCB1RmluZFJlcGxhY2VNZXNzYWdlID0gUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMzJBKCBGSU5ETVNHU1RSSU5HICk7CiAgICAgaW50IHVIZWxwTWVzc2FnZSA9IFJlZ2lzdGVyV2luZG93TWVzc2FnZTMyQSggSEVMUE1TR1NUUklORyApOwogCi0gICAgbHBmciA9IChMUEZJTkRSRVBMQUNFKVBUUl9TRUdfVE9fTElOKEdldFdpbmRvd0xvbmczMkEoaFduZCwgRFdMX1VTRVIpKTsKICAgICBzd2l0Y2ggKHdQYXJhbSkgewogCWNhc2UgSURPSzoKLQkgICAgR2V0RGxnSXRlbVRleHQxNihoV25kLCBlZHQxLCBscGZyLT5scHN0ckZpbmRXaGF0LCBscGZyLT53RmluZFdoYXRMZW4pOworCSAgICBpZiAoZlVuaWNvZGUpIAorCSAgICAgIEdldERsZ0l0ZW1UZXh0MzJXKGhXbmQsIGVkdDEsIChMUFdTVFIpbHBzdHJGaW5kV2hhdCwgd0ZpbmRXaGF0TGVuLzIpOworCSAgICAgIGVsc2UgR2V0RGxnSXRlbVRleHQzMkEoaFduZCwgZWR0MSwgbHBzdHJGaW5kV2hhdCwgd0ZpbmRXaGF0TGVuKTsKIAkgICAgaWYgKElzRGxnQnV0dG9uQ2hlY2tlZDMyKGhXbmQsIHJhZDIpKQotCQlscGZyLT5GbGFncyB8PSBGUl9ET1dOOwotCQllbHNlIGxwZnItPkZsYWdzICY9IH5GUl9ET1dOOworCQkqbHBGbGFncyB8PSBGUl9ET1dOOworCQllbHNlICpscEZsYWdzICY9IH5GUl9ET1dOOwogCSAgICBpZiAoSXNEbGdCdXR0b25DaGVja2VkMzIoaFduZCwgY2h4MSkpCi0JCWxwZnItPkZsYWdzIHw9IEZSX1dIT0xFV09SRDsgCi0JCWVsc2UgbHBmci0+RmxhZ3MgJj0gfkZSX1dIT0xFV09SRDsKKwkJKmxwRmxhZ3MgfD0gRlJfV0hPTEVXT1JEOyAKKwkJZWxzZSAqbHBGbGFncyAmPSB+RlJfV0hPTEVXT1JEOwogCSAgICBpZiAoSXNEbGdCdXR0b25DaGVja2VkMzIoaFduZCwgY2h4MikpCi0JCWxwZnItPkZsYWdzIHw9IEZSX01BVENIQ0FTRTsgCi0JCWVsc2UgbHBmci0+RmxhZ3MgJj0gfkZSX01BVENIQ0FTRTsKLSAgICAgICAgICAgIGxwZnItPkZsYWdzICY9IH4oRlJfUkVQTEFDRSB8IEZSX1JFUExBQ0VBTEwgfCBGUl9ESUFMT0dURVJNKTsKLQkgICAgbHBmci0+RmxhZ3MgfD0gRlJfRklORE5FWFQ7Ci0JICAgIFNlbmRNZXNzYWdlMTYobHBmci0+aHduZE93bmVyLCB1RmluZFJlcGxhY2VNZXNzYWdlLCAwLAorCQkqbHBGbGFncyB8PSBGUl9NQVRDSENBU0U7IAorCQllbHNlICpscEZsYWdzICY9IH5GUl9NQVRDSENBU0U7CisgICAgICAgICAgICAqbHBGbGFncyAmPSB+KEZSX1JFUExBQ0UgfCBGUl9SRVBMQUNFQUxMIHwgRlJfRElBTE9HVEVSTSk7CisJICAgICpscEZsYWdzIHw9IEZSX0ZJTkRORVhUOworCSAgICBTZW5kTWVzc2FnZTMyQShod25kT3duZXIsIHVGaW5kUmVwbGFjZU1lc3NhZ2UsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFdpbmRvd0xvbmczMkEoaFduZCwgRFdMX1VTRVIpICk7CiAJICAgIHJldHVybiBUUlVFOwogCWNhc2UgSURDQU5DRUw6Ci0gICAgICAgICAgICBscGZyLT5GbGFncyAmPSB+KEZSX0ZJTkRORVhUIHwgRlJfUkVQTEFDRSB8IEZSX1JFUExBQ0VBTEwpOwotCSAgICBscGZyLT5GbGFncyB8PSBGUl9ESUFMT0dURVJNOwotCSAgICBTZW5kTWVzc2FnZTE2KGxwZnItPmh3bmRPd25lciwgdUZpbmRSZXBsYWNlTWVzc2FnZSwgMCwKKyAgICAgICAgICAgICpscEZsYWdzICY9IH4oRlJfRklORE5FWFQgfCBGUl9SRVBMQUNFIHwgRlJfUkVQTEFDRUFMTCk7CisJICAgICpscEZsYWdzIHw9IEZSX0RJQUxPR1RFUk07CisJICAgIFNlbmRNZXNzYWdlMzJBKGh3bmRPd25lciwgdUZpbmRSZXBsYWNlTWVzc2FnZSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V2luZG93TG9uZzMyQShoV25kLCBEV0xfVVNFUikgKTsKLQkgICAgRGVzdHJveVdpbmRvdzE2KGhXbmQpOworCSAgICBEZXN0cm95V2luZG93MzIoaFduZCk7CiAJICAgIHJldHVybiBUUlVFOwogCWNhc2UgcHNoSGVscDoKIAkgICAgLyogRklYTUUgOiBzaG91bGQgbHBmciBzdHJ1Y3R1cmUgYmUgcGFzc2VkIGFzIGFuIGFyZ3VtZW50ID8/PyAqLwotCSAgICBTZW5kTWVzc2FnZTE2KGxwZnItPmh3bmRPd25lciwgdUhlbHBNZXNzYWdlLCAwLCAwKTsKKwkgICAgU2VuZE1lc3NhZ2UzMkEoaHduZE93bmVyLCB1SGVscE1lc3NhZ2UsIDAsIDApOwogCSAgICByZXR1cm4gVFJVRTsKICAgICB9CiAgICAgcmV0dXJuIEZBTFNFOwpAQCAtOTgxLDE2ICsxMTY0LDY0IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRmluZFRleHREbGdQcm9jICAgKENPTU1ETEcuMTMpCisgKiAgICAgICAgICAgRmluZFRleHREbGdQcm9jMTYgICAoQ09NTURMRy4xMykKICAqLwotTFJFU1VMVCBXSU5BUEkgRmluZFRleHREbGdQcm9jKEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywgV1BBUkFNMTYgd1BhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0pCitMUkVTVUxUIFdJTkFQSSBGaW5kVGV4dERsZ1Byb2MxNihIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csIFdQQVJBTTE2IHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0pCiB7CisgICAgTFBGSU5EUkVQTEFDRTE2IGxwZnI7CiAgICAgc3dpdGNoICh3TXNnKSB7CiAJY2FzZSBXTV9JTklURElBTE9HOgotCSAgICByZXR1cm4gRklORERMR19XTUluaXREaWFsb2coaFduZCwgd1BhcmFtLCBsUGFyYW0pOworICAgICAgICAgICAgbHBmcj0oTFBGSU5EUkVQTEFDRTE2KVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CisJICAgIHJldHVybiBGSU5ERExHX1dNSW5pdERpYWxvZyhoV25kLCBsUGFyYW0sICYobHBmci0+RmxhZ3MpLAorCQlQVFJfU0VHX1RPX0xJTihscGZyLT5scHN0ckZpbmRXaGF0KSwgRkFMU0UpOwogCWNhc2UgV01fQ09NTUFORDoKLQkgICAgcmV0dXJuIEZJTkRETEdfV01Db21tYW5kKGhXbmQsIHdQYXJhbSwgbFBhcmFtKTsKKwkgICAgbHBmcj0oTFBGSU5EUkVQTEFDRTE2KVBUUl9TRUdfVE9fTElOKEdldFdpbmRvd0xvbmczMkEoaFduZCwgRFdMX1VTRVIpKTsKKwkgICAgcmV0dXJuIEZJTkRETEdfV01Db21tYW5kKGhXbmQsIHdQYXJhbSwgbHBmci0+aHduZE93bmVyLAorCQkmbHBmci0+RmxhZ3MsIFBUUl9TRUdfVE9fTElOKGxwZnItPmxwc3RyRmluZFdoYXQpLAorCQlscGZyLT53RmluZFdoYXRMZW4sIEZBTFNFKTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBGaW5kVGV4dERsZ1Byb2MzMkEKKyAqLworTFJFU1VMVCBXSU5BUEkgRmluZFRleHREbGdQcm9jMzJBKEhXTkQzMiBoV25kLCBVSU5UMzIgd01zZywgV1BBUkFNMzIgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBMUEZJTkRSRVBMQUNFMzJBIGxwZnI7CisgICAgc3dpdGNoICh3TXNnKSB7CisJY2FzZSBXTV9JTklURElBTE9HOgorCSAgICBscGZyPShMUEZJTkRSRVBMQUNFMzJBKWxQYXJhbTsKKwkgICAgcmV0dXJuIEZJTkRETEdfV01Jbml0RGlhbG9nKGhXbmQsIGxQYXJhbSwgJihscGZyLT5GbGFncyksCisJICAgICAgbHBmci0+bHBzdHJGaW5kV2hhdCwgRkFMU0UpOworCWNhc2UgV01fQ09NTUFORDoKKwkgICAgbHBmcj0oTFBGSU5EUkVQTEFDRTMyQSlHZXRXaW5kb3dMb25nMzJBKGhXbmQsIERXTF9VU0VSKTsKKwkgICAgcmV0dXJuIEZJTkRETEdfV01Db21tYW5kKGhXbmQsIHdQYXJhbSwgbHBmci0+aHduZE93bmVyLAorCQkmbHBmci0+RmxhZ3MsIGxwZnItPmxwc3RyRmluZFdoYXQsIGxwZnItPndGaW5kV2hhdExlbiwKKwkJRkFMU0UpOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEZpbmRUZXh0RGxnUHJvYzMyVworICovCitMUkVTVUxUIFdJTkFQSSBGaW5kVGV4dERsZ1Byb2MzMlcoSFdORDMyIGhXbmQsIFVJTlQzMiB3TXNnLCBXUEFSQU0zMiB3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtKQoreworICAgIExQRklORFJFUExBQ0UzMlcgbHBmcjsKKyAgICBzd2l0Y2ggKHdNc2cpIHsKKwljYXNlIFdNX0lOSVRESUFMT0c6CisJICAgIGxwZnI9KExQRklORFJFUExBQ0UzMlcpbFBhcmFtOworCSAgICByZXR1cm4gRklORERMR19XTUluaXREaWFsb2coaFduZCwgbFBhcmFtLCAmKGxwZnItPkZsYWdzKSwKKwkgICAgICAoTFBTVFIpbHBmci0+bHBzdHJGaW5kV2hhdCwgVFJVRSk7CisJY2FzZSBXTV9DT01NQU5EOgorCSAgICBscGZyPShMUEZJTkRSRVBMQUNFMzJXKUdldFdpbmRvd0xvbmczMkEoaFduZCwgRFdMX1VTRVIpOworCSAgICByZXR1cm4gRklORERMR19XTUNvbW1hbmQoaFduZCwgd1BhcmFtLCBscGZyLT5od25kT3duZXIsCisJCSZscGZyLT5GbGFncywgKExQU1RSKWxwZnItPmxwc3RyRmluZFdoYXQsIGxwZnItPndGaW5kV2hhdExlbiwKKwkJVFJVRSk7CiAgICAgfQogICAgIHJldHVybiBGQUxTRTsKIH0KQEAgLTk5OSwzMSArMTIzMCwzNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUExBQ0VETEdfV01Jbml0RGlhbG9nICAgICAgICAgW2ludGVybmFsXQogICovCi1zdGF0aWMgTFJFU1VMVCBSRVBMQUNFRExHX1dNSW5pdERpYWxvZyhIV05EMTYgaFduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorc3RhdGljIExSRVNVTFQgUkVQTEFDRURMR19XTUluaXREaWFsb2coSFdORDMyIGhXbmQsIExQQVJBTSBsUGFyYW0sCisJCSAgICBMUERXT1JEIGxwRmxhZ3MsIExQU1RSIGxwc3RyRmluZFdoYXQsIAorCQkgICAgTFBTVFIgbHBzdHJSZXBsYWNlV2l0aCwgQk9PTDMyIGZVbmljb2RlKQogewotICAgIExQRklORFJFUExBQ0UgbHBmcjsKLQogICAgIFNldFdpbmRvd0xvbmczMkEoaFduZCwgRFdMX1VTRVIsIGxQYXJhbSk7Ci0gICAgbHBmciA9IChMUEZJTkRSRVBMQUNFKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7Ci0gICAgbHBmci0+RmxhZ3MgJj0gfihGUl9GSU5ETkVYVCB8IEZSX1JFUExBQ0UgfCBGUl9SRVBMQUNFQUxMIHwgRlJfRElBTE9HVEVSTSk7CisgICAgKmxwRmxhZ3MgJj0gfihGUl9GSU5ETkVYVCB8IEZSX1JFUExBQ0UgfCBGUl9SRVBMQUNFQUxMIHwgRlJfRElBTE9HVEVSTSk7CiAgICAgLyoKICAgICAgKiBGSVhNRSA6IElmIHRoZSBpbml0aWFsIEZpbmRXaGF0IHN0cmluZyBpcyBlbXB0eSwgd2Ugc2hvdWxkIGRpc2FibGUgdGhlIEZpbk5leHQgLwogICAgICAqIFJlcGxhY2UgLyBSZXBsYWNlQWxsIGJ1dHRvbnMuICBPbmx5IGFmdGVyIHR5cGluZyBzb21lIHRleHQsIHRoZSBidXR0b25zIHNob3VsZCBiZQogICAgICAqIGVuYWJsZWQuCiAgICAgICovCi0gICAgU2V0RGxnSXRlbVRleHQxNihoV25kLCBlZHQxLCBscGZyLT5scHN0ckZpbmRXaGF0KTsKLSAgICBTZXREbGdJdGVtVGV4dDE2KGhXbmQsIGVkdDIsIGxwZnItPmxwc3RyUmVwbGFjZVdpdGgpOwotICAgIENoZWNrRGxnQnV0dG9uMzIoaFduZCwgY2h4MSwgKGxwZnItPkZsYWdzICYgRlJfV0hPTEVXT1JEKSA/IDEgOiAwKTsKLSAgICBpZiAobHBmci0+RmxhZ3MgJiAoRlJfSElERVdIT0xFV09SRCB8IEZSX05PV0hPTEVXT1JEKSkKKyAgICBpZiAoZlVuaWNvZGUpICAgICAKKyAgICB7CisJU2V0RGxnSXRlbVRleHQzMlcoaFduZCwgZWR0MSwgKExQV1NUUilscHN0ckZpbmRXaGF0KTsKKwlTZXREbGdJdGVtVGV4dDMyVyhoV25kLCBlZHQyLCAoTFBXU1RSKWxwc3RyUmVwbGFjZVdpdGgpOworICAgIH0gZWxzZQorICAgIHsKKwlTZXREbGdJdGVtVGV4dDMyQShoV25kLCBlZHQxLCBscHN0ckZpbmRXaGF0KTsKKwlTZXREbGdJdGVtVGV4dDMyQShoV25kLCBlZHQyLCBscHN0clJlcGxhY2VXaXRoKTsKKyAgICB9CisgICAgQ2hlY2tEbGdCdXR0b24zMihoV25kLCBjaHgxLCAoKmxwRmxhZ3MgJiBGUl9XSE9MRVdPUkQpID8gMSA6IDApOworICAgIGlmICgqbHBGbGFncyAmIChGUl9ISURFV0hPTEVXT1JEIHwgRlJfTk9XSE9MRVdPUkQpKQogCUVuYWJsZVdpbmRvdzMyKEdldERsZ0l0ZW0zMihoV25kLCBjaHgxKSwgRkFMU0UpOwotICAgIGlmIChscGZyLT5GbGFncyAmIEZSX0hJREVXSE9MRVdPUkQpCisgICAgaWYgKCpscEZsYWdzICYgRlJfSElERVdIT0xFV09SRCkKIAlTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIGNoeDEpLCBTV19ISURFKTsKLSAgICBDaGVja0RsZ0J1dHRvbjMyKGhXbmQsIGNoeDIsIChscGZyLT5GbGFncyAmIEZSX01BVENIQ0FTRSkgPyAxIDogMCk7Ci0gICAgaWYgKGxwZnItPkZsYWdzICYgKEZSX0hJREVNQVRDSENBU0UgfCBGUl9OT01BVENIQ0FTRSkpCisgICAgQ2hlY2tEbGdCdXR0b24zMihoV25kLCBjaHgyLCAoKmxwRmxhZ3MgJiBGUl9NQVRDSENBU0UpID8gMSA6IDApOworICAgIGlmICgqbHBGbGFncyAmIChGUl9ISURFTUFUQ0hDQVNFIHwgRlJfTk9NQVRDSENBU0UpKQogCUVuYWJsZVdpbmRvdzMyKEdldERsZ0l0ZW0zMihoV25kLCBjaHgyKSwgRkFMU0UpOwotICAgIGlmIChscGZyLT5GbGFncyAmIEZSX0hJREVNQVRDSENBU0UpCisgICAgaWYgKCpscEZsYWdzICYgRlJfSElERU1BVENIQ0FTRSkKIAlTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIGNoeDIpLCBTV19ISURFKTsKLSAgICBpZiAoIShscGZyLT5GbGFncyAmIEZSX1NIT1dIRUxQKSkgeworICAgIGlmICghKCpscEZsYWdzICYgRlJfU0hPV0hFTFApKSB7CiAJRW5hYmxlV2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIHBzaEhlbHApLCBGQUxTRSk7CiAJU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihoV25kLCBwc2hIZWxwKSwgU1dfSElERSk7CiAgICAgfQpAQCAtMTAzNSw2NiArMTI3Miw4OSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUExBQ0VETEdfV01Db21tYW5kICAgICAgICAgICAgW2ludGVybmFsXQogICovCi1zdGF0aWMgTFJFU1VMVCBSRVBMQUNFRExHX1dNQ29tbWFuZChIV05EMTYgaFduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorc3RhdGljIExSRVNVTFQgUkVQTEFDRURMR19XTUNvbW1hbmQoSFdORDMyIGhXbmQsIFdQQVJBTTE2IHdQYXJhbSwKKwkJICAgIEhXTkQzMiBod25kT3duZXIsIExQRFdPUkQgbHBGbGFncywKKwkJICAgIExQU1RSIGxwc3RyRmluZFdoYXQsIFdPUkQgd0ZpbmRXaGF0TGVuLAorCQkgICAgTFBTVFIgbHBzdHJSZXBsYWNlV2l0aCwgV09SRCB3UmVwbGFjZVdpdGhMZW4sCisJCSAgICBCT09MMzIgZlVuaWNvZGUpCiB7Ci0gICAgTFBGSU5EUkVQTEFDRSBscGZyOwogICAgIGludCB1RmluZFJlcGxhY2VNZXNzYWdlID0gUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMzJBKCBGSU5ETVNHU1RSSU5HICk7CiAgICAgaW50IHVIZWxwTWVzc2FnZSA9IFJlZ2lzdGVyV2luZG93TWVzc2FnZTMyQSggSEVMUE1TR1NUUklORyApOwogCi0gICAgbHBmciA9IChMUEZJTkRSRVBMQUNFKVBUUl9TRUdfVE9fTElOKEdldFdpbmRvd0xvbmczMkEoaFduZCwgRFdMX1VTRVIpKTsKICAgICBzd2l0Y2ggKHdQYXJhbSkgewogCWNhc2UgSURPSzoKLQkgICAgR2V0RGxnSXRlbVRleHQxNihoV25kLCBlZHQxLCBscGZyLT5scHN0ckZpbmRXaGF0LCBscGZyLT53RmluZFdoYXRMZW4pOwotCSAgICBHZXREbGdJdGVtVGV4dDE2KGhXbmQsIGVkdDIsIGxwZnItPmxwc3RyUmVwbGFjZVdpdGgsIGxwZnItPndSZXBsYWNlV2l0aExlbik7CisJICAgIGlmIChmVW5pY29kZSkKKwkgICAgeworCQlHZXREbGdJdGVtVGV4dDMyVyhoV25kLCBlZHQxLCAoTFBXU1RSKWxwc3RyRmluZFdoYXQsIHdGaW5kV2hhdExlbi8yKTsKKwkJR2V0RGxnSXRlbVRleHQzMlcoaFduZCwgZWR0MiwgKExQV1NUUilscHN0clJlcGxhY2VXaXRoLCB3UmVwbGFjZVdpdGhMZW4vMik7CisJICAgIH0gIGVsc2UKKwkgICAgeworCQlHZXREbGdJdGVtVGV4dDMyQShoV25kLCBlZHQxLCBscHN0ckZpbmRXaGF0LCB3RmluZFdoYXRMZW4pOworCQlHZXREbGdJdGVtVGV4dDMyQShoV25kLCBlZHQyLCBscHN0clJlcGxhY2VXaXRoLCB3UmVwbGFjZVdpdGhMZW4pOworCSAgICB9CiAJICAgIGlmIChJc0RsZ0J1dHRvbkNoZWNrZWQzMihoV25kLCBjaHgxKSkKLQkJbHBmci0+RmxhZ3MgfD0gRlJfV0hPTEVXT1JEOyAKLQkJZWxzZSBscGZyLT5GbGFncyAmPSB+RlJfV0hPTEVXT1JEOworCQkqbHBGbGFncyB8PSBGUl9XSE9MRVdPUkQ7IAorCQllbHNlICpscEZsYWdzICY9IH5GUl9XSE9MRVdPUkQ7CiAJICAgIGlmIChJc0RsZ0J1dHRvbkNoZWNrZWQzMihoV25kLCBjaHgyKSkKLQkJbHBmci0+RmxhZ3MgfD0gRlJfTUFUQ0hDQVNFOyAKLQkJZWxzZSBscGZyLT5GbGFncyAmPSB+RlJfTUFUQ0hDQVNFOwotICAgICAgICAgICAgbHBmci0+RmxhZ3MgJj0gfihGUl9SRVBMQUNFIHwgRlJfUkVQTEFDRUFMTCB8IEZSX0RJQUxPR1RFUk0pOwotCSAgICBscGZyLT5GbGFncyB8PSBGUl9GSU5ETkVYVDsKLQkgICAgU2VuZE1lc3NhZ2UxNihscGZyLT5od25kT3duZXIsIHVGaW5kUmVwbGFjZU1lc3NhZ2UsIDAsCisJCSpscEZsYWdzIHw9IEZSX01BVENIQ0FTRTsgCisJCWVsc2UgKmxwRmxhZ3MgJj0gfkZSX01BVENIQ0FTRTsKKyAgICAgICAgICAgICpscEZsYWdzICY9IH4oRlJfUkVQTEFDRSB8IEZSX1JFUExBQ0VBTEwgfCBGUl9ESUFMT0dURVJNKTsKKwkgICAgKmxwRmxhZ3MgfD0gRlJfRklORE5FWFQ7CisJICAgIFNlbmRNZXNzYWdlMzJBKGh3bmRPd25lciwgdUZpbmRSZXBsYWNlTWVzc2FnZSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V2luZG93TG9uZzMyQShoV25kLCBEV0xfVVNFUikgKTsKIAkgICAgcmV0dXJuIFRSVUU7CiAJY2FzZSBJRENBTkNFTDoKLSAgICAgICAgICAgIGxwZnItPkZsYWdzICY9IH4oRlJfRklORE5FWFQgfCBGUl9SRVBMQUNFIHwgRlJfUkVQTEFDRUFMTCk7Ci0JICAgIGxwZnItPkZsYWdzIHw9IEZSX0RJQUxPR1RFUk07Ci0JICAgIFNlbmRNZXNzYWdlMTYobHBmci0+aHduZE93bmVyLCB1RmluZFJlcGxhY2VNZXNzYWdlLCAwLAorICAgICAgICAgICAgKmxwRmxhZ3MgJj0gfihGUl9GSU5ETkVYVCB8IEZSX1JFUExBQ0UgfCBGUl9SRVBMQUNFQUxMKTsKKwkgICAgKmxwRmxhZ3MgfD0gRlJfRElBTE9HVEVSTTsKKwkgICAgU2VuZE1lc3NhZ2UzMkEoaHduZE93bmVyLCB1RmluZFJlcGxhY2VNZXNzYWdlLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXaW5kb3dMb25nMzJBKGhXbmQsIERXTF9VU0VSKSApOwotCSAgICBEZXN0cm95V2luZG93MTYoaFduZCk7CisJICAgIERlc3Ryb3lXaW5kb3czMihoV25kKTsKIAkgICAgcmV0dXJuIFRSVUU7CiAJY2FzZSBwc2gxOgotCSAgICBHZXREbGdJdGVtVGV4dDE2KGhXbmQsIGVkdDEsIGxwZnItPmxwc3RyRmluZFdoYXQsIGxwZnItPndGaW5kV2hhdExlbik7Ci0JICAgIEdldERsZ0l0ZW1UZXh0MTYoaFduZCwgZWR0MiwgbHBmci0+bHBzdHJSZXBsYWNlV2l0aCwgbHBmci0+d1JlcGxhY2VXaXRoTGVuKTsKKwkgICAgaWYgKGZVbmljb2RlKQorCSAgICB7CisJCUdldERsZ0l0ZW1UZXh0MzJXKGhXbmQsIGVkdDEsIChMUFdTVFIpbHBzdHJGaW5kV2hhdCwgd0ZpbmRXaGF0TGVuLzIpOworCQlHZXREbGdJdGVtVGV4dDMyVyhoV25kLCBlZHQyLCAoTFBXU1RSKWxwc3RyUmVwbGFjZVdpdGgsIHdSZXBsYWNlV2l0aExlbi8yKTsKKwkgICAgfSAgZWxzZQorCSAgICB7CQorCQlHZXREbGdJdGVtVGV4dDMyQShoV25kLCBlZHQxLCBscHN0ckZpbmRXaGF0LCB3RmluZFdoYXRMZW4pOworCQlHZXREbGdJdGVtVGV4dDMyQShoV25kLCBlZHQyLCBscHN0clJlcGxhY2VXaXRoLCB3UmVwbGFjZVdpdGhMZW4pOworCSAgICB9CiAJICAgIGlmIChJc0RsZ0J1dHRvbkNoZWNrZWQzMihoV25kLCBjaHgxKSkKLQkJbHBmci0+RmxhZ3MgfD0gRlJfV0hPTEVXT1JEOyAKLQkJZWxzZSBscGZyLT5GbGFncyAmPSB+RlJfV0hPTEVXT1JEOworCQkqbHBGbGFncyB8PSBGUl9XSE9MRVdPUkQ7IAorCQllbHNlICpscEZsYWdzICY9IH5GUl9XSE9MRVdPUkQ7CiAJICAgIGlmIChJc0RsZ0J1dHRvbkNoZWNrZWQzMihoV25kLCBjaHgyKSkKLQkJbHBmci0+RmxhZ3MgfD0gRlJfTUFUQ0hDQVNFOyAKLQkJZWxzZSBscGZyLT5GbGFncyAmPSB+RlJfTUFUQ0hDQVNFOwotICAgICAgICAgICAgbHBmci0+RmxhZ3MgJj0gfihGUl9GSU5ETkVYVCB8IEZSX1JFUExBQ0VBTEwgfCBGUl9ESUFMT0dURVJNKTsKLQkgICAgbHBmci0+RmxhZ3MgfD0gRlJfUkVQTEFDRTsKLQkgICAgU2VuZE1lc3NhZ2UxNihscGZyLT5od25kT3duZXIsIHVGaW5kUmVwbGFjZU1lc3NhZ2UsIDAsCisJCSpscEZsYWdzIHw9IEZSX01BVENIQ0FTRTsgCisJCWVsc2UgKmxwRmxhZ3MgJj0gfkZSX01BVENIQ0FTRTsKKyAgICAgICAgICAgICpscEZsYWdzICY9IH4oRlJfRklORE5FWFQgfCBGUl9SRVBMQUNFQUxMIHwgRlJfRElBTE9HVEVSTSk7CisJICAgICpscEZsYWdzIHw9IEZSX1JFUExBQ0U7CisJICAgIFNlbmRNZXNzYWdlMzJBKGh3bmRPd25lciwgdUZpbmRSZXBsYWNlTWVzc2FnZSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V2luZG93TG9uZzMyQShoV25kLCBEV0xfVVNFUikgKTsKIAkgICAgcmV0dXJuIFRSVUU7CiAJY2FzZSBwc2gyOgotCSAgICBHZXREbGdJdGVtVGV4dDE2KGhXbmQsIGVkdDEsIGxwZnItPmxwc3RyRmluZFdoYXQsIGxwZnItPndGaW5kV2hhdExlbik7Ci0JICAgIEdldERsZ0l0ZW1UZXh0MTYoaFduZCwgZWR0MiwgbHBmci0+bHBzdHJSZXBsYWNlV2l0aCwgbHBmci0+d1JlcGxhY2VXaXRoTGVuKTsKKwkgICAgaWYgKGZVbmljb2RlKQorCSAgICB7CisJCUdldERsZ0l0ZW1UZXh0MzJXKGhXbmQsIGVkdDEsIChMUFdTVFIpbHBzdHJGaW5kV2hhdCwgd0ZpbmRXaGF0TGVuLzIpOworCQlHZXREbGdJdGVtVGV4dDMyVyhoV25kLCBlZHQyLCAoTFBXU1RSKWxwc3RyUmVwbGFjZVdpdGgsIHdSZXBsYWNlV2l0aExlbi8yKTsKKwkgICAgfSAgZWxzZQorCSAgICB7CisJCUdldERsZ0l0ZW1UZXh0MzJBKGhXbmQsIGVkdDEsIGxwc3RyRmluZFdoYXQsIHdGaW5kV2hhdExlbik7CisJCUdldERsZ0l0ZW1UZXh0MzJBKGhXbmQsIGVkdDIsIGxwc3RyUmVwbGFjZVdpdGgsIHdSZXBsYWNlV2l0aExlbik7CisJICAgIH0KIAkgICAgaWYgKElzRGxnQnV0dG9uQ2hlY2tlZDMyKGhXbmQsIGNoeDEpKQotCQlscGZyLT5GbGFncyB8PSBGUl9XSE9MRVdPUkQ7IAotCQllbHNlIGxwZnItPkZsYWdzICY9IH5GUl9XSE9MRVdPUkQ7CisJCSpscEZsYWdzIHw9IEZSX1dIT0xFV09SRDsgCisJCWVsc2UgKmxwRmxhZ3MgJj0gfkZSX1dIT0xFV09SRDsKIAkgICAgaWYgKElzRGxnQnV0dG9uQ2hlY2tlZDMyKGhXbmQsIGNoeDIpKQotCQlscGZyLT5GbGFncyB8PSBGUl9NQVRDSENBU0U7IAotCQllbHNlIGxwZnItPkZsYWdzICY9IH5GUl9NQVRDSENBU0U7Ci0gICAgICAgICAgICBscGZyLT5GbGFncyAmPSB+KEZSX0ZJTkRORVhUIHwgRlJfUkVQTEFDRSB8IEZSX0RJQUxPR1RFUk0pOwotCSAgICBscGZyLT5GbGFncyB8PSBGUl9SRVBMQUNFQUxMOwotCSAgICBTZW5kTWVzc2FnZTE2KGxwZnItPmh3bmRPd25lciwgdUZpbmRSZXBsYWNlTWVzc2FnZSwgMCwKKwkJKmxwRmxhZ3MgfD0gRlJfTUFUQ0hDQVNFOyAKKwkJZWxzZSAqbHBGbGFncyAmPSB+RlJfTUFUQ0hDQVNFOworICAgICAgICAgICAgKmxwRmxhZ3MgJj0gfihGUl9GSU5ETkVYVCB8IEZSX1JFUExBQ0UgfCBGUl9ESUFMT0dURVJNKTsKKwkgICAgKmxwRmxhZ3MgfD0gRlJfUkVQTEFDRUFMTDsKKwkgICAgU2VuZE1lc3NhZ2UzMkEoaHduZE93bmVyLCB1RmluZFJlcGxhY2VNZXNzYWdlLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXaW5kb3dMb25nMzJBKGhXbmQsIERXTF9VU0VSKSApOwogCSAgICByZXR1cm4gVFJVRTsKIAljYXNlIHBzaEhlbHA6CiAJICAgIC8qIEZJWE1FIDogc2hvdWxkIGxwZnIgc3RydWN0dXJlIGJlIHBhc3NlZCBhcyBhbiBhcmd1bWVudCA/Pz8gKi8KLQkgICAgU2VuZE1lc3NhZ2UxNihscGZyLT5od25kT3duZXIsIHVIZWxwTWVzc2FnZSwgMCwgMCk7CisJICAgIFNlbmRNZXNzYWdlMzJBKGh3bmRPd25lciwgdUhlbHBNZXNzYWdlLCAwLCAwKTsKIAkgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIHJldHVybiBGQUxTRTsKQEAgLTExMDIsMTYgKzEzNjIsNjcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBSZXBsYWNlVGV4dERsZ1Byb2MgICAoQ09NTURMRy4xNCkKKyAqICAgICAgICAgICBSZXBsYWNlVGV4dERsZ1Byb2MxNiAgIChDT01NRExHLjE0KQogICovCi1MUkVTVUxUIFdJTkFQSSBSZXBsYWNlVGV4dERsZ1Byb2MoSFdORDE2IGhXbmQsIFVJTlQxNiB3TXNnLCBXUEFSQU0xNiB3UGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSkKK0xSRVNVTFQgV0lOQVBJIFJlcGxhY2VUZXh0RGxnUHJvYzE2KEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywgV1BBUkFNMTYgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSkKIHsKKyAgICBMUEZJTkRSRVBMQUNFMTYgbHBmcjsKICAgICBzd2l0Y2ggKHdNc2cpIHsKIAljYXNlIFdNX0lOSVRESUFMT0c6Ci0JICAgIHJldHVybiBSRVBMQUNFRExHX1dNSW5pdERpYWxvZyhoV25kLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgICAgICAgICBscGZyPShMUEZJTkRSRVBMQUNFMTYpUFRSX1NFR19UT19MSU4obFBhcmFtKTsKKwkgICAgcmV0dXJuIFJFUExBQ0VETEdfV01Jbml0RGlhbG9nKGhXbmQsIGxQYXJhbSwgJmxwZnItPkZsYWdzLAorCQkgICAgUFRSX1NFR19UT19MSU4obHBmci0+bHBzdHJGaW5kV2hhdCksCisJCSAgICBQVFJfU0VHX1RPX0xJTihscGZyLT5scHN0clJlcGxhY2VXaXRoKSwgRkFMU0UpOwogCWNhc2UgV01fQ09NTUFORDoKLQkgICAgcmV0dXJuIFJFUExBQ0VETEdfV01Db21tYW5kKGhXbmQsIHdQYXJhbSwgbFBhcmFtKTsKKwkgICAgbHBmcj0oTFBGSU5EUkVQTEFDRTE2KVBUUl9TRUdfVE9fTElOKEdldFdpbmRvd0xvbmczMkEoaFduZCwgRFdMX1VTRVIpKTsKKwkgICAgcmV0dXJuIFJFUExBQ0VETEdfV01Db21tYW5kKGhXbmQsIHdQYXJhbSwgbHBmci0+aHduZE93bmVyLCAKKwkJICAgICZscGZyLT5GbGFncywgUFRSX1NFR19UT19MSU4obHBmci0+bHBzdHJGaW5kV2hhdCksCisJCSAgICBscGZyLT53RmluZFdoYXRMZW4sIFBUUl9TRUdfVE9fTElOKGxwZnItPmxwc3RyUmVwbGFjZVdpdGgpLAorCQkgICAgbHBmci0+d1JlcGxhY2VXaXRoTGVuLCBGQUxTRSk7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUmVwbGFjZVRleHREbGdQcm9jMzJBCisgKi8gCitMUkVTVUxUIFdJTkFQSSBSZXBsYWNlVGV4dERsZ1Byb2MzMkEoSFdORDMyIGhXbmQsIFVJTlQzMiB3TXNnLCBXUEFSQU0zMiB3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtKQoreworICAgIExQRklORFJFUExBQ0UzMkEgbHBmcjsKKyAgICBzd2l0Y2ggKHdNc2cpIHsKKwljYXNlIFdNX0lOSVRESUFMT0c6CisgICAgICAgICAgICBscGZyPShMUEZJTkRSRVBMQUNFMzJBKWxQYXJhbTsKKwkgICAgcmV0dXJuIFJFUExBQ0VETEdfV01Jbml0RGlhbG9nKGhXbmQsIGxQYXJhbSwgJmxwZnItPkZsYWdzLAorCQkgICAgbHBmci0+bHBzdHJGaW5kV2hhdCwgbHBmci0+bHBzdHJSZXBsYWNlV2l0aCwgRkFMU0UpOworCWNhc2UgV01fQ09NTUFORDoKKwkgICAgbHBmcj0oTFBGSU5EUkVQTEFDRTMyQSlHZXRXaW5kb3dMb25nMzJBKGhXbmQsIERXTF9VU0VSKTsKKwkgICAgcmV0dXJuIFJFUExBQ0VETEdfV01Db21tYW5kKGhXbmQsIHdQYXJhbSwgbHBmci0+aHduZE93bmVyLCAKKwkJICAgICZscGZyLT5GbGFncywgbHBmci0+bHBzdHJGaW5kV2hhdCwgbHBmci0+d0ZpbmRXaGF0TGVuLAorCQkgICAgbHBmci0+bHBzdHJSZXBsYWNlV2l0aCwgbHBmci0+d1JlcGxhY2VXaXRoTGVuLCBGQUxTRSk7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUmVwbGFjZVRleHREbGdQcm9jMzJXCisgKi8gCitMUkVTVUxUIFdJTkFQSSBSZXBsYWNlVGV4dERsZ1Byb2MzMlcoSFdORDMyIGhXbmQsIFVJTlQzMiB3TXNnLCBXUEFSQU0zMiB3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtKQoreworICAgIExQRklORFJFUExBQ0UzMlcgbHBmcjsKKyAgICBzd2l0Y2ggKHdNc2cpIHsKKwljYXNlIFdNX0lOSVRESUFMT0c6CisgICAgICAgICAgICBscGZyPShMUEZJTkRSRVBMQUNFMzJXKWxQYXJhbTsKKwkgICAgcmV0dXJuIFJFUExBQ0VETEdfV01Jbml0RGlhbG9nKGhXbmQsIGxQYXJhbSwgJmxwZnItPkZsYWdzLAorCQkgICAgKExQU1RSKWxwZnItPmxwc3RyRmluZFdoYXQsIChMUFNUUilscGZyLT5scHN0clJlcGxhY2VXaXRoLAorCQkgICAgVFJVRSk7CisJY2FzZSBXTV9DT01NQU5EOgorCSAgICBscGZyPShMUEZJTkRSRVBMQUNFMzJXKUdldFdpbmRvd0xvbmczMkEoaFduZCwgRFdMX1VTRVIpOworCSAgICByZXR1cm4gUkVQTEFDRURMR19XTUNvbW1hbmQoaFduZCwgd1BhcmFtLCBscGZyLT5od25kT3duZXIsIAorCQkgICAgJmxwZnItPkZsYWdzLCAoTFBTVFIpbHBmci0+bHBzdHJGaW5kV2hhdCwgbHBmci0+d0ZpbmRXaGF0TGVuLAorCQkgICAgKExQU1RSKWxwZnItPmxwc3RyUmVwbGFjZVdpdGgsIGxwZnItPndSZXBsYWNlV2l0aExlbiwgVFJVRSk7CiAgICAgfQogICAgIHJldHVybiBGQUxTRTsKIH0KQEAgLTEzMjEsNyArMTYzMiw4IEBACiAgICAgewogICAgICAgICBIQU5ETEUxNiBoUmVzSW5mbzsKICAgICAgICAgaWYgKCEoaFJlc0luZm8gPSBGaW5kUmVzb3VyY2UxNihscENoQ29sLT5oSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBDaENvbC0+bHBUZW1wbGF0ZU5hbWUsIFJUX0RJQUxPRykpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2hDb2wtPmxwVGVtcGxhdGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUX0RJQUxPRzE2KSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIENvbW1EbGdMYXN0RXJyb3IgPSBDREVSUl9GSU5EUkVTRkFJTFVSRTsKICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKQEAgLTE3OTgsNyArMjExMCw3IEBACiAgSEJSVVNIMzIgaGJydXNoOwogIEhEQzMyIGhkYyA7CiAgUkVDVDE2IHJlY3QsY2xpZW50OwotIEhDVVJTT1IxNiBoY3Vyc29yPVNldEN1cnNvcjE2KExvYWRDdXJzb3IxNigwLElEQ19XQUlUKSk7CisgSENVUlNPUjE2IGhjdXJzb3I9U2V0Q3Vyc29yMTYoTG9hZEN1cnNvcjE2KDAsSURDX1dBSVQxNikpOwogCiAgR2V0Q2xpZW50UmVjdDE2KGh3bmQsJmNsaWVudCk7CiAgaGRjPUdldERDMzIoaHduZCk7CkBAIC0yNDE2LDcgKzI3MjgsOCBAQAogICAgIHsKICAgICAgICAgSEFORExFMTYgaFJlc0luZm87CiAgICAgICAgIGlmICghKGhSZXNJbmZvID0gRmluZFJlc291cmNlMTYoIGxwQ2hGb250LT5oSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2hGb250LT5scFRlbXBsYXRlTmFtZSwgUlRfRElBTE9HKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2hGb250LT5scFRlbXBsYXRlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRfRElBTE9HMTYpKSkKICAgICAgICAgewogICAgICAgICAgICAgQ29tbURsZ0xhc3RFcnJvciA9IENERVJSX0ZJTkRSRVNGQUlMVVJFOwogICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwpAQCAtMjYzNSw3ICsyOTQ4LDcgQEAKICAgaW50IGksaixyZXMsaW5pdD0wOwogICBsb25nIGw7CiAgIExQTE9HRk9OVDE2IGxweHg7Ci0gIEhDVVJTT1IxNiBoY3Vyc29yPVNldEN1cnNvcjE2KExvYWRDdXJzb3IxNigwLElEQ19XQUlUKSk7CisgIEhDVVJTT1IxNiBoY3Vyc29yPVNldEN1cnNvcjE2KExvYWRDdXJzb3IxNigwLElEQ19XQUlUMTYpKTsKICAgTFBDSE9PU0VGT05UIGxwY2Y7CiAKICAgU2V0V2luZG93TG9uZzMyQShoRGxnLCBEV0xfVVNFUiwgbFBhcmFtKTsgCkBAIC0yNjUwLDcgKzI5NjMsNyBAQAogICAgIHJldHVybiBGQUxTRTsKICAgfQogICBpZiAoIWhCaXRtYXBUVCkKLSAgICBoQml0bWFwVFQgPSBMb2FkQml0bWFwMTYoMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9UUlRZUEUpKTsKKyAgICBoQml0bWFwVFQgPSBMb2FkQml0bWFwMTYoMCwgTUFLRUlOVFJFU09VUkNFMTYoT0JNX1RSVFlQRSkpOwogCQkJIAogICBpZiAoIShscGNmLT5GbGFncyAmIENGX1NIT1dIRUxQKSB8fCAhSXNXaW5kb3czMihscGNmLT5od25kT3duZXIpKQogICAgIFNob3dXaW5kb3czMihHZXREbGdJdGVtMzIoaERsZyxwc2hIZWxwKSxTV19ISURFKTsKQEAgLTI3NTQsNyArMzA2Nyw3IEBACiAgIEJJVE1BUDE2IGJtOwogICBMUE1FQVNVUkVJVEVNU1RSVUNUMTYgbHBtaT1QVFJfU0VHX1RPX0xJTigoTFBNRUFTVVJFSVRFTVNUUlVDVDE2KWxQYXJhbSk7CiAgIGlmICghaEJpdG1hcFRUKQotICAgIGhCaXRtYXBUVCA9IExvYWRCaXRtYXAxNigwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX1RSVFlQRSkpOworICAgIGhCaXRtYXBUVCA9IExvYWRCaXRtYXAxNigwLCBNQUtFSU5UUkVTT1VSQ0UxNihPQk1fVFJUWVBFKSk7CiAgIEdldE9iamVjdDE2KCBoQml0bWFwVFQsIHNpemVvZihibSksICZibSApOwogICBscG1pLT5pdGVtSGVpZ2h0PWJtLmJtSGVpZ2h0OwogICAvKiBGSVhNRTogdXNlIE1BWCBvZiBibS5ibUhlaWdodCBhbmQgdG0udG1IZWlnaHQgLiovCkBAIC0yODk2LDcgKzMyMDksNyBAQAogCQkgICAgICBpPVNlbmREbGdJdGVtTWVzc2FnZTE2KGhEbGcsY21iMSxDQl9HRVRDVVJTRUwxNiwwLDApOwogCQkgICAgICBpZiAoaSE9Q0JfRVJSKQogCQkgICAgICB7Ci0JCSAgICAgICAgSENVUlNPUjE2IGhjdXJzb3I9U2V0Q3Vyc29yMTYoTG9hZEN1cnNvcjE2KDAsSURDX1dBSVQpKTsKKwkJICAgICAgICBIQ1VSU09SMTYgaGN1cnNvcj1TZXRDdXJzb3IxNihMb2FkQ3Vyc29yMTYoMCxJRENfV0FJVDE2KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHIgPSBTRUdQVFJfQUxMT0MoMjU2KTsKICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZTE2KGhEbGcsY21iMSxDQl9HRVRMQlRFWFQxNixpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlTRUdQVFJfR0VUKHN0cikpOwpAQCAtMzA4NCwxMSArMzM5NywxNCBAQAogCX0JCQkJCQkJCVwKIAlvZm4xNi0+bk1heEN1c3RGaWx0ZXIgPSBvZm4tPm5NYXhDdXN0RmlsdGVyOwkJCVwKIAlvZm4xNi0+bkZpbHRlckluZGV4ID0gb2ZuLT5uRmlsdGVySW5kZXg7CQkJXAorCWlmIChvZm4tPm5NYXhGaWxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJb2ZuMTYtPmxwc3RyRmlsZSA9IFNFR1BUUl9HRVQoU0VHUFRSX0FMTE9DKG9mbi0+bk1heEZpbGUpKTsJXAogCW9mbjE2LT5uTWF4RmlsZSA9IG9mbi0+bk1heEZpbGU7CQkJCVwKLQlpZiAob2ZuLT5scHN0ckZpbGVUaXRsZSkJCQkJCVwKKwlpZiAob2ZuMTYtPmxwc3RyRmlsZVRpdGxlKQkJCQkJXAogCQlvZm4xNi0+bHBzdHJGaWxlVGl0bGU9IFNFR1BUUl9HRVQoU0VHUFRSX1NUUkRVUChvZm4tPmxwc3RyRmlsZVRpdGxlKSk7XAogCW9mbjE2LT5uTWF4RmlsZVRpdGxlID0gb2ZuLT5uTWF4RmlsZVRpdGxlOwkJCVwKKyAgICAgICAgaWYgKG9mbjE2LT5uTWF4RmlsZVRpdGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBvZm4xNi0+bHBzdHJGaWxlVGl0bGUgPSBTRUdQVFJfR0VUKFNFR1BUUl9BTExPQyhvZm4tPm5NYXhGaWxlVGl0bGUpKTtcCiAJaWYgKG9mbi0+bHBzdHJJbml0aWFsRGlyKQkJCQkJXAogCQlvZm4xNi0+bHBzdHJJbml0aWFsRGlyID0gU0VHUFRSX0dFVChTRUdQVFJfU1RSRFVQKG9mbi0+bHBzdHJJbml0aWFsRGlyKSk7XAogCWlmIChvZm4tPmxwc3RyVGl0bGUpCQkJCQkJXApAQCAtMzEwNiw2ICszNDIyLDggQEAKIAkJCQkJCQkJCVwKIAlyZXQgPSB4eHgjIzE2KFNFR1BUUl9HRVQob2ZuMTYpKTsJCQkJXAogCQkJCQkJCQkJXAorCW9mbi0+bkZpbGVPZmZzZXQgPSBvZm4xNi0+bkZpbGVPZmZzZXQ7CQkJCVwKKwlvZm4tPm5GaWxlRXh0ZW5zaW9uID0gb2ZuMTYtPm5GaWxlRXh0ZW5zaW9uOwkJCVwKIAlpZiAob2ZuMTYtPmxwc3RyRmlsdGVyKQkJCQkJCVwKIAkJU0VHUFRSX0ZSRUUoUFRSX1NFR19UT19MSU4ob2ZuMTYtPmxwc3RyRmlsdGVyKSk7CVwKIAlpZiAob2ZuMTYtPmxwVGVtcGxhdGVOYW1lKQkJCQkJXApAQCAtMzExOSwxMSArMzQzNywxNSBAQAogCWlmIChvZm4xNi0+bHBzdHJDdXN0b21GaWx0ZXIpCQkJCQlcCiAJCVNFR1BUUl9GUkVFKFBUUl9TRUdfVE9fTElOKG9mbjE2LT5scHN0ckN1c3RvbUZpbHRlcikpOwlcCiAJCQkJCQkJCQlcCisJaWYgKG9mbjE2LT5scHN0ckZpbGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlzdHJjcHkob2ZuLT5scHN0ckZpbGUsUFRSX1NFR19UT19MSU4ob2ZuMTYtPmxwc3RyRmlsZSkpOwlcCiAJU0VHUFRSX0ZSRUUoUFRSX1NFR19UT19MSU4ob2ZuMTYtPmxwc3RyRmlsZSkpOwkJCVwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQkJCQkJCQkJXAotCWlmIChvZm4xNi0+bHBzdHJGaWxlVGl0bGUpCQkJCQlcCisJaWYgKG9mbjE2LT5scHN0ckZpbGVUaXRsZSkgeyAgICAgICAgIAkJCQlcCisgICAgICAgICAgICAgICAgc3RyY3B5KG9mbi0+bHBzdHJGaWxlVGl0bGUsUFRSX1NFR19UT19MSU4ob2ZuMTYtPmxwc3RyRmlsZVRpdGxlKSk7XAogCQlTRUdQVFJfRlJFRShQVFJfU0VHX1RPX0xJTihvZm4xNi0+bHBzdHJGaWxlVGl0bGUpKTsJXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJU0VHUFRSX0ZSRUUob2ZuMTYpOwkJCQkJCVwKIAlyZXR1cm4gcmV0OwkJCQkJCQlcCiB9CQkJCQkJCQkJXApAQCAtMzE4MiwxMSArMzUwNCwxNCBAQAogCX0JCQkJCQkJCVwKIAlvZm4xNi0+bk1heEN1c3RGaWx0ZXIgPSBvZm4tPm5NYXhDdXN0RmlsdGVyOwkJCVwKIAlvZm4xNi0+bkZpbHRlckluZGV4ID0gb2ZuLT5uRmlsdGVySW5kZXg7CQkJXAorICAgICAgICBpZiAob2ZuLT5uTWF4RmlsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCW9mbjE2LT5scHN0ckZpbGUgPSBTRUdQVFJfR0VUKFNFR1BUUl9BTExPQyhvZm4tPm5NYXhGaWxlKSk7CVwKIAlvZm4xNi0+bk1heEZpbGUgPSBvZm4tPm5NYXhGaWxlOwkJCQlcCi0JaWYgKG9mbi0+bHBzdHJGaWxlVGl0bGUpCQkJCQlcCisJaWYgKG9mbjE2LT5scHN0ckZpbGVUaXRsZSkJCQkJCVwKIAkJb2ZuMTYtPmxwc3RyRmlsZVRpdGxlPSBTRUdQVFJfR0VUKFNFR1BUUl9TVFJEVVBfV3RvQShvZm4tPmxwc3RyRmlsZVRpdGxlKSk7XAogCW9mbjE2LT5uTWF4RmlsZVRpdGxlID0gb2ZuLT5uTWF4RmlsZVRpdGxlOwkJCVwKKyAgICAgICAgaWYgKG9mbi0+bk1heEZpbGVUaXRsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJb2ZuMTYtPmxwc3RyRmlsZVRpdGxlID0gU0VHUFRSX0dFVChTRUdQVFJfQUxMT0Mob2ZuLT5uTWF4RmlsZVRpdGxlKSk7XAogCWlmIChvZm4tPmxwc3RySW5pdGlhbERpcikJCQkJCVwKIAkJb2ZuMTYtPmxwc3RySW5pdGlhbERpciA9IFNFR1BUUl9HRVQoU0VHUFRSX1NUUkRVUF9XdG9BKG9mbi0+bHBzdHJJbml0aWFsRGlyKSk7XAogCWlmIChvZm4tPmxwc3RyVGl0bGUpCQkJCQkJXApAQCAtMzIwMyw2ICszNTI4LDggQEAKIAl9CQkJCQkJCQlcCiAJcmV0ID0geHh4IyMxNihTRUdQVFJfR0VUKG9mbjE2KSk7CQkJCVwKIAkJCQkJCQkJCVwKKwlvZm4tPm5GaWxlT2Zmc2V0ID0gb2ZuMTYtPm5GaWxlT2Zmc2V0OwkJCQlcCisJb2ZuLT5uRmlsZUV4dGVuc2lvbiA9IG9mbjE2LT5uRmlsZUV4dGVuc2lvbjsJCQlcCiAJaWYgKG9mbjE2LT5scHN0ckZpbHRlcikJCQkJCQlcCiAJCVNFR1BUUl9GUkVFKFBUUl9TRUdfVE9fTElOKG9mbjE2LT5scHN0ckZpbHRlcikpOwlcCiAJaWYgKG9mbjE2LT5scFRlbXBsYXRlTmFtZSkJCQkJCVwKQEAgLTMyMTYsMTEgKzM1NDMsMTUgQEAKIAlpZiAob2ZuMTYtPmxwc3RyQ3VzdG9tRmlsdGVyKQkJCQkJXAogCQlTRUdQVFJfRlJFRShQVFJfU0VHX1RPX0xJTihvZm4xNi0+bHBzdHJDdXN0b21GaWx0ZXIpKTsJXAogCQkJCQkJCQkJXAorCWlmIChvZm4xNi0+bHBzdHJGaWxlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJbHN0cmNweUF0b1cob2ZuLT5scHN0ckZpbGUsUFRSX1NFR19UT19MSU4ob2ZuMTYtPmxwc3RyRmlsZSkpOwlcCiAJU0VHUFRSX0ZSRUUoUFRSX1NFR19UT19MSU4ob2ZuMTYtPmxwc3RyRmlsZSkpOwkJCVwKKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQkJCQkJCQkJXAotCWlmIChvZm4xNi0+bHBzdHJGaWxlVGl0bGUpCQkJCQlcCisJaWYgKG9mbjE2LT5scHN0ckZpbGVUaXRsZSkgewkJCQkJXAorICAgICAgICAgICAgICAgIGxzdHJjcHlBdG9XKG9mbi0+bHBzdHJGaWxlVGl0bGUsUFRSX1NFR19UT19MSU4ob2ZuMTYtPmxwc3RyRmlsZVRpdGxlKSk7XAogCQlTRUdQVFJfRlJFRShQVFJfU0VHX1RPX0xJTihvZm4xNi0+bHBzdHJGaWxlVGl0bGUpKTsJXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJU0VHUFRSX0ZSRUUob2ZuMTYpOwkJCQkJCVwKIAlyZXR1cm4gcmV0OwkJCQkJCQlcCiB9CmRpZmYgLS1naXQgYS9taXNjL2NwdS5jIGIvbWlzYy9jcHUuYwppbmRleCA2NWU5YWM0Li4wMzY5YjQ5IDEwMDY0NAotLS0gYS9taXNjL2NwdS5jCisrKyBiL21pc2MvY3B1LmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImdsb2JhbC5oIgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5udC5oIgogI2luY2x1ZGUgIndpbnJlZy5oIgpAQCAtMzQsNyArMzUsNyBAQAogCSAqIEZJWE1FOiBwZXJoYXBzIG92ZXJyaWRlYWJsZSB3aXRoIHByZWNvbXBpbGVyIGZsYWdzPwogCSAqLwogCWNhY2hlZHNpLnUueC53UHJvY2Vzc29yQXJjaGl0ZWN0dXJlCT0gUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRV9JTlRFTDsKLQljYWNoZWRzaS5kd1BhZ2VTaXplIAkJCT0gNDA5NjsKKwljYWNoZWRzaS5kd1BhZ2VTaXplIAkJCT0gVklSVFVBTF9HZXRQYWdlU2l6ZSgpOwogCiAJLyogRklYTUU6IGJldHRlciB2YWx1ZXMgZm9yIHRoZSB0d28gZW50cmllcyBiZWxvdy4uLiAqLwogCWNhY2hlZHNpLmxwTWluaW11bUFwcGxpY2F0aW9uQWRkcmVzcwk9ICh2b2lkICopMHg0MDAwMDAwMDsKZGlmZiAtLWdpdCBhL21pc2MvY3J0ZGxsLmMgYi9taXNjL2NydGRsbC5jCmluZGV4IGU0Y2RkYTAuLjJjMDBhMzIgMTAwNjQ0Ci0tLSBhL21pc2MvY3J0ZGxsLmMKKysrIGIvbWlzYy9jcnRkbGwuYwpAQCAtMTcwMywzICsxNzAzLDI5IEBACiAgIFRSQUNFKGNydGRsbCwiQ1JURExMX19zbGVlcCBmb3IgJWxkIG1pbGxpc2Vjb25kc1xuIix0aW1lb3V0KTsKICAgU2xlZXAoKHRpbWVvdXQpP3RpbWVvdXQ6MSk7CiB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIGdldGVudiAgICAgICAgICAgKENSVERMTC40MzcpCisgKi8KK0xQU1RSIF9fY2RlY2wgQ1JURExMX2dldGVudihjb25zdCBjaGFyICpuYW1lKSAKK3sKKyAgICAgTFBTVFIgZW52aXJvbiA9IEdldEVudmlyb25tZW50U3RyaW5nczMyQSgpOworICAgICBMUFNUUiBwcCxwb3MgPSBOVUxMOworICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworICAKKyAgICAgZm9yIChwcCA9IGVudmlyb247ICgqcHApOyBwcCA9IHBwICsgc3RybGVuKHBwKSArMSkKKyAgICAgICB7CisJIHBvcyA9c3RyY2hyKHBwLCc9Jyk7CisJIGlmIChwb3MpCisJICAgbGVuZ3RoID0gcG9zIC1wcDsKKwkgZWxzZQorCSAgIGxlbmd0aCA9IHN0cmxlbihwcCk7CisJIGlmICghc3RybmNtcChwcCxuYW1lLGxlbmd0aCkpIGJyZWFrOworICAgICAgIH0KKyAgICAgaWYgKChwcCkmJiAocG9zKSkgCisgICAgICAgeworCSBwcCA9IHBvcysxOworCSBUUkFDRShjcnRkbGwsImdvdCAlc1xuIixwcCk7CisgICAgICAgfQorICAgICBGcmVlRW52aXJvbm1lbnRTdHJpbmdzMzJBKCBlbnZpcm9uICk7CisgICAgIHJldHVybiBwcDsKK30KZGlmZiAtLWdpdCBhL21pc2MvZGRlbWwuYyBiL21pc2MvZGRlbWwuYwppbmRleCBmYjk0Mjg2Li44N2IxZjg0IDEwMDY0NAotLS0gYS9taXNjL2RkZW1sLmMKKysrIGIvbWlzYy9kZGVtbC5jCkBAIC0xMiw2ICsxMiw5IEBACiAjaW5jbHVkZSAiZGVidWcuaCIKIAogCitzdGF0aWMgTE9ORyAgICAgRERFX2N1cnJlbnRfaGFuZGxlOworCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICBEZGVJbml0aWFsaXplMTYgICAoRERFTUwuMikKICAqLwpAQCAtMTc0LDcgKzE3Nyw4IEBACiBIU1ogV0lOQVBJIERkZUNyZWF0ZVN0cmluZ0hhbmRsZTMyQSggRFdPUkQgaWRJbnN0LCBMUENTVFIgcHN6LCBJTlQzMiBjb2RlcGFnZSApCiB7CiAgICAgRklYTUUoIGRkZW1sLCAiZW1wdHkgc3R1YlxuIiApOwotICAgIHJldHVybiAwOworICAgIERERV9jdXJyZW50X2hhbmRsZSsrOworICAgIHJldHVybiBEREVfY3VycmVudF9oYW5kbGU7CiB9CiAKIApAQCAtMTg0LDcgKzE4OCw4IEBACiBIU1ogV0lOQVBJIERkZUNyZWF0ZVN0cmluZ0hhbmRsZTMyVyggRFdPUkQgaWRJbnN0LCBMUENXU1RSIHBzeiwgSU5UMzIgY29kZXBhZ2UpCiB7CiAgICAgRklYTUUoIGRkZW1sLCAiZW1wdHkgc3R1YlxuIiApOwotICAgIHJldHVybiAwOworICAgIERERV9jdXJyZW50X2hhbmRsZSsrOworICAgIHJldHVybiBEREVfY3VycmVudF9oYW5kbGU7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbWlzYy9kZWJ1Z3N0ci5jIGIvbWlzYy9kZWJ1Z3N0ci5jCmluZGV4IGU3MjBhMzMuLmQ1ZDhlNjkgMTAwNjQ0Ci0tLSBhL21pc2MvZGVidWdzdHIuYworKysgYi9taXNjL2RlYnVnc3RyLmMKQEAgLTEyOSwxNSArMTI5LDU3IEBACiAvKiBUaGlzIHJvdXRpbmUgcmV0dXJucyBhIG5pY2VseSBmb3JtYXRlZCBuYW1lIG9mIHRoZSByZXNvdXJjZSByZXMKICAgIElmIHRoZSByZXNvdXJjZSBuYW1lIGlzIGEgc3RyaW5nLCBpdCB3aWxsIHJldHVybiAnPHJlcy1uYW1lPicKICAgIElmIGl0IGlzIGEgbnVtYmVyLCBpdCB3aWxsIHJldHVybiAjPDQtZGlnaXQtaGV4LW51bWJlcj4gKi8KLUxQU1RSCi1kZWJ1Z3JlcyAoY29uc3Qgdm9pZCAqcmVzKQorTFBTVFIgZGVidWdyZXNfYSggTFBDU1RSIHJlcyApCiB7Ci0gIGlmIChISVdPUkQoKERXT1JEKXJlcykpCi0gICAgcmV0dXJuIGRlYnVnc3RyX2EoKExQQ1NUUilyZXMpOwotICBlbHNlewogICAgIGNoYXIgcmVzbmFtZVsxMF07CisgICAgaWYgKEhJV09SRChyZXMpKSByZXR1cm4gZGVidWdzdHJfYShyZXMpOwogICAgIHNwcmludGYocmVzbmFtZSwgIiMlMDR4IiwgTE9XT1JEKHJlcykpOwogICAgIHJldHVybiBkZWJ1Z3N0cl9hIChyZXNuYW1lKTsKLSAgfQogfQogCitMUFNUUiBkZWJ1Z3Jlc193KCBMUENXU1RSIHJlcyApCit7CisgICAgY2hhciByZXNuYW1lWzEwXTsKKyAgICBpZiAoSElXT1JEKHJlcykpIHJldHVybiBkZWJ1Z3N0cl93KHJlcyk7CisgICAgc3ByaW50ZihyZXNuYW1lLCAiIyUwNHgiLCBMT1dPUkQocmVzKSk7CisgICAgcmV0dXJuIGRlYnVnc3RyX2EgKHJlc25hbWUpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgZGVidWdfZHVtcHN0ciAoTFBDU1RSIHMpCit7CisgIGZwdXRjICgnIicsIHN0ZGVycik7CisgIHdoaWxlICgqcykKKyAgICB7CisgICAgICBzd2l0Y2ggKCpzKQorCXsKKwljYXNlICdcXCc6CisJY2FzZSAnIic6CisJICBmcHV0YyAoJ1xcJywgc3RkZXJyKTsKKwkgIGZwdXRjICgqcywgc3RkZXJyKTsKKwkgIGJyZWFrOworCWNhc2UgJ1xuJzoKKwkgIGZwdXRjICgnXFwnLCBzdGRlcnIpOworCSAgZnB1dGMgKCduJywgc3RkZXJyKTsKKwkgIGJyZWFrOworCWNhc2UgJ1xyJzoKKwkgIGZwdXRjICgnXFwnLCBzdGRlcnIpOworCSAgZnB1dGMgKCdyJywgc3RkZXJyKTsKKwkgIGJyZWFrOworCWNhc2UgJ1x0JzoKKwkgIGZwdXRjICgnXFwnLCBzdGRlcnIpOworCSAgZnB1dGMgKCd0Jywgc3RkZXJyKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBpZiAoKnM8JyAnKQorCSAgICBwcmludGYgKCJcXDB4JTAyeCIsICpzKTsKKwkgIGVsc2UKKwkgICAgZnB1dGMgKCpzLCBzdGRlcnIpOworCX0KKyAgICAgIHMrKzsKKyAgICB9CisgIGZwdXRjICgnIicsIHN0ZGVycik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL21pc2MvaW1hZ2VsaXN0LmMgYi9taXNjL2ltYWdlbGlzdC5jCmluZGV4IGRiNGM4YjQuLjQ3NGRlOWUgMTAwNjQ0Ci0tLSBhL21pc2MvaW1hZ2VsaXN0LmMKKysrIGIvbWlzYy9pbWFnZWxpc3QuYwpAQCAtNSwyOCArNSwyMSBAQAogICoKICAqICBUT0RPOgogICogICAgLSBJbXByb3ZlIHRoZSBkb2N1bWVudGF0aW9uLgotICogICAgLSBGaXggSW1hZ2VMaXN0X0RyYXdJbmRpcmVjdC4KLSAqICAgICAgICAtIERyYXdpbmcgc2VsZWN0ZWQgaW1hZ2VzIGlzIGF3ZnVsbHkgc2xvdyBzaW5jZSBpdCBoYXMgdG8KLSAqICAgICAgICAgIGJlIGRvbmUgcGl4ZWwgYnkgcGl4ZWwuCi0gKiAgICAtIEZpeCBJbWFnZUxpc3RfR2V0SWNvbiAoYWxtb3N0IGZpeGVkKS4KLSAqICAgIC0gRml4IGFsbCBvdGhlciBzdHVicy4KKyAqICAgIC0gSW1wcm92ZSBlcnJvciBjaGVja2luZyBpbiBzb21lIGZ1bmN0aW9ucy4KKyAqICAgIC0gRml4IElMRF9UUkFOU1BBUkVOVCBlcnJvciBpbiBJbWFnZUxpc3RfRHJhd0luZGlyZWN0LgorICogICAgLSBGaXggb2Zmc2V0cyBpbiBJbWFnZUxpc3RfRHJhd0luZGlyZWN0LgorICogICAgLSBGaXggSW1hZ2VMaXN0X0dldEljb24gKG1pZ2h0IGJlIGEgcmVzdWx0IG9mIHRoZQorICogICAgICBJTERfVFJBTlNQQVJFTlQgZXJyb3IgaW4gSW1hZ2VMaXN0X0RyYXdJbmRpcmVjdCkuCiAgKiAgICAtIEZpeCBkcmFnIGZ1bmN0aW9ucy4KLSAqICAgIC0gSW1wcm92ZSBlcnJvciBjaGVja2luZyBpbiBtb3N0IGZ1bmN0aW9ucy4KKyAqICAgIC0gRml4IGFsbCBvdGhlciBzdHVicy4KICAqICAgIC0gQWRkIEltYWdlTGlzdF9TZXRGaWx0ZXIgKHVuZG9jdW1lbnRlZCkuCiAgKiAgICAgIEJUVyBkb2VzIGFueWJvZHkga25vdyBhbnl0aGluZyBhYm91dCB0aGlzIGZ1bmN0aW9uPz8/CiAgKiAgICAgICAgLSBJdCByZW1vdmVzIDEyIEJ5dGVzIGZyb20gdGhlIHN0YWNrICgzIFBhcmFtZXRlcnMpLgogICogICAgICAgIC0gRmlyc3QgcGFyYW1ldGVyIFNIT1VMRCBiZSBhIEhJTUFHRUxJU1QuCiAgKiAgICAgICAgLSBTZWNvbmQgcGFyYW1ldGVyIENPVUxEIGJlIGFuIGluZGV4Pz8/Pz8KICAqICAgICAgICAtIFRoaXJkIHBhcmFtZXRlci4uLi4gPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Ci0gKiAgICAtIEFkZCB1bmRvY3VtZW50ZWQgZnVuY3Rpb25zLgotICogICAgICAgIEFyZSB0aGVyZSBhbnkgb3RoZXIgdW5kb2N1bWVudGVkIEltYWdlTGlzdCBmdW5jdGlvbnM/CiAgKgogICogIFRlc3Rpbmc6Ci0gKiAgICAtIFRlc3QgSW1hZ2VMaXN0X0xvYWRJbWFnZUEvVyB3aXRoIEljb25zIGFuZCBDdXJzb3JzLgotICogICAgLSBUZXN0IEltYWdlTGlzdF9Db3B5LgotICogICAgLSBUZXN0IEltYWdlTGlzdF9EdXBsaWNhdGUuCi0gKiAgICAtIFRlc3QgSW1hZ2VMaXN0X1JlbW92ZS4KLSAqICAgIC0gVGVzdCBJbWFnZUxpc3RfU2V0SW1hZ2VDb3VudC4KICAqICAgIC0gVGVzdCBJbWFnZUxpc3RfR2V0SW1hZ2VSZWN0ICh1bmRvY3VtZW50ZWQpLgogICogICAgLSBUZXN0IGFsbCB0aGUgb3RoZXIgZnVuY3Rpb25zLgogICoKQEAgLTU0LDcgKzQ3LDYgQEAKICNpbmNsdWRlICJpbWFnZWxpc3QuaCIKICNpbmNsdWRlICJjb21tY3RybC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiaGVhcC5oIgogCiAjaWZkZWYgX19HRVRfSUNPTl9JTkZPX0hBQ0tfXwogI2luY2x1ZGUgImJpdG1hcC5oIgpAQCAtNzYsOCArNjgsMTYgQEAKIHN0YXRpYyBIQ1VSU09SMzIgIGhjdXJJbnRlcm5hbCA9IDA7CiAKIAotc3RhdGljIHZvaWQKLUlNQUdFTElTVF9JbnRlcm5hbEdyb3dCaXRtYXBzIChISU1BR0VMSVNUIGhpbWwsIElOVDMyIG5JbWFnZUNvdW50KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAJCSBJTUFHRUxJU1RfSW50ZXJuYWxHcm93Qml0bWFwcyAgIFtJbnRlcm5hbF0KKyAqCisgKiAgR3Jvd3MgdGhlIGJpdG1hcHMgb2YgdGhlIGdpdmVuIGltYWdlIGxpc3QgYnkgdGhlIGdpdmVuIG51bWJlciBvZiAKKyAqICBpbWFnZXMuIENhbiBOT1QgYmUgdXNlZCB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBpbWFnZXMuCisgKi8KKworc3RhdGljIHZvaWQgSU1BR0VMSVNUX0ludGVybmFsR3Jvd0JpdG1hcHMgKAorCUhJTUFHRUxJU1QgaGltbCwgICAgLyogaW1hZ2UgbGlzdCBoYW5kbGUgKi8KKwlJTlQzMiBuSW1hZ2VDb3VudCkgIC8qIG51bWJlciBvZiBpbWFnZXMgdG8gZ3JvdyBieSAqLwogewogICAgIEhEQzMyICAgICBoZGNJbWFnZUxpc3QsIGhkY0JpdG1hcDsKICAgICBIQklUTUFQMzIgaGJtTmV3Qml0bWFwOwpAQCAtMTI2LDQ0ICsxMjYsMTQgQEAKIH0KIAogCi1zdGF0aWMgdm9pZAotSU1BR0VMSVNUX0ludGVybmFsRHJhd01hc2sgKEhJTUFHRUxJU1QgaGltbCwgSU5UMzIgaSwgSERDMzIgaGRjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIHgsIElOVDMyIHkpCi17Ci0gICAgSERDMzIgaGRjSW1hZ2VMaXN0OwotCi0gICAgaWYgKGhpbWwtPmhibU1hc2spCi0gICAgewotICAgICAgICBoZGNJbWFnZUxpc3QgPSBDcmVhdGVDb21wYXRpYmxlREMzMiAoMCk7Ci0gICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmhibU1hc2spOwotICAgICAgICBCaXRCbHQzMiAoaGRjLCB4LCB5LCBoaW1sLT5jeCwgaGltbC0+Y3ksIGhkY0ltYWdlTGlzdCwKLSAgICAgICAgICAgICAgICAgIGhpbWwtPmN4ICogaSwgMCwgU1JDQ09QWSk7Ci0gICAgICAgIERlbGV0ZURDMzIgKGhkY0ltYWdlTGlzdCk7Ci0gICAgfSAgCi19Ci0KLQotc3RhdGljIHZvaWQKLUlNQUdFTElTVF9JbnRlcm5hbERyYXdJbWFnZSAoSElNQUdFTElTVCBoaW1sLCBJTlQzMiBpLCBIREMzMiBoZGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIHgsIElOVDMyIHksIFVJTlQzMiBmU3R5bGUpCi17Ci0gICAgSERDMzIgaGRjSW1hZ2VMaXN0OwotCi0gICAgaGRjSW1hZ2VMaXN0ID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOwotICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmhibUltYWdlKTsKLSAgICBCaXRCbHQzMiAoaGRjLCB4LCB5LCBoaW1sLT5jeCwgaGltbC0+Y3ksIGhkY0ltYWdlTGlzdCwKLSAgICAgICAgICAgICAgaGltbC0+Y3ggKiBpLCAwLCBTUkNDT1BZKTsKLSAgICBEZWxldGVEQzMyIChoZGNJbWFnZUxpc3QpOwotfQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgCQkgSW1hZ2VMaXN0X0FkZCAgIFtDT01DVEwzMi4zOV0KICAqCiAgKiAgQWRkIGFuIGltYWdlIChhbmQgYSBtYXNrKSB0byBhbiBpbWFnZSBsaXN0LgogICoKICAqICBSRVRVUk5TCi0gKiAgICBJbmRleCBvZiB0aGUgZmlyc3QgaW1hZ2UgdGhhdCB3YXMgYWRkZWQsIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICogICAgSW5kZXggb2YgdGhlIGZpcnN0IGltYWdlIHRoYXQgd2FzIGFkZGVkLgorICogICAgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCiAgKi8KIAogSU5UMzIgV0lOQVBJIEltYWdlTGlzdF9BZGQgKApAQCAtMTc0LDE3ICsxNDQsMTcgQEAKICAgICBIREMzMiAgICBoZGNJbWFnZUxpc3QsIGhkY0ltYWdlLCBoZGNNYXNrOwogICAgIElOVDMyICAgIG5GaXJzdEluZGV4LCBuSW1hZ2VDb3VudDsKICAgICBJTlQzMiAgICBuU3RhcnRYLCBuUnVuWCwgblJ1blk7Ci0gICAgQ09MT1JSRUYgY2xyQ29sb3I7CiAgICAgQklUTUFQMzIgYm1wOwogCiAgICAgaWYgKGhpbWwgPT0gTlVMTCkgcmV0dXJuICgtMSk7CiAKKyAgICBoZGNNYXNrID0gMDsgLyogdG8ga2VlcCBjb21waWxlciBoYXBweSA7LSkgKi8KKwogICAgIEdldE9iamVjdDMyQSAoaGJtSW1hZ2UsIHNpemVvZihCSVRNQVAzMiksIChMUFZPSUQpJmJtcCk7CiAgICAgbkltYWdlQ291bnQgPSBibXAuYm1XaWR0aCAvIGhpbWwtPmN4OwogCiAgICAgaWYgKGhpbWwtPmNDdXJJbWFnZSArIG5JbWFnZUNvdW50ID49IGhpbWwtPmNNYXhJbWFnZSkKICAgICAgICAgSU1BR0VMSVNUX0ludGVybmFsR3Jvd0JpdG1hcHMgKGhpbWwsIG5JbWFnZUNvdW50KTsKLS8vICAgICAgICBJbWFnZUxpc3RfU2V0SW1hZ2VDb3VudCAoaGltbCwgaGltbC0+Y0N1ckltYWdlICsgbkltYWdlQ291bnQpOwogCiAgICAgaGRjSW1hZ2VMaXN0ID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOwogICAgIGhkY0ltYWdlID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOwpAQCAtMjAzLDYgKzE3MywyMSBAQAogICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlLCBoYm1NYXNrKTsKICAgICAgICAgICAgIEJpdEJsdDMyIChoZGNJbWFnZUxpc3QsIGhpbWwtPmNDdXJJbWFnZSAqIGhpbWwtPmN4LCAwLAogICAgICAgICAgICAgICAgICAgICAgIGJtcC5ibVdpZHRoLCBoaW1sLT5jeSwgaGRjSW1hZ2UsIDAsIDAsIFNSQ0NPUFkpOworCisgICAgICAgICAgICAvKiBmaXggdHJhbnNwYXJlbnQgYXJlYXMgb2YgdGhlIGltYWdlIGJpdG1hcCovCisgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjTWFzaywgaGltbC0+aGJtTWFzayk7CisgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2UsIGhpbWwtPmhibUltYWdlKTsKKyAgICAgICAgICAgIG5TdGFydFggPSBoaW1sLT5jQ3VySW1hZ2UgKiBoaW1sLT5jeDsKKyAgICAgICAgICAgIGZvciAoblJ1blkgPSAwOyBuUnVuWSA8IGhpbWwtPmN5OyBuUnVuWSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoblJ1blggPSAwOyBuUnVuWCA8IGJtcC5ibVdpZHRoOyBuUnVuWCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEdldFBpeGVsMzIgKGhkY01hc2ssIG5TdGFydFggKyBuUnVuWCwgblJ1blkpID09CisgICAgICAgICAgICAgICAgICAgICAgICBSR0IoMjU1LCAyNTUsIDI1NSkpCisgICAgICAgICAgICAgICAgICAgICAgICBTZXRQaXhlbDMyIChoZGNJbWFnZSwgblN0YXJ0WCArIG5SdW5YLCBuUnVuWSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSR0IoMCwgMCwgMCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKQEAgLTIxNCw4ICsxOTksOCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZvciAoblJ1blggPSAwOyBuUnVuWCA8IGJtcC5ibVdpZHRoOyBuUnVuWCsrKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2xyQ29sb3IgPSBHZXRQaXhlbDMyIChoZGNJbWFnZUxpc3QsIG5TdGFydFggKyBuUnVuWCwgblJ1blkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2xyQ29sb3IgPT0gaGltbC0+Y2xyQmspCisgICAgICAgICAgICAgICAgICAgIGlmIChHZXRQaXhlbDMyIChoZGNJbWFnZUxpc3QsIG5TdGFydFggKyBuUnVuWCwgblJ1blkpID09CisgICAgICAgICAgICAgICAgICAgICAgICBoaW1sLT5jbHJCaykKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgU2V0UGl4ZWwzMiAoaGRjSW1hZ2VMaXN0LCBuU3RhcnRYICsgblJ1blgsIG5SdW5ZLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHQigwLCAwLCAwKSk7CkBAIC0yNDgsNyArMjMzLDggQEAKICAqICBtYXNrIGNvbG9yLgogICoKICAqICBSRVRVUk5TCi0gKiAgICBJbmRleCBvZiB0aGUgZmlyc3QgaW1hZ2UgdGhhdCB3YXMgYWRkZWQsIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICogICAgSW5kZXggb2YgdGhlIGZpcnN0IGltYWdlIHRoYXQgd2FzIGFkZGVkLgorICogICAgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCiAgKi8KIAogSU5UMzIgV0lOQVBJIEltYWdlTGlzdF9BZGRNYXNrZWQgKApAQCAtMjYwLDcgKzI0Niw2IEBACiAgICAgSU5UMzIgICAgbkluZGV4LCBuSW1hZ2VDb3VudDsKICAgICBCSVRNQVAzMiBibXA7CiAgICAgSU5UMzIgICAgblN0YXJ0WCwgblJ1blgsIG5SdW5ZOwotICAgIENPTE9SUkVGIGNsckNvbG9yOwogCiAgICAgaWYgKGhpbWwgPT0gTlVMTCkgcmV0dXJuICgtMSk7CiAKQEAgLTI5MSw4ICsyNzYsOCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBmb3IgKG5SdW5YID0gMDsgblJ1blggPCBibXAuYm1XaWR0aDsgblJ1blgrKykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbHJDb2xvciA9IEdldFBpeGVsMzIgKGhkY0ltYWdlTGlzdCwgblN0YXJ0WCArIG5SdW5YLCBuUnVuWSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsckNvbG9yID09IGNsck1hc2spCisgICAgICAgICAgICAgICAgaWYgKEdldFBpeGVsMzIgKGhkY0ltYWdlTGlzdCwgblN0YXJ0WCArIG5SdW5YLCBuUnVuWSkgPT0KKyAgICAgICAgICAgICAgICAgICAgY2xyTWFzaykKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIFNldFBpeGVsMzIgKGhkY0ltYWdlTGlzdCwgblN0YXJ0WCArIG5SdW5YLCBuUnVuWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkdCKDAsIDAsIDApKTsKQEAgLTMxNiw4ICszMDEsMTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgCQkgSW1hZ2VMaXN0X0JlZ2luRHJhZyAgIFtDT01DVEwzMi40Ml0KICAqCi0gKiBDcmVhdGVzIGEgdGVtcG9yYXJ5IGltYWdlbGlzdCB3aXRoIGFuIGltYWdlIGluIGl0LCB3aGljaCB3aWxsIGJlIHVzZWQKLSAqIGFzIGEgZHJhZyBpbWFnZS4KKyAqICBDcmVhdGVzIGEgdGVtcG9yYXJ5IGltYWdlbGlzdCB3aXRoIGFuIGltYWdlIGluIGl0LCB3aGljaCB3aWxsIGJlIHVzZWQKKyAqICBhcyBhIGRyYWcgaW1hZ2UuCisgKgorICogIFJFVFVSTlMKKyAqICAgIC4uLgogICovCiAKIEJPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X0JlZ2luRHJhZyAoCkBAIC0zNzcsNiArMzY1LDkgQEAKICAqICBDb3B5aW5nIGZyb20gb25lIGltYWdlbGlzdCB0byBhbm90aGVyIGlzIGFsbG93ZWQsIGluIGNvbnRyYXJ5IHRvCiAgKiAgTSQncyBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbi4gVGhleSBqdXN0IGFsbG93IGNvcHlpbmcgb3Igc3dhcHBpbmcKICAqICB3aXRoaW4gb25lIGltYWdlbGlzdCAoaGltbERzdCBhbmQgaGltbFNyYyBtdXN0IGJlIHRoZSBzYW1lKS4KKyAqCisgKiAgUkVUVVJOUworICogICAgLi4uCiAgKi8KIAogQk9PTDMyIFdJTkFQSSBJbWFnZUxpc3RfQ29weSAoCkBAIC00OTEsNyArNDgyLDggQEAKICAqICBDcmVhdGVzIGFuIGltYWdlbGlzdCBvZiB0aGUgZ2l2ZW4gaW1hZ2Ugc2l6ZSBhbmQgbnVtYmVyIG9mIGltYWdlcy4KICAqCiAgKiAgUkVUVVJOUwotICogICAgSGFuZGxlIG9mIHRoZSBjcmVhdGVkIGltYWdlIGxpc3QsIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKiAgICBIYW5kbGUgb2YgdGhlIGNyZWF0ZWQgaW1hZ2UgbGlzdC4KKyAqICAgIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCiAgKi8KIAogSElNQUdFTElTVCBXSU5BUEkgSW1hZ2VMaXN0X0NyZWF0ZSAoCkBAIC01MDUsNiArNDk3LDEzIEBACiAgICAgSElNQUdFTElTVCBoaW1sOwogICAgIEhEQzMyICAgICAgaGRjOwogICAgIElOVDMyICAgICAgbkNvdW50OworICAgIEhCSVRNQVAzMiAgaGJtVGVtcDsKKyAgICBXT1JEICAgICAgIGFCaXRCbGVuZDI1WzE2XSA9IAorICAgICAgICB7MHg3Nzc3LCAweEREREQsIDB4Nzc3NywgMHhERERELCAweDc3NzcsIDB4RERERCwgMHg3Nzc3LCAweEREREQsCisgICAgICAgICAweDc3NzcsIDB4RERERCwgMHg3Nzc3LCAweEREREQsIDB4Nzc3NywgMHhERERELCAweDc3NzcsIDB4RERERH07CisgICAgV09SRCAgICAgICBhQml0QmxlbmQ1MFsxNl0gPQorICAgICAgICB7MHg1NTU1LCAweEFBQUEsIDB4NTU1NSwgMHhBQUFBLCAweDU1NTUsIDB4QUFBQSwgMHg1NTU1LCAweEFBQUEsCisgICAgICAgICAweDU1NTUsIDB4QUFBQSwgMHg1NTU1LCAweEFBQUEsIDB4NTU1NSwgMHhBQUFBLCAweDU1NTUsIDB4QUFBQX07CiAKICAgICBoaW1sID0gKEhJTUFHRUxJU1QpTG9jYWxBbGxvYzMyIChMTUVNX0ZJWEVEIHwgTE1FTV9aRVJPSU5JVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IF9JTUFHRUxJU1QpKTsKQEAgLTU1Myw2ICs1NTIsMTUgQEAKICAgICBlbHNlCiAgICAgICAgIGhpbWwtPmhibU1hc2sgPSAwOwogCisgICAgLyogY3JlYXRlIGJsZW5kaW5nIGJydXNoZXMgKi8KKyAgICBoYm1UZW1wID0gQ3JlYXRlQml0bWFwMzIgKDE2LCAxNiwgMSwgMSwgJmFCaXRCbGVuZDI1KTsKKyAgICBoaW1sLT5oYnJCbGVuZDI1ID0gQ3JlYXRlUGF0dGVybkJydXNoMzIgKGhibVRlbXApOworICAgIERlbGV0ZU9iamVjdDMyIChoYm1UZW1wKTsKKworICAgIGhibVRlbXAgPSBDcmVhdGVCaXRtYXAzMiAoMTYsIDE2LCAxLCAxLCAmYUJpdEJsZW5kNTApOworICAgIGhpbWwtPmhickJsZW5kNTAgPSBDcmVhdGVQYXR0ZXJuQnJ1c2gzMiAoaGJtVGVtcCk7CisgICAgRGVsZXRlT2JqZWN0MzIgKGhibVRlbXApOworCiAgICAgcmV0dXJuIChoaW1sKTsgICAgCiB9CiAKQEAgLTU2Myw3ICs1NzEsOCBAQAogICogIERlc3Ryb3kgdGhlIGdpdmVuIGltYWdlbGlzdC4KICAqCiAgKiAgUkVUVVJOUwotICogICAgVFJVRSBpZiB0aGUgaW1hZ2UgbGlzdCB3YXMgZGVzdHJ5ZWQsIEZBTFNFIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICogICAgVFJVRSBpZiB0aGUgaW1hZ2UgbGlzdCB3YXMgZGVzdHJveWVkLgorICogICAgRkFMU0UgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCiAgKi8KIAogQk9PTDMyIFdJTkFQSSBJbWFnZUxpc3RfRGVzdHJveSAoCkBAIC02MTQsNyArNjIzLDYgQEAKICAgICBGSVhNRSAoaW1hZ2VsaXN0LCAiZW1wdHkgc3R1YiFcbiIpOwogCiAKLQogICAgIFNldEN1cnNvcjMyIChoY3VySW50ZXJuYWwpOwogICAgIGhjdXJJbnRlcm5hbCA9IDA7CiAgCkBAIC03MjcsMjMgKzczNSwyNCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgCQkgSW1hZ2VMaXN0X0RyYXdpbmRpcmVjdCAgIFtDT01DVEwzMi41Ml0KKyAqCSAJCSBJbWFnZUxpc3RfRHJhd0luZGlyZWN0ICAgW0NPTUNUTDMyLjUyXQogICovCiAKIEJPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X0RyYXdJbmRpcmVjdCAoCiAJSU1BR0VMSVNURFJBV1BBUkFNUyAqcGltbGRwKQogewogICAgIEhJTUFHRUxJU1QgaGltbExvY2FsOwotICAgIEhEQzMyICAgICAgaGRjSW1hZ2VMaXN0LGhkY01hc2ssIGhkY1RlbXBJbWFnZTsKLSAgICBIQklUTUFQMzIgIGhibU1hc2ssIGhibVRlbXBJbWFnZTsKKyAgICBIREMzMiAgICAgIGhkY0ltYWdlTGlzdCwgaGRjVGVtcEltYWdlOworICAgIEhCSVRNQVAzMiAgaGJtVGVtcEltYWdlOwogICAgIEhCUlVTSDMyICAgaEJydXNoLCBoT2xkQnJ1c2g7Ci0gICAgSU5UMzIgICAgICBuT3ZsSWR4LCBuU3RhcnRYLCBuUnVuWCwgblJ1blk7Ci0gICAgQ09MT1JSRUYgICBjbHJCbGVuZCwgY2xySW1hZ2U7CisgICAgSU5UMzIgICAgICBuT3ZsSWR4OworICAgIENPTE9SUkVGICAgY2xyQmxlbmQ7CiAgICAgQk9PTDMyICAgICBiSW1hZ2U7ICAgICAgIC8qIGRyYXcgaW1hZ2UgPyAqLwogICAgIEJPT0wzMiAgICAgYkltYWdlVHJhbnM7ICAvKiBkcmF3IGltYWdlIHRyYW5zcGFyZW50ID8gKi8KICAgICBCT09MMzIgICAgIGJNYXNrOyAgICAgICAgLyogZHJhdyBtYXNrID8gKi8KICAgICBCT09MMzIgICAgIGJNYXNrVHJhbnM7ICAgLyogZHJhdyBtYXNrIHRyYW5zcGFyZW50ID8gKi8KLSAgICBCT09MMzIgICAgIGJCbGVuZCA9IEZBTFNFOworICAgIEJPT0wzMiAgICAgYkJsZW5kMjU7CisgICAgQk9PTDMyICAgICBiQmxlbmQ1MDsKIAogICAgIGlmIChwaW1sZHAgPT0gTlVMTCkgcmV0dXJuIChGQUxTRSk7CiAgICAgaWYgKHBpbWxkcC0+Y2JTaXplIDwgc2l6ZW9mKElNQUdFTElTVERSQVdQQVJBTVMpKSByZXR1cm4gKEZBTFNFKTsKQEAgLTc1NSw2ICs3NjQsOCBAQAogICAgIGJJbWFnZVRyYW5zID0gRkFMU0U7CiAgICAgYk1hc2sgICAgICAgPSBGQUxTRTsKICAgICBiTWFza1RyYW5zICA9IEZBTFNFOworICAgIGJCbGVuZDI1ICAgID0gRkFMU0U7CisgICAgYkJsZW5kNTAgICAgPSBGQUxTRTsKICAgICBpZiAoKGhpbWxMb2NhbC0+Y2xyQmsgPT0gQ0xSX05PTkUpICYmIChoaW1sTG9jYWwtPmhibU1hc2spKQogICAgIHsKICAgICAgICAgYkltYWdlVHJhbnMgPSBUUlVFOwpAQCAtNzc4LDkwICs3ODksOTIgQEAKICAgICAgICAgYkltYWdlID0gRkFMU0U7CiAgICAgfQogICAgIGlmICgocGltbGRwLT5mU3R5bGUgJiBJTERfVFJBTlNQQVJFTlQpICYmIChoaW1sTG9jYWwtPmhibU1hc2spKQorICAgIHsKICAgICAgICAgYk1hc2tUcmFucyA9IFRSVUU7CisgICAgICAgIGJJbWFnZVRyYW5zID0gVFJVRTsKKyAgICB9CiAgICAgaWYgKChoaW1sTG9jYWwtPmNsckJrID09IENMUl9OT05FKSAmJiAoaGltbExvY2FsLT5oYm1NYXNrKSkKICAgICAgICAgYk1hc2tUcmFucyA9IFRSVUU7CiAKLQotICAgIGlmICgocGltbGRwLT5mU3R5bGUgJiBJTERfQkxFTkQyNSkgfHwgKHBpbWxkcC0+ZlN0eWxlICYgSUxEX0JMRU5ENTApKQotICAgICAgICBiQmxlbmQgPSBUUlVFOworICAgIGlmIChwaW1sZHAtPmZTdHlsZSAmIElMRF9CTEVORDUwKQorICAgICAgICBiQmxlbmQ1MCA9IFRSVUU7CisgICAgZWxzZSBpZiAocGltbGRwLT5mU3R5bGUgJiBJTERfQkxFTkQyNSkKKyAgICAgICAgYkJsZW5kMjUgPSBUUlVFOwogCiAgICAgaGRjSW1hZ2VMaXN0ID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOwogCi0KICAgICBpZiAoYk1hc2spCiAgICAgewogICAgICAgICAvKiBkcmF3IHRoZSBtYXNrICovCiAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWxMb2NhbC0+aGJtTWFzayk7CiAgICAgICAgIAotICAgICAgICBCaXRCbHQzMiAocGltbGRwLT5oZGNEc3QsIHBpbWxkcC0+eCwgcGltbGRwLT55LCBwaW1sZHAtPmhpbWwtPmN4LAotICAgICAgICAgICAgICAgICAgcGltbGRwLT5oaW1sLT5jeSwgaGRjSW1hZ2VMaXN0LAotICAgICAgICAgICAgICAgICAgcGltbGRwLT5oaW1sLT5jeCAqIHBpbWxkcC0+aSwgMCwKKyAgICAgICAgQml0Qmx0MzIgKHBpbWxkcC0+aGRjRHN0LCBwaW1sZHAtPngsIHBpbWxkcC0+eSwKKyAgICAgICAgICAgICAgICAgIGhpbWxMb2NhbC0+Y3gsIGhpbWxMb2NhbC0+Y3ksIGhkY0ltYWdlTGlzdCwKKyAgICAgICAgICAgICAgICAgIGhpbWxMb2NhbC0+Y3ggKiBwaW1sZHAtPmksIDAsCiAgICAgICAgICAgICAgICAgICBiTWFza1RyYW5zID8gU1JDQU5EIDogU1JDQ09QWSk7CiAgICAgfQorCiAgICAgaWYgKGJJbWFnZSkKICAgICB7CiAgICAgICAgIC8qIGRyYXcgdGhlIGltYWdlICovCiAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNJbWFnZUxpc3QsIGhpbWxMb2NhbC0+aGJtSW1hZ2UpOwotICAgICAgICBpZiAoIWJCbGVuZCkKKworICAgICAgICBpZiAoIWJJbWFnZVRyYW5zKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWJJbWFnZVRyYW5zKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhCcnVzaCA9IENyZWF0ZVNvbGlkQnJ1c2gzMiAoaGltbExvY2FsLT5jbHJCayk7Ci0gICAgICAgICAgICAgICAgaE9sZEJydXNoID0gU2VsZWN0T2JqZWN0MzIgKHBpbWxkcC0+aGRjRHN0LCBoQnJ1c2gpOwotICAgICAgICAgICAgICAgIFBhdEJsdDMyIChwaW1sZHAtPmhkY0RzdCwgcGltbGRwLT54LCBwaW1sZHAtPnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhpbWxMb2NhbC0+Y3gsIGhpbWxMb2NhbC0+Y3ksIFBBVENPUFkpOwotICAgICAgICAgICAgICAgIERlbGV0ZU9iamVjdDMyIChTZWxlY3RPYmplY3QzMiAocGltbGRwLT5oZGNEc3QsIGhPbGRCcnVzaCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQml0Qmx0MzIgKHBpbWxkcC0+aGRjRHN0LCBwaW1sZHAtPngsIHBpbWxkcC0+eSwgaGltbExvY2FsLT5jeCwKLSAgICAgICAgICAgICAgICAgICAgICBoaW1sTG9jYWwtPmN5LCBoZGNJbWFnZUxpc3QsIGhpbWxMb2NhbC0+Y3ggKiBwaW1sZHAtPmksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgU1JDUEFJTlQpOworICAgICAgICAgICAgaEJydXNoID0gQ3JlYXRlU29saWRCcnVzaDMyIChoaW1sTG9jYWwtPmNsckJrKTsKKyAgICAgICAgICAgIGhPbGRCcnVzaCA9IFNlbGVjdE9iamVjdDMyIChwaW1sZHAtPmhkY0RzdCwgaEJydXNoKTsKKyAgICAgICAgICAgIFBhdEJsdDMyIChwaW1sZHAtPmhkY0RzdCwgcGltbGRwLT54LCBwaW1sZHAtPnksCisgICAgICAgICAgICAgICAgICAgICAgaGltbExvY2FsLT5jeCwgaGltbExvY2FsLT5jeSwgUEFUQ09QWSk7CisgICAgICAgICAgICBEZWxldGVPYmplY3QzMiAoU2VsZWN0T2JqZWN0MzIgKHBpbWxkcC0+aGRjRHN0LCBoT2xkQnJ1c2gpKTsKICAgICAgICAgfQotICAgICAgICBlbHNlCisKKyAgICAgICAgQml0Qmx0MzIgKHBpbWxkcC0+aGRjRHN0LCBwaW1sZHAtPngsIHBpbWxkcC0+eSwgaGltbExvY2FsLT5jeCwKKyAgICAgICAgICAgICAgICAgIGhpbWxMb2NhbC0+Y3ksIGhkY0ltYWdlTGlzdCwgaGltbExvY2FsLT5jeCAqIHBpbWxkcC0+aSwgMCwKKyAgICAgICAgICAgICAgICAgIFNSQ1BBSU5UKTsKKworICAgICAgICBpZiAoYkJsZW5kMjUgfHwgYkJsZW5kNTApCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChwaW1sZHAtPnJnYkZnID09IENMUl9ERUZBVUxUKQotICAgICAgICAgICAgICAgIGNsckJsZW5kID0gKEdldFN5c0NvbG9yMzIgKENPTE9SX0hJR0hMSUdIVCkgJiAweEZFRkVGRUZFKT4+MTsKKyAgICAgICAgICAgICAgICBjbHJCbGVuZCA9IEdldFN5c0NvbG9yMzIgKENPTE9SX0hJR0hMSUdIVCk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY2xyQmxlbmQgPSAocGltbGRwLT5yZ2JGZyAmIDB4RkVGRUZFRkUpPj4xOworICAgICAgICAgICAgICAgIGNsckJsZW5kID0gcGltbGRwLT5yZ2JGZzsKIAogICAgICAgICAgICAgaGRjVGVtcEltYWdlID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOwogICAgICAgICAgICAgaGJtVGVtcEltYWdlID0gQ3JlYXRlQml0bWFwMzIgKGhpbWxMb2NhbC0+Y3gsIGhpbWxMb2NhbC0+Y3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgaGltbExvY2FsLT51Qml0c1BpeGVsLCBOVUxMKTsKICAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNUZW1wSW1hZ2UsIGhibVRlbXBJbWFnZSk7Ci0gICAgICAgICAgICBQYXRCbHQzMiAoaGRjVGVtcEltYWdlLCAwLCAwLCBoaW1sTG9jYWwtPmN4LCBoaW1sTG9jYWwtPmN5LCBCTEFDS05FU1MpOwogCi0jaWYgMAotICAgICAgICAgICAgaWYgKGJJbWFnZVRyYW5zKQotICAgICAgICAgICAgewotI2VuZGlmCi0gICAgICAgICAgICAgICAgaGRjTWFzayA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNNYXNrLCBoaW1sTG9jYWwtPmhibU1hc2spOwotICAgICAgICAgICAgICAgIG5TdGFydFggPSBwaW1sZHAtPmkgKiBoaW1sTG9jYWwtPmN4OwogCi0gICAgICAgICAgICAgICAgZm9yIChuUnVuWSA9IDA7IG5SdW5ZIDwgaGltbExvY2FsLT5jeTsgblJ1blkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoblJ1blggPSAwOyBuUnVuWCA8IGhpbWxMb2NhbC0+Y3g7IG5SdW5YKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChHZXRQaXhlbDMyIChoZGNNYXNrLCBuU3RhcnRYICsgblJ1blgsIG5SdW5ZKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsckltYWdlID0gR2V0UGl4ZWwzMiAoaGRjSW1hZ2VMaXN0LCBuU3RhcnRYICsgblJ1blgsIG5SdW5ZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHJJbWFnZSA9ICgoY2xySW1hZ2UgJiAweEZFRkVGRUZFKT4+MSkgKyBjbHJCbGVuZDsKKyAgICAgICAgICAgIC8qIG1hc2sgKi8KKyAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNUZW1wSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJsZW5kNTAgPyBoaW1sTG9jYWwtPmhickJsZW5kNTAgOiBoaW1sTG9jYWwtPmhickJsZW5kMjUpOworICAgICAgICAgICAgUGF0Qmx0MzIgKGhkY1RlbXBJbWFnZSwgMCwgMCwgaGltbExvY2FsLT5jeCwgaGltbExvY2FsLT5jeSwgUEFUQ09QWSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRQaXhlbDMyIChoZGNUZW1wSW1hZ2UsIG5SdW5YLCBuUnVuWSwgY2xySW1hZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlTGlzdCwgaGltbExvY2FsLT5oYm1NYXNrKTsKKyAgICAgICAgICAgIEJpdEJsdDMyIChoZGNUZW1wSW1hZ2UsIDAsIDAsIGhpbWxMb2NhbC0+Y3gsCisgICAgICAgICAgICAgICAgICAgICAgaGltbExvY2FsLT5jeSwgaGRjSW1hZ2VMaXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICBwaW1sZHAtPmkgKiBoaW1sTG9jYWwtPmN4LCAwLCBTUkNQQUlOVCk7CiAKLSAgICAgICAgICAgICAgICBEZWxldGVEQzMyIChoZGNNYXNrKTsKLSAgICAgICAgICAgICAgICBCaXRCbHQzMiAocGltbGRwLT5oZGNEc3QsIHBpbWxkcC0+eCwgcGltbGRwLT55LCBoaW1sTG9jYWwtPmN4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBoaW1sTG9jYWwtPmN5LCBoZGNUZW1wSW1hZ2UsIDAsIDAsIFNSQ1BBSU5UKTsKLSNpZiAwCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBCaXRCbHQzMiAocGltbGRwLT5oZGNEc3QsIHBpbWxkcC0+eCwgcGltbGRwLT55LCBoaW1sTG9jYWwtPmN4LAorICAgICAgICAgICAgICAgICAgICAgIGhpbWxMb2NhbC0+Y3ksIGhkY1RlbXBJbWFnZSwgMCwgMCwgU1JDQU5EKTsKIAotICAgICAgICAgICAgfQotI2VuZGlmCisgICAgICAgICAgICAvKiBmaWxsICovCisgICAgICAgICAgICBoQnJ1c2ggPSBDcmVhdGVTb2xpZEJydXNoMzIgKGNsckJsZW5kKTsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNUZW1wSW1hZ2UsIGhCcnVzaCk7CisgICAgICAgICAgICBQYXRCbHQzMiAoaGRjVGVtcEltYWdlLCAwLCAwLCBoaW1sTG9jYWwtPmN4LCBoaW1sTG9jYWwtPmN5LCBQQVRDT1BZKTsKKyAgICAgICAgICAgIERlbGV0ZU9iamVjdDMyIChoQnJ1c2gpOworCisgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjVGVtcEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCbGVuZDUwID8gaGltbExvY2FsLT5oYnJCbGVuZDUwIDogaGltbExvY2FsLT5oYnJCbGVuZDI1KTsKKyAgICAgICAgICAgIFBhdEJsdDMyIChoZGNUZW1wSW1hZ2UsIDAsIDAsIGhpbWxMb2NhbC0+Y3gsIGhpbWxMb2NhbC0+Y3ksIDB4MEEwMzI5KTsKKworICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlTGlzdCwgaGltbExvY2FsLT5oYm1NYXNrKTsKKyAgICAgICAgICAgIEJpdEJsdDMyIChoZGNUZW1wSW1hZ2UsIDAsIDAsIGhpbWxMb2NhbC0+Y3gsCisgICAgICAgICAgICAgICAgICAgICAgaGltbExvY2FsLT5jeSwgaGRjSW1hZ2VMaXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICBwaW1sZHAtPmkgKiBoaW1sTG9jYWwtPmN4LCAwLCBTUkNQQUlOVCk7CisKKyAgICAgICAgICAgIEJpdEJsdDMyIChwaW1sZHAtPmhkY0RzdCwgcGltbGRwLT54LCBwaW1sZHAtPnksIGhpbWxMb2NhbC0+Y3gsCisgICAgICAgICAgICAgICAgICAgICAgaGltbExvY2FsLT5jeSwgaGRjVGVtcEltYWdlLCAwLCAwLCBTUkNQQUlOVCk7CiAKICAgICAgICAgICAgIERlbGV0ZU9iamVjdDMyIChoYm1UZW1wSW1hZ2UpOwogICAgICAgICAgICAgRGVsZXRlREMzMiAoaGRjVGVtcEltYWdlKTsKQEAgLTk0Niw2ICs5NTksMTUgQEAKIH0KIAogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIAkJIEltYWdlTGlzdF9FbmREcmFnICAgW0NPTUNUTDMyLjU0XQorICoKKyAqICBGaW5pc2hlcyBhIGRyYWcgb3BlcmF0aW9uLgorICoKKyAqICBGSVhNRQorICogICAgc2VtaS1zdHViLgorICovCisKIEJPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X0VuZERyYWcgKFZPSUQpCiB7CiAgICAgRklYTUUgKGltYWdlbGlzdCwgInBhcnRpYWxseSBpbXBsZW1lbnRlZCFcbiIpOwpAQCAtOTY1LDYgKzk4NywxNSBAQAogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgCQkgSW1hZ2VMaXN0X0dldEJrQ29sb3IgICBbQ09NQ1RMMzIuNTVdCisgKgorICogIFJldHVybnMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgYW4gaW1hZ2UgbGlzdC4KKyAqCisgKiAgUkVUVVJOUworICogICAgQmFja2dyb3VuZCBjb2xvci4KKyAqLworCiBDT0xPUlJFRiBXSU5BUEkgSW1hZ2VMaXN0X0dldEJrQ29sb3IgKAogCUhJTUFHRUxJU1QgaGltbCkKIHsKQEAgLTk3Miw2ICsxMDAzLDE1IEBACiB9CiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAJCSBJbWFnZUxpc3RfR2V0RHJhZ0ltYWdlICAgW0NPTUNUTDMyLjU2XQorICoKKyAqICBSZXR1cm5zIHRoZSBoYW5kbGUgdG8gdGhlIGludGVybmFsIGRyYWcgaW1hZ2UgbGlzdC4KKyAqCisgKiAgRklYTUUKKyAqICAgIHNlbWktc3R1Yi4KKyAqLworCiBISU1BR0VMSVNUIFdJTkFQSSBJbWFnZUxpc3RfR2V0RHJhZ0ltYWdlICgKIAlQT0lOVDMyICpwcHQsCiAJUE9JTlQzMiAqcHB0SG90c3BvdCkKQEAgLTk4NSw2ICsxMDI1LDEwIEBACiB9CiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAJCSBJbWFnZUxpc3RfR2V0SWNvbiAgIFtDT01DVEwzMi41N10KKyAqLworCiBISUNPTjMyIFdJTkFQSSBJbWFnZUxpc3RfR2V0SWNvbiAoCiAJSElNQUdFTElTVCBoaW1sLCAKIAlJTlQzMiBpLCAKQEAgLTEwMDIsOCArMTA0Niw3IEBACiAgICAgaWkueEhvdHNwb3QgPSAwOwogICAgIGlpLnlIb3RzcG90ID0gMDsKICAgICBpaS5oYm1NYXNrICA9IENyZWF0ZUJpdG1hcDMyIChuV2lkdGgsIG5IZWlnaHQsIDEsIDEsIE5VTEwpOwotICAgIGlpLmhibUNvbG9yID0gQ3JlYXRlQml0bWFwMzIgKG5XaWR0aCwgbkhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAxLCBOVUxMKTsKKyAgICBpaS5oYm1Db2xvciA9IENyZWF0ZUJpdG1hcDMyIChuV2lkdGgsIG5IZWlnaHQsIDEsIDEsIE5VTEwpOwogCiAgICAgaGRjID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIoMCk7CiAKQEAgLTEwMjcsNiArMTA3MCwxMCBAQAogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgCQkgSW1hZ2VMaXN0X0dldEljb25TaXplICAgW0NPTUNUTDMyLjU4XQorICovCisKIEJPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X0dldEljb25TaXplICgKIAlISU1BR0VMSVNUIGhpbWwsCiAJSU5UMzIgKmN4LApAQCAtMTA0NCw2ICsxMDkxLDEwIEBACiB9CiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAJCSBJbWFnZUxpc3RfR2V0SWNvbkNvdW50ICAgW0NPTUNUTDMyLjU5XQorICovCisKIElOVDMyIFdJTkFQSSBJbWFnZUxpc3RfR2V0SW1hZ2VDb3VudCAoCiAJSElNQUdFTElTVCBoaW1sKQogewpAQCAtMTA1MSw2ICsxMTAyLDEwIEBACiB9CiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAJCSBJbWFnZUxpc3RfR2V0SW1hZ2VJbmZvICAgW0NPTUNUTDMyLjYwXQorICovCisKIEJPT0wzMiBXSU5BUEkgSW1hZ2VMaXN0X0dldEltYWdlSW5mbyAoCiAJSElNQUdFTElTVCBoaW1sLAogCUlOVDMyIGksCkBAIC0xMDcwLDcgKzExMjUsMTIgQEAKIH0KIAogCi0vKiBJIGRvbid0IGtub3cgaWYgaXQgaXMgcmVhbGx5IGEgQk9PTDMyIG9yIHNvbWV0aGluZyBlbHNlISEhPz8gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgCQkgSW1hZ2VMaXN0X0dldEltYWdlUmVjdCAgIFtDT01DVEwzMi42MV0KKyAqCisgKiAgQ09NTUVOVFMKKyAqICAgIEkgZG9uJ3Qga25vdyBpZiBpdCByZWFsbHkgcmV0dXJucyBhIEJPT0wzMiBvciBzb21ldGhpbmcgZWxzZSEhIT8/CisgKi8KIAogQk9PTDMyIFdJTkFQSSBJbWFnZUxpc3RfR2V0SW1hZ2VSZWN0ICgKIAlISU1BR0VMSVNUIGhpbWwsCkBAIC0xMDkwLDYgKzExNTAsMTAgQEAKIH0KIAogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIAkJIEltYWdlTGlzdF9Mb2FkSW1hZ2UzMkEgICBbQ09NQ1RMMzIuNjNdCisgKi8KKwogSElNQUdFTElTVCBXSU5BUEkgSW1hZ2VMaXN0X0xvYWRJbWFnZTMyQSAoCiAJSElOU1RBTkNFMzIgaGksCiAJTFBDU1RSIGxwYm1wLApAQCAtMTE1Miw2ICsxMjE2LDEwIEBACiB9CiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAJCSBJbWFnZUxpc3RfTG9hZEltYWdlMzJXICAgW0NPTUNUTDMyLjY0XQorICovCisKIEhJTUFHRUxJU1QgV0lOQVBJIEltYWdlTGlzdF9Mb2FkSW1hZ2UzMlcgKAogCUhJTlNUQU5DRTMyIGhpLAogCUxQQ1dTVFIgbHBibXAsCkBAIC0xMjE3LDYgKzEyODUsMTAgQEAKIH0KIAogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIAkJIEltYWdlTGlzdF9NZXJnZSAgIFtDT01DVEwzMi42NV0KKyAqLworCiBISU1BR0VMSVNUIFdJTkFQSSBJbWFnZUxpc3RfTWVyZ2UgKAogCUhJTUFHRUxJU1QgaGltbDEsCiAJSU5UMzIgaTEsCkBAIC0xMjM0LDcgKzEzMDYsMTUgQEAKICAgICBpZiAoKGhpbWwxID09IE5VTEwpIHx8IChoaW1sMiA9PSBOVUxMKSkgcmV0dXJuIChOVUxMKTsKIAogICAgIC8qIGNoZWNrIGluZGljZXMgKi8KKyAgICBpZiAoKGkxIDwgMCkgfHwgKGkxID49IGhpbWwxLT5jQ3VySW1hZ2UpKSB7CisgICAgICAgIEVSUiAoaW1hZ2VsaXN0LCAiSW5kZXggMSBvdXQgb2YgcmFuZ2UhICVkXG4iLCBpMSk7CisgICAgICAgIHJldHVybiAoTlVMTCk7CisgICAgfQogCisgICAgaWYgKChpMiA8IDApIHx8IChpMiA+PSBoaW1sMi0+Y0N1ckltYWdlKSkgeworICAgICAgICBFUlIgKGltYWdlbGlzdCwgIkluZGV4IDIgb3V0IG9mIHJhbmdlISAlZFxuIiwgaTIpOworICAgICAgICByZXR1cm4gKE5VTEwpOworICAgIH0KIAogICAgIGlmICh4T2ZmcyA+IDApIHsKICAgICAgICAgY3hEc3QgPSBfTUFYIChoaW1sMS0+Y3gsIHhPZmZzICsgaGltbDItPmN4KTsKQEAgLTE0MzUsOSArMTUxNSw2IEBACiAKICAgICAgICAgaGltbC0+Y0N1ckltYWdlLS07CiAgICAgICAgIGhpbWwtPmNNYXhJbWFnZSA9IGhpbWwtPmNDdXJJbWFnZSArIGhpbWwtPmNHcm93OwotCi0gICAgICAgIFRSQUNFIChpbWFnZWxpc3QsICJOdW1iZXIgb2YgaW1hZ2VzOiAlZFxuIiwgaGltbC0+Y0N1ckltYWdlKTsKLSAgICAgICAgVFJBQ0UgKGltYWdlbGlzdCwgIk1heC4gbnVtYmVyIG9mIGltYWdlczogJWRcbiIsIGhpbWwtPmNNYXhJbWFnZSk7CiAgICAgfQogCiAgICAgcmV0dXJuIChUUlVFKTsKQEAgLTE1MDcsNiArMTU4NCw3IEBACiAgICAgQklUTUFQMzIgYm1wOwogI2VuZGlmCiAKKyAgICBpZiAoaGltbCA9PSBOVUxMKSByZXR1cm4gKC0xKTsKICAgICBpZiAoKGkgPj0gaGltbC0+Y0N1ckltYWdlKSB8fCAoaSA8IC0xKSkgcmV0dXJuICgtMSk7CiAKICNpZmRlZiBfX0dFVF9JQ09OX0lORk9fSEFDS19fCkBAIC0xNTI1LDggKzE2MDMsOSBAQAogICAgIGlmIChpID09IC0xKSB7CiAgICAgICAgIGlmIChoaW1sLT5jQ3VySW1hZ2UgKyAxID49IGhpbWwtPmNNYXhJbWFnZSkKICAgICAgICAgICAgIElNQUdFTElTVF9JbnRlcm5hbEdyb3dCaXRtYXBzIChoaW1sLCAxKTsKKwogICAgICAgICBuSW5kZXggPSBoaW1sLT5jQ3VySW1hZ2U7Ci0gICAgICAgIGhpbWwtPmNDdXJJbWFnZSArKzsKKyAgICAgICAgaGltbC0+Y0N1ckltYWdlKys7CiAgICAgfQogICAgIGVsc2UKICAgICAgICAgbkluZGV4ID0gaTsKQEAgLTE2NDUsMjQgKzE3MjQsMjUgQEAKIHsKICAgICBIREMzMiAgICAgaGRjSW1hZ2VMaXN0LCBoZGNCaXRtYXA7CiAgICAgSEJJVE1BUDMyIGhibU5ld0JpdG1hcDsKLSAgICBJTlQzMiAgICAgbk5ld1dpZHRoOworICAgIElOVDMyICAgICBuTmV3Q291bnQsIG5Db3B5Q291bnQ7CiAKICAgICBpZiAoaGltbCA9PSBOVUxMKSByZXR1cm4gKEZBTFNFKTsKICAgICBpZiAoaGltbC0+Y0N1ckltYWdlIDw9IGlJbWFnZUNvdW50KSByZXR1cm4gKEZBTFNFKTsKICAgICBpZiAoaGltbC0+Y01heEltYWdlID4gaUltYWdlQ291bnQpIHJldHVybiAoVFJVRSk7CiAKLSAgICBuTmV3V2lkdGggPSAoaUltYWdlQ291bnQgKyBoaW1sLT5jR3JvdykgKiBoaW1sLT5jeDsKKyAgICBuTmV3Q291bnQgPSBpSW1hZ2VDb3VudCArIGhpbWwtPmNHcm93OworICAgIG5Db3B5Q291bnQgPSBfTUlOKGhpbWwtPmNDdXJJbWFnZSwgaUltYWdlQ291bnQpOwogCiAgICAgaGRjSW1hZ2VMaXN0ID0gQ3JlYXRlQ29tcGF0aWJsZURDMzIgKDApOwogICAgIGhkY0JpdG1hcCA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKIAotICAgIGhibU5ld0JpdG1hcCA9Ci0gICAgICAgIENyZWF0ZUJpdG1hcDMyIChuTmV3V2lkdGgsIGhpbWwtPmN5LCAxLCBoaW1sLT51Qml0c1BpeGVsLCBOVUxMKTsKKyAgICBoYm1OZXdCaXRtYXAgPSBDcmVhdGVCaXRtYXAzMiAobk5ld0NvdW50ICogaGltbC0+Y3gsIGhpbWwtPmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBoaW1sLT51Qml0c1BpeGVsLCBOVUxMKTsKICAgICBpZiAoaGJtTmV3Qml0bWFwID09IDApCiAgICAgewogICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjSW1hZ2VMaXN0LCBoaW1sLT5oYm1JbWFnZSk7CiAgICAgICAgIFNlbGVjdE9iamVjdDMyIChoZGNCaXRtYXAsIGhibU5ld0JpdG1hcCk7Ci0gICAgICAgIEJpdEJsdDMyIChoZGNCaXRtYXAsIDAsIDAsIGhpbWwtPmNDdXJJbWFnZSAqIGhpbWwtPmN4LCBoaW1sLT5jeSwKKyAgICAgICAgQml0Qmx0MzIgKGhkY0JpdG1hcCwgMCwgMCwgbkNvcHlDb3VudCAqIGhpbWwtPmN4LCBoaW1sLT5jeSwKICAgICAgICAgICAgICAgICAgIGhkY0ltYWdlTGlzdCwgMCwgMCwgU1JDQ09QWSk7CiAgICAgICAgIERlbGV0ZU9iamVjdDMyIChoaW1sLT5oYm1JbWFnZSk7CiAgICAgICAgIGhpbWwtPmhibUltYWdlID0gaGJtTmV3Qml0bWFwOwpAQCAtMTY3NCwxNCArMTc1NCwxMyBAQAogCiAgICAgaWYgKGhpbWwtPmhibU1hc2spCiAgICAgewotICAgICAgICBoYm1OZXdCaXRtYXAgPSAKLSAgICAgICAgICAgIENyZWF0ZUJpdG1hcDMyIChuTmV3V2lkdGgsIGhpbWwtPmN5LCAxLCAxLCBOVUxMKTsKLQorICAgICAgICBoYm1OZXdCaXRtYXAgPSBDcmVhdGVCaXRtYXAzMiAobk5ld0NvdW50ICogaGltbC0+Y3gsIGhpbWwtPmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgTlVMTCk7CiAgICAgICAgIGlmIChoYm1OZXdCaXRtYXAgIT0gMCkKICAgICAgICAgewogICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIgKGhkY0ltYWdlTGlzdCwgaGltbC0+aGJtTWFzayk7CiAgICAgICAgICAgICBTZWxlY3RPYmplY3QzMiAoaGRjQml0bWFwLCBoYm1OZXdCaXRtYXApOwotICAgICAgICAgICAgQml0Qmx0MzIgKGhkY0JpdG1hcCwgMCwgMCwgaGltbC0+Y0N1ckltYWdlICogaGltbC0+Y3gsIGhpbWwtPmN5LAorICAgICAgICAgICAgQml0Qmx0MzIgKGhkY0JpdG1hcCwgMCwgMCwgbkNvcHlDb3VudCAqIGhpbWwtPmN4LCBoaW1sLT5jeSwKICAgICAgICAgICAgICAgICAgICAgICBoZGNJbWFnZUxpc3QsIDAsIDAsIFNSQ0NPUFkpOwogICAgICAgICAgICAgRGVsZXRlT2JqZWN0MzIgKGhpbWwtPmhibU1hc2spOwogICAgICAgICAgICAgaGltbC0+aGJtTWFzayA9IGhibU5ld0JpdG1hcDsKQEAgLTE2OTUsOCArMTc3NCwxMCBAQAogICAgIERlbGV0ZURDMzIgKGhkY0ltYWdlTGlzdCk7CiAgICAgRGVsZXRlREMzMiAoaGRjQml0bWFwKTsKIAotICAgIC8qIFVwZGF0ZSBtYXggaW1hZ2UgY291bnQgKi8KLSAgICBoaW1sLT5jTWF4SW1hZ2UgPSBpSW1hZ2VDb3VudCArIGhpbWwtPmN4OworICAgIC8qIFVwZGF0ZSBtYXggaW1hZ2UgY291bnQgYW5kIGN1cnJlbnQgaW1hZ2UgY291bnQgKi8KKyAgICBoaW1sLT5jTWF4SW1hZ2UgPSBuTmV3Q291bnQ7CisgICAgaWYgKGhpbWwtPmNDdXJJbWFnZSA+IG5Db3B5Q291bnQpCisgICAgICAgIGhpbWwtPmNDdXJJbWFnZSA9IG5Db3B5Q291bnQ7CiAKICAgICByZXR1cm4gKFRSVUUpOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9sc3RyLmMgYi9taXNjL2xzdHIuYwppbmRleCBmZjM1NzZhLi4wNWI3ZmIzIDEwMDY0NAotLS0gYS9taXNjL2xzdHIuYworKysgYi9taXNjL2xzdHIuYwpAQCAtNSwxMiArNSwxMyBAQAogICogQ29weXJpZ2h0IDE5OTYgTWFyY3VzIE1laXNzbmVyCiAgKi8KIAorI2luY2x1ZGUgImNvbmZpZy5oIgorCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImNvbmZpZy5oIgogCiAjaWZkZWYgSEFWRV9XQ1RZUEVfSAogIyBpbmNsdWRlIDx3Y3R5cGUuaD4KQEAgLTE4Nyw3ICsxODgsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENoYXJOZXh0MzJBICAgKFVTRVIzMi4yOCkKKyAqICAgICAgICAgICBDaGFyTmV4dDMyQSAgIChVU0VSMzIuMjkpCiAgKi8KIExQU1RSIFdJTkFQSSBDaGFyTmV4dDMyQSggTFBDU1RSIHB0ciApCiB7CkBAIC0xOTgsNyArMTk5LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDaGFyTmV4dEV4MzJBICAgKFVTRVIzMi4yOSkKKyAqICAgICAgICAgICBDaGFyTmV4dEV4MzJBICAgKFVTRVIzMi4zMCkKICAqLwogTFBTVFIgV0lOQVBJIENoYXJOZXh0RXgzMkEoIFdPUkQgY29kZXBhZ2UsIExQQ1NUUiBwdHIsIERXT1JEIGZsYWdzICkKIHsKQEAgLTIwOSw3ICsyMTAsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENoYXJOZXh0RXhXICAgKFVTRVIzMi4zMCkKKyAqICAgICAgICAgICBDaGFyTmV4dEV4VyAgIChVU0VSMzIuMzEpCiAgKi8KIExQV1NUUiBXSU5BUEkgQ2hhck5leHRFeDMyVyhXT1JEIGNvZGVwYWdlLExQQ1dTVFIgeCxEV09SRCBmbGFncykKIHsKQEAgLTIxOSw3ICsyMjAsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDaGFyTmV4dFcgICAoVVNFUjMyLjMxKQorICogICAgICAgICAgIENoYXJOZXh0VyAgIChVU0VSMzIuMzIpCiAgKi8KIExQV1NUUiBXSU5BUEkgQ2hhck5leHQzMlcoTFBDV1NUUiB4KQogewpAQCAtMjI4LDcgKzIyOSw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENoYXJQcmV2MzJBICAgKFVTRVIzMi4zMikKKyAqICAgICAgICAgICBDaGFyUHJldjMyQSAgIChVU0VSMzIuMzMpCiAgKi8KIExQU1RSIFdJTkFQSSBDaGFyUHJldjMyQSggTFBDU1RSIHN0YXJ0LCBMUENTVFIgcHRyICkKIHsKQEAgLTI0Myw3ICsyNDQsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENoYXJQcmV2RXgzMkEgICAoVVNFUjMyLjMzKQorICogICAgICAgICAgIENoYXJQcmV2RXgzMkEgICAoVVNFUjMyLjM0KQogICovCiBMUFNUUiBXSU5BUEkgQ2hhclByZXZFeDMyQSggV09SRCBjb2RlcGFnZSwgTFBDU1RSIHN0YXJ0LCBMUENTVFIgcHRyLCBEV09SRCBmbGFncyApCiB7CkBAIC0yNTgsNyArMjU5LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDaGFyUHJldkV4VyAgIChVU0VSMzIuMzQpCisgKiAgICAgICAgICAgQ2hhclByZXZFeFcgICAoVVNFUjMyLjM1KQogICovCiBMUFdTVFIgV0lOQVBJIENoYXJQcmV2RXgzMlcoV09SRCBjb2RlcGFnZSxMUENXU1RSIHN0YXJ0LExQQ1dTVFIgeCxEV09SRCBmbGFncykKIHsKQEAgLTI2OCw3ICsyNjksNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDaGFyUHJldlcgICAoVVNFUjMyLjM1KQorICogICAgICAgICAgIENoYXJQcmV2VyAgIChVU0VSMzIuMzYpCiAgKi8KIExQV1NUUiBXSU5BUEkgQ2hhclByZXYzMlcoTFBDV1NUUiBzdGFydCxMUENXU1RSIHgpCiB7CkBAIC0yNzcsNyArMjc4LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ2hhckxvd2VyQSAgIChVU0VSMzIuMjQpCisgKiAgICAgICAgICAgQ2hhckxvd2VyQSAgIChVU0VSMzIuMjUpCiAgKiBGSVhNRTogaGFuZGxlIGN1cnJlbnQgbG9jYWxlCiAgKi8KIExQU1RSIFdJTkFQSSBDaGFyTG93ZXIzMkEoTFBTVFIgeCkKQEAgLTI5OCw3ICsyOTksNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDaGFyTG93ZXJCdWZmQSAgIChVU0VSMzIuMjUpCisgKiAgICAgICAgICAgQ2hhckxvd2VyQnVmZkEgICAoVVNFUjMyLjI2KQogICogRklYTUU6IGhhbmRsZSBjdXJyZW50IGxvY2FsZQogICovCiBEV09SRCBXSU5BUEkgQ2hhckxvd2VyQnVmZjMyQShMUFNUUiB4LERXT1JEIGJ1ZmxlbikKQEAgLTMxNiw3ICszMTcsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDaGFyTG93ZXJCdWZmVyAgIChVU0VSMzIuMjYpCisgKiAgICAgICAgICAgQ2hhckxvd2VyQnVmZlcgICAoVVNFUjMyLjI3KQogICogRklYTUU6IGhhbmRsZSBjdXJyZW50IGxvY2FsZQogICovCiBEV09SRCBXSU5BUEkgQ2hhckxvd2VyQnVmZjMyVyhMUFdTVFIgeCxEV09SRCBidWZsZW4pCkBAIC0zMzQsNyArMzM1LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ2hhckxvd2VyVyAgIChVU0VSMzIuMjcpCisgKiAgICAgICAgICAgQ2hhckxvd2VyVyAgIChVU0VSMzIuMjgpCiAgKiBGSVhNRTogaGFuZGxlIGN1cnJlbnQgbG9jYWxlCiAgKi8KIExQV1NUUiBXSU5BUEkgQ2hhckxvd2VyMzJXKExQV1NUUiB4KQpAQCAtMzUzLDcgKzM1NCw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENoYXJVcHBlcjMyQSAgIChVU0VSMzIuNDApCisgKiAgICAgICAgICAgQ2hhclVwcGVyMzJBICAgKFVTRVIzMi40MSkKICAqIEZJWE1FOiBoYW5kbGUgY3VycmVudCBsb2NhbGUKICAqLwogTFBTVFIgV0lOQVBJIENoYXJVcHBlcjMyQShMUFNUUiB4KQpAQCAtMzcyLDcgKzM3Myw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENoYXJVcHBlckJ1ZmZBICAgKFVTRVIzMi40MSkKKyAqICAgICAgICAgICBDaGFyVXBwZXJCdWZmQSAgIChVU0VSMzIuNDIpCiAgKiBGSVhNRTogaGFuZGxlIGN1cnJlbnQgbG9jYWxlCiAgKi8KIERXT1JEIFdJTkFQSSBDaGFyVXBwZXJCdWZmMzJBKExQU1RSIHgsRFdPUkQgYnVmbGVuKQpAQCAtMzkwLDcgKzM5MSw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENoYXJVcHBlckJ1ZmZXICAgKFVTRVIzMi40MikKKyAqICAgICAgICAgICBDaGFyVXBwZXJCdWZmVyAgIChVU0VSMzIuNDMpCiAgKiBGSVhNRTogaGFuZGxlIGN1cnJlbnQgbG9jYWxlCiAgKi8KIERXT1JEIFdJTkFQSSBDaGFyVXBwZXJCdWZmMzJXKExQV1NUUiB4LERXT1JEIGJ1ZmxlbikKQEAgLTQwOCw3ICs0MDksNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDaGFyVXBwZXJXICAgKFVTRVIzMi40MykKKyAqICAgICAgICAgICBDaGFyVXBwZXJXICAgKFVTRVIzMi40NCkKICAqIEZJWE1FOiBoYW5kbGUgY3VycmVudCBsb2NhbGUKICAqLwogTFBXU1RSIFdJTkFQSSBDaGFyVXBwZXIzMlcoTFBXU1RSIHgpCkBAIC00MjcsNyArNDI4LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgSXNDaGFyQWxwaGFBICAgKFVTRVIzMi4zMzApCisgKiAgICAgICAgICAgSXNDaGFyQWxwaGFBICAgKFVTRVIzMi4zMzEpCiAgKiBGSVhNRTogaGFuZGxlIGN1cnJlbnQgbG9jYWxlCiAgKi8KIEJPT0wzMiBXSU5BUEkgSXNDaGFyQWxwaGEzMkEoQ0hBUiB4KQpAQCAtNDM2LDcgKzQzNyw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIElzQ2hhckFscGhhTnVtZXJpY0EgICAoVVNFUjMyLjMzMSkKKyAqICAgICAgICAgICBJc0NoYXJBbHBoYU51bWVyaWNBICAgKFVTRVIzMi4zMzIpCiAgKiBGSVhNRTogaGFuZGxlIGN1cnJlbnQgbG9jYWxlCiAgKi8KIEJPT0wzMiBXSU5BUEkgSXNDaGFyQWxwaGFOdW1lcmljMzJBKENIQVIgeCkKQEAgLTQ0NSw3ICs0NDYsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBJc0NoYXJBbHBoYU51bWVyaWNXICAgKFVTRVIzMi4zMzIpCisgKiAgICAgICAgICAgSXNDaGFyQWxwaGFOdW1lcmljVyAgIChVU0VSMzIuMzMzKQogICogRklYTUU6IGhhbmRsZSBjdXJyZW50IGxvY2FsZQogICovCiBCT09MMzIgV0lOQVBJIElzQ2hhckFscGhhTnVtZXJpYzMyVyhXQ0hBUiB4KQpAQCAtNDU0LDcgKzQ1NSw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIElzQ2hhckFscGhhVyAgIChVU0VSMzIuMzMzKQorICogICAgICAgICAgIElzQ2hhckFscGhhVyAgIChVU0VSMzIuMzM0KQogICogRklYTUU6IGhhbmRsZSBjdXJyZW50IGxvY2FsZQogICovCiBCT09MMzIgV0lOQVBJIElzQ2hhckFscGhhMzJXKFdDSEFSIHgpCkBAIC00NjMsNyArNDY0LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgSXNDaGFyTG93ZXIzMkEgICAoVVNFUjMyLjMzNCkKKyAqICAgICAgICAgICBJc0NoYXJMb3dlcjMyQSAgIChVU0VSMzIuMzM1KQogICogRklYTUU6IGhhbmRsZSBjdXJyZW50IGxvY2FsZQogICovCiBCT09MMzIgV0lOQVBJIElzQ2hhckxvd2VyMzJBKENIQVIgeCkKQEAgLTQ3Miw3ICs0NzMsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBJc0NoYXJMb3dlcjMyVyAgIChVU0VSMzIuMzM1KQorICogICAgICAgICAgIElzQ2hhckxvd2VyMzJXICAgKFVTRVIzMi4zMzYpCiAgKiBGSVhNRTogaGFuZGxlIGN1cnJlbnQgbG9jYWxlCiAgKi8KIEJPT0wzMiBXSU5BUEkgSXNDaGFyTG93ZXIzMlcoV0NIQVIgeCkKQEAgLTQ4MSw3ICs0ODIsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBJc0NoYXJVcHBlcjMyQSAgIChVU0VSMzIuMzM2KQorICogICAgICAgICAgIElzQ2hhclVwcGVyMzJBICAgKFVTRVIzMi4zMzcpCiAgKiBGSVhNRTogaGFuZGxlIGN1cnJlbnQgbG9jYWxlCiAgKi8KIEJPT0wzMiBXSU5BUEkgSXNDaGFyVXBwZXIzMkEoQ0hBUiB4KQpAQCAtNDkwLDcgKzQ5MSw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIElzQ2hhclVwcGVyMzJXICAgKFVTRVIzMi4zMzcpCisgKiAgICAgICAgICAgSXNDaGFyVXBwZXIzMlcgICAoVVNFUjMyLjMzOCkKICAqIEZJWE1FOiBoYW5kbGUgY3VycmVudCBsb2NhbGUKICAqLwogQk9PTDMyIFdJTkFQSSBJc0NoYXJVcHBlcjMyVyhXQ0hBUiB4KQpAQCAtNjEwLDcgKzYxMSw3IEBACiAJCQkJCQkJc3ByaW50ZmJ1Zj1IZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLDEwMCk7CiAKIAkJCQkJCS8qIENNRiAtIFRoaXMgbWFrZXMgYSBCSUcgYXNzdW1wdGlvbiBhYm91dCB2YV9saXN0ICovCi0JCQkJCQl2c3ByaW50ZihzcHJpbnRmYnVmLCBmbXRzdHIsICh2YV9saXN0KSBhcmdsaXN0c3RhcnQpOworCQkJCQkJd3ZzcHJpbnRmMzJBKHNwcmludGZidWYsIGZtdHN0ciwgKHZhX2xpc3QpIGFyZ2xpc3RzdGFydCk7CiAJCQkJCQl4PXNwcmludGZidWY7CiAJCQkJCQl3aGlsZSAoKngpIHsKIAkJCQkJCQlBRERfVE9fVCgqeCsrKTsKQEAgLTYyMCw3ICs2MjEsNyBAQAogCQkJCQkJLyogTlVMTCBhcmdzIC0gY29weSBmb3JtYXRzdHIgCiAJCQkJCQkgKiAocHJvYmFibHkgd3JvbmcpCiAJCQkJCQkgKi8KLQkJCQkJCXdoaWxlIChsYXN0ZjxmKSB7CisJCQkJCQl3aGlsZSAoKGxhc3RmPGYpJiYoKmxhc3RmKSkgewogCQkJCQkJCUFERF9UT19UKCpsYXN0ZisrKTsKIAkJCQkJCX0KIAkJCQkJfQpAQCAtNzg3LDcgKzc4OCw3IEBACiAJCQkJCQlzcHJpbnRmYnVmPUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsMTAwKTsKIAogCQkJCQkJLyogQ01GIC0gVGhpcyBtYWtlcyBhIEJJRyBhc3N1bXB0aW9uIGFib3V0IHZhX2xpc3QgKi8KLQkJCQkJCXZzcHJpbnRmKHNwcmludGZidWYsIGZtdHN0ciwgKHZhX2xpc3QpIGFyZ2xpc3RzdGFydCk7CisJCQkJCQl3dnNwcmludGYzMkEoc3ByaW50ZmJ1ZiwgZm10c3RyLCAodmFfbGlzdCkgYXJnbGlzdHN0YXJ0KTsKIAkJCQkJfQogCQkJCQl4PXNwcmludGZidWY7CiAJCQkJCXdoaWxlICgqeCkgewpkaWZmIC0tZ2l0IGEvbWlzYy9tYWluLmMgYi9taXNjL21haW4uYwppbmRleCAyOTJhNGQwLi4xZDg0M2VjIDEwMDY0NAotLS0gYS9taXNjL21haW4uYworKysgYi9taXNjL21haW4uYwpAQCAtNjI2LDcgKzYyNiw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTWVzc2FnZUJlZXAzMiAgIChVU0VSMzIuMzg5KQorICogICAgICAgICAgIE1lc3NhZ2VCZWVwMzIgICAoVVNFUjMyLjM5MCkKICAqLwogQk9PTDMyIFdJTkFQSSBNZXNzYWdlQmVlcDMyKCBVSU5UMzIgaSApCiB7CkBAIC02NTUsNyArNjU1LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglTeXN0ZW1QYXJhbWV0ZXJzSW5mbzMyQSAgIChVU0VSMzIuNTM5KQorICoJU3lzdGVtUGFyYW1ldGVyc0luZm8zMkEgICAoVVNFUjMyLjU0MCkKICAqLwogQk9PTDMyIFdJTkFQSSBTeXN0ZW1QYXJhbWV0ZXJzSW5mbzMyQSggVUlOVDMyIHVBY3Rpb24sIFVJTlQzMiB1UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHB2UGFyYW0sIFVJTlQzMiBmdVdpbkluaSApCkBAIC05OTksNyArOTk5LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglTeXN0ZW1QYXJhbWV0ZXJzSW5mbzMyVyAgIChVU0VSMzIuNTQwKQorICoJU3lzdGVtUGFyYW1ldGVyc0luZm8zMlcgICAoVVNFUjMyLjU0MSkKICAqLwogQk9PTDMyIFdJTkFQSSBTeXN0ZW1QYXJhbWV0ZXJzSW5mbzMyVyggVUlOVDMyIHVBY3Rpb24sIFVJTlQzMiB1UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHB2UGFyYW0sIFVJTlQzMiBmdVdpbkluaSApCmRpZmYgLS1naXQgYS9taXNjL21wci5jIGIvbWlzYy9tcHIuYwppbmRleCBlNWNmMjZlLi5kY2U2ZGMxIDEwMDY0NAotLS0gYS9taXNjL21wci5jCisrKyBiL21pc2MvbXByLmMKQEAgLTYsMjMgKzYsNjYgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAid25ldC5oIgogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV05ldENhY2hlUGFzc3dvcmQgW01QUi41Ml0gIFNhdmVzIHBhc3N3b3JkIGluIGNhY2hlCisgKgorICogUkVUVVJOUworICogICAgU3VjY2VzczogV05fU1VDQ0VTUworICogICAgRmFpbHVyZTogV05BQ0NFU1NfREVOSUVELCBXTl9CQURfUEFTU1dPUkQsIFdOX0JBRFZBTFVFLCBXTl9ORVRfRVJST1IsCisgKiAgICAgICAgICAgICBXTl9OT1RfU1VQUE9SVEVELCBXTl9PVVRfT0ZfTUVNT1JZCisgKi8KK0RXT1JEIFdJTkFQSSBXTmV0Q2FjaGVQYXNzd29yZCgKKyAgICBMUFNUUiBwYlJlc291cmNlLCAvKiBbaW5dIE5hbWUgb2Ygd29ya2dyb3VwLCBjb21wdXRlciwgb3IgcmVzb3VyY2UgKi8KKyAgICBXT1JEIGNiUmVzb3VyY2UsICAvKiBbaW5dIFNpemUgb2YgbmFtZSAqLworICAgIExQU1RSIHBiUGFzc3dvcmQsIC8qIFtpbl0gQnVmZmVyIGNvbnRhaW5pbmcgcGFzc3dvcmQgKi8KKyAgICBXT1JEIGNiUGFzc3dvcmQsICAvKiBbaW5dIFNpemUgb2YgcGFzc3dvcmQgKi8KKyAgICBCWVRFIG5UeXBlKSAgICAgICAvKiBbaW5dIFR5cGUgb2YgcGFzc3dvcmQgdG8gY2FjaGUgKi8KK3sKKyAgICBGSVhNRShtcHIsIiglcywlZCwlcywlZCwlZCk6IHN0dWJcbiIsIHBiUmVzb3VyY2UsY2JSZXNvdXJjZSwKKyAgICAgICAgICBwYlBhc3N3b3JkLGNiUGFzc3dvcmQsblR5cGUpOworICAgIHJldHVybiBXTl9TVUNDRVNTOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV05ldEdldENhY2hlZFBhc3N3b3JkIFtNUFIuPz8/XSAgUmV0cmlldmVzIHBhc3N3b3JkIGZyb20gY2FjaGUKKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBXTl9TVUNDRVNTCisgKiAgICBGYWlsdXJlOiBXTkFDQ0VTU19ERU5JRUQsIFdOX0JBRF9QQVNTV09SRCwgV05fQkFEX1ZBTFVFLCBXTl9ORVRfRVJST1IsCisgKiAgICAgICAgICAgICBXTl9OT1RfU1VQUE9SVEVELCBXTl9PVVRfT0ZfTUVNT1JZCisgKi8KIERXT1JEIFdJTkFQSSBXTmV0R2V0Q2FjaGVkUGFzc3dvcmQoCi0JTFBTVFIJcGJSZXNvdXJjZSwKLQlXT1JECWNiUmVzb3VyY2UsCi0JTFBTVFIJcGJQYXNzd29yZCwKLQlMUFdPUkQJcGNiUGFzc3dvcmQsCi0JQllURQluVHlwZQotKSB7Ci0JRklYTUUobXByLCIoJXMsJWQsJXAsJWQsJWQpOiBzdHViXG4iLAotCQlwYlJlc291cmNlLGNiUmVzb3VyY2UscGJQYXNzd29yZCwqcGNiUGFzc3dvcmQsblR5cGUpOwotCXJldHVybiAwOworICAgIExQU1RSIHBiUmVzb3VyY2UsICAgLyogW2luXSAgTmFtZSBvZiB3b3JrZ3JvdXAsIGNvbXB1dGVyLCBvciByZXNvdXJjZSAqLworICAgIFdPUkQgY2JSZXNvdXJjZSwgICAgLyogW2luXSAgU2l6ZSBvZiBuYW1lICovCisgICAgTFBTVFIgcGJQYXNzd29yZCwgICAvKiBbb3V0XSBCdWZmZXIgdG8gcmVjZWl2ZSBwYXNzd29yZCAqLworICAgIExQV09SRCBwY2JQYXNzd29yZCwgLyogW291dF0gUmVjZWl2ZXMgc2l6ZSBvZiBwYXNzd29yZCAqLworICAgIEJZVEUgblR5cGUpICAgICAgICAgLyogW2luXSAgVHlwZSBvZiBwYXNzd29yZCB0byByZXRyaWV2ZSAqLworeworICAgIEZJWE1FKG1wciwiKCVzLCVkLCVwLCVkLCVkKTogc3R1YlxuIiwKKyAgICAgICAgICBwYlJlc291cmNlLGNiUmVzb3VyY2UscGJQYXNzd29yZCwqcGNiUGFzc3dvcmQsblR5cGUpOworICAgIHJldHVybiBXTl9BQ0NFU1NfREVOSUVEOwogfQogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTXVsdGluZXRHZXRDb25uZWN0aW9uUGVyZm9ybWFuY2UzMkEgW01QUi4/Pz9dCisgKgorICogUkVUVVJOUworICogICAgU3VjY2VzczogTk9fRVJST1IKKyAqICAgIEZhaWx1cmU6IEVSUk9SX05PVF9TVVBQT1JURUQsIEVSUk9SX05PVF9DT05ORUNURUQsCisgKiAgICAgICAgICAgICBFUlJPUl9OT19ORVRfT1JfQkFEX1BBVEgsIEVSUk9SX0JBRF9ERVZJQ0UsCisgKiAgICAgICAgICAgICBFUlJPUl9CQURfTkVUX05BTUUsIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSLCAKKyAqICAgICAgICAgICAgIEVSUk9SX05PX05FVFdPUkssIEVSUk9SX0VYVEVOREVEX0VSUk9SCisgKi8KIERXT1JEIFdJTkFQSSBNdWx0aW5ldEdldENvbm5lY3Rpb25QZXJmb3JtYW5jZTMyQSgKLQlMUE5FVFJFU09VUkNFMzJBIGxwTmV0UmVzb3VyY2UsCi0JTFBORVRDT05ORUNUSU5GT1NUUlVDVCBscE5ldENvbm5lY3RJbmZvU3RydWN0Ci0pIHsKLQlGSVhNRShtcHIsIiglcCwlcCk6IHN0dWJcbiIsbHBOZXRSZXNvdXJjZSxscE5ldENvbm5lY3RJbmZvU3RydWN0KTsKLQlyZXR1cm4gMTsKKyAgICBMUE5FVFJFU09VUkNFMzJBIGxwTmV0UmVzb3VyY2UsICAgICAgICAgICAgICAgIC8qIFtpbl0gU3BlY2lmaWVzIHJlc291cmNlICovCisgICAgTFBORVRDT05ORUNUSU5GT1NUUlVDVCBscE5ldENvbm5lY3RJbmZvU3RydWN0KSAvKiBbaW5dIFBvaW50ZXIgdG8gc3RydWN0ICovCit7CisgICAgRklYTUUobXByLCIoJXAsJXApOiBzdHViXG4iLGxwTmV0UmVzb3VyY2UsbHBOZXRDb25uZWN0SW5mb1N0cnVjdCk7CisgICAgcmV0dXJuIFdOX05PVF9TVVBQT1JURUQ7CiB9CisKZGlmZiAtLWdpdCBhL21pc2MvcmVnaXN0cnkuYyBiL21pc2MvcmVnaXN0cnkuYwppbmRleCAzZjdhYzAzLi5iNzNjN2Y1IDEwMDY0NAotLS0gYS9taXNjL3JlZ2lzdHJ5LmMKKysrIGIvbWlzYy9yZWdpc3RyeS5jCkBAIC0xOTksOSArMTk5LDYgQEAKIAljYXNlIEhLRVlfQ1VSUkVOVF9DT05GSUc6CiAJCXJldHVybiBrZXlfY3VycmVudF9jb25maWc7CiAJZGVmYXVsdDoKLQkJV0FSTihyZWcsICIoJWx4KSwgc3BlY2lhbCBrZXkhXG4iLAotCQkJKExPTkcpaGtleQotCQkpOwogCQlyZXR1cm4gZ2V0X2hhbmRsZShoa2V5KTsKIAl9CiAJLypOT1RSRUFDSEVEKi8KZGlmZiAtLWdpdCBhL21pc2Mvc2hlbGwuYyBiL21pc2Mvc2hlbGwuYwppbmRleCA1NDVlY2RjLi5lY2VhMTRkIDEwMDY0NAotLS0gYS9taXNjL3NoZWxsLmMKKysrIGIvbWlzYy9zaGVsbC5jCkBAIC02MjAsNyArNjIwLDcgQEAKIAogCQkgICAgaWYoIHBzdHIgKQogCQkgICAgewotCQkJSENVUlNPUjE2IGhDdXJzb3IgPSBMb2FkQ3Vyc29yMTYoIDAsIE1BS0VJTlRSRVNPVVJDRShPQ1JfRFJBR09CSkVDVCkgKTsKKwkJCUhDVVJTT1IxNiBoQ3Vyc29yID0gTG9hZEN1cnNvcjE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UxNihPQ1JfRFJBR09CSkVDVCkgKTsKIAkJCVNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBMQl9HRVRURVhUMzIsIChXUEFSQU0zMilpZHgsIChMUEFSQU0pcHN0ciApOwogCQkJU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIExCX0RFTEVURVNUUklORzMyLCAoV1BBUkFNMzIpaWR4LCAwICk7CiAJCQlVcGRhdGVXaW5kb3czMiggaFduZEN0bCApOwpAQCAtNzI5LDcgKzcyOSw3IEBACiAgICAgaW5mby5zekFwcCAgICAgICAgPSBzekFwcDsKICAgICBpbmZvLnN6T3RoZXJTdHVmZiA9IHN6T3RoZXJTdHVmZjsKICAgICBpbmZvLmhJY29uICAgICAgICA9IGhJY29uOwotICAgIGlmICghaEljb24pIGluZm8uaEljb24gPSBMb2FkSWNvbjE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UoT0lDX1dJTkVJQ09OKSApOworICAgIGlmICghaEljb24pIGluZm8uaEljb24gPSBMb2FkSWNvbjE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UxNihPSUNfV0lORUlDT04pICk7CiAgICAgcmV0dXJuIERpYWxvZ0JveEluZGlyZWN0UGFyYW0zMkEoIFdJTl9HZXRXaW5kb3dJbnN0YW5jZSggaFduZCApLAogICAgICAgICAgICAgICAgICAgICAgICAgIFNZU1JFU19HZXRSZXNQdHIoIFNZU1JFU19ESUFMT0dfU0hFTExfQUJPVVRfTVNHQk9YICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhXbmQsIEFib3V0RGxnUHJvYzMyLCAoTFBBUkFNKSZpbmZvICk7CkBAIC03NDgsNyArNzQ4LDcgQEAKICAgICBpbmZvLnN6QXBwICAgICAgICA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3pBcHAgKTsKICAgICBpbmZvLnN6T3RoZXJTdHVmZiA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3pPdGhlclN0dWZmICk7CiAgICAgaW5mby5oSWNvbiAgICAgICAgPSBoSWNvbjsKLSAgICBpZiAoIWhJY29uKSBpbmZvLmhJY29uID0gTG9hZEljb24xNiggMCwgTUFLRUlOVFJFU09VUkNFKE9JQ19XSU5FSUNPTikgKTsKKyAgICBpZiAoIWhJY29uKSBpbmZvLmhJY29uID0gTG9hZEljb24xNiggMCwgTUFLRUlOVFJFU09VUkNFMTYoT0lDX1dJTkVJQ09OKSApOwogICAgIHJldCA9IERpYWxvZ0JveEluZGlyZWN0UGFyYW0zMkEoIFdJTl9HZXRXaW5kb3dJbnN0YW5jZSggaFduZCApLAogICAgICAgICAgICAgICAgICAgICAgICAgIFNZU1JFU19HZXRSZXNQdHIoIFNZU1JFU19ESUFMT0dfU0hFTExfQUJPVVRfTVNHQk9YICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhXbmQsIEFib3V0RGxnUHJvYzMyLCAoTFBBUkFNKSZpbmZvICk7CkBAIC0xMDc0LDcgKzEwNzQsOCBAQAogCQlfbGNsb3NlMzIoIGhGaWxlKTsKIAkJcmV0dXJuIDA7CiAJfQotCWljb25ncm91cHJlc2RpciA9IEdldFJlc0RpckVudHJ5Vyhyb290cmVzZGlyLChMUFdTVFIpUlRfR1JPVVBfSUNPTiwoRFdPUkQpcm9vdHJlc2RpcixGQUxTRSk7CisJaWNvbmdyb3VwcmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHJvb3RyZXNkaXIsUlRfR1JPVVBfSUNPTjMyVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRClyb290cmVzZGlyLEZBTFNFKTsKIAlpZiAoIWljb25ncm91cHJlc2RpcikgewogCQlXQVJOKHJlZywiTm8gSWNvbmdyb3VwcmVzb3VyY2VkaXJlY3RvcnkhXG4iKTsKIAkJVW5tYXBWaWV3T2ZGaWxlKHBlaW1hZ2UpOwpAQCAtMTE0Myw3ICsxMTQ0LDggQEAKIAkJY2lkc1tpXSA9IGNpZDsKIAkJUmV0UHRyW2ldID0gTG9va3VwSWNvbklkRnJvbURpcmVjdG9yeUV4MzIoaWdkYXRhLFRSVUUsU1lTTUVUUklDU19DWElDT04sU1lTTUVUUklDU19DWUlDT04sMCk7CiAJfQotCWljb25yZXNkaXI9R2V0UmVzRGlyRW50cnlXKHJvb3RyZXNkaXIsKExQV1NUUilSVF9JQ09OLChEV09SRClyb290cmVzZGlyLEZBTFNFKTsKKwlpY29ucmVzZGlyPUdldFJlc0RpckVudHJ5Vyhyb290cmVzZGlyLFJUX0lDT04zMlcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRClyb290cmVzZGlyLEZBTFNFKTsKIAlpZiAoIWljb25yZXNkaXIpIHsKIAkgICAgV0FSTihyZWcsIk5vIEljb25yZXNvdXJjZWRpcmVjdG9yeSFcbiIpOwogCSAgICBVbm1hcFZpZXdPZkZpbGUocGVpbWFnZSk7CkBAIC0xMjcwLDcgKzEyNzIsNyBAQAogCSAgICAqbHBpSWNvbiA9IDY7ICAgLyogZ2VuZXJpYyBpY29uIC0gZm91bmQgbm90aGluZyAqLwogCiAJR2V0TW9kdWxlRmlsZU5hbWUxNihoSW5zdCwgbHBJY29uUGF0aCwgMHg4MCk7Ci0JaEljb24gPSBMb2FkSWNvbjE2KCBoSW5zdCwgTUFLRUlOVFJFU09VUkNFKCpscGlJY29uKSk7CisJaEljb24gPSBMb2FkSWNvbjE2KCBoSW5zdCwgTUFLRUlOVFJFU09VUkNFMTYoKmxwaUljb24pKTsKICAgICB9CiAKICAgICByZXR1cm4gaEljb247CmRpZmYgLS1naXQgYS9taXNjL3ZlcnNpb24uYyBiL21pc2MvdmVyc2lvbi5jCmluZGV4IDc3Yzc5ODYuLjJiMTI1ZTIgMTAwNjQ0Ci0tLSBhL21pc2MvdmVyc2lvbi5jCisrKyBiL21pc2MvdmVyc2lvbi5jCkBAIC0xMzMsNiArMTMzLDcgQEAKICAgICAgICAgLyogV2luMy4xMCAqLwogICAgICAgICBpZiAocGVoZWFkZXItPk9wdGlvbmFsSGVhZGVyLk1pbm9yU3Vic3lzdGVtVmVyc2lvbiA8PSAxMSkgcmV0dXJuIFdJTjMxOwogICAgICAgICAvKiBOVCAzLjUxICovCisgICAgICAgIGlmIChwZWhlYWRlci0+T3B0aW9uYWxIZWFkZXIuTWlub3JTdWJzeXN0ZW1WZXJzaW9uID09IDUwKSByZXR1cm4gTlQzNTE7CiAgICAgICAgIGlmIChwZWhlYWRlci0+T3B0aW9uYWxIZWFkZXIuTWlub3JTdWJzeXN0ZW1WZXJzaW9uID09IDUxKSByZXR1cm4gTlQzNTE7CiAgICAgfQogICAgIEVSUih2ZXIsInVua25vd24gc3Vic3lzdGVtIHZlcnNpb246ICUwNHguJTA0eCwgcGxlYXNlIHJlcG9ydC5cbiIsCmRpZmYgLS1naXQgYS9taXNjL3dpbnNvY2suYyBiL21pc2Mvd2luc29jay5jCmluZGV4IDlmOWZkY2YuLjc5YTdhMTAgMTAwNjQ0Ci0tLSBhL21pc2Mvd2luc29jay5jCisrKyBiL21pc2Mvd2luc29jay5jCkBAIC0xMCwyMSArMTAsMzAgQEAKICAqCiAgKi8KICAKKyNpbmNsdWRlICJjb25maWcuaCIKKwogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL2lwYy5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2lmZGVmIEhBVkVfU1lTX0ZJTElPX0gKKyMgaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CisjZW5kaWYKICNpZiBkZWZpbmVkKF9fc3ZyNF9fKQotI2luY2x1ZGUgPHN5cy9maWxpby5oPgogI2luY2x1ZGUgPHN5cy9pb2Njb20uaD4KICNpbmNsdWRlIDxzeXMvc29ja2lvLmg+CiAjZW5kaWYKKwogI2lmIGRlZmluZWQoX19FTVhfXykKLSNpbmNsdWRlIDxzeXMvc29faW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgaW5jbHVkZSA8c3lzL3NvX2lvY3RsLmg+CiAjZW5kaWYKKworI2lmZGVmIEhBVkVfU1lTX1BBUkFNX0gKKyMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPHN5cy9tc2cuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KQEAgLTEyMjcsNyArMTIzNiwxNiBAQAogCQkJICAodW5zaWduZWQpcHdzaSwgcywgbGV2ZWwsIG9wdG5hbWUsIChpbnQpIG9wdHZhbCwgb3B0bGVuKTsKICAgICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKQogICAgIHsKKwlzdHJ1Y3QJbGluZ2VyIGxpbmdlcjsKKwogCWNvbnZlcnRfc29ja29wdCgmbGV2ZWwsICZvcHRuYW1lKTsKKwlpZiAob3B0bmFtZSA9PSBTT19MSU5HRVIpIHsKKwkJLyogeWVzLCB1c2VzIHVuc2lnbmVkIHNob3J0IGluIGJvdGggd2luMTYvd2luMzIgKi8KKwkJbGluZ2VyLmxfb25vZmYJPSAoKFVJTlQxNiopb3B0dmFsKVswXTsKKwkJbGluZ2VyLmxfbGluZ2VyCT0gKChVSU5UMTYqKW9wdHZhbClbMV07CisJCW9wdHZhbCA9IChjaGFyKikmbGluZ2VyOworCQlvcHRsZW4gPSBzaXplb2Yoc3RydWN0IGxpbmdlcik7CisJfQogCWlmIChzZXRzb2Nrb3B0KHB3cy0+ZmQsIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbikgPT0gMCkgcmV0dXJuIDA7CiAJcHdzaS0+ZXJyID0gd3NhRXJybm8oKTsKICAgICB9CkBAIC0xMjQxLDE2ICsxMjU5LDcgQEAKIElOVDE2IFdJTkFQSSBXSU5TT0NLX3NldHNvY2tvcHQxNihTT0NLRVQxNiBzLCBJTlQxNiBsZXZlbCwgSU5UMTYgb3B0bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpvcHR2YWwsIElOVDE2IG9wdGxlbikKIHsKLSAgICBJTlQzMiBsaW5nZXIzMlsyXTsKICAgICBpZiggIW9wdHZhbCApIHJldHVybiBTT0NLRVRfRVJST1I7Ci0gICAgaWYoIG9wdG5hbWUgPT0gU09fTElOR0VSICkKLSAgICB7Ci0JSU5UMTYqIHB0ciA9IChJTlQxNiopb3B0dmFsOwotCWxpbmdlcjMyWzBdID0gcHRyWzBdOwotCWxpbmdlcjMyWzFdID0gcHRyWzFdOwotCW9wdHZhbCA9IChjaGFyKikmbGluZ2VyMzI7Ci0Jb3B0bGVuID0gc2l6ZW9mKGxpbmdlcjMyKTsKLSAgICB9CiAgICAgcmV0dXJuIChJTlQxNilXSU5TT0NLX3NldHNvY2tvcHQzMiggcywgKFVJTlQxNilsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4gKTsKIH0KIApAQCAtMjY2OCw1ICsyNjc3LDMgQEAKIAkJcmV0dXJuIFdTQUVPUE5PVFNVUFA7CiAgICAgfQogfQotCi0KZGlmZiAtLWdpdCBhL21pc2Mvd2luc29ja19kbnMuYyBiL21pc2Mvd2luc29ja19kbnMuYwppbmRleCA4YTQyYTc5Li5kMDFiOGY3IDEwMDY0NAotLS0gYS9taXNjL3dpbnNvY2tfZG5zLmMKKysrIGIvbWlzYy93aW5zb2NrX2Rucy5jCkBAIC05LDYgKzksOCBAQAogICogICAgICAgTmV0c2NhcGUgNC4wKS4KICAqLwogCisjaW5jbHVkZSAiY29uZmlnLmgiCisKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KQEAgLTE5LDEyICsyMSwxNiBAQAogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpZmRlZiBfX0VNWF9fCi0jaW5jbHVkZSA8c3lzL3NvX2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjIGluY2x1ZGUgPHN5cy9zb19pb2N0bC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAorIyBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX0ZJTElPX0gKKyMgaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CiAjZW5kaWYKICNpZmRlZiBfX3N2cjRfXwotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CisjIGluY2x1ZGUgPHN5cy9maWxlLmg+CiAjZW5kaWYKIAogZXh0ZXJuIGludCBoX2Vycm5vOwpAQCAtMzY0LDYgKzM3MCw5IEBACiAJICAgIH0KIAkgICAgZWxzZQogCSAgICB7CisJICAgIAlleHRlcm4gQk9PTDMyIFRIUkVBRF9Jbml0RG9uZTsKKworCSAgICAgICAgVEhSRUFEX0luaXREb25lID0gRkFMU0U7CiAJCS8qIGNoaWxkIHByb2Nlc3MgKi8KIAogCQljbG9zZShhc3luY19jdGwud3NfYW9wLT5mZFswXSk7ICAvKiByZWFkIGVuZHBvaW50ICovCmRpZmYgLS1naXQgYS9taXNjL3dzcHJpbnRmLmMgYi9taXNjL3dzcHJpbnRmLmMKaW5kZXggZmZmYTJlNi4uNTQwZGM0YSAxMDA2NDQKLS0tIGEvbWlzYy93c3ByaW50Zi5jCisrKyBiL21pc2Mvd3NwcmludGYuYwpAQCAtNDgzLDcgKzQ4Myw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgd3ZzcHJpbnRmMzJBICAgKFVTRVIzMi41ODYpCisgKiAgICAgICAgICAgd3ZzcHJpbnRmMzJBICAgKFVTRVIzMi41ODcpCiAgKi8KIElOVDMyIFdJTkFQSSB3dnNwcmludGYzMkEoIExQU1RSIGJ1ZmZlciwgTFBDU1RSIHNwZWMsIHZhX2xpc3QgYXJncyApCiB7CkBAIC00OTMsNyArNDkzLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICB3dnNwcmludGYzMlcgICAoVVNFUjMyLjU4NykKKyAqICAgICAgICAgICB3dnNwcmludGYzMlcgICAoVVNFUjMyLjU4OCkKICAqLwogSU5UMzIgV0lOQVBJIHd2c3ByaW50ZjMyVyggTFBXU1RSIGJ1ZmZlciwgTFBDV1NUUiBzcGVjLCB2YV9saXN0IGFyZ3MgKQogewpkaWZmIC0tZ2l0IGEvbXNkb3MvaW50MjEuYyBiL21zZG9zL2ludDIxLmMKaW5kZXggZTIyNmNjMS4uOGE3YzBhMiAxMDA2NDQKLS0tIGEvbXNkb3MvaW50MjEuYworKysgYi9tc2Rvcy9pbnQyMS5jCkBAIC04MjQsNiArODI0LDM4IEBACiAgICAgIH0KIH0gCiAKK3N0YXRpYyBCT09MMzIKK0lOVDIxX25ldHdvcmtmdW5jIChDT05URVhUICpjb250ZXh0KQoreworICAgICBzd2l0Y2ggKEFMX3JlZyhjb250ZXh0KSkgeworICAgICBjYXNlIDB4MDA6IC8qIEdldCBtYWNoaW5lIG5hbWUuICovCisgICAgIHsKKwkgIGNoYXIgKmRzdCA9IFBUUl9TRUdfT0ZGX1RPX0xJTiAoRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSk7CisJICBUUkFDRShpbnQyMSwgImdldHRpbmcgbWFjaGluZSBuYW1lIHRvICVwXG4iLCBkc3QpOworCSAgaWYgKGdldGhvc3RuYW1lIChkc3QsIDE1KSkKKwkgIHsKKwkgICAgICAgV0FSTihpbnQyMSwiZmFpbGVkIVxuIik7CisJICAgICAgIERPU19FUlJPUiggRVJfTm9OZXR3b3JrLCBFQ19Ob3RGb3VuZCwgU0FfQWJvcnQsIEVMX05ldHdvcmsgKTsKKwkgICAgICAgcmV0dXJuIFRSVUU7CisJICB9IGVsc2UgeworCSAgICAgICBpbnQgbGVuID0gc3RybGVuIChkc3QpOworCSAgICAgICB3aGlsZSAobGVuIDwgMTUpCisJCSAgICBkc3RbbGVuKytdID0gJyAnOworCSAgICAgICBkc3RbMTVdID0gMDsKKwkgICAgICAgQ0hfcmVnKGNvbnRleHQpID0gMTsgLyogVmFsaWQgKi8KKwkgICAgICAgQ0xfcmVnKGNvbnRleHQpID0gMTsgLyogTkVUYmlvcyBudW1iZXI/Pz8gKi8KKwkgICAgICAgVFJBQ0UoaW50MjEsICJyZXR1cm5pbmcgJXNcbiIsIGRlYnVnc3RyX2FuIChkc3QsIDE2KSk7CisJICAgICAgIHJldHVybiBGQUxTRTsKKwkgIH0KKyAgICAgfQorCisgICAgIGRlZmF1bHQ6CisJICBET1NfRVJST1IoIEVSX05vTmV0d29yaywgRUNfTm90Rm91bmQsIFNBX0Fib3J0LCBFTF9OZXR3b3JrICk7CisJICByZXR1cm4gVFJVRTsKKyAgICAgfQorfQorCisKIFNFR1BUUiBJTlQyMV9HZXRMaXN0T2ZMaXN0cygpCiB7CiAJc3RhdGljIERPU19MSVNUT0ZMSVNUUyAqTE9MOwpAQCAtODkxLDEzICs5MjMsMTUgQEAKIHsKICAgICBCT09MMzIJYlNldERPU0V4dGVuZGVkRXJyb3IgPSBGQUxTRTsKIAotICAgIC8qICAgIFRSQUNFKGludDIxLCAiQVg9JTA0eCBCWD0lMDR4IENYPSUwNHggRFg9JTA0eCAiCi0gICAgICAgICAgICAgICAgICJTST0lMDR4IERJPSUwNHggRFM9JTA0eCBFUz0lMDR4IEVGTD0lMDhseFxuIiwKLSAgICAgICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpLCBCWF9yZWcoY29udGV4dCksIENYX3JlZyhjb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpLCBTSV9yZWcoY29udGV4dCksIERJX3JlZyhjb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgKFdPUkQpRFNfcmVnKGNvbnRleHQpLCAoV09SRClFU19yZWcoY29udGV4dCksCi0gICAgICAgICAgICAgICAgIEVGTF9yZWcoY29udGV4dCkgKTsKLQkJICovCisjaWYgMAorICAgIFRSQUNFKGludDIxLCAiQVg9JTA0eCBCWD0lMDR4IENYPSUwNHggRFg9JTA0eCAiCisJICAiU0k9JTA0eCBEST0lMDR4IERTPSUwNHggRVM9JTA0eCBFRkw9JTA4bHhcbiIsCisJICBBWF9yZWcoY29udGV4dCksIEJYX3JlZyhjb250ZXh0KSwgQ1hfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCksCisJICBTSV9yZWcoY29udGV4dCksIERJX3JlZyhjb250ZXh0KSwKKwkgIChXT1JEKURTX3JlZyhjb250ZXh0KSwgKFdPUkQpRVNfcmVnKGNvbnRleHQpLAorCSAgRUZMX3JlZyhjb250ZXh0KSApOworI2VuZGlmCisKICAgICBpZiAoQUhfcmVnKGNvbnRleHQpID09IDB4NTkpICAvKiBHZXQgZXh0ZW5kZWQgZXJyb3IgaW5mbyAqLwogICAgIHsKICAgICAgICAgVFJBQ0UoaW50MjEsICJHRVQgRVhURU5ERUQgRVJST1IgY29kZSAweCUwMnggY2xhc3MgMHglMDJ4IGFjdGlvbiAweCUwMnggbG9jdXMgJTAyeFxuIiwKQEAgLTE1MjYsMTMgKzE1NjAsMTYgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4NWQ6IC8qIE5FVFdPUksgKi8KLSAgICBjYXNlIDB4NWU6Ci0gICAgICAgIFRSQUNFKGludDIxLCJOZXR3b3JrIGZ1bmN0aW9uIEFYPSUwNHhcbiIsQVhfcmVnKGNvbnRleHQpKTsKLSAgICAgICAgLyogbmV0d29yayBzb2Z0d2FyZSBub3QgaW5zdGFsbGVkICovCisgICAgICAgIEZJWE1FKGludDIxLCJGdW5jdGlvbiAweCUwNHggbm90IGltcGxlbWVudGVkLlxuIiwgQVhfcmVnIChjb250ZXh0KSk7CisJLyogRml4IHRoZSBmb2xsb3dpbmcgd2hpbGUgeW91J3JlIGF0IGl0LiAgKi8KICAgICAgICAgRE9TX0VSUk9SKCBFUl9Ob05ldHdvcmssIEVDX05vdEZvdW5kLCBTQV9BYm9ydCwgRUxfTmV0d29yayApOwogCWJTZXRET1NFeHRlbmRlZEVycm9yID0gVFJVRTsKICAgICAgICAgYnJlYWs7CiAKKyAgICBjYXNlIDB4NWU6CisJYlNldERPU0V4dGVuZGVkRXJyb3IgPSBJTlQyMV9uZXR3b3JrZnVuYyAoY29udGV4dCk7CisgICAgICAgIGJyZWFrOworCiAgICAgY2FzZSAweDVmOiAvKiBORVRXT1JLICovCiAgICAgICAgIHN3aXRjaCAoQUxfcmVnKGNvbnRleHQpKQogICAgICAgICB7CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL2F1ZGlvLmMgYi9tdWx0aW1lZGlhL2F1ZGlvLmMKaW5kZXggY2Q1NWNlOC4uNzgwZTAzNSAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9hdWRpby5jCisrKyBiL211bHRpbWVkaWEvYXVkaW8uYwpAQCAtMjgsMTEgKzI4LDEzIEBACiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2lmZGVmIEhBVkVfT1NTCisKICNpZmRlZiBIQVZFX01BQ0hJTkVfU09VTkRDQVJEX0gKLSNpbmNsdWRlIDxtYWNoaW5lL3NvdW5kY2FyZC5oPgotI2Vsc2UgLyogSEFWRV9NQUNISU5FX1NPVU5EQ0FSRF9IICovCi0jaW5jbHVkZSA8c3lzL3NvdW5kY2FyZC5oPgotI2VuZGlmIC8qIEhBVkVfTUFDSElORV9TT1VORENBUkRfSCAqLworIyBpbmNsdWRlIDxtYWNoaW5lL3NvdW5kY2FyZC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfU09VTkRDQVJEX0gKKyMgaW5jbHVkZSA8c3lzL3NvdW5kY2FyZC5oPgorI2VuZGlmCiAKICNkZWZpbmUgU09VTkRfREVWICIvZGV2L2RzcCIKICNkZWZpbmUgTUlYRVJfREVWICIvZGV2L21peGVyIgpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9kc291bmQuYyBiL211bHRpbWVkaWEvZHNvdW5kLmMKaW5kZXggODMxZGFiZi4uYzU0MWQyNyAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9kc291bmQuYworKysgYi9tdWx0aW1lZGlhL2Rzb3VuZC5jCkBAIC0yOCw2ICsyOCw3IEBACiAgKiAgIFNvdW5kIHdvcmtzIGZvciB0aGUgaW50cm9tb3ZpZS4KICAqLwogCisjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTQ1LDEyICs0NiwxMyBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAKICNpZmRlZiBIQVZFX09TUwotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2lmZGVmIEhBVkVfTUFDSElORV9TT1VORENBUkRfSAotI2luY2x1ZGUgPG1hY2hpbmUvc291bmRjYXJkLmg+Ci0jZWxzZSAvKiBIQVZFX01BQ0hJTkVfU09VTkRDQVJEX0ggKi8KLSNpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+Ci0jZW5kaWYgLyogSEFWRV9NQUNISU5FX1NPVU5EQ0FSRF9IICovCisjIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgorIyBpZmRlZiBIQVZFX01BQ0hJTkVfU09VTkRDQVJEX0gKKyMgIGluY2x1ZGUgPG1hY2hpbmUvc291bmRjYXJkLmg+CisjIGVuZGlmCisjIGlmZGVmIEhBVkVfU1lTX1NPVU5EQ0FSRF9ICisjICBpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+CisjIGVuZGlmCiAKIHN0YXRpYyBpbnQgYXVkaW9mZCA9IC0xOwogc3RhdGljIExQRElSRUNUU09VTkQJZHNvdW5kID0gTlVMTDsKQEAgLTg0NSw3ICs4NDcsNyBAQAogI2VuZGlmIC8qIEhBVkVfT1NTICovCiAKIEhSRVNVTFQgV0lOQVBJIERpcmVjdFNvdW5kQ3JlYXRlKExQR1VJRCBscEdVSUQsTFBESVJFQ1RTT1VORCAqcHBEUyxJVW5rbm93biAqcFVua091dGVyICkgewotCWludAl4eDsKKwlpbnQgeHg7CiAJaWYgKGxwR1VJRCkKIAkJZnByaW50ZihzdGRlcnIsIkRpcmVjdFNvdW5kQ3JlYXRlKCVwLCVwLCVwKVxuIixscEdVSUQscHBEUyxwVW5rT3V0ZXIpOwogI2lmZGVmIEhBVkVfT1NTCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL2luaXQuYyBiL211bHRpbWVkaWEvaW5pdC5jCmluZGV4IGRjMzFlZmIuLjdlNDg1NTAgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvaW5pdC5jCisrKyBiL211bHRpbWVkaWEvaW5pdC5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSAieG1hbGxvYy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLSNpZiBkZWZpbmVkIChfX0hBU19TT1VORENBUkRfSF9fKQorI2lmZGVmIEhBVkVfT1NTCiAKIGV4dGVybiBpbnQgTU9ETV9OVU1ERVZTOwogZXh0ZXJuIExQTUlESU9VVENBUFMxNiBtaWRpRGV2aWNlc1tNQVhfTUlESU9VVERSVl07CkBAIC0yNiw3ICsyNiw3IEBACiAgKiByZXR1cm4gdGhlIFdpbmRvd3MgZXF1aXZhbGVudCB0byBhIFVuaXggRGV2aWNlIFR5cGUKICAqCiAgKi8KLSNpZiBkZWZpbmVkIChfX0hBU19TT1VORENBUkRfSF9fKQorI2lmZGVmIEhBVkVfT1NTCiBpbnQgdW5peFRvV2luZG93c0RldmljZVR5cGUoaW50IHR5cGUpCiB7CiAgIC8qIE1PRF9NSURJUE9SVCAgICAgb3V0cHV0IHBvcnQgCkBAIC01NywxMiArNTcsMTEgQEAKICAqLwogQk9PTDMyIE1VTFRJTUVESUFfSW5pdCAodm9pZCkKIHsKLSNpZiBkZWZpbmVkIChfX0hBU19TT1VORENBUkRfSF9fKQorI2lmZGVmIEhBVkVfT1NTCiAgIGludCBpLCBzdGF0dXMsIG51bXN5bnRoZGV2cywgbnVtbWlkaWRldnM7CiAgIHN0cnVjdCBzeW50aF9pbmZvIHNpbmZvOwogICBzdHJ1Y3QgbWlkaV9pbmZvIG1pbmZvOwogICBpbnQgZmQ7ICAgICAgICAvKiBmaWxlIGRlc2NyaXB0b3IgZm9yIE1JRElfREVWICovCi0gIExQTUlESU9VVENBUFMxNiB0bXBscENhcHMgPSBOVUxMOwogCiAgIFRSQUNFIChtaWRpLCAiSW5pdGlhbGl6aW5nIHRoZSBNSURJIHZhcmlhYmxlcy5cbiIpOwogICAvKiB0cnkgdG8gb3BlbiBkZXZpY2UgKi8KQEAgLTg2LDYgKzg1LDggQEAKICAgfQogCiAgIGZvciAoaSA9IDAgOyBpIDwgbnVtc3ludGhkZXZzIDsgaSsrKSB7CisgICAgTFBNSURJT1VUQ0FQUzE2IHRtcGxwQ2FwczsKKwogICAgIHNpbmZvLmRldmljZSA9IGk7CiAgICAgc3RhdHVzID0gaW9jdGwoZmQsIFNORENUTF9TWU5USF9JTkZPLCAmc2luZm8pOwogICAgIGlmIChzdGF0dXMgPT0gLTEpIHsKQEAgLTE0NCwxMiArMTQ1LDE2IEBACiAgIE1PRE1fTlVNREVWUyA9IG51bXN5bnRoZGV2cyArIG51bW1pZGlkZXZzOwogICAKICAgZm9yIChpID0gMCA7IGkgPCBudW1taWRpZGV2cyA7IGkrKykgeworICAgIExQTUlESU9VVENBUFMxNiB0bXBscENhcHM7CisKICAgICBtaW5mby5kZXZpY2UgPSBpOwogICAgIHN0YXR1cyA9IGlvY3RsKGZkLCBTTkRDVExfTUlESV9JTkZPLCAmbWluZm8pOwogICAgIGlmIChzdGF0dXMgPT0gLTEpIHsKICAgICAgIEVSUihtaWRpLCAiaW9jdGwgZmFpbGVkLlxuIik7CiAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CisKKyAgICB0bXBscENhcHMgPSB4bWFsbG9jIChzaXplb2YgKE1JRElPVVRDQVBTMTYpKTsKICAgICAvKiBUaGlzIHdob2xlIHBhcnQgaXMgc29tZXdoYXQgb2JzY3VyZSB0byBtZS4gSSdsbCBrZWVwIHRyeWluZyB0byBkaWcKICAgICAgICBpbmZvIGFib3V0IGl0LiBJZiB5b3UgaGFwcGVuIHRvIGtub3csIHBsZWFzZSB0ZWxsIHVzLiBUaGUgdmVyeSBkZXNjcml0aXZlCiAgICAgICAgbWluZm8uZGV2X3R5cGUgd2FzIG5vdCB1c2VkIGhlcmUuCkBAIC0xNzQsNyArMTc5LDcgQEAKICAgLyogY2xvc2UgZmlsZSBhbmQgZXhpdCAqLwogICBjbG9zZShmZCk7CiAKLSNlbmRpZiAvKiBfX0hBU19TT1VORENBUkRfSF9fICovCisjZW5kaWYgLyogSEFWRV9PU1MgKi8KICAgCiAgIHJldHVybiBUUlVFOwogICAKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWNpYW5pbS5jIGIvbXVsdGltZWRpYS9tY2lhbmltLmMKaW5kZXggN2I5Mzc5Yi4uZGM5MTVhMyAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tY2lhbmltLmMKKysrIGIvbXVsdGltZWRpYS9tY2lhbmltLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNkZWZpbmUgQU5JTUZSQU1FU19QRVJNSU4gCTE4MDAKICNkZWZpbmUgU0VDT05EU19QRVJNSU4JIAk2MAogCi0jaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIHR5cGVkZWYgc3RydWN0IHsKICAgICBpbnQgICAgIG5Vc2VDb3VudDsgICAgICAgICAgLyogSW5jcmVtZW50ZWQgZm9yIGVhY2ggc2hhcmVkIG9wZW4gKi8KICAgICBCT09MMTYgIGZTaGFyZWFibGU7ICAgICAgICAgLyogVFJVRSBpZiBmaXJzdCBvcGVuIHdhcyBzaGFyZWFibGUgKi8KQEAgLTQwLDcgKzM5LDYgQEAKIH0gTElOVVhfQU5JTTsKIAogc3RhdGljIExJTlVYX0FOSU0JQW5pbURldltNQVhfQU5JTURSVl07Ci0jZW5kaWYKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTUwLDcgKzQ4LDYgQEAKICovCiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lPcGVuKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX09QRU5fUEFSTVMxNiBscFBhcm1zKQogewotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJTFBTVFIJCWxwc3RyRWxlbWVudE5hbWU7CiAJY2hhcgkJc3RyWzEyOF07CiAKQEAgLTEwMiw5ICs5OSw2IEBACiAJCX0KICovCiAgCXJldHVybiAwOwotI2Vsc2UKLQlyZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwotI2VuZGlmCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTEyLDEyICsxMDYsMTAgQEAKICovCiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lDbG9zZShVSU5UMTYgd0RldklELCBEV09SRCBkd1BhcmFtLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7Ci0jaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlUUkFDRShtY2lhbmltLCIoJXUsICUwOGxYLCAlcCk7XG4iLCAKIAkJCQl3RGV2SUQsIGR3UGFyYW0sIGxwUGFybXMpOwogCWlmIChBbmltRGV2W3dEZXZJRF0ubHBkd1RyYWNrTGVuICE9IE5VTEwpIGZyZWUoQW5pbURldlt3RGV2SURdLmxwZHdUcmFja0xlbik7CiAJaWYgKEFuaW1EZXZbd0RldklEXS5scGR3VHJhY2tQb3MgIT0gTlVMTCkgZnJlZShBbmltRGV2W3dEZXZJRF0ubHBkd1RyYWNrUG9zKTsKLSNlbmRpZgogICAgICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTI3LDcgKzExOSw2IEBACiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lHZXREZXZDYXBzKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIAogCQkJCQkJTFBNQ0lfR0VUREVWQ0FQU19QQVJNUyBscFBhcm1zKQogewotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJVFJBQ0UobWNpYW5pbSwiKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCQkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwpAQCAtMTY5LDkgKzE2MCw2IEBACiAJVFJBQ0UobWNpYW5pbSwgImxwUGFybXMtPmR3UmV0dXJuPSUwOGxYO1xuIiwgCiAJCWxwUGFybXMtPmR3UmV0dXJuKTsKICAJcmV0dXJuIDA7Ci0jZWxzZQotCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0jZW5kaWYKIH0KIAogCkBAIC0xODEsNyArMTY5LDYgQEAKIHN0YXRpYyBEV09SRCBBTklNX0NhbGNUaW1lKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3Rm9ybWF0VHlwZSwgRFdPUkQgZHdGcmFtZSkKIHsKIAlEV09SRAlkd1RpbWUgPSAwOwotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJVUlOVDE2CXdUcmFjazsKIAlVSU5UMTYJd01pbnV0ZXM7CiAJVUlOVDE2CXdTZWNvbmRzOwpAQCAtMjIyLDcgKzIwOSw2IEBACiAJCQkJd1RyYWNrLCB3TWludXRlcywgd1NlY29uZHMsIHdGcmFtZXMpOwogCQkJYnJlYWs7CiAJCX0KLSNlbmRpZgogCXJldHVybiBkd1RpbWU7CiB9CiAKQEAgLTIzMyw3ICsyMTksNiBAQAogc3RhdGljIERXT1JEIEFOSU1fQ2FsY0ZyYW1lKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3Rm9ybWF0VHlwZSwgRFdPUkQgZHdUaW1lKQogewogCURXT1JECWR3RnJhbWUgPSAwOwotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJVUlOVDE2CXdUcmFjazsKIAlUUkFDRShtY2lhbmltLCIoJXUsICUwOGxYLCAlbHUpO1xuIiwgCiAJCQl3RGV2SUQsIGR3Rm9ybWF0VHlwZSwgZHdUaW1lKTsKQEAgLTI2Nyw3ICsyNTIsNiBAQAogCQkJZHdGcmFtZSArPSBNQ0lfVE1TRl9GUkFNRShkd1RpbWUpOwogCQkJYnJlYWs7CiAJCX0KLSNlbmRpZgogCXJldHVybiBkd0ZyYW1lOwogfQogCkBAIC0yNzcsNyArMjYxLDYgQEAKICovCiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lJbmZvKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0lORk9fUEFSTVMxNiBscFBhcm1zKQogewotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJVFJBQ0UobWNpYW5pbSwiKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKQEAgLTMwMSw5ICsyODQsNiBAQAogCWVsc2UKIAkJbHBQYXJtcy0+ZHdSZXRTaXplID0gMDsKICAJcmV0dXJuIDA7Ci0jZWxzZQotCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0jZW5kaWYKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMTEsNyArMjkxLDYgQEAKICovCiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lTdGF0dXMoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU1RBVFVTX1BBUk1TIGxwUGFybXMpCiB7Ci0jaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlUUkFDRShtY2lhbmltLCIoJXUsICUwOGxYLCAlcCk7XG4iLCAKIAkJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKQEAgLTM4OCw5ICszNjcsNiBAQAogCQl9CiAgICAgZnByaW50ZihzdGRlcnIsIkFOSU1fbWNpU3RhdHVzIC8vIG5vdCBNQ0lfU1RBVFVTX0lURU0gIVxuIik7CiAgCXJldHVybiAwOwotI2Vsc2UKLQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKLSNlbmRpZgogfQogCiAKQEAgLTM5OSw3ICszNzUsNiBAQAogKi8KIHN0YXRpYyBEV09SRCBBTklNX21jaVBsYXkoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfUExBWV9QQVJNUyBscFBhcm1zKQogewotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJaW50IAlzdGFydCwgZW5kOwogCVRSQUNFKG1jaWFuaW0sIigldSwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwpAQCAtNDI2LDkgKzQwMSw2IEBACiAJCQlBbmltRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCQl9CiAJcmV0dXJuIDA7Ci0jZWxzZQotCXJldHVybiBNQ0lFUlJfSEFSRFdBUkU7Ci0jZW5kaWYKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MzYsNyArNDA4LDYgQEAKICovCiBzdGF0aWMgRFdPUkQgQU5JTV9tY2lTdG9wKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKLSNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCVRSQUNFKG1jaWFuaW0sIigldSwgJTA4bFgsICVwKTtcbiIsIAogCQkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwpAQCAtNDQ4LDkgKzQxOSw2IEBACiAJCQlBbmltRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCQl9CiAgCXJldHVybiAwOwotI2Vsc2UKLQlyZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwotI2VuZGlmCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDU4LDcgKzQyNiw2IEBACiAqLwogc3RhdGljIERXT1JEIEFOSU1fbWNpUGF1c2UoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKQogewotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJVFJBQ0UobWNpYW5pbSwiKCV1LCAlMDhsWCwgJXApO1xuIiwgCiAJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKQEAgLTQ3MCw5ICs0MzcsNiBAQAogCQkJQW5pbURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAkJfQogCXJldHVybiAwOwotI2Vsc2UKLQlyZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwotI2VuZGlmCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDgwLDcgKzQ0NCw2IEBACiAqLwogc3RhdGljIERXT1JEIEFOSU1fbWNpUmVzdW1lKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKLSNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCVRSQUNFKG1jaWFuaW0sIigldSwgJTA4bFgsICVwKTtcbiIsIAogCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CkBAIC00OTIsOSArNDU1LDYgQEAKIAkJCUFuaW1EZXZbd0RldklEXS53Tm90aWZ5RGV2aWNlSUQsIE1DSV9OT1RJRllfU1VDQ0VTU0ZVTCk7CiAJCX0KIAlyZXR1cm4gMDsKLSNlbHNlCi0JcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKLSNlbmRpZgogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTUwMiw3ICs0NjIsNiBAQAogKi8KIHN0YXRpYyBEV09SRCBBTklNX21jaVNlZWsoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfU0VFS19QQVJNUyBscFBhcm1zKQogewotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJRFdPUkQJZHdSZXQ7CiAJTUNJX1BMQVlfUEFSTVMgUGxheVBhcm1zOwogCVRSQUNFKG1jaWFuaW0sIigldSwgJTA4bFgsICVwKTtcbiIsIApAQCAtNTMwLDkgKzQ4OSw2IEBACiAJCQlBbmltRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCQl9CiAJcmV0dXJuIGR3UmV0OwotI2Vsc2UKLQlyZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwotI2VuZGlmCiB9CiAKIApAQCAtNTQxLDcgKzQ5Nyw2IEBACiAqLwogc3RhdGljIERXT1JEIEFOSU1fbWNpU2V0KFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NFVF9QQVJNUyBscFBhcm1zKQogewotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJVFJBQ0UobWNpYW5pbSwiKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogLyoKQEAgLTU3NSw5ICs1MzAsNiBAQAogCQkJQW5pbURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAkJfQogCXJldHVybiAwOwotI2Vsc2UKLQlyZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwotI2VuZGlmCiB9CiAKIApAQCAtNTg3LDcgKzUzOSw2IEBACiBMT05HIEFOSU1fRHJpdmVyUHJvYyhEV09SRCBkd0RldklELCBIRFJWUjE2IGhEcml2LCBXT1JEIHdNc2csIAogCQkgICAgIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKLSNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCXN3aXRjaCh3TXNnKSB7CiAJCWNhc2UgRFJWX0xPQUQ6CiAJCQlyZXR1cm4gMTsKQEAgLTY0Nyw5ICs1OTgsNiBAQAogCQlkZWZhdWx0OgogCQkJcmV0dXJuIERlZkRyaXZlclByb2MoZHdEZXZJRCwgaERyaXYsIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAJCX0KLSNlbHNlCi0JcmV0dXJuIE1DSUVSUl9IQVJEV0FSRTsKLSNlbmRpZgogfQogCiAKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWNpY2RhLmMgYi9tdWx0aW1lZGlhL21jaWNkYS5jCmluZGV4IDM5YTFmMDkuLjQ4ZTZlYTEgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbWNpY2RhLmMKKysrIGIvbXVsdGltZWRpYS9tY2ljZGEuYwpAQCAtMTYsMjQgKzE2LDI2IEBACiAjaW5jbHVkZSAibW1zeXN0ZW0uaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCi0jaWZkZWYgbGludXgKLSNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KLSNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgotI2VsaWYgX19GcmVlQlNEX18KLSNpbmNsdWRlIDxtYWNoaW5lL3NvdW5kY2FyZC5oPgotI2luY2x1ZGUgPHN5cy9jZGlvLmg+CisjaWZkZWYgSEFWRV9MSU5VWF9DRFJPTV9ICisjIGluY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX01BQ0hJTkVfU09VTkRDQVJEX0gKKyMgaW5jbHVkZSA8bWFjaGluZS9zb3VuZGNhcmQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX0NESU9fSAorIyBpbmNsdWRlIDxzeXMvY2Rpby5oPgogI2VuZGlmCiAKICNpZmRlZiBfX0ZyZWVCU0RfXwotI2RlZmluZSBDREFVRElPX0RFViAiL2Rldi9yY2QwYyIKKyMgZGVmaW5lIENEQVVESU9fREVWICIvZGV2L3JjZDBjIgogI2Vsc2UKLSNkZWZpbmUgQ0RBVURJT19ERVYgIi9kZXYvY2Ryb20iCisjIGRlZmluZSBDREFVRElPX0RFViAiL2Rldi9jZHJvbSIKICNlbmRpZgogCiAjaWZkZWYgU09VTkRfVkVSU0lPTgotI2RlZmluZSBJT0NUTChhLGIsYykJCWlvY3RsKGEsYiwmYykKKyMgZGVmaW5lIElPQ1RMKGEsYixjKQkJaW9jdGwoYSxiLCZjKQogI2Vsc2UKLSNkZWZpbmUgSU9DVEwoYSxiLGMpCQkoYyA9IGlvY3RsKGEsYixjKSApCisjIGRlZmluZSBJT0NUTChhLGIsYykJCShjID0gaW9jdGwoYSxiLGMpICkKICNlbmRpZgogCiAjZGVmaW5lIE1BWF9DREFVRElPRFJWIAkJKDEpCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21pZGkuYyBiL211bHRpbWVkaWEvbWlkaS5jCmluZGV4IDBhMmY4OTcuLjViZWE4N2MgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbWlkaS5jCisrKyBiL211bHRpbWVkaWEvbWlkaS5jCkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAibXVsdGltZWRpYS5oIgpAQCAtMjEsMTQgKzIwLDEwIEBACiAjaW5jbHVkZSAieG1hbGxvYy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLSNpZiBkZWZpbmVkIChfX0hBU19TT1VORENBUkRfSF9fKQotCiBzdGF0aWMgTElOVVhfTUlESUlOCU1pZGlJbkRldltNQVhfTUlESUlORFJWXTsKIHN0YXRpYyBMSU5VWF9NSURJT1VUCU1pZGlPdXREZXZbTUFYX01JRElPVVREUlZdOwogc3RhdGljIExJTlVYX01DSU1JREkJTUNJTWlkaURldltNQVhfTUNJTUlESURSVl07CiAKLSNlbmRpZgotCiAvKiB0aGlzIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgTUlESSBkZXZpY2VzIGZvdW5kICovCiBpbnQgTU9ETV9OVU1ERVZTID0gMDsKIApAQCAtNDUsOCArNDAsNiBAQAogewogCVRSQUNFKG1pZGksIndEZXZJRCA9ICUwNFggd01zZyA9ICVkIGR3UGFybTEgPSAlMDRsWCBkd1BhcmFtMiA9ICUwNGxYXG4iLHdEZXZJRCwgd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0KIAlzd2l0Y2ggKHdNc2cpIHsKIAljYXNlIE1PTV9PUEVOOgogCWNhc2UgTU9NX0NMT1NFOgpAQCAtODAsOSArNzMsNiBAQAogCSAgYnJlYWs7CiAJfQogICAgICAgICByZXR1cm4gMDsKLSNlbHNlCi0JcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7Ci0jZW5kaWYKIH0KIAogCkBAIC05MSw3ICs4MSw2IEBACiAgKi8KIHN0YXRpYyBEV09SRCBNSURJX1JlYWRCeXRlKFVJTlQxNiB3RGV2SUQsIEJZVEUgKmxwYnl0KQogewotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJaWYgKGxwYnl0ICE9IE5VTEwpIHsKIAkJaWYgKG1taW9SZWFkKE1DSU1pZGlEZXZbd0RldklEXS5oRmlsZSwgKEhQU1RSKWxwYnl0LAogCQkJKGxvbmcpIHNpemVvZihCWVRFKSkgPT0gKGxvbmcpIHNpemVvZihCWVRFKSkgewpAQCAtMTAxLDkgKzkwLDYgQEAKIAlXQVJOKG1pZGksICJlcnJvciByZWFkaW5nIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOwogCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAKLSNlbHNlCi0gICAgICAgIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwotI2VuZGlmCiB9CiAKIApAQCAtMTc4LDcgKzE2NCw2IEBACiAgKi8KIHN0YXRpYyBEV09SRCBNSURJX1JlYWRNVGhkKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3T2Zmc2V0KQogewotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJRFdPUkQJdG9iZXJlYWQ7CiAJRk9VUkNDCWZvdXJjYzsKIAlUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYKTtcbiIsIHdEZXZJRCwgZHdPZmZzZXQpOwpAQCAtMjA3LDE1ICsxOTIsMTEgQEAKIAkJTWZfZGl2aXNpb24gPSBkaXZpc2lvbiA9IHJlYWQxNmJpdCAoKTsKICovCiAJcmV0dXJuIDA7Ci0jZWxzZQotCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwotI2VuZGlmCiB9CiAKIAogc3RhdGljIERXT1JEIE1JRElfUmVhZE1UcmsoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdPZmZzZXQpCiB7Ci0jaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlEV09SRAl0b2JlcmVhZDsKIAlGT1VSQ0MJZm91cmNjOwogCWlmIChtbWlvU2VlayhNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUsIGR3T2Zmc2V0LCBTRUVLX1NFVCkgIT0gZHdPZmZzZXQpIHsKQEAgLTIzMiw5ICsyMTMsNiBAQAogCXRvYmVyZWFkIC09IDMgKiBzaXplb2YoV09SRCk7CiAJTUNJTWlkaURldlt3RGV2SURdLmR3VG90YWxMZW4gPSB0b2JlcmVhZDsKIAlyZXR1cm4gMDsKLSNlbHNlCi0gICAgICAgICByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKLSNlbmRpZgogfQogCiAKQEAgLTI0Myw3ICsyMjEsNiBAQAogICovCiBzdGF0aWMgRFdPUkQgTUlESV9tY2lPcGVuKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX09QRU5fUEFSTVMxNiBscFBhcm1zKQogewotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJTUlESU9QRU5ERVNDIAlNaWRpRGVzYzsKIAlEV09SRAkJZHdSZXQ7CiAJRFdPUkQJCWR3T2Zmc2V0OwpAQCAtMzMwLDkgKzMwNyw2IEBACiAvKglkd1JldCA9IG1pZE1lc3NhZ2Uod0RldklELCBNSURNX09QRU4sIDAsIChEV09SRCkmTWlkaURlc2MsIENBTExCQUNLX05VTEwpOyovCiAKIAlyZXR1cm4gMDsKLSNlbHNlCi0JcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7Ci0jZW5kaWYKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zNDAsMTYgKzMxNCwxMiBAQAogICovCiBzdGF0aWMgRFdPUkQgTUlESV9tY2lTdG9wKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKLSNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCVRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMgPSBNQ0lfTU9ERV9TVE9QOwogCVRSQUNFKG1pZGksICJNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXM9JXAgJWRcbiIsCiAJCQkmTUNJTWlkaURldlt3RGV2SURdLmR3U3RhdHVzLCBNQ0lNaWRpRGV2W3dEZXZJRF0uZHdTdGF0dXMpOwogCXJldHVybiAwOwotI2Vsc2UKLQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotI2VuZGlmCiB9CiAKIApAQCAtMzU4LDcgKzMyOCw2IEBACiAgKi8KIHN0YXRpYyBEV09SRCBNSURJX21jaUNsb3NlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3UGFyYW0sIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKLSNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCURXT1JECQlkd1JldDsKIAogCVRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdQYXJhbSwgbHBQYXJtcyk7CkBAIC0zODIsOSArMzUxLDYgQEAKICovCiAJCX0KIAlyZXR1cm4gMDsKLSNlbHNlCi0JcmV0dXJuIDA7Ci0jZW5kaWYKIH0KIAogCkBAIC0zOTMsNyArMzU5LDYgQEAKICAqLwogc3RhdGljIERXT1JEIE1JRElfbWNpUGxheShVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9QTEFZX1BBUk1TIGxwUGFybXMpCiB7Ci0jaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlpbnQJCWNvdW50LHN0YXJ0LGVuZDsKIAlMUE1JRElIRFIJbHBNaWRpSGRyOwogCURXT1JECQlkd0RhdGEsZHdSZXQ7CkBAIC00OTQsMTQgKzQ1OSw4IEBACiAJCVRSQUNFKG1pZGksICJNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORDE2KUxPV09SRChscFBhcm1zLT5kd0NhbGxiYWNrKSwgCiAJCQlNQ0lNaWRpRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwotI2lmIDAKLQkJZXhpdCgxKTsKLSNlbmRpZgogCX0KIAlyZXR1cm4gMDsKLSNlbHNlCi0JcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7Ci0jZW5kaWYKICAgICAgIH0KIAogCkBAIC01MTAsNyArNDY5LDYgQEAKICAqLwogc3RhdGljIERXT1JEIE1JRElfbWNpUmVjb3JkKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1JFQ09SRF9QQVJNUyBscFBhcm1zKQogewotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJaW50CQkJc3RhcnQsIGVuZDsKIAlMUE1JRElIRFIJbHBNaWRpSGRyOwogCURXT1JECQlkd1JldDsKQEAgLTU2MSw5ICs1MTksNiBAQAogCQkJTUNJTWlkaURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAl9CiAJcmV0dXJuIDA7Ci0jZWxzZQotCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwotI2VuZGlmCiB9CiAKIApAQCAtNTcyLDEzICs1MjcsOSBAQAogICovCiBzdGF0aWMgRFdPUkQgTUlESV9tY2lQYXVzZShVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7Ci0jaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJcmV0dXJuIDA7Ci0jZWxzZQotCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0jZW5kaWYKIH0KIAogCkBAIC01ODcsMTMgKzUzOCw5IEBACiAgKi8KIHN0YXRpYyBEV09SRCBNSURJX21jaVJlc3VtZShVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7Ci0jaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJcmV0dXJuIDA7Ci0jZWxzZQotCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0jZW5kaWYKIH0KIAogCkBAIC02MDIsNyArNTQ5LDYgQEAKICAqLwogc3RhdGljIERXT1JEIE1JRElfbWNpU2V0KFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NFVF9QQVJNUyBscFBhcm1zKQogewotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJVFJBQ0UobWlkaSwgIiglMDRYLCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCVRSQUNFKG1pZGksICJkd1RpbWVGb3JtYXQ9JTA4bFhcbiIsIGxwUGFybXMtPmR3VGltZUZvcm1hdCk7CkBAIC02NDgsOSArNTk0LDYgQEAKIAlpZiAoZHdGbGFncyAmIE1DSV9TRVFfU0VUX1RFTVBPKQogCQlUUkFDRShtaWRpLCAiTUNJX1NFUV9TRVRfVEVNUE8gIVxuIik7CiAgCXJldHVybiAwOwotI2Vsc2UKLQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotI2VuZGlmCiB9CiAKIApAQCAtNjU5LDcgKzYwMiw2IEBACiAgKi8KIHN0YXRpYyBEV09SRCBNSURJX21jaVN0YXR1cyhVSU5UMTYgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TVEFUVVNfUEFSTVMgbHBQYXJtcykKIHsKLSNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCVRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlpZiAoZHdGbGFncyAmIE1DSV9TVEFUVVNfSVRFTSkgewpAQCAtNzM2LDkgKzY3OCw2IEBACiAJCQlNQ0lNaWRpRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCX0KICAJcmV0dXJuIDA7Ci0jZWxzZQotCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0jZW5kaWYKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03NDcsNyArNjg2LDYgQEAKIHN0YXRpYyBEV09SRCBNSURJX21jaUdldERldkNhcHMoVUlOVDE2IHdEZXZJRCwgRFdPUkQgZHdGbGFncywgCiAJCQkJCUxQTUNJX0dFVERFVkNBUFNfUEFSTVMgbHBQYXJtcykKIHsKLSNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCVRSQUNFKG1pZGksICIoJTA0WCwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlpZiAoZHdGbGFncyAmIE1DSV9HRVRERVZDQVBTX0lURU0pIHsKQEAgLTc4NCw5ICs3MjIsNiBAQAogCQl9CiAJfQogIAlyZXR1cm4gMDsKLSNlbHNlCi0JcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLSNlbmRpZgogfQogCiAKQEAgLTc5NSw3ICs3MzAsNiBAQAogICovCiBzdGF0aWMgRFdPUkQgTUlESV9tY2lJbmZvKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0lORk9fUEFSTVMxNiBscFBhcm1zKQogewotIyBpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkIChsaW51eCkKIAlUUkFDRShtaWRpLCAiKCUwNFgsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJbHBQYXJtcy0+bHBzdHJSZXR1cm4gPSBOVUxMOwpAQCAtODE0LDkgKzc0OCw2IEBACiAJZWxzZQogCQlscFBhcm1zLT5kd1JldFNpemUgPSAwOwogIAlyZXR1cm4gMDsKLSNlbHNlCi0JcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLSNlbmRpZgogfQogCiAKQEAgLTg0Miw3ICs3NzMsNiBAQAogICovCiBzdGF0aWMgRFdPUkQgbWlkT3BlbihXT1JEIHdEZXZJRCwgTFBNSURJT1BFTkRFU0MgbHBEZXNjLCBEV09SRCBkd0ZsYWdzKQogewotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJaW50CQltaWRpOwogCVRSQUNFKG1pZGksICIoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBEZXNjLCBkd0ZsYWdzKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHsKQEAgLTg4Myw5ICs4MTMsNiBAQAogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7Ci0jZWxzZQotCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwotI2VuZGlmCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODkzLDcgKzgyMCw2IEBACiAgKi8KIHN0YXRpYyBEV09SRCBtaWRDbG9zZShXT1JEIHdEZXZJRCkKIHsKLSNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCVRSQUNFKG1pZGksICIoJTA0WCk7XG4iLCB3RGV2SUQpOwogCWlmIChNaWRpSW5EZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKIAkJV0FSTihtaWRpLCJjYW4ndCBjbG9zZSAhXG4iKTsKQEAgLTkwNyw5ICs4MzMsNiBAQAogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7Ci0jZWxzZQotCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwotI2VuZGlmCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTA0Myw3ICs5NjYsNiBAQAogICovCiBzdGF0aWMgRFdPUkQgbW9kT3BlbihXT1JEIHdEZXZJRCwgTFBNSURJT1BFTkRFU0MgbHBEZXNjLCBEV09SRCBkd0ZsYWdzKQogewotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJaW50CQltaWRpOwogCiAJVFJBQ0UobWlkaSwgIiglMDRYLCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscERlc2MsIGR3RmxhZ3MpOwpAQCAtMTA4Niw5ICsxMDA4LDYgQEAKIAl9CiAJVFJBQ0UobWlkaSwgIlN1Y2Nlc2Z1bCB1bml4ZGV2PSVkICFcbiIsIG1pZGkpOwogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwotI2Vsc2UKLQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKLSNlbmRpZgogfQogCiAKQEAgLTEwOTcsNyArMTAxNiw2IEBACiAgKi8KIHN0YXRpYyBEV09SRCBtb2RDbG9zZShXT1JEIHdEZXZJRCkKIHsKLSNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCVRSQUNFKG1pZGksICIoJTA0WCk7XG4iLCB3RGV2SUQpOwogCWlmIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7CiAJCVdBUk4obWlkaSwiY2FuJ3QgY2xvc2UgIVxuIik7CkBAIC0xMTExLDkgKzEwMjksNiBAQAogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7Ci0jZWxzZQotCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwotI2VuZGlmCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTEyMSw3ICsxMDM2LDYgQEAKICAqLwogc3RhdGljIERXT1JEIG1vZERhdGEoV09SRCB3RGV2SUQsIERXT1JEIGR3UGFyYW0pCiB7Ci0jaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlXT1JECWV2ZW50OwogCiAJVFJBQ0UobWlkaSwgIiglMDRYLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGR3UGFyYW0pOwpAQCAtMTEzNSw5ICsxMDQ5LDYgQEAKIAkJV0FSTihtaWRpLCAiZXJyb3Igd3JpdHRpbmcgdW5peGRldiAhXG4iKTsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7Ci0jZWxzZQotICAgICAgICByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKLSNlbmRpZgogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTExNDUsNyArMTA1Niw2IEBACiAgKi8KIHN0YXRpYyBEV09SRCBtb2RMb25nRGF0YShXT1JEIHdEZXZJRCwgTFBNSURJSERSIGxwTWlkaUhkciwgRFdPUkQgZHdTaXplKQogewotI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJaW50CQljb3VudDsKIAlMUFdPUkQJcHRyOwogCWludCAgICAgZW47CkBAIC0xMTkxLDkgKzExMDEsNiBAQAogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAl9CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7Ci0jZWxzZQotCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwotI2VuZGlmCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTIwMSw3ICsxMTA4LDYgQEAKICAqLwogc3RhdGljIERXT1JEIG1vZFByZXBhcmUoV09SRCB3RGV2SUQsIExQTUlESUhEUiBscE1pZGlIZHIsIERXT1JEIGR3U2l6ZSkKIHsKLSNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCVRSQUNFKG1pZGksICIoJTA0WCwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBNaWRpSGRyLCBkd1NpemUpOwogCWlmIChNaWRpT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7CiAJCVdBUk4obWlkaSwiY2FuJ3QgcHJlcGFyZSAhXG4iKTsKQEAgLTEyMTcsOSArMTEyMyw2IEBACiAJbHBNaWRpSGRyLT5kd0ZsYWdzIHw9IE1IRFJfUFJFUEFSRUQ7CiAJbHBNaWRpSGRyLT5kd0ZsYWdzICY9IH5NSERSX0RPTkU7CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7Ci0jZWxzZQotCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwotI2VuZGlmCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTIyNywxNiArMTEzMCwxMiBAQAogICovCiBzdGF0aWMgRFdPUkQgbW9kVW5wcmVwYXJlKFdPUkQgd0RldklELCBMUE1JRElIRFIgbHBNaWRpSGRyLCBEV09SRCBkd1NpemUpCiB7Ci0jaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlUUkFDRShtaWRpLCAiKCUwNFgsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwTWlkaUhkciwgZHdTaXplKTsKIAlpZiAoTWlkaU91dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewogCQlXQVJOKG1pZGksImNhbid0IHVucHJlcGFyZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJfQogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwotI2Vsc2UKLQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKLSNlbmRpZgogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEyOTEsNyArMTE5MCw2IEBACiBMT05HIE1JRElfRHJpdmVyUHJvYyhEV09SRCBkd0RldklELCBIRFJWUjE2IGhEcml2LCBXT1JEIHdNc2csIAogCQkgICAgIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKLSNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCXN3aXRjaCh3TXNnKSB7CiAJY2FzZSBEUlZfTE9BRDoKIAkJcmV0dXJuIDE7CkBAIC0xMzQyLDEwICsxMjQwLDUgQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gRGVmRHJpdmVyUHJvYyhkd0RldklELCBoRHJpdiwgd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAl9Ci0jZWxzZQotCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwotI2VuZGlmCiB9Ci0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21peGVyLmMgYi9tdWx0aW1lZGlhL21peGVyLmMKaW5kZXggZjM3YjkzMS4uMTIzMzUzMSAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9taXhlci5jCisrKyBiL211bHRpbWVkaWEvbWl4ZXIuYwpAQCAtMTUsMTAgKzE1LDExIEBACiAjaW5jbHVkZSAibW1zeXN0ZW0uaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCi0jaWZkZWYgbGludXgKLSNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KLSNlbGlmIF9fRnJlZUJTRF9fCi0jaW5jbHVkZSA8bWFjaGluZS9zb3VuZGNhcmQuaD4KKyNpZmRlZiBIQVZFX1NZU19TT1VORENBUkRfSAorIyBpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX01BQ0hJTkVfU09VTkRDQVJEX0gKKyMgaW5jbHVkZSA8bWFjaGluZS9zb3VuZGNhcmQuaD4KICNlbmRpZgogCiAjZGVmaW5lIE1JWEVSX0RFViAiL2Rldi9taXhlciIKQEAgLTM1LDcgKzM2LDcgQEAKICAqLwogc3RhdGljIERXT1JEIE1JWF9HZXREZXZDYXBzKFdPUkQgd0RldklELCBMUE1JWEVSQ0FQUzE2IGxwQ2FwcywgRFdPUkQgZHdTaXplKQogewotI2lmZGVmIGxpbnV4CisjaWZkZWYgSEFWRV9PU1MKIAlpbnQgCQltaXhlcixtYXNrOwogCiAJVFJBQ0UobW1hdXgsIiglMDRYLCAlcCwgJWx1KTtcbiIsIHdEZXZJRCwgbHBDYXBzLCBkd1NpemUpOwpAQCAtNjQsNyArNjUsNyBAQAogI2VuZGlmCiB9CiAKLSNpZmRlZiBsaW51eAorI2lmZGVmIEhBVkVfT1NTCiBzdGF0aWMgY2hhciAqc2RsYWJlbHNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9IFNPVU5EX0RFVklDRV9MQUJFTFM7CiBzdGF0aWMgY2hhciAqc2RuYW1lc1tTT1VORF9NSVhFUl9OUkRFVklDRVNdID0gU09VTkRfREVWSUNFX05BTUVTOwogI2VuZGlmCkBAIC03NCw3ICs3NSw3IEBACiAgKi8KIHN0YXRpYyBEV09SRCBNSVhfR2V0TGluZUluZm8oV09SRCB3RGV2SUQsIExQTUlYRVJMSU5FMTYgbHBtbCwgRFdPUkQgZmR3SW5mbykKIHsKLSNpZmRlZiBsaW51eAorI2lmZGVmIEhBVkVfT1NTCiAJaW50IAkJbWl4ZXIsaSxqLGRldm1hc2sscmVjc3JjLHJlY21hc2s7CiAKIAlUUkFDRShtbWF1eCwiKCUwNFgsICVwLCAlbHUpO1xuIiwgd0RldklELCBscG1sLCBmZHdJbmZvKTsKQEAgLTE3Niw3ICsxNzcsNyBAQAogICovCiBzdGF0aWMgRFdPUkQgTUlYX09wZW4oV09SRCB3RGV2SUQsIExQTUlYRVJPUEVOREVTQyBscG1vZCwgRFdPUkQgZmxhZ3MpCiB7Ci0jaWZkZWYgbGludXgKKyNpZmRlZiBIQVZFX09TUwogCiAJVFJBQ0UobW1hdXgsIiglMDRYLCAlcCwgJWx1KTtcbiIsd0RldklELGxwbW9kLGZsYWdzKTsKIAlpZiAobHBtb2QgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21tYXV4LmMgYi9tdWx0aW1lZGlhL21tYXV4LmMKaW5kZXggZGU5NTNiMy4uOGQyNjczZCAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tbWF1eC5jCisrKyBiL211bHRpbWVkaWEvbW1hdXguYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBTYW1wbGUgQVVYSUxBUlkgV2luZSBEcml2ZXIgZm9yIExpbnV4CisgKiBTYW1wbGUgQVVYSUxBUlkgV2luZSBEcml2ZXIKICAqCiAgKiBDb3B5cmlnaHQgMTk5NCBNYXJ0aW4gQXlvdHRlCiAgKi8KQEAgLTE3LDEwICsxNywxMSBAQAogI2luY2x1ZGUgIm1tc3lzdGVtLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotI2lmZGVmIGxpbnV4Ci0jaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+Ci0jZWxpZiBfX0ZyZWVCU0RfXwotI2luY2x1ZGUgPG1hY2hpbmUvc291bmRjYXJkLmg+CisjaWZkZWYgSEFWRV9TWVNfU09VTkRDQVJEX0gKKyMgaW5jbHVkZSA8c3lzL3NvdW5kY2FyZC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9NQUNISU5FX1NPVU5EQ0FSRF9ICisjIGluY2x1ZGUgPG1hY2hpbmUvc291bmRjYXJkLmg+CiAjZW5kaWYKIAogI2RlZmluZSBNSVhFUl9ERVYgIi9kZXYvbWl4ZXIiCkBAIC00Miw3ICs0Myw3IEBACiAgKi8KIHN0YXRpYyBEV09SRCBBVVhfR2V0RGV2Q2FwcyhXT1JEIHdEZXZJRCwgTFBBVVhDQVBTMTYgbHBDYXBzLCBEV09SRCBkd1NpemUpCiB7Ci0jaWZkZWYgbGludXgKKyNpZmRlZiBIQVZFX09TUwogCWludCAJbWl4ZXIsdm9sdW1lOwogCiAJVFJBQ0UobW1hdXgsIiglMDRYLCAlcCwgJWx1KTtcbiIsIHdEZXZJRCwgbHBDYXBzLCBkd1NpemUpOwpAQCAtMTEzLDcgKzExNCw3IEBACiAgKi8KIHN0YXRpYyBEV09SRCBBVVhfR2V0Vm9sdW1lKFdPUkQgd0RldklELCBMUERXT1JEIGxwZHdWb2wpCiB7Ci0jaWZkZWYgbGludXgKKyNpZmRlZiBIQVZFX09TUwogCWludCAJbWl4ZXIsdm9sdW1lLGxlZnQscmlnaHQsY21kOwogCiAJVFJBQ0UobW1hdXgsIiglMDRYLCAlcCk7XG4iLCB3RGV2SUQsIGxwZHdWb2wpOwpAQCAtMTcxLDcgKzE3Miw3IEBACiAgKi8KIHN0YXRpYyBEV09SRCBBVVhfU2V0Vm9sdW1lKFdPUkQgd0RldklELCBEV09SRCBkd1BhcmFtKQogewotI2lmZGVmIGxpbnV4CisjaWZkZWYgSEFWRV9PU1MKIAlpbnQgCW1peGVyOwogCWludAkJdm9sdW1lOwogCWludAkJY21kOwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9iaXRtYXAuYyBiL29iamVjdHMvYml0bWFwLmMKaW5kZXggOGI2MmU4ZC4uNzFmYzY0NCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9iaXRtYXAuYworKysgYi9vYmplY3RzL2JpdG1hcC5jCkBAIC01MTUsNyArNTE1LDcgQEAKIAkKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgTG9hZEltYWdlMzJBICAgIChVU0VSMzIuMzY0KQorICoJICAgIExvYWRJbWFnZTMyQSAgICAoVVNFUjMyLjM2NSkKICAqIEZJWE1FOiBpbXBsZW1lbnRhdGlvbiBzdGlsbCBsYWNrcyBuZWFybHkgYWxsIGZlYXR1cmVzLCBzZWUgTFJfKgogICogZGVmaW5lcyBpbiB3aW5kb3dzLmgKICAqLwpAQCAtNTg0LDcgKzU4NCw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgQ29weUltYWdlMzIgICAgKFVTRVIzMi42MCkKKyAqCSAgICBDb3B5SW1hZ2UzMiAgICAoVVNFUjMyLjYxKQogICoKICAqIEZJWE1FOiBpbXBsZW1lbnRhdGlvbiBzdGlsbCBsYWNrcyBuZWFybHkgYWxsIGZlYXR1cmVzLCBzZWUgTFJfKgogICogZGVmaW5lcyBpbiB3aW5kb3dzLmgKQEAgLTYzMiw3ICs2MzIsNyBAQAogICAgICAgICByZXR1cm4gT0JNX0xvYWRCaXRtYXAoIExPV09SRCgoaW50KW5hbWUpICk7CiAgICAgfQogCi0gICAgaWYgKCEoaFJzcmMgPSBGaW5kUmVzb3VyY2UxNiggaW5zdGFuY2UsIG5hbWUsIFJUX0JJVE1BUCApKSkgcmV0dXJuIDA7CisgICAgaWYgKCEoaFJzcmMgPSBGaW5kUmVzb3VyY2UxNiggaW5zdGFuY2UsIG5hbWUsIFJUX0JJVE1BUDE2ICkpKSByZXR1cm4gMDsKICAgICBpZiAoIShoYW5kbGUgPSBMb2FkUmVzb3VyY2UxNiggaW5zdGFuY2UsIGhSc3JjICkpKSByZXR1cm4gMDsKIAogICAgIGluZm8gPSAoQklUTUFQSU5GTyAqKUxvY2tSZXNvdXJjZTE2KCBoYW5kbGUgKTsKQEAgLTY0OCw3ICs2NDgsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgIExvYWRCaXRtYXAzMlcgICAoVVNFUjMyLjM1NykKKyAqCSAgICBMb2FkQml0bWFwMzJXICAgKFVTRVIzMi4zNTgpCiAgKi8KIEhCSVRNQVAzMiBXSU5BUEkgTG9hZEJpdG1hcDMyVyggSElOU1RBTkNFMzIgaW5zdGFuY2UsIExQQ1dTVFIgbmFtZSApCiB7CkBAIC02NjQsOCArNjY0LDcgQEAKICAgICAgICAgcmV0dXJuIE9CTV9Mb2FkQml0bWFwKCBMT1dPUkQoKGludCluYW1lKSApOwogICAgIH0KIAotICAgIGlmICghKGhSc3JjID0gRmluZFJlc291cmNlMzJXKCBpbnN0YW5jZSwgbmFtZSwKLQkJKExQV1NUUilSVF9CSVRNQVAgKSkpIHJldHVybiAwOworICAgIGlmICghKGhSc3JjID0gRmluZFJlc291cmNlMzJXKCBpbnN0YW5jZSwgbmFtZSwgUlRfQklUTUFQMzJXICkpKSByZXR1cm4gMDsKICAgICBpZiAoIShoYW5kbGUgPSBMb2FkUmVzb3VyY2UzMiggaW5zdGFuY2UsIGhSc3JjICkpKSByZXR1cm4gMDsKIAogICAgIGluZm8gPSAoQklUTUFQSU5GTyAqKUxvY2tSZXNvdXJjZTMyKCBoYW5kbGUgKTsKQEAgLTY4MSw3ICs2ODAsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgTG9hZEJpdG1hcDMyQSAgIChVU0VSMzIuMzU2KQorICoJICAgIExvYWRCaXRtYXAzMkEgICAoVVNFUjMyLjM1NykKICAqLwogSEJJVE1BUDMyIFdJTkFQSSBMb2FkQml0bWFwMzJBKCBISU5TVEFOQ0UzMiBpbnN0YW5jZSwgTFBDU1RSIG5hbWUgKQogewpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9jdXJzb3JpY29uLmMgYi9vYmplY3RzL2N1cnNvcmljb24uYwppbmRleCBjMjUzMzNmLi44NDE3MGJmIDEwMDY0NAotLS0gYS9vYmplY3RzL2N1cnNvcmljb24uYworKysgYi9vYmplY3RzL2N1cnNvcmljb24uYwpAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgQ1VSU09SSUNPTkRJUkVOVFJZICplbnRyeSA9IE5VTEw7CiAKICAgICBpZiAoIShoUnNyYyA9IEZpbmRSZXNvdXJjZTE2KCBoSW5zdGFuY2UsIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZDdXJzb3IgPyBSVF9HUk9VUF9DVVJTT1IgOiBSVF9HUk9VUF9JQ09OICkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkN1cnNvciA/IFJUX0dST1VQX0NVUlNPUjE2IDogUlRfR1JPVVBfSUNPTjE2ICkpKQogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgaWYgKCEoaE1lbSA9IExvYWRSZXNvdXJjZTE2KCBoSW5zdGFuY2UsIGhSc3JjICkpKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKChkaXIgPSAoQ1VSU09SSUNPTkRJUiAqKUxvY2tSZXNvdXJjZTE2KCBoTWVtICkpKQpAQCAtMjUxLDcgKzI1MSw3IEBACiAgICAgQ1VSU09SSUNPTkRJUkVOVFJZICplbnRyeSA9IE5VTEw7CiAKICAgICBpZiAoIShoUnNyYyA9IEZpbmRSZXNvdXJjZTMyVyggaEluc3RhbmNlLCBuYW1lLAotICAgICAgICAgICAgICAgIChMUENXU1RSKShmQ3Vyc29yID8gUlRfR1JPVVBfQ1VSU09SIDogUlRfR1JPVVBfSUNPTikgKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkN1cnNvciA/IFJUX0dST1VQX0NVUlNPUjMyVyA6IFJUX0dST1VQX0lDT04zMlcgKSkpCiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICBpZiAoIShoTWVtID0gTG9hZFJlc291cmNlMzIoIGhJbnN0YW5jZSwgaFJzcmMgKSkpIHJldHVybiBGQUxTRTsKICAgICBpZiAoKGRpciA9IChDVVJTT1JJQ09ORElSKilMb2NrUmVzb3VyY2UzMiggaE1lbSApKSkKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICBDcmVhdGVJY29uRnJvbVJlc291cmNlICAgICAgICAgIChVU0VSMzIuPz8/KQorICogICAgICAgICAgQ3JlYXRlSWNvbkZyb21SZXNvdXJjZSAgICAgICAgICAoVVNFUjMyLjc2KQogICogRklYTUU6CiAgKiAgCWJvbkBlbGVrdHJvbi5pa3AucGh5c2lrLnR1LWRhcm1zdGFkdC5kZSA5NzExMzA6IFRlc3Qgd2l0aCB3ZWRpdHJlcwogICoJc2hvd2VkIG9ubHkgYmxhbmsgbGF5b3V0LiBDb3VsZG4ndCBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIHByb2JsZW0KQEAgLTQ2MSw3ICs0NjEsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICBDcmVhdGVJY29uRnJvbVJlc291cmNlRXgzMiAgICAgICAgICAoVVNFUjMyLjc2KQorICogICAgICAgICAgQ3JlYXRlSWNvbkZyb21SZXNvdXJjZUV4MzIgICAgICAgICAgKFVTRVIzMi43NykKICAqLwogSElDT04zMiBXSU5BUEkgQ3JlYXRlSWNvbkZyb21SZXNvdXJjZUV4MzIoIExQQllURSBiaXRzLCBVSU5UMzIgY2JTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBiSWNvbiwgRFdPUkQgZHdWZXJzaW9uLApAQCAtNTAzLDggKzUwMyw4IEBACiAgICAgLyogTG9hZCB0aGUgcmVzb3VyY2UgKi8KIAogICAgIGlmICggKGhSc3JjID0gRmluZFJlc291cmNlMTYoIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUlOVFJFU09VUkNFKCBkaXJFbnRyeS5pY29uLndSZXNJZCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ3Vyc29yID8gUlRfQ1VSU09SIDogUlRfSUNPTiApKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VJTlRSRVNPVVJDRTE2KCBkaXJFbnRyeS5pY29uLndSZXNJZCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQ3Vyc29yID8gUlRfQ1VSU09SMTYgOiBSVF9JQ09OMTYgKSkgKQogICAgIHsKIAkvKiAxNi1iaXQgaWNvbiBvciBjdXJzb3IgcmVzb3VyY2VzIGFyZSBwcm9jZXNzZWQKIAkgKiB0cmFuc3BhcmVudGx5IGJ5IHRoZSBMb2FkUmVzb3VyY2UxNigpIHZpYSBjdXN0b20KQEAgLTU1OCw4ICs1NTgsOCBAQAogICAgIC8qIExvYWQgdGhlIHJlc291cmNlICovCiAKICAgICBpZiAoIChoUnNyYyA9IEZpbmRSZXNvdXJjZTMyVyggaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgIChMUFdTVFIpIChEV09SRCkgZGlyRW50cnkuaWNvbi53UmVzSWQsCi0gICAgICAgICAgICAgICAgICAgICAgKExQV1NUUikgKGZDdXJzb3IgPyBSVF9DVVJTT1IgOiBSVF9JQ09OICkpKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VJTlRSRVNPVVJDRTMyVyggZGlyRW50cnkuaWNvbi53UmVzSWQgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkN1cnNvciA/IFJUX0NVUlNPUjMyVyA6IFJUX0lDT04zMlcgKSkgKQogICAgIHsKIAlIQU5ETEUzMiBoID0gMDsKIAlpZiAoIChoYW5kbGUgPSBMb2FkUmVzb3VyY2UzMiggaEluc3RhbmNlLCBoUnNyYyApKSApCkBAIC02ODksNyArNjg5LDcgQEAKIAogICAgICAgICAgICBpZiggIWhSZXQgKSAvKiBmYWxsIGJhY2sgb24gZGVmYXVsdCBkcmFnIGN1cnNvciAqLwogICAgICAgICAgICAgICAgIGhSZXQgPSBDVVJTT1JJQ09OX0NvcHkoIHBUYXNrLT5oSW5zdGFuY2UgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSU09SSUNPTl9Mb2FkMTYoMCxNQUtFSU5UUkVTT1VSQ0UoT0NSX0RSQUdPQkpFQ1QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VSU09SSUNPTl9Mb2FkMTYoMCxNQUtFSU5UUkVTT1VSQ0UxNihPQ1JfRFJBR09CSkVDVCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU01FVFJJQ1NfQ1hDVVJTT1IsIFNZU01FVFJJQ1NfQ1lDVVJTT1IsIDEsIFRSVUUpICk7CiAgICAgICAgfQogCkBAIC03NDksNyArNzQ5LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDcmVhdGVDdXJzb3IzMiAgICAoVVNFUjMyLjY2KQorICogICAgICAgICAgIENyZWF0ZUN1cnNvcjMyICAgIChVU0VSMzIuNjcpCiAgKi8KIEhDVVJTT1IzMiBXSU5BUEkgQ3JlYXRlQ3Vyc29yMzIoIEhJTlNUQU5DRTMyIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIHhIb3RTcG90LCBJTlQzMiB5SG90U3BvdCwKQEAgLTc4MSw3ICs3ODEsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENyZWF0ZUljb24zMiAgICAoVVNFUjMyLjc0KQorICogICAgICAgICAgIENyZWF0ZUljb24zMiAgICAoVVNFUjMyLjc1KQogICovCiBISUNPTjMyIFdJTkFQSSBDcmVhdGVJY29uMzIoIEhJTlNUQU5DRTMyIGhJbnN0YW5jZSwgSU5UMzIgbldpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBuSGVpZ2h0LCBCWVRFIGJQbGFuZXMsIEJZVEUgYkJpdHNQaXhlbCwKQEAgLTgzNiw3ICs4MzYsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENvcHlJY29uMzIgICAgKFVTRVIzMi41OSkKKyAqICAgICAgICAgICBDb3B5SWNvbjMyICAgIChVU0VSMzIuNjApCiAgKi8KIEhJQ09OMzIgV0lOQVBJIENvcHlJY29uMzIoIEhJQ09OMzIgaEljb24gKQogewpAQCAtODY3LDcgKzg2Nyw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRGVzdHJveUljb24zMiAgICAoVVNFUjMyLjEzMikKKyAqICAgICAgICAgICBEZXN0cm95SWNvbjMyICAgIChVU0VSMzIuMTMzKQogICovCiBCT09MMzIgV0lOQVBJIERlc3Ryb3lJY29uMzIoIEhJQ09OMzIgaEljb24gKQogewpAQCAtODg3LDcgKzg4Nyw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRGVzdHJveUN1cnNvcjMyICAgIChVU0VSMzIuMTMxKQorICogICAgICAgICAgIERlc3Ryb3lDdXJzb3IzMiAgICAoVVNFUjMyLjEzMikKICAqLwogQk9PTDMyIFdJTkFQSSBEZXN0cm95Q3Vyc29yMzIoIEhDVVJTT1IzMiBoQ3Vyc29yICkKIHsKQEAgLTkwNyw3ICs5MDcsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERyYXdJY29uMzIgICAgKFVTRVIzMi4xNTgpCisgKiAgICAgICAgICAgRHJhd0ljb24zMiAgICAoVVNFUjMyLjE1OSkKICAqLwogQk9PTDMyIFdJTkFQSSBEcmF3SWNvbjMyKCBIREMzMiBoZGMsIElOVDMyIHgsIElOVDMyIHksIEhJQ09OMzIgaEljb24gKQogewpAQCAtMTExNyw3ICsxMTE3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRDdXJzb3IzMiAgICAoVVNFUjMyLjQ3MSkKKyAqICAgICAgICAgICBTZXRDdXJzb3IzMiAgICAoVVNFUjMyLjQ3MikKICAqIFJFVFVSTlM6CiAgKglBIGhhbmRsZSB0byB0aGUgcHJldmlvdXMgY3Vyc29yIHNoYXBlLgogICovCkBAIC0xMTUxLDcgKzExNTEsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldEN1cnNvclBvczMyICAgIChVU0VSMzIuNDczKQorICogICAgICAgICAgIFNldEN1cnNvclBvczMyICAgIChVU0VSMzIuNDc0KQogICovCiBCT09MMzIgV0lOQVBJIFNldEN1cnNvclBvczMyKCBJTlQzMiB4LCBJTlQzMiB5ICkKIHsKQEAgLTExNzEsNyArMTE3MSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2hvd0N1cnNvcjMyICAgIChVU0VSMzIuNTI5KQorICogICAgICAgICAgIFNob3dDdXJzb3IzMiAgICAoVVNFUjMyLjUzMCkKICAqLwogSU5UMzIgV0lOQVBJIFNob3dDdXJzb3IzMiggQk9PTDMyIGJTaG93ICkKIHsKQEAgLTEyMDQsNyArMTIwNCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0Q3Vyc29yMzIgICAgKFVTRVIzMi4yMjYpCisgKiAgICAgICAgICAgR2V0Q3Vyc29yMzIgICAgKFVTRVIzMi4yMjcpCiAgKi8KIEhDVVJTT1IzMiBXSU5BUEkgR2V0Q3Vyc29yMzIodm9pZCkKIHsKQEAgLTEyMjQsNyArMTIyNCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ2xpcEN1cnNvcjMyICAgIChVU0VSMzIuNTIpCisgKiAgICAgICAgICAgQ2xpcEN1cnNvcjMyICAgIChVU0VSMzIuNTMpCiAgKi8KIEJPT0wzMiBXSU5BUEkgQ2xpcEN1cnNvcjMyKCBjb25zdCBSRUNUMzIgKnJlY3QgKQogewpAQCAtMTI2OSw3ICsxMjY5LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRDdXJzb3JQb3MzMiAgICAoVVNFUjMyLjIyOCkKKyAqICAgICAgICAgICBHZXRDdXJzb3JQb3MzMiAgICAoVVNFUjMyLjIyOSkKICAqLwogdm9pZCBXSU5BUEkgR2V0Q3Vyc29yUG9zMzIoIFBPSU5UMzIgKnB0ICkKIHsKQEAgLTEyODksNyArMTI4OSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0Q2xpcEN1cnNvcjMyICAgIChVU0VSMzIuMjIwKQorICogICAgICAgICAgIEdldENsaXBDdXJzb3IzMiAgICAoVVNFUjMyLjIyMSkKICAqLwogdm9pZCBXSU5BUEkgR2V0Q2xpcEN1cnNvcjMyKCBSRUNUMzIgKnJlY3QgKQogewpAQCAtMTMyNyw3ICsxMzI3LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgIExvb2t1cEljb25JZEZyb21EaXJlY3RvcnlFeDMyICAgICAgIChVU0VSMzIuMzc5KQorICogICAgICAgICAgTG9va3VwSWNvbklkRnJvbURpcmVjdG9yeUV4MzIgICAgICAgKFVTRVIzMi4zODApCiAgKi8KIElOVDMyIFdJTkFQSSBMb29rdXBJY29uSWRGcm9tRGlyZWN0b3J5RXgzMiggTFBCWVRFIGRpciwgQk9PTDMyIGJJY29uLAogICAgICAgICAgICAgIElOVDMyIHdpZHRoLCBJTlQzMiBoZWlnaHQsIFVJTlQzMiBjRmxhZyApCkBAIC0xMzQ2LDcgKzEzNDYsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgTG9va3VwSWNvbklkRnJvbURpcmVjdG9yeQkJKFVTRVIzMi4zNzgpCisgKiAgICAgICAgICBMb29rdXBJY29uSWRGcm9tRGlyZWN0b3J5CQkoVVNFUjMyLjM3OSkKICAqLwogSU5UMzIgV0lOQVBJIExvb2t1cEljb25JZEZyb21EaXJlY3RvcnkzMiggTFBCWVRFIGRpciwgQk9PTDMyIGJJY29uICkKIHsKQEAgLTEzNjcsMTAgKzEzNjcsMTAgQEAKIAogICAgIHN3aXRjaChyZXNUeXBlKQogICAgIHsKLQljYXNlIFJUX0NVUlNPUjoKKwljYXNlIFJUX0NVUlNPUjE2OgogCSAgICAgcmV0dXJuIChXT1JEKUxvb2t1cEljb25JZEZyb21EaXJlY3RvcnlFeDE2KCBscERpciwgRkFMU0UsIAogCQkJICBTWVNNRVRSSUNTX0NYQ1VSU09SLCBTWVNNRVRSSUNTX0NZQ1VSU09SLCBMUl9NT05PQ0hST01FICk7Ci0JY2FzZSBSVF9JQ09OOgorCWNhc2UgUlRfSUNPTjE2OgogCSAgICAgcmV0dXJuIChXT1JEKUxvb2t1cEljb25JZEZyb21EaXJlY3RvcnlFeDE2KCBscERpciwgVFJVRSwKIAkJCSAgU1lTTUVUUklDU19DWElDT04sIFNZU01FVFJJQ1NfQ1lJQ09OLCAwICk7CiAJZGVmYXVsdDoKQEAgLTE0NDgsNyArMTQ0OCw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExvYWRDdXJzb3JXICAgICAgICAgICAgICAgIChVU0VSMzIuMzYxKQorICogICAgICAgICAgIExvYWRDdXJzb3JXICAgICAgICAgICAgICAgIChVU0VSMzIuMzYyKQogICovCiBIQ1VSU09SMzIgV0lOQVBJIExvYWRDdXJzb3IzMlcoSElOU1RBTkNFMzIgaEluc3RhbmNlLCBMUENXU1RSIG5hbWUpCiB7CkBAIC0xNDU3LDcgKzE0NTcsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMb2FkQ3Vyc29yQSAgICAgICAgICAgICAgICAoVVNFUjMyLjM1OCkKKyAqICAgICAgICAgICBMb2FkQ3Vyc29yQSAgICAgICAgICAgICAgICAoVVNFUjMyLjM1OSkKICAqLwogSENVUlNPUjMyIFdJTkFQSSBMb2FkQ3Vyc29yMzJBKEhJTlNUQU5DRTMyIGhJbnN0YW5jZSwgTFBDU1RSIG5hbWUpCiB7CkBAIC0xNDc0LDcgKzE0NzQsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMb2FkSWNvblcgICAgICAgICAgKFVTRVIzMi4zNjMpCisgKiAgICAgICAgICAgTG9hZEljb25XICAgICAgICAgIChVU0VSMzIuMzY0KQogICovCiBISUNPTjMyIFdJTkFQSSBMb2FkSWNvbjMyVyhISU5TVEFOQ0UzMiBoSW5zdGFuY2UsIExQQ1dTVFIgbmFtZSkKIHsKQEAgLTE0ODQsNyArMTQ4NCw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExvYWRJY29uQSAgICAgICAgICAoVVNFUjMyLjM2MikKKyAqICAgICAgICAgICBMb2FkSWNvbkEgICAgICAgICAgKFVTRVIzMi4zNjMpCiAgKi8KIEhJQ09OMzIgV0lOQVBJIExvYWRJY29uMzJBKEhJTlNUQU5DRTMyIGhJbnN0YW5jZSwgTFBDU1RSIG5hbWUpCiB7CkBAIC0xNTAyLDcgKzE1MDIsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgR2V0SWNvbkluZm8JCShVU0VSMzIuMjQxKQorICogICAgICAgICAgR2V0SWNvbkluZm8JCShVU0VSMzIuMjQyKQogICovCiBCT09MMzIgV0lOQVBJIEdldEljb25JbmZvKEhJQ09OMzIgaEljb24sTFBJQ09OSU5GTyBpY29uaW5mbykgewogICAgIENVUlNPUklDT05JTkZPCSpjaWNvbmluZm87CmRpZmYgLS1naXQgYS9vYmplY3RzL2VuaG1ldGFmaWxlLmMgYi9vYmplY3RzL2VuaG1ldGFmaWxlLmMKaW5kZXggODI2NjI3NS4uOTc0NTY2NiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9lbmhtZXRhZmlsZS5jCisrKyBiL29iamVjdHMvZW5obWV0YWZpbGUuYwpAQCAtMTYsNyArMTYsNyBAQAogICoKICAqCiAgKi8KLUhFTkhNRVRBRklMRTMyIEdldEVuaE1ldGFGaWxlMzJBKCAKK0hFTkhNRVRBRklMRTMyIFdJTkFQSSBHZXRFbmhNZXRhRmlsZTMyQSggCiAJICAgICBMUENTVFIgbHBzek1ldGFGaWxlICAvKiBmaWxlbmFtZSBvZiBlbmhhbmNlZCBtZXRhZmlsZSAqLwogICAgICkKIHsKQEAgLTM5LDEzICszOSwxMyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICBHZXRFbmhNZXRhRmlsZUhlYWRlcjMyICAoR0RJMzIuMTc4KQorICogICAgICAgIEdldEVuaE1ldGFGaWxlSGVhZGVyICAoR0RJMzIuMTc4KQogICoKICAqICBJZiBfYnVmXyBpcyBOVUxMLCByZXR1cm5zIHRoZSBzaXplIG9mIGJ1ZmZlciByZXF1aXJlZC4KICAqICBPdGhlcndpc2UsIGNvcHkgdXAgdG8gX2J1ZnNpemVfIGJ5dGVzIG9mIGVuaGFuY2VkIG1ldGFmaWxlIGhlYWRlciBpbnRvIAogICogIF9idWYuCiAgKi8KLVVJTlQzMiBHZXRFbmhNZXRhRmlsZUhlYWRlcjMyKCAKK1VJTlQzMiBXSU5BUEkgR2V0RW5oTWV0YUZpbGVIZWFkZXIoIAogICAgICAgIEhFTkhNRVRBRklMRTMyIGhtZiwgLyogZW5oYW5jZWQgbWV0YWZpbGUgKi8KICAgICAgICBVSU5UMzIgYnVmc2l6ZSwgICAgIC8qIHNpemUgb2YgYnVmZmVyICovCiAgICAgICAgTFBFTkhNRVRBSEVBREVSIGJ1ZiAvKiBidWZmZXIgKi8gCkBAIC02MCwyOSArNjAsNTMgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICBHZXRFbmhNZXRhRmlsZURlc2NyaXB0aW9uMzJBICAoR0RJMzIuMTc2KQotICoKLSAqICBDb3BpZXMgdGhlIGRlc2NyaXB0aW9uIHN0cmluZyBvZiBhbiBlbmhhbmNlZCBtZXRhZmlsZSBpbnRvIGEgYnVmZmVyIAotICogIF9idWZfLgotICoKLSAqIEZJWE1FCi0gKiAgIGRvZXNuJ3Qgd29yay4gZGVzY3JpcHRpb24gaXMgd2lkZSwgd2l0aCBzdWJzdHJ1Y3R1cmUKICAqLwotVUlOVDMyIEdldEVuaE1ldGFGaWxlRGVzY3JpcHRpb24zMkEoIAorVUlOVDMyIFdJTkFQSSBHZXRFbmhNZXRhRmlsZURlc2NyaXB0aW9uMzJBKCAKICAgICAgICBIRU5ITUVUQUZJTEUzMiBobWYsIC8qIGVuaGFuY2VkIG1ldGFmaWxlICovCiAgICAgICAgVUlOVDMyIHNpemUsIC8qIHNpemUgb2YgYnVmICovIAogICAgICAgIExQU1RSIGJ1ZiAvKiBidWZmZXIgdG8gcmVjZWl2ZSBkZXNjcmlwdGlvbiAqLwogICAgICkKIHsKICAgTFBFTkhNRVRBSEVBREVSIHAgPSBHbG9iYWxMb2NrMzIoaG1mKTsKLSAgCisgIElOVDMyIGZpcnN0ICA9IGxzdHJsZW4zMlcoICh2b2lkICopcCtwLT5vZmZEZXNjcmlwdGlvbik7CisKICAgaWYgKCFidWYgfHwgIXNpemUpIHJldHVybiBwLT5uRGVzY3JpcHRpb247CisKICAgbHN0cmNweW5XdG9BKGJ1ZiwgKHZvaWQgKilwK3AtPm9mZkRlc2NyaXB0aW9uLCBzaXplKTsKLSAgLyogIG1lbW1vdmUoYnVmLCAodm9pZCAqKXArcC0+b2ZmRGVzY3JpcHRpb24sIE1JTihzaXplLHAtPm5EZXNjcmlwdGlvbikpOyovCisgIGJ1ZiArPSBmaXJzdCArMTsKKyAgbHN0cmNweW5XdG9BKGJ1ZiwgKHZvaWQgKilwK3AtPm9mZkRlc2NyaXB0aW9uKzIqKGZpcnN0KzEpLCBzaXplLWZpcnN0LTEpOworCisgIC8qICBtZW1tb3ZlKGJ1ZiwgKHZvaWQgKilwK3AtPm9mZkRlc2NyaXB0aW9uLCBNSU4oc2l6ZSxwLT5uRGVzY3JpcHRpb24pKTsgKi8KKyAgR2xvYmFsVW5sb2NrMzIoaG1mKTsKICAgcmV0dXJuIE1JTihzaXplLHAtPm5EZXNjcmlwdGlvbik7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFBsYXlFbmhNZXRhRmlsZVJlY29yZDMyICAoR0RJMzIuMjY0KQorICogICAgICAgICAgR2V0RW5oTWV0YUZpbGVEZXNjcmlwdGlvbjMyVyAgKEdESTMyLnh4eCkKKyAqCisgKiAgQ29waWVzIHRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgb2YgYW4gZW5oYW5jZWQgbWV0YWZpbGUgaW50byBhIGJ1ZmZlciAKKyAqICBfYnVmXy4KKyAqCisgKiAgSWYgX2J1Zl8gaXMgTlVMTCwgcmV0dXJucyBzaXplIG9mIF9idWZfIHJlcXVpcmVkLiBPdGhlcndpc2UsIHJldHVybnMKKyAqICBudW1iZXIgb2YgY2hhcmFjdGVycyBjb3BpZWQuCisgKi8KK1VJTlQzMiBXSU5BUEkgR2V0RW5oTWV0YUZpbGVEZXNjcmlwdGlvbjMyVyggCisgICAgICAgSEVOSE1FVEFGSUxFMzIgaG1mLCAvKiBlbmhhbmNlZCBtZXRhZmlsZSAqLworICAgICAgIFVJTlQzMiBzaXplLCAvKiBzaXplIG9mIGJ1ZiAqLyAKKyAgICAgICBMUFdTVFIgYnVmIC8qIGJ1ZmZlciB0byByZWNlaXZlIGRlc2NyaXB0aW9uICovCisgICAgKQoreworICBMUEVOSE1FVEFIRUFERVIgcCA9IEdsb2JhbExvY2szMihobWYpOworCisgIGlmICghYnVmIHx8ICFzaXplKSByZXR1cm4gcC0+bkRlc2NyaXB0aW9uOworCisgIG1lbW1vdmUoYnVmLCAodm9pZCAqKXArcC0+b2ZmRGVzY3JpcHRpb24sIE1JTihzaXplLHAtPm5EZXNjcmlwdGlvbikpOworICBHbG9iYWxVbmxvY2szMihobWYpOworICByZXR1cm4gTUlOKHNpemUscC0+bkRlc2NyaXB0aW9uKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUGxheUVuaE1ldGFGaWxlUmVjb3JkICAoR0RJMzIuMjY0KQogICoKICAqICBSZW5kZXIgYSBzaW5nbGUgZW5oYW5jZWQgbWV0YWZpbGUgcmVjb3JkIGluIHRoZSBkZXZpY2UgY29udGV4dCBoZGMuCiAgKgpAQCAtOTEsNyArMTE1LDcgQEAKICAqICBCVUdTCiAgKiAgICBNYW55IHVuaW1wbGVtZW50ZWQgcmVjb3Jkcy4KICAqLwotQk9PTDMyIFBsYXlFbmhNZXRhRmlsZVJlY29yZDMyKCAKK0JPT0wzMiBXSU5BUEkgUGxheUVuaE1ldGFGaWxlUmVjb3JkKCAKICAgICAgSERDMzIgaGRjLCAKICAgICAgLyogZGV2aWNlIGNvbnRleHQgaW4gd2hpY2ggdG8gcmVuZGVyIEVNRiByZWNvcmQgKi8KICAgICAgTFBIQU5ETEVUQUJMRTMyIGhhbmRsZXRhYmxlLCAKQEAgLTM0NSw3ICszNjksNyBAQAogICogQlVHUwogICogICBJZ25vcmVzIHJlY3QuCiAgKi8KLUJPT0wzMiBFbnVtRW5oTWV0YUZpbGUzMiggCitCT09MMzIgV0lOQVBJIEVudW1FbmhNZXRhRmlsZTMyKCAKICAgICAgSERDMzIgaGRjLCAvKiBkZXZpY2UgY29udGV4dCB0byBwYXNzIHRvIF9FbmhNZXRhRnVuY18gKi8KICAgICAgSEVOSE1FVEFGSUxFMzIgaG1mLCAvKiBFTUYgdG8gd2FsayAqLwogICAgICBFTkhNRkVOVU1QUk9DMzIgY2FsbGJhY2ssIC8qIGNhbGxiYWNrIGZ1bmN0aW9uICovIApAQCAtMzcwLDcgKzM5NCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICBQbGF5RW5oTWV0YUZpbGUzMiAgKEdESTMyLjI2MykKKyAqICAgIFBsYXlFbmhNZXRhRmlsZSAgKEdESTMyLjI2MykKICAqCiAgKiAgICBSZW5kZXJzIGFuIGVuaGFuY2VkIG1ldGFmaWxlIGludG8gYSBzcGVjaWZpZWQgcmVjdGFuZ2xlICpscFJlY3QKICAqICAgIGluIGRldmljZSBjb250ZXh0IGhkYy4KQEAgLTM3OSw3ICs0MDMsNyBAQAogICogICAgQWxtb3N0IGVudGlyZWx5IHVuaW1wbGVtZW50ZWQKICAqCiAgKi8KLUJPT0wzMiBQbGF5RW5oTWV0YUZpbGUzMiggCitCT09MMzIgV0lOQVBJIFBsYXlFbmhNZXRhRmlsZSggCiAgICAgICAgSERDMzIgaGRjLCAvKiBEQyB0byByZW5kZXIgaW50byAqLwogICAgICAgIEhFTkhNRVRBRklMRTMyIGhtZiwgLyogbWV0YWZpbGUgdG8gcmVuZGVyICovCiAgICAgICAgY29uc3QgUkVDVDMyICpscFJlY3QgIC8qIHJlY3RhbmdsZSB0byBwbGFjZSBtZXRhZmlsZSBpbnNpZGUgKi8KQEAgLTM5MSw3ICs0MTUsNyBAQAogCQkJCSAgICBzaXplb2YoSEFORExFVEFCTEUzMikqY291bnQpOwogICBodC0+b2JqZWN0SGFuZGxlWzBdID0gaG1mOwogICB3aGlsZSAoMSkgewotICAgIFBsYXlFbmhNZXRhRmlsZVJlY29yZDMyKGhkYywgaHQsIHAsIGNvdW50KTsKKyAgICBQbGF5RW5oTWV0YUZpbGVSZWNvcmQoaGRjLCBodCwgcCwgY291bnQpOwogICAgIGlmIChwLT5pVHlwZSA9PSBFTVJfRU9GKSBicmVhazsKICAgICBwID0gKHZvaWQgKikgcCArIHAtPm5TaXplOyAvKiBjYXN0ZWQgc28gdGhhdCBhcml0aG1ldGljIGlzIGluIGJ5dGVzICovCiAgIH0KQEAgLTM5OSwxNiArNDIzLDE2IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIERlbGV0ZUVuaE1ldGFGaWxlMzIgKEdESTMyLjY4KQorICogIERlbGV0ZUVuaE1ldGFGaWxlIChHREkzMi42OCkKICAqLwotQk9PTDMyIERlbGV0ZUVuaE1ldGFGaWxlMzIoSEVOSE1FVEFGSUxFMzIgaG1mKSB7CitCT09MMzIgV0lOQVBJIERlbGV0ZUVuaE1ldGFGaWxlKEhFTkhNRVRBRklMRTMyIGhtZikgewogICByZXR1cm4gIUdsb2JhbEZyZWUzMihobWYpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBDb3B5RW5oTWV0YUZpbGVBIChHREkzMi4yMSkKICAqLwotSEVOSE1FVEFGSUxFMzIgQ29weUVuaE1ldGFGaWxlMzJBKEhFTkhNRVRBRklMRTMyIGhtZiwgTFBDU1RSIGZpbGUpIHsKK0hFTkhNRVRBRklMRTMyIFdJTkFQSSBDb3B5RW5oTWV0YUZpbGUzMkEoSEVOSE1FVEFGSUxFMzIgaG1mLCBMUENTVFIgZmlsZSkgewogICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9mb250LmMgYi9vYmplY3RzL2ZvbnQuYwppbmRleCA1NjRhNDNjLi43Njk0OGU4IDEwMDY0NAotLS0gYS9vYmplY3RzL2ZvbnQuYworKysgYi9vYmplY3RzL2ZvbnQuYwpAQCAtNzIyLDEwICs3MjIsMTkgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRUZXh0RXh0ZW50UG9pbnQzMlcgICAgKEdESTMyLjIzMSkKKyAqIEdldFRleHRFeHRlbnRQb2ludDMyVyBbR0RJMzIuMjMxXSAgQ29tcHV0ZXMgd2lkdGgvaGVpZ2h0IGZvciBhIHN0cmluZworICoKKyAqIENvbXB1dGVzIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcuCisgKgorICogUkVUVVJOUworICogICAgU3VjY2VzczogVFJVRQorICogICAgRmFpbHVyZTogRkFMU0UKICAqLwotQk9PTDMyIFdJTkFQSSBHZXRUZXh0RXh0ZW50UG9pbnQzMlcoIEhEQzMyIGhkYywgTFBDV1NUUiBzdHIsIElOVDMyIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU0laRTMyIHNpemUgKQorQk9PTDMyIFdJTkFQSSBHZXRUZXh0RXh0ZW50UG9pbnQzMlcoCisgICAgSERDMzIgaGRjLCAgICAgLyogW2luXSAgSGFuZGxlIG9mIGRldmljZSBjb250ZXh0ICovCisgICAgTFBDV1NUUiBzdHIsICAgLyogW2luXSAgQWRkcmVzcyBvZiB0ZXh0IHN0cmluZyAqLworICAgIElOVDMyIGNvdW50LCAgIC8qIFtpbl0gIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHN0cmluZyAqLworICAgIExQU0laRTMyIHNpemUpIC8qIFtvdXRdIEFkZHJlc3Mgb2Ygc3RydWN0dXJlIGZvciBzdHJpbmcgc2l6ZSAqLwogewogICAgIExQU1RSIHAgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHN0ciApOwogICAgIEJPT0wzMiByZXQgPSBHZXRUZXh0RXh0ZW50UG9pbnQzMkEoIGhkYywgcCwgY291bnQsIHNpemUgKTsKQEAgLTg5Niw2ICs5MDUsMjYgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdldE91dGxpbmVUZXh0TWV0cmljcyBbR0RJLjMwOF0gIEdldHMgbWV0cmljcyBmb3IgVHJ1ZVR5cGUgZm9udHMuCisgKgorICogTk9URVMKKyAqICAgIGxwT1RNIHNob3VsZCBiZSBMUE9VVExJTkVURVhUTUVUUklDCisgKgorICogUkVUVVJOUworICogICAgU3VjY2VzczogTm9uLXplcm8gb3Igc2l6ZSBvZiByZXF1aXJlZCBidWZmZXIKKyAqICAgIEZhaWx1cmU6IDAKKyAqLworSU5UMTYgV0lOQVBJIEdldE91dGxpbmVUZXh0TWV0cmljcygKKyAgICBIREMxNiBoZGMsICAgIC8qIFtpbl0gIEhhbmRsZSBvZiBkZXZpY2UgY29udGV4dCAqLworICAgIElOVDE2IGNiRGF0YSwgLyogW2luXSAgU2l6ZSBvZiBtZXRyaWMgZGF0YSBhcnJheSAqLworICAgIHZvaWQgKmxwT1RNKSAgLyogW291dF0gQWRkcmVzcyBvZiBtZXRyaWMgZGF0YSBhcnJheSAqLworeworICAgIEZJWE1FKGZvbnQsICIoJTA0eCwlMDR4LCVwKTogc3R1YlxuIiwgaGRjLGNiRGF0YSxscE9UTSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0Q2hhcldpZHRoMTYgICAgKEdESS4zNTApCiAgKi8KIEJPT0wxNiBXSU5BUEkgR2V0Q2hhcldpZHRoMTYoIEhEQzE2IGhkYywgVUlOVDE2IGZpcnN0Q2hhciwgVUlOVDE2IGxhc3RDaGFyLApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9nZGlvYmouYyBiL29iamVjdHMvZ2Rpb2JqLmMKaW5kZXggMjgzZGNkMS4uOGQwNjBiMCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9nZGlvYmouYworKysgYi9vYmplY3RzL2dkaW9iai5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJnZGkuaCIKIAotV09SRCBHRElfSGVhcFNlbCA9IDA7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgR0RJIHN0b2NrIG9iamVjdHMgCkBAIC04OTcsNyArODk2LDcgQEAKIAkgICAgIElOVDMyIG5NdWx0aXBsaWVyLAogCSAgICAgSU5UMzIgbkRpdmlzb3IKICkgewotI2lmZGVmIF9fR05VQ19fCisjaWYgKFNJWkVPRl9MT05HX0xPTkcgPj0gOCkKICAgICBsb25nIGxvbmcgcmV0OwogICAgIGlmICghbkRpdmlzb3IpIHJldHVybiAtMTsKICAgICByZXQgPSAoKGxvbmcgbG9uZyluTXVsdGlwbGljYW5kICogbk11bHRpcGxpZXIpIC8gbkRpdmlzb3I7CmRpZmYgLS1naXQgYS9vYmplY3RzL21ldGFmaWxlLmMgYi9vYmplY3RzL21ldGFmaWxlLmMKaW5kZXggY2QwYTgwYi4uZWE0MjRiYyAxMDA2NDQKLS0tIGEvb2JqZWN0cy9tZXRhZmlsZS5jCisrKyBiL29iamVjdHMvbWV0YWZpbGUuYwpAQCAtOTUwLDYgKzk1MCw5IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgU2V0TWV0YUZpbGVCaXRzRXggICAgKEdESTMyLjMyMykKKyAqIAorICogIENyZWF0ZSBhIG1ldGFmaWxlIGZyb20gcmF3IGRhdGEuIE5vIGNoZWNraW5nIG9mIHRoZSBkYXRhIGlzIHBlcmZvcm1lZC4KKyAqICBVc2UgX0dldE1ldGFGaWxlQml0c0V4XyB0byBnZXQgcmF3IGRhdGEgZnJvbSBhIG1ldGFmaWxlLgogICovCiBITUVUQUZJTEUzMiBXSU5BUEkgU2V0TWV0YUZpbGVCaXRzRXgoIAogICAgICBVSU5UMzIgc2l6ZSwgLyogc2l6ZSBvZiBtZXRhZmlsZSwgaW4gYnl0ZXMgKi8KZGlmZiAtLWdpdCBhL29iamVjdHMvb2VtYml0bWFwLmMgYi9vYmplY3RzL29lbWJpdG1hcC5jCmluZGV4IGQzNjJmNzcuLmY3YjgzY2UgMTAwNjQ0Ci0tLSBhL29iamVjdHMvb2VtYml0bWFwLmMKKysrIGIvb2JqZWN0cy9vZW1iaXRtYXAuYwpAQCAtNjgsNiArNjgsOCBAQAogI2luY2x1ZGUgImJpdG1hcHMvb2JtX3JlZHVjZV85NSIKICNpbmNsdWRlICJiaXRtYXBzL29ibV9jbG9zZV85NSIKICNpbmNsdWRlICJiaXRtYXBzL29ibV9jbG9zZWRfOTUiCisjaW5jbHVkZSAiYml0bWFwcy9vYm1fcmVzdG9yZV85NSIKKyNpbmNsdWRlICJiaXRtYXBzL29ibV9yZXN0b3JlZF85NSIKIAogCiAjZGVmaW5lIE9CTV9GSVJTVCAgT0JNX1JBRElPQ0hFQ0sgIC8qIEZpcnN0IE9FTSBiaXRtYXAgKi8KQEAgLTEzMSwxMSArMTMzLDE1IEBACiAjaW5jbHVkZSAiYml0bWFwcy9vaWNfcG9ydHJhaXQiCiAjaW5jbHVkZSAiYml0bWFwcy9vaWNfbGFuZHNjYXBlIgogI2luY2x1ZGUgImJpdG1hcHMvb2ljX3dpbmVpY29uIgorI2luY2x1ZGUgImJpdG1hcHMvb2ljX2hhbmRfOTUiCisjaW5jbHVkZSAiYml0bWFwcy9vaWNfcXVlc185NSIKKyNpbmNsdWRlICJiaXRtYXBzL29pY19iYW5nXzk1IgorI2luY2x1ZGUgImJpdG1hcHMvb2ljX25vdGVfOTUiCiAKICNkZWZpbmUgT0lDX0ZJUlNUICBPSUNfU0FNUExFICAgICAgLyogRmlyc3QgT0VNIGljb24gKi8KICNkZWZpbmUgT0lDX0xBU1QgICBPSUNfV0lORUlDT04gICAvKiBMYXN0IE9FTSBpY29uICovCiAKLXN0YXRpYyBjaGFyICoqIGNvbnN0IE9CTV9JY29uc19EYXRhW09JQ19MQVNULU9JQ19GSVJTVCsxXSA9CitzdGF0aWMgY2hhciAqKk9CTV9JY29uc19EYXRhW09JQ19MQVNULU9JQ19GSVJTVCsxXSA9CiB7CiAgICAgb2ljX3NhbXBsZSwgICAgLyogT0lDX1NBTVBMRSAqLwogICAgIG9pY19oYW5kLCAgICAgIC8qIE9JQ19IQU5EICovCkBAIC0xNjQsNiArMTcwLDkgQEAKICNpbmNsdWRlICJiaXRtYXBzL29jcl9kcmFnb2JqZWN0IgogLyojaW5jbHVkZSAiYml0bWFwcy9vY3Jfc2l6ZWFsbCIqLwogLyojaW5jbHVkZSAiYml0bWFwcy9vY3JfaWNvY3VyIiovCisjaW5jbHVkZSAiYml0bWFwcy9vY3Jfbm8iCisjaW5jbHVkZSAiYml0bWFwcy9vY3JfYXBwc3RhcnRpbmciCisjaW5jbHVkZSAiYml0bWFwcy9vY3JfaGVscCIKIAogLyogQ3Vyc29yIGFyZSBub3QgYWxsIGNvbnRpZ3VvdXMgKGdvIGZpZ3VyZS4uLikgKi8KICNkZWZpbmUgT0NSX0ZJUlNUMCBPQ1JfQlVNTUVSCkBAIC0xNzgsMjYgKzE4Nyw0MSBAQAogI2RlZmluZSBPQ1JfTEFTVDIgIE9DUl9TSVpFTlMgCiAjZGVmaW5lIE9DUl9CQVNFMgkoT0NSX0JBU0UxICsgT0NSX0xBU1QxIC0gT0NSX0ZJUlNUMSArIDEpCiAKLSNkZWZpbmUgTkJfQ1VSU09SUyAoT0NSX0JBU0UyICsgT0NSX0xBU1QyIC0gT0NSX0ZJUlNUMiArIDEpCisjZGVmaW5lIE9DUl9GSVJTVDMgT0NSX05PCisjZGVmaW5lIE9DUl9MQVNUMyAgT0NSX05PCisjZGVmaW5lIE9DUl9CQVNFMyAgICAgICAoT0NSX0JBU0UyICsgT0NSX0xBU1QyIC0gT0NSX0ZJUlNUMiArIDEpCisKKyNkZWZpbmUgT0NSX0ZJUlNUNCBPQ1JfQVBQU1RBUlRJTkcKKyNkZWZpbmUgT0NSX0xBU1Q0ICBPQ1JfQVBQU1RBUlRJTkcKKyNkZWZpbmUgT0NSX0JBU0U0ICAgICAgIChPQ1JfQkFTRTMgKyBPQ1JfTEFTVDMgLSBPQ1JfRklSU1QzICsgMSkKKworI2RlZmluZSBPQ1JfRklSU1Q1IE9DUl9IRUxQCisjZGVmaW5lIE9DUl9MQVNUNSAgT0NSX0hFTFAKKyNkZWZpbmUgT0NSX0JBU0U1ICAgICAgIChPQ1JfQkFTRTQgKyBPQ1JfTEFTVDQgLSBPQ1JfRklSU1Q0ICsgMSkKKworI2RlZmluZSBOQl9DVVJTT1JTIChPQ1JfQkFTRTUgKyBPQ1JfTEFTVDUgLSBPQ1JfRklSU1Q1ICsgMSkKIHN0YXRpYyBjaGFyICoqT0JNX0N1cnNvcnNfRGF0YVtOQl9DVVJTT1JTXSA9IAogewotICAgIG9jcl9idW1tZXIsCSAgIC8qIE9DUl9CVU1NRVIgKi8KLSAgICBvY3JfZHJhZ29iamVjdCwvKiBPQ1JfRFJBR09CSkVDVCAqLyAKLSAgICBvY3Jfbm9ybWFsLCAgICAvKiBPQ1JfTk9STUFMICovCi0gICAgb2NyX2liZWFtLCAgICAgLyogT0NSX0lCRUFNICovCi0gICAgb2NyX3dhaXQsICAgICAgLyogT0NSX1dBSVQgKi8KLSAgICBvY3JfY3Jvc3MsICAgICAvKiBPQ1JfQ1JPU1MgKi8KLSAgICBvY3JfdXAsICAgICAgICAvKiBPQ1JfVVAgKi8KLSAgICBvY3Jfc2l6ZSwgICAgICAvKiBPQ1JfU0laRSAqLwotICAgIG9jcl9pY29uLCAgICAgIC8qIE9DUl9JQ09OICovCi0gICAgb2NyX3NpemVud3NlLCAgLyogT0NSX1NJWkVOV1NFICovCi0gICAgb2NyX3NpemVuZXN3LCAgLyogT0NSX1NJWkVORVNXICovCi0gICAgb2NyX3NpemV3ZSwgICAgLyogT0NSX1NJWkVXRSAqLwotICAgIG9jcl9zaXplbnMgICAgIC8qIE9DUl9TSVpFTlMgKi8KKyAgICBvY3JfYnVtbWVyLAkgICAgIC8qIE9DUl9CVU1NRVIgKi8KKyAgICBvY3JfZHJhZ29iamVjdCwgIC8qIE9DUl9EUkFHT0JKRUNUICovIAorICAgIG9jcl9ub3JtYWwsICAgICAgLyogT0NSX05PUk1BTCAqLworICAgIG9jcl9pYmVhbSwgICAgICAgLyogT0NSX0lCRUFNICovCisgICAgb2NyX3dhaXQsICAgICAgICAvKiBPQ1JfV0FJVCAqLworICAgIG9jcl9jcm9zcywgICAgICAgLyogT0NSX0NST1NTICovCisgICAgb2NyX3VwLCAgICAgICAgICAvKiBPQ1JfVVAgKi8KKyAgICBvY3Jfc2l6ZSwgICAgICAgIC8qIE9DUl9TSVpFICovCisgICAgb2NyX2ljb24sICAgICAgICAvKiBPQ1JfSUNPTiAqLworICAgIG9jcl9zaXplbndzZSwgICAgLyogT0NSX1NJWkVOV1NFICovCisgICAgb2NyX3NpemVuZXN3LCAgICAvKiBPQ1JfU0laRU5FU1cgKi8KKyAgICBvY3Jfc2l6ZXdlLCAgICAgIC8qIE9DUl9TSVpFV0UgKi8KKyAgICBvY3Jfc2l6ZW5zLCAgICAgIC8qIE9DUl9TSVpFTlMgKi8KICNpZiAwCi0gICAgb2NyX3NpemVhbGwsICAgLyogT0NSX1NJWkVBTEwgKi8KLSAgICBvY3JfaWNvY3VyICAgICAvKiBPQ1JfSUNPQ1VSICovCisgICAgb2NyX3NpemVhbGwsICAgICAvKiBPQ1JfU0laRUFMTCAqLworICAgIG9jcl9pY29jdXIgICAgICAgLyogT0NSX0lDT0NVUiAqLwogI2VuZGlmCisgICAgb2NyX25vLCAgICAgICAgICAvKiBPQ1JfTk8gKi8KKyAgICBvY3JfYXBwc3RhcnRpbmcsIC8qIE9DUl9BUFBTVEFSVElORyAqLworICAgIG9jcl9oZWxwICAgICAgICAgLyogT0NSX0hFTFAgKi8KIH07CiAKIHN0YXRpYyBIR0xPQkFMMTYgT0JNX0N1cnNvcnNbTkJfQ1VSU09SU107CkBAIC00MTMsNiArNDM3LDEyIEBACiAgICAgICAgICAgICAgICAgICBpZCA9IE9DUl9CQVNFMiArIGlkIC0gT0NSX0ZJUlNUMjsKIAkgICAgIGVsc2UgaWYgKChpZCA+PSBPQ1JfRklSU1QwKSAmJiAoaWQgPD0gT0NSX0xBU1QwKSkKIAkJICAgICAgIGlkID0gT0NSX0JBU0UwICsgaWQgLSBPQ1JfRklSU1QwOworCQkgIGVsc2UgaWYgKChpZCA+PSBPQ1JfRklSU1QzKSAmJiAoaWQgPD0gT0NSX0xBU1QzKSkKKwkJCSAgICBpZCA9IE9DUl9CQVNFMyArIGlkIC0gT0NSX0ZJUlNUMzsKKwkJICAgICAgIGVsc2UgaWYgKChpZCA+PSBPQ1JfRklSU1Q0KSAmJiAoaWQgPD0gT0NSX0xBU1Q0KSkKKwkJCQkgaWQgPSBPQ1JfQkFTRTQgKyBpZCAtIE9DUl9GSVJTVDQ7CisJCQkgICAgZWxzZSBpZiAoKGlkID49IE9DUl9GSVJTVDUpICYmIChpZCA8PSBPQ1JfTEFTVDUpKQorCQkJCSAgICAgIGlkID0gT0NSX0JBU0U1ICsgaWQgLSBPQ1JfRklSU1Q1OwogICAgICAgICBlbHNlIHJldHVybiAwOwogICAgICAgICBpZiAoT0JNX0N1cnNvcnNbaWRdKSByZXR1cm4gT0JNX0N1cnNvcnNbaWRdOwogICAgIH0KQEAgLTQ5OCw3ICs1MjgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgT0JNX0luaXQKICAqCi0gKiBJbml0aWFsaXplcyB0aGUgT0JNX1BpeG1hcHNfRGF0YSBzdHJ1Y3QKKyAqIEluaXRpYWxpemVzIHRoZSBPQk1fUGl4bWFwc19EYXRhIGFuZCBPQk1fSWNvbnNfRGF0YSBzdHJ1Y3QKICAqLwogQk9PTDMyIE9CTV9Jbml0KCkKIHsKQEAgLTUwOCw2ICs1MzgsMTMgQEAKIAlPQk1fUGl4bWFwc19EYXRhW09CTV9aT09NIC0gT0JNX0ZJUlNUXS5kYXRhID0gb2JtX3pvb21fOTU7CiAJT0JNX1BpeG1hcHNfRGF0YVtPQk1fUkVEVUNFIC0gT0JNX0ZJUlNUXS5kYXRhID0gb2JtX3JlZHVjZV85NTsKIAlPQk1fUGl4bWFwc19EYXRhW09CTV9DTE9TRSAtIE9CTV9GSVJTVF0uZGF0YSA9IG9ibV9jbG9zZV85NTsKKyAgICAgICAgT0JNX1BpeG1hcHNfRGF0YVtPQk1fUkVTVE9SRSAtIE9CTV9GSVJTVF0uZGF0YSA9IG9ibV9yZXN0b3JlXzk1OworICAgICAgICBPQk1fUGl4bWFwc19EYXRhW09CTV9SRVNUT1JFRCAtIE9CTV9GSVJTVF0uZGF0YSA9IG9ibV9yZXN0b3JlZF85NTsKKworICAgICAgICBPQk1fSWNvbnNfRGF0YVtPSUNfSEFORCAtIE9JQ19GSVJTVF0gPSBvaWNfaGFuZF85NTsKKyAgICAgICAgT0JNX0ljb25zX0RhdGFbT0lDX1FVRVMgLSBPSUNfRklSU1RdID0gb2ljX3F1ZXNfOTU7CisgICAgICAgIE9CTV9JY29uc19EYXRhW09JQ19CQU5HIC0gT0lDX0ZJUlNUXSA9IG9pY19iYW5nXzk1OworICAgICAgICBPQk1fSWNvbnNfRGF0YVtPSUNfTk9URSAtIE9JQ19GSVJTVF0gPSBvaWNfbm90ZV85NTsKICAgICB9CiAgICAgZWxzZSB7CiAJT0JNX1BpeG1hcHNfRGF0YVtPQk1fWk9PTUQgLSBPQk1fRklSU1RdLmRhdGEgPSBvYm1fem9vbWQ7CkBAIC01MTUsNiArNTUyLDEzIEBACiAJT0JNX1BpeG1hcHNfRGF0YVtPQk1fWk9PTSAtIE9CTV9GSVJTVF0uZGF0YSA9IG9ibV96b29tOwogCU9CTV9QaXhtYXBzX0RhdGFbT0JNX1JFRFVDRSAtIE9CTV9GSVJTVF0uZGF0YSA9IG9ibV9yZWR1Y2U7CiAJT0JNX1BpeG1hcHNfRGF0YVtPQk1fQ0xPU0UgLSBPQk1fRklSU1RdLmRhdGEgPSBvYm1fY2xvc2U7CisgICAgICAgIE9CTV9QaXhtYXBzX0RhdGFbT0JNX1JFU1RPUkUgLSBPQk1fRklSU1RdLmRhdGEgPSBvYm1fcmVzdG9yZTsKKyAgICAgICAgT0JNX1BpeG1hcHNfRGF0YVtPQk1fUkVTVE9SRUQgLSBPQk1fRklSU1RdLmRhdGEgPSBvYm1fcmVzdG9yZWQ7CisKKyAgICAgICAgT0JNX0ljb25zX0RhdGFbT0lDX0hBTkQgLSBPSUNfRklSU1RdID0gb2ljX2hhbmQ7CisgICAgICAgIE9CTV9JY29uc19EYXRhW09JQ19RVUVTIC0gT0lDX0ZJUlNUXSA9IG9pY19xdWVzOworICAgICAgICBPQk1fSWNvbnNfRGF0YVtPSUNfQkFORyAtIE9JQ19GSVJTVF0gPSBvaWNfYmFuZzsKKyAgICAgICAgT0JNX0ljb25zX0RhdGFbT0lDX05PVEUgLSBPSUNfRklSU1RdID0gb2ljX25vdGU7CiAgICAgfQogCiAgICAgcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9vYmplY3RzL3BhbGV0dGUuYyBiL29iamVjdHMvcGFsZXR0ZS5jCmluZGV4IDM3NzVlOWYuLmU0NzExNDggMTAwNjQ0Ci0tLSBhL29iamVjdHMvcGFsZXR0ZS5jCisrKyBiL29iamVjdHMvcGFsZXR0ZS5jCkBAIC04NSwxNiArODUsMjAgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDcmVhdGVQYWxldHRlMzIgICAgKEdESTMyLjUzKQorICogQ3JlYXRlUGFsZXR0ZTMyIFtHREkzMi41M10gIENyZWF0ZXMgYSBsb2dpY2FsIGNvbG9yIHBhbGV0dGUKKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBIYW5kbGUgdG8gbG9naWNhbCBwYWxldHRlCisgKiAgICBGYWlsdXJlOiBOVUxMCiAgKi8KLUhQQUxFVFRFMzIgV0lOQVBJIENyZWF0ZVBhbGV0dGUzMiggY29uc3QgTE9HUEFMRVRURSogcGFsZXR0ZSApCitIUEFMRVRURTMyIFdJTkFQSSBDcmVhdGVQYWxldHRlMzIoCisgICAgY29uc3QgTE9HUEFMRVRURSogcGFsZXR0ZSkgLyogW2luXSBQb2ludGVyIHRvIGxvZ2ljYWwgY29sb3IgcGFsZXR0ZSAqLwogewogICAgIFBBTEVUVEVPQkogKiBwYWxldHRlUHRyOwogICAgIEhQQUxFVFRFMzIgaHBhbGV0dGU7CiAgICAgaW50IHNpemUgPSBzaXplb2YoTE9HUEFMRVRURSkgKyAocGFsZXR0ZS0+cGFsTnVtRW50cmllcyAtIDEpICogc2l6ZW9mKFBBTEVUVEVFTlRSWSk7CiAKLSAgICBUUkFDRShwYWxldHRlLCIlaSBlbnRyaWVzIFxuIiwKLSAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZS0+cGFsTnVtRW50cmllcyk7CisgICAgVFJBQ0UocGFsZXR0ZSwiZW50cmllcz0laVxuIiwgcGFsZXR0ZS0+cGFsTnVtRW50cmllcyk7CiAKICAgICBocGFsZXR0ZSA9IEdESV9BbGxvY09iamVjdCggc2l6ZSArIHNpemVvZihpbnQqKSArc2l6ZW9mKEdESU9CSkhEUikgLCBQQUxFVFRFX01BR0lDICk7CiAgICAgaWYgKCFocGFsZXR0ZSkgcmV0dXJuIDA7CkBAIC0xMTAsMTUgKzExNCwyMiBAQAogICAgIHJldHVybiBocGFsZXR0ZTsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDcmVhdGVIYWxmdG9uZVBhbGV0dGUgICAoR0RJMzIuNDcpCisgKiBDcmVhdGVIYWxmdG9uZVBhbGV0dGUgW0dESTMyLjQ3XSAgQ3JlYXRlcyBhIGhhbGZ0b25lIHBhbGV0dGUKKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBIYW5kbGUgdG8gbG9naWNhbCBoYWxmdG9uZSBwYWxldHRlCisgKiAgICBGYWlsdXJlOiAwCiAgKi8KLUhQQUxFVFRFMzIgV0lOQVBJIENyZWF0ZUhhbGZ0b25lUGFsZXR0ZShIREMzMiBoZGMpCitIUEFMRVRURTMyIFdJTkFQSSBDcmVhdGVIYWxmdG9uZVBhbGV0dGUoCisgICAgSERDMzIgaGRjKSAvKiBbaW5dIEhhbmRsZSB0byBkZXZpY2UgY29udGV4dCAqLwogewotICBGSVhNRShwYWxldHRlLCIoJXgpOiBlbXB0eSBzdHViIVxuIiwgaGRjKTsKLSAgcmV0dXJuIE5VTEw7CisgICAgRklYTUUocGFsZXR0ZSwiKCV4KTogc3R1YlxuIiwgaGRjKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRQYWxldHRlRW50cmllczE2ICAgIChHREkuMzYzKQogICovCkBAIC0xMzAsMTYgKzE0MSwyMiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldFBhbGV0dGVFbnRyaWVzMzIgICAgKEdESTMyLjIwOSkKKyAqIEdldFBhbGV0dGVFbnRyaWVzMzIgW0dESTMyLjIwOV0gIFJldHJpZXZlcyBwYWxldHRlIGVudHJpZXMKKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBOdW1iZXIgb2YgZW50cmllcyBmcm9tIGxvZ2ljYWwgcGFsZXR0ZQorICogICAgRmFpbHVyZTogMAogICovCi1VSU5UMzIgV0lOQVBJIEdldFBhbGV0dGVFbnRyaWVzMzIoIEhQQUxFVFRFMzIgaHBhbGV0dGUsIFVJTlQzMiBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGNvdW50LCBMUFBBTEVUVEVFTlRSWSBlbnRyaWVzICkKK1VJTlQzMiBXSU5BUEkgR2V0UGFsZXR0ZUVudHJpZXMzMigKKyAgICBIUEFMRVRURTMyIGhwYWxldHRlLCAgICAvKiBbaW5dICBIYW5kbGUgb2YgbG9naWNhbCBwYWxldHRlICovCisgICAgVUlOVDMyIHN0YXJ0LCAgICAgICAgICAgLyogW2luXSAgRmlyc3QgZW50cnkgdG8gcmVjZWl2ZSAqLworICAgIFVJTlQzMiBjb3VudCwgICAgICAgICAgIC8qIFtpbl0gIE51bWJlciBvZiBlbnRyaWVzIHRvIHJlY2VpdmUgKi8KKyAgICBMUFBBTEVUVEVFTlRSWSBlbnRyaWVzKSAvKiBbb3V0XSBBZGRyZXNzIG9mIGFycmF5IHJlY2VpdmluZyBlbnRyaWVzICovCiB7CiAgICAgUEFMRVRURU9CSiAqIHBhbFB0cjsKICAgICBJTlQzMiBudW1FbnRyaWVzOwogCi0gICAgVFJBQ0UocGFsZXR0ZSwiaHBhbCA9ICUwNHgsICVpIGVudHJpZXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICBocGFsZXR0ZSwgY291bnQgKTsKKyAgICBUUkFDRShwYWxldHRlLCJocGFsID0gJTA0eCwgY291bnQ9JWlcbiIsIGhwYWxldHRlLCBjb3VudCApOwogICAgICAgICAKICAgICBwYWxQdHIgPSAoUEFMRVRURU9CSiAqKSBHRElfR2V0T2JqUHRyKCBocGFsZXR0ZSwgUEFMRVRURV9NQUdJQyApOwogICAgIGlmICghcGFsUHRyKSByZXR1cm4gMDsKQEAgLTE3MiwxNiArMTg5LDIyIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0UGFsZXR0ZUVudHJpZXMzMiAgICAoR0RJMzIuMzI2KQorICogU2V0UGFsZXR0ZUVudHJpZXMzMiBbR0RJMzIuMzI2XSAgU2V0cyBjb2xvciB2YWx1ZXMgZm9yIHJhbmdlIGluIHBhbGV0dGUKKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBOdW1iZXIgb2YgZW50cmllcyB0aGF0IHdlcmUgc2V0CisgKiAgICBGYWlsdXJlOiAwCiAgKi8KLVVJTlQzMiBXSU5BUEkgU2V0UGFsZXR0ZUVudHJpZXMzMiggSFBBTEVUVEUzMiBocGFsZXR0ZSwgVUlOVDMyIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgY291bnQsIExQUEFMRVRURUVOVFJZIGVudHJpZXMgKQorVUlOVDMyIFdJTkFQSSBTZXRQYWxldHRlRW50cmllczMyKAorICAgIEhQQUxFVFRFMzIgaHBhbGV0dGUsICAgIC8qIFtpbl0gSGFuZGxlIG9mIGxvZ2ljYWwgcGFsZXR0ZSAqLworICAgIFVJTlQzMiBzdGFydCwgICAgICAgICAgIC8qIFtpbl0gSW5kZXggb2YgZmlyc3QgZW50cnkgdG8gc2V0ICovCisgICAgVUlOVDMyIGNvdW50LCAgICAgICAgICAgLyogW2luXSBOdW1iZXIgb2YgZW50cmllcyB0byBzZXQgKi8KKyAgICBMUFBBTEVUVEVFTlRSWSBlbnRyaWVzKSAvKiBbaW5dIEFkZHJlc3Mgb2YgYXJyYXkgb2Ygc3RydWN0dXJlcyAqLwogewogICAgIFBBTEVUVEVPQkogKiBwYWxQdHI7CiAgICAgSU5UMzIgbnVtRW50cmllczsKIAotICAgIFRSQUNFKHBhbGV0dGUsImhwYWwgPSAlMDR4LCAlaSBlbnRyaWVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgaHBhbGV0dGUsIGNvdW50ICk7CisgICAgVFJBQ0UocGFsZXR0ZSwiaHBhbD0lMDR4LHN0YXJ0PSVpLGNvdW50PSVpXG4iLGhwYWxldHRlLHN0YXJ0LGNvdW50ICk7CiAKICAgICBwYWxQdHIgPSAoUEFMRVRURU9CSiAqKSBHRElfR2V0T2JqUHRyKCBocGFsZXR0ZSwgUEFMRVRURV9NQUdJQyApOwogICAgIGlmICghcGFsUHRyKSByZXR1cm4gMDsKQEAgLTIxNCw5ICsyMzcsMTUgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBSZXNpemVQYWxldHRlMzIgICAoR0RJMzIuMjg5KQorICogUmVzaXplUGFsZXR0ZTMyIFtHREkzMi4yODldICBSZXNpemVzIGxvZ2ljYWwgcGFsZXR0ZQorICoKKyAqIFJFVFVSTlMKKyAqICAgIFN1Y2Nlc3M6IFRSVUUKKyAqICAgIEZhaWx1cmU6IEZBTFNFCiAgKi8KLUJPT0wzMiBXSU5BUEkgUmVzaXplUGFsZXR0ZTMyKCBIUEFMRVRURTMyIGhQYWwsIFVJTlQzMiBjRW50cmllcyApCitCT09MMzIgV0lOQVBJIFJlc2l6ZVBhbGV0dGUzMigKKyAgICBIUEFMRVRURTMyIGhQYWwsIC8qIFtpbl0gSGFuZGxlIG9mIGxvZ2ljYWwgcGFsZXR0ZSAqLworICAgIFVJTlQzMiBjRW50cmllcykgLyogW2luXSBOdW1iZXIgb2YgZW50cmllcyBpbiBsb2dpY2FsIHBhbGV0dGUgKi8KIHsKICAgICBQQUxFVFRFT0JKICogcGFsUHRyID0gKFBBTEVUVEVPQkogKikgR0RJX0dldE9ialB0ciggaFBhbCwgUEFMRVRURV9NQUdJQyApOwogICAgIFVJTlQzMgkgY1ByZXZFbnQsIHByZXZWZXI7CkBAIC0yNjgsMTUgKzI5NywyMiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEFuaW1hdGVQYWxldHRlMzIgICAoR0RJMzIuNikKKyAqIEFuaW1hdGVQYWxldHRlMzIgW0dESTMyLjZdICBSZXBsYWNlcyBlbnRyaWVzIGluIGxvZ2ljYWwgcGFsZXR0ZQogICoKLSAqIEZJWE1FOiBzaG91bGQgdXNlIGV4aXN0aW5nIG1hcHBpbmcgd2hlbiBhbmltYXRpbmcgYSBwcmltYXJ5IHBhbGV0dGUKKyAqIFJFVFVSTlMKKyAqICAgIFN1Y2Nlc3M6IFRSVUUKKyAqICAgIEZhaWx1cmU6IEZBTFNFCisgKgorICogRklYTUUKKyAqICAgIFNob3VsZCB1c2UgZXhpc3RpbmcgbWFwcGluZyB3aGVuIGFuaW1hdGluZyBhIHByaW1hcnkgcGFsZXR0ZQogICovCi1CT09MMzIgV0lOQVBJIEFuaW1hdGVQYWxldHRlMzIoIEhQQUxFVFRFMzIgaFBhbCwgVUlOVDMyIFN0YXJ0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIE51bUVudHJpZXMsIExQUEFMRVRURUVOVFJZIFBhbGV0dGVDb2xvcnMpCitCT09MMzIgV0lOQVBJIEFuaW1hdGVQYWxldHRlMzIoCisgICAgSFBBTEVUVEUzMiBoUGFsLCAgICAgICAgICAgICAgLyogW2luXSBIYW5kbGUgdG8gbG9naWNhbCBwYWxldHRlICovCisgICAgVUlOVDMyIFN0YXJ0SW5kZXgsICAgICAgICAgICAgLyogW2luXSBGaXJzdCBlbnRyeSBpbiBwYWxldHRlICovCisgICAgVUlOVDMyIE51bUVudHJpZXMsICAgICAgICAgICAgLyogW2luXSBDb3VudCBvZiBlbnRyaWVzIGluIHBhbGV0dGUgKi8KKyAgICBMUFBBTEVUVEVFTlRSWSBQYWxldHRlQ29sb3JzKSAvKiBbaW5dIFBvaW50ZXIgdG8gZmlyc3QgcmVwbGFjZW1lbnQgKi8KIHsKLSAgICBUUkFDRShwYWxldHRlLCAiJTA0eCAoJWkgLSAlaSlcbiIsIGhQYWwsIAotICAgICAgICAgICAgICAgICAgICBTdGFydEluZGV4LCBTdGFydEluZGV4ICsgTnVtRW50cmllcyApOworICAgIFRSQUNFKHBhbGV0dGUsICIlMDR4ICglaSAtICVpKVxuIiwgaFBhbCwgU3RhcnRJbmRleCxTdGFydEluZGV4K051bUVudHJpZXMpOwogCiAgICAgaWYoIGhQYWwgIT0gU1RPQ0tfREVGQVVMVF9QQUxFVFRFICkgCiAgICAgewpAQCAtMzA3LDEyICszNDMsMTggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRTeXN0ZW1QYWxldHRlVXNlMzIgICAoR0RJMzIuMzM1KQorICogU2V0U3lzdGVtUGFsZXR0ZVVzZTMyIFtHREkzMi4zMzVdCisgKgorICogUkVUVVJOUworICogICAgU3VjY2VzczogUHJldmlvdXMgc3lzdGVtIHBhbGV0dGUKKyAqICAgIEZhaWx1cmU6IFNZU1BBTF9FUlJPUgogICovCi1VSU5UMzIgV0lOQVBJIFNldFN5c3RlbVBhbGV0dGVVc2UzMiggSERDMzIgaGRjLCBVSU5UMzIgdXNlICkKK1VJTlQzMiBXSU5BUEkgU2V0U3lzdGVtUGFsZXR0ZVVzZTMyKAorICAgIEhEQzMyIGhkYywgIC8qIFtpbl0gSGFuZGxlIG9mIGRldmljZSBjb250ZXh0ICovCisgICAgVUlOVDMyIHVzZSkgLyogW2luXSBQYWxldHRlLXVzYWdlIGZsYWcgKi8KIHsKICAgICBVSU5UMzIgb2xkID0gU3lzdGVtUGFsZXR0ZVVzZTsKLSAgICBGSVhNRShwYWxldHRlLCIoJTA0eCwlMDR4KTogZW1wdHkgc3R1YiAhISFcbiIsIGhkYywgdXNlICk7CisgICAgRklYTUUocGFsZXR0ZSwiKCUwNHgsJTA0eCk6IHN0dWJcbiIsIGhkYywgdXNlICk7CiAgICAgU3lzdGVtUGFsZXR0ZVVzZSA9IHVzZTsKICAgICByZXR1cm4gb2xkOwogfQpAQCAtMzI4LDkgKzM3MCwxMyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldFN5c3RlbVBhbGV0dGVVc2UzMiAgIChHREkzMi4yMjMpCisgKiBHZXRTeXN0ZW1QYWxldHRlVXNlMzIgW0dESTMyLjIyM10gIEdldHMgc3RhdGUgb2Ygc3lzdGVtIHBhbGV0dGUKKyAqCisgKiBSRVRVUk5TCisgKiAgICBDdXJyZW50IHN0YXRlIG9mIHN5c3RlbSBwYWxldHRlCiAgKi8KLVVJTlQzMiBXSU5BUEkgR2V0U3lzdGVtUGFsZXR0ZVVzZTMyKCBIREMzMiBoZGMgKQorVUlOVDMyIFdJTkFQSSBHZXRTeXN0ZW1QYWxldHRlVXNlMzIoCisgICAgSERDMzIgaGRjKSAvKiBbaW5dIEhhbmRsZSBvZiBkZXZpY2UgY29udGV4dCAqLwogewogICAgIHJldHVybiBTeXN0ZW1QYWxldHRlVXNlOwogfQpAQCAtMzQ3LDE2ICszOTMsMjIgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRTeXN0ZW1QYWxldHRlRW50cmllczMyICAgKEdESTMyLjIyMikKKyAqIEdldFN5c3RlbVBhbGV0dGVFbnRyaWVzMzIgW0dESTMyLjIyMl0gIEdldHMgcmFuZ2Ugb2YgcGFsZXR0ZSBlbnRyaWVzCisgKgorICogUkVUVVJOUworICogICAgU3VjY2VzczogTnVtYmVyIG9mIGVudHJpZXMgcmV0cmlldmVkIGZyb20gcGFsZXR0ZQorICogICAgRmFpbHVyZTogMAogICovCi1VSU5UMzIgV0lOQVBJIEdldFN5c3RlbVBhbGV0dGVFbnRyaWVzMzIoIEhEQzMyIGhkYywgVUlOVDMyIHN0YXJ0LCBVSU5UMzIgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUEFMRVRURUVOVFJZIGVudHJpZXMgKQorVUlOVDMyIFdJTkFQSSBHZXRTeXN0ZW1QYWxldHRlRW50cmllczMyKAorICAgIEhEQzMyIGhkYywgICAgICAgICAgICAgIC8qIFtpbl0gIEhhbmRsZSBvZiBkZXZpY2UgY29udGV4dCAqLworICAgIFVJTlQzMiBzdGFydCwgICAgICAgICAgIC8qIFtpbl0gIEluZGV4IG9mIGZpcnN0IGVudHJ5IHRvIGJlIHJldHJpZXZlZCAqLworICAgIFVJTlQzMiBjb3VudCwgICAgICAgICAgIC8qIFtpbl0gIE51bWJlciBvZiBlbnRyaWVzIHRvIGJlIHJldHJpZXZlZCAqLworICAgIExQUEFMRVRURUVOVFJZIGVudHJpZXMpIC8qIFtvdXRdIEFycmF5IHJlY2VpdmluZyBzeXN0ZW0tcGFsZXR0ZSBlbnRyaWVzICovCiB7CiAgICAgVUlOVDMyIGk7CiAgICAgREMgKmRjOwogCi0gICAgVFJBQ0UocGFsZXR0ZSwgImhkYyA9ICUwNHgsICIKLQkJICAgICJjb3VuZCA9ICVpXG4iLCBoZGMsIGNvdW50ICk7CisgICAgVFJBQ0UocGFsZXR0ZSwgImhkYz0lMDR4LHN0YXJ0PSVpLGNvdW50PSVpXG4iLCBoZGMsc3RhcnQsY291bnQpOwogCiAgICAgaWYgKCEoZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApKSkgcmV0dXJuIDA7CiAgICAgaWYgKHN0YXJ0ID49IGRjLT53LmRldkNhcHMtPnNpemVQYWxldHRlKQpAQCAtMzg4LDkgKzQ0MCwxOCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldE5lYXJlc3RQYWxldHRlSW5kZXgzMiAgIChHREkzMi4yMDMpCisgKiBHZXROZWFyZXN0UGFsZXR0ZUluZGV4MzIgW0dESTMyLjIwM10gIEdldHMgcGFsZXR0ZSBpbmRleCBmb3IgY29sb3IKKyAqCisgKiBOT1RFUworICogICAgU2hvdWxkIGluZGV4IGJlIGluaXRpYWxpemVkIHRvIENMUl9JTlZBTElEIGluc3RlYWQgb2YgMD8KKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBJbmRleCBvZiBlbnRyeSBpbiBsb2dpY2FsIHBhbGV0dGUKKyAqICAgIEZhaWx1cmU6IENMUl9JTlZBTElECiAgKi8KLVVJTlQzMiBXSU5BUEkgR2V0TmVhcmVzdFBhbGV0dGVJbmRleDMyKCBIUEFMRVRURTMyIGhwYWxldHRlLCBDT0xPUlJFRiBjb2xvciApCitVSU5UMzIgV0lOQVBJIEdldE5lYXJlc3RQYWxldHRlSW5kZXgzMigKKyAgICBIUEFMRVRURTMyIGhwYWxldHRlLCAvKiBbaW5dIEhhbmRsZSBvZiBsb2dpY2FsIGNvbG9yIHBhbGV0dGUgKi8KKyAgICBDT0xPUlJFRiBjb2xvcikgICAgICAvKiBbaW5dIENvbG9yIHRvIGJlIG1hdGNoZWQgKi8KIHsKICAgICBQQUxFVFRFT0JKKglwYWxPYmogPSAoUEFMRVRURU9CSiopR0RJX0dldE9ialB0ciggaHBhbGV0dGUsIFBBTEVUVEVfTUFHSUMgKTsKICAgICBVSU5UMzIgaW5kZXggID0gMDsKQEAgLTQwMCw4ICs0NjEsNyBAQAogCQkJCSAgICAgICAgICBwYWxPYmotPmxvZ3BhbGV0dGUucGFsTnVtRW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGNvbG9yLCBGQUxTRSApOwogCi0gICAgVFJBQ0UocGFsZXR0ZSwiKCUwNHgsJTA2bHgpOiByZXR1cm5pbmcgJWRcbiIsIAotICAgICAgICAgICAgICAgICAgICBocGFsZXR0ZSwgY29sb3IsIGluZGV4ICk7CisgICAgVFJBQ0UocGFsZXR0ZSwiKCUwNHgsJTA2bHgpOiByZXR1cm5pbmcgJWRcbiIsIGhwYWxldHRlLCBjb2xvciwgaW5kZXggKTsKICAgICBHRElfSEVBUF9VTkxPQ0soIGhwYWxldHRlICk7CiAgICAgcmV0dXJuIGluZGV4OwogfQpAQCAtNDE3LDkgKzQ3NywxOCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldE5lYXJlc3RDb2xvcjMyICAgKEdESTMyLjIwMikKKyAqIEdldE5lYXJlc3RDb2xvcjMyIFtHREkzMi4yMDJdICBHZXRzIGEgc3lzdGVtIGNvbG9yIHRvIG1hdGNoCisgKgorICogTk9URVMKKyAqICAgIFNob3VsZCB0aGlzIHJldHVybiBDTFJfSU5WQUxJRCBpbnN0ZWFkIG9mIEZhZGVDYWZlPworICoKKyAqIFJFVFVSTlMKKyAqICAgIFN1Y2Nlc3M6IENvbG9yIGZyb20gc3lzdGVtIHBhbGV0dGUgdGhhdCBjb3JyZXNwb25kcyB0byBnaXZlbiBjb2xvcgorICogICAgRmFpbHVyZTogQ0xSX0lOVkFMSUQKICAqLwotQ09MT1JSRUYgV0lOQVBJIEdldE5lYXJlc3RDb2xvcjMyKCBIREMzMiBoZGMsIENPTE9SUkVGIGNvbG9yICkKK0NPTE9SUkVGIFdJTkFQSSBHZXROZWFyZXN0Q29sb3IzMigKKyAgICBIREMzMiBoZGMsICAgICAgLyogW2luXSBIYW5kbGUgb2YgZGV2aWNlIGNvbnRleHQgKi8KKyAgICBDT0xPUlJFRiBjb2xvcikgLyogW2luXSBDb2xvciB0byBiZSBtYXRjaGVkICovCiB7CiAgICAgQ09MT1JSRUYgCSBuZWFyZXN0ID0gMHhGQURFQ0FGRTsKICAgICBEQyAJCSpkYzsKQEAgLTQzNiw4ICs1MDUsNyBAQAogICAgICAgR0RJX0hFQVBfVU5MT0NLKCBkYy0+dy5oUGFsZXR0ZSApOwogICAgIH0KIAotICAgIFRSQUNFKHBhbGV0dGUsIiglMDZseCk6IHJldHVybmluZyAlMDZseFxuIiwgCi0gICAgICAgICAgICAgICAgICAgIGNvbG9yLCBuZWFyZXN0ICk7CisgICAgVFJBQ0UocGFsZXR0ZSwiKCUwNmx4KTogcmV0dXJuaW5nICUwNmx4XG4iLCBjb2xvciwgbmVhcmVzdCApOwogICAgIEdESV9IRUFQX1VOTE9DSyggaGRjICk7ICAgIAogICAgIHJldHVybiBuZWFyZXN0OwogfQpAQCAtNjEwLDIwICs2NzgsMjQgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZWxlY3RQYWxldHRlMzIgICAgKEdESTMyLjMwMCkKKyAqIFNlbGVjdFBhbGV0dGUzMiBbR0RJMzIuMzAwXSAgU2VsZWN0cyBsb2dpY2FsIHBhbGV0dGUgaW50byBEQworICoKKyAqIFJFVFVSTlMKKyAqICAgIFN1Y2Nlc3M6IFByZXZpb3VzIGxvZ2ljYWwgcGFsZXR0ZQorICogICAgRmFpbHVyZTogTlVMTAogICovCi1IUEFMRVRURTMyIFdJTkFQSSBTZWxlY3RQYWxldHRlMzIoIEhEQzMyIGhEQywgSFBBTEVUVEUzMiBoUGFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgYkZvcmNlQmFja2dyb3VuZCApCitIUEFMRVRURTMyIFdJTkFQSSBTZWxlY3RQYWxldHRlMzIoCisgICAgSERDMzIgaERDLCAgICAgICAgICAgICAgIC8qIFtpbl0gSGFuZGxlIG9mIGRldmljZSBjb250ZXh0ICovCisgICAgSFBBTEVUVEUzMiBoUGFsLCAgICAgICAgIC8qIFtpbl0gSGFuZGxlIG9mIGxvZ2ljYWwgY29sb3IgcGFsZXR0ZSAqLworICAgIEJPT0wzMiBiRm9yY2VCYWNrZ3JvdW5kKSAvKiBbaW5dIEZvcmVncm91bmQvYmFja2dyb3VuZCBtb2RlICovCiB7CiAgICAgV09SRAl3QmtnUGFsZXR0ZSA9IDE7CiAgICAgUEFMRVRURU9CSiogbHB0ID0gKFBBTEVUVEVPQkoqKSBHRElfR2V0T2JqUHRyKCBoUGFsLCBQQUxFVFRFX01BR0lDICk7CiAKLSAgICBUUkFDRShwYWxldHRlLCJkYyAlMDR4IHBhbCAlMDR4LCBmb3JjZT0laSBcbiIsIAotCQkJICAgIGhEQywgaFBhbCwgYkZvcmNlQmFja2dyb3VuZCk7CisgICAgVFJBQ0UocGFsZXR0ZSwiZGM9JTA0eCxwYWw9JTA0eCxmb3JjZT0laVxuIiwgaERDLCBoUGFsLCBiRm9yY2VCYWNrZ3JvdW5kKTsKICAgICBpZiggIWxwdCApIHJldHVybiAwOwogCi0gICAgVFJBQ0UocGFsZXR0ZSwiIGVudHJpZXMgPSAlZFxuIiwgCi0JCQkgICAgbHB0LT5sb2dwYWxldHRlLnBhbE51bUVudHJpZXMpOworICAgIFRSQUNFKHBhbGV0dGUsIiBlbnRyaWVzID0gJWRcbiIsIGxwdC0+bG9ncGFsZXR0ZS5wYWxOdW1FbnRyaWVzKTsKICAgICBHRElfSEVBUF9VTkxPQ0soIGhQYWwgKTsKIAogICAgIGlmKCBoUGFsICE9IFNUT0NLX0RFRkFVTFRfUEFMRVRURSApCkBAIC02NTEsOSArNzIzLDE0IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgUmVhbGl6ZVBhbGV0dGUzMiAgICAoR0RJMzIuMjgwKQorICogUmVhbGl6ZVBhbGV0dGUzMiBbR0RJMzIuMjgwXSAgTWFwcyBwYWxldHRlIGVudHJpZXMgdG8gc3lzdGVtIHBhbGV0dGUKKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBOdW1iZXIgb2YgZW50cmllcyBpbiBsb2dpY2FsIHBhbGV0dGUKKyAqICAgIEZhaWx1cmU6IEdESV9FUlJPUgogICovCi1VSU5UMzIgV0lOQVBJIFJlYWxpemVQYWxldHRlMzIoIEhEQzMyIGhEQyApCitVSU5UMzIgV0lOQVBJIFJlYWxpemVQYWxldHRlMzIoCisgICAgSERDMzIgaERDKSAvKiBbaW5dIEhhbmRsZSBvZiBkZXZpY2UgY29udGV4dCAqLwogewogICAgIFVJTlQzMiByZWFsaXplZCA9IEdESVJlYWxpemVQYWxldHRlKCBoREMgKTsKIApAQCAtNjg5LDEwICs3NjYsMTYgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICBVcGRhdGVDb2xvcnMzMiAgIChHREkzMi4zNTkpCisgKiBVcGRhdGVDb2xvcnMzMiBbR0RJMzIuMzU5XSAgUmVtYXBzIGN1cnJlbnQgY29sb3JzIHRvIGxvZ2ljYWwgcGFsZXR0ZQorICoKKyAqIFJFVFVSTlMKKyAqICAgIFN1Y2Nlc3M6IFRSVUUKKyAqICAgIEZhaWx1cmU6IEZBTFNFCiAgKi8KLUJPT0wzMiBXSU5BUEkgVXBkYXRlQ29sb3JzMzIoIEhEQzMyIGhEQyApCitCT09MMzIgV0lOQVBJIFVwZGF0ZUNvbG9yczMyKAorICAgIEhEQzMyIGhEQykgLyogW2luXSBIYW5kbGUgb2YgZGV2aWNlIGNvbnRleHQgKi8KIHsKICAgICBVcGRhdGVDb2xvcnMxNiggaERDICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CisKZGlmZiAtLWdpdCBhL29iamVjdHMvdGV4dC5jIGIvb2JqZWN0cy90ZXh0LmMKaW5kZXggYzZlOGIyNi4uMjE3MjM3OSAxMDA2NDQKLS0tIGEvb2JqZWN0cy90ZXh0LmMKKysrIGIvb2JqZWN0cy90ZXh0LmMKQEAgLTI4NSw3ICsyODUsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERyYXdUZXh0MzJBICAgIChVU0VSMzIuMTYzKQorICogICAgICAgICAgIERyYXdUZXh0MzJBICAgIChVU0VSMzIuMTY0KQogICovCiBJTlQzMiBXSU5BUEkgRHJhd1RleHQzMkEoIEhEQzMyIGhkYywgTFBDU1RSIHN0ciwgSU5UMzIgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUkVDVDMyIHJlY3QsIFVJTlQzMiBmbGFncyApCkBAIC0zMDMsNyArMzAzLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBEcmF3VGV4dDMyVyAgICAoVVNFUjMyLjE2NikKKyAqICAgICAgICAgICBEcmF3VGV4dDMyVyAgICAoVVNFUjMyLjE2NykKICAqLwogSU5UMzIgV0lOQVBJIERyYXdUZXh0MzJXKCBIREMzMiBoZGMsIExQQ1dTVFIgc3RyLCBJTlQzMiBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBSRUNUMzIgcmVjdCwgVUlOVDMyIGZsYWdzICkKQEAgLTMxNSw3ICszMTUsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBEcmF3VGV4dEV4MzJBICAgIChVU0VSMzIuMTY0KQorICogICAgICAgICAgIERyYXdUZXh0RXgzMkEgICAgKFVTRVIzMi4xNjUpCiAgKi8KIElOVDMyIERyYXdUZXh0RXgzMkEoIEhEQzMyIGhkYywgTFBDU1RSIHN0ciwgSU5UMzIgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICBMUFJFQ1QzMiByZWN0LCBVSU5UMzIgZmxhZ3MsIExQRFJBV1RFWFRQQVJBTVMgZHRwICkKQEAgLTMyNiw3ICszMjYsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBEcmF3VGV4dEV4MzJXICAgIChVU0VSMzIuMTY1KQorICogICAgICAgICAgIERyYXdUZXh0RXgzMlcgICAgKFVTRVIzMi4xNjYpCiAgKi8KIElOVDMyIERyYXdUZXh0RXgzMlcoIEhEQzMyIGhkYywgTFBDV1NUUiBzdHIsIElOVDMyIGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgTFBSRUNUMzIgcmVjdCwgVUlOVDMyIGZsYWdzLCBMUERSQVdURVhUUEFSQU1TIGR0cCApCkBAIC01MzAsNyArNTMwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHcmF5U3RyaW5nMzJBICAgKFVTRVIzMi4zMTQpCisgKiAgICAgICAgICAgR3JheVN0cmluZzMyQSAgIChVU0VSMzIuMzE1KQogICovCiBCT09MMzIgV0lOQVBJIEdyYXlTdHJpbmczMkEoIEhEQzMyIGhkYywgSEJSVVNIMzIgaGJyLCBHUkFZU1RSSU5HUFJPQzMyIGdzcHJjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtLCBJTlQzMiBjY2gsIElOVDMyIHgsIElOVDMyIHksCkBAIC01NDEsNyArNTQxLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHcmF5U3RyaW5nMzJXICAgKFVTRVIzMi4zMTUpCisgKiAgICAgICAgICAgR3JheVN0cmluZzMyVyAgIChVU0VSMzIuMzE2KQogICovCiBCT09MMzIgV0lOQVBJIEdyYXlTdHJpbmczMlcoIEhEQzMyIGhkYywgSEJSVVNIMzIgaGJyLCBHUkFZU1RSSU5HUFJPQzMyIGdzcHJjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtLCBJTlQzMiBjY2gsIElOVDMyIHgsIElOVDMyIHksCkBAIC02NDAsNyArNjQwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBUYWJiZWRUZXh0T3V0MzJBICAgIChVU0VSMzIuNTQxKQorICogICAgICAgICAgIFRhYmJlZFRleHRPdXQzMkEgICAgKFVTRVIzMi41NDIpCiAgKi8KIExPTkcgV0lOQVBJIFRhYmJlZFRleHRPdXQzMkEoIEhEQzMyIGhkYywgSU5UMzIgeCwgSU5UMzIgeSwgTFBDU1RSIGxwc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgY291bnQsIElOVDMyIGNUYWJTdG9wcywKQEAgLTY1NCw3ICs2NTQsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFRhYmJlZFRleHRPdXQzMlcgICAgKFVTRVIzMi41NDIpCisgKiAgICAgICAgICAgVGFiYmVkVGV4dE91dDMyVyAgICAoVVNFUjMyLjU0MykKICAqLwogTE9ORyBXSU5BUEkgVGFiYmVkVGV4dE91dDMyVyggSERDMzIgaGRjLCBJTlQzMiB4LCBJTlQzMiB5LCBMUENXU1RSIHN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGNvdW50LCBJTlQzMiBjVGFiU3RvcHMsCkBAIC02ODQsNyArNjg0LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRUYWJiZWRUZXh0RXh0ZW50MzJBICAgIChVU0VSMzIuMjkyKQorICogICAgICAgICAgIEdldFRhYmJlZFRleHRFeHRlbnQzMkEgICAgKFVTRVIzMi4yOTMpCiAgKi8KIERXT1JEIFdJTkFQSSBHZXRUYWJiZWRUZXh0RXh0ZW50MzJBKCBIREMzMiBoZGMsIExQQ1NUUiBscHN0ciwgSU5UMzIgY291bnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGNUYWJTdG9wcywgY29uc3QgSU5UMzIgKmxwVGFiUG9zICkKQEAgLTY5Nyw3ICs2OTcsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldFRhYmJlZFRleHRFeHRlbnQzMlcgICAgKFVTRVIzMi4yOTMpCisgKiAgICAgICAgICAgR2V0VGFiYmVkVGV4dEV4dGVudDMyVyAgICAoVVNFUjMyLjI5NCkKICAqLwogRFdPUkQgV0lOQVBJIEdldFRhYmJlZFRleHRFeHRlbnQzMlcoIEhEQzMyIGhkYywgTFBDV1NUUiBscHN0ciwgSU5UMzIgY291bnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGNUYWJTdG9wcywgY29uc3QgSU5UMzIgKmxwVGFiUG9zICkKQEAgLTcxMSwyNSArNzExLDQ3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldFRleHRDaGFyc2V0ICAgIChHREkzMi4yMjYpIChHREkuNjEyKQorICogR2V0VGV4dENoYXJzZXQzMiBbR0RJMzIuMjI2XSAgR2V0cyBjaGFyYWN0ZXIgc2V0IGZvciBmb250IGluIERDCisgKgorICogTk9URVMKKyAqICAgIFNob3VsZCBpdCByZXR1cm4gYSBVSU5UMzIgaW5zdGVhZCBvZiBhbiBJTlQzMj8KKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBDaGFyYWN0ZXIgc2V0IGlkZW50aWZpZXIKKyAqICAgIEZhaWx1cmU6IERFRkFVTFRfQ0hBUlNFVAogICovCi1JTlQzMiBXSU5BUEkgR2V0VGV4dENoYXJzZXQzMihIREMzMiBoZGMpCitJTlQzMiBXSU5BUEkgR2V0VGV4dENoYXJzZXQzMigKKyAgICBIREMzMiBoZGMpIC8qIFtpbl0gSGFuZGxlIHRvIGRldmljZSBjb250ZXh0ICovCiB7Ci0gICAgRklYTUUodGV4dCwiKDB4JXgpOiBzdHViXG4iLGhkYyk7Ci0gICAgcmV0dXJuIERFRkFVTFRfQ0hBUlNFVDsgCisgICAgLyogTVNETiBkb2NzIHNheSB0aGlzIGlzIGVxdWl2YWxlbnQgKi8KKyAgICByZXR1cm4gR2V0VGV4dENoYXJzZXRJbmZvKGhkYywgTlVMTCwgMCk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogR2V0VGV4dENoYXJzZXQxNiBbR0RJLjYxMl0KKyAqLwogSU5UMTYgV0lOQVBJIEdldFRleHRDaGFyc2V0MTYoSERDMTYgaGRjKQogewogICAgIHJldHVybiBHZXRUZXh0Q2hhcnNldDMyKGhkYyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldFRleHRDaGFyc2V0SW5mbyAgICAoR0RJMzIuMzgxKQorICogR2V0VGV4dENoYXJzZXRJbmZvIFtHREkzMi4zODFdICBHZXRzIGNoYXJhY3RlciBzZXQgZm9yIGZvbnQKKyAqCisgKiBOT1RFUworICogICAgU2hvdWxkIGNzaSBiZSBhbiBMUEZPTlRTSUdOQVRVUkUgaW5zdGVhZCBvZiBhbiBMUENIQVJTRVRJTkZPPworICogICAgU2hvdWxkIGl0IHJldHVybiBhIFVJTlQzMiBpbnN0ZWFkIG9mIGFuIElOVDMyPworICoKKyAqIFJFVFVSTlMKKyAqICAgIFN1Y2Nlc3M6IENoYXJhY3RlciBzZXQgaWRlbnRpZmllcgorICogICAgRmFpbHVyZTogREVGQVVMVF9DSEFSU0VUCiAgKi8KLUlOVDMyIFdJTkFQSSBHZXRUZXh0Q2hhcnNldEluZm8oSERDMzIgaGRjLExQQ0hBUlNFVElORk8gY3NpLERXT1JEIGZsYWdzKQorSU5UMzIgV0lOQVBJIEdldFRleHRDaGFyc2V0SW5mbygKKyAgICBIREMzMiBoZGMsICAgICAgICAgLyogW2luXSAgSGFuZGxlIHRvIGRldmljZSBjb250ZXh0ICovCisgICAgTFBDSEFSU0VUSU5GTyBjc2ksIC8qIFtvdXRdIFBvaW50ZXIgdG8gc3RydWN0IHRvIHJlY2VpdmUgZGF0YSAqLworICAgIERXT1JEIGZsYWdzKSAgICAgICAvKiBbaW5dICBSZXNlcnZlZCAtIG11c3QgYmUgMCAqLwogewotICAgIEZJWE1FKHRleHQsIigweCV4LCVwLCUwOGx4KTogc3R1YiFcbiIsaGRjLGNzaSxmbGFncyk7CisgICAgRklYTUUodGV4dCwiKDB4JXgsJXAsJTA4bHgpOiBzdHViXG4iLGhkYyxjc2ksZmxhZ3MpOwogICAgIGlmIChjc2kpIHsKIAljc2ktPmNpQ2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVDsKIAljc2ktPmNpQUNQID0gR2V0QUNQKCk7CmRpZmYgLS1naXQgYS9vbGUvY29tcG9iai5jIGIvb2xlL2NvbXBvYmouYwppbmRleCAyZjEwZTMxLi5mYzYzNDZiIDEwMDY0NAotLS0gYS9vbGUvY29tcG9iai5jCisrKyBiL29sZS9jb21wb2JqLmMKQEAgLTMyNCwzNCArMzI0LDIzIEBACiAgKiAgICAgICAgICAgU3RyaW5nRnJvbUdVSUQyIChPTEUzMi4xNTIpCiAgKgogICogQ29udmVydHMgYSBnbG9iYWwgdW5pcXVlIGlkZW50aWZpZXIgaW50byBhIHN0cmluZyBvZiBhbiBBUEktCi0gKiBzcGVjaWZpZWQgZml4ZWQgZm9ybWF0LgorICogc3BlY2lmaWVkIGZpeGVkIGZvcm1hdC4gKFRoZSB1c3VhbCB7Li4uLi59IHN0dWZmLikKICAqCi0gKiBtb3J0ZW5lQHB2di5vcmcgOTgwMzE4CisgKiBSRVRVUk5TCisgKglUaGUgKFVOSUNPREUpIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgR1VJRCBpbiAnc3RyJworICoJVGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZywgMCBpZiB0aGVyZSB3YXMgYW55IHByb2JsZW0uCiAgKi8KLU9MRVNUQVRVUyBXSU5BUEkKLVN0cmluZ0Zyb21HVUlEMihjb25zdCBSRUZHVUlEICppZCwgTFBPTEVTVFIzMiAqc3RyLCBJTlQzMiBjbWF4KQorSU5UMzIgV0lOQVBJCitTdHJpbmdGcm9tR1VJRDIoUkVGR1VJRCBpZCwgTFBPTEVTVFIzMiBzdHIsIElOVDMyIGNtYXgpCiB7Ci0gIGludCBjaGFyc19pbl9zdHJpbmcgPSBzdHJsZW4oIltERERERERERC1XV1dXLVdXV1ctV1dXVy1XV1dXRERERERERERdIikrMTsKLSAgRFdPUkQgZHd0bXBbMl07Ci0gIFdPUkQgd3RtcFs0XTsKKyAgY2hhcgkJeGd1aWRbODBdOwogCi0gIGlmKGNtYXggPj0gY2hhcnNfaW5fc3RyaW5nKSB7Ci0gICAgZHd0bXBbMF0gPSAqKERXT1JEICopaWQ7Ci0gICAgd3RtcFswXSA9ICooV09SRCAqKShpZCArIHNpemVvZihEV09SRCkpOwotICAgIHd0bXBbMV0gPSAqKFdPUkQgKikoaWQgKyBzaXplb2YoRFdPUkQpICsgc2l6ZW9mKFdPUkQpKTsKLSAgICB3dG1wWzJdID0gKihXT1JEICopKGlkICsgc2l6ZW9mKERXT1JEKSArIDIqc2l6ZW9mKFdPUkQpKTsKLSAgICB3dG1wWzNdID0gKihXT1JEICopKGlkICsgc2l6ZW9mKERXT1JEKSArIDMqc2l6ZW9mKFdPUkQpKTsKLSAgICBkd3RtcFsxXSA9ICooRFdPUkQgKikoaWQgKyBzaXplb2YoRFdPUkQpICsgNCpzaXplb2YoV09SRCkpOwotICAgIHNwcmludGYoKihjaGFyICoqKXN0ciwgIlslMDhseC0lMDR4LSUwNHgtJTA0eC0lMDR4JTA4bHhdIiwKLQkgICAgZHd0bXBbMF0sIHd0bXBbMF0sIHd0bXBbMV0sIHd0bXBbMl0sIHd0bXBbM10sIGR3dG1wWzFdKTsKLSAgICBUUkFDRShvbGUsICInJXMnXG4iLCAqc3RyKTsKLSAgICByZXR1cm4gY2hhcnNfaW5fc3RyaW5nOwotICB9Ci0gIGVsc2UgewotICAgIFdBUk4ob2xlLCAiVG9vIGxpdHRsZSBzcGFjZSBpbiB0aGUgc3RyaW5nOiBuZWVkICVkIGNoYXJzLCBnb3Q6ICVkXG4iLAotCSBjaGFyc19pbl9zdHJpbmcsIGNtYXgpOwotICAgIHJldHVybiAwOwotICB9CisgIGlmIChXSU5FX1N0cmluZ0Zyb21DTFNJRChpZCx4Z3VpZCkpCisgIAlyZXR1cm4gMDsKKyAgaWYgKHN0cmxlbih4Z3VpZCk+PWNtYXgpCisgIAlyZXR1cm4gMDsKKyAgbHN0cmNweUF0b1coc3RyLHhndWlkKTsKKyAgcmV0dXJuIHN0cmxlbih4Z3VpZCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvb2xlL29sZTJkaXNwLmMgYi9vbGUvb2xlMmRpc3AuYwppbmRleCBlMDc1MzhmLi4zOGQzMzk5IDEwMDY0NAotLS0gYS9vbGUvb2xlMmRpc3AuYworKysgYi9vbGUvb2xlMmRpc3AuYwpAQCAtOTQsNyArOTQsMTEgQEAKIAlyZXR1cm4gc3RybGVuKEJTVFJfR2V0QWRkcihzdHIpKTsKIH0KIAotT0xFU1RBVFVTIFdJTkFQSSBDcmVhdGVEaXNwVHlwZUluZm8oSU5URVJGQUNFREFUQSAqIHBpZGF0YSxMQ0lEIGxjaWQsTFBWT0lELypJVHlwZUluZm8qLyAqICogcHB0aW5mbykgeworT0xFU1RBVFVTIFdJTkFQSSBDcmVhdGVEaXNwVHlwZUluZm8oCisgICAgSU5URVJGQUNFREFUQSAqIHBpZGF0YSwKKyAgICBMQ0lEIGxjaWQsCisgICAgTFBWT0lEICogKiBwcHRpbmZvKSAvKiBJVHlwZUluZm8gKi8KK3sKIAlmcHJpbnRmKHN0ZGVyciwiQ3JlYXRlRGlzcFR5cGVJbmZvKCVwLCVsZCwlcCksc3R1YlxuIixwaWRhdGEsbGNpZCxwcHRpbmZvKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL29sZS90eXBlbGliLmMgYi9vbGUvdHlwZWxpYi5jCmluZGV4IGQ5ODhkMDMuLjRhZDc1OWQgMTAwNjQ0Ci0tLSBhL29sZS90eXBlbGliLmMKKysrIGIvb2xlL3R5cGVsaWIuYwpAQCAtMzQsNyArMzQsNyBAQAogCQlXSU5FX1N0cmluZ0Zyb21DTFNJRChndWlkLHhndWlkKTsKIAllbHNlCiAJCXNwcmludGYoeGd1aWQsIjxndWlkIDB4JTA4bHg+IiwoRFdPUkQpZ3VpZCk7Ci0JRklYTUUob2xlLCIoJXMsJWQsJWQsMHglMDR4LCVwKSxzdHViIVxuIix4Z3VpZCx3TWFqLHdNaW4sbGNpZCxwYXRoKTsKKwlGSVhNRShvbGUsIiglcywlZCwlZCwweCUwNGx4LCVwKSxzdHViIVxuIix4Z3VpZCx3TWFqLHdNaW4sbGNpZCxwYXRoKTsKIAlyZXR1cm4gRV9GQUlMOwogfQogCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL0NoYW5nZUxvZyBiL3Byb2dyYW1zL25vdGVwYWQvQ2hhbmdlTG9nCmluZGV4IDcxMDAyMmQuLjJjMjk4N2IgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvQ2hhbmdlTG9nCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNyBAQAorU3VuIE1hciAyOSAyMDoyOTo0MSAxOTk4ICBMYXVyZW50IEJ1ZmZsZXIgPGxhdXJlbnRAYmx1ZXdpbi5jaD4KKwkqIFtGci5yY10KKwlBZGRlZCBGcmVuY2ggbGFuZ3VhZ2Ugc3VwcG9ydC4KKwogRnJpIEZlYiAyNyAyMTowMzozNyAxOTk4ICBLYXJsIEJhY2tzdHL2bSA8a2FybF9iQGdlb2NpdGllcy5jb20+CiAJKiBGaXhlZCBzb21lIG1pbm9yIGZlYXR1cmVzLgogCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL0ZyLnJjIGIvcHJvZ3JhbXMvbm90ZXBhZC9Gci5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzEwMmY2Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9Gci5yYwpAQCAtMCwwICsxLDkwIEBACisvKgorICogTm90ZXBhZCAoRnJlbmNoIHJlc291cmNlcykKKyAqCisgKiBDb3B5cmlnaHQgMTk5NyBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CisgKiBUcmFuc2xhdGlvbiBieSBMYXVyZW50IEJ1ZmZsZXIgPGxhdXJlbnRAYmx1ZXdpbi5jaD4KKyAqLworCisjZGVmaW5lIExBTkdVQUdFX0lEICAgICAgICAgICAgICAgICAgRnIKKyNkZWZpbmUgTEFOR1VBR0VfTlVNQkVSICAgICAgICAgICAgICAzCisjZGVmaW5lIExBTkdVQUdFX01FTlVfSVRFTSAgICAgICAgICAgIiZGcmFu52FpcyIKKworLyogTWVudSAqLworCisjZGVmaW5lIE1FTlVfRklMRSAgICAgICAgICAgICAgICAgICAgIiZGaWNoaWVyIgorI2RlZmluZSBNRU5VX0ZJTEVfTkVXICAgICAgICAgICAgICAgICImTm91dmVhdS4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX09QRU4gICAgICAgICAgICAgICAiJk91dnJpciIKKyNkZWZpbmUgTUVOVV9GSUxFX1NBVkUgICAgICAgICAgICAgICAiJlNhdXZlciIKKyNkZWZpbmUgTUVOVV9GSUxFX1NBVkVBUyAgICAgICAgICAgICAiUyZhdXZlciBzb3VzLi4uIgorI2RlZmluZSBNRU5VX0ZJTEVfUFJJTlQgICAgICAgICAgICAgICJJbSZwcmltZXIiCisjZGVmaW5lIE1FTlVfRklMRV9QQUdFU0VUVVAgICAgICAgICAgIiZNaXNlIGVuIHBhZ2UuLi4iCisjZGVmaW5lIE1FTlVfRklMRV9QUklOVFNFVFVQICAgICAgICAgIkltcCZyaW1hbnRlLi4uIgorI2RlZmluZSBNRU5VX0ZJTEVfRVhJVCAgICAgICAgICAgICAgICImUXVpdHRlciIKKworI2RlZmluZSBNRU5VX0VESVQgICAgICAgICAgICAgICAgICAgICImRWRpdGlvbiIKKyNkZWZpbmUgTUVOVV9FRElUX1VORE8gICAgICAgICAgICAgICAiJkFubnVsZXJcdEN0cmwrWiIKKyNkZWZpbmUgTUVOVV9FRElUX0NVVCAgICAgICAgICAgICAgICAiQ291cGUmclx0Q3RybCtYIgorI2RlZmluZSBNRU5VX0VESVRfQ09QWSAgICAgICAgICAgICAgICImQ29waWVyXHRDdHJsK0MiCisjZGVmaW5lIE1FTlVfRURJVF9QQVNURSAgICAgICAgICAgICAgIkMmb2xsZXJcdEN0cmwrViIKKyNkZWZpbmUgTUVOVV9FRElUX0RFTEVURSAgICAgICAgICAgICAiRSZmZmFjZXJcdERlbCIKKyNkZWZpbmUgTUVOVV9FRElUX1NFTEVDVEFMTCAgICAgICAgICAiVG91dCAmc2VsZWN0aW9ubmVyIgorI2RlZmluZSBNRU5VX0VESVRfVElNRURBVEUgICAgICAgICAgICImSGV1cmUvRGF0ZVx0RjUiCisjZGVmaW5lIE1FTlVfRURJVF9XUkFQICAgICAgICAgICAgICAgIiZSZXRvdXIg4CBsYSBsaWduZSIKKworI2RlZmluZSBNRU5VX1NFQVJDSCAgICAgICAgICAgICAgICAgICImUmVjaGVyY2hlIgorI2RlZmluZSBNRU5VX1NFQVJDSF9TRUFSQ0ggICAgICAgICAgICImQ2hlcmNoZXIuLi4iCisjZGVmaW5lIE1FTlVfU0VBUkNIX05FWFQgICAgICAgICAgICAgIiZTdWl2YW50XHRGMyIKKworI2RlZmluZSBNRU5VX0xBTkdVQUdFICAgICAgICAgICAgICAgICImTGFuZ3VlIgorCisjZGVmaW5lIE1FTlVfSEVMUCAgICAgICAgICAgICAgICAgICAgIiZBaWRlIgorI2RlZmluZSBNRU5VX0hFTFBfQ09OVEVOVFMgICAgICAgICAgICImU29tbWFpcmUiCisjZGVmaW5lIE1FTlVfSEVMUF9TRUFSQ0ggICAgICAgICAgICAgIiZDaGVyY2hlci4uLiIKKyNkZWZpbmUgTUVOVV9IRUxQX0hFTFBfT05fSEVMUCAgICAgICAiJkFpZGUgc3VyIGwnYWlkZSIKKworI2RlZmluZSBNRU5VX0lORk8gICAgICAgICAgICAgICAgICAgICJJbmYmby4uLiIKKyNkZWZpbmUgTUVOVV9JTkZPX0xJQ0VOU0UgICAgICAgICAgICAiJkxpY2Vuc2UiCisjZGVmaW5lIE1FTlVfSU5GT19OT19XQVJSQU5UWSAgICAgICAgIiZTQU5TIEdBUkFOVElFIgorI2RlZmluZSBNRU5VX0lORk9fQUJPVVRfV0lORSAgICAgICAgICImQSBwcm9wb3MgZGUgV2luZSIKKworLyogRGlhbG9ncyAqLworCisjZGVmaW5lIERJQUxPR19PSyAgICAgICAgICAgICAgICAgICAgIk9LIgorI2RlZmluZSBESUFMT0dfQ0FOQ0VMICAgICAgICAgICAgICAgICJBbm51bGVyIgorI2RlZmluZSBESUFMT0dfQlJPV1NFICAgICAgICAgICAgICAgICImUGFyY291cmlyLi4uIgorI2RlZmluZSBESUFMT0dfSEVMUCAgICAgICAgICAgICAgICAgICImQWlkZSIKKworI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX0NBUFRJT04gICAgICJNaXNlIGVuIHBhZ2UiCisjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfSEVBRCAgICAgICAgIiZFbi106nRlOiIKKyNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9UQUlMICAgICAgICAiJlBpZWQgZGUgcGFnZToiCisjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfTUFSR0lOICAgICAgIiZNYXJnZXM6IgorI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX0xFRlQgICAgICAgICImR2F1Y2hlOiIKKyNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9SSUdIVCAgICAgICAiJkRyb2l0ZToiCisjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfVE9QICAgICAgICAgIiZIYXV0OiIKKyNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9CT1RUT00gICAgICAiJkJhczoiCisKKworLyogU3RyaW5ncyAqLworI2RlZmluZSBTVFJJTkdfTk9URVBBRCAgICAgICAgICAgICAgICJOb3RlcGFkIgorI2RlZmluZSBTVFJJTkdfRVJST1IgICAgICAgICAgICAgICAgICJFUlJFVVIiCisjZGVmaW5lIFNUUklOR19XQVJOSU5HICAgICAgICAgICAgICAgIkFWRVJUSVNTRU1FTlQiCisjZGVmaW5lIFNUUklOR19JTkZPICAgICAgICAgICAgICAgICAgIkluZm9ybWF0aW9uIgorCisjZGVmaW5lIFNUUklOR19VTlRJVExFRCAgICAgICAgICAgICAgIihzYW5zIHRpdHJlKSIKKworI2RlZmluZSBTVFJJTkdfQUxMX0ZJTEVTICAgICAgICAgICAgICAiVG91cyAoKi4qKSIKKyNkZWZpbmUgU1RSSU5HX1RFWFRfRklMRVNfVFhUICAgICAgICAgIkZpY2hpZXJzIHRleHRlICgqLnR4dCkiCisKKyNkZWZpbmUgU1RSSU5HX1RPT0xBUkdFICAgICAgICAgIkxlIGZpY2hpZXIgJyVzJyBlc3QgdHJvcCBncmFuZCBwb3VyIGxlIGJsb2Mgbm90ZS5cbiBcCitWZXVpbGxleiB1dGlsaXNlciB1biBhdXRyZSDpZGl0ZXVyLiIKKworI2RlZmluZSBTVFJJTkdfTk9URVhUICAgICAgICAgICAiVm91cyBuJ2F2ZXogcGFzIGVudHLpIGRlIHRleHRlLiBcCitcblZldWlsbGV6IHRhcGVyIHF1ZWxxdWUgY2hvc2UgZXQgcmVjb21tZW5jZXIiCisKKyNkZWZpbmUgU1RSSU5HX05PVEZPVU5EICAgICAgICAgIiclcycgaW50cm91dmFibGUuIgorCisjZGVmaW5lIFNUUklOR19PVVRfT0ZfTUVNT1JZICAgICJQYXMgYXNzZXogZGUgbeltb2lyZSBwb3VyIGZpbmlyIGNldHRlIHTiY2hlLiBcCitcbkZlcm1leiB1bmUgb3UgcGx1c2llciBhcHBsaWNhdGlvbnMgcG91ciBsaWLpcmVyIFxuIFwKK2RlIGxhIG3pbW9pcmUuIgorCisjaW5jbHVkZSAibm90ZXBhZC5yYyIKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUuaW4gYi9wcm9ncmFtcy9ub3RlcGFkL01ha2VmaWxlLmluCmluZGV4IGZhOTQ1YWQuLjNkNjJiOWEgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUuaW4KKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZS5pbgpAQCAtOCw3ICs4LDcgQEAKIEFMTF9MSUJTICA9ICQoV0lORUxJQikgJChYX0xJQlMpICQoWFBNX0xJQikgJChYTElCKSAkKExJQlMpCiBSQ0ZMQUdTICAgPSAtdzMyIC1oCiAKLUxBTkdVQUdFUyAgID0gRW4gRGUgU3cKK0xBTkdVQUdFUyAgID0gRW4gRGUgRnIgU3cKIExJQ0VOU0VMQU5HID0gRW4KIAogTU9TVFNSQ1MgPSBcCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL1RPRE8gYi9wcm9ncmFtcy9ub3RlcGFkL1RPRE8KaW5kZXggYmI1NWY0OC4uYzdhMmJjMyAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvbm90ZXBhZC9UT0RPCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvVE9ETwpAQCAtMSw0ICsxLDYgQEAKIAorIC0gTG9nZmlsZSBmZWF0dXJlCisKICAtIE5vdGVwYWQgc2VnZmF1bHRzIHdoZW4gc2VsZWN0aW5nICJGaW5kIiBidXR0b24gaW4gIlNlYXJjaCIgZGlhbG9nLgogIAogIC0gY3JlYXRlIG5ldyAqLnJjIGZpbGVzIGZvciBhbGwgbGFuZ3VhZ2VzIHlvdSBrbm93LgpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9saWNlbnNlLmMgYi9wcm9ncmFtcy9ub3RlcGFkL2xpY2Vuc2UuYwppbmRleCBiMTBmMmUzLi45ZmY2MmE2IDEwMDY0NAotLS0gYS9wcm9ncmFtcy9ub3RlcGFkL2xpY2Vuc2UuYworKysgYi9wcm9ncmFtcy9ub3RlcGFkL2xpY2Vuc2UuYwpAQCAtNywyMyArNywyNSBAQAogCiBzdGF0aWMgTElDRU5TRSogU2VsZWN0TGFuZ3VhZ2UoTFBDU1RSIExhbmd1YWdlKQogewotLyogIGlmIChsc3RyY21wKExhbmd1YWdlLCAiQ3oiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9Deik7ICovCi0vKiAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJEYSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0RhKTsgKi8KLS8qICBpZiAobHN0cmNtcChMYW5ndWFnZSwgIkRlIikpIHJldHVybigmV2luZUxpY2Vuc2VfRW4pOyAqLwotLyogIGlmIChsc3RyY21wKExhbmd1YWdlLCAiRW4iKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9Fbik7ICovCi0vKiAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJFbyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0VvKTsgKi8KLS8qICBpZiAobHN0cmNtcChMYW5ndWFnZSwgIkVzIikpIHJldHVybigmV2luZUxpY2Vuc2VfRXMpOyAqLwotLyogIGlmIChsc3RyY21wKExhbmd1YWdlLCAiRmkiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9GaSk7ICovCi0vKiAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJGciIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0ZyKTsgKi8KLS8qICBpZiAobHN0cmNtcChMYW5ndWFnZSwgIkh1IikpIHJldHVybigmV2luZUxpY2Vuc2VfSHUpOyAqLwotLyogIGlmIChsc3RyY21wKExhbmd1YWdlLCAiSXQiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9JdCk7ICovCi0vKiAgaWYgKGxzdHJjbXAoTGFuZ2F1Z2UsICJLbyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0tvKTsgKi8KLS8qICBpZiAobHN0cmNtcChMYW5ndWFnZSwgIk5vIikpIHJldHVybigmV2luZUxpY2Vuc2VfTm8pOyAqLwotLyogIGlmIChsc3RyY21wKExhbmd1YWdlLCAiUGwiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9QbCk7ICovCi0vKiAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJQbyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX1BvKTsgKi8KLS8qICBpZiAobHN0cmNtcChMYW5ndWFnZSwgIlZhIikpIHJldHVybigmV2luZUxpY2Vuc2VfVmEpOyAqLwotLyogIGlmIChsc3RyY21wKExhbmd1YWdlLCAiU3ciKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9Tdyk7ICovCi0vKiAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJDYSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0NhKTsgKi8KKy8qICAKKyAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJDYSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0NhKTsKKyAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJDeiIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0N6KTsKKyAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJEYSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0RhKTsKKyAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJEZSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0VuKTsKKyAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJFbiIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0VuKTsKKyAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJFbyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0VvKTsKKyAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJFcyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0VzKTsKKyAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJGaSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0ZpKTsKKyAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJGciIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0ZyKTsKKyAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJIdSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0h1KTsKKyAgaWYgKGxzdHJjbXAoTGFuZ3VhZ2UsICJJdCIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0l0KTsKKyAgaWYgKGxzdHJjbXAoTGFuZ2F1Z2UsICJLbyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0tvKTsgCisgIGlmIChsc3RyY21wKExhbmd1YWdlLCAiTm8iKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9Obyk7ICAgCisgIGlmIChsc3RyY21wKExhbmd1YWdlLCAiUGwiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9QbCk7CisgIGlmIChsc3RyY21wKExhbmd1YWdlLCAiUG8iKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9Qbyk7CisgIGlmIChsc3RyY21wKExhbmd1YWdlLCAiVmEiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9WYSk7CisgIGlmIChsc3RyY21wKExhbmd1YWdlLCAiU3ciKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9Tdyk7CisqLwogICByZXR1cm4oJldpbmVMaWNlbnNlX0VuKTsKIH0KIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9saWNlbnNlLmggYi9wcm9ncmFtcy9ub3RlcGFkL2xpY2Vuc2UuaAppbmRleCA1Zjk5Y2RmLi4yMGZhYzJlIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9ub3RlcGFkL2xpY2Vuc2UuaAorKysgYi9wcm9ncmFtcy9ub3RlcGFkL2xpY2Vuc2UuaApAQCAtMTEsMjAgKzExLDI2IEBACiAgIExQQ1NUUiBXYXJyYW50eSwgV2FycmFudHlDYXB0aW9uOwogfSBMSUNFTlNFOwogCi0vKiBleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9DejsgKi8KLS8qIGV4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0RhOyAqLwotLyogZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfRGU7ICovCisvKiAKK2V4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0NhOworZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfQ3o7CitleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9EYTsKK2V4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0RlOworKi8KKwogZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfRW47Ci0vKiBleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9FbzsgKi8KLS8qIGV4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0VzOyAqLwotLyogZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfRmk7ICovCi0vKiBleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9GcjsgKi8KLS8qIGV4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0h1OyAqLwotLyogZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfSXQ7ICovCi0vKiBleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9LbzsgKi8KLS8qIGV4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX05vOyAqLwotLyogZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfUGw7ICovCi0vKiBleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9QbzsgKi8KLS8qIGV4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX1ZhOyAqLwotLyogZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfU3c7ICovCi0vKiBleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9DYTsgKi8KKworLyogCitleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9FbzsKK2V4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0VzOworZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfRmk7CitleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9GcjsKK2V4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0h1OworZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfSXQ7CitleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9LbzsKK2V4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX05vOworZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfUGw7CitleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9QbzsKK2V4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX1ZhOworZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfU3c7CisqLwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9tYWluLmMgYi9wcm9ncmFtcy9ub3RlcGFkL21haW4uYwppbmRleCA4ODQ5M2M0Li40YjQzNGEyIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9ub3RlcGFkL21haW4uYworKysgYi9wcm9ncmFtcy9ub3RlcGFkL21haW4uYwpAQCAtMzAsOCArMzAsNiBAQAogCiBpbnQgTk9URVBBRF9NZW51Q29tbWFuZCAoV1BBUkFNIHdQYXJhbSkKIHsgIAotLy8gICBwcmludGYoIk5PVEVQQURfTWVudUNvbW1hbmQoKVxuIik7Ci0KICAgIHN3aXRjaCAod1BhcmFtKSB7CiAgICAgIGNhc2UgTlBfRklMRV9ORVc6ICAgICAgICAgIERJQUxPR19GaWxlTmV3KCk7IGJyZWFrOwogICAgICBjYXNlIE5QX0ZJTEVfT1BFTjogICAgICAgICBESUFMT0dfRmlsZU9wZW4oKTsgYnJlYWs7CkBAIC04MiwyMiArODAsMTggQEAKICAgICBzd2l0Y2ggKG1zZykgewogCiAgICAgICAgY2FzZSBXTV9DUkVBVEU6Ci0gICAgICAgIHByaW50ZigiV01fQ1JFQVRFXG4iKTsKICAgIAlicmVhazsKIAotICAgICAgICBjYXNlIFdNX1BBSU5UOgotCSAgcHJpbnRmKCJXTV9QQUlOVFxuIik7CisgICAgICAgY2FzZSBXTV9QQUlOVDoKICAgICAgICAgICBCZWdpblBhaW50KGhXbmQsICZwcyk7CiAgICAgICAgICAgRW5kUGFpbnQoaFduZCwgJnBzKTsKICAgIAlicmVhazsKIAogICAgICAgIGNhc2UgV01fQ09NTUFORDoKLSAgICAgICAgICBwcmludGYoIldNX0NPTU1BTkRcbiIpOwogICAgICAgICAgIE5PVEVQQURfTWVudUNvbW1hbmQod1BhcmFtKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgIGNhc2UgV01fREVTVFJPWToKLSAgICAgICAgICBwcmludGYoIldNX0RFU1RST1lcbiIpOwogICAgICAgICAgIFBvc3RRdWl0TWVzc2FnZSAoMCk7CiAgICAgICAgICAgYnJlYWs7CiAKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3ZpZXcvZ2xvYmFscy5oIGIvcHJvZ3JhbXMvdmlldy9nbG9iYWxzLmgKaW5kZXggOTg4OTkxMS4uNTU3N2FmNiAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvdmlldy9nbG9iYWxzLmgKKysrIGIvcHJvZ3JhbXMvdmlldy9nbG9iYWxzLmgKQEAgLTEsNCArMSw3IEBACiAKKy8qIGZvciBTTUFMTF9SRUNUICovCisjaW5jbHVkZSAid2luY29uLmgiIAorCiAvKiAgQWRkIGdsb2JhbCBmdW5jdGlvbiBwcm90b3R5cGVzIGhlcmUgKi8KIAogQk9PTCBJbml0QXBwbGljYXRpb24oSElOU1RBTkNFKTsKQEAgLTE2LDE4ICsxOSw3IEBACiBleHRlcm4gY2hhciAgICAgIHN6VGl0bGVbXTsgICAgICAvKiBUaGUgdGl0bGUgYmFyIHRleHQgKi8KIAogCi0jaWZkZWYgV0lORUxJQgotdHlwZWRlZiBzdHJ1Y3QKLXsKLQlEV09SRAlrZXkgV0lORV9QQUNLRUQ7Ci0JSEFORExFMTYJaG1mIFdJTkVfUEFDS0VEOwotCVJFQ1QxNgliYm94IFdJTkVfUEFDS0VEOwotCVdPUkQJaW5jaCBXSU5FX1BBQ0tFRDsKLQlEV09SRAlyZXNlcnZlZCBXSU5FX1BBQ0tFRDsKLQlXT1JECWNoZWNrc3VtIFdJTkVfUEFDS0VEOwotfSBBUE1GSUxFSEVBREVSIFdJTkVfUEFDS0VEOwotI2Vsc2UKLSNwcmFnbWEgcGFjayggMiApCisjcHJhZ21hIHBhY2soMSkKIHR5cGVkZWYgc3RydWN0CiB7CiAJRFdPUkQJCWtleTsKQEAgLTM3LDcgKzI5LDYgQEAKIAlEV09SRAkJcmVzZXJ2ZWQ7CiAJV09SRAkJY2hlY2tzdW07CiB9IEFQTUZJTEVIRUFERVI7Ci0jZW5kaWYKIAogI2RlZmluZSBBUE1IRUFERVJfS0VZCTB4OUFDNkNERDdsCiAKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3ZpZXcvaW5pdC5jIGIvcHJvZ3JhbXMvdmlldy9pbml0LmMKaW5kZXggZWVhYTE0OS4uZTZlMjBkYSAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvdmlldy9pbml0LmMKKysrIGIvcHJvZ3JhbXMvdmlldy9pbml0LmMKQEAgLTI0LDcgKzI0LDcgQEAKIAogICAvKiBMb2FkIHNtYWxsIGljb24gaW1hZ2UgKi8KICAgd2MuaEljb25TbSA9IExvYWRJbWFnZShoSW5zdGFuY2UsCQkKLQkJCSBNQUtFSU5UUkVTT1VSQ0UoSURJX0FQUElDT04pLAorCQkJIE1BS0VJTlRSRVNPVVJDRTMyQShJRElfQVBQSUNPTiksCiAJCQkgSU1BR0VfSUNPTiwKIAkJCSAxNiwgMTYsCiAJCQkgMCk7CmRpZmYgLS1naXQgYS9wcm9ncmFtcy92aWV3L3Jlc291cmNlLmggYi9wcm9ncmFtcy92aWV3L3Jlc291cmNlLmgKaW5kZXggMGZmMmI1Yy4uZDExZGEwNCAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvdmlldy9yZXNvdXJjZS5oCisrKyBiL3Byb2dyYW1zL3ZpZXcvcmVzb3VyY2UuaApAQCAtNCw2ICs0LDcgQEAKICNkZWZpbmUgSURNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAxMDAwCiAjZGVmaW5lIElETV9IRUxMTyAgICAgICAgICAgICAgICAgICAgICAgNTAxCiAjZGVmaW5lIElETV9PUEVOICAgICAgICAgICAgICAgICAgICAgICAgNTAyCisjZGVmaW5lIElETV9TRVRfRVhUX1RPX1dJTiAgICAgICAgICAgICAgNTAzCiAjZGVmaW5lIElETV9MRUZUICAgICAgICAgICAgICAgICAgICAgICAgNjAxCiAjZGVmaW5lIElETV9SSUdIVCAgICAgICAgICAgICAgICAgICAgICAgNjAyCiAjZGVmaW5lIElETV9VUCAgICAgICAgICAgICAgICAgICAgICAgICAgNjAzCmRpZmYgLS1naXQgYS9wcm9ncmFtcy92aWV3L3ZpZXcuYyBiL3Byb2dyYW1zL3ZpZXcvdmlldy5jCmluZGV4IGQ0OTQ4M2MuLjM5NjMyOTMgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3ZpZXcvdmlldy5jCisrKyBiL3Byb2dyYW1zL3ZpZXcvdmlldy5jCkBAIC0xNCw3ICsxNCw3IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KIAogQk9PTCBGaWxlSXNQbGFjZWFibGUoIExQQ1NUUiBzekZpbGVOYW1lICk7Ci1ITUVUQUZJTEUgR2V0UGxhY2VhYmxlTWV0YUZpbGUoIExQQ1NUUiBzekZpbGVOYW1lICk7CitITUVUQUZJTEUgR2V0UGxhY2VhYmxlTWV0YUZpbGUoIEhXTkQgaHduZCwgTFBDU1RSIHN6RmlsZU5hbWUgKTsKIAogI2RlZmluZSBGTl9MRU5HVEggODAKIApAQCAtMjYsNyArMjYsNyBAQAogQk9PTCBGaWxlT3BlbihIV05EIGhXbmQsIGNoYXIgKmZuKQogewogICBPUEVORklMRU5BTUUgb2ZuID0geyBzaXplb2YoT1BFTkZJTEVOQU1FKSwKLQkJICAgICAgIDAsIE5VTEwsICJNZXRhZmlsZXNcMCoud21mXDAiLCBOVUxMLCAwLCAwLCBOVUxMLCAKKwkJICAgICAgIDAsIDAsICJNZXRhZmlsZXNcMCoud21mXDAiLCBOVUxMLCAwLCAwLCBOVUxMLCAKIAkJICAgICAgIEZOX0xFTkdUSCwgTlVMTCwgMCwgTlVMTCwgTlVMTCwgT0ZOX0NSRUFURVBST01QVCB8CiAJCSAgICAgICBPRk5fU0hPV0hFTFAsIDAsIDAsIE5VTEwsIDAsIE5VTEwgfTsKICAgb2ZuLmh3bmRPd25lciA9IGhXbmQ7CkBAIC00Nyw3ICs0Nyw3IEBACiAJUEFJTlRTVFJVQ1QgcHM7IAogCUJlZ2luUGFpbnQoaHduZCwgJnBzKTsKIAlTZXRNYXBNb2RlKHBzLmhkYywgTU1fQU5JU09UUk9QSUMpOwotCVNldFZpZXdwb3J0RXh0KHBzLmhkYywgd2lkdGgsIGhlaWdodCk7CisJU2V0Vmlld3BvcnRFeHRFeChwcy5oZGMsIHdpZHRoLCBoZWlnaHQsIE5VTEwpOwogCVNldFZpZXdwb3J0T3JnRXgocHMuaGRjLCBkZWx0YXgsIGRlbHRheSwgTlVMTCk7CiAJaWYoaG1mKSBQbGF5TWV0YUZpbGUocHMuaGRjLCBobWYpOwogCUVuZFBhaW50KGh3bmQsICZwcyk7CkBAIC02OCw3ICs2OCw3IEBACiAJICAgIGlmIChGaWxlT3Blbihod25kLCBmaWxlbmFtZSkpIHsKIAkgICAgICBpc0FsZHVzID0gRmlsZUlzUGxhY2VhYmxlKGZpbGVuYW1lKTsKIAkgICAgICBpZiAoaXNBbGR1cykgewotCQlobWYgPSBHZXRQbGFjZWFibGVNZXRhRmlsZShmaWxlbmFtZSk7CisJCWhtZiA9IEdldFBsYWNlYWJsZU1ldGFGaWxlKGh3bmQsIGZpbGVuYW1lKTsKIAkgICAgICB9IGVsc2UgewogCQlSRUNUIHI7CiAJCWhtZiA9IEdldE1ldGFGaWxlKGZpbGVuYW1lKTsKQEAgLTgxLDYgKzgxLDE3IEBACiAJICB9CiAJICBicmVhazsKIAkgIAorCWNhc2UgSURNX1NFVF9FWFRfVE9fV0lOOgorCSAgeworCSAgICBSRUNUIHI7CisJICAgIEdldENsaWVudFJlY3QoaHduZCwgJnIpOworCSAgICB3aWR0aCA9IHIucmlnaHQgLSByLmxlZnQ7CisJICAgIGhlaWdodCA9IHIuYm90dG9tIC0gci50b3A7CisJICAgIEludmFsaWRhdGVSZWN0KCBod25kLCBOVUxMLCBUUlVFICk7CisJICB9CisJICBicmVhazsKKworCSAgCiAJY2FzZSBJRE1fTEVGVDoKIAkgIGRlbHRheCArPSAxMDA7CiAJICBJbnZhbGlkYXRlUmVjdCggaHduZCwgTlVMTCwgVFJVRSApOwpAQCAtMTM4LDcgKzE0OSw3IEBACiAgIHJldHVybiAoYXBtaC5rZXkgPT0gQVBNSEVBREVSX0tFWSk7CiB9CiAKLUhNRVRBRklMRSBHZXRQbGFjZWFibGVNZXRhRmlsZSggTFBDU1RSIHN6RmlsZU5hbWUgKQorSE1FVEFGSUxFIEdldFBsYWNlYWJsZU1ldGFGaWxlKCBIV05EIGh3bmQsIExQQ1NUUiBzekZpbGVOYW1lICkKIHsKICAgTFBTVFIJbHBEYXRhOwogICBNRVRBSEVBREVSIG1mSGVhZGVyOwpAQCAtMTYyLDMxICsxNzMsMzQgQEAKICAgICBjaGFyIG1zZ1sxMjhdOwogICAgIHNwcmludGYobXNnLCAiQ29tcHV0ZWQgY2hlY2tzdW0gJTA0eCAhPSBzdG9yZWQgY2hlY2tzdW0gJTA0eFxuIiwgCiAJICAgY2hlY2tzdW0sIEFQTUhlYWRlci5jaGVja3N1bSk7Ci0gICAgLyogICAgTWVzc2FnZUJveChod25kLCBtc2csICJDaGVja3N1bSBmYWlsZWQiLCBNQl9PSyk7ICovCisgICAgICAgIE1lc3NhZ2VCb3goaHduZCwgbXNnLCAiQ2hlY2tzdW0gZmFpbGVkIiwgTUJfT0spOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKCFfbHJlYWQoZmgsIChMUFNUUikmbWZIZWFkZXIsIHNpemVvZihNRVRBSEVBREVSKSkpIHJldHVybiAwOwogCi0gIGlmICghKGxwRGF0YSA9IEdsb2JhbEFsbG9jKEdQVFIsIChtZkhlYWRlci5tdFNpemUgKiAyTCkpKSkgcmV0dXJuIDA7CisgIGlmICghKGxwRGF0YSA9IChMUFNUUikgR2xvYmFsQWxsb2MoR1BUUiwgKG1mSGVhZGVyLm10U2l6ZSAqIDJMKSkpKSByZXR1cm4gMDsKIAogICBfbGxzZWVrKGZoLCBzaXplb2YoQVBNRklMRUhFQURFUiksIDApOwogICBpZiAoIV9scmVhZChmaCwgbHBEYXRhLCAoVUlOVCkobWZIZWFkZXIubXRTaXplICogMkwpKSkKICAgewogICAgIEdsb2JhbEZyZWUobHBEYXRhKTsKICAgICBfbGNsb3NlKGZoKTsKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gMDsKICAgfQogICBfbGNsb3NlKGZoKTsKIAogICBpZiAoIShobWYgPSBTZXRNZXRhRmlsZUJpdHNFeChtZkhlYWRlci5tdFNpemUqMiwgbHBEYXRhKSkpIAotICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAwOwogCiAgIAotICB3aWR0aCA9IEFQTUhlYWRlci5iYm94LnJpZ2h0IC0gQVBNSGVhZGVyLmJib3gubGVmdDsKLSAgaGVpZ2h0ID0gQVBNSGVhZGVyLmJib3guYm90dG9tIC0gQVBNSGVhZGVyLmJib3gudG9wOworICB3aWR0aCA9IEFQTUhlYWRlci5iYm94LlJpZ2h0IC0gQVBNSGVhZGVyLmJib3guTGVmdDsKKyAgaGVpZ2h0ID0gQVBNSGVhZGVyLmJib3guQm90dG9tIC0gQVBNSGVhZGVyLmJib3guVG9wOwogCi0gIC8qICBwcmludGYoIk9rISB3aWR0aCAlZCBoZWlnaHQgJWRcbiIsIHdpZHRoLCBoZWlnaHQpOyAqLworICAvKiAgICAgIHByaW50ZigiT2shIHdpZHRoICVkIGhlaWdodCAlZCBpbmNoICVkXG4iLCB3aWR0aCwgaGVpZ2h0LCBBUE1IZWFkZXIuaW5jaCk7ICAqLworICB3aWR0aCA9IHdpZHRoKjk2L0FQTUhlYWRlci5pbmNoOworICBoZWlnaHQgPSBoZWlnaHQqOTYvQVBNSGVhZGVyLmluY2g7CisKICAgZGVsdGF4ID0gMDsKICAgZGVsdGF5ID0gMCA7CiAgIHJldHVybiBobWY7CmRpZmYgLS1naXQgYS9wcm9ncmFtcy92aWV3L3ZpZXdyYy5yYyBiL3Byb2dyYW1zL3ZpZXcvdmlld3JjLnJjCmluZGV4IGM0OTM5NTAuLmMzZWI0MDAgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3ZpZXcvdmlld3JjLnJjCisrKyBiL3Byb2dyYW1zL3ZpZXcvdmlld3JjLnJjCkBAIC0yMSw2ICsyMSw4IEBACiAgICAgRU5ECiAgICAgUE9QVVAgIiZQYW4iCiAgICAgQkVHSU4KKyAgICAgIE1FTlVJVEVNICImU2NhbGUgdG8gV2luZG93IiwgICAgICAgICAgICAgIElETV9TRVRfRVhUX1RPX1dJTgorICAgICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgICAgICBNRU5VSVRFTSAiJkxlZnQiLAkJCQlJRE1fTEVGVAogICAgICAgTUVOVUlURU0gIiZSaWdodCIsCQkJSURNX1JJR0hUCiAgICAgICBNRU5VSVRFTSAiJlVwIiwJCQkJSURNX1VQCmRpZmYgLS1naXQgYS9yYy93aW5lcmMuYyBiL3JjL3dpbmVyYy5jCmluZGV4IDRhOWZhM2YuLjhhODAxZWYgMTAwNjQ0Ci0tLSBhL3JjL3dpbmVyYy5jCisrKyBiL3JjL3dpbmVyYy5jCkBAIC04NTAsMTUgKzg1MCwxNSBAQAogICAgICAgICBpbnQgdHlwZTsKICAgICAgICAgc3dpdGNoKGl0LT50eXBlKQogICAgICAgICB7Ci0gICAgICAgIGNhc2UgYWNjOnR5cGU9KGludClSVF9BQ0NFTEVSQVRPUjticmVhazsKLSAgICAgICAgY2FzZSBibXA6dHlwZT0oaW50KVJUX0JJVE1BUDticmVhazsKLSAgICAgICAgY2FzZSBjdXI6dHlwZT0oaW50KVJUX0NVUlNPUjticmVhazsKLSAgICAgICAgY2FzZSBkbGc6dHlwZT0oaW50KVJUX0RJQUxPRzticmVhazsKLSAgICAgICAgY2FzZSBmbnQ6dHlwZT0oaW50KVJUX0ZPTlQ7YnJlYWs7Ci0gICAgICAgIGNhc2UgaWNvOnR5cGU9KGludClSVF9JQ09OO2JyZWFrOwotICAgICAgICBjYXNlIG1lbjp0eXBlPShpbnQpUlRfTUVOVTticmVhazsKLSAgICAgICAgY2FzZSByZHQ6dHlwZT0oaW50KVJUX1JDREFUQTticmVhazsKLSAgICAgICAgY2FzZSBzdHI6dHlwZT0oaW50KVJUX1NUUklORzticmVhazsKKyAgICAgICAgY2FzZSBhY2M6dHlwZT0oaW50KVJUX0FDQ0VMRVJBVE9SMTY7YnJlYWs7CisgICAgICAgIGNhc2UgYm1wOnR5cGU9KGludClSVF9CSVRNQVAxNjticmVhazsKKyAgICAgICAgY2FzZSBjdXI6dHlwZT0oaW50KVJUX0NVUlNPUjE2O2JyZWFrOworICAgICAgICBjYXNlIGRsZzp0eXBlPShpbnQpUlRfRElBTE9HMTY7YnJlYWs7CisgICAgICAgIGNhc2UgZm50OnR5cGU9KGludClSVF9GT05UMTY7YnJlYWs7CisgICAgICAgIGNhc2UgaWNvOnR5cGU9KGludClSVF9JQ09OMTY7YnJlYWs7CisgICAgICAgIGNhc2UgbWVuOnR5cGU9KGludClSVF9NRU5VMTY7YnJlYWs7CisgICAgICAgIGNhc2UgcmR0OnR5cGU9KGludClSVF9SQ0RBVEExNjticmVhazsKKyAgICAgICAgY2FzZSBzdHI6dHlwZT0oaW50KVJUX1NUUklORzE2O2JyZWFrOwogICAgICAgICBkZWZhdWx0OmZwcmludGYoc3RkZXJyLCJVbmtub3duIHJlc3R5cGVcbiIpO3R5cGU9LTE7YnJlYWs7CiAgICAgICAgIH0KIAlpZih3aW4zMikKZGlmZiAtLWdpdCBhL3JlbGF5MzIvYnVpbHRpbjMyLmMgYi9yZWxheTMyL2J1aWx0aW4zMi5jCmluZGV4IGI1ZTc5YWEuLmJhYTMyZDcgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvYnVpbHRpbjMyLmMKKysrIGIvcmVsYXkzMi9idWlsdGluMzIuYwpAQCAtOTMsNyArOTMsNyBAQAogICAgIHsgJlczMlNLUk5MX0Rlc2NyaXB0b3IsIE5VTEwsIFRSVUUgIH0sCiAgICAgeyAmV0lOTU1fRGVzY3JpcHRvciwgICAgTlVMTCwgVFJVRSAgfSwKICAgICB7ICZXSU5TUE9PTF9EZXNjcmlwdG9yLCBOVUxMLCBUUlVFICB9LAotICAgIHsgJldPVzMyX0Rlc2NyaXB0b3IsICAgIE5VTEwsIEZBTFNFIH0sCisgICAgeyAmV09XMzJfRGVzY3JpcHRvciwgICAgTlVMTCwgVFJVRSB9LAogICAgIHsgJldTT0NLMzJfRGVzY3JpcHRvciwgIE5VTEwsIFRSVUUgIH0sCiAgICAgLyogTGFzdCBlbnRyeSAqLwogICAgIHsgTlVMTCwgTlVMTCwgRkFMU0UgfQpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9jb21jdGwzMi5zcGVjIGIvcmVsYXkzMi9jb21jdGwzMi5zcGVjCmluZGV4IDM0Zjk2OGQuLjVmMzk1NmMgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvY29tY3RsMzIuc3BlYworKysgYi9yZWxheTMyL2NvbWN0bDMyLnNwZWMKQEAgLTEzLDkgKzEzLDkgQEAKICAgNiBzdGRjYWxsIENyZWF0ZVN0YXR1c1dpbmRvd0EobG9uZyBwdHIgbG9uZyBsb25nKSBDcmVhdGVTdGF0dXNXaW5kb3czMkEKICAgNyBzdHViIENyZWF0ZVRvb2xiYXIKICAgOCBzdHViIENyZWF0ZU1hcHBlZEJpdG1hcAotIyAgOSBzdHViIENPTUNUTDMyXzkKLSMgMTAgc3R1YiBDT01DVEwzMl8xMAotIyAxMSBzdHViIENPTUNUTDMyXzExCisgIDkgc3R1YiBDT01DVEwzMl85CisgMTAgc3R1YiBDT01DVEwzMl8xMAorIDExIHN0dWIgQ09NQ1RMMzJfMTEKICAxMiBzdHViIENjdGwxNjMyX1RodW5rRGF0YTMyCiAgMTMgc3R1YiBNYWtlRHJhZ0xpc3QKICAxNCBzdHViIExCSXRlbUZyb21QdApAQCAtNzIsMTUgKzcyLDE2IEBACiAgNjMgc3RkY2FsbCBJbWFnZUxpc3RfTG9hZEltYWdlQShsb25nIHB0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIEltYWdlTGlzdF9Mb2FkSW1hZ2UzMkEKICA2NCBzdGRjYWxsIEltYWdlTGlzdF9Mb2FkSW1hZ2VXKGxvbmcgcHRyIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X0xvYWRJbWFnZTMyVwogIDY1IHN0ZGNhbGwgSW1hZ2VMaXN0X01lcmdlKHB0ciBsb25nIHB0ciBsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X01lcmdlCisjIDY2IHN0ZGNhbGwgSW1hZ2VMaXN0X1JlYWQocHRyKSBJbWFnZUxpc3RfUmVhZAogIDY2IHN0dWIgSW1hZ2VMaXN0X1JlYWQKICA2NyBzdGRjYWxsIEltYWdlTGlzdF9SZW1vdmUocHRyIGxvbmcpIEltYWdlTGlzdF9SZW1vdmUKICA2OCBzdGRjYWxsIEltYWdlTGlzdF9SZXBsYWNlKHB0ciBsb25nIGxvbmcgbG9uZykgSW1hZ2VMaXN0X1JlcGxhY2UKICA2OSBzdGRjYWxsIEltYWdlTGlzdF9SZXBsYWNlSWNvbihwdHIgbG9uZyBsb25nKSBJbWFnZUxpc3RfUmVwbGFjZUljb24KICA3MCBzdGRjYWxsIEltYWdlTGlzdF9TZXRCa0NvbG9yKHB0ciBsb25nKSBJbWFnZUxpc3RfU2V0QmtDb2xvcgotIyA3MQotIyA3MgotIyA3MwotIyA3NCBzdHViIEdldFNpemUgIyAxIHBhcmFtZXRlcgorIDcxIHN0dWIgQWxsb2MKKyA3MiBzdHViIFJlQWxsb2MKKyA3MyBzdHViIEZyZWUKKyA3NCBzdHViIEdldFNpemUKICA3NSBzdGRjYWxsIEltYWdlTGlzdF9TZXREcmFnQ3Vyc29ySW1hZ2UocHRyIGxvbmcgbG9uZyBsb25nKSBJbWFnZUxpc3RfU2V0RHJhZ0N1cnNvckltYWdlCiAgNzYgc3R1YiBJbWFnZUxpc3RfU2V0RmlsdGVyCiAgNzcgc3RkY2FsbCBJbWFnZUxpc3RfU2V0SWNvblNpemUocHRyIGxvbmcgbG9uZykgSW1hZ2VMaXN0X1NldEljb25TaXplCkBAIC05NSw1OCArOTYsOTUgQEAKICA4NiBzdHViIFVuaW5pdGlhbGl6ZUZsYXRTQgogIDg3IHN0dWIgX1RyYWNrTW91c2VFdmVudAogCi0jMTUxCi0jMTUyIHN0dWIgRnJlZU1SVUxpc3QgICMgMSBwYXJhbWV0ZXIKLSMxNTMKLSMxNTQKLSMxNTUgc3R1YiBGaW5kTVJVU3RyaW5nQSAgIyAzIHBhcmFtZXRlcnMKLSMxNTYKLSMxNTcKLSMxNjMKLSMxNjQKLSMxNjcKLSMxNjkgc3R1YiBGaW5kTVJVRGF0YQotIzIzMyAtIDIzNgorMTUxIHN0dWIgQ3JlYXRlTVJVTGlzdAorMTUyIHN0dWIgRnJlZU1SVUxpc3QKKzE1MyBzdHViIEFkZE1SVVN0cmluZ0EKKzE1NCBzdHViIEVudW1NUlVMaXN0QQorMTU1IHN0dWIgRmluZE1SVVN0cmluZ0EKKzE1NiBzdHViIERlbE1SVVN0cmluZworMTU3IHN0dWIgQ09NQ1RMMzJfMTU3CiAKLSMzMjAKLSMzMjEKLSMzMjIKLSMzMjMKLSMzMjQKLSMzMjUKLSMzMjYKLSMzMjcKLSMzMjgKLSMzMjkgc3R1YiBEUEFfQ3JlYXRlCi0jMzMwIHN0dWIgRFBBX0Rlc3Ryb3kKLSMzMzEKLSMzMzIgc3R1YiBEUEFfR2V0UHRyCi0jMzMzCi0jMzM0IHN0dWIgRFBBX0luc2VydFB0cgotIzMzNQotIzMzNiBzdHViIERQQV9EZWxldGVQdHIKLSMzMzcKLSMzMzgKLSMzMzkgc3R1YiBEUEFfU2VhcmNoCi0jMzQwCi0jMzQxCi0jMzQyCisxNjMgc3R1YiBDcmVhdGVQYWdlCisxNjQgc3R1YiBDcmVhdGVQcm94eVBhZ2UKIAotIzM1MCBzdHViIFN0ckNockEKLSMzNTEKLSMzNTIgc3R1YiBTdHJDbXBBCi0jMzUzCi0jMzU0IHN0dWIgU3RyU3RyQQotIzM1NQotIzM1NgotIzM1NyBzdHViIFN0clRvSW50QQotIzM1OCAtIDM2OQorMTY3IHN0dWIgQWRkTVJVRGF0YQorMTY5IHN0dWIgRmluZE1SVURhdGEKIAotIzM3MiAtIDM3NQotIzM3NiBzdHViIEludGxTdHJFcVdvcmtlckEKLSMzNzcgc3R1YiBJbnRsU3RyRXFXb3JrZXJXCi0jMzgyCi0jMzgzIHN0dWIgRG9SZWFkZXJNb2RlCi0jMzg0IC0gMzkwCi0jNDAwIC0gNDA0Ci0jNDEwIC0gNDEzCisyMzMgc3R1YiBTdHJfR2V0UHRyQQorMjM0IHN0dWIgU3RyX1NldFB0ckEKKzIzNSBzdHViIFN0cl9HZXRQdHJXCisyMzYgc3R1YiBTdHJfU2V0UHRyVworCiszMjAgc3R1YiBEU0FfQ3JlYXRlCiszMjEgc3R1YiBEU0FfRGVzdHJveQorMzIyIHN0dWIgRFNBX0dldEl0ZW0KKzMyMyBzdHViIERTQV9HZXRJdGVtUHRyCiszMjQgc3R1YiBEU0FfSW5zZXJ0SXRlbQorMzI1IHN0dWIgRFNBX1NldEl0ZW0KKzMyNiBzdHViIERTQV9EZWxldGVJdGVtCiszMjcgc3R1YiBEU0FfRGVsZXRlQWxsSXRlbXMKKzMyOCBzdHViIERQQV9DcmVhdGUKKzMyOSBzdHViIERQQV9EZXN0cm95CiszMzAgc3R1YiBEUEFfR3JvdworMzMxIHN0dWIgRFBBX0Nsb25lCiszMzIgc3R1YiBEUEFfR2V0UHRyCiszMzMgc3R1YiBEUEFfR2V0UHRySW5kZXgKKzMzNCBzdHViIERQQV9JbnNlcnRQdHIKKzMzNSBzdHViIERQQV9TZXRQdHIKKzMzNiBzdHViIERQQV9EZWxldGVQdHIKKzMzNyBzdHViIERQQV9EZWxldGVBbGxQdHJzCiszMzggc3R1YiBEUEFfU29ydAorMzM5IHN0dWIgRFBBX1NlYXJjaAorMzQwIHN0dWIgRFBBX0NyZWF0ZUV4CiszNDEgc3R1YiBTZW5kTm90aWZ5CiszNDIgc3R1YiBTZW5kTm90aWZ5RXgKKworMzUwIHN0dWIgU3RyQ2hyQQorMzUxIHN0dWIgU3RyUkNocgorMzUyIHN0dWIgU3RyQ21wTkEKKzM1MyBzdHViIFN0ckNtcE5JQQorMzU0IHN0dWIgU3RyU3RyQQorMzU1IHN0dWIgU3RyU3RySUEKKzM1NiBzdHViIFN0ckNTcG5BCiszNTcgc3R1YiBTdHJUb0ludEEKKzM1OCBzdHViIFN0ckNoclcKKzM1OSBzdHViIFN0clJDaHJXCiszNjAgc3R1YiBTdHJDbXBOVworMzYxIHN0dWIgU3RyQ21wTklXCiszNjIgc3R1YiBTdHJTdHJXCiszNjMgc3R1YiBTdHJTdHJJVworMzY0IHN0dWIgU3RyU3BuVworMzY1IHN0dWIgU3RyVG9JbnRXCiszNjYgc3R1YiBTdHJDaHJJQQorMzY3IHN0dWIgU3RyQ2hySVcKKzM2OCBzdHViIFN0clJDaHJJQQorMzY5IHN0dWIgU3RyUkNocklXCisKKzM3MiBzdHViIFN0clJTdHJJQQorMzczIHN0dWIgU3RyUlN0cklXCiszNzQgc3R1YiBTdHJDU3BuSUEKKzM3NSBzdHViIFN0ckNTcG5JVworMzc2IHN0dWIgSW50bFN0ckVxV29ya2VyQQorMzc3IHN0dWIgSW50bFN0ckVxV29ya2VyVworCiszODIgc3R1YiBTbW9vdGhTY3JvbGxXaW5kb3cKKzM4MyBzdHViIERvUmVhZGVyTW9kZQorMzg0IHN0dWIgU2V0UGF0aFdvcmRCcmVha1Byb2MKKzM4NSBzdHViIENPTUNUTDMyXzM4NQorMzg2IHN0dWIgQ09NQ1RMMzJfMzg2CiszODcgc3R1YiBDT01DVEwzMl8zODcKKzM4OCBzdHViIENPTUNUTDMyXzM4OAorMzg5IHN0dWIgQ09NQ1RMMzJfMzg5CiszOTAgc3R1YiBDT01DVEwzMl8zOTAKKworNDAwIHN0dWIgQ09NQ1RMMzJfNDAwCis0MDEgc3R1YiBDT01DVEwzMl80MDEKKzQwMiBzdHViIENPTUNUTDMyXzQwMgorNDAzIHN0dWIgQ09NQ1RMMzJfNDAzCis0MDQgc3R1YiBDT01DVEwzMl80MDQKKworNDEwIHN0dWIgQ09NQ1RMMzJfNDEwCis0MTEgc3R1YiBDT01DVEwzMl80MTEKKzQxMiBzdHViIENPTUNUTDMyXzQxMgorNDEzIHN0dWIgQ09NQ1RMMzJfNDEzCisKZGlmZiAtLWdpdCBhL3JlbGF5MzIvY29tZGxnMzIuc3BlYyBiL3JlbGF5MzIvY29tZGxnMzIuc3BlYwppbmRleCBjNWFlYjQ2Li4xNGRlOWJkIDEwMDY0NAotLS0gYS9yZWxheTMyL2NvbWRsZzMyLnNwZWMKKysrIGIvcmVsYXkzMi9jb21kbGczMi5zcGVjCkBAIC03LDggKzcsOCBAQAogIDMgc3RkY2FsbCBDaG9vc2VGb250QShwdHIpIENob29zZUZvbnQzMkEKICA0IHN0dWIgQ2hvb3NlRm9udFcKICA1IHN0ZGNhbGwgQ29tbURsZ0V4dGVuZGVkRXJyb3IoKSBDb21tRGxnRXh0ZW5kZWRFcnJvcgotIDYgc3R1YiBGaW5kVGV4dEEKLSA3IHN0dWIgRmluZFRleHRXCisgNiBzdGRjYWxsIEZpbmRUZXh0QShwdHIpIEZpbmRUZXh0MzJBCisgNyBzdGRjYWxsIEZpbmRUZXh0VyhwdHIpIEZpbmRUZXh0MzJXCiAgOCBzdGRjYWxsIEdldEZpbGVUaXRsZUEocHRyIHB0ciBsb25nKSBHZXRGaWxlVGl0bGUzMkEKICA5IHN0ZGNhbGwgR2V0RmlsZVRpdGxlVyhwdHIgcHRyIGxvbmcpIEdldEZpbGVUaXRsZTMyVwogMTAgc3RkY2FsbCBHZXRPcGVuRmlsZU5hbWVBKHB0cikgR2V0T3BlbkZpbGVOYW1lMzJBCkBAIC0yMCw4ICsyMCw4IEBACiAxNiBzdHViIFBhZ2VTZXR1cERsZ1cKIDE3IHN0ZGNhbGwgUHJpbnREbGdBKHB0cikgUHJpbnREbGczMkEKIDE4IHN0ZGNhbGwgUHJpbnREbGdXKHB0cikgUHJpbnREbGczMlcKLTE5IHN0dWIgUmVwbGFjZVRleHRBCi0yMCBzdHViIFJlcGxhY2VUZXh0VworMTkgc3RkY2FsbCBSZXBsYWNlVGV4dEEocHRyKSBSZXBsYWNlVGV4dDMyQQorMjAgc3RkY2FsbCBSZXBsYWNlVGV4dFcocHRyKSBSZXBsYWNlVGV4dDMyVwogMjEgc3R1YiBXYW50QXJyb3dzCiAyMiBzdHViIGR3TEJTdWJjbGFzcwogMjMgc3R1YiBkd09LU3ViY2xhc3MKZGlmZiAtLWdpdCBhL3JlbGF5MzIvY3J0ZGxsLnNwZWMgYi9yZWxheTMyL2NydGRsbC5zcGVjCmluZGV4IGI4MGU5ZmMuLjAxMjc0YzUgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvY3J0ZGxsLnNwZWMKKysrIGIvcmVsYXkzMi9jcnRkbGwuc3BlYwpAQCAtMzkxLDcgKzM5MSw3IEBACiAzODcgc3R1YiBmd3NjYW5mCiAzODggY2RlY2wgZ2V0YyhwdHIpIENSVERMTF9nZXRjCiAzODkgc3R1YiBnZXRjaGFyCi0zOTAgc3R1YiBnZXRlbnYKKzM5MCBjZGVjbCBnZXRlbnYgKHN0cikgQ1JURExMX2dldGVudgogMzkxIGNkZWNsIGdldHMocHRyKSBDUlRETExfZ2V0cwogMzkyIGNkZWNsIGdtdGltZShwdHIpIGdtdGltZQogMzkzIHN0dWIgaXNfd2N0eXBlCmRpZmYgLS1naXQgYS9yZWxheTMyL2dkaTMyLnNwZWMgYi9yZWxheTMyL2dkaTMyLnNwZWMKaW5kZXggNTFhNTVjZS4uYTc0MWIyZCAxMDA2NDQKLS0tIGEvcmVsYXkzMi9nZGkzMi5zcGVjCisrKyBiL3JlbGF5MzIvZ2RpMzIuc3BlYwpAQCAtNzIsNyArNzIsNyBAQAogIDY1IHN0ZGNhbGwgRFB0b0xQKGxvbmcgcHRyIGxvbmcpIERQdG9MUDMyCiAgNjYgc3R1YiBEZWxldGVDb2xvclNwYWNlCiAgNjcgc3RkY2FsbCBEZWxldGVEQyhsb25nKSBEZWxldGVEQzMyCi0gNjggc3RkY2FsbCBEZWxldGVFbmhNZXRhRmlsZShsb25nKSBEZWxldGVFbmhNZXRhRmlsZTMyCisgNjggc3RkY2FsbCBEZWxldGVFbmhNZXRhRmlsZShsb25nKSBEZWxldGVFbmhNZXRhRmlsZQogIDY5IHN0ZGNhbGwgRGVsZXRlTWV0YUZpbGUobG9uZykgRGVsZXRlTWV0YUZpbGUzMgogIDcwIHN0ZGNhbGwgRGVsZXRlT2JqZWN0KGxvbmcpCURlbGV0ZU9iamVjdDMyCiAgNzEgc3R1YiBEZXNjcmliZVBpeGVsRm9ybWF0CkBAIC0xODIsNyArMTgyLDcgQEAKIDE3NSBzdHViIEdldEVuaE1ldGFGaWxlQml0cwogMTc2IHN0ZGNhbGwgR2V0RW5oTWV0YUZpbGVEZXNjcmlwdGlvbkEobG9uZyBsb25nIHB0cikgR2V0RW5oTWV0YUZpbGVEZXNjcmlwdGlvbjMyQQogMTc3IHN0dWIgR2V0RW5oTWV0YUZpbGVEZXNjcmlwdGlvblcKLTE3OCBzdGRjYWxsIEdldEVuaE1ldGFGaWxlSGVhZGVyKGxvbmcgbG9uZyBwdHIpIEdldEVuaE1ldGFGaWxlSGVhZGVyMzIKKzE3OCBzdGRjYWxsIEdldEVuaE1ldGFGaWxlSGVhZGVyKGxvbmcgbG9uZyBwdHIpIEdldEVuaE1ldGFGaWxlSGVhZGVyCiAxNzkgc3R1YiBHZXRFbmhNZXRhRmlsZVBhbGV0dGVFbnRyaWVzCiAxODAgc3R1YiBHZXRFbmhNZXRhRmlsZVcKIDE4MSBzdHViIEdldEZvbnREYXRhCkBAIC0yNjcsOCArMjY3LDggQEAKIDI2MCBzdGRjYWxsIFBhdEJsdChsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgUGF0Qmx0MzIKIDI2MSBzdGRjYWxsIFBhdGhUb1JlZ2lvbihsb25nKSBQYXRoVG9SZWdpb24zMgogMjYyIHN0ZGNhbGwgUGllKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBQaWUzMgotMjYzIHN0ZGNhbGwgUGxheUVuaE1ldGFGaWxlKGxvbmcgbG9uZyBwdHIpIFBsYXlFbmhNZXRhRmlsZTMyCi0yNjQgc3RkY2FsbCBQbGF5RW5oTWV0YUZpbGVSZWNvcmQobG9uZyBwdHIgcHRyIGxvbmcpIFBsYXlFbmhNZXRhRmlsZVJlY29yZDMyCisyNjMgc3RkY2FsbCBQbGF5RW5oTWV0YUZpbGUobG9uZyBsb25nIHB0cikgUGxheUVuaE1ldGFGaWxlCisyNjQgc3RkY2FsbCBQbGF5RW5oTWV0YUZpbGVSZWNvcmQobG9uZyBwdHIgcHRyIGxvbmcpIFBsYXlFbmhNZXRhRmlsZVJlY29yZAogMjY1IHN0ZGNhbGwgUGxheU1ldGFGaWxlKGxvbmcgbG9uZykgUGxheU1ldGFGaWxlMzIKIDI2NiBzdGRjYWxsIFBsYXlNZXRhRmlsZVJlY29yZChsb25nIHB0ciBwdHIgbG9uZykgUGxheU1ldGFGaWxlUmVjb3JkMzIKIDI2NyBzdHViIFBsZ0JsdApkaWZmIC0tZ2l0IGEvcmVsYXkzMi9rZXJuZWwzMi5zcGVjIGIvcmVsYXkzMi9rZXJuZWwzMi5zcGVjCmluZGV4IDhiMGYxYjMuLmI0Y2JlYjIgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIva2VybmVsMzIuc3BlYworKysgYi9yZWxheTMyL2tlcm5lbDMyLnNwZWMKQEAgLTYsOCArNiwxMSBAQAogIyAgaW1wb3J0IGtlcm5lbDMyLmRsbCBieSBvcmRpbmFsKQogIyB0aGUgYmFzZSBpcyBOT1QgaW5jbHVkZWQgaW4gdGhlc2Ugb3JkaW5hbHMKIAotIyB1bmRvY3VtZW50ZWQgb3JkaW5hbCBvbmx5IGNhbGxzIChuYW1lcyB0YWtlbiBmcm9tIGszMmV4cC5oIGJ5IEFuZHJldwotIyBTY2h1bG1hbi4KKyMgbmFtZXMgb2YgdW5kb2N1bWVudGVkIG9yZGluYWwgb25seSBjYWxscyBhcmUgdGFrZW4gZnJvbToKKyMgLSBrMzJleHAuaCBieSBBbmRyZXcgU2NodWxtYW4KKyMgLSBlcnJvciBtZXNzYWdlcyBhbmQgc3RyaW5ncyBmcm9tIHRoZSBkZWJ1ZyB2ZXJzaW9uIG9mIGtlcm5lbDMyLmRsbAorIyAtIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBNUyBUaHVuayBDb21waWxlcgorCiAgIDEgc3R1YiBWeERDYWxsMAogICAyIHN0dWIgVnhEQ2FsbDEKICAgMyBzdHViIFZ4RENhbGwyCkBAIC0xNywzMyArMjAsNTAgQEAKICAgNyBzdHViIFZ4RENhbGw2CiAgIDggc3R1YiBWeERDYWxsNwogICA5IHN0dWIgVnhEQ2FsbDgKLSAKLSAxMCBzdHViIF9LRVJORUwzMl9zdHJpbmdjb252MSAjYW5zaTJvZW0gb3IgcmV2ZXJzZT8KLSAKLSAxNyBzdHViIF9LRVJORUwzMl8xNwotIDE4IHN0ZGNhbGwgX0tFUk5FTDMyXzE4KGxvbmcgbG9uZykgX0tFUk5FTDMyXzE4Ci0gMTkgc3R1YiBfS0VSTkVMMzJfZ2V0aGVhcHNlZ21lbnQKLSAKLSAzMSBzdHViIF9LRVJORUwzMl8zMQotIAotIDM0IHN0ZGNhbGwgX0tFUk5FTDMyXzM0KCkgX0tFUk5FTDMyXzM0CisgMTAgc3RkY2FsbCBDaGFyVG9PZW1BKHN0ciBzdHIpIENoYXJUb09lbTMyQQorIDExIHN0ZGNhbGwgQ2hhclRvT2VtQnVmZkEoc3RyIHN0ciBsb25nKSBDaGFyVG9PZW1CdWZmMzJBCisgMTIgc3RkY2FsbCBPZW1Ub0NoYXJBKHB0ciBwdHIpIE9lbVRvQ2hhcjMyQQorIDEzIHN0ZGNhbGwgT2VtVG9DaGFyQnVmZkEocHRyIHB0ciBsb25nKSBPZW1Ub0NoYXJCdWZmMzJBCisgMTQgc3RkY2FsbCBMb2FkU3RyaW5nQShsb25nIGxvbmcgcHRyIGxvbmcpIExvYWRTdHJpbmczMkEKKyAxNSB2YXJhcmdzIHdzcHJpbnRmQSgpIHdzcHJpbnRmMzJBCisgMTYgc3RkY2FsbCB3dnNwcmludGZBKCkgd3ZzcHJpbnRmMzJBCisgMTcgc3R1YiBfS0VSTkVMMzJfMTdfVkRNQ2FsbAorIDE4IHN0ZGNhbGwgR2V0UHJvY2Vzc0RXT1JEKGxvbmcgbG9uZykgR2V0UHJvY2Vzc0RXT1JECisgMTkgc3R1YiBUaGVUZW1wbGF0ZUhhbmRsZQorIDIwIHN0dWIgX0tFUk5FTDMyXzIwX0Zha2VXaW4zMkhhbmRsZUZyb21ET1NGaWxlSGFuZGxlCisgMjEgc3R1YiBfS0VSTkVMMzJfMjFfR2V0RE9TRmlsZUhhbmRsZUZyb21XaW4zMkhhbmRsZQorIDIyIHN0dWIgX0tFUk5FTDMyXzIyX0NsZWFudXBGYWtlV2luMzJIYW5kbGUKKyAyMyBzdHViIF9LRVJORUwzMl8yMworIDI0IHN0ZGNhbGwgR2xvYmFsQWxsb2MxNihsb25nIGxvbmcpIEdsb2JhbEFsbG9jMTYKKyAyNSBzdGRjYWxsIEdsb2JhbExvY2sxNihsb25nKSBHbG9iYWxMb2NrMTYKKyAyNiBzdGRjYWxsIEdsb2JhbFVubG9jazE2KGxvbmcpIEdsb2JhbFVubG9jazE2CisgMjcgc3RkY2FsbCBHbG9iYWxGaXgxNihsb25nKSBHbG9iYWxGaXgxNgorIDI4IHN0ZGNhbGwgR2xvYmFsVW5maXgxNihsb25nKSBHbG9iYWxVbmZpeDE2CisgMjkgc3RkY2FsbCBHbG9iYWxXaXJlMTYobG9uZykgR2xvYmFsV2lyZTE2CisgMzAgc3RkY2FsbCBHbG9iYWxVbldpcmUxNihsb25nKSBHbG9iYWxVbldpcmUxNgorIDMxIHN0ZGNhbGwgR2xvYmFsRnJlZTE2KGxvbmcpIEdsb2JhbEZyZWUxNgorIDMyIHN0ZGNhbGwgR2xvYmFsU2l6ZTE2KGxvbmcpIEdsb2JhbFNpemUxNgorIDMzIHN0dWIgX0tFUk5FTDMyXzMzCisgMzQgc3RkY2FsbCBHZXRXaW4xNkRPU0VudigpIEdldFdpbjE2RE9TRW52CiAgMzUgc3RkY2FsbCBMb2FkTGlicmFyeTE2KHN0cikgTG9hZExpYnJhcnkxNgogIDM2IHN0ZGNhbGwgRnJlZUxpYnJhcnkxNihsb25nKSBGcmVlTGlicmFyeTE2CiAgMzcgc3RkY2FsbCBHZXRQcm9jQWRkcmVzczE2KGxvbmcgc3RyKSBXSU4zMl9HZXRQcm9jQWRkcmVzczE2Ci0gCisgMzggcmVnaXN0ZXIgQWxsb2NNYXBwZWRCdWZmZXIoKSBBbGxvY01hcHBlZEJ1ZmZlcgorIDM5IHJlZ2lzdGVyIEZyZWVNYXBwZWRCdWZmZXIoKSBGcmVlTWFwcGVkQnVmZmVyCiAgNDAgcmVnaXN0ZXIgX0tFUk5FTDMyXzQwKCkgX0tFUk5FTDMyXzQwCi0gNDEgc3RkY2FsbCBfS0VSTkVMMzJfNDEobG9uZyBzdHIgbG9uZyBzdHIgc3RyKSBfS0VSTkVMMzJfNDEKLSA0MiBzdHViIF9LRVJORUwzMl80MgotIDQzIHN0ZGNhbGwgX0tFUk5FTDMyXzQzKGxvbmcgc3RyIGxvbmcgc3RyIHN0cikgX0tFUk5FTDMyXzQzCi0gNDUgcmVnaXN0ZXIgX0tFUk5FTDMyXzQ1KCkgX0tFUk5FTDMyXzQ1IAotIDQ2IHN0ZGNhbGwgX0tFUk5FTDMyXzQ2KGxvbmcgc3RyIGxvbmcgc3RyIHN0cikgX0tFUk5FTDMyXzQ2Ci0gNDcgc3R1YiBfS0VSTkVMMzJfNDcKLSAKKyA0MSBzdGRjYWxsIFRodW5rSW5pdExTRihsb25nIHN0ciBsb25nIHN0ciBzdHIpIFRodW5rSW5pdExTRgorIDQyIHN0dWIgX0RlYnVnVGh1bmtMU0YKKyA0MyBzdGRjYWxsIFRodW5rSW5pdExTKGxvbmcgc3RyIGxvbmcgc3RyIHN0cikgVGh1bmtJbml0TFMKKyA0NCBzdHViIF9EZWJ1Z1RodW5rTFMKKyA0NSByZWdpc3RlciBDb21tb24zMlRoa0xTKCkgQ29tbW9uMzJUaGtMUyAKKyA0NiBzdGRjYWxsIFRodW5rSW5pdFNMKGxvbmcgc3RyIGxvbmcgc3RyIHN0cikgVGh1bmtJbml0U0wKKyA0NyBzdHViIF9EZWJ1Z1RodW5rU0wKKyA0OCBzdHViIFJlbGVhc2VUaHVua0xvY2sKKyA0OSBzdHViIFJlc3RvcmVUaHVua0xvY2sKICA1MCBzdGRjYWxsIEFkZEF0b21BKHN0cikgQWRkQXRvbTMyQQotCisgNTEgc3R1YiBfS0VSTkVMMzJfNTEKICA1MiBzdGRjYWxsIF9LRVJORUwzMl81MigpIF9LRVJORUwzMl81MgotCi0jIFdPVyBjYWxscworIDUzIHN0dWIgX0tFUk5FTDMyXzUzX0xvYWRMaWJyYXJ5QW5kR2V0UHJvYzE2CiAgNTQgc3RkY2FsbCBXT1dDYWxsYmFjazE2KGxvbmcgbG9uZykgV09XQ2FsbGJhY2sxNgogIDU1IHN0ZGNhbGwgV09XQ2FsbGJhY2sxNkV4KHB0ciBsb25nIGxvbmcgcHRyIHB0cikgV09XQ2FsbGJhY2sxNkV4CiAgNTYgc3RkY2FsbCBXT1dHZXRWRE1Qb2ludGVyKGxvbmcgbG9uZyBsb25nKSBXT1dHZXRWRE1Qb2ludGVyCkBAIC02MSw3ICs4MSw3IEBACiAgNjggc3RkY2FsbCBXT1dHZXRWRE1Qb2ludGVyRml4KGxvbmcgbG9uZyBsb25nKSBXT1dHZXRWRE1Qb2ludGVyRml4CiAgNjkgc3RkY2FsbCBXT1dHZXRWRE1Qb2ludGVyVW5maXgobG9uZykgV09XR2V0VkRNUG9pbnRlclVuZml4CiAgNzAgc3RkY2FsbCBXT1czMl8xKGxvbmcgbG9uZykgV09XMzJfMQotIAorIDcxIHN0dWIgSXNUaHJlYWRJZAogIDcyIHN0dWIgUnRsTGFyZ2VJbnRlZ2VyQWRkCiAgNzMgc3R1YiBSdGxFbmxhcmdlZEludGVnZXJNdWx0aXBseQogIDc0IHN0dWIgUnRsRW5sYXJnZWRVbnNpZ25lZE11bHRpcGx5CkBAIC03NiwyMCArOTYsMjIgQEAKICA4MyBzdHViIFJ0bExhcmdlSW50ZWdlclN1YnRyYWN0CiAgODQgc3R1YiBSdGxDb252ZXJ0TG9uZ1RvTGFyZ2VJbnRlZ2VyCiAgODUgc3R1YiBSdGxDb252ZXJ0VWxvbmdUb0xhcmdlSW50ZWdlcgotCi0gODcgc3RkY2FsbCBfS0VSTkVMMzJfODcoKSBfS0VSTkVMMzJfODcKLSA4OCB2YXJhcmdzIF9LRVJORUwzMl84OCgpIF9LRVJORUwzMl84OAotIDg5IHN0ZGNhbGwgRlRfUHJvbG9nUHJpbWUocHRyIHB0cikgRlRfUHJvbG9nUHJpbWUKLSA5MCByZWdpc3RlciBfS0VSTkVMMzJfOTAoKSBfS0VSTkVMMzJfOTAKLSA5MSBzdHViIF9LRVJORUwzMl85MQorIDg2IHN0dWIgX0tFUk5FTDMyXzg2X0VudGVyU3lzTGV2ZWxTcGVjaWFsCisgODcgc3RkY2FsbCBTU09uQmlnU3RhY2soKSBTU09uQmlnU3RhY2sKKyA4OCB2YXJhcmdzIFNTQ2FsbCgpIFNTQ2FsbAorIDg5IHJlZ2lzdGVyIEZUX1Byb2xvZ1ByaW1lKCkgRlRfUHJvbG9nUHJpbWUKKyA5MCByZWdpc3RlciBRVF9UaHVua1ByaW1lKCkgUVRfVGh1bmtQcmltZQorIDkxIHN0dWIgUEsxNkZORgogIDkyIHN0dWIgX0tFUk5FTDMyXzkyCi0gOTMgc3RkY2FsbCBHRVRQV0lOMTZMT0NLKHB0cikgR2V0UFdpbkxvY2sKLSA5NyBzdHViIEVOVEVSU1lTTEVWRUwKLSA5OCBzdHViIExFQVZFU1lTTEVWRUwKLSA5OSBzdGRjYWxsIF9LRVJORUwzMl85OChsb25nKSBfS0VSTkVMMzJfOTgKLTEwMCBzdGRjYWxsIF9LRVJORUwzMl85OShsb25nIGxvbmcgbG9uZykgX0tFUk5FTDMyXzk5Ci0xMDEgc3R1YiBfS0VSTkVMMzJfMTAwCi0KKyA5MyBzdGRjYWxsIEdldFBXaW4xNkxvY2socHRyKSBHZXRQV2luTG9jaworIDk0IHN0dWIgX0RlYnVnQ2hlY2tOb3RTeXNMZXZlbAorIDk1IHN0dWIgX0RlYnVnQXNzZXJ0Q3JpdGljYWxTZWN0aW9uCisgOTYgc3R1YiBDb25maXJtV2luMTZMb2NrCisgOTcgc3R1YiBFbnRlclN5c0xldmVsCisgOTggc3R1YiBMZWF2ZVN5c0xldmVsCisgOTkgc3RkY2FsbCBfS0VSTkVMMzJfOTkobG9uZykgX0tFUk5FTDMyXzk5CisxMDAgc3RkY2FsbCBfS0VSTkVMMzJfMTAwKGxvbmcgbG9uZyBsb25nKSBfS0VSTkVMMzJfMTAwCisxMDEgc3R1YiBfS0VSTkVMMzJfMTAxCiAKIDEwMiBzdGRjYWxsIEFkZEF0b21XKHdzdHIpIEFkZEF0b20zMlcKIDEwMyBzdGRjYWxsIEFsbG9jQ29uc29sZSgpIEFsbG9jQ29uc29sZQpAQCAtMjA3LDIzICsyMjksMjMgQEAKIDIxNSBzdGRjYWxsIEV4aXRUaHJlYWQobG9uZykgRXhpdFRocmVhZAogMjE2IHN0ZGNhbGwgRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzQShzdHIgcHRyIGxvbmcpIEV4cGFuZEVudmlyb25tZW50U3RyaW5nczMyQQogMjE3IHN0ZGNhbGwgRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzVyh3c3RyIHB0ciBsb25nKSBFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MzMlcKLTIxOCBzdHViIEZUX0V4aXQwCi0yMTkgc3R1YiBGVF9FeGl0MTIKLTIyMCBzdHViIEZUX0V4aXQxNgotMjIxIHN0dWIgRlRfRXhpdDIwCi0yMjIgc3R1YiBGVF9FeGl0MjQKLTIyMyBzdHViIEZUX0V4aXQyOAotMjI0IHN0dWIgRlRfRXhpdDMyCi0yMjUgc3R1YiBGVF9FeGl0MzYKLTIyNyBzdHViIEZUX0V4aXQ0MAotMjI4IHN0dWIgRlRfRXhpdDQ0Ci0yMjkgc3R1YiBGVF9FeGl0NDgKLTIyNiBzdHViIEZUX0V4aXQ0Ci0yMzAgc3R1YiBGVF9FeGl0NTIKLTIzMSBzdHViIEZUX0V4aXQ1NgotMjMyIHN0dWIgRlRfRXhpdDgKLTIzMyBzdHViIEZUX1Byb2xvZwotMjM0IHN0dWIgRlRfVGh1bmsKKzIxOCByZWdpc3RlciBGVF9FeGl0MCgpIEZUX0V4aXQwCisyMTkgcmVnaXN0ZXIgRlRfRXhpdDEyKCkgRlRfRXhpdDEyCisyMjAgcmVnaXN0ZXIgRlRfRXhpdDE2KCkgRlRfRXhpdDE2CisyMjEgcmVnaXN0ZXIgRlRfRXhpdDIwKCkgRlRfRXhpdDIwCisyMjIgcmVnaXN0ZXIgRlRfRXhpdDI0KCkgRlRfRXhpdDI0CisyMjMgcmVnaXN0ZXIgRlRfRXhpdDI4KCkgRlRfRXhpdDI4CisyMjQgcmVnaXN0ZXIgRlRfRXhpdDMyKCkgRlRfRXhpdDMyCisyMjUgcmVnaXN0ZXIgRlRfRXhpdDM2KCkgRlRfRXhpdDM2CisyMjcgcmVnaXN0ZXIgRlRfRXhpdDQwKCkgRlRfRXhpdDQwCisyMjggcmVnaXN0ZXIgRlRfRXhpdDQ0KCkgRlRfRXhpdDQ0CisyMjkgcmVnaXN0ZXIgRlRfRXhpdDQ4KCkgRlRfRXhpdDQ4CisyMjYgcmVnaXN0ZXIgRlRfRXhpdDQoKSBGVF9FeGl0NAorMjMwIHJlZ2lzdGVyIEZUX0V4aXQ1MigpIEZUX0V4aXQ1MgorMjMxIHJlZ2lzdGVyIEZUX0V4aXQ1NigpIEZUX0V4aXQ1NgorMjMyIHJlZ2lzdGVyIEZUX0V4aXQ4KCkgRlRfRXhpdDgKKzIzMyByZWdpc3RlciBGVF9Qcm9sb2coKSBGVF9Qcm9sb2cKKzIzNCByZWdpc3RlciBGVF9UaHVuaygpIEZUX1RodW5rCiAyMzUgc3RkY2FsbCBGYXRhbEFwcEV4aXRBKGxvbmcgc3RyKSBGYXRhbEFwcEV4aXQzMkEKIDIzNiBzdGRjYWxsIEZhdGFsQXBwRXhpdFcobG9uZyB3c3RyKSBGYXRhbEFwcEV4aXQzMlcKIDIzNyBzdHViIEZhdGFsRXhpdApAQCAtMzA4LDkgKzMzMCw5IEBACiAzMTYgc3RkY2FsbCBHZXREaXNrRnJlZVNwYWNlVyh3c3RyIHB0ciBwdHIgcHRyIHB0cikgR2V0RGlza0ZyZWVTcGFjZTMyVwogMzE3IHN0ZGNhbGwgR2V0RHJpdmVUeXBlQShzdHIpIEdldERyaXZlVHlwZTMyQQogMzE4IHN0ZGNhbGwgR2V0RHJpdmVUeXBlVyh3c3RyKSBHZXREcml2ZVR5cGUzMlcKKzMxOSBzdGRjYWxsIEdldEVudmlyb25tZW50U3RyaW5ncygpIEdldEVudmlyb25tZW50U3RyaW5nczMyQQogMzIwIHN0ZGNhbGwgR2V0RW52aXJvbm1lbnRTdHJpbmdzQSgpIEdldEVudmlyb25tZW50U3RyaW5nczMyQQogMzIxIHN0ZGNhbGwgR2V0RW52aXJvbm1lbnRTdHJpbmdzVygpIEdldEVudmlyb25tZW50U3RyaW5nczMyVwotMzE5IHN0ZGNhbGwgR2V0RW52aXJvbm1lbnRTdHJpbmdzKCkgR2V0RW52aXJvbm1lbnRTdHJpbmdzMzJBCiAzMjIgc3RkY2FsbCBHZXRFbnZpcm9ubWVudFZhcmlhYmxlQShzdHIgcHRyIGxvbmcpIEdldEVudmlyb25tZW50VmFyaWFibGUzMkEKIDMyMyBzdGRjYWxsIEdldEVudmlyb25tZW50VmFyaWFibGVXKHdzdHIgcHRyIGxvbmcpIEdldEVudmlyb25tZW50VmFyaWFibGUzMlcKIDMyNCBzdHViIEdldEVycm9yTW9kZQpAQCAtMzQ0LDcgKzM2Niw3IEBACiAzNTIgc3R1YiBHZXROYW1lZFBpcGVIYW5kbGVTdGF0ZUEKIDM1MyBzdHViIEdldE5hbWVkUGlwZUhhbmRsZVN0YXRlVwogMzU0IHN0dWIgR2V0TmFtZWRQaXBlSW5mbwotMzU1IHN0dWIgR2V0TnVtYmVyRm9ybWF0QQorMzU1IHN0ZGNhbGwgR2V0TnVtYmVyRm9ybWF0QShsb25nIGxvbmcgc3RyIHB0ciBwdHIgbG9uZykgR2V0TnVtYmVyRm9ybWF0MzJBCiAzNTYgc3R1YiBHZXROdW1iZXJGb3JtYXRXCiAzNTcgc3RkY2FsbCBHZXROdW1iZXJPZkNvbnNvbGVJbnB1dEV2ZW50cyhsb25nIHB0cikgR2V0TnVtYmVyT2ZDb25zb2xlSW5wdXRFdmVudHMKIDM1OCBzdGRjYWxsIEdldE51bWJlck9mQ29uc29sZU1vdXNlQnV0dG9ucyhsb25nIHB0cikgR2V0TnVtYmVyT2ZDb25zb2xlTW91c2VCdXR0b25zCkBAIC01MTMsNyArNTM1LDcgQEAKIDUyMSBzdHViIE1hcEhNb2R1bGVTTAogNTIyIHN0ZGNhbGwgTWFwTFMocHRyKSBNYXBMUwogNTIzIHN0ZGNhbGwgTWFwU0wobG9uZykgTWFwU0wKLTUyNCBzdHViIE1hcFNMRml4Cis1MjQgc3RkY2FsbCBNYXBTTEZpeChsb25nKSBNYXBTTEZpeAogNTI1IHN0ZGNhbGwgTWFwVmlld09mRmlsZShsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIE1hcFZpZXdPZkZpbGUKIDUyNiBzdGRjYWxsIE1hcFZpZXdPZkZpbGVFeChsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyKSBNYXBWaWV3T2ZGaWxlRXgKIDUyNyBzdHViIE1vZHVsZTMyRmlyc3QKQEAgLTY5MCw3ICs3MTIsNyBAQAogNjk4IHN0ZGNhbGwgVVRSZWdpc3Rlcihsb25nIHN0ciBzdHIgc3RyIHB0ciBwdHIgcHRyKSBVVFJlZ2lzdGVyCiA2OTkgc3RkY2FsbCBVVFVuUmVnaXN0ZXIobG9uZykgVVRVblJlZ2lzdGVyCiA3MDAgc3RkY2FsbCBVbk1hcExTKGxvbmcpIFVuTWFwTFMKLTcwMSBzdHViIFVuTWFwU0xGaXhBcnJheQorNzAxIHN0ZGNhbGwgVW5NYXBTTEZpeEFycmF5KHB0ciBsb25nKSBVbk1hcFNMRml4QXJyYXkKIDcwMiBzdGRjYWxsIFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcihwdHIpIFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgogNzAzIHN0dWIgVW5pbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uCiA3MDQgc3RkY2FsbCBVbmxvY2tGaWxlKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgVW5sb2NrRmlsZQpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9tcHIuc3BlYyBiL3JlbGF5MzIvbXByLnNwZWMKaW5kZXggYzdmMGZkMS4uMmJlODFiNSAxMDA2NDQKLS0tIGEvcmVsYXkzMi9tcHIuc3BlYworKysgYi9yZWxheTMyL21wci5zcGVjCkBAIC0zMCw3ICszMCw3IEBACiAwMDQ5IHN0dWIgV05ldEFkZENvbm5lY3Rpb24zVwogMDA1MCBzdHViIFdOZXRBZGRDb25uZWN0aW9uQQogMDA1MSBzdHViIFdOZXRBZGRDb25uZWN0aW9uVwotMDA1MiBzdHViIFdOZXRDYWNoZVBhc3N3b3JkCiswMDUyIHN0ZGNhbGwgV05ldENhY2hlUGFzc3dvcmQocHRyIGxvbmcgcHRyIGxvbmcgbG9uZykgV05ldENhY2hlUGFzc3dvcmQKIDAwNTMgc3R1YiBXTmV0Q2FuY2VsQ29ubmVjdGlvbjJBCiAwMDU0IHN0dWIgV05ldENhbmNlbENvbm5lY3Rpb24yVwogMDA1NSBzdHViIFdOZXRDYW5jZWxDb25uZWN0aW9uQQpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9yZWxheTM4Ni5jIGIvcmVsYXkzMi9yZWxheTM4Ni5jCmluZGV4IDQxMTVjN2IuLjUxNzdhYzIgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvcmVsYXkzODYuYworKysgYi9yZWxheTMyL3JlbGF5Mzg2LmMKQEAgLTExLDI1ICsxMSw5IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImJ1aWx0aW4zMi5oIgogI2luY2x1ZGUgInNlbGVjdG9ycy5oIgorI2luY2x1ZGUgImRlYnVnc3RyLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotc3RhdGljIHZvaWQgX2R1bXBzdHIodW5zaWduZWQgY2hhciAqcykgewotCWZwdXRzKCJcIiIsc3Rkb3V0KTsKLQl3aGlsZSAoKnMpIHsKLQkJaWYgKCpzPCcgJykgewotCQkJcHJpbnRmKCJcXDB4JTAyeCIsKnMrKyk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoKnM9PSdcXCcpIHsKLQkJCWZwdXRzKCJcXFxcIixzdGRvdXQpOwotCQkJcysrOwotCQkJY29udGludWU7Ci0JCX0KLQkJZnB1dGMoKnMrKyxzdGRvdXQpOwotCX0KLQlmcHV0cygiXCIiLHN0ZG91dCk7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFJFTEFZX0NhbGxGcm9tMzIKICAqCkBAIC02OSwxMSArNTMsMTEgQEAKICAgICAgICAgICAgICAgICBsc3RyY3B5bld0b0EoIGJ1ZmYsIChMUFdTVFIpYXJnc1tpXSwgc2l6ZW9mKGJ1ZmYpICk7CiAJCWJ1ZmZbc2l6ZW9mKGJ1ZmYpLTFdPSdcMCc7CiAJICAgIAlwcmludGYoICIlMDh4IEwiLCBhcmdzW2ldICk7Ci0JCV9kdW1wc3RyKCh1bnNpZ25lZCBjaGFyKilidWZmKTsKKwkJZGVidWdfZHVtcHN0ciggYnVmZiApOwogCSAgICB9CiAgICAgICAgICAgICBlbHNlIHsKIAkgICAgCXByaW50ZiggIiUwOHggIiwgYXJnc1tpXSApOwotCQlfZHVtcHN0cigodW5zaWduZWQgY2hhciopYXJnc1tpXSk7CisJCWRlYnVnX2R1bXBzdHIoKExQQ1NUUilhcmdzW2ldKTsKIAkgICAgfQogCX0KICAgICAgICAgZWxzZSBwcmludGYoICIlMDh4IiwgYXJnc1tpXSApOwpAQCAtMTcwLDE5ICsxNTQsNDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFJFTEFZX0NhbGxGcm9tMzJSZWdzCiAgKgotICogJ3N0YWNrJyBwb2ludHMgdG8gdGhlIHJlbGF5IGFkZHIgb24gdGhlIHN0YWNrLgotICogU3RhY2sgbGF5b3V0OgotICogIC4uLiAgICAgIC4uLgotICogKGVzcCsyMTYpIHJldF9hZGRyCi0gKiAoZXNwKzIxMikgcmV0dXJuIHRvIHJlbGF5IGRlYnVnZ2luZyBjb2RlIChvbmx5IHdoZW4gZGVidWdnaW5nKHJlbGF5KSkKLSAqIChlc3ArMjA4KSBlbnRyeSBwb2ludCB0byBjYWxsCi0gKiAoZXNwKzQpICAgQ09OVEVYVAotICogKGVzcCkgICAgIHJldHVybiBhZGRyIHRvIHJlbGF5IGNvZGUKKyAqICdjb250ZXh0JyBjb250YWlucyB0aGUgcmVnaXN0ZXIgY29udGVudHMgYXQgdGhlIHBvaW50IG9mIGNhbGwgb2YKKyAqIHRoZSBSRUdfRU5UUllfUE9JTlQuIFRoZSBzdGFjayBsYXlvdXQgb2YgdGhlIHN0YWNrIHBvaW50ZWQgdG8gYnkKKyAqIEVTUF9yZWcoJmNvbnRleHQpIGlzIGFzIGZvbGxvd3M6CisgKgorICogSWYgZGVidWdtc2cocmVsYXkpIGlzIE9GRjoKKyAqICAuLi4gICAgLi4uCisgKiAoZXNwKzQpIGFyZ3MKKyAqIChlc3ApICAgcmV0dXJuIGFkZHIgdG8gY2FsbGVyCisgKiAoZXNwLTQpIGZ1bmN0aW9uIGVudHJ5IHBvaW50CisgKgorICogSWYgZGVidWdtc2cocmVsYXkpIGlzIE9OOgorICogIC4uLiAgICAuLi4KKyAqIChlc3ArOCkgYXJncworICogKGVzcCs0KSByZXR1cm4gYWRkciB0byBjYWxsZXIKKyAqIChlc3ApICAgcmV0dXJuIGFkZHIgdG8gREVCVUdfRU5UUllfUE9JTlQKKyAqIChlc3AtNCkgZnVuY3Rpb24gZW50cnkgcG9pbnQKKyAqCisgKiBBcyB0aGUgY2FsbGVkIGZ1bmN0aW9uIG1pZ2h0IGNoYW5nZSB0aGUgc3RhY2sgbGF5b3V0CisgKiAoZS5nLiBGVF9Qcm9sb2csIEZUX0V4aXROTiksIHdlIHJlbW92ZSBhbGwgbW9kaWZpY2F0aW9ucyB0byB0aGUgc3RhY2ssCisgKiBzbyB0aGF0IHRoZSBjYWxsZWQgZnVuY3Rpb24gc2VlcyAoaW4gYm90aCBjYXNlcyk6CisgKgorICogIC4uLiAgICAuLi4KKyAqIChlc3ArNCkgYXJncworICogKGVzcCkgICByZXR1cm4gYWRkciB0byBjYWxsZXIKKyAqICAuLi4gICAgPjEyOCBieXRlcyBzcGFjZSBmcmVlIHRvIGJlIG1vZGlmaWVkIChlbnN1cmVkIGJ5IHRoZSBhc3NlbWJseSBnbHVlKQorICoKKyAqIE5PVEU6IFRoaXMgcm91dGluZSBtYWtlcyBubyBhc3N1bXB0aW9uIGFib3V0IHRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZgorICogICAgICAgaXRzIG93biBzdGFjayB0byB0aGUgc3RhY2sgcG9pbnRlZCB0byBieSBFU1BfcmVnKCZjb250ZXh0KSwKKyAqCSBleGNlcHQgdGhhdCB0aGUgbGF0dGVyIG11c3QgaGF2ZSA+MTI4IGJ5dGVzIHNwYWNlIHRvIGdyb3cuCisgKgkgVGhpcyBtZWFucyB0aGUgYXNzZW1ibHkgZ2x1ZSBjb3VsZCBldmVuIHN3aXRjaCBzdGFja3MgY29tcGxldGVseQorICoJIChlLmcuIHRvIGFsbG93IGZvciBsYXJnZSBzdGFja3MpLgorICoKICAqLwotdm9pZCBSRUxBWV9DYWxsRnJvbTMyUmVncyggQ09OVEVYVCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoQ0FMTEJBQ0sgKmVudHJ5X3BvaW50KShDT05URVhUICopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQllURSAqcmVsYXlfYWRkciwgaW50IHJldF9hZGRyICkKKwordm9pZCBSRUxBWV9DYWxsRnJvbTMyUmVncyggQ09OVEVYVCBjb250ZXh0ICkKIHsKKyAgICB2b2lkIChDQUxMQkFDSyAqZW50cnlfcG9pbnQpKENPTlRFWFQgKikgPSAKKwkgKih2b2lkIChDQUxMQkFDSyAqKikoQ09OVEVYVCAqKSkgKEVTUF9yZWcoJmNvbnRleHQpIC0gNCk7CisKICAgICBpZiAoIVRSQUNFX09OKHJlbGF5KSkKICAgICB7CiAgICAgICAgIC8qIFNpbXBseSBjYWxsIHRoZSBlbnRyeSBwb2ludCAqLwpAQCAtMTkyLDE2ICsyMDIsMjUgQEAKICAgICB7CiAgICAgICAgIGNoYXIgYnVmZmVyWzgwXTsKICAgICAgICAgdW5zaWduZWQgaW50IHR5cGVtYXNrOworCUJZVEUgKnJlbGF5X2FkZHI7CiAKICAgICAJX19SRVNUT1JFX0VTOwotICAgICAgICAvKiBGaXh1cCB0aGUgY29udGV4dCBzdHJ1Y3R1cmUgYmVjYXVzZSBvZiB0aGUgZXh0cmEgcGFyYW1ldGVyICovCi0gICAgICAgIC8qIHB1c2hlZCBieSB0aGUgcmVsYXkgZGVidWdnaW5nIGNvZGUgKi8KIAotICAgICAgICBFSVBfcmVnKCZjb250ZXh0KSA9IHJldF9hZGRyOwotICAgICAgICBFU1BfcmVnKCZjb250ZXh0KSArPSBzaXplb2YoaW50KTsKKyAgICAgICAgLyoKKwkgKiBGaXh1cCB0aGUgY29udGV4dCBzdHJ1Y3R1cmUgYmVjYXVzZSBvZiB0aGUgZXh0cmEgcGFyYW1ldGVyCisgICAgICAgICAqIHB1c2hlZCBieSB0aGUgcmVsYXkgZGVidWdnaW5nIGNvZGUuCisJICogTm90ZSB0aGF0IHRoaXMgaW1wbGljaXRseSBkb2VzIGEgUkVUIG9uIHRoZSBDQUxMIGZyb20gdGhlCisJICogREVCVUdfRU5UUllfUE9JTlQgdG8gdGhlIFJFR19FTlRSWV9QT0lOVDsgIHNldHRpbmcgdGhlIEVJUCByZWdpc3RlcgorCSAqIGVuc3VyZXMgdGhhdCB0aGUgYXNzZW1ibHkgZ2x1ZSB3aWxsIGRpcmVjdGx5IHJldHVybiB0byB0aGUKKwkgKiBjYWxsZXIsIGp1c3QgYXMgaW4gdGhlIG5vbi1kZWJ1Z2dpbmcgY2FzZS4KKwkgKi8KKworICAgICAgICByZWxheV9hZGRyID0gKihCWVRFICoqKSBFU1BfcmVnKCZjb250ZXh0KTsgCisgICAgICAgIEVTUF9yZWcoJmNvbnRleHQpICs9IHNpemVvZihCWVRFICopOworCUVJUF9yZWcoJmNvbnRleHQpID0gKihEV09SRCAqKUVTUF9yZWcoJmNvbnRleHQpOwogCiAgICAgICAgIEJVSUxUSU4zMl9HZXRFbnRyeVBvaW50KCBidWZmZXIsIHJlbGF5X2FkZHIgLSA1LCAmdHlwZW1hc2sgKTsKLSAgICAgICAgcHJpbnRmKCJDYWxsICVzKHJlZ3MpIHJldD0lMDh4XG4iLCBidWZmZXIsIHJldF9hZGRyICk7CisgICAgICAgIHByaW50ZigiQ2FsbCAlcyhyZWdzKSByZXQ9JTA4eFxuIiwgYnVmZmVyLCAqKGludCAqKUVTUF9yZWcoJmNvbnRleHQpICk7CiAgICAgICAgIHByaW50ZigiIEVBWD0lMDhseCBFQlg9JTA4bHggRUNYPSUwOGx4IEVEWD0lMDhseCBFU0k9JTA4bHggRURJPSUwOGx4XG4iLAogICAgICAgICAgICAgICAgIEVBWF9yZWcoJmNvbnRleHQpLCBFQlhfcmVnKCZjb250ZXh0KSwgRUNYX3JlZygmY29udGV4dCksCiAgICAgICAgICAgICAgICAgRURYX3JlZygmY29udGV4dCksIEVTSV9yZWcoJmNvbnRleHQpLCBFRElfcmVnKCZjb250ZXh0KSApOwpAQCAtMjEzLDcgKzIzMiw3IEBACiAgICAgICAgIC8qIE5vdyBjYWxsIHRoZSByZWFsIGZ1bmN0aW9uICovCiAgICAgICAgIGVudHJ5X3BvaW50KCAmY29udGV4dCApOwogCi0gICAgICAgIHByaW50ZigiUmV0ICAlcygpIHJldHZhbD1yZWdzIHJldD0lMDh4XG4iLCBidWZmZXIsIHJldF9hZGRyICk7CisgICAgICAgIHByaW50ZigiUmV0ICAlcygpIHJldHZhbD1yZWdzIHJldD0lMDh4XG4iLCBidWZmZXIsICooaW50ICopRVNQX3JlZygmY29udGV4dCkgKTsKICAgICAgICAgcHJpbnRmKCIgRUFYPSUwOGx4IEVCWD0lMDhseCBFQ1g9JTA4bHggRURYPSUwOGx4IEVTST0lMDhseCBFREk9JTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgRUFYX3JlZygmY29udGV4dCksIEVCWF9yZWcoJmNvbnRleHQpLCBFQ1hfcmVnKCZjb250ZXh0KSwKICAgICAgICAgICAgICAgICBFRFhfcmVnKCZjb250ZXh0KSwgRVNJX3JlZygmY29udGV4dCksIEVESV9yZWcoJmNvbnRleHQpICk7CmRpZmYgLS1naXQgYS9yZWxheTMyL3VzZXIzMi5zcGVjIGIvcmVsYXkzMi91c2VyMzIuc3BlYwppbmRleCAzMzQwZGQxLi4xYjNlNjExIDEwMDY0NAotLS0gYS9yZWxheTMyL3VzZXIzMi5zcGVjCisrKyBiL3JlbGF5MzIvdXNlcjMyLnNwZWMKQEAgLTgsNyArOCw3IEBACiAgIDUgc3RkY2FsbCBBcHBlbmRNZW51QShsb25nIGxvbmcgbG9uZyBwdHIpIEFwcGVuZE1lbnUzMkEKICAgNiBzdGRjYWxsIEFwcGVuZE1lbnVXKGxvbmcgbG9uZyBsb25nIHB0cikgQXBwZW5kTWVudTMyVwogICA3IHN0ZGNhbGwgQXJyYW5nZUljb25pY1dpbmRvd3MobG9uZykgQXJyYW5nZUljb25pY1dpbmRvd3MzMgotICA4IHN0dWIgQXR0YWNoVGhyZWFkSW5wdXQKKyAgOCBzdGRjYWxsIEF0dGFjaFRocmVhZElucHV0KGxvbmcgbG9uZyBsb25nKSBBdHRhY2hUaHJlYWRJbnB1dAogICA5IHN0ZGNhbGwgQmVnaW5EZWZlcldpbmRvd1Bvcyhsb25nKSBCZWdpbkRlZmVyV2luZG93UG9zMzIKICAxMCBzdGRjYWxsIEJlZ2luUGFpbnQobG9uZyBwdHIpIEJlZ2luUGFpbnQzMgogIDExIHN0ZGNhbGwgQnJpbmdXaW5kb3dUb1RvcChsb25nKSBCcmluZ1dpbmRvd1RvVG9wMzIKQEAgLTMwNSw3ICszMDUsNyBAQAogMzAwIHN0dWIgR2V0VXNlck9iamVjdEluZm9ybWF0aW9uVwogMzAxIHN0dWIgR2V0VXNlck9iamVjdFNlY3VyaXR5CiAzMDIgc3RkY2FsbCBHZXRXaW5kb3cobG9uZyBsb25nKSBHZXRXaW5kb3czMgotMzAzIHN0dWIgR2V0V2luZG93Q29udGV4dEhlbHBJZAorMzAzIHN0ZGNhbGwgR2V0V2luZG93Q29udGV4dEhlbHBJZChsb25nKSBHZXRXaW5kb3dDb250ZXh0SGVscElkCiAzMDQgc3RkY2FsbCBHZXRXaW5kb3dEQyhsb25nKSBHZXRXaW5kb3dEQzMyCiAzMDUgc3RkY2FsbCBHZXRXaW5kb3dMb25nQShsb25nIGxvbmcpIEdldFdpbmRvd0xvbmczMkEKIDMwNiBzdGRjYWxsIEdldFdpbmRvd0xvbmdXKGxvbmcgbG9uZykgR2V0V2luZG93TG9uZzMyVwpAQCAtNTE3LDcgKzUxNyw3IEBACiA1MTIgc3R1YiBTZXRVc2VyT2JqZWN0SW5mb3JtYXRpb25BCiA1MTMgc3R1YiBTZXRVc2VyT2JqZWN0SW5mb3JtYXRpb25XCiA1MTQgc3R1YiBTZXRVc2VyT2JqZWN0U2VjdXJpdHkKLTUxNSBzdHViIFNldFdpbmRvd0NvbnRleHRIZWxwSWQKKzUxNSBzdGRjYWxsIFNldFdpbmRvd0NvbnRleHRIZWxwSWQobG9uZyBsb25nKSBTZXRXaW5kb3dDb250ZXh0SGVscElkCiA1MTYgc3R1YiBTZXRXaW5kb3dGdWxsU2NyZWVuU3RhdGUKIDUxNyBzdGRjYWxsIFNldFdpbmRvd0xvbmdBKGxvbmcgbG9uZyBsb25nKSBTZXRXaW5kb3dMb25nMzJBCiA1MTggc3RkY2FsbCBTZXRXaW5kb3dMb25nVyhsb25nIGxvbmcgbG9uZykgU2V0V2luZG93TG9uZzMyVwpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL2V2ZW50LmMgYi9zY2hlZHVsZXIvZXZlbnQuYwppbmRleCA5Y2Y1MDVjLi5kNWFkOWM4IDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvZXZlbnQuYworKysgYi9zY2hlZHVsZXIvZXZlbnQuYwpAQCAtODgsNyArODgsNyBAQAogCiAgICAgU1lTVEVNX0xPQ0soKTsKICAgICBldmVudCA9IChFVkVOVCAqKUszMk9CSl9DcmVhdGUoIEszMk9CSl9FVkVOVCwgc2l6ZW9mKCpldmVudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBFVkVOVF9BTExfQUNDRVNTLCAmaGFuZGxlICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBFVkVOVF9BTExfQUNDRVNTLCBzYSwgJmhhbmRsZSApOwogICAgIGlmIChldmVudCkKICAgICB7CiAgICAgICAgIC8qIEZpbmlzaCBpbml0aWFsaXppbmcgaXQgKi8KQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgIFNZU1RFTV9MT0NLKCk7CiAgICAgaWYgKChvYmogPSBLMzJPQkpfRmluZE5hbWVUeXBlKCBuYW1lLCBLMzJPQkpfRVZFTlQgKSkgIT0gTlVMTCkKICAgICB7Ci0gICAgICAgIGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggb2JqLCBhY2Nlc3MsIGluaGVyaXQgKTsKKyAgICAgICAgaGFuZGxlID0gSEFORExFX0FsbG9jKCBQUk9DRVNTX0N1cnJlbnQoKSwgb2JqLCBhY2Nlc3MsIGluaGVyaXQgKTsKICAgICAgICAgSzMyT0JKX0RlY0NvdW50KCBvYmogKTsKICAgICB9CiAgICAgU1lTVEVNX1VOTE9DSygpOwpAQCAtMTUyLDggKzE1Miw4IEBACiB7CiAgICAgRVZFTlQgKmV2ZW50OwogICAgIFNZU1RFTV9MT0NLKCk7Ci0gICAgaWYgKCEoZXZlbnQgPSAoRVZFTlQgKilIQU5ETEVfR2V0T2JqUHRyKCBoYW5kbGUsIEszMk9CSl9FVkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWRU5UX01PRElGWV9TVEFURSApKSkKKyAgICBpZiAoIShldmVudCA9IChFVkVOVCAqKUhBTkRMRV9HZXRPYmpQdHIoUFJPQ0VTU19DdXJyZW50KCksIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX0VWRU5ULCBFVkVOVF9NT0RJRllfU1RBVEUpKSkKICAgICB7CiAgICAgICAgIFNZU1RFTV9VTkxPQ0soKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwpAQCAtMTc0LDggKzE3NCw4IEBACiB7CiAgICAgRVZFTlQgKmV2ZW50OwogICAgIFNZU1RFTV9MT0NLKCk7Ci0gICAgaWYgKCEoZXZlbnQgPSAoRVZFTlQgKilIQU5ETEVfR2V0T2JqUHRyKCBoYW5kbGUsIEszMk9CSl9FVkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWRU5UX01PRElGWV9TVEFURSApKSkKKyAgICBpZiAoIShldmVudCA9IChFVkVOVCAqKUhBTkRMRV9HZXRPYmpQdHIoUFJPQ0VTU19DdXJyZW50KCksIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX0VWRU5ULCBFVkVOVF9NT0RJRllfU1RBVEUpKSkKICAgICB7CiAgICAgICAgIFNZU1RFTV9VTkxPQ0soKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwpAQCAtMTk1LDggKzE5NSw4IEBACiB7CiAgICAgRVZFTlQgKmV2ZW50OwogICAgIFNZU1RFTV9MT0NLKCk7Ci0gICAgaWYgKCEoZXZlbnQgPSAoRVZFTlQgKilIQU5ETEVfR2V0T2JqUHRyKCBoYW5kbGUsIEszMk9CSl9FVkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWRU5UX01PRElGWV9TVEFURSApKSkKKyAgICBpZiAoIShldmVudCA9IChFVkVOVCAqKUhBTkRMRV9HZXRPYmpQdHIoUFJPQ0VTU19DdXJyZW50KCksIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX0VWRU5ULCBFVkVOVF9NT0RJRllfU1RBVEUpKSkKICAgICB7CiAgICAgICAgIFNZU1RFTV9VTkxPQ0soKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL2hhbmRsZS5jIGIvc2NoZWR1bGVyL2hhbmRsZS5jCmluZGV4IDZjMWQ2NDEuLmU2NjMwYWEgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9oYW5kbGUuYworKysgYi9zY2hlZHVsZXIvaGFuZGxlLmMKQEAgLTIyLDIzICsyMiw5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgSEFORExFX0FsbG9jVGFibGUKLSAqLwotSEFORExFX1RBQkxFICpIQU5ETEVfQWxsb2NUYWJsZSggUERCMzIgKnByb2Nlc3MgKQotewotICAgIEhBTkRMRV9UQUJMRSAqdGFibGUgPSBIZWFwQWxsb2MoIHByb2Nlc3MtPnN5c3RlbV9oZWFwLCBIRUFQX1pFUk9fTUVNT1JZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIQU5ETEVfVEFCTEUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSFRBQkxFX1NJWkUtMSkgKiBzaXplb2YoSEFORExFX0VOVFJZKSApOwotICAgIGlmICghdGFibGUpIHJldHVybiBOVUxMOwotICAgIHRhYmxlLT5jb3VudCA9IEhUQUJMRV9TSVpFOwotICAgIHJldHVybiB0YWJsZTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBIQU5ETEVfR3Jvd1RhYmxlCiAgKi8KLXN0YXRpYyBCT09MMzIgSEFORExFX0dyb3dUYWJsZSggUERCMzIgKnByb2Nlc3MgKQorc3RhdGljIEJPT0wzMiBIQU5ETEVfR3Jvd1RhYmxlKCBQREIzMiAqcHJvY2VzcywgSU5UMzIgaW5jciApCiB7CiAgICAgSEFORExFX1RBQkxFICp0YWJsZTsKIApAQCAtNDcsMTAgKzMzLDEwIEBACiAgICAgdGFibGUgPSBIZWFwUmVBbGxvYyggcHJvY2Vzcy0+c3lzdGVtX2hlYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSEVBUF9aRVJPX01FTU9SWSB8IEhFQVBfTk9fU0VSSUFMSVpFLCB0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEFORExFX1RBQkxFKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHRhYmxlLT5jb3VudCtIVEFCTEVfSU5DLTEpICogc2l6ZW9mKEhBTkRMRV9FTlRSWSkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAodGFibGUtPmNvdW50ICsgaW5jciAtIDEpICogc2l6ZW9mKEhBTkRMRV9FTlRSWSkgKTsKICAgICBpZiAodGFibGUpCiAgICAgewotICAgICAgICB0YWJsZS0+Y291bnQgKz0gSFRBQkxFX0lOQzsKKyAgICAgICAgdGFibGUtPmNvdW50ICs9IGluY3I7CiAgICAgICAgIHByb2Nlc3MtPmhhbmRsZV90YWJsZSA9IHRhYmxlOwogICAgIH0KICAgICBTWVNURU1fVU5MT0NLKCk7CkBAIC01OSwxNSArNDUsNjcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBIQU5ETEVfQ3JlYXRlVGFibGUKKyAqCisgKiBDcmVhdGUgYSBwcm9jZXNzIGhhbmRsZSB0YWJsZSwgb3B0aW9uYWxseSBpbmhlcml0aW5nIHRoZSBwYXJlbnQncyBoYW5kbGVzLgorICovCitCT09MMzIgSEFORExFX0NyZWF0ZVRhYmxlKCBQREIzMiAqcGRiLCBCT09MMzIgaW5oZXJpdCApCit7CisgICAgRFdPUkQgc2l6ZTsKKworICAgIC8qIFByb2Nlc3MgbXVzdCBub3QgYWxyZWFkeSBoYXZlIGEgaGFuZGxlIHRhYmxlICovCisgICAgYXNzZXJ0KCAhcGRiLT5oYW5kbGVfdGFibGUgKTsKKworICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHByb2Nlc3MsIHNpbXBseSBhbGxvY2F0ZSBhIHRhYmxlICovCisgICAgaWYgKCFwZGItPnBhcmVudCkgaW5oZXJpdCA9IEZBTFNFOworCisgICAgU1lTVEVNX0xPQ0soKTsKKyAgICBzaXplID0gaW5oZXJpdCA/IHBkYi0+cGFyZW50LT5oYW5kbGVfdGFibGUtPmNvdW50IDogSFRBQkxFX1NJWkU7CisgICAgaWYgKChwZGItPmhhbmRsZV90YWJsZSA9IEhlYXBBbGxvYyggcGRiLT5zeXN0ZW1faGVhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRUFQX1pFUk9fTUVNT1JZIHwgSEVBUF9OT19TRVJJQUxJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhBTkRMRV9UQUJMRSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplLTEpICogc2l6ZW9mKEhBTkRMRV9FTlRSWSkgKSkpCisgICAgeworICAgICAgICBwZGItPmhhbmRsZV90YWJsZS0+Y291bnQgPSBzaXplOworICAgICAgICBpZiAoaW5oZXJpdCkKKyAgICAgICAgeworICAgICAgICAgICAgSEFORExFX0VOVFJZICpzcmMgPSBwZGItPnBhcmVudC0+aGFuZGxlX3RhYmxlLT5lbnRyaWVzOworICAgICAgICAgICAgSEFORExFX0VOVFJZICpkc3QgPSBwZGItPmhhbmRsZV90YWJsZS0+ZW50cmllczsKKyAgICAgICAgICAgIEhBTkRMRTMyIGg7CisKKyAgICAgICAgICAgIGZvciAoaCA9IDA7IGggPCBzaXplOyBoKyssIHNyYysrLCBkc3QrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiBoYW5kbGUgaXMgdmFsaWQgYW5kIGluaGVyaXRhYmxlICovCisgICAgICAgICAgICAgICAgaWYgKHNyYy0+cHRyICYmIChzcmMtPmFjY2VzcyAmIFJFU0VSVkVEX0lOSEVSSVQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0LT5hY2Nlc3MgPSBzcmMtPmFjY2VzczsKKyAgICAgICAgICAgICAgICAgICAgZHN0LT5wdHIgICAgPSBzcmMtPnB0cjsKKyAgICAgICAgICAgICAgICAgICAgSzMyT0JKX0luY0NvdW50KCBkc3QtPnB0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBIYW5kbGUgMSBpcyB0aGUgcHJvY2VzcyBpdHNlbGYgKHVubGVzcyB0aGUgcGFyZW50IGRlY2lkZWQgb3RoZXJ3aXNlKSAqLworICAgICAgICBpZiAoIXBkYi0+aGFuZGxlX3RhYmxlLT5lbnRyaWVzWzFdLnB0cikKKyAgICAgICAgeworICAgICAgICAgICAgcGRiLT5oYW5kbGVfdGFibGUtPmVudHJpZXNbMV0ucHRyICAgID0gJnBkYi0+aGVhZGVyOworICAgICAgICAgICAgcGRiLT5oYW5kbGVfdGFibGUtPmVudHJpZXNbMV0uYWNjZXNzID0gUFJPQ0VTU19BTExfQUNDRVNTOworICAgICAgICAgICAgSzMyT0JKX0luY0NvdW50KCAmcGRiLT5oZWFkZXIgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgcmV0dXJuIChwZGItPmhhbmRsZV90YWJsZSAhPSBOVUxMKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBIQU5ETEVfQWxsb2MKICAqCiAgKiBBbGxvY2F0ZSBhIGhhbmRsZSBmb3IgYSBrZXJuZWwgb2JqZWN0IGFuZCBpbmNyZW1lbnQgaXRzIHJlZmNvdW50LgogICovCi1IQU5ETEUzMiBIQU5ETEVfQWxsb2MoIEszMk9CSiAqcHRyLCBEV09SRCBhY2Nlc3MsIEJPT0wzMiBpbmhlcml0ICkKK0hBTkRMRTMyIEhBTkRMRV9BbGxvYyggUERCMzIgKnBkYiwgSzMyT0JKICpwdHIsIERXT1JEIGFjY2VzcywgQk9PTDMyIGluaGVyaXQgKQogewogICAgIEhBTkRMRTMyIGg7CiAgICAgSEFORExFX0VOVFJZICplbnRyeTsKLSAgICBQREIzMiAqcGRiID0gUFJPQ0VTU19DdXJyZW50KCk7CiAKICAgICBhc3NlcnQoIHB0ciApOwogCkBAIC03NywxNiArMTE1LDE3IEBACiAKICAgICBTWVNURU1fTE9DSygpOwogICAgIEszMk9CSl9JbmNDb3VudCggcHRyICk7Ci0gICAgZW50cnkgPSBwZGItPmhhbmRsZV90YWJsZS0+ZW50cmllczsKLSAgICBmb3IgKGggPSAwOyBoIDwgcGRiLT5oYW5kbGVfdGFibGUtPmNvdW50OyBoKyssIGVudHJ5KyspCisgICAgLyogRG9uJ3QgdHJ5IHRvIGFsbG9jYXRlIGhhbmRsZSAwICovCisgICAgZW50cnkgPSBwZGItPmhhbmRsZV90YWJsZS0+ZW50cmllcyArIDE7CisgICAgZm9yIChoID0gMTsgaCA8IHBkYi0+aGFuZGxlX3RhYmxlLT5jb3VudDsgaCsrLCBlbnRyeSsrKQogICAgICAgICBpZiAoIWVudHJ5LT5wdHIpIGJyZWFrOwotICAgIGlmICgoaCA8IHBkYi0+aGFuZGxlX3RhYmxlLT5jb3VudCkgfHwgSEFORExFX0dyb3dUYWJsZSggcGRiICkpCisgICAgaWYgKChoIDwgcGRiLT5oYW5kbGVfdGFibGUtPmNvdW50KSB8fCBIQU5ETEVfR3Jvd1RhYmxlKCBwZGIsIEhUQUJMRV9JTkMgKSkKICAgICB7CiAgICAgICAgIGVudHJ5ID0gJnBkYi0+aGFuZGxlX3RhYmxlLT5lbnRyaWVzW2hdOwogICAgICAgICBlbnRyeS0+YWNjZXNzID0gYWNjZXNzOwogICAgICAgICBlbnRyeS0+cHRyICAgID0gcHRyOwogICAgICAgICBTWVNURU1fVU5MT0NLKCk7Ci0gICAgICAgIHJldHVybiBoICsgMTsgIC8qIEF2b2lkIGhhbmRsZSAwICovCisgICAgICAgIHJldHVybiBoOwogICAgIH0KICAgICBLMzJPQkpfRGVjQ291bnQoIHB0ciApOwogICAgIFNZU1RFTV9VTkxPQ0soKTsKQEAgLTEwMSwxNSArMTQwLDE1IEBACiAgKiBSZXRyaWV2ZSBhIHBvaW50ZXIgdG8gYSBrZXJuZWwgb2JqZWN0IGFuZCBpbmNyZW1lbnRzIGl0cyByZWZlcmVuY2UgY291bnQuCiAgKiBUaGUgcmVmY291bnQgbXVzdCBiZSBkZWNyZW1lbnRlZCB3aGVuIHRoZSBwb2ludGVyIGlzIG5vIGxvbmdlciB1c2VkLgogICovCi1LMzJPQkogKkhBTkRMRV9HZXRPYmpQdHIoIEhBTkRMRTMyIGhhbmRsZSwgSzMyT0JKX1RZUEUgdHlwZSwgRFdPUkQgYWNjZXNzICkKK0szMk9CSiAqSEFORExFX0dldE9ialB0ciggUERCMzIgKnBkYiwgSEFORExFMzIgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLMzJPQkpfVFlQRSB0eXBlLCBEV09SRCBhY2Nlc3MgKQogewogICAgIEszMk9CSiAqcHRyID0gTlVMTDsKLSAgICBQREIzMiAqcGRiID0gUFJPQ0VTU19DdXJyZW50KCk7CiAKICAgICBTWVNURU1fTE9DSygpOwogICAgIGlmICgoaGFuZGxlID4gMCkgJiYgKGhhbmRsZSA8PSBwZGItPmhhbmRsZV90YWJsZS0+Y291bnQpKQogICAgIHsKLSAgICAgICAgSEFORExFX0VOVFJZICplbnRyeSA9ICZwZGItPmhhbmRsZV90YWJsZS0+ZW50cmllc1toYW5kbGUtMV07CisgICAgICAgIEhBTkRMRV9FTlRSWSAqZW50cnkgPSAmcGRiLT5oYW5kbGVfdGFibGUtPmVudHJpZXNbaGFuZGxlXTsKICAgICAgICAgaWYgKChlbnRyeS0+YWNjZXNzICYgYWNjZXNzKSAhPSBhY2Nlc3MpCiAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBoYW5kbGUgJTA4eCBiYWQgYWNjZXNzIChhY2M9JTA4bHggcmVxPSUwOGx4KVxuIiwKICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgZW50cnktPmFjY2VzcywgYWNjZXNzICk7CkBAIC0xMzEsMTUgKzE3MCwxNSBAQAogICogQ2hhbmdlIHRoZSBvYmplY3QgcG9pbnRlciBvZiBhIGhhbmRsZSwgYW5kIGluY3JlbWVudCB0aGUgcmVmY291bnQuCiAgKiBVc2Ugd2l0aCBjYXV0aW9uIQogICovCi1CT09MMzIgSEFORExFX1NldE9ialB0ciggSEFORExFMzIgaGFuZGxlLCBLMzJPQkogKnB0ciwgRFdPUkQgYWNjZXNzICkKK0JPT0wzMiBIQU5ETEVfU2V0T2JqUHRyKCBQREIzMiAqcGRiLCBIQU5ETEUzMiBoYW5kbGUsIEszMk9CSiAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGFjY2VzcyApCiB7CiAgICAgQk9PTDMyIHJldCA9IEZBTFNFOwotICAgIFBEQjMyICpwZGIgPSBQUk9DRVNTX0N1cnJlbnQoKTsKIAogICAgIFNZU1RFTV9MT0NLKCk7CiAgICAgaWYgKChoYW5kbGUgPiAwKSAmJiAoaGFuZGxlIDw9IHBkYi0+aGFuZGxlX3RhYmxlLT5jb3VudCkpCiAgICAgewotICAgICAgICBIQU5ETEVfRU5UUlkgKmVudHJ5ID0gJnBkYi0+aGFuZGxlX3RhYmxlLT5lbnRyaWVzW2hhbmRsZS0xXTsKKyAgICAgICAgSEFORExFX0VOVFJZICplbnRyeSA9ICZwZGItPmhhbmRsZV90YWJsZS0+ZW50cmllc1toYW5kbGVdOwogICAgICAgICBLMzJPQkogKm9sZF9wdHIgPSBlbnRyeS0+cHRyOwogICAgICAgICBLMzJPQkpfSW5jQ291bnQoIHB0ciApOwogICAgICAgICBlbnRyeS0+YWNjZXNzID0gYWNjZXNzOwpAQCAtMTU0LDE4ICsxOTMsNDAgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ2xvc2VIYW5kbGUgICAoS0VSTkVMMzIuMjMpCisgKiAgICAgICAgICAgSEFORExFX0dldEFjY2VzcwogICovCi1CT09MMzIgV0lOQVBJIENsb3NlSGFuZGxlKCBIQU5ETEUzMiBoYW5kbGUgKQorc3RhdGljIEJPT0wzMiBIQU5ETEVfR2V0QWNjZXNzKCBQREIzMiAqcGRiLCBIQU5ETEUzMiBoYW5kbGUsIExQRFdPUkQgYWNjZXNzICkKIHsKICAgICBCT09MMzIgcmV0ID0gRkFMU0U7Ci0gICAgUERCMzIgKnBkYiA9IFBST0NFU1NfQ3VycmVudCgpOworCisgICAgU1lTVEVNX0xPQ0soKTsKKyAgICBpZiAoKGhhbmRsZSA+IDApICYmIChoYW5kbGUgPD0gcGRiLT5oYW5kbGVfdGFibGUtPmNvdW50KSkKKyAgICB7CisgICAgICAgIEhBTkRMRV9FTlRSWSAqZW50cnkgPSAmcGRiLT5oYW5kbGVfdGFibGUtPmVudHJpZXNbaGFuZGxlXTsKKyAgICAgICAgaWYgKGVudHJ5LT5wdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgICphY2Nlc3MgPSBlbnRyeS0+YWNjZXNzICYgflJFU0VSVkVEX0FMTDsKKyAgICAgICAgICAgIHJldCA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgU1lTVEVNX1VOTE9DSygpOworICAgIGlmICghcmV0KSBTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfSEFORExFICk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgSEFORExFX0Nsb3NlCisgKi8KK3N0YXRpYyBCT09MMzIgSEFORExFX0Nsb3NlKCBQREIzMiAqcGRiLCBIQU5ETEUzMiBoYW5kbGUgKQoreworICAgIEJPT0wzMiByZXQgPSBGQUxTRTsKICAgICBLMzJPQkogKnB0cjsKIAogICAgIFNZU1RFTV9MT0NLKCk7CiAgICAgaWYgKChoYW5kbGUgPiAwKSAmJiAoaGFuZGxlIDw9IHBkYi0+aGFuZGxlX3RhYmxlLT5jb3VudCkpCiAgICAgewotICAgICAgICBIQU5ETEVfRU5UUlkgKmVudHJ5ID0gJnBkYi0+aGFuZGxlX3RhYmxlLT5lbnRyaWVzW2hhbmRsZS0xXTsKKyAgICAgICAgSEFORExFX0VOVFJZICplbnRyeSA9ICZwZGItPmhhbmRsZV90YWJsZS0+ZW50cmllc1toYW5kbGVdOwogICAgICAgICBpZiAoKHB0ciA9IGVudHJ5LT5wdHIpKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIShlbnRyeS0+YWNjZXNzICYgUkVTRVJWRURfQ0xPU0VfUFJPVEVDVCkpCkBAIC0xODUsNiArMjQ2LDQxIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEhBTkRMRV9DbG9zZUFsbAorICoKKyAqIENsb3NlIGFsbCBoYW5kbGVzIHBvaW50aW5nIHRvIGEgZ2l2ZW4gb2JqZWN0IChvciBhbGwgaGFuZGxlcyBvZiB0aGUKKyAqIHByb2Nlc3MgaWYgdGhlIG9iamVjdCBpcyBOVUxMKQorICovCit2b2lkIEhBTkRMRV9DbG9zZUFsbCggUERCMzIgKnBkYiwgSzMyT0JKICpvYmogKQoreworICAgIEhBTkRMRV9FTlRSWSAqZW50cnk7CisgICAgSzMyT0JKICpwdHI7CisgICAgSEFORExFMzIgaGFuZGxlOworCisgICAgU1lTVEVNX0xPQ0soKTsKKyAgICBlbnRyeSA9IHBkYi0+aGFuZGxlX3RhYmxlLT5lbnRyaWVzOworICAgIGZvciAoaGFuZGxlID0gMDsgaGFuZGxlIDwgcGRiLT5oYW5kbGVfdGFibGUtPmNvdW50OyBoYW5kbGUrKywgZW50cnkrKykKKyAgICB7CisgICAgICAgIGlmICghKHB0ciA9IGVudHJ5LT5wdHIpKSBjb250aW51ZTsgIC8qIGVtcHR5IHNsb3QgKi8KKyAgICAgICAgaWYgKG9iaiAmJiAocHRyICE9IG9iaikpIGNvbnRpbnVlOyAgLyogbm90IHRoZSByaWdodCBvYmplY3QgKi8KKyAgICAgICAgZW50cnktPmFjY2VzcyA9IDA7CisgICAgICAgIGVudHJ5LT5wdHIgICAgPSBOVUxMOworICAgICAgICBLMzJPQkpfRGVjQ291bnQoIHB0ciApOworICAgIH0KKyAgICBTWVNURU1fVU5MT0NLKCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENsb3NlSGFuZGxlICAgKEtFUk5FTDMyLjIzKQorICovCitCT09MMzIgV0lOQVBJIENsb3NlSGFuZGxlKCBIQU5ETEUzMiBoYW5kbGUgKQoreworICAgIHJldHVybiBIQU5ETEVfQ2xvc2UoIFBST0NFU1NfQ3VycmVudCgpLCBoYW5kbGUgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0SGFuZGxlSW5mb3JtYXRpb24gICAoS0VSTkVMMzIuMzM2KQogICovCiBCT09MMzIgV0lOQVBJIEdldEhhbmRsZUluZm9ybWF0aW9uKCBIQU5ETEUzMiBoYW5kbGUsIExQRFdPUkQgZmxhZ3MgKQpAQCAtMTk1LDcgKzI5MSw3IEBACiAgICAgU1lTVEVNX0xPQ0soKTsKICAgICBpZiAoKGhhbmRsZSA+IDApICYmIChoYW5kbGUgPD0gcGRiLT5oYW5kbGVfdGFibGUtPmNvdW50KSkKICAgICB7Ci0gICAgICAgIEhBTkRMRV9FTlRSWSAqZW50cnkgPSAmcGRiLT5oYW5kbGVfdGFibGUtPmVudHJpZXNbaGFuZGxlLTFdOworICAgICAgICBIQU5ETEVfRU5UUlkgKmVudHJ5ID0gJnBkYi0+aGFuZGxlX3RhYmxlLT5lbnRyaWVzW2hhbmRsZV07CiAgICAgICAgIGlmIChlbnRyeS0+cHRyKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoZmxhZ3MpCkBAIC0yMjIsNyArMzE4LDcgQEAKICAgICBTWVNURU1fTE9DSygpOwogICAgIGlmICgoaGFuZGxlID4gMCkgJiYgKGhhbmRsZSA8PSBwZGItPmhhbmRsZV90YWJsZS0+Y291bnQpKQogICAgIHsKLSAgICAgICAgSEFORExFX0VOVFJZICplbnRyeSA9ICZwZGItPmhhbmRsZV90YWJsZS0+ZW50cmllc1toYW5kbGUtMV07CisgICAgICAgIEhBTkRMRV9FTlRSWSAqZW50cnkgPSAmcGRiLT5oYW5kbGVfdGFibGUtPmVudHJpZXNbaGFuZGxlXTsKICAgICAgICAgaWYgKGVudHJ5LT5wdHIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGVudHJ5LT5hY2Nlc3MgPSAoZW50cnktPmFjY2VzcyAmIH5tYXNrKSB8IGZsYWdzOwpAQCAtMjMzLDMgKzMyOSw0OSBAQAogICAgIGlmICghcmV0KSBTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfSEFORExFICk7CiAgICAgcmV0dXJuIHJldDsKIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRHVwbGljYXRlSGFuZGxlICAgKEtFUk5FTDMyLjE5MikKKyAqLworQk9PTDMyIFdJTkFQSSBEdXBsaWNhdGVIYW5kbGUoIEhBTkRMRTMyIHNvdXJjZV9wcm9jZXNzLCBIQU5ETEUzMiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFMzIgZGVzdF9wcm9jZXNzLCBIQU5ETEUzMiAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBhY2Nlc3MsIEJPT0wzMiBpbmhlcml0LCBEV09SRCBvcHRpb25zICkKK3sKKyAgICBQREIzMiAqc3JjX3BkYiA9IE5VTEwsICpkc3RfcGRiID0gTlVMTDsKKyAgICBLMzJPQkogKm9iaiA9IE5VTEw7CisgICAgQk9PTDMyIHJldCA9IEZBTFNFOworICAgIEhBTkRMRTMyIGhhbmRsZTsKKworICAgIFNZU1RFTV9MT0NLKCk7CisKKyAgICBpZiAoIShzcmNfcGRiID0gUFJPQ0VTU19HZXRQdHIoIHNvdXJjZV9wcm9jZXNzLCBQUk9DRVNTX0RVUF9IQU5ETEUgKSkpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICBpZiAoIShvYmogPSBIQU5ETEVfR2V0T2JqUHRyKCBzcmNfcGRiLCBzb3VyY2UsIEszMk9CSl9VTktOT1dOLCAwICkpKQorICAgICAgICBnb3RvIGRvbmU7CisKKyAgICAvKiBOb3cgdGhhdCB3ZSBhcmUgc3VyZSB0aGUgc291cmNlIGlzIHZhbGlkLCBoYW5kbGUgdGhlIG9wdGlvbnMgKi8KKworICAgIGlmIChvcHRpb25zICYgRFVQTElDQVRFX0NMT1NFX1NPVVJDRSkKKyAgICAgICAgSEFORExFX0Nsb3NlKCBzcmNfcGRiLCBzb3VyY2UgKTsKKyAgICBpZiAob3B0aW9ucyAmIERVUExJQ0FURV9TQU1FX0FDQ0VTUykKKyAgICAgICAgSEFORExFX0dldEFjY2Vzcyggc3JjX3BkYiwgc291cmNlLCAmYWNjZXNzICk7CisKKyAgICAvKiBBbmQgZHVwbGljYXRlIHRoZSBoYW5kbGUgaW4gdGhlIGRlc3QgcHJvY2VzcyAqLworCisgICAgaWYgKCEoZHN0X3BkYiA9IFBST0NFU1NfR2V0UHRyKCBkZXN0X3Byb2Nlc3MsIFBST0NFU1NfRFVQX0hBTkRMRSApKSkKKyAgICAgICAgZ290byBkb25lOworICAgIGlmICgoaGFuZGxlID0gSEFORExFX0FsbG9jKCBkc3RfcGRiLCBvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcywgaW5oZXJpdCApKSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyKQorICAgIHsKKyAgICAgICAgaWYgKGRlc3QpICpkZXN0ID0gaGFuZGxlOworICAgICAgICByZXQgPSBUUlVFOworICAgIH0KKworZG9uZToKKyAgICBpZiAoZHN0X3BkYikgSzMyT0JKX0RlY0NvdW50KCAmZHN0X3BkYi0+aGVhZGVyICk7CisgICAgaWYgKG9iaikgSzMyT0JKX0RlY0NvdW50KCBvYmogKTsKKyAgICBpZiAoc3JjX3BkYikgSzMyT0JKX0RlY0NvdW50KCAmc3JjX3BkYi0+aGVhZGVyICk7CisgICAgU1lTVEVNX1VOTE9DSygpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvazMyb2JqLmMgYi9zY2hlZHVsZXIvazMyb2JqLmMKaW5kZXggMzA3MTdmYi4uOTgwNTNhNCAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL2szMm9iai5jCisrKyBiL3NjaGVkdWxlci9rMzJvYmouYwpAQCAtMTYyLDggKzE2MiwxMCBAQAogICogVGhlIHJlZmNvdW50IG9mIHRoZSBvYmplY3QgbXVzdCBiZSBkZWNyZW1lbnRlZCBvbmNlIGl0IGlzIGluaXRpYWxpemVkLgogICovCiBLMzJPQkogKkszMk9CSl9DcmVhdGUoIEszMk9CSl9UWVBFIHR5cGUsIERXT1JEIHNpemUsIExQQ1NUUiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBhY2Nlc3MsIEhBTkRMRTMyICpoYW5kbGUgKQorICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBhY2Nlc3MsIFNFQ1VSSVRZX0FUVFJJQlVURVMgKnNhLCBIQU5ETEUzMiAqaGFuZGxlKQogeworICAgIEJPT0wzMiBpbmhlcml0ID0gKHNhICYmIChzYS0+bkxlbmd0aD49c2l6ZW9mKCpzYSkpICYmIHNhLT5iSW5oZXJpdEhhbmRsZSk7CisKICAgICAvKiBDaGVjayBpZiB0aGUgbmFtZSBhbHJlYWR5IGV4aXN0cyAqLwogCiAgICAgSzMyT0JKICpvYmogPSBLMzJPQkpfRmluZE5hbWUoIG5hbWUgKTsKQEAgLTE3Miw3ICsxNzQsNyBAQAogICAgICAgICBpZiAob2JqLT50eXBlID09IHR5cGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfQUxSRUFEWV9FWElTVFMgKTsKLSAgICAgICAgICAgICpoYW5kbGUgPSBIQU5ETEVfQWxsb2MoIG9iaiwgYWNjZXNzLCBGQUxTRSApOworICAgICAgICAgICAgKmhhbmRsZSA9IEhBTkRMRV9BbGxvYyggUFJPQ0VTU19DdXJyZW50KCksIG9iaiwgYWNjZXNzLCBpbmhlcml0ICk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0yMDksNyArMjExLDcgQEAKIAogICAgIC8qIEFsbG9jYXRlIGEgaGFuZGxlICovCiAKLSAgICAqaGFuZGxlID0gSEFORExFX0FsbG9jKCBvYmosIGFjY2VzcywgRkFMU0UgKTsKKyAgICAqaGFuZGxlID0gSEFORExFX0FsbG9jKCBQUk9DRVNTX0N1cnJlbnQoKSwgb2JqLCBhY2Nlc3MsIGluaGVyaXQgKTsKICAgICBTWVNURU1fVU5MT0NLKCk7CiAgICAgcmV0dXJuIG9iajsKIH0KZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9tdXRleC5jIGIvc2NoZWR1bGVyL211dGV4LmMKaW5kZXggYWU2OTQ5OC4uNDA3ZTUwZSAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL211dGV4LmMKKysrIGIvc2NoZWR1bGVyL211dGV4LmMKQEAgLTg2LDcgKzg2LDcgQEAKIAogICAgIFNZU1RFTV9MT0NLKCk7CiAgICAgbXV0ZXggPSAoTVVURVggKilLMzJPQkpfQ3JlYXRlKCBLMzJPQkpfTVVURVgsIHNpemVvZigqbXV0ZXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgTVVURVhfQUxMX0FDQ0VTUywgJmhhbmRsZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgTVVURVhfQUxMX0FDQ0VTUywgc2EsICZoYW5kbGUgKTsKICAgICBpZiAobXV0ZXgpCiAgICAgewogICAgICAgICAvKiBGaW5pc2ggaW5pdGlhbGl6aW5nIGl0ICovCkBAIC0xNDAsNyArMTQwLDcgQEAKICAgICBTWVNURU1fTE9DSygpOwogICAgIGlmICgob2JqID0gSzMyT0JKX0ZpbmROYW1lVHlwZSggbmFtZSwgSzMyT0JKX01VVEVYICkpICE9IE5VTEwpCiAgICAgewotICAgICAgICBoYW5kbGUgPSBIQU5ETEVfQWxsb2MoIG9iaiwgYWNjZXNzLCBpbmhlcml0ICk7CisgICAgICAgIGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggUFJPQ0VTU19DdXJyZW50KCksIG9iaiwgYWNjZXNzLCBpbmhlcml0ICk7CiAgICAgICAgIEszMk9CSl9EZWNDb3VudCggb2JqICk7CiAgICAgfQogICAgIFNZU1RFTV9VTkxPQ0soKTsKQEAgLTE2Nyw4ICsxNjcsOCBAQAogewogICAgIE1VVEVYICptdXRleDsKICAgICBTWVNURU1fTE9DSygpOwotICAgIGlmICghKG11dGV4ID0gKE1VVEVYICopSEFORExFX0dldE9ialB0ciggaGFuZGxlLCBLMzJPQkpfTVVURVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVVRFWF9NT0RJRllfU1RBVEUgKSkpCisgICAgaWYgKCEobXV0ZXggPSAoTVVURVggKilIQU5ETEVfR2V0T2JqUHRyKFBST0NFU1NfQ3VycmVudCgpLCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9NVVRFWCwgTVVURVhfTU9ESUZZX1NUQVRFKSkpCiAgICAgewogICAgICAgICBTWVNURU1fVU5MT0NLKCk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9wcm9jZXNzLmMgYi9zY2hlZHVsZXIvcHJvY2Vzcy5jCmluZGV4IDI3MGZkYzkuLmNlNmZjNTAgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9wcm9jZXNzLmMKKysrIGIvc2NoZWR1bGVyL3Byb2Nlc3MuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBXaW4zMiBwcm9jZXNzZXMKICAqCi0gKiBDb3B5cmlnaHQgMTk5NiBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqIENvcHlyaWdodCAxOTk2LCAxOTk4IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KQEAgLTE3LDYgKzE3LDggQEAKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgInBlX2ltYWdlLmgiCisjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgImRlYnVnLmgiCiAKIC8qIFByb2Nlc3Mgc2VsZi1oYW5kbGUgKi8KICNkZWZpbmUgUFJPQ0VTU19TRUxGICgoSEFORExFMzIpMHg3ZmZmZmZmZikKQEAgLTU1LDE1ICs1NywxNCBAQAogICovCiBQREIzMiAqUFJPQ0VTU19HZXRQdHIoIEhBTkRMRTMyIGhhbmRsZSwgRFdPUkQgYWNjZXNzICkKIHsKLSAgICBQREIzMiAqcGRiOworICAgIFBEQjMyICpwZGIgPSBQUk9DRVNTX0N1cnJlbnQoKTsKIAogICAgIGlmIChoYW5kbGUgPT0gUFJPQ0VTU19TRUxGKQogICAgIHsKLSAgICAgICAgcGRiID0gUFJPQ0VTU19DdXJyZW50KCk7CiAgICAgICAgIEszMk9CSl9JbmNDb3VudCggJnBkYi0+aGVhZGVyICk7CiAgICAgICAgIHJldHVybiBwZGI7CiAgICAgfQotICAgIHJldHVybiAoUERCMzIgKilIQU5ETEVfR2V0T2JqUHRyKCBoYW5kbGUsIEszMk9CSl9QUk9DRVNTLCBhY2Nlc3MgKTsKKyAgICByZXR1cm4gKFBEQjMyICopSEFORExFX0dldE9ialB0ciggcGRiLCBoYW5kbGUsIEszMk9CSl9QUk9DRVNTLCBhY2Nlc3MgKTsKIH0KIAogCkBAIC04Nyw1OCArODgsNTkgQEAKIH0KIAogCi1zdGF0aWMgaW50IHBzdHJfY21wKCBjb25zdCB2b2lkICpwczEsIGNvbnN0IHZvaWQgKnBzMiApCi17Ci0gICAgcmV0dXJuIGxzdHJjbXBpMzJBKCAqKExQU1RSICopcHMxLCAqKExQU1RSICopcHMyICk7Ci19CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFBST0NFU1NfRmlsbEVudkRCCisgKiAgICAgICAgICAgUFJPQ0VTU19CdWlsZEVudkRCCisgKgorICogQnVpbGQgdGhlIGVudiBEQiBmb3IgdGhlIGluaXRpYWwgcHJvY2VzcwogICovCi1zdGF0aWMgQk9PTDMyIFBST0NFU1NfRmlsbEVudkRCKCBQREIzMiAqcGRiLCBUREIgKnBUYXNrLCBMUENTVFIgY21kX2xpbmUgKQorc3RhdGljIEJPT0wzMiBQUk9DRVNTX0J1aWxkRW52REIoIFBEQjMyICpwZGIgKQogewotICAgIExQU1RSIHAsIGVudjsKLSAgICBJTlQzMiBjb3VudCA9IDA7Ci0gICAgTFBTVFIgKnBwLCAqYXJyYXkgPSBOVUxMOworICAgIC8qIEFsbG9jYXRlIHRoZSBlbnYgREIgKEZJWE1FOiBzaG91bGQgbm90IGJlIG9uIHRoZSBzeXN0ZW0gaGVhcCkgKi8KIAotICAgIC8qIENvcHkgdGhlIFdpbjE2IGVudmlyb25tZW50LCBzb3J0aW5nIGl0IGluIHRoZSBwcm9jZXNzICovCisgICAgaWYgKCEocGRiLT5lbnZfZGIgPSBIZWFwQWxsb2MoU3lzdGVtSGVhcCxIRUFQX1pFUk9fTUVNT1JZLHNpemVvZihFTlZEQikpKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oICZwZGItPmVudl9kYi0+c2VjdGlvbiApOwogCi0gICAgZW52ID0gcCA9IEdsb2JhbExvY2sxNiggcFRhc2stPnBkYi5lbnZpcm9ubWVudCApOwotICAgIGZvciAocCA9IGVudjsgKnA7IHAgKz0gc3RybGVuKHApICsgMSkgY291bnQrKzsKLSAgICBwZGItPmVudl9kYi0+ZW52X3NpemUgPSAocCAtIGVudikgKyAxOwotICAgIHBkYi0+ZW52X2RiLT5lbnZpcm9uID0gSGVhcEFsbG9jKCBwZGItPmhlYXAsIDAsIHBkYi0+ZW52X2RiLT5lbnZfc2l6ZSApOwotICAgIGlmICghcGRiLT5lbnZfZGItPmVudmlyb24pIGdvdG8gZXJyb3I7Ci0gICAgaWYgKCEoYXJyYXkgPSBIZWFwQWxsb2MoIHBkYi0+aGVhcCwgMCwgY291bnQgKiBzaXplb2YoYXJyYXlbMF0pICkpKQotICAgICAgICBnb3RvIGVycm9yOwotICAgIGZvciAocCA9IGVudiwgcHAgPSBhcnJheTsgKnA7IHAgKz0gc3RybGVuKHApICsgMSkgKnBwKysgPSBwOwotICAgIHFzb3J0KCBhcnJheSwgY291bnQsIHNpemVvZihMUFNUUiksIHBzdHJfY21wICk7Ci0gICAgcCA9IHBkYi0+ZW52X2RiLT5lbnZpcm9uOwotICAgIGZvciAocHAgPSBhcnJheTsgY291bnQ7IGNvdW50LS0sIHBwKyspCi0gICAgewotICAgICAgICBzdHJjcHkoIHAsICpwcCApOwotICAgICAgICBwICs9IHN0cmxlbihwKSArIDE7Ci0gICAgfQotICAgICpwID0gJ1wwJzsKLSAgICBIZWFwRnJlZSggcGRiLT5oZWFwLCAwLCBhcnJheSApOwotICAgIGFycmF5ID0gTlVMTDsKKyAgICAvKiBBbGxvY2F0ZSB0aGUgc3RhbmRhcmQgaGFuZGxlcyAqLworCisgICAgcGRiLT5lbnZfZGItPmhTdGRpbiAgPSBGSUxFX0R1cFVuaXhIYW5kbGUoIDAgKTsKKyAgICBwZGItPmVudl9kYi0+aFN0ZG91dCA9IEZJTEVfRHVwVW5peEhhbmRsZSggMSApOworICAgIHBkYi0+ZW52X2RiLT5oU3RkZXJyID0gRklMRV9EdXBVbml4SGFuZGxlKCAyICk7CisgICAgRklMRV9TZXRGaWxlVHlwZSggcGRiLT5lbnZfZGItPmhTdGRpbiwgIEZJTEVfVFlQRV9DSEFSICk7CisgICAgRklMRV9TZXRGaWxlVHlwZSggcGRiLT5lbnZfZGItPmhTdGRvdXQsIEZJTEVfVFlQRV9DSEFSICk7CisgICAgRklMRV9TZXRGaWxlVHlwZSggcGRiLT5lbnZfZGItPmhTdGRlcnIsIEZJTEVfVFlQRV9DSEFSICk7CisKKyAgICAvKiBCdWlsZCB0aGUgZW52aXJvbm1lbnQgc3RyaW5ncyAqLworCisgICAgcmV0dXJuIEVOVl9CdWlsZEVudmlyb25tZW50KCBwZGIgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBQUk9DRVNTX0luaGVyaXRFbnZEQgorICovCitzdGF0aWMgQk9PTDMyIFBST0NFU1NfSW5oZXJpdEVudkRCKCBQREIzMiAqcGRiLCBMUENTVFIgY21kX2xpbmUsIExQQ1NUUiBlbnYgKQoreworICAgIGlmICghKHBkYi0+ZW52X2RiID0gSGVhcEFsbG9jKHBkYi0+aGVhcCwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKEVOVkRCKSkpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiggJnBkYi0+ZW52X2RiLT5zZWN0aW9uICk7CisKKyAgICAvKiBDb3B5IHRoZSBwYXJlbnQgZW52aXJvbm1lbnQgKi8KKworICAgIGlmICghRU5WX0luaGVyaXRFbnZpcm9ubWVudCggcGRiLCBlbnYgKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgLyogQ29weSB0aGUgY29tbWFuZCBsaW5lICovCi0gICAgLyogRml4bWU6IEhlcmUgd2UgcmVseSBvbiB0aGUgaGFjayB0aGF0IGxvYWRlci9tb2R1bGUuYyBwdXQncyB0aGUgdW5wcm9jZXNzZWQKLSAgICAgICBjb21tYW5kbGluZSBhZnRlciB0aGUgcHJvY2Vzc2VkIG9uZSBpbiBQYXNjYWwgbm90YXRpb24uCi0gICAgICAgV2UgbWF5IGFjY2VzcyBOdWxsIGRhdGEgaWYgd2UgZ2V0IGNhbGxlZCBhbm90aGVyIHdheS4KLSAgICAgICBJZiB3ZSBoYXZlIGEgcmVhbCBDcmVhdGVQcm9jZXNzIHNvbWV0aW1lcywgdGhlIHByb2JsZW0gdG8gZ2V0IGFuIHVucmVzdHJpY3RlZAotICAgICAgIGNvbW1hbmRsaW5lIHdpbGwgZ28gYXdheSBhbmQgd2Ugd29uJ3QgbmVlZCB0aGF0IGhhY2sgYW55IGxvbmdlcgotICAgICAgICovCi0gICAgaWYgKCEocGRiLT5lbnZfZGItPmNtZF9saW5lID0KLQkgIEhFQVBfc3RyZHVwQSggcGRiLT5oZWFwLCAwLCBjbWRfbGluZSArICh1bnNpZ25lZCBjaGFyKWNtZF9saW5lWzBdICsgMikpKQotICAgICAgICBnb3RvIGVycm9yOwotICAgIHJldHVybiBUUlVFOwogCi1lcnJvcjoKLSAgICBpZiAocGRiLT5lbnZfZGItPmNtZF9saW5lKSBIZWFwRnJlZSggcGRiLT5oZWFwLCAwLCBwZGItPmVudl9kYi0+Y21kX2xpbmUgKTsKLSAgICBpZiAoYXJyYXkpIEhlYXBGcmVlKCBwZGItPmhlYXAsIDAsIGFycmF5ICk7Ci0gICAgaWYgKHBkYi0+ZW52X2RiLT5lbnZpcm9uKSBIZWFwRnJlZSggcGRiLT5oZWFwLCAwLCBwZGItPmVudl9kYi0+ZW52aXJvbiApOwotICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIShwZGItPmVudl9kYi0+Y21kX2xpbmUgPSBIRUFQX3N0cmR1cEEoIHBkYi0+aGVhcCwgMCwgY21kX2xpbmUgKSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8qIEluaGVyaXQgdGhlIHN0YW5kYXJkIGhhbmRsZXMgKi8KKyAgICBwZGItPmVudl9kYi0+aFN0ZGluICA9IHBkYi0+cGFyZW50LT5lbnZfZGItPmhTdGRpbjsKKyAgICBwZGItPmVudl9kYi0+aFN0ZG91dCA9IHBkYi0+cGFyZW50LT5lbnZfZGItPmhTdGRvdXQ7CisgICAgcGRiLT5lbnZfZGItPmhTdGRlcnIgPSBwZGItPnBhcmVudC0+ZW52X2RiLT5oU3RkZXJyOworCisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIApAQCAtMTUwLDggKzE1Miw5IEBACiBzdGF0aWMgdm9pZCBQUk9DRVNTX0ZyZWVQREIoIFBEQjMyICpwZGIgKQogewogICAgIHBkYi0+aGVhZGVyLnR5cGUgPSBLMzJPQkpfVU5LTk9XTjsKKyAgICBpZiAocGRiLT5oYW5kbGVfdGFibGUpIEhBTkRMRV9DbG9zZUFsbCggcGRiLCBOVUxMICk7CisgICAgRU5WX0ZyZWVFbnZpcm9ubWVudCggcGRiICk7CiAgICAgaWYgKHBkYi0+aGVhcCAmJiAocGRiLT5oZWFwICE9IHBkYi0+c3lzdGVtX2hlYXApKSBIZWFwRGVzdHJveSggcGRiLT5oZWFwICk7Ci0gICAgaWYgKHBkYi0+aGFuZGxlX3RhYmxlKSBIZWFwRnJlZSggcGRiLT5zeXN0ZW1faGVhcCwgMCwgcGRiLT5oYW5kbGVfdGFibGUgKTsKICAgICBpZiAocGRiLT5sb2FkX2RvbmVfZXZ0KSBLMzJPQkpfRGVjQ291bnQoIHBkYi0+bG9hZF9kb25lX2V2dCApOwogICAgIGlmIChwZGItPmV2ZW50KSBLMzJPQkpfRGVjQ291bnQoIHBkYi0+ZXZlbnQgKTsKICAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24oICZwZGItPmNyaXRfc2VjdGlvbiApOwpAQCAtMTYzLDYgKzE2Niw3IEBACiAgKiAgICAgICAgICAgUFJPQ0VTU19DcmVhdGVQREIKICAqCiAgKiBBbGxvY2F0ZSBhbmQgZmlsbCBhIFBEQiBzdHJ1Y3R1cmUuCisgKiBSdW5zIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwYXJlbnQgcHJvY2Vzcy4KICAqLwogc3RhdGljIFBEQjMyICpQUk9DRVNTX0NyZWF0ZVBEQiggUERCMzIgKnBhcmVudCApCiB7CkBAIC0xODgsOSArMTkyLDEwIEBACiAgICAgaWYgKCEocGRiLT5ldmVudCA9IEVWRU5UX0NyZWF0ZSggVFJVRSwgRkFMU0UgKSkpIGdvdG8gZXJyb3I7CiAgICAgaWYgKCEocGRiLT5sb2FkX2RvbmVfZXZ0ID0gRVZFTlRfQ3JlYXRlKCBUUlVFLCBGQUxTRSApKSkgZ290byBlcnJvcjsKIAotICAgIC8qIEFsbG9jYXRlIHRoZSBoYW5kbGUgdGFibGUgKi8KKyAgICAvKiBDcmVhdGUgdGhlIGhhbmRsZSB0YWJsZSAqLwogCi0gICAgaWYgKCEocGRiLT5oYW5kbGVfdGFibGUgPSBIQU5ETEVfQWxsb2NUYWJsZSggcGRiICkpKSBnb3RvIGVycm9yOworICAgIGlmICghSEFORExFX0NyZWF0ZVRhYmxlKCBwZGIsIFRSVUUgKSkgZ290byBlcnJvcjsKKwogICAgIHJldHVybiBwZGI7CiAKIGVycm9yOgpAQCAtMjE4LDEwICsyMjMsMTMgQEAKIAogICAgIC8qIENyZWF0ZSB0aGUgaW5pdGlhbCBwcm9jZXNzIGFuZCB0aHJlYWQgc3RydWN0dXJlcyAqLwogICAgIGlmICghKHBkYiA9IFBST0NFU1NfQ3JlYXRlUERCKCBOVUxMICkpKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCEodGhkYiA9IFRIUkVBRF9DcmVhdGUoIHBkYiwgMCwgTlVMTCwgTlVMTCApKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghKHRoZGIgPSBUSFJFQURfQ3JlYXRlKCBwZGIsIDAsIEZBTFNFLCBOVUxMLCBOVUxMICkpKSByZXR1cm4gRkFMU0U7CiAgICAgU0VUX0NVUl9USFJFQUQoIHRoZGIgKTsKICAgICBUSFJFQURfSW5pdERvbmUgPSBUUlVFOwogCisgICAgLyogQ3JlYXRlIHRoZSBlbnZpcm9ubWVudCBEQiBvZiB0aGUgZmlyc3QgcHJvY2VzcyAqLworICAgIGlmICghUFJPQ0VTU19CdWlsZEVudkRCKCBwZGIgKSkgcmV0dXJuIEZBTFNFOworCiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTIzMSwxNCArMjM5LDE2IEBACiAgKgogICogQ3JlYXRlIGEgbmV3IHByb2Nlc3MgZGF0YWJhc2UgYW5kIGFzc29jaWF0ZWQgaW5mby4KICAqLwotUERCMzIgKlBST0NFU1NfQ3JlYXRlKCBUREIgKnBUYXNrLCBMUENTVFIgY21kX2xpbmUgKQorUERCMzIgKlBST0NFU1NfQ3JlYXRlKCBORV9NT0RVTEUgKnBNb2R1bGUsIExQQ1NUUiBjbWRfbGluZSwgTFBDU1RSIGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgSElOU1RBTkNFMTYgaEluc3RhbmNlLCBISU5TVEFOQ0UxNiBoUHJldkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgY21kU2hvdyApCiB7CiAgICAgRFdPUkQgc2l6ZSwgY29tbWl0OwotICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKLSAgICBQREIzMiAqcGRiID0gUFJPQ0VTU19DcmVhdGVQREIoIFBST0NFU1NfQ3VycmVudCgpICk7CisgICAgVEhEQiAqdGhkYiA9IE5VTEw7CisgICAgUERCMzIgKnBhcmVudCA9IFBST0NFU1NfQ3VycmVudCgpOworICAgIFBEQjMyICpwZGIgPSBQUk9DRVNTX0NyZWF0ZVBEQiggcGFyZW50ICk7CiAKICAgICBpZiAoIXBkYikgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIHBUYXNrLT5oTW9kdWxlICkpKSByZXR1cm4gMDsKIAogICAgIC8qIENyZWF0ZSB0aGUgaGVhcCAqLwogCkBAIC0yNTUsMTIgKzI2NSwyNyBAQAogICAgIGlmICghKHBkYi0+aGVhcCA9IEhlYXBDcmVhdGUoIEhFQVBfR1JPV0FCTEUsIHNpemUsIGNvbW1pdCApKSkgZ290byBlcnJvcjsKICAgICBwZGItPmhlYXBfbGlzdCA9IHBkYi0+aGVhcDsKIAotICAgIGlmICghKHBkYi0+ZW52X2RiID0gSGVhcEFsbG9jKHBkYi0+aGVhcCwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKEVOVkRCKSkpKQotICAgICAgICBnb3RvIGVycm9yOwotICAgIGlmICghUFJPQ0VTU19GaWxsRW52REIoIHBkYiwgcFRhc2ssIGNtZF9saW5lICkpIGdvdG8gZXJyb3I7CisgICAgLyogSW5oZXJpdCB0aGUgZW52IERCIGZyb20gdGhlIHBhcmVudCAqLworCisgICAgaWYgKCFQUk9DRVNTX0luaGVyaXRFbnZEQiggcGRiLCBjbWRfbGluZSwgZW52ICkpIGdvdG8gZXJyb3I7CisKKyAgICAvKiBDcmVhdGUgdGhlIG1haW4gdGhyZWFkICovCisKKyAgICBpZiAocE1vZHVsZS0+bW9kdWxlMzIpCisgICAgICAgIHNpemUgPSBQRV9IRUFERVIocE1vZHVsZS0+bW9kdWxlMzIpLT5PcHRpb25hbEhlYWRlci5TaXplT2ZTdGFja1Jlc2VydmU7CisgICAgZWxzZQorICAgICAgICBzaXplID0gMDsKKyAgICBpZiAoISh0aGRiID0gVEhSRUFEX0NyZWF0ZSggcGRiLCBzaXplLCBGQUxTRSwgTlVMTCwgTlVMTCApKSkgZ290byBlcnJvcjsKKworICAgIC8qIENyZWF0ZSBhIFdpbjE2IHRhc2sgZm9yIHRoaXMgcHJvY2VzcyAqLworCisgICAgcGRiLT50YXNrID0gVEFTS19DcmVhdGUoIHRoZGIsIHBNb2R1bGUsIGhJbnN0YW5jZSwgaFByZXZJbnN0YW5jZSwgY21kU2hvdyk7CisgICAgaWYgKCFwZGItPnRhc2spIGdvdG8gZXJyb3I7CisKICAgICByZXR1cm4gcGRiOwogCiBlcnJvcjoKKyAgICBpZiAodGhkYikgSzMyT0JKX0RlY0NvdW50KCAmdGhkYi0+aGVhZGVyICk7CiAgICAgUFJPQ0VTU19GcmVlUERCKCBwZGIgKTsKICAgICByZXR1cm4gTlVMTDsKIH0KQEAgLTMxNSw0MCArMzQwLDE1IEBACiAgICAgcmV0dXJuIEszMk9CSl9PUFMoIHBkYi0+ZXZlbnQgKS0+cmVtb3ZlX3dhaXQoIHBkYi0+ZXZlbnQsIHRocmVhZF9pZCApOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQlQUk9DRVNTX0Nsb3NlT2JqSGFuZGxlcwotICoKLSAqCWNsb3NlcyBhbGwgaGFuZGxlcyB0aGF0IHJlZmVyZW5jZSAicHRyIgotICogbm90ZTogbmVlZCB0byBhZGQgMSB0byB0aGUgYXJyYXkgZW50cnkgdG8gZ2V0IHRvIHdoYXQKLSAqIENsb3NlSGFuZGxlIGV4cGVjdHMgKHRoZXJlIGlzIG5vIHplcm8gaGFuZGxlKQotICovCi12b2lkIFBST0NFU1NfQ2xvc2VPYmpIYW5kbGVzKFBEQjMyICpwZGIsIEszMk9CSiAqcHRyKQotewotCUhBTkRMRTMyIGhhbmRsZTsKLQotCWFzc2VydCggcGRiLT5oZWFkZXIudHlwZSA9PSBLMzJPQkpfUFJPQ0VTUyApOwotCi0JLyogQ2xvc2UgYWxsIGhhbmRsZXMgdGhhdCBoYXZlIGEgcG9pbnRlciB0byBwdHIgKi8KLQlmb3IgKGhhbmRsZSA9IDA7IGhhbmRsZSA8IHBkYi0+aGFuZGxlX3RhYmxlLT5jb3VudDsgaGFuZGxlKyspCi0JCWlmIChwZGItPmhhbmRsZV90YWJsZS0+ZW50cmllc1toYW5kbGVdLnB0ciA9PSBwdHIpIAotCQkJQ2xvc2VIYW5kbGUoIGhhbmRsZSsxICk7Ci19CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFBST0NFU1NfRGVzdHJveQotICogbm90ZTogbmVlZCB0byBhZGQgMSB0byB0aGUgYXJyYXkgZW50cnkgdG8gZ2V0IHRvIHdoYXQKLSAqIENsb3NlSGFuZGxlIGV4cGVjdHMgKHRoZXJlIGlzIG5vIHplcm8gaGFuZGxlKQogICovCiBzdGF0aWMgdm9pZCBQUk9DRVNTX0Rlc3Ryb3koIEszMk9CSiAqcHRyICkKIHsKICAgICBQREIzMiAqcGRiID0gKFBEQjMyICopcHRyOwotICAgIEhBTkRMRTMyIGhhbmRsZTsKICAgICBhc3NlcnQoIHB0ci0+dHlwZSA9PSBLMzJPQkpfUFJPQ0VTUyApOwogCi0gICAgLyogQ2xvc2UgYWxsIGhhbmRsZXMgKi8KLSAgICBmb3IgKGhhbmRsZSA9IDA7IGhhbmRsZSA8IHBkYi0+aGFuZGxlX3RhYmxlLT5jb3VudDsgaGFuZGxlKyspCi0gICAgICAgIGlmIChwZGItPmhhbmRsZV90YWJsZS0+ZW50cmllc1toYW5kbGVdLnB0cikgQ2xvc2VIYW5kbGUoIGhhbmRsZSsxICk7Ci0KICAgICAvKiBGcmVlIGV2ZXJ5dGhpbmcgKi8KIAogICAgIHB0ci0+dHlwZSA9IEszMk9CSl9VTktOT1dOOwpAQCAtMzk1LDcgKzM5NSw3IEBACiAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9IQU5ETEUgKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHJldHVybiBIQU5ETEVfQWxsb2MoICZwZGItPmhlYWRlciwgYWNjZXNzLCBpbmhlcml0ICk7CisgICAgcmV0dXJuIEhBTkRMRV9BbGxvYyggUFJPQ0VTU19DdXJyZW50KCksICZwZGItPmhlYWRlciwgYWNjZXNzLCBpbmhlcml0ICk7CiB9CQkJICAgICAgCiAKIApAQCAtNDEwLDI3OCArNDEwLDYgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgR2V0RW52aXJvbm1lbnRTdHJpbmdzMzJBICAgKEtFUk5FTDMyLjIxMCkgKEtFUk5FTDMyLjIxMSkKLSAqLwotTFBTVFIgV0lOQVBJIEdldEVudmlyb25tZW50U3RyaW5nczMyQSh2b2lkKQotewotICAgIFBEQjMyICpwZGIgPSBQUk9DRVNTX0N1cnJlbnQoKTsKLSAgICByZXR1cm4gcGRiLT5lbnZfZGItPmVudmlyb247Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgIEdldEVudmlyb25tZW50U3RyaW5nczMyVyAgIChLRVJORUwzMi4yMTIpCi0gKi8KLUxQV1NUUiBXSU5BUEkgR2V0RW52aXJvbm1lbnRTdHJpbmdzMzJXKHZvaWQpCi17Ci0gICAgSU5UMzIgc2l6ZTsKLSAgICBMUFdTVFIgcmV0LCBwVzsKLSAgICBMUFNUUiBwQTsKLSAgICBQREIzMiAqcGRiID0gUFJPQ0VTU19DdXJyZW50KCk7Ci0KLSAgICBzaXplID0gSGVhcFNpemUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHBkYi0+ZW52X2RiLT5lbnZpcm9uICk7Ci0gICAgaWYgKCEocmV0ID0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplICogc2l6ZW9mKFdDSEFSKSApKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcEEgPSBwZGItPmVudl9kYi0+ZW52aXJvbjsKLSAgICBwVyA9IHJldDsKLSAgICB3aGlsZSAoKnBBKQotICAgIHsKLSAgICAgICAgbHN0cmNweUF0b1coIHBXLCBwQSApOwotICAgICAgICBzaXplID0gc3RybGVuKHBBKTsKLSAgICAgICAgcEEgKz0gc2l6ZSArIDE7Ci0gICAgICAgIHBXICs9IHNpemUgKyAxOwotICAgIH0KLSAgICAqcFcgPSAwOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRnJlZUVudmlyb25tZW50U3RyaW5nczMyQSAgIChLRVJORUwzMi4xNDEpCi0gKi8KLUJPT0wzMiBXSU5BUEkgRnJlZUVudmlyb25tZW50U3RyaW5nczMyQSggTFBTVFIgcHRyICkKLXsKLSAgICBQREIzMiAqcGRiID0gUFJPQ0VTU19DdXJyZW50KCk7Ci0gICAgaWYgKHB0ciAhPSBwZGItPmVudl9kYi0+ZW52aXJvbikKLSAgICB7Ci0gICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBGcmVlRW52aXJvbm1lbnRTdHJpbmdzMzJXICAgKEtFUk5FTDMyLjE0MikKLSAqLwotQk9PTDMyIFdJTkFQSSBGcmVlRW52aXJvbm1lbnRTdHJpbmdzMzJXKCBMUFdTVFIgcHRyICkKLXsKLSAgICByZXR1cm4gSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHB0ciApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgR2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyQSAgIChLRVJORUwzMi4yMTMpCi0gKi8KLURXT1JEIFdJTkFQSSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJBKCBMUENTVFIgbmFtZSwgTFBTVFIgdmFsdWUsIERXT1JEIHNpemUgKQotewotICAgIExQU1RSIHA7Ci0gICAgSU5UMzIgbGVuLCByZXM7Ci0KLSAgICBwID0gUFJPQ0VTU19DdXJyZW50KCktPmVudl9kYi0+ZW52aXJvbjsKLSAgICBpZiAoIW5hbWUgfHwgISpuYW1lKQotICAgIHsKLSAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiApOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgbGVuID0gc3RybGVuKG5hbWUpOwotICAgIHdoaWxlICgqcCkKLSAgICB7Ci0gICAgICAgIHJlcyA9IGxzdHJuY21waTMyQSggbmFtZSwgcCwgbGVuICk7Ci0gICAgICAgIGlmIChyZXMgPCAwKSBnb3RvIG5vdF9mb3VuZDsKLSAgICAgICAgaWYgKCFyZXMgJiYgKHBbbGVuXSA9PSAnPScpKSBicmVhazsKLSAgICAgICAgcCArPSBzdHJsZW4ocCkgKyAxOwotICAgIH0KLSAgICBpZiAoISpwKSBnb3RvIG5vdF9mb3VuZDsKLSAgICBpZiAodmFsdWUpIGxzdHJjcHluMzJBKCB2YWx1ZSwgcCArIGxlbiArIDEsIHNpemUgKTsKLSAgICBsZW4gPSBzdHJsZW4ocCk7Ci0gICAgLyogQWNjb3JkaW5nIHRvIHRoZSBXaW4zMiBkb2NzLCBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20sIHJldHVybgotICAgICAqIHRoZSBzaXplIHJlcXVpcmVkIHRvIGhvbGQgdGhlIHN0cmluZyBwbHVzIHRoZSB0ZXJtaW5hdGluZyBudWxsCi0gICAgICovCi0gICAgaWYgKHNpemUgPD0gbGVuKSBsZW4rKzsKLSAgICByZXR1cm4gbGVuOwotCQotbm90X2ZvdW5kOgotICAgIHJldHVybiAwOyAgLyogRklYTUU6IFNldExhc3RFcnJvciAqLwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldEVudmlyb25tZW50VmFyaWFibGUzMlcgICAoS0VSTkVMMzIuMjE0KQotICovCi1EV09SRCBXSU5BUEkgR2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyVyggTFBDV1NUUiBuYW1lVywgTFBXU1RSIHZhbFcsIERXT1JEIHNpemUpCi17Ci0gICAgTFBTVFIgbmFtZSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmFtZVcgKTsKLSAgICBMUFNUUiB2YWwgID0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplICk7Ci0gICAgRFdPUkQgcmVzICA9IEdldEVudmlyb25tZW50VmFyaWFibGUzMkEoIG5hbWUsIHZhbCwgc2l6ZSApOwotICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuYW1lICk7Ci0gICAgaWYgKHZhbFcpIGxzdHJjcHluQXRvVyggdmFsVywgdmFsLCBzaXplICk7Ci0gICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHZhbCApOwotICAgIHJldHVybiByZXM7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyQSAgIChLRVJORUwzMi40ODQpCi0gKi8KLUJPT0wzMiBXSU5BUEkgU2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyQSggTFBDU1RSIG5hbWUsIExQQ1NUUiB2YWx1ZSApCi17Ci0gICAgSU5UMzIgc2l6ZSwgbGVuLCByZXM7Ci0gICAgTFBTVFIgcCwgZW52LCBuZXdfZW52OwotICAgIFBEQjMyICpwZGIgPSBQUk9DRVNTX0N1cnJlbnQoKTsKLQotICAgIGVudiA9IHAgPSBwZGItPmVudl9kYi0+ZW52aXJvbjsKLQotICAgIC8qIEZpbmQgYSBwbGFjZSB0byBpbnNlcnQgdGhlIHN0cmluZyAqLwotCi0gICAgcmVzID0gLTE7Ci0gICAgbGVuID0gc3RybGVuKG5hbWUpOwotICAgIHdoaWxlICgqcCkKLSAgICB7Ci0gICAgICAgIHJlcyA9IGxzdHJuY21waTMyQSggbmFtZSwgcCwgbGVuICk7Ci0gICAgICAgIGlmIChyZXMgPCAwKSBicmVhazsKLSAgICAgICAgaWYgKCFyZXMgJiYgKHBbbGVuXSA9PSAnPScpKSBicmVhazsKLSAgICAgICAgcmVzID0gMTsKLSAgICAgICAgcCArPSBzdHJsZW4ocCkgKyAxOwotICAgIH0KLSAgICBpZiAoIXZhbHVlICYmIHJlcykgIC8qIFZhbHVlIHRvIHJlbW92ZSBkb2Vzbid0IGV4aXN0IGFscmVhZHkgKi8KLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgLyogUmVhbGxvYyB0aGUgYnVmZmVyICovCi0KLSAgICBsZW4gPSB2YWx1ZSA/IHN0cmxlbihuYW1lKSArIHN0cmxlbih2YWx1ZSkgKyAyIDogMDsKLSAgICBpZiAoIXJlcykgbGVuIC09IHN0cmxlbihwKSArIDE7ICAvKiBUaGUgbmFtZSBhbHJlYWR5IGV4aXN0cyAqLwotICAgIHNpemUgPSBwZGItPmVudl9kYi0+ZW52X3NpemUgKyBsZW47Ci0gICAgaWYgKGxlbiA8IDApCi0gICAgewotICAgICAgICBMUFNUUiBuZXh0ID0gcCArIHN0cmxlbihwKSArIDE7Ci0gICAgICAgIG1lbW1vdmUoIG5leHQgKyBsZW4sIG5leHQsIHBkYi0+ZW52X2RiLT5lbnZfc2l6ZSAtIChuZXh0IC0gZW52KSApOwotICAgIH0KLSAgICBpZiAoIShuZXdfZW52ID0gSGVhcFJlQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIGVudiwgc2l6ZSApKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHAgPSBuZXdfZW52ICsgKHAgLSBlbnYpOwotICAgIGlmIChsZW4gPiAwKSBtZW1tb3ZlKCBwICsgbGVuLCBwLCBwZGItPmVudl9kYi0+ZW52X3NpemUgLSAocC1uZXdfZW52KSApOwotCi0gICAgLyogU2V0IHRoZSBuZXcgc3RyaW5nICovCi0KLSAgICBpZiAodmFsdWUpCi0gICAgewotICAgICAgICBzdHJjcHkoIHAsIG5hbWUgKTsKLSAgICAgICAgc3RyY2F0KCBwLCAiPSIgKTsKLSAgICAgICAgc3RyY2F0KCBwLCB2YWx1ZSApOwotICAgIH0KLSAgICBwZGItPmVudl9kYi0+ZW52X3NpemUgPSBzaXplOwotICAgIHBkYi0+ZW52X2RiLT5lbnZpcm9uICA9IG5ld19lbnY7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyVyAgIChLRVJORUwzMi40ODUpCi0gKi8KLUJPT0wzMiBXSU5BUEkgU2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyVyggTFBDV1NUUiBuYW1lLCBMUENXU1RSIHZhbHVlICkKLXsKLSAgICBMUFNUUiBuYW1lQSAgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIG5hbWUgKTsKLSAgICBMUFNUUiB2YWx1ZUEgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHZhbHVlICk7Ci0gICAgQk9PTDMyIHJldCA9IFNldEVudmlyb25tZW50VmFyaWFibGUzMkEoIG5hbWVBLCB2YWx1ZUEgKTsKLSAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmFtZUEgKTsKLSAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdmFsdWVBICk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBFeHBhbmRFbnZpcm9ubWVudFZhcmlhYmxlc0EgICAoS0VSTkVMMzIuMTAzKQotICovCi1EV09SRCBXSU5BUEkgRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzMzJBKCBMUENTVFIgc3JjLCBMUFNUUiBkc3QsIERXT1JEIGxlbikKLXsKLQlMUENTVFIgczsKLSAgICAgICAgTFBTVFIgZDsKLQlIQU5ETEUzMgloZWFwID0gR2V0UHJvY2Vzc0hlYXAoKTsKLQlMUFNUUgkJeGRzdCA9IEhlYXBBbGxvYyhoZWFwLDAsMTApOwotCURXT1JECQljdXJzaXplID0gMTA7Ci0JRFdPUkQJCXJldDsKLQotCWZwcmludGYoc3RkZXJyLCJFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MzMkEoJXMpXG4iLHNyYyk7Ci0Jcz1zcmM7Ci0JZD14ZHN0OwotCW1lbXNldChkc3QsJ1wwJyxsZW4pOwotI2RlZmluZSBDSEVDS19GUkVFKG4pICB7CQkJCVwKLQlEV09SRAlfbmVlZGVkID0gKG4pOwkJCQlcCi0JCQkJCQkJXAotCXdoaWxlIChjdXJzaXplLShkLXhkc3QpPF9uZWVkZWQpIHsJCVwKLQkJRFdPUkQJaW5kID0gZC14ZHN0OwkJCVwKLQkJCQkJCQlcCi0JCWN1cnNpemUrPTEwMDsJCQkJXAotCQl4ZHN0PShMUFNUUilIZWFwUmVBbGxvYyhoZWFwLDAseGRzdCxjdXJzaXplKTtcCi0JCWQgPSB4ZHN0K2luZDsJCQkJXAotCX0JCQkJCQlcCi19Ci0KLQl3aGlsZSAoKnMpIHsKLQkJaWYgKCpzPT0nJScpIHsKLQkJCUxQQ1NUUiBlbmQ7Ci0KLQkJCWVuZCA9IHM7ZG8geyBlbmQrKzsgfSB3aGlsZSAoKmVuZCAmJiAqZW5kIT0nJScpOwotCQkJaWYgKCplbmQ9PSclJykgewotCQkJCUxQU1RSCXggPSBIZWFwQWxsb2MoaGVhcCwwLGVuZC1zKzEpOwotCQkJCWNoYXIJYnVmWzJdOwotCi0JCQkJbHN0cmNweW4zMkEoeCxzKzEsZW5kLXMpOwotCQkJCXhbZW5kLXNdPTA7Ci0KLQkJCQkvKiBwdXQgZXhwYW5kZWQgdmFyaWFibGUgZGlyZWN0bHkgaW50byAKLQkJCQkgKiBkZXN0aW5hdGlvbiBzdHJpbmcsIHNvIHdlIGRvbid0IGhhdmUKLQkJCQkgKiB0byB1c2UgdGVtcG9yYXJ5IGJ1ZmZlcnMuCi0JCQkJICovCi0JCQkJcmV0ID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyQSh4LGJ1ZiwyKTsKLQkJCQlDSEVDS19GUkVFKHJldCsyKTsKLQkJCQlyZXQgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJBKHgsZCxjdXJzaXplLShkLXhkc3QpKTsKLQkJCQlpZiAocmV0KSB7Ci0JCQkJCWQrPXN0cmxlbihkKTsKLQkJCQkJcz1lbmQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQ0hFQ0tfRlJFRShzdHJsZW4oeCkrMik7Ci0JCQkJCSpkKys9JyUnOwotCQkJCQlsc3RyY3B5MzJBKGQseCk7Ci0JCQkJCWQrPXN0cmxlbih4KTsKLQkJCQkJKmQrKz0nJSc7Ci0JCQkJfQotCQkJCUhlYXBGcmVlKGhlYXAsMCx4KTsKLQkJCX0gZWxzZQotCQkJCSpkKys9KnM7Ci0KLQkJCXMrKzsKLQkJfSBlbHNlIHsKLQkJCUNIRUNLX0ZSRUUoMSk7Ci0JCQkqZCsrPSpzKys7Ci0JCX0KLQl9Ci0JKmQJPSAnXDAnOwotCXJldAk9IGxzdHJsZW4zMkEoeGRzdCkrMTsKLQlpZiAoZC14ZHN0PGxlbikKLQkJbHN0cmNweTMyQShkc3QseGRzdCk7Ci0JSGVhcEZyZWUoaGVhcCwwLHhkc3QpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEV4cGFuZEVudmlyb25tZW50VmFyaWFibGVzQSAgIChLRVJORUwzMi4xMDQpCi0gKi8KLURXT1JEIFdJTkFQSSBFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MzMlcoIExQQ1dTVFIgc3JjLCBMUFdTVFIgZHN0LCBEV09SRCBsZW4pCi17Ci0JSEFORExFMzIJaGVhcCA9IEdldFByb2Nlc3NIZWFwKCk7Ci0JTFBTVFIJCXNyY0EgPSBIRUFQX3N0cmR1cFd0b0EoaGVhcCwwLHNyYyk7Ci0JTFBTVFIJCWRzdEEgPSBIZWFwQWxsb2MoaGVhcCwwLGxlbik7Ci0JRFdPUkQJCXJldCA9IEV4cGFuZEVudmlyb25tZW50U3RyaW5nczMyQShzcmNBLGRzdEEsbGVuKTsKLQotCWxzdHJjcHlBdG9XKGRzdCxkc3RBKTsKLQlIZWFwRnJlZShoZWFwLDAsZHN0QSk7Ci0JSGVhcEZyZWUoaGVhcCwwLHNyY0EpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldFByb2Nlc3NIZWFwICAgIChLRVJORUwzMi4yNTkpCiAgKi8KIEhBTkRMRTMyIFdJTkFQSSBHZXRQcm9jZXNzSGVhcCh2b2lkKQpAQCAtOTEwLDcgKzYzOCw3IEBACiAgKiBGSVhNRTogY2hlY2sgdGhpcywgaWYgd2UgZXZlciBydW4gd2luMzIgYmluYXJpZXMgaW4gZGlmZmVyZW50IGFkZHJlc3NzcGFjZXMKICAqCSAgLi4uIGFuZCBhZGQgYSBzaXplY2hlY2sKICAqLwotQk9PTDMyIFdJTkFQSSBXcml0ZVByb2Nlc3NNZW1vcnkoSEFORExFMzIgaFByb2Nlc3MsIExQQ1ZPSUQgbHBCYXNlQWRkcmVzcywKK0JPT0wzMiBXSU5BUEkgV3JpdGVQcm9jZXNzTWVtb3J5KEhBTkRMRTMyIGhQcm9jZXNzLCBMUFZPSUQgbHBCYXNlQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscEJ1ZmZlciwgRFdPUkQgblNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwTnVtYmVyT2ZCeXRlc1dyaXR0ZW4gKQogewpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3NlbWFwaG9yZS5jIGIvc2NoZWR1bGVyL3NlbWFwaG9yZS5jCmluZGV4IDM2MWJmMWYuLmE0NTZlYmYgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9zZW1hcGhvcmUuYworKysgYi9zY2hlZHVsZXIvc2VtYXBob3JlLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAogICAgIFNZU1RFTV9MT0NLKCk7CiAgICAgc2VtID0gKFNFTUFQSE9SRSAqKUszMk9CSl9DcmVhdGUoIEszMk9CSl9TRU1BUEhPUkUsIHNpemVvZigqc2VtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgU0VNQVBIT1JFX0FMTF9BQ0NFU1MsICZoYW5kbGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgU0VNQVBIT1JFX0FMTF9BQ0NFU1MsIHNhLCAmaGFuZGxlKTsKICAgICBpZiAoc2VtKQogICAgIHsKICAgICAgICAgLyogRmluaXNoIGluaXRpYWxpemluZyBpdCAqLwpAQCAtOTQsNyArOTQsNyBAQAogICAgIFNZU1RFTV9MT0NLKCk7CiAgICAgaWYgKChvYmogPSBLMzJPQkpfRmluZE5hbWVUeXBlKCBuYW1lLCBLMzJPQkpfU0VNQVBIT1JFICkpICE9IE5VTEwpCiAgICAgewotICAgICAgICBoYW5kbGUgPSBIQU5ETEVfQWxsb2MoIG9iaiwgYWNjZXNzLCBpbmhlcml0ICk7CisgICAgICAgIGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggUFJPQ0VTU19DdXJyZW50KCksIG9iaiwgYWNjZXNzLCBpbmhlcml0ICk7CiAgICAgICAgIEszMk9CSl9EZWNDb3VudCggb2JqICk7CiAgICAgfQogICAgIFNZU1RFTV9VTkxPQ0soKTsKQEAgLTEyMiw3ICsxMjIsOCBAQAogICAgIFNFTUFQSE9SRSAqc2VtOwogCiAgICAgU1lTVEVNX0xPQ0soKTsKLSAgICBpZiAoIShzZW0gPSAoU0VNQVBIT1JFICopSEFORExFX0dldE9ialB0ciggaGFuZGxlLCBLMzJPQkpfU0VNQVBIT1JFLAorICAgIGlmICghKHNlbSA9IChTRU1BUEhPUkUgKilIQU5ETEVfR2V0T2JqUHRyKCBQUk9DRVNTX0N1cnJlbnQoKSwgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLMzJPQkpfU0VNQVBIT1JFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRU1BUEhPUkVfTU9ESUZZX1NUQVRFICkpKQogICAgIHsKICAgICAgICAgU1lTVEVNX1VOTE9DSygpOwpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3N5bmNocm8uYyBiL3NjaGVkdWxlci9zeW5jaHJvLmMKaW5kZXggMmE4MmE0MS4uMDIyMDUwMyAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL3N5bmNocm8uYworKysgYi9zY2hlZHVsZXIvc3luY2hyby5jCkBAIC0zMSw4ICszMSw4IEBACiAgICAgU1lTVEVNX0xPQ0soKTsKICAgICBmb3IgKGkgPSAwLCBwdHIgPSB3YWl0LT5vYmpzOyBpIDwgY291bnQ7IGkrKywgcHRyKyspCiAgICAgewotICAgICAgICBpZiAoISgqcHRyID0gSEFORExFX0dldE9ialB0ciggaGFuZGxlc1tpXSwgSzMyT0JKX1VOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWU5DSFJPTklaRSApKSkKKyAgICAgICAgaWYgKCEoKnB0ciA9IEhBTkRMRV9HZXRPYmpQdHIoIFBST0NFU1NfQ3VycmVudCgpLCBoYW5kbGVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX1VOS05PV04sIFNZTkNIUk9OSVpFICkpKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGlmICghSzMyT0JKX09QUyggKnB0ciApLT5zaWduYWxlZCkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3RocmVhZC5jIGIvc2NoZWR1bGVyL3RocmVhZC5jCmluZGV4IDg3NzRiODMuLjVlMDY1ZmYgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci90aHJlYWQuYworKysgYi9zY2hlZHVsZXIvdGhyZWFkLmMKQEAgLTM4LDYgKzM4LDggQEAKICAgICBUSFJFQURfRGVzdHJveSAgICAgIC8qIGRlc3Ryb3kgKi8KIH07CiAKKy8qIFRoZSBwc2V1ZG9oYW5kbGUgdXNlZCBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLCBzZWUgR2V0Q3VycmVudFRocmVhZCAqLworI2RlZmluZSBDVVJSRU5UX1RIUkVBRF9QU0VVRE9IQU5ETEUgMHhmZmZmZmZmZQogCiAvKiBJcyB0aHJlYWRpbmcgY29kZSBpbml0aWFsaXplZD8gKi8KIEJPT0wzMiBUSFJFQURfSW5pdERvbmUgPSBGQUxTRTsKQEAgLTUyLDEyICs1NCwxMyBAQAogewogICAgIFRIREIgKnRocmVhZDsKIAotICAgIGlmIChoYW5kbGUgPT0gMHhmZmZmZmZmZSkgIC8qIFNlbGYtdGhyZWFkIGhhbmRsZSAqLworICAgIGlmIChoYW5kbGUgPT0gQ1VSUkVOVF9USFJFQURfUFNFVURPSEFORExFKSAgLyogU2VsZi10aHJlYWQgaGFuZGxlICovCiAgICAgewogICAgICAgICB0aHJlYWQgPSBUSFJFQURfQ3VycmVudCgpOwogICAgICAgICBLMzJPQkpfSW5jQ291bnQoICZ0aHJlYWQtPmhlYWRlciApOwogICAgIH0KLSAgICBlbHNlIHRocmVhZCA9IChUSERCICopSEFORExFX0dldE9ialB0ciggaGFuZGxlLCBLMzJPQkpfVEhSRUFELCBhY2Nlc3MgKTsKKyAgICBlbHNlIHRocmVhZCA9IChUSERCICopSEFORExFX0dldE9ialB0ciggUFJPQ0VTU19DdXJyZW50KCksIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX1RIUkVBRCwgYWNjZXNzICk7CiAgICAgcmV0dXJuIHRocmVhZDsKIH0KIApAQCAtMTMwLDcgKzEzMyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBUSFJFQURfQ3JlYXRlCiAgKi8KLVRIREIgKlRIUkVBRF9DcmVhdGUoIFBEQjMyICpwZGIsIERXT1JEIHN0YWNrX3NpemUsCitUSERCICpUSFJFQURfQ3JlYXRlKCBQREIzMiAqcGRiLCBEV09SRCBzdGFja19zaXplLCBCT09MMzIgYWxsb2Nfc3RhY2sxNiwKICAgICAgICAgICAgICAgICAgICAgIExQVEhSRUFEX1NUQVJUX1JPVVRJTkUgc3RhcnRfYWRkciwgTFBWT0lEIHBhcmFtICkKIHsKICAgICBEV09SRCBvbGRfcHJvdDsKQEAgLTE0Myw3ICsxNDYsNiBAQAogICAgIHRoZGItPnByb2Nlc3MgICAgICAgICA9IHBkYjsKICAgICB0aGRiLT50ZWIuZXhjZXB0ICAgICAgPSAodm9pZCAqKS0xOwogICAgIHRoZGItPnRlYi5odGFzazE2ICAgICA9IDA7IC8qIEZJWE1FICovCi0gICAgdGhkYi0+dGViLnN0YWNrX3NlbCAgID0gMDsgLyogRklYTUUgKi8KICAgICB0aGRiLT50ZWIuc2VsZiAgICAgICAgPSAmdGhkYi0+dGViOwogICAgIHRoZGItPnRlYi50bHNfcHRyICAgICA9IHRoZGItPnRsc19hcnJheTsKICAgICB0aGRiLT50ZWIucHJvY2VzcyAgICAgPSBwZGI7CkBAIC0xNjYsOCArMTY4LDkgQEAKICAgICAJc3RhY2tfc2l6ZSA9IDEwMjQgKiAxMDI0OwogICAgIGlmIChzdGFja19zaXplID49IDE2KjEwMjQqMTAyNCkKICAgICAJZnByaW50ZihzdGRlcnIsIldhcm5pbmc6VGhyZWFkIHN0YWNrIHNpemUgaXMgJWxkIE1CLlxuIixzdGFja19zaXplLzEwMjQvMTAyNCk7Ci0gICAgdGhkYi0+c3RhY2tfYmFzZSA9IFZpcnR1YWxBbGxvYyggTlVMTCwgc3RhY2tfc2l6ZSwgTUVNX0NPTU1JVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX0VYRUNVVEVfUkVBRFdSSVRFICk7CisgICAgdGhkYi0+c3RhY2tfYmFzZSA9IFZpcnR1YWxBbGxvYyhOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tfc2l6ZSArIChhbGxvY19zdGFjazE2ID8gMHgxMDAwMCA6IDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVNX0NPTU1JVCwgUEFHRV9FWEVDVVRFX1JFQURXUklURSApOwogICAgIGlmICghdGhkYi0+c3RhY2tfYmFzZSkgZ290byBlcnJvcjsKICAgICAvKiBTZXQgYSBndWFyZCBwYWdlIGF0IHRoZSBib3R0b20gb2YgdGhlIHN0YWNrICovCiAgICAgVmlydHVhbFByb3RlY3QoIHRoZGItPnN0YWNrX2Jhc2UsIDEsIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUgfCBQQUdFX0dVQVJELApAQCAtMTgyLDYgKzE4NSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCBGQUxTRSApOwogICAgIGlmICghdGhkYi0+dGViX3NlbCkgZ290byBlcnJvcjsKIAorICAgIC8qIEFsbG9jYXRlIHRoZSAxNi1iaXQgc3RhY2sgc2VsZWN0b3IgKi8KKworICAgIGlmIChhbGxvY19zdGFjazE2KQorICAgIHsKKyAgICAgICAgdGhkYi0+dGViLnN0YWNrX3NlbCA9IFNFTEVDVE9SX0FsbG9jQmxvY2soIHRoZGItPnRlYi5zdGFja190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwLCBTRUdNRU5UX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgRkFMU0UgKTsKKyAgICAgICAgaWYgKCF0aGRiLT50ZWIuc3RhY2tfc2VsKSBnb3RvIGVycm9yOworICAgICAgICB0aGRiLT5jdXJfc3RhY2sgPSBQVFJfU0VHX09GRl9UT19TRUdQVFIoIHRoZGItPnRlYi5zdGFja19zZWwsIDB4ZmZmYyApOworICAgIH0KKwogICAgIC8qIEFsbG9jYXRlIHRoZSBldmVudCAqLwogCiAgICAgaWYgKCEodGhkYi0+ZXZlbnQgPSBFVkVOVF9DcmVhdGUoIFRSVUUsIEZBTFNFICkpKSBnb3RvIGVycm9yOwpAQCAtMjA0LDYgKzIxOCw3IEBACiAKIGVycm9yOgogICAgIGlmICh0aGRiLT5ldmVudCkgSzMyT0JKX0RlY0NvdW50KCB0aGRiLT5ldmVudCApOworICAgIGlmICh0aGRiLT50ZWIuc3RhY2tfc2VsKSBTRUxFQ1RPUl9GcmVlQmxvY2soIHRoZGItPnRlYi5zdGFja19zZWwsIDEgKTsKICAgICBpZiAodGhkYi0+dGViX3NlbCkgU0VMRUNUT1JfRnJlZUJsb2NrKCB0aGRiLT50ZWJfc2VsLCAxICk7CiAgICAgaWYgKHRoZGItPnN0YWNrX2Jhc2UpIFZpcnR1YWxGcmVlKCB0aGRiLT5zdGFja19iYXNlLCAwLCBNRU1fUkVMRUFTRSApOwogICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCB0aGRiICk7CkBAIC0yODcsNiArMzAyLDcgQEAKICNlbmRpZgogICAgIEszMk9CSl9EZWNDb3VudCggdGhkYi0+ZXZlbnQgKTsKICAgICBTRUxFQ1RPUl9GcmVlQmxvY2soIHRoZGItPnRlYl9zZWwsIDEgKTsKKyAgICBpZiAodGhkYi0+dGViLnN0YWNrX3NlbCkgU0VMRUNUT1JfRnJlZUJsb2NrKCB0aGRiLT50ZWIuc3RhY2tfc2VsLCAxICk7CiAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIHRoZGIgKTsKIAogfQpAQCAtMjk1LDE0ICszMTEsMTggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENyZWF0ZVRocmVhZCAgIChLRVJORUwzMi42MykKICAqLwotSEFORExFMzIgV0lOQVBJIENyZWF0ZVRocmVhZCggTFBTRUNVUklUWV9BVFRSSUJVVEVTIGF0dHJpYnMsIERXT1JEIHN0YWNrLAorSEFORExFMzIgV0lOQVBJIENyZWF0ZVRocmVhZCggU0VDVVJJVFlfQVRUUklCVVRFUyAqc2EsIERXT1JEIHN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSFJFQURfU1RBUlRfUk9VVElORSBzdGFydCwgTFBWT0lEIHBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MsIExQRFdPUkQgaWQgKQogewogICAgIEhBTkRMRTMyIGhhbmRsZTsKLSAgICBUSERCICp0aHJlYWQgPSBUSFJFQURfQ3JlYXRlKCBQUk9DRVNTX0N1cnJlbnQoKSwgc3RhY2ssIHN0YXJ0LCBwYXJhbSApOworICAgIEJPT0wzMiBpbmhlcml0ID0gKHNhICYmIChzYS0+bkxlbmd0aD49c2l6ZW9mKCpzYSkpICYmIHNhLT5iSW5oZXJpdEhhbmRsZSk7CisKKyAgICBUSERCICp0aHJlYWQgPSBUSFJFQURfQ3JlYXRlKCBQUk9DRVNTX0N1cnJlbnQoKSwgc3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgc3RhcnQsIHBhcmFtICk7CiAgICAgaWYgKCF0aHJlYWQpIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTMyOwotICAgIGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggJnRocmVhZC0+aGVhZGVyLCBUSFJFQURfQUxMX0FDQ0VTUywgRkFMU0UgKTsKKyAgICBoYW5kbGUgPSBIQU5ETEVfQWxsb2MoIFBST0NFU1NfQ3VycmVudCgpLCAmdGhyZWFkLT5oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJFQURfQUxMX0FDQ0VTUywgaW5oZXJpdCApOwogICAgIGlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikgZ290byBlcnJvcjsKICAgICBpZiAoU1lTREVQU19TcGF3blRocmVhZCggdGhyZWFkICkgPT0gLTEpIGdvdG8gZXJyb3I7CiAgICAgKmlkID0gVEhEQl9UT19USFJFQURfSUQoIHRocmVhZCApOwpAQCAtMzE1LDkgKzMzNSwxMyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEV4aXRUaHJlYWQgICAoS0VSTkVMMzIuMjE1KQorICogRXhpdFRocmVhZCBbS0VSTkVMMzIuMjE1XSAgRW5kcyBhIHRocmVhZAorICoKKyAqIFJFVFVSTlMKKyAqICAgIE5vbmUKICAqLwotdm9pZCBXSU5BUEkgRXhpdFRocmVhZCggRFdPUkQgY29kZSApCit2b2lkIFdJTkFQSSBFeGl0VGhyZWFkKAorICAgIERXT1JEIGNvZGUpIC8qIFtpbl0gRXhpdCBjb2RlIGZvciB0aGlzIHRocmVhZCAqLwogewogICAgIFRIREIgKnRoZGIgPSBUSFJFQURfQ3VycmVudCgpOwogICAgIExPTkcgY291bnQ7CkBAIC0zNDMsMTYgKzM2NywyMiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldEN1cnJlbnRUaHJlYWQgICAoS0VSTkVMMzIuMjAwKQorICogR2V0Q3VycmVudFRocmVhZCBbS0VSTkVMMzIuMjAwXSAgR2V0cyBwc2V1ZG9oYW5kbGUgZm9yIGN1cnJlbnQgdGhyZWFkCisgKgorICogUkVUVVJOUworICogICAgUHNldWRvaGFuZGxlIGZvciB0aGUgY3VycmVudCB0aHJlYWQKICAqLwogSEFORExFMzIgV0lOQVBJIEdldEN1cnJlbnRUaHJlYWQodm9pZCkKIHsKLSAgICByZXR1cm4gMHhGRkZGRkZGRTsKKyAgICByZXR1cm4gQ1VSUkVOVF9USFJFQURfUFNFVURPSEFORExFOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldEN1cnJlbnRUaHJlYWRJZCAgIChLRVJORUwzMi4yMDEpCisgKiBHZXRDdXJyZW50VGhyZWFkSWQgW0tFUk5FTDMyLjIwMV0gIFJldHVybnMgdGhyZWFkIGlkZW50aWZpZXIuCisgKgorICogUkVUVVJOUworICogICAgVGhyZWFkIGlkZW50aWZpZXIgb2YgY2FsbGluZyB0aHJlYWQKICAqLwogRFdPUkQgV0lOQVBJIEdldEN1cnJlbnRUaHJlYWRJZCh2b2lkKQogewpAQCAtMzYxLDcgKzM5MSwxMCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0TGFzdEVycm9yICAgKEtFUk5FTC4xNDgpIChLRVJORUwzMi4yMjcpCisgKiBHZXRMYXN0RXJyb3IgW0tFUk5FTC4xNDhdIFtLRVJORUwzMi4yMjddICBSZXR1cm5zIGxhc3QtZXJyb3IgY29kZS4KKyAqCisgKiBSRVRVUk5TCisgKiAgICAgQ2FsbGluZyB0aHJlYWQncyBsYXN0IGVycm9yIGNvZGUgdmFsdWUuCiAgKi8KIERXT1JEIFdJTkFQSSBHZXRMYXN0RXJyb3Iodm9pZCkKIHsKQEAgLTM3MSw5ICs0MDQsMTMgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldExhc3RFcnJvciAgIChLRVJORUwuMTQ3KSAoS0VSTkVMMzIuNDk3KQorICogU2V0TGFzdEVycm9yIFtLRVJORUwuMTQ3XSBbS0VSTkVMMzIuNDk3XSAgU2V0cyB0aGUgbGFzdC1lcnJvciBjb2RlLgorICoKKyAqIFJFVFVSTlMKKyAqICAgIE5vbmUuCiAgKi8KLXZvaWQgV0lOQVBJIFNldExhc3RFcnJvciggRFdPUkQgZXJyb3IgKQordm9pZCBXSU5BUEkgU2V0TGFzdEVycm9yKAorICAgIERXT1JEIGVycm9yKSAvKiBbaW5dIFBlci10aHJlYWQgZXJyb3IgY29kZSAqLwogewogICAgIFRIREIgKnRocmVhZCA9IFRIUkVBRF9DdXJyZW50KCk7CiAgICAgLyogVGhpcyBvbmUgbXVzdCB3b3JrIGJlZm9yZSB3ZSBoYXZlIGEgdGhyZWFkIChGSVhNRSkgKi8KQEAgLTM4MiwxMSArNDE5LDI3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRMYXN0RXJyb3JFeCAgIChVU0VSMzIuNDg0KQorICogU2V0TGFzdEVycm9yRXggW1VTRVIzMi40ODVdICBTZXRzIHRoZSBsYXN0LWVycm9yIGNvZGUuCisgKgorICogUkVUVVJOUworICogICAgTm9uZS4KICAqLwotdm9pZCBXSU5BUEkgU2V0TGFzdEVycm9yRXgoIERXT1JEIGVycm9yLCBEV09SRCB0eXBlICkKK3ZvaWQgV0lOQVBJIFNldExhc3RFcnJvckV4KAorICAgIERXT1JEIGVycm9yLCAvKiBbaW5dIFBlci10aHJlYWQgZXJyb3IgY29kZSAqLworICAgIERXT1JEIHR5cGUpICAvKiBbaW5dIEVycm9yIHR5cGUgKi8KIHsKLSAgICAvKiBGSVhNRTogd2hhdCBhYm91dCAndHlwZSc/ICovCisgICAgVFJBQ0UodGhyZWFkLCAiKCUwOGx4LCAlMDhseClcbiIsIGVycm9yLHR5cGUpOworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNMRV9FUlJPUjoKKyAgICAgICAgY2FzZSBTTEVfTUlOT1JFUlJPUjoKKyAgICAgICAgY2FzZSBTTEVfV0FSTklORzoKKyAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCBmb3Igbm93ICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBGSVhNRSh0aHJlYWQsICIoZXJyb3I9JTA4bHgsIHR5cGU9JTA4bHgpOiBVbmhhbmRsZWQgdHlwZVxuIiwgZXJyb3IsdHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CiAgICAgU2V0TGFzdEVycm9yKCBlcnJvciApOwogfQogCkBAIC00MTYsMTQgKzQ2OSwxNSBAQAogICAgIHJldHVybiByZXQgKyBpOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgVGxzQWxsb2MgICAoS0VSTkVMMzIuNTMwKQorICogVGxzQWxsb2MgW0tFUk5FTDMyLjUzMF0gIEFsbG9jYXRlcyBhIFRMUyBpbmRleC4KICAqCiAgKiBBbGxvY2F0ZXMgYSB0aHJlYWQgbG9jYWwgc3RvcmFnZSBpbmRleAogICoKICAqIFJFVFVSTlMKLSAqCVRMUyBJbmRleAotICoJMHhGRkZGRkZGRjogRmFpbHVyZQorICogICAgU3VjY2VzczogVExTIEluZGV4CisgKiAgICBGYWlsdXJlOiAweEZGRkZGRkZGCiAgKi8KIERXT1JEIFdJTkFQSSBUbHNBbGxvYyh2b2lkKQogewpAQCAtNDMyLDkgKzQ4NiwxNiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgVGxzRnJlZSAgIChLRVJORUwzMi41MzEpCisgKiBUbHNGcmVlIFtLRVJORUwzMi41MzFdICBSZWxlYXNlcyBhIFRMUyBpbmRleC4KKyAqCisgKiBSZWxlYXNlcyBhIHRocmVhZCBsb2NhbCBzdG9yYWdlIGluZGV4LCBtYWtpbmcgaXQgYXZhaWxhYmxlIGZvciByZXVzZQorICogCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBUUlVFCisgKiAgICBGYWlsdXJlOiBGQUxTRQogICovCi1CT09MMzIgV0lOQVBJIFRsc0ZyZWUoIERXT1JEIGluZGV4ICkKK0JPT0wzMiBXSU5BUEkgVGxzRnJlZSgKKyAgICBEV09SRCBpbmRleCkgLyogW2luXSBUTFMgSW5kZXggdG8gZnJlZSAqLwogewogICAgIERXT1JEIG1hc2s7CiAgICAgVEhEQiAqdGhyZWFkID0gVEhSRUFEX0N1cnJlbnQoKTsKQEAgLTQ2MiwxNCArNTIzLDE1IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBUbHNHZXRWYWx1ZSAgIChLRVJORUwzMi41MzIpCisgKiBUbHNHZXRWYWx1ZSBbS0VSTkVMMzIuNTMyXSAgR2V0cyB2YWx1ZSBpbiBhIHRocmVhZCdzIFRMUyBzbG90CisgKgogICogUkVUVVJOUwotICoJITA6IFZhbHVlIHN0b3JlZCBpbiBjYWxsaW5nIHRocmVhZCdzIFRMUyBzbG90IGZvciBpbmRleAotICoJMDogQ2hlY2sgR2V0TGFzdEVycm9yKCkgZm9yIGVycm9yIGNvZGUKKyAqICAgIFN1Y2Nlc3M6IFZhbHVlIHN0b3JlZCBpbiBjYWxsaW5nIHRocmVhZCdzIFRMUyBzbG90IGZvciBpbmRleAorICogICAgRmFpbHVyZTogMCBhbmQgR2V0TGFzdEVycm9yIHJldHVybnMgTk9fRVJST1IKICAqLwogTFBWT0lEIFdJTkFQSSBUbHNHZXRWYWx1ZSgKLQkgICAgICBEV09SRCBpbmRleCAvKiBUTFMgaW5kZXggdG8gcmV0cmlldmUgdmFsdWUgZm9yICovCi0pIHsKKyAgICBEV09SRCBpbmRleCkgLyogW2luXSBUTFMgaW5kZXggdG8gcmV0cmlldmUgdmFsdWUgZm9yICovCit7CiAgICAgVEhEQiAqdGhyZWFkID0gVEhSRUFEX0N1cnJlbnQoKTsKICAgICBpZiAoaW5kZXggPj0gNjQpCiAgICAgewpAQCAtNDgyLDE1ICs1NDQsMTYgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFRsc1NldFZhbHVlICAgKEtFUk5FTDMyLjUzMykKKyAqIFRsc1NldFZhbHVlIFtLRVJORUwzMi41MzNdICBTdG9yZXMgYSB2YWx1ZSBpbiB0aGUgdGhyZWFkJ3MgVExTIHNsb3QuCisgKgogICogUkVUVVJOUwotICoJVFJVRTogU3VjY2Vzc2Z1bAotICogICAgICBGQUxTRTogRmFpbHVyZQorICogICAgU3VjY2VzczogVFJVRQorICogICAgRmFpbHVyZTogRkFMU0UKICAqLwogQk9PTDMyIFdJTkFQSSBUbHNTZXRWYWx1ZSgKLQkgICAgICBEV09SRCBpbmRleCwgLyogVExTIGluZGV4IHRvIHNldCB2YWx1ZSBmb3IgKi8KLQkgICAgICBMUFZPSUQgdmFsdWUgLyogdmFsdWUgdG8gYmUgc3RvcmVkICovCi0pIHsKKyAgICBEV09SRCBpbmRleCwgIC8qIFtpbl0gVExTIGluZGV4IHRvIHNldCB2YWx1ZSBmb3IgKi8KKyAgICBMUFZPSUQgdmFsdWUpIC8qIFtpbl0gVmFsdWUgdG8gYmUgc3RvcmVkICovCit7CiAgICAgVEhEQiAqdGhyZWFkID0gVEhSRUFEX0N1cnJlbnQoKTsKICAgICBpZiAoaW5kZXggPj0gNjQpCiAgICAgewpAQCAtNTAzLDkgKzU2NiwxNSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldFRocmVhZENvbnRleHQgICAoS0VSTkVMMzIuMjk0KQorICogR2V0VGhyZWFkQ29udGV4dCBbS0VSTkVMMzIuMjk0XSAgUmV0cmlldmVzIGNvbnRleHQgb2YgdGhyZWFkLgorICoKKyAqIFJFVFVSTlMKKyAqICAgIFN1Y2Nlc3M6IFRSVUUKKyAqICAgIEZhaWx1cmU6IEZBTFNFCiAgKi8KLUJPT0wzMiBXSU5BUEkgR2V0VGhyZWFkQ29udGV4dCggSEFORExFMzIgaGFuZGxlLCBDT05URVhUICpjb250ZXh0ICkKK0JPT0wzMiBXSU5BUEkgR2V0VGhyZWFkQ29udGV4dCgKKyAgICBIQU5ETEUzMiBoYW5kbGUsICAvKiBbaW5dICBIYW5kbGUgdG8gdGhyZWFkIHdpdGggY29udGV4dCAqLworICAgIENPTlRFWFQgKmNvbnRleHQpIC8qIFtvdXRdIEFkZHJlc3Mgb2YgY29udGV4dCBzdHJ1Y3R1cmUgKi8KIHsKICAgICBUSERCICp0aHJlYWQgPSBUSFJFQURfR2V0UHRyKCBoYW5kbGUsIFRIUkVBRF9HRVRfQ09OVEVYVCApOwogICAgIGlmICghdGhyZWFkKSByZXR1cm4gRkFMU0U7CkBAIC01MTYsMTUgKzU4NSwyMCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0VGhyZWFkUHJpb3JpdHkgICAoS0VSTkVMMzIuMjk2KQorICogR2V0VGhyZWFkUHJpb3JpdHkgW0tFUk5FTDMyLjI5Nl0gIFJldHVybnMgcHJpb3JpdHkgZm9yIHRocmVhZC4KKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBUaHJlYWQncyBwcmlvcml0eSBsZXZlbC4KKyAqICAgIEZhaWx1cmU6IFRIUkVBRF9QUklPUklUWV9FUlJPUl9SRVRVUk4KICAqLwotSU5UMzIgV0lOQVBJIEdldFRocmVhZFByaW9yaXR5KEhBTkRMRTMyIGh0aHJlYWQpCitJTlQzMiBXSU5BUEkgR2V0VGhyZWFkUHJpb3JpdHkoCisgICAgSEFORExFMzIgaHRocmVhZCkgLyogW2luXSBIYW5kbGUgdG8gdGhyZWFkICovCiB7CiAgICAgVEhEQiAqdGhyZWFkOwogICAgIElOVDMyIHJldDsKICAgICAKICAgICBpZiAoISh0aHJlYWQgPSBUSFJFQURfR2V0UHRyKCBodGhyZWFkLCBUSFJFQURfUVVFUllfSU5GT1JNQVRJT04gKSkpCi0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gVEhSRUFEX1BSSU9SSVRZX0VSUk9SX1JFVFVSTjsKICAgICByZXQgPSB0aHJlYWQtPmRlbHRhX3ByaW9yaXR5OwogICAgIEszMk9CSl9EZWNDb3VudCggJnRocmVhZC0+aGVhZGVyICk7CiAgICAgcmV0dXJuIHJldDsKQEAgLTUzMiw5ICs2MDYsMTUgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldFRocmVhZFByaW9yaXR5ICAgKEtFUk5FTDMyLjUxNCkKKyAqIFNldFRocmVhZFByaW9yaXR5IFtLRVJORUwzMi41MTRdICBTZXRzIHByaW9yaXR5IGZvciB0aHJlYWQuCisgKgorICogUkVUVVJOUworICogICAgU3VjY2VzczogVFJVRQorICogICAgRmFpbHVyZTogRkFMU0UKICAqLwotQk9PTDMyIFdJTkFQSSBTZXRUaHJlYWRQcmlvcml0eShIQU5ETEUzMiBodGhyZWFkLElOVDMyIHByaW9yaXR5KQorQk9PTDMyIFdJTkFQSSBTZXRUaHJlYWRQcmlvcml0eSgKKyAgICBIQU5ETEUzMiBodGhyZWFkLCAvKiBbaW5dIEhhbmRsZSB0byB0aHJlYWQgKi8KKyAgICBJTlQzMiBwcmlvcml0eSkgICAvKiBbaW5dIFRocmVhZCBwcmlvcml0eSBsZXZlbCAqLwogewogICAgIFRIREIgKnRocmVhZDsKICAgICAKQEAgLTU0NSwxOSArNjI1LDM0IEBACiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBUZXJtaW5hdGVUaHJlYWQgICAoS0VSTkVMMzIpCisgKiBUZXJtaW5hdGVUaHJlYWQgW0tFUk5FTDMyLj8/P10gIFRlcm1pbmF0ZXMgYSB0aHJlYWQKKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBUUlVFCisgKiAgICBGYWlsdXJlOiBGQUxTRQogICovCi1CT09MMzIgV0lOQVBJIFRlcm1pbmF0ZVRocmVhZChIQU5ETEUzMiBoYW5kbGUsRFdPUkQgZXhpdGNvZGUpCitCT09MMzIgV0lOQVBJIFRlcm1pbmF0ZVRocmVhZCgKKyAgICBIQU5ETEUzMiBoYW5kbGUsIC8qIFtpbl0gSGFuZGxlIHRvIHRocmVhZCAqLworICAgIERXT1JEIGV4aXRjb2RlKSAgLyogW2luXSBFeGl0IGNvZGUgZm9yIHRocmVhZCAqLwogewotICAgIEZJWE1FKHRocmVhZCwiKDB4JTA4eCwlbGQpOiBTVFVCIVxuIixoYW5kbGUsZXhpdGNvZGUpOworICAgIEZJWE1FKHRocmVhZCwiKDB4JTA4eCwlbGQpOiBzdHViXG4iLGhhbmRsZSxleGl0Y29kZSk7CisgICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldEV4aXRDb2RlVGhyZWFkICAgKEtFUk5FTDMyKQorICogR2V0RXhpdENvZGVUaHJlYWQgW0tFUk5FTDMyLj8/P10gIEdldHMgdGVybWluYXRpb24gc3RhdHVzIG9mIHRocmVhZC4KKyAqIAorICogUkVUVVJOUworICogICAgU3VjY2VzczogVFJVRQorICogICAgRmFpbHVyZTogRkFMU0UKICAqLwotQk9PTDMyIFdJTkFQSSBHZXRFeGl0Q29kZVRocmVhZChIQU5ETEUzMiBodGhyZWFkLExQRFdPUkQgZXhpdGNvZGUpCitCT09MMzIgV0lOQVBJIEdldEV4aXRDb2RlVGhyZWFkKAorICAgIEhBTkRMRTMyIGh0aHJlYWQsIC8qIFtpbl0gIEhhbmRsZSB0byB0aHJlYWQgKi8KKyAgICBMUERXT1JEIGV4aXRjb2RlKSAvKiBbb3V0XSBBZGRyZXNzIHRvIHJlY2VpdmUgdGVybWluYXRpb24gc3RhdHVzICovCiB7CiAgICAgVEhEQiAqdGhyZWFkOwogICAgIApAQCAtNTY4LDM0ICs2NjMsOTAgQEAKICAgICByZXR1cm4gVFJVRTsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBSZXN1bWVUaHJlYWQgICAoS0VSTkVMMzIpCi0gKi8KLUJPT0wzMiBXSU5BUEkgUmVzdW1lVGhyZWFkKCBIQU5ETEUzMiBoYW5kbGUgKQotewotICAgIEZJWE1FKHRocmVhZCwiKDB4JTA4eCk6IFNUVUIhXG4iLGhhbmRsZSk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU3VzcGVuZFRocmVhZCAgIChLRVJORUwzMikKKyAqIFJlc3VtZVRocmVhZCBbS0VSTkVMMzIuNTg3XSAgUmVzdW1lcyBhIHRocmVhZC4KKyAqCisgKiBEZWNyZW1lbnRzIGEgdGhyZWFkJ3Mgc3VzcGVuZCBjb3VudC4gIFdoZW4gY291bnQgaXMgemVybywgdGhlCisgKiBleGVjdXRpb24gb2YgdGhlIHRocmVhZCBpcyByZXN1bWVkLgorICoKKyAqIFJFVFVSTlMKKyAqICAgIFN1Y2Nlc3M6IFByZXZpb3VzIHN1c3BlbmQgY291bnQKKyAqICAgIEZhaWx1cmU6IDB4RkZGRkZGRkYKICAqLwotQk9PTDMyIFdJTkFQSSBTdXNwZW5kVGhyZWFkKCBIQU5ETEUzMiBoYW5kbGUgKQorRFdPUkQgV0lOQVBJIFJlc3VtZVRocmVhZCgKKyAgICBIQU5ETEUzMiBoYW5kbGUpIC8qIFtpbl0gSW5kZW50aWZpZXMgdGhyZWFkIHRvIHJlc3RhcnQgKi8KIHsKLSAgICBGSVhNRSh0aHJlYWQsIigweCUwOHgpOiBTVFVCIVxuIixoYW5kbGUpOwotICAgIHJldHVybiBUUlVFOworICAgIEZJWE1FKHRocmVhZCwiKDB4JTA4eCk6IHN0dWJcbiIsaGFuZGxlKTsKKyAgICByZXR1cm4gMHhGRkZGRkZGRjsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldFRocmVhZFRpbWVzICAgKEtFUk5FTDMyKQorICogU3VzcGVuZFRocmVhZCBbS0VSTkVMMzIuNjgxXSAgU3VzcGVuZHMgYSB0aHJlYWQuCisgKgorICogUkVUVVJOUworICogICAgU3VjY2VzczogUHJldmlvdXMgc3VzcGVuZCBjb3VudAorICogICAgRmFpbHVyZTogMHhGRkZGRkZGRgorICovCitEV09SRCBXSU5BUEkgU3VzcGVuZFRocmVhZCgKKyAgICBIQU5ETEUzMiBoYW5kbGUpIC8qIFtpbl0gSGFuZGxlIHRvIHRoZSB0aHJlYWQgKi8KK3sKKyAgICBGSVhNRSh0aHJlYWQsIigweCUwOHgpOiBzdHViXG4iLGhhbmRsZSk7CisgICAgcmV0dXJuIDB4RkZGRkZGRkY7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdldFRocmVhZFRpbWVzIFtLRVJORUwzMi4/Pz9dICBPYnRhaW5zIHRpbWluZyBpbmZvcm1hdGlvbi4KKyAqCisgKiBOT1RFUworICogICAgV2hhdCBhcmUgdGhlIGZpZWxkcyB3aGVyZSB0aGVzZSB2YWx1ZXMgYXJlIHN0b3JlZD8KKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBUUlVFCisgKiAgICBGYWlsdXJlOiBGQUxTRQogICovCiBCT09MMzIgV0lOQVBJIEdldFRocmVhZFRpbWVzKCAKLQlIQU5ETEUzMiB0aHJlYWQsIAotCUxQRklMRVRJTUUgY3JlYXRpb250aW1lLAotCUxQRklMRVRJTUUgZXhpdHRpbWUsCi0JTFBGSUxFVElNRSBrZXJuZWx0aW1lLAotCUxQRklMRVRJTUUgdXNlcnRpbWUKLSkgewotCVNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7Ci0JcmV0dXJuIEZBTFNFOworICAgIEhBTkRMRTMyIHRocmVhZCwgICAgICAgICAvKiBbaW5dICBTcGVjaWZpZXMgdGhlIHRocmVhZCBvZiBpbnRlcmVzdCAqLworICAgIExQRklMRVRJTUUgY3JlYXRpb250aW1lLCAvKiBbb3V0XSBXaGVuIHRoZSB0aHJlYWQgd2FzIGNyZWF0ZWQgKi8KKyAgICBMUEZJTEVUSU1FIGV4aXR0aW1lLCAgICAgLyogW291dF0gV2hlbiB0aGUgdGhyZWFkIHdhcyBkZXN0cm95ZWQgKi8KKyAgICBMUEZJTEVUSU1FIGtlcm5lbHRpbWUsICAgLyogW291dF0gVGltZSB0aHJlYWQgc3BlbnQgaW4ga2VybmVsIG1vZGUgKi8KKyAgICBMUEZJTEVUSU1FIHVzZXJ0aW1lKSAgICAgLyogW291dF0gVGltZSB0aHJlYWQgc3BlbnQgaW4gdXNlciBtb2RlICovCit7CisgICAgRklYTUUodGhyZWFkLCIoMHglMDh4KTogc3R1YlxuIix0aHJlYWQpOworICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgICAgcmV0dXJuIEZBTFNFOwogfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBdHRhY2hUaHJlYWRJbnB1dCBbS0VSTkVMMzIuOF0gIEF0dGFjaGVzIGlucHV0IG9mIDEgdGhyZWFkIHRvIG90aGVyCisgKgorICogQXR0YWNoZXMgdGhlIGlucHV0IHByb2Nlc3NpbmcgbWVjaGFuaXNtIG9mIG9uZSB0aHJlYWQgdG8gdGhhdCBvZgorICogYW5vdGhlciB0aHJlYWQuCisgKgorICogUkVUVVJOUworICogICAgU3VjY2VzczogVFJVRQorICogICAgRmFpbHVyZTogRkFMU0UKKyAqLworQk9PTDMyIFdJTkFQSSBBdHRhY2hUaHJlYWRJbnB1dCggCisgICAgRFdPUkQgaWRBdHRhY2gsICAgLyogW2luXSBUaHJlYWQgdG8gYXR0YWNoICovCisgICAgRFdPUkQgaWRBdHRhY2hUbywgLyogW2luXSBUaHJlYWQgdG8gYXR0YWNoIHRvICovCisgICAgQk9PTDMyIGZBdHRhY2gpICAgLyogW2luXSBBdHRhY2ggb3IgZGV0YWNoICovCit7CisgICAgQk9PTDMyIHJldDsKKworICAgIEZJWE1FKHRocmVhZCwgIigweCUwOGx4LDB4JTA4bHgsJWQpOiBzdHViXG4iLGlkQXR0YWNoLGlkQXR0YWNoVG8sZkF0dGFjaCk7CisgICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgICBpZiAoZkF0dGFjaCkgeworICAgICAgICAvKiBBdHRhY2ggdGhyZWFkcyAqLworICAgICAgICByZXQgPSBGQUxTRTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIERldGFjaCB0aHJlYWRzICovCisgICAgICAgIHJldCA9IEZBTFNFOworICAgIH07CisgICAgcmV0dXJuIHJldDsKK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGQuYyBiL3Rvb2xzL2J1aWxkLmMKaW5kZXggMTU0ZjY3OS4uODE0YTViMCAxMDA2NDQKLS0tIGEvdG9vbHMvYnVpbGQuYworKysgYi90b29scy9idWlsZC5jCkBAIC0xODcyLDkgKzE4NzIsOSBAQAogCWVsc2UgCiAJewogCSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAkMFxuIiApOwotCSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAiIFBSRUZJWCAiQ0FMTFRPMTZfUmV0QWRkcl9sb25nKzJcbiIgKTsKKwkgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaHcgIiBQUkVGSVggIkNBTExUTzE2X1JldEFkZHJfZWF4KzJcbiIgKTsKIAkgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaHcgJDBcbiIgKTsKLQkgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaHcgIiBQUkVGSVggIkNBTExUTzE2X1JldEFkZHJfbG9uZ1xuIiApOworCSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAiIFBSRUZJWCAiQ0FMTFRPMTZfUmV0QWRkcl9lYXhcbiIgKTsKIAl9CiAKICAgICAgICAgLyogUHVzaCB0aGUgY2FsbGVkIHJvdXRpbmUgYWRkcmVzcyAqLwpAQCAtMTk1Nyw2ICsxOTU3LDcgQEAKIHsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZ2xvYmwgIiBQUkVGSVggIkNBTExUTzE2X1JldF93b3JkXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Lmdsb2JsICIgUFJFRklYICJDQUxMVE8xNl9SZXRfbG9uZ1xuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5nbG9ibCAiIFBSRUZJWCAiQ0FMTFRPMTZfUmV0X2VheFxuIiApOwogCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgUFJFRklYICJDQUxMVE8xNl9SZXRfd29yZDpcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHR4b3JsICUlZWR4LCUlZWR4XG4iICk7CkBAIC0xOTY3LDYgKzE5NjgsNyBAQAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdHNobGwgJDE2LCUlZWR4XG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAlJWF4LCUlZHhcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZWR4LCUlZWF4XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgUFJFRklYICJDQUxMVE8xNl9SZXRfZWF4OlxuIiApOwogCiAgICAgLyogUmVzdG9yZSAzMi1iaXQgc2VnbWVudCByZWdpc3RlcnMgKi8KIApAQCAtMjAwNyw5ICsyMDA5LDExIEBACiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmRhdGFcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZ2xvYmwgIiBQUkVGSVggIkNBTExUTzE2X1JldEFkZHJfd29yZFxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5nbG9ibCAiIFBSRUZJWCAiQ0FMTFRPMTZfUmV0QWRkcl9sb25nXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Lmdsb2JsICIgUFJFRklYICJDQUxMVE8xNl9SZXRBZGRyX2VheFxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5nbG9ibCAiIFBSRUZJWCAiQ0FMTFRPMTZfQ3VycmVudF9mc1xuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsIFBSRUZJWCAiQ0FMTFRPMTZfUmV0QWRkcl93b3JkOlx0LmxvbmcgMFxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsIFBSRUZJWCAiQ0FMTFRPMTZfUmV0QWRkcl9sb25nOlx0LmxvbmcgMFxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsIFBSRUZJWCAiQ0FMTFRPMTZfUmV0QWRkcl9lYXg6XHQubG9uZyAwXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgUFJFRklYICJDQUxMVE8xNl9DdXJyZW50X2ZzOlx0LmxvbmcgMFxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC50ZXh0XG4iICk7CiB9CkBAIC0yMDk1LDEyICsyMDk5LDE1IEBACiAgKgogICogU3RhY2sgbGF5b3V0OgogICogICAuLi4gICAgIC4uLgotICogKGVzcCsyMDgpIHJldCBhZGRyIChvciByZWxheSBhZGRyIHdoZW4gZGVidWdnaW5nKHJlbGF5KSBpcyBvbikKLSAqIChlc3ArMjA0KSBlbnRyeSBwb2ludAorICogKGVzcCszMzYpIHJldCBhZGRyIChvciByZWxheSBhZGRyIHdoZW4gZGVidWdnaW5nKHJlbGF5KSBpcyBvbikKKyAqIChlc3ArMzMyKSBlbnRyeSBwb2ludAorICogKGVzcCsyMDQpIGJ1ZmZlciBhcmVhIHRvIGFsbG93IHN0YWNrIGZyYW1lIG1hbmlwdWxhdGlvbgogICogKGVzcCswKSAgIENPTlRFWFQgc3RydWN0CiAgKi8KIHN0YXRpYyB2b2lkIEJ1aWxkQ2FsbEZyb20zMlJlZ3MoIEZJTEUgKm91dGZpbGUgKQogeworI2RlZmluZSBTVEFDS19TUEFDRSAxMjgKKwogICAgIC8qIEZ1bmN0aW9uIGhlYWRlciAqLwogCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlxuXHQuYWxpZ24gNFxuIiApOwpAQCAtMjExMCw2ICsyMTE3LDEwIEBACiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Lmdsb2JsICIgUFJFRklYICJDQUxMMzJfUmVnc1xuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsIFBSRUZJWCAiQ0FMTDMyX1JlZ3M6XG4iICk7CiAKKyAgICAvKiBBbGxvY2F0ZSBzb21lIGJ1ZmZlciBzcGFjZSBvbiB0aGUgc3RhY2sgKi8KKyAgIAorICAgIGZwcmludGYoIG91dGZpbGUsICJcdGxlYWwgLSVkKCUlZXNwKSwgJSVlc3BcbiIsIFNUQUNLX1NQQUNFICk7CisgICAgCiAgICAgLyogQnVpbGQgdGhlIGNvbnRleHQgc3RydWN0dXJlICovCiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAkMFxuIiApOwpAQCAtMjExOCw3ICsyMTI5LDcgQEAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNoZmxcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAkMFxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5ieXRlIDB4NjZcblx0cHVzaGwgJSVjc1xuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsIDIwKCUlZXNwKVxuIiApOyAgLyogJWVpcCBhdCB0aW1lIG9mIGNhbGwgKi8KKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlZCglJWVzcClcbiIsIDE2K1NUQUNLX1NQQUNFKzQgKTsgIC8qICVlaXAgYXQgdGltZSBvZiBjYWxsICovCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJSVlYnBcbiIgKTsKIAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICUlZWF4XG4iICk7CkBAIC0yMTQ1LDcgKzIxNTYsNyBAQAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdGZzYXZlICVkKCUlZXNwKVxuIiwgQ09OVEVYVE9GRlNFVChGbG9hdFNhdmUpICk7CiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRsZWFsICVkKCUlZXNwKSwlJWVheFxuIiwKLSAgICAgICAgICAgICBzaXplb2YoQ09OVEVYVCkgKyA0ICk7IC8qICVlc3AgYXQgdGltZSBvZiBjYWxsICovCisgICAgICAgICAgICAgc2l6ZW9mKENPTlRFWFQpICsgU1RBQ0tfU1BBQ0UgKyA0ICk7IC8qICVlc3AgYXQgdGltZSBvZiBjYWxsICovCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCwlZCglJWVzcClcbiIsIENPTlRFWFRPRkZTRVQoRXNwKSApOwogCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Y2FsbCAiIFBSRUZJWCAiUkVMQVlfQ2FsbEZyb20zMlJlZ3NcbiIgKTsKQEAgLTIxODQsNiArMjE5NSw4IEBACiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wZmxcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BsICUlZXNwXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cmV0XG4iICk7CisKKyN1bmRlZiBTVEFDS19TUEFDRQogfQogCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2V4YW1pbmUtcmVsYXkgYi90b29scy9leGFtaW5lLXJlbGF5CmluZGV4IDYwMzBmMDguLjg1ZTdmZjcgMTAwNzU1Ci0tLSBhL3Rvb2xzL2V4YW1pbmUtcmVsYXkKKysrIGIvdG9vbHMvZXhhbWluZS1yZWxheQpAQCAtMSwzMyArMSw1NyBAQAogIyEvdXNyL2Jpbi9wZXJsIC13CiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjIFJlbGF5LWNoZWNrZXIuCisjCisjIFRoaXMgcHJvZ3JhbSB3aWxsIGluc3BlY3QgYSBsb2cgZmlsZSB3aXRoIHJlbGF5IGluZm9ybWF0aW9uIGFuZCB0ZWxsIHlvdQorIyB3aGV0aGVyIGNhbGxzIGFuZCByZXR1cm5zIG1hdGNoLiAgSWYgbm90LCB0aGlzIHN1Z2dlc3RzIHRoYXQgdGhlIHBhcmFtZXRlcgorIyBsaXN0IG1pZ2h0IGJlIGluY29ycmVjdC4gIChJdCBjb3VsZCBiZSBzb21ldGhpbmcgZWxzZSBhbHNvLikKKyMKKyMgQ29weXJpZ2h0IDE5OTctMTk5OCBNb3J0ZW4gV2VsaW5kZXIgKHRlcnJhQGRpa3UuZGspCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIG15ICRzcmNmaWxlID0gJEFSR1ZbMF07CiBteSBAY2FsbHN0YWNrID0gKCk7CitteSAkbmV3bGluZWVycm9yID0gMDsKK215ICRpbmRlbnRwID0gMTsKIAogb3BlbiAoSU4sICI8JHNyY2ZpbGUiKSB8fCBkaWUgIkNhbm5vdCBvcGVuICRzcmNmaWxlIGZvciByZWFkaW5nOiAkIVxuIjsKIExJTkU6CiB3aGlsZSAoPElOPikgewotICAgIGlmICgvXkNhbGwgKFtBLVphLXowLTldK1wuWzAtOV0rKTogLipcKS8pIHsKKyAgICBpZiAoL15DYWxsIChbQS1aYS16MC05XStcLlxkKyk6IC4qXCkvKSB7CiAJbXkgJGZ1bmMgPSAkMTsKIAlpZiAoLyByZXQ9KC4uLi4uLi4uKSQvIHx8Ci0JICAgIC8gcmV0PSguLi4uOi4uLi4pIGRzPS4uLi4kLykgeworCSAgICAvIHJldD0oLi4uLjouLi4uKSAoZHM9Li4uLikkLyB8fAorCSAgICAvIHJldD0oLi4uLi4uLi4pIChmcz0uLi4uKSQvKSB7CiAJICAgIG15ICRyZXRhZGRyID0gJDE7Ci0JICAgIHB1c2ggQGNhbGxzdGFjaywgWyRmdW5jLCRyZXRhZGRyXTsKKwkgICAgbXkgJHNlZ3JlZyA9ICQyOworCisJICAgICRzZWdyZWcgPSAibm9uZSIgdW5sZXNzIGRlZmluZWQgJHNlZ3JlZzsKKwkgICAgcHVzaCBAY2FsbHN0YWNrLCBbJGZ1bmMsJHJldGFkZHIsICRzZWdyZWddOwogCSAgICBuZXh0OwogCX0gZWxzZSB7CiAJICAgICMgQXNzdW1lIGEgbGluZSBnb3QgY3V0IGJ5IGEgbGluZSBmZWVkIGluIGEgc3RyaW5nLgogCSAgICAkXyAuPSBzY2FsYXIgKDxJTj4pOwotCSAgICBwcmludCAiWyRfXSI7CisJICAgIGlmICghJG5ld2xpbmVlcnJvcikgeworCQlwcmludCAiRXJyb3I6IHN0cmluZyBwcm9iYWJseSBjdXQgYnkgbmV3bGluZS5cbiI7CisJCSRuZXdsaW5lZXJyb3IgPSAxOworCSAgICB9CSAgICAKKwkgICAgIyBwcmludCAiWyRfXSI7CiAJICAgIHJlZG87CiAJfQogICAgIH0KIAogCi0gICAgaWYgKC9eUmV0ICAoW0EtWmEtejAtOV0rXC5bMC05XSspOiAuKiByZXQ9KC4uLi4uLi4uKSQvIHx8Ci0JL15SZXQgIChbQS1aYS16MC05XStcLlswLTldKyk6IC4qIHJldD0oLi4uLjouLi4uKSBkcz0uLi4uJC8pIHsKKyAgICBpZiAoL15SZXQgIChbQS1aYS16MC05XStcLlxkKyk6IC4qIHJldD0oLi4uLi4uLi4pJC8gfHwKKwkvXlJldCAgKFtBLVphLXowLTldK1wuXGQrKTogLiogcmV0PSguLi4uOi4uLi4pIChkcz0uLi4uKSQvIHx8CisJL15SZXQgIChbQS1aYS16MC05XStcLlxkKyk6IC4qIHJldD0oLi4uLi4uLi4pIChmcz0uLi4uKSQvKSB7CiAJbXkgJGZ1bmMgPSAkMTsKIAlteSAkcmV0YWRkciA9ICQyOwotCW15ICgkdG9wZnVuYywkdG9wYWRkcik7CisJbXkgJHNlZ3JlZyA9ICQzOworCW15ICgkdG9wZnVuYywkdG9wYWRkciwkdG9wc2VnKTsKKworCSRzZWdyZWcgPSAibm9uZSIgdW5sZXNzIGRlZmluZWQgJHNlZ3JlZzsKIAogICAgICAgUE9QOgogCXdoaWxlICgxKSB7CkBAIC0zNiw3ICs2MCw3IEBACiAJCW5leHQgTElORTsKIAkgICAgfQogCi0JICAgICgkdG9wZnVuYywkdG9wYWRkcikgPSBAe3BvcCBAY2FsbHN0YWNrfTsKKwkgICAgKCR0b3BmdW5jLCR0b3BhZGRyLCR0b3BzZWcpID0gQHtwb3AgQGNhbGxzdGFja307CiAKIAkgICAgaWYgKCR0b3BmdW5jIG5lICRmdW5jKSB7CiAJCXByaW50ICJFcnJvcjogUmV0dXJuIGZyb20gJHRvcGZ1bmMsIGJ1dCBjYWxsIGZyb20gJGZ1bmMuXG4iOwpAQCAtNDUsMTAgKzY5LDE2IEBACiAJICAgIGxhc3QgUE9QOwogCX0KIAotCWlmICgkdG9wYWRkciBlcSAkcmV0YWRkcikgewotCSAgICBwcmludCAiT0s6ICRmdW5jIGZyb20gJHJldGFkZHIuXG4iOworCW15ICRhZGRyb2sgPSAoJHRvcGFkZHIgZXEgJHJldGFkZHIpOworCW15ICRzZWdvayA9ICgkdG9wc2VnIGVxICRzZWdyZWcpOworCWlmICgkYWRkcm9rICYmICRzZWdvaykgeworCSAgICBwcmludCAiT0s6ICIsICgkaW5kZW50cCA/ICgnICcgeCAoMSArICQjY2FsbHN0YWNrKSkgOiAnJyk7CisJICAgIHByaW50ICIkZnVuYyBmcm9tICRyZXRhZGRyIHdpdGggJHNlZ3JlZy5cbiI7CiAJfSBlbHNlIHsKLQkgICAgcHJpbnQgIkVycm9yOiBSZXR1cm4gZnJvbSAkZnVuYyBpcyB0byAkcmV0YWRkciwgbm90ICR0b3BhZGRyLlxuIjsKKwkgICAgcHJpbnQgIkVycm9yOiBSZXR1cm4gZnJvbSAkZnVuYyBpcyB0byAkcmV0YWRkciwgbm90ICR0b3BhZGRyLlxuIgorCQlpZiAhJGFkZHJvazsKKwkgICAgcHJpbnQgIkVycm9yOiBSZXR1cm4gZnJvbSAkZnVuYyB3aXRoIHNlZ3JlZyAkc2VncmVnLCBub3QgJHRvcHNlZy5cbiIKKwkJaWYgISRzZWdvazsKIAl9ICAgIAogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmRfZGVidWdfY2hhbm5lbHMgYi90b29scy9maW5kX2RlYnVnX2NoYW5uZWxzCmluZGV4IGRiZWM4NzcuLmM1ZTcyZTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2ZpbmRfZGVidWdfY2hhbm5lbHMKKysrIGIvdG9vbHMvZmluZF9kZWJ1Z19jaGFubmVscwpAQCAtMSwxMCArMSwxMiBAQAogIyEvYmluL2Jhc2gKICMKICMgVGhpcyBzY3JpcHQgc2NhbnMgdGhlIHdob2xlIHNvdXJjZSBjb2RlIGZvciBzeW1ib2xzIG9mIHRoZSBmb3JtIAotIyAnZHByaW50Zl94eHgoeXl5JyB3aGVyZSB5eXkgaXMgYSBDIGlkZW50aWZpZXIgYW5kIG91dHB1dHMsIG9uIHRoZQotIyBzdGFuZGFyZCBvdXRwdXQgYSBzb3J0ZWQgbGlzdCBvZiB0aGUgaWRlbnRpZmllcnMgZm91bmQgaW4gdGhlIC5jIAotIyBmaWxlcy4gRWFjaCBpZGVudGlmaWVyIGlzIHJlcG9ydGVkIG9uY2UuIEhlYWRlciBmaWxlcyBhcmUgbm90Ci0jIHNjYW5uZWQuCisjICd4eHgoeXl5JyB3aGVyZToKKyMgICAgICAgIHh4eCBpcyBlaXRoZXIgVFJBQ0UsIFdBUk4sIEVSUiBvciBXQVJOCisjICAgICAgICB5eXkgaXMgYSBDIGlkZW50aWZpZXIgCisjIEl0IG91dHB1dHMgb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhIHNvcnRlZCBsaXN0IG9mIHRoZSAKKyMgeXl5IGlkZW50aWZpZXJzIGZvdW5kIGluIHRoZSAuYyBmaWxlcy4gCisjIEVhY2ggaWRlbnRpZmllciBpcyByZXBvcnRlZCBvbmNlLiBIZWFkZXIgZmlsZXMgYXJlIG5vdCBzY2FubmVkLgogIwogIyBUaGUgc2NyaXB0IGNhbiBiZSBnaXZlbiBhbiBhcmd1bWVudCB0aGF0IHNwZWNpZnkgdGhlIGZpbGVzIHRvIGJlCiAjIHNlYXJjaGVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHNjaGVtZToKZGlmZiAtLWdpdCBhL3dpbjMyL01ha2VmaWxlLmluIGIvd2luMzIvTWFrZWZpbGUuaW4KaW5kZXggYjlhY2RiOS4uYmViZjYzMiAxMDA2NDQKLS0tIGEvd2luMzIvTWFrZWZpbGUuaW4KKysrIGIvd2luMzIvTWFrZWZpbGUuaW4KQEAgLTksNyArOSw2IEBACiAJYWR2YXBpLmMgXAogCWNvZGVfcGFnZS5jIFwKIAljb25zb2xlLmMgXAotCWVudmlyb25tZW50LmMgXAogCWVycm9yLmMgXAogCWV4Y2VwdC5jIFwKIAlmaWxlLmMgXApkaWZmIC0tZ2l0IGEvd2luMzIvY29kZV9wYWdlLmMgYi93aW4zMi9jb2RlX3BhZ2UuYwppbmRleCAwNWUxYWMyLi5hNDNjMjI2IDEwMDY0NAotLS0gYS93aW4zMi9jb2RlX3BhZ2UuYworKysgYi93aW4zMi9jb2RlX3BhZ2UuYwpAQCAtOTEsNyArOTEsNyBAQAogICAgIGludCByZXQ7CiAKICAgICBpZiAoc3JjbGVuID09IC0xKQotCXNyY2xlbiA9IGxzdHJsZW4zMkEoc3JjKSsxOworCXNyY2xlbiA9IGxzdHJsZW4zMkEoc3JjKTsKICAgICBpZiAoIWRzdGxlbiB8fCAhZHN0KQogCXJldHVybiBzcmNsZW47CiAKQEAgLTEwMyw3ICsxMDMsNyBAQAogCWRzdCsrOyAgICBzcmMrKzsKIAlkc3RsZW4tLTsgc3JjbGVuLS07CiAgICAgfQotICAgIGlmIChkc3RsZW4gPT0gMCkgeworICAgIGlmICgoZHN0bGVuID09IDApICYmICpzcmMpIHsKIAlTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAJcmV0dXJuIDA7CiAgICAgfQpkaWZmIC0tZ2l0IGEvd2luMzIvY29uc29sZS5jIGIvd2luMzIvY29uc29sZS5jCmluZGV4IDZjMjcxOWIuLjFhYjdkODQgMTAwNjQ0Ci0tLSBhL3dpbjMyL2NvbnNvbGUuYworKysgYi93aW4zMi9jb25zb2xlLmMKQEAgLTIyMyw3ICsyMjMsNyBAQAogCQlyZXR1cm4gRkFMU0U7CiAJfQogCi0JUFJPQ0VTU19DbG9zZU9iakhhbmRsZXMocGRiLCAmY29uc29sZS0+aGVhZGVyKTsKKyAgICAgICAgSEFORExFX0Nsb3NlQWxsKCBwZGIsICZjb25zb2xlLT5oZWFkZXIgKTsKIAogCUszMk9CSl9EZWNDb3VudCggJmNvbnNvbGUtPmhlYWRlciApOwogCXBkYi0+Y29uc29sZSA9IE5VTEw7CkBAIC0zMzUsNyArMzM1LDcgQEAKIAlTWVNURU1fTE9DSygpOwogCWlmIChwZGItPmNvbnNvbGUgIT0gTlVMTCkgewogCQlDT05TT0xFICpjb25zb2xlID0gKENPTlNPTEUgKilwZGItPmNvbnNvbGU7Ci0JCWhhbmRsZSA9IChIRklMRTMyKUhBTkRMRV9BbGxvYygmY29uc29sZS0+aGVhZGVyLCAwLCBUUlVFKTsKKwkJaGFuZGxlID0gKEhGSUxFMzIpSEFORExFX0FsbG9jKHBkYiwgJmNvbnNvbGUtPmhlYWRlciwgMCwgVFJVRSk7CiAJfQogCVNZU1RFTV9VTkxPQ0soKTsKIAlyZXR1cm4gaGFuZGxlOwpAQCAtMzkyLDE0ICszOTIsMTQgQEAKIAljb25zb2xlLT5zbGF2ZSA9IHNsYXZlOwogCWNvbnNvbGUtPnBpZCA9IHBpZDsKIAotCWlmICgoaEluID0gSEFORExFX0FsbG9jKCZjb25zb2xlLT5oZWFkZXIsIDAsIFRSVUUpKSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyKQorCWlmICgoaEluID0gSEFORExFX0FsbG9jKHBkYiwmY29uc29sZS0+aGVhZGVyLCAwLCBUUlVFKSkgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikKICAgICAgICAgewogICAgICAgICAgICAgSzMyT0JKX0RlY0NvdW50KCZjb25zb2xlLT5oZWFkZXIpOwogICAgICAgICAgICAgU1lTVEVNX1VOTE9DSygpOwogICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCX0KIAotCWlmICgoaE91dCA9IEhBTkRMRV9BbGxvYygmY29uc29sZS0+aGVhZGVyLCAwLCBUUlVFKSkgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikKKwlpZiAoKGhPdXQgPSBIQU5ETEVfQWxsb2MocGRiLCZjb25zb2xlLT5oZWFkZXIsIDAsIFRSVUUpKSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyKQogICAgICAgICB7CiAgICAgICAgICAgICBDbG9zZUhhbmRsZShoSW4pOwogICAgICAgICAgICAgSzMyT0JKX0RlY0NvdW50KCZjb25zb2xlLT5oZWFkZXIpOwpAQCAtNDA4LDcgKzQwOCw3IEBACiAJfQogCiAKLQlpZiAoKGhFcnIgPSBIQU5ETEVfQWxsb2MoJmNvbnNvbGUtPmhlYWRlciwgMCwgVFJVRSkpID09IElOVkFMSURfSEFORExFX1ZBTFVFMzIpCisJaWYgKChoRXJyID0gSEFORExFX0FsbG9jKHBkYiwmY29uc29sZS0+aGVhZGVyLCAwLCBUUlVFKSkgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikKICAgICAgICAgewogICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaEluKTsKICAgICAgICAgICAgIENsb3NlSGFuZGxlKGhPdXQpOwpkaWZmIC0tZ2l0IGEvd2luMzIvZW52aXJvbm1lbnQuYyBiL3dpbjMyL2Vudmlyb25tZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYzI1M2EuLjAwMDAwMDAKLS0tIGEvd2luMzIvZW52aXJvbm1lbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBXaW4zMiBrZXJuZWwgZnVuY3Rpb25zCi0gKgotICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMgYW5kIENhbWVyb24gSGVpZGUKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlICJ3aW5kb3dzLmgiCi0jaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlICJtb2R1bGUuaCIKLSNpbmNsdWRlICJ0YXNrLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJwcm9jZXNzLmgiICAvKiBmb3IgUFJPQ0VTU19DdXJyZW50KCkgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRDb21tYW5kTGluZUEgICAgICAoS0VSTkVMMzIuMTYxKQotICovCi1MUENTVFIgV0lOQVBJIEdldENvbW1hbmRMaW5lMzJBKHZvaWQpCi17Ci0gICAgcmV0dXJuIFBST0NFU1NfQ3VycmVudCgpLT5lbnZfZGItPmNtZF9saW5lOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRDb21tYW5kTGluZVcgICAgICAoS0VSTkVMMzIuMTYyKQotICovCi1MUENXU1RSIFdJTkFQSSBHZXRDb21tYW5kTGluZTMyVyh2b2lkKQotewotICAgIHN0YXRpYyBXQ0hBUiBidWZmZXJbMTAyNF07Ci0KLSAgICBsc3RyY3B5bkF0b1coYnVmZmVyLEdldENvbW1hbmRMaW5lMzJBKCksMTAyNCk7Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRTeXN0ZW1Qb3dlclN0YXR1cyAgICAgIChLRVJORUwzMi42MjEpCi0gKi8KLUJPT0wzMiBXSU5BUEkgR2V0U3lzdGVtUG93ZXJTdGF0dXMoTFBTWVNURU1fUE9XRVJfU1RBVFVTIHNwc19wdHIpCi17Ci0gICAgcmV0dXJuIEZBTFNFOyAgIC8qIG5vIHBvd2VyIG1hbmFnZW1lbnQgc3VwcG9ydCAqLwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldFN5c3RlbVBvd2VyU3RhdGUgICAgICAoS0VSTkVMMzIuNjMwKQotICovCi1CT09MMzIgV0lOQVBJIFNldFN5c3RlbVBvd2VyU3RhdGUoQk9PTDMyIHN1c3BlbmRfb3JfaGliZXJuYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBmb3JjZV9mbGFnKQotewotICAgIC8qIHN1c3BlbmRfb3JfaGliZXJuYXRlIGZsYWc6IHc5NSBkb2VzIG5vdCBzdXBwb3J0Ci0gICAgICAgdGhpcyBmZWF0dXJlIGFueXdheSAqLwotCi0gICAgZm9yICggOzA7ICkKLSAgICB7Ci0gICAgICAgIGlmICggZm9yY2VfZmxhZyApCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQpkaWZmIC0tZ2l0IGEvd2luMzIvZmlsZS5jIGIvd2luMzIvZmlsZS5jCmluZGV4IDAzZGZhM2UuLmMwZWI5MzIgMTAwNjQ0Ci0tLSBhL3dpbjMyL2ZpbGUuYworKysgYi93aW4zMi9maWxlLmMKQEAgLTQwLDcgKzQwLDggQEAKIAlUUkFDRShmaWxlLCAiJWQgJXAgJWxkXG4iLCBoRmlsZSwgbHBCdWZmZXIsIAogCQkgICAgIG51bWJlck9mQnl0ZXNUb1dyaXRlKTsKIAkKLQlpZiAoIShpb3B0ciA9IEhBTkRMRV9HZXRPYmpQdHIoIGhGaWxlLCBLMzJPQkpfVU5LTk9XTiwgMCApKSkgCisJaWYgKCEoaW9wdHIgPSBIQU5ETEVfR2V0T2JqUHRyKCBQUk9DRVNTX0N1cnJlbnQoKSwgaEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX1VOS05PV04sIDAgKSkpIAogCQlyZXR1cm4gSEZJTEVfRVJST1IzMjsKICAgICAgICAgaWYgKEszMk9CSl9PUFMoaW9wdHIpLT53cml0ZSkKICAgICAgICAgICAgIHN0YXR1cyA9IEszMk9CSl9PUFMoaW9wdHIpLT53cml0ZShpb3B0ciwgbHBCdWZmZXIsIG51bWJlck9mQnl0ZXNUb1dyaXRlLCAKQEAgLTYxLDcgKzYyLDggQEAKIAlUUkFDRShmaWxlLCAiJWQgJXAgJWxkXG4iLCBoRmlsZSwgbHBCdWZmZXIsIAogCQkgICAgIG51bWJlck9mQnl0ZXNUb1JlYWQpOwogCQotCWlmICghKGlvcHRyID0gSEFORExFX0dldE9ialB0ciggaEZpbGUsIEszMk9CSl9VTktOT1dOLCAwICkpKSAKKwlpZiAoIShpb3B0ciA9IEhBTkRMRV9HZXRPYmpQdHIoIFBST0NFU1NfQ3VycmVudCgpLCBoRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLMzJPQkpfVU5LTk9XTiwgMCApKSkgCiAJCXJldHVybiBIRklMRV9FUlJPUjMyOwogICAgICAgICBpZiAoSzMyT0JKX09QUyhpb3B0ciktPnJlYWQpCiAgICAgICAgICAgICBzdGF0dXMgPSBLMzJPQkpfT1BTKGlvcHRyKS0+cmVhZChpb3B0ciwgbHBCdWZmZXIsIG51bWJlck9mQnl0ZXNUb1JlYWQsIApkaWZmIC0tZ2l0IGEvd2luMzIva2VybmVsMzIuYyBiL3dpbjMyL2tlcm5lbDMyLmMKaW5kZXggYmVhYmVlNi4uNWI2NzE3OSAxMDA2NDQKLS0tIGEvd2luMzIva2VybmVsMzIuYworKysgYi93aW4zMi9rZXJuZWwzMi5jCkBAIC0yLDYgKzIsNyBAQAogICogS0VSTkVMMzIgdGh1bmtzIGFuZCBvdGhlciB1bmRvY3VtZW50ZWQgc3R1ZmYKICAqCiAgKiBDb3B5cmlnaHQgMTk5Ny0xOTk4IE1hcmN1cyBNZWlzc25lcgorICogQ29weXJpZ2h0IDE5OTggICAgICBVbHJpY2ggV2VpZ2FuZAogICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtMzAsMTcgKzMxLDE3IEBACiAgKiBHZW5lcmF0ZXMgYSBGVF9Qcm9sb2cgY2FsbC4KICAqCQogICogIDBGQjZEMSAgICAgICAgICAgICAgICAgIG1vdnpibCBlZHgsY2wKLSAqICA4QjE0OTV4eHh4eHh4eAkgICAgbW92IGVkeCxbNCplZHggKyB4eHh4eHh4eF0KKyAqICA4QjE0OTV4eHh4eHh4eAkgICAgbW92IGVkeCxbNCplZHggKyB0YXJnZXRUYWJsZV0KICAqICA2OHh4eHh4eHh4CQkgICAgcHVzaCBGVF9Qcm9sb2cKICAqICBDMwkJCSAgICBscmV0CiAgKi8KLXN0YXRpYyB2b2lkIF93cml0ZV9mdHByb2xvZyhMUEJZVEUgdGh1bmssRFdPUkQgdGh1bmtzdGFydCkgeworc3RhdGljIHZvaWQgX3dyaXRlX2Z0cHJvbG9nKExQQllURSByZWxheUNvZGUgLERXT1JEICp0YXJnZXRUYWJsZSkgewogCUxQQllURQl4OwogCi0JeAk9IHRodW5rOworCXgJPSByZWxheUNvZGU7CiAJKngrKwk9IDB4MGY7KngrKz0weGI2Oyp4Kys9MHhkMTsgLyogbW92emJsIGVkeCxjbCAqLwotCSp4KysJPSAweDhCOyp4Kys9MHgxNDsqeCsrPTB4OTU7KihEV09SRCopeD0gdGh1bmtzdGFydDsKLQl4Kz00OwkvKiBtb3YgZWR4LCBbNCplZHggKyB0aHVua3N0YXJ0XSAqLworCSp4KysJPSAweDhCOyp4Kys9MHgxNDsqeCsrPTB4OTU7KihEV09SRCoqKXg9IHRhcmdldFRhYmxlOworCXgrPTQ7CS8qIG1vdiBlZHgsIFs0KmVkeCArIHRhcmdldFRhYmxlXSAqLwogCSp4KysJPSAweDY4OyAqKERXT1JEKil4ID0gKERXT1JEKUdldFByb2NBZGRyZXNzMzIoR2V0TW9kdWxlSGFuZGxlMzJBKCJLRVJORUwzMiIpLCJGVF9Qcm9sb2ciKTsKIAl4Kz00OyAJLyogcHVzaCBGVF9Qcm9sb2cgKi8KIAkqeCsrCT0gMHhDMzsJCS8qIGxyZXQgKi8KQEAgLTQ4LDM2ICs0OSwyNiBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJRlRfUHJvbG9nUHJpbWUJCQkoS0VSTkVMMzIuODkpCi0gKi8KLXZvaWQgV0lOQVBJIEZUX1Byb2xvZ1ByaW1lKAotCURXT1JEIHN0YXJ0aW5kLAkJLyogW2luXSBzdGFydCBvZiB0aHVua3RhYmxlICovCi0JTFBCWVRFIHRodW5rCQkvKiBbaW5dIHRodW5rIGNvZGVzdGFydCAqLwotKSB7Ci0JX3dyaXRlX2Z0cHJvbG9nKHRodW5rLCooRFdPUkQqKShzdGFydGluZCt0aHVuaykpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCV93cml0ZV9xdHRodW5rCQkJCQkoaW50ZXJuYWwpCiAgKiBHZW5lcmF0ZXMgYSBRVF9UaHVuayBzdHlsZSBjYWxsLgogICoKICAqICAzM0M5ICAgICAgICAgICAgICAgICAgICB4b3IgZWN4LCBlY3gKICAqICA4QTRERkMgICAgICAgICAgICAgICAgICBtb3YgY2wgLCBbZWJwLTA0XQotICogIDhCMTQ4RHh4eHh4eHh4ICAgICAgICAgIG1vdiBlZHgsIFs0KmVjeCArIChFQVgrRURYKV0KKyAqICA4QjE0OER4eHh4eHh4eCAgICAgICAgICBtb3YgZWR4LCBbNCplY3ggKyB0YXJnZXRUYWJsZV0KICAqICBCOHl5eXl5eXl5ICAgICAgICAgICAgICBtb3YgZWF4LCBRVF9UaHVuawogICogIEZGRTAgICAgICAgICAgICAgICAgICAgIGptcCBlYXgKICAqLwogc3RhdGljIHZvaWQgX3dyaXRlX3F0dGh1bmsoCi0JTFBCWVRFIHN0YXJ0LAkJLyogW2luXSBzdGFydCBvZiBRVF9UaHVuayBzdHViICovCi0JRFdPUkQgdGh1bmtzdGFydAkvKiBbaW5dIHN0YXJ0IG9mIHRodW5rIChmb3IgaW5kZXggbG9va3VwKSAqLworCUxQQllURSByZWxheUNvZGUsCS8qIFtpbl0gc3RhcnQgb2YgUVRfVGh1bmsgc3R1YiAqLworCURXT1JEICp0YXJnZXRUYWJsZQkvKiBbaW5dIHN0YXJ0IG9mIHRodW5rIChmb3IgaW5kZXggbG9va3VwKSAqLwogKSB7CiAJTFBCWVRFCXg7CiAKLQl4CT0gc3RhcnQ7CisJeAk9IHJlbGF5Q29kZTsKIAkqeCsrCT0gMHgzMzsqeCsrPTB4Qzk7IC8qIHhvciBlY3gsZWN4ICovCiAJKngrKwk9IDB4OEE7KngrKz0weDREOyp4Kys9MHhGQzsgLyogbW92YiBjbCxbZWJwLTA0XSAqLwotCSp4KysJPSAweDhCOyp4Kys9MHgxNDsqeCsrPTB4OEQ7KihEV09SRCopeD0gdGh1bmtzdGFydDsKLQl4Kz00OwkvKiBtb3YgZWR4LCBbNCplY3ggKyAoRUFYK0VEWCkgKi8KKwkqeCsrCT0gMHg4QjsqeCsrPTB4MTQ7KngrKz0weDhEOyooRFdPUkQqKil4PSB0YXJnZXRUYWJsZTsKKwl4Kz00OwkvKiBtb3YgZWR4LCBbNCplY3ggKyB0YXJnZXRUYWJsZSAqLwogCSp4KysJPSAweEI4OyAqKERXT1JEKil4ID0gKERXT1JEKUdldFByb2NBZGRyZXNzMzIoR2V0TW9kdWxlSGFuZGxlMzJBKCJLRVJORUwzMiIpLCJRVF9UaHVuayIpOwogCXgrPTQ7IAkvKiBtb3YgZWF4ICwgUVRfVGh1bmsgKi8KIAkqeCsrCT0gMHhGRjsgKngrKyA9IDB4RTA7CS8qIGptcCBlYXggKi8KQEAgLTE1Myw5ICsxNDQsOSBAQAogCQkJcmV0dXJuIDA7CiAJCXRocy0+cHRyID0gKERXT1JEKVBUUl9TRUdfVE9fTElOKHRoczE2LT5wdHIpOwogCQkvKiBjb2RlIG9mZnNldCBmb3IgUVRfVGh1bmsgaXMgYXQgMHgxQy4uLiAgKi8KLQkJX3dyaXRlX3F0dGh1bmsgKCgoTFBCWVRFKXRocykgKyB0aHMtPngxQyx0aHMtPnB0cik7CisJCV93cml0ZV9xdHRodW5rICgoKExQQllURSl0aHMpICsgdGhzLT54MUMsKERXT1JEICopdGhzLT5wdHIpOwogCQkvKiBjb2RlIG9mZnNldCBmb3IgRlRfUHJvbG9nIGlzIGF0IDB4MjAuLi4gICovCi0JCV93cml0ZV9mdHByb2xvZygoKExQQllURSl0aHMpICsgdGhzLT54MjAsdGhzLT5wdHIpOworCQlfd3JpdGVfZnRwcm9sb2coKChMUEJZVEUpdGhzKSArIHRocy0+eDIwLChEV09SRCAqKXRocy0+cHRyKTsKIAkJcmV0dXJuIDE7CiAJfQogCXJldHVybiBUUlVFOwpAQCAtMTkzLDYgKzE4NCwxODUgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQlGVF9Qcm9sb2cJCQkoS0VSTkVMMzIuMjMzKQorICogCisgKiBUaGUgc2V0IG9mIEZUXy4uLiB0aHVuayByb3V0aW5lcyBpcyB1c2VkIGluc3RlYWQgb2YgUVRfVGh1bmssCisgKiBpZiBzdHJ1Y3R1cmVzIGhhdmUgdG8gYmUgY29udmVydGVkIGZyb20gMzItYml0IHRvIDE2LWJpdAorICogKGNoYW5nZSBvZiBtZW1iZXIgYWxpZ25tZW50LCBjb252ZXJzaW9uIG9mIG1lbWJlcnMpLgorICoKKyAqIFRoZSB0aHVuayBmdW5jdGlvbiAoYXMgY3JlYXRlZCBieSB0aGUgdGh1bmsgY29tcGlsZXIpIGNhbGxzCisgKiBGVF9Qcm9sb2cgYXQgdGhlIGJlZ2lubmluZywgdG8gc2V0IHVwIGEgc3RhY2sgZnJhbWUgYW5kCisgKiBhbGxvY2F0ZSBhIDY0IGJ5dGUgYnVmZmVyIG9uIHRoZSBzdGFjay4KKyAqIFRoZSBpbnB1dCBwYXJhbWV0ZXJzICh0YXJnZXQgYWRkcmVzcyBhbmQgc29tZSBmbGFncykgYXJlCisgKiBzYXZlZCBmb3IgbGF0ZXIgdXNlIGJ5IEZUX1RodW5rLgorICoKKyAqIElucHV0OiAgRURYICAxNi1iaXQgdGFyZ2V0IGFkZHJlc3MgKFNFR1BUUikKKyAqICAgICAgICAgQ1ggICBiaXRzICAwLi43ICAgdGFyZ2V0IG51bWJlciAoaW4gdGFyZ2V0IHRhYmxlKQorICogICAgICAgICAgICAgIGJpdHMgIDguLjkgICBzb21lIGZsYWdzICh1bmNsZWFyPz8/KQorICogICAgICAgICAgICAgIGJpdHMgMTAuLjE1ICBudW1iZXIgb2YgRFdPUkQgYXJndW1lbnRzCisgKgorICogT3V0cHV0OiBBIG5ldyBzdGFja2ZyYW1lIGlzIGNyZWF0ZWQsIGFuZCBhIDY0IGJ5dGUgYnVmZmVyCisgKiAgICAgICAgIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suIFRoZSBsYXlvdXQgb2YgdGhlIHN0YWNrIAorICogICAgICAgICBvbiByZXR1cm4gaXMgYXMgZm9sbG93czoKKyAqCisgKiAgKGVicCs0KSAgcmV0dXJuIGFkZHJlc3MgdG8gY2FsbGVyIG9mIHRodW5rIGZ1bmN0aW9uCisgKiAgKGVicCkgICAgb2xkIEVCUAorICogIChlYnAtNCkgIHNhdmVkIEVCWCByZWdpc3RlciBvZiBjYWxsZXIKKyAqICAoZWJwLTgpICBzYXZlZCBFU0kgcmVnaXN0ZXIgb2YgY2FsbGVyCisgKiAgKGVicC0xMikgc2F2ZWQgRURJIHJlZ2lzdGVyIG9mIGNhbGxlcgorICogIChlYnAtMTYpIHNhdmVkIEVDWCByZWdpc3RlciwgY29udGFpbmluZyBmbGFncworICogIChlYnAtMjApIGJpdG1hcCBjb250YWluaW5nIHBhcmFtZXRlcnMgdGhhdCBhcmUgdG8gYmUgY29udmVydGVkCisgKiAgICAgICAgICAgYnkgRlRfVGh1bms7IGl0IGlzIGluaXRpYWxpemVkIHRvIDAgYnkgRlRfUHJvbG9nIGFuZAorICogICAgICAgICAgIGZpbGxlZCBpbiBieSB0aGUgdGh1bmsgY29kZSBiZWZvcmUgY2FsbGluZyBGVF9UaHVuaworICogIChlYnAtMjQpCisgKiAgICAuLi4gICAgKHVuY2xlYXIpCisgKiAgKGVicC00NCkKKyAqICAoZWJwLTQ4KSBzYXZlZCBFQVggcmVnaXN0ZXIgb2YgY2FsbGVyICh1bmNsZWFyLCBuZXZlciByZXN0b3JlZD8/PykKKyAqICAoZWJwLTUyKSBzYXZlZCBFRFggcmVnaXN0ZXIsIGNvbnRhaW5pbmcgMTYtYml0IHRodW5rIHRhcmdldAorICogIChlYnAtNTYpCisgKiAgICAuLi4gICAgKHVuY2xlYXIpCisgKiAgKGVicC02NCkKKyAqCisgKiAgRVNQIGlzIEVCUC02OCBvbiByZXR1cm4uCisgKiAgICAgICAgIAorICovCisKKyNkZWZpbmUgUE9QX0RXT1JEKGN0eCkJCSgqKChEV09SRCAqKUVTUF9yZWcoY3R4KSkrKykKKyNkZWZpbmUgUFVTSF9EV09SRChjdHgsIHZhbCkgCSotLSgoRFdPUkQgKilFU1BfcmVnKGN0eCkpID0gKHZhbCkKKworVk9JRCBXSU5BUEkgRlRfUHJvbG9nKENPTlRFWFQgKmNvbnRleHQpCit7CisgICAgLyogUG9wIHJldHVybiBhZGRyZXNzIHRvIHRodW5rIGNvZGUgKi8KKyAgICBFSVBfcmVnKGNvbnRleHQpID0gUE9QX0RXT1JEKGNvbnRleHQpOworCisgICAgLyogQnVpbGQgc3RhY2sgZnJhbWUgKi8KKyAgICBQVVNIX0RXT1JEKGNvbnRleHQsIEVCUF9yZWcoY29udGV4dCkpOworICAgIEVCUF9yZWcoY29udGV4dCkgPSBFU1BfcmVnKGNvbnRleHQpOworCisgICAgLyogQWxsb2NhdGUgNjQtYnl0ZSBUaHVuayBCdWZmZXIgKi8KKyAgICBFU1BfcmVnKGNvbnRleHQpIC09IDY0OworICAgIG1lbXNldCgoY2hhciAqKUVTUF9yZWcoY29udGV4dCksICdcMCcsIDY0KTsKKworICAgIC8qIFN0b3JlIEZsYWdzIChFQ1gpIGFuZCBUYXJnZXQgQWRkcmVzcyAoRURYKSAqLworICAgIC8qIFNhdmUgb3RoZXIgcmVnaXN0ZXJzIHRvIGJlIHJlc3RvcmVkIGxhdGVyICovCisgICAgKihEV09SRCAqKShFQlBfcmVnKGNvbnRleHQpIC0gIDQpID0gRUJYX3JlZyhjb250ZXh0KTsKKyAgICAqKERXT1JEICopKEVCUF9yZWcoY29udGV4dCkgLSAgOCkgPSBFU0lfcmVnKGNvbnRleHQpOworICAgICooRFdPUkQgKikoRUJQX3JlZyhjb250ZXh0KSAtIDEyKSA9IEVESV9yZWcoY29udGV4dCk7CisgICAgKihEV09SRCAqKShFQlBfcmVnKGNvbnRleHQpIC0gMTYpID0gRUNYX3JlZyhjb250ZXh0KTsKKworICAgICooRFdPUkQgKikoRUJQX3JlZyhjb250ZXh0KSAtIDQ4KSA9IEVBWF9yZWcoY29udGV4dCk7CisgICAgKihEV09SRCAqKShFQlBfcmVnKGNvbnRleHQpIC0gNTIpID0gRURYX3JlZyhjb250ZXh0KTsKKyAgICAKKyAgICAvKiBQdXNoIHJldHVybiBhZGRyZXNzIGJhY2sgb250byBzdGFjayAqLworICAgIFBVU0hfRFdPUkQoY29udGV4dCwgRUlQX3JlZyhjb250ZXh0KSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCUZUX1RodW5rCQkJKEtFUk5FTDMyLjIzNCkKKyAqCisgKiBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgdGhlIGFjdHVhbCBjYWxsIHRvIDE2LWJpdCBjb2RlLCAKKyAqIHNpbWlsYXIgdG8gUVRfVGh1bmsuIFRoZSBkaWZmZXJlbmNlcyBhcmU6CisgKiAgLSBUaGUgY2FsbCB0YXJnZXQgaXMgdGFrZW4gZnJvbSB0aGUgYnVmZmVyIGNyZWF0ZWQgYnkgRlRfUHJvbG9nCisgKiAgLSBUaG9zZSBhcmd1bWVudHMgcmVxdWVzdGVkIGJ5IHRoZSB0aHVuayBjb2RlIChieSBzZXR0aW5nIHRoZQorICogICAgY29ycmVzcG9uZGluZyBiaXQgaW4gdGhlIGJpdG1hcCBhdCBFQlAtMjApIGFyZSBjb252ZXJ0ZWQKKyAqICAgIGZyb20gMzItYml0IHBvaW50ZXJzIHRvIHNlZ21lbnRlZCBwb2ludGVycyAodGhvc2UgcG9pbnRlcnMKKyAqICAgIGFyZSBndWFyYW50ZWVkIHRvIHBvaW50IHRvIHN0cnVjdHVyZXMgY29waWVkIHRvIHRoZSBzdGFjaworICogICAgYnkgdGhlIHRodW5rIGNvZGUsIHNvIHdlIGFsd2F5cyB1c2UgdGhlIDE2LWJpdCBzdGFjayBzZWxlY3RvcgorICogICAgZm9yIHRob3NlIGFkZHJlc3NlcykuCisgKiAKKyAqICAgIFRoZSBiaXQgI2kgb2YgRUJQLTIwIGNvcnJlc3BvbmRzIGhlcmUgdG8gdGhlIERXT1JEIHN0YXJ0aW5nIGF0CisgKiAgICBFU1ArNCArIDIqaS4KKyAqIAorICogRklYTUU6IEl0IGlzIHVuY2xlYXIgd2hhdCBoYXBwZW5zIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gMzIgV09SRHMgCisgKiAgICAgICAgb2YgYXJndW1lbnRzLCBzbyB0aGF0IHRoZSBzaW5nbGUgRFdPUkQgYml0bWFwIGlzIG5vIGxvbmdlcgorICogICAgICAgIHN1ZmZpY2llbnQgLi4uCisgKi8KKworVk9JRCBXSU5BUEkgRlRfVGh1bmsoQ09OVEVYVCAqY29udGV4dCkKK3sKKyAgICBEV09SRCBtYXBFU1ByZWxhdGl2ZSA9ICooRFdPUkQgKikoRUJQX3JlZyhjb250ZXh0KSAtIDIwKTsKKyAgICBEV09SRCBjYWxsVGFyZ2V0ICAgICA9ICooRFdPUkQgKikoRUJQX3JlZyhjb250ZXh0KSAtIDUyKTsKKworICAgIENPTlRFWFQgY29udGV4dDE2OworICAgIERXT1JEIGksIGFyZ3NpemU7CisgICAgTFBCWVRFIG5ld3N0YWNrOworICAgIFRIREIgKnRoZGIgPSBUSFJFQURfQ3VycmVudCgpOworCisgICAgbWVtY3B5KCZjb250ZXh0MTYsY29udGV4dCxzaXplb2YoY29udGV4dDE2KSk7CisKKyAgICBDU19yZWcoJmNvbnRleHQxNikgID0gSElXT1JEKGNhbGxUYXJnZXQpOworICAgIElQX3JlZygmY29udGV4dDE2KSAgPSBMT1dPUkQoY2FsbFRhcmdldCk7CisgICAgRUJQX3JlZygmY29udGV4dDE2KSA9IE9GRlNFVE9GKCB0aGRiLT5jdXJfc3RhY2sgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoV09SRCkmKChTVEFDSzE2RlJBTUUqKTApLT5icDsKKworICAgIGFyZ3NpemUgID0gRUJQX3JlZyhjb250ZXh0KS1FU1BfcmVnKGNvbnRleHQpLTB4NDQ7CisgICAgbmV3c3RhY2sgPSAoKExQQllURSlUSFJFQURfU1RBQ0sxNih0aGRiKSktYXJnc2l6ZTsKKworICAgIG1lbWNweSggbmV3c3RhY2ssIChMUEJZVEUpRVNQX3JlZyhjb250ZXh0KSs0LCBhcmdzaXplICk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykJLyogTk9URTogV2hhdCBhYm91dCA+IDMyIGFyZ3VtZW50cz8gKi8KKwlpZiAobWFwRVNQcmVsYXRpdmUgJiAoMSA8PCBpKSkKKwl7CisJICAgIFNFR1BUUiAqYXJnID0gKFNFR1BUUiAqKShuZXdzdGFjayArIDIqaSk7CisJICAgICphcmcgPSBQVFJfU0VHX09GRl9UT19TRUdQVFIoU0VMRUNUT1JPRih0aGRiLT5jdXJfc3RhY2spLCAKKwkJCQkJICooTFBCWVRFICopYXJnIC0gbmV3c3RhY2spOworCX0KKworICAgIEVBWF9yZWcoY29udGV4dCkgPSBDYWxsYmFja3MtPkNhbGxSZWdpc3RlclNob3J0UHJvYyggJmNvbnRleHQxNiwgYXJnc2l6ZSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQlGVF9FeGl0Tk4JCShLRVJORUwzMi4yMTggLSAyMzIpCisgKgorICogT25lIG9mIHRoZSBGVF9FeGl0Tk4gZnVuY3Rpb25zIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSB0aHVuayBjb2RlLgorICogSXQgcmVtb3ZlcyB0aGUgc3RhY2sgZnJhbWUgY3JlYXRlZCBieSBGVF9Qcm9sb2csIG1vdmVzIHRoZSBmdW5jdGlvbgorICogcmV0dXJuIGZyb20gRUJYIHRvIEVBWCAoeWVzLCBGVF9UaHVuayBkaWQgdXNlIEVBWCBmb3IgdGhlIHJldHVybiAKKyAqIHZhbHVlLCBidXQgdGhlIHRodW5rIGNvZGUgaGFzIG1vdmVkIGl0IGZyb20gRUFYIHRvIEVCWCBpbiB0aGUgCisgKiBtZWFudGltZSAuLi4gOi0pLCByZXN0b3JlcyB0aGUgY2FsbGVyJ3MgRUJYLCBFU0ksIGFuZCBFREkgcmVnaXN0ZXJzLAorICogYW5kIHBlcmZvcm0gYSByZXR1cm4gdG8gdGhlIENBTExFUiBvZiB0aGUgdGh1bmsgY29kZSAod2hpbGUgcmVtb3ZpbmcKKyAqIHRoZSBnaXZlbiBudW1iZXIgb2YgYXJndW1lbnRzIGZyb20gdGhlIGNhbGxlcidzIHN0YWNrKS4KKyAqLworCitWT0lEIFdJTkFQSSBGVF9FeGl0KENPTlRFWFQgKmNvbnRleHQsIGludCBuUG9wQXJncykKK3sKKyAgICAvKiBSZXR1cm4gdmFsdWUgaXMgaW4gRUJYICovCisgICAgRUFYX3JlZyhjb250ZXh0KSA9IEVCWF9yZWcoY29udGV4dCk7CisKKyAgICAvKiBSZXN0b3JlIEVCWCwgRVNJLCBhbmQgRURJIHJlZ2lzdGVycyAqLworICAgIEVCWF9yZWcoY29udGV4dCkgPSAqKERXT1JEICopKEVCUF9yZWcoY29udGV4dCkgLSAgNCk7CisgICAgRVNJX3JlZyhjb250ZXh0KSA9ICooRFdPUkQgKikoRUJQX3JlZyhjb250ZXh0KSAtICA4KTsKKyAgICBFRElfcmVnKGNvbnRleHQpID0gKihEV09SRCAqKShFQlBfcmVnKGNvbnRleHQpIC0gMTIpOworCisgICAgLyogQ2xlYW4gdXAgc3RhY2sgZnJhbWUgKi8KKyAgICBFU1BfcmVnKGNvbnRleHQpID0gRUJQX3JlZyhjb250ZXh0KTsKKyAgICBFQlBfcmVnKGNvbnRleHQpID0gUE9QX0RXT1JEKGNvbnRleHQpOworCisgICAgLyogUG9wIHJldHVybiBhZGRyZXNzIHRvIENBTExFUiBvZiB0aHVuayBjb2RlICovCisgICAgRUlQX3JlZyhjb250ZXh0KSA9IFBPUF9EV09SRChjb250ZXh0KTsKKyAgICAvKiBSZW1vdmUgYXJndW1lbnRzICovCisgICAgRVNQX3JlZyhjb250ZXh0KSArPSBuUG9wQXJnczsKKyAgICAvKiBQdXNoIHJldHVybiBhZGRyZXNzIGJhY2sgb250byBzdGFjayAqLworICAgIFBVU0hfRFdPUkQoY29udGV4dCwgRUlQX3JlZyhjb250ZXh0KSk7Cit9CisKK1ZPSUQgV0lOQVBJIEZUX0V4aXQwIChDT05URVhUICpjb250ZXh0KSB7IEZUX0V4aXQoY29udGV4dCwgIDApOyB9CitWT0lEIFdJTkFQSSBGVF9FeGl0NCAoQ09OVEVYVCAqY29udGV4dCkgeyBGVF9FeGl0KGNvbnRleHQsICA0KTsgfQorVk9JRCBXSU5BUEkgRlRfRXhpdDggKENPTlRFWFQgKmNvbnRleHQpIHsgRlRfRXhpdChjb250ZXh0LCAgOCk7IH0KK1ZPSUQgV0lOQVBJIEZUX0V4aXQxMihDT05URVhUICpjb250ZXh0KSB7IEZUX0V4aXQoY29udGV4dCwgMTIpOyB9CitWT0lEIFdJTkFQSSBGVF9FeGl0MTYoQ09OVEVYVCAqY29udGV4dCkgeyBGVF9FeGl0KGNvbnRleHQsIDE2KTsgfQorVk9JRCBXSU5BUEkgRlRfRXhpdDIwKENPTlRFWFQgKmNvbnRleHQpIHsgRlRfRXhpdChjb250ZXh0LCAyMCk7IH0KK1ZPSUQgV0lOQVBJIEZUX0V4aXQyNChDT05URVhUICpjb250ZXh0KSB7IEZUX0V4aXQoY29udGV4dCwgMjQpOyB9CitWT0lEIFdJTkFQSSBGVF9FeGl0MjgoQ09OVEVYVCAqY29udGV4dCkgeyBGVF9FeGl0KGNvbnRleHQsIDI4KTsgfQorVk9JRCBXSU5BUEkgRlRfRXhpdDMyKENPTlRFWFQgKmNvbnRleHQpIHsgRlRfRXhpdChjb250ZXh0LCAzMik7IH0KK1ZPSUQgV0lOQVBJIEZUX0V4aXQzNihDT05URVhUICpjb250ZXh0KSB7IEZUX0V4aXQoY29udGV4dCwgMzYpOyB9CitWT0lEIFdJTkFQSSBGVF9FeGl0NDAoQ09OVEVYVCAqY29udGV4dCkgeyBGVF9FeGl0KGNvbnRleHQsIDQwKTsgfQorVk9JRCBXSU5BUEkgRlRfRXhpdDQ0KENPTlRFWFQgKmNvbnRleHQpIHsgRlRfRXhpdChjb250ZXh0LCA0NCk7IH0KK1ZPSUQgV0lOQVBJIEZUX0V4aXQ0OChDT05URVhUICpjb250ZXh0KSB7IEZUX0V4aXQoY29udGV4dCwgNDgpOyB9CitWT0lEIFdJTkFQSSBGVF9FeGl0NTIoQ09OVEVYVCAqY29udGV4dCkgeyBGVF9FeGl0KGNvbnRleHQsIDUyKTsgfQorVk9JRCBXSU5BUEkgRlRfRXhpdDU2KENPTlRFWFQgKmNvbnRleHQpIHsgRlRfRXhpdChjb250ZXh0LCA1Nik7IH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFdPV0NhbGxiYWNrMTYgKEtFUk5FTDMyLjYyKShXT1czMi4yKQogICogQ2FsbHMgYSB3aW4xNiBmdW5jdGlvbiB3aXRoIGEgc2luZ2xlIERXT1JEIGFyZ3VtZW50LgogICogUkVUVVJOUwpAQCAtMjQyLDcgKzQxMiw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCQlfS0VSTkVMMzJfNDMgCShLRVJORUwzMi40MikKKyAqIAkJVGh1bmtJbml0TFMgCShLRVJORUwzMi40MykKICAqIEEgdGh1bmtidWZmZXIgbGluayByb3V0aW5lIAogICogVGhlIHRodW5rYnVmIGxvb2tzIGxpa2U6CiAgKgpAQCAtMjU0LDcgKzQyNCw3IEBACiAgKiBSRVRVUk5TCiAgKglzZWdtZW50ZWQgcG9pbnRlciB0byB0aHVuaz8KICAqLwotRFdPUkQgV0lOQVBJIF9LRVJORUwzMl80MygKK0RXT1JEIFdJTkFQSSBUaHVua0luaXRMUygKIAlMUERXT1JEIHRodW5rLAkvKiBbaW5dIHdpbjMyIHRodW5rICovCiAJTFBDU1RSIHRoa2J1ZiwJLyogW2luXSB0aGtidWZmZXIgbmFtZSBpbiB3aW4xNiBkbGwgKi8KIAlEV09SRCBsZW4sCS8qIFtpbl0gdGhrYnVmZmVyIGxlbmd0aCAqLwpAQCAtMjkzLDM5ICs0NjMsNzAgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAJCV9LRVJORUwzMl80NSAJKEtFUk5FTDMyLjQ0KQotICogQW5vdGhlciAzMi0+MTYgdGh1bmssIHRoZSBkaWZmZXJlbmNlIHRvIFFUX1RodW5rIGlzLCB0aGF0IHRoZSBjYWxsZWQgcm91dGluZQotICogdXNlcyAweDY2IGxyZXQsIGFuZCB0aGF0IHdlIGhhdmUgdG8gcGFzcyBDWCBpbiBESS4KLSAqICh0aGVyZSBzZWVtcyB0byBiZSBzb21lIGtpbmQgb2YgQkwvQlggcmV0dXJuIG1hZ2ljIHRvby4uLikKKyAqIAkJQ29tbW9uMzJUaGtMUyAJKEtFUk5FTDMyLjQ1KQorICogCisgKiBUaGlzIGlzIGFub3RoZXIgMzItPjE2IHRodW5rLCBpbmRlcGVuZGVudCBvZiB0aGUgUVRfVGh1bmsvRlRfVGh1bmsKKyAqIHN0eWxlIHRodW5rcy4gVGhlIGJhc2ljIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgcGFyYW1ldGVyIGNvbnZlcnNpb24gCisgKiBpcyBkb25lIGNvbXBsZXRlbHkgb24gdGhlICoxNi1iaXQqIHNpZGUgaGVyZS4gVGh1cyB3ZSBkbyBub3QgY2FsbAorICogdGhlIDE2LWJpdCB0YXJnZXQgZGlyZWN0bHksIGJ1dCBjYWxsIGEgY29tbW9uIGVudHJ5IHBvaW50IGluc3RlYWQuCisgKiBUaGlzIGVudHJ5IGZ1bmN0aW9uIHRoZW4gY2FsbHMgdGhlIHRhcmdldCBhY2NvcmRpbmcgdG8gdGhlIHRhcmdldAorICogbnVtYmVyIHBhc3NlZCBpbiB0aGUgREkgcmVnaXN0ZXIuCisgKiAKKyAqIElucHV0OiAgRUFYICAgIFNFR1BUUiB0byB0aGUgY29tbW9uIDE2LWJpdCBlbnRyeSBwb2ludAorICogICAgICAgICBDWCAgICAgb2Zmc2V0IGluIHRodW5rIHRhYmxlICh0YXJnZXQgbnVtYmVyICogNCkKKyAqICAgICAgICAgRFggICAgIGVycm9yIHJldHVybiB2YWx1ZSBpZiBleGVjdXRpb24gZmFpbHMgKHVuY2xlYXI/Pz8pCisgKiAgICAgICAgIEVEWC5ISSBudW1iZXIgb2YgRFdPUkQgcGFyYW1ldGVycwogICoKLSAqIFtjcmFzaGVzXQorICogKE5vdGUgdGhhdCB3ZSBuZWVkIHRvIG1vdmUgdGhlIHRodW5rIHRhYmxlIG9mZnNldCBmcm9tIENYIHRvIERJICEpCisgKgorICogVGhlIGNhbGxlZCAxNi1iaXQgc3R1YiBleHBlY3RzIGl0cyBzdGFjayB0byBsb29rIGxpa2UgdGhpczoKKyAqICAgICAuLi4KKyAqICAgKGVzcCs0MCkgIDMyLWJpdCBhcmd1bWVudHMKKyAqICAgICAuLi4KKyAqICAgKGVzcCs4KSAgIDMyIGJ5dGUgb2Ygc3RhY2sgc3BhY2UgYXZhaWxhYmxlIGFzIGJ1ZmZlcgorICogICAoZXNwKSAgICAgOCBieXRlIHJldHVybiBhZGRyZXNzIGZvciB1c2Ugd2l0aCAweDY2IGxyZXQgCisgKiAKKyAqIFRoZSBjYWxsZWQgMTYtYml0IHN0dWIgdXNlcyBhIDB4NjYgbHJldCB0byByZXR1cm4gdG8gMzItYml0IGNvZGUsCisgKiBhbmQgdXNlcyB0aGUgRUFYIHJlZ2lzdGVyIHRvIHJldHVybiBhIERXT1JEIHJldHVybiB2YWx1ZS4KKyAqIFRodXMgd2UgbmVlZCB0byB1c2UgYSBzcGVjaWFsIGFzc2VtYmx5IGdsdWUgcm91dGluZSAKKyAqIChDYWxsUmVnaXN0ZXJMb25nUHJvYyBpbnN0ZWFkIG9mIENhbGxSZWdpc3RlclNob3J0UHJvYykuCisgKgorICogRmluYWxseSwgd2UgcmV0dXJuIHRvIHRoZSBjYWxsZXIsIHBvcHBpbmcgdGhlIGFyZ3VtZW50cyBvZmYgCisgKiB0aGUgc3RhY2suCisgKgorICogRklYTUU6IFRoZSBjYWxsZWQgZnVuY3Rpb24gdXNlcyBFQlggdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgYXJndW1lbnRzIHRoYXQgYXJlIHRvIGJlIHBvcHBlZCBvZmYgdGhlIGNhbGxlcidzIHN0YWNrLgorICogICAgICAgIFRoaXMgaXMgY2xvYmJlcmVkIGJ5IHRoZSBhc3NlbWJseSBnbHVlLCBzbyB3ZSBzaW1wbHkgdXNlCisgKiAgICAgICAgdGhlIG9yaWdpbmFsIEVEWC5ISSB0byBnZXQgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgKiAgICAgICAgKFRob3NlIHR3byB2YWx1ZXMgc2hvdWxkIGJlIGVxdWFsIGFueXdheSAuLi4/KQorICogCiAgKi8KLVZPSUQgV0lOQVBJIF9LRVJORUwzMl80NShDT05URVhUICpjb250ZXh0KQorVk9JRCBXSU5BUEkgQ29tbW9uMzJUaGtMUyhDT05URVhUICpjb250ZXh0KQogewotCUNPTlRFWFQJY29udGV4dDE2OwotCUxQQllURQljdXJzdGFjazsKLSAgICAgICAgRFdPUkQgcmV0LHN0YWNrc2l6ZTsKLQlUSERCICp0aGRiID0gVEhSRUFEX0N1cnJlbnQoKTsKKyAgICBDT05URVhUIGNvbnRleHQxNjsKKyAgICBEV09SRCBhcmdzaXplOworICAgIFRIREIgKnRoZGIgPSBUSFJFQURfQ3VycmVudCgpOwogCi0JVFJBQ0UodGh1bmssIiglJWVheD0weCUwOGx4KCUlY3g9MHglMDRseCwlJWVkeD0weCUwOGx4KSlcbiIsCi0JCShEV09SRClFQVhfcmVnKGNvbnRleHQpLChEV09SRClDWF9yZWcoY29udGV4dCksKERXT1JEKUVEWF9yZWcoY29udGV4dCkKLQkpOwotCXN0YWNrc2l6ZSA9IEVCUF9yZWcoY29udGV4dCktRVNQX3JlZyhjb250ZXh0KTsKLQlUUkFDRSh0aHVuaywiCXN0YWNrc2l6ZSA9ICVsZFxuIixzdGFja3NpemUpOworICAgIG1lbWNweSgmY29udGV4dDE2LGNvbnRleHQsc2l6ZW9mKGNvbnRleHQxNikpOwogCi0JbWVtY3B5KCZjb250ZXh0MTYsY29udGV4dCxzaXplb2YoY29udGV4dDE2KSk7CisgICAgRElfcmVnKCZjb250ZXh0MTYpICA9IENYX3JlZyhjb250ZXh0KTsKKyAgICBDU19yZWcoJmNvbnRleHQxNikgID0gSElXT1JEKEVBWF9yZWcoY29udGV4dCkpOworICAgIElQX3JlZygmY29udGV4dDE2KSAgPSBMT1dPUkQoRUFYX3JlZyhjb250ZXh0KSk7CisgICAgRUJQX3JlZygmY29udGV4dDE2KSA9IE9GRlNFVE9GKCB0aGRiLT5jdXJfc3RhY2sgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoV09SRCkmKChTVEFDSzE2RlJBTUUqKTApLT5icDsKIAotCURJX3JlZygmY29udGV4dDE2KQkgPSBDWF9yZWcoY29udGV4dCk7Ci0JQ1NfcmVnKCZjb250ZXh0MTYpCSA9IEhJV09SRChFQVhfcmVnKGNvbnRleHQpKTsKLQlJUF9yZWcoJmNvbnRleHQxNikJID0gTE9XT1JEKEVBWF9yZWcoY29udGV4dCkpOworICAgIGFyZ3NpemUgPSBISVdPUkQoRURYX3JlZyhjb250ZXh0KSkgKiA0OwogCi0JY3Vyc3RhY2sgPSBQVFJfU0VHX1RPX0xJTihTVEFDSzE2X1BVU0goIHRoZGIsIHN0YWNrc2l6ZSApKTsKLQltZW1jcHkoY3Vyc3RhY2sgLSBzdGFja3NpemUsKExQQllURSlFU1BfcmVnKGNvbnRleHQpLHN0YWNrc2l6ZSk7Ci0JcmV0ID0gQ2FsbGJhY2tzLT5DYWxsUmVnaXN0ZXJMb25nUHJvYygmY29udGV4dDE2LDApOwotCVNUQUNLMTZfUE9QKCB0aGRiLCBzdGFja3NpemUgKTsKKyAgICBtZW1jcHkoICgoTFBCWVRFKVRIUkVBRF9TVEFDSzE2KHRoZGIpKS1hcmdzaXplLAorICAgICAgICAgICAgKExQQllURSlFU1BfcmVnKGNvbnRleHQpKzQsIGFyZ3NpemUgKTsKIAotCVRSQUNFKHRodW5rLCIuIHJldHVybmVkICUwOGx4XG4iLHJldCk7Ci0JRUFYX3JlZyhjb250ZXh0KSAJID0gcmV0OworICAgIEVBWF9yZWcoY29udGV4dCkgPSBDYWxsYmFja3MtPkNhbGxSZWdpc3RlckxvbmdQcm9jKCZjb250ZXh0MTYsIGFyZ3NpemUgKyAzMik7CisKKyAgICAvKiBDbGVhbiB1cCBjYWxsZXIncyBzdGFjayBmcmFtZSAqLworCisgICAgRUlQX3JlZyhjb250ZXh0KSA9IFBPUF9EV09SRChjb250ZXh0KTsKKyAgICBFU1BfcmVnKGNvbnRleHQpICs9IGFyZ3NpemU7CisgICAgUFVTSF9EV09SRChjb250ZXh0LCBFSVBfcmVnKGNvbnRleHQpKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zNjQsNyArNTY1LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkoS0VSTkVMMzIuNDEpCisgKgkJVGh1bmtJbml0TFNGCQkoS0VSTkVMMzIuNDEpCiAgKiBBIHRodW5rIHNldHVwIHJvdXRpbmUuCiAgKiBFeHBlY3RzIGEgcG9pbnRlciB0byBhIHByZWluaXRpYWxpemVkIHRodW5rYnVmZmVyIGluIHRoZSBmaXJzdCBhcmd1bWVudAogICogbG9va2luZyBsaWtlOgpAQCAtNDAxLDcgKzYwMiw3IEBACiAgKiBSRVRVUk5TCiAgKgl1bmNsZWFyLCBwb2ludGVyIHRvIHdpbjE2IHRoa2J1ZmZlcj8KICAqLwotTFBWT0lEIFdJTkFQSSBfS0VSTkVMMzJfNDEoCitMUFZPSUQgV0lOQVBJIFRodW5rSW5pdExTRigKIAlMUEJZVEUgdGh1bmssCS8qIFtpbl0gd2luMzIgdGh1bmsgKi8KIAlMUENTVFIgdGhrYnVmLAkvKiBbaW5dIHRoa2J1ZmZlciBuYW1lIGluIHdpbjE2IGRsbCAqLwogCURXT1JEIGxlbiwJLyogW2luXSBsZW5ndGggb2YgdGhrYnVmZmVyICovCkBAIC00NDcsMzMgKzY0OCw3MyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCQkJCShLRVJORUwzMi45MCkKLSAqIFFUIFRodW5rIHByaW1pbmcgZnVuY3Rpb24KLSAqIFJld3JpdGVzIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSB0aHVuayB0byB1c2UgdGhlIFFUX1RodW5rIGludGVyZmFjZQotICogYW5kIGp1bXBzIHRvIHRoZSBzdGFydCBvZiB0aGF0IGNvZGUuCi0gKiBbb2tdCisgKgkJRlRfUHJvbG9nUHJpbWUJCQkoS0VSTkVMMzIuODkpCisgKiAKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIHJlbGF5IGNvZGUgaW5zdGFsbGVkIGJ5CisgKiBUaHVua0luaXRMU0YuIEl0IHJlcGxhY2VzIHRoZSBsb2NhdGlvbiBmcm9tIHdoZXJlIGl0IHdhcyAKKyAqIGNhbGxlZCBieSBhIHN0YW5kYXJkIEZUX1Byb2xvZyBjYWxsIHN0dWIgKHdoaWNoIGlzICdwcmltZWQnCisgKiBieSBpbnNlcnRpbmcgdGhlIGNvcnJlY3QgdGFyZ2V0IHRhYmxlIHBvaW50ZXIpLgorICogRmluYWxseSwgaXQgY2FsbHMgdGhhdCBzdHViLgorICogCisgKiBJbnB1dDogIEVDWCAgICB0YXJnZXQgbnVtYmVyICsgZmxhZ3MgKHBhc3NlZCB0aHJvdWdoIHRvIEZUX1Byb2xvZykKKyAqICAgICAgICAoRVNQKSAgIG9mZnNldCBvZiBsb2NhdGlvbiB3aGVyZSB0YXJnZXQgdGFibGUgcG9pbnRlciAKKyAqICAgICAgICAgICAgICAgIGlzIHN0b3JlZCwgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSByZWxheSBjb2RlCisgKiAgICAgICAgKEVTUCs0KSBwb2ludGVyIHRvIHN0YXJ0IG9mIHJlbGF5IGNvZGUKKyAqICAgICAgICAgICAgICAgICh0aGlzIGlzIHdoZXJlIHRoZSBGVF9Qcm9sb2cgY2FsbCBzdHViIGdldHMgd3JpdHRlbiB0bykKKyAqIAorICogTm90ZTogVGhlIHR3byBEV09SRCBhcmd1bWVudHMgZ2V0IHBvcHBlZCBmcm9tIHRoZSBzdGFjay4KKyAqICAgICAgICAKICAqLwotVk9JRCBXSU5BUEkgX0tFUk5FTDMyXzkwKENPTlRFWFQgKmNvbnRleHQpCitWT0lEIFdJTkFQSSBGVF9Qcm9sb2dQcmltZShDT05URVhUICpjb250ZXh0KQogewotCVRSQUNFKHRodW5rLCAiUVQgVGh1bmsgcHJpbWluZzsgY29udGV4dCAlcFxuIiwgY29udGV4dCk7Ci0JCi0JX3dyaXRlX3F0dGh1bmsoKExQQllURSlFQVhfcmVnKGNvbnRleHQpLCooRFdPUkQqKShFQVhfcmVnKGNvbnRleHQpK0VEWF9yZWcoY29udGV4dCkpKTsKLQkvKiB3ZSBqdXN0IGNhbGwgdGhlIHJlYWwgUVRfVGh1bmsgcmlnaHQgbm93IAotCSAqIHdlIGNhbiBieXBhc3MgdGhlIHJlbGF5Y29kZSwgZm9yIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmVnaXN0ZXJjb250ZXh0Ci0JICovCi0JRURYX3JlZyhjb250ZXh0KSA9ICooRFdPUkQqKSgoKihEV09SRCopKEVBWF9yZWcoY29udGV4dCkrRURYX3JlZyhjb250ZXh0KSkpKzQqKCgoQllURSopRUJQX3JlZyhjb250ZXh0KSlbLTRdKSk7Ci0JcmV0dXJuIFFUX1RodW5rKGNvbnRleHQpOworICAgIERXT1JEICB0YXJnZXRUYWJsZU9mZnNldCA9IFBPUF9EV09SRChjb250ZXh0KTsKKyAgICBMUEJZVEUgcmVsYXlDb2RlID0gKExQQllURSlQT1BfRFdPUkQoY29udGV4dCk7CisgICAgRFdPUkQgKnRhcmdldFRhYmxlID0gKihEV09SRCAqKikocmVsYXlDb2RlK3RhcmdldFRhYmxlT2Zmc2V0KTsKKyAgICBEV09SRCAgdGFyZ2V0TnIgPSBMT0JZVEUoRUNYX3JlZyhjb250ZXh0KSk7CisKKyAgICBfd3JpdGVfZnRwcm9sb2cocmVsYXlDb2RlLCB0YXJnZXRUYWJsZSk7CisKKyAgICAvKiBXZSBzaG91bGQgYWN0dWFsbHkgY2FsbCB0aGUgcmVsYXkgY29kZSBub3csICovCisgICAgLyogYnV0IHdlIHNraXAgaXQgYW5kIGdvIGRpcmVjdGx5IHRvIEZUX1Byb2xvZyAqLworICAgIEVEWF9yZWcoY29udGV4dCkgPSB0YXJnZXRUYWJsZVt0YXJnZXROcl07CisgICAgRlRfUHJvbG9nKGNvbnRleHQpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCQkJCShLRVJORUwzMi40NSkKKyAqCQlRVF9UaHVua1ByaW1lCQkJKEtFUk5FTDMyLjkwKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29ycmVzcG9uZHMgdG8gRlRfUHJvbG9nUHJpbWUsIGJ1dCBpbnN0YWxscyBhIAorICogY2FsbCBzdHViIGZvciBRVF9UaHVuayBpbnN0ZWFkLgorICoKKyAqIElucHV0OiAoRUJQLTQpIHRhcmdldCBudW1iZXIgKHBhc3NlZCB0aHJvdWdoIHRvIFFUX1RodW5rKQorICogICAgICAgICBFRFggICAgdGFyZ2V0IHRhYmxlIHBvaW50ZXIgbG9jYXRpb24gb2Zmc2V0CisgKiAgICAgICAgIEVBWCAgICBzdGFydCBvZiByZWxheSBjb2RlCisgKiAgICAgIAorICovCitWT0lEIFdJTkFQSSBRVF9UaHVua1ByaW1lKENPTlRFWFQgKmNvbnRleHQpCit7CisgICAgRFdPUkQgIHRhcmdldFRhYmxlT2Zmc2V0ID0gRURYX3JlZyhjb250ZXh0KTsKKyAgICBMUEJZVEUgcmVsYXlDb2RlID0gKExQQllURSlFQVhfcmVnKGNvbnRleHQpOworICAgIERXT1JEICp0YXJnZXRUYWJsZSA9ICooRFdPUkQgKiopKHJlbGF5Q29kZSt0YXJnZXRUYWJsZU9mZnNldCk7CisgICAgRFdPUkQgIHRhcmdldE5yID0gKihEV09SRCAqKShFQlBfcmVnKGNvbnRleHQpIC0gNCk7CisKKyAgICBfd3JpdGVfcXR0aHVuayhyZWxheUNvZGUsIHRhcmdldFRhYmxlKTsKKworICAgIC8qIFdlIHNob3VsZCBhY3R1YWxseSBjYWxsIHRoZSByZWxheSBjb2RlIG5vdywgKi8KKyAgICAvKiBidXQgd2Ugc2tpcCBpdCBhbmQgZ28gZGlyZWN0bHkgdG8gUVRfVGh1bmsgKi8KKyAgICBFRFhfcmVnKGNvbnRleHQpID0gdGFyZ2V0VGFibGVbdGFyZ2V0TnJdOworICAgIFFUX1RodW5rKGNvbnRleHQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCQkJCShLRVJORUwzMi40NikKICAqIEFub3RoZXIgdGh1bmtidWYgbGluayByb3V0aW5lLgogICogVGhlIHN0YXJ0IG9mIHRoZSB0aHVua2J1ZiBsb29rcyBsaWtlIHRoaXM6CiAgKiAJMDA6IERXT1JECWxlbmd0aAogICoJMDQ6IFNFR1BUUglhZGRyZXNzIGZvciB0aHVua2J1ZmZlciBwb2ludGVyCiAgKiBbb2sgcHJvYmFibHldCiAgKi8KLVZPSUQgV0lOQVBJIF9LRVJORUwzMl80NigKK1ZPSUQgV0lOQVBJIFRodW5rSW5pdFNMKAogCUxQQllURSB0aHVuaywJCS8qIFtpbl0gc3RhcnQgb2YgdGh1bmtidWZmZXIgKi8KIAlMUENTVFIgdGhrYnVmLAkJLyogW2luXSBuYW1lL29yZGluYWwgb2YgdGh1bmtidWZmZXIgaW4gd2luMTYgZGxsICovCiAJRFdPUkQgbGVuLAkJLyogW2luXSBsZW5ndGggb2YgdGh1bmtidWZmZXIgKi8KQEAgLTUwOCwyOCArNzQ5LDI4IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgX0tFUk5FTDMyXzg3CisgKiAgICAgICAgICAgU1NPbkJpZ1N0YWNrCUtFUk5FTDMyLjg3CiAgKiBDaGVjayBpZiB0aHVua2luZyBpcyBpbml0aWFsaXplZCAoc3Mgc2VsZWN0b3Igc2V0IHVwIGV0Yy4pCiAgKiBXZSBkbyB0aGF0IGRpZmZlcmVudGx5LCBzbyBqdXN0IHJldHVybiBUUlVFLgogICogW29rXQogICogUkVUVVJOUwogICoJVFJVRSBmb3Igc3VjY2Vzcy4KICAqLwotQk9PTDMyIFdJTkFQSSBfS0VSTkVMMzJfODcoKQorQk9PTDMyIFdJTkFQSSBTU09uQmlnU3RhY2soKQogewogICAgIFRSQUNFKHRodW5rLCAiWWVzLCB0aHVua2luZyBpcyBpbml0aWFsaXplZFxuIik7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgX0tFUk5FTDMyXzg4CisgKiAgICAgICAgICAgU1NDYWxsCiAgKiBPbmUgb2YgdGhlIHJlYWwgdGh1bmtpbmcgZnVuY3Rpb25zLiBUaGlzIG9uZSBzZWVtcyB0byBiZSBmb3IgMzI8LT4zMgogICogdGh1bmtzLiBJdCBzaG91bGQgcHJvYmFibHkgYmUgY2FwYWJsZSBvZiBjcm9zc2luZyBwcm9jZXNzYm91bmRhcmllcy4KICAqCiAgKiBBbmQgWUVTLCBJJ3ZlIHNlZW4gbnI9NDggKHNvbWV3aGVyZSBpbiB0aGUgV2luOTUgMzI8LT4xNiBPTEUgY291cGxpbmcpCiAgKiBbb2tdCiAgKi8KLURXT1JEIFdJTkFQSVYgX0tFUk5FTDMyXzg4KAorRFdPUkQgV0lOQVBJViBTU0NhbGwoCiAJRFdPUkQgbnIsCS8qIFtpbl0gbnVtYmVyIG9mIGFyZ3VtZW50IGJ5dGVzICovCiAJRFdPUkQgZmxhZ3MsCS8qIFtpbl0gRklYTUU6IGZsYWdzID8gKi8KIAlGQVJQUk9DMzIgZnVuLAkvKiBbaW5dIGZ1bmN0aW9uIHRvIGNhbGwgKi8KQEAgLTY1NSw0MCArODk2LDYgQEAKIAlmcHJpbnRmKHN0ZGVyciwiRnJlZVNMQ2FsbGJhY2soMHglMDhseClcbiIseCk7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAJCUtFUk5FTF8zNTgJCShLRVJORUwpCi0gKiBBbGxvY2F0ZXMgYSBjb2RlIHNlZ21lbnQgd2hpY2ggc3RhcnRzIGF0IHRoZSBhZGRyZXNzIHBhc3NlZCBpbiB4LiBsaW1pdAotICogMHhmZmZmZiwgYW5kIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIHN0YXJ0LgotICogUkVUVVJOUwotICoJYSBzZWdtZW50ZWQgcG9pbnRlciAKLSAqLwotRFdPUkQgV0lOQVBJCi1fS0VSTkVMXzM1OChEV09SRCB4KSB7Ci0JV09SRAlzZWw7Ci0KLQlmcHJpbnRmKHN0ZGVyciwiX0tFUk5FTF8zNTgoMHglMDhseCksc3R1YlxuIix4KTsKLQlpZiAoIUhJV09SRCh4KSkKLQkJcmV0dXJuIHg7Ci0KLQlzZWwgPSBTRUxFQ1RPUl9BbGxvY0Jsb2NrKCBQVFJfU0VHX1RPX0xJTih4KSAsIDB4ZmZmZiwgU0VHTUVOVF9DT0RFLCBGQUxTRSwgRkFMU0UgKTsKLQlyZXR1cm4gUFRSX1NFR19PRkZfVE9fU0VHUFRSKCBzZWwsIDAgKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAkJS0VSTkVMXzM1OQkJKEtFUk5FTCkKLSAqIEZyZWVzIHRoZSBjb2RlIHNlZ21lbnQgb2YgdGhlIHBhc3NlZCBsaW5lYXIgcG9pbnRlciAoVGhpcyBoYXMgdXN1YWxseQotICogYmVlbiBhbGxvY2F0ZWQgYnkgX0tFUk5FTF8zNTgpLgotICovCi1WT0lEIFdJTkFQSQotX0tFUk5FTF8zNTkoCi0JRFdPUkQgeAkvKiBbaW5dIHNlZ21lbnRlZCBwb2ludGVyPyAqLwotKSB7Ci0JZnByaW50ZihzdGRlcnIsIl9LRVJORUxfMzU5KDB4JTA4bHgpLHN0dWJcbiIseCk7Ci0JaWYgKChISVdPUkQoeCkgJiA3KSE9NykKLQkJcmV0dXJuOwotCVNFTEVDVE9SX0ZyZWVCbG9jayh4Pj4xNiwxKTsKLQlyZXR1cm47Ci19CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCUtFUk5FTF80NzEJCShLRVJORUwuNDcxKQpkaWZmIC0tZ2l0IGEvd2luMzIvbmV3Zm5zLmMgYi93aW4zMi9uZXdmbnMuYwppbmRleCBhZGVkYjA3Li4zZTZiOWZkIDEwMDY0NAotLS0gYS93aW4zMi9uZXdmbnMuYworKysgYi93aW4zMi9uZXdmbnMuYwpAQCAtOCw2ICs4LDcgQEAKIGF0IGEgbGF0ZXIgZGF0ZS4gKi8KIAogI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCkBAIC0xMzEsMyArMTMyLDU3IEBACiAgIFNldExhc3RFcnJvciAoRVJST1JfVU5LTk9XTik7CiAgIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTMyOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRTeXN0ZW1Qb3dlclN0YXR1cyAgICAgIChLRVJORUwzMi42MjEpCisgKi8KK0JPT0wzMiBXSU5BUEkgR2V0U3lzdGVtUG93ZXJTdGF0dXMoTFBTWVNURU1fUE9XRVJfU1RBVFVTIHNwc19wdHIpCit7CisgICAgcmV0dXJuIEZBTFNFOyAgIC8qIG5vIHBvd2VyIG1hbmFnZW1lbnQgc3VwcG9ydCAqLworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldFN5c3RlbVBvd2VyU3RhdGUgICAgICAoS0VSTkVMMzIuNjMwKQorICovCitCT09MMzIgV0lOQVBJIFNldFN5c3RlbVBvd2VyU3RhdGUoQk9PTDMyIHN1c3BlbmRfb3JfaGliZXJuYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBmb3JjZV9mbGFnKQoreworICAgIC8qIHN1c3BlbmRfb3JfaGliZXJuYXRlIGZsYWc6IHc5NSBkb2VzIG5vdCBzdXBwb3J0CisgICAgICAgdGhpcyBmZWF0dXJlIGFueXdheSAqLworCisgICAgZm9yICggOzA7ICkKKyAgICB7CisgICAgICAgIGlmICggZm9yY2VfZmxhZyApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0MzJBCShLRVJORUwzMi4zNTUpCisgKi8KK0lOVDMyIFdJTkFQSSBHZXROdW1iZXJGb3JtYXQzMkEoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCisJCQkgICAgICAgTFBDU1RSIGxwdmFsdWUsICBjaGFyICpscEZvcm1hdCwKKwkJCSAgICAgICBMUFNUUiBscE51bWJlclN0ciwgaW50IGNjaE51bWJlcikKKy8qIE5PVEU6IHR5cGUgb2YgbHBGb3JtYXQgc2hvdWxkIGJlIENPTlNUIE5VTUJFUkZPUk1BVCAqLworCit7CisgaW50IG47CisKKyBGSVhNRShmaWxlLCIlczogc3R1Yiwgbm8gcmVmb3JtYXRpbmcgZG9uZVxuIixscHZhbHVlKTsKKworIG4gPSBzdHJsZW4obHB2YWx1ZSk7CisgaWYgKGNjaE51bWJlcikgeyAKKyAgIHN0cm5jcHkobHBOdW1iZXJTdHIsbHB2YWx1ZSxjY2hOdW1iZXIpOworICAgaWYgKGNjaE51bWJlciA8PSBuKSB7CisgICAgIGxwTnVtYmVyU3RyW2NjaE51bWJlci0xXSA9IDA7CisgICAgIG4gPSBjY2hOdW1iZXItMTsKKyAgIH0KKyB9CisgcmV0dXJuIG47Cit9CmRpZmYgLS1naXQgYS93aW4zMi9vcmRpbmFscy5jIGIvd2luMzIvb3JkaW5hbHMuYwppbmRleCA2YWMxNTViLi43ZDk0ZDU0IDEwMDY0NAotLS0gYS93aW4zMi9vcmRpbmFscy5jCisrKyBiL3dpbjMyL29yZGluYWxzLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlICJ3aW5udC5oIgogI2luY2x1ZGUgInByb2Nlc3MuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCkBAIC0yMCw3ICsyMSw3IEBACiBzdGF0aWMgU0VHUFRSIHNlZ1dpbjE2TXV0ZXggPSBOVUxMOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRQV2luTG9jayAgICAoS0VSTkVMMzIpCisgKiAgICAgICAgICAgR2V0UFdpbkxvY2sgICAgKEtFUk5FTDMyLjkzKQogICogUmV0dXJuIHRoZSBpbmZhbW91cyBXaW4xNk11dGV4LgogICovCiBWT0lEIFdJTkFQSSBHZXRQV2luTG9jayhDUklUSUNBTF9TRUNUSU9OICoqbG9jaykKQEAgLTMwLDcgKzMxLDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBfS0VSTkVMMzJfODgKKyAqICAgICAgICAgICBXT1czMl8xICAgICAgICAoS0VSTkVMMzIuODgpCiAgKi8KIEJPT0wzMiBXSU5BUEkgV09XMzJfMShTRUdQVFIgc2VncHRyLExQTERUX0VOVFJZIGxkdGVudCkKIHsKQEAgLTM5LDExICs0MCwxMSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIF9LRVJORUwzMl8xOCAgICAoS0VSTkVMMzIuMTgpCisgKiAgICAgICAgICAgR2V0UHJvY2Vzc0RXT1JEICAgIChLRVJORUwzMi4xOCkKICAqICdPZiBjb3Vyc2UgeW91IGNhbm5vdCBkaXJlY3RseSBhY2Nlc3MgV2luZG93cyBpbnRlcm5hbCBzdHJ1Y3R1cmVzJwogICovCiAKLURXT1JEIFdJTkFQSSBfS0VSTkVMMzJfMTgoRFdPUkQgcHJvY2Vzc2lkLERXT1JEIGFjdGlvbikKK0RXT1JEIFdJTkFQSSBHZXRQcm9jZXNzRFdPUkQoRFdPUkQgcHJvY2Vzc2lkLERXT1JEIGFjdGlvbikKIHsKIAlQREIzMgkqcHJvY2VzczsKIAlUREIJKnBUYXNrOwpAQCAtMTE0LDIyICsxMTUsMjIgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCQkJCShLRVJORUwzMi4zMykKKyAqCQlHZXRXaW4xNkRPU0VudgkJCShLRVJORUwzMi4zNCkKICAqIFJldHVybnMgc29tZSBpbnRlcm5hbCB2YWx1ZS4uLi4gcHJvYmFibHkgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQgZGF0YWJhc2U/CiAgKi8KLURXT1JEIFdJTkFQSSBfS0VSTkVMMzJfMzQoKQorRFdPUkQgV0lOQVBJIEdldFdpbjE2RE9TRW52KCkKIHsKLQlmcHJpbnRmKHN0ZGVyciwiS0VSTkVMMzJfMzQoKSwgU1RVQiByZXR1cm5pbmcgMFxuIik7CisJZnByaW50ZihzdGRlcnIsIkdldFdpbjE2RE9TRW52KCksIFNUVUIgcmV0dXJuaW5nIDBcbiIpOwogCXJldHVybiAwOwogfQogCi1CT09MMzIgV0lOQVBJIF9LRVJORUwzMl85OShIQU5ETEUzMiB0aHJlYWRpZCxEV09SRCBleGl0Y29kZSxEV09SRCB4KSB7Ci0JZnByaW50ZihzdGRlcnIsIktFUk5FTDMyXzk5KCVkLCVsZCwweCUwOGx4KSxzdHViXG4iLHRocmVhZGlkLGV4aXRjb2RlLHgpOworQk9PTDMyIFdJTkFQSSBfS0VSTkVMMzJfMTAwKEhBTkRMRTMyIHRocmVhZGlkLERXT1JEIGV4aXRjb2RlLERXT1JEIHgpIHsKKwlmcHJpbnRmKHN0ZGVyciwiS0VSTkVMMzJfMTAwKCVkLCVsZCwweCUwOGx4KSxzdHViXG4iLHRocmVhZGlkLGV4aXRjb2RlLHgpOwogCXJldHVybiBUUlVFOwogfQogCi1EV09SRCBXSU5BUEkgX0tFUk5FTDMyXzk4KERXT1JEIHgpIHsKLQlmcHJpbnRmKHN0ZGVyciwiS0VSTkVMMzJfOTgoMHglMDhseCksc3R1YlxuIix4KTsKK0RXT1JEIFdJTkFQSSBfS0VSTkVMMzJfOTkoRFdPUkQgeCkgeworCWZwcmludGYoc3RkZXJyLCJLRVJORUwzMl85OSgweCUwOGx4KSxzdHViXG4iLHgpOwogCXJldHVybiAxOwogfQogCmRpZmYgLS1naXQgYS93aW4zMi9wcm9jZXNzLmMgYi93aW4zMi9wcm9jZXNzLmMKaW5kZXggMjMyNmY5Zi4uMThiZDVjMiAxMDA2NDQKLS0tIGEvd2luMzIvcHJvY2Vzcy5jCisrKyBiL3dpbjMyL3Byb2Nlc3MuYwpAQCAtMTksNyArMTksNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE1zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHMgICAgKFVTRVIzMi4zOTkpCisgKiAgICAgICAgICAgTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0cyAgICAoVVNFUjMyLjQwMCkKICAqLwogRFdPUkQgV0lOQVBJIE1zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHMoCiAJRFdPUkQgbkNvdW50LEhBTkRMRTMyICpwSGFuZGxlcyxCT09MMzIgZldhaXRBbGwsRFdPUkQgZHdNaWxsaXNlY29uZHMsCkBAIC0zMywxNiArMzMsNiBAQAogCXJldHVybiAwOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBEdXBsaWNhdGVIYW5kbGUgICAgKEtFUk5FTDMyLjc4KQotICovCi1CT09MMzIgV0lOQVBJIER1cGxpY2F0ZUhhbmRsZShIQU5ETEUzMiBhLCBIQU5ETEUzMiBiLCBIQU5ETEUzMiBjLCBIQU5ETEUzMiAqIGQsIERXT1JEIGUsIEJPT0wzMiBmLCBEV09SRCBnKQotewotCWZwcmludGYoc3RkZXJyLCJEdXBsaWNhdGVIYW5kbGUoJWQsJWQsJWQsJXAsJWxkLCVkLCVsZCkgc3R1YlxuIixhLGIsYyxkLGUsZixnKTsKLQkqZCA9IGI7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICBHZXRQcm9jZXNzQWZmaW5pdHlNYXNrCiAgKi8KQEAgLTg3LDEzICs3NywxOCBAQAogCURXT1JEIGNyZWF0aW9uZmxhZ3MsTFBWT0lEIGVudixMUENTVFIgY3VyZGlyLAogCUxQU1RBUlRVUElORk8zMkEgc3RhcnR1cGluZm8sTFBQUk9DRVNTX0lORk9STUFUSU9OIHByb2Nlc3NpbmZvCiApIHsKLQlmcHJpbnRmKHN0ZGVyciwiQ3JlYXRlUHJvY2Vzc0EoJXMsJXMsJXAsJXAsJWQsJTA4bHgsJXAsJXMsJXAsJXApLCBzdHViXG4iLAorCVdBUk4od2luMzIsIkNyZWF0ZVByb2Nlc3NBKCVzLCVzLCVwLCVwLCVkLCUwOGx4LCVwLCVzLCVwLCVwKSxcbgorCQljYWxsaW5nIFdpbkV4ZWMzMiBpbnN0ZWFkXG4iLAogCQlhcHBuYW1lLGNtZGxpbmUscHJvY2Vzc2F0dHJpYnV0ZXMsdGhyZWFkYXR0cmlidXRlcywKIAkJaW5oZXJpdGhhbmRsZXMsY3JlYXRpb25mbGFncyxlbnYsY3VyZGlyLHN0YXJ0dXBpbmZvLHByb2Nlc3NpbmZvCiAJKTsKKyAgICAgICAgV2luRXhlYzMyKGNtZGxpbmUsVFJVRSk7CisgICAgICAgIHJldHVybiBUUlVFOworI2lmIDAKIAkvKiBtYWtlIGZyb20gbGNjIHVzZXMgc3lzdGVtIGFzIGZhbGxiYWNrIGlmIENyZWF0ZVByb2Nlc3MgcmV0dXJucwogCSAgIEZBTFNFLCBzbyByZXR1cm4gZmFsc2UgKi8KIAlyZXR1cm4gRkFMU0U7CisjZW5kaWYKIH0KIAogQk9PTDMyIFdJTkFQSSBDcmVhdGVQcm9jZXNzMzJXKApkaWZmIC0tZ2l0IGEvd2luMzIvdXNlcjMyLmMgYi93aW4zMi91c2VyMzIuYwppbmRleCA4NmVlMzdmLi5hMzdjNTk5IDEwMDY0NAotLS0gYS93aW4zMi91c2VyMzIuYworKysgYi93aW4zMi91c2VyMzIuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgR2V0TWVzc2FnZTMyQSAgIChVU0VSMzIuMjY5KQorICogICAgICAgICAgR2V0TWVzc2FnZTMyQSAgIChVU0VSMzIuMjcwKQogICovCiBCT09MMzIgV0lOQVBJIEdldE1lc3NhZ2UzMkEoTVNHMzIqIGxwbXNnLEhXTkQzMiBod25kLFVJTlQzMiBtaW4sVUlOVDMyIG1heCkKIHsKQEAgLTMzLDcgKzMzLDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICBHZXRNZXNzYWdlMzJXICAgKFVTRVIzMi4yNzMpCisgKiAgICAgICAgICBHZXRNZXNzYWdlMzJXICAgKFVTRVIzMi4yNzQpCiAgKi8KIEJPT0wzMiBXSU5BUEkgR2V0TWVzc2FnZTMyVyhNU0czMiogbHBtc2csSFdORDMyIGh3bmQsVUlOVDMyIG1pbixVSU5UMzIgbWF4KQogewpkaWZmIC0tZ2l0IGEvd2luZG93cy9kY2UuYyBiL3dpbmRvd3MvZGNlLmMKaW5kZXggZGExYmVlNy4uMWU5YjMxNiAxMDA2NDQKLS0tIGEvd2luZG93cy9kY2UuYworKysgYi93aW5kb3dzL2RjZS5jCkBAIC01OTAsNyArNTkwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXREQ0V4MzIgICAgKFVTRVIzMi4yMzApCisgKiAgICAgICAgICAgR2V0RENFeDMyICAgIChVU0VSMzIuMjMxKQogICoKICAqIFVuaW1wbGVtZW50ZWQgZmxhZ3M6IERDWF9MT0NLV0lORE9XVVBEQVRFCiAgKgpAQCAtODA4LDcgKzgwOCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0REMzMiAgICAoVVNFUjMyLjIyOSkKKyAqICAgICAgICAgICBHZXREQzMyICAgIChVU0VSMzIuMjMwKQogICogUkVUVVJOUwogICoJOkhhbmRsZSB0byBEQwogICoJTlVMTDogRmFpbHVyZQpAQCAtODMzLDcgKzgzMyw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0V2luZG93REMzMiAgICAoVVNFUjMyLikKKyAqICAgICAgICAgICBHZXRXaW5kb3dEQzMyICAgIChVU0VSMzIuMzA0KQogICovCiBIREMzMiBXSU5BUEkgR2V0V2luZG93REMzMiggSFdORDMyIGh3bmQgKQogewpAQCAtODUyLDcgKzg1Miw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgUmVsZWFzZURDMzIgICAgKFVTRVIzMi40MzkpCisgKiAgICAgICAgICAgUmVsZWFzZURDMzIgICAgKFVTRVIzMi40NDApCiAgKgogICogUkVUVVJOUwogICoJMTogU3VjY2VzcwpAQCAtOTM3LDcgKzkzNyw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgIFdpbmRvd0Zyb21EQzE2ICAgKFVTRVIzMi41ODApCisgKiAgICAgICAgICBXaW5kb3dGcm9tREMxNiAgIChVU0VSLjExNykKICAqLwogSFdORDE2IFdJTkFQSSBXaW5kb3dGcm9tREMxNiggSERDMTYgaERDICkKIHsKQEAgLTk0Niw3ICs5NDYsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICBXaW5kb3dGcm9tREMzMiAgIChVU0VSMzIuNTgwKQorICogICAgICAgICAgV2luZG93RnJvbURDMzIgICAoVVNFUjMyLjU4MSkKICAqLwogSFdORDMyIFdJTkFQSSBXaW5kb3dGcm9tREMzMiggSERDMzIgaERDICkKIHsKQEAgLTk2Niw3ICs5NjYsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExvY2tXaW5kb3dVcGRhdGUzMiAgIChVU0VSMzIuMzc3KQorICogICAgICAgICAgIExvY2tXaW5kb3dVcGRhdGUzMiAgIChVU0VSMzIuMzc4KQogICovCiBCT09MMzIgV0lOQVBJIExvY2tXaW5kb3dVcGRhdGUzMiggSFdORDMyIGh3bmQgKQogewpkaWZmIC0tZ2l0IGEvd2luZG93cy9kZWZkbGcuYyBiL3dpbmRvd3MvZGVmZGxnLmMKaW5kZXggMzZjMTQ2YS4uZWRlMGUwOSAxMDA2NDQKLS0tIGEvd2luZG93cy9kZWZkbGcuYworKysgYi93aW5kb3dzL2RlZmRsZy5jCkBAIC0zMDIsNyArMzAyLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBEZWZEbGdQcm9jMzJBICAgKFVTRVIzMi4xMTkpCisgKiAgICAgICAgICAgRGVmRGxnUHJvYzMyQSAgIChVU0VSMzIuMTIwKQogICovCiBMUkVTVUxUIFdJTkFQSSBEZWZEbGdQcm9jMzJBKCBIV05EMzIgaHduZCwgVUlOVDMyIG1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCkBAIC0zNTcsNyArMzU3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBEZWZEbGdQcm9jMzJXICAgKFVTRVIzMi4xMjApCisgKiAgICAgICAgICAgRGVmRGxnUHJvYzMyVyAgIChVU0VSMzIuMTIxKQogICovCiBMUkVTVUxUIFdJTkFQSSBEZWZEbGdQcm9jMzJXKCBIV05EMzIgaHduZCwgVUlOVDMyIG1zZywgV1BBUkFNMzIgd1BhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSApCmRpZmYgLS1naXQgYS93aW5kb3dzL2RlZnduZC5jIGIvd2luZG93cy9kZWZ3bmQuYwppbmRleCA5YjQxYmYxLi41Y2UyMTc5IDEwMDY0NAotLS0gYS93aW5kb3dzL2RlZnduZC5jCisrKyBiL3dpbmRvd3MvZGVmd25kLmMKQEAgLTM1MiwxMSArMzUyLDE0IEBACiAKICAgICBjYXNlIFdNX1FVRVJZRFJBR0lDT046CiAgICAgICAgIHsKLSAgICAgICAgICAgIEhJQ09OMTYgaEkgPSAwOwotICAgICAgICAgICAgVUlOVDE2IGxlbiA9IDE7Ci0gICAgICAgICAgICB3aGlsZShsZW4gPCA2NCkKLQkJaWYoIChoSSA9IExvYWRJY29uMTYod25kUHRyLT5oSW5zdGFuY2UsTUFLRUlOVFJFU09VUkNFKGxlbikpKSApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoTFJFU1VMVCloSTsKKyAgICAgICAgICAgIEhJQ09OMTYgaEljb249MDsKKyAgICAgICAgICAgIFVJTlQxNiBsZW47CisKKyAgICAgICAgICAgIGlmKCAoaEljb249d25kUHRyLT5jbGFzcy0+aEN1cnNvcikgKSByZXR1cm4gKExSRVNVTFQpaEljb247CisgICAgICAgICAgICBmb3IobGVuPTE7IGxlbjw2NDsgbGVuKyspCisgICAgICAgICAgICAgICAgaWYoKGhJY29uPUxvYWRJY29uMTYod25kUHRyLT5oSW5zdGFuY2UsTUFLRUlOVFJFU09VUkNFMTYobGVuKSkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKExSRVNVTFQpaEljb247CisgICAgICAgICAgICByZXR1cm4gKExSRVNVTFQpTG9hZEljb24xNihOVUxMLElESV9BUFBMSUNBVElPTjE2KTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIApAQCAtNDQwLDcgKzQ0Myw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRGVmV2luZG93UHJvYzMyQSAgIChVU0VSMzIuMTI1KQorICogICAgICAgICAgIERlZldpbmRvd1Byb2MzMkEgICAoVVNFUjMyLjEyNikKICAqLwogTFJFU1VMVCBXSU5BUEkgRGVmV2luZG93UHJvYzMyQSggSFdORDMyIGh3bmQsIFVJTlQzMiBtc2csIFdQQVJBTTMyIHdQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKQpAQCAtNTAxLDcgKzUwNCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRGVmV2luZG93UHJvYzMyVyAgIChVU0VSMzIuMTI2KQorICogICAgICAgICAgIERlZldpbmRvd1Byb2MzMlcgICAoVVNFUjMyLjEyNykKICAqLwogTFJFU1VMVCBXSU5BUEkgRGVmV2luZG93UHJvYzMyVyggSFdORDMyIGh3bmQsIFVJTlQzMiBtc2csIFdQQVJBTTMyIHdQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKQpkaWZmIC0tZ2l0IGEvd2luZG93cy9kaWFsb2cuYyBiL3dpbmRvd3MvZGlhbG9nLmMKaW5kZXggYzZhZDcwYy4uYTFiNjdmOSAxMDA2NDQKLS0tIGEvd2luZG93cy9kaWFsb2cuYworKysgYi93aW5kb3dzL2RpYWxvZy5jCkBAIC0yOSwxMSArMjksMTIgQEAKIHsKICAgICBEV09SRCAgICAgIHN0eWxlOwogICAgIERXT1JEICAgICAgZXhTdHlsZTsKKyAgICBEV09SRCAgICAgIGhlbHBJZDsKICAgICBJTlQxNiAgICAgIHg7CiAgICAgSU5UMTYgICAgICB5OwogICAgIElOVDE2ICAgICAgY3g7CiAgICAgSU5UMTYgICAgICBjeTsKLSAgICBVSU5UMTYgICAgIGlkOworICAgIFVJTlQzMiAgICAgaWQ7CiAgICAgTFBDU1RSICAgICBjbGFzc05hbWU7CiAgICAgTFBDU1RSICAgICB3aW5kb3dOYW1lOwogICAgIExQVk9JRCAgICAgZGF0YTsKQEAgLTQ0LDYgKzQ1LDcgQEAKIHsKICAgICBEV09SRCAgICAgIHN0eWxlOwogICAgIERXT1JEICAgICAgZXhTdHlsZTsKKyAgICBEV09SRCAgICAgIGhlbHBJZDsKICAgICBVSU5UMTYgICAgIG5iSXRlbXM7CiAgICAgSU5UMTYgICAgICB4OwogICAgIElOVDE2ICAgICAgeTsKQEAgLTUzLDcgKzU1LDEwIEBACiAgICAgTFBDU1RSICAgICBjbGFzc05hbWU7CiAgICAgTFBDU1RSICAgICBjYXB0aW9uOwogICAgIFdPUkQgICAgICAgcG9pbnRTaXplOworICAgIFdPUkQgICAgICAgd2VpZ2h0OworICAgIEJPT0wzMiAgICAgaXRhbGljOwogICAgIExQQ1NUUiAgICAgZmFjZU5hbWU7CisgICAgQk9PTDMyICAgICBkaWFsb2dFeDsKIH0gRExHX1RFTVBMQVRFOwogCiAgIC8qIERpYWxvZyBiYXNlIHVuaXRzICovCkBAIC0xNjYsMzIgKzE3MSw1NyBAQAogICogUmV0dXJuIHRoZSBjbGFzcyBhbmQgdGV4dCBvZiB0aGUgY29udHJvbCBwb2ludGVkIHRvIGJ5IHB0ciwKICAqIGZpbGwgdGhlIGhlYWRlciBzdHJ1Y3R1cmUgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5leHQgY29udHJvbC4KICAqLwotc3RhdGljIGNvbnN0IFdPUkQgKkRJQUxPR19HZXRDb250cm9sMzIoIGNvbnN0IFdPUkQgKnAsIERMR19DT05UUk9MX0lORk8gKmluZm8gKQorc3RhdGljIGNvbnN0IFdPUkQgKkRJQUxPR19HZXRDb250cm9sMzIoIGNvbnN0IFdPUkQgKnAsIERMR19DT05UUk9MX0lORk8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIGRpYWxvZ0V4ICkKIHsKLSAgICBzdGF0aWMgV0NIQVIgYnVmZmVyWzEwXTsKLSAgICBpbnQgaW50X2lkOwotCi0gICAgaW5mby0+c3R5bGUgICA9IEdFVF9EV09SRChwKTsgcCArPSAyOwotICAgIGluZm8tPmV4U3R5bGUgPSBHRVRfRFdPUkQocCk7IHAgKz0gMjsKKyAgICBpZiAoZGlhbG9nRXgpCisgICAgeworICAgICAgICBpbmZvLT5oZWxwSWQgID0gR0VUX0RXT1JEKHApOyBwICs9IDI7CisgICAgICAgIGluZm8tPmV4U3R5bGUgPSBHRVRfRFdPUkQocCk7IHAgKz0gMjsKKyAgICAgICAgaW5mby0+c3R5bGUgICA9IEdFVF9EV09SRChwKTsgcCArPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbmZvLT5oZWxwSWQgID0gMDsKKyAgICAgICAgaW5mby0+c3R5bGUgICA9IEdFVF9EV09SRChwKTsgcCArPSAyOworICAgICAgICBpbmZvLT5leFN0eWxlID0gR0VUX0RXT1JEKHApOyBwICs9IDI7CisgICAgfQogICAgIGluZm8tPnggICAgICAgPSBHRVRfV09SRChwKTsgcCsrOwogICAgIGluZm8tPnkgICAgICAgPSBHRVRfV09SRChwKTsgcCsrOwogICAgIGluZm8tPmN4ICAgICAgPSBHRVRfV09SRChwKTsgcCsrOwogICAgIGluZm8tPmN5ICAgICAgPSBHRVRfV09SRChwKTsgcCsrOwotICAgIGluZm8tPmlkICAgICAgPSBHRVRfV09SRChwKTsgcCsrOworCisgICAgaWYgKGRpYWxvZ0V4KQorICAgIHsKKyAgICAgICAgLyogaWQgaXMgYSBEV09SRCBmb3IgRElBTE9HRVggKi8KKyAgICAgICAgaW5mby0+aWQgPSBHRVRfRFdPUkQocCk7CisgICAgICAgIHAgKz0gMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW5mby0+aWQgPSBHRVRfV09SRChwKTsKKyAgICAgICAgcCsrOworICAgIH0KIAogICAgIGlmIChHRVRfV09SRChwKSA9PSAweGZmZmYpCiAgICAgewotICAgICAgICBzd2l0Y2goR0VUX1dPUkQocCsxKSkKKyAgICAgICAgc3RhdGljIGNvbnN0IFdDSEFSIGNsYXNzX25hbWVzWzZdWzEwXSA9CiAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMHg4MDogbHN0cmNweUF0b1coIGJ1ZmZlciwgIkJ1dHRvbiIgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDB4ODE6IGxzdHJjcHlBdG9XKCBidWZmZXIsICJFZGl0IiApOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMHg4MjogbHN0cmNweUF0b1coIGJ1ZmZlciwgIlN0YXRpYyIgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDB4ODM6IGxzdHJjcHlBdG9XKCBidWZmZXIsICJMaXN0Qm94IiApOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMHg4NDogbHN0cmNweUF0b1coIGJ1ZmZlciwgIlNjcm9sbEJhciIgKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDB4ODU6IGxzdHJjcHlBdG9XKCBidWZmZXIsICJDb21ib0JveCIgKTsgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OiAgIGJ1ZmZlclswXSA9ICdcMCc7IGJyZWFrOworICAgICAgICAgICAgeyAnQicsJ3UnLCd0JywndCcsJ28nLCduJywgfSwgICAgICAgICAgICAgLyogMHg4MCAqLworICAgICAgICAgICAgeyAnRScsJ2QnLCdpJywndCcsIH0sICAgICAgICAgICAgICAgICAgICAgLyogMHg4MSAqLworICAgICAgICAgICAgeyAnUycsJ3QnLCdhJywndCcsJ2knLCdjJywgfSwgICAgICAgICAgICAgLyogMHg4MiAqLworICAgICAgICAgICAgeyAnTCcsJ2knLCdzJywndCcsJ0InLCdvJywneCcsIH0sICAgICAgICAgLyogMHg4MyAqLworICAgICAgICAgICAgeyAnUycsJ2MnLCdyJywnbycsJ2wnLCdsJywnQicsJ2EnLCdyJywgfSwgLyogMHg4NCAqLworICAgICAgICAgICAgeyAnQycsJ28nLCdtJywnYicsJ28nLCdCJywnbycsJ3gnLCB9ICAgICAgLyogMHg4NSAqLworICAgICAgICB9OworICAgICAgICBXT1JEIGlkID0gR0VUX1dPUkQocCsxKTsKKyAgICAgICAgaWYgKChpZCA+PSAweDgwKSAmJiAoaWQgPD0gMHg4NSkpCisgICAgICAgICAgICBpbmZvLT5jbGFzc05hbWUgPSAoTFBDU1RSKWNsYXNzX25hbWVzW2lkIC0gMHg4MF07CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW5mby0+Y2xhc3NOYW1lID0gTlVMTDsKKyAgICAgICAgICAgIEVSUiggZGlhbG9nLCAiVW5rbm93biBidWlsdC1pbiBjbGFzcyBpZCAlMDR4XG4iLCBpZCApOwogICAgICAgICB9Ci0gICAgICAgIGluZm8tPmNsYXNzTmFtZSA9IChMUENTVFIpYnVmZmVyOwogICAgICAgICBwICs9IDI7CiAgICAgfQogICAgIGVsc2UKQEAgLTIwMCwxMCArMjMwLDkgQEAKICAgICAgICAgcCArPSBsc3RybGVuMzJXKCAoTFBDV1NUUilwICkgKyAxOwogICAgIH0KIAotICAgIGludF9pZCA9IChHRVRfV09SRChwKSA9PSAweGZmZmYpOwotICAgIGlmIChpbnRfaWQpCisgICAgaWYgKEdFVF9XT1JEKHApID09IDB4ZmZmZikgIC8qIElzIGl0IGFuIGludGVnZXIgaWQ/ICovCiAgICAgewotCWluZm8tPndpbmRvd05hbWUgPSAoTFBDU1RSKShwICsgMSk7CisJaW5mby0+d2luZG93TmFtZSA9IChMUENTVFIpKFVJTlQzMilHRVRfV09SRChwICsgMSk7CiAJcCArPSAyOwogICAgIH0KICAgICBlbHNlCkBAIC0yMTIsMjUgKzI0MSwyOSBAQAogICAgICAgICBwICs9IGxzdHJsZW4zMlcoIChMUENXU1RSKXAgKSArIDE7CiAgICAgfQogCisgICAgVFJBQ0UoZGlhbG9nLCIgICAgJXMgJXMgJWQsICVkLCAlZCwgJWQsICVkLCAlMDhseCwgJTA4bHgsICUwOGx4XG4iLCAKKyAgICAgICAgICBkZWJ1Z3N0cl93KCAoTFBDV1NUUilpbmZvLT5jbGFzc05hbWUgKSwKKyAgICAgICAgICBkZWJ1Z3Jlc193KCAoTFBDV1NUUilpbmZvLT53aW5kb3dOYW1lICksCisgICAgICAgICAgaW5mby0+aWQsIGluZm8tPngsIGluZm8tPnksIGluZm8tPmN4LCBpbmZvLT5jeSwKKyAgICAgICAgICBpbmZvLT5zdHlsZSwgaW5mby0+ZXhTdHlsZSwgaW5mby0+aGVscElkICk7CisKICAgICBpZiAoR0VUX1dPUkQocCkpCiAgICAgeworICAgICAgICBpZiAoVFJBQ0VfT04oZGlhbG9nKSkKKyAgICAgICAgeworICAgICAgICAgICAgV09SRCBpLCBjb3VudCA9IEdFVF9XT1JEKHApIC8gc2l6ZW9mKFdPUkQpOworICAgICAgICAgICAgVFJBQ0UoZGlhbG9nLCAiICBCRUdJTlxuIik7CisgICAgICAgICAgICBUUkFDRShkaWFsb2csICIgICAgIik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgRFVNUCggIiUwNHgsIiwgR0VUX1dPUkQocCtpKzEpICk7CisgICAgICAgICAgICBEVU1QKCJcbiIpOworICAgICAgICAgICAgVFJBQ0UoZGlhbG9nLCAiICBFTkRcbiIgKTsKKyAgICAgICAgfQogICAgICAgICBpbmZvLT5kYXRhID0gKExQVk9JRCkocCArIDEpOwogICAgICAgICBwICs9IEdFVF9XT1JEKHApIC8gc2l6ZW9mKFdPUkQpOwogICAgIH0KICAgICBlbHNlIGluZm8tPmRhdGEgPSBOVUxMOwogICAgIHArKzsKIAotICAgIGlmKGludF9pZCkKLSAgICAgIFRSQUNFKGRpYWxvZywiICAgJXAgJTA0eCAlZCwgJWQsICVkLCAlZCwgJWQsICUwOGx4LCAlMDhseCwgJTA4bHhcbiIsIAotCQkgICAgICBpbmZvLT5jbGFzc05hbWUsIExPV09SRChpbmZvLT53aW5kb3dOYW1lKSwKLQkJICAgICAgaW5mby0+aWQsIGluZm8tPngsIGluZm8tPnksIGluZm8tPmN4LCBpbmZvLT5jeSwKLQkJICAgICAgaW5mby0+c3R5bGUsIGluZm8tPmV4U3R5bGUsIChEV09SRClpbmZvLT5kYXRhKTsKLSAgICBlbHNlCi0gICAgICBUUkFDRShkaWFsb2csIiAgICVwICclcCcgJWQsICVkLCAlZCwgJWQsICVkLCAlMDhseCwgJTA4bHgsICUwOGx4XG4iLCAKLQkJICAgICAgaW5mby0+Y2xhc3NOYW1lLCBpbmZvLT53aW5kb3dOYW1lLAotCQkgICAgICBpbmZvLT5pZCwgaW5mby0+eCwgaW5mby0+eSwgaW5mby0+Y3gsIGluZm8tPmN5LAotCQkgICAgICBpbmZvLT5zdHlsZSwgaW5mby0+ZXhTdHlsZSwgKERXT1JEKWluZm8tPmRhdGEpOwotCiAgICAgLyogTmV4dCBjb250cm9sIGlzIG9uIGR3b3JkIGJvdW5kYXJ5ICovCiAgICAgcmV0dXJuIChjb25zdCBXT1JEICopKCgoKGludClwKSArIDMpICYgfjMpOwogfQpAQCAtMjQxLDEyICsyNzQsMTQgQEAKICAqCiAgKiBDcmVhdGUgdGhlIGNvbnRyb2wgd2luZG93cyBmb3IgYSBkaWFsb2cuCiAgKi8KLXN0YXRpYyBCT09MMzIgRElBTE9HX0NyZWF0ZUNvbnRyb2xzKCBXTkQgKnBXbmQsIExQQ1NUUiB0ZW1wbGF0ZSwgSU5UMzIgaXRlbXMsCitzdGF0aWMgQk9PTDMyIERJQUxPR19DcmVhdGVDb250cm9scyggV05EICpwV25kLCBMUENTVFIgdGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRExHX1RFTVBMQVRFICpkbGdUZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISU5TVEFOQ0UzMiBoSW5zdCwgQk9PTDMyIHdpbjMyICkKIHsKICAgICBESUFMT0dJTkZPICpkbGdJbmZvID0gKERJQUxPR0lORk8gKilwV25kLT53RXh0cmE7CiAgICAgRExHX0NPTlRST0xfSU5GTyBpbmZvOwogICAgIEhXTkQzMiBod25kQ3RybCwgaHduZERlZkJ1dHRvbiA9IDA7CisgICAgSU5UMzIgaXRlbXMgPSBkbGdUZW1wbGF0ZS0+bmJJdGVtczsKIAogICAgIFRSQUNFKGRpYWxvZywgIiBCRUdJTlxuIiApOwogICAgIHdoaWxlIChpdGVtcy0tKQpAQCAtMjg0LDcgKzMxOSw4IEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wbGF0ZSA9IChMUENTVFIpRElBTE9HX0dldENvbnRyb2wzMiggKFdPUkQgKil0ZW1wbGF0ZSwgJmluZm8gKTsKKyAgICAgICAgICAgIHRlbXBsYXRlID0gKExQQ1NUUilESUFMT0dfR2V0Q29udHJvbDMyKCAoV09SRCAqKXRlbXBsYXRlLCAmaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGdUZW1wbGF0ZS0+ZGlhbG9nRXggKTsKICAgICAgICAgICAgIGh3bmRDdHJsID0gQ3JlYXRlV2luZG93RXgzMlcoIGluZm8uZXhTdHlsZSB8IFdTX0VYX05PUEFSRU5UTk9USUZZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQ1dTVFIpaW5mby5jbGFzc05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBDV1NUUilpbmZvLndpbmRvd05hbWUsCkBAIC0zOTcsMTcgKzQzMywzMCBAQAogewogICAgIGNvbnN0IFdPUkQgKnAgPSAoY29uc3QgV09SRCAqKXRlbXBsYXRlOwogCi0gICAgcmVzdWx0LT5zdHlsZSAgID0gR0VUX0RXT1JEKHApOyBwICs9IDI7Ci0gICAgcmVzdWx0LT5leFN0eWxlID0gR0VUX0RXT1JEKHApOyBwICs9IDI7CisgICAgcmVzdWx0LT5zdHlsZSA9IEdFVF9EV09SRChwKTsgcCArPSAyOworICAgIGlmIChyZXN1bHQtPnN0eWxlID09IDB4ZmZmZjAwMDEpICAvKiBESUFMT0dFWCByZXNvdXJjZSAqLworICAgIHsKKyAgICAgICAgcmVzdWx0LT5kaWFsb2dFeCA9IFRSVUU7CisgICAgICAgIHJlc3VsdC0+aGVscElkICAgPSBHRVRfRFdPUkQocCk7IHAgKz0gMjsKKyAgICAgICAgcmVzdWx0LT5leFN0eWxlICA9IEdFVF9EV09SRChwKTsgcCArPSAyOworICAgICAgICByZXN1bHQtPnN0eWxlICAgID0gR0VUX0RXT1JEKHApOyBwICs9IDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJlc3VsdC0+ZGlhbG9nRXggPSBGQUxTRTsKKyAgICAgICAgcmVzdWx0LT5oZWxwSWQgICA9IDA7CisgICAgICAgIHJlc3VsdC0+ZXhTdHlsZSAgPSBHRVRfRFdPUkQocCk7IHAgKz0gMjsKKyAgICB9CiAgICAgcmVzdWx0LT5uYkl0ZW1zID0gR0VUX1dPUkQocCk7IHArKzsKICAgICByZXN1bHQtPnggICAgICAgPSBHRVRfV09SRChwKTsgcCsrOwogICAgIHJlc3VsdC0+eSAgICAgICA9IEdFVF9XT1JEKHApOyBwKys7CiAgICAgcmVzdWx0LT5jeCAgICAgID0gR0VUX1dPUkQocCk7IHArKzsKICAgICByZXN1bHQtPmN5ICAgICAgPSBHRVRfV09SRChwKTsgcCsrOwotICAgIFRSQUNFKGRpYWxvZywgIkRJQUxPRyAlZCwgJWQsICVkLCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT54LCByZXN1bHQtPnksIHJlc3VsdC0+Y3gsIHJlc3VsdC0+Y3kgKTsKLSAgICBUUkFDRShkaWFsb2csICIgU1RZTEUgJTA4bHhcbiIsIHJlc3VsdC0+c3R5bGUgKTsKLSAgICBUUkFDRShkaWFsb2csICIgRVhTVFlMRSAlMDhseFxuIiwgcmVzdWx0LT5leFN0eWxlICk7CisgICAgVFJBQ0UoIGRpYWxvZywgIkRJQUxPRyVzICVkLCAlZCwgJWQsICVkLCAlbGRcbiIsCisgICAgICAgICAgIHJlc3VsdC0+ZGlhbG9nRXggPyAiRVgiIDogIiIsIHJlc3VsdC0+eCwgcmVzdWx0LT55LAorICAgICAgICAgICByZXN1bHQtPmN4LCByZXN1bHQtPmN5LCByZXN1bHQtPmhlbHBJZCApOworICAgIFRSQUNFKCBkaWFsb2csICIgU1RZTEUgMHglMDhseFxuIiwgcmVzdWx0LT5zdHlsZSApOworICAgIFRSQUNFKCBkaWFsb2csICIgRVhTVFlMRSAweCUwOGx4XG4iLCByZXN1bHQtPmV4U3R5bGUgKTsKIAogICAgIC8qIEdldCB0aGUgbWVudSBuYW1lICovCiAKQEAgLTQyNCw3ICs0NzMsNyBAQAogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICByZXN1bHQtPm1lbnVOYW1lID0gKExQQ1NUUilwOwotICAgICAgICBUUkFDRShkaWFsb2csICIgTUVOVSAnJXAnXG4iLCBwICk7CisgICAgICAgIFRSQUNFKGRpYWxvZywgIiBNRU5VICVzXG4iLCBkZWJ1Z3N0cl93KCAoTFBDV1NUUilwICkpOwogICAgICAgICBwICs9IGxzdHJsZW4zMlcoIChMUENXU1RSKXAgKSArIDE7CiAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTQ0NCw3ICs0OTMsNyBAQAogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICByZXN1bHQtPmNsYXNzTmFtZSA9IChMUENTVFIpcDsKLSAgICAgICAgVFJBQ0UoZGlhbG9nLCAiIENMQVNTICclcCdcbiIsIHAgKTsKKyAgICAgICAgVFJBQ0UoZGlhbG9nLCAiIENMQVNTICVzXG4iLCBkZWJ1Z3N0cl93KCAoTFBDV1NUUilwICkpOwogICAgICAgICBwICs9IGxzdHJsZW4zMlcoIChMUENXU1RSKXAgKSArIDE7CiAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTQ1Myw3ICs1MDIsNyBAQAogCiAgICAgcmVzdWx0LT5jYXB0aW9uID0gKExQQ1NUUilwOwogICAgIHAgKz0gbHN0cmxlbjMyVyggKExQQ1dTVFIpcCApICsgMTsKLSAgICBUUkFDRShkaWFsb2csICIgQ0FQVElPTiAnJXAnXG4iLCByZXN1bHQtPmNhcHRpb24gKTsKKyAgICBUUkFDRShkaWFsb2csICIgQ0FQVElPTiAlc1xuIiwgZGVidWdzdHJfdyggKExQQ1dTVFIpcmVzdWx0LT5jYXB0aW9uICkgKTsKIAogICAgIC8qIEdldCB0aGUgZm9udCBuYW1lICovCiAKQEAgLTQ2MSwxMSArNTEwLDIzIEBACiAgICAgewogCXJlc3VsdC0+cG9pbnRTaXplID0gR0VUX1dPUkQocCk7CiAgICAgICAgIHArKzsKKyAgICAgICAgaWYgKHJlc3VsdC0+ZGlhbG9nRXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdC0+d2VpZ2h0ID0gR0VUX1dPUkQocCk7IHArKzsKKyAgICAgICAgICAgIHJlc3VsdC0+aXRhbGljID0gTE9CWVRFKEdFVF9XT1JEKHApKTsgcCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0LT53ZWlnaHQgPSBGV19ET05UQ0FSRTsKKyAgICAgICAgICAgIHJlc3VsdC0+aXRhbGljID0gRkFMU0U7CisgICAgICAgIH0KIAlyZXN1bHQtPmZhY2VOYW1lID0gKExQQ1NUUilwOwogICAgICAgICBwICs9IGxzdHJsZW4zMlcoIChMUENXU1RSKXAgKSArIDE7Ci0JVFJBQ0UoZGlhbG9nLCAiIEZPTlQgJWQsJyVwJ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+cG9pbnRTaXplLCByZXN1bHQtPmZhY2VOYW1lICk7CisJVFJBQ0UoZGlhbG9nLCAiIEZPTlQgJWQsICVzLCAlZCwgJXNcbiIsCisgICAgICAgICAgICAgIHJlc3VsdC0+cG9pbnRTaXplLCBkZWJ1Z3N0cl93KCAoTFBDV1NUUilyZXN1bHQtPmZhY2VOYW1lICksCisgICAgICAgICAgICAgIHJlc3VsdC0+d2VpZ2h0LCByZXN1bHQtPml0YWxpYyA/ICJUUlVFIiA6ICJGQUxTRSIgKTsKICAgICB9CisKICAgICAvKiBGaXJzdCBjb250cm9sIGlzIG9uIGR3b3JkIGJvdW5kYXJ5ICovCiAgICAgcmV0dXJuIChMUENTVFIpKCgoKGludClwKSArIDMpICYgfjMpOwogfQpAQCAtNTE3LDEwICs1NzgsMTAgQEAKICAgICAgICAgICAvKiBUaGUgZm9udCBoZWlnaHQgbXVzdCBiZSBuZWdhdGl2ZSBhcyBpdCBpcyBhIHBvaW50IHNpemUgKi8KICAgICAgICAgICAvKiAoc2VlIENyZWF0ZUZvbnQoKSBkb2N1bWVudGF0aW9uIGluIHRoZSBXaW5kb3dzIFNESykuICAgKi8KIAlpZiAod2luMzJUZW1wbGF0ZSkKLQkgICAgaEZvbnQgPSBDcmVhdGVGb250MzJXKCAtdGVtcGxhdGUucG9pbnRTaXplLCAwLCAwLCAwLCBGV19ET05UQ0FSRSwKLQkJCSAgICBGQUxTRSwgRkFMU0UsIEZBTFNFLCBERUZBVUxUX0NIQVJTRVQsIDAsIDAsCi0JCQkgICAgUFJPT0ZfUVVBTElUWSwgRkZfRE9OVENBUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQ1dTVFIpdGVtcGxhdGUuZmFjZU5hbWUgKTsKKwkgICAgaEZvbnQgPSBDcmVhdGVGb250MzJXKCAtdGVtcGxhdGUucG9pbnRTaXplLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS53ZWlnaHQsIHRlbXBsYXRlLml0YWxpYywgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBERUZBVUxUX0NIQVJTRVQsIDAsIDAsIFBST09GX1FVQUxJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0RPTlRDQVJFLCAoTFBDV1NUUil0ZW1wbGF0ZS5mYWNlTmFtZSApOwogCWVsc2UKIAkgICAgaEZvbnQgPSBDcmVhdGVGb250MTYoIC10ZW1wbGF0ZS5wb2ludFNpemUsIDAsIDAsIDAsIEZXX0RPTlRDQVJFLAogCQkJICAgIEZBTFNFLCBGQUxTRSwgRkFMU0UsIERFRkFVTFRfQ0hBUlNFVCwgMCwgMCwKQEAgLTYwMiw2ICs2NjMsNyBAQAogICAgIH0KICAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogICAgIHduZFB0ci0+ZmxhZ3MgfD0gV0lOX0lTRElBTE9HOworICAgIHduZFB0ci0+aGVscENvbnRleHQgPSB0ZW1wbGF0ZS5oZWxwSWQ7CiAKICAgICAgIC8qIEluaXRpYWxpc2UgZGlhbG9nIGV4dHJhIGRhdGEgKi8KIApAQCAtNjIxLDggKzY4Myw4IEBACiAKICAgICAvKiBDcmVhdGUgY29udHJvbHMgKi8KIAotICAgIGlmIChESUFMT0dfQ3JlYXRlQ29udHJvbHMoIHduZFB0ciwgZGxnVGVtcGxhdGUsIHRlbXBsYXRlLm5iSXRlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhJbnN0LCB3aW4zMlRlbXBsYXRlICkpCisgICAgaWYgKERJQUxPR19DcmVhdGVDb250cm9scyggd25kUHRyLCBkbGdUZW1wbGF0ZSwgJnRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhJbnN0LCB3aW4zMlRlbXBsYXRlICkpCiAgICAgewogICAgICAgIC8qIFNlbmQgaW5pdGlhbGlzYXRpb24gbWVzc2FnZXMgYW5kIHNldCBmb2N1cyAqLwogCkBAIC02NjksNyArNzMxLDcgQEAKICAgICBUUkFDRShkaWFsb2csICIlMDR4LCUwOGx4LCUwNHgsJTA4bHgsJWxkXG4iLAogICAgICAgICAgICAgICAgICAgIGhJbnN0LCAoRFdPUkQpZGxnVGVtcGxhdGUsIG93bmVyLCAoRFdPUkQpZGxnUHJvYywgcGFyYW0gKTsKIAotICAgIGlmICghKGhSc3JjID0gRmluZFJlc291cmNlMTYoIGhJbnN0LCBkbGdUZW1wbGF0ZSwgUlRfRElBTE9HICkpKSByZXR1cm4gMDsKKyAgICBpZiAoIShoUnNyYyA9IEZpbmRSZXNvdXJjZTE2KCBoSW5zdCwgZGxnVGVtcGxhdGUsIFJUX0RJQUxPRzE2ICkpKSByZXR1cm4gMDsKICAgICBpZiAoIShobWVtID0gTG9hZFJlc291cmNlMTYoIGhJbnN0LCBoUnNyYyApKSkgcmV0dXJuIDA7CiAgICAgaWYgKCEoZGF0YSA9IExvY2tSZXNvdXJjZTE2KCBobWVtICkpKSBod25kID0gMDsKICAgICBlbHNlIGh3bmQgPSBDcmVhdGVEaWFsb2dJbmRpcmVjdFBhcmFtMTYoIGhJbnN0LCBkYXRhLCBvd25lciwKQEAgLTY4MCw3ICs3NDIsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENyZWF0ZURpYWxvZ1BhcmFtMzJBICAgKFVTRVIzMi43MikKKyAqICAgICAgICAgICBDcmVhdGVEaWFsb2dQYXJhbTMyQSAgIChVU0VSMzIuNzMpCiAgKi8KIEhXTkQzMiBXSU5BUEkgQ3JlYXRlRGlhbG9nUGFyYW0zMkEoIEhJTlNUQU5DRTMyIGhJbnN0LCBMUENTVFIgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTkQzMiBvd25lciwgRExHUFJPQzMyIGRsZ1Byb2MsCkBAIC02OTgsMTMgKzc2MCwxMyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENyZWF0ZURpYWxvZ1BhcmFtMzJXICAgKFVTRVIzMi43MykKKyAqICAgICAgICAgICBDcmVhdGVEaWFsb2dQYXJhbTMyVyAgIChVU0VSMzIuNzQpCiAgKi8KIEhXTkQzMiBXSU5BUEkgQ3JlYXRlRGlhbG9nUGFyYW0zMlcoIEhJTlNUQU5DRTMyIGhJbnN0LCBMUENXU1RSIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV05EMzIgb3duZXIsIERMR1BST0MzMiBkbGdQcm9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIHBhcmFtICkKIHsKLSAgICBIQU5ETEUzMiBocnNyYyA9IEZpbmRSZXNvdXJjZTMyVyggaEluc3QsIG5hbWUsIChMUFdTVFIpUlRfRElBTE9HICk7CisgICAgSEFORExFMzIgaHJzcmMgPSBGaW5kUmVzb3VyY2UzMlcoIGhJbnN0LCBuYW1lLCBSVF9ESUFMT0czMlcgKTsKICAgICBpZiAoIWhyc3JjKSByZXR1cm4gMDsKICAgICByZXR1cm4gQ3JlYXRlRGlhbG9nSW5kaXJlY3RQYXJhbTMyVyggaEluc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpTG9hZFJlc291cmNlMzIoaEluc3QsIGhyc3JjKSwKQEAgLTc0OSw3ICs4MTEsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENyZWF0ZURpYWxvZ0luZGlyZWN0UGFyYW0zMlcgICAoVVNFUjMyLjcxKQorICogICAgICAgICAgIENyZWF0ZURpYWxvZ0luZGlyZWN0UGFyYW0zMlcgICAoVVNFUjMyLjcyKQogICovCiBIV05EMzIgV0lOQVBJIENyZWF0ZURpYWxvZ0luZGlyZWN0UGFyYW0zMlcoIEhJTlNUQU5DRTMyIGhJbnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENWT0lEIGRsZ1RlbXBsYXRlLApAQCAtODE4LDcgKzg4MCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRGlhbG9nQm94UGFyYW0zMkEgICAoVVNFUjMyLjEzOCkKKyAqICAgICAgICAgICBEaWFsb2dCb3hQYXJhbTMyQSAgIChVU0VSMzIuMTM5KQogICovCiBJTlQzMiBXSU5BUEkgRGlhbG9nQm94UGFyYW0zMkEoIEhJTlNUQU5DRTMyIGhJbnN0LCBMUENTVFIgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdORDMyIG93bmVyLCBETEdQUk9DMzIgZGxnUHJvYywgTFBBUkFNIHBhcmFtICkKQEAgLTgzMCw3ICs4OTIsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERpYWxvZ0JveFBhcmFtMzJXICAgKFVTRVIzMi4xMzkpCisgKiAgICAgICAgICAgRGlhbG9nQm94UGFyYW0zMlcgICAoVVNFUjMyLjE0MCkKICAqLwogSU5UMzIgV0lOQVBJIERpYWxvZ0JveFBhcmFtMzJXKCBISU5TVEFOQ0UzMiBoSW5zdCwgTFBDV1NUUiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV05EMzIgb3duZXIsIERMR1BST0MzMiBkbGdQcm9jLCBMUEFSQU0gcGFyYW0gKQpAQCAtODcwLDcgKzkzMiw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRGlhbG9nQm94SW5kaXJlY3RQYXJhbTMyQSAgIChVU0VSMzIuMTM1KQorICogICAgICAgICAgIERpYWxvZ0JveEluZGlyZWN0UGFyYW0zMkEgICAoVVNFUjMyLjEzNikKICAqLwogSU5UMzIgV0lOQVBJIERpYWxvZ0JveEluZGlyZWN0UGFyYW0zMkEoSElOU1RBTkNFMzIgaEluc3RhbmNlLCBMUENWT0lEIHRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdORDMyIG93bmVyLCBETEdQUk9DMzIgZGxnUHJvYywKQEAgLTg4NCw3ICs5NDYsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERpYWxvZ0JveEluZGlyZWN0UGFyYW0zMlcgICAoVVNFUjMyLjEzNykKKyAqICAgICAgICAgICBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtMzJXICAgKFVTRVIzMi4xMzgpCiAgKi8KIElOVDMyIFdJTkFQSSBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtMzJXKEhJTlNUQU5DRTMyIGhJbnN0YW5jZSwgTFBDVk9JRCB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTkQzMiBvd25lciwgRExHUFJPQzMyIGRsZ1Byb2MsCkBAIC05MDcsNyArOTY5LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBFbmREaWFsb2czMiAgIChVU0VSMzIuMTczKQorICogICAgICAgICAgIEVuZERpYWxvZzMyICAgKFVTRVIuODgpCiAgKi8KIEJPT0wzMiBXSU5BUEkgRW5kRGlhbG9nMzIoIEhXTkQzMiBod25kLCBJTlQzMiByZXR2YWwgKQogewpAQCAtMTA1Myw3ICsxMTE1LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBJc0RpYWxvZ01lc3NhZ2UzMkEgICAoVVNFUjMyLjM0MSkKKyAqICAgICAgICAgICBJc0RpYWxvZ01lc3NhZ2UzMkEgICAoVVNFUjMyLjM0MikKICAqLwogQk9PTDMyIFdJTkFQSSBJc0RpYWxvZ01lc3NhZ2UzMkEoIEhXTkQzMiBod25kRGxnLCBMUE1TRzMyIG1zZyApCiB7CkBAIC0xMDcyLDcgKzExMzQsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIElzRGlhbG9nTWVzc2FnZTMyVyAgIChVU0VSMzIuMzQyKQorICogICAgICAgICAgIElzRGlhbG9nTWVzc2FnZTMyVyAgIChVU0VSMzIuMzQzKQogICovCiBCT09MMzIgV0lOQVBJIElzRGlhbG9nTWVzc2FnZTMyVyggSFdORDMyIGh3bmREbGcsIExQTVNHMzIgbXNnICkKIHsKQEAgLTExMDIsNyArMTE2NCw3IEBACiAgCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIEdldERsZ0N0cmxJRDMyICAgKFVTRVIzMi4yMzMpCisgKiAgICAgICAgIEdldERsZ0N0cmxJRDMyICAgKFVTRVIzMi4yMzQpCiAgKi8KIElOVDMyIFdJTkFQSSBHZXREbGdDdHJsSUQzMiggSFdORDMyIGh3bmQgKQogewpAQCAtMTEyNyw3ICsxMTg5LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXREbGdJdGVtMzIgICAoVVNFUjMyLjIzNCkKKyAqICAgICAgICAgICBHZXREbGdJdGVtMzIgICAoVVNFUjMyLjIzNSkKICAqLwogSFdORDMyIFdJTkFQSSBHZXREbGdJdGVtMzIoIEhXTkQzMiBod25kRGxnLCBJTlQzMiBpZCApCiB7CkBAIC0xMTUzLDcgKzEyMTUsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlMzJBICAgKFVTRVIzMi40NTEpCisgKiAgICAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlMzJBICAgKFVTRVIzMi40NTIpCiAgKi8KIExSRVNVTFQgV0lOQVBJIFNlbmREbGdJdGVtTWVzc2FnZTMyQSggSFdORDMyIGh3bmQsIElOVDMyIGlkLCBVSU5UMzIgbXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQpAQCAtMTE2NSw3ICsxMjI3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZTMyVyAgIChVU0VSMzIuNDUyKQorICogICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZTMyVyAgIChVU0VSMzIuNDUzKQogICovCiBMUkVTVUxUIFdJTkFQSSBTZW5kRGxnSXRlbU1lc3NhZ2UzMlcoIEhXTkQzMiBod25kLCBJTlQzMiBpZCwgVUlOVDMyIG1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKQEAgLTExODYsNyArMTI0OCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXREbGdJdGVtVGV4dDMyQSAgIChVU0VSMzIuNDc3KQorICogICAgICAgICAgIFNldERsZ0l0ZW1UZXh0MzJBICAgKFVTRVIzMi40NzgpCiAgKi8KIHZvaWQgV0lOQVBJIFNldERsZ0l0ZW1UZXh0MzJBKCBIV05EMzIgaHduZCwgSU5UMzIgaWQsIExQQ1NUUiBscFN0cmluZyApCiB7CkBAIC0xMTk1LDcgKzEyNTcsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0RGxnSXRlbVRleHQzMlcgICAoVVNFUjMyLjQ3OCkKKyAqICAgICAgICAgICBTZXREbGdJdGVtVGV4dDMyVyAgIChVU0VSMzIuNDc5KQogICovCiB2b2lkIFdJTkFQSSBTZXREbGdJdGVtVGV4dDMyVyggSFdORDMyIGh3bmQsIElOVDMyIGlkLCBMUENXU1RSIGxwU3RyaW5nICkKIHsKQEAgLTEyMTQsNyArMTI3Niw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0RGxnSXRlbVRleHQzMkEgICAoVVNFUjMyLjIzNikKKyAqICAgICAgICAgICBHZXREbGdJdGVtVGV4dDMyQSAgIChVU0VSMzIuMjM3KQogICovCiBJTlQzMiBXSU5BUEkgR2V0RGxnSXRlbVRleHQzMkEoIEhXTkQzMiBod25kLCBJTlQzMiBpZCwgTFBTVFIgc3RyLCBVSU5UMzIgbGVuICkKIHsKQEAgLTEyMjQsNyArMTI4Niw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0RGxnSXRlbVRleHQzMlcgICAoVVNFUjMyLjIzNykKKyAqICAgICAgICAgICBHZXREbGdJdGVtVGV4dDMyVyAgIChVU0VSMzIuMjM4KQogICovCiBJTlQzMiBXSU5BUEkgR2V0RGxnSXRlbVRleHQzMlcoIEhXTkQzMiBod25kLCBJTlQzMiBpZCwgTFBXU1RSIHN0ciwgVUlOVDMyIGxlbiApCiB7CkBAIC0xMjQzLDcgKzEzMDUsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0RGxnSXRlbUludDMyICAgKFVTRVIzMi40NzYpCisgKiAgICAgICAgICAgU2V0RGxnSXRlbUludDMyICAgKFVTRVIzMi40NzcpCiAgKi8KIHZvaWQgV0lOQVBJIFNldERsZ0l0ZW1JbnQzMiggSFdORDMyIGh3bmQsIElOVDMyIGlkLCBVSU5UMzIgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBmU2lnbmVkICkKQEAgLTEyODIsNyArMTM0NCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0RGxnSXRlbUludDMyICAgKFVTRVIzMi4yMzUpCisgKiAgICAgICAgICAgR2V0RGxnSXRlbUludDMyICAgKFVTRVIzMi4yMzYpCiAgKi8KIFVJTlQzMiBXSU5BUEkgR2V0RGxnSXRlbUludDMyKCBIV05EMzIgaHduZCwgSU5UMzIgaWQsIEJPT0wzMiAqdHJhbnNsYXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgZlNpZ25lZCApCkBAIC0xMzI1LDcgKzEzODcsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENoZWNrRGxnQnV0dG9uMzIgICAoVVNFUjMyLjQ0KQorICogICAgICAgICAgIENoZWNrRGxnQnV0dG9uMzIgICAoVVNFUjMyLjQ1KQogICovCiBCT09MMzIgV0lOQVBJIENoZWNrRGxnQnV0dG9uMzIoIEhXTkQzMiBod25kLCBJTlQzMiBpZCwgVUlOVDMyIGNoZWNrICkKIHsKQEAgLTEzNDQsNyArMTQwNiw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgSXNEbGdCdXR0b25DaGVja2VkMzIgICAoVVNFUjMyLjM0MykKKyAqICAgICAgICAgICBJc0RsZ0J1dHRvbkNoZWNrZWQzMiAgIChVU0VSMzIuMzQ0KQogICovCiBVSU5UMzIgV0lOQVBJIElzRGxnQnV0dG9uQ2hlY2tlZDMyKCBIV05EMzIgaHduZCwgVUlOVDMyIGlkICkKIHsKQEAgLTEzNjMsNyArMTQyNSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ2hlY2tSYWRpb0J1dHRvbjMyICAgKFVTRVIzMi40NykKKyAqICAgICAgICAgICBDaGVja1JhZGlvQnV0dG9uMzIgICAoVVNFUjMyLjQ4KQogICovCiBCT09MMzIgV0lOQVBJIENoZWNrUmFkaW9CdXR0b24zMiggSFdORDMyIGh3bmREbGcsIFVJTlQzMiBmaXJzdElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBsYXN0SUQsIFVJTlQzMiBjaGVja0lEICkKQEAgLTEzODksNyArMTQ1MSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0RGlhbG9nQmFzZVVuaXRzICAgKFVTRVIuMjQzKSAoVVNFUjMyLjIzMikKKyAqICAgICAgICAgICBHZXREaWFsb2dCYXNlVW5pdHMgICAoVVNFUi4yNDMpIChVU0VSMzIuMjMzKQogICovCiBEV09SRCBXSU5BUEkgR2V0RGlhbG9nQmFzZVVuaXRzKHZvaWQpCiB7CkBAIC0xNDE0LDcgKzE0NzYsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE1hcERpYWxvZ1JlY3QzMiAgIChVU0VSMzIuMzgxKQorICogICAgICAgICAgIE1hcERpYWxvZ1JlY3QzMiAgIChVU0VSMzIuMzgyKQogICovCiB2b2lkIFdJTkFQSSBNYXBEaWFsb2dSZWN0MzIoIEhXTkQzMiBod25kLCBMUFJFQ1QzMiByZWN0ICkKIHsKQEAgLTE0NDAsNyArMTUwMiw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0TmV4dERsZ0dyb3VwSXRlbTMyICAgKFVTRVIzMi4yNzQpCisgKiAgICAgICAgICAgR2V0TmV4dERsZ0dyb3VwSXRlbTMyICAgKFVTRVIzMi4yNzUpCiAgKi8KIEhXTkQzMiBXSU5BUEkgR2V0TmV4dERsZ0dyb3VwSXRlbTMyKCBIV05EMzIgaHduZERsZywgSFdORDMyIGh3bmRDdHJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBmUHJldmlvdXMgKQpAQCAtMTUwMSw3ICsxNTYzLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXROZXh0RGxnVGFiSXRlbTMyICAgKFVTRVIzMi4yNzUpCisgKiAgICAgICAgICAgR2V0TmV4dERsZ1RhYkl0ZW0zMiAgIChVU0VSMzIuMjc2KQogICovCiBIV05EMzIgV0lOQVBJIEdldE5leHREbGdUYWJJdGVtMzIoIEhXTkQzMiBod25kRGxnLCBIV05EMzIgaHduZEN0cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBmUHJldmlvdXMgKQpAQCAtMTc1OSw3ICsxODIxLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERsZ0RpclNlbGVjdEV4MzJBICAgIChVU0VSMzIuMTQ4KQorICogICAgICAgICAgIERsZ0RpclNlbGVjdEV4MzJBICAgIChVU0VSMzIuMTQ5KQogICovCiBCT09MMzIgV0lOQVBJIERsZ0RpclNlbGVjdEV4MzJBKCBIV05EMzIgaHduZCwgTFBTVFIgc3RyLCBJTlQzMiBsZW4sIElOVDMyIGlkICkKIHsKQEAgLTE3NjgsNyArMTgzMCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBEbGdEaXJTZWxlY3RFeDMyVyAgICAoVVNFUjMyLjE0OSkKKyAqICAgICAgICAgICBEbGdEaXJTZWxlY3RFeDMyVyAgICAoVVNFUjMyLjE1MCkKICAqLwogQk9PTDMyIFdJTkFQSSBEbGdEaXJTZWxlY3RFeDMyVyggSFdORDMyIGh3bmQsIExQV1NUUiBzdHIsIElOVDMyIGxlbiwgSU5UMzIgaWQgKQogewpAQCAtMTc4Nyw3ICsxODQ5LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERsZ0RpclNlbGVjdENvbWJvQm94RXgzMkEgICAgKFVTRVIzMi4xNDYpCisgKiAgICAgICAgICAgRGxnRGlyU2VsZWN0Q29tYm9Cb3hFeDMyQSAgICAoVVNFUjMyLjE0NykKICAqLwogQk9PTDMyIFdJTkFQSSBEbGdEaXJTZWxlY3RDb21ib0JveEV4MzJBKCBIV05EMzIgaHduZCwgTFBTVFIgc3RyLCBJTlQzMiBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGlkICkKQEAgLTE3OTcsNyArMTg1OSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBEbGdEaXJTZWxlY3RDb21ib0JveEV4MzJXICAgIChVU0VSMzIuMTQ3KQorICogICAgICAgICAgIERsZ0RpclNlbGVjdENvbWJvQm94RXgzMlcgICAgKFVTRVIzMi4xNDgpCiAgKi8KIEJPT0wzMiBXSU5BUEkgRGxnRGlyU2VsZWN0Q29tYm9Cb3hFeDMyVyggSFdORDMyIGh3bmQsIExQV1NUUiBzdHIsIElOVDMyIGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgaWQpCkBAIC0xODE3LDcgKzE4NzksNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgRGxnRGlyTGlzdDMyQSAgICAoVVNFUjMyLjE0MikKKyAqCSAgICBEbGdEaXJMaXN0MzJBICAgIChVU0VSMzIuMTQzKQogICovCiBJTlQzMiBXSU5BUEkgRGxnRGlyTGlzdDMyQSggSFdORDMyIGhEbGcsIExQU1RSIHNwZWMsIElOVDMyIGlkTEJveCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBpZFN0YXRpYywgVUlOVDMyIGF0dHJpYiApCkBAIC0xODI3LDcgKzE4ODksNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgRGxnRGlyTGlzdDMyVyAgICAoVVNFUjMyLjE0NSkKKyAqCSAgICBEbGdEaXJMaXN0MzJXICAgIChVU0VSMzIuMTQ2KQogICovCiBJTlQzMiBXSU5BUEkgRGxnRGlyTGlzdDMyVyggSFdORDMyIGhEbGcsIExQV1NUUiBzcGVjLCBJTlQzMiBpZExCb3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgaWRTdGF0aWMsIFVJTlQzMiBhdHRyaWIgKQpAQCAtMTg0Nyw3ICsxOTA5LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgIERsZ0Rpckxpc3RDb21ib0JveDMyQSAgICAoVVNFUjMyLjE0MykKKyAqCSAgICBEbGdEaXJMaXN0Q29tYm9Cb3gzMkEgICAgKFVTRVIzMi4xNDQpCiAgKi8KIElOVDMyIFdJTkFQSSBEbGdEaXJMaXN0Q29tYm9Cb3gzMkEoIEhXTkQzMiBoRGxnLCBMUFNUUiBzcGVjLCBJTlQzMiBpZENCb3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBpZFN0YXRpYywgVUlOVDMyIGF0dHJpYiApCkBAIC0xODU3LDcgKzE5MTksNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgRGxnRGlyTGlzdENvbWJvQm94MzJXICAgIChVU0VSMzIuMTQ0KQorICoJICAgIERsZ0Rpckxpc3RDb21ib0JveDMyVyAgICAoVVNFUjMyLjE0NSkKICAqLwogSU5UMzIgV0lOQVBJIERsZ0Rpckxpc3RDb21ib0JveDMyVyggSFdORDMyIGhEbGcsIExQV1NUUiBzcGVjLCBJTlQzMiBpZENCb3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBpZFN0YXRpYywgVUlOVDMyIGF0dHJpYiApCmRpZmYgLS1naXQgYS93aW5kb3dzL2RpbnB1dC5jIGIvd2luZG93cy9kaW5wdXQuYwppbmRleCAxMDE0MzVmLi5lMDM0YWViIDEwMDY0NAotLS0gYS93aW5kb3dzL2RpbnB1dC5jCisrKyBiL3dpbmRvd3MvZGlucHV0LmMKQEAgLTIzOCw3ICsyMzgsNiBAQAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIFN5c0tleWJvYXJkQV9TZXRQcm9wZXJ0eSgKIAlMUERJUkVDVElOUFVUREVWSUNFMzJBIHRoaXMsUkVGR1VJRCByZ3VpZCxMUENESVBST1BIRUFERVIgcGgKICkgewotCUxQU1lTS0VZQk9BUkQzMkEJa3RoaXMgPSAoTFBTWVNLRVlCT0FSRDMyQSl0aGlzOwogCWNoYXIJCQl4YnVmWzUwXTsKIAogCWlmIChISVdPUkQocmd1aWQpKQpkaWZmIC0tZ2l0IGEvd2luZG93cy9ldmVudC5jIGIvd2luZG93cy9ldmVudC5jCmluZGV4IGU1NWMwNDguLjk0ZTFlNTIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZXZlbnQuYworKysgYi93aW5kb3dzL2V2ZW50LmMKQEAgLTExNzcsNyArMTE3Nyw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQlTZXRDYXB0dXJlMzIgICAoVVNFUjMyLjQ2MykKKyAqCQlTZXRDYXB0dXJlMzIgICAoVVNFUjMyLjQ2NCkKICAqLwogSFdORDMyIFdJTkFQSSBTZXRDYXB0dXJlMzIoIEhXTkQzMiBod25kICkKIHsKQEAgLTExODYsNyArMTE4Niw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQlSZWxlYXNlQ2FwdHVyZSAgIChVU0VSLjE5KSAoVVNFUjMyLjQzOCkKKyAqCQlSZWxlYXNlQ2FwdHVyZSAgIChVU0VSLjE5KSAoVVNFUjMyLjQzOSkKICAqLwogdm9pZCBXSU5BUEkgUmVsZWFzZUNhcHR1cmUodm9pZCkKIHsKQEAgLTEyMDUsNyArMTIwNSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQlHZXRDYXB0dXJlMzIgICAoVVNFUjMyLjIwNykKKyAqCQlHZXRDYXB0dXJlMzIgICAoVVNFUjMyLjIwOCkKICAqLwogSFdORDMyIFdJTkFQSSBHZXRDYXB0dXJlMzIodm9pZCkKIHsKQEAgLTEyODgsNyArMTI4OCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgIFN3YXBNb3VzZUJ1dHRvbjMyICAgKFVTRVIzMi41MzYpCisgKgkgICAgIFN3YXBNb3VzZUJ1dHRvbjMyICAgKFVTRVIzMi41MzcpCiAgKi8KIEJPT0wzMiBXSU5BUEkgU3dhcE1vdXNlQnV0dG9uMzIoIEJPT0wzMiBmU3dhcCApCiB7CmRpZmYgLS1naXQgYS93aW5kb3dzL2ZvY3VzLmMgYi93aW5kb3dzL2ZvY3VzLmMKaW5kZXggMzhlZjVjNS4uOTJjNzU3YSAxMDA2NDQKLS0tIGEvd2luZG93cy9mb2N1cy5jCisrKyBiL3dpbmRvd3MvZm9jdXMuYwpAQCAtOTEsNyArOTEsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgICBTZXRGb2N1czMyICAgKFVTRVIzMi40ODApCisgKiAgICAgICAgICAgICAgIFNldEZvY3VzMzIgICAoVVNFUjMyLjQ4MSkKICAqLwogSFdORDMyIFdJTkFQSSBTZXRGb2N1czMyKCBIV05EMzIgaHduZCApCiB7CkBAIC0xNDcsNyArMTQ3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgR2V0Rm9jdXMzMiAgIChVU0VSMzIuMjM5KQorICogICAgICAgICAgICAgICBHZXRGb2N1czMyICAgKFVTRVIzMi4yNDApCiAgKi8KIEhXTkQzMiBXSU5BUEkgR2V0Rm9jdXMzMih2b2lkKQogewpkaWZmIC0tZ2l0IGEvd2luZG93cy9ob29rLmMgYi93aW5kb3dzL2hvb2suYwppbmRleCA3OWYxYTdiLi5hOWUxMDg5IDEwMDY0NAotLS0gYS93aW5kb3dzL2hvb2suYworKysgYi93aW5kb3dzL2hvb2suYwpAQCAtMTE4NSw3ICsxMTg1LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRXaW5kb3dzSG9vazMyQSAgIChVU0VSMzIuNTI0KQorICogICAgICAgICAgIFNldFdpbmRvd3NIb29rMzJBICAgKFVTRVIzMi41MjUpCiAgKgogICogRklYTUU6IEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIGNvcnJlY3QKICAqLwpAQCAtMTIwMiw3ICsxMjAyLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRXaW5kb3dzSG9vazMyVyAgIChVU0VSMzIuNTI3KQorICogICAgICAgICAgIFNldFdpbmRvd3NIb29rMzJXICAgKFVTRVIzMi41MjgpCiAgKgogICogRklYTUU6IEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIGNvcnJlY3QKICAqLwpAQCAtMTIzMCw3ICsxMjMwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRXaW5kb3dzSG9va0V4MzJBICAgKFVTRVIzMi41MjUpCisgKiAgICAgICAgICAgU2V0V2luZG93c0hvb2tFeDMyQSAgIChVU0VSMzIuNTI2KQogICovCiBISE9PSyBXSU5BUEkgU2V0V2luZG93c0hvb2tFeDMyQSggSU5UMzIgaWQsIEhPT0tQUk9DMzIgcHJvYywgSElOU1RBTkNFMzIgaEluc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdUaHJlYWRJRCApCkBAIC0xMjQ5LDcgKzEyNDksNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldFdpbmRvd3NIb29rRXgzMlcgICAoVVNFUjMyLjUyNikKKyAqICAgICAgICAgICBTZXRXaW5kb3dzSG9va0V4MzJXICAgKFVTRVIzMi41MjcpCiAgKi8KIEhIT09LIFdJTkFQSSBTZXRXaW5kb3dzSG9va0V4MzJXKCBJTlQzMiBpZCwgSE9PS1BST0MzMiBwcm9jLCBISU5TVEFOQ0UzMiBoSW5zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1RocmVhZElEICkKQEAgLTEyODgsNyArMTI4OCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgVW5ob29rV2luZG93c0hvb2szMiAgIChVU0VSMzIuNTU2KQorICogICAgICAgICAgIFVuaG9va1dpbmRvd3NIb29rMzIgICAoVVNFUjMyLjU1NykKICAqLwogQk9PTDMyIFdJTkFQSSBVbmhvb2tXaW5kb3dzSG9vazMyKCBJTlQzMiBpZCwgSE9PS1BST0MzMiBwcm9jICkKIHsKQEAgLTEzMTgsNyArMTMxOCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgVW5ob29rV2luZG93SG9va0V4MzIgICAoVVNFUjMyLjU1NykKKyAqICAgICAgICAgICBVbmhvb2tXaW5kb3dIb29rRXgzMiAgIChVU0VSMzIuNTU4KQogICovCiBCT09MMzIgV0lOQVBJIFVuaG9va1dpbmRvd3NIb29rRXgzMiggSEhPT0sgaGhvb2sgKQogewpAQCAtMTM0NSw3ICsxMzQ1LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDYWxsTmV4dEhvb2tFeDMyICAgIChVU0VSMzIuMTYpCisgKiAgICAgICAgICAgQ2FsbE5leHRIb29rRXgzMiAgICAoVVNFUjMyLjE3KQogICoKICAqIFRoZXJlIGFyZW4ndCBBTlNJIGFuZCBVTklDT0RFIHZlcnNpb25zIG9mIHRoaXMuCiAgKi8KQEAgLTEzOTYsNyArMTM5Niw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ2FsbE1zZ0ZpbHRlcjMyQSAgIChVU0VSMzIuMTQpCisgKiAgICAgICAgICAgQ2FsbE1zZ0ZpbHRlcjMyQSAgIChVU0VSMzIuMTUpCiAgKi8KIC8qCiAgKiBGSVhNRTogVGhlcmUgYXJlIEFOU0kgYW5kIFVOSUNPREUgdmVyc2lvbnMgb2YgdGhpcywgcGx1cyBhbiB1bnNwZWNpZmllZApAQCAtMTQxMiw3ICsxNDEyLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDYWxsTXNnRmlsdGVyMzJXICAgKFVTRVIzMi4xNSkKKyAqICAgICAgICAgICBDYWxsTXNnRmlsdGVyMzJXICAgKFVTRVIzMi4xNikKICAqLwogQk9PTDMyIFdJTkFQSSBDYWxsTXNnRmlsdGVyMzJXKCBMUE1TRzMyIG1zZywgSU5UMzIgY29kZSApCiB7CmRpZmYgLS1naXQgYS93aW5kb3dzL2tleWJvYXJkLmMgYi93aW5kb3dzL2tleWJvYXJkLmMKaW5kZXggNmQ5MTM5OC4uMDZkZTFmNyAxMDA2NDQKLS0tIGEvd2luZG93cy9rZXlib2FyZC5jCisrKyBiL3dpbmRvd3Mva2V5Ym9hcmQuYwpAQCAtMzEwLDYgKzMxMCw5IEBACiAKIHN0YXRpYyBCT09MMzIgTnVtU3RhdGU9RkFMU0UsIENhcHNTdGF0ZT1GQUxTRTsKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlLRVlCT0FSRF9HZW5lcmF0ZU1zZworICovCiB2b2lkIEtFWUJPQVJEX0dlbmVyYXRlTXNnKCBXT1JEIHZrZXksIGludCBFdnR5cGUsIElOVDMyIGV2ZW50X3gsIElOVDMyIGV2ZW50X3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBldmVudF90aW1lLCBLRVlMUCBsb2NhbGtleWxwICkKIHsKQEAgLTQ5Miw3ICs0OTUsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJR2V0S2V5U3RhdGUJCQlbVVNFUi4xMDZdCisgKiAgICAgICAgICAgR2V0S2V5U3RhdGUgICAgICAoVVNFUi4xMDYpCiAgKi8KIFdPUkQgV0lOQVBJIEdldEtleVN0YXRlMTYoSU5UMTYgdmtleSkKIHsKQEAgLTUwMCw3ICs1MDMsOCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCUdldEtleVN0YXRlCQkJW1VTRVIzMi4yNDhdCisgKiAgICAgICAgICAgR2V0S2V5U3RhdGUgICAgICAoVVNFUjMyLjI0OSkKKyAqCiAgKiBBbiBhcHBsaWNhdGlvbiBjYWxscyB0aGUgR2V0S2V5U3RhdGUgZnVuY3Rpb24gaW4gcmVzcG9uc2UgdG8gYQogICoga2V5Ym9hcmQtaW5wdXQgbWVzc2FnZS4gIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBzdGF0ZSBvZiB0aGUga2V5CiAgKiBhdCB0aGUgdGltZSB0aGUgaW5wdXQgbWVzc2FnZSB3YXMgZ2VuZXJhdGVkLiAgKFNESyAzLjEgVm9sIDIuIHAgMzkwKQpAQCAtNTMxLDcgKzUzNSw4IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJR2V0S2V5Ym9hcmRTdGF0ZQlbVVNFUi4yMjJdW1VTRVIzMi4yNTNdCisgKiAgICAgICAgICAgR2V0S2V5Ym9hcmRTdGF0ZSAgICAgIChVU0VSLjIyMikoVVNFUjMyLjI1NCkKKyAqCiAgKiBBbiBhcHBsaWNhdGlvbiBjYWxscyB0aGUgR2V0S2V5Ym9hcmRTdGF0ZSBmdW5jdGlvbiBpbiByZXNwb25zZSB0byBhCiAgKiBrZXlib2FyZC1pbnB1dCBtZXNzYWdlLiAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHN0YXRlIG9mIHRoZSBrZXlib2FyZAogICogYXQgdGhlIHRpbWUgdGhlIGlucHV0IG1lc3NhZ2Ugd2FzIGdlbmVyYXRlZC4gIChTREsgMy4xIFZvbCAyLiBwIDM4NykKQEAgLTU0OCw3ICs1NTMsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICBTZXRLZXlib2FyZFN0YXRlICAgICAgICAgICAgW1VTRVIuMjIzXVtVU0VSMzIuNDgzXQorICogICAgICAgICAgU2V0S2V5Ym9hcmRTdGF0ZSAgICAgIChVU0VSLjIyMykoVVNFUjMyLjQ4NCkKICAqLwogVk9JRCBXSU5BUEkgU2V0S2V5Ym9hcmRTdGF0ZShMUEJZVEUgbHBLZXlTdGF0ZSkKIHsKQEAgLTU2Miw3ICs1NjcsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICBHZXRBc3luY0tleVN0YXRlICAgICAgICAoVVNFUjMyLjIwNikKKyAqICAgICAgICAgICBHZXRBc3luY0tleVN0YXRlMzIgICAgICAoVVNFUjMyLjIwNykKICAqCiAgKglEZXRlcm1pbmUgaWYgYSBrZXkgaXMgb3Igd2FzIHByZXNzZWQuICByZXR2YWwgaGFzIGhpZ2gtb3JkZXIgCiAgKiBiaXQgc2V0IHRvIDEgaWYgY3VycmVudGx5IHByZXNzZWQsIGxvdy1vcmRlciBiaXQgc2V0IHRvIDEgaWYga2V5IGhhcwpAQCAtNjA2LDcgKzYxMSw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgIEdldEFzeW5jS2V5U3RhdGUgICAgICAgIChVU0VSLjI0OSkKKyAqICAgICAgICAgICAgR2V0QXN5bmNLZXlTdGF0ZTE2ICAgICAgICAoVVNFUi4yNDkpCiAgKi8KIFdPUkQgV0lOQVBJIEdldEFzeW5jS2V5U3RhdGUxNihJTlQxNiBuS2V5KQogewpAQCAtNjE0LDcgKzYxOSw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCVRyYW5zbGF0ZUFjY2VsZXJhdG9yIAlbVVNFUi4xNzhdW1VTRVIzMi41NTEuLl0KKyAqICAgICAgICAgICBLQkRfdHJhbnNsYXRlX2FjY2VsZXJhdG9yCiAgKgogICogRklYTUU6IHNob3VsZCBzZW5kIHNvbWUgV01fSU5JVE1FTlUgb3IvYW5kIFdNX0lOSVRNRU5VUE9QVVAgIC1tZXNzYWdlcwogICovCkBAIC03MzQsNiArNzM5LDkgQEAKICAgICByZXR1cm4gRkFMU0U7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgIFRyYW5zbGF0ZUFjY2VsZXJhdG9yMzIgICAgICAoVVNFUjMyLjU1MSkoVVNFUjMyLjU1MikoVVNFUjMyLjU1MykKKyAqLwogSU5UMzIgV0lOQVBJIFRyYW5zbGF0ZUFjY2VsZXJhdG9yMzIoSFdORDMyIGhXbmQsIEhBQ0NFTDMyIGhBY2NlbCwgTFBNU0czMiBtc2cpCiB7CiAgICAgTFBBQ0NFTDMyCWxwQWNjZWxUYmwgPSAoTFBBQ0NFTDMyKUxvY2tSZXNvdXJjZTMyKGhBY2NlbCk7CkBAIC03NTQsMTQgKzc2MiwyMCBAQAogCSAgIm1zZy0+aHduZD0lMDR4LCBtc2ctPm1lc3NhZ2U9JTA0eFxuIiwKIAkgIGhBY2NlbCxoV25kLG1zZy0+aHduZCxtc2ctPm1lc3NhZ2UpOwogCi0gICAgZm9yIChpID0gMDsgbHBBY2NlbFRibFtpXS5rZXkgOyBpKyspCisgICAgaSA9IDA7CisgICAgZG8KKyAgICB7CiAgICAgCWlmIChLQkRfdHJhbnNsYXRlX2FjY2VsZXJhdG9yKGhXbmQsbXNnLGxwQWNjZWxUYmxbaV0uZlZpcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQWNjZWxUYmxbaV0ua2V5LGxwQWNjZWxUYmxbaV0uY21kKSkKIAkJcmV0dXJuIDE7CisgICAgfSB3aGlsZSAoKGxwQWNjZWxUYmxbaSsrXS5mVmlydCAmIDB4ODApID09IDApOwogICAgIFdBUk4oYWNjZWwsICJjb3VsZG4ndCB0cmFuc2xhdGUgYWNjZWxlcmF0b3Iga2V5Iik7CiAgICAgcmV0dXJuIDA7CiB9Ci0JCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVHJhbnNsYXRlQWNjZWxlcmF0b3IxNiAgICAgIChVU0VSLjE3OCkKKyAqLwkKIElOVDE2IFdJTkFQSSBUcmFuc2xhdGVBY2NlbGVyYXRvcjE2KEhXTkQxNiBoV25kLCBIQUNDRUwxNiBoQWNjZWwsIExQTVNHMTYgbXNnKQogewogICAgIExQQUNDRUwxNglscEFjY2VsVGJsID0gKExQQUNDRUwxNilMb2NrUmVzb3VyY2UxNihoQWNjZWwpOwpAQCAtNzg0LDE3ICs3OTgsMjAgQEAKICAgICBTVFJVQ1QzMl9NU0cxNnRvMzIobXNnLCZtc2czMik7CiAKIAotICAgIGZvciAoaT0wO2xwQWNjZWxUYmxbaV0ua2V5O2krKykgCisgICAgaSA9IDA7CisgICAgZG8KKyAgICB7CiAgICAgCWlmIChLQkRfdHJhbnNsYXRlX2FjY2VsZXJhdG9yKGhXbmQsJm1zZzMyLGxwQWNjZWxUYmxbaV0uZlZpcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQWNjZWxUYmxbaV0ua2V5LGxwQWNjZWxUYmxbaV0uY21kKSkKIAkJcmV0dXJuIDE7CisgICAgfSB3aGlsZSAoKGxwQWNjZWxUYmxbaSsrXS5mVmlydCAmIDB4ODApID09IDApOwogICAgIFdBUk4oYWNjZWwsICJjb3VsZG4ndCB0cmFuc2xhdGUgYWNjZWxlcmF0b3Iga2V5Iik7CiAgICAgcmV0dXJuIDA7CiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgCU9lbUtleVNjYW4JCQlbS0VZQk9BUkQuMTI4XVtVU0VSMzIuNDAwXQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBPZW1LZXlTY2FuICAgICAgKEtFWUJPQVJELjEyOCkoVVNFUjMyLjQwMSkKICAqLwogRFdPUkQgV0lOQVBJIE9lbUtleVNjYW4oV09SRCB3T2VtQ2hhcikKIHsKQEAgLTgwMyw4ICs4MjAsOCBAQAogICAgIHJldHVybiB3T2VtQ2hhcjsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgCVZrS2V5U2NhbkEJCQlbVVNFUjMyLjU3Ml0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVmtLZXlTY2FuQSAgICAgIChVU0VSMzIuNTczKQogICovCiAvKiBWa0tleVNjYW4gdHJhbnNsYXRlcyBhbiBBTlNJIGNoYXJhY3RlciB0byBhIHZpcnR1YWwta2V5IGFuZCBzaGlmdCBjb2RlCiAgKiBmb3IgdGhlIGN1cnJlbnQga2V5Ym9hcmQuCkBAIC04NzQsNyArODkxLDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgCVZrS2V5U2NhblcJCQlbVVNFUjMyLjU3NV0KKyAqICAgIAlWa0tleVNjYW5XICAgICAgKFVTRVIzMi41NzYpCiAgKi8KIFdPUkQgV0lOQVBJIFZrS2V5U2NhbjMyVyhXQ0hBUiBjQ2hhcikKIHsKQEAgLTg4Miw3ICs4OTksNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAJR2V0S2V5Ym9hcmRUeXBlCQkJW0tFWUJPQVJELjEzMF0KKyAqICAgIAlHZXRLZXlib2FyZFR5cGUxNiAgICAgIChLRVlCT0FSRC4xMzApCiAgKi8KIElOVDE2IFdJTkFQSSBHZXRLZXlib2FyZFR5cGUxNihJTlQxNiBuVHlwZUZsYWcpCiB7CkBAIC04OTAsNyArOTA3LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgCUdldEtleWJvYXJkVHlwZQkJCVtVU0VSMzIuMjU0XQorICogICAgCUdldEtleWJvYXJkVHlwZTMyICAgICAgKFVTRVIzMi4yNTUpCiAgKi8KIElOVDMyIFdJTkFQSSBHZXRLZXlib2FyZFR5cGUzMihJTlQzMiBuVHlwZUZsYWcpCiB7CkBAIC05MTQsNyArOTMxLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAJTWFwVmlydHVhbEtleUEJCQlbVVNFUjMyLjM4Ml0KKyAqICAgIAlNYXBWaXJ0dWFsS2V5MzJBICAgICAgKFVTRVIzMi4zODMpCiAgKi8KIFVJTlQzMiBXSU5BUEkgTWFwVmlydHVhbEtleTMyQShVSU5UMzIgY29kZSwgVUlOVDMyIG1hcHR5cGUpCiB7CkBAIC05MjIsNyArOTM5LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgCU1hcFZpcnR1YWxLZXlBCQkJW1VTRVIzMi4zODRdCisgKiAgICAJTWFwVmlydHVhbEtleTMyVyAgICAgIChVU0VSMzIuMzg1KQogICovCiBVSU5UMzIgV0lOQVBJIE1hcFZpcnR1YWxLZXkzMlcoVUlOVDMyIGNvZGUsIFVJTlQzMiBtYXB0eXBlKQogewpAQCAtOTMwLDcgKzk0Nyw4IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgIAlNYXBWaXJ0dWFsS2V5QQkJCVtLRVlCT0FSRC4xMzFdCisgKiAgICAJTWFwVmlydHVhbEtleTE2ICAgICAgKEtFWUJPQVJELjEzMSkKKyAqCiAgKiBNYXBWaXJ0dWFsS2V5IHRyYW5zbGF0ZXMga2V5Y29kZXMgZnJvbSBvbmUgZm9ybWF0IHRvIGFub3RoZXIKICAqLwogVUlOVDE2IFdJTkFQSSBNYXBWaXJ0dWFsS2V5MTYoVUlOVDE2IHdDb2RlLCBVSU5UMTYgd01hcFR5cGUpCkBAIC05ODgsNyArMTAwNiw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCUdldEtCQ29kZVBhZ2UzMiAgIChVU0VSMzIuMjQ1KQorICoJR2V0S0JDb2RlUGFnZTMyICAgKFVTRVIzMi4yNDYpCiAgKi8KIFVJTlQzMiBXSU5BUEkgR2V0S0JDb2RlUGFnZTMyKHZvaWQpCiB7CkBAIC05OTYsOSArMTAxNCwxNiBAQAogICAgIHJldHVybiA4NTA7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglHZXRLZXlOYW1lVGV4dDMyQSAgIChVU0VSMzIuMjQ3KQorICovCitJTlQzMiBXSU5BUEkgR2V0S2V5TmFtZVRleHQzMkEoTE9ORyBsUGFyYW0sIExQU1RSIGxwQnVmZmVyLCBJTlQzMiBuU2l6ZSkKK3sKKwlyZXR1cm4gR2V0S2V5TmFtZVRleHQxNihsUGFyYW0sbHBCdWZmZXIsblNpemUpOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJR2V0S2V5TmFtZVRleHQzMlcgICAoVVNFUjMyLjI0NykKKyAqCUdldEtleU5hbWVUZXh0MzJXICAgKFVTRVIzMi4yNDgpCiAgKi8KIElOVDMyIFdJTkFQSSBHZXRLZXlOYW1lVGV4dDMyVyhMT05HIGxQYXJhbSwgTFBXU1RSIGxwQnVmZmVyLCBJTlQzMiBuU2l6ZSkKIHsKQEAgLTEwMTAsMTMgKzEwMzUsNiBAQAogCXJldHVybiByZXM7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglHZXRLZXlOYW1lVGV4dDMyQSAgIChVU0VSMzIuMjQ2KQotICovCi1JTlQzMiBXSU5BUEkgR2V0S2V5TmFtZVRleHQzMkEoTE9ORyBsUGFyYW0sIExQU1RSIGxwQnVmZmVyLCBJTlQzMiBuU2l6ZSkKLXsKLQlyZXR1cm4gR2V0S2V5TmFtZVRleHQxNihsUGFyYW0sbHBCdWZmZXIsblNpemUpOwotfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJR2V0S2V5TmFtZVRleHQxNiAgIChLRVlCT0FSRC4xMzMpCkBAIC0xMDUzLDcgKzEwNzEsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJVG9Bc2NpaSAgIChVU0VSMzIuNTQ1KQorICoJVG9Bc2NpaTMyICAgICAgKFVTRVIzMi41NDYpCiAgKi8KIElOVDMyIFdJTkFQSSBUb0FzY2lpMzIoIFVJTlQzMiB2aXJ0S2V5LFVJTlQzMiBzY2FuQ29kZSxMUEJZVEUgbHBLZXlTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIExQV09SRCBscENoYXIsVUlOVDMyIGZsYWdzICkKQEAgLTEyMjQsNyArMTI0Miw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0S2V5Ym9hcmRMYXlvdXQJCQkoVVNFUjMyLjI0OSkKKyAqICAgICAgICAgICBHZXRLZXlib2FyZExheW91dAkJCShVU0VSMzIuMjUwKQogICovCiBIS0wzMiBXSU5BUEkgR2V0S2V5Ym9hcmRMYXlvdXQoRFdPUkQgZHdMYXlvdXQpCiB7CkBAIC0xMjMzLDcgKzEyNTEsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRLZXlib2FyZExheW91dExpc3QJCShVU0VSMzIuMjUwKQorICogICAgICAgICAgIEdldEtleWJvYXJkTGF5b3V0TGlzdAkJKFVTRVIzMi4yNTEpCiAgKiBGSVhNRQogICovCiBJTlQzMiBXSU5BUEkgR2V0S2V5Ym9hcmRMYXlvdXRMaXN0KElOVDMyIG5CdWZmLEhLTDMyICpsYXlvdXRzKQpkaWZmIC0tZ2l0IGEvd2luZG93cy9tZGkuYyBiL3dpbmRvd3MvbWRpLmMKaW5kZXggNzM5YWE2Ni4uYWM4NDhjMyAxMDA2NDQKLS0tIGEvd2luZG93cy9tZGkuYworKysgYi93aW5kb3dzL21kaS5jCkBAIC01NzEsNyArNTcxLDcgQEAKIHsKICBIREMzMiAJCWhEQ1NyYyAgPSBDcmVhdGVDb21wYXRpYmxlREMzMigwKTsKICBIREMzMgkJaERDRGVzdAk9IENyZWF0ZUNvbXBhdGlibGVEQzMyKGhEQ1NyYyk7Ci0gSEJJVE1BUDE2CWhiQ2xvc2UgPSBMb2FkQml0bWFwMTYoMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9DTE9TRSkgKTsKKyBIQklUTUFQMTYJaGJDbG9zZSA9IExvYWRCaXRtYXAxNigwLCBNQUtFSU5UUkVTT1VSQ0UxNihPQk1fQ0xPU0UpICk7CiAgSEJJVE1BUDE2CWhiQ29weTsKICBIQU5ETEUxNglob2JqU3JjLCBob2JqRGVzdDsKIApAQCAtOTE1LDcgKzkxNSw3IEBACiAJaWYgKCFoQm1wQ2xvc2UpCiAgICAgICAgIHsKICAgICAgICAgICAgIGhCbXBDbG9zZSA9IENyZWF0ZU1ESU1lbnVCaXRtYXAoKTsKLSAgICAgICAgICAgIGhCbXBSZXN0b3JlID0gTG9hZEJpdG1hcDE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX1JFU1RPUkUpICk7CisgICAgICAgICAgICBoQm1wUmVzdG9yZSA9IExvYWRCaXRtYXAxNiggMCwgTUFLRUlOVFJFU09VUkNFMTYoT0JNX1JFU1RPUkUpICk7CiAgICAgICAgIH0KIAlNRElfVXBkYXRlRnJhbWVUZXh0KGZyYW1lV25kLCBod25kLCBNRElfTk9GUkFNRVJFUEFJTlQsZnJhbWVXbmQtPnRleHQpOwogCkBAIC0xMTUyLDcgKzExNTIsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERlZkZyYW1lUHJvYzMyQSAgIChVU0VSMzIuMTIxKQorICogICAgICAgICAgIERlZkZyYW1lUHJvYzMyQSAgIChVU0VSMzIuMTIyKQogICovCiBMUkVTVUxUIFdJTkFQSSBEZWZGcmFtZVByb2MzMkEoIEhXTkQzMiBod25kLCBIV05EMzIgaHduZE1ESUNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIG1lc3NhZ2UsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKQEAgLTExOTIsNyArMTE5Miw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRGVmRnJhbWVQcm9jMzJXICAgKFVTRVIzMi4xMjIpCisgKiAgICAgICAgICAgRGVmRnJhbWVQcm9jMzJXICAgKFVTRVIzMi4xMjMpCiAgKi8KIExSRVNVTFQgV0lOQVBJIERlZkZyYW1lUHJvYzMyVyggSFdORDMyIGh3bmQsIEhXTkQzMiBod25kTURJQ2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgbWVzc2FnZSwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQpAQCAtMTM3Niw3ICsxMzc2LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBEZWZNRElDaGlsZFByb2MzMkEgICAoVVNFUjMyLjEyMykKKyAqICAgICAgICAgICBEZWZNRElDaGlsZFByb2MzMkEgICAoVVNFUjMyLjEyNCkKICAqLwogTFJFU1VMVCBXSU5BUEkgRGVmTURJQ2hpbGRQcm9jMzJBKCBIV05EMzIgaHduZCwgVUlOVDMyIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCkBAIC0xNDI4LDcgKzE0MjgsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERlZk1ESUNoaWxkUHJvYzMyVyAgIChVU0VSMzIuMTI0KQorICogICAgICAgICAgIERlZk1ESUNoaWxkUHJvYzMyVyAgIChVU0VSMzIuMTI1KQogICovCiBMUkVTVUxUIFdJTkFQSSBEZWZNRElDaGlsZFByb2MzMlcoIEhXTkQzMiBod25kLCBVSU5UMzIgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKQEAgLTE0NjYsMTUgKzE0NjYsMTUgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgIENyZWF0ZU1ESVdpbmRvd0EgKFVTRVIzMi43OCkKKyAqICAgICAgICAgICAgICBDcmVhdGVNRElXaW5kb3dBIChVU0VSMzIuNzkpCiAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICBDcmVhdGVNRElXaW5kb3dXIChVU0VSMzIuNzkpCisgKiAgICAgICAgICAgICAgQ3JlYXRlTURJV2luZG93VyAoVVNFUjMyLjgwKQogICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICBUcmFuc2xhdGVNRElTeXNBY2NlbDMyICAgKFVTRVIzMi41NTQpCisgKiAgICAgICAgICAgICBUcmFuc2xhdGVNRElTeXNBY2NlbDMyICAgKFVTRVIzMi41NTUpCiAgKi8KIEJPT0wzMiBXSU5BUEkgVHJhbnNsYXRlTURJU3lzQWNjZWwzMiggSFdORDMyIGh3bmRDbGllbnQsIExQTVNHMzIgbXNnICkKIHsKQEAgLTE1OTQsNyArMTU5NCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2Nyb2xsQ2hpbGRyZW4zMiAgIChVU0VSMzIuNDQ3KQorICogICAgICAgICAgIFNjcm9sbENoaWxkcmVuMzIgICAoVVNFUjMyLjQ0OCkKICAqLwogdm9pZCBXSU5BUEkgU2Nyb2xsQ2hpbGRyZW4zMihIV05EMzIgaFduZCwgVUlOVDMyIHVNc2csIFdQQVJBTTMyIHdQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSkKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWVzc2FnZS5jIGIvd2luZG93cy9tZXNzYWdlLmMKaW5kZXggZTk2ZmU1Mi4uMTVlZjQ4ZSAxMDA2NDQKLS0tIGEvd2luZG93cy9tZXNzYWdlLmMKKysrIGIvd2luZG93cy9tZXNzYWdlLmMKQEAgLTU1MSw3ICs1NTEsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0RG91YmxlQ2xpY2tUaW1lMzIgICAoVVNFUjMyLjQ3OSkKKyAqICAgICAgICAgICBTZXREb3VibGVDbGlja1RpbWUzMiAgIChVU0VSMzIuNDgwKQogICovCiBCT09MMzIgV0lOQVBJIFNldERvdWJsZUNsaWNrVGltZTMyKCBVSU5UMzIgaW50ZXJ2YWwgKQogewpAQCAtNTcwLDcgKzU3MCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXREb3VibGVDbGlja1RpbWUzMiAgIChVU0VSMzIuMjM4KQorICogICAgICAgICAgIEdldERvdWJsZUNsaWNrVGltZTMyICAgKFVTRVIzMi4yMzkpCiAgKi8KIFVJTlQzMiBXSU5BUEkgR2V0RG91YmxlQ2xpY2tUaW1lMzIodm9pZCkKIHsKQEAgLTk5MCw3ICs5OTAsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFBvc3RNZXNzYWdlMzJBICAgKFVTRVIzMi40MTgpCisgKiAgICAgICAgICAgUG9zdE1lc3NhZ2UzMkEgICAoVVNFUjMyLjQxOSkKICAqLwogQk9PTDMyIFdJTkFQSSBQb3N0TWVzc2FnZTMyQSggSFdORDMyIGh3bmQsIFVJTlQzMiBtZXNzYWdlLCBXUEFSQU0zMiB3UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtICkKQEAgLTEwMDEsNyArMTAwMSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgUG9zdE1lc3NhZ2UzMlcgICAoVVNFUjMyLjQxOSkKKyAqICAgICAgICAgICBQb3N0TWVzc2FnZTMyVyAgIChVU0VSMzIuNDIwKQogICovCiBCT09MMzIgV0lOQVBJIFBvc3RNZXNzYWdlMzJXKCBIV05EMzIgaHduZCwgVUlOVDMyIG1lc3NhZ2UsIFdQQVJBTTMyIHdQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKQpAQCAtMTE0MSw3ICsxMTQxLDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEgICAoVVNFUjMyLjQ1MykKKyAqICAgICAgICAgICBTZW5kTWVzc2FnZTMyQSAgIChVU0VSMzIuNDU0KQogICovCiBMUkVTVUxUIFdJTkFQSSBTZW5kTWVzc2FnZTMyQSggSFdORDMyIGh3bmQsIFVJTlQzMiBtc2csIFdQQVJBTTMyIHdQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtICkKQEAgLTEyNzgsNyArMTI3OCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgV2FpdE1lc3NhZ2UgICAgKFVTRVIuMTEyKSAoVVNFUjMyLjU3NykKKyAqICAgICAgICAgICBXYWl0TWVzc2FnZSAgICAoVVNFUi4xMTIpIChVU0VSMzIuNTc4KQogICovCiB2b2lkIFdJTkFQSSBXYWl0TWVzc2FnZSggdm9pZCApCiB7CkBAIC0xNDg5LDcgKzE0ODksNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFRyYW5zbGF0ZU1lc3NhZ2UzMiAgIChVU0VSMzIuNTU1KQorICogICAgICAgICAgIFRyYW5zbGF0ZU1lc3NhZ2UzMiAgIChVU0VSMzIuNTU2KQogICovCiBCT09MMzIgV0lOQVBJIFRyYW5zbGF0ZU1lc3NhZ2UzMiggY29uc3QgTVNHMzIgKm1zZyApCiB7CkBAIC0xNTQ0LDcgKzE1NDQsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERpc3BhdGNoTWVzc2FnZTMyQSAgIChVU0VSMzIuMTQwKQorICogICAgICAgICAgIERpc3BhdGNoTWVzc2FnZTMyQSAgIChVU0VSMzIuMTQxKQogICovCiBMT05HIFdJTkFQSSBEaXNwYXRjaE1lc3NhZ2UzMkEoIGNvbnN0IE1TRzMyKiBtc2cgKQogewpAQCAtMTU5MSw3ICsxNTkxLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBEaXNwYXRjaE1lc3NhZ2UzMlcgICAoVVNFUjMyLjE0MSkKKyAqICAgICAgICAgICBEaXNwYXRjaE1lc3NhZ2UzMlcgICAoVVNFUjMyLjE0MikKICAqLwogTE9ORyBXSU5BUEkgRGlzcGF0Y2hNZXNzYWdlMzJXKCBjb25zdCBNU0czMiogbXNnICkKIHsKQEAgLTE2NDgsNyArMTY0OCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMzJBICAgKFVTRVIzMi40MzYpCisgKiAgICAgICAgICAgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMzJBICAgKFVTRVIzMi40MzcpCiAgKi8KIFdPUkQgV0lOQVBJIFJlZ2lzdGVyV2luZG93TWVzc2FnZTMyQSggTFBDU1RSIHN0ciApCiB7CkBAIC0xNjU4LDcgKzE2NTgsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFJlZ2lzdGVyV2luZG93TWVzc2FnZTMyVyAgIChVU0VSMzIuNDM3KQorICogICAgICAgICAgIFJlZ2lzdGVyV2luZG93TWVzc2FnZTMyVyAgIChVU0VSMzIuNDM4KQogICovCiBXT1JEIFdJTkFQSSBSZWdpc3RlcldpbmRvd01lc3NhZ2UzMlcoIExQQ1dTVFIgc3RyICkKIHsKQEAgLTE2OTksNyArMTY5OSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgSW5TZW5kTWVzc2FnZTMyICAgIChVU0VSMzIuMzE5KQorICogICAgICAgICAgIEluU2VuZE1lc3NhZ2UzMiAgICAoVVNFUjMyLjMyMCkKICAqLwogQk9PTDMyIFdJTkFQSSBJblNlbmRNZXNzYWdlMzIodm9pZCkKIHsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbXNnYm94LmMgYi93aW5kb3dzL21zZ2JveC5jCmluZGV4IDAxZjQ1ZTIuLjVlYmY1ZTIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbXNnYm94LmMKKysrIGIvd2luZG93cy9tc2dib3guYwpAQCAtNjksMjAgKzY5LDIwIEBACiAgICAgc3dpdGNoKGxwbWItPmR3U3R5bGUgJiBNQl9JQ09OTUFTSykgewogICAgICBjYXNlIE1CX0lDT05FWENMQU1BVElPTjoKICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZTE2KGh3bmQsIHN0YzEsIFNUTV9TRVRJQ09OMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMTYpTG9hZEljb24xNigwLCBJRElfRVhDTEFNQVRJT04pLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChXUEFSQU0xNilMb2FkSWNvbjE2KDAsIElESV9FWENMQU1BVElPTjE2KSwgMCk7CiAgICAgICBicmVhazsKICAgICAgY2FzZSBNQl9JQ09OUVVFU1RJT046CiAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UxNihod25kLCBzdGMxLCBTVE1fU0VUSUNPTjE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTE2KUxvYWRJY29uMTYoMCwgSURJX1FVRVNUSU9OKSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMTYpTG9hZEljb24xNigwLCBJRElfUVVFU1RJT04xNiksIDApOwogICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTUJfSUNPTkFTVEVSSVNLOgogICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlMTYoaHduZCwgc3RjMSwgU1RNX1NFVElDT04xNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChXUEFSQU0xNilMb2FkSWNvbjE2KDAsIElESV9BU1RFUklTSyksIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTE2KUxvYWRJY29uMTYoMCwgSURJX0FTVEVSSVNLMTYpLCAwKTsKICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1CX0lDT05IQU5EOgogICAgICBkZWZhdWx0OgogICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlMTYoaHduZCwgc3RjMSwgU1RNX1NFVElDT04xNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChXUEFSQU0xNilMb2FkSWNvbjE2KDAsIElESV9IQU5EKSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMTYpTG9hZEljb24xNigwLCBJRElfSEFORDE2KSwgMCk7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgCkBAIC0xODksNyArMTg5LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBNZXNzYWdlQm94MzJBICAgKFVTRVIzMi4zOTApCisgKiAgICAgICAgICAgTWVzc2FnZUJveDMyQSAgIChVU0VSMzIuMzkxKQogICovCiBJTlQzMiBXSU5BUEkgTWVzc2FnZUJveDMyQShIV05EMzIgaFduZCwgTFBDU1RSIHRleHQsIExQQ1NUUiB0aXRsZSwgVUlOVDMyIHR5cGUpCiB7CkBAIC0yMDgsNyArMjA4LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBNZXNzYWdlQm94MzJXICAgKFVTRVIzMi4zOTUpCisgKiAgICAgICAgICAgTWVzc2FnZUJveDMyVyAgIChVU0VSMzIuMzk2KQogICovCiBJTlQzMiBXSU5BUEkgTWVzc2FnZUJveDMyVyggSFdORDMyIGh3bmQsIExQQ1dTVFIgdGV4dCwgTFBDV1NUUiB0aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgdHlwZSApCkBAIC0yMjMsNyArMjIzLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBNZXNzYWdlQm94RXgzMkEgICAoVVNFUjMyLjM5MSkKKyAqICAgICAgICAgICBNZXNzYWdlQm94RXgzMkEgICAoVVNFUjMyLjM5MikKICAqLwogSU5UMzIgV0lOQVBJIE1lc3NhZ2VCb3hFeDMyQSggSFdORDMyIGhXbmQsIExQQ1NUUiB0ZXh0LCBMUENTVFIgdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgdHlwZSwgV09SRCBsYW5naWQgKQpAQCAtMjMzLDcgKzIzMyw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE1lc3NhZ2VCb3hFeDMyVyAgIChVU0VSMzIuMzkyKQorICogICAgICAgICAgIE1lc3NhZ2VCb3hFeDMyVyAgIChVU0VSMzIuMzkzKQogICovCiBJTlQzMiBXSU5BUEkgTWVzc2FnZUJveEV4MzJXKCBIV05EMzIgaFduZCwgTFBDV1NUUiB0ZXh0LCBMUENXU1RSIHRpdGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIHR5cGUsIFdPUkQgbGFuZ2lkICkKQEAgLTI0Myw2ICsyNDMsMzAgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTWVzc2FnZUJveEluZGlyZWN0MTYgICAoVVNFUi44MjcpCisgKi8KK0lOVDE2IFdJTkFQSSBNZXNzYWdlQm94SW5kaXJlY3QxNiggTFBNU0dCT1hQQVJBTVMxNiBtc2dib3ggKQoreworICAgIE1TR0JPWFBBUkFNUzMyQSBtc2dib3gzMjsKKyAgICAKKyAgICBtc2dib3gzMi5jYlNpemUJCT0gbXNnYm94LT5jYlNpemU7CisgICAgbXNnYm94MzIuaHduZE93bmVyCQk9IG1zZ2JveC0+aHduZE93bmVyOworICAgIG1zZ2JveDMyLmhJbnN0YW5jZQkJPSBtc2dib3gtPmhJbnN0YW5jZTsKKyAgICBtc2dib3gzMi5scHN6VGV4dAkJPSBQVFJfU0VHX1RPX0xJTihtc2dib3gtPmxwc3pUZXh0KTsKKyAgICBtc2dib3gzMi5scHN6Q2FwdGlvbgk9IFBUUl9TRUdfVE9fTElOKG1zZ2JveC0+bHBzekNhcHRpb24pOworICAgIG1zZ2JveDMyLmR3U3R5bGUJCT0gbXNnYm94LT5kd1N0eWxlOworICAgIG1zZ2JveDMyLmxwc3pJY29uCQk9IFBUUl9TRUdfVE9fTElOKG1zZ2JveC0+bHBzekljb24pOworICAgIG1zZ2JveDMyLmR3Q29udGV4dEhlbHBJZAk9IG1zZ2JveC0+ZHdDb250ZXh0SGVscElkOworICAgIG1zZ2JveDMyLmxwZm5Nc2dCb3hDYWxsYmFjawk9IG1zZ2JveC0+bHBmbk1zZ0JveENhbGxiYWNrOworICAgIG1zZ2JveDMyLmR3TGFuZ3VhZ2VJZAk9IG1zZ2JveC0+ZHdMYW5ndWFnZUlkOworCisgICAgcmV0dXJuIERpYWxvZ0JveEluZGlyZWN0UGFyYW0zMkEoIG1zZ2JveDMyLmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTUkVTX0dldFJlc1B0ciggU1lTUkVTX0RJQUxPR19NU0dCT1ggKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnYm94MzIuaHduZE93bmVyLCBNU0dCT1hfRGxnUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSkmbXNnYm94MzIgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTWVzc2FnZUJveEluZGlyZWN0MzJBICAgKFVTRVIzMi4zOTQpCiAgKi8KIElOVDMyIFdJTkFQSSBNZXNzYWdlQm94SW5kaXJlY3QzMkEoIExQTVNHQk9YUEFSQU1TMzJBIG1zZ2JveCApCmRpZmYgLS1naXQgYS93aW5kb3dzL25vbmNsaWVudC5jIGIvd2luZG93cy9ub25jbGllbnQuYwppbmRleCA2ZDc1ZmMxLi5mZTdlN2M5IDEwMDY0NAotLS0gYS93aW5kb3dzL25vbmNsaWVudC5jCisrKyBiL3dpbmRvd3Mvbm9uY2xpZW50LmMKQEAgLTE1OCw3ICsxNTgsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERyYXdDYXB0aW9uVGVtcEEgICAgKFVTRVIzMi4pCisgKiAgICAgICAgICAgRHJhd0NhcHRpb25UZW1wQSAgICAoVVNFUjMyLjU5OSkKICAqLwogRFdPUkQKIERyYXdDYXB0aW9uVGVtcDMyQShIV05EMzIgaHduZCxIREMzMiBoZGMsTFBSRUNUMzIgcmVjdCxIRk9OVDMyIGhmb250LERXT1JEIHgxLExQQ1NUUiBzdHIsRFdPUkQgeDIpIHsKQEAgLTE3OSw3ICsxNzksNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEFkanVzdFdpbmRvd1JlY3QzMiAgICAoVVNFUjMyLikKKyAqICAgICAgICAgICBBZGp1c3RXaW5kb3dSZWN0MzIgICAgKFVTRVIzMi4yKQogICovCiBCT09MMzIgV0lOQVBJIEFkanVzdFdpbmRvd1JlY3QzMiggTFBSRUNUMzIgcmVjdCwgRFdPUkQgc3R5bGUsIEJPT0wzMiBtZW51ICkKIHsKQEAgLTIxNSw3ICsyMTUsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEFkanVzdFdpbmRvd1JlY3RFeDMyICAgIChVU0VSMzIuKQorICogICAgICAgICAgIEFkanVzdFdpbmRvd1JlY3RFeDMyICAgIChVU0VSMzIuMykKICAqLwogQk9PTDMyIFdJTkFQSSBBZGp1c3RXaW5kb3dSZWN0RXgzMiggTFBSRUNUMzIgcmVjdCwgRFdPUkQgc3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgbWVudSwgRFdPUkQgZXhTdHlsZSApCkBAIC04NTQsMTQgKzg1NCwxNCBAQAogCiAgICAgaWYgKCFoYml0bWFwQ2xvc2UpCiAgICAgewotCWlmICghKGhiaXRtYXBDbG9zZSA9IExvYWRCaXRtYXAxNiggMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9DTE9TRSkgKSkpCisJaWYgKCEoaGJpdG1hcENsb3NlID0gTG9hZEJpdG1hcDE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UxNihPQk1fQ0xPU0UpICkpKQogCSAgICByZXR1cm47Ci0JaGJpdG1hcE1pbmltaXplICA9IExvYWRCaXRtYXAxNiggMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9SRURVQ0UpICk7Ci0JaGJpdG1hcE1pbmltaXplRCA9IExvYWRCaXRtYXAxNiggMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9SRURVQ0VEKSApOwotCWhiaXRtYXBNYXhpbWl6ZSAgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fWk9PTSkgKTsKLQloYml0bWFwTWF4aW1pemVEID0gTG9hZEJpdG1hcDE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX1pPT01EKSApOwotCWhiaXRtYXBSZXN0b3JlICAgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fUkVTVE9SRSkgKTsKLQloYml0bWFwUmVzdG9yZUQgID0gTG9hZEJpdG1hcDE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX1JFU1RPUkVEKSApOworCWhiaXRtYXBNaW5pbWl6ZSAgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRTE2KE9CTV9SRURVQ0UpICk7CisJaGJpdG1hcE1pbmltaXplRCA9IExvYWRCaXRtYXAxNiggMCwgTUFLRUlOVFJFU09VUkNFMTYoT0JNX1JFRFVDRUQpICk7CisJaGJpdG1hcE1heGltaXplICA9IExvYWRCaXRtYXAxNiggMCwgTUFLRUlOVFJFU09VUkNFMTYoT0JNX1pPT00pICk7CisJaGJpdG1hcE1heGltaXplRCA9IExvYWRCaXRtYXAxNiggMCwgTUFLRUlOVFJFU09VUkNFMTYoT0JNX1pPT01EKSApOworCWhiaXRtYXBSZXN0b3JlICAgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRTE2KE9CTV9SRVNUT1JFKSApOworCWhiaXRtYXBSZXN0b3JlRCAgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRTE2KE9CTV9SRVNUT1JFRCkgKTsKICAgICB9CiAgICAgCiAgICAgaWYgKHduZFB0ci0+ZHdFeFN0eWxlICYgV1NfRVhfRExHTU9EQUxGUkFNRSkKQEAgLTk1MCwxNCArOTUwLDE0IEBACiAJCQkJCSAgICBDT0xPUl9JTkFDVElWRUNBUFRJT04pICk7CiAKICAgICBpZiAoIWhiaXRtYXBDbG9zZSkgewotCWlmICghKGhiaXRtYXBDbG9zZSA9IExvYWRCaXRtYXAxNiggMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9DTE9TRSkgKSkpCisJaWYgKCEoaGJpdG1hcENsb3NlID0gTG9hZEJpdG1hcDE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UxNihPQk1fQ0xPU0UpICkpKQogCSAgICByZXR1cm47Ci0JaGJpdG1hcE1pbmltaXplICA9IExvYWRCaXRtYXAxNiggMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9SRURVQ0UpICk7Ci0JaGJpdG1hcE1pbmltaXplRCA9IExvYWRCaXRtYXAxNiggMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9SRURVQ0VEKSApOwotCWhiaXRtYXBNYXhpbWl6ZSAgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fWk9PTSkgKTsKLQloYml0bWFwTWF4aW1pemVEID0gTG9hZEJpdG1hcDE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX1pPT01EKSApOwotCWhiaXRtYXBSZXN0b3JlICAgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fUkVTVE9SRSkgKTsKLQloYml0bWFwUmVzdG9yZUQgID0gTG9hZEJpdG1hcDE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX1JFU1RPUkVEKSApOworCWhiaXRtYXBNaW5pbWl6ZSAgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRTE2KE9CTV9SRURVQ0UpICk7CisJaGJpdG1hcE1pbmltaXplRCA9IExvYWRCaXRtYXAxNiggMCwgTUFLRUlOVFJFU09VUkNFMTYoT0JNX1JFRFVDRUQpICk7CisJaGJpdG1hcE1heGltaXplICA9IExvYWRCaXRtYXAxNiggMCwgTUFLRUlOVFJFU09VUkNFMTYoT0JNX1pPT00pICk7CisJaGJpdG1hcE1heGltaXplRCA9IExvYWRCaXRtYXAxNiggMCwgTUFLRUlOVFJFU09VUkNFMTYoT0JNX1pPT01EKSApOworCWhiaXRtYXBSZXN0b3JlICAgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRTE2KE9CTV9SRVNUT1JFKSApOworCWhiaXRtYXBSZXN0b3JlRCAgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRTE2KE9CTV9SRVNUT1JFRCkgKTsKICAgICB9CiAgICAgCiAgICAgaWYgKHduZFB0ci0+ZHdFeFN0eWxlICYgV1NfRVhfRExHTU9EQUxGUkFNRSkgewpAQCAtMTI5NywyMyArMTI5NywyMyBAQAogCiAgICAgY2FzZSBIVExFRlQ6CiAgICAgY2FzZSBIVFJJR0hUOgotCXJldHVybiAoTE9ORylTZXRDdXJzb3IxNiggTG9hZEN1cnNvcjE2KCAwLCBJRENfU0laRVdFICkgKTsKKwlyZXR1cm4gKExPTkcpU2V0Q3Vyc29yMTYoIExvYWRDdXJzb3IxNiggMCwgSURDX1NJWkVXRTE2ICkgKTsKIAogICAgIGNhc2UgSFRUT1A6CiAgICAgY2FzZSBIVEJPVFRPTToKLQlyZXR1cm4gKExPTkcpU2V0Q3Vyc29yMTYoIExvYWRDdXJzb3IxNiggMCwgSURDX1NJWkVOUyApICk7CisJcmV0dXJuIChMT05HKVNldEN1cnNvcjE2KCBMb2FkQ3Vyc29yMTYoIDAsIElEQ19TSVpFTlMxNiApICk7CiAKICAgICBjYXNlIEhUVE9QTEVGVDoKICAgICBjYXNlIEhUQk9UVE9NUklHSFQ6CQotCXJldHVybiAoTE9ORylTZXRDdXJzb3IxNiggTG9hZEN1cnNvcjE2KCAwLCBJRENfU0laRU5XU0UgKSApOworCXJldHVybiAoTE9ORylTZXRDdXJzb3IxNiggTG9hZEN1cnNvcjE2KCAwLCBJRENfU0laRU5XU0UxNiApICk7CiAKICAgICBjYXNlIEhUVE9QUklHSFQ6CiAgICAgY2FzZSBIVEJPVFRPTUxFRlQ6Ci0JcmV0dXJuIChMT05HKVNldEN1cnNvcjE2KCBMb2FkQ3Vyc29yMTYoIDAsIElEQ19TSVpFTkVTVyApICk7CisJcmV0dXJuIChMT05HKVNldEN1cnNvcjE2KCBMb2FkQ3Vyc29yMTYoIDAsIElEQ19TSVpFTkVTVzE2ICkgKTsKICAgICB9CiAKICAgICAvKiBEZWZhdWx0IGN1cnNvcjogYXJyb3cgKi8KLSAgICByZXR1cm4gKExPTkcpU2V0Q3Vyc29yMTYoIExvYWRDdXJzb3IxNiggMCwgSURDX0FSUk9XICkgKTsKKyAgICByZXR1cm4gKExPTkcpU2V0Q3Vyc29yMTYoIExvYWRDdXJzb3IxNiggMCwgSURDX0FSUk9XMTYgKSApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL3dpbmRvd3MvcGFpbnRpbmcuYyBiL3dpbmRvd3MvcGFpbnRpbmcuYwppbmRleCBhNzg5ODJmMy4uNWJmZWVkMiAxMDA2NDQKLS0tIGEvd2luZG93cy9wYWludGluZy5jCisrKyBiL3dpbmRvd3MvcGFpbnRpbmcuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQmVnaW5QYWludDMyICAgIChVU0VSMzIuOSkKKyAqICAgICAgICAgICBCZWdpblBhaW50MzIgICAgKFVTRVIzMi4xMCkKICAqLwogSERDMzIgV0lOQVBJIEJlZ2luUGFpbnQzMiggSFdORDMyIGh3bmQsIFBBSU5UU1RSVUNUMzIgKmxwcyApCiB7CkBAIC0xOTEsNyArMTkxLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBFbmRQYWludDMyICAgIChVU0VSMzIuMTc1KQorICogICAgICAgICAgIEVuZFBhaW50MzIgICAgKFVTRVIzMi4xNzYpCiAgKi8KIEJPT0wzMiBXSU5BUEkgRW5kUGFpbnQzMiggSFdORDMyIGh3bmQsIGNvbnN0IFBBSU5UU1RSVUNUMzIgKmxwcyApCiB7CkBAIC00OTYsNyArNDk2LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBSZWRyYXdXaW5kb3czMiAgICAoVVNFUjMyLjQyNSkKKyAqICAgICAgICAgICBSZWRyYXdXaW5kb3czMiAgICAoVVNFUjMyLjQyNikKICAqLwogQk9PTDMyIFdJTkFQSSBSZWRyYXdXaW5kb3czMiggSFdORDMyIGh3bmQsIGNvbnN0IFJFQ1QzMiAqcmVjdFVwZGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSR04zMiBocmduVXBkYXRlLCBVSU5UMzIgZmxhZ3MgKQpAQCAtNTMxLDcgKzUzMSw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFVwZGF0ZVdpbmRvdzMyICAgKFVTRVIzMi41NjYpCisgKiAgICAgICAgICAgVXBkYXRlV2luZG93MzIgICAoVVNFUjMyLjU2NykKICAqLwogdm9pZCBXSU5BUEkgVXBkYXRlV2luZG93MzIoIEhXTkQzMiBod25kICkKIHsKQEAgLTU0OSw3ICs1NDksNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEludmFsaWRhdGVSZ24zMiAgIChVU0VSMzIuMzI4KQorICogICAgICAgICAgIEludmFsaWRhdGVSZ24zMiAgIChVU0VSMzIuMzI5KQogICovCiB2b2lkIFdJTkFQSSBJbnZhbGlkYXRlUmduMzIoIEhXTkQzMiBod25kLCBIUkdOMzIgaHJnbiwgQk9PTDMyIGVyYXNlICkKIHsKQEAgLTU2Nyw3ICs1NjcsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEludmFsaWRhdGVSZWN0MzIgICAoVVNFUjMyLjMyNykKKyAqICAgICAgICAgICBJbnZhbGlkYXRlUmVjdDMyICAgKFVTRVIzMi4zMjgpCiAgKi8KIHZvaWQgV0lOQVBJIEludmFsaWRhdGVSZWN0MzIoIEhXTkQzMiBod25kLCBjb25zdCBSRUNUMzIgKnJlY3QsIEJPT0wzMiBlcmFzZSApCiB7CkBAIC01ODcsNyArNTg3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBWYWxpZGF0ZVJnbjMyICAgKFVTRVIzMi41NzEpCisgKiAgICAgICAgICAgVmFsaWRhdGVSZ24zMiAgIChVU0VSMzIuNTcyKQogICovCiB2b2lkIFdJTkFQSSBWYWxpZGF0ZVJnbjMyKCBIV05EMzIgaHduZCwgSFJHTjMyIGhyZ24gKQogewpAQCAtNjA1LDcgKzYwNSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgVmFsaWRhdGVSZWN0MzIgICAoVVNFUjMyLjU3MCkKKyAqICAgICAgICAgICBWYWxpZGF0ZVJlY3QzMiAgIChVU0VSMzIuNTcxKQogICovCiB2b2lkIFdJTkFQSSBWYWxpZGF0ZVJlY3QzMiggSFdORDMyIGh3bmQsIGNvbnN0IFJFQ1QzMiAqcmVjdCApCiB7CkBAIC02MjksNyArNjI5LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRVcGRhdGVSZWN0MzIgICAoVVNFUjMyLjI5NikKKyAqICAgICAgICAgICBHZXRVcGRhdGVSZWN0MzIgICAoVVNFUjMyLjI5NykKICAqLwogQk9PTDMyIFdJTkFQSSBHZXRVcGRhdGVSZWN0MzIoIEhXTkQzMiBod25kLCBMUFJFQ1QzMiByZWN0LCBCT09MMzIgZXJhc2UgKQogewpAQCAtNjYxLDcgKzY2MSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0VXBkYXRlUmduMzIgICAoVVNFUjMyLjI5NykKKyAqICAgICAgICAgICBHZXRVcGRhdGVSZ24zMiAgIChVU0VSMzIuMjk4KQogICovCiBJTlQzMiBXSU5BUEkgR2V0VXBkYXRlUmduMzIoIEhXTkQzMiBod25kLCBIUkdOMzIgaHJnbiwgQk9PTDMyIGVyYXNlICkKIHsKQEAgLTY5MCw3ICs2OTAsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEV4Y2x1ZGVVcGRhdGVSZ24zMiAgIChVU0VSMzIuMTk0KQorICogICAgICAgICAgIEV4Y2x1ZGVVcGRhdGVSZ24zMiAgIChVU0VSMzIuMTk1KQogICovCiBJTlQzMiBXSU5BUEkgRXhjbHVkZVVwZGF0ZVJnbjMyKCBIREMzMiBoZGMsIEhXTkQzMiBod25kICkKIHsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvcHJvcGVydHkuYyBiL3dpbmRvd3MvcHJvcGVydHkuYwppbmRleCA5YzNhYzE4Li40M2JjOTc4IDEwMDY0NAotLS0gYS93aW5kb3dzL3Byb3BlcnR5LmMKKysrIGIvd2luZG93cy9wcm9wZXJ0eS5jCkBAIC02Niw3ICs2Niw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0UHJvcDMyQSAgIChVU0VSMzIuMjgwKQorICogICAgICAgICAgIEdldFByb3AzMkEgICAoVVNFUjMyLjI4MSkKICAqLwogSEFORExFMzIgV0lOQVBJIEdldFByb3AzMkEoIEhXTkQzMiBod25kLCBMUENTVFIgc3RyICkKIHsKQEAgLTg0LDcgKzg0LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRQcm9wMzJXICAgKFVTRVIzMi4yODEpCisgKiAgICAgICAgICAgR2V0UHJvcDMyVyAgIChVU0VSMzIuMjgyKQogICovCiBIQU5ETEUzMiBXSU5BUEkgR2V0UHJvcDMyVyggSFdORDMyIGh3bmQsIExQQ1dTVFIgc3RyICkKIHsKQEAgLTEwOSw3ICsxMDksNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldFByb3AzMkEgICAoVVNFUjMyLjQ5NikKKyAqICAgICAgICAgICBTZXRQcm9wMzJBICAgKFVTRVIzMi40OTcpCiAgKi8KIEJPT0wzMiBXSU5BUEkgU2V0UHJvcDMyQSggSFdORDMyIGh3bmQsIExQQ1NUUiBzdHIsIEhBTkRMRTMyIGhhbmRsZSApCiB7CkBAIC0xNDEsNyArMTQxLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRQcm9wMzJXICAgKFVTRVIzMi40OTcpCisgKiAgICAgICAgICAgU2V0UHJvcDMyVyAgIChVU0VSMzIuNDk4KQogICovCiBCT09MMzIgV0lOQVBJIFNldFByb3AzMlcoIEhXTkQzMiBod25kLCBMUENXU1RSIHN0ciwgSEFORExFMzIgaGFuZGxlICkKIHsKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFJlbW92ZVByb3AzMkEgICAoVVNFUjMyLjQ0MSkKKyAqICAgICAgICAgICBSZW1vdmVQcm9wMzJBICAgKFVTRVIzMi40NDIpCiAgKi8KIEhBTkRMRTMyIFdJTkFQSSBSZW1vdmVQcm9wMzJBKCBIV05EMzIgaHduZCwgTFBDU1RSIHN0ciApCiB7CkBAIC0yMTgsNyArMjE4LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBSZW1vdmVQcm9wMzJXICAgKFVTRVIzMi40NDIpCisgKiAgICAgICAgICAgUmVtb3ZlUHJvcDMyVyAgIChVU0VSMzIuNDQzKQogICovCiBIQU5ETEUzMiBXSU5BUEkgUmVtb3ZlUHJvcDMyVyggSFdORDMyIGh3bmQsIExQQ1dTVFIgc3RyICkKIHsKQEAgLTI4MCw3ICsyODAsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEVudW1Qcm9wczMyQSAgIChVU0VSMzIuMTg1KQorICogICAgICAgICAgIEVudW1Qcm9wczMyQSAgIChVU0VSMzIuMTg2KQogICovCiBJTlQzMiBXSU5BUEkgRW51bVByb3BzMzJBKCBIV05EMzIgaHduZCwgUFJPUEVOVU1QUk9DMzJBIGZ1bmMgKQogewpAQCAtMjg5LDcgKzI4OSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRW51bVByb3BzMzJXICAgKFVTRVIzMi4xODgpCisgKiAgICAgICAgICAgRW51bVByb3BzMzJXICAgKFVTRVIzMi4xODkpCiAgKi8KIElOVDMyIFdJTkFQSSBFbnVtUHJvcHMzMlcoIEhXTkQzMiBod25kLCBQUk9QRU5VTVBST0MzMlcgZnVuYyApCiB7CkBAIC0yOTgsNyArMjk4LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBFbnVtUHJvcHNFeDMyQSAgIChVU0VSMzIuMTg2KQorICogICAgICAgICAgIEVudW1Qcm9wc0V4MzJBICAgKFVTRVIzMi4xODcpCiAgKi8KIElOVDMyIFdJTkFQSSBFbnVtUHJvcHNFeDMyQShIV05EMzIgaHduZCwgUFJPUEVOVU1QUk9DRVgzMkEgZnVuYywgTFBBUkFNIGxQYXJhbSkKIHsKQEAgLTMyNSw3ICszMjUsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEVudW1Qcm9wc0V4MzJXICAgKFVTRVIzMi4xODcpCisgKiAgICAgICAgICAgRW51bVByb3BzRXgzMlcgICAoVVNFUjMyLjE4OCkKICAqLwogSU5UMzIgV0lOQVBJIEVudW1Qcm9wc0V4MzJXKEhXTkQzMiBod25kLCBQUk9QRU5VTVBST0NFWDMyVyBmdW5jLCBMUEFSQU0gbFBhcmFtKQogewpkaWZmIC0tZ2l0IGEvd2luZG93cy9xdWV1ZS5jIGIvd2luZG93cy9xdWV1ZS5jCmluZGV4IDA5MzdmOTMuLjFiZjIyNzAgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcXVldWUuYworKysgYi93aW5kb3dzL3F1ZXVlLmMKQEAgLTY3NSw3ICs2NzUsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFBvc3RRdWl0TWVzc2FnZTMyICAgKFVTRVIzMi40MjApCisgKiAgICAgICAgICAgUG9zdFF1aXRNZXNzYWdlMzIgICAoVVNFUjMyLjQyMSkKICAqLwogdm9pZCBXSU5BUEkgUG9zdFF1aXRNZXNzYWdlMzIoIElOVDMyIGV4aXRDb2RlICkKIHsKQEAgLTY5OSw3ICs2OTksNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRXaW5kb3dUaHJlYWRQcm9jZXNzSWQgICAoVVNFUjMyLjMxMikKKyAqICAgICAgICAgICBHZXRXaW5kb3dUaHJlYWRQcm9jZXNzSWQgICAoVVNFUjMyLjMxMykKICAqLwogRFdPUkQgV0lOQVBJIEdldFdpbmRvd1RocmVhZFByb2Nlc3NJZCggSFdORDMyIGh3bmQsIExQRFdPUkQgcHJvY2VzcyApCiB7CkBAIC03MjcsNyArNzI3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRNZXNzYWdlUXVldWUzMiAgIChVU0VSMzIuNDkzKQorICogICAgICAgICAgIFNldE1lc3NhZ2VRdWV1ZTMyICAgKFVTRVIzMi40OTQpCiAgKi8KIEJPT0wzMiBXSU5BUEkgU2V0TWVzc2FnZVF1ZXVlMzIoIElOVDMyIHNpemUgKQogewpAQCAtODIyLDcgKzgyMiw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0SW5wdXRTdGF0ZTMyICAgKFVTRVIzMi4yNDMpCisgKiAgICAgICAgICAgR2V0SW5wdXRTdGF0ZTMyICAgKFVTRVIzMi4yNDQpCiAgKi8KIEJPT0wzMiBXSU5BUEkgR2V0SW5wdXRTdGF0ZTMyKHZvaWQpCiB7CkBAIC04MzUsNyArODM1LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRNZXNzYWdlUG9zICAgKFVTRVIuMTE5KSAoVVNFUjMyLjI3MSkKKyAqICAgICAgICAgICBHZXRNZXNzYWdlUG9zICAgKFVTRVIuMTE5KSAoVVNFUjMyLjI3MikKICAqLwogRFdPUkQgV0lOQVBJIEdldE1lc3NhZ2VQb3Modm9pZCkKIHsKQEAgLTg0Nyw3ICs4NDcsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldE1lc3NhZ2VUaW1lICAgKFVTRVIuMTIwKSAoVVNFUjMyLjI3MikKKyAqICAgICAgICAgICBHZXRNZXNzYWdlVGltZSAgIChVU0VSLjEyMCkgKFVTRVIzMi4yNzMpCiAgKi8KIExPTkcgV0lOQVBJIEdldE1lc3NhZ2VUaW1lKHZvaWQpCiB7CkBAIC04NTksNyArODU5LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRNZXNzYWdlRXh0cmFJbmZvICAgKFVTRVIuMjg4KSAoVVNFUjMyLjI3MCkKKyAqICAgICAgICAgICBHZXRNZXNzYWdlRXh0cmFJbmZvICAgKFVTRVIuMjg4KSAoVVNFUjMyLjI3MSkKICAqLwogTE9ORyBXSU5BUEkgR2V0TWVzc2FnZUV4dHJhSW5mbyh2b2lkKQogewpkaWZmIC0tZ2l0IGEvd2luZG93cy9yZWN0LmMgYi93aW5kb3dzL3JlY3QuYwppbmRleCA3NjA1NjY2Li5lNzgzZTg1IDEwMDY0NAotLS0gYS93aW5kb3dzL3JlY3QuYworKysgYi93aW5kb3dzL3JlY3QuYwpAQCAtMjIsNyArMjIsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldFJlY3QzMiAgICAoVVNFUjMyLjQ5OCkKKyAqICAgICAgICAgICBTZXRSZWN0MzIgICAgKFVTRVIzMi40OTkpCiAgKi8KIHZvaWQgV0lOQVBJIFNldFJlY3QzMiggTFBSRUNUMzIgcmVjdCwgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLAogICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiByaWdodCwgSU5UMzIgYm90dG9tICkKQEAgLTQ0LDcgKzQ0LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRSZWN0RW1wdHkzMiAgICAoVVNFUjMyLjQ5OSkKKyAqICAgICAgICAgICBTZXRSZWN0RW1wdHkzMiAgICAoVVNFUjMyLjUwMCkKICAqLwogdm9pZCBXSU5BUEkgU2V0UmVjdEVtcHR5MzIoIExQUkVDVDMyIHJlY3QgKQogewpAQCAtNjMsNyArNjMsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENvcHlSZWN0MzIgICAgKFVTRVIzMi42MSkKKyAqICAgICAgICAgICBDb3B5UmVjdDMyICAgIChVU0VSMzIuNjIpCiAgKi8KIEJPT0wzMiBXSU5BUEkgQ29weVJlY3QzMiggUkVDVDMyICpkZXN0LCBjb25zdCBSRUNUMzIgKnNyYyApCiB7CkBAIC04Miw3ICs4Miw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgSXNSZWN0RW1wdHkzMiAgICAoVVNFUjMyLjM0NikKKyAqICAgICAgICAgICBJc1JlY3RFbXB0eTMyICAgIChVU0VSMzIuMzQ3KQogICovCiBCT09MMzIgV0lOQVBJIElzUmVjdEVtcHR5MzIoIGNvbnN0IFJFQ1QzMiAqcmVjdCApCiB7CkBAIC0xMDEsNyArMTAxLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBQdEluUmVjdDMyICAgIChVU0VSMzIuNDIzKQorICogICAgICAgICAgIFB0SW5SZWN0MzIgICAgKFVTRVIzMi40MjQpCiAgKi8KIEJPT0wzMiBXSU5BUEkgUHRJblJlY3QzMiggY29uc3QgUkVDVDMyICpyZWN0LCBQT0lOVDMyIHB0ICkKIHsKQEAgLTEyMyw3ICsxMjMsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE9mZnNldFJlY3QzMiAgICAoVVNFUjMyLjQwNSkKKyAqICAgICAgICAgICBPZmZzZXRSZWN0MzIgICAgKFVTRVIzMi40MDYpCiAgKi8KIHZvaWQgV0lOQVBJIE9mZnNldFJlY3QzMiggTFBSRUNUMzIgcmVjdCwgSU5UMzIgeCwgSU5UMzIgeSApCiB7CkBAIC0xNDcsNyArMTQ3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBJbmZsYXRlUmVjdDMyICAgIChVU0VSMzIuMzIwKQorICogICAgICAgICAgIEluZmxhdGVSZWN0MzIgICAgKFVTRVIzMi4zMjEpCiAgKi8KIHZvaWQgV0lOQVBJIEluZmxhdGVSZWN0MzIoIExQUkVDVDMyIHJlY3QsIElOVDMyIHgsIElOVDMyIHkgKQogewpAQCAtMTgwLDcgKzE4MCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgSW50ZXJzZWN0UmVjdDMyICAgIChVU0VSMzIuMzI2KQorICogICAgICAgICAgIEludGVyc2VjdFJlY3QzMiAgICAoVVNFUjMyLjMyNykKICAqLwogQk9PTDMyIFdJTkFQSSBJbnRlcnNlY3RSZWN0MzIoIExQUkVDVDMyIGRlc3QsIGNvbnN0IFJFQ1QzMiAqc3JjMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSRUNUMzIgKnNyYzIgKQpAQCAtMjMxLDcgKzIzMSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgVW5pb25SZWN0MzIgICAgKFVTRVIzMi41NTgpCisgKiAgICAgICAgICAgVW5pb25SZWN0MzIgICAgKFVTRVIzMi41NTkpCiAgKi8KIEJPT0wzMiBXSU5BUEkgVW5pb25SZWN0MzIoIExQUkVDVDMyIGRlc3QsIGNvbnN0IFJFQ1QzMiAqc3JjMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJFQ1QzMiAqc3JjMiApCkBAIC0yNzEsNyArMjcxLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBFcXVhbFJlY3QzMiAgICAoVVNFUjMyLjE5MykKKyAqICAgICAgICAgICBFcXVhbFJlY3QzMiAgICAoVVNFUjMyLjE5NCkKICAqLwogQk9PTDMyIFdJTkFQSSBFcXVhbFJlY3QzMiggY29uc3QgUkVDVDMyKiByZWN0MSwgY29uc3QgUkVDVDMyKiByZWN0MiApCiB7CkBAIC0zMTcsNyArMzE3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTdWJ0cmFjdFJlY3QzMiAgICAoVVNFUjMyLjUzNSkKKyAqICAgICAgICAgICBTdWJ0cmFjdFJlY3QzMiAgICAoVVNFUjMyLjUzNikKICAqLwogQk9PTDMyIFdJTkFQSSBTdWJ0cmFjdFJlY3QzMiggTFBSRUNUMzIgZGVzdCwgY29uc3QgUkVDVDMyICpzcmMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkVDVDMyICpzcmMyICkKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvc2Nyb2xsLmMgYi93aW5kb3dzL3Njcm9sbC5jCmluZGV4IDcwMWU2OWIuLjg4NTk2OGMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvc2Nyb2xsLmMKKysrIGIvd2luZG93cy9zY3JvbGwuYwpAQCAtMzcsNyArMzcsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgU2Nyb2xsV2luZG93MzIgICAoVVNFUjMyLjQ0OSkKKyAqICAgICAgICAgICAgIFNjcm9sbFdpbmRvdzMyICAgKFVTRVIzMi40NTApCiAgKgogICogRklYTUU6IHZlcmlmeSBjbGlwcGluZyByZWdpb24gY2FsY3VsYXRpb25zCiAgKi8KQEAgLTE0MCw3ICsxNDAsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICBTY3JvbGxEQzMyICAgKFVTRVIzMi40NDgpCisgKiAgICAgICAgICAgICBTY3JvbGxEQzMyICAgKFVTRVIzMi40NDkpCiAgKiAKICAqIEJvdGggJ3JjJyBhbmQgJ3ByTENsaXAnIGFyZSBpbiBsb2dpY2FsIHVuaXRzIGJ1dCB1cGRhdGUgaW5mbyBpcyAKICAqIHJldHVybmVkIGluIGRldmljZSBjb29yZGluYXRlcy4KQEAgLTM0NCw3ICszNDQsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgU2Nyb2xsV2luZG93RXgzMiAgIChVU0VSMzIuNDUwKQorICogICAgICAgICAgICAgU2Nyb2xsV2luZG93RXgzMiAgIChVU0VSMzIuNDUxKQogICoKICAqIE5PVEU6IFVzZSB0aGlzIGZ1bmN0aW9uIGluc3RlYWQgb2YgU2Nyb2xsV2luZG93MzIKICAqLwpkaWZmIC0tZ2l0IGEvd2luZG93cy9zeXNjb2xvci5jIGIvd2luZG93cy9zeXNjb2xvci5jCmluZGV4IGRkNDkwYTkuLmJhZjNhZTUgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvc3lzY29sb3IuYworKysgYi93aW5kb3dzL3N5c2NvbG9yLmMKQEAgLTI3LDcgKzI3LDcgQEAKICAgICAiQWN0aXZlQm9yZGVyIiwgIjEyOCAxMjggMTI4IiwgICAvKiBDT0xPUl9BQ1RJVkVCT1JERVIgICAgICAgICovCiAgICAgIkluYWN0aXZlQm9yZGVyIiwgIjI1NSAyNTUgMjU1IiwgLyogQ09MT1JfSU5BQ1RJVkVCT1JERVIgICAgICAqLwogICAgICJBcHBXb3Jrc3BhY2UiLCAiMjU1IDI1NSAyMzIiLCAgIC8qIENPTE9SX0FQUFdPUktTUEFDRSAgICAgICAgKi8KLSAgICAiSGlsaWdodCIsICIxNjYgMjAyIDI0MCIsICAgICAgICAvKiBDT0xPUl9ISUdITElHSFQgICAgICAgICAgICovCisgICAgIkhpbGlnaHQiLCAiMjI0IDIyNCAyMjQiLCAgICAgICAgLyogQ09MT1JfSElHSExJR0hUICAgICAgICAgICAqLwogICAgICJIaWxpZ2h0VGV4dCIsICIwIDAgMCIsICAgICAgICAgIC8qIENPTE9SX0hJR0hMSUdIVFRFWFQgICAgICAgKi8KICAgICAiQnV0dG9uRmFjZSIsICIxOTIgMTkyIDE5MiIsICAgICAvKiBDT0xPUl9CVE5GQUNFICAgICAgICAgICAgICovCiAgICAgIkJ1dHRvblNoYWRvdyIsICIxMjggMTI4IDEyOCIsICAgLyogQ09MT1JfQlROU0hBRE9XICAgICAgICAgICAqLwpAQCAtNTYsNyArNTYsNyBAQAogICAgICJBY3RpdmVCb3JkZXIiLCAiMTI4IDEyOCAxMjgiLCAgIC8qIENPTE9SX0FDVElWRUJPUkRFUiAgICAgICAgKi8KICAgICAiSW5hY3RpdmVCb3JkZXIiLCAiMjU1IDI1NSAyNTUiLCAvKiBDT0xPUl9JTkFDVElWRUJPUkRFUiAgICAgICovCiAgICAgIkFwcFdvcmtzcGFjZSIsICIyNTUgMjU1IDIzMiIsICAgLyogQ09MT1JfQVBQV09SS1NQQUNFICAgICAgICAqLwotICAgICJIaWxpZ2h0IiwgIjE2NiAyMDIgMjQwIiwgICAgICAgIC8qIENPTE9SX0hJR0hMSUdIVCAgICAgICAgICAgKi8KKyAgICAiSGlsaWdodCIsICIyMjQgMjI0IDIyNCIsICAgICAgICAvKiBDT0xPUl9ISUdITElHSFQgICAgICAgICAgICovCiAgICAgIkhpbGlnaHRUZXh0IiwgIjAgMCAwIiwgICAgICAgICAgLyogQ09MT1JfSElHSExJR0hUVEVYVCAgICAgICAqLwogICAgICJCdXR0b25GYWNlIiwgIjE5MiAxOTIgMTkyIiwgICAgIC8qIENPTE9SX0JUTkZBQ0UgICAgICAgICAgICAgKi8KICAgICAiQnV0dG9uU2hhZG93IiwgIjEyOCAxMjggMTI4IiwgICAvKiBDT0xPUl9CVE5TSEFET1cgICAgICAgICAgICovCkBAIC0xMjMsNyArMTIzLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgR2V0U3lzQ29sb3IzMiAgIChVU0VSMzIuMjg4KQorICogICAgICAgICAgICAgR2V0U3lzQ29sb3IzMiAgIChVU0VSMzIuMjg5KQogICovCiBDT0xPUlJFRiBXSU5BUEkgR2V0U3lzQ29sb3IzMiggSU5UMzIgbkluZGV4ICkKIHsKQEAgLTE1OSw3ICsxNTksNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICBTZXRTeXNDb2xvcnMzMiAgIChVU0VSMzIuNTA0KQorICogICAgICAgICAgICAgU2V0U3lzQ29sb3JzMzIgICAoVVNFUjMyLjUwNSkKICAqLwogQk9PTDMyIFdJTkFQSSBTZXRTeXNDb2xvcnMzMiggSU5UMzIgbkNoYW5nZXMsIGNvbnN0IElOVDMyICpscFN5c0NvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09MT1JSRUYgKmxwQ29sb3JWYWx1ZXMgKQpAQCAtMTkzLDcgKzE5Myw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0U3lzQ29sb3JCcnVzaDMyICAgIChVU0VSMzIuMjg5KQorICogICAgICAgICAgIEdldFN5c0NvbG9yQnJ1c2gzMiAgICAoVVNFUjMyLjI5MCkKICAqLwogSEJSVVNIMzIgV0lOQVBJIEdldFN5c0NvbG9yQnJ1c2gzMiggSU5UMzIgaW5kZXggKQogewpkaWZmIC0tZ2l0IGEvd2luZG93cy9zeXNtZXRyaWNzLmMgYi93aW5kb3dzL3N5c21ldHJpY3MuYwppbmRleCA5YTljZmY2Li5iMWY0ZWE5IDEwMDY0NAotLS0gYS93aW5kb3dzL3N5c21ldHJpY3MuYworKysgYi93aW5kb3dzL3N5c21ldHJpY3MuYwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljczMyICAgIChVU0VSMzIuMjkxKQorICogICAgICAgICAgIEdldFN5c3RlbU1ldHJpY3MzMiAgICAoVVNFUjMyLjI5MikKICAqLwogSU5UMzIgV0lOQVBJIEdldFN5c3RlbU1ldHJpY3MzMiggSU5UMzIgaW5kZXggKQogewpkaWZmIC0tZ2l0IGEvd2luZG93cy90aW1lci5jIGIvd2luZG93cy90aW1lci5jCmluZGV4IGExNGFhNmEuLjQ4OGI0MzAgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvdGltZXIuYworKysgYi93aW5kb3dzL3RpbWVyLmMKQEAgLTMxMCw3ICszMTAsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldFRpbWVyMzIgICAoVVNFUjMyLjUxMCkKKyAqICAgICAgICAgICBTZXRUaW1lcjMyICAgKFVTRVIzMi41MTEpCiAgKi8KIFVJTlQzMiBXSU5BUEkgU2V0VGltZXIzMiggSFdORDMyIGh3bmQsIFVJTlQzMiBpZCwgVUlOVDMyIHRpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVSUFJPQzMyIHByb2MgKQpAQCAtMzM2LDcgKzMzNiw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0U3lzdGVtVGltZXIzMiAgIChVU0VSMzIuNTA4KQorICogICAgICAgICAgIFNldFN5c3RlbVRpbWVyMzIgICAoVVNFUjMyLjUwOSkKICAqLwogVUlOVDMyIFdJTkFQSSBTZXRTeXN0ZW1UaW1lcjMyKCBIV05EMzIgaHduZCwgVUlOVDMyIGlkLCBVSU5UMzIgdGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRVJQUk9DMzIgcHJvYyApCkBAIC0zNTksNyArMzU5LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBLaWxsVGltZXIzMiAgIChVU0VSMzIuMzUzKQorICogICAgICAgICAgIEtpbGxUaW1lcjMyICAgKFVTRVIzMi4zNTQpCiAgKi8KIEJPT0wzMiBXSU5BUEkgS2lsbFRpbWVyMzIoIEhXTkQzMiBod25kLCBVSU5UMzIgaWQgKQogewpAQCAtMzc5LDcgKzM3OSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgS2lsbFN5c3RlbVRpbWVyMzIgICAoVVNFUjMyLjM1MikKKyAqICAgICAgICAgICBLaWxsU3lzdGVtVGltZXIzMiAgIChVU0VSMzIuMzUzKQogICovCiBCT09MMzIgV0lOQVBJIEtpbGxTeXN0ZW1UaW1lcjMyKCBIV05EMzIgaHduZCwgVUlOVDMyIGlkICkKIHsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvdXNlci5jIGIvd2luZG93cy91c2VyLmMKaW5kZXggZWM4MDFkNi4uMjQ5Y2ZhNyAxMDA2NDQKLS0tIGEvd2luZG93cy91c2VyLmMKKysrIGIvd2luZG93cy91c2VyLmMKQEAgLTIwLDEwICsyMCw5IEBACiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ0b29saGVscC5oIgogI2luY2x1ZGUgIm1lc3NhZ2UuaCIKKyNpbmNsdWRlICJtaXNjZW11LmgiCiAjaW5jbHVkZSAic2hlbGwuaCIKIAotV09SRCBVU0VSX0hlYXBTZWwgPSAwOwotCiBleHRlcm4gQk9PTDMyIE1FTlVfUGF0Y2hSZXNpZGVudFBvcHVwKCBIUVVFVUUxNiwgV05EKiApOwogZXh0ZXJuIHZvaWQgUVVFVUVfRmx1c2hNZXNzYWdlcyhIUVVFVUUxNik7CiAKQEAgLTExNywxMCArMTE2LDEyIEBACiAgICAgLyogU2V0UmVzb3VyY2VIYW5kbGVyKCkgcmV0dXJucyBwcmV2aW91cyBmdW5jdGlvbiB3aGljaCBpcyBzZXQKICAgICAgKiB3aGVuIGEgbW9kdWxlJ3MgcmVzb3VyY2UgdGFibGUgaXMgbG9hZGVkLiAqLwogCi0gICAgcHJvYyA9IFNldFJlc291cmNlSGFuZGxlciggaEluc3RhbmNlLCBSVF9JQ09OLCAoRkFSUFJPQzMyKUxvYWRESUJJY29uSGFuZGxlciApOworICAgIHByb2MgPSBTZXRSZXNvdXJjZUhhbmRsZXIoIGhJbnN0YW5jZSwgUlRfSUNPTjE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGQVJQUk9DMzIpTG9hZERJQkljb25IYW5kbGVyICk7CiAgICAgaWYoIV9fcjE2bG9hZGVyICkgCiAJX19yMTZsb2FkZXIgPSAoUkVTT1VSQ0VIQU5ETEVSMTYpcHJvYzsKLSAgICBwcm9jID0gU2V0UmVzb3VyY2VIYW5kbGVyKCBoSW5zdGFuY2UsIFJUX0NVUlNPUiwgKEZBUlBST0MzMilMb2FkRElCQ3Vyc29ySGFuZGxlciApOworICAgIHByb2MgPSBTZXRSZXNvdXJjZUhhbmRsZXIoIGhJbnN0YW5jZSwgUlRfQ1VSU09SMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZBUlBST0MzMilMb2FkRElCQ3Vyc29ySGFuZGxlciApOwogICAgIGlmKCFfX3IxNmxvYWRlciApCiAJX19yMTZsb2FkZXIgPSAoUkVTT1VSQ0VIQU5ETEVSMTYpcHJvYzsKIH0KQEAgLTE0MSw2ICsxNDIsMTAgQEAKIAogICAgIFVTRVJfSW5zdGFsbFJzcmNIYW5kbGVyKCBoSW5zdGFuY2UgKTsKIAorICAgIC8qIEhhY2s6IHJlc3RvcmUgdGhlIGRpdmlkZS1ieS16ZXJvIGhhbmRsZXIgKi8KKyAgICAvKiBGSVhNRTogc2hvdWxkIHNldCBhIFVTRVItc3BlY2lmaWMgaGFuZGxlciB0aGF0IGRpc3BsYXlzIGEgbXNnIGJveCAqLworICAgIElOVF9TZXRIYW5kbGVyKCAwLCBJTlRfR2V0SGFuZGxlciggMHhmZiApICk7CisKICAgICAgIC8qIENyZWF0ZSB0YXNrIG1lc3NhZ2UgcXVldWUgKi8KICAgICBxdWV1ZVNpemUgPSBHZXRQcm9maWxlSW50MzJBKCAid2luZG93cyIsICJEZWZhdWx0UXVldWVTaXplIiwgOCApOwogICAgIGlmICghU2V0TWVzc2FnZVF1ZXVlMzIoIHF1ZXVlU2l6ZSApKSByZXR1cm4gMDsKQEAgLTI2NCw3ICsyNjksNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEV4aXRXaW5kb3dzRXggICAoVVNFUjMyLjE5NSkKKyAqICAgICAgICAgICBFeGl0V2luZG93c0V4ICAgKFVTRVIzMi4xOTYpCiAgKi8KIEJPT0wzMiBXSU5BUEkgRXhpdFdpbmRvd3NFeCggVUlOVDMyIGZsYWdzLCBEV09SRCByZXNlcnZlZCApCiB7CmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbi5jIGIvd2luZG93cy93aW4uYwppbmRleCBiMTUxODFkLi5jMjUxY2JhIDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbi5jCisrKyBiL3dpbmRvd3Mvd2luLmMKQEAgLTQzOCw2ICs0MzgsNyBAQAogICAgIHBXbmREZXNrdG9wLT5wSFNjcm9sbCAgICAgICAgICA9IE5VTEw7CiAgICAgcFduZERlc2t0b3AtPnBQcm9wICAgICAgICAgICAgID0gTlVMTDsKICAgICBwV25kRGVza3RvcC0+d0lEbWVudSAgICAgICAgICAgPSAwOworICAgIHBXbmREZXNrdG9wLT5oZWxwQ29udGV4dCAgICAgICA9IDA7CiAgICAgcFduZERlc2t0b3AtPmZsYWdzICAgICAgICAgICAgID0gMDsKICAgICBwV25kRGVza3RvcC0+d2luZG93ICAgICAgICAgICAgPSByb290V2luZG93OwogICAgIHBXbmREZXNrdG9wLT5oU3lzTWVudSAgICAgICAgICA9IDA7CkBAIC00NjcsOCArNDY4LDggQEAKICAgICBMUkVTVUxUIChXSU5BUEkgKmxvY2FsU2VuZDMyKShIV05EMzIsIFVJTlQzMiwgV1BBUkFNMzIsIExQQVJBTSk7CiAKICAgICBUUkFDRSh3aW4sICIlcyAlcyAlMDhseCAlMDhseCAlZCwlZCAlZHglZCAiCi0JCSAiJTA0eCAlMDR4ICUwOHggJXBcbiIsIGRlYnVncmVzKGNzLT5scHN6TmFtZSksIAotCQkgZGVidWdyZXMoY3MtPmxwc3pDbGFzcyksIGNzLT5kd0V4U3R5bGUsIAorCQkgIiUwNHggJTA0eCAlMDh4ICVwXG4iLCBkZWJ1Z3Jlc19hKGNzLT5scHN6TmFtZSksIAorCQkgZGVidWdyZXNfYShjcy0+bHBzekNsYXNzKSwgY3MtPmR3RXhTdHlsZSwgCiAJCSBjcy0+c3R5bGUsIGNzLT54LCBjcy0+eSwgY3MtPmN4LCBjcy0+Y3ksCiAJCSBjcy0+aHduZFBhcmVudCwgY3MtPmhNZW51LCBjcy0+aEluc3RhbmNlLCBjcy0+bHBDcmVhdGVQYXJhbXMpOwogCkBAIC01NTEsNiArNTUyLDcgQEAKICAgICB3bmRQdHItPmR3U3R5bGUgICAgICAgID0gY3MtPnN0eWxlICYgfldTX1ZJU0lCTEU7CiAgICAgd25kUHRyLT5kd0V4U3R5bGUgICAgICA9IGNzLT5kd0V4U3R5bGU7CiAgICAgd25kUHRyLT53SURtZW51ICAgICAgICA9IDA7CisgICAgd25kUHRyLT5oZWxwQ29udGV4dCAgICA9IDA7CiAgICAgd25kUHRyLT5mbGFncyAgICAgICAgICA9IHdpbjMyID8gV0lOX0lTV0lOMzIgOiAwOwogICAgIHduZFB0ci0+cFZTY3JvbGwgICAgICAgPSBOVUxMOwogICAgIHduZFB0ci0+cEhTY3JvbGwgICAgICAgPSBOVUxMOwpAQCAtMjMwMCw2ICsyMzAyLDI5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRXaW5kb3dDb250ZXh0SGVscElkICAgKFVTRVIzMi4zMDMpCisgKi8KK0RXT1JEIFdJTkFQSSBHZXRXaW5kb3dDb250ZXh0SGVscElkKCBIV05EMzIgaHduZCApCit7CisgICAgV05EICp3bmQgPSBXSU5fRmluZFduZFB0ciggaHduZCApOworICAgIGlmICghd25kKSByZXR1cm4gMDsKKyAgICByZXR1cm4gd25kLT5oZWxwQ29udGV4dDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldFdpbmRvd0NvbnRleHRIZWxwSWQgICAoVVNFUjMyLjUxNSkKKyAqLworQk9PTDMyIFdJTkFQSSBTZXRXaW5kb3dDb250ZXh0SGVscElkKCBIV05EMzIgaHduZCwgRFdPUkQgaWQgKQoreworICAgIFdORCAqd25kID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKyAgICBpZiAoIXduZCkgcmV0dXJuIEZBTFNFOworICAgIHduZC0+aGVscENvbnRleHQgPSBpZDsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQlEUkFHX1F1ZXJ5VXBkYXRlCiAgKgogICogcmVjdXJzaXZlbHkgZmluZCBhIGNoaWxkIHRoYXQgY29udGFpbnMgc3BEcmFnSW5mby0+cHQgcG9pbnQgCkBAIC0yNDQwLDcgKzI0NjUsNyBAQAogCiAgICAgaWYoICFscERyYWdJbmZvIHx8ICFzcERyYWdJbmZvICkgcmV0dXJuIDBMOwogCi0gICAgaEJ1bW1lciA9IExvYWRDdXJzb3IxNigwLCBJRENfQlVNTUVSKTsKKyAgICBoQnVtbWVyID0gTG9hZEN1cnNvcjE2KDAsIElEQ19CVU1NRVIxNik7CiAKICAgICBpZiggIWhCdW1tZXIgfHwgIXduZFB0ciApCiAgICAgewpkaWZmIC0tZ2l0IGEvd2luZG93cy93aW5oZWxwLmMgYi93aW5kb3dzL3dpbmhlbHAuYwppbmRleCBkODUyMWQ0Li4yZWYzMDViIDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbmhlbHAuYworKysgYi93aW5kb3dzL3dpbmhlbHAuYwpAQCAtMjMsNyArMjMsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICBXaW5IZWxwMzJBICAgKFVTRVIzMi41NzgpCisgKiAgICAgICAgICAgICBXaW5IZWxwMzJBICAgKFVTRVIzMi41NzkpCiAgKi8KIEJPT0wzMiBXSU5BUEkgV2luSGVscDMyQSggSFdORDMyIGhXbmQsIExQQ1NUUiBscEhlbHBGaWxlLCBVSU5UMzIgd0NvbW1hbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RGF0YSApCkBAIC0xMDksNyArMTA5LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgV2luSGVscDMyVyAgIChVU0VSMzIuNTc5KQorICogICAgICAgICAgICAgV2luSGVscDMyVyAgIChVU0VSMzIuNTgwKQogICovCiBCT09MMzIgV0lOQVBJIFdpbkhlbHAzMlcoIEhXTkQzMiBoV25kLCBMUENXU1RSIGhlbHBGaWxlLCBVSU5UMzIgY29tbWFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdEYXRhICkKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2lucG9zLmMgYi93aW5kb3dzL3dpbnBvcy5jCmluZGV4IGFlYmRjYTguLmU5OTJhY2MgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2lucG9zLmMKKysrIGIvd2luZG93cy93aW5wb3MuYwpAQCAtMTUzLDcgKzE1Myw3IEBACiAgICAgcmV0dXJuIEFycmFuZ2VJY29uaWNXaW5kb3dzMzIocGFyZW50KTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEFycmFuZ2VJY29uaWNXaW5kb3dzMzIgICAoVVNFUjMyLjYpCisgKiAgICAgICAgICAgQXJyYW5nZUljb25pY1dpbmRvd3MzMiAgIChVU0VSMzIuNykKICAqLwogVUlOVDMyIFdJTkFQSSBBcnJhbmdlSWNvbmljV2luZG93czMyKCBIV05EMzIgcGFyZW50ICkKIHsKQEAgLTIwMSw3ICsyMDEsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgU3dpdGNoVG9UaGlzV2luZG93MzIgICAoVVNFUjMyLjUzOCkKKyAqICAgICAgICAgICAgIFN3aXRjaFRvVGhpc1dpbmRvdzMyICAgKFVTRVIzMi41MzkpCiAgKi8KIHZvaWQgV0lOQVBJIFN3aXRjaFRvVGhpc1dpbmRvdzMyKCBIV05EMzIgaHduZCwgQk9PTDMyIHJlc3RvcmUgKQogewpAQCAtMjU0LDcgKzI1NCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0Q2xpZW50UmVjdDMyICAgKFVTRVIzMi4yMTkpCisgKiAgICAgICAgICAgR2V0Q2xpZW50UmVjdDMyICAgKFVTRVIzMi4yMjApCiAgKi8KIHZvaWQgV0lOQVBJIEdldENsaWVudFJlY3QzMiggSFdORDMyIGh3bmQsIExQUkVDVDMyIHJlY3QgKSAKIHsKQEAgLTI3OSw3ICsyNzksNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIENsaWVudFRvU2NyZWVuMzIgICAoVVNFUjMyLjUxKQorICogICAgICAgICBDbGllbnRUb1NjcmVlbjMyICAgKFVTRVIzMi41MikKICAqLwogQk9PTDMyIFdJTkFQSSBDbGllbnRUb1NjcmVlbjMyKCBIV05EMzIgaHduZCwgTFBQT0lOVDMyIGxwcG50ICkKIHsKQEAgLTI5OCw3ICsyOTgsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIFNjcmVlblRvQ2xpZW50MzIgICAoVVNFUjMyLjQ0NikKKyAqICAgICAgICAgU2NyZWVuVG9DbGllbnQzMiAgIChVU0VSMzIuNDQ3KQogICovCiB2b2lkIFdJTkFQSSBTY3JlZW5Ub0NsaWVudDMyKCBIV05EMzIgaHduZCwgTFBQT0lOVDMyIGxwcG50ICkKIHsKQEAgLTM5NCw3ICszOTQsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIFdpbmRvd0Zyb21Qb2ludDMyICAgKFVTRVIzMi41ODEpCisgKiAgICAgICAgIFdpbmRvd0Zyb21Qb2ludDMyICAgKFVTRVIzMi41ODIpCiAgKi8KIEhXTkQzMiBXSU5BUEkgV2luZG93RnJvbVBvaW50MzIoIFBPSU5UMzIgcHQgKQogewpAQCAtNDE4LDcgKzQxOCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgQ2hpbGRXaW5kb3dGcm9tUG9pbnQzMiAgIChVU0VSMzIuNDgpCisgKiAgICAgICAgIENoaWxkV2luZG93RnJvbVBvaW50MzIgICAoVVNFUjMyLjQ5KQogICovCiBIV05EMzIgV0lOQVBJIENoaWxkV2luZG93RnJvbVBvaW50MzIoIEhXTkQzMiBod25kUGFyZW50LCBQT0lOVDMyIHB0ICkKIHsKQEAgLTUxMyw3ICs1MTMsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIE1hcFdpbmRvd1BvaW50czMyICAgKFVTRVIzMi4zODUpCisgKiAgICAgICAgIE1hcFdpbmRvd1BvaW50czMyICAgKFVTRVIzMi4zODYpCiAgKi8KIHZvaWQgV0lOQVBJIE1hcFdpbmRvd1BvaW50czMyKCBIV05EMzIgaHduZEZyb20sIEhXTkQzMiBod25kVG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBQT0lOVDMyIGxwcHQsIFVJTlQzMiBjb3VudCApCkBAIC01NDAsNyArNTQwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBJc0ljb25pYzMyICAgKFVTRVIzMi4zNDQpCisgKiAgICAgICAgICAgSXNJY29uaWMzMiAgIChVU0VSMzIuMzQ1KQogICovCiBCT09MMzIgV0lOQVBJIElzSWNvbmljMzIoSFdORDMyIGhXbmQpCiB7CkBAIC01NjAsNyArNTYwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBJc1pvb21lZCAgIChVU0VSMzIuMzUxKQorICogICAgICAgICAgIElzWm9vbWVkICAgKFVTRVIzMi4zNTIpCiAgKi8KIEJPT0wzMiBXSU5BUEkgSXNab29tZWQzMihIV05EMzIgaFduZCkKIHsKQEAgLTU3OSw3ICs1NzksNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBHZXRBY3RpdmVXaW5kb3cgICAgKFVTRVIzMi4yMDQpCisgKiAgICAgICAgIEdldEFjdGl2ZVdpbmRvdyAgICAoVVNFUjMyLjIwNSkKICAqLwogSFdORDMyIFdJTkFQSSBHZXRBY3RpdmVXaW5kb3czMih2b2lkKQogewpAQCAtNjA4LDcgKzYwOCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgU2V0QWN0aXZlV2luZG93MzIgICAgKFVTRVIzMi40NjIpCisgKiAgICAgICAgIFNldEFjdGl2ZVdpbmRvdzMyICAgIChVU0VSMzIuNDYzKQogICovCiBIV05EMzIgV0lOQVBJIFNldEFjdGl2ZVdpbmRvdzMyKCBIV05EMzIgaHduZCApCiB7CkBAIC02NjgsNyArNjY4LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgU2V0U2hlbGxXaW5kb3czMiAgICAoVVNFUjMyLjI4NykKKyAqICAgICAgICAgU2V0U2hlbGxXaW5kb3czMiAgICAoVVNFUjMyLjUwNCkKICAqLwogSFdORDMyIFdJTkFQSSBTZXRTaGVsbFdpbmRvdzMyKEhXTkQzMiBod25kc2hlbGwpCiB7CkBAIC02OTcsNyArNjk3LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBCcmluZ1dpbmRvd1RvVG9wMzIgICAoVVNFUjMyLjEwKQorICogICAgICAgICAgIEJyaW5nV2luZG93VG9Ub3AzMiAgIChVU0VSMzIuMTEpCiAgKi8KIEJPT0wzMiBXSU5BUEkgQnJpbmdXaW5kb3dUb1RvcDMyKCBIV05EMzIgaHduZCApCiB7CkBAIC03MTYsNyArNzE2LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBNb3ZlV2luZG93MzIgICAoVVNFUjMyLjM5OCkKKyAqICAgICAgICAgICBNb3ZlV2luZG93MzIgICAoVVNFUjMyLjM5OSkKICAqLwogQk9PTDMyIFdJTkFQSSBNb3ZlV2luZG93MzIoIEhXTkQzMiBod25kLCBJTlQzMiB4LCBJTlQzMiB5LCBJTlQzMiBjeCwgSU5UMzIgY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIHJlcGFpbnQgKQpAQCAtMTExMSw3ICsxMTExLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRJbnRlcm5hbFdpbmRvd1BvczMyICAgKFVTRVIzMi4yNDQpCisgKiAgICAgICAgICAgR2V0SW50ZXJuYWxXaW5kb3dQb3MzMiAgIChVU0VSMzIuMjQ1KQogICovCiBVSU5UMzIgV0lOQVBJIEdldEludGVybmFsV2luZG93UG9zMzIoIEhXTkQzMiBod25kLCBMUFJFQ1QzMiByZWN0V25kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFBPSU5UMzIgcHRJY29uICkKQEAgLTExNTYsNyArMTE1Niw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0V2luZG93UGxhY2VtZW50MzIgICAoVVNFUjMyLjMwNikKKyAqICAgICAgICAgICBHZXRXaW5kb3dQbGFjZW1lbnQzMiAgIChVU0VSMzIuMzA3KQogICovCiBCT09MMzIgV0lOQVBJIEdldFdpbmRvd1BsYWNlbWVudDMyKCBIV05EMzIgaHduZCwgV0lORE9XUExBQ0VNRU5UMzIgKnB3cGwzMiApCiB7CkBAIC0xMjM4LDcgKzEyMzgsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBTZXRXaW5kb3dQbGFjZW1lbnQzMiAgIChVU0VSMzIuNTE4KQorICogICAgICAgICAgIFNldFdpbmRvd1BsYWNlbWVudDMyICAgKFVTRVIzMi41MTkpCiAgKi8KIEJPT0wzMiBXSU5BUEkgU2V0V2luZG93UGxhY2VtZW50MzIoIEhXTkQzMiBod25kLCBjb25zdCBXSU5ET1dQTEFDRU1FTlQzMiAqcHdwbDMyICkKIHsKQEAgLTEyODksNyArMTI4OSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0SW50ZXJuYWxXaW5kb3dQb3MzMiAgIChVU0VSMzIuNDgyKQorICogICAgICAgICAgIFNldEludGVybmFsV2luZG93UG9zMzIgICAoVVNFUjMyLjQ4MykKICAqLwogdm9pZCBXSU5BUEkgU2V0SW50ZXJuYWxXaW5kb3dQb3MzMiggSFdORDMyIGh3bmQsIFVJTlQzMiBzaG93Q21kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBSRUNUMzIgcmVjdCwgTFBQT0lOVDMyIHB0ICkKQEAgLTIwNDIsNyArMjA0Miw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldFdpbmRvd1BvcyAgIChVU0VSMzIuNTE5KQorICogICAgICAgICAgIFNldFdpbmRvd1BvcyAgIChVU0VSMzIuNTIwKQogICovCiBCT09MMzIgV0lOQVBJIFNldFdpbmRvd1BvczMyKCBIV05EMzIgaHduZCwgSFdORDMyIGh3bmRJbnNlcnRBZnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIHgsIElOVDMyIHksIElOVDMyIGN4LCBJTlQzMiBjeSwgV09SRCBmbGFncykKQEAgLTIwNTQsNiArMjA1NCw3IEBACiAgICAgSFdORDMyCXRlbXBJbnNlcnRBZnRlcj0gMDsKICAgICBpbnQgCXJlc3VsdCA9IDA7CiAgICAgVUlOVDMyIAl1RmxhZ3MgPSAwOworICAgIEJPT0wzMiAgICAgIHJlc3luYyA9IEZBTFNFOwogCiAgICAgVFJBQ0Uod2luLCJod25kICUwNHgsICglaSwlaSktKCVpLCVpKSBmbGFncyAlMDh4XG4iLCAKIAkJCQkJCSBod25kLCB4LCB5LCB4K2N4LCB5K2N5LCBmbGFncyk7ICAKQEAgLTIzMjQsNiArMjMyNSw3IEBACiAgICAgICAgICAgICAgIHdpbnBvcy5od25kSW5zZXJ0QWZ0ZXIgPSB0ZW1wSW5zZXJ0QWZ0ZXI7CiAJICAgIH0KICAgICAgICAgICAgIFRTWE1hcFdpbmRvdyggZGlzcGxheSwgd25kUHRyLT53aW5kb3cgKTsKKyAgICAgICAgICAgIGlmICh3bmRQdHItPmZsYWdzICYgV0lOX01BTkFHRUQpIHJlc3luYyA9IFRSVUU7CiAKIAkgICAgLyogSWYgZm9jdXMgd2FzIHNldCB0byBhbiB1bm1hcHBlZCB3aW5kb3csIHJlc2V0IFggZm9jdXMgbm93ICovCiAJICAgIGZvY3VzID0gY3VyciA9IEdldEZvY3VzMzIoKTsKQEAgLTIzOTgsOSArMjQwMCwxMyBAQAogCiAgICAgVFJBQ0Uod2luLCJcdHN0YXR1cyBmbGFncyA9ICUwNHhcbiIsIHdpbnBvcy5mbGFncyAmIFNXUF9BR0dfU1RBVFVTRkxBR1MpOwogCi0gICAgaWYgKCAoKHdpbnBvcy5mbGFncyAmIFNXUF9BR0dfU1RBVFVTRkxBR1MpICE9IFNXUF9BR0dfTk9QT1NDSEFOR0UpICYmIAotCSAhKHdpbnBvcy5mbGFncyAmIFNXUF9OT1NFTkRDSEFOR0lORykpCisgICAgaWYgKCByZXN5bmMgfHwKKyAgICAgICAgKCgod2lucG9zLmZsYWdzICYgU1dQX0FHR19TVEFUVVNGTEFHUykgIT0gU1dQX0FHR19OT1BPU0NIQU5HRSkgJiYgCisgICAgICAgICAhKHdpbnBvcy5mbGFncyAmIFNXUF9OT1NFTkRDSEFOR0lORykpICkKKyAgICB7CiAgICAgICAgIFNlbmRNZXNzYWdlMzJBKCB3aW5wb3MuaHduZCwgV01fV0lORE9XUE9TQ0hBTkdFRCwgMCwgKExQQVJBTSkmd2lucG9zICk7CisgICAgICAgIGlmIChyZXN5bmMpIEVWRU5UX1N5bmNocm9uaXplICgpOworICAgIH0KIAogICAgIHJldHVybiBUUlVFOwogfQpAQCAtMjQxNiw3ICsyNDIyLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBCZWdpbkRlZmVyV2luZG93UG9zMzIgICAoVVNFUjMyLjgpCisgKiAgICAgICAgICAgQmVnaW5EZWZlcldpbmRvd1BvczMyICAgKFVTRVIzMi45KQogICovCiBIRFdQMzIgV0lOQVBJIEJlZ2luRGVmZXJXaW5kb3dQb3MzMiggSU5UMzIgY291bnQgKQogewpAQCAtMjQ0OSw3ICsyNDU1LDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBEZWZlcldpbmRvd1BvczMyICAgKFVTRVIzMi4xMjcpCisgKiAgICAgICAgICAgRGVmZXJXaW5kb3dQb3MzMiAgIChVU0VSMzIuMTI4KQogICovCiBIRFdQMzIgV0lOQVBJIERlZmVyV2luZG93UG9zMzIoIEhEV1AzMiBoZHdwLCBIV05EMzIgaHduZCwgSFdORDMyIGh3bmRBZnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgeCwgSU5UMzIgeSwgSU5UMzIgY3gsIElOVDMyIGN5LApAQCAtMjUzNyw3ICsyNTQzLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBFbmREZWZlcldpbmRvd1BvczMyICAgKFVTRVIzMi4xNzIpCisgKiAgICAgICAgICAgRW5kRGVmZXJXaW5kb3dQb3MzMiAgIChVU0VSMzIuMTczKQogICovCiBCT09MMzIgV0lOQVBJIEVuZERlZmVyV2luZG93UG9zMzIoIEhEV1AzMiBoZHdwICkKIHsKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2lucHJvYy5jIGIvd2luZG93cy93aW5wcm9jLmMKaW5kZXggM2I2MjdkZS4uNjZkZjc3NSAxMDA2NDQKLS0tIGEvd2luZG93cy93aW5wcm9jLmMKKysrIGIvd2luZG93cy93aW5wcm9jLmMKQEAgLTE4NTUsNyArMTg1NSw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICAgQ2FsbFdpbmRvd1Byb2MzMkEgICAgKFVTRVIzMi4xNykKKyAqCSAgICAgQ2FsbFdpbmRvd1Byb2MzMkEgICAgKFVTRVIzMi4xOCkKICAqLwogTFJFU1VMVCBXSU5BUEkgQ2FsbFdpbmRvd1Byb2MzMkEoIFdORFBST0MzMiBmdW5jLCBIV05EMzIgaHduZCwgVUlOVDMyIG1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQpAQCAtMTg5MSw3ICsxODkxLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgICBDYWxsV2luZG93UHJvYzMyVyAgICAoVVNFUjMyLjE4KQorICoJICAgICBDYWxsV2luZG93UHJvYzMyVyAgICAoVVNFUjMyLjE5KQogICovCiBMUkVTVUxUIFdJTkFQSSBDYWxsV2luZG93UHJvYzMyVyggV05EUFJPQzMyIGZ1bmMsIEhXTkQzMiBod25kLCBVSU5UMzIgbXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCg==