ZGlmZiAtLWdpdCBhL1BBQ0tBR0VfU09VUkNFUyBiL1BBQ0tBR0VfU09VUkNFUwppbmRleCAzMGIxMDE1Li43N2VjMzYyIDEwMDY0NAotLS0gYS9QQUNLQUdFX1NPVVJDRVMKKysrIGIvUEFDS0FHRV9TT1VSQ0VTCkBAIC01MCw2ICs1MCw4IEBACiBsaWJ4ZG1jcDZfMS4wLjMtMV9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDljNmRhYWEyYTRhN2VlZTRmOWU5YTA0MmY2N2NkYmM4NDIyOTYyN2UKIGxpYnhleHQ2XzEuMS4xLTJfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjdlNTg2NjgwNDBiZGU3NDk5ZjNiYjczZTZiNzAzYWU3NTE0NjExYgogbGlieGV4dDZfMS4xLjEtMl9pMzg2LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxYjJhOGQzZjFjYmJkMTg1NmNkNzYzNDUyMjEwNTkwOTVhMDdkYjY5CitsaWJ4ZXh0LWRldl8xLjEuMS0yX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4YjI4ODAzNmNmNWM3N2NlNmUzMzk2ZWY1MWUzMmQ4N2YwN2UyY2UKK2xpYnhleHQtZGV2XzEuMS4xLTJfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDliNDRjMDZjMGM2OTM0NTc4MDU0MDdkNDFjZGRhMjU2NzVlYjQ3ZAogbGlieGZpeGVzM180LjAuNC0xX2FtZDY0LmRlYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMDIyM2VlYjBjMTZiZTI2ZGJjMTU1MTllZWZiZjQzNjY2NjM0OTI3CiBsaWJ4Zml4ZXMzXzQuMC40LTFfaTM4Ni5kZWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUzZTkxMjk0NTI5OTlhZGU5ZjcyZjZkMGNiN2IxZGNhOGRjNDlhZjEKIGxpYnh4Zjg2dm0xXzEuMS4wLTJfYW1kNjQuZGViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTEzNWE5MGE5YTY2ZGU2YzUwZTQ4NWYzNDE1MjMxNDA0MTVjZWY2ZQpkaWZmIC0tZ2l0IGEvYnVpbGQtbHVjaWQtbXVsdGlsaWItdG9vbGNoYWluLnNoIGIvYnVpbGQtbHVjaWQtbXVsdGlsaWItdG9vbGNoYWluLnNoCmluZGV4IDFjMTMzYjguLjRkNTA5YmYgMTAwNzU1Ci0tLSBhL2J1aWxkLWx1Y2lkLW11bHRpbGliLXRvb2xjaGFpbi5zaAorKysgYi9idWlsZC1sdWNpZC1tdWx0aWxpYi10b29sY2hhaW4uc2gKQEAgLTE4NSw5ICsxODUsMTAgQEAKIGFkZF91YnVudHVfcGFja2FnZSBcCiAgICAgbGlieDExLTYgXAogICAgIGxpYngxMS1kZXYgXAotICAgIGxpYnhjYjEtZGV2IFwKICAgICBsaWJ4YXU2IFwKKyAgICBsaWJ4Y2IxLWRldiBcCiAgICAgbGlieGRtY3A2IFwKKyAgICBsaWJ4ZXh0LWRldiBcCiAgICAgeDExcHJvdG8tY29yZS1kZXYgXAogICAgIHgxMXByb3RvLXhleHQtZGV2IFwKICAgICB4MTFwcm90by1pbnB1dC1kZXYgXApAQCAtNDkyLDYgKzQ5Myw5IEBACiAgIHByaW50ZiAiJXMiICR7UkVTVUxUJTp9CiB9CiAKK1BBVEg9JChzYW5pdGl6ZV9wYXRoX2xpc3QgJFBBVEgpCitMRF9MSUJSQVJZX1BBVEg9JChzYW5pdGl6ZV9wYXRoX2xpc3QgJExEX0xJQlJBUllfUEFUSCkKKwogQlVJTERfRElSPSRXT1JLX0RJUi9idWlsZAogbWtkaXIgLXAgJEJVSUxEX0RJUgogCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL01JVE1pc2MuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvTUlUTWlzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOTcxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL01JVE1pc2MuaApAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUkFORE9NIENSVUZUISBUSElTIEhBUyBOTyBPRkZJQ0lBTCBYIENPTlNPUlRJVU0gT1IgWCBQUk9KRUNUIFRFQU0gQkxFU1NJTkcgKi8KKworLyogJFhvcmc6IE1JVE1pc2MuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjIzIHhvcmdjdnMgRXhwICQgKi8KKworI2lmbmRlZiBfWE1JVE1JU0NfSF8KKyNkZWZpbmUgX1hNSVRNSVNDX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL21pdG1pc2Njb25zdC5oPgorCitfWEZVTkNQUk9UT0JFR0lOCisKK0Jvb2wgWE1JVE1pc2NRdWVyeUV4dGVuc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIGludCoJCS8qIGV2ZW50X2Jhc2VwICovLAorICAgIGludCoJCS8qIGVycm9yX2Jhc2VwICovCispOworCitTdGF0dXMgWE1JVE1pc2NTZXRCdWdNb2RlKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgQm9vbAkJLyogb25PZmYgKi8KKyk7CisKK0Jvb2wgWE1JVE1pc2NHZXRCdWdNb2RlKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YRVZJLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hFVkkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmI1M2M0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YRVZJLmgKQEAgLTAsMCArMSw2MyBAQAorLyogJFhvcmc6IFhFVkkuaCx2IDEuMyAyMDAwLzA4LzE4IDA0OjA1OjQ0IGNvc2tyZXkgRXhwICQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMTk5NyBieSBTaWxpY29uIEdyYXBoaWNzIENvbXB1dGVyIFN5c3RlbXMsIEluYy4KK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQKK2ZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0Citub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBTaWxpY29uIEdyYXBoaWNzIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24KK29mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KK1NpbGljb24gR3JhcGhpY3MgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gYWJvdXQgdGhlIHN1aXRhYmlsaXR5CitvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIgord2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorU0lMSUNPTiBHUkFQSElDUyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUworU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBJTiBOTyBFVkVOVCBTSEFMTCBTSUxJQ09OCitHUkFQSElDUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMCitEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCitEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFCitPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gIFdJVEgKK1RIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogJFhGcmVlODYkICovCisKKyNpZm5kZWYgX1hFVklfSF8KKyNkZWZpbmUgX1hFVklfSF8KKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL0VWSS5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVmlzdWFsSUQJCWNvcmVfdmlzdWFsX2lkOworICAgIGludAkJCXNjcmVlbjsKKyAgICBpbnQJCQlsZXZlbDsKKyAgICB1bnNpZ25lZCBpbnQJdHJhbnNwYXJlbmN5X3R5cGU7CisgICAgdW5zaWduZWQgaW50CXRyYW5zcGFyZW5jeV92YWx1ZTsKKyAgICB1bnNpZ25lZCBpbnQJbWluX2h3X2NvbG9ybWFwczsKKyAgICB1bnNpZ25lZCBpbnQJbWF4X2h3X2NvbG9ybWFwczsKKyAgICB1bnNpZ25lZCBpbnQJbnVtX2NvbG9ybWFwX2NvbmZsaWN0czsKKyAgICBWaXN1YWxJRCoJCWNvbG9ybWFwX2NvbmZsaWN0czsKK30gRXh0ZW5kZWRWaXN1YWxJbmZvOworCitfWEZVTkNQUk9UT0JFR0lOCisKK0Jvb2wgWGV2aVF1ZXJ5RXh0ZW5zaW9uKAorICAgIERpc3BsYXkqICAgICAgICAgICAgLyogZHB5ICovCispOworU3RhdHVzIFhldmlRdWVyeVZlcnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBpbnQqCQkvKiBtYWpvclZlcnNpb24gKi8sCisgICAgaW50KgkJLyogbWlub3JWZXJzaW9uICovCispOworU3RhdHVzIFhldmlHZXRWaXN1YWxJbmZvKAorICAgIERpc3BsYXkqCQkgCS8qIGRweSAqLywKKyAgICBWaXN1YWxJRCoJCQkvKiB2aXN1YWxfcXVlcnkgKi8sCisgICAgaW50CQkJCS8qIG5WaXN1YWxfcXVlcnkgKi8sCisgICAgRXh0ZW5kZWRWaXN1YWxJbmZvKioJLyogZXh0ZW5kZWRWaXN1YWxJbmZvX3JldHVybiAqLywKKyAgICBpbnQqCQkJLyogbkluZm9fcmV0dXJuICovCispOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWExieC5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YTGJ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkOWRkOQotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWExieC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qICRYb3JnOiBYTGJ4LmgsdiAxLjMgMjAwMC8wOC8xOCAwNDowNTo0NSBjb3NrcmV5IEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IDE5OTIgTmV0d29yayBDb21wdXRpbmcgRGV2aWNlcworICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTkNELiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAorICogd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTkNELiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCisgKiBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKKyAqIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIE5DRC4gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIE5DRC4KKyAqIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiAKKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKgorICovCisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9leHRlbnNpb25zL1hMYnguaCx2IDEuMyAyMDAyLzEwLzE2IDAxOjU5OjU1IGRhd2VzIEV4cCAkICovCisgCisjaWZuZGVmIF9YTEJYX0hfCisjZGVmaW5lIF9YTEJYX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorI2luY2x1ZGUgPFgxMS9YZGVmcy5oPgorI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvbGJ4Lmg+CisKK19YRlVOQ1BST1RPQkVHSU4KKworQm9vbCBYTGJ4UXVlcnlFeHRlbnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBpbnQqCQkvKiByZXF1ZXN0cCAqLywKKyAgICBpbnQqCQkvKiBldmVudF9iYXNlcCAqLywKKyAgICBpbnQqCQkvKiBlcnJvcl9iYXNlcCAqLworKTsKKworQm9vbCBYTGJ4UXVlcnlWZXJzaW9uKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgaW50KgkJLyogbWFqb3JWZXJzaW9uICovLAorICAgIGludCoJCS8qIG1pbm9yVmVyc2lvbiAqLworKTsKKworaW50IFhMYnhHZXRFdmVudEJhc2UoRGlzcGxheSAqZHB5KTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hTaG0uaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWFNobS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OGNhNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hTaG0uaApAQCAtMCwwICsxLDEzNiBAQAorLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvZXh0ZW5zaW9ucy9YU2htLmgsdiAxLjExIDIwMDMvMDQvMDMgMTU6MTE6MDcgZGF3ZXMgRXhwICQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUSElTIElTIE5PVCBBTiBYIENPTlNPUlRJVU0gU1RBTkRBUkQgT1IgQU4gWCBQUk9KRUNUIFRFQU0gU1BFQ0lGSUNBVElPTiAqLworCisvKiAkWG9yZzogWFNobS5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjQgeG9yZ2N2cyBFeHAgJCAqLworCisjaWZuZGVmIF9YU0hNX0hfCisjZGVmaW5lIF9YU0hNX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3NobS5oPgorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgU2htU2VnOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50CXR5cGU7CQkgICAgLyogb2YgZXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgQm9vbCBzZW5kX2V2ZW50OwkgICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbWUgYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CSAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgRHJhd2FibGUgZHJhd2FibGU7CSAgICAvKiBkcmF3YWJsZSBvZiByZXF1ZXN0ICovCisgICAgaW50IG1ham9yX2NvZGU7CSAgICAvKiBTaG1SZXFDb2RlICovCisgICAgaW50IG1pbm9yX2NvZGU7CSAgICAvKiBYX1NobVB1dEltYWdlICovCisgICAgU2htU2VnIHNobXNlZzsJICAgIC8qIHRoZSBTaG1TZWcgdXNlZCBpbiB0aGUgcmVxdWVzdCAqLworICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OyAgIC8qIHRoZSBvZmZzZXQgaW50byBTaG1TZWcgdXNlZCBpbiB0aGUgcmVxdWVzdCAqLworfSBYU2htQ29tcGxldGlvbkV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgU2htU2VnIHNobXNlZzsJLyogcmVzb3VyY2UgaWQgKi8KKyAgICBpbnQgc2htaWQ7CQkvKiBrZXJuZWwgaWQgKi8KKyAgICBjaGFyICpzaG1hZGRyOwkvKiBhZGRyZXNzIGluIGNsaWVudCAqLworICAgIEJvb2wgcmVhZE9ubHk7CS8qIGhvdyB0aGUgc2VydmVyIHNob3VsZCBhdHRhY2ggaXQgKi8KK30gWFNobVNlZ21lbnRJbmZvOworCitfWEZVTkNQUk9UT0JFR0lOCisKK0Jvb2wgWFNobVF1ZXJ5RXh0ZW5zaW9uKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8KKyk7CisKK2ludCBYU2htR2V0RXZlbnRCYXNlKAorICAgIERpc3BsYXkqIAkJLyogZHB5ICovCispOworCitCb29sIFhTaG1RdWVyeVZlcnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBpbnQqCQkvKiBtYWpvclZlcnNpb24gKi8sCisgICAgaW50KgkJLyogbWlub3JWZXJzaW9uICovLAorICAgIEJvb2wqCQkvKiBzaGFyZWRQaXhtYXBzICovCispOworCitpbnQgWFNobVBpeG1hcEZvcm1hdCgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovCispOworCitTdGF0dXMgWFNobUF0dGFjaCgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIFhTaG1TZWdtZW50SW5mbyoJLyogc2htaW5mbyAqLworKTsKKworU3RhdHVzIFhTaG1EZXRhY2goCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBYU2htU2VnbWVudEluZm8qCS8qIHNobWluZm8gKi8KKyk7CisKK1N0YXR1cyBYU2htUHV0SW1hZ2UoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBEcmF3YWJsZQkJLyogZCAqLywKKyAgICBHQwkJCS8qIGdjICovLAorICAgIFhJbWFnZSoJCS8qIGltYWdlICovLAorICAgIGludAkJCS8qIHNyY194ICovLAorICAgIGludAkJCS8qIHNyY195ICovLAorICAgIGludAkJCS8qIGRzdF94ICovLAorICAgIGludAkJCS8qIGRzdF95ICovLAorICAgIHVuc2lnbmVkIGludAkvKiBzcmNfd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIHNyY19oZWlnaHQgKi8sCisgICAgQm9vbAkJLyogc2VuZF9ldmVudCAqLworKTsKKworU3RhdHVzIFhTaG1HZXRJbWFnZSgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIFhJbWFnZSoJCS8qIGltYWdlICovLAorICAgIGludAkJCS8qIHggKi8sCisgICAgaW50CQkJLyogeSAqLywKKyAgICB1bnNpZ25lZCBsb25nCS8qIHBsYW5lX21hc2sgKi8KKyk7CisKK1hJbWFnZSAqWFNobUNyZWF0ZUltYWdlKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgVmlzdWFsKgkJLyogdmlzdWFsICovLAorICAgIHVuc2lnbmVkIGludAkvKiBkZXB0aCAqLywKKyAgICBpbnQJCQkvKiBmb3JtYXQgKi8sCisgICAgY2hhcioJCS8qIGRhdGEgKi8sCisgICAgWFNobVNlZ21lbnRJbmZvKgkvKiBzaG1pbmZvICovLAorICAgIHVuc2lnbmVkIGludAkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogaGVpZ2h0ICovCispOworCitQaXhtYXAgWFNobUNyZWF0ZVBpeG1hcCgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIERyYXdhYmxlCQkvKiBkICovLAorICAgIGNoYXIqCQkvKiBkYXRhICovLAorICAgIFhTaG1TZWdtZW50SW5mbyoJLyogc2htaW5mbyAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CS8qIGhlaWdodCAqLywKKyAgICB1bnNpZ25lZCBpbnQJLyogZGVwdGggKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YYWcuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGFnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyZTJjNAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGFnLmgKQEAgLTAsMCArMSw5MiBAQAorLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvZXh0ZW5zaW9ucy9YYWcuaCx2IDEuNSAyMDAxLzEyLzE3IDIwOjUyOjI0IGRhd2VzIEV4cCAkICovCisvKgorQ29weXJpZ2h0IDE5OTYsIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKK2luIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKK09USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCitPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yCitvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uCitmcm9tIFRoZSBPcGVuIEdyb3VwLgorKi8KKy8qICRYb3JnOiBYYWcuaCx2IDEuNSAyMDAxLzAyLzA5IDAyOjAzOjI0IHhvcmdjdnMgRXhwICQgKi8KKworI2lmbmRlZiBfWEFHX0hfCisjZGVmaW5lIF9YQUdfSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL2FnLmg+CisjaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitfWEZVTkNQUk9UT0JFR0lOCisKK3R5cGVkZWYgWElEIFhBcHBHcm91cDsKKworQm9vbCBYYWdRdWVyeVZlcnNpb24oCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgaW50KgkJCS8qIG1ham9yX3ZlcnNpb24gKi8sCisgICAgaW50KgkJCS8qIG1pbm9yX3ZlcnNpb24gKi8KKyk7CisKK1N0YXR1cyBYYWdDcmVhdGVFbWJlZGRlZEFwcGxpY2F0aW9uR3JvdXAoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgVmlzdWFsSUQJCQkvKiByb290X3Zpc3VhbCAqLywKKyAgICBDb2xvcm1hcAkJCS8qIGRlZmF1bHRfY29sb3JtYXAgKi8sCisgICAgdW5zaWduZWQgbG9uZwkJLyogYmxhY2tfcGl4ZWwgKi8sCisgICAgdW5zaWduZWQgbG9uZwkJLyogd2hpdGVfcGl4ZWwgKi8sCisgICAgWEFwcEdyb3VwKgkJCS8qIGFwcF9ncm91cF9yZXR1cm4gKi8KKyk7CisKK1N0YXR1cyBYYWdDcmVhdGVOb25lbWJlZGRlZEFwcGxpY2F0aW9uR3JvdXAoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgWEFwcEdyb3VwKgkJCS8qIGFwcF9ncm91cF9yZXR1cm4gKi8KKyk7CisKK1N0YXR1cyBYYWdEZXN0cm95QXBwbGljYXRpb25Hcm91cCgKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBYQXBwR3JvdXAJCQkvKiBhcHBfZ3JvdXAgKi8KKyk7CisKK1N0YXR1cyBYYWdHZXRBcHBsaWNhdGlvbkdyb3VwQXR0cmlidXRlcygKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBYQXBwR3JvdXAJCQkvKiBhcHBfZ3JvdXAgKi8sCisgICAgLi4uCispOworCitTdGF0dXMgWGFnUXVlcnlBcHBsaWNhdGlvbkdyb3VwKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIFhJRAkJCQkvKiByZXNvdXJjZV9iYXNlICovLAorICAgIFhBcHBHcm91cCoJCQkvKiBhcHBfZ3JvdXBfcmV0ICovCispOworCitTdGF0dXMgWGFnQ3JlYXRlQXNzb2NpYXRpb24oCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgV2luZG93KgkJCS8qIHdpbmRvd19yZXQgKi8sCisgICAgdm9pZCoJCQkvKiBzeXN0ZW1fd2luZG93ICovCispOworCitTdGF0dXMgWGFnRGVzdHJveUFzc29jaWF0aW9uKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIFdpbmRvdwkJCS8qIHdpbmRvdyAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YQUdfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YY3VwLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hjdXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTkwOWM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YY3VwLmgKQEAgLTAsMCArMSw2MCBAQAorLyogJFhvcmc6IFhjdXAuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjI0IHhvcmdjdnMgRXhwICQgKi8KKy8qCisKK0NvcHlyaWdodCAxOTg3LCAxOTg4LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworLyogJFhGcmVlODYkICovCisKKyNpZm5kZWYgX1hDVVBfSF8KKyNkZWZpbmUgX1hDVVBfSF8KKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvY3VwLmg+CisKK19YRlVOQ1BST1RPQkVHSU4KKworQm9vbCBYY3VwUXVlcnlWZXJzaW9uKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIGludCoJCQkvKiBtYWpvcl92ZXJzaW9uICovLAorICAgIGludCoJCQkvKiBtaW5vcl92ZXJzaW9uICovCispOworCitTdGF0dXMgWGN1cEdldFJlc2VydmVkQ29sb3JtYXBFbnRyaWVzKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIGludAkJCQkvKiBzY3JlZW4gKi8sCisgICAgWENvbG9yKioJCQkvKiBjb2xvcnNfb3V0ICovLAorICAgIGludCoJCQkvKiBuY29sb3JzICovCispOworCitTdGF0dXMgWGN1cFN0b3JlQ29sb3JzKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIENvbG9ybWFwCQkJLyogY29sb3JtYXAgKi8sCisgICAgWENvbG9yKgkJCS8qIGNvbG9ycyAqLywKKyAgICBpbnQJCQkJLyogbmNvbG9ycyAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YQ1VQX0hfICovCisKZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGRiZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YZGJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwNzM4ZAotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvWGRiZS5oCkBAIC0wLDAgKzEsMTQwIEBACisvKiAkWG9yZzogWGRiZS5oLHYgMS4zIDIwMDAvMDgvMTggMDQ6MDU6NDUgY29za3JleSBFeHAgJCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTUgIEhld2xldHQtUGFja2FyZCBDb21wYW55CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIEhFV0xFVFQtUEFDS0FSRCBDT01QQU5ZIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IKKyAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICogCisgKiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgSGV3bGV0dC1QYWNrYXJkCisgKiBDb21wYW55IHNoYWxsIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZQorICogc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiBhdXRob3JpemF0aW9uIGZyb20gdGhlIEhld2xldHQtUGFja2FyZCBDb21wYW55LgorICogCisgKiAgICAgSGVhZGVyIGZpbGUgZm9yIFhsaWItcmVsYXRlZCBEQkUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9leHRlbnNpb25zL1hkYmUuaCx2IDMuMiAyMDAxLzA4LzAxIDAwOjQ0OjM1IHRzaSBFeHAgJCAqLworCisjaWZuZGVmIFhEQkVfSAorI2RlZmluZSBYREJFX0gKKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvZGJlLmg+CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVmlzdWFsSUQgICAgdmlzdWFsOyAgICAvKiBvbmUgdmlzdWFsIElEIHRoYXQgc3VwcG9ydHMgZG91YmxlLWJ1ZmZlcmluZyAqLworICAgIGludCAgICAgICAgIGRlcHRoOyAgICAgLyogZGVwdGggb2YgdmlzdWFsIGluIGJpdHMgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgICAgICAgICBwZXJmbGV2ZWw7IC8qIHBlcmZvcm1hbmNlIGxldmVsIG9mIHZpc3VhbCAgICAgICAgICAgICAgICAgICovCit9CitYZGJlVmlzdWFsSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgIGNvdW50OyAgICAgICAgICAvKiBudW1iZXIgb2YgaXRlbXMgaW4gdmlzdWFsX2RlcHRoICAgKi8KKyAgICBYZGJlVmlzdWFsSW5mbyAgICAgICp2aXNpbmZvOyAgICAgICAvKiBsaXN0IG9mIHZpc3VhbHMgJiBkZXB0aHMgZm9yIHNjcm4gKi8KK30KK1hkYmVTY3JlZW5WaXN1YWxJbmZvOworCisKK3R5cGVkZWYgRHJhd2FibGUgWGRiZUJhY2tCdWZmZXI7CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBYZGJlU3dhcEFjdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBXaW5kb3cJCXN3YXBfd2luZG93OyAgICAvKiB3aW5kb3cgZm9yIHdoaWNoIHRvIHN3YXAgYnVmZmVycyAgICovCisgICAgWGRiZVN3YXBBY3Rpb24Jc3dhcF9hY3Rpb247ICAgIC8qIHN3YXAgYWN0aW9uIHRvIHVzZSBmb3Igc3dhcF93aW5kb3cgKi8KK30KK1hkYmVTd2FwSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBXaW5kb3cJd2luZG93OwkJCS8qIHdpbmRvdyB0aGF0IGJ1ZmZlciBiZWxvbmdzIHRvICovCit9CitYZGJlQmFja0J1ZmZlckF0dHJpYnV0ZXM7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50CQkJdHlwZTsKKyAgICBEaXNwbGF5CQkqZGlzcGxheTsJLyogZGlzcGxheSB0aGUgZXZlbnQgd2FzIHJlYWQgZnJvbSAqLworICAgIFhkYmVCYWNrQnVmZmVyCWJ1ZmZlcjsJCS8qIHJlc291cmNlIGlkICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBsb25nCXNlcmlhbDsJCS8qIHNlcmlhbCBudW1iZXIgb2YgZmFpbGVkIHJlcXVlc3QgKi8KKyAgICB1bnNpZ25lZCBjaGFyCWVycm9yX2NvZGU7CS8qIGVycm9yIGJhc2UgKyBYZGJlQmFkQnVmZmVyICAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyCXJlcXVlc3RfY29kZTsJLyogbWFqb3Igb3Bjb2RlIG9mIGZhaWxlZCByZXF1ZXN0ICAqLworICAgIHVuc2lnbmVkIGNoYXIJbWlub3JfY29kZTsJLyogbWlub3Igb3Bjb2RlIG9mIGZhaWxlZCByZXF1ZXN0ICAqLworfQorWGRiZUJ1ZmZlckVycm9yOworCisvKiBfWEZVTkNQUk9UT0JFR0lOIGFuZCBfWEZVTkNQUk9UT0VORCBhcmUgZGVmaW5lZCBhcyBub29wcworICogKGZvciBub24tQysrIGJ1aWxkcykgaW4gWDExL1hmdW5jcHJvdG8uaC4KKyAqLworX1hGVU5DUFJPVE9CRUdJTgorCitleHRlcm4gU3RhdHVzIFhkYmVRdWVyeUV4dGVuc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZHB5ICAgICAgICAgICAgICAgICAgKi8sCisgICAgaW50KgkJLyogbWFqb3JfdmVyc2lvbl9yZXR1cm4gKi8sCisgICAgaW50KgkJLyogbWlub3JfdmVyc2lvbl9yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBYZGJlQmFja0J1ZmZlciBYZGJlQWxsb2NhdGVCYWNrQnVmZmVyTmFtZSgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICAgICAgICAgKi8sCisgICAgV2luZG93CQkvKiB3aW5kb3cgICAgICAqLywKKyAgICBYZGJlU3dhcEFjdGlvbgkvKiBzd2FwX2FjdGlvbiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYZGJlRGVhbGxvY2F0ZUJhY2tCdWZmZXJOYW1lKAorICAgIERpc3BsYXkqCQkvKiBkcHkgICAgKi8sCisgICAgWGRiZUJhY2tCdWZmZXIJLyogYnVmZmVyICovCispOworCitleHRlcm4gU3RhdHVzIFhkYmVTd2FwQnVmZmVycygKKyAgICBEaXNwbGF5KgkJLyogZHB5ICAgICAgICAgKi8sCisgICAgWGRiZVN3YXBJbmZvKgkvKiBzd2FwX2luZm8gICAqLywKKyAgICBpbnQJCQkvKiBudW1fd2luZG93cyAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYZGJlQmVnaW5JZGlvbSgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovCispOworCitleHRlcm4gU3RhdHVzIFhkYmVFbmRJZGlvbSgKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovCispOworCitleHRlcm4gWGRiZVNjcmVlblZpc3VhbEluZm8gKlhkYmVHZXRWaXN1YWxJbmZvKAorICAgIERpc3BsYXkqCQkvKiBkcHkgICAgICAgICAgICAgICAqLywKKyAgICBEcmF3YWJsZSoJCS8qIHNjcmVlbl9zcGVjaWZpZXJzICovLAorICAgIGludCoJCS8qIG51bV9zY3JlZW5zICAgICAgICovCispOworCitleHRlcm4gdm9pZCBYZGJlRnJlZVZpc3VhbEluZm8oCisgICAgWGRiZVNjcmVlblZpc3VhbEluZm8qCS8qIHZpc3VhbF9pbmZvICovCispOworCitleHRlcm4gWGRiZUJhY2tCdWZmZXJBdHRyaWJ1dGVzICpYZGJlR2V0QmFja0J1ZmZlckF0dHJpYnV0ZXMoCisgICAgRGlzcGxheSoJCS8qIGRweSAgICAqLywKKyAgICBYZGJlQmFja0J1ZmZlcgkvKiBidWZmZXIgKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNlbmRpZiAvKiBYREJFX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YZXh0LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmRjNDIzCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YZXh0LmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqICRYb3JnOiBYZXh0LmgsdiAxLjQgMjAwMS8wMi8wOSAwMjowMzoyNCB4b3JnY3ZzIEV4cCAkCisgKgorQ29weXJpZ2h0IDE5ODksIDE5OTggIFRoZSBPcGVuIEdyb3VwCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKK3RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbi4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCitPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KK0NPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCitpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCisgKi8KKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL2V4dGVuc2lvbnMvWGV4dC5oLHYgMS40IDIwMDEvMTIvMTQgMTk6NTM6MjggZGF3ZXMgRXhwICQgKi8KKworI2lmbmRlZiBfWEVYVF9IXworI2RlZmluZSBfWEVYVF9IXworCisjaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4KKworX1hGVU5DUFJPVE9CRUdJTgorCit0eXBlZGVmIGludCAoKlhleHRFcnJvckhhbmRsZXIpICgKKyAgICBEaXNwbGF5ICoJCS8qIGRweSAqLywKKyAgICBfWGNvbnN0IGNoYXIqCS8qIGV4dF9uYW1lICovLAorICAgIF9YY29uc3QgY2hhcioJLyogcmVhc29uICovCispOworCitleHRlcm4gWGV4dEVycm9ySGFuZGxlciBYU2V0RXh0ZW5zaW9uRXJyb3JIYW5kbGVyKAorICAgIFhleHRFcnJvckhhbmRsZXIJLyogaGFuZGxlciAqLworKTsKKworZXh0ZXJuIGludCBYTWlzc2luZ0V4dGVuc2lvbigKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIF9YY29uc3QgY2hhcioJLyogZXh0X25hbWUgKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNkZWZpbmUgWF9FWFRFTlNJT05fVU5LTk9XTiAidW5rbm93biIKKyNkZWZpbmUgWF9FWFRFTlNJT05fTUlTU0lORyAibWlzc2luZyIKKworI2VuZGlmIC8qIF9YRVhUX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL1hnZS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTM4MmZmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9YZ2UuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IKkgMjAwNy0yMDA4IFBldGVyIEh1dHRlcmVyCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IFBldGVyIEh1dHRlcmVyLCBVbml2ZXJzaXR5IG9mIFNvdXRoIEF1c3RyYWxpYSwgTklDVEEKKyAqCisgKi8KKworCisvKiBYR0UgQ2xpZW50IGludGVyZmFjZXMgKi8KKworI2lmbmRlZiBfWEdFX0hfCisjZGVmaW5lIF9YR0VfSF8KKworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4KKworX1hGVU5DUFJPVE9CRUdJTgorCisvKioKKyAqIEdlbmVyaWMgRXZlbnQgbWFzay4gCisgKiBUbyBiZSB1c2VkIHdoZW5ldmVyIGEgbGlzdCBvZiBtYXNrcyBwZXIgZXh0ZW5zaW9uIGhhcyB0byBiZSBwcm92aWRlZC4KKyAqCisgKiBCdXQsIGRvbid0IGFjdHVhbGx5IHVzZSB0aGUgQ0FSRHs4LDE2LDMyfSB0eXBlcy4gIFdlIGNhbid0IGdldCB0aGVtIHRoZW0KKyAqIGRlZmluZWQgaGVyZSB3aXRob3V0IHBvbGx1dGluZyB0aGUgbmFtZXNwYWNlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciAgICAgICBleHRlbnNpb247CisgICAgdW5zaWduZWQgY2hhciAgICAgICBwYWQwOworICAgIHVuc2lnbmVkIHNob3J0ICAgICAgcGFkMTsKKyAgICB1bnNpZ25lZCBpbnQgICAgICBldm1hc2s7Cit9IFhHZW5lcmljRXZlbnRNYXNrOworCitCb29sIFhHRVF1ZXJ5RXh0ZW5zaW9uKERpc3BsYXkqIGRweSwgaW50ICpldmVudF9iYXNlcCwgaW50ICplcnJfYmFzZXApOworQm9vbCBYR0VRdWVyeVZlcnNpb24oRGlzcGxheSogZHB5LCBpbnQgKm1ham9yLCBpbnQqIG1pbm9yKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9YR0VfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZHBtcy5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9kcG1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIwNmQ0NwotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvZHBtcy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qICRYb3JnOiBkcG1zLmgsdiAxLjMgMjAwMC8wOC8xOCAwNDowNTo0NSBjb3NrcmV5IEV4cCAkICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworQ29weXJpZ2h0IChjKSAxOTk2IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZS4KKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCitGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKK0RJR0lUQUwgRVFVSVBNRU5UIENPUlBPUkFUSU9OIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTLCBJTkNMVURJTkcsIAorQlVUIE5PVCBMSU1JVEVEIFRPIENPTlNFUVVFTlRJQUwgT1IgSU5DSURFTlRBTCBEQU1BR0VTLCBPUiBPVEhFUiBMSUFCSUxJVFksIAorV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiAKK0lOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uIAorc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlcgorZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIERpZ2l0YWwgCitFcXVpcG1lbnQgQ29ycG9yYXRpb24uCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL2V4dGVuc2lvbnMvZHBtcy5oLHYgMy40IDIwMDAvMDMvMTUgMTY6NTE6NTEgdHNpIEV4cCAkICovCisKKyNpZm5kZWYgX1gxMV9FWFRFTlNJT05TX0RQTVNfSAorI2RlZmluZSBfWDExX0VYVEVOU0lPTlNfRFBNU19IIDEKKworI2luY2x1ZGUgPFgxMS9YLmg+CisjaW5jbHVkZSA8WDExL1htZC5oPgorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL2RwbXNjb25zdC5oPgorCitfWEZVTkNQUk9UT0JFR0lOCisKK2V4dGVybiBCb29sIERQTVNRdWVyeUV4dGVuc2lvbihEaXNwbGF5ICosIGludCAqLCBpbnQgKik7CitleHRlcm4gU3RhdHVzIERQTVNHZXRWZXJzaW9uKERpc3BsYXkgKiwgaW50ICosIGludCAqKTsKK2V4dGVybiBCb29sIERQTVNDYXBhYmxlKERpc3BsYXkgKik7CitleHRlcm4gU3RhdHVzIERQTVNTZXRUaW1lb3V0cyhEaXNwbGF5ICosIENBUkQxNiwgQ0FSRDE2LCBDQVJEMTYpOworZXh0ZXJuIEJvb2wgRFBNU0dldFRpbWVvdXRzKERpc3BsYXkgKiwgQ0FSRDE2ICosIENBUkQxNiAqLCBDQVJEMTYgKik7CitleHRlcm4gU3RhdHVzIERQTVNFbmFibGUoRGlzcGxheSAqKTsKK2V4dGVybiBTdGF0dXMgRFBNU0Rpc2FibGUoRGlzcGxheSAqKTsKK2V4dGVybiBTdGF0dXMgRFBNU0ZvcmNlTGV2ZWwoRGlzcGxheSAqLCBDQVJEMTYpOworZXh0ZXJuIFN0YXR1cyBEUE1TSW5mbyhEaXNwbGF5ICosIENBUkQxNiAqLCBCT09MICopOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYgLyogIV9YMTFfRVhURU5TSU9OU19EUE1TX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9leHR1dGlsLmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL2V4dHV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjVkODFlCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9leHR1dGlsLmgKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiAkWG9yZzogZXh0dXRpbC5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjQgeG9yZ2N2cyBFeHAgJAorICoKK0NvcHlyaWdodCAxOTg5LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorICoKKyAqIEF1dGhvcjogIEppbSBGdWx0b24sIE1JVCBUaGUgT3BlbiBHcm91cAorICogCisgKiAgICAgICAgICAgICAgICAgICAgIFhsaWIgRXh0ZW5zaW9uLVdyaXRpbmcgVXRpbGl0aWVzCisgKgorICogVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHV0aWxpdGllcyBmb3Igd3JpdGluZyB0aGUgY2xpZW50IEFQSSBmb3IgdmFyaW91cworICogcHJvdG9jb2wgZXh0ZW5zaW9ucy4gIFRIRVNFIElOVEVSRkFDRVMgQVJFIE5PVCBQQVJUIE9GIFRIRSBYIFNUQU5EQVJEIEFORAorICogQVJFIFNVQkpFQ1QgVE8gQ0hBTkdFIQorICovCisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9leHRlbnNpb25zL2V4dHV0aWwuaCx2IDEuOSAyMDAxLzEyLzE0IDE5OjUzOjI4IGRhd2VzIEV4cCAkICovCisKKyNpZm5kZWYgX0VYVFVUSUxfSF8KKyNkZWZpbmUgX0VYVFVUSUxfSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hleHQuaD4KKworLyoKKyAqIFdlIG5lZWQgdG8ga2VlcCBhIGxpc3Qgb2Ygb3BlbiBkaXNwbGF5cyBzaW5jZSB0aGUgWGxpYiBkaXNwbGF5IGxpc3QgaXNuJ3QKKyAqIHB1YmxpYy4gIFdlIGFsc28gaGF2ZSB0byBwZXItZGlzcGxheSBpbmZvIGluIGEgc2VwYXJhdGUgYmxvY2sgc2luY2UgaXQgaXNuJ3QKKyAqIHN0b3JlZCBkaXJlY3RseSBpbiB0aGUgRGlzcGxheSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9YRXh0RGlzcGxheUluZm8geworICAgIHN0cnVjdCBfWEV4dERpc3BsYXlJbmZvICpuZXh0OwkvKiBrZWVwIGEgbGlua2VkIGxpc3QgKi8KKyAgICBEaXNwbGF5ICpkaXNwbGF5OwkJCS8qIHdoaWNoIGRpc3BsYXkgdGhpcyBpcyAqLworICAgIFhFeHRDb2RlcyAqY29kZXM7CQkJLyogdGhlIGV4dGVuc2lvbiBwcm90b2NvbCBjb2RlcyAqLworICAgIFhQb2ludGVyIGRhdGE7CQkJLyogZXh0cmEgZGF0YSBmb3IgZXh0ZW5zaW9uIHRvIHVzZSAqLworfSBYRXh0RGlzcGxheUluZm87CisKK3R5cGVkZWYgc3RydWN0IF9YRXh0ZW5zaW9uSW5mbyB7CisgICAgWEV4dERpc3BsYXlJbmZvICpoZWFkOwkJLyogc3RhcnQgb2YgbGlzdCAqLworICAgIFhFeHREaXNwbGF5SW5mbyAqY3VyOwkJLyogbW9zdCByZWNlbnRseSB1c2VkICovCisgICAgaW50IG5kaXNwbGF5czsJCQkvKiBudW1iZXIgb2YgZGlzcGxheXMgKi8KK30gWEV4dGVuc2lvbkluZm87CisKK3R5cGVkZWYgc3RydWN0IF9YRXh0ZW5zaW9uSG9va3MgeworICAgIGludCAoKmNyZWF0ZV9nYykoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorCSAgICAgIEdDCQkJLyogZ2MgKi8sCisJICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8KKyk7CisgICAgaW50ICgqY29weV9nYykoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICBHQwkJCS8qIGdjICovLAorICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLworKTsKKyAgICBpbnQgKCpmbHVzaF9nYykoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICBHQwkJCS8qIGdjICovLAorICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLworKTsKKyAgICBpbnQgKCpmcmVlX2djKSgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgIEdDCQkJLyogZ2MgKi8sCisgICAgICAgICAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovCispOworICAgIGludCAoKmNyZWF0ZV9mb250KSgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgIFhGb250U3RydWN0KgkJLyogZnMgKi8sCisgICAgICAgICAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovCispOworICAgIGludCAoKmZyZWVfZm9udCkoCisJICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICBYRm9udFN0cnVjdCoJCS8qIGZzICovLAorICAgICAgICAgICAgICBYRXh0Q29kZXMqCQkvKiBjb2RlcyAqLworKTsKKyAgICBpbnQgKCpjbG9zZV9kaXNwbGF5KSgKKwkgICAgICBEaXNwbGF5KgkJCS8qIGRpc3BsYXkgKi8sCisgICAgICAgICAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovCispOworICAgIEJvb2wgKCp3aXJlX3RvX2V2ZW50KSgKKwkgICAgICAgRGlzcGxheSoJCQkvKiBkaXNwbGF5ICovLAorICAgICAgICAgICAgICAgWEV2ZW50KgkJCS8qIHJlICovLAorICAgICAgICAgICAgICAgeEV2ZW50KgkJCS8qIGV2ZW50ICovCispOworICAgIFN0YXR1cyAoKmV2ZW50X3RvX3dpcmUpKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgWEV2ZW50KgkJCS8qIHJlICovLAorICAgICAgICAgICAgICB4RXZlbnQqCQkJLyogZXZlbnQgKi8KKyk7CisgICAgaW50ICgqZXJyb3IpKAorCSAgICAgIERpc3BsYXkqCQkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgeEVycm9yKgkJCS8qIGVyciAqLywKKyAgICAgICAgICAgICAgWEV4dENvZGVzKgkJLyogY29kZXMgKi8sCisgICAgICAgICAgICAgIGludCoJCQkvKiByZXRfY29kZSAqLworKTsKKyAgICBjaGFyICooKmVycm9yX3N0cmluZykoCisJICAgICAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgICBpbnQJCQkvKiBjb2RlICovLAorICAgICAgICAgICAgICAgIFhFeHRDb2RlcyoJCS8qIGNvZGVzICovLAorICAgICAgICAgICAgICAgIGNoYXIqCQkJLyogYnVmZmVyICovLAorICAgICAgICAgICAgICAgIGludAkJCS8qIG5ieXRlcyAqLworKTsKK30gWEV4dGVuc2lvbkhvb2tzOworCitleHRlcm4gWEV4dGVuc2lvbkluZm8gKlhleHRDcmVhdGVFeHRlbnNpb24oCisgICAgdm9pZAorKTsKK2V4dGVybiB2b2lkIFhleHREZXN0cm95RXh0ZW5zaW9uKAorICAgIFhFeHRlbnNpb25JbmZvKgkvKiBpbmZvICovCispOworZXh0ZXJuIFhFeHREaXNwbGF5SW5mbyAqWGV4dEFkZERpc3BsYXkoCisgICAgWEV4dGVuc2lvbkluZm8qCS8qIGV4dGluZm8gKi8sCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBjaGFyKgkJLyogZXh0X25hbWUgKi8sCisgICAgWEV4dGVuc2lvbkhvb2tzKgkvKiBob29rcyAqLywKKyAgICBpbnQJCQkvKiBuZXZlbnRzICovLAorICAgIFhQb2ludGVyCQkvKiBkYXRhICovCispOworZXh0ZXJuIGludCBYZXh0UmVtb3ZlRGlzcGxheSgKKyAgICBYRXh0ZW5zaW9uSW5mbyoJLyogZXh0aW5mbyAqLywKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovCispOworZXh0ZXJuIFhFeHREaXNwbGF5SW5mbyAqWGV4dEZpbmREaXNwbGF5KAorICAgIFhFeHRlbnNpb25JbmZvKgkvKiBleHRpbmZvICovLAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8KKyk7CisKKyNkZWZpbmUgWGV4dEhhc0V4dGVuc2lvbihpKSAoKGkpICYmICgoaSktPmNvZGVzKSkKKyNkZWZpbmUgWGV4dENoZWNrRXh0ZW5zaW9uKGRweSxpLG5hbWUsdmFsKSBcCisgIGlmICghWGV4dEhhc0V4dGVuc2lvbihpKSkgeyBYTWlzc2luZ0V4dGVuc2lvbiAoZHB5LCBuYW1lKTsgcmV0dXJuIHZhbDsgfQorI2RlZmluZSBYZXh0U2ltcGxlQ2hlY2tFeHRlbnNpb24oZHB5LGksbmFtZSkgXAorICBpZiAoIVhleHRIYXNFeHRlbnNpb24oaSkpIHsgWE1pc3NpbmdFeHRlbnNpb24gKGRweSwgbmFtZSk7IHJldHVybjsgfQorCisKKy8qCisgKiBoZWxwZXIgbWFjcm9zIHRvIGdlbmVyYXRlIGNvZGUgdGhhdCBpcyBjb21tb24gdG8gYWxsIGV4dGVuc2lvbnM7IGNhbGxlcgorICogc2hvdWxkIHByZWZpeCBpdCB3aXRoIHN0YXRpYyBpZiBleHRlbnNpb24gc291cmNlIGlzIGluIG9uZSBmaWxlOyB0aGlzCisgKiBjb3VsZCBiZSBhIHV0aWxpdHkgZnVuY3Rpb24sIGJ1dCBoYXZlIHRvIHN0YWNrIDYgdW51c2VkIGFyZ3VtZW50cyBmb3IgCisgKiBzb21ldGhpbmcgdGhhdCBpcyBjYWxsZWQgbWFueSwgbWFueSB0aW1lcyB3b3VsZCBiZSBiYWQuCisgKi8KKyNkZWZpbmUgWEVYVF9HRU5FUkFURV9GSU5EX0RJU1BMQVkocHJvYyxleHRpbmZvLGV4dG5hbWUsaG9va3MsbmV2LGRhdGEpIFwKK1hFeHREaXNwbGF5SW5mbyAqcHJvYyAoRGlzcGxheSAqZHB5KSBcCit7IFwKKyAgICBYRXh0RGlzcGxheUluZm8gKmRweWluZm87IFwKKyAgICBpZiAoIWV4dGluZm8pIHsgaWYgKCEoZXh0aW5mbyA9IFhleHRDcmVhdGVFeHRlbnNpb24oKSkpIHJldHVybiBOVUxMOyB9IFwKKyAgICBpZiAoIShkcHlpbmZvID0gWGV4dEZpbmREaXNwbGF5IChleHRpbmZvLCBkcHkpKSkgXAorICAgICAgZHB5aW5mbyA9IFhleHRBZGREaXNwbGF5IChleHRpbmZvLGRweSxleHRuYW1lLGhvb2tzLG5ldixkYXRhKTsgXAorICAgIHJldHVybiBkcHlpbmZvOyBcCit9CisKKyNkZWZpbmUgWEVYVF9GSU5EX0RJU1BMQVlfUFJPVE8ocHJvYykgXAorCVhFeHREaXNwbGF5SW5mbyAqcHJvYyhEaXNwbGF5ICpkcHkpCisKKyNkZWZpbmUgWEVYVF9HRU5FUkFURV9DTE9TRV9ESVNQTEFZKHByb2MsZXh0aW5mbykgXAoraW50IHByb2MgKERpc3BsYXkgKmRweSwgWEV4dENvZGVzICpjb2RlcykgXAoreyBcCisgICAgcmV0dXJuIFhleHRSZW1vdmVEaXNwbGF5IChleHRpbmZvLCBkcHkpOyBcCit9CisKKyNkZWZpbmUgWEVYVF9DTE9TRV9ESVNQTEFZX1BST1RPKHByb2MpIFwKKwlpbnQgcHJvYyhEaXNwbGF5ICpkcHksIFhFeHRDb2RlcyAqY29kZXMpCisKKyNkZWZpbmUgWEVYVF9HRU5FUkFURV9FUlJPUl9TVFJJTkcocHJvYyxleHRuYW1lLG5lcnIsZXJybCkgXAorY2hhciAqcHJvYyAoRGlzcGxheSAqZHB5LCBpbnQgY29kZSwgWEV4dENvZGVzICpjb2RlcywgY2hhciAqYnVmLCBpbnQgbikgXAoreyAgXAorICAgIGNvZGUgLT0gY29kZXMtPmZpcnN0X2Vycm9yOyAgXAorICAgIGlmIChjb2RlID49IDAgJiYgY29kZSA8IG5lcnIpIHsgXAorCWNoYXIgdG1wWzI1Nl07IFwKKwlzcHJpbnRmICh0bXAsICIlcy4lZCIsIGV4dG5hbWUsIGNvZGUpOyBcCisJWEdldEVycm9yRGF0YWJhc2VUZXh0IChkcHksICJYUHJvdG9FcnJvciIsIHRtcCwgZXJybFtjb2RlXSwgYnVmLCBuKTsgXAorCXJldHVybiBidWY7IFwKKyAgICB9IFwKKyAgICByZXR1cm4gKGNoYXIgKikwOyBcCit9CisKKyNkZWZpbmUgWEVYVF9FUlJPUl9TVFJJTkdfUFJPVE8ocHJvYykgXAorCWNoYXIgKnByb2MoRGlzcGxheSAqZHB5LCBpbnQgY29kZSwgWEV4dENvZGVzICpjb2RlcywgY2hhciAqYnVmLCBpbnQgbikKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9sYnhidWYuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4YnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5ODNkZgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4YnVmLmgKQEAgLTAsMCArMSw1MSBAQAorLyogJFhvcmc6IGxieGJ1Zi5oLHYgMS4zIDIwMDAvMDgvMTggMDQ6MDU6NDUgY29za3JleSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkwLCAxOTk0IE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMsIEluYy4gbm90IGJlCisgKiB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIAorICogc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBBUy1JUycuICBORVRXT1JLIENPTVBVVElORyBERVZJQ0VTLCBJTkMuLAorICogRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBXSVRIT1VUCisgKiBMSU1JVEFUSU9OIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBCisgKiBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIE5FVFdPUksKKyAqIENPTVBVVElORyBERVZJQ0VTLCBJTkMuLCBCRSBMSUFCTEUgRk9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIElOQ0xVRElORworICogU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIElOQ0xVRElORyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgVEhFUkVPRiwgQU5ECisgKiBSRUdBUkRMRVNTIE9GIFdIRVRIRVIgSU4gQU4gQUNUSU9OIElOIENPTlRSQUNULCBUT1JUIE9SIE5FR0xJR0VOQ0UsCisgKiBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCisgKiBTT0ZUV0FSRS4KKyAqIAorICovCisKKyNpZm5kZWYgX0JVRkZFUl9IXworI2RlZmluZSBfQlVGRkVSX0hfCisKKyNkZWZpbmUgSU5CVUZGRVJfU0laRQkJKDEgPDwgMTMpCS8qIDhLICovCisjZGVmaW5lIE9VVEJVRkZFUl9TSVpFCQkoMSA8PCAxMikJLyogNEsgKi8KKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgICAgMQorI2VuZGlmCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFICAgMAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IF96bGliYnVmZmVyICAqWmxpYkJ1ZmZlclB0cjsKKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisKK19YRlVOQ1BST1RPQkVHSU4KKworZXh0ZXJuIGludCAgSW5pdFpsaWJCdWZmZXIoWmxpYkJ1ZmZlclB0ciBiLCBpbnQgc2l6ZSk7CitleHRlcm4gdm9pZCBGcmVlWmxpYkJ1ZmZlcihabGliQnVmZmVyUHRyIGIpOworZXh0ZXJuIGNoYXIgKlJlc2VydmVPdXRCdWYoWmxpYkJ1ZmZlclB0ciBvdXRidWYsIGludCBvdXRsZW4pOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYJLyogX0JVRkZFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9sYnhidWZzdHIuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4YnVmc3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhMDZmNgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4YnVmc3RyLmgKQEAgLTAsMCArMSw0NSBAQAorLyogJFhvcmc6IGxieGJ1ZnN0ci5oLHYgMS4zIDIwMDAvMDgvMTggMDQ6MDU6NDUgY29za3JleSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkwLCAxOTk0IE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZAorICogaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZAorICogdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIE5ldHdvcmsgQ29tcHV0aW5nIERldmljZXMsIEluYy4gbm90IGJlCisgKiB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIAorICogc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBBUy1JUycuICBORVRXT1JLIENPTVBVVElORyBERVZJQ0VTLCBJTkMuLAorICogRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBXSVRIT1VUCisgKiBMSU1JVEFUSU9OIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBCisgKiBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIE5FVFdPUksKKyAqIENPTVBVVElORyBERVZJQ0VTLCBJTkMuLCBCRSBMSUFCTEUgRk9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIsIElOQ0xVRElORworICogU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIElOQ0xVRElORyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgVEhFUkVPRiwgQU5ECisgKiBSRUdBUkRMRVNTIE9GIFdIRVRIRVIgSU4gQU4gQUNUSU9OIElOIENPTlRSQUNULCBUT1JUIE9SIE5FR0xJR0VOQ0UsCisgKiBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCisgKiBTT0ZUV0FSRS4KKyAqIAorICovCisvKiAkWEZyZWU4NiQgKi8KKworI2lmbmRlZiBfQlVGRkVSU1RSX0hfCisjZGVmaW5lIF9CVUZGRVJTVFJfSF8KKworI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL2xieGJ1Zi5oPgorCisvKgorICogWkxJQiBJbnB1dC9PdXRwdXQgYnVmZmVyCisgKi8KK3R5cGVkZWYgc3RydWN0IF96bGliYnVmZmVyIHsKKwljaGFyIAkqYnVmYmFzZTsKKwljaGFyCSpidWZlbmQ7CisJY2hhcgkqYnVmcHRyOworCWludCAgCWJ1ZmNudDsKK30gWmxpYkJ1ZmZlcjsKKworI2RlZmluZSBCWVRFU19BVkFJTChpbmJ1ZiwgbGVuKQlcCisJKCgoaW5idWYpLT5idWZjbnQgPj0gKGxlbikpID8gKGluYnVmKS0+YnVmcHRyIDogTlVMTCkKKworI2VuZGlmCS8qIF9CVUZGRVJTVFJfSF8gKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4aW1hZ2UuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvbGJ4aW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDYyN2NmCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9sYnhpbWFnZS5oCkBAIC0wLDAgKzEsMTUxIEBACisvKiAkWG9yZzogbGJ4aW1hZ2UuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjI0IHhvcmdjdnMgRXhwICQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk5NCwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvZXh0ZW5zaW9ucy9sYnhpbWFnZS5oLHYgMS40IDIwMDEvMTIvMjAgMTk6Mjg6NTQgdHNpIEV4cCAkICovCisKKyNpZm5kZWYgX0xCWF9JTUFHRV9IXworI2RlZmluZSBfTEJYX0lNQUdFX0hfCisKKyNpbmNsdWRlIDxYMTEvWGZ1bmNwcm90by5oPgorCitfWEZVTkNQUk9UT0JFR0lOCisKK3R5cGVkZWYgc3RydWN0IF9MYnhCaXRtYXBDb21wTWV0aG9kIHsKKworICAgIGNoYXIgKm1ldGhvZE5hbWU7CisgICAgaW50IGluaXRlZDsKKyAgICBpbnQgbWV0aG9kT3BDb2RlOwkvKiB0byBiZSBmaWxsZWQgb24gcmVwbHkgZnJvbSBzZXJ2ZXIgKi8KKworICAgIGludCAoKmNvbXBJbml0KSgKKwl2b2lkCisgICAgKTsKKworICAgIGludCAoKmNvbXBGdW5jKSgKKwl1bnNpZ25lZCBjaGFyICoJCS8qIGluYnVmICovLAorCXVuc2lnbmVkIGNoYXIgKgkJLyogb3V0YnVmICovLAorCWludAkJCS8qIG91dGJ1ZlNpemUgKi8sCisJaW50CQkJLyogaW1hZ2VfYnl0ZXMgKi8sCisJaW50CQkJLyogcGl4ZWxzX3Blcl9saW5lICovLAorCWludAkJCS8qIHBhZGRlZF9ieXRlc19wZXJfc2NhbmxpbmUgKi8sCisJaW50CQkJLyogcmV2ZXJzZV9iaXRzICovLAorCWludCAqCQkJLyogYnl0ZXNDb21wcmVzc2VkICovCisgICAgKTsKKworICAgIGludCAoKmRlY29tcEZ1bmMpKAorCXVuc2lnbmVkIGNoYXIgKgkJLyogaW5idWYgKi8sCisJdW5zaWduZWQgY2hhciAqCQkvKiBvdXRidWYgKi8sCisJaW50CQkJLyogaW1hZ2VfYnl0ZXMgKi8sCisJaW50CQkJLyogcGl4ZWxzX3Blcl9saW5lICovLAorCWludAkJCS8qIHBhZGRlZF9ieXRlc19wZXJfc2NhbmxpbmUgKi8sCisJaW50CQkJLyogcmV2ZXJzZV9iaXRzICovCisgICAgKTsKKworfSBMYnhCaXRtYXBDb21wTWV0aG9kOworCisKKyNkZWZpbmUgTEJYX01BWF9ERVBUSFMgNQorCit0eXBlZGVmIHN0cnVjdCBfTGJ4UGl4bWFwQ29tcE1ldGhvZCB7CisKKyAgICBjaGFyICptZXRob2ROYW1lOworICAgIHVuc2lnbmVkIGZvcm1hdE1hc2s7CisgICAgaW50IGRlcHRoQ291bnQ7CisgICAgaW50IGRlcHRoc1tMQlhfTUFYX0RFUFRIU107CisgICAgaW50IGluaXRlZDsKKyAgICBpbnQgbWV0aG9kT3BDb2RlOwkvKiB0byBiZSBmaWxsZWQgb24gcmVwbHkgZnJvbSBzZXJ2ZXIgKi8KKworICAgIGludCAoKmNvbXBJbml0KSgKKwl2b2lkCisgICAgKTsKKworICAgIGludCAoKmNvbXBGdW5jKSgKKwljaGFyICoJCQkvKiBpbmJ1ZiAqLywKKwljaGFyICoJCQkvKiBvdXRidWYgKi8sCisJaW50CQkJLyogb3V0YnVmU2l6ZSAqLywKKwlpbnQJCQkvKiBmb3JtYXQgKi8sCisJaW50CQkJLyogZGVwdGggKi8sCisJaW50CQkJLyogbnVtX3NjYW5fbGluZXMgKi8sCisJaW50CQkJLyogc2Nhbl9saW5lX3NpemUgKi8sCisJaW50ICoJCQkvKiBieXRlc0NvbXByZXNzZWQgKi8KKyAgICApOworCisgICAgaW50ICgqZGVjb21wRnVuYykoCisJY2hhciAqCQkJLyogaW5idWYgKi8sCisJY2hhciAqCQkJLyogb3V0YnVmICovLAorCWludAkJCS8qIG51bV9zY2FuX2xpbmVzICovLAorCWludAkJCS8qIHNjYW5fbGluZV9zaXplICovCisgICAgKTsKKworfSBMYnhQaXhtYXBDb21wTWV0aG9kOworCisKK2V4dGVybiBpbnQgTGJ4SW1hZ2VFbmNvZGVQYWNrQml0cyAoCitjaGFyICoJCQkvKiBpbmJ1ZiAqLywKK2NoYXIgKgkJCS8qIG91dGJ1ZiAqLywKK2ludAkJCS8qIG91dGJ1ZlNpemUgKi8sCitpbnQJCQkvKiBmb3JtYXQgKi8sCitpbnQJCQkvKiBkZXB0aCAqLywKK2ludAkJCS8qIG51bV9zY2FuX2xpbmVzICovLAoraW50CQkJLyogc2Nhbl9saW5lX3NpemUgKi8sCitpbnQgKgkJCS8qIGJ5dGVzQ29tcHJlc3NlZCAqLworKTsKKworZXh0ZXJuIGludCBMYnhJbWFnZUVuY29kZUZheEc0MkQgKAordW5zaWduZWQgY2hhciAqCQkvKiBpbmJ1ZiAqLywKK3Vuc2lnbmVkIGNoYXIgKgkJLyogb3V0YnVmICovLAoraW50CQkJLyogb3V0YnVmU2l6ZSAqLywKK2ludAkJCS8qIGltYWdlX2J5dGVzICovLAoraW50CQkJLyogcGl4ZWxzX3Blcl9saW5lICovLAoraW50CQkJLyogcGFkZGVkX2J5dGVzX3Blcl9zY2FubGluZSAqLywKK2ludAkJCS8qIHJldmVyc2VfYml0cyAqLywKK2ludCAqCQkJLyogYnl0ZXNDb21wcmVzc2VkICovCispOworCitleHRlcm4gaW50IExieEltYWdlRGVjb2RlUGFja0JpdHMgKAorY2hhciAqCQkJLyogaW5idWYgKi8sCitjaGFyICoJCQkvKiBvdXRidWYgKi8sCitpbnQJCQkvKiBudW1fc2Nhbl9saW5lcyAqLywKK2ludAkJCS8qIHNjYW5fbGluZV9zaXplICovCispOworCitleHRlcm4gaW50IExieEltYWdlRGVjb2RlRmF4RzQyRCAoCit1bnNpZ25lZCBjaGFyICoJCS8qIGluYnVmICovLAordW5zaWduZWQgY2hhciAqCQkvKiBvdXRidWYgKi8sCitpbnQJCQkvKiBpbWFnZV9ieXRlcyAqLywKK2ludAkJCS8qIHBpeGVsc19wZXJfbGluZSAqLywKK2ludAkJCS8qIHBhZGRlZF9ieXRlc19wZXJfc2NhbmxpbmUgKi8sCitpbnQJCQkvKiByZXZlcnNlX2JpdHMgKi8KKyk7CisKK19YRlVOQ1BST1RPRU5ECisKKyNkZWZpbmUgTEJYX0lNQUdFX0NPTVBSRVNTX1NVQ0NFU1MJCTAKKyNkZWZpbmUgTEJYX0lNQUdFX0NPTVBSRVNTX05PX1NVUFBPUlQJCTEKKyNkZWZpbmUgTEJYX0lNQUdFX0NPTVBSRVNTX0JBRF9NQUxMT0MJCTIKKyNkZWZpbmUgTEJYX0lNQUdFX0NPTVBSRVNTX05PVF9XT1JUSF9JVAkJMworCisjZW5kaWYgLyogX0xCWF9JTUFHRV9IXyAqLwpkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9tdWx0aWJ1Zi5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9tdWx0aWJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWE4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL211bHRpYnVmLmgKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiAkWG9yZzogbXVsdGlidWYuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjI0IHhvcmdjdnMgRXhwICQKKyAqCitDb3B5cmlnaHQgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKyAqLworCisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9leHRlbnNpb25zL211bHRpYnVmLmgsdiAzLjQgMjAwMS8xMi8xNCAxOTo1MzoyOCBkYXdlcyBFeHAgJCAqLworCisjaWZuZGVmIF9NVUxUSUJVRl9IXworI2RlZmluZSBfTVVMVElCVUZfSF8KKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisKKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9tdWx0aWJ1ZmNvbnN0Lmg+CisKKyNpZiAhZGVmaW5lZChVTklYQ1BQKSB8fCBkZWZpbmVkKEFOU0lDUFApCisjZGVmaW5lIE1idWZHZXRSZXEobmFtZSxyZXEsaW5mbykgR2V0UmVxIChuYW1lLCByZXEpOyBcCisJcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsgXAorCXJlcS0+bWJ1ZlJlcVR5cGUgPSBYXyMjbmFtZTsKKyNlbHNlCisjZGVmaW5lIE1idWZHZXRSZXEobmFtZSxyZXEsaW5mbykgR2V0UmVxIChuYW1lLCByZXEpOyBcCisJcmVxLT5yZXFUeXBlID0gaW5mby0+Y29kZXMtPm1ham9yX29wY29kZTsgXAorCXJlcS0+bWJ1ZlJlcVR5cGUgPSBYXy8qKi9uYW1lOworI2VuZGlmCisKKy8qCisgKiBFeHRyYSBkZWZpbml0aW9ucyB0aGF0IHdpbGwgb25seSBiZSBuZWVkZWQgaW4gdGhlIGNsaWVudAorICovCit0eXBlZGVmIFhJRCBNdWx0aWJ1ZmZlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludAl0eXBlOwkJICAgIC8qIG9mIGV2ZW50ICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7ICAgLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIGludCBzZW5kX2V2ZW50OwkgICAgLyogdHJ1ZSBpZiB0aGlzIGNhbWUgZnJvbWUgYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CSAgICAvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgTXVsdGlidWZmZXIgYnVmZmVyOwkgICAgLyogYnVmZmVyIG9mIGV2ZW50ICovCisgICAgaW50CXN0YXRlOwkJICAgIC8qIHNlZSBDbG9iYmVyZWQgY29uc3RhbnRzIGFib3ZlICovCit9IFhtYnVmQ2xvYmJlck5vdGlmeUV2ZW50OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50CXR5cGU7CQkgICAgLyogb2YgZXZlbnQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAvKiAjIG9mIGxhc3QgcmVxdWVzdCBwcm9jZXNzZWQgYnkgc2VydmVyICovCisgICAgaW50IHNlbmRfZXZlbnQ7CSAgICAvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tZSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAqZGlzcGxheTsJICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBNdWx0aWJ1ZmZlciBidWZmZXI7CSAgICAvKiBidWZmZXIgb2YgZXZlbnQgKi8KK30gWG1idWZVcGRhdGVOb3RpZnlFdmVudDsKKworCisvKgorICogcGVyLXdpbmRvdyBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIGdvdAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGRpc3BsYXllZF9pbmRleDsJLyogd2hpY2ggYnVmZmVyIGlzIGJlaW5nIGRpc3BsYXllZCAqLworICAgIGludCB1cGRhdGVfYWN0aW9uOwkJLyogVW5kZWZpbmVkLCBCYWNrZ3JvdW5kLCBVbnRvdWNoZWQsIENvcGllZCAqLworICAgIGludCB1cGRhdGVfaGludDsJCS8qIEZyZXF1ZW50LCBJbnRlcm1pdHRlbnQsIFN0YXRpYyAqLworICAgIGludCB3aW5kb3dfbW9kZTsJCS8qIE1vbm8sIFN0ZXJlbyAqLworICAgIGludCBuYnVmZmVyczsJCS8qIE51bWJlciBvZiBidWZmZXJzICovCisgICAgTXVsdGlidWZmZXIgKmJ1ZmZlcnM7CS8qIEJ1ZmZlcnMgKi8KK30gWG1idWZXaW5kb3dBdHRyaWJ1dGVzOworCisvKgorICogcGVyLXdpbmRvdyBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIHNldAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHVwZGF0ZV9oaW50OwkJLyogRnJlcXVlbnQsIEludGVybWl0dGVudCwgU3RhdGljICovCit9IFhtYnVmU2V0V2luZG93QXR0cmlidXRlczsKKworCisvKgorICogcGVyLWJ1ZmZlciBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIGdvdAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgV2luZG93IHdpbmRvdzsJCS8qIHdoaWNoIHdpbmRvdyB0aGlzIGJlbG9uZ3MgdG8gKi8KKyAgICB1bnNpZ25lZCBsb25nIGV2ZW50X21hc2s7CS8qIGV2ZW50cyB0aGF0IGhhdmUgYmVlbiBzZWxlY3RlZCAqLworICAgIGludCBidWZmZXJfaW5kZXg7CQkvKiB3aGljaCBidWZmZXIgaXMgdGhpcyAqLworICAgIGludCBzaWRlOwkJCS8qIE1vbm8sIExlZnQsIFJpZ2h0ICovCit9IFhtYnVmQnVmZmVyQXR0cmlidXRlczsKKworLyoKKyAqIHBlci1idWZmZXIgYXR0cmlidXRlcyB0aGF0IGNhbiBiZSBzZXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGxvbmcgZXZlbnRfbWFzazsJLyogZXZlbnRzIHRoYXQgaGF2ZSBiZWVuIHNlbGVjdGVkICovCit9IFhtYnVmU2V0QnVmZmVyQXR0cmlidXRlczsKKworCisvKgorICogcGVyLXNjcmVlbiBidWZmZXIgaW5mbyAodGhlcmUgd2lsbCBiZSBsaXN0cyBvZiB0aGVtKQorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVmlzdWFsSUQgdmlzdWFsaWQ7CQkvKiB2aXN1YWwgdXN1YWJsZSBhdCB0aGlzIGRlcHRoICovCisgICAgaW50IG1heF9idWZmZXJzOwkJLyogbW9zdCBidWZmZXJzIGZvciB0aGlzIHZpc3VhbCAqLworICAgIGludCBkZXB0aDsJCQkvKiBkZXB0aCBvZiBidWZmZXJzIHRvIGJlIGNyZWF0ZWQgKi8KK30gWG1idWZCdWZmZXJJbmZvOworCitfWEZVTkNQUk9UT0JFR0lOCisKK2V4dGVybiBCb29sIFhtYnVmUXVlcnlFeHRlbnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBpbnQqCQkvKiBldmVudF9iYXNlX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBlcnJvcl9iYXNlX3JldHVybiAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYbWJ1ZkdldFZlcnNpb24oCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBpbnQqCQkvKiBtYWpvcl92ZXJzaW9uX3JldHVybiAqLywKKyAgICBpbnQqCQkvKiBtaW5vcl92ZXJzaW9uX3JldHVybiAqLworKTsKKworZXh0ZXJuIGludCBYbWJ1ZkNyZWF0ZUJ1ZmZlcnMoCisgICAgRGlzcGxheSoJCS8qIGRweSAqLywKKyAgICBXaW5kb3cJCS8qIHcgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgaW50CQkJLyogdXBkYXRlX2FjdGlvbiAqLywKKyAgICBpbnQJCQkvKiB1cGRhdGVfaGludCAqLywKKyAgICBNdWx0aWJ1ZmZlcioJLyogYnVmZmVycyAqLworKTsKKworZXh0ZXJuIHZvaWQgWG1idWZEZXN0cm95QnVmZmVycygKKyAgICBEaXNwbGF5KgkJLyogZHB5ICovLAorICAgIFdpbmRvdwkJLyogd2luZG93ICovCispOworCitleHRlcm4gdm9pZCBYbWJ1ZkRpc3BsYXlCdWZmZXJzKAorICAgIERpc3BsYXkqCQkvKiBkcHkgKi8sCisgICAgaW50CQkJLyogY291bnQgKi8sCisgICAgTXVsdGlidWZmZXIqCS8qIGJ1ZmZlcnMgKi8sCisgICAgaW50CQkJLyogbWluX2RlbGF5ICovLAorICAgIGludAkJCS8qIG1heF9kZWxheSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYbWJ1ZkdldFdpbmRvd0F0dHJpYnV0ZXMoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgV2luZG93CQkJLyogdyAqLywKKyAgICBYbWJ1ZldpbmRvd0F0dHJpYnV0ZXMqCS8qIGF0dHIgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhtYnVmQ2hhbmdlV2luZG93QXR0cmlidXRlcygKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBXaW5kb3cJCQkvKiB3ICovLAorICAgIHVuc2lnbmVkIGxvbmcJCS8qIHZhbHVlbWFzayAqLywKKyAgICBYbWJ1ZlNldFdpbmRvd0F0dHJpYnV0ZXMqCS8qIGF0dHIgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWG1idWZHZXRCdWZmZXJBdHRyaWJ1dGVzKAorICAgIERpc3BsYXkqCQkJLyogZHB5ICovLAorICAgIE11bHRpYnVmZmVyCQkJLyogYiAqLywKKyAgICBYbWJ1ZkJ1ZmZlckF0dHJpYnV0ZXMqCS8qIGF0dHIgKi8KKyk7CisKK2V4dGVybiB2b2lkIFhtYnVmQ2hhbmdlQnVmZmVyQXR0cmlidXRlcygKKyAgICBEaXNwbGF5KgkJCS8qIGRweSAqLywKKyAgICBNdWx0aWJ1ZmZlcgkJCS8qIGIgKi8sCisgICAgdW5zaWduZWQgbG9uZwkJLyogdmFsdWVtYXNrICovLAorICAgIFhtYnVmU2V0QnVmZmVyQXR0cmlidXRlcyoJLyogYXR0ciAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYbWJ1ZkdldFNjcmVlbkluZm8oCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgRHJhd2FibGUJCQkvKiBkICovLAorICAgIGludCoJCQkvKiBubW9ub19yZXR1cm4gKi8sCisgICAgWG1idWZCdWZmZXJJbmZvKioJCS8qIG1vbm9faW5mb19yZXR1cm4gKi8sCisgICAgaW50KgkJCS8qIG5zdGVyZW9fcmV0dXJuICovLAorICAgIFhtYnVmQnVmZmVySW5mbyoqCQkvKiBzdGVyZW9faW5mb19yZXR1cm4gKi8KKyk7CisKK2V4dGVybiBXaW5kb3cgWG1idWZDcmVhdGVTdGVyZW9XaW5kb3coCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgV2luZG93CQkJLyogcGFyZW50ICovLAorICAgIGludAkJCQkvKiB4ICovLAorICAgIGludAkJCQkvKiB5ICovLAorICAgIHVuc2lnbmVkIGludAkJLyogd2lkdGggKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBoZWlnaHQgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiBib3JkZXJfd2lkdGggKi8sCisgICAgaW50CQkJCS8qIGRlcHRoICovLAorICAgIHVuc2lnbmVkIGludAkJLyogY2xhc3MgKi8sCisgICAgVmlzdWFsKgkJCS8qIHZpc3VhbCAqLywKKyAgICB1bnNpZ25lZCBsb25nCQkvKiB2YWx1ZW1hc2sgKi8sCisgICAgWFNldFdpbmRvd0F0dHJpYnV0ZXMqCS8qIGF0dHIgKi8sCisgICAgTXVsdGlidWZmZXIqCQkvKiBsZWZ0cCAqLywKKyAgICBNdWx0aWJ1ZmZlcioJCS8qIHJpZ2h0cCAqLworKTsKKworZXh0ZXJuIHZvaWQgWG1idWZDbGVhckJ1ZmZlckFyZWEoCisgICAgRGlzcGxheSoJCQkvKiBkcHkgKi8sCisgICAgTXVsdGlidWZmZXIJCQkvKiBidWZmZXIgKi8sCisgICAgaW50CQkJCS8qIHggKi8sCisgICAgaW50CQkJCS8qIHkgKi8sCisgICAgdW5zaWduZWQgaW50CQkvKiB3aWR0aCAqLywKKyAgICB1bnNpZ25lZCBpbnQJCS8qIGhlaWdodCAqLywKKyAgICBCb29sCQkJLyogZXhwb3N1cmVzICovCispOworCitfWEZVTkNQUk9UT0VORAorCisjZW5kaWYgLyogX01VTFRJQlVGX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NlY3VyaXR5LmggYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3NlY3VyaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3YTg2MgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2VjdXJpdHkuaApAQCAtMCwwICsxLDc5IEBACisvKiAkWG9yZzogc2VjdXJpdHkuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjI0IHhvcmdjdnMgRXhwICQgKi8KKy8qCitDb3B5cmlnaHQgMTk5NiwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAoraW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCitPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCitBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKK09USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwKK25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3IKK290aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24KK2Zyb20gVGhlIE9wZW4gR3JvdXAuCisqLworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvZXh0ZW5zaW9ucy9zZWN1cml0eS5oLHYgMS4zIDIwMDEvMTIvMTQgMTk6NTM6MjkgZGF3ZXMgRXhwICQgKi8KKworI2lmbmRlZiBfU0VDVVJJVFlfSAorI2RlZmluZSBfU0VDVVJJVFlfSAorCisjZGVmaW5lIF9YQVVUSF9TVFJVQ1RfT05MWQorI2luY2x1ZGUgPFgxMS9YYXV0aC5oPgorCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvc2VjdXIuaD4KKworX1hGVU5DUFJPVE9CRUdJTgorCitTdGF0dXMgWFNlY3VyaXR5UXVlcnlFeHRlbnNpb24gKAorICAgIERpc3BsYXkgKmRweSwKKyAgICBpbnQgKm1ham9yX3ZlcnNpb25fcmV0dXJuLAorICAgIGludCAqbWlub3JfdmVyc2lvbl9yZXR1cm4pOworCitYYXV0aCAqWFNlY3VyaXR5QWxsb2NYYXV0aCh2b2lkKTsKKwordm9pZCBYU2VjdXJpdHlGcmVlWGF1dGgoWGF1dGggKmF1dGgpOworCisvKiB0eXBlIGZvciByZXR1cm5lZCBhdXRoIGlkcyAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFhTZWN1cml0eUF1dGhvcml6YXRpb247CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgdGltZW91dDsKKyAgICB1bnNpZ25lZCBpbnQgdHJ1c3RfbGV2ZWw7CisgICAgWElEICAgICAgICAgIGdyb3VwOworICAgIGxvbmcJIGV2ZW50X21hc2s7Cit9IFhTZWN1cml0eUF1dGhvcml6YXRpb25BdHRyaWJ1dGVzOworCitYYXV0aCAqWFNlY3VyaXR5R2VuZXJhdGVBdXRob3JpemF0aW9uKAorICAgIERpc3BsYXkgKmRweSwKKyAgICBYYXV0aCAqYXV0aF9pbiwKKyAgICB1bnNpZ25lZCBsb25nIHZhbHVlbWFzaywKKyAgICBYU2VjdXJpdHlBdXRob3JpemF0aW9uQXR0cmlidXRlcyAqYXR0cmlidXRlcywKKyAgICBYU2VjdXJpdHlBdXRob3JpemF0aW9uICphdXRoX2lkX3JldHVybik7CisKK1N0YXR1cyBYU2VjdXJpdHlSZXZva2VBdXRob3JpemF0aW9uKAorICAgIERpc3BsYXkgKmRweSwKKyAgICBYU2VjdXJpdHlBdXRob3JpemF0aW9uIGF1dGhfaWQpOworCitfWEZVTkNQUk9UT0VORAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHR5cGU7CQkgICAgICAvKiBldmVudCBiYXNlICsgWFNlY3VyaXR5QXV0aG9yaXphdGlvblJldm9rZWQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsgICAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sIHNlbmRfZXZlbnQ7CSAgICAgIC8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CSAgICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBYU2VjdXJpdHlBdXRob3JpemF0aW9uIGF1dGhfaWQ7IC8qIHJldm9rZWQgYXV0aG9yaXphdGlvbiBpZCAqLworfSBYU2VjdXJpdHlBdXRob3JpemF0aW9uUmV2b2tlZEV2ZW50OworCisjZW5kaWYgLyogX1NFQ1VSSVRZX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2hhcGUuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc2hhcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTkyZjdhCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy9zaGFwZS5oCkBAIC0wLDAgKzEsMTU1IEBACisvKiAkWEZyZWU4NjogeGMvaW5jbHVkZS9leHRlbnNpb25zL3NoYXBlLmgsdiAxLjMgMjAwMS8xMi8xNCAxOTo1MzoyOSBkYXdlcyBFeHAgJCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitDb3B5cmlnaHQgMTk4OSwgMTk5OCAgVGhlIE9wZW4gR3JvdXAKKworUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAordGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Citjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCitkb2N1bWVudGF0aW9uLgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK09QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCitBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKworRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlCit1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MKK2luIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSBUaGUgT3BlbiBHcm91cC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICRYb3JnOiBzaGFwZS5oLHYgMS40IDIwMDEvMDIvMDkgMDI6MDM6MjQgeG9yZ2N2cyBFeHAgJCAqLworCisjaWZuZGVmIF9TSEFQRV9IXworI2RlZmluZSBfU0hBUEVfSF8KKworI2luY2x1ZGUgPFgxMS9YZnVuY3Byb3RvLmg+CisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvc2hhcGVjb25zdC5oPgorCisjaWZuZGVmIF9TSEFQRV9TRVJWRVJfCisjaW5jbHVkZSA8WDExL1h1dGlsLmg+CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQJdHlwZTsJCSAgICAvKiBvZiBldmVudCAqLworICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsOyAgIC8qICMgb2YgbGFzdCByZXF1ZXN0IHByb2Nlc3NlZCBieSBzZXJ2ZXIgKi8KKyAgICBCb29sIHNlbmRfZXZlbnQ7CSAgICAvKiB0cnVlIGlmIHRoaXMgY2FtZSBmcm9tZSBhIFNlbmRFdmVudCByZXF1ZXN0ICovCisgICAgRGlzcGxheSAqZGlzcGxheTsJICAgIC8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBXaW5kb3cgd2luZG93OwkgICAgLyogd2luZG93IG9mIGV2ZW50ICovCisgICAgaW50IGtpbmQ7CQkgICAgLyogU2hhcGVCb3VuZGluZyBvciBTaGFwZUNsaXAgKi8KKyAgICBpbnQgeCwgeTsJCSAgICAvKiBleHRlbnRzIG9mIG5ldyByZWdpb24gKi8KKyAgICB1bnNpZ25lZCB3aWR0aCwgaGVpZ2h0OworICAgIFRpbWUgdGltZTsJCSAgICAvKiBzZXJ2ZXIgdGltZXN0YW1wIHdoZW4gcmVnaW9uIGNoYW5nZWQgKi8KKyAgICBCb29sIHNoYXBlZDsJICAgIC8qIHRydWUgaWYgdGhlIHJlZ2lvbiBleGlzdHMgKi8KK30gWFNoYXBlRXZlbnQ7CisKK19YRlVOQ1BST1RPQkVHSU4KKworZXh0ZXJuIEJvb2wgWFNoYXBlUXVlcnlFeHRlbnNpb24gKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgaW50KgkvKiBldmVudF9iYXNlICovLAorICAgIGludCoJLyogZXJyb3JfYmFzZSAqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU2hhcGVRdWVyeVZlcnNpb24gKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgaW50KgkvKiBtYWpvcl92ZXJzaW9uICovLAorICAgIGludCoJLyogbWlub3JfdmVyc2lvbiAqLworKTsKKworZXh0ZXJuIHZvaWQgWFNoYXBlQ29tYmluZVJlZ2lvbiAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJLyogZGVzdCAqLywKKyAgICBpbnQJCS8qIGRlc3Rfa2luZCAqLywKKyAgICBpbnQJCS8qIHhfb2ZmICovLAorICAgIGludAkJLyogeV9vZmYgKi8sCisgICAgUmVnaW9uCS8qIHJlZ2lvbiAqLywKKyAgICBpbnQJCS8qIG9wICovCispOworCitleHRlcm4gdm9pZCBYU2hhcGVDb21iaW5lUmVjdGFuZ2xlcyAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJLyogZGVzdCAqLywKKyAgICBpbnQJCS8qIGRlc3Rfa2luZCAqLywKKyAgICBpbnQJCS8qIHhfb2ZmICovLAorICAgIGludAkJLyogeV9vZmYgKi8sCisgICAgWFJlY3RhbmdsZSoJLyogcmVjdGFuZ2xlcyAqLywKKyAgICBpbnQJCS8qIG5fcmVjdHMgKi8sCisgICAgaW50CQkvKiBvcCAqLywKKyAgICBpbnQJCS8qIG9yZGVyaW5nICovCispOworCitleHRlcm4gdm9pZCBYU2hhcGVDb21iaW5lTWFzayAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJLyogZGVzdCAqLywKKyAgICBpbnQJCS8qIGRlc3Rfa2luZCAqLywKKyAgICBpbnQJCS8qIHhfb2ZmICovLAorICAgIGludAkJLyogeV9vZmYgKi8sCisgICAgUGl4bWFwCS8qIHNyYyAqLywKKyAgICBpbnQJCS8qIG9wICovCispOworCitleHRlcm4gdm9pZCBYU2hhcGVDb21iaW5lU2hhcGUgKAorICAgIERpc3BsYXkqCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CS8qIGRlc3QgKi8sCisgICAgaW50CQkvKiBkZXN0X2tpbmQgKi8sCisgICAgaW50CQkvKiB4X29mZiAqLywKKyAgICBpbnQJCS8qIHlfb2ZmICovLAorICAgIFdpbmRvdwkvKiBzcmMgKi8sCisgICAgaW50CQkvKiBzcmNfa2luZCAqLywKKyAgICBpbnQJCS8qIG9wICovCispOworCitleHRlcm4gdm9pZCBYU2hhcGVPZmZzZXRTaGFwZSAoCisgICAgRGlzcGxheSoJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJLyogZGVzdCAqLywKKyAgICBpbnQJCS8qIGRlc3Rfa2luZCAqLywKKyAgICBpbnQJCS8qIHhfb2ZmICovLAorICAgIGludAkJLyogeV9vZmYgKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFNoYXBlUXVlcnlFeHRlbnRzICgKKyAgICBEaXNwbGF5KgkJLyogZGlzcGxheSAqLywKKyAgICBXaW5kb3cJCS8qIHdpbmRvdyAqLywKKyAgICBCb29sKgkJLyogYm91bmRpbmdfc2hhcGVkICovLAorICAgIGludCoJCS8qIHhfYm91bmRpbmcgKi8sCisgICAgaW50KgkJLyogeV9ib3VuZGluZyAqLywKKyAgICB1bnNpZ25lZCBpbnQqCS8qIHdfYm91bmRpbmcgKi8sCisgICAgdW5zaWduZWQgaW50KgkvKiBoX2JvdW5kaW5nICovLAorICAgIEJvb2wqCQkvKiBjbGlwX3NoYXBlZCAqLywKKyAgICBpbnQqCQkvKiB4X2NsaXAgKi8sCisgICAgaW50KgkJLyogeV9jbGlwICovLAorICAgIHVuc2lnbmVkIGludCoJLyogd19jbGlwICovLAorICAgIHVuc2lnbmVkIGludCoJLyogaF9jbGlwICovCispOworCitleHRlcm4gdm9pZCBYU2hhcGVTZWxlY3RJbnB1dCAoCisgICAgRGlzcGxheSoJCS8qIGRpc3BsYXkgKi8sCisgICAgV2luZG93CQkvKiB3aW5kb3cgKi8sCisgICAgdW5zaWduZWQgbG9uZwkvKiBtYXNrICovCispOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBYU2hhcGVJbnB1dFNlbGVjdGVkICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkvKiB3aW5kb3cgKi8KKyk7CisKK2V4dGVybiBYUmVjdGFuZ2xlICpYU2hhcGVHZXRSZWN0YW5nbGVzICgKKyAgICBEaXNwbGF5KgkvKiBkaXNwbGF5ICovLAorICAgIFdpbmRvdwkvKiB3aW5kb3cgKi8sCisgICAgaW50CQkvKiBraW5kICovLAorICAgIGludCoJLyogY291bnQgKi8sCisgICAgaW50KgkvKiBvcmRlcmluZyAqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qICFfU0hBUEVfU0VSVkVSXyAqLworCisjZW5kaWYgLyogX1NIQVBFX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3N5bmMuaCBiL3N5c3Jvb3QvdXNyL2luY2x1ZGUvWDExL2V4dGVuc2lvbnMvc3luYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZTIyMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3N5bmMuaApAQCAtMCwwICsxLDMzOCBAQAorLyogJFhvcmc6IHN5bmMuaCx2IDEuNCAyMDAxLzAyLzA5IDAyOjAzOjI0IHhvcmdjdnMgRXhwICQgKi8KKy8qCisKK0NvcHlyaWdodCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAxOTkxLDE5OTMgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sIE1heW5hcmQsIE1hc3NhY2h1c2V0dHMsCithbmQgT2xpdmV0dGkgUmVzZWFyY2ggTGltaXRlZCwgQ2FtYnJpZGdlLCBFbmdsYW5kLgorCisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCitwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Citib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lcyBvZiBEaWdpdGFsIG9yIE9saXZldHRpCitub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICAKKworRElHSVRBTCBBTkQgT0xJVkVUVEkgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUworU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKK0ZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRIRVkgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKK1VTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogJFhGcmVlODY6IHhjL2luY2x1ZGUvZXh0ZW5zaW9ucy9zeW5jLmgsdiAxLjQgMjAwMS8xMi8yMCAxOTo0MDo1OSB0c2kgRXhwICQgKi8KKworI2lmbmRlZiBfU1lOQ19IXworI2RlZmluZSBfU1lOQ19IXworCisjaW5jbHVkZSA8WDExL1hmdW5jcHJvdG8uaD4KKyNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9zeW5jY29uc3QuaD4KKworX1hGVU5DUFJPVE9CRUdJTgorLyogZ2V0IHJpZCBvZiBtYWNyb3Mgc28gd2UgY2FuIGRlZmluZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9ucyAqLworI3VuZGVmIFhTeW5jSW50VG9WYWx1ZQorI3VuZGVmIFhTeW5jSW50c1RvVmFsdWUKKyN1bmRlZiBYU3luY1ZhbHVlR3JlYXRlclRoYW4KKyN1bmRlZiBYU3luY1ZhbHVlTGVzc1RoYW4KKyN1bmRlZiBYU3luY1ZhbHVlR3JlYXRlck9yRXF1YWwKKyN1bmRlZiBYU3luY1ZhbHVlTGVzc09yRXF1YWwKKyN1bmRlZiBYU3luY1ZhbHVlRXF1YWwKKyN1bmRlZiBYU3luY1ZhbHVlSXNOZWdhdGl2ZQorI3VuZGVmIFhTeW5jVmFsdWVJc1plcm8KKyN1bmRlZiBYU3luY1ZhbHVlSXNQb3NpdGl2ZQorI3VuZGVmIFhTeW5jVmFsdWVMb3czMgorI3VuZGVmIFhTeW5jVmFsdWVIaWdoMzIKKyN1bmRlZiBYU3luY1ZhbHVlQWRkCisjdW5kZWYgWFN5bmNWYWx1ZVN1YnRyYWN0CisjdW5kZWYgWFN5bmNNYXhWYWx1ZQorI3VuZGVmIFhTeW5jTWluVmFsdWUKKworZXh0ZXJuIHZvaWQgWFN5bmNJbnRUb1ZhbHVlKAorICAgIFhTeW5jVmFsdWUqIC8qcHYqLywKKyAgICBpbnQgLyppKi8KKyk7CisKK2V4dGVybiB2b2lkIFhTeW5jSW50c1RvVmFsdWUoCisgICAgWFN5bmNWYWx1ZSogLypwdiovLAorICAgIHVuc2lnbmVkIGludCAvKmwqLywKKyAgICBpbnQgLypoKi8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jVmFsdWVHcmVhdGVyVGhhbigKKyAgICBYU3luY1ZhbHVlIC8qYSovLAorICAgIFhTeW5jVmFsdWUgLypiKi8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jVmFsdWVMZXNzVGhhbigKKyAgICBYU3luY1ZhbHVlIC8qYSovLAorICAgIFhTeW5jVmFsdWUgLypiKi8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jVmFsdWVHcmVhdGVyT3JFcXVhbCgKKyAgICBYU3luY1ZhbHVlIC8qYSovLAorICAgIFhTeW5jVmFsdWUgLypiKi8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jVmFsdWVMZXNzT3JFcXVhbCgKKyAgICBYU3luY1ZhbHVlIC8qYSovLAorICAgIFhTeW5jVmFsdWUgLypiKi8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jVmFsdWVFcXVhbCgKKyAgICBYU3luY1ZhbHVlIC8qYSovLAorICAgIFhTeW5jVmFsdWUgLypiKi8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jVmFsdWVJc05lZ2F0aXZlKAorICAgIFhTeW5jVmFsdWUgLyp2Ki8KKyk7CisKK2V4dGVybiBCb29sIFhTeW5jVmFsdWVJc1plcm8oCisgICAgWFN5bmNWYWx1ZSAvKmEqLworKTsKKworZXh0ZXJuIEJvb2wgWFN5bmNWYWx1ZUlzUG9zaXRpdmUoCisgICAgWFN5bmNWYWx1ZSAvKnYqLworKTsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBYU3luY1ZhbHVlTG93MzIoCisgICAgWFN5bmNWYWx1ZSAvKnYqLworKTsKKworZXh0ZXJuIGludCBYU3luY1ZhbHVlSGlnaDMyKAorICAgIFhTeW5jVmFsdWUgLyp2Ki8KKyk7CisKK2V4dGVybiB2b2lkIFhTeW5jVmFsdWVBZGQoCisgICAgWFN5bmNWYWx1ZSogLypwcmVzdWx0Ki8sCisgICAgWFN5bmNWYWx1ZSAvKmEqLywKKyAgICBYU3luY1ZhbHVlIC8qYiovLAorICAgIGludCogLypwb3ZlcmZsb3cqLworKTsKKworZXh0ZXJuIHZvaWQgWFN5bmNWYWx1ZVN1YnRyYWN0KAorICAgIFhTeW5jVmFsdWUqIC8qcHJlc3VsdCovLAorICAgIFhTeW5jVmFsdWUgLyphKi8sCisgICAgWFN5bmNWYWx1ZSAvKmIqLywKKyAgICBpbnQqIC8qcG92ZXJmbG93Ki8KKyk7CisKK2V4dGVybiB2b2lkIFhTeW5jTWF4VmFsdWUoCisgICAgWFN5bmNWYWx1ZSogLypwdiovCispOworCitleHRlcm4gdm9pZCBYU3luY01pblZhbHVlKAorICAgIFhTeW5jVmFsdWUqIC8qcHYqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworCit0eXBlZGVmIHN0cnVjdCBfWFN5bmNTeXN0ZW1Db3VudGVyIHsKKyAgICBjaGFyICpuYW1lOwkJCS8qIG51bGwtdGVybWluYXRlZCBuYW1lIG9mIHN5c3RlbSBjb3VudGVyICovCisgICAgWFN5bmNDb3VudGVyIGNvdW50ZXI7CS8qIGNvdW50ZXIgaWQgb2YgdGhpcyBzeXN0ZW0gY291bnRlciAqLworICAgIFhTeW5jVmFsdWUgcmVzb2x1dGlvbjsJLyogcmVzb2x1dGlvbiBvZiB0aGlzIHN5c3RlbSBjb3VudGVyICovCit9IFhTeW5jU3lzdGVtQ291bnRlcjsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgWFN5bmNDb3VudGVyIGNvdW50ZXI7CS8qIGNvdW50ZXIgdG8gdHJpZ2dlciBvbiAqLworICAgIFhTeW5jVmFsdWVUeXBlIHZhbHVlX3R5cGU7CS8qIGFic29sdXRlL3JlbGF0aXZlICovCisgICAgWFN5bmNWYWx1ZSB3YWl0X3ZhbHVlOwkvKiB2YWx1ZSB0byBjb21wYXJlIGNvdW50ZXIgdG8gKi8KKyAgICBYU3luY1Rlc3RUeXBlIHRlc3RfdHlwZTsJLyogcG9zL25lZyBjb21wYXJpc29uL3RyYW5zdGlvbiAqLworfSBYU3luY1RyaWdnZXI7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBYU3luY1RyaWdnZXIgdHJpZ2dlcjsJLyogdHJpZ2dlciBmb3IgYXdhaXQgKi8KKyAgICBYU3luY1ZhbHVlIGV2ZW50X3RocmVzaG9sZDsgLyogc2VuZCBldmVudCBpZiBwYXN0IHRocmVzaG9sZCAqLworfSBYU3luY1dhaXRDb25kaXRpb247CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFhTeW5jVHJpZ2dlciB0cmlnZ2VyOworICAgIFhTeW5jVmFsdWUgIGRlbHRhOworICAgIEJvb2wgZXZlbnRzOworICAgIFhTeW5jQWxhcm1TdGF0ZSBzdGF0ZTsKK30gWFN5bmNBbGFybUF0dHJpYnV0ZXM7CisKKy8qCisgKiAgRXZlbnRzCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB0eXBlOwkJCS8qIGV2ZW50IGJhc2UgKyBYU3luY0NvdW50ZXJOb3RpZnkgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgc2VuZF9ldmVudDsJCS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CQkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgWFN5bmNDb3VudGVyIGNvdW50ZXI7CS8qIGNvdW50ZXIgaW52b2x2ZWQgaW4gYXdhaXQgKi8KKyAgICBYU3luY1ZhbHVlIHdhaXRfdmFsdWU7CS8qIHZhbHVlIGJlaW5nIHdhaXRlZCBmb3IgKi8KKyAgICBYU3luY1ZhbHVlIGNvdW50ZXJfdmFsdWU7CS8qIGNvdW50ZXIgdmFsdWUgd2hlbiB0aGlzIGV2ZW50IHdhcyBzZW50ICovCisgICAgVGltZSB0aW1lOwkJCS8qIG1pbGxpc2Vjb25kcyAqLworICAgIGludCBjb3VudDsJCQkvKiBob3cgbWFueSBtb3JlIGV2ZW50cyB0byBjb21lICovCisgICAgQm9vbCBkZXN0cm95ZWQ7CQkvKiBUcnVlIGlmIGNvdW50ZXIgd2FzIGRlc3Ryb3llZCAqLworfSBYU3luY0NvdW50ZXJOb3RpZnlFdmVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB0eXBlOwkJCS8qIGV2ZW50IGJhc2UgKyBYU3luY0NvdW50ZXJOb3RpZnkgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogIyBvZiBsYXN0IHJlcXVlc3QgcHJvY2Vzc2VkIGJ5IHNlcnZlciAqLworICAgIEJvb2wgc2VuZF9ldmVudDsJCS8qIHRydWUgaWYgdGhpcyBjYW1lIGZyb20gYSBTZW5kRXZlbnQgcmVxdWVzdCAqLworICAgIERpc3BsYXkgKmRpc3BsYXk7CQkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgWFN5bmNBbGFybSBhbGFybTsJCS8qIGFsYXJtIHRoYXQgdHJpZ2dlcmVkICovCisgICAgWFN5bmNWYWx1ZSBjb3VudGVyX3ZhbHVlOwkvKiB2YWx1ZSB0aGF0IHRyaWdnZXJlZCB0aGUgYWxhcm0gKi8KKyAgICBYU3luY1ZhbHVlIGFsYXJtX3ZhbHVlOwkvKiB0ZXN0ICB2YWx1ZSBvZiB0cmlnZ2VyIGluIGFsYXJtICovCisgICAgVGltZSB0aW1lOwkJCS8qIG1pbGxpc2Vjb25kcyAqLworICAgIFhTeW5jQWxhcm1TdGF0ZSBzdGF0ZTsJLyogbmV3IHN0YXRlIG9mIGFsYXJtICovCit9IFhTeW5jQWxhcm1Ob3RpZnlFdmVudDsKKworLyoKKyAqICBFcnJvcnMgCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB0eXBlOwkJCQorICAgIERpc3BsYXkgKmRpc3BsYXk7CQkvKiBEaXNwbGF5IHRoZSBldmVudCB3YXMgcmVhZCBmcm9tICovCisgICAgWFN5bmNBbGFybSBhbGFybTsJCS8qIHJlc291cmNlIGlkICovCisgICAgdW5zaWduZWQgbG9uZyBzZXJpYWw7CS8qIHNlcmlhbCBudW1iZXIgb2YgZmFpbGVkIHJlcXVlc3QgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGVycm9yX2NvZGU7CS8qIGVycm9yIGJhc2UgKyBYU3luY0JhZEFsYXJtICovCisgICAgdW5zaWduZWQgY2hhciByZXF1ZXN0X2NvZGU7CS8qIE1ham9yIG9wLWNvZGUgb2YgZmFpbGVkIHJlcXVlc3QgKi8KKyAgICB1bnNpZ25lZCBjaGFyIG1pbm9yX2NvZGU7CS8qIE1pbm9yIG9wLWNvZGUgb2YgZmFpbGVkIHJlcXVlc3QgKi8KK30gWFN5bmNBbGFybUVycm9yOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHR5cGU7CQkJCisgICAgRGlzcGxheSAqZGlzcGxheTsJCS8qIERpc3BsYXkgdGhlIGV2ZW50IHdhcyByZWFkIGZyb20gKi8KKyAgICBYU3luY0NvdW50ZXIgY291bnRlcjsJLyogcmVzb3VyY2UgaWQgKi8KKyAgICB1bnNpZ25lZCBsb25nIHNlcmlhbDsJLyogc2VyaWFsIG51bWJlciBvZiBmYWlsZWQgcmVxdWVzdCAqLworICAgIHVuc2lnbmVkIGNoYXIgZXJyb3JfY29kZTsJLyogZXJyb3IgYmFzZSArIFhTeW5jQmFkQ291bnRlciAqLworICAgIHVuc2lnbmVkIGNoYXIgcmVxdWVzdF9jb2RlOwkvKiBNYWpvciBvcC1jb2RlIG9mIGZhaWxlZCByZXF1ZXN0ICovCisgICAgdW5zaWduZWQgY2hhciBtaW5vcl9jb2RlOwkvKiBNaW5vciBvcC1jb2RlIG9mIGZhaWxlZCByZXF1ZXN0ICovCit9IFhTeW5jQ291bnRlckVycm9yOworCisvKiAKKyAqICBQcm90b3R5cGVzCisgKi8KKworX1hGVU5DUFJPVE9CRUdJTgorCitleHRlcm4gU3RhdHVzIFhTeW5jUXVlcnlFeHRlbnNpb24oCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBpbnQqIC8qZXZlbnRfYmFzZV9yZXR1cm4qLywKKyAgICBpbnQqIC8qZXJyb3JfYmFzZV9yZXR1cm4qLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU3luY0luaXRpYWxpemUoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBpbnQqIC8qbWFqb3JfdmVyc2lvbl9yZXR1cm4qLywKKyAgICBpbnQqIC8qbWlub3JfdmVyc2lvbl9yZXR1cm4qLworKTsKKworZXh0ZXJuIFhTeW5jU3lzdGVtQ291bnRlciAqWFN5bmNMaXN0U3lzdGVtQ291bnRlcnMoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBpbnQqIC8qbl9jb3VudGVyc19yZXR1cm4qLworKTsKKworZXh0ZXJuIHZvaWQgWFN5bmNGcmVlU3lzdGVtQ291bnRlckxpc3QoCisgICAgWFN5bmNTeXN0ZW1Db3VudGVyKiAvKmxpc3QqLworKTsKKworZXh0ZXJuIFhTeW5jQ291bnRlciBYU3luY0NyZWF0ZUNvdW50ZXIoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYU3luY1ZhbHVlIC8qaW5pdGlhbF92YWx1ZSovCispOworCitleHRlcm4gU3RhdHVzIFhTeW5jU2V0Q291bnRlcigKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIFhTeW5jQ291bnRlciAvKmNvdW50ZXIqLywKKyAgICBYU3luY1ZhbHVlIC8qdmFsdWUqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU3luY0NoYW5nZUNvdW50ZXIoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYU3luY0NvdW50ZXIgLypjb3VudGVyKi8sCisgICAgWFN5bmNWYWx1ZSAvKnZhbHVlKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFN5bmNEZXN0cm95Q291bnRlcigKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIFhTeW5jQ291bnRlciAvKmNvdW50ZXIqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU3luY1F1ZXJ5Q291bnRlcigKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIFhTeW5jQ291bnRlciAvKmNvdW50ZXIqLywKKyAgICBYU3luY1ZhbHVlKiAvKnZhbHVlX3JldHVybiovCispOworCitleHRlcm4gU3RhdHVzIFhTeW5jQXdhaXQoCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICBYU3luY1dhaXRDb25kaXRpb24qIC8qd2FpdF9saXN0Ki8sCisgICAgaW50IC8qbl9jb25kaXRpb25zKi8KKyk7CisKK2V4dGVybiBYU3luY0FsYXJtIFhTeW5jQ3JlYXRlQWxhcm0oCisgICAgRGlzcGxheSogLypkcHkqLywKKyAgICB1bnNpZ25lZCBsb25nIC8qdmFsdWVzX21hc2sqLywKKyAgICBYU3luY0FsYXJtQXR0cmlidXRlcyogLyp2YWx1ZXMqLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU3luY0Rlc3Ryb3lBbGFybSgKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIFhTeW5jQWxhcm0gLyphbGFybSovCispOworCitleHRlcm4gU3RhdHVzIFhTeW5jUXVlcnlBbGFybSgKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIFhTeW5jQWxhcm0gLyphbGFybSovLAorICAgIFhTeW5jQWxhcm1BdHRyaWJ1dGVzKiAvKnZhbHVlc19yZXR1cm4qLworKTsKKworZXh0ZXJuIFN0YXR1cyBYU3luY0NoYW5nZUFsYXJtKAorICAgIERpc3BsYXkqIC8qZHB5Ki8sCisgICAgWFN5bmNBbGFybSAvKmFsYXJtKi8sCisgICAgdW5zaWduZWQgbG9uZyAvKnZhbHVlc19tYXNrKi8sCisgICAgWFN5bmNBbGFybUF0dHJpYnV0ZXMqIC8qdmFsdWVzKi8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFN5bmNTZXRQcmlvcml0eSgKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIFhJRCAvKmNsaWVudF9yZXNvdXJjZV9pZCovLAorICAgIGludCAvKnByaW9yaXR5Ki8KKyk7CisKK2V4dGVybiBTdGF0dXMgWFN5bmNHZXRQcmlvcml0eSgKKyAgICBEaXNwbGF5KiAvKmRweSovLAorICAgIFhJRCAvKmNsaWVudF9yZXNvdXJjZV9pZCovLAorICAgIGludCogLypyZXR1cm5fcHJpb3JpdHkqLworKTsKKworX1hGVU5DUFJPVE9FTkQKKworI2VuZGlmIC8qIF9TWU5DX0hfICovCmRpZmYgLS1naXQgYS9zeXNyb290L3Vzci9pbmNsdWRlL1gxMS9leHRlbnNpb25zL3h0ZXN0ZXh0MS5oIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy94dGVzdGV4dDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWRjZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvaW5jbHVkZS9YMTEvZXh0ZW5zaW9ucy94dGVzdGV4dDEuaApAQCAtMCwwICsxLDg1IEBACisvKiAkWG9yZzogeHRlc3RleHQxLmgsdiAxLjQgMjAwMS8wMi8wOSAwMjowMzoyNCB4b3JnY3ZzIEV4cCAkICovCisvKgorICogeHRlc3RleHQxLmgKKyAqCisgKiBYMTEgSW5wdXQgU3ludGhlc2lzIEV4dGVuc2lvbiBpbmNsdWRlIGZpbGUKKyAqLworCisvKgorCisKK0NvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg4LCAxOTk4ICBUaGUgT3BlbiBHcm91cAorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0Cit0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKK2NvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKK2RvY3VtZW50YXRpb24uCisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCithbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorT1BFTiBHUk9VUCBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0FOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCitDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncworaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLgorCisKK0NvcHlyaWdodCAxOTg2LCAxOTg3LCAxOTg4IGJ5IEhld2xldHQtUGFja2FyZCBDb3Jwb3JhdGlvbgorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCitzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0CitmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodAorbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKK25vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgSGV3bGV0dC1QYWNrYXJkIG5vdCBiZSB1c2VkIGluCithZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCitzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisKK0hld2xldHQtUGFja2FyZCBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIAorc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAKKyJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisKK1RoaXMgc29mdHdhcmUgaXMgbm90IHN1YmplY3QgdG8gYW55IGxpY2Vuc2Ugb2YgdGhlIEFtZXJpY2FuCitUZWxlcGhvbmUgYW5kIFRlbGVncmFwaCBDb21wYW55IG9yIG9mIHRoZSBSZWdlbnRzIG9mIHRoZQorVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorCisqLworCisjaWZuZGVmIF9YVEVTVEVYVDFfSAorI2RlZmluZSBfWFRFU1RFWFQxX0gKKy8qCisgKiB0aGUgdHlwZWRlZnMgZm9yIENBUkQ4LCBDQVJEMTYsIGFuZCBDQVJEMzIgYXJlIGRlZmluZWQgaW4gWG1kLmgKKyAqLworCisjaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMveHRlc3RleHQxY29uc3QuaD4KKy8qCisgKiBUaGlzIGlzIHRoZSBkZWZpbml0aW9uIGZvciB0aGUgaW5wdXQgYWN0aW9uIGhvc3QgZm9ybWF0IGV2ZW50IHN0cnVjdHVyZS4KKyAqIFRoaXMgaXMgdGhlIGZvcm0gdGhhdCBhIGNsaWVudCB1c2luZyB0aGlzIGV4dGVuc2lvbiB3aWxsIHNlZSB3aGVuCisgKiBpdCByZWNlaXZlcyBhbiBpbnB1dCBhY3Rpb24gZXZlbnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgaW50ICAgICB0eXBlOyAgICAgICAgICAgLyogYWx3YXlzIFhUZXN0SW5wdXRBY3Rpb25UeXBlICovCisJRGlzcGxheSAqZGlzcGxheTsKKwlXaW5kb3cgIHdpbmRvdzsKKyAgICAgICAgQ0FSRDggICBhY3Rpb25zW1hUZXN0QUNUSU9OU19TSVpFXTsKK30gWFRlc3RJbnB1dEFjdGlvbkV2ZW50OworCisvKgorICogVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiBmb3IgdGhlIHhUZXN0RmFrZUFjayBob3N0IGZvcm1hdCBldmVudCBzdHJ1Y3R1cmUuCisgKiBUaGlzIGlzIHRoZSBmb3JtIHRoYXQgYSBjbGllbnQgdXNpbmcgdGhpcyBleHRlbnNpb24gd2lsbCBzZWUgd2hlbgorICogaXQgcmVjZWl2ZXMgYW4gWFRlc3RGYWtlQWNrIGV2ZW50LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGludCAgICAgdHlwZTsgICAgICAgICAgIC8qIGFsd2F5cyBYVGVzdEZha2VBY2tUeXBlICovCisJRGlzcGxheSAqZGlzcGxheTsKKwlXaW5kb3cgIHdpbmRvdzsKK30gWFRlc3RGYWtlQWNrRXZlbnQ7CisKKyNlbmRpZiAvKiBfWFRFU1RFWFQxX0ggKi8KZGlmZiAtLWdpdCBhL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcveGV4dC5wYyBiL3N5c3Jvb3QvdXNyL2xpYi9wa2djb25maWcveGV4dC5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGQxMWRjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZy94ZXh0LnBjCkBAIC0wLDAgKzEsMTIgQEAKK3ByZWZpeD0vdXNyCitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke2V4ZWNfcHJlZml4fS9saWIKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworTmFtZTogWGV4dAorRGVzY3JpcHRpb246IE1pc2MgWCBFeHRlbnNpb24gTGlicmFyeQorVmVyc2lvbjogMS4xLjEKK1JlcXVpcmVzOiB4ZXh0cHJvdG8KK1JlcXVpcmVzLnByaXZhdGU6IHgxMQorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sWGV4dApkaWZmIC0tZ2l0IGEvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3hleHQucGMgYi9zeXNyb290L3Vzci9saWIzMi9wa2djb25maWcveGV4dC5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGQxMWRjCi0tLSAvZGV2L251bGwKKysrIGIvc3lzcm9vdC91c3IvbGliMzIvcGtnY29uZmlnL3hleHQucGMKQEAgLTAsMCArMSwxMiBAQAorcHJlZml4PS91c3IKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7ZXhlY19wcmVmaXh9L2xpYgoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiBYZXh0CitEZXNjcmlwdGlvbjogTWlzYyBYIEV4dGVuc2lvbiBMaWJyYXJ5CitWZXJzaW9uOiAxLjEuMQorUmVxdWlyZXM6IHhleHRwcm90bworUmVxdWlyZXMucHJpdmF0ZTogeDExCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQorTGliczogLUwke2xpYmRpcn0gLWxYZXh0Cg==