ZGlmZiAtLWdpdCBhL2hscnN5bmMvaGxyc3luYy5weSBiL2hscnN5bmMvaGxyc3luYy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNGE0OTU1Ci0tLSAvZGV2L251bGwKKysrIGIvaGxyc3luYy9obHJzeW5jLnB5CkBAIC0wLDAgKzEsMTI1IEBACisjIS91c3IvYmluL3B5dGhvbjIuNQorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CisKK2Zyb20gcHlzcWxpdGUyIGltcG9ydCBkYmFwaTIgYXMgc3FsaXRlMworaW1wb3J0IHN5cworCitobHIgPSBzcWxpdGUzLmNvbm5lY3Qoc3lzLmFyZ3ZbMV0pCit3ZWIgPSBzcWxpdGUzLmNvbm5lY3Qoc3lzLmFyZ3ZbMl0pCisKKyMgc3dpdGNoIHRvIGF1dG9jb21taXQKK2hsci5pc29sYXRpb25fbGV2ZWwgPSBOb25lCit3ZWIuaXNvbGF0aW9uX2xldmVsID0gTm9uZQorCitobHIucm93X2ZhY3RvcnkgPSBzcWxpdGUzLlJvdword2ViLnJvd19mYWN0b3J5ID0gc3FsaXRlMy5Sb3cKKword2l0aCBobHI6CisJaGxyX3N1YnNjcnMgPSBobHIuZXhlY3V0ZSgiIiIKKwkJU0VMRUNUICogRlJPTSBTdWJzY3JpYmVyCisJIiIiKS5mZXRjaGFsbCgpCisJaGxyX3Rva2VucyA9IGhsci5leGVjdXRlKCIiIgorCQlTRUxFQ1QgKiBGUk9NIEF1dGhUb2tlbgorCSIiIikuZmV0Y2hhbGwoKQorCit3aXRoIHdlYjoKKwl3ZWJfdG9rZW5zID0gd2ViLmV4ZWN1dGUoIiIiCisJCVNFTEVDVCAqIEZST00gcmVnX3Rva2VucworCSIiIikuZmV0Y2hhbGwoKQorCXdlYl9zbXMgPSB3ZWIuZXhlY3V0ZSgiIiIKKwkJU0VMRUNUICogRlJPTSBzbXNfcXVldWUKKwkiIiIpLmZldGNoYWxsKCkKKworIyBpbmRleCBieSBzdWJzY3IgaWQKK2hscl9zdWJzY3JzX2J5X2lkID0ge30KK2hscl9zdWJzY3JzX2J5X2V4dCA9IHt9CitobHJfdG9rZW5zX2J5X3N1YnNjcl9pZCA9IHt9Citmb3IgeCBpbiBobHJfc3Vic2NyczoKKwlobHJfc3Vic2Nyc19ieV9pZFt4WydpZCddXSA9IHgKKwlobHJfc3Vic2Nyc19ieV9leHRbeFsnZXh0ZW5zaW9uJ11dID0geAorZGVsIGhscl9zdWJzY3JzCitmb3IgeCBpbiBobHJfdG9rZW5zOgorCWhscl90b2tlbnNfYnlfc3Vic2NyX2lkW3hbJ3N1YnNjcmliZXJfaWQnXV0gPSB4CitkZWwgaGxyX3Rva2VucworCit3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZCA9IHt9Citmb3IgeCBpbiB3ZWJfdG9rZW5zOgorCXdlYl90b2tlbnNfYnlfc3Vic2NyX2lkW3hbJ3N1YnNjcmliZXJfaWQnXV0gPSB4CitkZWwgd2ViX3Rva2VucworCisjIHJlbW92ZSBsZWZ0b3ZlciB3ZWJfdG9rZW5zIGFuZCBjb3JyZWN0IGluY29uc2lzdGVudCBmaWVsZHMKK3dpdGggd2ViOgorCWZvciB4IGluIHdlYl90b2tlbnNfYnlfc3Vic2NyX2lkLnZhbHVlcygpOgorCQlzdWJzY3IgPSBobHJfc3Vic2Nyc19ieV9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiBzdWJzY3IgaXMgTm9uZToKKwkJCXdlYi5leGVjdXRlKCIiIgorCQkJCSAgICAgIERFTEVURSBGUk9NIHJlZ190b2tlbnMgV0hFUkUgc3Vic2NyaWJlcl9pZCA9ID8KKwkJCQkgICAiIiIsICh4WydzdWJzY3JpYmVyX2lkJ10sKSkKKwkJCWRlbCB3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZFt4WydzdWJzY3JpYmVyX2lkJ11dCisJCQljb250aW51ZQorCQlpZiBzdHIoeFsnaW1zaSddKSAhPSBzdHIoc3Vic2NyWydpbXNpJ10pIG9yIFwKKwkJICAgeFsnZXh0ZW5zaW9uJ10gIT0gc3Vic2NyWydleHRlbnNpb24nXSBvciBcCisJCSAgIHhbJ3Rtc2knXSAhPSBzdWJzY3JbJ3Rtc2knXSBvciBcCisJCSAgIHhbJ2xhYyddICE9IHN1YnNjclsnbGFjJ106CisJCQl3ZWIuZXhlY3V0ZSgiIiIKKwkJCQkgICAgICBVUERBVEUgcmVnX3Rva2VucworCQkJCSAgICAgIFNFVCBpbXNpID0gPywgZXh0ZW5zaW9uID0gPywgdG1zaSA9ID8sIGxhYyA9ID8KKwkJCQkgICAgICBXSEVSRSBzdWJzY3JpYmVyX2lkID0gPworCQkJCSAgICIiIiwgKHN0cihzdWJzY3JbJ2ltc2knXSksIHN1YnNjclsnZXh0ZW5zaW9uJ10sCisJCQkJICAgc3Vic2NyWyd0bXNpJ10sIHN1YnNjclsnbGFjJ10sIHhbJ3N1YnNjcmliZXJfaWQnXSkpCisKKyMgYWRkIG1pc3Npbmcgd2ViX3Rva2Vucword2l0aCB3ZWI6CisJZm9yIHggaW4gaGxyX3Rva2Vuc19ieV9zdWJzY3JfaWQudmFsdWVzKCk6CisJCXN1YnNjciA9IGhscl9zdWJzY3JzX2J5X2lkLmdldCh4WydzdWJzY3JpYmVyX2lkJ10sIE5vbmUpCisJCWlmIHN1YnNjciBpcyBOb25lOgorCQkJaGxyLmV4ZWN1dGUoIiIiCisJCQkJICAgICAgREVMRVRFIEZST00gQXV0aFRva2VuIFdIRVJFIHN1YnNjcmliZXJfaWQgPSA/CisJCQkJICAgIiIiLCAoeFsnc3Vic2NyaWJlcl9pZCddLCkpCisJCQlkZWwgaGxyX3Rva2Vuc19ieV9zdWJzY3JfaWRbeFsnc3Vic2NyaWJlcl9pZCddXQorCQkJY29udGludWUKKwkJd2VidG9rZW4gPSB3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiB3ZWJ0b2tlbiBpcyBOb25lOgorCQkJd2ViLmV4ZWN1dGUoIiIiCisJCQkJICAgICAgSU5TRVJUIElOVE8gcmVnX3Rva2VucworCQkJCSAgICAgIChzdWJzY3JpYmVyX2lkLCBleHRlbnNpb24sIHJlZ19jb21wbGV0ZWQsIG5hbWUsIGVtYWlsLCBsYWMsIGltc2ksIHRva2VuLCB0bXNpKQorCQkJCSAgICAgIFZBTFVFUworCQkJCSAgICAgICg/LCA/LCAwLCA/LCAnJywgPywgPywgPywgPykKKwkJCQkgICAiIiIsICh4WydzdWJzY3JpYmVyX2lkJ10sIHN1YnNjclsnZXh0ZW5zaW9uJ10sIHN1YnNjclsnbmFtZSddLAorCQkJCSAgIHN1YnNjclsnbGFjJ10sIHN0cihzdWJzY3JbJ2ltc2knXSksIHhbJ3Rva2VuJ10sIHN1YnNjclsndG1zaSddKSkKKworIyBhdXRob3JpemUgc3Vic2NyaWJlcnMKK3dpdGggaGxyOgorCWZvciB4IGluIHdlYl90b2tlbnNfYnlfc3Vic2NyX2lkLnZhbHVlcygpOgorCQlzdWJzY3IgPSBobHJfc3Vic2Nyc19ieV9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiB4WydyZWdfY29tcGxldGVkJ10gYW5kIG5vdCBzdWJzY3JbJ2F1dGhvcml6ZWQnXToKKwkJCWhsci5leGVjdXRlKCIiIgorCQkJCSAgICAgIFVQREFURSBTdWJzY3JpYmVyCisJCQkJICAgICAgU0VUIGF1dGhvcml6ZWQgPSAxCisJCQkJICAgICAgV0hFUkUgaWQgPSA/CisJCQkJICAgIiIiLCAoeFsnc3Vic2NyaWJlcl9pZCddLCkpCisKKyMgU3luYyBTTVMgZnJvbSB3ZWIgdG8gaGxyCit3aXRoIGhscjoKKwlmb3Igc21zIGluIHdlYl9zbXM6CisJCXN1YnNjciA9IGhscl9zdWJzY3JzX2J5X2V4dC5nZXQoc21zWydyZWNlaXZlcl9leHQnXSkKKwkJaWYgc3Vic2NyIGlzIE5vbmU6CisJCQlwcmludCAnJXMgbm90IGZvdW5kJyAlIHNtc1sncmVjZWl2ZXJfZXh0J10KKwkJCWNvbnRpbnVlCisJCWhsci5leGVjdXRlKCIiIgorCQkJCSAgICAgIElOU0VSVCBJTlRPIFNNUworCQkJCSAgICAgIChjcmVhdGVkLCBzZW5kZXJfaWQsIHJlY2VpdmVyX2lkLCByZXBseV9wYXRoX3JlcSwgc3RhdHVzX3JlcF9yZXEsIHByb3RvY29sX2lkLCBkYXRhX2NvZGluZ19zY2hlbWUsIHVkX2hkcl9pbmQsIHRleHQpCisJCQkJICAgICAgVkFMVUVTCisJCQkJICAgICAgKD8sIDEsID8sIDAsIDAsIDAsIDAsIDAsID8pCisJCQkJICAgIiIiLCAoc21zWydjcmVhdGVkJ10sIHN1YnNjclsnaWQnXSwgc21zWyd0ZXh0J10pKQord2l0aCB3ZWI6CisJZm9yIHNtcyBpbiB3ZWJfc21zOgorCQl3ZWIuZXhlY3V0ZSgiIiIKKwkJCQkgICAgICBERUxFVEUgRlJPTSBzbXNfcXVldWUgV0hFUkUgaWQgPSA/CisJCQkJICAgIiIiLCAoc21zWydpZCddLCkpCisKKworaGxyLmNsb3NlKCkKK3dlYi5jbG9zZSgpCisKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi9saWJvc21vY29yZS8uZ2l0aWdub3JlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSAuZ2l0aWdub3JlCnJlbmFtZSB0byBsaWJvc21vY29yZS8uZ2l0aWdub3JlCmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvbGlib3Ntb2NvcmUvQ09QWUlORwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gQ09QWUlORwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvQ09QWUlORwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9saWJvc21vY29yZS9jb25maWd1cmUuaW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbmZpZ3VyZS5pbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvY29uZmlndXJlLmluCmRpZmYgLS1naXQgYS9naXQtdmVyc2lvbi1nZW4gYi9saWJvc21vY29yZS9naXQtdmVyc2lvbi1nZW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGdpdC12ZXJzaW9uLWdlbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvZ2l0LXZlcnNpb24tZ2VuCmRpZmYgLS1naXQgYS9pbmNsdWRlL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvYml0dmVjLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL2NvbXAxMjguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvY29tcDEyOC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2NvbXAxMjguaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9jb21wMTI4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9nc200OC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTQ4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDhfaWUuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDhfaWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9nc200OF9pZS5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTQ4X2llLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtX3V0aWxzLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbV91dGlscy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2dzbV91dGlscy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbV91dGlscy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL2dzbXRhcC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc210YXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9nc210YXAuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc210YXAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9saW51eGxpc3QuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbGludXhsaXN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvbGludXhsaXN0LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbGludXhsaXN0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvbG9nZ2luZy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9sb2dnaW5nLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvbG9nZ2luZy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2xvZ2dpbmcuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9tbmNjLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL21uY2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9tbmNjLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbW5jYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL21zZ2IuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbXNnYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL21zZ2IuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9tc2diLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL01ha2VmaWxlLmFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL01ha2VmaWxlLmFtCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8wOC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMDguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMDguaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMDguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMTEuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzExLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzExLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzExLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzgwLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF84MC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF84MC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF84MC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF81OC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDhfNTguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDhfNTguaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDhfNTguaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMTJfMjEuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvcnNsLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3JzbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3JzbC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3JzbC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3J4bGV2X3N0YXQuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcnhsZXZfc3RhdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3J4bGV2X3N0YXQuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yeGxldl9zdGF0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvc2VsZWN0LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3NlbGVjdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3NlbGVjdC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3NlbGVjdC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3NpZ25hbC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zaWduYWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9zaWduYWwuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zaWduYWwuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9zdGF0aXN0aWNzLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3N0YXRpc3RpY3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9zdGF0aXN0aWNzLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc3RhdGlzdGljcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3RhbGxvYy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90YWxsb2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS90YWxsb2MuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90YWxsb2MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS90aW1lci5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS90aW1lci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3RpbWVyLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGltZXIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS90bHYuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGx2LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvdGx2LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGx2LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvdXRpbHMuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS91dGlscy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3V0aWxzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvd3JpdGVfcXVldWUuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvd3JpdGVfcXVldWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS93cml0ZV9xdWV1ZS5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3dyaXRlX3F1ZXVlLmgKZGlmZiAtLWdpdCBhL2xpYm9zbW9jb3JlLnBjLmluIGIvbGlib3Ntb2NvcmUvbGlib3Ntb2NvcmUucGMuaW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYm9zbW9jb3JlLnBjLmluCnJlbmFtZSB0byBsaWJvc21vY29yZS9saWJvc21vY29yZS5wYy5pbgpkaWZmIC0tZ2l0IGEvbTQvRFVNTVkgYi9saWJvc21vY29yZS9tNC9EVU1NWQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbTQvRFVNTVkKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL200L0RVTU1ZCmRpZmYgLS1naXQgYS9zcmMvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS9zcmMvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS9zcmMvYml0dmVjLmMgYi9saWJvc21vY29yZS9zcmMvYml0dmVjLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9iaXR2ZWMuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL2JpdHZlYy5jCmRpZmYgLS1naXQgYS9zcmMvY29tcDEyOC5jIGIvbGlib3Ntb2NvcmUvc3JjL2NvbXAxMjguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvbXAxMjguYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL2NvbXAxMjguYwpkaWZmIC0tZ2l0IGEvc3JjL2dzbTQ4LmMgYi9saWJvc21vY29yZS9zcmMvZ3NtNDguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2dzbTQ4LmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9nc200OC5jCmRpZmYgLS1naXQgYS9zcmMvZ3NtNDhfaWUuYyBiL2xpYm9zbW9jb3JlL3NyYy9nc200OF9pZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvZ3NtNDhfaWUuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL2dzbTQ4X2llLmMKZGlmZiAtLWdpdCBhL3NyYy9nc21fdXRpbHMuYyBiL2xpYm9zbW9jb3JlL3NyYy9nc21fdXRpbHMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2dzbV91dGlscy5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvZ3NtX3V0aWxzLmMKZGlmZiAtLWdpdCBhL3NyYy9sb2dnaW5nLmMgYi9saWJvc21vY29yZS9zcmMvbG9nZ2luZy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvbG9nZ2luZy5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvbG9nZ2luZy5jCmRpZmYgLS1naXQgYS9zcmMvbXNnYi5jIGIvbGlib3Ntb2NvcmUvc3JjL21zZ2IuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL21zZ2IuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL21zZ2IuYwpkaWZmIC0tZ2l0IGEvc3JjL3JzbC5jIGIvbGlib3Ntb2NvcmUvc3JjL3JzbC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvcnNsLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9yc2wuYwpkaWZmIC0tZ2l0IGEvc3JjL3J4bGV2X3N0YXQuYyBiL2xpYm9zbW9jb3JlL3NyYy9yeGxldl9zdGF0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9yeGxldl9zdGF0LmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9yeGxldl9zdGF0LmMKZGlmZiAtLWdpdCBhL3NyYy9zZWxlY3QuYyBiL2xpYm9zbW9jb3JlL3NyYy9zZWxlY3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3NlbGVjdC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvc2VsZWN0LmMKZGlmZiAtLWdpdCBhL3NyYy9zaWduYWwuYyBiL2xpYm9zbW9jb3JlL3NyYy9zaWduYWwuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3NpZ25hbC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvc2lnbmFsLmMKZGlmZiAtLWdpdCBhL3NyYy9zdGF0aXN0aWNzLmMgYi9saWJvc21vY29yZS9zcmMvc3RhdGlzdGljcy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvc3RhdGlzdGljcy5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvc3RhdGlzdGljcy5jCmRpZmYgLS1naXQgYS9zcmMvdGFsbG9jLmMgYi9saWJvc21vY29yZS9zcmMvdGFsbG9jLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90YWxsb2MuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3RhbGxvYy5jCmRpZmYgLS1naXQgYS9zcmMvdGltZXIuYyBiL2xpYm9zbW9jb3JlL3NyYy90aW1lci5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGltZXIuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3RpbWVyLmMKZGlmZiAtLWdpdCBhL3NyYy90bHZfcGFyc2VyLmMgYi9saWJvc21vY29yZS9zcmMvdGx2X3BhcnNlci5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGx2X3BhcnNlci5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvdGx2X3BhcnNlci5jCmRpZmYgLS1naXQgYS9zcmMvdXRpbHMuYyBiL2xpYm9zbW9jb3JlL3NyYy91dGlscy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdXRpbHMuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3V0aWxzLmMKZGlmZiAtLWdpdCBhL3NyYy93cml0ZV9xdWV1ZS5jIGIvbGlib3Ntb2NvcmUvc3JjL3dyaXRlX3F1ZXVlLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy93cml0ZV9xdWV1ZS5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvd3JpdGVfcXVldWUuYwpkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS90ZXN0cy9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3Rlc3RzL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS90ZXN0cy9zbXMvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS90ZXN0cy9zbXMvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL3Ntcy9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvdGVzdHMvc21zL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS90ZXN0cy9zbXMvc21zX3Rlc3QuYyBiL2xpYm9zbW9jb3JlL3Rlc3RzL3Ntcy9zbXNfdGVzdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9zbXMvc21zX3Rlc3QuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvdGVzdHMvc21zL3Ntc190ZXN0LmMKZGlmZiAtLWdpdCBhL3Rlc3RzL3RpbWVyL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvdGVzdHMvdGltZXIvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL3RpbWVyL01ha2VmaWxlLmFtCnJlbmFtZSB0byBsaWJvc21vY29yZS90ZXN0cy90aW1lci9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvdGVzdHMvdGltZXIvdGltZXJfdGVzdC5jIGIvbGlib3Ntb2NvcmUvdGVzdHMvdGltZXIvdGltZXJfdGVzdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy90aW1lci90aW1lcl90ZXN0LmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3Rlc3RzL3RpbWVyL3RpbWVyX3Rlc3QuYwpkaWZmIC0tZ2l0IGEvbGludXgta2VybmVsL2xpbnV4LTIuNi4yNy40LW1pc2RuLWFiaXMuZGlmZiBiL2xpbnV4LWtlcm5lbC9saW51eC0yLjYuMjcuNC1taXNkbi1hYmlzLmRpZmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5MWVkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LWtlcm5lbC9saW51eC0yLjYuMjcuNC1taXNkbi1hYmlzLmRpZmYKQEAgLTAsMCArMSwxNDQgQEAKK2RpZmYgLU5ydSAtLWV4Y2x1ZGUtZnJvbSAvc3VuYmVhbS9ob21lL2xhZm9yZ2Uvc2NyaXB0cy9kb250ZGlmZiBsaW51eC0yLjYuMjcuNC1jbGVhbi9kcml2ZXJzL2lzZG4vbUlTRE4vbGF5ZXIyLmMgbGludXgtMi42LjI3LjQvZHJpdmVycy9pc2RuL21JU0ROL2xheWVyMi5jCistLS0gbGludXgtMi42LjI3LjQtY2xlYW4vZHJpdmVycy9pc2RuL21JU0ROL2xheWVyMi5jCTIwMDgtMTAtMjYgMDA6MDU6MDcuMDAwMDAwMDAwICswMjAwCisrKysgbGludXgtMi42LjI3LjQvZHJpdmVycy9pc2RuL21JU0ROL2xheWVyMi5jCTIwMDgtMTItMjMgMTY6MTY6MjkuMDAwMDAwMDAwICswMTAwCitAQCAtOTQsOCArOTQsMTAgQEAKKyAJc3RydWN0IGxheWVyMiAqbDIgPSBmaS0+dXNlcmRhdGE7CisgCXZhX2xpc3QgdmE7CisgCisrI2lmIDAKKyAJaWYgKCEoKmRlYnVnICYgREVCVUdfTDJfRlNNKSkKKyAJCXJldHVybjsKKysjZW5kaWYKKyAJdmFfc3RhcnQodmEsIGZtdCk7CisgCXByaW50ayhLRVJOX0RFQlVHICJsMiAodGVpICVkKTogIiwgbDItPnRlaSk7CisgCXZwcmludGsoZm10LCB2YSk7CitAQCAtODgyLDYgKzg4NCw4IEBACisgCWwyLT52YSA9IDA7CisgCWwyLT52ciA9IDA7CisgCWwyLT5zb3cgPSAwOworKwlsMi0+c2FwaSA9IHNrYi0+ZGF0YVswXSA+PiAyOworKwlzZXRfY2hhbm5lbF9hZGRyZXNzKCZsMi0+Y2gsIGwyLT5zYXBpLCBsMi0+dGVpKTsKKyAJY2xlYXJfZXhjZXB0aW9uKGwyKTsKKyAJc2VuZF91ZnJhbWUobDIsIE5VTEwsIFVBIHwgZ2V0X1BvbGxGbGFnKGwyLCBza2IpLCBSU1ApOworIAltSVNETl9Gc21DaGFuZ2VTdGF0ZShmaSwgU1RfTDJfNyk7CitAQCAtODk4LDYgKzkwMiw3IEBACisgCXN0cnVjdCBsYXllcjIgKmwyID0gZmktPnVzZXJkYXRhOworIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYXJnOworIAorKwlwcmludGsoS0VSTl9ERUJVRyAibDJfc2VuZF9VQSgpXG4iKTsKKyAJc2VuZF91ZnJhbWUobDIsIHNrYiwgVUEgfCBnZXRfUG9sbEZsYWcobDIsIHNrYiksIFJTUCk7CisgfQorIAorQEAgLTkzMSw2ICs5MzYsOCBAQAorIAlsMi0+dmEgPSAwOworIAlsMi0+dnIgPSAwOworIAlsMi0+c293ID0gMDsKKysJbDItPnNhcGkgPSBza2ItPmRhdGFbMF0gPj4gMjsKKysJc2V0X2NoYW5uZWxfYWRkcmVzcygmbDItPmNoLCBsMi0+c2FwaSwgbDItPnRlaSk7CisgCW1JU0ROX0ZzbUNoYW5nZVN0YXRlKGZpLCBTVF9MMl83KTsKKyAJc3RvcF90MjAwKGwyLCAzKTsKKyAJbUlTRE5fRnNtUmVzdGFydFRpbWVyKCZsMi0+dDIwMywgbDItPlQyMDMsIEVWX0wyX1QyMDMsIE5VTEwsIDMpOworQEAgLTk4Miw2ICs5ODksOCBAQAorIAl9IGVsc2UgaWYgKGwyLT52cyAhPSBsMi0+dmEpIHsKKyAJCXNrYl9xdWV1ZV9wdXJnZSgmbDItPmlfcXVldWUpOworIAkJcHIgPSBETF9FU1RBQkxJU0hfSU5EOworKwkJLy9sMi0+c2FwaSA9IHNrYi0+ZGF0YVswXSA+PiAyOworKwkJLy9zZXRfY2hhbm5lbF9hZGRyZXNzKCZsMi0+Y2gsIGwyLT5zYXBpLCBsMi0+dGVpKTsKKyAJfQorIAlzdG9wX3QyMDAobDIsIDUpOworIAlsMi0+dnIgPSAwOworQEAgLTE4NDEsMTEgKzE4NTAsMTQgQEAKKyAJdV9pbnQJbDsKKyAJaW50CWMgPSAwOworIAorKwlwcmludGsoS0VSTl9ERUJVRyAicGhfZGF0YV9pbmRpY2F0aW9uIDB4JXggMHgleCAweCV4XG4iLCBkYXRhcFswXSwgZGF0YXBbMV0sIGRhdGFwWzJdKTsKKysKKyAJbCA9IGwyYWRkcnNpemUobDIpOworIAlpZiAoc2tiLT5sZW4gPD0gbCkgeworIAkJbUlTRE5fRnNtRXZlbnQoJmwyLT5sMm0sIEVWX0wyX0ZSQU1FX0VSUk9SLCAodm9pZCAqKSAnTicpOworIAkJcmV0dXJuIHJldDsKKyAJfQorKyNpZiAwCisgCWlmICh0ZXN0X2JpdChGTEdfTEFQRCwgJmwyLT5mbGFnKSkgeyAvKiBNYXliZSBub3QgbmVlZGVkICovCisgCQlwc2FwaSA9ICpkYXRhcCsrOworIAkJcHRlaSA9ICpkYXRhcCsrOworQEAgLTE4NzUsNiArMTg4Nyw3IEBACisgCQkJcmV0dXJuIDA7CisgCQl9CisgCX0gZWxzZQorKyNlbmRpZgorIAkJZGF0YXAgKz0gbDsKKyAJaWYgKCEoKmRhdGFwICYgMSkpIHsJLyogSS1GcmFtZSAqLworIAkJYyA9IGlmcmFtZV9lcnJvcihsMiwgc2tiKTsKK0BAIC0xODkwLDYgKzE5MDMsNyBAQAorIAkJCXJldCA9IG1JU0ROX0ZzbUV2ZW50KCZsMi0+bDJtLCBFVl9MMl9VSSwgc2tiKTsKKyAJfSBlbHNlIGlmIChJc1NBQk1FKGRhdGFwLCBsMikpIHsKKyAJCWMgPSB1bm51bV9lcnJvcihsMiwgc2tiLCBDTUQpOworKwkJcHJpbnRrKEtFUk5fREVCVUcgIklzU0FCTUUoKSByZXR1cm5lZCB0cnVlLCB1bm51bV9lcnJvcj0lZFxuIiwgYyk7CisgCQlpZiAoIWMpCisgCQkJcmV0ID0gbUlTRE5fRnNtRXZlbnQoJmwyLT5sMm0sIEVWX0wyX1NBQk1FLCBza2IpOworIAl9IGVsc2UgaWYgKElzVUEoZGF0YXApKSB7CitAQCAtMjA4Nyw3ICsyMTAxLDcgQEAKKyAJCXRlc3RfYW5kX3NldF9iaXQoRkxHX0xBUEQsICZsMi0+ZmxhZyk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEZMR19MQVBEX05FVCwgJmwyLT5mbGFnKTsKKyAJCXRlc3RfYW5kX3NldF9iaXQoRkxHX01PRDEyOCwgJmwyLT5mbGFnKTsKKy0JCWwyLT5zYXBpID0gMDsKKysJCWwyLT5zYXBpID0gNjI7CisgCQlsMi0+bWF4bGVuID0gTUFYX0RGUkFNRV9MRU47CisgCQlpZiAodGVzdF9iaXQoT1BUSU9OX0wyX1BNWCwgJm9wdGlvbnMpKQorIAkJCWwyLT53aW5kb3cgPSA3OworZGlmZiAtTnJ1IC0tZXhjbHVkZS1mcm9tIC9zdW5iZWFtL2hvbWUvbGFmb3JnZS9zY3JpcHRzL2RvbnRkaWZmIGxpbnV4LTIuNi4yNy40LWNsZWFuL2RyaXZlcnMvaXNkbi9tSVNETi90ZWkuYyBsaW51eC0yLjYuMjcuNC9kcml2ZXJzL2lzZG4vbUlTRE4vdGVpLmMKKy0tLSBsaW51eC0yLjYuMjcuNC1jbGVhbi9kcml2ZXJzL2lzZG4vbUlTRE4vdGVpLmMJMjAwOC0xMC0yNiAwMDowNTowNy4wMDAwMDAwMDAgKzAyMDAKKysrKyBsaW51eC0yLjYuMjcuNC9kcml2ZXJzL2lzZG4vbUlTRE4vdGVpLmMJMjAwOC0xMi0yMyAxNjozMjo1OS4wMDAwMDAwMDAgKzAxMDAKK0BAIC04MzAsMTggKzgzMCwyOSBAQAorIAlpbnQJCXRlaSwgcmk7CisgCXN0cnVjdCBsYXllcjIJKmwyOworIAorKwlwcmludGsoS0VSTl9ERUJVRyAibmV3IHRlaSByZXF1ZXN0OiB0ZWk9JWRcbiIsIGRwWzNdID4+IDEpOworKworIAlyaSA9IGRwWzBdIDw8IDg7CisgCXJpICs9IGRwWzFdOworLQlpZiAoIW1nci0+dXApCistCQlnb3RvIGRlbmllZDsKKy0JdGVpID0gZ2V0X2ZyZWVfdGVpKG1ncik7CistCWlmICh0ZWkgPCAwKSB7CistCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpObyBmcmVlIHRlaVxuIiwgX19mdW5jX18pOworKwlpZiAoIW1nci0+dXApIHsKKysJCXByaW50ayhLRVJOX0RFQlVHICJtZ3ItPnVwID09IE5VTExcbiIpOworIAkJZ290byBkZW5pZWQ7CisgCX0KKysJaWYgKGRwWzNdICE9IDB4ZmYpIHsKKysJCS8qIFRoaXMgaXMgYSBURUkgcmVxdWVzdCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAwOC41NiA2LjEuMTEuMiAqLworKwkJdGVpID0gZHBbM10gPj4gMTsKKysJfSBlbHNlIHsKKysJCXRlaSA9IGdldF9mcmVlX3RlaShtZ3IpOworKwkJaWYgKHRlaSA8IDApIHsKKysJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczpObyBmcmVlIHRlaVxuIiwgX19mdW5jX18pOworKwkJCWdvdG8gZGVuaWVkOworKwkJfQorKwl9CisgCWwyID0gY3JlYXRlX25ld190ZWkobWdyLCB0ZWkpOworLQlpZiAoIWwyKQorKwlpZiAoIWwyKSB7CisrCQlwcmludGsoS0VSTl9ERUJVRyAiY3JlYXRlX25ld190ZWkgPT0gTlVMTFxuIik7CisgCQlnb3RvIGRlbmllZDsKKysJfQorIAllbHNlCisgCQltSVNETl9Gc21FdmVudCgmbDItPnRtLT50ZWlfbSwgRVZfQVNTSUdOX1JFUSwgZHApOworIAlyZXR1cm47CitAQCAtMTE1OSwxMiArMTE3MCwxNCBAQAorIAkJcmV0dXJuIC1FTk9UQ09OTjsKKyAJaWYgKHNrYi0+bGVuICE9IDMpCisgCQlyZXR1cm4gLUVOT1RDT05OOworKyNpZiAwCisgCWlmIChza2ItPmRhdGFbMF0gIT0gMCkKKyAJCS8qIG9ubHkgU0FQSSAwIGNvbW1hbmQgKi8KKyAJCXJldHVybiAtRU5PVENPTk47CisrI2VuZGlmCisgCWlmICghKHNrYi0+ZGF0YVsxXSAmIDEpKSAvKiBpbnZhbGlkIEVBMSAqLworIAkJcmV0dXJuIC1FSU5WQUw7CistCXRlaSA9IHNrYi0+ZGF0YVsxXSA+PiAwOworKwl0ZWkgPSBza2ItPmRhdGFbMV0gPj4gMTsKKyAJaWYgKHRlaSA+IDYzKSAvKiBub3QgYSBmaXhlZCB0ZWkgKi8KKyAJCXJldHVybiAtRU5PVENPTk47CisgCWlmICgoc2tiLT5kYXRhWzJdICYgfjB4MTApICE9IFNBQk1FKQpkaWZmIC0tZ2l0IGEvbGludXgta2VybmVsL2xpbnV4LTIuNi4zMC1oZmNtdWx0aS1tdWx0aWJ0cy5wYXRjaCBiL2xpbnV4LWtlcm5lbC9saW51eC0yLjYuMzAtaGZjbXVsdGktbXVsdGlidHMucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI5NGQzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LWtlcm5lbC9saW51eC0yLjYuMzAtaGZjbXVsdGktbXVsdGlidHMucGF0Y2gKQEAgLTAsMCArMSw0ODYgQEAKK1RoaXMgZXhwZXJpbWVudGFsIHBhdGNoIHNwbGl0cyBvbmUgRTEgY2FyZCBpbnRvIHRocmVlIHZpcnR1YWwgY2FyZHMsCisKK1RTIDEsMiwzLDQsNSBpcyBjYXJkIDAKK1RTIDYsNyw4LDksMTAgaXMgY2FyZCAxCitUUyAxMSwxMiwxMywxNCBpcyBjYXJkIDIKKworVGhpcyBhbGxvd3MgeW91IHRvIHJ1biBvbmUgTDIgVEVJIGhhbmRsZXIgb24gZWFjaCBvZiB0aGUgdmlydHVhbCBjYXJkcywKK3doaWNoIGlzIHJlcXVpcmVkIGlmIHlvdSB3YW50IHRvIHJ1biBtdWx0aXBsZSBCVFMgb24gYSBzaW5nbGUgRTEgbGluay4KKworVGhhbmtzIHRvIEFuZHJlYXMgRXZlcnNiZXJnIGZvciB0aGlzIHBhdGNoLgorCitkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY19tdWx0aS5oIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY19tdWx0aS5oCitpbmRleCAwYzc3Mzg2Li4wMmRkNGExIDEwMDY0NAorLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY19tdWx0aS5oCisrKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjX211bHRpLmgKK0BAIC0yMDksMTQgKzIwOSwxNyBAQCBzdHJ1Y3QgaGZjX211bHRpIHsKKyAJdV9sb25nCQlsZWRzdGF0ZTsgLyogc2F2ZSBsYXN0IHN0YXRlIG9mIGxlZHMgKi8KKyAJaW50CQlvcHRpY2Fsc3VwcG9ydDsgLyogaGFzIHRoZSBlMSBib2FyZCAqLworIAkJCQkJLyogYW4gb3B0aWNhbCBJbnRlcmZhY2UgKi8KKy0JaW50CQlkc2xvdDsJLyogY2hhbm5lbCAjIG9mIGQtY2hhbm5lbCAoRTEpIGRlZmF1bHQgMTYgKi8KKysKKysJdV9pbnQJCWJtYXNrWzMyXTsgLyogYml0bWFzayBvZiBiY2hhbm5lbHMgZm9yIHBvcnQgKi8KKysJdV9jaGFyCQlkbnVtWzMyXTsgLyogYXJyYXkgb2YgdXNlZCBkY2hhbm5lbCBudW1iZXJzIGZvciBwb3J0ICovCisrCXVfY2hhcgkJY3JlYXRlZFszMl07IC8qIHdoYXQgcG9ydCBpcyBjcmVhdGVkICovCisrCXVfaW50CQlhY3Rpdml0eVszMl07IAkvKiBpZiB0aGVyZSBpcyBhbnkgYWN0aW9uIG9uIHRoaXMgKi8KKysJCQkJCS8qIHBvcnQgKHdpbGwgYmUgY2xlYXJlZCBhZnRlciAqLworKwkJCQkJLyogc2hvd2luZyBsZWQtc3RhdGVzKSAqLworIAorIAl1X2xvbmcJCXdkY291bnQ7IAkvKiBldmVyeSA1MDAgbXMgd2UgbmVlZCB0byAqLworIAkJCQkJLyogc2VuZCB0aGUgd2F0Y2hkb2cgYSBzaWduYWwgKi8KKyAJdV9jaGFyCQl3ZGJ5dGU7IC8qIHdhdGNoZG9nIHRvZ2dsZSBieXRlICovCistCXVfaW50CQlhY3Rpdml0eVs4XTsgCS8qIGlmIHRoZXJlIGlzIGFueSBhY3Rpb24gb24gdGhpcyAqLworLQkJCQkJLyogcG9ydCAod2lsbCBiZSBjbGVhcmVkIGFmdGVyICovCistCQkJCQkvKiBzaG93aW5nIGxlZC1zdGF0ZXMpICovCisgCWludAkJZTFfc3RhdGU7IC8qIGtlZXAgdHJhY2sgb2YgbGFzdCBzdGF0ZSAqLworIAlpbnQJCWUxX2dldGNsb2NrOyAvKiBpZiBzeW5jIGlzIHJldHJpZXZlZCBmcm9tIGludGVyZmFjZSAqLworIAlpbnQJCXN5bmNyb25pemVkOyAvKiBrZWVwIHRyYWNrIG9mIGV4aXN0aW5nIHN5bmMgaW50ZXJmYWNlICovCitAQCAtMjMzLDcgKzIzNiw2IEBAIHN0cnVjdCBoZmNfbXVsdGkgeworIAkgKiB0aGUgYmNoLT5jaGFubmVsIGlzIGVxdXZhbGVudCB0byB0aGUgaGZjLWNoYW5uZWwKKyAJICovCisgCXN0cnVjdCBoZmNfY2hhbgljaGFuWzMyXTsKKy0JdV9jaGFyCQljcmVhdGVkWzhdOyAvKiB3aGF0IHBvcnQgaXMgY3JlYXRlZCAqLworIAlzaWduZWQgY2hhcglzbG90X293bmVyWzI1Nl07IC8qIG93bmVyIGNoYW5uZWwgb2Ygc2xvdCAqLworIH07CisgCitkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjbXVsdGkuYworaW5kZXggZTFkYWIzMC4uNGZlMmQyNyAxMDA2NDQKKy0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNtdWx0aS5jCisrKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjbXVsdGkuYworQEAgLTE2MTksOCArMTYxOSw4IEBAIGhmY211bHRpX2xlZHMoc3RydWN0IGhmY19tdWx0aSAqaGMpCisgCQkgKiBsZWZ0IHJlZDogICAgICAgZnJhbWUgc3luYywgYnV0IG5vIEwxCisgCQkgKiByaWdodCBncmVlbjogICAgTDIgYWN0aXZlCisgCQkgKi8KKy0JCWlmIChoYy0+Y2hhbltoYy0+ZHNsb3RdLnN5bmMgIT0gMikgeyAvKiBubyBmcmFtZSBzeW5jICovCistCQkJaWYgKGhjLT5jaGFuW2hjLT5kc2xvdF0uZGNoLT5kZXYuRC5wcm90b2NvbAorKwkJaWYgKGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jICE9IDIpIHsgLyogbm8gZnJhbWUgc3luYyAqLworKwkJCWlmIChoYy0+Y2hhbltoYy0+ZG51bVswXV0uZGNoLT5kZXYuRC5wcm90b2NvbAorIAkJCQkhPSBJU0ROX1BfTlRfRTEpIHsKKyAJCQkJbGVkWzBdID0gMTsKKyAJCQkJbGVkWzFdID0gMTsKK0BAIC0yNDI4LDU1ICsyNDI4LDU2IEBAIGhhbmRsZV90aW1lcl9pcnEoc3RydWN0IGhmY19tdWx0aSAqaGMpCisgCQkJfQorIAkJfQorIAlpZiAoaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxICYmIGhjLT5jcmVhdGVkWzBdKSB7CistCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZHNsb3RdLmRjaDsKKy0JCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX1JFUE9SVF9MT1MsICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZykpIHsKKysjd2FybmluZyB0b2RvOiBwdXQgaW50ZXJmYWNlIHBhcmFtZXRlcnMgdG8gaGMKKysJCWRjaCA9IGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5kY2g7CisrCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfTE9TLCAmaGMtPmNoYW5baGMtPmRudW1bMF1dLmNmZykpIHsKKyAJCQkvKiBMT1MgKi8KKyAJCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1NZTkNfU1RBKSAmIFZfU0lHX0xPUzsKKy0JCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRzbG90XS5sb3MpCisrCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5sb3MpCisgCQkJCXNpZ25hbF9zdGF0ZV91cChkY2gsIEwxX1NJR05BTF9MT1NfT04sCisgCQkJCSAgICAiTE9TIGRldGVjdGVkIik7CistCQkJaWYgKHRlbXAgJiYgIWhjLT5jaGFuW2hjLT5kc2xvdF0ubG9zKQorKwkJCWlmICh0ZW1wICYmICFoYy0+Y2hhbltoYy0+ZG51bVswXV0ubG9zKQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfTE9TX09GRiwKKyAJCQkJICAgICJMT1MgZ29uZSIpOworLQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0ubG9zID0gdGVtcDsKKysJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0ubG9zID0gdGVtcDsKKyAJCX0KKy0JCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX1JFUE9SVF9BSVMsICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZykpIHsKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX1JFUE9SVF9BSVMsICZoYy0+Y2hhbltoYy0+ZG51bVswXV0uY2ZnKSkgeworIAkJCS8qIEFJUyAqLworIAkJCXRlbXAgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfU1lOQ19TVEEpICYgVl9BSVM7CistCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kc2xvdF0uYWlzKQorKwkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZG51bVswXV0uYWlzKQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfQUlTX09OLAorIAkJCQkgICAgIkFJUyBkZXRlY3RlZCIpOworLQkJCWlmICh0ZW1wICYmICFoYy0+Y2hhbltoYy0+ZHNsb3RdLmFpcykKKysJCQlpZiAodGVtcCAmJiAhaGMtPmNoYW5baGMtPmRudW1bMF1dLmFpcykKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX0FJU19PRkYsCisgCQkJCSAgICAiQUlTIGdvbmUiKTsKKy0JCQloYy0+Y2hhbltoYy0+ZHNsb3RdLmFpcyA9IHRlbXA7CisrCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLmFpcyA9IHRlbXA7CisgCQl9CistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfU0xJUCwgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkgeworKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX1NMSVAsICZoYy0+Y2hhbltoYy0+ZG51bVswXV0uY2ZnKSkgeworIAkJCS8qIFNMSVAgKi8KKyAJCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1NMSVApICYgVl9GT1NMSVBfUlg7CistCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kc2xvdF0uc2xpcF9yeCkKKysJCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRudW1bMF1dLnNsaXBfcngpCisgCQkJCXNpZ25hbF9zdGF0ZV91cChkY2gsIEwxX1NJR05BTF9TTElQX1JYLAorIAkJCQkgICAgIiBiaXQgU0xJUCBkZXRlY3RlZCBSWCIpOworLQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uc2xpcF9yeCA9IHRlbXA7CisrCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnNsaXBfcnggPSB0ZW1wOworIAkJCXRlbXAgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfU0xJUCkgJiBWX0ZPU0xJUF9UWDsKKy0JCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRzbG90XS5zbGlwX3R4KQorKwkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZG51bVswXV0uc2xpcF90eCkKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX1NMSVBfVFgsCisgCQkJCSAgICAiIGJpdCBTTElQIGRldGVjdGVkIFRYIik7CistCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zbGlwX3R4ID0gdGVtcDsKKysJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0uc2xpcF90eCA9IHRlbXA7CisgCQl9CistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfUkRJLCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKSB7CisrCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfUkRJLCAmaGMtPmNoYW5baGMtPmRudW1bMF1dLmNmZykpIHsKKyAJCQkvKiBSREkgKi8KKyAJCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1JYX1NMMF8wKSAmIFZfQTsKKy0JCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRzbG90XS5yZGkpCisrCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5yZGkpCisgCQkJCXNpZ25hbF9zdGF0ZV91cChkY2gsIEwxX1NJR05BTF9SRElfT04sCisgCQkJCSAgICAiUkRJIGRldGVjdGVkIik7CistCQkJaWYgKHRlbXAgJiYgIWhjLT5jaGFuW2hjLT5kc2xvdF0ucmRpKQorKwkJCWlmICh0ZW1wICYmICFoYy0+Y2hhbltoYy0+ZG51bVswXV0ucmRpKQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfUkRJX09GRiwKKyAJCQkJICAgICJSREkgZ29uZSIpOworLQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0ucmRpID0gdGVtcDsKKysJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0ucmRpID0gdGVtcDsKKyAJCX0KKyAJCXRlbXAgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfSkFUVF9ESVIpOworLQkJc3dpdGNoIChoYy0+Y2hhbltoYy0+ZHNsb3RdLnN5bmMpIHsKKysJCXN3aXRjaCAoaGMtPmNoYW5baGMtPmRudW1bMF1dLnN5bmMpIHsKKyAJCWNhc2UgMDoKKyAJCQlpZiAoKHRlbXAgJiAweDYwKSA9PSAweDYwKSB7CisgCQkJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX1NZTkMpCitAQCAtMjQ4NSwxMCArMjQ4NiwxMCBAQCBoYW5kbGVfdGltZXJfaXJxKHN0cnVjdCBoZmNfbXVsdGkgKmhjKQorIAkJCQkJICAgICJpbiBjbG9jayBzeW5jXG4iLAorIAkJCQkJICAgIF9fZnVuY19fLCBoYy0+aWQpOworIAkJCQlIRkNfb3V0YihoYywgUl9SWF9PRkYsCistCQkJCSAgICBoYy0+Y2hhbltoYy0+ZHNsb3RdLmppdHRlciB8IFZfUlhfSU5JVCk7CisrCQkJCSAgICBoYy0+Y2hhbltoYy0+ZG51bVswXV0uaml0dGVyIHwgVl9SWF9JTklUKTsKKyAJCQkJSEZDX291dGIoaGMsIFJfVFhfT0ZGLAorLQkJCQkgICAgaGMtPmNoYW5baGMtPmRzbG90XS5qaXR0ZXIgfCBWX1JYX0lOSVQpOworLQkJCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnN5bmMgPSAxOworKwkJCQkgICAgaGMtPmNoYW5baGMtPmRudW1bMF1dLmppdHRlciB8IFZfUlhfSU5JVCk7CisrCQkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jID0gMTsKKyAJCQkJZ290byBjaGVja19mcmFtZXN5bmM7CisgCQkJfQorIAkJCWJyZWFrOworQEAgLTI0OTksNyArMjUwMCw3IEBAIGhhbmRsZV90aW1lcl9pcnEoc3RydWN0IGhmY19tdWx0aSAqaGMpCisgCQkJCQkgICAgIiVzOiAoaWQ9JWQpIEUxICIKKyAJCQkJCSAgICAibG9zdCBjbG9jayBzeW5jXG4iLAorIAkJCQkJICAgIF9fZnVuY19fLCBoYy0+aWQpOworLQkJCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnN5bmMgPSAwOworKwkJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0uc3luYyA9IDA7CisgCQkJCWJyZWFrOworIAkJCX0KKyBjaGVja19mcmFtZXN5bmM6CitAQCAtMjUxMCw3ICsyNTExLDcgQEAgY2hlY2tfZnJhbWVzeW5jOgorIAkJCQkJICAgICIlczogKGlkPSVkKSBFMSAiCisgCQkJCQkgICAgIm5vdyBpbiBmcmFtZSBzeW5jXG4iLAorIAkJCQkJICAgIF9fZnVuY19fLCBoYy0+aWQpOworLQkJCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnN5bmMgPSAyOworKwkJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0uc3luYyA9IDI7CisgCQkJfQorIAkJCWJyZWFrOworIAkJY2FzZSAyOgorQEAgLTI1MjAsNyArMjUyMSw3IEBAIGNoZWNrX2ZyYW1lc3luYzoKKyAJCQkJCSAgICAiJXM6IChpZD0lZCkgRTEgbG9zdCAiCisgCQkJCQkgICAgImNsb2NrICYgZnJhbWUgc3luY1xuIiwKKyAJCQkJCSAgICBfX2Z1bmNfXywgaGMtPmlkKTsKKy0JCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jID0gMDsKKysJCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnN5bmMgPSAwOworIAkJCQlicmVhazsKKyAJCQl9CisgCQkJdGVtcCA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9TWU5DX1NUQSk7CitAQCAtMjUzMCw3ICsyNTMxLDcgQEAgY2hlY2tfZnJhbWVzeW5jOgorIAkJCQkJICAgICIlczogKGlkPSVkKSBFMSAiCisgCQkJCQkgICAgImxvc3QgZnJhbWUgc3luY1xuIiwKKyAJCQkJCSAgICBfX2Z1bmNfXywgaGMtPmlkKTsKKy0JCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jID0gMTsKKysJCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnN5bmMgPSAxOworIAkJCX0KKyAJCQlicmVhazsKKyAJCX0KK0BAIC0yNzQ2LDcgKzI3NDcsOCBAQCBoZmNtdWx0aV9pbnRlcnJ1cHQoaW50IGludG5vLCB2b2lkICpkZXZfaWQpCisgCQlpZiAocl9pcnFfbWlzYyAmIFZfU1RBX0lSUSkgeworIAkJCWlmIChoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEpIHsKKyAJCQkJLyogc3RhdGUgbWFjaGluZSAqLworLQkJCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZHNsb3RdLmRjaDsKKysjd2FybmluZyB0b2RvCisrCQkJCWRjaCA9IGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5kY2g7CisgCQkJCWUxX3N5bmNzdGEgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfU1lOQ19TVEEpOworIAkJCQlpZiAodGVzdF9iaXQoSEZDX0NISVBfUExYU0QsICZoYy0+Y2hpcCkKKyAJCQkJICYmIGhjLT5lMV9nZXRjbG9jaykgeworQEAgLTI3NjgsNyArMjc3MCwxNSBAQCBoZmNtdWx0aV9pbnRlcnJ1cHQoaW50IGludG5vLCB2b2lkICpkZXZfaWQpCisgCQkJCX0KKyAJCQkJZGNoLT5zdGF0ZSA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9FMV9SRF9TVEEpCisgCQkJCQkmIDB4NzsKKysjd2FybmluZyB0b2RvIGhhY2shISEgYnJvYWRjYXN0IHN0YXRlIGNoYW5nZSEhIQorKwkJCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZG51bVswXV0uZGNoOworIAkJCQlzY2hlZHVsZV9ldmVudChkY2gsIEZMR19QSENIQU5HRSk7CisrCQkJCWRjaCA9IGhjLT5jaGFuW2hjLT5kbnVtWzFdXS5kY2g7CisrCQkJCWRjaC0+c3RhdGUgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfRTFfUkRfU1RBKQorKwkJCQkJJiAweDc7CisrCQkJCXNjaGVkdWxlX2V2ZW50KGRjaCwgRkxHX1BIQ0hBTkdFKTsKKysKKysKKyAJCQkJaWYgKGRlYnVnICYgREVCVUdfSEZDTVVMVElfU1RBVEUpCisgCQkJCQlwcmludGsoS0VSTl9ERUJVRworIAkJCQkJICAgICIlczogRTEgKGlkPSVkKSBuZXdzdGF0ZSAleFxuIiwKK0BAIC0zODUxLDMxICszODYxLDM1IEBAIGhmY211bHRpX2luaXRtb2RlKHN0cnVjdCBkY2hhbm5lbCAqZGNoKQorIAlpZiAoZGVidWcgJiBERUJVR19IRkNNVUxUSV9JTklUKQorIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlbnRlcmVkXG4iLCBfX2Z1bmNfXyk7CisgCisrCWkgPSBkY2gtPnNsb3Q7CisrCXB0ID0gaGMtPmNoYW5baV0ucG9ydDsKKyAJaWYgKGhjLT5jdHlwZSA9PSBIRkNfVFlQRV9FMSkgeworLQkJaGMtPmNoYW5baGMtPmRzbG90XS5zbG90X3R4ID0gLTE7CistCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnNsb3RfcnggPSAtMTsKKy0JCWhjLT5jaGFuW2hjLT5kc2xvdF0uY29uZiA9IC0xOworLQkJaWYgKGhjLT5kc2xvdCkgeworLQkJCW1vZGVfaGZjbXVsdGkoaGMsIGhjLT5kc2xvdCwgZGNoLT5kZXYuRC5wcm90b2NvbCwKKysJCS8qIEUxICovCisrI3dhcm5pbmcgdG9kbzogZG9uJyd0IGRvIGl0IGlmIGRudW0gPT0gMAorKwkJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5zbG90X3R4ID0gLTE7CisrCQloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLnNsb3RfcnggPSAtMTsKKysJCWhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY29uZiA9IC0xOworKwkJaWYgKGhjLT5kbnVtW3B0XSkgeworKwkJCW1vZGVfaGZjbXVsdGkoaGMsIGRjaC0+c2xvdCwgZGNoLT5kZXYuRC5wcm90b2NvbCwKKyAJCQkJLTEsIDAsIC0xLCAwKTsKKyAJCQlkY2gtPnRpbWVyLmZ1bmN0aW9uID0gKHZvaWQgKikgaGZjbXVsdGlfZGJ1c3lfdGltZXI7CisgCQkJZGNoLT50aW1lci5kYXRhID0gKGxvbmcpIGRjaDsKKyAJCQlpbml0X3RpbWVyKCZkY2gtPnRpbWVyKTsKKyAJCX0KKyAJCWZvciAoaSA9IDE7IGkgPD0gMzE7IGkrKykgeworLQkJCWlmIChpID09IGhjLT5kc2xvdCkKKysJCQlpZiAoISgoMSA8PCBpKSAmIGhjLT5ibWFza1twdF0pKSAvKiBza2lwIHVudXNlZCBjaGFubmVsICovCisgCQkJCWNvbnRpbnVlOworIAkJCWhjLT5jaGFuW2ldLnNsb3RfdHggPSAtMTsKKyAJCQloYy0+Y2hhbltpXS5zbG90X3J4ID0gLTE7CisgCQkJaGMtPmNoYW5baV0uY29uZiA9IC0xOworIAkJCW1vZGVfaGZjbXVsdGkoaGMsIGksIElTRE5fUF9OT05FLCAtMSwgMCwgLTEsIDApOworIAkJfQorLQkJLyogRTEgKi8KKy0JCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX1JFUE9SVF9MT1MsICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZykpIHsKKysjd2FybmluZyB0b2RvIChnbG9iYWwpCisrCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfTE9TLCAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpKSB7CisgCQkJSEZDX291dGIoaGMsIFJfTE9TMCwgMjU1KTsgLyogMiBtcyAqLworIAkJCUhGQ19vdXRiKGhjLCBSX0xPUzEsIDI1NSk7IC8qIDUxMiBtcyAqLworIAkJfQorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfT1BUSUNBTCwgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkgeworKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfT1BUSUNBTCwgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKSkgeworIAkJCUhGQ19vdXRiKGhjLCBSX1JYMCwgMCk7CisgCQkJaGMtPmh3LnJfdHgwID0gMCB8IFZfT1VUX0VOOworIAkJfSBlbHNlIHsKK0BAIC0zODg4LDEyICszOTAyLDEyIEBAIGhmY211bHRpX2luaXRtb2RlKHN0cnVjdCBkY2hhbm5lbCAqZGNoKQorIAkJSEZDX291dGIoaGMsIFJfVFhfRlIwLCAweDAwKTsKKyAJCUhGQ19vdXRiKGhjLCBSX1RYX0ZSMSwgMHhmOCk7CisgCistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19DUkM0LCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKQorKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfQ1JDNCwgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKSkKKyAJCQlIRkNfb3V0YihoYywgUl9UWF9GUjIsIFZfVFhfTUYgfCBWX1RYX0UgfCBWX05FR19FKTsKKyAKKyAJCUhGQ19vdXRiKGhjLCBSX1JYX0ZSMCwgVl9BVVRPX1JFU1lOQyB8IFZfQVVUT19SRUNPIHwgMCk7CisgCistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19DUkM0LCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKQorKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfQ1JDNCwgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKSkKKyAJCQlIRkNfb3V0YihoYywgUl9SWF9GUjEsIFZfUlhfTUYgfCBWX1JYX01GX1NZTkMpOworIAorIAkJaWYgKGRjaC0+ZGV2LkQucHJvdG9jb2wgPT0gSVNETl9QX05UX0UxKSB7CitAQCAtMzk1Nyw3ICszOTcxLDcgQEAgaGZjbXVsdGlfaW5pdG1vZGUoc3RydWN0IGRjaGFubmVsICpkY2gpCisgCQkJcGx4c2RfY2hlY2tzeW5jKGhjLCAwKTsKKyAJCX0KKyAJfSBlbHNlIHsKKy0JCWkgPSBkY2gtPnNsb3Q7CisrCQkvKiBTVCAqLworIAkJaGMtPmNoYW5baV0uc2xvdF90eCA9IC0xOworIAkJaGMtPmNoYW5baV0uc2xvdF9yeCA9IC0xOworIAkJaGMtPmNoYW5baV0uY29uZiA9IC0xOworQEAgLTM5NzMsOCArMzk4Nyw2IEBAIGhmY211bHRpX2luaXRtb2RlKHN0cnVjdCBkY2hhbm5lbCAqZGNoKQorIAkJaGMtPmNoYW5baSAtIDFdLnNsb3RfcnggPSAtMTsKKyAJCWhjLT5jaGFuW2kgLSAxXS5jb25mID0gLTE7CisgCQltb2RlX2hmY211bHRpKGhjLCBpIC0gMSwgSVNETl9QX05PTkUsIC0xLCAwLCAtMSwgMCk7CistCQkvKiBTVCAqLworLQkJcHQgPSBoYy0+Y2hhbltpXS5wb3J0OworIAkJLyogc2VsZWN0IGludGVyZmFjZSAqLworIAkJSEZDX291dGIoaGMsIFJfU1RfU0VMLCBwdCk7CisgCQkvKiB1bmRvY3VtZW50ZWQ6IGRlbGF5IGFmdGVyIFJfU1RfU0VMICovCitAQCAtNDU1Nyw2ICs0NTY5LDggQEAgcmVsZWFzZV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKKyAJCX0KKyAJCS8qIGZyZWUgY2hhbm5lbHMgKi8KKyAJCWZvciAoaSA9IDA7IGkgPD0gMzE7IGkrKykgeworKwkJCWlmICghKCgxIDw8IGkpICYgaGMtPmJtYXNrW3B0XSkpIC8qIHNraXAgdW51c2VkIGNoYW5uZWwgKi8KKysJCQkJY29udGludWU7CisgCQkJaWYgKGhjLT5jaGFuW2ldLmJjaCkgeworIAkJCQlpZiAoZGVidWcgJiBERUJVR19IRkNNVUxUSV9JTklUKQorIAkJCQkJcHJpbnRrKEtFUk5fREVCVUcKK0BAIC00NjgwLDEyICs0Njk0LDEzIEBAIHJlbGVhc2VfY2FyZChzdHJ1Y3QgaGZjX211bHRpICpoYykKKyB9CisgCisgc3RhdGljIGludAorLWluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKytpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0sIGludCBwdCkKKyB7CisgCXN0cnVjdCBkY2hhbm5lbAkqZGNoOworIAlzdHJ1Y3QgYmNoYW5uZWwJKmJjaDsKKyAJaW50CQljaCwgcmV0ID0gMDsKKyAJY2hhcgkJbmFtZVtNSVNETl9NQVhfSURMRU5dOworKwlpbnQJCWJjb3VudCA9IDA7CisgCisgCWRjaCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkY2hhbm5lbCksIEdGUF9LRVJORUwpOworIAlpZiAoIWRjaCkKK0BAIC00Njk4LDEzICs0NzEzLDEyIEBAIGluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKyAJICAgICgxIDw8IChJU0ROX1BfQl9IRExDICYgSVNETl9QX0JfTUFTSykpOworIAlkY2gtPmRldi5ELnNlbmQgPSBoYW5kbGVfZG1zZzsKKyAJZGNoLT5kZXYuRC5jdHJsID0gaGZjbV9kY3RybDsKKy0JZGNoLT5kZXYubnJiY2hhbiA9IChoYy0+ZHNsb3QpID8gMzAgOiAzMTsKKy0JZGNoLT5zbG90ID0gaGMtPmRzbG90OworLQloYy0+Y2hhbltoYy0+ZHNsb3RdLmRjaCA9IGRjaDsKKy0JaGMtPmNoYW5baGMtPmRzbG90XS5wb3J0ID0gMDsKKy0JaGMtPmNoYW5baGMtPmRzbG90XS5udF90aW1lciA9IC0xOworKwlkY2gtPnNsb3QgPSBoYy0+ZG51bVtwdF07CisrCWhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uZGNoID0gZGNoOworKwloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLnBvcnQgPSBwdDsKKysJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5udF90aW1lciA9IC0xOworIAlmb3IgKGNoID0gMTsgY2ggPD0gMzE7IGNoKyspIHsKKy0JCWlmIChjaCA9PSBoYy0+ZHNsb3QpIC8qIHNraXAgZGNoYW5uZWwgKi8KKysJCWlmICghKCgxIDw8IGNoKSAmIGhjLT5ibWFza1twdF0pKSAvKiBza2lwIHVudXNlZCBjaGFubmVsICovCisgCQkJY29udGludWU7CisgCQliY2ggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYmNoYW5uZWwpLCBHRlBfS0VSTkVMKTsKKyAJCWlmICghYmNoKSB7CitAQCAtNDczMyw3ICs0NzQ3LDEwIEBAIGluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKyAJCWhjLT5jaGFuW2NoXS5iY2ggPSBiY2g7CisgCQloYy0+Y2hhbltjaF0ucG9ydCA9IDA7CisgCQlzZXRfY2hhbm5lbG1hcChiY2gtPm5yLCBkY2gtPmRldi5jaGFubmVsbWFwKTsKKysJCWJjb3VudCsrOworIAl9CisrCWRjaC0+ZGV2Lm5yYmNoYW4gPSBiY291bnQ7CisrI3dhcm5pbmcgdG9kbzogbXVzdCBiZSBzZXQgZ2xvYmFsbHksIGFuZCBtdXN0IGJlIGEgc2VwZXJhdGUgZnVuY3Rpb24KKyAJLyogc2V0IG9wdGljYWwgbGluZSB0eXBlICovCisgCWlmIChwb3J0W1BvcnRfY250XSAmIDB4MDAxKSB7CisgCQlpZiAoIW0tPm9wdGljYWxzdXBwb3J0KSAgeworQEAgLTQ3NDksNyArNDc2Niw3IEBAIGluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKyAJCQkJICAgIF9fZnVuY19fLAorIAkJCQkgICAgSEZDX2NudCArIDEsIDEpOworIAkJCXRlc3RfYW5kX3NldF9iaXQoSEZDX0NGR19PUFRJQ0FMLAorLQkJCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJCSAgICAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpOworIAkJfQorIAl9CisgCS8qIHNldCBMT1MgcmVwb3J0ICovCitAQCAtNDc1OSw3ICs0Nzc2LDcgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkJCSAgICAiTE9TIHJlcG9ydDogY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJICAgIF9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfUkVQT1JUX0xPUywKKy0JCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJICAgICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZyk7CisgCX0KKyAJLyogc2V0IEFJUyByZXBvcnQgKi8KKyAJaWYgKHBvcnRbUG9ydF9jbnRdICYgMHgwMDgpIHsKK0BAIC00NzY4LDcgKzQ3ODUsNyBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQkJICAgICJBSVMgcmVwb3J0OiBjYXJkKCVkKSBwb3J0KCVkKVxuIiwKKyAJCQkgICAgX19mdW5jX18sIEhGQ19jbnQgKyAxLCAxKTsKKyAJCXRlc3RfYW5kX3NldF9iaXQoSEZDX0NGR19SRVBPUlRfQUlTLAorLQkJICAgICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZyk7CisrCQkgICAgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKTsKKyAJfQorIAkvKiBzZXQgU0xJUCByZXBvcnQgKi8KKyAJaWYgKHBvcnRbUG9ydF9jbnRdICYgMHgwMTApIHsKK0BAIC00Nzc4LDcgKzQ3OTUsNyBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQkJICAgICJjYXJkKCVkKSBwb3J0KCVkKVxuIiwKKyAJCQkgICAgX19mdW5jX18sIEhGQ19jbnQgKyAxLCAxKTsKKyAJCXRlc3RfYW5kX3NldF9iaXQoSEZDX0NGR19SRVBPUlRfU0xJUCwKKy0JCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJICAgICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZyk7CisgCX0KKyAJLyogc2V0IFJESSByZXBvcnQgKi8KKyAJaWYgKHBvcnRbUG9ydF9jbnRdICYgMHgwMjApIHsKK0BAIC00Nzg4LDcgKzQ4MDUsNyBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQkJICAgICJjYXJkKCVkKSBwb3J0KCVkKVxuIiwKKyAJCQkgICAgX19mdW5jX18sIEhGQ19jbnQgKyAxLCAxKTsKKyAJCXRlc3RfYW5kX3NldF9iaXQoSEZDX0NGR19SRVBPUlRfUkRJLAorLQkJICAgICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZyk7CisrCQkgICAgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKTsKKyAJfQorIAkvKiBzZXQgQ1JDLTQgTW9kZSAqLworIAlpZiAoIShwb3J0W1BvcnRfY250XSAmIDB4MTAwKSkgeworQEAgLTQ3OTcsNyArNDgxNCw3IEBAIGluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKyAJCQkJIiBjYXJkKCVkKSBwb3J0KCVkKVxuIiwKKyAJCQkJX19mdW5jX18sIEhGQ19jbnQgKyAxLCAxKTsKKyAJCXRlc3RfYW5kX3NldF9iaXQoSEZDX0NGR19DUkM0LAorLQkJICAgICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZyk7CisrCQkgICAgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKTsKKyAJfSBlbHNlIHsKKyAJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX0lOSVQpCisgCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBQT1JUIHR1cm4gb2ZmIENSQzQiCitAQCAtNDgyOSwyMCArNDg0NiwyMyBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCX0KKyAJLyogc2V0IGVsYXN0aWMgaml0dGVyIGJ1ZmZlciAqLworIAlpZiAocG9ydFtQb3J0X2NudF0gJiAweDMwMDApIHsKKy0JCWhjLT5jaGFuW2hjLT5kc2xvdF0uaml0dGVyID0gKHBvcnRbUG9ydF9jbnRdPj4xMikgJiAweDM7CisrCQloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmppdHRlciA9IChwb3J0W1BvcnRfY250XT4+MTIpICYgMHgzOworIAkJaWYgKGRlYnVnICYgREVCVUdfSEZDTVVMVElfSU5JVCkKKyAJCQlwcmludGsoS0VSTl9ERUJVRworIAkJCSAgICAiJXM6IFBPUlQgc2V0IGVsYXN0aWMgIgorIAkJCSAgICAiYnVmZmVyIHRvICVkOiBjYXJkKCVkKSBwb3J0KCVkKVxuIiwKKy0JCQkgICAgX19mdW5jX18sIGhjLT5jaGFuW2hjLT5kc2xvdF0uaml0dGVyLAorKwkJCSAgICBfX2Z1bmNfXywgaGMtPmNoYW5baGMtPmRudW1bcHRdXS5qaXR0ZXIsCisgCQkJICAgIEhGQ19jbnQgKyAxLCAxKTsKKyAJfSBlbHNlCistCQloYy0+Y2hhbltoYy0+ZHNsb3RdLmppdHRlciA9IDI7IC8qIGRlZmF1bHQgKi8KKy0Jc25wcmludGYobmFtZSwgTUlTRE5fTUFYX0lETEVOIC0gMSwgImhmYy1lMS4lZCIsIEhGQ19jbnQgKyAxKTsKKysJCWhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uaml0dGVyID0gMjsgLyogZGVmYXVsdCAqLworKwlpZiAoaGMtPnBvcnRzID4gMSkKKysJCXNucHJpbnRmKG5hbWUsIE1JU0ROX01BWF9JRExFTiAtIDEsICJoZmMtZTEuJWQtJWQiLCBIRkNfY250ICsgMSwgcHQrMSk7CisrCWVsc2UKKysJCXNucHJpbnRmKG5hbWUsIE1JU0ROX01BWF9JRExFTiAtIDEsICJoZmMtZTEuJWQiLCBIRkNfY250ICsgMSk7CisgCXJldCA9IG1JU0ROX3JlZ2lzdGVyX2RldmljZSgmZGNoLT5kZXYsICZoYy0+cGNpX2Rldi0+ZGV2LCBuYW1lKTsKKyAJaWYgKHJldCkKKyAJCWdvdG8gZnJlZV9jaGFuOworLQloYy0+Y3JlYXRlZFswXSA9IDE7CisrCWhjLT5jcmVhdGVkW3B0XSA9IDE7CisgCXJldHVybiByZXQ7CisgZnJlZV9jaGFuOgorIAlyZWxlYXNlX3BvcnQoaGMsIGRjaCk7CitAQCAtNTAwOSwxOCArNTAyOSwzMCBAQCBoZmNtdWx0aV9pbml0KHN0cnVjdCBobV9tYXAgKm0sIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorIAloYy0+aWQgPSBIRkNfY250OworIAloYy0+cGNtID0gcGNtW0hGQ19jbnRdOworIAloYy0+aW9fbW9kZSA9IGlvbW9kZVtIRkNfY250XTsKKysjd2FybmluZyB0b2RvOiByZXdvcmsgbW9kdWxlIHBhcmFtZXRlcnMgZm9yIGN1c3RvbWl6aW5nIGUxIGZyYWdtZW50cy4uLi4geWVhLCBsZXQnJ3MgY2FsbCBpdDogZnJhZ21lbnRzCisgCWlmIChkc2xvdFtIRkNfY250XSA8IDAgJiYgaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKSB7CistCQloYy0+ZHNsb3QgPSAwOworKwkJaGMtPmRudW1bMF0gPSAwOworIAkJcHJpbnRrKEtFUk5fSU5GTyAiSEZDLUUxIGNhcmQgaGFzIGRpc2FibGVkIEQtY2hhbm5lbCwgYnV0ICIKKyAJCQkiMzEgQi1jaGFubmVsc1xuIik7CisgCX0KKyAJaWYgKGRzbG90W0hGQ19jbnRdID4gMCAmJiBkc2xvdFtIRkNfY250XSA8IDMyCisgCSAgICAmJiBoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEpIHsKKy0JCWhjLT5kc2xvdCA9IGRzbG90W0hGQ19jbnRdOworKwkJaGMtPmRudW1bMF0gPSBkc2xvdFtIRkNfY250XTsKKyAJCXByaW50ayhLRVJOX0lORk8gIkhGQy1FMSBjYXJkIGhhcyBhbHRlcm5hdGluZyBELWNoYW5uZWwgb24gIgorIAkJCSJ0aW1lIHNsb3QgJWRcbiIsIGRzbG90W0hGQ19jbnRdKTsKKyAJfSBlbHNlCistCQloYy0+ZHNsb3QgPSAxNjsKKysJCWhjLT5kbnVtWzBdID0gMTY7CisrCisrI3dhcm5pbmcgdG9kbyBIQUNLISEhIGp1c3QgYSBzbWFsbCBtYXAgb2YgdHdvICJmcmFnbWVudHMiCisrCWlmIChoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEpIHsKKysJCWhjLT5kbnVtWzBdID0gMTsKKysJCWhjLT5ibWFza1swXSA9IDB4MDAwMDAwM2M7CisrCQloYy0+ZG51bVsxXSA9IDY7CisrCQloYy0+Ym1hc2tbMV0gPSAweDAwMDAwNzgwOworKwkJaGMtPmRudW1bMl0gPSAxMTsKKysJCWhjLT5ibWFza1syXSA9IDB4MDAwMDc4MDA7CisrCQloYy0+cG9ydHMgPSAzOworKwl9CisgCisgCS8qIHNldCBjaGlwIHNwZWNpZmljIGZlYXR1cmVzICovCisgCWhjLT5tYXN0ZXJjbGsgPSAtMTsKK0BAIC01MTAzLDcgKzUxMzUsNyBAQCBoZmNtdWx0aV9pbml0KHN0cnVjdCBobV9tYXAgKm0sIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorIAkJCWdvdG8gZnJlZV9jYXJkOworIAkJfQorIAkJaWYgKGhjLT5jdHlwZSA9PSBIRkNfVFlQRV9FMSkKKy0JCQlyZXRfZXJyID0gaW5pdF9lMV9wb3J0KGhjLCBtKTsKKysJCQlyZXRfZXJyID0gaW5pdF9lMV9wb3J0KGhjLCBtLCBwdCk7CisgCQllbHNlCisgCQkJcmV0X2VyciA9IGluaXRfbXVsdGlfcG9ydChoYywgcHQpOworIAkJaWYgKGRlYnVnICYgREVCVUdfSEZDTVVMVElfSU5JVCkKK0BAIC01MTE1LDEwICs1MTQ3LDE0IEBAIGhmY211bHRpX2luaXQoc3RydWN0IGhtX21hcCAqbSwgc3RydWN0IHBjaV9kZXYgKnBkZXYsCisgCQlpZiAocmV0X2VycikgeworIAkJCXdoaWxlIChwdCkgeyAvKiByZWxlYXNlIGFscmVhZHkgcmVnaXN0ZXJlZCBwb3J0cyAqLworIAkJCQlwdC0tOworLQkJCQlyZWxlYXNlX3BvcnQoaGMsIGhjLT5jaGFuWyhwdCA8PCAyKSArIDJdLmRjaCk7CisrCQkJCWlmIChoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEpCisrCQkJCQlyZWxlYXNlX3BvcnQoaGMsIGhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uZGNoKTsKKysJCQkJZWxzZQorKwkJCQkJcmVsZWFzZV9wb3J0KGhjLCBoYy0+Y2hhblsocHQgPDwgMikgKyAyXS5kY2gpOworIAkJCX0KKyAJCQlnb3RvIGZyZWVfY2FyZDsKKyAJCX0KKysjd2FybmluZyB0b2RvOiBjb3VudCBpdCByaWdodCwgYWRkIGFkZGl0aW9uYWwgImZyYWdtZW50IiBjb3VudGVyLi4uCisgCQlQb3J0X2NudCsrOworIAl9CisgCmRpZmYgLS1naXQgYS9vcGVuYnNjLy5naXRpZ25vcmUgYi9vcGVuYnNjLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2ODExNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDQ4IEBACisqLm8KKyouYQorLmRlcHMKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorYnNjY29uZmlnLmgKK2JzY2NvbmZpZy5oLmluCitvcGVuYnNjLnBjCitic2NfaGFjaworYnNjX21zY19pcAorYnNjX21nY3AKKyouKn4KKyouc3c/CisKKyNjb25maWd1cmUKK2FjbG9jYWwubTQKK2F1dG9tNHRlLmNhY2hlLworY29uZmlnLmxvZworY29uZmlnLnN0YXR1cworY29uZmlndXJlCitkZXBjb21wCitpbnN0YWxsLXNoCittaXNzaW5nCitzdGFtcC1oMQorCisjIGdpdC12ZXJzaW9uLWdlbiBtYWdpYworLnRhcmJhbGwtdmVyc2lvbgorLnZlcnNpb24KKworCisjIGFwcHMgYW5kIGFwcCBkYXRhCitobHIuc3FsaXRlMworYnMxMV9jb25maWcKK2lwYWNjZXNzLWNvbmZpZworaXBhY2Nlc3MtZmluZAoraXBhY2Nlc3MtZmlybXdhcmUKK2lwYWNjZXNzLXByb3h5Citpc2Ruc3luYworCisjdGVzdHMKK3Rlc3RzL2NoYW5uZWwvY2hhbm5lbF90ZXN0Cit0ZXN0cy9kYi9kYl90ZXN0Cit0ZXN0cy9kZWJ1Zy9kZWJ1Z190ZXN0Cit0ZXN0cy9nc20wNDA4L2dzbTA0MDhfdGVzdAordGVzdHMvc2NjcC9zY2NwX3Rlc3QKK3Rlc3RzL3Ntcy9zbXNfdGVzdAordGVzdHMvdGltZXIvdGltZXJfdGVzdAorCmRpZmYgLS1naXQgYS9vcGVuYnNjL0FVVEhPUlMgYi9vcGVuYnNjL0FVVEhPUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmNjBlNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvQVVUSE9SUwpAQCAtMCwwICsxLDcgQEAKK0hhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CitIb2xnZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorSmFuIEx1ZWJiZSA8amx1ZWJiZUBkZWJpYW4ub3JnPgorU3RlZmFuIFNjaG1pZHQgPHN0ZWZhbkBkYXRlbmZyZWloYWZlbi5vcmc+CitEYW5pZWwgV2lsbG1hbm4gPGRhbmllbEB0b3RhbHVlYmVyd2FjaHVuZy5kZT4KK0FuZHJlYXMgRXZlcnNiZXJnIDxBbmRyZWFzLkV2ZXJzYmVyZ0B2ZXJzYXRlbC5kZT4KK1N5bHZhaW4gTXVuYXV0IDwyNDZ0bnRAZ21haWwuY29tPgpkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL29wZW5ic2MvQ09QWUlORwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIENPUFlJTkcKY29weSB0byBvcGVuYnNjL0NPUFlJTkcKZGlmZiAtLWdpdCBhL29wZW5ic2MvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTExY2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTMgQEAKK0FVVE9NQUtFX09QVElPTlMgPSBmb3JlaWduIGRpc3QtYnppcDIgMS42CisKK0lOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCitTVUJESVJTID0gaW5jbHVkZSBzcmMgdGVzdHMKKworcGtnY29uZmlnZGlyID0gJChsaWJkaXIpL3BrZ2NvbmZpZworcGtnY29uZmlnX0RBVEEgPSBvcGVuYnNjLnBjIGxpYnNjY3AucGMKKworQlVJTFRfU09VUkNFUyA9ICQodG9wX3NyY2RpcikvLnZlcnNpb24KKyQodG9wX3NyY2RpcikvLnZlcnNpb246CisJZWNobyAkKFZFUlNJT04pID4gJEAtdCAmJiBtdiAkQC10ICRACitkaXN0LWhvb2s6CisJZWNobyAkKFZFUlNJT04pID4gJChkaXN0ZGlyKS8udGFyYmFsbC12ZXJzaW9uCmRpZmYgLS1naXQgYS9vcGVuYnNjL1JFQURNRSBiL29wZW5ic2MvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxODA3YmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL1JFQURNRQpAQCAtMCwwICsxLDMwIEBACitBYm91dCBPcGVuQlNDCis9PT09PT09PT09PT09CisKK09wZW5CU0MgaXMgYSBtaW5pbWFsaXN0aWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIEdTTSBOZXR3b3JrLCB3aXRoCitwYXJ0aWN1bGFyIGVtcGhhc2lzIG9uIHRoZSBmdW5jdGlvbmFsaXR5IHR5cGljYWxseSBwcm92aWRlZCBieSB0aGUgQlNDLAorTVNDLCBITFIsIFZMUiBhbmQgU01TQy4KKworSXRzIGN1cnJlbnRseSBzdXBwb3J0ZWQgaW50ZXJmYWNlcyB0b3dhcmRzIHRoZSBCVFMgYXJlOgorCisgKiBDbGFzc2ljIEEtYmlzIG92ZXIgRTEgdXNpbmcgYSBtSVNETiBiYXNlZCBFMSBpbnRlcmZhY2UuIEluIG90aGVyCisgICB3b3JkcywgeW91IGNhbiBjb25uZWN0IGV4aXN0aW5nIEdTTSBCYXNlIFRyYW5zY2VpdmVyIFN0YXRpb24gKEJUUykKKyAgIHRocm91Z2ggRTEgdG8gT3BlbkJTQy4gIFNvIGZhciwgd2UgaGF2ZSBvbmx5IHRlc3RlZCB0aGUgU2llbWVucyBCUy0xMQorICAgVGVzdCByZXBvcnRzIHdpdGggb3RoZXIgQlRTIGFyZSBtdWNoIGFwcHJlY2lhdGVkIQorCisgKiBBLWJpcyBvdmVyIElQIGFzIHVzZWQgYnkgdGhlIGlwLmFjY2VzcyBuYW5vQlRTIHByb2R1Y3QgZmFtaWx5CisKK1RoaXMgcHJvamVjdCBpcyBzdGlsbCBpbiBpdHMgZWFybHkgZGF5cywgYW5kIHRoZXJlIGFyZSBsb3RzIG9mIGFyZWFzIHdoZXJlIGl0Citkb2Vzbid0IGJlaGF2ZSBhcyBwZXIgR1NNIHNwZWMuCisKKwlIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorCisKK2xpYm9zbW9jb3JlCis9PT09PT09PT09PQorCitQbGVhc2Ugbm90ZSB0aGF0IGFzIG9mIE1hcmNoIDIwMTAsIE9wZW5CU0MgaGFzIGEgZGVwZW5kZW5jeSB0byBhIGxpYnJhcnkKK2NhbGxlZCAibGlib3Ntb2NvcmUiLiAgWW91IGNhbiBvYnRhaW4gdGhhdCBsaWJyYXJ5IGZyb20KKworCWdpdDovL2dpdC5vc21vY29tLm9yZy9saWJvc21vY29yZS5naXQKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9jb25maWd1cmUuaW4gYi9vcGVuYnNjL2NvbmZpZ3VyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2QyNjBhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9jb25maWd1cmUuaW4KQEAgLTAsMCArMSw1NyBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQKK0FDX0lOSVQoW29wZW5ic2NdLAorCW00X2VzeXNjbWQoWy4vZ2l0LXZlcnNpb24tZ2VuIC50YXJiYWxsLXZlcnNpb25dKSwKKwlbb3BlbmJzYy1kZXZlbEBsaXN0cy5vcGVuYnNjLm9yZ10pCisKK0FNX0lOSVRfQVVUT01BS0UoW2Rpc3QtYnppcDJdKQorCitkbmwga2VybmVsIHN0eWxlIGNvbXBpbGUgbWVzc2FnZXMKK200X2lmZGVmKFtBTV9TSUxFTlRfUlVMRVNdLCBbQU1fU0lMRU5UX1JVTEVTKFt5ZXNdKV0pCisKK2RubCBjaGVja3MgZm9yIHByb2dyYW1zCitBQ19QUk9HX01BS0VfU0VUCitBQ19QUk9HX0NDCitBQ19QUk9HX0lOU1RBTEwKK0FDX1BST0dfUkFOTElCCisKK2RubCBjaGVja3MgZm9yIGxpYnJhcmllcworQUNfU0VBUkNIX0xJQlMoY3J5cHQsIGNyeXB0LAorICAgIFtMSUJDUllQVD0iLWxjcnlwdCI7IEFDX0RFRklORShbVlRZX0NSWVBUX1BXXSwgW10sIFtVc2UgY3J5cHQgZnVuY3Rpb25hbGl0eSBvZiB2dHkuXSldKQorCitQS0dfQ0hFQ0tfTU9EVUxFUyhMSUJPU01PQ09SRSwgbGlib3Ntb2NvcmUgPj0gMC4xLjIpCisKK2RubCBjaGVja3MgZm9yIGhlYWRlciBmaWxlcworQUNfSEVBREVSX1NUREMKKworZG5sIENoZWNrcyBmb3IgdHlwZWRlZnMsIHN0cnVjdHVyZXMgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcworCisjIFRoZSBmb2xsb3dpbmcgdGVzdCBpcyB0YWtlbiBmcm9tIFdlYktpdCdzIHdlYmtpdC5tNAorc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPSIkQ0ZMQUdTIC1mdmlzaWJpbGl0eT1oaWRkZW4gIgorQUNfTVNHX0NIRUNLSU5HKFtpZiAke0NDfSBzdXBwb3J0cyAtZnZpc2liaWxpdHk9aGlkZGVuXSkKK0FDX0NPTVBJTEVfSUZFTFNFKFtjaGFyIGZvbztdLAorICAgICAgWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICBTWU1CT0xfVklTSUJJTElUWT0iLWZ2aXNpYmlsaXR5PWhpZGRlbiJdLAorICAgICAgICBBQ19NU0dfUkVTVUxUKFtub10pKQorQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTIgorQUNfU1VCU1QoU1lNQk9MX1ZJU0lCSUxJVFkpCisKKworZG5sIEdlbmVyYXRlIHRoZSBvdXRwdXQKK0FNX0NPTkZJR19IRUFERVIoYnNjY29uZmlnLmgpCisKK0FDX09VVFBVVCgKKyAgICBvcGVuYnNjLnBjCisgICAgbGlic2NjcC5wYworICAgIGluY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZQorICAgIGluY2x1ZGUvdnR5L01ha2VmaWxlCisgICAgaW5jbHVkZS9zY2NwL01ha2VmaWxlCisgICAgaW5jbHVkZS9NYWtlZmlsZQorICAgIHNyYy9NYWtlZmlsZQorICAgIHRlc3RzL01ha2VmaWxlCisgICAgdGVzdHMvZGVidWcvTWFrZWZpbGUKKyAgICB0ZXN0cy9nc20wNDA4L01ha2VmaWxlCisgICAgdGVzdHMvZGIvTWFrZWZpbGUKKyAgICB0ZXN0cy9jaGFubmVsL01ha2VmaWxlCisgICAgdGVzdHMvc2NjcC9NYWtlZmlsZQorICAgIE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9jb250cmliL2J0LnB5IGIvb3BlbmJzYy9jb250cmliL2J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFiMTExZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2NvbnRyaWIvYnQucHkKQEAgLTAsMCArMSwzMyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBvcworCitmID0gb3BlbigidW5iYWxhbmNlZCIpCitsaW5lcyA9IFtdCitmb3IgbGluZSBpbiBmOgorICAgIGxpbmVzLmFwcGVuZChsaW5lKQorCitmaWxlbmFtZXMgPSB7fQorCitvdXRwdXQgPSBbXQorZm9yIGxpbmUgaW4gbGluZXM6CisgICAgaWYgIlsweCIgaW4gbGluZToKKyAgICAgICAgc3RhcnQgPSBsaW5lLmZpbmQoIlsiKQorICAgICAgICBlbmQgPSBsaW5lLmZpbmQoIl0iKQorICAgICAgICBhZGRyID0gbGluZVtzdGFydCsxOmVuZF0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZSA9IGZpbGVuYW1lc1thZGRyXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByID0gb3MucG9wZW4oImFkZHIybGluZSAtZnMgLWUgLi9ic2NfaGFjayAlcyIgJSBhZGRyKQorICAgICAgICAgICAgYWxsID0gci5yZWFkKCkucmVwbGFjZSgiXG4iLCAiLCIpCisgICAgICAgICAgICBmaWxlID0gYWxsCisgICAgICAgICAgICBmaWxlbmFtZXNbYWRkcl0gPSBmaWxlCisKKyAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZShhZGRyLCBmaWxlKQorICAgIG91dHB1dC5hcHBlbmQobGluZSkKKworZyA9IG9wZW4oInVuYmFsYW5jZWQuMiIsICJ3IikKK2cud3JpdGUoIiIuam9pbihvdXRwdXQpKQorCisKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9jb250cmliL2NvbnZlcnRfdG9fZW51bS5weSBiL29wZW5ic2MvY29udHJpYi9jb252ZXJ0X3RvX2VudW0ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmNkNmYyYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvY29udHJpYi9jb252ZXJ0X3RvX2VudW0ucHkKQEAgLTAsMCArMSwzNyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMKKyMgQ29udmVydCBFVFNJIGRvY3VtZW50cyB0byBhbiBlbnVtCisjCisKK2ltcG9ydCByZSwgc3lzCisKK2RlZiBjb252ZXJ0KHN0cmluZyk6CisgICAgc3RyaW5nID0gc3RyaW5nLnN0cmlwKCkucmVwbGFjZSgiICIsICIiKS5yanVzdCg4LCAiMCIpCisgICAgdmFyID0gMAorICAgIG9mZnNldCA9IDcKKyAgICBmb3IgY2hhciBpbiBzdHJpbmc6CisgICAgICAgIGFzc2VydCBvZmZzZXQgPj0gMAorICAgICAgICB2YXIgPSB2YXIgfCAoaW50KGNoYXIpIDw8IG9mZnNldCkKKyAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IC0gMQorCisgICAgcmV0dXJuIHZhcgorCitkZWYgc3RyaW5nKG5hbWUpOgorICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoIiAiLCAiXyIpCisgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnIicsICIiKQorICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy8nLCAnXycpCisgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnKCcsICdfJykKKyAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcpJywgJ18nKQorICAgIHJldHVybiAiJXNfJXMiICUgKHN5cy5hcmd2WzJdLCBuYW1lLnVwcGVyKCkpCisKK2ZpbGUgPSBvcGVuKHN5cy5hcmd2WzFdKQorCisKK2ZvciBsaW5lIGluIGZpbGU6CisgICAgbSA9IHJlLm1hdGNoKHIiWyBcdF0qKD9QPHZhbHVlPlswMSBdKylbIF0rKD9QPG5hbWU+W2EtekEtWiAvMC05KCldKykiLCBsaW5lWzotMV0pCisKKyAgICBpZiBtOgorICAgICAgICBwcmludCAiXHQlc1x0XHQ9ICVkLCIgJSAoc3RyaW5nKG0uZ3JvdXBkaWN0KClbIm5hbWUiXSksIGNvbnZlcnQobS5ncm91cGRpY3QoKVsidmFsdWUiXSkpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgbGluZVs6LTFdCmRpZmYgLS1naXQgYS9vcGVuYnNjL2NvbnRyaWIvbWdjcF9zZXJ2ZXIucHkgYi9vcGVuYnNjL2NvbnRyaWIvbWdjcF9zZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2YzZWYzOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvY29udHJpYi9tZ2NwX3NlcnZlci5weQpAQCAtMCwwICsxLDU0IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgU2ltcGxlIHNlcnZlciBmb3IgbWdjcC4uLiBzZW5kIGF1ZGl0LCByZWNlaXZlIHJlc3BvbnNlLi4KKworaW1wb3J0IHNvY2tldCwgdGltZQorCitNR0NQX0dBVEVXQVlfUE9SVCA9IDI0MjcKK01HQ1BfQ0FMTEFHRU5UX1BPUlQgPSAyNzI3CisKK3JzaXBfcmVzcCA9ICIiIjIwMCAzMjEzMjEzMzJcclxuIiIiCithdWRpdF9wYWNrZXQgPSAiIiJBVUVQICVkIDEzQG1ndyBNR0NQIDEuMFxyXG4iIiIKK2NyY3hfcGFja2V0ID0gIiIiQ1JDWCAlZCAxNEBtZ3cgTUdDUCAxLjBcclxuQzogNGE4NGFkNWQyNWZcclxuTDogcDoyMCwgYTpHU00tRUZSLCBudDpJTlxyXG5NOiByZWN2b25seVxyXG4iIiIKK2RsY3hfcGFja2V0ID0gIiIiRExDWCAlZCAxNEBtZ3cgTUdDUCAxLjBcclxuQzogNGE4NGFkNWQyNWZcclxuSTogJWRcclxuIiIiCittZGN4X3BhY2tldCA9ICIiIk1EQ1ggJWQgMTRAbWd3IE1HQ1AgMS4wXHJcbkM6IDRhODRhZDVkMjVmXHJcbkk6ICVkXHJcbkw6IHA6MjAsIGE6R1NNLUVGUiwgbnQ6SU5cclxuTTogcmVjdm9ubHlcclxuXHJcbnY9MFxyXG5vPS0gMjU4Njk2NDc3IDAgSU4gSVA0IDE3Mi4xNi4xLjEwN1xyXG5zPS1cclxuYz1JTiBJUDQgMTcyLjE2LjEuMTA3XHJcbnQ9MCAwXHJcbm09YXVkaW8gNDQwMCBSVFAvQVZQIDEyN1xyXG5hPXJ0cG1hcDoxMjcgR1NNLUVGUi84MDAwLzFcclxuYT1wdGltZToyMFxyXG5hPXJlY3Zvbmx5XHJcbm09aW1hZ2UgNDQwMiB1ZHB0bCB0MzhcclxuYT1UMzhGYXhWZXJzaW9uOjBcclxuYT1UMzhNYXhCaXRSYXRlOjE0NDAwXHJcbiIiIgorCitkZWYgaGV4ZHVtcChzcmMsIGxlbmd0aD04KToKKyAgICAiIiJSZWNpcGUgaXMgZnJvbSBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy8xNDI4MTIvIiIiCisgICAgcmVzdWx0ID0gW10KKyAgICBkaWdpdHMgPSA0IGlmIGlzaW5zdGFuY2Uoc3JjLCB1bmljb2RlKSBlbHNlIDIKKyAgICBmb3IgaSBpbiB4cmFuZ2UoMCwgbGVuKHNyYyksIGxlbmd0aCk6CisgICAgICAgcyA9IHNyY1tpOmkrbGVuZ3RoXQorICAgICAgIGhleGEgPSBiJyAnLmpvaW4oWyIlMCpYIiAlIChkaWdpdHMsIG9yZCh4KSkgIGZvciB4IGluIHNdKQorICAgICAgIHRleHQgPSBiJycuam9pbihbeCBpZiAweDIwIDw9IG9yZCh4KSA8IDB4N0YgZWxzZSBiJy4nICBmb3IgeCBpbiBzXSkKKyAgICAgICByZXN1bHQuYXBwZW5kKCBiIiUwNFggICAlLSpzICAgJXMiICUgKGksIGxlbmd0aCooZGlnaXRzICsgMSksIGhleGEsIHRleHQpICkKKyAgICByZXR1cm4gYidcbicuam9pbihyZXN1bHQpCisKK3NlcnZlcl9zb2NrZXQgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19ER1JBTSkKK3NlcnZlcl9zb2NrZXQuYmluZCgoIjEyNy4wLjAuMSIsIE1HQ1BfQ0FMTEFHRU5UX1BPUlQpKQorc2VydmVyX3NvY2tldC5zZXRibG9ja2luZygwKQorCisKK2RlZiBzZW5kX3JlY2VpdmUocGFja2V0KToKKyAgICBzZXJ2ZXJfc29ja2V0LnNlbmR0byhwYWNrZXQsICgiMTI3LjAuMC4xIiwgTUdDUF9HQVRFV0FZX1BPUlQpKQorICAgIHRyeToKKyAgICAgICAgZGF0YSwgYWRkciA9IHNlcnZlcl9zb2NrZXQucmVjdmZyb20oNDA5NikKKyAgICAgICAgcHJpbnQgaGV4ZHVtcChkYXRhKSwgYWRkcgorICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgIHBhc3MKKworZGVmIGdlbmVyYXRlX3RpZCgpOgorICAgIGltcG9ydCByYW5kb20KKyAgICByZXR1cm4gcmFuZG9tLnJhbmRpbnQoMCwgNjUxMjMpCisKKworCitpID0gMQord2hpbGUgVHJ1ZToKKyAgICBzZW5kX3JlY2VpdmUocnNpcF9yZXNwKQorICAgIHNlbmRfcmVjZWl2ZShhdWRpdF9wYWNrZXQpCisgICAgc2VuZF9yZWNlaXZlKGNyY3hfcGFja2V0ICUgZ2VuZXJhdGVfdGlkKCkgKQorICAgIHNlbmRfcmVjZWl2ZShtZGN4X3BhY2tldCAlIChnZW5lcmF0ZV90aWQoKSwgaSkpCisgICAgc2VuZF9yZWNlaXZlKGRsY3hfcGFja2V0ICUgKGdlbmVyYXRlX3RpZCgpLCBpKSkKKyAgICBpID0gaSArIDEKKworICAgIHRpbWUuc2xlZXAoMykKZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL0JTMTEtT01MLnR4dCBiL29wZW5ic2MvZG9jL0JTMTEtT01MLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWMzMjk5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2MvQlMxMS1PTUwudHh0CkBAIC0wLDAgKzEsMzEgQEAKK1RoZSBTaWVtZW5zIEJTLTExIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBHU00gMTIuMjEgT01MIG9wZXJhdGlvbnM6CisKKworQ1JFQVRFIE9CSkVDVAorCithYmlzX29tX2ZvbV9oZHIub2JqX2NsYXNzIGNhbiBiZSAKK0EzOgorQTU6IEFMQ08sIEJCU0lHLCBDQ0xLLCBHUFNVLCBMSSwgUEEKK0E4OiBFbnZhQlRTRQorQTk6IEJQT1JUCisKK3RoZSBhYmlzX29tX29ial9pbnN0LnRyeF9uciBmaWVsZCBpbmRpY2F0ZXMgdGhlIGluZGV4IG9mIG9iamVjdCwgd2hlcmVhcyB0aGUKK2FiaXNfb21fZm9tX2hkci5idHNfbnIgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisKK2VudW0gYWJpc19iczExX29ianR5cGUgeworCUJTMTFfT0JKX0FMQ08JCT0gMHgwMSwKKwlCUzExX09CSl9CQlNJRwkJPSAweDAyLAkvKiBvYmpfY2xhc3M6IDAsMSAqLworCUJTMTFfT0JKX1RSWDEJCT0gMHgwMywJLyogb25seSBERUFDVElWQVRFIFRSWDEgKi8KKwlCUzExX09CSl9DQ0xLCQk9IDB4MDQsCisJQlMxMV9PQkpfR1BTVQkJPSAweDA2LAorCUJTMTFfT0JKX0xJCQk9IDB4MDcsCisJQlMxMV9PQkpfUEEJCT0gMHgwOSwJLyogb2JqX2NsYXNzOiAwLCAxKi8KK307CisKK0luIGNhc2Ugb2YgQ1JFQVRFIEVOVkFCVFNFLCB0aGUgYWJpc19vbV9vYmpfaW5zdC50cnhfbnIgaW5kaWNhdGVzIHRoZSBFbnZhQlRTRXgKK251bWJlci4KKworSW4gY2FzZSBvZiBBOSAoQ1JFQUVURSBCUE9SVCksIHRoZSBhYmlzX29tX29ial9pbnN0LmJ0c19uciBpbmRpY2F0ZXMgd2hpY2ggQlBPUlQKK3NoYWxsIGJlIHVzZWQuCisKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvY2FsbC1yb3V0aW5nLnR4dCBiL29wZW5ic2MvZG9jL2NhbGwtcm91dGluZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwMmY5ZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL2NhbGwtcm91dGluZy50eHQKQEAgLTAsMCArMSwyNSBAQAorQ2FsbCByb3V0aW5nIGluIE9wZW5CU0MKKworRmxvdyBvZiBldmVudHM6CisKKyAjIE1PIGNhbGwgaW5pdGlhdGVkIGJ5IE1TLCBDSEFOTkVMIFJRRCwgSU1NRURJQVRFIEFTU0lHTgorICMgTVMgc2VuZHMgQ0MgU0VUVVAgbWVzc2FnZSwgd2UgYXNzdW1lIGFscmVhZHkgb24gVENIL0ggRkFDQ0gKKyAjIE9wZW5CU0MgZG9lcyBhIHN1YnNjcmliZXIgbG9va3VwIGJhc2VkIG9uIHRoZSB0YXJnZXQgZXh0ZW5zaW9uCisgICogSWYgYSBzdWJzY3JpYmVyIGlzIGZvdW5kOgorICAgIyBzZW5kIENBTEwgUFJPQ0VFRElORyBtZXNzYWdlIHRvIE1PCisgICAjIHBhZ2UgdGhlIE1UIHN1YnNjcmliZXIgYW5kIGFzayBpdEkgdG8gYXNrIGZvciBUQ0gvSAorICAgIyBvbmNlIHBhZ2luZyBjb21wbGV0ZXMsIHdlIGhhdmUgdGhlIFRDSC9IIGZvciB0aGUgTVQgZW5kCisgICAjIHNlbmQgU0VUVVAgdG8gTVQKKyAgICMgcmVjZWl2ZSBDQUxMIENPTkZJUk1FRCBmcm9tIE1UCisgICAjIHNldC11cCB0aGUgVFJBVSBtdXggbWFwcGluZyBiZXR3ZWVuIHRoZSBFMSBzdWJzbG90cyBmb3IgYm90aCBUQ0gvSAorICAgIyByZWNlaXZlIEFMRVJUSU5HIGZyb20gTVQsIHJvdXRlIEFMRVJUSU5HIHRvIE1PCisgICAjIHJlY2VpdmUgQ09OTkVDVCBmcm9tIE1ULCBjb25maXJtIHRvIE1UIHdpdGggQ09OTkVDVF9BQ0sKKyAgICMgc2VuZCBhIENPTk5FQ1QgbWVzc2FnZSB0byBNTywgcmVjZWl2ZSBDT05ORUNUX0FDSyBmcm9tIE1PCisgKiBJZiBzdWJzY3JpYmVyIGlzIG5vdCBmb3VuZDoKKyAgIyBzZW5kIFJFTEVBU0UgQ09NUExFVEUgd2l0aCBhcHJvcHJpYXRlIGNhdXNlIHRvIE1PICgxOiB1bmFsbG9hY2F0ZWQgMzogbm8gcm91dGUpCisgIAorCisKK1Rob3VnaHRzIGFib3V0IFJSL01NOgorCisqIHdlIGFsbG9jYXRlIFJSL01NIGVudGl0aWVzIG9uIGRlbWFuZCwgd2hlbiB3ZSBuZWVkIHRoZW0KZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL2NoYW5uZWxfcmVsZWFzZS50eHQgYi9vcGVuYnNjL2RvYy9jaGFubmVsX3JlbGVhc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhY2YwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9jaGFubmVsX3JlbGVhc2UudHh0CkBAIC0wLDAgKzEsNzQgQEAKKworR1NNIDA0LjA4IDcuMS43IC8gOS4xLjcJCVJSIENIQU5ORUwgUkVMRVNFCisKK1JTTCAwOC41OCAzLjQgLyA/CQlSTEwgTGluayBSZWxlYXNlIFJlcXVlc3QKKworUlNMIDA4LjU4IDQuNiAvIDguNC41CQlERUFDVGl2YXRlIFNBQ0NICisJKiBEZWFjdGl2YXRlIFNBQ0NIIGFjY29yZGluZyB0byBDaGFubmVsIFJlbGVhc2UgUHJvYyAwNC4wOAorCSogdG8gYmUgc2VudCBhZnRlciBSUiBDSEFOTkVMIFJFTEVBU0UgaXMgc2VudCB0byBNUworCitSU0wgMDguNTggNC43IC8gOC40LjE0CQlSRiBDSEFObmVsIFJFTGVhc2UKKwkqIHRlbGxzIHRoZSBCVFMgdG8gcmVsZWFzZSBhIHJhZGlvIGNoYW5uZWwKKwkqICJ3aGVuIGFuIGFjdGl2YXRlZCByYWRpbyBjaGFubmVsIGlzIG5vIGxvbmdlciBuZWVkZWQiCisJKiBCVFMgcmVzcG9uZHMgd2l0aCBSRiBDSEFObmVsIFJFTGVhc2UgQUNLbm93bGVkZ2UKKworCitHU00gMDQuMDggMy40LjEzOiBSUiBjb25uZWN0aW9uIHJlbGVhc2UgcHJvY2VkdXJlCisKKyogbmV0d29yayBzZW5kcyBSUiBDSEFOTkVMIFJFTEVBU0UgdG8gTVMgb24gdGhlIERDQ0gKKyAgKiBzdGFydCBUMzEwOQorICAqIGRlYWN0aXZhdGUgU0FDQ0gKKyogTVMgZGlzY29ubmVjdHMgbWFpbiBzaWduYWxsaW5nIGxpbmsgKGJ5IHNlbmRpbmcgRElTQykKKyAgKiBhbGwgb3RoZXIgZGF0YSBsaW5rcyBhcmUgZGlzY29ubmVjdGVkIGJ5IGxvY2FsIGVuZCBsaW5rIHJlbGVhc2UKKyogbmV0d29yayByZWNlaXZlcyBESVNDIChCVFMgc2VuZHMgUkxMIFJFTCBJTkQgdG8gQlNDKQorICAqIHN0b3AgVDMxMDkKKyAgKiBzdGFydCBUMzExMSAKKyogd2hlbiBUMzExMSB0aW1lcyBvdXQsIHRoZSBuZXR3b3JrIGNhbiByZXVzZSB0aGUgY2hhbm5scworKiBpZiBUMzEwOSB0aW1lcyBvdXQsIHRoZSBuZXR3b3JrIGRlYWN0aXZhdGVzIHRoZSBjaGFubmVscyAKKyAgYW5kIGNhbiByZXVzZSB0aGVtCisgICogdGhpcyBwcm9iYWJseSBtZWFucyBzaW1wbHkgUkYgQ0hBTm5lbCBSRUxlYXNlCisKKworPT0gSW1wbGVtZW50YXRpb24gaW4gT3BlbkJTQyA9PQorCitjaGFuX2FsbG9jLmM6bGNoYW5fYXV0b19yZWxlYXNlKCkKKwkqIGNoZWNrcyBpZiB1c2UgY291bnQgc3RpbGwgPiAwIChhYm9ydCkKKwkqIGNhbGxzIGdzbTQ4X3NlbmRfcnJfcmVsZWFzZSgpCisJCSogd2hpY2ggY2FsbHMgcnNsX2RlYWN0X3NhY2NoKCkKKwkqIGNhbGxzIHJzbF9yZWxlYXNlX3JlcXVlc3QoKQorCQkqIHdoaWNoIHNlbmRzIFJMTCBMaW5rIFJlbGVhc2UgcmVxdWVzdAorCQorUlggb2YgUkVMZWFzZSBJTkRpY2F0aW9uOgorCSogY2FsbCByc2xfcmZfY2hhbl9yZWxlYXNlKCkgKHNlbmQgUkZfQ0hBTl9SRUwpCisKK1JYIG9mIFJFTGVhc2UgQ09ORmltZW06CisJKiBjYWxsIHJzbF9yZl9jaGFuX3JlbGVhc2UoKSAoc2VuZCBSRl9DSEFOX1JFTCkKKworKiBSWCBvZiBSRl9DSEFOX1JFTF9BQ0sKKwkqIGNhbGwgbGNoYW5fZnJlZSgpCisJCSogc3Vic2NyX3B1dCgpCisJCSogZGVsZXRlIHJlbGVhc2VfdGltZXIKKworCis9PT0gSW50ZWdyYXRpb24gd2l0aCBTTVMgPT09CisKKyogUlggb2YgQ1BfRVJST1Igb3IgdW5pbXBsZW1lbnRlZCBNVAorCSogdHJpZ2dlciB0cmFuc19mcmVlKCkgd2hpY2ggd2lsbCBsY2hhbl9hdXRvX3JlbGVhc2UoKQorCisqIENQIFRDMSogZXhwaXJlZCB3aGlsZSB3YWl0aW5nIGZvciBDUC1BQ0sKKwkqIHRyaWdnZXIgdHJhbnNfZnJlZSgpIHdoaWNoIHdpbGwgbGNoYW5fYXV0b19yZWxlYXNlKCkKKworKiBSWCBvZiBSUF9FUlJPUgorCSogdHJpZ2dlciB0cmFuc19mcmVlKCkgd2hpY2ggd2lsbCBsY2hhbl9hdXRvX3JlbGVhc2UoKQorCQorKiBUWCBvZiBDUC1BQ0sgaW4gTVQgREVMSVZFUgorCSogdHJpZ2dlciB0cmFuc19mcmVlKCkgd2hpY2ggd2lsbCBsY2hhbl9hdXRvX3JlbGVhc2UoKQorCisqIFJYIG9mIENQLUFDSyBpbiBNTyBTVUJNSVQKKwkqIHRyaWdnZXIgdHJhbnNfZnJlZSgpIHdoaWNoIHdpbGwgbGNoYW5fYXV0b19yZWxlYXNlKCkKKwkKKyogUlggb2YgUlAtQUNLIGluIE1UIERFTElWRVIgKGFuZCBubyBtb3JlIG1lc3NhZ2VzKQorCSogdHJpZ2dlciByc2xfcmVsZWFzZV9yZXF1ZXN0KCkgZm9yIFNBUEkzCisKKyogUlggb2YgUlAtU01NQSBpbiBNVCBERUxJVkVSIChhbmQgbm8gbW9yZSBtZXNzYWdlcykKKwkqIHRyaWdnZXIgcnNsX3JlbGVhc2VfcmVxdWVzdCgpIGZvciBTQVBJMwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvZTEtZGF0YS1tb2RlbC50eHQgYi9vcGVuYnNjL2RvYy9lMS1kYXRhLW1vZGVsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTk0ZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2MvZTEtZGF0YS1tb2RlbC50eHQKQEAgLTAsMCArMSwxNzIgQEAKK0UxIHJlbGF0ZWQgZGF0YSBtb2RlbAorCitUaGlzIGRhdGEgbW9kZWwgZGVzY3JpYmVzIHRoZSBwaHlzaWNhbCByZWxhdGlvbnNoaXAgb2YgdGhlIGluZGl2aWR1YWwKK3BhcnRzIGluIHRoZSBuZXR3b3JrLCBpdCBpcyBub3QgdGhlIGxvZ2ljYWwvcHJvdG9jb2wgc2lkZSBvZiB0aGUgR1NNCituZXR3b3JrLgorCitBIEJUUyBpcyBjb25uZWN0ZWQgdG8gdGhlIEJTQyBieSBzb21lIHBoeXNpY2FsIGxpbmsuICBJdCBjb3VsZCBiZSBhbiBhY3R1YWwKK0UxIGxpbmssIGJ1dCBpdCBjb3VsZCBhbHNvIGJlIGFiaXMtb3Zlci1JUCB3aXRoIGEgbWl4dHVyZSBvZiBUQ1AgYW5kIFJUUC9VRFAuCisKK1RvIGZ1cnRoZXIgY29tcGxpY2F0ZSB0aGUgZmFjdCwgbXVsdGlwbGUgQlRTIGNhbiBzaGFyZSBvbmUgc3VjaCBweXNpY2FsCitsaW5rLiAgT24gYSBzaW5nbGUgRTEgbGluZSwgd2UgY2FuIGVhc2lseSBhY2NvbW9kYXRlIHVwIHRvIHRocmVlIEJUUyB3aXRoCit0d28gVFJYIGVhY2guCisKK1RodXMsIGl0IGlzIGJlc3QgZm9yIE9wZW5CU0MgdG8gaGF2ZSBzb21lIGtpbmQgb2YgYWJzdHJhY3Rpb24gbGF5ZXIuICBUaGUgQlNDJ3MKK3ZpZXcgb2YgYSBCVFMgY29ubmVjdGVkIHRvIGl0LiAgV2UgY2FsbCB0aGlzICdidHNfbGluaycuICBBIGJ0c19saW5rIGNhbiBiZQorKiBhbGwgdGhlIFRDUCBhbmQgVURQIHN0cmVhbXMgb2YgYSBBYmlzLW92ZXItSVAgQlRTCisqIGEgc2V0IG9mIEUxIHRpbWVzbG90cyBmb3IgT01MLCBSU0wgYW5kIFRSQVUgY29ubmVjdGlvbnMgb24gYSBFMSBsaW5rCisqIGEgc2VyaWFsIGxpbmUgZXhjbHVzaXZlbHkgdXNlZCBmb3IgT01MIG1lc3NhZ2VzIChULUxpbmspCisKK0EgYnRzX2xpbmsgY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgT3BlbkJTQyBjb3JlIGF0IHJ1bnRpbWUuCisKK3N0cnVjdCB0cnhfbGluayB7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7Cit9OworCitzdHJ1Y3QgYnRzX2xpbmsgeworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IHRyeF9saW5rIHRyeF9saW5rc1tOVU1fVFJYXTsKK307CisKK0ludGVyZmFjZSBmcm9tIHN0YWNrIHRvIGlucHV0IGNvcmU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitpbnQgYWJpc19yc2xfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKwlzZW5kIGEgbWVzc2FnZSB0aHJvdWdoIGEgUlNMIGxpbmsgdG8gdGhlIFRSWCBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlciBpbgorCW1zZy0+dHJ4LgorCitpbnQgYWJpc19yc2xfcmN2bXNnKHN0cnVjdCBtc2diICptc2cpOworCXJlY2VpdmUgYSBtZXNzYWdlIGZyb20gYSBSU0wgbGluayBmcm9tIHRoZSBUUlggc3BlY2lmaWVkIGJ5IHRoZQorCWNhbGxlciBpbiBtc2ctPnRyeC4KKworaW50IGFiaXNfbm1fc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKwlzZW5kIGEgbWVzc2FnZSB0aHJvdWdoIGEgT01MIGxpbmsgdG8gdGhlIEJUUyBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlciBpbgorCW1zZy0+dHJ4LT5idHMuICBUaGUgY2FsbGVyIGNhbiBqdXN0IHVzZSBidHMtPmMwIHRvIGdldCB0aGUgZmlyc3QgVFJYCisJaW4gYSBCVFMuIChPTUwgbWVzc2FnZXMgYXJlIG5vdCByZWFsbHkgc2VudCB0byBhIFRSWCBidXQgdG8gdGhlIEJUUykKKworaW50IGFiaXNfbm1fcmN2bXNnKHN0cnVjdCBtc2diICptc2cpOworCXJlY2VpdmUgYSBtZXNzYWdlIGZyb20gYSBPTUwgbGluayBmcm9tIHRoZSBCVFMgc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIKKwlpbiBtc2ctPnRyeC0+YnRzLiAgVGhlIGNhbGxlciBjYW4ganVzdCB1c2UgYnRzLT5jMCB0byBnZXQgdGhlIGZpcnN0CisJVFJYIGluIGEgQlRTLgorCitpbnQgYWJpc19saW5rX2V2ZW50KGludCBldmVudCwgdm9pZCAqZGF0YSk7CisJc2lnbmFsIHNvbWUgZXZlbnQgKHN1Y2ggYXMgbGF5ZXIgMSBjb25uZWN0L2Rpc2Nvbm5lY3QpIGZyb20gdGhlCisJaW5wdXQgY29yZSB0byB0aGUgc3RhY2suCisKK2ludCBzdWJjaF9kZW11eF9pbihteCwgY29uc3QgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pOworCXJlY2VpdmUgJ2xlbicgYnl0ZXMgZnJvbSBhIGdpdmVuIEUxIHRpbWVzbG90IChUUkFVIGZyYW1lcykKKworaW50IHN1YmNoYW5fbXV4X291dChteCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pOworCW9idGFpbiAnbGVuJyBieXRlcyBvZiBvdXRwdXQgZGF0YSB0byBiZSBzZW50IG9uIEUxIHRpbWVzbG90CisKK0ludHJmYWNlIGJ5IElucHV0IENvcmUgZm9yIElucHV0IFBsdWdpbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW50IGJ0c2xpbmtfcmVnaXN0ZXJfcGx1Z2luKCk7CisKKworQ29uZmlndXJhdGlvbiBmb3IgdGhlIEUxIGlucHV0IG1vZHVsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitCVFMKKwlCVFMgbnVtYmVyCisJbnVtYmVyIG9mIFRSWAorCU9NTCBsaW5rCisJCUUxIGxpbmUgbnVtYmVyCisJCXRpbWVzbG90IG51bWJlcgorCQlbc3Vic2xvdCBudW1iZXJdCisJCVNBUEkKKwkJVEVJCisJZm9yIGVhY2ggVFJYCisJCVJTTCBsaW5rCisJCQlFMSBsaW5lIG51bWJlcgorCQkJdGltZXNsb3QgbnVtYmVyCisJCQlbc3Vic2xvdCBudW1iZXJdCisJCQlTQVBJCisJCQlURUkKKwkJZm9yIGVhY2ggVFMKKwkJCUUxIGxpbmUgbnVtYmVyCisJCQl0aW1lc2xvdCBudW1iZXIKKwkJCXN1YnNsb3QgbnVtYmVyCisKKworRTEgaW5wdXQgbW9kdWxlIGRhdGEgbW9kZWwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitlbnVtIGUxaW5wX3NpZ25fdHlwZSB7CisJRTFJTlBfU0lHTl9OT05FLAorCUUxSU5QX1NJR05fT01MLAorCUUxSU5QX1NJR05fUlNMLAorfTsKKworc3RydWN0IGUxaW5wX3NpZ25fbGluayB7CisJLyogbGlzdCBvZiBzaWduYWxsaW5nIGxpbmtzICovCisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCWVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGU7CisKKwkvKiB0cnggZm9yIG1zZy0+dHJ4IG9mIHJlY2VpdmVkIG1zZ3MgKi8JCisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwkvKiBtc2diIHF1ZXVlIG9mIHRvLWJlLXRyYW5zbWl0dGVkIG1zZ3MgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0eF9saXN0OworCisJLyogU0FQSSBhbmQgVEVJIG9uIHRoZSBFMSBUUyAqLworCXVfaW50OF90IHNhcGk7CisJdV9pbnQ4X3QgdGVpOworfQorCitlbnVtIGUxaW5wX3RzX3R5cGUgeworCUUxSU5QX1RTX1RZUEVfTk9ORSwKKwlFMUlOUF9UU19UWVBFX1NJR04sCisJRTFJTlBfVFNfVFlQRV9UUkFVLAorfTsKKworLyogQSB0aW1lc2xvdCBpbiB0aGUgRTEgaW50ZXJmYWNlICovCitzdHJ1Y3QgZTFpbnBfdHMgeworCWVudW0gZTFpbnBfdHNfdHlwZSB0eXBlOworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBsbGlzdF9oZWFkIHNpZ25fbGlua3M7CisJCX0gc2lnbjsKKwkJc3RydWN0IHsKKwkJCS8qIHN1YmNoYW5uZWwgZGVtdXhlciBmb3IgZnJhbWVzIGZyb20gRTEgKi8KKwkJCXN0cnVjdCBzdWJjaF9kZW11eCBkZW11eDsKKwkJCS8qIHN1YmNoYW5uZWwgbXV4ZXIgZm9yIGZyYW1lcyB0byBFMSAqLworCQkJc3RydWN0IHN1YmNoX211eCBtdXg7CisJCX0gdHJhdTsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCS8qIG1JU0ROIGRyaXZlciBoYXMgb25lIGZkIGZvciBlYWNoIHRzICovCisJCQlzdHJ1Y3QgYnNjX2ZkOworCQl9IG1pc2RuOworCX0gZHJpdmVyOworfTsKKworc3RydWN0IGUxaW5wX2xpbmUgeworCXVuc2lnbmVkIGludCBudW07CisJY2hhciAqbmFtZTsKKworCXN0cnVjdCBlMWlucF90cyB0c1tOUl9FMV9UU107CisKKwljaGFyICplMWlucF9kcml2ZXI7CisJdm9pZCAqZHJpdmVyX2RhdGE7Cit9OworCisvKiBDYWxsIGZyb20gdGhlIFN0YWNrOiBjb25maWd1cmF0aW9uIG9mIHRoaXMgVFMgaGFzIGNoYW5nZWQgKi8KK2ludCBlMWlucF91cGRhdGVfdHMoc3RydWN0IGUxaW5wX3RzICp0cyk7CisKKy8qIFJlY2VpdmUgYSBwYWNrZXQgZnJvbSB0aGUgRTEgZHJpdmVyICovCitpbnQgZTFpbnBfcnhfdHMoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IG1zZ2IgKm1zZywKKwkJdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKTsKKworLyogU2VuZCBhIHBhY2tldCwgY2FsbGJhY2sgZnVuY3Rpb24gaW4gdGhlIGRyaXZlciAqLworaW50IGUxZHJpdmVyX3R4X3RzKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBtc2diICptc2cpCisKKworc3RydWN0IGUxaW5wX2RyaXZlciB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCp3YW50X3dyaXRlKShzdHJ1Y3QgZTFpbnBfdHMgKnRzKTsKK307CmRpZmYgLS1naXQgYS9vcGVuYnNjL2RvYy9nc20taG9wcGluZy50eHQgYi9vcGVuYnNjL2RvYy9nc20taG9wcGluZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxMDkzOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL2dzbS1ob3BwaW5nLnR4dApAQCAtMCwwICsxLDU0IEBACithY2NvcmRpbmcgdG8gR1NNIDA1LjAyOgorCitnZW5lcmFsIHBhcmFtZXRlcnMgZnJvbSBDQ0NIOgorKiBDQSBjZWxsIGFsbG9jYXRpb24gb2YgQVJGQ04ncyAoU3lzdGVtIEluZm9ybWF0aW9uIC8gQkNDSCkKKyogRk46IFRETUEgZnJhbWUgbnVtYmVyICh0MSx0Mix0MycpIGluIFNDSAorCitzcGVjaWZpYyBwYXJhbWV0ZXJzIGZyb20gY2hhbm5lbCBhc3NpZ25tZW50OgorKiBNQTogbW9iaWxlIGFsbG9jYXRpb24sIGRlZmluZXMgc2V0IG9mIEFSRkNOJ3MsIHVwIHRvIDY0CisqIE1BSU86IGluZGV4CisqIEhTTjogaG9wcGluZyBzZXF1ZW5jZSBnZW5lcmF0b3IgbnVtYmVyICgwLi42NCkKKworCitob3BwaW5nIHNlcXVlbmNlIGdlbmVyYXRpb24gKDYuMi4zKToKKwordV9pbnQ4X3Qgcm50YWJsZVsxMTRdID0geworCSA0OCwgIDk4LCAgNjMsICAgMSwgIDM2LCAgOTUsICA3OCwgMTAyLCAgOTQsICA3MywKKwkgIDAsICA2NCwgIDI1LCAgODEsICA3NiwgIDU5LCAxMjQsICAyMywgMTA0LCAxMDAsCisJMTAxLCAgNDcsIDExOCwgIDg1LCAgMTgsICA1NiwgIDk2LCAgODYsICA1NCwgICAyLAorCSA4MCwgIDM0LCAxMjcsICAxMywgICA2LCAgODksICA1NywgMTAzLCAgMTIsICA3NCwKKwkgNTUsIDExMSwgIDc1LCAgMzgsIDEwOSwgIDcxLCAxMTIsICAyOSwgIDExLCAgODgsCisJIDg3LCAgMTksICAgMywgIDY4LCAxMTAsICAyNiwgIDMzLCAgMzEsICAgOCwgIDQ1LAorCSA4MiwgIDU4LCAgNDAsIDEwNywgIDMyLCAgIDUsIDEwNiwgIDkyLCAgNjIsICA2NywKKwkgNzcsIDEwOCwgMTIyLCAgMzcsICA2MCwgIDY2LCAxMjEsICA0MiwgIDUxLCAxMjYsCisJMTE3LCAxMTQsICAgNCwgIDkwLCAgNDMsICA1MiwgIDUzLCAxMTMsIDEyMCwgIDcyLAorCSAxNiwgIDQ5LCAgIDcsICA3OSwgMTE5LCAgNjEsICAyMiwgIDg0LCAgIDksICA5NywKKwkxMjUsICA5OSwgIDE3LCAxMjMKK307CisKKy8qIG1haT0wIHJlcHJlc2VudHMgbG93ZXN0IEFSRkNOIGluIHRoZSBNQSAqLworCisKK3VfaW50OF90IGhvcHBpbmdfbWFpKHVfaW50OF90IGhzbiwgdV9pbnQzMl90IGZuLCB1X2ludDhfdCBtYWlvLAorCQkgICAgIHVfaW50OF90IHQxLCB1X2ludDhfdCB0MiwgdV9pbnQ4X3QgdDNfKQoreworCXVfaW50OF90IG1haTsKKworCWlmIChoc24gPT0gMCkgLyogY3ljbGljIGhvcHBpbmcgKi8KKwkJbWFpID0gKGZuICsgbWFpbykgJSBuOworCWVsc2UgeworCQl1X2ludDMyX3QgbSwgbV8sIHRfLCBzOworCisJCW0gPSB0MiArIHJudGFibGVbKGhzbiB4b3IgKHQxICUgNjQpKSArIHQzXTsKKwkJbV8gPSBtICUgKDJeTkJJTik7CisJCXRfID0gdDMgJSAoMl5OQklOKTsKKwkJaWYgKG1fIDwgbiB0aGVuKQorCQkJcyA9IG1fOworCQllbHNlCisJCQlzID0gKG1fICsgdF8pICUgbjsKKwkJbWFpID0gKHMgKyBtYWlvKSAlIG47CisJfQorCisJcmV0dXJuIG1haTsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvaGFuZG92ZXIudHh0IGIvb3BlbmJzYy9kb2MvaGFuZG92ZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMTllODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9oYW5kb3Zlci50eHQKQEAgLTAsMCArMSw4OSBAQAorSWRlYXMgYWJvdXQgYSBoYW5kb3ZlciBhbGdvcml0aG0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBpcyBtb3N0bHkgYmFzZWQgb24gdGhlIHJlc3VsdHMgcHJlc2VudGVkIGluIENoYXB0ZXIgOCBvZiAiUGVyZm9ybWFuY2UKK0VuaGFuY2VtZW50cyBpbiBhIEZyZXF1ZW5jeSBIb3BwaW5nIEdTTSBOZXR3b3JrIiBieSBUaG9tYXMgVG9mdGVnYWFyZCBOaWVsc2VuCithbmQgSm9lcm9lbiBXaWdhcmQuIAorCisKKz09PSBSZWFzb25zIGZvciBwZXJmb3JtaW5nIGhhbmRvdmVyID09PQorCitTZWN0aW9uIDIuMS4xOiBIYW5kb3ZlciB1c2VkIGluIHRoZWlyIENBUEFDSVRZIHNpbXVsYXRpb246CisKKzEpIEludGVyZmVyZW5jZSBIYW5kb3ZlcgorCitBdmVyYWdlIFJYTEVWIGlzIHNhdGlzZmFjdG9yeSBoaWdoLCBidXQgYXZlcmFnZSBSWFFVQUwgdG9vIGxvdyBpbmRpY2F0ZXMKK2ludGVyZmVyZW5jZSB0byB0aGUgY2hhbm5lbC4gIEhhbmRvdmVyIHNob3VsZCBiZSBtYWRlLgorCisyKSBCYWQgUXVhbGl0eQorCitBdmVyYWdlZCBSWFFVQUwgaXMgbG93ZXIgdGhhbiBhIHRocmVzaG9sZAorCiszKSBMb3cgTGV2ZWwgLyBTaWduYWwgU3RyZW5ndGgKKworQXZlcmFnZSBSWExFViBpcyBsb3dlciB0aGFuIGEgdGhyZXNob2xkCisKKzQpIERpc3RhbmNlIEhhbmRvdmVyCisKK01TIGlzIHRvbyBmYXIgYXdheSBmcm9tIGEgY2VsbCAobWVhc3VyZWQgYnkgVEEpCisKKzUpIFBvd2VyIGJ1ZGdldCAvIEJldHRlciBDZWxsCisKK1JYIExldmVsIG9mIG5laWdoYm9yIGNlbGwgaXMgYXQgbGVhc3QgIkhPIE1hcmdpbiBkQiIgZEIgYmV0dGVyIHRoYW4gdGhlCitjdXJyZW50IHNlcnZpbmcgY2VsbC4KKworPT09IElkZWFsIHBhcmFtZXRlcnMgZm9yIEhPIGFsZ29yaXRobSA9PT0KKworQ2hhcHRlciA4LCBTZWN0aW9uIDIuMiwgVGFibGUgMjQ6CisKK1dpbmRvdyBSWExFViBhdmVyYWdpbmc6CQkxMCBTQUNDSCBmcmFtZXMgKG5vIHdlaWdodGluZykKK1dpbmRvdyBSWFFVQUwgYXZlcmFnaW5nOgkxIFNBQ0NIIGZyYW1lIChubyBhdmVyYWdpbmcpCitMZXZlbCBUaHJlYXNob2xkOgkJMSBvZiB0aGUgbGFzdCAxIEFWLVJYTEVWIHZhbHVlcyA8IC0xMTBkQm0KK1F1YWxpdHkgVGhyZXNob2xkOgkJMyBvZiB0aGUgbGFzdCA0IEFWLVJYUVVBTCB2YWx1ZXMgPj0gNQorSW50ZXJmZXJlbmNlIFRocmVzaG9sZDoJCTEgb2YgdGhlIGxhc3QgQVYtUlhMRVYgPiAtODUgZEJtICYKKwkJCQkzIG9mIHRoZSBsYXN0IDQgQVYtUlhRVUFMIHZhbHVlcyA+PSA1CitQb3dlciBCdWRnZXQ6CQkJTGV2ZWwgb2YgbmVpZ2hib3IgY2VsbCA+IDMgZEIgYmV0dGVyCitQb3dlciBCdWRnZXQgSW50ZXJ2YWw6CQlFdmVyeSA2IFNBQ0NIIGZyYW1lcyAoNiBzZWNvbmRzID8hPykKK0Rpc3RhbmNlIEhhbmRvdmVyOgkJRGlzYWJsZWQKK0V2YWx1YXRpb24gcnVsZSAxOgkJUlhMRVYgb2YgdGhlIGNhbmRpZGF0ZSBjZWxsIGEgdGxlYXN0IC0xMDQgZEJtCitFdmFsdWF0aW9uIHJ1bGUgMjoJCUxldmVsIG9mIGNhbmRpZGF0ZSBjZWxsID4gM2RCIGJldHRlciBvd24gY2VsbAorVGltZXIgU3VjY2Vzc2Z1bCBITzoJCTUgU0FDQ0ggZnJhbWVzCitUaW1lciBVbnN1Y2Nlc3NmdWwgSE86CQkxIFNBQ0NIIGZyYW1lCisKK0luIGEgbm9uLWZyZXF1ZW5jeSBob3BwaW5nIGNhc2UsIFJYUVVBTCB0aHJlc2hvbGQgY2FuIGJlIGRlY3JlYXNlZCB0bworUlhMRVYgPj0gNAorCitXaGVuIGZyZXF1ZW5jeSBob3BwaW5nIGlzIGVuYWJsZWQsIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBwYXJhbWV0ZXJzCitzaG91bGQgYmUgaW50cm9kdWNlZDoKKworKiBObyBpbnRyYS1jZWxsIGhhbmRvdmVyCisqIFVzZSBhIEhPIE1hcmdpbiBvZiAyZEIKKworPT09IEhhbmRvdmVyIENoYW5uZWwgUmVzZXJ2YXRpb24gPT09CisKK0luIGxvYWRlZCBuZXR3b3JrLCBlYWNoIGNlbGwgc2hvdWxkIHJlc2VydmUgc29tZSBjaGFubmVscyBmb3IgaGFuZG92ZXJzLAorcmF0aGVyIHRoYW4gdXNpbmcgYWxsIG9mIHRoZW0gZm9yIG5ldyBjYWxsIGVzdGFibGlzaG1lbnQuICBUaGlzIHJlZHVjZXMgdGhlCituZWVkIHRvIGRyb3AgY2FsbHMgZHVlIHRvIGZhaWxpbmcgaGFuZG92ZXJzLCBhdCB0aGUgZXhwZW5zZSBvZiBmYWlsaW5nIG5ldyBjYWxsCithdHRlbXB0cy4KKworPT09IER5bmFtaWMgSE8gTWFyZ2luID09PQorCitUaGUgaGFuZG92ZXIgbWFyZ2luIChoeXN0ZXJlc2lzKSBzaG91bGQgZGVwZW5kIG9uIHRoZSBSWFFVQUwuIE9wdGltYWwgcmVzdWx0cword2VyZSBhY2hpZXZlZCB3aXRoIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3M6CisqIFJYUVVBTCA8PSA0OiA5IGRCCisqIFJYUVVBTCA9PSA1OiA2IGRCCisqIFJYUVVBTCA+PSA2OiAxIGRCCisKKworCis9PSBBY3R1YWwgSGFuZG92ZXIgb24gYSBwcm90b2NvbCBsZXZlbCA9PQorCitBZnRlciB0aGUgQlNDIGhhcyBkZWNpZGVkIGEgaGFuZG92ZXIgc2hhbGwgYmUgZG9uZSwgaXQgaGFzIHRvCisKKyMgYWxsb2NhdGUgYSBjaGFubmVsIGF0IHRoZSBuZXcgQlRTCisjIGFsbG9jYXRlIGEgaGFuZG92ZXIgcmVmZXJlbmNlCisjIGFjdGl2YXRlIHRoZSBjaGFubmVsIG9uIHRoZSBCVFMgc2lkZSB1c2luZyBSU0wgQ0hBTk5FTCBBQ1RJVkFUSU9OLAorICBpbmRpY2F0aW5nIHRoZSBITyByZWZlcmVuY2UKKyMgQlRTIHJlc3BvbmRzIHdpdGggQ0hBTiBBQ1QgQUNLLCBpbmNsdWRpbmcgR1NNIGZyYW1lIG51bWJlcgorIyBCU0Mgc2VuZHMgMDQuMDggSE8gQ01EIHRvIE1TIHVzaW5nIG9sZCBCVFMKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2Mvb21sLWludGVyZmFjZS50eHQgYi9vcGVuYnNjL2RvYy9vbWwtaW50ZXJmYWNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGRjZmVhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2Mvb21sLWludGVyZmFjZS50eHQKQEAgLTAsMCArMSwyMSBAQAorb21sIGludGVyZmFjZSBkZXNpZ24gbm90ZXMKKworcHJvYmxlbXM6CisKKyogdGhlcmUgaXMgbm8gd2F5IGhvdyB0byB0YWcgYSBjb21tYW5kIHNlbnQgdG8gdGhlIEJUUywgd2l0aCB0aGUgcmVzcG9uc2UKKyAgaGF2aW5nIHRoZSBzYW1lIHRhZyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgY29tbWFuZAorKiB0aGVyZWZvcmUsIHdlIGNhbiBoYXZlIGUuZy4gYm90aCB0aGUgQlNDIGFuZCB0aGUgT01MIGludGVyZmFjZSBzZW5kIGEKKyAgU0VUIEFUVFJJQlVURSBtZXNzYWdlLCB3aGVyZSB0aGUgcmVzcG9uc2VzIHdvdWxkIGVuZCB1cCBhdCB0aGUgd3JvbmcKKyAgcXVlcnkuCisKK3RoZSBvbmx5IHBvc3NpYmxlIHNvbHV0aW9ucyBpIGNhbiBpbWFnaW5lOgorKiBoYXZlIHNvbWUga2luZCBvZiBleGNsdXNpdmUgbG9ja2luZywgd2hlcmUgdGhlIE9NTCBpbnRlcmZhY2UgZ2V0cyBibG9ja2VkCisgIGZyb20gdGhlIEJTQyBhbmQgaXMgZXhjbHVzaXZlbHkgYXNzaWduZWQgdG8gdGhlIE9NTCBjb25zb2xlIHVudGlsIGFsbCBjb21tYW5kcworICBvZiB0aGUgT01MIGNvbnNvbGUgaGF2ZSB0ZXJtaW5hdGVkLiAgVGhpcyBjYW4gZWl0aGVyIGJlIGRvbmUgZXhwbGljaXRseQorICBkeW5hbWljYWxseSBvciBvbiBkZW1hbmQKKworKiB1c2UgdGhlIE9NTCBpbnRlcmZhY2Ugc3luY2hyb25vdXNseSwgaS5lLiBhbHdheXMgd2FpdCBmb3IgdGhlIHJlc3BvbnNlIGZyb20KKyAgdGhlIEJUUyBiZWZvcmUKKworKiB1bmlsYXRlcmFsIC8gdW5zb2xpY2l0ZWQgbWVzc2FnZXMgbmVlZCB0byBiZSBicm9hZGNhc3RlZCB0byBib3RoIHRoZSBCU0MgYW5kCisgIHRoZSBPTUwgY29uc29sZQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9naXQtdmVyc2lvbi1nZW4gYi9vcGVuYnNjL2dpdC12ZXJzaW9uLWdlbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMmFkNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9naXQtdmVyc2lvbi1nZW4KQEAgLTAsMCArMSwxNTEgQEAKKyMhL2Jpbi9zaAorIyBQcmludCBhIHZlcnNpb24gc3RyaW5nLgorc2NyaXB0dmVyc2lvbj0yMDEwLTAxLTI4LjAxCisKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisjIFRoaXMgc2NyaXB0IGlzIGRlcml2ZWQgZnJvbSBHSVQtVkVSU0lPTi1HRU4gZnJvbSBHSVQ6IGh0dHA6Ly9naXQub3IuY3ovLgorIyBJdCBtYXkgYmUgcnVuIHR3byB3YXlzOgorIyAtIGZyb20gYSBnaXQgcmVwb3NpdG9yeSBpbiB3aGljaCB0aGUgImdpdCBkZXNjcmliZSIgY29tbWFuZCBiZWxvdworIyAgIHByb2R1Y2VzIHVzZWZ1bCBvdXRwdXQgKHRodXMgcmVxdWlyaW5nIGF0IGxlYXN0IG9uZSBzaWduZWQgdGFnKQorIyAtIGZyb20gYSBub24tZ2l0LXJlcG8gZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSAudGFyYmFsbC12ZXJzaW9uIGZpbGUsIHdoaWNoCisjICAgcHJlc3VtZXMgdGhpcyBzY3JpcHQgaXMgaW52b2tlZCBsaWtlICIuL2dpdC12ZXJzaW9uLWdlbiAudGFyYmFsbC12ZXJzaW9uIi4KKworIyBJbiBvcmRlciB0byB1c2UgaW50cmEtdmVyc2lvbiBzdHJpbmdzIGluIHlvdXIgcHJvamVjdCwgeW91IHdpbGwgbmVlZCB0d28KKyMgc2VwYXJhdGUgZ2VuZXJhdGVkIHZlcnNpb24gc3RyaW5nIGZpbGVzOgorIworIyAudGFyYmFsbC12ZXJzaW9uIC0gcHJlc2VudCBvbmx5IGluIGEgZGlzdHJpYnV0aW9uIHRhcmJhbGwsIGFuZCBub3QgaW4KKyMgICBhIGNoZWNrZWQtb3V0IHJlcG9zaXRvcnkuICBDcmVhdGVkIHdpdGggY29udGVudHMgdGhhdCB3ZXJlIGxlYXJuZWQgYXQKKyMgICB0aGUgbGFzdCB0aW1lIGF1dG9jb25mIHdhcyBydW4sIGFuZCB1c2VkIGJ5IGdpdC12ZXJzaW9uLWdlbi4gIE11c3Qgbm90CisjICAgYmUgcHJlc2VudCBpbiBlaXRoZXIgJChzcmNkaXIpIG9yICQoYnVpbGRkaXIpIGZvciBnaXQtdmVyc2lvbi1nZW4gdG8KKyMgICBnaXZlIGFjY3VyYXRlIGFuc3dlcnMgZHVyaW5nIG5vcm1hbCBkZXZlbG9wbWVudCB3aXRoIGEgY2hlY2tlZCBvdXQgdHJlZSwKKyMgICBidXQgbXVzdCBiZSBwcmVzZW50IGluIGEgdGFyYmFsbCB3aGVuIHRoZXJlIGlzIG5vIHZlcnNpb24gY29udHJvbCBzeXN0ZW0uCisjICAgVGhlcmVmb3JlLCBpdCBjYW5ub3QgYmUgdXNlZCBpbiBhbnkgZGVwZW5kZW5jaWVzLiAgR05VbWFrZWZpbGUgaGFzCisjICAgaG9va3MgdG8gZm9yY2UgYSByZWNvbmZpZ3VyZSBhdCBkaXN0cmlidXRpb24gdGltZSB0byBnZXQgdGhlIHZhbHVlCisjICAgY29ycmVjdCwgd2l0aG91dCBwZW5hbGl6aW5nIG5vcm1hbCBkZXZlbG9wbWVudCB3aXRoIGV4dHJhIHJlY29uZmlndXJlcy4KKyMKKyMgLnZlcnNpb24gLSBwcmVzZW50IGluIGEgY2hlY2tlZC1vdXQgcmVwb3NpdG9yeSBhbmQgaW4gYSBkaXN0cmlidXRpb24KKyMgICB0YXJiYWxsLiAgVXNhYmxlIGluIGRlcGVuZGVuY2llcywgcGFydGljdWxhcmx5IGZvciBmaWxlcyB0aGF0IGRvbid0CisjICAgd2FudCB0byBkZXBlbmQgb24gY29uZmlnLmggYnV0IGRvIHdhbnQgdG8gdHJhY2sgdmVyc2lvbiBjaGFuZ2VzLgorIyAgIERlbGV0ZSB0aGlzIGZpbGUgcHJpb3IgdG8gYW55IGF1dG9jb25mIHJ1biB3aGVyZSB5b3Ugd2FudCB0byByZWJ1aWxkCisjICAgZmlsZXMgdG8gcGljayB1cCBhIHZlcnNpb24gc3RyaW5nIGNoYW5nZTsgYW5kIGxlYXZlIGl0IHN0YWxlIHRvCisjICAgbWluaW1pemUgcmVidWlsZCB0aW1lIGFmdGVyIHVucmVsYXRlZCBjaGFuZ2VzIHRvIGNvbmZpZ3VyZSBzb3VyY2VzLgorIworIyBJdCBpcyBwcm9iYWJseSB3aXNlIHRvIGFkZCB0aGVzZSB0d28gZmlsZXMgdG8gLmdpdGlnbm9yZSwgc28gdGhhdCB5b3UKKyMgZG9uJ3QgYWNjaWRlbnRhbGx5IGNvbW1pdCBlaXRoZXIgZ2VuZXJhdGVkIGZpbGUuCisjCisjIFVzZSB0aGUgZm9sbG93aW5nIGxpbmUgaW4geW91ciBjb25maWd1cmUuYWMsIHNvIHRoYXQgJChWRVJTSU9OKSB3aWxsCisjIGF1dG9tYXRpY2FsbHkgYmUgdXAtdG8tZGF0ZSBlYWNoIHRpbWUgY29uZmlndXJlIGlzIHJ1biAoYW5kIG5vdGUgdGhhdAorIyBzaW5jZSBjb25maWd1cmUuYWMgbm8gbG9uZ2VyIGluY2x1ZGVzIGEgdmVyc2lvbiBzdHJpbmcsIE1ha2VmaWxlIHJ1bGVzCisjIHNob3VsZCBub3QgZGVwZW5kIG9uIGNvbmZpZ3VyZS5hYyBmb3IgdmVyc2lvbiB1cGRhdGVzKS4KKyMKKyMgQUNfSU5JVChbR05VIHByb2plY3RdLAorIyAgICAgICAgIG00X2VzeXNjbWQoW2J1aWxkLWF1eC9naXQtdmVyc2lvbi1nZW4gLnRhcmJhbGwtdmVyc2lvbl0pLAorIyAgICAgICAgIFtidWctcHJvamVjdEBleGFtcGxlXSkKKyMKKyMgVGhlbiB1c2UgdGhlIGZvbGxvd2luZyBsaW5lcyBpbiB5b3VyIE1ha2VmaWxlLmFtLCBzbyB0aGF0IC52ZXJzaW9uCisjIHdpbGwgYmUgcHJlc2VudCBmb3IgZGVwZW5kZW5jaWVzLCBhbmQgc28gdGhhdCAudGFyYmFsbC12ZXJzaW9uIHdpbGwKKyMgZXhpc3QgaW4gZGlzdHJpYnV0aW9uIHRhcmJhbGxzLgorIworIyBCVUlMVF9TT1VSQ0VTID0gJCh0b3Bfc3JjZGlyKS8udmVyc2lvbgorIyAkKHRvcF9zcmNkaXIpLy52ZXJzaW9uOgorIwllY2hvICQoVkVSU0lPTikgPiAkQC10ICYmIG12ICRALXQgJEAKKyMgZGlzdC1ob29rOgorIwllY2hvICQoVkVSU0lPTikgPiAkKGRpc3RkaXIpLy50YXJiYWxsLXZlcnNpb24KKworY2FzZSAkIyBpbgorICAgIDEpIDs7CisgICAgKikgZWNobyAxPiYyICJVc2FnZTogJDAgXCRzcmNkaXIvLnRhcmJhbGwtdmVyc2lvbiI7IGV4aXQgMTs7Citlc2FjCisKK3RhcmJhbGxfdmVyc2lvbl9maWxlPSQxCitubD0nCisnCisKKyMgRmlyc3Qgc2VlIGlmIHRoZXJlIGlzIGEgdGFyYmFsbC1vbmx5IHZlcnNpb24gZmlsZS4KKyMgdGhlbiB0cnkgImdpdCBkZXNjcmliZSIsIHRoZW4gZGVmYXVsdC4KK2lmIHRlc3QgLWYgJHRhcmJhbGxfdmVyc2lvbl9maWxlCit0aGVuCisgICAgdj1gY2F0ICR0YXJiYWxsX3ZlcnNpb25fZmlsZWAgfHwgZXhpdCAxCisgICAgY2FzZSAkdiBpbgorCSokbmwqKSB2PSA7OyAjIHJlamVjdCBtdWx0aS1saW5lIG91dHB1dAorCVswLTldKikgOzsKKwkqKSB2PSA7OworICAgIGVzYWMKKyAgICB0ZXN0IC16ICIkdiIgXAorCSYmIGVjaG8gIiQwOiBXQVJOSU5HOiAkdGFyYmFsbF92ZXJzaW9uX2ZpbGUgc2VlbXMgdG8gYmUgZGFtYWdlZCIgMT4mMgorZmkKKworaWYgdGVzdCAtbiAiJHYiCit0aGVuCisgICAgOiAjIHVzZSAkdgorZWxpZiB0ZXN0IC1kIC4vLi4vLmdpdCBcCisgICAgJiYgdj1gZ2l0IGRlc2NyaWJlIC0tYWJicmV2PTQgLS1tYXRjaD0ndionIEhFQUQgMj4vZGV2L251bGwgXAorCSAgfHwgZ2l0IGRlc2NyaWJlIC0tYWJicmV2PTQgSEVBRCAyPi9kZXYvbnVsbGAgXAorICAgICYmIGNhc2UgJHYgaW4KKwkgWzAtOV0qKSA7OworCSB2WzAtOV0qKSA7OworCSAqKSAoZXhpdCAxKSA7OworICAgICAgIGVzYWMKK3RoZW4KKyAgICAjIElzIHRoaXMgYSBuZXcgZ2l0IHRoYXQgbGlzdHMgbnVtYmVyIG9mIGNvbW1pdHMgc2luY2UgdGhlIGxhc3QKKyAgICAjIHRhZyBvciB0aGUgcHJldmlvdXMgb2xkZXIgdmVyc2lvbiB0aGF0IGRpZCBub3Q/CisgICAgIyAgIE5ld2VyOiB2Ni4xMC03Ny1nMGY4ZmFlYgorICAgICMgICBPbGRlcjogdjYuMTAtZzBmOGZhZWIKKyAgICBjYXNlICR2IGluCisJKi0qLSopIDogZ2l0IGRlc2NyaWJlIGlzIG9rYXkgdGhyZWUgcGFydCBmbGF2b3IgOzsKKwkqLSopCisJICAgIDogZ2l0IGRlc2NyaWJlIGlzIG9sZGVyIHR3byBwYXJ0IGZsYXZvcgorCSAgICAjIFJlY3JlYXRlIHRoZSBudW1iZXIgb2YgY29tbWl0cyBhbmQgcmV3cml0ZSBzdWNoIHRoYXQgdGhlCisJICAgICMgcmVzdWx0IGlzIHRoZSBzYW1lIGFzIGlmIHdlIHdlcmUgdXNpbmcgdGhlIG5ld2VyIHZlcnNpb24KKwkgICAgIyBvZiBnaXQgZGVzY3JpYmUuCisJICAgIHZ0YWc9YGVjaG8gIiR2IiB8IHNlZCAncy8tLiovLydgCisJICAgIG51bWNvbW1pdHM9YGdpdCByZXYtbGlzdCAiJHZ0YWciLi5IRUFEIHwgd2MgLWxgCisJICAgIHY9YGVjaG8gIiR2IiB8IHNlZCAicy9cKC4qXCktXCguKlwpL1wxLSRudW1jb21taXRzLVwyLyJgOworCSAgICA7OworICAgIGVzYWMKKworICAgICMgQ2hhbmdlIHRoZSBmaXJzdCAnLScgdG8gYSAnLicsIHNvIHZlcnNpb24tY29tcGFyaW5nIHRvb2xzIHdvcmsgcHJvcGVybHkuCisgICAgIyBSZW1vdmUgdGhlICJnIiBpbiBnaXQgZGVzY3JpYmUncyBvdXRwdXQgc3RyaW5nLCB0byBzYXZlIGEgYnl0ZS4KKyAgICB2PWBlY2hvICIkdiIgfCBzZWQgJ3MvLS8uLztzL1woLipcKS1nL1wxLS8nYDsKK2Vsc2UKKyAgICB2PVVOS05PV04KK2ZpCisKK3Y9YGVjaG8gIiR2IiB8c2VkICdzL152Ly8nYAorCisjIERvbid0IGRlY2xhcmUgYSB2ZXJzaW9uICJkaXJ0eSIgbWVyZWx5IGJlY2F1c2UgYSB0aW1lIHN0YW1wIGhhcyBjaGFuZ2VkLgorZ2l0IHN0YXR1cyA+IC9kZXYvbnVsbCAyPiYxCisKK2RpcnR5PWBzaCAtYyAnZ2l0IGRpZmYtaW5kZXggLS1uYW1lLW9ubHkgSEVBRCcgMj4vZGV2L251bGxgIHx8IGRpcnR5PQorY2FzZSAiJGRpcnR5IiBpbgorICAgICcnKSA7OworICAgICopICMgQXBwZW5kIHRoZSBzdWZmaXggb25seSBpZiB0aGVyZSBpc24ndCBvbmUgYWxyZWFkeS4KKwljYXNlICR2IGluCisJICAqLWRpcnR5KSA7OworCSAgKikgdj0iJHYtZGlydHkiIDs7CisJZXNhYyA7OworZXNhYworCisjIE9taXQgdGhlIHRyYWlsaW5nIG5ld2xpbmUsIHNvIHRoYXQgbTRfZXN5c2NtZCBjYW4gdXNlIHRoZSByZXN1bHQgZGlyZWN0bHkuCitlY2hvICIkdiIgfCB0ciAtZCAnXDAxMicKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC1lbmQ6ICIkIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL2luY2x1ZGUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiMmEzMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMgQEAKK1NVQkRJUlMgPSBvcGVuYnNjIHZ0eSBzY2NwCisKK25vaW5zdF9IRUFERVJTID0gbUlTRE5pZi5oIGNvbXBhdF9hZl9pc2RuLmgKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9jb21wYXRfYWZfaXNkbi5oIGIvb3BlbmJzYy9pbmNsdWRlL2NvbXBhdF9hZl9pc2RuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjYmZiMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9jb21wYXRfYWZfaXNkbi5oCkBAIC0wLDAgKzEsMzkgQEAKKyNpZmRlZiBNSVNETl9PTERfQUZfQ09NUEFUSUJJTElUWQorI3VuZGVmIEFGX0lTRE4KKyN1bmRlZiBQRl9JU0ROCisKK2V4dGVybglpbnQJQUZfSVNETjsKKyNkZWZpbmUgUEZfSVNETglBRl9JU0ROCisKK2ludAlBRl9JU0ROOworCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgaW5pdF9hZl9pc2RuKHZvaWQpOworCisjaWZkZWYgQUZfQ09NUEFUSUJJTElUWV9GVU5DCisjaWZkZWYgTUlTRE5fT0xEX0FGX0NPTVBBVElCSUxJVFkKK3ZvaWQgaW5pdF9hZl9pc2RuKHZvaWQpCit7CisJaW50CXM7CisKKwkvKiB0ZXN0IGZvciBuZXcgdmFsdWUgKi8KKwlBRl9JU0ROID0gMzQ7CisJcyA9IHNvY2tldChBRl9JU0ROLCBTT0NLX1JBVywgSVNETl9QX0JBU0UpOworCWlmIChzID49IDApIHsKKwkJY2xvc2Uocyk7CisJCXJldHVybjsKKwl9CisJQUZfSVNETiA9IDI3OworCXMgPSBzb2NrZXQoQUZfSVNETiwgU09DS19SQVcsIElTRE5fUF9CQVNFKTsKKwlpZiAocyA+PSAwKSB7CisJCWNsb3NlKHMpOworCQlyZXR1cm47CisJfQorfQorI2Vsc2UKK3ZvaWQgaW5pdF9hZl9pc2RuKHZvaWQpCit7Cit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL21JU0ROaWYuaCBiL29wZW5ic2MvaW5jbHVkZS9tSVNETmlmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwNjVkMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9tSVNETmlmLmgKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKgorICogQXV0aG9yCUthcnN0ZW4gS2VpbCA8a2tlaWxAbm92ZWxsLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgMjAwOCAgYnkgS2Fyc3RlbiBLZWlsIDxra2VpbEBub3ZlbGwuY29tPgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICogdmVyc2lvbiAyLjEgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgbUlTRE5JRl9ICisjZGVmaW5lIG1JU0ROSUZfSAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaWZkZWYgbGludXgKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjZWxzZQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9lcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorCisvKgorICogQUJJIFZlcnNpb24gMzIgYml0CisgKgorICogPDggYml0PiBNYWpvciB2ZXJzaW9uCisgKgkJLSBjaGFuZ2VkIGlmIGFueSBpbnRlcmZhY2UgYmVjb21lIGJhY2t3YXJkcyBpbmNvbXBhdGlibGUKKyAqCisgKiA8OCBiaXQ+IE1pbm9yIHZlcnNpb24KKyAqICAgICAgICAgICAgICAtIGNoYW5nZWQgaWYgYW55IGludGVyZmFjZSBpcyBleHRlbmRlZCBidXQgYmFja3dhcmRzIGNvbXBhdGlibGUKKyAqCisgKiA8MTYgYml0PiBSZWxlYXNlIG51bWJlcgorICogICAgICAgICAgICAgIC0gc2hvdWxkIGJlIGluY3JlbWVudGVkIG9uIGV2ZXJ5IGNoZWNraW4KKyAqLworI2RlZmluZQlNSVNETl9NQUpPUl9WRVJTSU9OCTEKKyNkZWZpbmUJTUlTRE5fTUlOT1JfVkVSU0lPTgkxCisjZGVmaW5lIE1JU0ROX1JFTEVBU0UJCTIwCisKKy8qIHByaW1pdGl2ZXMgZm9yIGluZm9ybWF0aW9uIGV4Y2hhbmdlCisgKiBnZW5lcmVsbCBmb3JtYXQKKyAqIDwxNiAgYml0ICAwID4KKyAqIDw4ICBiaXQgY29tbWFuZD4KKyAqICAgIEJJVCA4ID0gMSBMQVlFUiBwcml2YXRlCisgKiAgICBCSVQgNyA9IDEgYW5zd2VyCisgKiAgICBCSVQgNiA9IDEgREFUQQorICogPDggIGJpdCB0YXJnZXQgbGF5ZXIgbWFzaz4KKyAqCisgKiBMYXllciA9IDAwIGlzIHJlc2VydmVkIGZvciBnZW5lcmFsIGNvbW1hbmRzCisgICBMYXllciA9IDAxICBMMiAtPiBIVworICAgTGF5ZXIgPSAwMiAgSFcgLT4gTDIKKyAgIExheWVyID0gMDQgIEwzIC0+IEwyCisgICBMYXllciA9IDA4ICBMMiAtPiBMMworICogTGF5ZXIgPSBGRiBpcyByZXNlcnZlZCBmb3IgYnJvYWRjYXN0IGNvbW1hbmRzCisgKi8KKworI2RlZmluZSBNSVNETl9DTURNQVNLCQkweGZmMDAKKyNkZWZpbmUgTUlTRE5fTEFZRVJNQVNLCQkweDAwZmYKKworLyogZ2VuZXJlbGwgY29tbWFuZHMgKi8KKyNkZWZpbmUgT1BFTl9DSEFOTkVMCQkweDAxMDAKKyNkZWZpbmUgQ0xPU0VfQ0hBTk5FTAkJMHgwMjAwCisjZGVmaW5lIENPTlRST0xfQ0hBTk5FTAkJMHgwMzAwCisjZGVmaW5lIENIRUNLX0RBVEEJCTB4MDQwMAorCisvKiBsYXllciAyIC0+IGxheWVyIDEgKi8KKyNkZWZpbmUgUEhfQUNUSVZBVEVfUkVRCQkweDAxMDEKKyNkZWZpbmUgUEhfREVBQ1RJVkFURV9SRVEJMHgwMjAxCisjZGVmaW5lIFBIX0RBVEFfUkVRCQkweDIwMDEKKyNkZWZpbmUgTVBIX0FDVElWQVRFX1JFUQkweDA1MDEKKyNkZWZpbmUgTVBIX0RFQUNUSVZBVEVfUkVRCTB4MDYwMQorI2RlZmluZSBNUEhfSU5GT1JNQVRJT05fUkVRCTB4MDcwMQorI2RlZmluZSBQSF9DT05UUk9MX1JFUQkJMHgwODAxCisKKy8qIGxheWVyIDEgLT4gbGF5ZXIgMiAqLworI2RlZmluZSBQSF9BQ1RJVkFURV9JTkQJCTB4MDEwMgorI2RlZmluZSBQSF9BQ1RJVkFURV9DTkYJCTB4NDEwMgorI2RlZmluZSBQSF9ERUFDVElWQVRFX0lORAkweDAyMDIKKyNkZWZpbmUgUEhfREVBQ1RJVkFURV9DTkYJMHg0MjAyCisjZGVmaW5lIFBIX0RBVEFfSU5ECQkweDIwMDIKKyNkZWZpbmUgUEhfREFUQV9FX0lORAkJMHgzMDAyCisjZGVmaW5lIE1QSF9BQ1RJVkFURV9JTkQJMHgwNTAyCisjZGVmaW5lIE1QSF9ERUFDVElWQVRFX0lORAkweDA2MDIKKyNkZWZpbmUgTVBIX0lORk9STUFUSU9OX0lORAkweDA3MDIKKyNkZWZpbmUgUEhfREFUQV9DTkYJCTB4NjAwMgorI2RlZmluZSBQSF9DT05UUk9MX0lORAkJMHgwODAyCisjZGVmaW5lIFBIX0NPTlRST0xfQ05GCQkweDQ4MDIKKworLyogbGF5ZXIgMyAtPiBsYXllciAyICovCisjZGVmaW5lIERMX0VTVEFCTElTSF9SRVEJMHgxMDA0CisjZGVmaW5lIERMX1JFTEVBU0VfUkVRCQkweDExMDQKKyNkZWZpbmUgRExfREFUQV9SRVEJCTB4MzAwNAorI2RlZmluZSBETF9VTklUREFUQV9SRVEJCTB4MzEwNAorI2RlZmluZSBETF9JTkZPUk1BVElPTl9SRVEJMHgwMDA0CisKKy8qIGxheWVyIDIgLT4gbGF5ZXIgMyAqLworI2RlZmluZSBETF9FU1RBQkxJU0hfSU5ECTB4MTAwOAorI2RlZmluZSBETF9FU1RBQkxJU0hfQ05GCTB4NTAwOAorI2RlZmluZSBETF9SRUxFQVNFX0lORAkJMHgxMTA4CisjZGVmaW5lIERMX1JFTEVBU0VfQ05GCQkweDUxMDgKKyNkZWZpbmUgRExfREFUQV9JTkQJCTB4MzAwOAorI2RlZmluZSBETF9VTklUREFUQV9JTkQJCTB4MzEwOAorI2RlZmluZSBETF9JTkZPUk1BVElPTl9JTkQJMHgwMDA4CisKKy8qIGludGVybiBsYXllciAyIG1hbmFnbWVudCAqLworI2RlZmluZSBNRExfQVNTSUdOX1JFUQkJMHgxODA0CisjZGVmaW5lIE1ETF9BU1NJR05fSU5ECQkweDE5MDQKKyNkZWZpbmUgTURMX1JFTU9WRV9SRVEJCTB4MUEwNAorI2RlZmluZSBNRExfUkVNT1ZFX0lORAkJMHgxQjA0CisjZGVmaW5lIE1ETF9TVEFUVVNfVVBfSU5ECTB4MUMwNAorI2RlZmluZSBNRExfU1RBVFVTX0RPV05fSU5ECTB4MUQwNAorI2RlZmluZSBNRExfU1RBVFVTX1VJX0lORAkweDFFMDQKKyNkZWZpbmUgTURMX0VSUk9SX0lORAkJMHgxRjA0CisjZGVmaW5lIE1ETF9FUlJPUl9SU1AJCTB4NUYwNAorCisvKiBETF9JTkZPUk1BVElPTl9JTkQgdHlwZXMgKi8KKyNkZWZpbmUgRExfSU5GT19MMl9DT05ORUNUCTB4MDAwMQorI2RlZmluZSBETF9JTkZPX0wyX1JFTU9WRUQJMHgwMDAyCisKKy8qIFBIX0NPTlRST0wgdHlwZXMgKi8KKy8qIFRPVUNIIFRPTkUgSVMgMHgyMFhYICBYWCAiMCIuLi4iOSIsICJBIiwiQiIsIkMiLCJEIiwiKiIsIiMiICovCisjZGVmaW5lIERUTUZfVE9ORV9WQUwJCTB4MjAwMAorI2RlZmluZSBEVE1GX1RPTkVfTUFTSwkJMHgwMDdGCisjZGVmaW5lIERUTUZfVE9ORV9TVEFSVAkJMHgyMTAwCisjZGVmaW5lIERUTUZfVE9ORV9TVE9QCQkweDIyMDAKKyNkZWZpbmUgRFRNRl9IRkNfQ09FRgkJMHg0MDAwCisjZGVmaW5lIERTUF9DT05GX0pPSU4JCTB4MjQwMworI2RlZmluZSBEU1BfQ09ORl9TUExJVAkJMHgyNDA0CisjZGVmaW5lIERTUF9SRUNFSVZFX09GRgkJMHgyNDA1CisjZGVmaW5lIERTUF9SRUNFSVZFX09OCQkweDI0MDYKKyNkZWZpbmUgRFNQX0VDSE9fT04JCTB4MjQwNworI2RlZmluZSBEU1BfRUNIT19PRkYJCTB4MjQwOAorI2RlZmluZSBEU1BfTUlYX09OCQkweDI0MDkKKyNkZWZpbmUgRFNQX01JWF9PRkYJCTB4MjQwYQorI2RlZmluZSBEU1BfREVMQVkJCTB4MjQwYgorI2RlZmluZSBEU1BfSklUVEVSCQkweDI0MGMKKyNkZWZpbmUgRFNQX1RYREFUQV9PTgkJMHgyNDBkCisjZGVmaW5lIERTUF9UWERBVEFfT0ZGCQkweDI0MGUKKyNkZWZpbmUgRFNQX1RYX0RFSklUVEVSCQkweDI0MGYKKyNkZWZpbmUgRFNQX1RYX0RFSl9PRkYJCTB4MjQxMAorI2RlZmluZSBEU1BfVE9ORV9QQVRUX09OCTB4MjQxMQorI2RlZmluZSBEU1BfVE9ORV9QQVRUX09GRgkweDI0MTIKKyNkZWZpbmUgRFNQX1ZPTF9DSEFOR0VfVFgJMHgyNDEzCisjZGVmaW5lIERTUF9WT0xfQ0hBTkdFX1JYCTB4MjQxNAorI2RlZmluZSBEU1BfQkZfRU5BQkxFX0tFWQkweDI0MTUKKyNkZWZpbmUgRFNQX0JGX0RJU0FCTEUJCTB4MjQxNgorI2RlZmluZSBEU1BfQkZfQUNDRVBUCQkweDI0MTYKKyNkZWZpbmUgRFNQX0JGX1JFSkVDVAkJMHgyNDE3CisjZGVmaW5lIERTUF9QSVBFTElORV9DRkcJMHgyNDE4CisjZGVmaW5lIEhGQ19WT0xfQ0hBTkdFX1RYCTB4MjYwMQorI2RlZmluZSBIRkNfVk9MX0NIQU5HRV9SWAkweDI2MDIKKyNkZWZpbmUgSEZDX1NQTF9MT09QX09OCQkweDI2MDMKKyNkZWZpbmUgSEZDX1NQTF9MT09QX09GRgkweDI2MDQKKworLyogRFNQX1RPTkVfUEFUVF9PTiBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgVE9ORV9PRkYJCQkweDAwMDAKKyNkZWZpbmUgVE9ORV9HRVJNQU5fRElBTFRPTkUJCTB4MDAwMQorI2RlZmluZSBUT05FX0dFUk1BTl9PTERESUFMVE9ORQkJMHgwMDAyCisjZGVmaW5lIFRPTkVfQU1FUklDQU5fRElBTFRPTkUJCTB4MDAwMworI2RlZmluZSBUT05FX0dFUk1BTl9ESUFMUEJYCQkweDAwMDQKKyNkZWZpbmUgVE9ORV9HRVJNQU5fT0xERElBTFBCWAkJMHgwMDA1CisjZGVmaW5lIFRPTkVfQU1FUklDQU5fRElBTFBCWAkJMHgwMDA2CisjZGVmaW5lIFRPTkVfR0VSTUFOX1JJTkdJTkcJCTB4MDAwNworI2RlZmluZSBUT05FX0dFUk1BTl9PTERSSU5HSU5HCQkweDAwMDgKKyNkZWZpbmUgVE9ORV9BTUVSSUNBTl9SSU5HUEJYCQkweDAwMGIKKyNkZWZpbmUgVE9ORV9HRVJNQU5fUklOR1BCWAkJMHgwMDBjCisjZGVmaW5lIFRPTkVfR0VSTUFOX09MRFJJTkdQQlgJCTB4MDAwZAorI2RlZmluZSBUT05FX0FNRVJJQ0FOX1JJTkdJTkcJCTB4MDAwZQorI2RlZmluZSBUT05FX0dFUk1BTl9CVVNZCQkweDAwMGYKKyNkZWZpbmUgVE9ORV9HRVJNQU5fT0xEQlVTWQkJMHgwMDEwCisjZGVmaW5lIFRPTkVfQU1FUklDQU5fQlVTWQkJMHgwMDExCisjZGVmaW5lIFRPTkVfR0VSTUFOX0hBTkdVUAkJMHgwMDEyCisjZGVmaW5lIFRPTkVfR0VSTUFOX09MREhBTkdVUAkJMHgwMDEzCisjZGVmaW5lIFRPTkVfQU1FUklDQU5fSEFOR1VQCQkweDAwMTQKKyNkZWZpbmUgVE9ORV9TUEVDSUFMX0lORk8JCTB4MDAxNQorI2RlZmluZSBUT05FX0dFUk1BTl9HQVNTRU5CRVNFVFpUCTB4MDAxNgorI2RlZmluZSBUT05FX0dFUk1BTl9BVUZTQ0hBTFRUT04JMHgwMDE2CisKKy8qIE1QSF9JTkZPUk1BVElPTl9JTkQgKi8KKyNkZWZpbmUgTDFfU0lHTkFMX0xPU19PRkYJMHgwMDEwCisjZGVmaW5lIEwxX1NJR05BTF9MT1NfT04JMHgwMDExCisjZGVmaW5lIEwxX1NJR05BTF9BSVNfT0ZGCTB4MDAxMgorI2RlZmluZSBMMV9TSUdOQUxfQUlTX09OCTB4MDAxMworI2RlZmluZSBMMV9TSUdOQUxfUkRJX09GRgkweDAwMTQKKyNkZWZpbmUgTDFfU0lHTkFMX1JESV9PTgkweDAwMTUKKyNkZWZpbmUgTDFfU0lHTkFMX1NMSVBfUlgJMHgwMDIwCisjZGVmaW5lIEwxX1NJR05BTF9TTElQX1RYCTB4MDAyMQorCisvKgorICogcHJvdG9jb2wgaWRzCisgKiBEIGNoYW5uZWwgMS0zMQorICogQiBjaGFubmVsIDMzIC0gNjMKKyAqLworCisjZGVmaW5lIElTRE5fUF9OT05FCQkwCisjZGVmaW5lIElTRE5fUF9CQVNFCQkwCisjZGVmaW5lIElTRE5fUF9URV9TMAkJMHgwMQorI2RlZmluZSBJU0ROX1BfTlRfUzAgIAkJMHgwMgorI2RlZmluZSBJU0ROX1BfVEVfRTEJCTB4MDMKKyNkZWZpbmUgSVNETl9QX05UX0UxICAJCTB4MDQKKyNkZWZpbmUgSVNETl9QX1RFX1VQMAkJMHgwNQorI2RlZmluZSBJU0ROX1BfTlRfVVAwCQkweDA2CisKKyNkZWZpbmUgSVNfSVNETl9QX1RFKHApICgocCA9PSBJU0ROX1BfVEVfUzApIHx8IChwID09IElTRE5fUF9URV9FMSkgfHwgXAorCQkJCShwID09IElTRE5fUF9URV9VUDApIHx8IChwID09IElTRE5fUF9MQVBEX1RFKSkKKyNkZWZpbmUgSVNfSVNETl9QX05UKHApICgocCA9PSBJU0ROX1BfTlRfUzApIHx8IChwID09IElTRE5fUF9OVF9FMSkgfHwgXAorCQkJCShwID09IElTRE5fUF9OVF9VUDApIHx8IChwID09IElTRE5fUF9MQVBEX05UKSkKKyNkZWZpbmUgSVNfSVNETl9QX1MwKHApICgocCA9PSBJU0ROX1BfVEVfUzApIHx8IChwID09IElTRE5fUF9OVF9TMCkpCisjZGVmaW5lIElTX0lTRE5fUF9FMShwKSAoKHAgPT0gSVNETl9QX1RFX0UxKSB8fCAocCA9PSBJU0ROX1BfTlRfRTEpKQorI2RlZmluZSBJU19JU0ROX1BfVVAwKHApICgocCA9PSBJU0ROX1BfVEVfVVAwKSB8fCAocCA9PSBJU0ROX1BfTlRfVVAwKSkKKworCisjZGVmaW5lIElTRE5fUF9MQVBEX1RFCQkweDEwCisjZGVmaW5lCUlTRE5fUF9MQVBEX05UCQkweDExCisKKyNkZWZpbmUgSVNETl9QX0JfTUFTSwkJMHgxZgorI2RlZmluZSBJU0ROX1BfQl9TVEFSVAkJMHgyMAorCisjZGVmaW5lIElTRE5fUF9CX1JBVwkJMHgyMQorI2RlZmluZSBJU0ROX1BfQl9IRExDCQkweDIyCisjZGVmaW5lIElTRE5fUF9CX1g3NVNMUAkJMHgyMworI2RlZmluZSBJU0ROX1BfQl9MMkRUTUYJCTB4MjQKKyNkZWZpbmUgSVNETl9QX0JfTDJEU1AJCTB4MjUKKyNkZWZpbmUgSVNETl9QX0JfTDJEU1BIRExDCTB4MjYKKworI2RlZmluZSBPUFRJT05fTDJfUE1YCQkxCisjZGVmaW5lIE9QVElPTl9MMl9QVFAJCTIKKyNkZWZpbmUgT1BUSU9OX0wyX0ZJWEVEVEVJCTMKKyNkZWZpbmUgT1BUSU9OX0wyX0NMRUFOVVAJNAorCisvKiBzaG91bGQgYmUgaW4gc3luYyB3aXRoIGxpbnV4L2tvYmplY3QuaDpLT0JKX05BTUVfTEVOICovCisjZGVmaW5lIE1JU0ROX01BWF9JRExFTgkJMjAKKworc3RydWN0IG1JU0ROaGVhZCB7CisJdW5zaWduZWQgaW50CXByaW07CisJdW5zaWduZWQgaW50CWlkOworfSAgX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgTUlTRE5fSEVBREVSX0xFTglzaXplb2Yoc3RydWN0IG1JU0ROaGVhZCkKKyNkZWZpbmUgTUFYX0RBVEFfU0laRQkJMjA0OAorI2RlZmluZSBNQVhfREFUQV9NRU0JCShNQVhfREFUQV9TSVpFICsgTUlTRE5fSEVBREVSX0xFTikKKyNkZWZpbmUgTUFYX0RGUkFNRV9MRU4JCTI2MAorCisjZGVmaW5lIE1JU0ROX0lEX0FERFJfTUFTSwkweEZGRkYKKyNkZWZpbmUgTUlTRE5fSURfVEVJX01BU0sJMHhGRjAwCisjZGVmaW5lIE1JU0ROX0lEX1NBUElfTUFTSwkweDAwRkYKKyNkZWZpbmUgTUlTRE5fSURfVEVJX0FOWQkweDdGMDAKKworI2RlZmluZSBNSVNETl9JRF9BTlkJCTB4RkZGRgorI2RlZmluZSBNSVNETl9JRF9OT05FCQkweEZGRkUKKworI2RlZmluZSBHUk9VUF9URUkJCTEyNworI2RlZmluZSBURUlfU0FQSQkJNjMKKyNkZWZpbmUgQ1RSTF9TQVBJCQkwCisKKyNkZWZpbmUgTUlTRE5fTUFYX0NIQU5ORUwJMTI3CisjZGVmaW5lIE1JU0ROX0NITUFQX1NJWkUJKChNSVNETl9NQVhfQ0hBTk5FTCArIDEpID4+IDMpCisKKyNkZWZpbmUgU09MX01JU0ROCTAKKworc3RydWN0IHNvY2thZGRyX21JU0ROIHsKKwlzYV9mYW1pbHlfdCAgICBmYW1pbHk7CisJdW5zaWduZWQgY2hhcglkZXY7CisJdW5zaWduZWQgY2hhcgljaGFubmVsOworCXVuc2lnbmVkIGNoYXIJc2FwaTsKKwl1bnNpZ25lZCBjaGFyCXRlaTsKK307CisKK3N0cnVjdCBtSVNETnZlcnNpb24geworCXVuc2lnbmVkIGNoYXIJbWFqb3I7CisJdW5zaWduZWQgY2hhcgltaW5vcjsKKwl1bnNpZ25lZCBzaG9ydAlyZWxlYXNlOworfTsKKworI2RlZmluZSBNQVhfREVWSUNFX0lEIDYzCisKK3N0cnVjdCBtSVNETl9kZXZpbmZvIHsKKwl1X2ludAkJCWlkOworCXVfaW50CQkJRHByb3RvY29sczsKKwl1X2ludAkJCUJwcm90b2NvbHM7CisJdV9pbnQJCQlwcm90b2NvbDsKKwl1X2NoYXIJCQljaGFubmVsbWFwW01JU0ROX0NITUFQX1NJWkVdOworCXVfaW50CQkJbnJiY2hhbjsKKwljaGFyCQkJbmFtZVtNSVNETl9NQVhfSURMRU5dOworfTsKKworc3RydWN0IG1JU0ROX2RldnJlbmFtZSB7CisJdV9pbnQJCQlpZDsKKwljaGFyCQkJbmFtZVtNSVNETl9NQVhfSURMRU5dOworfTsKKworc3RydWN0IHBoX2luZm9fY2ggeworCWludDMyX3QgCQlwcm90b2NvbDsKKwlpbnQ2NF90CQkJRmxhZ3M7Cit9OworCitzdHJ1Y3QgcGhfaW5mb19kY2ggeworCXN0cnVjdCBwaF9pbmZvX2NoCWNoOworCWludDE2X3QJCQlzdGF0ZTsKKwlpbnQxNl90CQkJbnVtX2JjaDsKK307CisKK3N0cnVjdCBwaF9pbmZvIHsKKwlzdHJ1Y3QgcGhfaW5mb19kY2gJZGNoOworCXN0cnVjdCBwaF9pbmZvX2NoIAliY2hbXTsKK307CisKKy8qIHRpbWVyIGRldmljZSBpb2N0bCAqLworI2RlZmluZSBJTUFERFRJTUVSCV9JT1IoJ0knLCA2NCwgaW50KQorI2RlZmluZSBJTURFTFRJTUVSCV9JT1IoJ0knLCA2NSwgaW50KQorLyogc29ja2V0IGlvY3RscyAqLworI2RlZmluZQlJTUdFVFZFUlNJT04JX0lPUignSScsIDY2LCBpbnQpCisjZGVmaW5lCUlNR0VUQ09VTlQJX0lPUignSScsIDY3LCBpbnQpCisjZGVmaW5lIElNR0VUREVWSU5GTwlfSU9SKCdJJywgNjgsIGludCkKKyNkZWZpbmUgSU1DVFJMUkVRCV9JT1IoJ0knLCA2OSwgaW50KQorI2RlZmluZSBJTUNMRUFSX0wyCV9JT1IoJ0knLCA3MCwgaW50KQorI2RlZmluZSBJTVNFVERFVk5BTUUJX0lPUignSScsIDcxLCBzdHJ1Y3QgbUlTRE5fZGV2cmVuYW1lKQorCitzdGF0aWMgaW5saW5lIGludAordGVzdF9jaGFubmVsbWFwKHVfaW50IG5yLCB1X2NoYXIgKm1hcCkKK3sKKwlpZiAobnIgPD0gTUlTRE5fTUFYX0NIQU5ORUwpCisJCXJldHVybiBtYXBbbnIgPj4gM10gJiAoMSA8PCAobnIgJiA3KSk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzZXRfY2hhbm5lbG1hcCh1X2ludCBuciwgdV9jaGFyICptYXApCit7CisJbWFwW25yID4+IDNdIHw9ICgxIDw8IChuciAmIDcpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitjbGVhcl9jaGFubmVsbWFwKHVfaW50IG5yLCB1X2NoYXIgKm1hcCkKK3sKKwltYXBbbnIgPj4gM10gJj0gfigxIDw8IChuciAmIDcpKTsKK30KKworLyogQ09OVFJPTF9DSEFOTkVMIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgTUlTRE5fQ1RSTF9HRVRPUAkJMHgwMDAwCisjZGVmaW5lIE1JU0ROX0NUUkxfTE9PUAkJCTB4MDAwMQorI2RlZmluZSBNSVNETl9DVFJMX0NPTk5FQ1QJCTB4MDAwMgorI2RlZmluZSBNSVNETl9DVFJMX0RJU0NPTk5FQ1QJCTB4MDAwNAorI2RlZmluZSBNSVNETl9DVFJMX1BDTUNPTk5FQ1QJCTB4MDAxMAorI2RlZmluZSBNSVNETl9DVFJMX1BDTURJU0NPTk5FQ1QJMHgwMDIwCisjZGVmaW5lIE1JU0ROX0NUUkxfU0VUUEVFUgkJMHgwMDQwCisjZGVmaW5lIE1JU0ROX0NUUkxfVU5TRVRQRUVSCQkweDAwODAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9SWF9PRkYJCTB4MDEwMAorI2RlZmluZSBNSVNETl9DVFJMX0ZJTExfRU1QVFkJCTB4MDIwMAorI2RlZmluZSBNSVNETl9DVFJMX0dFVFBFRVIJCTB4MDQwMAorI2RlZmluZSBNSVNETl9DVFJMX0hXX0ZFQVRVUkVTX09QCTB4MjAwMAorI2RlZmluZSBNSVNETl9DVFJMX0hXX0ZFQVRVUkVTCQkweDIwMDEKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfT1AJCTB4NDAwMAorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19QQ01fQ09OTgkJMHg0MDAxCisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX1BDTV9ESVNDCQkweDQwMDIKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfQ09ORl9KT0lOCTB4NDAwMworI2RlZmluZSBNSVNETl9DVFJMX0hGQ19DT05GX1NQTElUCTB4NDAwNAorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19SRUNFSVZFX09GRgkweDQwMDUKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfUkVDRUlWRV9PTgkweDQwMDYKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfRUNIT0NBTl9PTiAJMHg0MDA3CisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX0VDSE9DQU5fT0ZGIAkweDQwMDgKKworCisvKiBzb2NrZXQgb3B0aW9ucyAqLworI2RlZmluZSBNSVNETl9USU1FX1NUQU1QCQkweDAwMDEKKworc3RydWN0IG1JU0ROX2N0cmxfcmVxIHsKKwlpbnQJCW9wOworCWludAkJY2hhbm5lbDsKKwlpbnQJCXAxOworCWludAkJcDI7Cit9OworCisvKiBtdXhlciBvcHRpb25zICovCisjZGVmaW5lIE1JU0ROX09QVF9BTEwJCTEKKyNkZWZpbmUgTUlTRE5fT1BUX1RFSU1HUgkyCisKKyNlbmRpZiAvKiBtSVNETklGX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL01ha2VmaWxlLmFtIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE4Nzc4MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTEgQEAKK25vaW5zdF9IRUFERVJTID0gYWJpc19ubS5oIGFiaXNfcnNsLmggZGIuaCBnc21fMDRfMDguaCBnc21fZGF0YS5oIFwKKwkJIGdzbV9zdWJzY3JpYmVyLmggZ3NtXzA0XzExLmggZGVidWcuaCBzaWduYWwuaCBcCisJCSBtaXNkbi5oIGNoYW5fYWxsb2MuaCB0ZWxuZXRfaW50ZXJmYWNlLmggcGFnaW5nLmggXAorCQkgc3ViY2hhbl9kZW11eC5oIHRyYXVfZnJhbWUuaCBlMV9pbnB1dC5oIHRyYXVfbXV4LmggXAorCQkgaXBhY2Nlc3MuaCByczIzMi5oIG9wZW5ic2NkZWZpbmVzLmggcnRwX3Byb3h5LmggXAorCQkgYnNjX3JsbC5oIG1uY2MuaCB0cmFuc2FjdGlvbi5oIHVzc2QuaCBnc21fMDRfODAuaCBcCisJCSBzaWxlbnRfY2FsbC5oIG1nY3AuaCBtZWFzX3JlcC5oIHJlc3Rfb2N0ZXRzLmggXAorCQkgc3lzdGVtX2luZm9ybWF0aW9uLmggaGFuZG92ZXIuaCBtZ2NwX2ludGVybmFsLmgKKworb3BlbmJzY19IRUFERVJTID0gZ3NtXzA0XzA4LmggbWVhc19yZXAuaCBic2NfYXBpLmgKK29wZW5ic2NkaXIgPSAkKGluY2x1ZGVkaXIpL29wZW5ic2MKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfbm0uaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfbm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTMwN2UzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19ubS5oCkBAIC0wLDAgKzEsMTcyIEBACisvKiBHU00gTmV0d29yayBNYW5hZ2VtZW50IG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UgCisgKiAzR1BQIFRTIDEyLjIxIHZlcnNpb24gOC4wLjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNjIzIFY4LjAuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfTk1fSAorI2RlZmluZSBfTk1fSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmg+CisKK3N0cnVjdCBjZWxsX2dsb2JhbF9pZCB7CisJdV9pbnQxNl90IG1jYzsKKwl1X2ludDE2X3QgbW5jOworCXVfaW50MTZfdCBsYWM7CisJdV9pbnQxNl90IGNpOworfTsKKworLyogVGhlIEJDQ0ggaW5mbyBmcm9tIGFuIGlwLmFjY2VzcyB0ZXN0LCBpbiBob3N0IGJ5dGUgb3JkZXIKKyAqIGFuZCBhbHJlYWR5IHBhcnNlZC4uLiAqLworc3RydWN0IGlwYWNfYmNjaF9pbmZvIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJdV9pbnQxNl90IGluZm9fdHlwZTsKKwl1X2ludDhfdCBmcmVxX3F1YWw7CisJdV9pbnQxNl90IGFyZmNuOworCXVfaW50OF90IHJ4X2xldjsKKwl1X2ludDhfdCByeF9xdWFsOworCWludDE2X3QgZnJlcV9lcnI7CisJdV9pbnQxNl90IGZyYW1lX29mZnNldDsKKwl1X2ludDMyX3QgZnJhbWVfbnJfb2Zmc2V0OworCXVfaW50OF90IGJzaWM7CisJc3RydWN0IGNlbGxfZ2xvYmFsX2lkIGNnaTsKKwl1X2ludDhfdCBiYV9saXN0X3NpMlsxNl07CisJdV9pbnQ4X3QgYmFfbGlzdF9zaTJiaXNbMTZdOworCXVfaW50OF90IGJhX2xpc3Rfc2kydGVyWzE2XTsKKwl1X2ludDhfdCBjYV9saXN0X3NpMVsxNl07Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIG5tX2F0dF90bHZkZWY7CisKKy8qIFBVQkxJQyAqLworCitzdHJ1Y3QgbXNnYjsKKworc3RydWN0IGFiaXNfbm1fY2ZnIHsKKwkvKiBjYWxsYmFjayBmb3IgdW5pZGlyZWN0aW9uYWwgcmVwb3J0cyAqLworCWludCAoKnJlcG9ydF9jYikoc3RydWN0IG1zZ2IgKiwKKwkJCSBzdHJ1Y3QgYWJpc19vbV9mb21faGRyICopOworCS8qIGNhbGxiYWNrIGZvciBzb2Z0d2FyZSBhY3RpdmF0ZSByZXF1ZXN0cyBmcm9tIEJUUyAqLworCWludCAoKnN3X2FjdF9yZXEpKHN0cnVjdCBtc2diICopOworfTsKKworZXh0ZXJuIGludCBhYmlzX25tX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKworaW50IGFiaXNfbm1fdGx2X3BhcnNlKHN0cnVjdCB0bHZfcGFyc2VkICp0cCwgc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgdV9pbnQ4X3QgKmJ1ZiwgaW50IGxlbik7CitpbnQgYWJpc19ubV9yeChzdHJ1Y3QgbXNnYiAqbXNnKTsKK2ludCBhYmlzX25tX29wc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMCwgdV9pbnQ4X3QgaTEsIHVfaW50OF90IGkyKTsKK2ludCBhYmlzX25tX2NoZ19hZG1fc3RhdGUoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMCwKKwkJCSAgdV9pbnQ4X3QgaTEsIHVfaW50OF90IGkyLCBlbnVtIGFiaXNfbm1fYWRtX3N0YXRlIGFkbV9zdGF0ZSk7CitpbnQgYWJpc19ubV9lc3RhYmxpc2hfdGVpKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHRyeF9uciwKKwkJCSAgdV9pbnQ4X3QgZTFfcG9ydCwgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QsCisJCQkgIHVfaW50OF90IHRlaSk7CitpbnQgYWJpc19ubV9jb25uX3RlcnJfc2lnbihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwKKwkJCSAgIHVfaW50OF90IGUxX3BvcnQsIHVfaW50OF90IGUxX3RpbWVzbG90LCB1X2ludDhfdCBlMV9zdWJzbG90KTsKK2ludCBhYmlzX25tX2Nvbm5fdGVycl90cmFmKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsCisJCQkgICB1X2ludDhfdCBlMV9wb3J0LCB1X2ludDhfdCBlMV90aW1lc2xvdCwKKwkJCSAgIHVfaW50OF90IGUxX3N1YnNsb3QpOworaW50IGFiaXNfbm1fc2V0X2J0c19hdHRyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90ICphdHRyLCBpbnQgYXR0cl9sZW4pOworaW50IGFiaXNfbm1fc2V0X3JhZGlvX2F0dHIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90ICphdHRyLCBpbnQgYXR0cl9sZW4pOworaW50IGFiaXNfbm1fc2V0X2NoYW5uZWxfYXR0cihzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzLCB1X2ludDhfdCBjaGFuX2NvbWIpOworaW50IGFiaXNfbm1fc3dfYWN0X3JlcV9hY2soc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMSwKKwkJCXVfaW50OF90IGkyLCB1X2ludDhfdCBpMywgaW50IG5hY2ssIHVfaW50OF90ICphdHRyLCBpbnQgYXR0X2xlbik7CitpbnQgYWJpc19ubV9yYXdfbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBsZW4sIHVfaW50OF90ICptc2cpOworaW50IGFiaXNfbm1fZXZlbnRfcmVwb3J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pOworaW50IGFiaXNfbm1fcmVzZXRfcmVzb3VyY2Uoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9zb2Z0d2FyZV9sb2FkKHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJICB1X2ludDhfdCB3aW5fc2l6ZSwgaW50IGZvcmNlZCwKKwkJCSAgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmNiX2RhdGEpOworaW50IGFiaXNfbm1fc29mdHdhcmVfbG9hZF9zdGF0dXMoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9zb2Z0d2FyZV9hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpmbmFtZSwKKwkJCSAgICAgIGdzbV9jYmZuICpjYmZuLCB2b2lkICpjYl9kYXRhKTsKKworaW50IGFiaXNfbm1fY29ubl9tZHJvcF9saW5rKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGUxX3BvcnQwLCB1X2ludDhfdCB0czAsCisJCQkgICAgdV9pbnQ4X3QgZTFfcG9ydDEsIHVfaW50OF90IHRzMSk7CisKK2ludCBhYmlzX25tX3BlcmZvcm1fdGVzdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCQkgdV9pbnQ4X3QgYnRzX25yLCB1X2ludDhfdCB0cnhfbnIsIHVfaW50OF90IHRzX25yLAorCQkJIHVfaW50OF90IHRlc3RfbnIsIHVfaW50OF90IGF1dG9uX3JlcG9ydCwKKwkJCSB1X2ludDhfdCAqcGh5c19jb25maWcsIHVfaW50MTZfdCBwaHlzX2NvbmZpZ19sZW4pOworCitpbnQgYWJpc19ubV9jaGNvbWI0cGNoYW4oZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbik7CisKKy8qIFNpZW1lbnMgLyBCUy0xMSBzcGVjaWZpYyAqLworaW50IGFiaXNfbm1fYnMxMV9yZXNldF9yZXNvdXJjZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfZGJfdHJhbnNtaXNzaW9uKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBiZWdpbik7CitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgZW51bSBhYmlzX2JzMTFfb2JqdHlwZSB0eXBlLAorCQkJICB1X2ludDhfdCBpZHgsIHVfaW50OF90IGF0dHJfbGVuLCBjb25zdCB1X2ludDhfdCAqYXR0cik7CitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9lbnZhQlRTRShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBpZHgpOworaW50IGFiaXNfbm1fYnMxMV9jcmVhdGVfYnBvcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgaWR4KTsKK2ludCBhYmlzX25tX2JzMTFfZGVsZXRlX29iamVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCWVudW0gYWJpc19iczExX29ianR5cGUgdHlwZSwgdV9pbnQ4X3QgaWR4KTsKK2ludCBhYmlzX25tX2JzMTFfZGVsZXRlX2Jwb3J0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGlkeCk7CitpbnQgYWJpc19ubV9iczExX2Nvbm5fb21sX3RlaShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBlMV9wb3J0LAorCQkJICB1X2ludDhfdCBlMV90aW1lc2xvdCwgdV9pbnQ4X3QgZTFfc3Vic2xvdCwgdV9pbnQ4X3QgdGVpKTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X29tbF90ZWlfdHMoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9iczExX2dldF9zZXJubyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X3RyeF9wb3dlcihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgbGV2ZWwpOworaW50IGFiaXNfbm1fYnMxMV9nZXRfdHJ4X3Bvd2VyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKK2ludCBhYmlzX25tX2JzMTFfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbGV2ZWwsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBvbik7CitpbnQgYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG9uKTsKK2ludCBhYmlzX25tX2JzMTFfaW5maWVsZF9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pOworaW50IGFiaXNfbm1fYnMxMV9zZXRfdHJ4MV9wdyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpwYXNzd29yZCk7CitpbnQgYWJpc19ubV9iczExX3NldF9wbGxfbG9ja2VkKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBsb2NrZWQpOworaW50IGFiaXNfbm1fYnMxMV9nZXRfcGxsX21vZGUoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9iczExX3NldF9wbGwoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHZhbHVlKTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X2NjbGsoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9iczExX2dldF9zdGF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfbG9hZF9zd2woc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgIHVfaW50OF90IHdpbl9zaXplLCBpbnQgZm9yY2VkLCBnc21fY2JmbiAqY2Jmbik7CitpbnQgYWJpc19ubV9iczExX3NldF9leHRfdGltZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X2Jwb3J0X2xpbmVfY2ZnKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGJwb3J0LCBlbnVtIGFiaXNfYnMxMV9saW5lX2NmZyBsaW5lX2NmZyk7CitpbnQgYWJpc19ubV9iczExX2JzY19kaXNjb25uZWN0KHN0cnVjdCBnc21fYnRzICpidHMsIGludCByZWNvbm5lY3QpOworaW50IGFiaXNfbm1fYnMxMV9yZXN0YXJ0KHN0cnVjdCBnc21fYnRzICpidHMpOworCisvKiBpcC5hY2Nlc3MgbmFub0JUUyBzcGVjaWZpYyBjb21tYW5kcyAqLworaW50IGFiaXNfbm1faXBhY2Nlc3NfbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG1zZ190eXBlLAorCQkJIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgYnRzX25yLAorCQkJIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbik7CitpbnQgYWJpc19ubV9pcGFjY2Vzc19zZXRfbnZhdHRyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCAqYXR0ciwKKwkJCQlpbnQgYXR0cl9sZW4pOworaW50IGFiaXNfbm1faXBhY2Nlc3NfcmVzdGFydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2lwYWNjZXNzX3NldF9hdHRyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJCQl1X2ludDhfdCBidHNfbnIsIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkJdV9pbnQ4X3QgKmF0dHIsIHVfaW50OF90IGF0dHJfbGVuKTsKK2ludCBhYmlzX25tX2lwYWNjZXNzX3JzbF9jb25uZWN0KHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCAKKwkJCQkgdV9pbnQzMl90IGlwLCB1X2ludDE2X3QgcG9ydCwgdV9pbnQ4X3Qgc3RyZWFtKTsKK3ZvaWQgYWJpc19ubV9pcGFjY2Vzc19jZ2kodV9pbnQ4X3QgKmJ1Ziwgc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgaXBhY19wYXJzZV9iY2NoX2luZm8oc3RydWN0IGlwYWNfYmNjaF9pbmZvICpiaW5mLCB1X2ludDhfdCAqYnVmKTsKK2NvbnN0IGNoYXIgKmlwYWNjX3Rlc3RyZXNfbmFtZSh1X2ludDhfdCByZXMpOworCisvKiBGdW5jdGlvbnMgY2FsbGluZyBpbnRvIG90aGVyIGNvZGUgcGFydHMgKi8KK2VudW0gbm1fZXZ0IHsKKwlFVlRfU1RBVEVDSEdfT1BFUiwKKwlFVlRfU1RBVEVDSEdfQURNLAorfTsKK2ludCBubV9zdGF0ZV9ldmVudChlbnVtIG5tX2V2dCBldnQsIHVfaW50OF90IG9ial9jbGFzcywgdm9pZCAqb2JqLAorCQkgICBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpvbGRfc3RhdGUsIHN0cnVjdCBnc21fbm1fc3RhdGUgKm5ld19zdGF0ZSk7IAorCitjb25zdCBjaGFyICpubV9vcHN0YXRlX25hbWUodV9pbnQ4X3Qgb3MpOworY29uc3QgY2hhciAqbm1fYXZhaWxfbmFtZSh1X2ludDhfdCBhdmFpbCk7CitpbnQgbm1faXNfcnVubmluZyhzdHJ1Y3QgZ3NtX25tX3N0YXRlICpzKTsKKyNlbmRpZiAvKiBfTk1fSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19yc2wuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfcnNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4MDE4NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfcnNsLmgKQEAgLTAsMCArMSw4NyBAQAorLyogR1NNIFJhZGlvIFNpZ25hbGxpbmcgTGluayBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlIAorICogM0dQUCBUUyAwOC41OCB2ZXJzaW9uIDguNi4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDU5NiBWOC42LjAgKi8KKworLyogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9SU0xfSAorI2RlZmluZSBfUlNMX0gKKworI2luY2x1ZGUgPG9zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF81OC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCitpbnQgcnNsX2JjY2hfaW5mbyhzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdHlwZSwKKwkJICBjb25zdCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbik7CitpbnQgcnNsX3NhY2NoX2ZpbGxpbmcoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IHR5cGUsIAorCQkgICAgICBjb25zdCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbik7CitpbnQgcnNsX2NoYW5fYWN0aXZhdGUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IGNoYW5fbnIsCisJCSAgICAgIHVfaW50OF90IGFjdF90eXBlLAorCQkgICAgICBzdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSAqY2hhbl9tb2RlLAorCQkgICAgICBzdHJ1Y3QgcnNsX2llX2NoYW5faWRlbnQgKmNoYW5faWRlbnQsCisJCSAgICAgIHVfaW50OF90IGJzX3Bvd2VyLCB1X2ludDhfdCBtc19wb3dlciwKKwkJICAgICAgdV9pbnQ4X3QgdGEpOworaW50IHJzbF9jaGFuX2FjdGl2YXRlX2xjaGFuKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBhY3RfdHlwZSwgCisJCQkgICAgdV9pbnQ4X3QgdGEsIHVfaW50OF90IGhvX3JlZik7CitpbnQgcnNsX2NoYW5fbW9kZV9tb2RpZnlfcmVxKHN0cnVjdCBnc21fbGNoYW4gKnRzKTsKK2ludCByc2xfZW5jcnlwdGlvbl9jbWQoc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgcnNsX3BhZ2luZ19jbWQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgcGFnaW5nX2dyb3VwLCB1X2ludDhfdCBsZW4sCisJCSAgIHVfaW50OF90ICptc19pZGVudCwgdV9pbnQ4X3QgY2hhbl9uZWVkZWQpOworaW50IHJzbF9wYWdpbmdfY21kX3N1YnNjcihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBjaGFuX25lZWRlZCwKKwkJCSBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitpbnQgcnNsX2ltbV9hc3NpZ25fY21kKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGxlbiwgdV9pbnQ4X3QgKnZhbCk7CisKK2ludCByc2xfZGF0YV9yZXF1ZXN0KHN0cnVjdCBtc2diICptc2csIHVfaW50OF90IGxpbmtfaWQpOworaW50IHJzbF9lc3RhYmxpc2hfcmVxdWVzdChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCk7CitpbnQgcnNsX3JlbGFzZV9yZXF1ZXN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkKTsKKworLyogU2llbWVucyB2ZW5kb3Itc3BlY2lmaWMgUlNMIGV4dGVuc2lvbnMgKi8KK2ludCByc2xfc2llbWVuc19tcnBjaShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IHJzbF9tcnBjaSAqbXJwY2kpOworCisvKiBpcC5hY2Nlc3Mgc3BlY2ZpYyBSU0wgZXh0ZW5zaW9ucyAqLworaW50IHJzbF9pcGFjY19jcmN4KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2ludCByc2xfaXBhY2NfbWRjeChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQzMl90IGlwLAorCQkgICB1X2ludDE2X3QgcG9ydCwgdV9pbnQ4X3QgcnRwX3BheWxvYWQyKTsKK2ludCByc2xfaXBhY2NfbWRjeF90b19ydHBzb2NrKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2ludCByc2xfaXBhY2NfcGRjaF9hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CisKK2ludCBhYmlzX3JzbF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZyk7CisKK3Vuc2lnbmVkIGludCBnZXRfcGFnaW5nX2dyb3VwKHVfaW50NjRfdCBpbXNpLCB1bnNpZ25lZCBpbnQgYnNfY2NfY2hhbnMsCisJCQkgICAgICBpbnQgbl9wYWdfYmxvY2tzKTsKK3Vuc2lnbmVkIGludCBuX3BhZ19ibG9ja3MoaW50IGJzX2NjY2hfc2RjY2hfY29tYiwgdW5zaWduZWQgaW50IGJzX2FnX2Jsa3NfcmVzKTsKK3VfaW50NjRfdCBzdHJfdG9faW1zaShjb25zdCBjaGFyICppbXNpX3N0cik7Cit1X2ludDhfdCBsY2hhbjJjaGFuX25yKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2ludCByc2xfcmVsZWFzZV9yZXF1ZXN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkKTsKKworLyogdG8gYmUgcHJvdmlkZWQgYnkgZXh0ZXJuYWwgY29kZSAqLworaW50IGFiaXNfcnNsX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgcnNsX2RlYWN0X3NhY2NoKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2ludCByc2xfY2hhbl9yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKKworLyogQkNDSCByZWxhdGVkIGNvZGUgKi8KK2ludCByc2xfY2NjaF9jb25mX3RvX2JzX2NjX2NoYW5zKGludCBjY2NoX2NvbmYpOworaW50IHJzbF9jY2NoX2NvbmZfdG9fYnNfY2NjaF9zZGNjaF9jb21iKGludCBjY2NoX2NvbmYpOworaW50IHJzbF9udW1iZXJfb2ZfcGFnaW5nX3N1YmNoYW5uZWxzKHN0cnVjdCBnc21fYnRzICpidHMpOworCitpbnQgcnNsX2NoYW5fYnNfcG93ZXJfY3RybChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdW5zaWduZWQgaW50IGZwYywgaW50IGRiKTsKK2ludCByc2xfY2hhbl9tc19wb3dlcl9jdHJsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1bnNpZ25lZCBpbnQgZnBjLCBpbnQgZGJtKTsKKworI2VuZGlmIC8qIFJTTF9NVF9IICovCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2JzY19hcGkuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2JzY19hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWUzNDRmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYnNjX2FwaS5oCkBAIC0wLDAgKzEsNiBAQAorLyogR1NNIDA4LjA4IGxpa2UgQVBJIGZvciBPcGVuQlNDICovCisKKyNpbmNsdWRlICJnc21fZGF0YS5oIgorCisKK2ludCBnc20wODA4X3N1Ym1pdF9kdGFwKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgbGlua19pZCk7CmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ic2NfcmxsLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ic2NfcmxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4OThkMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2JzY19ybGwuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9CU0NfUkxMX0gKKyNkZWZpbmUgX0JTQ19STExfSAorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorCitlbnVtIGJzY19ybGxyX2luZCB7CisJQlNDX1JMTFJfSU5EX0VTVF9DT05GLAorCUJTQ19STExSX0lORF9SRUxfSU5ELAorCUJTQ19STExSX0lORF9FUlJfSU5ELAorCUJTQ19STExSX0lORF9USU1FT1VULAorfTsKKworaW50IHJsbF9lc3RhYmxpc2goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQsCisJCSAgdm9pZCAoKmNiKShzdHJ1Y3QgZ3NtX2xjaGFuICosIHVfaW50OF90LCB2b2lkICosCisJCQkgICAgIGVudW0gYnNjX3JsbHJfaW5kKSwKKwkJICB2b2lkICpkYXRhKTsKK3ZvaWQgcmxsX2luZGljYXRpb24oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQsIHVfaW50OF90IHR5cGUpOworCisjZW5kaWYgLyogX0JTQ19STExfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvY2hhbl9hbGxvYy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvY2hhbl9hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NjRlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jaGFuX2FsbG9jLmgKQEAgLTAsMCArMSw2NiBAQAorLyogTWFuYWdlbWVudCBmdW5jdGlvbnMgdG8gYWxsb2NhdGUvcmVsZWFzZSBzdHJ1Y3QgZ3NtX2xjaGFuICovCisvKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisjaWZuZGVmIF9DSEFOX0FMTE9DX0gKKyNkZWZpbmUgX0NIQU5fQUxMT0NfSAorCisjaW5jbHVkZSAiZ3NtX3N1YnNjcmliZXIuaCIKKworLyogU3BlY2lhbCBhbGxvY2F0b3IgZm9yIEMwIG9mIEJUUyAqLworc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0c19jMF9hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCSAgIGVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgcGNoYW4pOworCisvKiBSZWd1bGFyIHBoeXNpY2FsIGNoYW5uZWwgYWxsb2NhdG9yICovCitzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbik7CisKKy8qIFJlZ3VsYXIgcGh5c2ljYWwgY2hhbm5lbCAoVFMpICovCit2b2lkIHRzX2ZyZWUoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyk7CisKKy8qIEZpbmQgYW4gYWxsb2NhdGVkIGNoYW5uZWwgKi8KK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2ZpbmQoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworCisvKiBGaW5kIGFuIGFsbG9jYXRlZCBjaGFubmVsIGZvciBhIHNwZWNpZmllZCBzdWJzY3JpYmVyICovCitzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKKworLyogQWxsb2NhdGUgYSBsb2dpY2FsIGNoYW5uZWwgKFNEQ0NILCBUQ0gsIC4uLikgKi8KK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsIGVudW0gZ3NtX2NoYW5fdCB0eXBlKTsKKworLyogRnJlZSBhIGxvZ2ljYWwgY2hhbm5lbCAoU0RDQ0gsIFRDSCwgLi4uKSAqLwordm9pZCBsY2hhbl9mcmVlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKKworLyogQ29uc2lkZXIgcmVsZWFzaW5nIHRoZSBjaGFubmVsICovCitpbnQgbGNoYW5fYXV0b19yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKKworc3RydWN0IGxvYWRfY291bnRlciB7CisJdW5zaWduZWQgaW50IHRvdGFsOworCXVuc2lnbmVkIGludCB1c2VkOworfTsKKworc3RydWN0IHBjaGFuX2xvYWQgeworCXN0cnVjdCBsb2FkX2NvdW50ZXIgcGNoYW5bR1NNX1BDSEFOX1VOS05PV05dOworfTsKKwordm9pZCBidHNfY2hhbl9sb2FkKHN0cnVjdCBwY2hhbl9sb2FkICpjbCwgY29uc3Qgc3RydWN0IGdzbV9idHMgKmJ0cyk7Cit2b2lkIG5ldHdvcmtfY2hhbl9sb2FkKHN0cnVjdCBwY2hhbl9sb2FkICpwbCwgc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpOworCitpbnQgdHJ4X2lzX3VzYWJsZShzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCk7CisKKyNlbmRpZiAvKiBfQ0hBTl9BTExPQ19IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kYi5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGExMjc4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGIuaApAQCAtMCwwICsxLDcxIEBACisvKiAoQykgMjAwOCBieSBKYW4gTHVlYmJlIDxqbHVlYmJlQGRlYmlhbi5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfREJfSAorI2RlZmluZSBfREJfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisKKy8qIG9uZSB0aW1lIGluaXRpYWxpc2F0aW9uICovCitpbnQgZGJfaW5pdChjb25zdCBjaGFyICpuYW1lKTsKK2ludCBkYl9wcmVwYXJlKCk7CitpbnQgZGJfZmluaSgpOworCisvKiBzdWJzY3JpYmVyIG1hbmFnZW1lbnQgKi8KK3N0cnVjdCBnc21fc3Vic2NyaWJlciogZGJfY3JlYXRlX3N1YnNjcmliZXIoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgICBjaGFyICppbXNpKTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciogZGJfZ2V0X3N1YnNjcmliZXIoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSBlbnVtIGdzbV9zdWJzY3JpYmVyX2ZpZWxkIGZpZWxkLAorCQkJCQkgY29uc3QgY2hhciAqc3Vic2NyKTsKK2ludCBkYl9zeW5jX3N1YnNjcmliZXIoc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBzdWJzY3JpYmVyKTsKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX3Rtc2koc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBzdWJzY3JpYmVyKTsKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX2V4dGVuKHN0cnVjdCBnc21fc3Vic2NyaWJlciogc3Vic2NyaWJlcik7CitpbnQgZGJfc3Vic2NyaWJlcl9hbGxvY190b2tlbihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIHN1YnNjcmliZXIsIHVfaW50MzJfdCogdG9rZW4pOworaW50IGRiX3N1YnNjcmliZXJfYXNzb2NfaW1laShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIHN1YnNjcmliZXIsIGNoYXIgKmltZWkpOworaW50IGRiX3N5bmNfZXF1aXBtZW50KHN0cnVjdCBnc21fZXF1aXBtZW50ICplcXVpcCk7CisKKy8qIGF1dGggaW5mbyAqLworaW50IGdldF9hdXRoaW5mb19ieV9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX2luZm8gKmFpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworaW50IHNldF9hdXRoaW5mb19mb3Jfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF9pbmZvICphaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitpbnQgZ2V0X2F1dGh0dXBsZV9ieV9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX3R1cGxlICphdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworaW50IHNldF9hdXRodHVwbGVfZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgKmF0dXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworCisvKiBTTVMgc3RvcmUtYW5kLWZvcndhcmQgKi8KK2ludCBkYl9zbXNfc3RvcmUoc3RydWN0IGdzbV9zbXMgKnNtcyk7CitzdHJ1Y3QgZ3NtX3NtcyAqZGJfc21zX2dldF91bnNlbnQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVuc2lnbmVkIGxvbmcgbG9uZyBtaW5faWQpOworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50X2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdW5zaWduZWQgbG9uZyBsb25nIG1pbl9zdWJzY3JfaWQpOworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50X2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworaW50IGRiX3Ntc19tYXJrX3NlbnQoc3RydWN0IGdzbV9zbXMgKnNtcyk7CisKKy8qIEFQRFUgYmxvYiBzdG9yYWdlICovCitpbnQgZGJfYXBkdV9ibG9iX3N0b3JlKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLCAKKwkJCXVfaW50OF90IGFwZHVfaWRfZmxhZ3MsIHVfaW50OF90IGxlbiwKKwkJCXVfaW50OF90ICphcGR1KTsKKworLyogU3RhdGlzdGljcyBjb3VudGVyIHN0b3JhZ2UgKi8KK2ludCBkYl9zdG9yZV9jb3VudGVyKHN0cnVjdCBjb3VudGVyICpjdHIpOworCisjZW5kaWYgLyogX0RCX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2RlYnVnLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYzVhNjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kZWJ1Zy5oCkBAIC0wLDAgKzEsNTIgQEAKKyNpZm5kZWYgX0RFQlVHX0gKKyNkZWZpbmUgX0RFQlVHX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisKKyNkZWZpbmUgREVCVUcKKyNpbmNsdWRlIDxvc21vY29yZS9sb2dnaW5nLmg+CisKKy8qIERlYnVnIEFyZWFzIG9mIHRoZSBjb2RlICovCitlbnVtIHsKKwlEUkxMLAorCURDQywKKwlETU0sCisJRFJSLAorCURSU0wsCisJRE5NLAorCURNTkNDLAorCURTTVMsCisJRFBBRywKKwlETUVBUywKKwlETUksCisJRE1JQiwKKwlETVVYLAorCURJTlAsCisJRFNDQ1AsCisJRE1TQywKKwlETUdDUCwKKwlESE8sCisJRERCLAorCURSRUYsCisJRGVidWdfTGFzdEVudHJ5LAorfTsKKworLyogY29udGV4dCAqLworI2RlZmluZSBCU0NfQ1RYX0xDSEFOCTAKKyNkZWZpbmUgQlNDX0NUWF9TVUJTQ1IJMQorI2RlZmluZSBCU0NfQ1RYX0JUUwkyCisjZGVmaW5lIEJTQ19DVFhfU0NDUAkzCisKKy8qIHRhcmdldCAqLworCitlbnVtIHsKKwkvL0RFQlVHX0ZJTFRFUl9BTEwgPSAxIDw8IDAsCisJTE9HX0ZJTFRFUl9JTVNJID0gMSA8PCAxLAorfTsKKwordm9pZCBsb2dfc2V0X2ltc2lfZmlsdGVyKHN0cnVjdCBsb2dfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IGNoYXIgKmltc2kpOworCitleHRlcm4gY29uc3Qgc3RydWN0IGxvZ19pbmZvIGxvZ19pbmZvOworCisjZW5kaWYgLyogX0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2UxX2lucHV0LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9lMV9pbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhM2Q5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9lMV9pbnB1dC5oCkBAIC0wLDAgKzEsMTY4IEBACisjaWZuZGVmIF9FMV9JTlBVVF9ICisjZGVmaW5lIF9FMV9JTlBVVF9ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3ViY2hhbl9kZW11eC5oPgorCisjZGVmaW5lIE5VTV9FMV9UUyAgIDMyCisKK2VudW0gZTFpbnBfc2lnbl90eXBlIHsKKwlFMUlOUF9TSUdOX05PTkUsCisJRTFJTlBfU0lHTl9PTUwsCisJRTFJTlBfU0lHTl9SU0wsCit9OworY29uc3QgY2hhciAqZTFpbnBfc2lnbnR5cGVfbmFtZShlbnVtIGUxaW5wX3NpZ25fdHlwZSB0cCk7CisKK3N0cnVjdCBlMWlucF90czsKKworc3RydWN0IGUxaW5wX3NpZ25fbGluayB7CisJLyogbGlzdCBvZiBzaWduYWxsaW5nIGxpbmtzICovCisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCS8qIHRvIHdoaWNoIHRpbWVzbG90IGRvIHdlIGJlbG9uZz8gKi8KKwlzdHJ1Y3QgZTFpbnBfdHMgKnRzOworCisJZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZTsKKworCS8qIHRyeCBmb3IgbXNnLT50cnggb2YgcmVjZWl2ZWQgbXNncyAqLwkKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCS8qIG1zZ2IgcXVldWUgb2YgdG8tYmUtdHJhbnNtaXR0ZWQgbXNncyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIHR4X2xpc3Q7CisKKwkvKiBTQVBJIGFuZCBURUkgb24gdGhlIEUxIFRTICovCisJdV9pbnQ4X3Qgc2FwaTsKKwl1X2ludDhfdCB0ZWk7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1X2ludDhfdCBjaGFubmVsOworCQl9IG1pc2RuOworCX0gZHJpdmVyOworfTsKKworZW51bSBlMWlucF90c190eXBlIHsKKwlFMUlOUF9UU19UWVBFX05PTkUsCisJRTFJTlBfVFNfVFlQRV9TSUdOLAorCUUxSU5QX1RTX1RZUEVfVFJBVSwKK307Citjb25zdCBjaGFyICplMWlucF90c3R5cGVfbmFtZShlbnVtIGUxaW5wX3RzX3R5cGUgdHApOworCisvKiBBIHRpbWVzbG90IGluIHRoZSBFMSBpbnRlcmZhY2UgKi8KK3N0cnVjdCBlMWlucF90cyB7CisJZW51bSBlMWlucF90c190eXBlIHR5cGU7CisJaW50IG51bTsKKworCS8qIHRvIHdoaWNoIGxpbmUgZG8gd2UgYmVsb25nID8gKi8KKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCS8qIGxpc3Qgb2YgYWxsIHNpZ25hbGxpbmcgbGlua3Mgb24gdGhpcyBUUyAqLworCQkJc3RydWN0IGxsaXN0X2hlYWQgc2lnbl9saW5rczsKKwkJCS8qIHRpbWVyIHdoZW4gdG8gZGVxdWV1ZSBuZXh0IGZyYW1lICovCisJCQlzdHJ1Y3QgdGltZXJfbGlzdCB0eF90aW1lcjsKKwkJfSBzaWduOworCQlzdHJ1Y3QgeworCQkJLyogc3ViY2hhbm5lbCBkZW11eGVyIGZvciBmcmFtZXMgZnJvbSBFMSAqLworCQkJc3RydWN0IHN1YmNoX2RlbXV4IGRlbXV4OworCQkJLyogc3ViY2hhbm5lbCBtdXhlciBmb3IgZnJhbWVzIHRvIEUxICovCisJCQlzdHJ1Y3Qgc3ViY2hfbXV4IG11eDsKKwkJfSB0cmF1OworCX07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJLyogbUlTRE4gZHJpdmVyIGhhcyBvbmUgZmQgZm9yIGVhY2ggdHMgKi8KKwkJCXN0cnVjdCBic2NfZmQgZmQ7CisJCX0gbWlzZG47CisJCXN0cnVjdCB7CisJCQkvKiBpcC5hY2Nlc3MgZHJpdmVyIGhhcyBvbmUgZmQgZm9yIGVhY2ggdHMgKi8KKwkJCXN0cnVjdCBic2NfZmQgZmQ7CisJCX0gaXBhY2Nlc3M7CisKKwl9IGRyaXZlcjsKK307CisKK3N0cnVjdCBlMWlucF9kcml2ZXIgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCp3YW50X3dyaXRlKShzdHJ1Y3QgZTFpbnBfdHMgKnRzKTsKK307CQorCitzdHJ1Y3QgZTFpbnBfbGluZSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBpbnQgbnVtOworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwkvKiBhcnJheSBvZiB0aW1lc3Rsb3RzICovCisJc3RydWN0IGUxaW5wX3RzIHRzW05VTV9FMV9UU107CisKKwlzdHJ1Y3QgZTFpbnBfZHJpdmVyICpkcml2ZXI7CisJdm9pZCAqZHJpdmVyX2RhdGE7Cit9OworCisvKiByZWdpc3RlciBhIGRyaXZlciB3aXRoIHRoZSBFMSBjb3JlICovCitpbnQgZTFpbnBfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBlMWlucF9kcml2ZXIgKmRydik7CisKKy8qIHJlZ2lzdGVyIGEgbGluZSB3aXRoIHRoZSBFMSBjb3JlICovCitpbnQgZTFpbnBfbGluZV9yZWdpc3RlcihzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSk7CisKKy8qIGVuc3VyZSBhIGNlcnRhaW4gbGluZSBleGlzdHMsIHJldHVybiBwb2ludGVyIHRvIGl0ICovCitzdHJ1Y3QgZTFpbnBfbGluZSAqZTFpbnBfbGluZV9nZXRfY3JlYXRlKHVfaW50OF90IGUxX25yKTsKKworLyogZmluZCBhIHNpZ25fbGluayBmb3IgZ2l2ZW4gVEVJIGFuZCBTQVBJIGluIGEgVFMgKi8KK3N0cnVjdCBlMWlucF9zaWduX2xpbmsgKgorZTFpbnBfbG9va3VwX3NpZ25fbGluayhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCB1X2ludDhfdCB0ZWksCisJCQl1X2ludDhfdCBzYXBpKTsKKworLyogY3JlYXRlIGEgbmV3IHNpZ25hbGxpbmcgbGluayBpbiBhIEUxIHRpbWVzbG90ICovCitzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICoKK2UxaW5wX3NpZ25fbGlua19jcmVhdGUoc3RydWN0IGUxaW5wX3RzICp0cywgZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZSwKKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCB0ZWksCisJCQl1X2ludDhfdCBzYXBpKTsKKworLyogY29uZmlndXJlIGFuZCBpbml0aWFsaXplIG9uZSBlMWlucF90cyAqLworaW50IGUxaW5wX3RzX2NvbmZpZyhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwKKwkJICAgIGVudW0gZTFpbnBfdHNfdHlwZSB0eXBlKTsKKworLyogQ2FsbCBmcm9tIHRoZSBTdGFjazogY29uZmlndXJhdGlvbiBvZiB0aGlzIFRTIGhhcyBjaGFuZ2VkICovCitpbnQgZTFpbnBfdXBkYXRlX3RzKHN0cnVjdCBlMWlucF90cyAqdHMpOworCisvKiBSZWNlaXZlIGEgcGFja2V0IGZyb20gdGhlIEUxIGRyaXZlciAqLworaW50IGUxaW5wX3J4X3RzKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBtc2diICptc2csCisJCXVfaW50OF90IHRlaSwgdV9pbnQ4X3Qgc2FwaSk7CisKKy8qIGNhbGxlZCBieSBkcml2ZXIgaWYgaXQgd2FudHMgdG8gdHJhbnNtaXQgb24gYSBnaXZlbiBUUyAqLworc3RydWN0IG1zZ2IgKmUxaW5wX3R4X3RzKHN0cnVjdCBlMWlucF90cyAqZTFpX3RzLAorCQkJIHN0cnVjdCBlMWlucF9zaWduX2xpbmsgKipzaWduX2xpbmspOworCisvKiBjYWxsZWQgYnkgZHJpdmVyIGluIGNhc2Ugc29tZSBraW5kIG9mIGxpbmsgc3RhdGUgZXZlbnQgKi8KK2ludCBlMWlucF9ldmVudChzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBpbnQgZXZ0LCB1X2ludDhfdCB0ZWksIHVfaW50OF90IHNhcGkpOworCisvKiBXcml0ZSBMQVBEIGZyYW1lcyB0byB0aGUgZmQuICovCit2b2lkIGUxX3NldF9wY2FwX2ZkKGludCBmZCk7CisKKy8qIGNhbGxlZCBieSBUUkFVIG11eGVyIHRvIG9idGFpbiB0aGUgZGVzdGluYXRpb24gbXV4IGVudGl0eSAqLworc3RydWN0IHN1YmNoX211eCAqZTFpbnBfZ2V0X211eCh1X2ludDhfdCBlMV9uciwgdV9pbnQ4X3QgdHNfbnIpOworCit2b2lkIGUxaW5wX3NpZ25fbGlua19kZXN0cm95KHN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbmspOworaW50IGUxaW5wX2xpbmVfdXBkYXRlKHN0cnVjdCBlMWlucF9saW5lICpsaW5lKTsKKworLyogZTFfY29uZmlnLmMgKi8KK2ludCBlMV9yZWNvbmZpZ190cyhzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKTsKK2ludCBlMV9yZWNvbmZpZ190cngoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworaW50IGUxX3JlY29uZmlnX2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworaW50IGlhX2NvbmZpZ19jb25uZWN0KHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luKTsKK2ludCBpcGFjY2Vzc19zZXR1cChzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCk7CisKK2V4dGVybiBzdHJ1Y3QgbGxpc3RfaGVhZCBlMWlucF9kcml2ZXJfbGlzdDsKK2V4dGVybiBzdHJ1Y3QgbGxpc3RfaGVhZCBlMWlucF9saW5lX2xpc3Q7CisKKyNlbmRpZiAvKiBfRTFfSU5QVVRfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzA4LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMDguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDAxOGNkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzA4LmgKQEAgLTAsMCArMSw1NiBAQAorI2lmbmRlZiBfR1NNXzA0XzA4X0gKKyNkZWZpbmUgX0dTTV8wNF8wOF9ICisKKyNpbmNsdWRlIDxvcGVuYnNjL21lYXNfcmVwLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9wcm90b2NvbC9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc200OC5oPgorCitzdHJ1Y3QgbXNnYjsKK3N0cnVjdCBnc21fYnRzOworc3RydWN0IGdzbV9zdWJzY3JpYmVyOworc3RydWN0IGdzbV9uZXR3b3JrOworc3RydWN0IGdzbV90cmFuczsKKworLyogY29uZmlnIG9wdGlvbnMgY29udHJvbGxpbmcgdGhlIGJlaGF2aW91ciBvZiB0aGUgbG93ZXIgbGV2ZXMgKi8KK3ZvaWQgZ3NtMDQwOF9hbGxvd19ldmVyeW9uZShpbnQgYWxsb3cpOworCitpbnQgZ3NtMDQwOF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCk7CitlbnVtIGdzbV9jaGFuX3QgZ2V0X2N0eXBlX2J5X2NocmVxKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHJhLCBpbnQgbmVjaSk7CitlbnVtIGdzbV9jaHJlcV9yZWFzb25fdCBnZXRfcmVhc29uX2J5X2NocmVxKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHJhLCBpbnQgbmVjaSk7CisKK2ludCBnc200OF90eF9tbV9pbmZvKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2ludCBnc200OF90eF9tbV9hdXRoX3JlcShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgKnJhbmQsIGludCBrZXlfc2VxKTsKK2ludCBnc200OF90eF9tbV9hdXRoX3JlaihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CitzdHJ1Y3QgbXNnYiAqZ3NtNDhfbXNnYl9hbGxvYyh2b2lkKTsKK2ludCBnc200OF9zZW5kbXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKTsKK2ludCBnc200OF9taV90b19zdHJpbmcoY2hhciAqc3RyaW5nLCBjb25zdCBpbnQgc3RyX2xlbiwgY29uc3QgdV9pbnQ4X3QgKm1pLCBjb25zdCBpbnQgbWlfbGVuKTsKKworaW50IGdzbTQ4X3NlbmRfcnJfcmVsZWFzZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CitpbnQgZ3NtNDhfc2VuZF9ycl9jaXBoX21vZGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIGludCB3YW50X2ltZWlzdik7CitpbnQgZ3NtNDhfc2VuZF9ycl9hcHBfaW5mbyhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgYXBkdV9pZCwKKwkJCSAgIHVfaW50OF90IGFwZHVfbGVuLCBjb25zdCB1X2ludDhfdCAqYXBkdSk7CitpbnQgZ3NtNDhfc2VuZF9ycl9hc3NfY21kKHN0cnVjdCBnc21fbGNoYW4gKmRlc3RfbGNoYW4sIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBwb3dlcl9jbGFzcyk7CitpbnQgZ3NtNDhfc2VuZF9ob19jbWQoc3RydWN0IGdzbV9sY2hhbiAqb2xkX2xjaGFuLCBzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW4sCisJCSAgICAgIHVfaW50OF90IHBvd2VyX2NvbW1hbmQsIHVfaW50OF90IGhvX3JlZik7CisKK2ludCBic2NfdXBxdWV1ZShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCk7CisKK2ludCBtbmNjX3NlbmQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtc2dfdHlwZSwgdm9pZCAqYXJnKTsKKworLyogY29udmVydCBhIEFTQ0lJIHBob25lIG51bWJlciB0byBjYWxsLWNvbnRyb2wgQkNEICovCitpbnQgZW5jb2RlX2JjZF9udW1iZXIodV9pbnQ4X3QgKmJjZF9sdiwgdV9pbnQ4X3QgbWF4X2xlbiwKKwkJICAgICAgaW50IGhfbGVuLCBjb25zdCBjaGFyICppbnB1dCk7CitpbnQgZGVjb2RlX2JjZF9udW1iZXIoY2hhciAqb3V0cHV0LCBpbnQgb3V0cHV0X2xlbiwgY29uc3QgdV9pbnQ4X3QgKmJjZF9sdiwKKwkJICAgICAgaW50IGhfbGVuKTsKKworaW50IHNlbmRfc2llbWVuc19tcnBjaShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgKmNsYXNzbWFyazJfbHYpOworaW50IGdzbTQ4X3BhZ2luZ19leHRyYWN0X21pKHN0cnVjdCBtc2diICptc2csIGNoYXIgKm1pX3N0cmluZywgdV9pbnQ4X3QgKm1pX3R5cGUpOworaW50IGdzbTQ4X2hhbmRsZV9wYWdpbmdfcmVzcChzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CisKK2ludCBnc200OF9sY2hhbl9tb2RpZnkoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxjaGFuX21vZGUpOworaW50IGdzbTQ4X3J4X3JyX21vZGlmX2FjayhzdHJ1Y3QgbXNnYiAqbXNnKTsKK2ludCBnc200OF9wYXJzZV9tZWFzX3JlcChzdHJ1Y3QgZ3NtX21lYXNfcmVwICpyZXAsIHN0cnVjdCBtc2diICptc2cpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzExLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfMTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTI3YWYxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzExLmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZiBfR1NNXzA0XzExX0gKKyNkZWZpbmUgX0dTTV8wNF8xMV9ICisKKyNpbmNsdWRlIDxvc21vY29yZS9wcm90b2NvbC9nc21fMDRfMTEuaD4KKworLyogU01TIGRlbGl2ZXIgUERVICovCitzdHJ1Y3Qgc21zX2RlbGl2ZXIgeworCXVfaW50OF90IG10aToyOwkJLyogbWVzc2FnZSB0eXBlIGluZGljYXRvciAqLworCXVfaW50OF90IG1tczoxOwkJLyogbW9yZSBtZXNzYWdlcyB0byBzZW5kICovCisJdV9pbnQ4X3QgcnA6MTsJCS8qIHJlcGx5IHBhdGggKi8KKwl1X2ludDhfdCB1ZGhpOjE7CS8qIHVzZXIgZGF0YSBoZWFkZXIgaW5kaWNhdG9yICovCisJdV9pbnQ4X3Qgc3JpOjE7CQkvKiBzdGF0dXMgcmVwb3J0IGluZGljYXRpb24gKi8KKwl1X2ludDhfdCAqb3JpZ19hZGRyOwkvKiBvcmlnaW5hdGluZyBhZGRyZXNzICovCisJdV9pbnQ4X3QgcGlkOwkJLyogcHJvdG9jb2wgaWRlbnRpZmllciAqLworCXVfaW50OF90IGRjczsJCS8qIGRhdGEgY29kaW5nIHNjaGVtZSAqLworCQkJCS8qIHNlcnZpY2UgY2VudHJlIHRpbWUgc3RhbXAgKi8KKwl1X2ludDhfdCB1ZF9sZW47CS8qIHVzZXIgZGF0YSBsZW5ndGggKi8KKwl1X2ludDhfdCAqdXNlcl9kYXRhOwkvKiB1c2VyIGRhdGEgKi8KKworCXVfaW50OF90IG1zZ19yZWY7CS8qIG1lc3NhZ2UgcmVmZXJlbmNlICovCisJdV9pbnQ4X3QgKnNtc2M7Cit9OworCitzdHJ1Y3QgbXNnYjsKKworaW50IGdzbTA0MTFfcmN2X3NtcyhzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKTsKKworaW50IGdzbTQxMV9zZW5kX3Ntc19sY2hhbihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IGdzbV9zbXMgKnNtcyk7CisKK3N0cnVjdCBnc21fc21zICpzbXNfYWxsb2Modm9pZCk7Cit2b2lkIHNtc19mcmVlKHN0cnVjdCBnc21fc21zICpzbXMpOworCit2b2lkIF9nc200MTFfc21zX3RyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpOworaW50IGdzbTQxMV9zZW5kX3Ntc19zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICBzdHJ1Y3QgZ3NtX3NtcyAqc21zKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzgwLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fMDRfODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWFiMWM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzgwLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfR1NNXzA0XzgwX0gKKyNkZWZpbmUgX0dTTV8wNF84MF9ICisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzgwLmg+CisKKyNkZWZpbmUgTUFYX0xFTl9VU1NEX1NUUklORwkzMQorCitzdHJ1Y3QgdXNzZF9yZXF1ZXN0IHsKKwkJCWNoYXIgdGV4dFtNQVhfTEVOX1VTU0RfU1RSSU5HICsgMV07CisJCQl1X2ludDhfdCB0cmFuc2FjdGlvbl9pZDsKKwkJCXVfaW50OF90IGludm9rZV9pZDsKK307CisKK2ludCBnc20wNDgwX2RlY29kZV91c3NkX3JlcXVlc3QoY29uc3Qgc3RydWN0IG1zZ2IgKm1zZywgCisJCQkJc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxdWVzdCk7IAoraW50IGdzbTA0ODBfc2VuZF91c3NkX3Jlc3BvbnNlKGNvbnN0IHN0cnVjdCBtc2diICppbl9tc2csIGNvbnN0IGNoYXIqIHJlc3BvbnNlX3RleHQsIAorCQkJCQkJY29uc3Qgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKTsKK2ludCBnc20wNDgwX3NlbmRfdXNzZF9yZWplY3QoY29uc3Qgc3RydWN0IG1zZ2IgKm1zZywgCisJCQkJY29uc3Qgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxdWVzdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtX2RhdGEuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM1MjcxMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV9kYXRhLmgKQEAgLTAsMCArMSw3MTYgQEAKKyNpZm5kZWYgX0dTTV9EQVRBX0gKKyNkZWZpbmUgX0dTTV9EQVRBX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCitlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHsKKwlHU01fUENIQU5fTk9ORSwKKwlHU01fUENIQU5fQ0NDSCwKKwlHU01fUENIQU5fQ0NDSF9TRENDSDQsCisJR1NNX1BDSEFOX1RDSF9GLAorCUdTTV9QQ0hBTl9UQ0hfSCwKKwlHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEMsCisJR1NNX1BDSEFOX1BEQ0gsCQkvKiBHUFJTIFBEQ0ggKi8KKwlHU01fUENIQU5fVENIX0ZfUERDSCwJLyogVENIL0YgaWYgdXNlZCwgUERDSCBvdGhlcndpc2UgKi8KKwlHU01fUENIQU5fVU5LTk9XTiwKK307CisKK2VudW0gZ3NtX2NoYW5fdCB7CisJR1NNX0xDSEFOX05PTkUsCisJR1NNX0xDSEFOX1NEQ0NILAorCUdTTV9MQ0hBTl9UQ0hfRiwKKwlHU01fTENIQU5fVENIX0gsCisJR1NNX0xDSEFOX1VOS05PV04sCit9OworCisvKiBSUkxQIG1vZGUgb2Ygb3BlcmF0aW9uICovCitlbnVtIHJybHBfbW9kZSB7CisJUlJMUF9NT0RFX05PTkUsCisJUlJMUF9NT0RFX01TX0JBU0VELAorCVJSTFBfTU9ERV9NU19QUkVGLAorCVJSTFBfTU9ERV9BU1NfUFJFRiwKK307CisKKy8qIENoYW5uZWwgUmVxdWVzdCByZWFzb24gKi8KK2VudW0gZ3NtX2NocmVxX3JlYXNvbl90IHsKKwlHU01fQ0hSRVFfUkVBU09OX0VNRVJHLAorCUdTTV9DSFJFUV9SRUFTT05fUEFHLAorCUdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlHU01fQ0hSRVFfUkVBU09OX0xPQ0FUSU9OX1VQRCwKKwlHU01fQ0hSRVFfUkVBU09OX09USEVSLAorfTsKKworI2luY2x1ZGUgPG9zbW9jb3JlL3RpbWVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tbmNjLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvYml0dmVjLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc3RhdGlzdGljcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3V0aWxzLmg+CisKKyNkZWZpbmUgVFJYX05SX1RTCTgKKyNkZWZpbmUgVFNfTUFYX0xDSEFOCTgKKworI2RlZmluZSBIQVJEQ09ERURfQVJGQ04gMTIzCisjZGVmaW5lIEhBUkRDT0RFRF9UU0MJNworI2RlZmluZSBIQVJEQ09ERURfQlNJQwkweDNmCS8qIE5DQyA9IDcgLyBCQ0MgPSA3ICovCisKKy8qIGZvciBtdWx0aS1kcm9wIGNvbmZpZyAqLworI2RlZmluZSBIQVJEQ09ERURfQlRTMF9UUwkxCisjZGVmaW5lIEhBUkRDT0RFRF9CVFMxX1RTCTYKKyNkZWZpbmUgSEFSRENPREVEX0JUUzJfVFMJMTEKKworZW51bSBnc21faG9va3MgeworCUdTTV9IT09LX05NX1NXTE9BRCwKKwlHU01fSE9PS19SUl9QQUdJTkcsCit9OworCitlbnVtIGdzbV9wYWdpbmdfZXZlbnQgeworCUdTTV9QQUdJTkdfU1VDQ0VFREVELAorCUdTTV9QQUdJTkdfRVhQSVJFRCwKKwlHU01fUEFHSU5HX09PTSwKK307CisKK3N0cnVjdCBtc2diOwordHlwZWRlZiBpbnQgZ3NtX2NiZm4odW5zaWduZWQgaW50IGhvb2tudW0sCisJCSAgICAgdW5zaWduZWQgaW50IGV2ZW50LAorCQkgICAgIHN0cnVjdCBtc2diICptc2csCisJCSAgICAgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pOworCisvKgorICogVXNlIHRoZSBjaGFubmVsLiBBcyBzaWRlIGVmZmVjdCB0aGUgbGNoYW5uZWwgcmVjeWNsZSB0aW1lcgorICogd2lsbCBiZSBzdGFydGVkLgorICovCisjZGVmaW5lIExDSEFOX1JFTEVBU0VfVElNRU9VVCAyMCwgMAorI2RlZmluZSB1c2Vfc3Vic2NyX2Nvbihjb24pIFwKKwlkbyB7CShjb24pLT51c2VfY291bnQrKzsgXAorCQlERUJVR1AoRFJFRiwgImxjaGFuIChidHM9JWQsdHJ4PSVkLHRzPSVkLGNoPSVkKSBpbmNyZWFzZXMgdXNhZ2UgdG86ICVkXG4iLCBcCisJCQkoY29uKS0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIChjb24pLT5sY2hhbi0+dHMtPnRyeC0+bnIsIChjb24pLT5sY2hhbi0+dHMtPm5yLCBcCisJCQkoY29uKS0+bGNoYW4tPm5yLCAoY29uKS0+dXNlX2NvdW50KTsgXAorCQlic2Nfc2NoZWR1bGVfdGltZXIoJihjb24pLT5yZWxlYXNlX3RpbWVyLCBMQ0hBTl9SRUxFQVNFX1RJTUVPVVQpOyB9IHdoaWxlKDApOworCisjZGVmaW5lIHB1dF9zdWJzY3JfY29uKGNvbikgXAorCWRvIHsgKGNvbiktPnVzZV9jb3VudC0tOyBcCisJCURFQlVHUChEUkVGLCAibGNoYW4gKGJ0cz0lZCx0cng9JWQsdHM9JWQsY2g9JWQpIGRlY3JlYXNlcyB1c2FnZSB0bzogJWRcbiIsIFwKKwkJCShjb24pLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwgKGNvbiktPmxjaGFuLT50cy0+dHJ4LT5uciwgKGNvbiktPmxjaGFuLT50cy0+bnIsIFwKKwkJCShjb24pLT5sY2hhbi0+bnIsIChjb24pLT51c2VfY291bnQpOyBcCisJfSB3aGlsZSgwKTsKKworCisvKiBjb21tdW5pY2F0aW9ucyBsaW5rIHdpdGggYSBCVFMgKi8KK3N0cnVjdCBnc21fYnRzX2xpbmsgeworCXN0cnVjdCBnc21fYnRzICpidHM7Cit9OworCisvKiBSZWFsIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGNvbnRhaW5pbmcgS2kgKi8KK2VudW0gZ3NtX2F1dGhfYWxnbyB7CisJQVVUSF9BTEdPX05PTkUsCisJQVVUSF9BTEdPX1hPUiwKKwlBVVRIX0FMR09fQ09NUDEyOHYxLAorfTsKKworc3RydWN0IGdzbV9hdXRoX2luZm8geworCWVudW0gZ3NtX2F1dGhfYWxnbyBhdXRoX2FsZ287CisJdW5zaWduZWQgaW50IGEzYThfa2lfbGVuOworCXVfaW50OF90IGEzYThfa2lbMTZdOworfTsKKworc3RydWN0IGdzbV9hdXRoX3R1cGxlIHsKKwlpbnQgdXNlX2NvdW50OworCWludCBrZXlfc2VxOworCXVfaW50OF90IHJhbmRbMTZdOworCXVfaW50OF90IHNyZXNbNF07CisJdV9pbnQ4X3Qga2NbOF07Cit9OworCisKK3N0cnVjdCBnc21fbGNoYW47CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXI7CitzdHJ1Y3QgZ3NtX21uY2M7CitzdHJ1Y3QgcnRwX3NvY2tldDsKKworLyogTmV0d29yayBNYW5hZ2VtZW50IFN0YXRlICovCitzdHJ1Y3QgZ3NtX25tX3N0YXRlIHsKKwl1X2ludDhfdCBvcGVyYXRpb25hbDsKKwl1X2ludDhfdCBhZG1pbmlzdHJhdGl2ZTsKKwl1X2ludDhfdCBhdmFpbGFiaWxpdHk7Cit9OworCisvKgorICogTE9DQVRJT04gVVBEQVRJTkcgUkVRVUVTVCBzdGF0ZQorICoKKyAqIE91ciBjdXJyZW50IG9wZXJhdGlvbiBpczoKKyAqCS0gR2V0IGltZWkvdG1zaQorICoJLSBBY2NlcHQvUmVqZWN0IGFjY29yZGluZyB0byBnbG9iYWwgcG9saWN5CisgKi8KK3N0cnVjdCBnc21fbG9jX3VwZGF0aW5nX29wZXJhdGlvbiB7CisgICAgICAgIHN0cnVjdCB0aW1lcl9saXN0IHVwZGF0aW5nX3RpbWVyOworCXVuc2lnbmVkIGludCB3YWl0aW5nX2Zvcl9pbXNpIDogMTsKKwl1bnNpZ25lZCBpbnQgd2FpdGluZ19mb3JfaW1laSA6IDE7Cit9OworCisvKiBNYXhpbXVtIG51bWJlciBvZiBuZWlnaGJvciBjZWxscyB3aG9zZSBhdmVyYWdlIHdlIHRyYWNrICovCisjZGVmaW5lIE1BWF9ORUlHSF9NRUFTCQkxMAorLyogTWF4aW11bSBzaXplIG9mIHRoZSBhdmVyYWdpbmcgd2luZG93IGZvciBuZWlnaGJvciBjZWxscyAqLworI2RlZmluZSBNQVhfV0lOX05FSUdIX0FWRwkxMAorCisvKiBwcm9jZXNzZWQgbmVpZ2hib3IgbWVhc3VyZW1lbnRzIGZvciBvbmUgY2VsbCAqLworc3RydWN0IG5laWdoX21lYXNfcHJvYyB7CisJdV9pbnQxNl90IGFyZmNuOworCXVfaW50OF90IGJzaWM7CisJdV9pbnQ4X3QgcnhsZXZbTUFYX1dJTl9ORUlHSF9BVkddOworCXVuc2lnbmVkIGludCByeGxldl9jbnQ7CisJdV9pbnQ4X3QgbGFzdF9zZWVuX25yOworfTsKKworI2RlZmluZSBNQVhfQTVfS0VZX0xFTgkoMTI4LzgpCisjZGVmaW5lIFJTTF9FTkNfQUxHX0E1KHgpCSh4KzEpCisKKy8qIGlzIHRoZSBkYXRhIGxpbmsgZXN0YWJsaXNoZWQ/IHdobyBlc3RhYmxpc2hlZCBpdD8gKi8KKyNkZWZpbmUgTENIQU5fU0FQSV9VTlVTRUQJMAorI2RlZmluZSBMQ0hBTl9TQVBJX01TCQkxCisjZGVmaW5lIExDSEFOX1NBUElfTkVUCQkyCisKKy8qIHN0YXRlIG9mIGEgbG9naWNhbCBjaGFubmVsICovCitlbnVtIGdzbV9sY2hhbl9zdGF0ZSB7CisJTENIQU5fU19OT05FLAkJLyogY2hhbm5lbCBpcyBub3QgYWN0aXZlICovCisJTENIQU5fU19BQ1RfUkVRLAkvKiBjaGFubmVsIGFjdGl2YXRpbiByZXF1ZXN0ZWQgKi8KKwlMQ0hBTl9TX0FDVElWRSwJCS8qIGNoYW5uZWwgaXMgYWN0aXZlIGFuZCBvcGVyYXRpb25hbCAqLworCUxDSEFOX1NfUkVMX1JFUSwJLyogY2hhbm5lbCByZWxlYXNlIGhhcyBiZWVuIHJlcXVlc3RlZCAqLworCUxDSEFOX1NfSU5BQ1RJVkUsCS8qIGNoYW5uZWwgaXMgc2V0IGluYWN0aXZlICovCit9OworCisvKiB0aGUgcGVyIHN1YnNjcmliZXIgZGF0YSBmb3IgbGNoYW4gKi8KK3N0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uIHsKKwkvKiBUbyB3aG9tIHdlIGFyZSBhbGxvY2F0ZWQgYXQgdGhlIG1vbWVudCAqLworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJLyogVGltZXIgc3RhcnRlZCB0byByZWxlYXNlIHRoZSBjaGFubmVsICovCisJc3RydWN0IHRpbWVyX2xpc3QgcmVsZWFzZV90aW1lcjsKKworCS8qCisJICogT3BlcmF0aW9ucyB0aGF0IGhhdmUgYSBzdGF0ZSBhbmQgbWlnaHQgYmUgcGVuZGluZworCSAqLworCXN0cnVjdCBnc21fbG9jX3VwZGF0aW5nX29wZXJhdGlvbiAqbG9jX29wZXJhdGlvbjsKKworCS8qIHVzZSBjb3VudC4gaG93IG1hbnkgdXNlcnMgdXNlIHRoaXMgY2hhbm5lbCAqLworCXVuc2lnbmVkIGludCB1c2VfY291bnQ7CisKKwkvKiBBcmUgd2UgcGFydCBvZiBhIHNwZWNpYWwgInNpbGVudCIgY2FsbCAqLworCWludCBzaWxlbnRfY2FsbDsKKworCS8qIGJhY2sgcG9pbnRlcnMgKi8KKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworfTsKKworc3RydWN0IGdzbV9sY2hhbiB7CisJLyogVGhlIFRTIHRoYXQgd2UncmUgcGFydCBvZiAqLworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisJLyogVGhlIGxvZ2ljYWwgc3Vic2xvdCBudW1iZXIgaW4gdGhlIFRTICovCisJdV9pbnQ4X3QgbnI7CisJLyogVGhlIGxvZ2ljYWwgY2hhbm5lbCB0eXBlICovCisJZW51bSBnc21fY2hhbl90IHR5cGU7CisJLyogUlNMIGNoYW5uZWwgbW9kZSAqLworCWVudW0gcnNsX2Ntb2Rfc3BkIHJzbF9jbW9kZTsKKwkvKiBJZiBUQ0gsIHRyYWZmaWMgY2hhbm5lbCBtb2RlICovCisJZW51bSBnc200OF9jaGFuX21vZGUgdGNoX21vZGU7CisJLyogU3RhdGUgKi8KKwllbnVtIGdzbV9sY2hhbl9zdGF0ZSBzdGF0ZTsKKwkvKiBQb3dlciBsZXZlbHMgZm9yIE1TIGFuZCBCVFMgKi8KKwl1X2ludDhfdCBic19wb3dlcjsKKwl1X2ludDhfdCBtc19wb3dlcjsKKwkvKiBFbmNyeXB0aW9uIGluZm9ybWF0aW9uICovCisJc3RydWN0IHsKKwkJdV9pbnQ4X3QgYWxnX2lkOworCQl1X2ludDhfdCBrZXlfbGVuOworCQl1X2ludDhfdCBrZXlbTUFYX0E1X0tFWV9MRU5dOworCX0gZW5jcjsKKworCXN0cnVjdCB0aW1lcl9saXN0IFQzMTAxOworCisJLyogQU1SIGJpdHMgKi8KKwlzdHJ1Y3QgZ3NtNDhfbXVsdGlfcmF0ZV9jb25mIG1yX2NvbmY7CisJCisJLyogRXN0YWJsaXNoZWQgZGF0YSBsaW5rIGxheWVyIHNlcnZpY2VzICovCisJdV9pbnQ4X3Qgc2FwaXNbOF07CisKKwkvKiBjYWNoZSBvZiBsYXN0IG1lYXN1cmVtZW50IHJlcG9ydHMgb24gdGhpcyBsY2hhbiAqLworCXN0cnVjdCBnc21fbWVhc19yZXAgbWVhc19yZXBbNl07CisJaW50IG1lYXNfcmVwX2lkeDsKKworCS8qIHRhYmxlIG9mIG5laWdoYm9yIGNlbGwgbWVhc3VyZW1lbnRzICovCisJc3RydWN0IG5laWdoX21lYXNfcHJvYyBuZWlnaF9tZWFzW01BWF9ORUlHSF9NRUFTXTsKKworCXN0cnVjdCB7CisJCXVfaW50MzJfdCBib3VuZF9pcDsKKwkJdV9pbnQzMl90IGNvbm5lY3RfaXA7CisJCXVfaW50MTZfdCBib3VuZF9wb3J0OworCQl1X2ludDE2X3QgY29ubmVjdF9wb3J0OworCQl1X2ludDE2X3QgY29ubl9pZDsKKwkJdV9pbnQ4X3QgcnRwX3BheWxvYWQyOworCQl1X2ludDhfdCBzcGVlY2hfbW9kZTsKKwkJc3RydWN0IHJ0cF9zb2NrZXQgKnJ0cF9zb2NrZXQ7CisJfSBhYmlzX2lwOworCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gY29ubjsKK307CisKK3N0cnVjdCBnc21fZTFfc3Vic2xvdCB7CisJLyogTnVtYmVyIG9mIEUxIGxpbmsgKi8KKwl1X2ludDhfdAllMV9ucjsKKwkvKiBOdW1iZXIgb2YgRTEgVFMgaW5zaWRlIEUxIGxpbmsgKi8KKwl1X2ludDhfdAllMV90czsKKwkvKiBTdWItc2xvdCB3aXRoaW4gdGhlIEUxIFRTLCAweGZmIGlmIGZ1bGwgVFMgKi8KKwl1X2ludDhfdAllMV90c19zczsKK307CisKKyNkZWZpbmUgQlRTX1RSWF9GX0FDVElWQVRFRAkweDAwMDEKKy8qIE9uZSBUaW1lc2xvdCBpbiBhIFRSWCAqLworc3RydWN0IGdzbV9idHNfdHJ4X3RzIHsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwkvKiBudW1iZXIgb2YgdGhpcyB0aW1lc2xvdCBhdCB0aGUgVFJYICovCisJdV9pbnQ4X3QgbnI7CisKKwllbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuOworCisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJc3RydWN0IHRsdl9wYXJzZWQgbm1fYXR0cjsKKwl1X2ludDhfdCBubV9jaGFuX2NvbWI7CisKKwkvKiBUbyB3aGljaCBFMSBzdWJzbG90IGFyZSB3ZSBjb25uZWN0ZWQgKi8KKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgZTFfbGluazsKKworCXN0cnVjdCBnc21fbGNoYW4gbGNoYW5bVFNfTUFYX0xDSEFOXTsKK307CisKKy8qIE9uZSBUUlggaW4gYSBCVFMgKi8KK3N0cnVjdCBnc21fYnRzX3RyeCB7CisJLyogbGlzdCBoZWFkZXIgaW4gYnRzLT50cnhfbGlzdCAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCS8qIG51bWJlciBvZiB0aGlzIFRSWCBpbiB0aGUgQlRTICovCisJdV9pbnQ4X3QgbnI7CisJLyogaG93IGRvIHdlIHRhbGsgUlNMIHdpdGggdGhpcyBUUlg/ICovCisJc3RydWN0IGdzbV9lMV9zdWJzbG90IHJzbF9lMV9saW5rOworCXVfaW50OF90IHJzbF90ZWk7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqcnNsX2xpbms7CisKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCXN0cnVjdCB0bHZfcGFyc2VkIG5tX2F0dHI7CisJc3RydWN0IHsKKwkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwl9IGJiX3RyYW5zYzsKKworCXVfaW50MTZfdCBhcmZjbjsKKwlpbnQgbm9taW5hbF9wb3dlcjsJCS8qIGluIGRCbSAqLworCXVuc2lnbmVkIGludCBtYXhfcG93ZXJfcmVkOwkvKiBpbiBhY3R1YWwgZEIgKi8KKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCX0gYmJzaWc7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJCQl9IHBhOworCQl9IGJzMTE7CisJfTsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgdHNbVFJYX05SX1RTXTsKK307CisKK2VudW0gZ3NtX2J0c190eXBlIHsKKwlHU01fQlRTX1RZUEVfVU5LTk9XTiwKKwlHU01fQlRTX1RZUEVfQlMxMSwKKwlHU01fQlRTX1RZUEVfTkFOT0JUUywKK307CisKK3N0cnVjdCBnc21fYnRzX21vZGVsIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJZW51bSBnc21fYnRzX3R5cGUgdHlwZTsKKwljb25zdCBjaGFyICpuYW1lOworCisJc3RydWN0IHRsdl9kZWZpbml0aW9uIG5tX2F0dF90bHZkZWY7Cit9OworCisvKioKKyAqIEEgcGVuZGluZyBwYWdpbmcgcmVxdWVzdCAKKyAqLworc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCB7CisJLyogbGlzdF9oZWFkIGZvciBsaXN0IG9mIGFsbCBwYWdpbmcgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKwkvKiB0aGUgc3Vic2NyaWJlciB3aGljaCB3ZSdyZSBwYWdpbmcuIExhdGVyIGdzbV9wYWdpbmdfcmVxdWVzdAorCSAqIHNob3VsZCBwcm9iYWJseSBiZWNvbWUgYSBwYXJ0IG9mIHRoZSBnc21fc3Vic2NyaWJlciBzdHJ1Y3Q/ICovCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJLyogYmFjay1wb2ludGVyIHRvIHRoZSBCVFMgb24gd2hpY2ggd2UgYXJlIHBhZ2luZyAqLworCXN0cnVjdCBnc21fYnRzICpidHM7CisJLyogd2hhdCBraW5kIG9mIGNoYW5uZWwgdHlwZSBkbyB3ZSBhc2sgdGhlIE1TIHRvIGVzdGFibGlzaCAqLworCWludCBjaGFuX3R5cGU7CisKKwkvKiBUaW1lciAzMTEzOiBob3cgbG9uZyBkbyB3ZSB0cnkgdG8gcGFnZT8gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBUMzExMzsKKworCS8qIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBpbiBjYXNlIHBhZ2luZyBjb21wbGV0ZXMgKi8KKwlnc21fY2JmbiAqY2JmbjsKKwl2b2lkICpjYmZuX3BhcmFtOworfTsKKworLyoKKyAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHBhZ2luZyBzdGF0dXMgb2Ygb25lIEJUUy4gSXQKKyAqIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHBlbmRpbmcgcmVxdWVzdHMsIGEgYmFjayBwb2ludGVyCisgKiB0byB0aGUgZ3NtX2J0cywgYSB0aW1lciBhbmQgc29tZSBtb3JlIHN0YXRlLgorICovCitzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgeworCS8qIHBlbmRpbmcgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBwZW5kaW5nX3JlcXVlc3RzOworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKmxhc3RfcmVxdWVzdDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJc3RydWN0IHRpbWVyX2xpc3Qgd29ya190aW1lcjsKKworCS8qIGxvYWQgKi8KKwl1X2ludDE2X3QgYXZhaWxhYmxlX3Nsb3RzOworfTsKKworc3RydWN0IGdzbV9lbnZhYnRzZSB7CisJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKK307CisKK3N0cnVjdCBnc21fYnRzX2dwcnNfbnN2YyB7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpbnQgaWQ7CisJdV9pbnQxNl90IG5zdmNpOworCXVfaW50MTZfdCBsb2NhbF9wb3J0OworCXVfaW50MTZfdCByZW1vdGVfcG9ydDsKKwl1X2ludDMyX3QgcmVtb3RlX2lwOworCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7Cit9OworCisvKiBPbmUgQlRTICovCitzdHJ1Y3QgZ3NtX2J0cyB7CisJLyogbGlzdCBoZWFkZXIgaW4gbmV0LT5idHNfbGlzdCAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcms7CisJLyogbnVtYmVyIG9mIHRocyBCVFMgaW4gbmV0d29yayAqLworCXVfaW50OF90IG5yOworCS8qIENlbGwgSWRlbnRpdHkgKi8KKwl1X2ludDE2X3QgY2VsbF9pZGVudGl0eTsKKwkvKiBsb2NhdGlvbiBhcmVhIGNvZGUgb2YgdGhpcyBCVFMgKi8KKwl1X2ludDE2X3QgbG9jYXRpb25fYXJlYV9jb2RlOworCS8qIFRyYWluaW5nIFNlcXVlbmNlIENvZGUgKi8KKwl1X2ludDhfdCB0c2M7CisJLyogQmFzZSBTdGF0aW9uIElkZW50aWZpY2F0aW9uIENvZGUgKEJTSUMpICovCisJdV9pbnQ4X3QgYnNpYzsKKwkvKiB0eXBlIG9mIEJUUyAqLworCWVudW0gZ3NtX2J0c190eXBlIHR5cGU7CisJc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsOworCWVudW0gZ3NtX2JhbmQgYmFuZDsKKwkvKiBzaG91bGQgdGhlIGNoYW5uZWwgYWxsb2NhdG9yIGFsbG9jYXRlIGNoYW5uZWxzIGZyb20gaGlnaCBUUlggdG8gVFJYMCwKKwkgKiByYXRoZXIgdGhhbiBzdGFydGluZyBmcm9tIFRSWDAgYW5kIGdvIHVwd2FyZHM/ICovCisJaW50IGNoYW5fYWxsb2NfcmV2ZXJzZTsKKwkvKiBtYXhpbXVtIFR4IHBvd2VyIHRoYXQgdGhlIE1TIGlzIHBlcm1pdHRlZCB0byB1c2UgaW4gdGhpcyBjZWxsICovCisJaW50IG1zX21heF9wb3dlcjsKKworCS8qIGhvdyBkbyB3ZSB0YWxrIE9NTCB3aXRoIHRoaXMgVFJYPyAqLworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCBvbWxfZTFfbGluazsKKwl1X2ludDhfdCBvbWxfdGVpOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKm9tbF9saW5rOworCisJLyogQWJpcyBuZXR3b3JrIG1hbmFnZW1lbnQgTyZNIGhhbmRsZSAqLworCXN0cnVjdCBhYmlzX25tX2ggKm5taDsKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCXN0cnVjdCB0bHZfcGFyc2VkIG5tX2F0dHI7CisKKwkvKiBudW1iZXIgb2YgdGhpcyBCVFMgb24gZ2l2ZW4gRTEgbGluayAqLworCXVfaW50OF90IGJ0c19ucjsKKworCS8qIHBhZ2luZyBzdGF0ZSBhbmQgY29udHJvbCAqLworCXN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSBwYWdpbmc7CisKKwkvKiBDQ0NIIGlzIG9uIEMwICovCisJc3RydWN0IGdzbV9idHNfdHJ4ICpjMDsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJfSBzaXRlX21ncjsKKworCS8qIHBhcmFtZXRlcnMgZnJvbSB3aGljaCB3ZSBidWlsZCBTWVNURU0gSU5GT1JNQVRJT04gKi8KKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZ3NtNDhfcmFjaF9jb250cm9sIHJhY2hfY29udHJvbDsKKwkJdV9pbnQ4X3QgbmNjX3Blcm1pdHRlZDsKKwkJc3RydWN0IGdzbTQ4X2NlbGxfc2VsX3BhciBjZWxsX3NlbF9wYXI7CisJCXN0cnVjdCBnc200OF9jZWxsX29wdGlvbnMgY2VsbF9vcHRpb25zOworCQlzdHJ1Y3QgZ3NtNDhfY29udHJvbF9jaGFubmVsX2Rlc2NyIGNoYW5fZGVzYzsKKwkJc3RydWN0IGJpdHZlYyBuZWlnaF9saXN0OworCQlzdHJ1Y3QgYml0dmVjIGNlbGxfYWxsb2M7CisJCXN0cnVjdCB7CisJCQkvKiBiaXRtYXNrIGxhcmdlIGVub3VnaCBmb3IgYWxsIHBvc3NpYmxlIEFSRkNOJ3MgKi8KKwkJCXVfaW50OF90IG5laWdoX2xpc3RbMTAyNC84XTsKKwkJCXVfaW50OF90IGNlbGxfYWxsb2NbMTAyNC84XTsKKwkJfSBkYXRhOworCX0gc2lfY29tbW9uOworCisJLyogaXAuYWNjZXNzcyBVbml0IElEJ3MgaGF2ZSBTaXRlL0JUUy9UUlggbGF5b3V0ICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdV9pbnQxNl90IHNpdGVfaWQ7CisJCQl1X2ludDE2X3QgYnRzX2lkOworCQkJdV9pbnQzMl90IGZsYWdzOworCQl9IGlwX2FjY2VzczsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCX0gY2NsazsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCX0gcmFjazsKKwkJCXN0cnVjdCBnc21fZW52YWJ0c2UgZW52YWJ0c2VbNF07CisJCX0gYnMxMTsKKwl9OworCisJLyogTm90IGVudGlyZWx5IHN1cmUgaG93IGlwLmFjY2VzcyBzcGVjaWZpYyB0aGlzIGlzICovCisJc3RydWN0IHsKKwkJaW50IGVuYWJsZWQ7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCQkJdV9pbnQxNl90IG5zZWk7CisJCX0gbnNlOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCXVfaW50MTZfdCBidmNpOworCQl9IGNlbGw7CisJCXN0cnVjdCBnc21fYnRzX2dwcnNfbnN2YyBuc3ZjWzJdOworCQl1X2ludDhfdCByYWM7CisJfSBncHJzOworCQorCS8qIHRyYW5zY2VpdmVycyAqLworCWludCBudW1fdHJ4OworCXN0cnVjdCBsbGlzdF9oZWFkIHRyeF9saXN0OworfTsKKworLyogU29tZSBzdGF0aXN0aWNzIG9mIG91ciBuZXR3b3JrICovCitzdHJ1Y3QgZ3NtbmV0X3N0YXRzIHsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqdG90YWw7CisJCXN0cnVjdCBjb3VudGVyICpub19jaGFubmVsOworCX0gY2hyZXE7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKmF0dGVtcHRlZDsKKwkJc3RydWN0IGNvdW50ZXIgKm5vX2NoYW5uZWw7CS8qIG5vIGNoYW5uZWwgYXZhaWxhYmxlICovCisJCXN0cnVjdCBjb3VudGVyICp0aW1lb3V0OwkJLyogVDMxMDMgdGltZW91dCAqLworCQlzdHJ1Y3QgY291bnRlciAqY29tcGxldGVkOwkvKiBITyBDT01QTCByZWNlaXZlZCAqLworCQlzdHJ1Y3QgY291bnRlciAqZmFpbGVkOwkJLyogSE8gRkFJTCByZWNlaXZlZCAqLworCX0gaGFuZG92ZXI7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKmF0dGFjaDsKKwkJc3RydWN0IGNvdW50ZXIgKm5vcm1hbDsKKwkJc3RydWN0IGNvdW50ZXIgKnBlcmlvZGljOworCQlzdHJ1Y3QgY291bnRlciAqZGV0YWNoOworCX0gbG9jX3VwZF90eXBlOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICpyZWplY3Q7CisJCXN0cnVjdCBjb3VudGVyICphY2NlcHQ7CisJfSBsb2NfdXBkX3Jlc3A7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKmF0dGVtcHRlZDsKKwkJc3RydWN0IGNvdW50ZXIgKmRldGFjaGVkOworCQlzdHJ1Y3QgY291bnRlciAqY29tcGxldGVkOworCQlzdHJ1Y3QgY291bnRlciAqZXhwaXJlZDsKKwl9IHBhZ2luZzsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqc3VibWl0dGVkOyAvKiBNTyBTTVMgc3VibWlzc2lvbnMgKi8KKwkJc3RydWN0IGNvdW50ZXIgKm5vX3JlY2VpdmVyOworCQlzdHJ1Y3QgY291bnRlciAqZGVsaXZlcmVkOyAvKiBNVCBTTVMgZGVsaXZlcmllcyAqLworCQlzdHJ1Y3QgY291bnRlciAqcnBfZXJyX21lbTsKKwkJc3RydWN0IGNvdW50ZXIgKnJwX2Vycl9vdGhlcjsKKwl9IHNtczsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqZGlhbGxlZDsJLyogdG90YWwgbnVtYmVyIG9mIGRpYWxsZWQgY2FsbHMgKi8KKwkJc3RydWN0IGNvdW50ZXIgKmFsZXJ0ZWQ7CS8qIHdlIGFsZXJ0ZWQgdGhlIG90aGVyIGVuZCAqLworCQlzdHJ1Y3QgY291bnRlciAqY29ubmVjdGVkOy8qIGhvdyBtYW55IGNhbGxzIHdlcmUgYWNjZXB0ZWQgKi8KKwl9IGNhbGw7Cit9OworCitlbnVtIGdzbV9hdXRoX3BvbGljeSB7CisJR1NNX0FVVEhfUE9MSUNZX0NMT1NFRCwgLyogb25seSBzdWJzY3JpYmVycyBhdXRob3JpemVkIGluIERCICovCisJR1NNX0FVVEhfUE9MSUNZX0FDQ0VQVF9BTEwsIC8qIGFjY2VwdCBldmVyeW9uZSwgZXZlbiBpZiBub3QgYXV0aG9yaXplZCBpbiBEQiAqLworCUdTTV9BVVRIX1BPTElDWV9UT0tFTiwgLyogYWNjZXB0IGZpcnN0LCBzZW5kIHRva2VuIHBlciBzbXMsIHRoZW4gcmV2b2tlIGF1dGhvcml6YXRpb24gKi8KK307CisKKyNkZWZpbmUgR1NNX1QzMTAxX0RFRkFVTFQgMTAKKyNkZWZpbmUgR1NNX1QzMTEzX0RFRkFVTFQgNjAKKworc3RydWN0IGdzbV9uZXR3b3JrIHsKKwkvKiBnbG9iYWwgcGFyYW1ldGVycyAqLworCXVfaW50MTZfdCBjb3VudHJ5X2NvZGU7CisJdV9pbnQxNl90IG5ldHdvcmtfY29kZTsKKwljaGFyICpuYW1lX2xvbmc7CisJY2hhciAqbmFtZV9zaG9ydDsKKwllbnVtIGdzbV9hdXRoX3BvbGljeSBhdXRoX3BvbGljeTsKKwllbnVtIGdzbTQ4X3JlamVjdF92YWx1ZSByZWplY3RfY2F1c2U7CisJaW50IGE1X2VuY3J5cHRpb247CisJaW50IG5lY2k7CisJaW50IHNlbmRfbW1faW5mbzsKKwlzdHJ1Y3QgeworCQlpbnQgYWN0aXZlOworCQkvKiBXaW5kb3cgUlhMRVYgYXZlcmFnaW5nICovCisJCXVuc2lnbmVkIGludCB3aW5fcnhsZXZfYXZnOwkvKiBudW1iZXIgb2YgU0FDQ0ggZnJhbWVzICovCisJCS8qIFdpbmRvdyBSWFFVQUwgYXZlcmFnaW5nICovCisJCXVuc2lnbmVkIGludCB3aW5fcnhxdWFsX2F2ZzsJLyogbnVtYmVyIG9mIFNBQ0NIIGZyYW1lcyAqLworCQkvKiBXaW5kb3cgUlhMRVYgbmVpZ2hib3VyaW5nIGNlbGxzIGF2ZXJhZ2luZyAqLworCQl1bnNpZ25lZCBpbnQgd2luX3J4bGV2X2F2Z19uZWlnaDsgLyogbnVtYmVyIG9mIFNBQ0NIIGZyYW1lcyAqLworCisJCS8qIGhvdyBvZnRlbiBzaG91bGQgd2UgY2hlY2sgZm9yIHBvd2VyIGJ1ZGdldCBITyAqLworCQl1bnNpZ25lZCBpbnQgcHdyX2ludGVydmFsOwkvKiBTQUNDSCBmcmFtZXMgKi8KKwkJLyogaG93IG11Y2ggYmV0dGVyIGRvZXMgYSBuZWlnaGJvciBjZWxsIGhhdmUgdG8gYmUgPyAqLworCQl1bnNpZ25lZCBpbnQgcHdyX2h5c3RlcmVzaXM7CS8qIGRCbSAqLworCQkvKiBtYXhpbXVtIGRpc3RhY25lIGJlZm9yZSB3ZSB0cnkgYSBoYW5kb3ZlciAqLworCQl1bnNpZ25lZCBpbnQgbWF4X2Rpc3RhbmNlOwkvKiBUQSB2YWx1ZXMgKi8KKwl9IGhhbmRvdmVyOworCisJc3RydWN0IGdzbW5ldF9zdGF0cyBzdGF0czsKKworCS8qIGxheWVyIDQgKi8KKwlpbnQgKCptbmNjX3JlY3YpIChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG1zZ190eXBlLCB2b2lkICphcmcpOworCXN0cnVjdCBsbGlzdF9oZWFkIHVwcXVldWU7CisJc3RydWN0IGxsaXN0X2hlYWQgdHJhbnNfbGlzdDsKKworCXVuc2lnbmVkIGludCBudW1fYnRzOworCXN0cnVjdCBsbGlzdF9oZWFkIGJ0c19saXN0OworCisJLyogdGltZXIgdmFsdWVzICovCisJaW50IFQzMTAxOworCWludCBUMzEwMzsKKwlpbnQgVDMxMDU7CisJaW50IFQzMTA3OworCWludCBUMzEwOTsKKwlpbnQgVDMxMTE7CisJaW50IFQzMTEzOworCWludCBUMzExNTsKKwlpbnQgVDMxMTc7CisJaW50IFQzMTE5OworCWludCBUMzE0MTsKKworCS8qIFJhZGlvIFJlc291cmNlIExvY2F0aW9uIFByb3RvY29sIChUUyAwNC4zMSkgKi8KKwlzdHJ1Y3QgeworCQllbnVtIHJybHBfbW9kZSBtb2RlOworCX0gcnJscDsKK307CisKKyNkZWZpbmUgU01TX0hEUl9TSVpFCTEyOAorI2RlZmluZSBTTVNfVEVYVF9TSVpFCTI1Ngorc3RydWN0IGdzbV9zbXMgeworCXVuc2lnbmVkIGxvbmcgbG9uZyBpZDsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnNlbmRlcjsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnJlY2VpdmVyOworCisJdW5zaWduZWQgbG9uZyB2YWxpZGl0eV9taW51dGVzOworCXVfaW50OF90IHJlcGx5X3BhdGhfcmVxOworCXVfaW50OF90IHN0YXR1c19yZXBfcmVxOworCXVfaW50OF90IHVkX2hkcl9pbmQ7CisJdV9pbnQ4X3QgcHJvdG9jb2xfaWQ7CisJdV9pbnQ4X3QgZGF0YV9jb2Rpbmdfc2NoZW1lOworCXVfaW50OF90IG1zZ19yZWY7CisJY2hhciBkZXN0X2FkZHJbMjArMV07CS8qIERBIExWIGlzIDEyIGJ5dGVzIG1heCwgaS5lLiAxMCBieXRlcworCQkJCSAqIEJDRCA9PSAyMCBieXRlcyBzdHJpbmcgKi8KKwl1X2ludDhfdCB1c2VyX2RhdGFfbGVuOworCXVfaW50OF90IHVzZXJfZGF0YVtTTVNfVEVYVF9TSVpFXTsKKworCWNoYXIgdGV4dFtTTVNfVEVYVF9TSVpFXTsKK307CisKKworc3RydWN0IGdzbV9uZXR3b3JrICpnc21fbmV0d29ya19pbml0KHVfaW50MTZfdCBjb3VudHJ5X2NvZGUsIHVfaW50MTZfdCBuZXR3b3JrX2NvZGUsCisJCQkJICAgICBpbnQgKCptbmNjX3JlY3YpKHN0cnVjdCBnc21fbmV0d29yayAqLCBpbnQsIHZvaWQgKikpOworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfYWxsb2Moc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGVudW0gZ3NtX2J0c190eXBlIHR5cGUsCisJCQkgICAgICB1X2ludDhfdCB0c2MsIHVfaW50OF90IGJzaWMpOworc3RydWN0IGdzbV9idHNfdHJ4ICpnc21fYnRzX3RyeF9hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBnc21fc2V0X2J0c190eXBlKHN0cnVjdCBnc21fYnRzICpidHMsIGVudW0gZ3NtX2J0c190eXBlIHR5cGUpOworCitzdHJ1Y3QgZ3NtX2J0cyAqZ3NtX2J0c19udW0oc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBudW0pOworCisvKiBHZXQgcmVmZXJlbmNlIHRvIGEgbmVpZ2hib3IgY2VsbCBvbiBhIGdpdmVuIEJDQ0ggQVJGQ04gKi8KK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX25laWdoYm9yKGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJIHVfaW50MTZfdCBhcmZjbiwgdV9pbnQ4X3QgYnNpYyk7CisKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfbnVtKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBudW0pOworCitjb25zdCBjaGFyICpnc21fcGNoYW5fbmFtZShlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIGMpOworZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBnc21fcGNoYW5fcGFyc2UoY29uc3QgY2hhciAqbmFtZSk7Citjb25zdCBjaGFyICpnc21fbGNoYW50X25hbWUoZW51bSBnc21fY2hhbl90IGMpOworY29uc3QgY2hhciAqZ3NtX2NocmVxX25hbWUoZW51bSBnc21fY2hyZXFfcmVhc29uX3QgYyk7CitjaGFyICpnc21fdHJ4X25hbWUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworY2hhciAqZ3NtX3RzX25hbWUoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyk7CitjaGFyICpnc21fbGNoYW5fbmFtZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7Citjb25zdCBjaGFyICpnc21fbGNoYW5zX25hbWUoZW51bSBnc21fbGNoYW5fc3RhdGUgcyk7CisKK2VudW0gZ3NtX2UxX2V2ZW50IHsKKwlFVlRfRTFfTk9ORSwKKwlFVlRfRTFfVEVJX1VQLAorCUVWVF9FMV9URUlfRE4sCit9OworCit2b2lkIHNldF90c19lMWxpbmsoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywgdV9pbnQ4X3QgZTFfbnIsCisJCSAgIHVfaW50OF90IGUxX3RzLCB1X2ludDhfdCBlMV90c19zcyk7CitlbnVtIGdzbV9idHNfdHlwZSBwYXJzZV9idHN0eXBlKGNvbnN0IGNoYXIgKmFyZyk7Citjb25zdCBjaGFyICpidHN0eXBlMnN0cihlbnVtIGdzbV9idHNfdHlwZSB0eXBlKTsKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfYnlfbnIoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG5yKTsKK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX2J5X2xhYyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdW5zaWduZWQgaW50IGxhYywKKwkJCQlzdHJ1Y3QgZ3NtX2J0cyAqc3RhcnRfYnRzKTsKKworZXh0ZXJuIHZvaWQgKnRhbGxfYnNjX2N0eDsKK2V4dGVybiBpbnQgaXBhY2NfcnRwX2RpcmVjdDsKKworc3RhdGljIGlubGluZSBpbnQgaXNfaXBhY2Nlc3NfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3NpZW1lbnNfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitlbnVtIGdzbV9hdXRoX3BvbGljeSBnc21fYXV0aF9wb2xpY3lfcGFyc2UoY29uc3QgY2hhciAqYXJnKTsKK2NvbnN0IGNoYXIgKmdzbV9hdXRoX3BvbGljeV9uYW1lKGVudW0gZ3NtX2F1dGhfcG9saWN5IHBvbGljeSk7CisKK2VudW0gcnJscF9tb2RlIHJybHBfbW9kZV9wYXJzZShjb25zdCBjaGFyICphcmcpOworY29uc3QgY2hhciAqcnJscF9tb2RlX25hbWUoZW51bSBycmxwX21vZGUgbW9kZSk7CisKK3ZvaWQgZ3NtX3RyeF9sb2NrX3JmKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCBpbnQgbG9ja2VkKTsKKworLyogQSBwYXJzZWQgR1BSUyByb3V0aW5nIGFyZWEgKi8KK3N0cnVjdCBncHJzX3JhX2lkIHsKKwl1X2ludDE2X3QJbW5jOworCXVfaW50MTZfdAltY2M7CisJdV9pbnQxNl90CWxhYzsKKwl1X2ludDhfdAlyYWM7Cit9OworCitpbnQgZ3NtNDhfcmFfaWRfYnlfYnRzKHVfaW50OF90ICpidWYsIHN0cnVjdCBnc21fYnRzICpidHMpOwordm9pZCBncHJzX3JhX2lkX2J5X2J0cyhzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCwgc3RydWN0IGdzbV9idHMgKmJ0cyk7CitzdHJ1Y3QgZ3NtX21lYXNfcmVwICpsY2hhbl9uZXh0X21lYXNfcmVwKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKKworaW50IGdzbV9idHNfbW9kZWxfcmVnaXN0ZXIoc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fc3Vic2NyaWJlci5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjUzOTk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaApAQCAtMCwwICsxLDk1IEBACisjaWZuZGVmIF9HU01fU1VCU0NSX0gKKyNkZWZpbmUgX0dTTV9TVUJTQ1JfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAiZ3NtX2RhdGEuaCIKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKworI2RlZmluZSBHU01fSU1FSV9MRU5HVEggMTcKKyNkZWZpbmUgR1NNX0lNU0lfTEVOR1RIIDE3CisjZGVmaW5lIEdTTV9OQU1FX0xFTkdUSCAxMjgKKworI2RlZmluZSBHU01fRVhURU5TSU9OX0xFTkdUSCAxNSAvKiBNU0lTRE4gY2FuIG9ubHkgYmUgMTUgZGlnaXRzIGxlbmd0aCAqLworI2RlZmluZSBHU01fTUlOX0VYVEVOIDIwMDAwCisjZGVmaW5lIEdTTV9NQVhfRVhURU4gNDk5OTkKKworLyogcmVzZXJ2ZWQgYWNjb3JkaW5nIHRvIEdTTSAwMy4wMyDCpyAyLjQgKi8KKyNkZWZpbmUgR1NNX1JFU0VSVkVEX1RNU0kgICAweEZGRkZGRkZGCisKKworI2RlZmluZSBHU01fU1VCU0NSSUJFUl9GSVJTVF9DT05UQUNUCTB4MDAwMDAwMDEKKyNkZWZpbmUgdG1zaV9mcm9tX3N0cmluZyhzdHIpIHN0cnRvdWwoc3RyLCBOVUxMLCAxMCkKKworc3RydWN0IGdzbV9lcXVpcG1lbnQgeworCWxvbmcgbG9uZyB1bnNpZ25lZCBpbnQgaWQ7CisJY2hhciBpbWVpW0dTTV9JTUVJX0xFTkdUSF07CisJY2hhciBuYW1lW0dTTV9OQU1FX0xFTkdUSF07CisKKwlzdHJ1Y3QgZ3NtNDhfY2xhc3NtYXJrMSBjbGFzc21hcmsxOworCXVfaW50OF90IGNsYXNzbWFyazJfbGVuOworCXVfaW50OF90IGNsYXNzbWFyazJbM107CisJdV9pbnQ4X3QgY2xhc3NtYXJrM19sZW47CisJdV9pbnQ4X3QgY2xhc3NtYXJrM1sxNF07Cit9OworCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgeworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0OworCWxvbmcgbG9uZyB1bnNpZ25lZCBpbnQgaWQ7CisJY2hhciBpbXNpW0dTTV9JTVNJX0xFTkdUSF07CisJdV9pbnQzMl90IHRtc2k7CisJdV9pbnQxNl90IGxhYzsKKwljaGFyIG5hbWVbR1NNX05BTUVfTEVOR1RIXTsKKwljaGFyIGV4dGVuc2lvbltHU01fRVhURU5TSU9OX0xFTkdUSF07CisJaW50IGF1dGhvcml6ZWQ7CisKKwkvKiBUZW1wb3JhcnkgZmllbGQgd2hpY2ggaXMgbm90IHN0b3JlZCBpbiB0aGUgREIvSExSICovCisJdV9pbnQzMl90IGZsYWdzOworCisJLyogRXZlcnkgdXNlciBjYW4gb25seSBoYXZlIG9uZSBlcXVpcG1lbnQgaW4gdXNlIGF0IGFueSBnaXZlbgorCSAqIHBvaW50IGluIHRpbWUgKi8KKwlzdHJ1Y3QgZ3NtX2VxdWlwbWVudCBlcXVpcG1lbnQ7CisKKwkvKiBmb3IgaW50ZXJuYWwgbWFuYWdlbWVudCAqLworCWludCB1c2VfY291bnQ7CisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisKKwkvKiBwZW5kaW5nIHJlcXVlc3RzICovCisJaW50IGluX2NhbGxiYWNrOworCXN0cnVjdCBsbGlzdF9oZWFkIHJlcXVlc3RzOworfTsKKworZW51bSBnc21fc3Vic2NyaWJlcl9maWVsZCB7CisJR1NNX1NVQlNDUklCRVJfSU1TSSwKKwlHU01fU1VCU0NSSUJFUl9UTVNJLAorCUdTTV9TVUJTQ1JJQkVSX0VYVEVOU0lPTiwKKwlHU01fU1VCU0NSSUJFUl9JRCwKK307CisKK2VudW0gZ3NtX3N1YnNjcmliZXJfdXBkYXRlX3JlYXNvbiB7CisJR1NNX1NVQlNDUklCRVJfVVBEQVRFX0FUVEFDSEVELAorCUdTTV9TVUJTQ1JJQkVSX1VQREFURV9ERVRBQ0hFRCwKKwlHU01fU1VCU0NSSUJFUl9VUERBVEVfRVFVSVBNRU5ULAorfTsKKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX3B1dChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfdG1zaShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICB1X2ludDMyX3QgdG1zaSk7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfaW1zaShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICBjb25zdCBjaGFyICppbXNpKTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV9leHRlbnNpb24oc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpleHQpOworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X2lkKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQl1bnNpZ25lZCBsb25nIGxvbmcgaWQpOworaW50IHN1YnNjcl91cGRhdGUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgcmVhc29uKTsKK3ZvaWQgc3Vic2NyX3B1dF9jaGFubmVsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK3ZvaWQgc3Vic2NyX2dldF9jaGFubmVsKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpwYXJhbSk7CisKK2NoYXIgKnN1YnNjcl9uYW1lKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKKworLyogaW50ZXJuYWwgKi8KK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2FsbG9jKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBsbGlzdF9oZWFkIGFjdGl2ZV9zdWJzY3JpYmVyczsKKworI2VuZGlmIC8qIF9HU01fU1VCU0NSX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2hhbmRvdmVyLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9oYW5kb3Zlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYjFiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9oYW5kb3Zlci5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfSEFORE9WRVJfSAorI2RlZmluZSBfSEFORE9WRVJfSAorLyogSGFuZCBvdmVyIHRoZSBzcGVjaWZpZWQgbG9naWNhbCBjaGFubmVsIHRvIHRoZSBzcGVjaWZpZWQgbmV3IEJUUy4KKyAqIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBhY3R1YWwgaGFuZG92ZXIgYWxnb3JpdGhtLAorICogYWZ0ZXIgaXQgaGFzIGRlY2lkZWQgaXQgd2FudHMgdG8gaW5pdGlhdGUgSE8gdG8gYSBzcGVjaWZpYyBCVFMgKi8KK2ludCBic2NfaGFuZG92ZXJfc3RhcnQoc3RydWN0IGdzbV9sY2hhbiAqb2xkX2xjaGFuLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworI2VuZGlmIC8qIF9IQU5ET1ZFUl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9pcGFjY2Vzcy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvaXBhY2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjI0OGFhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvaXBhY2Nlc3MuaApAQCAtMCwwICsxLDEwNyBAQAorI2lmbmRlZiBfSVBBQ0NFU1NfSAorI2RlZmluZSBfSVBBQ0NFU1NfSAorCisjaW5jbHVkZSAiZTFfaW5wdXQuaCIKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKworI2RlZmluZSBJUEFfVENQX1BPUlRfT01MCTMwMDIKKyNkZWZpbmUgSVBBX1RDUF9QT1JUX1JTTAkzMDAzCisKK3N0cnVjdCBpcGFjY2Vzc19oZWFkIHsKKwl1X2ludDE2X3QgbGVuOwkvKiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwl1X2ludDhfdCBwcm90bzsKKwl1X2ludDhfdCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK2VudW0gaXBhY2Nlc3NfcHJvdG8geworCUlQQUNfUFJPVE9fUlNMCQk9IDB4MDAsCisJSVBBQ19QUk9UT19JUEFDQ0VTUwk9IDB4ZmUsCisJSVBBQ19QUk9UT19TQ0NQCQk9IDB4ZmQsCisJSVBBQ19QUk9UT19PTUwJCT0gMHhmZiwKK307CisKK2VudW0gaXBhY2Nlc3NfbXNndHlwZSB7CisJSVBBQ19NU0dUX1BJTkcJCT0gMHgwMCwKKwlJUEFDX01TR1RfUE9ORwkJPSAweDAxLAorCUlQQUNfTVNHVF9JRF9HRVQJPSAweDA0LAorCUlQQUNfTVNHVF9JRF9SRVNQCT0gMHgwNSwKKwlJUEFDX01TR1RfSURfQUNLCT0gMHgwNiwKK307CisKK2VudW0gaXBhY2Nlc3NfaWRfdGFncyB7CisJSVBBQ19JRFRBR19TRVJOUgkJPSAweDAwLAorCUlQQUNfSURUQUdfVU5JVE5BTUUJCT0gMHgwMSwKKwlJUEFDX0lEVEFHX0xPQ0FUSU9OMQkJPSAweDAyLAorCUlQQUNfSURUQUdfTE9DQVRJT04yCQk9IDB4MDMsCisJSVBBQ19JRFRBR19FUVVJUFZFUlMJCT0gMHgwNCwKKwlJUEFDX0lEVEFHX1NXVkVSU0lPTgkJPSAweDA1LAorCUlQQUNfSURUQUdfSVBBRERSCQk9IDB4MDYsCisJSVBBQ19JRFRBR19NQUNBRERSCQk9IDB4MDcsCisJSVBBQ19JRFRBR19VTklUCQkJPSAweDA4LAorfTsKKworaW50IGlwYWNjZXNzX2Nvbm5lY3Qoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2EpOworCisvKgorICogbWV0aG9kcyBmb3IgcGFyc2luZyBhbmQgc2VuZGluZyBhIG1lc3NhZ2UKKyAqLworaW50IGlwYWNjZXNzX3Jjdm1zZ19iYXNlKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBic2NfZmQgKmJmZCk7CitzdHJ1Y3QgbXNnYiAqaXBhY2Nlc3NfcmVhZF9tc2coc3RydWN0IGJzY19mZCAqYmZkLCBpbnQgKmVycm9yKTsKK3ZvaWQgaXBhY2Nlc3NfcHJlcGVuZF9oZWFkZXIoc3RydWN0IG1zZ2IgKm1zZywgaW50IHByb3RvKTsKK2ludCBpcGFjY2Vzc19zZW5kX2lkX2FjayhpbnQgZmQpOworaW50IGlwYWNjZXNzX3NlbmRfaWRfcmVxKGludCBmZCk7CisKK2ludCBpcGFjY2Vzc19pZHRhZ19wYXJzZShzdHJ1Y3QgdGx2X3BhcnNlZCAqZGVjLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pOworCisKKy8qCisgKiBGaXJtd2FyZSBzcGVjaWZpYyBoZWFkZXIKKyAqLworc3RydWN0IHNkcF9maXJtd2FyZSB7CisJY2hhciBtYWdpY1s0XTsKKwljaGFyIG1vcmVfbWFnaWNbMl07CisJdV9pbnQxNl90IG1vcmVfbW9yZV9tYWdpYzsKKwl1X2ludDMyX3QgaGVhZGVyX2xlbmd0aDsKKwl1X2ludDMyX3QgZmlsZV9sZW5ndGg7CisJY2hhciBzd19wYXJ0WzIwXTsKKwljaGFyIHRleHQxWzY0XTsKKwljaGFyIHRpbWVbMTJdOworCWNoYXIgZGF0ZVsxNF07CisJY2hhciB0ZXh0MlsxMF07CisJY2hhciB2ZXJzaW9uWzIwXTsKKwl1X2ludDE2X3QgdGFibGVfb2Zmc2V0OworCS8qIHN0dWZmIGkgZG9uJ3Qga25vdyAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNkcF9oZWFkZXJfZW50cnkgeworCXVfaW50MTZfdCBzb21ldGhpbmcxOworCWNoYXIgdGV4dDFbNjRdOworCWNoYXIgdGltZVsxMl07CisJY2hhciBkYXRlWzE0XTsKKwljaGFyIHRleHQyWzEwXTsKKwljaGFyIHZlcnNpb25bMjBdOworCXVfaW50MzJfdCBsZW5ndGg7CisJdV9pbnQzMl90IGFkZHIxOworCXVfaW50MzJfdCBhZGRyMjsKKwl1X2ludDMyX3Qgc3RhcnQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2RwX2hlYWRlcl9pdGVtIHsKKwlzdHJ1Y3Qgc2RwX2hlYWRlcl9lbnRyeSBoZWFkZXJfZW50cnk7CisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisJb2ZmX3QgYWJzb2x1dGVfb2Zmc2V0OworfTsKKworc3RydWN0IHNkcF9oZWFkZXIgeworCXN0cnVjdCBzZHBfZmlybXdhcmUgZmlybXdhcmVfaW5mbzsKKworCS8qIGZvciBtb3JlX21hZ2ljIGEgbGlzdCBvZiBzZHBfaGVhZGVyX2VudHJ5X2xpc3QgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBoZWFkZXJfbGlzdDsKKworCS8qIHRoZSBlbnRyeSBvZiB0aGUgc2RwX2hlYWRlciAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworfTsKKworaW50IGlwYWNjZXNzX2FuYWx5emVfZmlsZShpbnQgZmQsIGNvbnN0IHVuc2lnbmVkIGludCBzdF9zaXplLCBjb25zdCB1bnNpZ25lZCBiYXNlX29mZnNldCwgc3RydWN0IGxsaXN0X2hlYWQgKmxpc3QpOworCisjZW5kaWYgLyogX0lQQUNDRVNTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21lYXNfcmVwLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZWFzX3JlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMmM4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZWFzX3JlcC5oCkBAIC0wLDAgKzEsODUgQEAKKyNpZm5kZWYgX01FQVNfUkVQX0gKKyNkZWZpbmUgX01FQVNfUkVQX0gKKworI2RlZmluZSBNUkNfRl9QUk9DRVNTRUQJMHgwMDAxCisKKy8qIGV4dHJhY3RlZCBmcm9tIGEgTDMgbWVhc3VyZW1lbnQgcmVwb3J0IElFICovCitzdHJ1Y3QgZ3NtX21lYXNfcmVwX2NlbGwgeworCXVfaW50OF90IHJ4bGV2OworCXVfaW50OF90IGJzaWM7CisJdV9pbnQ4X3QgbmVpZ2hfaWR4OworCXVfaW50MTZfdCBhcmZjbjsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9OworCisvKiBSWCBMZXZlbCBhbmQgUlggUXVhbGl0eSAqLworc3RydWN0IGdzbV9yeF9sZXZfcXVhbCB7CisJdV9pbnQ4X3QgcnhfbGV2OworCXVfaW50OF90IHJ4X3F1YWw7Cit9OworCisvKiB1bmlkaXJlY3Rpb25hbCBtZWFzdW1yZW1lbnQgcmVwb3J0ICovCitzdHJ1Y3QgZ3NtX21lYXNfcmVwX3VuaWRpciB7CisJc3RydWN0IGdzbV9yeF9sZXZfcXVhbCBmdWxsOworCXN0cnVjdCBnc21fcnhfbGV2X3F1YWwgc3ViOworfTsKKworI2RlZmluZSBNRUFTX1JFUF9GX1VMX0RUWAkweDAxCisjZGVmaW5lIE1FQVNfUkVQX0ZfRExfVkFMSUQJMHgwMgorI2RlZmluZSBNRUFTX1JFUF9GX0JBMQkJMHgwNAorI2RlZmluZSBNRUFTX1JFUF9GX0RMX0RUWAkweDA4CisjZGVmaW5lIE1FQVNfUkVQX0ZfTVNfVE8JMHgxMAorI2RlZmluZSBNRUFTX1JFUF9GX01TX0wxCTB4MjAKKyNkZWZpbmUgTUVBU19SRVBfRl9GUEMJCTB4NDAKKworLyogcGFyc2VkIHVwbGluayBhbmQgZG93bmxpbmsgbWVhc3VyZW1lbnQgcmVzdWx0ICovCitzdHJ1Y3QgZ3NtX21lYXNfcmVwIHsKKwkvKiBiYWNrLXBvaW50ZXIgdG8gdGhlIGxvZ2ljYWwgY2hhbm5lbCAqLworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCisJLyogbnVtYmVyIG9mIHRoZSBtZWFzdXJlbWVudCByZXBvcnQgKi8KKwl1X2ludDhfdCBucjsKKwkvKiBmbGFncywgc2VlIE1FQVNfUkVQX0ZfKiAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKworCS8qIHVwbGluayBhbmQgZG93bmxpbmsgcnhsZXYsIHJ4cXVhbDsgZnVsbCBhbmQgc3ViICovCisJc3RydWN0IGdzbV9tZWFzX3JlcF91bmlkaXIgdWw7CisJc3RydWN0IGdzbV9tZWFzX3JlcF91bmlkaXIgZGw7CisKKwl1X2ludDhfdCBic19wb3dlcjsKKwl1X2ludDhfdCBtc190aW1pbmdfb2Zmc2V0OworCXN0cnVjdCB7CisJCWludDhfdCBwd3I7CS8qIE1TIHBvd2VyIGluIGRCbSAqLworCQl1X2ludDhfdCB0YTsJLyogTVMgdGltaW5nIGFkdmFuY2UgKi8KKwl9IG1zX2wxOworCisJLyogbmVpZ2hib3IgbWVhc3VyZW1lbnQgcmVwb3J0cyBmb3IgdXAgdG8gNiBjZWxscyAqLworCWludCBudW1fY2VsbDsKKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwX2NlbGwgY2VsbFs2XTsKK307CisKK2VudW0gbWVhc19yZXBfZmllbGQgeworCU1FQVNfUkVQX0RMX1JYTEVWX0ZVTEwsCisJTUVBU19SRVBfRExfUlhMRVZfU1VCLAorCU1FQVNfUkVQX0RMX1JYUVVBTF9GVUxMLAorCU1FQVNfUkVQX0RMX1JYUVVBTF9TVUIsCisJTUVBU19SRVBfVUxfUlhMRVZfRlVMTCwKKwlNRUFTX1JFUF9VTF9SWExFVl9TVUIsCisJTUVBU19SRVBfVUxfUlhRVUFMX0ZVTEwsCisJTUVBU19SRVBfVUxfUlhRVUFMX1NVQiwKK307CisKKy8qIG9idGFpbiBhbiBhdmVyYWdlIG92ZXIgdGhlIGxhc3QgJ251bScgZmllbGRzIGluIHRoZSBtZWFzIHJlcHMgKi8KK2ludCBnZXRfbWVhc19yZXBfYXZnKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkgICAgIGVudW0gbWVhc19yZXBfZmllbGQgZmllbGQsIHVuc2lnbmVkIGludCBudW0pOworCisvKiBDaGVjayBpZiBOIG91dCBvZiBNIGxhc3QgdmFsdWVzIGZvciBGSUVMRCBhcmUgPj0gYmQgKi8KK2ludCBtZWFzX3JlcF9uX291dF9vZl9tX2JlKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkJZW51bSBtZWFzX3JlcF9maWVsZCBmaWVsZCwKKwkJCXVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgbSwgaW50IGJlKTsKKwordW5zaWduZWQgaW50IGNhbGNfaW5pdGlhbF9pZHgodW5zaWduZWQgaW50IGFycmF5X3NpemUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbWVhc19yZXBfaWR4LAorCQkJICAgICAgdW5zaWduZWQgaW50IG51bV92YWx1ZXMpOworCisjZW5kaWYgLyogX01FQVNfUkVQX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21nY3AuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21nY3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2U4MDBiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcC5oCkBAIC0wLDAgKzEsMTIyIEBACisvKiBBIE1lZGlhIEdhdGV3YXkgQ29udHJvbCBQcm90b2NvbCBNZWRpYSBHYXRld2F5OiBSRkMgMzQzNSAqLworCisvKgorICogKEMpIDIwMDktMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBPUEVOQlNDX01HQ1BfSAorI2RlZmluZSBPUEVOQlNDX01HQ1BfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNkZWZpbmUgUlRQX1BPUlRfREVGQVVMVCA0MDAwCisKKy8qKgorICogQ2FsY3VsYXRlIHRoZSBSVFAgYXVkaW8gcG9ydCBmb3IgdGhlIGdpdmVuIG11bHRpcGxleAorICogYW5kIHRoZSBkaXJlY3Rpb24uIFRoaXMgYWxsb3dzIGEgc2VtaSBzdGF0aWMgZW5kcG9pbnQKKyAqIHRvIHBvcnQgY2FsY3VsYXRpb24gcmVtb3ZpbmcgdGhlIG5lZWQgZm9yIHRoZSBCU0MKKyAqIGFuZCB0aGUgTWVkaWFHYXRld2F5IHRvIGNvbW11bmljYXRlLgorICoKKyAqIFBvcnQgdXNhZ2UgZXhwbGFpbmVkOgorICogICAgICAgYmFzZSArIChtdWx0aXBsZXggKiAyKSArIDAgPT0gbG9jYWwgcG9ydCB0byB3YWl0IGZvciBuZXR3b3JrIHBhY2tldHMKKyAqICAgICAgIGJhc2UgKyAobXVsdGlwbGV4ICogMikgKyAxID09IGxvY2FsIHBvcnQgZm9yIHJ0Y3AKKyAqCisgKiBUaGUgYWJvdmUgcG9ydCB3aWxsIHJlY2VpdmUgcGFja2V0cyBmcm9tIHRoZSBCVFMgdGhhdCBuZWVkCisgKiB0byBiZSBwYXRjaGVkIGFuZCBmb3J3YXJkZWQgdG8gdGhlIG5ldHdvcmsuCisgKiBUaGUgYWJvdmUgcG9ydCB3aWxsIHJlY2VpdmUgcGFja2V0cyBmcm9tIHRoZSBuZXR3b3JrIHRoYXQKKyAqIG5lZWQgdG8gYmUgcGF0Y2hlZCBhbmQgZm9yd2FyZGVkIHRvIHRoZSBCVFMuCisgKgorICogV2UgYXNzdW1lIHRvIGhhdmUgYSBzdGF0aWMgQlRTIElQIGFkZHJlc3Mgc28gd2UgY2FuIGRpZmZlcmVudGlhdGUKKyAqIG5ldHdvcmsgYW5kIEJUUy4KKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJ0cF9jYWxjdWxhdGVfcG9ydChpbnQgbXVsdGlwbGV4LCBpbnQgYmFzZSkKK3sKKwlyZXR1cm4gYmFzZSArIChtdWx0aXBsZXggKiAyKTsKK30KKworCisvKgorICogSGFuZGxpbmcgb2YgTUdDUCBFbmRwb2ludHMgYW5kIHRoZSBNR0NQIENvbmZpZworICovCitzdHJ1Y3QgbWdjcF9lbmRwb2ludDsKK3N0cnVjdCBtZ2NwX2NvbmZpZzsKKworI2RlZmluZSBNR0NQX0VORFBfQ1JDWCAxCisjZGVmaW5lIE1HQ1BfRU5EUF9ETENYIDIKKyNkZWZpbmUgTUdDUF9FTkRQX01EQ1ggMworCisvKgorICogd2hhdCB0byBkbyB3aXRoIHRoZSBtc2c/CisgKgktIGNvbnRpbnVlIGFzIHVzdWFsPworICoJLSByZWplY3QgYW5kIHNlbmQgYSBmYWlsdXJlIGNvZGU/CisgKgktIGRlZmVyPyBkbyBub3Qgc2VuZCBhbnl0aGluZworICovCisjZGVmaW5lIE1HQ1BfUE9MSUNZX0NPTlQJNAorI2RlZmluZSBNR0NQX1BPTElDWV9SRUpFQ1QJNQorI2RlZmluZSBNR0NQX1BPTElDWV9ERUZFUgk2CisKK3R5cGVkZWYgaW50ICgqbWdjcF9jaGFuZ2UpKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBpbnQgZW5kcG9pbnQsIGludCBzdGF0ZSwgaW50IGxvY2FsX3J0cCk7Cit0eXBlZGVmIGludCAoKm1nY3BfcG9saWN5KShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgaW50IGVuZHBvaW50LCBpbnQgc3RhdGUsIGNvbnN0IGNoYXIgKnRyYW5zYWN0aW9faWQpOworCitzdHJ1Y3QgbWdjcF9jb25maWcgeworCWludCBzb3VyY2VfcG9ydDsKKwljaGFyICpsb2NhbF9pcDsKKwljaGFyICpzb3VyY2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbnVtYmVyX2VuZHBvaW50czsKKwljaGFyICpidHNfaXA7CisKKwlzdHJ1Y3QgaW5fYWRkciBidHNfaW47CisJY2hhciAqYXVkaW9fbmFtZTsKKwlpbnQgYXVkaW9fcGF5bG9hZDsKKwlpbnQgYXVkaW9fbG9vcDsKKwlpbnQgZWFybHlfYmluZDsKKwlpbnQgcnRwX2Jhc2VfcG9ydDsKKworCWNoYXIgKmZvcndhcmRfaXA7CisJaW50IGZvcndhcmRfcG9ydDsKKworCW1nY3BfY2hhbmdlIGNoYW5nZV9jYjsKKwltZ2NwX3BvbGljeSBwb2xpY3lfY2I7CisJdm9pZCAqZGF0YTsKKworCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwb2ludHM7CisJdW5zaWduZWQgaW50IGxhc3RfY2FsbF9pZDsKK307CisKKy8qIGNvbmZpZyBtYW5hZ2VtZW50ICovCitzdHJ1Y3QgbWdjcF9jb25maWcgKm1nY3BfY29uZmlnX2FsbG9jKHZvaWQpOworaW50IG1nY3BfcGFyc2VfY29uZmlnKGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlLCBzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZyk7CitpbnQgbWdjcF92dHlfaW5pdCh2b2lkKTsKK2ludCBtZ2NwX2VuZHBvaW50c19hbGxvY2F0ZShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZyk7CitpbnQgbWdjcF9iaW5kX3J0cF9wb3J0KHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwLCBpbnQgcnRwX3BvcnQpOwordm9pZCBtZ2NwX2ZyZWVfZW5kcChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCk7CisKKy8qCisgKiBmb3JtYXQgaGVscGVyIGZ1bmN0aW9ucworICovCitzdHJ1Y3QgbXNnYiAqbWdjcF9oYW5kbGVfbWVzc2FnZShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CitzdHJ1Y3QgbXNnYiAqbWdjcF9jcmVhdGVfcnNpcCh2b2lkKTsKK3N0cnVjdCBtc2diICptZ2NwX2NyZWF0ZV9yZXNwb25zZV93aXRoX2RhdGEoaW50IGNvZGUsIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqdHJhbnMsIGNvbnN0IGNoYXIgKmRhdGEpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcF9pbnRlcm5hbC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcF9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZDBjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwX2ludGVybmFsLmgKQEAgLTAsMCArMSw2NCBAQAorLyogTUdDUCBQcml2YXRlIERhdGEgKi8KKworLyoKKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgT1BFTkJTQ19NR0NQX0RBVEFfSAorI2RlZmluZSBPUEVOQlNDX01HQ1BfREFUQV9ICisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2RlZmluZSBDSV9VTlVTRUQgMAorCitzdHJ1Y3QgbWdjcF9lbmRwb2ludCB7CisJaW50IGNpOworCWNoYXIgKmNhbGxpZDsKKwljaGFyICpsb2NhbF9vcHRpb25zOworCWludCBjb25uX21vZGU7CisKKwlpbnQgYnRzX3BheWxvYWRfdHlwZTsKKwlpbnQgbmV0X3BheWxvYWRfdHlwZTsKKworCS8qIHRoZSBsb2NhbCBydHAgcG9ydCB3ZSBhcmUgYmluZGluZyB0byAqLworCWludCBydHBfcG9ydDsKKworCS8qCisJICogUlRQIG1hbmdsaW5nOgorCSAqICAtIHdlIGdldCBSVFAgYW5kIFJUQ1AgdG8gdXMgYW5kIG5lZWQgdG8gZm9yd2FyZCB0byB0aGUgQlRTCisJICogIC0gd2UgZ2V0IFJUUCBhbmQgUlRDUCBmcm9tIHRoZSBCVFMgYW5kIGZvcndhcmQgdG8gdGhlIG5ldHdvcmsKKwkgKi8KKwlzdHJ1Y3QgYnNjX2ZkIGxvY2FsX3J0cDsKKwlzdHJ1Y3QgYnNjX2ZkIGxvY2FsX3J0Y3A7CisKKwlzdHJ1Y3QgaW5fYWRkciByZW1vdGU7CisJc3RydWN0IGluX2FkZHIgYnRzOworCisJLyogaW4gbmV0d29yayBieXRlIG9yZGVyICovCisJaW50IG5ldF9ydHAsIG5ldF9ydGNwOworCWludCBidHNfcnRwLCBidHNfcnRjcDsKKworCS8qIGJhY2twb2ludGVyICovCisJc3RydWN0IG1nY3BfY29uZmlnICpjZmc7Cit9OworCisjZGVmaW5lIEVORFBPSU5UX05VTUJFUihlbmRwKSBhYnMoZW5kcCAtIGVuZHAtPmNmZy0+ZW5kcG9pbnRzKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21pc2RuLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9taXNkbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMzhkZTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9taXNkbi5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBNSVNETl9ICisjZGVmaW5lIE1JU0ROX0gKKworI2luY2x1ZGUgImUxX2lucHV0LmgiCisKK2ludCBtaV9zZXR1cChpbnQgY2FyZG5yLCAgc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIGludCByZWxlYXNlX2wyKTsKK2ludCBfYWJpc19ubV9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpOworaW50IG1pX2UxX2xpbmVfdXBkYXRlKHN0cnVjdCBlMWlucF9saW5lICpsaW5lKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tbmNjLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tbmNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4MzM5YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21uY2MuaApAQCAtMCwwICsxLDE1OSBAQAorLyogR1NNIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UgTGF5ZXIgMyBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlIAorICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX01OQ0NfSAorI2RlZmluZSBfTU5DQ19ICisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tbmNjLmg+CisKKy8qIE9uZSBlbmQgb2YgYSBjYWxsICovCitzdHJ1Y3QgZ3NtX2NhbGwgeworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCisJLyogbmV0d29yayBoYW5kbGUgKi8KKwl2b2lkICpuZXQ7CisKKwkvKiB0aGUgJ2xvY2FsJyB0cmFuc2FjdGlvbiAqLworCXVfaW50MzJfdCBjYWxscmVmOworCS8qIHRoZSAncmVtb3RlJyB0cmFuc2FjdGlvbiAqLworCXVfaW50MzJfdCByZW1vdGVfcmVmOworfTsKKworI2RlZmluZSBNTkNDX1NFVFVQX1JFUQkJMHgwMTAxCisjZGVmaW5lIE1OQ0NfU0VUVVBfSU5ECQkweDAxMDIKKyNkZWZpbmUgTU5DQ19TRVRVUF9SU1AJCTB4MDEwMworI2RlZmluZSBNTkNDX1NFVFVQX0NORgkJMHgwMTA0CisjZGVmaW5lIE1OQ0NfU0VUVVBfQ09NUExfUkVRCTB4MDEwNQorI2RlZmluZSBNTkNDX1NFVFVQX0NPTVBMX0lORAkweDAxMDYKKy8qIE1OQ0NfUkVKXyogaXMgcGVyZm9tZWQgdmlhIE1OQ0NfUkVMXyogKi8KKyNkZWZpbmUgTU5DQ19DQUxMX0NPTkZfSU5ECTB4MDEwNworI2RlZmluZSBNTkNDX0NBTExfUFJPQ19SRVEJMHgwMTA4CisjZGVmaW5lIE1OQ0NfUFJPR1JFU1NfUkVRCTB4MDEwOQorI2RlZmluZSBNTkNDX0FMRVJUX1JFUQkJMHgwMTBhCisjZGVmaW5lIE1OQ0NfQUxFUlRfSU5ECQkweDAxMGIKKyNkZWZpbmUgTU5DQ19OT1RJRllfUkVRCQkweDAxMGMKKyNkZWZpbmUgTU5DQ19OT1RJRllfSU5ECQkweDAxMGQKKyNkZWZpbmUgTU5DQ19ESVNDX1JFUQkJMHgwMTBlCisjZGVmaW5lIE1OQ0NfRElTQ19JTkQJCTB4MDEwZgorI2RlZmluZSBNTkNDX1JFTF9SRVEJCTB4MDExMAorI2RlZmluZSBNTkNDX1JFTF9JTkQJCTB4MDExMQorI2RlZmluZSBNTkNDX1JFTF9DTkYJCTB4MDExMgorI2RlZmluZSBNTkNDX0ZBQ0lMSVRZX1JFUQkweDAxMTMKKyNkZWZpbmUgTU5DQ19GQUNJTElUWV9JTkQJMHgwMTE0CisjZGVmaW5lIE1OQ0NfU1RBUlRfRFRNRl9JTkQJMHgwMTE1CisjZGVmaW5lIE1OQ0NfU1RBUlRfRFRNRl9SU1AJMHgwMTE2CisjZGVmaW5lIE1OQ0NfU1RBUlRfRFRNRl9SRUoJMHgwMTE3CisjZGVmaW5lIE1OQ0NfU1RPUF9EVE1GX0lORAkweDAxMTgKKyNkZWZpbmUgTU5DQ19TVE9QX0RUTUZfUlNQCTB4MDExOQorI2RlZmluZSBNTkNDX01PRElGWV9SRVEJCTB4MDExYQorI2RlZmluZSBNTkNDX01PRElGWV9JTkQJCTB4MDExYgorI2RlZmluZSBNTkNDX01PRElGWV9SU1AJCTB4MDExYworI2RlZmluZSBNTkNDX01PRElGWV9DTkYJCTB4MDExZAorI2RlZmluZSBNTkNDX01PRElGWV9SRUoJCTB4MDExZQorI2RlZmluZSBNTkNDX0hPTERfSU5ECQkweDAxMWYKKyNkZWZpbmUgTU5DQ19IT0xEX0NORgkJMHgwMTIwCisjZGVmaW5lIE1OQ0NfSE9MRF9SRUoJCTB4MDEyMQorI2RlZmluZSBNTkNDX1JFVFJJRVZFX0lORAkweDAxMjIKKyNkZWZpbmUgTU5DQ19SRVRSSUVWRV9DTkYJMHgwMTIzCisjZGVmaW5lIE1OQ0NfUkVUUklFVkVfUkVKCTB4MDEyNAorI2RlZmluZSBNTkNDX1VTRVJJTkZPX1JFUQkweDAxMjUKKyNkZWZpbmUgTU5DQ19VU0VSSU5GT19JTkQJMHgwMTI2CisjZGVmaW5lIE1OQ0NfUkVKX1JFUQkJMHgwMTI3CisjZGVmaW5lIE1OQ0NfUkVKX0lORAkJMHgwMTI4CisKKyNkZWZpbmUgTU5DQ19CUklER0UJCTB4MDIwMAorI2RlZmluZSBNTkNDX0ZSQU1FX1JFQ1YJCTB4MDIwMQorI2RlZmluZSBNTkNDX0ZSQU1FX0RST1AJCTB4MDIwMgorI2RlZmluZSBNTkNDX0xDSEFOX01PRElGWQkweDAyMDMKKworI2RlZmluZSBHU01fVENIRl9GUkFNRQkJMHgwMzAwCisjZGVmaW5lIEdTTV9UQ0hGX0ZSQU1FX0VGUgkweDAzMDEKKworI2RlZmluZSBHU01fTUFYX0ZBQ0lMSVRZCTEyOAorI2RlZmluZSBHU01fTUFYX1NTVkVSU0lPTgkxMjgKKyNkZWZpbmUgR1NNX01BWF9VU0VSVVNFUgkxMjgKKworI2RlZmluZQlNTkNDX0ZfQkVBUkVSX0NBUAkweDAwMDEKKyNkZWZpbmUgTU5DQ19GX0NBTExFRAkJMHgwMDAyCisjZGVmaW5lIE1OQ0NfRl9DQUxMSU5HCQkweDAwMDQKKyNkZWZpbmUgTU5DQ19GX1JFRElSRUNUSU5HCTB4MDAwOAorI2RlZmluZSBNTkNDX0ZfQ09OTkVDVEVECTB4MDAxMAorI2RlZmluZSBNTkNDX0ZfQ0FVU0UJCTB4MDAyMAorI2RlZmluZSBNTkNDX0ZfVVNFUlVTRVIJCTB4MDA0MAorI2RlZmluZSBNTkNDX0ZfUFJPR1JFU1MJCTB4MDA4MAorI2RlZmluZSBNTkNDX0ZfRU1FUkdFTkNZCTB4MDEwMAorI2RlZmluZSBNTkNDX0ZfRkFDSUxJVFkJCTB4MDIwMAorI2RlZmluZSBNTkNDX0ZfU1NWRVJTSU9OCTB4MDQwMAorI2RlZmluZSBNTkNDX0ZfQ0NDQVAJCTB4MDgwMAorI2RlZmluZSBNTkNDX0ZfS0VZUEFECQkweDEwMDAKKyNkZWZpbmUgTU5DQ19GX1NJR05BTAkJMHgyMDAwCisKK3N0cnVjdCBnc21fbW5jYyB7CisJLyogY29udGV4dCBiYXNlZCBpbmZvcm1hdGlvbiAqLworCXVfaW50MzJfdAltc2dfdHlwZTsKKwl1X2ludDMyX3QJY2FsbHJlZjsKKworCS8qIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCAqLworCXVfaW50MzJfdAlmaWVsZHM7CisKKwkvKiBkYXRhIGRlcml2ZWQgaW5mb3JtYXRpb25zIChNTkNDX0ZfIGJhc2VkKSAqLworCXN0cnVjdCBnc21fbW5jY19iZWFyZXJfY2FwCWJlYXJlcl9jYXA7CisJc3RydWN0IGdzbV9tbmNjX251bWJlcgkJY2FsbGVkOworCXN0cnVjdCBnc21fbW5jY19udW1iZXIJCWNhbGxpbmc7CisJc3RydWN0IGdzbV9tbmNjX251bWJlcgkJcmVkaXJlY3Rpbmc7CisJc3RydWN0IGdzbV9tbmNjX251bWJlcgkJY29ubmVjdGVkOworCXN0cnVjdCBnc21fbW5jY19jYXVzZQkJY2F1c2U7CisJc3RydWN0IGdzbV9tbmNjX3Byb2dyZXNzCXByb2dyZXNzOworCXN0cnVjdCBnc21fbW5jY191c2VydXNlcgl1c2VydXNlcjsKKwlzdHJ1Y3QgZ3NtX21uY2NfZmFjaWxpdHkJZmFjaWxpdHk7CisJc3RydWN0IGdzbV9tbmNjX2NjY2FwCQljY2NhcDsKKwlzdHJ1Y3QgZ3NtX21uY2Nfc3N2ZXJzaW9uCXNzdmVyc2lvbjsKKwlzdHJ1Y3QJeworCQlpbnQJCXN1cDsKKwkJaW50CQlpbnY7CisJfSBjbGlyOworCWludAkJc2lnbmFsOworCisJLyogZGF0YSBkZXJpdmVkIGluZm9ybWF0aW9uLCBub3QgTU5DQ19GIGJhc2VkICovCisJaW50CQlrZXlwYWQ7CisJaW50CQltb3JlOworCWludAkJbm90aWZ5OyAvKiAwLi4xMjcgKi8KKwlpbnQJCWVtZXJnZW5jeTsKKwljaGFyCQlpbXNpWzE2XTsKKworCXVuc2lnbmVkIGNoYXIJbGNoYW5fbW9kZTsKK307CisKK3N0cnVjdCBnc21fZGF0YV9mcmFtZSB7CisJdV9pbnQzMl90CW1zZ190eXBlOworCXVfaW50MzJfdAljYWxscmVmOworCXVuc2lnbmVkIGNoYXIJZGF0YVswXTsKK307CisKK2NoYXIgKmdldF9tbmNjX25hbWUoaW50IHZhbHVlKTsKK2ludCBtbmNjX3JlY3Yoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtc2dfdHlwZSwgdm9pZCAqYXJnKTsKK3ZvaWQgbW5jY19zZXRfY2F1c2Uoc3RydWN0IGdzbV9tbmNjICpkYXRhLCBpbnQgbG9jLCBpbnQgdmFsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9vcGVuYnNjZGVmaW5lcy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvb3BlbmJzY2RlZmluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODJlNTkyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvb3BlbmJzY2RlZmluZXMuaApAQCAtMCwwICsxLDM1IEBACisvKiAKKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBPUEVOQlNDREVGSU5FU19ICisjZGVmaW5lIE9QRU5CU0NERUZJTkVTX0gKKworI2lmZGVmIEJVSUxESU5HX09OX1dJTkRPV1MKKyAgICAjaWZkZWYgQlVJTERJTkdfT1BFTkJTQworICAgICAgICAjZGVmaW5lIEJTQ19BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpCisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBCU0NfQVBJIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorICAgICNlbmRpZgorI2Vsc2UKKyAgICAjZGVmaW5lIEJTQ19BUEkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3BhZ2luZy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcGFnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiZGNhOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3BhZ2luZy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIFBhZ2luZyBoZWxwZXIgYW5kIG1hbmFnZXIuLi4uICovCisvKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBQQUdJTkdfSAorI2RlZmluZSBQQUdJTkdfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlICJnc21fZGF0YS5oIgorI2luY2x1ZGUgImdzbV9zdWJzY3JpYmVyLmgiCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKworLyogY2FsbCBvbmNlIGZvciBldmVyeSBnc21fYnRzLi4uICovCit2b2lkIHBhZ2luZ19pbml0KHN0cnVjdCBnc21fYnRzICpidHMpOworCisvKiBzY2hlZHVsZSBwYWdpbmcgcmVxdWVzdCAqLworaW50IHBhZ2luZ19yZXF1ZXN0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0d29yaywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCSAgIGludCB0eXBlLCBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqZGF0YSk7CisKKy8qIHN0b3AgcGFnaW5nIHJlcXVlc3RzICovCit2b2lkIHBhZ2luZ19yZXF1ZXN0X3N0b3Aoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCisvKiB1cGRhdGUgcGFnaW5nIGxvYWQgKi8KK3ZvaWQgcGFnaW5nX3VwZGF0ZV9idWZmZXJfc3BhY2Uoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQxNl90KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yZXN0X29jdGV0cy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcmVzdF9vY3RldHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTcyYzBmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcmVzdF9vY3RldHMuaApAQCAtMCwwICsxLDEyMiBAQAorI2lmbmRlZiBfUkVTVF9PQ1RFVFNfSAorI2RlZmluZSBfUkVTVF9PQ1RFVFNfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKworLyogZ2VuZXJhdGUgU0kxIHJlc3Qgb2N0ZXRzICovCitpbnQgcmVzdF9vY3RldHNfc2kxKHVfaW50OF90ICpkYXRhLCB1X2ludDhfdCAqbmNoX3Bvcyk7CisKK3N0cnVjdCBnc200OF9zaV9zZWxlY3Rpb25fcGFyYW1zIHsKKwl1X2ludDE2X3QgcGVuYWx0eV90aW1lOjUsCisJCSAgdGVtcF9vZmZzOjMsCisJCSAgY2VsbF9yZXNlbF9vZmY6NiwKKwkJICBjYnE6MSwKKwkJICBwcmVzZW50OjE7Cit9OworCitzdHJ1Y3QgZ3NtNDhfc2lfcG93ZXJfb2Zmc2V0IHsKKwl1X2ludDhfdCBwb3dlcl9vZmZzZXQ6MiwKKwkJIHByZXNlbnQ6MTsKK307CisKK3N0cnVjdCBnc200OF9zaTNfZ3Byc19pbmQgeworCXVfaW50OF90IHNpMTNfcG9zaXRpb246MSwKKwkJIHJhX2NvbG91cjozLAorCQkgcHJlc2VudDoxOworfTsKKworc3RydWN0IGdzbTQ4X2xzYV9wYXJhbXMgeworCXVfaW50MzJfdCBwcmlvX3RocjozLAorCQkgbHNhX29mZnNldDozLAorCQkgbWNjOjEyLAorCQkgbW5jOjEyOworCXVuc2lnbmVkIGludCBwcmVzZW50OworfTsKKworc3RydWN0IGdzbTQ4X3NpX3JvX2luZm8geworCXN0cnVjdCBnc200OF9zaV9zZWxlY3Rpb25fcGFyYW1zIHNlbGVjdGlvbl9wYXJhbXM7CisJc3RydWN0IGdzbTQ4X3NpX3Bvd2VyX29mZnNldCBwb3dlcl9vZmZzZXQ7CisJdV9pbnQ4X3Qgc2kydGVyX2luZGljYXRvcjsKKwl1X2ludDhfdCBlYXJseV9jbV9jdHJsOworCXN0cnVjdCB7CisJCXVfaW50OF90IHdoZXJlOjMsCisJCQkgcHJlc2VudDoxOworCX0gc2NoZWR1bGluZzsKKwlzdHJ1Y3QgZ3NtNDhfc2kzX2dwcnNfaW5kIGdwcnNfaW5kOworCisJLyogU0kgNCBzcGVjaWZpYyAqLworCXN0cnVjdCBnc200OF9sc2FfcGFyYW1zIGxzYV9wYXJhbXM7CisJdV9pbnQxNl90IGNlbGxfaWQ7CisJdV9pbnQ4X3QgYnJlYWtfaW5kOwkvKiBkbyB3ZSBoYXZlIFNJNyArIFNJOCA/ICovCit9OworCisKKy8qIEdlbmVyYXRlIFNJMyBSZXN0IE9jdGVzdHMgKENoYXB0ZXIgMTAuNS4yLjM0IC8gVGFibGUgMTAuNC43MikgKi8KK2ludCByZXN0X29jdGV0c19zaTModV9pbnQ4X3QgKmRhdGEsIGNvbnN0IHN0cnVjdCBnc200OF9zaV9yb19pbmZvICpzaTMpOworCisvKiBHZW5lcmF0ZSBTSTQgUmVzdCBPY3RldHMgKENoYXB0ZXIgMTAuNS4yLjM1KSAqLworaW50IHJlc3Rfb2N0ZXRzX3NpNCh1X2ludDhfdCAqZGF0YSwgY29uc3Qgc3RydWN0IGdzbTQ4X3NpX3JvX2luZm8gKnNpNCk7CisKK2VudW0gcGJjY2hfY2Fycmllcl90eXBlIHsKKwlQQkNDSF9CQ0NILAorCVBCQ0NIX0FSRkNOLAorCVBCQ0NIX01BSU8KK307CisKKy8qIFRTIDAzLjYwIENoYXB0ZXIgNi4zLjMuMTogTmV0d29yayBNb2RlIG9mIE9wZXJhdGlvbiAqLworZW51bSBncHJzX25tbyB7CisJR1BSU19OTU9fSQk9IDAsCS8qIENTIHBhZ2luIG9uIEdQUlMgcGFnaW5nIG9yIHRyYWZmaWMgY2hhbm5lbCAqLworCUdQUlNfTk1PX0lJCT0gMSwJLyogYWxsIHBhZ2luZyBvbiBDQ0NIICovCisJR1BSU19OTU9fSUlJCT0gMiwJLyogbm8gcGFnaW5nIGNvb3JkaW5hdGlvbiAqLworfTsKKworc3RydWN0IGdwcnNfY2VsbF9vcHRpb25zIHsKKwllbnVtIGdwcnNfbm1vIG5tbzsKKwkvKiBUMzE2ODogd2FpdCBmb3IgcGFja2V0IHVwbGluayBhc3NpZ25tZW50IG1lc3NhZ2UgKi8KKwl1X2ludDMyX3QgdDMxNjg7CS8qIGluIG1pbGxpc2Vjb25kcyAqLworCS8qIFQzMTkyOiB3YWl0IGZvciByZWxlYXNlIG9mIHRoZSBUQkYgYWZ0ZXIgcmVjZXB0aW9uIG9mIHRoZSBmaW5hbCBibG9jayAqLworCXVfaW50MzJfdCB0MzE5MjsJLyogaW4gbWlsbGlzZWNvbmRzICovCisJdV9pbnQzMl90IGRyeF90aW1lcl9tYXg7LyogaW4gc2Vjb25kcyAqLworCXVfaW50MzJfdCBic19jdl9tYXg7Cit9OworCisvKiBUUyAwNC42MCBUYWJsZSAxMi45LjIgKi8KK3N0cnVjdCBncHJzX3Bvd2VyX2N0cmxfcGFycyB7CisJdV9pbnQ4X3QgYWxwaGE7CisJdV9pbnQ4X3QgdF9hdmdfdzsKKwl1X2ludDhfdCB0X2F2Z190OworCXVfaW50OF90IHBjX21lYXNfY2hhbjsKKwl1X2ludDhfdCBuX2F2Z19pOworfTsKKworc3RydWN0IGdzbTQ4X3NpMTNfaW5mbyB7CisJc3RydWN0IGdwcnNfY2VsbF9vcHRpb25zIGNlbGxfb3B0czsKKwlzdHJ1Y3QgZ3Byc19wb3dlcl9jdHJsX3BhcnMgcHdyX2N0cmxfcGFyczsKKwl1X2ludDhfdCBiY2NoX2NoYW5nZV9tYXJrOworCXVfaW50OF90IHNpX2NoYW5nZV9maWVsZDsKKwl1X2ludDhfdCBwYmNjaF9wcmVzZW50OworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdV9pbnQ4X3QgcmFjOworCQkJdV9pbnQ4X3Qgc3BnY19jY2NoX3N1cDsKKwkJCXVfaW50OF90IG5ldF9jdHJsX29yZDsKKwkJCXVfaW50OF90IHByaW9fYWNjX3RocjsKKwkJfSBub19wYmNjaDsKKwkJc3RydWN0IHsKKwkJCXVfaW50OF90IHBzaTFfcmVwX3BlcjsKKwkJCXVfaW50OF90IHBiOworCQkJdV9pbnQ4X3QgdHNjOworCQkJdV9pbnQ4X3QgdG47CisJCQllbnVtIHBiY2NoX2NhcnJpZXJfdHlwZSBjYXJyaWVyX3R5cGU7CisJCQl1X2ludDE2X3QgYXJmY247CisJCQl1X2ludDhfdCBtYWlvOworCQl9IHBiY2NoOworCX07Cit9OworCisvKiBHZW5lcmF0ZSBTSTEzIFJlc3QgT2N0ZXN0cyAoQ2hhcHRlciAxMC41LjIuMzdiKSAqLworaW50IHJlc3Rfb2N0ZXRzX3NpMTModV9pbnQ4X3QgKmRhdGEsIGNvbnN0IHN0cnVjdCBnc200OF9zaTEzX2luZm8gKnNpMTMpOworCisjZW5kaWYgLyogX1JFU1RfT0NURVRTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3JzMjMyLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yczIzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMTg3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yczIzMi5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfUlMyMzJfSAorI2RlZmluZSBfUlMyMzJfSAorCitpbnQgcnMyMzJfc2V0dXAoY29uc3QgY2hhciAqc2VyaWFsX3BvcnQsIHVuc2lnbmVkIGludCBkZWxheV9tcywKKwkJc3RydWN0IGdzbV9idHMgKmJ0cyk7CisKK2ludCBoYW5kbGVfc2VyaWFsX21zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKworI2VuZGlmIC8qIF9SUzIzMl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ydHBfcHJveHkuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3J0cF9wcm94eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjcxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ydHBfcHJveHkuaApAQCAtMCwwICsxLDg1IEBACisjaWZuZGVmIF9SVFBfUFJPWFlfSAorI2RlZmluZSBfUlRQX1BST1hZX0gKKworLyogUlRQIHByb3h5IGhhbmRsaW5nIGZvciBpcC5hY2Nlc3MgbmFub0JUUyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorCitlbnVtIHJ0cF9yeF9hY3Rpb24geworCVJUUF9OT05FLAorCVJUUF9QUk9YWSwKKwlSVFBfUkVDVl9VUFNUUkVBTSwKK307CisKK2VudW0gcnRwX3R4X2FjdGlvbiB7CisJUlRQX1NFTkRfTk9ORSwKKwlSVFBfU0VORF9ET1dOU1RSRUFNLAorfTsKKworc3RydWN0IHJ0cF9zdWJfc29ja2V0IHsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luX2xvY2FsOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW5fcmVtb3RlOworCisJc3RydWN0IGJzY19mZCBiZmQ7CisJLyogbGlua2VkIGxpc3Qgb2YgdG8tYmUtdHJhbnNtaXR0ZWQgbXNnYidzICovCisJc3RydWN0IGxsaXN0X2hlYWQgdHhfcXVldWU7Cit9OworCitzdHJ1Y3QgcnRwX3NvY2tldCB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBydHBfc3ViX3NvY2tldCBydHA7CisJc3RydWN0IHJ0cF9zdWJfc29ja2V0IHJ0Y3A7CisKKwkvKiB3aGF0IHNob3VsZCB3ZSBkbyBvbiByZWNlaXZlPyAqLworCWVudW0gcnRwX3J4X2FjdGlvbiByeF9hY3Rpb247CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHJ0cF9zb2NrZXQgKm90aGVyX3NvY2s7CisJCX0gcHJveHk7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldDsKKwkJCXVfaW50MzJfdCBjYWxscmVmOworCQl9IHJlY2VpdmU7CisJfTsKKwllbnVtIHJ0cF90eF9hY3Rpb24gdHhfYWN0aW9uOworCXN0cnVjdCB7CisJCXVfaW50MTZfdCBzZXF1ZW5jZTsKKwkJdV9pbnQzMl90IHRpbWVzdGFtcDsKKwkJdV9pbnQzMl90IHNzcmM7CisJCXN0cnVjdCB0aW1ldmFsIGxhc3RfdHY7CisJfSB0cmFuc21pdDsKK307CisKK3N0cnVjdCBydHBfc29ja2V0ICpydHBfc29ja2V0X2NyZWF0ZSh2b2lkKTsKK2ludCBydHBfc29ja2V0X2JpbmQoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCB1X2ludDMyX3QgaXApOworaW50IHJ0cF9zb2NrZXRfY29ubmVjdChzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQpOworaW50IHJ0cF9zb2NrZXRfcHJveHkoc3RydWN0IHJ0cF9zb2NrZXQgKnRoaXMsIHN0cnVjdCBydHBfc29ja2V0ICpvdGhlcik7CitpbnQgcnRwX3NvY2tldF91cHN0cmVhbShzdHJ1Y3QgcnRwX3NvY2tldCAqdGhpcywgc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVfaW50MzJfdCBjYWxscmVmKTsKK2ludCBydHBfc29ja2V0X2ZyZWUoc3RydWN0IHJ0cF9zb2NrZXQgKnJzKTsKK2ludCBydHBfc2VuZF9mcmFtZShzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWUpOworCisjZW5kaWYgLyogX1JUUF9QUk9YWV9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWduYWwuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMjI4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWduYWwuaApAQCAtMCwwICsxLDEzMyBAQAorLyogR2VuZXJpYyBzaWduYWxsaW5nL25vdGlmaWNhdGlvbiBpbmZyYXN0cnVjdHVyZSAqLworLyogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIE9QRU5CU0NfU0lHTkFMX0gKKyNkZWZpbmUgT1BFTkJTQ19TSUdOQUxfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9zaWduYWwuaD4KKworLyoKKyAqIFNpZ25hbGxpbmcgc3Vic3lzdGVtcworICovCitlbnVtIHNpZ25hbF9zdWJzeXN0ZW1zIHsKKwlTU19QQUdJTkcsCisJU1NfU01TLAorCVNTX0FCSVNJUCwKKwlTU19OTSwKKwlTU19MQ0hBTiwKKwlTU19TVUJTQ1IsCisJU1NfU0NBTEwsCisJU1NfR0xPQkFMLAorfTsKKworLyogU1NfUEFHSU5HIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX3BhZ2luZyB7CisJU19QQUdJTkdfU1VDQ0VFREVELAorCVNfUEFHSU5HX0VYUElSRUQsCit9OworCisvKiBTU19TTVMgc2lnbmFscyAqLworZW51bSBzaWduYWxfc21zIHsKKwlTX1NNU19TVUJNSVRURUQsCS8qIEEgU01TIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdXMgKi8KKwlTX1NNU19ERUxJVkVSRUQsCS8qIEEgU01TIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQgdG8gYSBNUyAqLworCVNfU01TX1NNTUEsCQkvKiBBIE1TIHRlbGxzIHVzIGl0IGhhcyBtb3JlIHNwYWNlIGF2YWlsYWJsZSAqLworCVNfU01TX01FTV9FWENFRURFRCwJLyogQSBNUyB0ZWxscyB1cyBpdCBoYXMgbm8gbW9yZSBzcGFjZSBhdmFpbGFibGUgKi8KK307CisKKy8qIFNTX0FCSVNJUCBzaWduYWxzICovCitlbnVtIHNpZ25hbF9hYmlzaXAgeworCVNfQUJJU0lQX0NSQ1hfQUNLLAorCVNfQUJJU0lQX01EQ1hfQUNLLAorCVNfQUJJU0lQX0RMQ1hfSU5ELAorfTsKKworLyogU1NfTk0gc2lnbmFscyAqLworZW51bSBzaWduYWxfbm0geworCVNfTk1fU1dfQUNUSVZfUkVQLAkvKiBHU00gMTIuMjEgc29mdHdhcmUgYWN0aXZhdGVkIHJlcG9ydCAqLworCVNfTk1fRkFJTF9SRVAsCQkvKiBHU00gMTIuMjEgZmFpbHVyZSBldmVudCByZXBvcnQgKi8KKwlTX05NX05BQ0ssCQkvKiBHU00gMTIuMjEgdmFyaW91cyBOTV9NVF8qX05BQ0sgaGFwcGVuZWQgKi8KKwlTX05NX0lQQUNDX05BQ0ssCS8qIEdTTSAxMi4yMSBuYW5vQlRTIGV4dGVuc2lvbnMgTk1fTVRfSVBBQ0NfKl8qX05BQ0sgaGFwcGVuZWQgKi8KKwlTX05NX0lQQUNDX0FDSywJCS8qIEdTTSAxMi4yMSBuYW5vQlRTIGV4dGVuc2lvbnMgTk1fTVRfSVBBQ0NfKl8qX0FDSyBoYXBwZW5lZCAqLworCVNfTk1fSVBBQ0NfUkVTVEFSVF9BQ0ssIC8qIG5hbm9CVFMgaGFzIHNlbmQgYSByZXN0YXJ0IGFjayAqLworCVNfTk1fSVBBQ0NfUkVTVEFSVF9OQUNLLC8qIG5hbm9CVFMgaGFzIHNlbmQgYSByZXN0YXJ0IGFjayAqLworCVNfTk1fVEVTVF9SRVAsCQkvKiBHU00gMTIuMjEgVGVzdCBSZXBvcnQgKi8KK307CisKKy8qIFNTX0xDSEFOIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX2xjaGFuIHsKKwkvKgorCSAqIFRoZSBsY2hhbiBnb3QgZnJlZWQgd2l0aCBhbiB1c2VfY291bnQgIT0gMCBhbmQgZXJyb3IKKwkgKiByZWNvdmVyeSBuZWVkcyB0byBiZSBjYXJyaWVkIG91dCBmcm9tIHdpdGhpbiB0aGUKKwkgKiBzaWduYWwgaGFuZGxlci4KKwkgKi8KKwlTX0xDSEFOX1VORVhQRUNURURfUkVMRUFTRSwKKwlTX0xDSEFOX0FDVElWQVRFX0FDSywJCS8qIDA4LjU4IENoYW5uZWwgQWN0aXZhdGUgQUNLICovCisJU19MQ0hBTl9BQ1RJVkFURV9OQUNLLAkJLyogMDguNTggQ2hhbm5lbCBBY3RpdmF0ZSBOQUNLICovCisJU19MQ0hBTl9IQU5ET1ZFUl9DT01QTCwJCS8qIDA0LjA4IEhhbmRvdmVyIENvbXBsZXRlZCAqLworCVNfTENIQU5fSEFORE9WRVJfRkFJTCwJCS8qIDA0LjA4IEhhbmRvdmVyIEZhaWxlZCAqLworCVNfTENIQU5fSEFORE9WRVJfREVURUNULAkvKiAwOC41OCBIYW5kb3ZlciBEZXRlY3QgKi8KKwlTX0xDSEFOX01FQVNfUkVQLAkJLyogMDguNTggTWVhc3VyZW1lbnQgUmVwb3J0ICovCit9OworCisvKiBTU19TVUJTQ1Igc2lnbmFscyAqLworZW51bSBzaWduYWxfc3Vic2NyIHsKKwlTX1NVQlNDUl9BVFRBQ0hFRCwKKwlTX1NVQlNDUl9ERVRBQ0hFRCwKKwlTX1NVQlNDUl9JREVOVElUWSwJCS8qIHdlJ3ZlIHJlY2VpdmVkIHNvbWUgaWRlbnRpdHkgaW5mb3JtYXRpb24gKi8KK307CisKKy8qIFNTX1NDQUxMIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX3NjYWxsIHsKKwlTX1NDQUxMX1NVQ0NFU1MsCisJU19TQ0FMTF9FWFBJUkVELAorCVNfU0NBTExfREVUQUNIRUQsCit9OworCitlbnVtIHNpZ25hbF9nbG9iYWwgeworCVNfR0xPQkFMX1NIVVRET1dOLAorfTsKKworc3RydWN0IHBhZ2luZ19zaWduYWxfZGF0YSB7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCS8qIE5VTEwgaW4gY2FzZSB0aGUgcGFnaW5nIGRpZG4ndCB3b3JrICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47Cit9OworCitzdHJ1Y3Qgc2NhbGxfc2lnbmFsX2RhdGEgeworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXZvaWQgKmRhdGE7Cit9OworCitzdHJ1Y3QgaXBhY2NfYWNrX3NpZ25hbF9kYXRhIHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXVfaW50OF90IG1zZ190eXBlOwkKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2lsZW50X2NhbGwuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpbGVudF9jYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmYzUxOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpbGVudF9jYWxsLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfU0lMRU5UX0NBTExfSAorI2RlZmluZSBfU0lMRU5UX0NBTExfSAorCitleHRlcm4gaW50IGdzbV9zaWxlbnRfY2FsbF9zdGFydChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCB0eXBlKTsKK2V4dGVybiBpbnQgZ3NtX3NpbGVudF9jYWxsX3N0b3Aoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworZXh0ZXJuIGludCBzaWxlbnRfY2FsbF9yeChzdHJ1Y3QgbXNnYiAqbXNnKTsKK2V4dGVybiBpbnQgc2lsZW50X2NhbGxfcmVyb3V0ZShzdHJ1Y3QgbXNnYiAqbXNnKTsKKworI2VuZGlmIC8qIF9TSUxFTlRfQ0FMTF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zdWJjaGFuX2RlbXV4LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zdWJjaGFuX2RlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmYTAyMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3N1YmNoYW5fZGVtdXguaApAQCAtMCwwICsxLDEwMiBAQAorI2lmbmRlZiBfU1VCQ0hfREVNVVhfSAorI2RlZmluZSBfU1VCQ0hfREVNVVhfSAorLyogQSBFMSBzdWItY2hhbm5lbCAoZGUpbXVsdGlwbGV4ZXIgd2l0aCBUUkFVIGZyYW1lIHN5bmMgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisKKyNkZWZpbmUgTlJfU1VCQ0gJNAorI2RlZmluZSBUUkFVX0ZSQU1FX1NJWkUJNDAKKyNkZWZpbmUgVFJBVV9GUkFNRV9CSVRTCShUUkFVX0ZSQU1FX1NJWkUqOCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogREVNVUxUSVBMRVhFUiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZGVtdXhfc3ViY2ggeworCXVfaW50OF90IG91dF9iaXRidWZbVFJBVV9GUkFNRV9CSVRTXTsKKwl1X2ludDE2X3Qgb3V0X2lkeDsgLyogbmV4dCBiaXQgdG8gYmUgd3JpdHRlbiBpbiBvdXRfYml0YnVmICovCisJLyogbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHplcm9zIHRoYXQgd2UgaGF2ZSByZWNlaXZlZCAoZm9yIHN5bmMpICovCisJdW5zaWduZWQgaW50IGNvbnNlY3V0aXZlX3plcm9zOworCS8qIGFyZSB3ZSBpbiBUUkFVIGZyYW1lIHN5bmMgb3Igbm90PyAqLworCXVuc2lnbmVkIGludCBpbl9zeW5jOworfTsKKworc3RydWN0IHN1YmNoX2RlbXV4IHsKKwkvKiBiaXRtYXNrIG9mIGN1cnJlbnRseSBhY3RpdmUgc3ViY2hhbm5lbHMgKi8KKwl1X2ludDhfdCBjaGFuX2FjdGl2OworCS8qIG9uZSBkZW11eF9zdWJjaCBzdHJ1Y3QgZm9yIGV2ZXJ5IHN1YmNoYW5uZWwgKi8KKwlzdHJ1Y3QgZGVtdXhfc3ViY2ggc3ViY2hbTlJfU1VCQ0hdOworCS8qIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbmNlIHdlIGhhdmUgcmVjZWl2ZWQgYSBjb21wbGV0ZQorCSAqIGZyYW1lIG9uIGEgZ2l2ZW4gc3ViY2hhbm5lbCAqLworCWludCAoKm91dF9jYikoc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgsIGludCBjaCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4sCisJCSAgICAgIHZvaWQgKik7CisJLyogdXNlci1wcm92aWRlZCBkYXRhLCB0cmFuc3BhcmVudGx5IHBhc3NlZCB0byBvdXRfY2IoKSAqLworCXZvaWQgKmRhdGE7Cit9OworCisvKiBpbml0aWFsaXplIG9uZSBkZW11bHRpcGxleGVyIGluc3RhbmNlICovCitpbnQgc3ViY2hfZGVtdXhfaW5pdChzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCk7CisKKy8qIGZlZWQgJ2xlbicgbnVtYmVyIG9mIG11eGVkIGJ5dGVzIGludG8gdGhlIGRlbXVsdGlwbGV4ZXIgKi8KK2ludCBzdWJjaF9kZW11eF9pbihzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pOworCisvKiBhY3RpdmF0ZSBkZWNvZGluZy9wcm9jZXNzaW5nIGZvciBvbmUgc3ViY2hhbm5lbCAqLworaW50IHN1YmNoX2RlbXV4X2FjdGl2YXRlKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCBpbnQgc3ViY2gpOworCisvKiBkZWFjdGl2YXRlIGRlY29kaW5nL3Byb2Nlc3NpbmcgZm9yIG9uZSBzdWJjaGFubmVsICovCitpbnQgc3ViY2hfZGVtdXhfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgaW50IHN1YmNoKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTVVMVElQTEVYRVIgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogb25lIGVsZW1lbnQgaW4gdGhlIHR4X3F1ZXVlIG9mIGEgbXV4ZXIgc3ViLWNoYW5uZWwgKi8KK3N0cnVjdCBzdWJjaF90eHFfZW50cnkgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwl1bnNpZ25lZCBpbnQgYml0X2xlbjsJLyogdG90YWwgbnVtYmVyIG9mIGJpdHMgaW4gJ2JpdHMnICovCisJdW5zaWduZWQgaW50IG5leHRfYml0OwkvKiBuZXh0IGJpdCB0byBiZSB0cmFuc21pdHRlZCAqLworCisJdV9pbnQ4X3QgYml0c1swXTsJLyogb25lIGJpdCBwZXIgYnl0ZSAqLworfTsKKworc3RydWN0IG11eF9zdWJjaCB7CisJc3RydWN0IGxsaXN0X2hlYWQgdHhfcXVldWU7Cit9OworCisvKiBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIG9uZSBpbnN0YW5jZSBvZiB0aGUgc3ViY2hhbm5lbCBtdXhlciAqLworc3RydWN0IHN1YmNoX211eCB7CisJc3RydWN0IG11eF9zdWJjaCBzdWJjaFtOUl9TVUJDSF07Cit9OworCisvKiBpbml0aWFsaXplIGEgc3ViY2hhbm5lbCBtdXhlciBpbnN0YW5jZSAqLworaW50IHN1YmNoYW5fbXV4X2luaXQoc3RydWN0IHN1YmNoX211eCAqbXgpOworCisvKiByZXF1ZXN0IHRoZSBvdXRwdXQgb2YgJ2xlbicgbXVsdGlwbGV4ZWQgYnl0ZXMgKi8KK2ludCBzdWJjaGFuX211eF9vdXQoc3RydWN0IHN1YmNoX211eCAqbXgsIHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKTsKKworLyogZW5xdWV1ZSBzb21lIGRhdGEgaW50byBvbmUgc3ViLWNoYW5uZWwgb2YgdGhlIG11eGVyICovCitpbnQgc3ViY2hhbl9tdXhfZW5xdWV1ZShzdHJ1Y3Qgc3ViY2hfbXV4ICpteCwgaW50IHNfbnIsIGNvbnN0IHVfaW50OF90ICpkYXRhLAorCQkJaW50IGxlbik7CisKKyNlbmRpZiAvKiBfU1VCQ0hfREVNVVhfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc3lzdGVtX2luZm9ybWF0aW9uLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zeXN0ZW1faW5mb3JtYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODJhOWFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc3lzdGVtX2luZm9ybWF0aW9uLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9TWVNURU1fSU5GT19ICisjZGVmaW5lIF9TWVNURU1fSU5GT19ICisKK2ludCBnc21fZ2VuZXJhdGVfc2kodV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHR5cGUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGMzNmI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdGVsbmV0X2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIG1pbmltYWxpc3RpYyB0ZWxuZXQvbmV0d29yayBpbnRlcmZhY2UgaXQgbWlnaHQgdHVybiBpbnRvIGEgd2lyZSBpbnRlcmZhY2UgKi8KKy8qIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFRFTE5FVF9JTlRFUkZBQ0VfSAorI2RlZmluZSBURUxORVRfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgImdzbV9kYXRhLmgiCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorCisjaW5jbHVkZSA8dnR5L3Z0eS5oPgorCitzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24geworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0d29yazsKKwlzdHJ1Y3QgYnNjX2ZkIGZkOworCXN0cnVjdCB2dHkgKnZ0eTsKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqZGJnOworfTsKKworCit2b2lkIHRlbG5ldF9pbml0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0d29yaywgaW50IHBvcnQpOworCitpbnQgYnNjX3Z0eV9pbml0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmFuc2FjdGlvbi5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdHJhbnNhY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGEwMDhiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdHJhbnNhY3Rpb24uaApAQCAtMCwwICsxLDc2IEBACisjaWZuZGVmIF9UUkFOU0FDVF9ICisjZGVmaW5lIF9UUkFOU0FDVF9ICisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisKKy8qIE9uZSB0cmFuc2FjdGlvbiAqLworc3RydWN0IGdzbV90cmFucyB7CisJLyogRW50cnkgaW4gbGlzdCBvZiBhbGwgdHJhbnNhY3Rpb25zICovCisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisKKwkvKiBUaGUgcHJvdG9jb2wgd2l0aGluIHdoaWNoIHdlIGxpdmUgKi8KKwl1X2ludDhfdCBwcm90b2NvbDsKKworCS8qIFRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIElEICovCisJdV9pbnQ4X3QgdHJhbnNhY3Rpb25faWQ7CisJCisJLyogVG8gd2hvbSB3ZSBiZWxvbmcsIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHJlbW90ZSBNTSBlbnRpdHkgKi8KKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCS8qIFRoZSBhc3NvY2lhdGVkIGNvbm5lY3Rpb24gd2UgYXJlIHVzaW5nIHRvIHRyYW5zbWl0IG1lc3NhZ2VzICovCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm47CisKKwkvKiByZWZlcmVuY2UgZnJvbSBNTkNDIG9yIG90aGVyIGFwcGxpY2F0aW9uICovCisJdV9pbnQzMl90IGNhbGxyZWY7CisKKwkvKiBpZiB0cmFmZmljIGNoYW5uZWwgcmVjZWl2ZSB3YXMgcmVxdWVzdGVkICovCisJaW50IHRjaF9yZWN2OworCisJdW5pb24geworCQlzdHJ1Y3QgeworCisJCQkvKiBjdXJyZW50IGNhbGwgc3RhdGUgKi8KKwkJCWludCBzdGF0ZTsKKworCQkJLyogY3VycmVudCB0aW1lciBhbmQgbWVzc2FnZSBxdWV1ZSAqLworCQkJaW50IFRjdXJyZW50OwkJLyogY3VycmVudCBDQyB0aW1lciAqLworCQkJaW50IFQzMDhfc2Vjb25kOwkvKiB1c2VkIHRvIHNlbmQgcmVsZWFzZSBhZ2FpbiAqLworCQkJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJCQlzdHJ1Y3QgZ3NtX21uY2MgbXNnOwkvKiBzdG9yZXMgc2V0dXAvZGlzY29ubmVjdC9yZWxlYXNlIG1lc3NhZ2UgKi8KKwkJfSBjYzsKKwkJc3RydWN0IHsKKwkJCXVfaW50OF90IGxpbmtfaWQ7CS8qIFJTTCBMaW5rIElEIHRvIGJlIHVzZWQgZm9yIHRoaXMgdHJhbnMgKi8KKwkJCWludCBpc19tdDsJLyogaXMgdGhpcyBhIE1PICgwKSBvciBNVCAoMSkgdHJhbnNmZXIgKi8KKwkJCWVudW0gZ3NtNDExX2NwX3N0YXRlIGNwX3N0YXRlOworCQkJc3RydWN0IHRpbWVyX2xpc3QgY3BfdGltZXI7CisKKwkJCWVudW0gZ3NtNDExX3JwX3N0YXRlIHJwX3N0YXRlOworCisJCQlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCQl9IHNtczsKKwl9OworfTsKKworCisKK3N0cnVjdCBnc21fdHJhbnMgKnRyYW5zX2ZpbmRfYnlfaWQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkJICAgdV9pbnQ4X3QgcHJvdG8sIHVfaW50OF90IHRyYW5zX2lkKTsKK3N0cnVjdCBnc21fdHJhbnMgKnRyYW5zX2ZpbmRfYnlfY2FsbHJlZihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJdV9pbnQzMl90IGNhbGxyZWYpOworCitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19hbGxvYyhzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCSAgICAgIHVfaW50OF90IHByb3RvY29sLCB1X2ludDhfdCB0cmFuc19pZCwKKwkJCSAgICAgIHVfaW50MzJfdCBjYWxscmVmKTsKK3ZvaWQgdHJhbnNfZnJlZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucyk7CisKK2ludCB0cmFuc19hc3NpZ25fdHJhbnNfaWQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgIHVfaW50OF90IHByb3RvY29sLCB1X2ludDhfdCB0aV9mbGFnKTsKKworLyogdXBkYXRlIGFsbCB0cmFuc2FjdGlvbnMgdG8gdXNlIGEgZGlmZmVyZW50IExDSEFOLCBlLmcuCisgKiBhZnRlciBoYW5kb3ZlciBoYXMgc3VjY2VlZGVkICovCitpbnQgdHJhbnNfbGNoYW5fY2hhbmdlKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uX29sZCwKKwkJICAgICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uX25ldyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfZnJhbWUuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfZnJhbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTIzZDRhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdHJhdV9mcmFtZS5oCkBAIC0wLDAgKzEsNjUgQEAKKyNpZm5kZWYgX1RSQVVfRlJBTUVfSAorI2RlZmluZSBfVFJBVV9GUkFNRV9ICisvKiBUUkFVIGZyYW1lIGhhbmRsaW5nIGFjY29yZGluZyB0byBHU00gVFMgMDguNjAgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIDIxIGZvciBGUi9FRlIsIDI1IGZvciBBTVIsIDE1IGZvciBPTSwgMTUgZm9yIGRhdGEsIDEzIGZvciBFLWRhdGEsIDIxIGlkbGUgKi8KKyNkZWZpbmUgTUFYX0NfQklUUwkyNQorLyogMjYwIGZvciBGUi9FRlIsIDI1NiBmb3IgQU1SLCAyNjQgZm9yIE9NLCAyODggZm9yIEUtZGF0YSAqLworI2RlZmluZSBNQVhfRF9CSVRTCTI4OAorLyogZm9yIGFsbCBzcGVlY2ggZnJhbWVzICovCisjZGVmaW5lIE1BWF9UX0JJVFMJNAorLyogZm9yIE9NICovCisjZGVmaW5lIE1BWF9TX0JJVFMJNgorLyogZm9yIEUtZGF0YSAqLworI2RlZmluZSBNQVhfTV9CSVRTCTIKKworc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSB7CisJdV9pbnQ4X3QgY19iaXRzW01BWF9DX0JJVFNdOworCXVfaW50OF90IGRfYml0c1tNQVhfRF9CSVRTXTsKKwl1X2ludDhfdCB0X2JpdHNbTUFYX1RfQklUU107CisJdV9pbnQ4X3Qgc19iaXRzW01BWF9TX0JJVFNdOworCXVfaW50OF90IG1fYml0c1tNQVhfTV9CSVRTXTsKK307CisKKyNkZWZpbmUgVFJBVV9GVF9GUl9VUAkJMHgwMgkvKiAwIDAgMCAxIDAgLSAzLjUuMS4xLjEgKi8KKyNkZWZpbmUgVFJBVV9GVF9GUl9ET1dOCQkweDFjCS8qIDEgMSAxIDAgMCAtIDMuNS4xLjEuMSAqLworI2RlZmluZSBUUkFVX0ZUX0VGUgkJMHgxYQkvKiAxIDEgMCAxIDAgLSAzLjUuMS4xLjEgKi8KKyNkZWZpbmUgVFJBVV9GVF9BTVIJCTB4MDYJLyogMCAwIDEgMSAwIC0gMy41LjEuMiAqLworI2RlZmluZSBUUkFVX0ZUX09NX1VQCQkweDA3CS8qIDAgMCAxIDAgMSAtIDMuNS4yICovCisjZGVmaW5lIFRSQVVfRlRfT01fRE9XTgkJMHgxYgkvKiAxIDEgMCAxIDEgLSAzLjUuMiAqLworI2RlZmluZSBUUkFVX0ZUX0RBVEFfVVAJCTB4MDgJLyogMCAxIDAgMCAwIC0gMy41LjMgKi8KKyNkZWZpbmUgVFJBVV9GVF9EQVRBX0RPV04JMHgxNgkvKiAxIDAgMSAxIDAgLSAzLjUuMyAqLworI2RlZmluZSBUUkFVX0ZUX0QxNDVfU1lOQwkweDE0CS8qIDEgMCAxIDAgMCAtIDMuNS4zICovCisjZGVmaW5lIFRSQVVfRlRfRURBVEEJCTB4MWYJLyogMSAxIDEgMSAxIC0gMy41LjQgKi8KKyNkZWZpbmUgVFJBVV9GVF9JRExFX1VQCQkweDEwCS8qIDEgMCAwIDAgMCAtIDMuNS41ICovCisjZGVmaW5lIFRSQVVfRlRfSURMRV9ET1dOCTB4MGUJLyogMCAxIDEgMSAwIC0gMy41LjUgKi8KKworCitpbnQgZGVjb2RlX3RyYXVfZnJhbWUoc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSAqZnIsIGNvbnN0IHVfaW50OF90ICp0cmF1X2JpdHMpOworaW50IGVuY29kZV90cmF1X2ZyYW1lKHVfaW50OF90ICp0cmF1X2JpdHMsIGNvbnN0IHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyKTsKK2ludCB0cmF1X2ZyYW1lX3VwMmRvd24oc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSAqZnIpOwordV9pbnQ4X3QgKnRyYXVfaWRsZV9mcmFtZSh2b2lkKTsKKworCisjZW5kaWYgLyogX1RSQVVfRlJBTUVfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdHJhdV9tdXguaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlYjcwOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfbXV4LmgKQEAgLTAsMCArMSw0OSBAQAorLyogU2ltcGxlIFRSQVUgZnJhbWUgcmVmbGVjdG9yIHRvIHJvdXRlIHZvaWNlIGNhbGxzICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworLyogVGhlICJUUkFVIG11eCBtYXAiIGRlZmluZXMgd2hpY2ggcGFydGljdWxhciAxNmtiaXQgc3ViLXNsb3QgKGluIHdoaWNoIEUxCisgKiB0aW1lc2xvdCBvbiB3aGljaCBFMSBpbnRlcmZhY2UpIHNob3VsZCBiZSBkaXJlY3RseSBtdXhlZCB0byB3aGljaCBvdGhlciAKKyAqIHN1Yi1zbG90LiAgRW50cmllcyBpbiB0aGUgbXV4IG1hcCBhcmUgYWx3YXlzIGJpLWRpcmVjdGlvbmFsLiAKKyAqCisgKiBUaGUgaWRlYSBvZiBhbGwgdGhpcyBpcyB0byBkaXJlY3RseSBzd2l0Y2ggdm9pY2UgY2hhbm5lbHMgaW4gdGhlIEJTQworICogZnJvbSBvbmUgcGhvbmUgdG8gYW5vdGhlci4gIFdlIGRvIHRoaXMgcmlnaHQgbm93IHNpbmNlIHdlIGRvbid0IHN1cHBvcnQKKyAqIGFueSBleHRlcm5hbCBpbnRlcmZhY2UgZm9yIHZvaWNlIGNoYW5uZWxzLCBhbmQgaW4gdGhlIGZ1dHVyZSBhcyBhbgorICogb3B0aW1pemF0aW9uIHRvIHJvdXRpbmcgdGhlbSBleHRlcm5hbGx5LgorICovCisKKy8qIG1hcCBhIFRSQVUgbXV4IG1hcCBlbnRyeSAqLworaW50IHRyYXVfbXV4X21hcChjb25zdCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKnNyYywKKwkJIGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZHN0KTsKK2ludCB0cmF1X211eF9tYXBfbGNoYW4oY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqc3JjLAkKKwkJCWNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmRzdCk7CisKKy8qIHVubWFwIGEgVFJBVSBtdXggbWFwIGVudHJ5ICovCitpbnQgdHJhdV9tdXhfdW5tYXAoY29uc3Qgc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcywgdV9pbnQzMl90IGNhbGxyZWYpOworCisvKiB3ZSBnZXQgY2FsbGVkIGJ5IHN1YmNoYW5fZGVtdXggKi8KK2ludCB0cmF1X211eF9pbnB1dChzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKnNyY19lMV9zcywKKwkJICAgY29uc3QgdV9pbnQ4X3QgKnRyYXVfYml0cywgaW50IG51bV9iaXRzKTsKKworLyogYWRkIGEgdHJhdSByZWNlaXZlciAqLworaW50IHRyYXVfcmVjdl9sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQzMl90IGNhbGxyZWYpOworCisvKiBzZW5kIHRyYXUgZnJvbSBhcHBsaWNhdGlvbiAqLworaW50IHRyYXVfc2VuZF9mcmFtZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IGdzbV9kYXRhX2ZyYW1lICpmcmFtZSk7CmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy91c3NkLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy91c3NkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNlYTMxYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Vzc2QuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9VU1NEX0gKKyNkZWZpbmUgX1VTU0RfSAorCisvKiBIYW5kbGVyIGZ1bmN0aW9uIGZvciBtb2JpbGUtb3JpZ2luYXRlZCBVU1NEIG1lc3NhZ2VzICovCisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisKK2ludCBoYW5kbGVfcmN2X3Vzc2Qoc3RydWN0IG1zZ2IgKm1zZyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3NjY3AvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzhhNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3NjY3AvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyIEBACitzY2NwX0hFQURFUlMgPSBzY2NwX3R5cGVzLmggc2NjcC5oCitzY2NwZGlyID0gJChpbmNsdWRlZGlyKS9zY2NwCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwLmggYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzNDc5YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9zY2NwL3NjY3AuaApAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIFNDQ1AgbWFuYWdlbWVudCBjb2RlCisgKgorICogKEMpIDIwMDksIDIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFNDQ1BfSAorI2RlZmluZSBTQ0NQX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAic2NjcF90eXBlcy5oIgorCitzdHJ1Y3QgbXNnYjsKK3N0cnVjdCBzY2NwX3N5c3RlbTsKKworZW51bSB7CisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX05PTkUsCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFUVVFU1QsCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX0NPTkZJUk0sCisJU0NDUF9DT05ORUNUSU9OX1NUQVRFX0VTVEFCTElTSEVELAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFLAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFLAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUZVU0VELAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9TRVRVUF9FUlJPUiwKK307CisKK3N0cnVjdCBzb2NrYWRkcl9zY2NwIHsKKwlzYV9mYW1pbHlfdAlzY2NwX2ZhbWlseTsJCS8qIEFGX1NDQ1AgaW4gdGhlIGZ1dHVyZT8/PyAqLworCXVfaW50OF90CXNjY3Bfc3NuOwkJLyogc3Vic3N5c3RlbSBudW1iZXIgZm9yIHJvdXRpbmcgKi8KKworCS8qIFRPRE8gZmlsbCBpbiBhZGRyZXNzIGluZGljYXRvci4uLiBpZiB0aGF0IGlzIGV2ZXIgbmVlZGVkICovCisKKwkvKiBub3Qgc3VyZSBhYm91dCB0aGVzZSAqLworCS8qIHVfaW50OF90ICAgIHNjY3BfY2xhc3M7ICovCit9OworCisvKgorICogcGFyc2VkIHN0cnVjdHVyZSBvZiBhbiBhZGRyZXNzCisgKi8KK3N0cnVjdCBzY2NwX2FkZHJlc3MgeworCXN0cnVjdCBzY2NwX2NhbGxlZF9wYXJ0eV9hZGRyZXNzICAgIGFkZHJlc3M7CisJdV9pbnQ4X3QJCQkgICAgc3NuOworCXVfaW50OF90CQkJICAgIHBvaVsyXTsKK307CisKK3N0cnVjdCBzY2NwX29wdGlvbmFsX2RhdGEgeworCXVfaW50OF90CQkJICAgIGRhdGFfbGVuOworCXVfaW50OF90CQkJICAgIGRhdGFfc3RhcnQ7Cit9OworCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uIHsKKwkvKiBwdWJsaWMgKi8KKwl2b2lkICpkYXRhX2N0eDsKKwl2b2lkICgqZGF0YV9jYikoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgc3RydWN0IG1zZ2IgKm1zZywgdW5zaWduZWQgaW50IGxlbik7CisKKwl2b2lkICpzdGF0ZV9jdHg7CisJdm9pZCAoKnN0YXRlX2NiKShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICosIGludCBvbGRfc3RhdGUpOworCisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJaW50IGNvbm5lY3Rpb25fc3RhdGU7CisKKwkvKiBwcml2YXRlICovCisJLyogbGlzdCBvZiBhY3RpdmUgY29ubmVjdGlvbnMgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBzY2NwX3N5c3RlbSAqc3lzdGVtOworCWludCBpbmNvbWluZzsKK307CisKKy8qKgorICogc3lzdGVtIGZ1bmN0aW9uYWxpdHkgdG8gaW1wbGVtZW50IG9uIHRvcCBvZiBhbnkgb3RoZXIgdHJhbnNwb3J0IGxheWVyOgorICogICBjYWxsIHNjY3Bfc3lzdGVtX2luY29taW5nIGZvciBpbmNvbWluZyBkYXRhIChmcm9tIHRoZSBuZXR3b3JrKQorICogICBzY2NwIHdpbGwgY2FsbCBvdXRnb2luZyB3aGVuZXZlciBvdXRnb2luZyBkYXRhIGV4aXN0cworICovCitpbnQgc2NjcF9zeXN0ZW1faW5pdChpbnQgKCpvdXRnb2luZykoc3RydWN0IG1zZ2IgKmRhdGEsIHZvaWQgKmN0eCksIHZvaWQgKmNvbnRleHQpOworaW50IHNjY3Bfc3lzdGVtX2luY29taW5nKHN0cnVjdCBtc2diICpkYXRhKTsKKworLyoqCisgKiBTZW5kIGRhdGEgb24gYW4gZXhpc3RpbmcgY29ubmVjdGlvbgorICovCitpbnQgc2NjcF9jb25uZWN0aW9uX3dyaXRlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBtc2diICpkYXRhKTsKK2ludCBzY2NwX2Nvbm5lY3Rpb25fc2VuZF9pdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKK2ludCBzY2NwX2Nvbm5lY3Rpb25fY2xvc2Uoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IGNhdXNlKTsKK2ludCBzY2NwX2Nvbm5lY3Rpb25fZnJlZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKTsKKworLyoqCisgKiBDcmVhdGUgYSBuZXcgc29ja2V0LiBTZXQgeW91ciBjYWxsYmFja3MgYW5kIHRoZW4gY2FsbCBiaW5kIHRvIG9wZW4KKyAqIHRoZSBjb25uZWN0aW9uLgorICovCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpzY2NwX2Nvbm5lY3Rpb25fc29ja2V0KHZvaWQpOworCisvKioKKyAqIE9wZW4gdGhlIGNvbm5lY3Rpb24gYW5kIHNlbmQgYWRkaXRpb25hbCBkYXRhCisgKi8KK2ludCBzY2NwX2Nvbm5lY3Rpb25fY29ubmVjdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLAorCQkJICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzY2NwX2NhbGxlZCwKKwkJCSAgICBzdHJ1Y3QgbXNnYiAqZGF0YSk7CisKKy8qKgorICogbW9zdGx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuIFNldCB0aGUgYWNjZXB0IGNhbGxiYWNrLgorICogVE9ETzogYWRkIHRydWUgcm91dGluZyBpbmZvcm1hdGlvbi4uLiBpbiBhbmFsb2d5IHRvIHNvY2tldCwgYmluZCwgYWNjZXB0CisgKi8KK2ludCBzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzb2NrLAorCQkJCSBpbnQgKCphY2NlcHRfY2IpKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHZvaWQgKmRhdGEpLAorCQkJCSB2b2lkICp1c2VyX2RhdGEpOworCisvKioKKyAqIFNlbmQgZGF0YSBpbiB0ZXJtcyBvZiB1bml0IGRhdGEuIEEgZml4ZWQgYWRkcmVzcyBpbmRpY2F0b3Igd2lsbCBiZSB1c2VkLgorICovCitpbnQgc2NjcF93cml0ZShzdHJ1Y3QgbXNnYiAqZGF0YSwKKwkgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNvY2tfc2VuZGVyLAorCSAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqc29ja190YXJnZXQsIGludCBjbGFzcyk7CitpbnQgc2NjcF9zZXRfcmVhZChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqc29jaywKKwkJICBpbnQgKCpyZWFkX2NiKShzdHJ1Y3QgbXNnYiAqbXNnYiwgdW5zaWduZWQgaW50LCB2b2lkICp1c2VyX2RhdGEpLAorCQkgIHZvaWQgKnVzZXJfZGF0YSk7CisKKy8qIGdlbmVyaWMgc29jayBhZGRyZXNzZXMgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCBzY2NwX3Nzbl9ic3NhcDsKKworLyogaGVscGVycyAqLwordV9pbnQzMl90IHNjY3Bfc3JjX3JlZl90b19pbnQoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSAqcmVmKTsKK3N0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2Ugc2NjcF9zcmNfcmVmX2Zyb21faW50KHVfaW50MzJfdCk7CisKKy8qKgorICogQmVsb3cgdGhpcyBhcmUgaGVscGVyIGZ1bmN0aW9ucyBhbmQgc3RydWN0cyBmb3IgcGFyc2luZyBTQ0NQIG1lc3NhZ2VzCisgKi8KK3N0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCB7CisJc3RydWN0IHNjY3BfYWRkcmVzcyBjYWxsZWQ7CisJc3RydWN0IHNjY3BfYWRkcmVzcyBjYWxsaW5nOworCisJLyogcG9pbnQgdG8gdGhlIG1zZyBwYWNrZXQgKi8KKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlICpzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKworCS8qIGRhdGEgcG9pbnRlciAqLworCWludCBkYXRhX2xlbjsKK307CisKKy8qCisgKiBoZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgbmF0IGNvZGUKKyAqLworaW50IHNjY3BfZGV0ZXJtaW5lX21zZ190eXBlKHN0cnVjdCBtc2diICptc2cpOworaW50IHNjY3BfcGFyc2VfaGVhZGVyKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwX3R5cGVzLmggYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJmZGE5NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9zY2NwL3NjY3BfdHlwZXMuaApAQCAtMCwwICsxLDQxNCBAQAorLyoKKyAqIElUVSBRLjcxMyBkZWZpbmVkIHR5cGVzIGZvciBTQ0NQCisgKgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFNDQ1BfVFlQRVNfSAorI2RlZmluZSBTQ0NQX1RZUEVTX0gKKworI2luY2x1ZGUgPGVuZGlhbi5oPgorCisvKiBUYWJsZSAxL1EuNzEzIC0gU0NDUCBtZXNzYWdlIHR5cGVzICovCitlbnVtIHNjY3BfbWVzc2FnZV90eXBlcyB7CisJU0NDUF9NU0dfVFlQRV9DUgk9IDEsCisJU0NDUF9NU0dfVFlQRV9DQwk9IDIsCisJU0NDUF9NU0dfVFlQRV9DUkVGCT0gMywKKwlTQ0NQX01TR19UWVBFX1JMU0QJPSA0LAorCVNDQ1BfTVNHX1RZUEVfUkxDCT0gNSwKKwlTQ0NQX01TR19UWVBFX0RUMQk9IDYsCisJU0NDUF9NU0dfVFlQRV9EVDIJPSA3LAorCVNDQ1BfTVNHX1RZUEVfQUsJPSA4LAorCVNDQ1BfTVNHX1RZUEVfVURUCT0gOSwKKwlTQ0NQX01TR19UWVBFX1VEVFMJPSAxMCwKKwlTQ0NQX01TR19UWVBFX0VECT0gMTEsCisJU0NDUF9NU0dfVFlQRV9FQQk9IDEyLAorCVNDQ1BfTVNHX1RZUEVfUlNSCT0gMTMsCisJU0NDUF9NU0dfVFlQRV9SU0MJPSAxNCwKKwlTQ0NQX01TR19UWVBFX0VSUgk9IDE1LAorCVNDQ1BfTVNHX1RZUEVfSVQJPSAxNiwKKwlTQ0NQX01TR19UWVBFX1hVRFQJPSAxNywKKwlTQ0NQX01TR19UWVBFX1hVRFRTCT0gMTgsCisJU0NDUF9NU0dfVFlQRV9MVURUCT0gMTksCisJU0NDUF9NU0dfVFlQRV9MVURUUwk9IDIwCit9OworCisvKiBUYWJsZSAyL1EuNzEzIC0gU0NDUCBwYXJhbWV0ZXIgbmFtZSBjb2RlcyAqLworZW51bSBzY2NwX3BhcmFtZXRlcl9uYW1lX2NvZGVzIHsKKwlTQ0NQX1BOQ19FTkRfT0ZfT1BUSU9OQUwJCT0gMCwKKwlTQ0NQX1BOQ19ERVNUSU5BVElPTl9MT0NBTF9SRUZFUkVOQ0UJPSAxLAorCVNDQ1BfUE5DX1NPVVJDRV9MT0NBTF9SRUZFUkVOQ0UJCT0gMiwKKwlTQ0NQX1BOQ19DQUxMRURfUEFSVFlfQUREUkVTUwkJPSAzLAorCVNDQ1BfUE5DX0NBTExJTkdfUEFSVFlfQUREUkVTUwkJPSA0LAorCVNDQ1BfUE5DX1BST1RPQ09MX0NMQVNTCQkJPSA1LAorCVNDQ1BfUE5DX1NFR01FTlRJTkcJCQk9IDYsCisJU0NDUF9QTkNfUkVDRUlWRV9TRVFfTlVNQkVSCQk9IDcsCisJU0NDUF9QTkNfU0VRVUVOQ0lORwkJCT0gOCwKKwlTQ0NQX1BOQ19DUkVESVQJCQkJPSA5LAorCVNDQ1BfUE5DX1JFTEVBU0VfQ0FVU0UJCQk9IDEwLAorCVNDQ1BfUE5DX1JFVFVSTl9DQVVTRQkJCT0gMTEsCisJU0NDUF9QTkNfUkVTRVRfQ0FVU0UJCQk9IDEyLAorCVNDQ1BfUE5DX0VSUk9SX0NBVVNFCQkJPSAxMywKKwlTQ0NQX1BOQ19SRUZVU0FMX0NBVVNFCQkJPSAxNCwKKwlTQ0NQX1BOQ19EQVRBCQkJCT0gMTUsCisJU0NDUF9QTkNfU0VHTUVOVEFUSU9OCQkJPSAxNiwKKwlTQ0NQX1BOQ19IT1BfQ09VTlRFUgkJCT0gMTcsCisJU0NDUF9QTkNfSU1QT1JUQU5DRQkJCT0gMTgsCisJU0NDUF9QTkNfTE9OR19EQVRBCQkJPSAxOSwKK307CisKKy8qIEZpZ3VyZSAzL1EuNzEzIENhbGxlZC9jYWxsaW5nIHBhcnR5IGFkZHJlc3MgKi8KK2VudW0geworCVNDQ1BfVElUTEVfSU5EX05PTkUJCQk9IDAsCisJU0NDUF9USVRMRV9JTkRfTkFUVVJFX09OTFkJCT0gMSwKKwlTQ0NQX1RJVExFX0lORF9UUkFOU0xBVElPTl9PTkxZCQk9IDIsCisJU0NDUF9USVRMRV9JTkRfVFJBTlNfTlVNX0VOQwkJPSAzLAorCVNDQ1BfVElUTEVfSU5EX1RSQU5TX05VTV9FTkNfTkFUVVJFCT0gNCwKK307CisKK2VudW0geworCVNDQ1BfQ0FMTF9ST1VURV9PTl9TU04JCQk9IDEsCisJU0NDUF9DQUxMX1JPVVRFX09OX0dUCQkJPSAwLAorfTsKKworc3RydWN0IHNjY3BfY2FsbGVkX3BhcnR5X2FkZHJlc3MgeworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1X2ludDhfdAlwb2ludF9jb2RlX2luZGljYXRvciA6IDEsCisJCQlzc25faW5kaWNhdG9yCSAgICAgOiAxLAorCQkJZ2xvYmFsX3RpdGxlX2luZGljYXRvciA6IDQsCisJCQlyb3V0aW5nX2luZGljYXRvciAgICA6IDEsCisJCQlyZXNlcnZlZAkgICAgIDogMTsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1X2ludDhfdAlyZXNlcnZlZAkgICAgIDogMSwKKwkJCXJvdXRpbmdfaW5kaWNhdG9yICAgIDogMSwKKwkJCWdsb2JhbF90aXRsZV9pbmRpY2F0b3IgOiA0LAorCQkJc3NuX2luZGljYXRvcgkgICAgIDogMSwKKwkJCXBvaW50X2NvZGVfaW5kaWNhdG9yIDogMTsKKyNlbmRpZgorCXVfaW50OF90CWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBpbmRpY2F0b3IgaW5kaWNhdGVzIHByZXNlbmNlIGluIHRoZSBhYm92ZSBvcmRlciAqLworCisvKiBGaWd1cmUgNi9RLjcxMyAqLworc3RydWN0IHNjY3Bfc2lnbmFsbGluZ19wb2ludF9jb2RlIHsKKwl1X2ludDhfdAlsc2I7CisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCXVfaW50OF90CW1zYiA6IDYsCisJCQlyZXNlcnZlZCA6IDI7CisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdV9pbnQ4X3QJcmVzZXJ2ZWQgOiAyLAorCQkJbXNiIDogNjsKKyNlbmRpZgorfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogU1NOID09IHN1YnN5c3RlbSBudW1iZXIgKi8KK2VudW0gc2NjcF9zdWJzeXN0ZW1fbnVtYmVyIHsKKwlTQ0NQX1NTTl9OT1RfS05PV05fT1JfVVNFRAkgICAgPSAwLAorCVNDQ1BfU1NOX01BTkFHRU1FTlQJCSAgICA9IDEsCisJU0NDUF9TU05fUkVTRVJWRURfSVRVCQkgICAgPSAyLAorCVNDQ1BfU1NOX0lTRE5fVVNFUl9QQVJUCQkgICAgPSAzLAorCVNDQ1BfU1NOX09NQVAJCQkgICAgPSA0LCAvKiBvcGVyYXRpb24sIG1haW50IGFuZCBhZG1pbmlzdHJhdGlvbiBwYXJ0ICovCisJU0NDUF9TU05fTUFQCQkJICAgID0gNSwgLyogbW9iaWxlIGFwcGxpY2F0aW9uIHBhcnQgKi8KKwlTQ0NQX1NTTl9ITFIJCQkgICAgPSA2LAorCVNDQ1BfU1NOX1ZMUgkJCSAgICA9IDcsCisJU0NDUF9TU05fTVNDCQkJICAgID0gOCwKKwlTQ0NQX1NTTl9FSUMJCQkgICAgPSA5LCAvKiBlcXVpcGVudCBpZGVudGlmaWVyIGNlbnRyZSAqLworCVNDQ1BfU1NOX0FVQwkJCSAgICA9IDEwLCAvKiBhdXRoZW50aWNhdGlvbiBjZW50cmUgKi8KKwlTQ0NQX1NTTl9JU0ROX1NVUFBMX1NFUlZJQ0VTCSAgICA9IDExLAorCVNDQ1BfU1NOX1JFU0VSVkVEX0lOVEwJCSAgICA9IDEyLAorCVNDQ1BfU1NOX0lTRE5fRURHRV9UT19FREdFCSAgICA9IDEzLAorCVNDQ1BfU1NOX1RDX1RFU1RfUkVTUE9OREVSCSAgICA9IDE0LAorCisJLyogRnJvbSBHU00gMDMuMDMgOC4yICovCisJU0NDUF9TU05fQlNTQVAJCQkgICAgPSAyNTQsCisJU0NDUF9TU05fQlNTT00JCQkgICAgPSAyNTMsCit9OworCisvKiBRLjcxMywgMy40LjIuMyAqLworZW51bSB7CisJU0NDUF9OQUlfVU5LTk9XTgkJICAgID0gMCwKKwlTQ0NQX05BSV9TVUJTQ1JJQkVSX05VTUJFUgkgICAgPSAxLAorCVNDQ1BfTkFJX1JFU0VSVkVEX05BVElPTkFMCSAgICA9IDIsCisJU0NDUF9OQUlfTkFUSU9OQUxfU0lHTklGSUNBTlQJICAgID0gMywKKwlTQ0NQX05BSV9JTlRFUk5BVElPTkFMCQkgICAgPSA0LAorfTsKKworc3RydWN0IHNjY3BfZ2xvYmFsX3RpdGxlIHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdV9pbnQ4X3QJbmF0dXJlX29mX2FkZHJfaW5kIDogNywKKwkJCW9kZF9ldmVuIDogMTsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1X2ludDhfdAlvZGRfZXZlbiA6IDEsCisJCQluYXR1cmVfb2ZfYWRkcl9pbmQgOiA3OworI2VuZGlmCisJdV9pbnQ4X3QJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFEuNzEzLCAzLjMgKi8KK3N0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgeworCXVfaW50OF90ICAgIG9jdGV0MTsKKwl1X2ludDhfdCAgICBvY3RldDI7CisJdV9pbnQ4X3QgICAgb2N0ZXQzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogUS43MTQsIDMuNiAqLworZW51bSBzY2NwX3Byb3RvY29sX2NsYXNzIHsKKwlTQ0NQX1BST1RPQ09MX0NMQVNTXzAJCSAgICA9IDAsCisJU0NDUF9QUk9UT0NPTF9DTEFTU18xCQkgICAgPSAxLAorCVNDQ1BfUFJPVE9DT0xfQ0xBU1NfMgkJICAgID0gMiwKKwlTQ0NQX1BST1RPQ09MX0NMQVNTXzMJCSAgICA9IDMsCit9OworCisvKiBiaXRzIDUtOCB3aGVuIGNsYXNzMCwgY2xhc3MxIGlzIHVzZWQgKi8KK2VudW0gc2NjcF9wcm90b2NvbF9vcHRpb25zIHsKKwlTQ0NQX1BST1RPQ09MX05PX1NQRUNJQUwJICAgID0gMCwKKwlTQ0NQX1BST1RPQ09MX1JFVFVSTl9NRVNTQUdFCSAgICA9IDgsCit9OworCitlbnVtIHNjY3BfcmVsZWFzZV9jYXVzZSB7CisJU0NDUF9SRUxFQVNFX0NBVVNFX0VORF9VU0VSX09SSUdJTkFURUQJICAgID0gMCwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfRU5EX1VTRVJfQ09OR0VTVElPTgkgICAgPSAxLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9FTkRfVVNFUl9GQUlMVVJFCSAgICA9IDIsCisJU0NDUF9SRUxFQVNFX0NBVVNFX1NDQ1BfVVNFUl9PUklHSU5BVEVECSAgICA9IDMsCisJU0NDUF9SRUxFQVNFX0NBVVNFX1JFTU9URV9QUk9DRURVUkVfRVJST1IgICA9IDQsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0lOQ09OU0lTVEVOVF9DT05OX0RBVEEgICA9IDUsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0FDQ0VTU19GQUlMVVJFCSAgICA9IDYsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0FDQ0VTU19DT05HRVNUSU9OCSAgICA9IDcsCisJU0NDUF9SRUxFQVNFX0NBVVNFX1NVQlNZU1RFTV9GQUlMVVJFCSAgICA9IDgsCisJU0NDUF9SRUxFQVNFX0NBVVNFX1NVQlNZU1RFTV9DT05HRVNUSU9OCSAgICA9IDksCisJU0NDUF9SRUxFQVNFX0NBVVNFX01UUF9GQUlMVVJFCQkgICAgPSAxMCwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfTkVUV09SS19DT05HRVNUSU9OCSAgICA9IDExLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9FWFBJUkFUSU9OX1JFU0VUCSAgICA9IDEyLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9FWFBJUkFUSU9OX0lOQUNUSVZFCSAgICA9IDEzLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9SRVNFUlZFRAkJICAgID0gMTQsCisJU0NDUF9SRUxFQVNFX0NBVVNFX1VOUVVBTElGSUVECQkgICAgPSAxNSwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfU0NDUF9GQUlMVVJFCQkgICAgPSAxNiwKK307CisKK2VudW0gc2NjcF9yZXR1cm5fY2F1c2UgeworCVNDQ1BfUkVUVVJOX0NBVVNFX05PX1RSQU5TTEFUSU9OX05BVFVSRQkgICAgPSAwLAorCVNDQ1BfUkVUVVJOX0NBVVNFX05PX1RSQU5TTEFUSU9OCSAgICA9IDEsCisJU0NDUF9SRVRVUk5fQ0FVU0VfU1VCU1lTVEVNX0NPTkdFU1RJT04JICAgID0gMiwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9TVUJTWVNURU1fRkFJTFVSRQkgICAgPSAzLAorCVNDQ1BfUkVUVVJOX0NBVVNFX1VORVFVSVBQRURfVVNFUgkgICAgPSA0LAorCVNDQ1BfUkVUVVJOX0NBVVNFX01UUF9GQUlMVVJFCQkgICAgPSA1LAorCVNDQ1BfUkVUVVJOX0NBVVNFX05FVFdPUktfQ09OR0VTVElPTgkgICAgPSA2LAorCVNDQ1BfUkVUVVJOX0NBVVNFX1VOUVVBTElGSUVECQkgICAgPSA3LAorCVNDQ1BfUkVUVVJOX0NBVVNFX0VSUk9SX0lOX01TR19UUkFOU1BPUlQgICAgPSA4LAorCVNDQ1BfUkVUVVJOX0NBVVNFX0VSUk9SX0lOX0xPQ0FMX1BST0NFU1NJTkcgPSA5LAorCVNDQ1BfUkVUVVJOX0NBVVNFX0RFU1RfQ0FOTk9UX1BFUkZPUk1fUkVBU1NFTUJMWSA9IDEwLAorCVNDQ1BfUkVUVVJOX0NBVVNFX1NDQ1BfRkFJTFVSRQkJICAgID0gMTEsCisJU0NDUF9SRVRVUk5fQ0FVU0VfSE9QX0NPVU5URVJfVklPTEFUSU9OCSAgICA9IDEyLAorCVNDQ1BfUkVUVVJOX0NBVVNFX1NFR01FTlRBVElPTl9OT1RfU1VQUE9SVEVEPSAxMywKKwlTQ0NQX1JFVFVSTl9DQVVTRV9TRUdNRU5UQVRJT05fRkFPTFVSRQkgICAgPSAxNAorfTsKKworZW51bSBzY2NwX3Jlc2V0X2NhdXNlIHsKKwlTQ0NQX1JFU0VUX0NBVVNFX0VORF9VU0VSX09SSUdJTkFURUQJICAgID0gMCwKKwlTQ0NQX1JFU0VUX0NBVVNFX1NDQ1BfVVNFUl9PUklHSU5BVEVECSAgICA9IDEsCisJU0NDUF9SRVNFVF9DQVVTRV9NU0dfT1VUX09GX09SREVSX1BTCSAgICA9IDIsCisJU0NDUF9SRVNFVF9DQVVTRV9NU0dfT1VUX09GX09SREVSX1BSCSAgICA9IDMsCisJU0NDUF9SRVNFVF9DQVVTRV9SUENfT1VUX09GX1dJTkRPVwkgICAgPSA0LAorCVNDQ1BfUkVTRVRfQ0FVU0VfUlBDX0lOQ09SUkVDVF9QUwkgICAgPSA1LAorCVNDQ1BfUkVTRVRfQ0FVU0VfUlBDX0dFTkVSQUwJCSAgICA9IDYsCisJU0NDUF9SRVNFVF9DQVVTRV9SRU1PVEVfRU5EX1VTRVJfT1BFUkFUSU9OQUw9IDcsCisJU0NDUF9SRVNFVF9DQVVTRV9ORVRXT1JLX09QRVJBVElPTkFMCSAgICA9IDgsCisJU0NDUF9SRVNFVF9DQVVTRV9BQ0NFU1NfT1BFUkFUSU9OQUwJICAgID0gOSwKKwlTQ0NQX1JFU0VUX0NBVVNFX05FVFdPUktfQ09OR0VTVElPTgkgICAgPSAxMCwKKwlTQ0NQX1JFU0VUX0NBVVNFX1JFU0VSVkVECQkgICAgPSAxMSwKK307CisKK2VudW0gc2NjcF9lcnJvcl9jYXVzZSB7CisJU0NDUF9FUlJPUl9MUk5fTUlTTUFUQ0hfVU5BU1NJR05FRAkgICAgPSAwLCAvKiBsb2NhbCByZWZlcmVuY2UgbnVtYmVyICovCisJU0NDUF9FUlJPUl9MUk5fTUlTTUFUQ0hfSU5DT05TSVNURU5UCSAgICA9IDEsCisJU0NDUF9FUlJPUl9QT0lOVF9DT0RFX01JU01BVENICQkgICAgPSAyLAorCVNDQ1BfRVJST1JfU0VSVklDRV9DTEFTU19NSVNNQVRDSAkgICAgPSAzLAorCVNDQ1BfRVJST1JfVU5RVUFMSUZJRUQJCQkgICAgPSA0LAorfTsKKworZW51bSBzY2NwX3JlZnVzYWxfY2F1c2UgeworCVNDQ1BfUkVGVVNBTF9FTkRfVVNFUl9PUklHSU5BVEVECSAgICA9IDAsCisJU0NDUF9SRUZVU0FMX0VORF9VU0VSX0NPTkdFU1RJT04JICAgID0gMSwKKwlTQ0NQX1JFRlVTQUxfRU5EX1VTRVJfRkFJTFVSRQkJICAgID0gMiwKKwlTQ0NQX1JFRlVTQUxfU0NDUF9VU0VSX09SSUdJTkFURUQJICAgID0gMywKKwlTQ0NQX1JFRlVTQUxfREVTVElOQVRJT05fQUREUkVTU19VS05PV04JICAgID0gNCwKKwlTQ0NQX1JFRlVTQUxfREVTVElOQVRJT05fSU5BQ0NFU1NJQkxFCSAgICA9IDUsCisJU0NDUF9SRUZVU0FMX05FVF9RT1NfTk9OX1RSQU5TSUVOVAkgICAgPSA2LAorCVNDQ1BfUkVGVVNBTF9ORVRfUU9TX1RSQU5TSUVOVAkJICAgID0gNywKKwlTQ0NQX1JFRlVTQUxfQUNDRVNTX0ZBSUxVUkUJCSAgICA9IDgsCisJU0NDUF9SRUZVU0FMX0FDQ0VTU19DT05HRVNUSU9OCQkgICAgPSA5LAorCVNDQ1BfUkVGVVNBTF9TVUJTWVNURU1fRkFJTFVSRQkJICAgID0gMTAsCisJU0NDUF9SRUZVU0FMX1NVQlNZVEVNX0NPTkdFU1RJT04JICAgID0gMTEsCisJU0NDUF9SRUZVU0FMX0VYUElSQVRJT04JCQkgICAgPSAxMiwKKwlTQ0NQX1JFRlVTQUxfSU5DT01QQVRJQkxFX1VTRVJfREFUQQkgICAgPSAxMywKKwlTQ0NQX1JFRlVTQUxfUkVTRVJWRUQJCQkgICAgPSAxNCwKKwlTQ0NQX1JFRlVTQUxfVU5RVUFMSUZJRUQJCSAgICA9IDE1LAorCVNDQ1BfUkVGVVNBTF9IT1BfQ09VTlRFUl9WSU9MQVRJT04JICAgID0gMTYsCisJU0NDUF9SRUZVU0FMX1NDQ1BfRkFJTFVSRQkJICAgID0gMTcsCisJU0NDUF9SRUZVU0FMX1VORVFVSVBQRURfVVNFUgkJICAgID0gMTgsCit9OworCisvKgorICogbWVzc2FnZXMuLi4gYXMgb2YgUS43MTMgQ2hhcHRlciA0CisgKi8KK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCXNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQlwcm90b19jbGFzczsKKworCisJLyogdmFyaWFibGUgKi8KKwl1X2ludDhfdAkJCXZhcmlhYmxlX2NhbGxlZDsKKyNpZiBWQVJJQUJMRQorCWNhbGxlZF9wYXJ0eV9hZGRyZXNzCisjZW5kaWYKKworCS8qIG9wdGlvbmFsICovCisJdV9pbnQ4X3QJCQlvcHRpb25hbF9zdGFydDsKKworI2lmIE9QVElPTkFMCisJY3JlZGl0IDMKKwljYWxsaW5ncGFydHkgdmFyIDQtbgorCWRhdGEgICAgICAgICAgICAzLTEzMAorCWhvcF9jb3VudGVyICAgICAzCisJaW1wb3J0YW5jZSAgICAgIDMKKwllbmRfb2Zfb3B0aW9uYWwgMQorI2VuZGlmCisKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX2NvbmZpcm0geworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXVfaW50OF90CQkJcHJvdG9fY2xhc3M7CisKKwkvKiBvcHRpb25hbCAqLworCXVfaW50OF90CQkJb3B0aW9uYWxfc3RhcnQ7CisKKwkvKiBvcHRpb25hbCAqLworI2lmIE9QVElPTkFMCisJY3JlZGl0IDMKKwljYWxsZWQgcGFydHkgNAorCWRhdGEgICAgICAgICAgICAzLTEzMAorCWltcG9ydGFuY2UgICAgICAzCisJZW5kX29mX29wdGlvbmFsIDEKKyNlbmRpZgorCisJdV9pbnQ4X3QJCQlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWZ1c2VkIHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXVfaW50OF90CQkJY2F1c2U7CisKKwkvKiBvcHRpb25hbCAqLworCXVfaW50OF90CQkJb3B0aW9uYWxfc3RhcnQ7CisKKwkvKiBvcHRpb25hbCAqLworI2lmIE9QVElPTkFMCisJY2FsbGVkIHBhcnR5IDQKKwlkYXRhICAgICAgICAgICAgMy0xMzAKKwlpbXBvcnRhbmNlICAgICAgMworCWVuZF9vZl9vcHRpb25hbCAxCisjZW5kaWYKKworCXVfaW50OF90CQkJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZWQgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXVfaW50OF90CQkJcmVsZWFzZV9jYXVzZTsKKworCisJLyogb3B0aW9uYWwgKi8KKwl1X2ludDhfdAkJCW9wdGlvbmFsX3N0YXJ0OworCisjaWYgT1BUSU9OQUwKKwlkYXRhICAgICAgICAgICAgMy0xMzAKKwlpbXBvcnRhbmNlICAgICAgMworCWVuZF9vZl9vcHRpb25hbCAxCisjZW5kaWYKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUgeworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCWRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCXNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2NjcF9kYXRhX2Zvcm0xIHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXVfaW50OF90CQkJc2VnbWVudGluZzsKKworCS8qIHZhcmlhYmxlICovCisJdV9pbnQ4X3QJCQl2YXJpYWJsZV9zdGFydDsKKworI2lmIFZBUklBQkxFCisJZGF0YSAyLTI1NjsKKyNlbmRpZgorCisJdV9pbnQ4X3QJCQlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCitzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhIHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXVfaW50OF90CQkJcHJvdG9fY2xhc3M7CisKKworCS8qIHZhcmlhYmxlICovCisJdV9pbnQ4X3QJCQl2YXJpYWJsZV9jYWxsZWQ7CisJdV9pbnQ4X3QJCQl2YXJpYWJsZV9jYWxsaW5nOworCXVfaW50OF90CQkJdmFyaWFibGVfZGF0YTsKKworI2lmIFZBUklBQkxFCisJY2FsbGVkIHBhcnR5IGFkZHJlc3MKKwljYWxsaW5nIHBhcnR5IGFkZHJlc3MKKyNlbmRpZgorCisJdV9pbnQ4X3QJCQlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfZGF0YV9pdCB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCWRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCXNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJdV9pbnQ4X3QJCQlwcm90b19jbGFzczsKKworCXVfaW50OF90CQkJc2VxdWVuY2luZ1syXTsKKwl1X2ludDhfdAkJCWNyZWRpdDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS9NYWtlZmlsZS5hbSBiL29wZW5ic2MvaW5jbHVkZS92dHkvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3NDc2NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS92dHkvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSBAQAorbm9pbnN0X0hFQURFUlMgPSBidWZmZXIuaCBjb21tYW5kLmggIHZlY3Rvci5oIHZ0eS5oCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvdnR5L2J1ZmZlci5oIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS9idWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTUxOTQwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS9idWZmZXIuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIEJ1ZmZlcmluZyB0byBvdXRwdXQgYW5kIGlucHV0LgorICogQ29weXJpZ2h0IChDKSAxOTk4IEt1bmloaXJvIElzaGlndXJvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorICoKKyAqIEdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfWkVCUkFfQlVGRkVSX0gKKyNkZWZpbmUgX1pFQlJBX0JVRkZFUl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogQ3JlYXRlIGEgbmV3IGJ1ZmZlci4gIE1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZCBpbiBjaHVua3Mgb2YgdGhlIGdpdmVuCisgICBzaXplLiAgSWYgdGhlIGFyZ3VtZW50IGlzIDAsIHRoZSBsaWJyYXJ5IHdpbGwgc3VwcGx5IGEgcmVhc29uYWJsZQorICAgZGVmYXVsdCBzaXplIHN1aXRhYmxlIGZvciBidWZmZXJpbmcgc29ja2V0IEkvTy4gKi8KK3N0cnVjdCBidWZmZXIgKmJ1ZmZlcl9uZXcoc2l6ZV90KTsKKworLyogRnJlZSBhbGwgZGF0YSBpbiB0aGUgYnVmZmVyLiAqLwordm9pZCBidWZmZXJfcmVzZXQoc3RydWN0IGJ1ZmZlciAqKTsKKworLyogVGhpcyBmdW5jdGlvbiBmaXJzdCBjYWxscyBidWZmZXJfcmVzZXQgdG8gcmVsZWFzZSBhbGwgYnVmZmVyZWQgZGF0YS4KKyAgIFRoZW4gaXQgZnJlZXMgdGhlIHN0cnVjdCBidWZmZXIgaXRzZWxmLiAqLwordm9pZCBidWZmZXJfZnJlZShzdHJ1Y3QgYnVmZmVyICopOworCisvKiBBZGQgdGhlIGdpdmVuIGRhdGEgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAqLworZXh0ZXJuIHZvaWQgYnVmZmVyX3B1dChzdHJ1Y3QgYnVmZmVyICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKKy8qIEFkZCBhIHNpbmdsZSBjaGFyYWN0ZXIgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAqLworZXh0ZXJuIHZvaWQgYnVmZmVyX3B1dGMoc3RydWN0IGJ1ZmZlciAqLCB1X2NoYXIpOworLyogQWRkIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gKi8KK2V4dGVybiB2b2lkIGJ1ZmZlcl9wdXRzdHIoc3RydWN0IGJ1ZmZlciAqLCBjb25zdCBjaGFyICopOworCisvKiBDb21iaW5lIGFsbCBhY2N1bXVsYXRlZCAoYW5kIHVuZmx1c2hlZCkgZGF0YSBpbnNpZGUgdGhlIGJ1ZmZlciBpbnRvIGEKKyAgIHNpbmdsZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgYWxsb2NhdGVkIHVzaW5nIFhNQUxMT0MoTVRZUEVfVE1QKS4gIE5vdGUKKyAgIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhbHRlciB0aGUgc3RhdGUgb2YgdGhlIGJ1ZmZlciwgc28gdGhlIGRhdGEKKyAgIGlzIHN0aWxsIGluc2lkZSB3YWl0aW5nIHRvIGJlIGZsdXNoZWQuICovCitjaGFyICpidWZmZXJfZ2V0c3RyKHN0cnVjdCBidWZmZXIgKik7CisKKy8qIFJldHVybnMgMSBpZiB0aGVyZSBpcyBubyBwZW5kaW5nIGRhdGEgaW4gdGhlIGJ1ZmZlci4gIE90aGVyd2lzZSByZXR1cm5zIDAuICovCitpbnQgYnVmZmVyX2VtcHR5KHN0cnVjdCBidWZmZXIgKik7CisKK3R5cGVkZWYgZW51bSB7CisJLyogQW4gSS9PIGVycm9yIG9jY3VycmVkLiAgVGhlIGJ1ZmZlciBzaG91bGQgYmUgZGVzdHJveWVkIGFuZCB0aGUKKwkgICBmaWxlIGRlc2NyaXB0b3Igc2hvdWxkIGJlIGNsb3NlZC4gKi8KKwlCVUZGRVJfRVJST1IgPSAtMSwKKworCS8qIFRoZSBkYXRhIHdhcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSwgYW5kIHRoZSBidWZmZXIgaXMgbm93IGVtcHR5CisJICAgKHRoZXJlIGlzIG5vIHBlbmRpbmcgZGF0YSB3YWl0aW5nIHRvIGJlIGZsdXNoZWQpLiAqLworCUJVRkZFUl9FTVBUWSA9IDAsCisKKwkvKiBUaGVyZSBpcyBwZW5kaW5nIGRhdGEgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nIHRvIGJlIGZsdXNoZWQuICBQbGVhc2UKKwkgICB0cnkgZmx1c2hpbmcgdGhlIGJ1ZmZlciB3aGVuIHNlbGVjdCBpbmRpY2F0ZXMgdGhhdCB0aGUgZmlsZSBkZXNjcmlwdG9yCisJICAgaXMgd3JpdGVhYmxlLiAqLworCUJVRkZFUl9QRU5ESU5HID0gMQorfSBidWZmZXJfc3RhdHVzX3Q7CisKKy8qIFRyeSB0byB3cml0ZSB0aGlzIGRhdGEgdG8gdGhlIGZpbGUgZGVzY3JpcHRvci4gIEFueSBkYXRhIHRoYXQgY2Fubm90CisgICBiZSB3cml0dGVuIGltbWVkaWF0ZWx5IGlzIGFkZGVkIHRvIHRoZSBidWZmZXIgcXVldWUuICovCitleHRlcm4gYnVmZmVyX3N0YXR1c190IGJ1ZmZlcl93cml0ZShzdHJ1Y3QgYnVmZmVyICosIGludCBmZCwKKwkJCQkgICAgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworCisvKiBUaGlzIGZ1bmN0aW9uIGF0dGVtcHRzIHRvIGZsdXNoIHNvbWUgKGJ1dCBwZXJoYXBzIG5vdCBhbGwpIG9mCisgICB0aGUgcXVldWVkIGRhdGEgdG8gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvci4gKi8KK2V4dGVybiBidWZmZXJfc3RhdHVzX3QgYnVmZmVyX2ZsdXNoX2F2YWlsYWJsZShzdHJ1Y3QgYnVmZmVyICosIGludCBmZCk7CisKKy8qIFRoZSBmb2xsb3dpbmcgMiBmdW5jdGlvbnMgKGJ1ZmZlcl9mbHVzaF9hbGwgYW5kIGJ1ZmZlcl9mbHVzaF93aW5kb3cpCisgICBhcmUgZm9yIHVzZSBpbiBsaWIvdnR5LmMgb25seS4gIFRoZXkgc2hvdWxkIG5vdCBiZSB1c2VkIGVsc2V3aGVyZS4gKi8KKworLyogQ2FsbCBidWZmZXJfZmx1c2hfYXZhaWxhYmxlIHJlcGVhdGVkbHkgdW50aWwgZWl0aGVyIGFsbCBkYXRhIGhhcyBiZWVuCisgICBmbHVzaGVkLCBvciBhbiBJL08gZXJyb3IgaGFzIGJlZW4gZW5jb3VudGVyZWQsIG9yIHRoZSBvcGVyYXRpb24gd291bGQKKyAgIGJsb2NrLiAqLworZXh0ZXJuIGJ1ZmZlcl9zdGF0dXNfdCBidWZmZXJfZmx1c2hfYWxsKHN0cnVjdCBidWZmZXIgKiwgaW50IGZkKTsKKworLyogQXR0ZW1wdCB0byB3cml0ZSBlbm91Z2ggZGF0YSB0byB0aGUgZ2l2ZW4gZmQgdG8gZmlsbCBhIHdpbmRvdyBvZiB0aGUKKyAgIGdpdmVuIHdpZHRoIGFuZCBoZWlnaHQgKGFuZCByZW1vdmUgdGhlIGRhdGEgd3JpdHRlbiBmcm9tIHRoZSBidWZmZXIpLgorCisgICBJZiAhbm9fbW9yZSwgdGhlbiBhIG1lc3NhZ2Ugc2F5aW5nICIgLS1Nb3JlLS0gIiBpcyBhcHBlbmRlZC4KKyAgIElmIGVyYXNlIGlzIHRydWUsIHRoZW4gZmlyc3Qgb3ZlcndyaXRlIHRoZSBwcmV2aW91cyAiIC0tTW9yZS0tICIgbWVzc2FnZQorICAgd2l0aCBzcGFjZXMuCisKKyAgIEFueSB3cml0ZSBlcnJvciAoaW5jbHVkaW5nIEVBR0FJTiBvciBFSU5UUikgd2lsbCBjYXVzZSB0aGlzIGZ1bmN0aW9uCisgICB0byByZXR1cm4gLTEgKGJlY2F1c2UgdGhlIGxvZ2ljIGZvciBoYW5kbGluZyB0aGUgZXJhc2UgYW5kIG1vcmUgZmVhdHVyZXMKKyAgIGlzIHRvbyBjb21wbGljYXRlZCB0byByZXRyeSB0aGUgd3JpdGUgbGF0ZXIpLgorKi8KK2V4dGVybiBidWZmZXJfc3RhdHVzX3QgYnVmZmVyX2ZsdXNoX3dpbmRvdyhzdHJ1Y3QgYnVmZmVyICosIGludCBmZCwgaW50IHdpZHRoLAorCQkJCQkgICBpbnQgaGVpZ2h0LCBpbnQgZXJhc2UsIGludCBub19tb3JlKTsKKworI2VuZGlmCQkJCS8qIF9aRUJSQV9CVUZGRVJfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS9jb21tYW5kLmggYi9vcGVuYnNjL2luY2x1ZGUvdnR5L2NvbW1hbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2IwNzFmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS9jb21tYW5kLmgKQEAgLTAsMCArMSwzNjEgQEAKKy8qCisgKiBaZWJyYSBjb25maWd1cmF0aW9uIGNvbW1hbmQgaW50ZXJmYWNlIHJvdXRpbmUKKyAqIENvcHlyaWdodCAoQykgMTk5NywgOTggS3VuaWhpcm8gSXNoaWd1cm8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCisgKgorICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaWZuZGVmIF9aRUJSQV9DT01NQU5EX0gKKyNkZWZpbmUgX1pFQlJBX0NPTU1BTkRfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlICJ2ZWN0b3IuaCIKKyNpbmNsdWRlICJ2dHkuaCIKKworLyogSG9zdCBjb25maWd1cmF0aW9uIHZhcmlhYmxlICovCitzdHJ1Y3QgaG9zdCB7CisJLyogSG9zdCBuYW1lIG9mIHRoaXMgcm91dGVyLiAqLworCWNoYXIgKm5hbWU7CisKKwkvKiBQYXNzd29yZCBmb3IgdnR5IGludGVyZmFjZS4gKi8KKwljaGFyICpwYXNzd29yZDsKKwljaGFyICpwYXNzd29yZF9lbmNyeXB0OworCisJLyogRW5hYmxlIHBhc3N3b3JkICovCisJY2hhciAqZW5hYmxlOworCWNoYXIgKmVuYWJsZV9lbmNyeXB0OworCisJLyogU3lzdGVtIHdpZGUgdGVybWluYWwgbGluZXMuICovCisJaW50IGxpbmVzOworCisJLyogTG9nIGZpbGVuYW1lLiAqLworCWNoYXIgKmxvZ2ZpbGU7CisKKwkvKiBjb25maWcgZmlsZSBuYW1lIG9mIHRoaXMgaG9zdCAqLworCWNoYXIgKmNvbmZpZzsKKworCS8qIEZsYWdzIGZvciBzZXJ2aWNlcyAqLworCWludCBhZHZhbmNlZDsKKwlpbnQgZW5jcnlwdDsKKworCS8qIEJhbm5lciBjb25maWd1cmF0aW9uLiAqLworCWNvbnN0IGNoYXIgKm1vdGQ7CisJY2hhciAqbW90ZGZpbGU7Cit9OworCisvKiBUaGVyZSBhcmUgc29tZSBjb21tYW5kIGxldmVscyB3aGljaCBjYWxsZWQgZnJvbSBjb21tYW5kIG5vZGUuICovCitlbnVtIG5vZGVfdHlwZSB7CisJQVVUSF9OT0RFLAkJLyogQXV0aGVudGljYXRpb24gbW9kZSBvZiB2dHkgaW50ZXJmYWNlLiAqLworCVZJRVdfTk9ERSwJCS8qIFZpZXcgbm9kZS4gRGVmYXVsdCBtb2RlIG9mIHZ0eSBpbnRlcmZhY2UuICovCisJQVVUSF9FTkFCTEVfTk9ERSwJLyogQXV0aGVudGljYXRpb24gbW9kZSBmb3IgY2hhbmdlIGVuYWJsZS4gKi8KKwlFTkFCTEVfTk9ERSwJCS8qIEVuYWJsZSBub2RlLiAqLworCUNPTkZJR19OT0RFLAkJLyogQ29uZmlnIG5vZGUuIERlZmF1bHQgbW9kZSBvZiBjb25maWcgZmlsZS4gKi8KKwlTRVJWSUNFX05PREUsCQkvKiBTZXJ2aWNlIG5vZGUuICovCisJREVCVUdfTk9ERSwJCS8qIERlYnVnIG5vZGUuICovCisjaWYgMAorCUFBQV9OT0RFLAkJLyogQUFBIG5vZGUuICovCisJS0VZQ0hBSU5fTk9ERSwJCS8qIEtleS1jaGFpbiBub2RlLiAqLworCUtFWUNIQUlOX0tFWV9OT0RFLAkvKiBLZXktY2hhaW4ga2V5IG5vZGUuICovCisJSU5URVJGQUNFX05PREUsCQkvKiBJbnRlcmZhY2UgbW9kZSBub2RlLiAqLworCVpFQlJBX05PREUsCQkvKiB6ZWJyYSBjb25uZWN0aW9uIG5vZGUuICovCisJVEFCTEVfTk9ERSwJCS8qIHJ0bV90YWJsZSBzZWxlY3Rpb24gbm9kZS4gKi8KKwlSSVBfTk9ERSwJCS8qIFJJUCBwcm90b2NvbCBtb2RlIG5vZGUuICovCisJUklQTkdfTk9ERSwJCS8qIFJJUG5nIHByb3RvY29sIG1vZGUgbm9kZS4gKi8KKwlCR1BfTk9ERSwJCS8qIEJHUCBwcm90b2NvbCBtb2RlIHdoaWNoIGluY2x1ZGVzIEJHUDQrICovCisJQkdQX1ZQTlY0X05PREUsCQkvKiBCR1AgTVBMUy1WUE4gUEUgZXhjaGFuZ2UuICovCisJQkdQX0lQVjRfTk9ERSwJCS8qIEJHUCBJUHY0IHVuaWNhc3QgYWRkcmVzcyBmYW1pbHkuICAqLworCUJHUF9JUFY0TV9OT0RFLAkJLyogQkdQIElQdjQgbXVsdGljYXN0IGFkZHJlc3MgZmFtaWx5LiAgKi8KKwlCR1BfSVBWNl9OT0RFLAkJLyogQkdQIElQdjYgYWRkcmVzcyBmYW1pbHkgKi8KKwlPU1BGX05PREUsCQkvKiBPU1BGIHByb3RvY29sIG1vZGUgKi8KKwlPU1BGNl9OT0RFLAkJLyogT1NQRiBwcm90b2NvbCBmb3IgSVB2NiBtb2RlICovCisJSVNJU19OT0RFLAkJLyogSVNJUyBwcm90b2NvbCBtb2RlICovCisJTUFTQ19OT0RFLAkJLyogTUFTQyBmb3IgbXVsdGljYXN0LiAgKi8KKwlJUkRQX05PREUsCQkvKiBJQ01QIFJvdXRlciBEaXNjb3ZlcnkgUHJvdG9jb2wgbW9kZS4gKi8KKwlJUF9OT0RFLAkJLyogU3RhdGljIGlwIHJvdXRlIG5vZGUuICovCisJQUNDRVNTX05PREUsCQkvKiBBY2Nlc3MgbGlzdCBub2RlLiAqLworCVBSRUZJWF9OT0RFLAkJLyogUHJlZml4IGxpc3Qgbm9kZS4gKi8KKwlBQ0NFU1NfSVBWNl9OT0RFLAkvKiBBY2Nlc3MgbGlzdCBub2RlLiAqLworCVBSRUZJWF9JUFY2X05PREUsCS8qIFByZWZpeCBsaXN0IG5vZGUuICovCisJQVNfTElTVF9OT0RFLAkJLyogQVMgbGlzdCBub2RlLiAqLworCUNPTU1VTklUWV9MSVNUX05PREUsCS8qIENvbW11bml0eSBsaXN0IG5vZGUuICovCisJUk1BUF9OT0RFLAkJLyogUm91dGUgbWFwIG5vZGUuICovCisJU01VWF9OT0RFLAkJLyogU05NUCBjb25maWd1cmF0aW9uIG5vZGUuICovCisJRFVNUF9OT0RFLAkJLyogUGFja2V0IGR1bXAgbm9kZS4gKi8KKwlGT1JXQVJESU5HX05PREUsCS8qIElQIGZvcndhcmRpbmcgbm9kZS4gKi8KKyNlbmRpZgorCVZUWV9OT0RFLAkJLyogVnR5IG5vZGUuICovCisKKwlHU01ORVRfTk9ERSwKKwlCVFNfTk9ERSwKKwlUUlhfTk9ERSwKKwlUU19OT0RFLAorCVNVQlNDUl9OT0RFLAorCU1HQ1BfTk9ERSwKK307CisKKy8qIE5vZGUgd2hpY2ggaGFzIHNvbWUgY29tbWFuZHMgYW5kIHByb21wdCBzdHJpbmcgYW5kIGNvbmZpZ3VyYXRpb24KKyAgIGZ1bmN0aW9uIHBvaW50ZXIgLiAqLworc3RydWN0IGNtZF9ub2RlIHsKKwkvKiBOb2RlIGluZGV4LiAqLworCWVudW0gbm9kZV90eXBlIG5vZGU7CisKKwkvKiBQcm9tcHQgY2hhcmFjdGVyIGF0IHZ0eSBpbnRlcmZhY2UuICovCisJY29uc3QgY2hhciAqcHJvbXB0OworCisJLyogSXMgdGhpcyBub2RlJ3MgY29uZmlndXJhdGlvbiBnb2VzIHRvIHZ0eXNoID8gKi8KKwlpbnQgdnR5c2g7CisKKwkvKiBOb2RlJ3MgY29uZmlndXJhdGlvbiB3cml0ZSBmdW5jdGlvbiAqLworCWludCAoKmZ1bmMpIChzdHJ1Y3QgdnR5ICopOworCisJLyogVmVjdG9yIG9mIHRoaXMgbm9kZSdzIGNvbW1hbmQgbGlzdC4gKi8KKwl2ZWN0b3IgY21kX3ZlY3RvcjsKK307CisKK2VudW0geworCUNNRF9BVFRSX0RFUFJFQ0FURUQgPSAxLAorCUNNRF9BVFRSX0hJRERFTiwKK307CisKKy8qIFN0cnVjdHVyZSBvZiBjb21tYW5kIGVsZW1lbnQuICovCitzdHJ1Y3QgY21kX2VsZW1lbnQgeworCWNvbnN0IGNoYXIgKnN0cmluZzsJLyogQ29tbWFuZCBzcGVjaWZpY2F0aW9uIGJ5IHN0cmluZy4gKi8KKwlpbnQgKCpmdW5jKSAoc3RydWN0IGNtZF9lbGVtZW50ICosIHN0cnVjdCB2dHkgKiwgaW50LCBjb25zdCBjaGFyICpbXSk7CisJY29uc3QgY2hhciAqZG9jOwkvKiBEb2N1bWVudGF0aW9uIG9mIHRoaXMgY29tbWFuZC4gKi8KKwlpbnQgZGFlbW9uOwkJLyogRGFlbW9uIHRvIHdoaWNoIHRoaXMgY29tbWFuZCBiZWxvbmcuICovCisJdmVjdG9yIHN0cnZlYzsJCS8qIFBvaW50aW5nIG91dCBlYWNoIGRlc2NyaXB0aW9uIHZlY3Rvci4gKi8KKwl1bnNpZ25lZCBpbnQgY21kc2l6ZTsJLyogQ29tbWFuZCBpbmRleCBjb3VudC4gKi8KKwljaGFyICpjb25maWc7CQkvKiBDb25maWd1cmF0aW9uIHN0cmluZyAqLworCXZlY3RvciBzdWJjb25maWc7CS8qIFN1YiBjb25maWd1cmF0aW9uIHN0cmluZyAqLworCXVfY2hhciBhdHRyOwkJLyogQ29tbWFuZCBhdHRyaWJ1dGVzICovCit9OworCisvKiBDb21tYW5kIGRlc2NyaXB0aW9uIHN0cnVjdHVyZS4gKi8KK3N0cnVjdCBkZXNjIHsKKwljb25zdCBjaGFyICpjbWQ7CS8qIENvbW1hbmQgc3RyaW5nLiAqLworCWNvbnN0IGNoYXIgKnN0cjsJLyogQ29tbWFuZCdzIGRlc2NyaXB0aW9uLiAqLworfTsKKworLyogUmV0dXJuIHZhbHVlIG9mIHRoZSBjb21tYW5kcy4gKi8KKyNkZWZpbmUgQ01EX1NVQ0NFU1MgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ01EX1dBUk5JTkcgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ01EX0VSUl9OT19NQVRDSCAgICAgICAgIDIKKyNkZWZpbmUgQ01EX0VSUl9BTUJJR1VPVVMgICAgICAgIDMKKyNkZWZpbmUgQ01EX0VSUl9JTkNPTVBMRVRFICAgICAgIDQKKyNkZWZpbmUgQ01EX0VSUl9FWEVFRF9BUkdDX01BWCAgIDUKKyNkZWZpbmUgQ01EX0VSUl9OT1RISU5HX1RPRE8gICAgIDYKKyNkZWZpbmUgQ01EX0NPTVBMRVRFX0ZVTExfTUFUQ0ggIDcKKyNkZWZpbmUgQ01EX0NPTVBMRVRFX01BVENIICAgICAgIDgKKyNkZWZpbmUgQ01EX0NPTVBMRVRFX0xJU1RfTUFUQ0ggIDkKKyNkZWZpbmUgQ01EX1NVQ0NFU1NfREFFTU9OICAgICAgMTAKKworLyogQXJnYyBtYXggY291bnRzLiAqLworI2RlZmluZSBDTURfQVJHQ19NQVggICAyNQorCisvKiBUdXJuIG9mZiB0aGVzZSBtYWNyb3Mgd2hlbiB1aXNuZyBjcHAgd2l0aCBleHRyYWN0LnBsICovCisjaWZuZGVmIFZUWVNIX0VYVFJBQ1RfUEwKKworLyogaGVscGVyIGRlZmluZXMgZm9yIGVuZC11c2VyIERFRlVOKiBtYWNyb3MgKi8KKyNkZWZpbmUgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0cnMsIGRudW0pIFwKKyAgc3RydWN0IGNtZF9lbGVtZW50IGNtZG5hbWUgPSBcCisgIHsgXAorICAgIC5zdHJpbmcgPSBjbWRzdHIsIFwKKyAgICAuZnVuYyA9IGZ1bmNuYW1lLCBcCisgICAgLmRvYyA9IGhlbHBzdHIsIFwKKyAgICAuYXR0ciA9IGF0dHJzLCBcCisgICAgLmRhZW1vbiA9IGRudW0sIFwKKyAgfTsKKworI2RlZmluZSBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCisgIHN0YXRpYyBpbnQgZnVuY25hbWUgKHN0cnVjdCBjbWRfZWxlbWVudCAqLCBzdHJ1Y3QgdnR5ICosIGludCwgY29uc3QgY2hhciAqW10pOyBcCisKKyNkZWZpbmUgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkgXAorICBzdGF0aWMgaW50IGZ1bmNuYW1lIFwKKyAgICAoc3RydWN0IGNtZF9lbGVtZW50ICpzZWxmLCBzdHJ1Y3QgdnR5ICp2dHksIGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pCisKKy8qIERFRlVOIGZvciB2dHkgY29tbWFuZCBpbnRlcmFmY2UuIExpdHRsZSBiaXQgaGFja3kgOy0pLiAqLworI2RlZmluZSBERUZVTihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9GVU5DX0RFQ0woZnVuY25hbWUpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgMCkgXAorICBERUZVTl9DTURfRlVOQ19URVhUKGZ1bmNuYW1lKQorCisjZGVmaW5lIERFRlVOX0FUVFIoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0cikgXAorICBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIsIDApIFwKKyAgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkKKworI2RlZmluZSBERUZVTl9ISURERU4oZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9BVFRSIChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ISURERU4pCisKKyNkZWZpbmUgREVGVU5fREVQUkVDQVRFRChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0FUVFIgKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0RFUFJFQ0FURUQpIFwKKworLyogREVGVU5fTk9TSCBmb3IgY29tbWFuZHMgdGhhdCB2dHlzaCBzaG91bGQgaWdub3JlICovCisjZGVmaW5lIERFRlVOX05PU0goZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKQorCisvKiBERUZTSCBmb3IgdnR5c2guICovCisjZGVmaW5lIERFRlNIKGRhZW1vbiwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKE5VTEwsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgZGFlbW9uKSBcCisKKy8qIERFRlVOICsgREVGU0ggKi8KKyNkZWZpbmUgREVGVU5TSChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0ZVTkNfREVDTChmdW5jbmFtZSkgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCAwLCBkYWVtb24pIFwKKyAgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkKKworLyogREVGVU4gKyBERUZTSCB3aXRoIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgREVGVU5TSF9BVFRSKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0cikgXAorICBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIsIGRhZW1vbikgXAorICBERUZVTl9DTURfRlVOQ19URVhUKGZ1bmNuYW1lKQorCisjZGVmaW5lIERFRlVOU0hfSElEREVOKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTlNIX0FUVFIgKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfSElEREVOKQorCisjZGVmaW5lIERFRlVOU0hfREVQUkVDQVRFRChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5TSF9BVFRSIChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0RFUFJFQ0FURUQpCisKKy8qIEFMSUFTIG1hY3JvIHdoaWNoIGRlZmluZSBleGlzdGluZyBjb21tYW5kJ3MgYWxpYXMuICovCisjZGVmaW5lIEFMSUFTKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgMCkKKworI2RlZmluZSBBTElBU19BVFRSKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgYXR0ciwgMCkKKworI2RlZmluZSBBTElBU19ISURERU4oZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ISURERU4sIDApCisKKyNkZWZpbmUgQUxJQVNfREVQUkVDQVRFRChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0RFUFJFQ0FURUQsIDApCisKKyNkZWZpbmUgQUxJQVNfU0goZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIGRhZW1vbikKKworI2RlZmluZSBBTElBU19TSF9ISURERU4oZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0hJRERFTiwgZGFlbW9uKQorCisjZGVmaW5lIEFMSUFTX1NIX0RFUFJFQ0FURUQoZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0RFUFJFQ0FURUQsIGRhZW1vbikKKworI2VuZGlmCQkJCS8qIFZUWVNIX0VYVFJBQ1RfUEwgKi8KKworLyogU29tZSBtYWNyb2VzICovCisjZGVmaW5lIENNRF9PUFRJT04oUykgICAoKFNbMF0pID09ICdbJykKKyNkZWZpbmUgQ01EX1ZBUklBQkxFKFMpICgoKFNbMF0pID49ICdBJyAmJiAoU1swXSkgPD0gJ1onKSB8fCAoKFNbMF0pID09ICc8JykpCisjZGVmaW5lIENNRF9WQVJBUkcoUykgICAoKFNbMF0pID09ICcuJykKKyNkZWZpbmUgQ01EX1JBTkdFKFMpCSgoU1swXSA9PSAnPCcpKQorCisjZGVmaW5lIENNRF9JUFY0KFMpCSAgICgoc3RyY21wICgoUyksICJBLkIuQy5EIikgPT0gMCkpCisjZGVmaW5lIENNRF9JUFY0X1BSRUZJWChTKSAoKHN0cmNtcCAoKFMpLCAiQS5CLkMuRC9NIikgPT0gMCkpCisjZGVmaW5lIENNRF9JUFY2KFMpICAgICAgICAoKHN0cmNtcCAoKFMpLCAiWDpYOjpYOlgiKSA9PSAwKSkKKyNkZWZpbmUgQ01EX0lQVjZfUFJFRklYKFMpICgoc3RyY21wICgoUyksICJYOlg6Olg6WC9NIikgPT0gMCkpCisKKy8qIENvbW1vbiBkZXNjcmlwdGlvbnMuICovCisjZGVmaW5lIFNIT1dfU1RSICJTaG93IHJ1bm5pbmcgc3lzdGVtIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIElQX1NUUiAiSVAgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgSVBWNl9TVFIgIklQdjYgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgTk9fU1RSICJOZWdhdGUgYSBjb21tYW5kIG9yIHNldCBpdHMgZGVmYXVsdHNcbiIKKyNkZWZpbmUgQ0xFQVJfU1RSICJSZXNldCBmdW5jdGlvbnNcbiIKKyNkZWZpbmUgUklQX1NUUiAiUklQIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIEJHUF9TVFIgIkJHUCBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBPU1BGX1NUUiAiT1NQRiBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBORUlHSEJPUl9TVFIgIlNwZWNpZnkgbmVpZ2hib3Igcm91dGVyXG4iCisjZGVmaW5lIERFQlVHX1NUUiAiRGVidWdnaW5nIGZ1bmN0aW9ucyAoc2VlIGFsc28gJ3VuZGVidWcnKVxuIgorI2RlZmluZSBVTkRFQlVHX1NUUiAiRGlzYWJsZSBkZWJ1Z2dpbmcgZnVuY3Rpb25zIChzZWUgYWxzbyAnZGVidWcnKVxuIgorI2RlZmluZSBST1VURVJfU1RSICJFbmFibGUgYSByb3V0aW5nIHByb2Nlc3NcbiIKKyNkZWZpbmUgQVNfU1RSICJBUyBudW1iZXJcbiIKKyNkZWZpbmUgTUJHUF9TVFIgIk1CR1AgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgTUFUQ0hfU1RSICJNYXRjaCB2YWx1ZXMgZnJvbSByb3V0aW5nIHRhYmxlXG4iCisjZGVmaW5lIFNFVF9TVFIgIlNldCB2YWx1ZXMgaW4gZGVzdGluYXRpb24gcm91dGluZyBwcm90b2NvbFxuIgorI2RlZmluZSBPVVRfU1RSICJGaWx0ZXIgb3V0Z29pbmcgcm91dGluZyB1cGRhdGVzXG4iCisjZGVmaW5lIElOX1NUUiAgIkZpbHRlciBpbmNvbWluZyByb3V0aW5nIHVwZGF0ZXNcbiIKKyNkZWZpbmUgVjROT1RBVElPTl9TVFIgInNwZWNpZnkgYnkgSVB2NCBhZGRyZXNzIG5vdGF0aW9uKGUuZy4gMC4wLjAuMClcbiIKKyNkZWZpbmUgT1NQRjZfTlVNQkVSX1NUUiAiU3BlY2lmeSBieSBudW1iZXJcbiIKKyNkZWZpbmUgSU5URVJGQUNFX1NUUiAiSW50ZXJmYWNlIGluZm9tYXRpb25cbiIKKyNkZWZpbmUgSUZOQU1FX1NUUiAiSW50ZXJmYWNlIG5hbWUoZS5nLiBlcDApXG4iCisjZGVmaW5lIElQNl9TVFIgIklQdjYgSW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgT1NQRjZfU1RSICJPcGVuIFNob3J0ZXN0IFBhdGggRmlyc3QgKE9TUEYpIGZvciBJUHY2XG4iCisjZGVmaW5lIE9TUEY2X1JPVVRFUl9TVFIgIkVuYWJsZSBhIHJvdXRpbmcgcHJvY2Vzc1xuIgorI2RlZmluZSBPU1BGNl9JTlNUQU5DRV9TVFIgIjwxLTY1NTM1PiBJbnN0YW5jZSBJRFxuIgorI2RlZmluZSBTRUNPTkRTX1NUUiAiPDEtNjU1MzU+IFNlY29uZHNcbiIKKyNkZWZpbmUgUk9VVEVfU1RSICJSb3V0aW5nIFRhYmxlXG4iCisjZGVmaW5lIFBSRUZJWF9MSVNUX1NUUiAiQnVpbGQgYSBwcmVmaXggbGlzdFxuIgorI2RlZmluZSBPU1BGNl9EVU1QX1RZUEVfTElTVCBcCisiKG5laWdoYm9yfGludGVyZmFjZXxhcmVhfGxzYXx6ZWJyYXxjb25maWd8ZGJleHxzcGZ8cm91dGV8bHNkYnxyZWRpc3RyaWJ1dGV8aG9va3xhc2JyfHByZWZpeHxhYnIpIgorI2RlZmluZSBJU0lTX1NUUiAiSVMtSVMgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgQVJFQV9UQUdfU1RSICJbYXJlYSB0YWddXG4iCisKKyNkZWZpbmUgQ09ORl9CQUNLVVBfRVhUICIuc2F2IgorCisvKiBJUHY0IG9ubHkgbWFjaGluZSBzaG91bGQgbm90IGFjY2VwdCBJUHY2IGFkZHJlc3MgZm9yIHBlZXIncyBJUAorICAgYWRkcmVzcy4gIFNvIHdlIHJlcGxhY2UgVlRZIGNvbW1hbmQgc3RyaW5nIGxpa2UgYmVsb3cuICovCisjaWZkZWYgSEFWRV9JUFY2CisjZGVmaW5lIE5FSUdIQk9SX0NNRCAgICAgICAibmVpZ2hib3IgKEEuQi5DLkR8WDpYOjpYOlgpICIKKyNkZWZpbmUgTk9fTkVJR0hCT1JfQ01EICAgICJubyBuZWlnaGJvciAoQS5CLkMuRHxYOlg6Olg6WCkgIgorI2RlZmluZSBORUlHSEJPUl9BRERSX1NUUiAgIk5laWdoYm9yIGFkZHJlc3NcbklQdjYgYWRkcmVzc1xuIgorI2RlZmluZSBORUlHSEJPUl9DTUQyICAgICAgIm5laWdoYm9yIChBLkIuQy5EfFg6WDo6WDpYfFdPUkQpICIKKyNkZWZpbmUgTk9fTkVJR0hCT1JfQ01EMiAgICJubyBuZWlnaGJvciAoQS5CLkMuRHxYOlg6Olg6WHxXT1JEKSAiCisjZGVmaW5lIE5FSUdIQk9SX0FERFJfU1RSMiAiTmVpZ2hib3IgYWRkcmVzc1xuTmVpZ2hib3IgSVB2NiBhZGRyZXNzXG5OZWlnaGJvciB0YWdcbiIKKyNlbHNlCisjZGVmaW5lIE5FSUdIQk9SX0NNRCAgICAgICAibmVpZ2hib3IgQS5CLkMuRCAiCisjZGVmaW5lIE5PX05FSUdIQk9SX0NNRCAgICAibm8gbmVpZ2hib3IgQS5CLkMuRCAiCisjZGVmaW5lIE5FSUdIQk9SX0FERFJfU1RSICAiTmVpZ2hib3IgYWRkcmVzc1xuIgorI2RlZmluZSBORUlHSEJPUl9DTUQyICAgICAgIm5laWdoYm9yIChBLkIuQy5EfFdPUkQpICIKKyNkZWZpbmUgTk9fTkVJR0hCT1JfQ01EMiAgICJubyBuZWlnaGJvciAoQS5CLkMuRHxXT1JEKSAiCisjZGVmaW5lIE5FSUdIQk9SX0FERFJfU1RSMiAiTmVpZ2hib3IgYWRkcmVzc1xuTmVpZ2hib3IgdGFnXG4iCisjZW5kaWYJCQkJLyogSEFWRV9JUFY2ICovCisKKy8qIFByb3RvdHlwZXMuICovCit2b2lkIGluc3RhbGxfbm9kZShzdHJ1Y3QgY21kX25vZGUgKiwgaW50ICgqKShzdHJ1Y3QgdnR5ICopKTsKK3ZvaWQgaW5zdGFsbF9kZWZhdWx0KGVudW0gbm9kZV90eXBlKTsKK3ZvaWQgaW5zdGFsbF9lbGVtZW50KGVudW0gbm9kZV90eXBlLCBzdHJ1Y3QgY21kX2VsZW1lbnQgKik7Cit2b2lkIHNvcnRfbm9kZSgpOworCisvKiBDb25jYXRlbmF0ZXMgYXJndltzaGlmdF0gdGhyb3VnaCBhcmd2W2FyZ2MtMV0gaW50byBhIHNpbmdsZSBOVUwtdGVybWluYXRlZAorICAgc3RyaW5nIHdpdGggYSBzcGFjZSBiZXR3ZWVuIGVhY2ggZWxlbWVudCAoYWxsb2NhdGVkIHVzaW5nCisgICBYTUFMTE9DKE1UWVBFX1RNUCkpLiAgUmV0dXJucyBOVUxMIGlmIHNoaWZ0ID49IGFyZ2MuICovCitjaGFyICphcmd2X2NvbmNhdChjb25zdCBjaGFyICoqYXJndiwgaW50IGFyZ2MsIGludCBzaGlmdCk7CisKK3ZlY3RvciBjbWRfbWFrZV9zdHJ2ZWMoY29uc3QgY2hhciAqKTsKK3ZvaWQgY21kX2ZyZWVfc3RydmVjKHZlY3Rvcik7Cit2ZWN0b3IgY21kX2Rlc2NyaWJlX2NvbW1hbmQoKTsKK2NoYXIgKipjbWRfY29tcGxldGVfY29tbWFuZCgpOworY29uc3QgY2hhciAqY21kX3Byb21wdChlbnVtIG5vZGVfdHlwZSk7CitpbnQgY29uZmlnX2Zyb21fZmlsZShzdHJ1Y3QgdnR5ICosIEZJTEUgKik7CitlbnVtIG5vZGVfdHlwZSBub2RlX3BhcmVudChlbnVtIG5vZGVfdHlwZSk7CitpbnQgY21kX2V4ZWN1dGVfY29tbWFuZCh2ZWN0b3IsIHN0cnVjdCB2dHkgKiwgc3RydWN0IGNtZF9lbGVtZW50ICoqLCBpbnQpOworaW50IGNtZF9leGVjdXRlX2NvbW1hbmRfc3RyaWN0KHZlY3Rvciwgc3RydWN0IHZ0eSAqLCBzdHJ1Y3QgY21kX2VsZW1lbnQgKiopOwordm9pZCBjb25maWdfcmVwbGFjZV9zdHJpbmcoc3RydWN0IGNtZF9lbGVtZW50ICosIGNoYXIgKiwgLi4uKTsKK3ZvaWQgY21kX2luaXQoaW50KTsKKworLyogRXhwb3J0IHR5cGljYWwgZnVuY3Rpb25zLiAqLworZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBjb25maWdfZW5kX2NtZDsKK2V4dGVybiBzdHJ1Y3QgY21kX2VsZW1lbnQgY29uZmlnX2V4aXRfY21kOworZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBjb25maWdfcXVpdF9jbWQ7CitleHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IGNvbmZpZ19oZWxwX2NtZDsKK2V4dGVybiBzdHJ1Y3QgY21kX2VsZW1lbnQgY29uZmlnX2xpc3RfY21kOworY2hhciAqaG9zdF9jb25maWdfZmlsZSgpOwordm9pZCBob3N0X2NvbmZpZ19zZXQoY29uc3QgY2hhciAqKTsKKwordm9pZCBwcmludF92ZXJzaW9uKGNvbnN0IGNoYXIgKik7CisKK2V4dGVybiB2b2lkICp0YWxsX3Z0eV9jbWRfY3R4OworCisjZW5kaWYJCQkJLyogX1pFQlJBX0NPTU1BTkRfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS92ZWN0b3IuaCBiL29wZW5ic2MvaW5jbHVkZS92dHkvdmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhMTg0ZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS92dHkvdmVjdG9yLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIEdlbmVyaWMgdmVjdG9yIGludGVyZmFjZSBoZWFkZXIuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDk4IEt1bmloaXJvIElzaGlndXJvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorICoKKyAqIEdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgKiAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfWkVCUkFfVkVDVE9SX0gKKyNkZWZpbmUgX1pFQlJBX1ZFQ1RPUl9ICisKKy8qIHN0cnVjdCBmb3IgdmVjdG9yICovCitzdHJ1Y3QgX3ZlY3RvciB7CisJdW5zaWduZWQgaW50IGFjdGl2ZTsJLyogbnVtYmVyIG9mIGFjdGl2ZSBzbG90cyAqLworCXVuc2lnbmVkIGludCBhbGxvY2VkOwkvKiBudW1iZXIgb2YgYWxsb2NhdGVkIHNsb3QgKi8KKwl2b2lkICoqaW5kZXg7CQkvKiBpbmRleCB0byBkYXRhICovCit9OwordHlwZWRlZiBzdHJ1Y3QgX3ZlY3RvciAqdmVjdG9yOworCisjZGVmaW5lIFZFQ1RPUl9NSU5fU0laRSAxCisKKy8qIChTb21ldGltZXMpIHVzZWZ1bGwgbWFjcm9zLiAgVGhpcyBtYWNybyBjb252ZXJ0IGluZGV4IGV4cHJlc3Npb24gdG8KKyBhcnJheSBleHByZXNzaW9uLiAqLworLyogUmVmZXJlbmNlIHNsb3QgYXQgZ2l2ZW4gaW5kZXgsIGNhbGxlciBtdXN0IGVuc3VyZSBzbG90IGlzIGFjdGl2ZSAqLworI2RlZmluZSB2ZWN0b3Jfc2xvdChWLEkpICAoKFYpLT5pbmRleFsoSSldKQorLyogTnVtYmVyIG9mIGFjdGl2ZSBzbG90cy4KKyAqIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbSB2ZWN0b3JfY291bnQoKSBhcyBpdCB0aGUgY291bnQgcmV0dXJuZWQKKyAqIHdpbGwgaW5jbHVkZSBhbnkgZW1wdHkgc2xvdHMKKyAqLworI2RlZmluZSB2ZWN0b3JfYWN0aXZlKFYpICgoViktPmFjdGl2ZSkKKworLyogUHJvdG90eXBlcy4gKi8KK3ZlY3RvciB2ZWN0b3JfaW5pdCh1bnNpZ25lZCBpbnQgc2l6ZSk7Cit2b2lkIHZlY3Rvcl9lbnN1cmUodmVjdG9yIHYsIHVuc2lnbmVkIGludCBudW0pOworaW50IHZlY3Rvcl9lbXB0eV9zbG90KHZlY3RvciB2KTsKK2ludCB2ZWN0b3Jfc2V0KHZlY3RvciB2LCB2b2lkICp2YWwpOworaW50IHZlY3Rvcl9zZXRfaW5kZXgodmVjdG9yIHYsIHVuc2lnbmVkIGludCBpLCB2b2lkICp2YWwpOwordm9pZCB2ZWN0b3JfdW5zZXQodmVjdG9yIHYsIHVuc2lnbmVkIGludCBpKTsKK3Vuc2lnbmVkIGludCB2ZWN0b3JfY291bnQodmVjdG9yIHYpOwordm9pZCB2ZWN0b3Jfb25seV93cmFwcGVyX2ZyZWUodmVjdG9yIHYpOwordm9pZCB2ZWN0b3Jfb25seV9pbmRleF9mcmVlKHZvaWQgKmluZGV4KTsKK3ZvaWQgdmVjdG9yX2ZyZWUodmVjdG9yIHYpOwordmVjdG9yIHZlY3Rvcl9jb3B5KHZlY3RvciB2KTsKKwordm9pZCAqdmVjdG9yX2xvb2t1cCh2ZWN0b3IsIHVuc2lnbmVkIGludCk7Cit2b2lkICp2ZWN0b3JfbG9va3VwX2Vuc3VyZSh2ZWN0b3IsIHVuc2lnbmVkIGludCk7CisKK2V4dGVybiB2b2lkICp0YWxsX3Z0eV92ZWNfY3R4OworCisjZW5kaWYJCQkJLyogX1pFQlJBX1ZFQ1RPUl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvdnR5L3Z0eS5oIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS92dHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDQxZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS92dHkuaApAQCAtMCwwICsxLDE1MSBAQAorI2lmbmRlZiBfVlRZX0gKKyNkZWZpbmUgX1ZUWV9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvKiBHQ0MgaGF2ZSBwcmludGYgdHlwZSBhdHRyaWJ1dGUgY2hlY2suICAqLworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFZUWV9QUklOVEZfQVRUUklCVVRFKGEsYikgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIGEsIGIpKSkKKyNlbHNlCisjZGVmaW5lIFZUWV9QUklOVEZfQVRUUklCVVRFKGEsYikKKyNlbmRpZgkJCQkvKiBfX0dOVUNfXyAqLworCisvKiBEb2VzIHRoZSBJL08gZXJyb3IgaW5kaWNhdGUgdGhhdCB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSByZXRyaWVkIGxhdGVyPyAqLworI2RlZmluZSBFUlJOT19JT19SRVRSWShFTikgXAorCSgoKEVOKSA9PSBFQUdBSU4pIHx8ICgoRU4pID09IEVXT1VMREJMT0NLKSB8fCAoKEVOKSA9PSBFSU5UUikpCisKKy8qIFZ0eSByZWFkIGJ1ZmZlciBzaXplLiAqLworI2RlZmluZSBWVFlfUkVBRF9CVUZTSVogNTEyCisKKyNkZWZpbmUgVlRZX0JVRlNJWiA1MTIKKyNkZWZpbmUgVlRZX01BWEhJU1QgMjAKKworLyogVnR5IGV2ZW50cyAqLworZW51bSBldmVudCB7CisJVlRZX1NFUlYsCisJVlRZX1JFQUQsCisJVlRZX1dSSVRFLAorCVZUWV9DTE9TRUQsCisJVlRZX1RJTUVPVVRfUkVTRVQsCisjaWZkZWYgVlRZU0gKKwlWVFlTSF9TRVJWLAorCVZUWVNIX1JFQUQsCisJVlRZU0hfV1JJVEUKKyNlbmRpZgkJCQkvKiBWVFlTSCAqLworfTsKKworc3RydWN0IHZ0eSB7CisJRklMRSAqZmlsZTsKKworCS8qIHByaXZhdGUgZGF0YSwgc3BlY2lmaWVkIGJ5IGNyZWF0b3IgKi8KKwl2b2lkICpwcml2OworCisJLyogRmlsZSBkZXNjcmlwdGVyIG9mIHRoaXMgdnR5LiAqLworCWludCBmZDsKKworCS8qIElzIHRoaXMgdnR5IGNvbm5lY3QgdG8gZmlsZSBvciBub3QgKi8KKwllbnVtIHsgVlRZX1RFUk0sIFZUWV9GSUxFLCBWVFlfU0hFTEwsIFZUWV9TSEVMTF9TRVJWIH0gdHlwZTsKKworCS8qIE5vZGUgc3RhdHVzIG9mIHRoaXMgdnR5ICovCisJaW50IG5vZGU7CisKKwkvKiBGYWlsdXJlIGNvdW50ICovCisJaW50IGZhaWw7CisKKwkvKiBPdXRwdXQgYnVmZmVyLiAqLworCXN0cnVjdCBidWZmZXIgKm9idWY7CisKKwkvKiBDb21tYW5kIGlucHV0IGJ1ZmZlciAqLworCWNoYXIgKmJ1ZjsKKworCS8qIENvbW1hbmQgY3Vyc29yIHBvaW50ICovCisJaW50IGNwOworCisJLyogQ29tbWFuZCBsZW5ndGggKi8KKwlpbnQgbGVuZ3RoOworCisJLyogQ29tbWFuZCBtYXggbGVuZ3RoLiAqLworCWludCBtYXg7CisKKwkvKiBIaXN0cnkgb2YgY29tbWFuZCAqLworCWNoYXIgKmhpc3RbVlRZX01BWEhJU1RdOworCisJLyogSGlzdG9yeSBsb29rdXAgY3VycmVudCBwb2ludCAqLworCWludCBocDsKKworCS8qIEhpc3RvcnkgaW5zZXJ0IGVuZCBwb2ludCAqLworCWludCBoaW5kZXg7CisKKwkvKiBGb3IgY3VycmVudCByZWZlcmVuY2luZyBwb2ludCBvZiBpbnRlcmZhY2UsIHJvdXRlLW1hcCwKKwkgICBhY2Nlc3MtbGlzdCBldGMuLi4gKi8KKwl2b2lkICppbmRleDsKKworCS8qIEZvciBtdWx0aXBsZSBsZXZlbCBpbmRleCB0cmVhdG1lbnQgc3VjaCBhcyBrZXkgY2hhaW4gYW5kIGtleS4gKi8KKwl2b2lkICppbmRleF9zdWI7CisKKwkvKiBGb3IgZXNjYXBlIGNoYXJhY3Rlci4gKi8KKwl1bnNpZ25lZCBjaGFyIGVzY2FwZTsKKworCS8qIEN1cnJlbnQgdnR5IHN0YXR1cy4gKi8KKwllbnVtIHsgVlRZX05PUk1BTCwgVlRZX0NMT1NFLCBWVFlfTU9SRSwgVlRZX01PUkVMSU5FIH0gc3RhdHVzOworCisJLyogSUFDIGhhbmRsaW5nOiB3YXMgdGhlIGxhc3QgY2hhcmFjdGVyIHJlY2VpdmVkIHRoZSBJQUMKKwkgKiAoaW50ZXJwcmV0LWFzLWNvbW1hbmQpIGVzY2FwZSBjaGFyYWN0ZXIgKGFuZCB0aGVyZWZvcmUgdGhlIG5leHQKKwkgKiBjaGFyYWN0ZXIgd2lsbCBiZSB0aGUgY29tbWFuZCBjb2RlKT8gIFJlZmVyIHRvIFRlbG5ldCBSRkMgODU0LiAqLworCXVuc2lnbmVkIGNoYXIgaWFjOworCisJLyogSUFDIFNCIChvcHRpb24gc3VibmVnb3RpYXRpb24pIGhhbmRsaW5nICovCisJdW5zaWduZWQgY2hhciBpYWNfc2JfaW5fcHJvZ3Jlc3M7CisJLyogQXQgdGhlIG1vbWVudCwgd2UgY2FyZSBvbmx5IGFib3V0IHRoZSBOQVdTICh3aW5kb3cgc2l6ZSkgbmVnb3RpYXRpb24sCisJICogYW5kIHRoYXQgcmVxdWlyZXMganVzdCBhIDUtY2hhcmFjdGVyIGJ1ZmZlciAoUkZDIDEwNzMpOgorCSAqIDxOQVdTIGNoYXI+IDwxNi1iaXQgd2lkdGg+IDwxNi1iaXQgaGVpZ2h0PiAqLworI2RlZmluZSBURUxORVRfTkFXU19TQl9MRU4gNQorCXVuc2lnbmVkIGNoYXIgc2JfYnVmW1RFTE5FVF9OQVdTX1NCX0xFTl07CisJLyogSG93IG1hbnkgc3VibmVnb3RpYXRpb24gY2hhcmFjdGVycyBoYXZlIHdlIHJlY2VpdmVkPyAgV2UganVzdCBkcm9wCisJICogdGhvc2UgdGhhdCBkbyBub3QgZml0IGluIHRoZSBidWZmZXIuICovCisJc2l6ZV90IHNiX2xlbjsKKworCS8qIFdpbmRvdyB3aWR0aC9oZWlnaHQuICovCisJaW50IHdpZHRoOworCWludCBoZWlnaHQ7CisKKwkvKiBDb25maWd1cmUgbGluZXMuICovCisJaW50IGxpbmVzOworCisJaW50IG1vbml0b3I7CisKKwkvKiBJbiBjb25maWd1cmUgbW9kZS4gKi8KKwlpbnQgY29uZmlnOworfTsKKworLyogU21hbGwgbWFjcm8gdG8gZGV0ZXJtaW5lIG5ld2xpbmUgaXMgbmV3bGluZSBvbmx5IG9yIGxpbmVmZWVkIG5lZWRlZC4gKi8KKyNkZWZpbmUgVlRZX05FV0xJTkUgICgodnR5LT50eXBlID09IFZUWV9URVJNKSA/ICJcclxuIiA6ICJcbiIpCisKK3N0YXRpYyBpbmxpbmUgY2hhciAqdnR5X25ld2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCXJldHVybiBWVFlfTkVXTElORTsKK30KKworLyogUHJvdG90eXBlcy4gKi8KK3ZvaWQgdnR5X2luaXQgKHZvaWQpOworaW50IHZ0eV9yZWFkX2NvbmZpZ19maWxlKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSk7Cit2b2lkIHZ0eV9pbml0X3Z0eXNoICh2b2lkKTsKK3ZvaWQgdnR5X3Jlc2V0ICh2b2lkKTsKK3N0cnVjdCB2dHkgKnZ0eV9uZXcgKHZvaWQpOworc3RydWN0IHZ0eSAqdnR5X2NyZWF0ZSAoaW50IHZ0eV9zb2NrLCB2b2lkICpwcml2KTsKK2ludCB2dHlfb3V0IChzdHJ1Y3QgdnR5ICosIGNvbnN0IGNoYXIgKiwgLi4uKSBWVFlfUFJJTlRGX0FUVFJJQlVURSgyLCAzKTsKK2ludCB2dHlfb3V0X25ld2xpbmUoc3RydWN0IHZ0eSAqKTsKK2ludCB2dHlfcmVhZChzdHJ1Y3QgdnR5ICp2dHkpOworLy92b2lkIHZ0eV90aW1lX3ByaW50IChzdHJ1Y3QgdnR5ICosIGludCk7Cit2b2lkIHZ0eV9jbG9zZSAoc3RydWN0IHZ0eSAqKTsKK2NoYXIgKnZ0eV9nZXRfY3dkICh2b2lkKTsKK3ZvaWQgdnR5X2xvZyAoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IGNoYXIgKnByb3RvLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QpOworaW50IHZ0eV9jb25maWdfbG9jayAoc3RydWN0IHZ0eSAqKTsKK2ludCB2dHlfY29uZmlnX3VubG9jayAoc3RydWN0IHZ0eSAqKTsKK2ludCB2dHlfc2hlbGwgKHN0cnVjdCB2dHkgKik7CitpbnQgdnR5X3NoZWxsX3NlcnYgKHN0cnVjdCB2dHkgKik7Cit2b2lkIHZ0eV9oZWxsbyAoc3RydWN0IHZ0eSAqKTsKKwordm9pZCAqdGFsbF92dHlfY3R4OworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2xpYnNjY3AucGMuaW4gYi9vcGVuYnNjL2xpYnNjY3AucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhOGQ0OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvbGlic2NjcC5wYy5pbgpAQCAtMCwwICsxLDEwIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogT3BlbkJTQyBTQ0NQIExpYgorRGVzY3JpcHRpb246IE9wZW5CU0MgU0NDUCBMaWIKK1ZlcnNpb246IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxzY2NwCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfS8KZGlmZiAtLWdpdCBhL29wZW5ic2Mvb3BlbmJzYy5wYy5pbiBiL29wZW5ic2Mvb3BlbmJzYy5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmEwN2UyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9vcGVuYnNjLnBjLmluCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQC8KKworTmFtZTogT3BlbkJTQworRGVzY3JpcHRpb246IE9wZW5CU0MgYmFzZSBzdGF0aW9uIGNvbnRyb2xsZXIKK1JlcXVpcmVzOgorVmVyc2lvbjogQFZFUlNJT05ACitMaWJzOiAtTCR7bGliZGlyfSAtbG9wZW5ic2MKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9NYWtlZmlsZS5hbSBiL29wZW5ic2Mvc3JjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYzgwOWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ4IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZSAtSSQodG9wX2J1aWxkZGlyKQorQU1fQ0ZMQUdTPS1XYWxsICQoTElCT1NNT0NPUkVfQ0ZMQUdTKQorQU1fTERGTEFHUyA9ICQoTElCT1NNT0NPUkVfTElCUykKKworc2Jpbl9QUk9HUkFNUyA9IGJzY19oYWNrIGJzMTFfY29uZmlnIGlwYWNjZXNzLWZpbmQgaXBhY2Nlc3MtY29uZmlnIFwKKyAgICAgICAgICAgICAgICBpc2Ruc3luYyBic2NfbWdjcCBpcGFjY2Vzcy1wcm94eQorbm9pbnN0X0xJQlJBUklFUyA9IGxpYmJzYy5hIGxpYm1zYy5hIGxpYnZ0eS5hCitub2luc3RfSEVBREVSUyA9IHZ0eS9jYXJkc2hlbGwuaAorCitic2NkaXIgPSAkKGxpYmRpcikKK2JzY19MSUJSQVJJRVMgPSBsaWJzY2NwLmEKKworbGliYnNjX2FfU09VUkNFUyA9IGFiaXNfcnNsLmMgYWJpc19ubS5jIGdzbV9kYXRhLmMgZ3NtXzA0XzA4X3V0aWxzLmMgXAorCQljaGFuX2FsbG9jLmMgZGVidWcuYyBcCisJCWdzbV9zdWJzY3JpYmVyX2Jhc2UuYyBzdWJjaGFuX2RlbXV4LmMgYnNjX3JsbC5jIHRyYW5zYWN0aW9uLmMgXAorCQl0cmF1X2ZyYW1lLmMgdHJhdV9tdXguYyBwYWdpbmcuYyBlMV9jb25maWcuYyBlMV9pbnB1dC5jIFwKKwkJaW5wdXQvbWlzZG4uYyBpbnB1dC9pcGFjY2Vzcy5jIFwKKwkJdGFsbG9jX2N0eC5jIHN5c3RlbV9pbmZvcm1hdGlvbi5jIHJlc3Rfb2N0ZXRzLmMgXAorCQlydHBfcHJveHkuYyBidHNfc2llbWVuc19iczExLmMgYnRzX2lwYWNjZXNzX25hbm9idHMuYyBcCisJCWJ0c191bmtub3duLmMgYnNjX3ZlcnNpb24uYyBic2NfYXBpLmMKKworbGlibXNjX2FfU09VUkNFUyA9IGdzbV9zdWJzY3JpYmVyLmMgZGIuYyB0ZWxuZXRfaW50ZXJmYWNlLmMgXAorCQltbmNjLmMgZ3NtXzA0XzA4LmMgZ3NtXzA0XzExLmMgdHJhbnNhY3Rpb24uYyBcCisJCXRva2VuX2F1dGguYyBycmxwLmMgZ3NtXzA0XzgwLmMgdXNzZC5jIHNpbGVudF9jYWxsLmMgXAorCQloYW5kb3Zlcl9sb2dpYy5jIGhhbmRvdmVyX2RlY2lzaW9uLmMgbWVhc19yZXAuYworCitsaWJ2dHlfYV9TT1VSQ0VTID0gdnR5L2J1ZmZlci5jIHZ0eS9jb21tYW5kLmMgdnR5L3ZlY3Rvci5jIHZ0eS92dHkuYworCitsaWJzY2NwX2FfU09VUkNFUyA9IHNjY3Avc2NjcC5jCisKK2JzY19oYWNrX1NPVVJDRVMgPSBic2NfaGFjay5jIGJzY19pbml0LmMgdnR5X2ludGVyZmFjZS5jIHZ0eV9pbnRlcmZhY2VfbGF5ZXIzLmMKK2JzY19oYWNrX0xEQUREID0gbGlibXNjLmEgbGliYnNjLmEgbGlibXNjLmEgbGlidnR5LmEgLWxkbCAtbGRiaSAkKExJQkNSWVBUKQorCiticzExX2NvbmZpZ19TT1VSQ0VTID0gYnMxMV9jb25maWcuYyBhYmlzX25tLmMgZ3NtX2RhdGEuYyBkZWJ1Zy5jIFwKKwkJICAgICAgcnMyMzIuYyBidHNfc2llbWVuc19iczExLmMKKworaXBhY2Nlc3NfZmluZF9TT1VSQ0VTID0gaXBhY2Nlc3MvaXBhY2Nlc3MtZmluZC5jCisKK2lwYWNjZXNzX2NvbmZpZ19TT1VSQ0VTID0gaXBhY2Nlc3MvaXBhY2Nlc3MtY29uZmlnLmMgaXBhY2Nlc3MvaXBhY2Nlc3MtZmlybXdhcmUuYworaXBhY2Nlc3NfY29uZmlnX0xEQUREID0gbGliYnNjLmEgbGlibXNjLmEgbGliYnNjLmEgbGlidnR5LmEgLWxkbCAtbGRiaSAkKExJQkNSWVBUKQorCitpc2Ruc3luY19TT1VSQ0VTID0gaXNkbnN5bmMuYworCitic2NfbWdjcF9TT1VSQ0VTID0gbWdjcC9tZ2NwX21haW4uYyBtZ2NwL21nY3BfcHJvdG9jb2wuYyBtZ2NwL21nY3BfbmV0d29yay5jIG1nY3AvbWdjcF92dHkuYyBcCisJCSAgIGRlYnVnLmMgdGVsbmV0X2ludGVyZmFjZS5jCitic2NfbWdjcF9MREFERCA9IGxpYnZ0eS5hCisKK2lwYWNjZXNzX3Byb3h5X1NPVVJDRVMgPSBpcGFjY2Vzcy9pcGFjY2Vzcy1wcm94eS5jIGRlYnVnLmMKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2FiaXNfbm0uYyBiL29wZW5ic2Mvc3JjL2FiaXNfbm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTg1MmJmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYWJpc19ubS5jCkBAIC0wLDAgKzEsMjk2OSBAQAorLyogR1NNIE5ldHdvcmsgTWFuYWdlbWVudCAoT01MKSBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlIAorICogM0dQUCBUUyAxMi4yMSB2ZXJzaW9uIDguMC4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDYyMyBWOC4wLjAgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxsaWJnZW4uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWlzZG4uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorCisjZGVmaW5lIE9NX0FMTE9DX1NJWkUJCTEwMjQKKyNkZWZpbmUgT01fSEVBRFJPT01fU0laRQkxMjgKKyNkZWZpbmUgSVBBQ0NfU0VHTUVOVF9TSVpFCTI0NQorCisvKiB1bmlkaXJlY3Rpb25hbCBtZXNzYWdlcyBmcm9tIEJUUyB0byBCU0MgKi8KK3N0YXRpYyBjb25zdCBlbnVtIGFiaXNfbm1fbXNndHlwZSByZXBvcnRzW10gPSB7CisJTk1fTVRfU1dfQUNUSVZBVEVEX1JFUCwKKwlOTV9NVF9URVNUX1JFUCwKKwlOTV9NVF9TVEFURUNIR19FVkVOVF9SRVAsCisJTk1fTVRfRkFJTFVSRV9FVkVOVF9SRVAsCit9OworCisvKiBtZXNzYWdlcyB3aXRob3V0IEFDSy9OQUNLICovCitzdGF0aWMgY29uc3QgZW51bSBhYmlzX25tX21zZ3R5cGUgbm9fYWNrX25hY2tbXSA9IHsKKwlOTV9NVF9NRUFTX1JFU19SRVEsCisJTk1fTVRfU1RPUF9NRUFTLAorCU5NX01UX1NUQVJUX01FQVMsCit9OworCisvKiBNZXNzYWdlcyByZWxhdGVkIHRvIHNvZnR3YXJlIGxvYWQgKi8KK3N0YXRpYyBjb25zdCBlbnVtIGFiaXNfbm1fbXNndHlwZSBzd19sb2FkX21zZ3NbXSA9IHsKKwlOTV9NVF9MT0FEX0lOSVRfQUNLLAorCU5NX01UX0xPQURfSU5JVF9OQUNLLAorCU5NX01UX0xPQURfU0VHX0FDSywKKwlOTV9NVF9MT0FEX0FCT1JULAorCU5NX01UX0xPQURfRU5EX0FDSywKKwlOTV9NVF9MT0FEX0VORF9OQUNLLAorCS8vTk1fTVRfU1dfQUNUX1JFUSwKKwlOTV9NVF9BQ1RJVkFURV9TV19BQ0ssCisJTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywKKwlOTV9NVF9TV19BQ1RJVkFURURfUkVQLAorfTsKKworc3RhdGljIGNvbnN0IGVudW0gYWJpc19ubV9tc2d0eXBlIG5hY2tzW10gPSB7CisJTk1fTVRfTE9BRF9JTklUX05BQ0ssCisJTk1fTVRfTE9BRF9FTkRfTkFDSywKKwlOTV9NVF9TV19BQ1RfUkVRX05BQ0ssCisJTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywKKwlOTV9NVF9FU1RBQkxJU0hfVEVJX05BQ0ssCisJTk1fTVRfQ09OTl9URVJSX1NJR05fTkFDSywKKwlOTV9NVF9ESVNDX1RFUlJfU0lHTl9OQUNLLAorCU5NX01UX0NPTk5fVEVSUl9UUkFGX05BQ0ssCisJTk1fTVRfRElTQ19URVJSX1RSQUZfTkFDSywKKwlOTV9NVF9DT05OX01EUk9QX0xJTktfTkFDSywKKwlOTV9NVF9ESVNDX01EUk9QX0xJTktfTkFDSywKKwlOTV9NVF9TRVRfQlRTX0FUVFJfTkFDSywKKwlOTV9NVF9TRVRfUkFESU9fQVRUUl9OQUNLLAorCU5NX01UX1NFVF9DSEFOX0FUVFJfTkFDSywKKwlOTV9NVF9QRVJGX1RFU1RfTkFDSywKKwlOTV9NVF9TRU5EX1RFU1RfUkVQX05BQ0ssCisJTk1fTVRfU1RPUF9URVNUX05BQ0ssCisJTk1fTVRfU1RPUF9FVkVOVF9SRVBfTkFDSywKKwlOTV9NVF9SRVNUX0VWRU5UX1JFUF9OQUNLLAorCU5NX01UX0NIR19BRE1fU1RBVEVfTkFDSywKKwlOTV9NVF9DSEdfQURNX1NUQVRFX1JFUV9OQUNLLAorCU5NX01UX1JFUF9PVVRTVF9BTEFSTVNfTkFDSywKKwlOTV9NVF9DSEFOR0VPVkVSX05BQ0ssCisJTk1fTVRfT1BTVEFSVF9OQUNLLAorCU5NX01UX1JFSU5JVF9OQUNLLAorCU5NX01UX1NFVF9TSVRFX09VVF9OQUNLLAorCU5NX01UX0NIR19IV19DT05GX05BQ0ssCisJTk1fTVRfR0VUX0FUVFJfTkFDSywKKwlOTV9NVF9TRVRfQUxBUk1fVEhSRVNfTkFDSywKKwlOTV9NVF9CUzExX0JFR0lOX0RCX1RYX05BQ0ssCisJTk1fTVRfQlMxMV9FTkRfREJfVFhfTkFDSywKKwlOTV9NVF9CUzExX0NSRUFURV9PQkpfTkFDSywKKwlOTV9NVF9CUzExX0RFTEVURV9PQkpfTkFDSywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIG5hY2tfbmFtZXNbXSA9IHsKKwl7IE5NX01UX0xPQURfSU5JVF9OQUNLLAkJIlNPRlRXQVJFIExPQUQgSU5JVCIgfSwKKwl7IE5NX01UX0xPQURfRU5EX05BQ0ssCQkiU09GVFdBUkUgTE9BRCBFTkQiIH0sCisJeyBOTV9NVF9TV19BQ1RfUkVRX05BQ0ssCSJTT0ZUV0FSRSBBQ1RJVkFURSBSRVFVRVNUIiB9LAorCXsgTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywJIkFDVElWQVRFIFNPRlRXQVJFIiB9LAorCXsgTk1fTVRfRVNUQUJMSVNIX1RFSV9OQUNLLAkiRVNUQUJMSVNIIFRFSSIgfSwKKwl7IE5NX01UX0NPTk5fVEVSUl9TSUdOX05BQ0ssCSJDT05ORUNUIFRFUlJFU1RSSUFMIFNJR05BTExJTkciIH0sCisJeyBOTV9NVF9ESVNDX1RFUlJfU0lHTl9OQUNLLAkiRElTQ09OTkVDVCBURVJSRVNUUklBTCBTSUdOQUxMSU5HIiB9LAorCXsgTk1fTVRfQ09OTl9URVJSX1RSQUZfTkFDSywJIkNPTk5FQ1QgVEVSUkVTVFJJQUwgVFJBRkZJQyIgfSwKKwl7IE5NX01UX0RJU0NfVEVSUl9UUkFGX05BQ0ssCSJESVNDT05ORUNUIFRFUlJFU1RSSUFMIFRSQUZGSUMiIH0sCisJeyBOTV9NVF9DT05OX01EUk9QX0xJTktfTkFDSywJIkNPTk5FQ1QgTVVMVEktRFJPUCBMSU5LIiB9LAorCXsgTk1fTVRfRElTQ19NRFJPUF9MSU5LX05BQ0ssCSJESVNDT05ORUNUIE1VTFRJLURST1AgTElOSyIgfSwKKwl7IE5NX01UX1NFVF9CVFNfQVRUUl9OQUNLLAkiU0VUIEJUUyBBVFRSSUJVVEUiIH0sCisJeyBOTV9NVF9TRVRfUkFESU9fQVRUUl9OQUNLLAkiU0VUIFJBRElPIEFUVFJJQlVURSIgfSwKKwl7IE5NX01UX1NFVF9DSEFOX0FUVFJfTkFDSywJIlNFVCBDSEFOTkVMIEFUVFJJQlVURSIgfSwKKwl7IE5NX01UX1BFUkZfVEVTVF9OQUNLLAkJIlBFUkZPUk0gVEVTVCIgfSwKKwl7IE5NX01UX1NFTkRfVEVTVF9SRVBfTkFDSywJIlNFTkQgVEVTVCBSRVBPUlQiIH0sCisJeyBOTV9NVF9TVE9QX1RFU1RfTkFDSywJCSJTVE9QIFRFU1QiIH0sCisJeyBOTV9NVF9TVE9QX0VWRU5UX1JFUF9OQUNLLAkiU1RPUCBFVkVOVCBSRVBPUlQiIH0sCisJeyBOTV9NVF9SRVNUX0VWRU5UX1JFUF9OQUNLLAkiUkVTRVQgRVZFTlQgUkVQT1JUIiB9LAorCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9OQUNLLAkiQ0hBTkdFIEFETUlOSVNUUkFUSVZFIFNUQVRFIiB9LAorCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfTkFDSywKKwkJCQkiQ0hBTkdFIEFETUlOSVNUUkFUSVZFIFNUQVRFIFJFUVVFU1QiIH0sCisJeyBOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX05BQ0ssCSJSRVBPUlQgT1VUU1RBTkRJTkcgQUxBUk1TIiB9LAorCXsgTk1fTVRfQ0hBTkdFT1ZFUl9OQUNLLAkiQ0hBTkdFT1ZFUiIgfSwKKwl7IE5NX01UX09QU1RBUlRfTkFDSywJCSJPUFNUQVJUIiB9LAorCXsgTk1fTVRfUkVJTklUX05BQ0ssCQkiUkVJTklUIiB9LAorCXsgTk1fTVRfU0VUX1NJVEVfT1VUX05BQ0ssCSJTRVQgU0lURSBPVVRQVVQiIH0sCisJeyBOTV9NVF9DSEdfSFdfQ09ORl9OQUNLLAkiQ0hBTkdFIEhBUkRXQVJFIENPTkZJR1VSQVRJT04iIH0sCisJeyBOTV9NVF9HRVRfQVRUUl9OQUNLLAkJIkdFVCBBVFRSSUJVVEUiIH0sCisJeyBOTV9NVF9TRVRfQUxBUk1fVEhSRVNfTkFDSywJIlNFVCBBTEFSTSBUSFJFU0hPTEQiIH0sCisJeyBOTV9NVF9CUzExX0JFR0lOX0RCX1RYX05BQ0ssCSJCUzExIEJFR0lOIERBVEFCQVNFIFRSQU5TTUlTU0lPTiIgfSwKKwl7IE5NX01UX0JTMTFfRU5EX0RCX1RYX05BQ0ssCSJCUzExIEVORCBEQVRBQkFTRSBUUkFOU01JU1NJT04iIH0sCisJeyBOTV9NVF9CUzExX0NSRUFURV9PQkpfTkFDSywJIkJTMTEgQ1JFQVRFIE9CSkVDVCIgfSwKKwl7IE5NX01UX0JTMTFfREVMRVRFX09CSl9OQUNLLAkiQlMxMSBERUxFVEUgT0JKRUNUIiB9LAorCXsgMCwJCQkJTlVMTCB9Cit9OworCisvKiBDaGFwdGVyIDkuNC4zNiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgbmFja19jYXVzZV9uYW1lc1tdID0geworCS8qIEdlbmVyYWwgTmFjayBDYXVzZXMgKi8KKwl7IE5NX05BQ0tfSU5DT1JSX1NUUlVDVCwJIkluY29ycmVjdCBtZXNzYWdlIHN0cnVjdHVyZSIgfSwKKwl7IE5NX05BQ0tfTVNHVFlQRV9JTlZBTCwJIkludmFsaWQgbWVzc2FnZSB0eXBlIHZhbHVlIiB9LAorCXsgTk1fTkFDS19PQkpDTEFTU19JTlZBTCwJIkludmFsaWQgT2JqZWN0IGNsYXNzIHZhbHVlIiB9LAorCXsgTk1fTkFDS19PQkpDTEFTU19OT1RTVVBQLAkiT2JqZWN0IGNsYXNzIG5vdCBzdXBwb3J0ZWQiIH0sCisJeyBOTV9OQUNLX0JUU05SX1VOS04sCQkiQlRTIG5vLiB1bmtub3duIiB9LAorCXsgTk1fTkFDS19UUlhOUl9VTktOLAkJIkJhc2ViYW5kIFRyYW5zY2VpdmVyIG5vLiB1bmtub3duIiB9LAorCXsgTk1fTkFDS19PQkpJTlNUX1VOS04sCQkiT2JqZWN0IEluc3RhbmNlIHVua25vd24iIH0sCisJeyBOTV9OQUNLX0FUVFJJRF9JTlZBTCwJCSJJbnZhbGlkIGF0dHJpYnV0ZSBpZGVudGlmaWVyIHZhbHVlIiB9LAorCXsgTk1fTkFDS19BVFRSSURfTk9UU1VQUCwJIkF0dHJpYnV0ZSBpZGVudGlmaWVyIG5vdCBzdXBwb3J0ZWQiIH0sCisJeyBOTV9OQUNLX1BBUkFNX1JBTkdFLAkJIlBhcmFtZXRlciB2YWx1ZSBvdXRzaWRlIHBlcm1pdHRlZCByYW5nZSIgfSwKKwl7IE5NX05BQ0tfQVRUUkxJU1RfSU5DT05TSVNURU5ULCJJbmNvbnNpc3RlbmN5IGluIGF0dHJpYnV0ZSBsaXN0IiB9LAorCXsgTk1fTkFDS19TUEVDX0lNUExfTk9UU1VQUCwJIlNwZWNpZmllZCBpbXBsZW1lbnRhdGlvbiBub3Qgc3VwcG9ydGVkIiB9LAorCXsgTk1fTkFDS19DQU5UX1BFUkZPUk0sCQkiTWVzc2FnZSBjYW5ub3QgYmUgcGVyZm9ybWVkIiB9LAorCS8qIFNwZWNpZmljIE5hY2sgQ2F1c2VzICovCisJeyBOTV9OQUNLX1JFU19OT1RJTVBMLAkJIlJlc291cmNlIG5vdCBpbXBsZW1lbnRlZCIgfSwKKwl7IE5NX05BQ0tfUkVTX05PVEFWQUlMLAkJIlJlc291cmNlIG5vdCBhdmFpbGFibGUiIH0sCisJeyBOTV9OQUNLX0ZSRVFfTk9UQVZBSUwsCSJGcmVxdWVuY3kgbm90IGF2YWlsYWJsZSIgfSwKKwl7IE5NX05BQ0tfVEVTVF9OT1RTVVBQLAkJIlRlc3Qgbm90IHN1cHBvcnRlZCIgfSwKKwl7IE5NX05BQ0tfQ0FQQUNJVFlfUkVTVFIsCSJDYXBhY2l0eSByZXN0cmljdGlvbnMiIH0sCisJeyBOTV9OQUNLX1BIWVNDRkdfTk9UUEVSRk9STSwJIlBoeXNpY2FsIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCIgfSwKKwl7IE5NX05BQ0tfVEVTVF9OT1RJTklULAkJIlRlc3Qgbm90IGluaXRpYXRlZCIgfSwKKwl7IE5NX05BQ0tfUEhZU0NGR19OT1RSRVNUT1JFLAkiUGh5c2ljYWwgY29uZmlndXJhdGlvbiBjYW5ub3QgYmUgcmVzdG9yZWQiIH0sCisJeyBOTV9OQUNLX1RFU1RfTk9TVUNILAkJIk5vIHN1Y2ggdGVzdCIgfSwKKwl7IE5NX05BQ0tfVEVTVF9OT1NUT1AsCQkiVGVzdCBjYW5ub3QgYmUgc3RvcHBlZCIgfSwKKwl7IE5NX05BQ0tfTVNHSU5DT05TSVNUX1BIWVNDRkcsCSJNZXNzYWdlIGluY29uc2lzdGVudCB3aXRoIHBoeXNpY2FsIGNvbmZpZ3VyYXRpb24iIH0sCisJeyBOTV9OQUNLX0ZJTEVfSU5DT01QTEVURSwJIkNvbXBsZXRlIGZpbGUgbm90cmVjZWl2ZWQiIH0sCisJeyBOTV9OQUNLX0ZJTEVfTk9UQVZBSUwsCSJGaWxlIG5vdCBhdmFpbGFibGUgYXQgZGVzdGluYXRpb24iIH0sCisJeyBOTV9OQUNLX0ZJTEVfTk9UQUNUSVZBVEUsCSJGaWxlIGNhbm5vdCBiZSBhY3RpdmF0ZSIgfSwKKwl7IE5NX05BQ0tfUkVRX05PVF9HUkFOVCwJIlJlcXVlc3Qgbm90IGdyYW50ZWQiIH0sCisJeyBOTV9OQUNLX1dBSVQsCQkJIldhaXQiIH0sCisJeyBOTV9OQUNLX05PVEhfUkVQT1JUX0VYSVNULAkiTm90aGluZyByZXBvcnRhYmxlIGV4aXN0aW5nIiB9LAorCXsgTk1fTkFDS19NRUFTX05PVFNVUFAsCQkiTWVhc3VyZW1lbnQgbm90IHN1cHBvcnRlZCIgfSwKKwl7IE5NX05BQ0tfTUVBU19OT1RTVEFSVCwJIk1lYXN1cmVtZW50IG5vdCBzdGFydGVkIiB9LAorCXsgMCwJCQkJTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbmFja19jYXVzZV9uYW1lKHVfaW50OF90IGNhdXNlKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKG5hY2tfY2F1c2VfbmFtZXMsIGNhdXNlKTsKK30KKworLyogQ2hhcHRlciA5LjQuMTY6IEV2ZW50IFR5cGUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGV2ZW50X3R5cGVfbmFtZXNbXSA9IHsKKwl7IE5NX0VWVF9DT01NX0ZBSUwsCQkiY29tbXVuaWNhdGlvbiBmYWlsdXJlIiB9LAorCXsgTk1fRVZUX1FPU19GQUlMLAkJInF1YWxpdHkgb2Ygc2VydmljZSBmYWlsdXJlIiB9LAorCXsgTk1fRVZUX1BST0NfRkFJTCwJCSJwcm9jZXNzaW5nIGZhaWx1cmUiIH0sCisJeyBOTV9FVlRfRVFVSVBfRkFJTCwJCSJlcXVpcG1lbnQgZmFpbHVyZSIgfSwKKwl7IE5NX0VWVF9FTlZfRkFJTCwJCSJlbnZpcm9ubWVudCBmYWlsdXJlIiB9LAorCXsgMCwJCQkJTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZXZlbnRfdHlwZV9uYW1lKHVfaW50OF90IGNhdXNlKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGV2ZW50X3R5cGVfbmFtZXMsIGNhdXNlKTsKK30KKworLyogQ2hhcHRlciA5LjQuNjM6IFBlcmNlaXZlZCBTZXZlcml0eSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgc2V2ZXJpdHlfbmFtZXNbXSA9IHsKKwl7IE5NX1NFVkVSX0NFQVNFRCwJCSJmYWlsdXJlIGNlYXNlZCIgfSwKKwl7IE5NX1NFVkVSX0NSSVRJQ0FMLAkJImNyaXRpY2FsIGZhaWx1cmUiIH0sCisJeyBOTV9TRVZFUl9NQUpPUiwJCSJtYWpvciBmYWlsdXJlIiB9LAorCXsgTk1fU0VWRVJfTUlOT1IsCQkibWlub3IgZmFpbHVyZSIgfSwKKwl7IE5NX1NFVkVSX1dBUk5JTkcsCQkid2FybmluZyBsZXZlbCBmYWlsdXJlIiB9LAorCXsgTk1fU0VWRVJfSU5ERVRFUk1JTkFURSwJImluZGV0ZXJtaW5hdGUgZmFpbHVyZSIgfSwKKwl7IDAsCQkJCU5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnNldmVyaXR5X25hbWUodV9pbnQ4X3QgY2F1c2UpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcoc2V2ZXJpdHlfbmFtZXMsIGNhdXNlKTsKK30KKworLyogQXR0cmlidXRlcyB0aGF0IHRoZSBCU0MgY2FuIHNldCwgbm90IG9ubHkgZ2V0LCBhY2NvcmRpbmcgdG8gU2VjdGlvbiA5LjQgKi8KK3N0YXRpYyBjb25zdCBlbnVtIGFiaXNfbm1fYXR0ciBubV9hdHRfc2V0dGFibGVbXSA9IHsKKwlOTV9BVFRfQUREX0lORk8sCisJTk1fQVRUX0FERF9URVhULAorCU5NX0FUVF9ERVNULAorCU5NX0FUVF9FVkVOVF9UWVBFLAorCU5NX0FUVF9GSUxFX0RBVEEsCisJTk1fQVRUX0dFVF9BUkksCisJTk1fQVRUX0hXX0NPTkZfQ0hHLAorCU5NX0FUVF9MSVNUX1JFUV9BVFRSLAorCU5NX0FUVF9NRFJPUF9MSU5LLAorCU5NX0FUVF9NRFJPUF9ORVhULAorCU5NX0FUVF9OQUNLX0NBVVNFUywKKwlOTV9BVFRfT1VUU1RfQUxBUk0sCisJTk1fQVRUX1BIWVNfQ09ORiwKKwlOTV9BVFRfUFJPQl9DQVVTRSwKKwlOTV9BVFRfUkFEX1NVQkMsCisJTk1fQVRUX1NPVVJDRSwKKwlOTV9BVFRfU1BFQ19QUk9CLAorCU5NX0FUVF9TVEFSVF9USU1FLAorCU5NX0FUVF9URVNUX0RVUiwKKwlOTV9BVFRfVEVTVF9OTywKKwlOTV9BVFRfVEVTVF9SRVBPUlQsCisJTk1fQVRUX1dJTkRPV19TSVpFLAorCU5NX0FUVF9TRVZFUklUWSwKKwlOTV9BVFRfTUVBU19SRVMsCisJTk1fQVRUX01FQVNfVFlQRSwKK307CisKK2NvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBubV9hdHRfdGx2ZGVmID0geworCS5kZWYgPSB7CisJCVtOTV9BVFRfQUJJU19DSEFOTkVMXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisJCVtOTV9BVFRfQUREX0lORk9dID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9BRERfVEVYVF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0FETV9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0FSRkNOX0xJU1RdPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0FVVE9OX1JFUE9SVF0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0FWQUlMX1NUQVRVU10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0JDQ0hfQVJGQ05dID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9CU0lDXSA9CQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0JUU19BSVJfVElNRVJdID0JeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0NDQ0hfTF9JX1BdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9DQ0NIX0xfVF0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0NIQU5fQ09NQl0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0NPTk5fRkFJTF9DUklUXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9ERVNUXSA9CQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0VWRU5UX1RZUEVdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9GSUxFX0RBVEFdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9GSUxFX0lEXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfRklMRV9WRVJTSU9OXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfR1NNX1RJTUVdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9IU05dID0JCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfSFdfQ09ORklHXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfSFdfREVTQ10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0lOVEFWRV9QQVJBTV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0lOVEVSRl9CT1VORF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgNiB9LAorCQlbTk1fQVRUX0xJU1RfUkVRX0FUVFJdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX01BSU9dID0JCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfTUFOVUZfU1RBVEVdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9NQU5VRl9USFJFU0hdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9NQU5VRl9JRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX01BWF9UQV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX01EUk9QX0xJTktdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9NRFJPUF9ORVhUXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfTkFDS19DQVVTRVNdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9OWTFdID0JCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfT1BFUl9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX09WRVJMX1BFUklPRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1BIWVNfQ09ORl0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1BPV0VSX0NMQVNTXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfUE9XRVJfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisJCVtOTV9BVFRfUFJPQl9DQVVTRV0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMyB9LAorCQlbTk1fQVRUX1JBQ0hfQl9USFJFU0hdID0JeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0xEQVZHX1NMT1RTXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfUkFEX1NVQkNdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9SRl9NQVhQT1dSX1JdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9TSVRFX0lOUFVUU10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1NJVEVfT1VUUFVUU10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1NPVVJDRV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1NQRUNfUFJPQl0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1NUQVJUX1RJTUVdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9UMjAwXSA9CQkJeyBUTFZfVFlQRV9GSVhFRCwgNyB9LAorCQlbTk1fQVRUX1RFSV0gPQkJCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9URVNUX0RVUl0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbTk1fQVRUX1RFU1RfTk9dID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9URVNUX1JFUE9SVF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1ZTV1JfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfV0lORE9XX1NJWkVdID0gCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfVFNDXSA9CQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1NXX0NPTkZJR10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1NFVkVSSVRZXSA9IAkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0dFVF9BUkldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9IV19DT05GX0NIR10gPSAJCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9PVVRTVF9BTEFSTV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX01FQVNfUkVTXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIGFiaXNfbm1fY2hhbl9jb21iIGNoY29tYjRwY2hhbltdID0geworCVtHU01fUENIQU5fQ0NDSF0JPSBOTV9DSEFOQ19tYWluQkNDSCwKKwlbR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0XQk9IE5NX0NIQU5DX0JDQ0hDb21iLAorCVtHU01fUENIQU5fVENIX0ZdCT0gTk1fQ0hBTkNfVENIRnVsbCwKKwlbR1NNX1BDSEFOX1RDSF9IXQk9IE5NX0NIQU5DX1RDSEhhbGYsCisJW0dTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4Q10gPSBOTV9DSEFOQ19TRENDSCwKKwlbR1NNX1BDSEFOX1BEQ0hdCT0gTk1fQ0hBTkNfSVBBQ19QRENILAorCVtHU01fUENIQU5fVENIX0ZfUERDSF0JPSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfUERDSCwKKwkvKiBGSVhNRTogYm91bmRzIGNoZWNrICovCit9OworCitpbnQgYWJpc19ubV9jaGNvbWI0cGNoYW4oZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbikKK3sKKwlpZiAocGNoYW4gPCBBUlJBWV9TSVpFKGNoY29tYjRwY2hhbikpCisJCXJldHVybiBjaGNvbWI0cGNoYW5bcGNoYW5dOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBhYmlzX25tX3Rsdl9wYXJzZShzdHJ1Y3QgdGx2X3BhcnNlZCAqdHAsIHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IHVfaW50OF90ICpidWYsIGludCBsZW4pCit7CisJaWYgKCFidHMtPm1vZGVsKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gdGx2X3BhcnNlKHRwLCAmYnRzLT5tb2RlbC0+bm1fYXR0X3RsdmRlZiwgYnVmLCBsZW4sIDAsIDApOworfQorCitzdGF0aWMgaW50IGlzX2luX2FycihlbnVtIGFiaXNfbm1fbXNndHlwZSBtdCwgY29uc3QgZW51bSBhYmlzX25tX21zZ3R5cGUgKmFyciwgaW50IHNpemUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmIChhcnJbaV0gPT0gbXQpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKKy8qIGlzIHRoaXMgbXNndHlwZSB0aGUgdXN1YWwgQUNLL05BQ0sgdHlwZSA/ICovCitzdGF0aWMgaW50IGlzX2Fja19uYWNrKGVudW0gYWJpc19ubV9tc2d0eXBlIG10KQoreworCXJldHVybiAhaXNfaW5fYXJyKG10LCBub19hY2tfbmFjaywgQVJSQVlfU0laRShub19hY2tfbmFjaykpOworfQorI2VuZGlmCisKKy8qIGlzIHRoaXMgbXNndHlwZSBhIHJlcG9ydCA/ICovCitzdGF0aWMgaW50IGlzX3JlcG9ydChlbnVtIGFiaXNfbm1fbXNndHlwZSBtdCkKK3sKKwlyZXR1cm4gaXNfaW5fYXJyKG10LCByZXBvcnRzLCBBUlJBWV9TSVpFKHJlcG9ydHMpKTsKK30KKworI2RlZmluZSBNVF9BQ0soeCkJKHgrMSkKKyNkZWZpbmUgTVRfTkFDSyh4KQkoeCsyKQorCitzdGF0aWMgdm9pZCBmaWxsX29tX2hkcihzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oLCB1X2ludDhfdCBsZW4pCit7CisJb2gtPm1kaXNjID0gQUJJU19PTV9NRElTQ19GT007CisJb2gtPnBsYWNlbWVudCA9IEFCSVNfT01fUExBQ0VNRU5UX09OTFk7CisJb2gtPnNlcXVlbmNlID0gMDsKKwlvaC0+bGVuZ3RoID0gbGVuOworfQorCitzdGF0aWMgdm9pZCBmaWxsX29tX2ZvbV9oZHIoc3RydWN0IGFiaXNfb21faGRyICpvaCwgdV9pbnQ4X3QgbGVuLAorCQkJICAgIHVfaW50OF90IG1zZ190eXBlLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCQkgICAgdV9pbnQ4X3QgYnRzX25yLCB1X2ludDhfdCB0cnhfbnIsIHVfaW50OF90IHRzX25yKQoreworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9CisJCQkoc3RydWN0IGFiaXNfb21fZm9tX2hkciAqKSBvaC0+ZGF0YTsKKworCWZpbGxfb21faGRyKG9oLCBsZW4rc2l6ZW9mKCpmb2gpKTsKKwlmb2gtPm1zZ190eXBlID0gbXNnX3R5cGU7CisJZm9oLT5vYmpfY2xhc3MgPSBvYmpfY2xhc3M7CisJZm9oLT5vYmpfaW5zdC5idHNfbnIgPSBidHNfbnI7CisJZm9oLT5vYmpfaW5zdC50cnhfbnIgPSB0cnhfbnI7CisJZm9oLT5vYmpfaW5zdC50c19uciA9IHRzX25yOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKm5tX21zZ2JfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gbXNnYl9hbGxvY19oZWFkcm9vbShPTV9BTExPQ19TSVpFLCBPTV9IRUFEUk9PTV9TSVpFLAorCQkJCSAgICJPTUwiKTsKK30KKworLyogU2VuZCBhIE9NTCBOTSBNZXNzYWdlIGZyb20gQlNDIHRvIEJUUyAqLworaW50IGFiaXNfbm1fc2VuZG1zZyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCW1zZy0+dHJ4ID0gYnRzLT5jMDsKKworCXJldHVybiBfYWJpc19ubV9zZW5kbXNnKG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yY3Ztc2dfc3coc3RydWN0IG1zZ2IgKm1iKTsKKworc3RhdGljIHN0cnVjdCB2YWx1ZV9zdHJpbmcgb2JqX2NsYXNzX25hbWVzW10gPSB7CisJeyBOTV9PQ19TSVRFX01BTkFHRVIsCSJTSVRFIE1BTkFHRVIiIH0sCisJeyBOTV9PQ19CVFMsCQkiQlRTIiB9LAorCXsgTk1fT0NfUkFESU9fQ0FSUklFUiwJIlJBRElPIENBUlJJRVIiIH0sCisJeyBOTV9PQ19CQVNFQl9UUkFOU0MsCSJCQVNFQkFORCBUUkFOU0NFSVZFUiIgfSwKKwl7IE5NX09DX0NIQU5ORUwsCSJDSEFOTkVMIiB9LAorCXsgTk1fT0NfQlMxMV9BREpDLAkiQURKQyIgfSwKKwl7IE5NX09DX0JTMTFfSEFORE9WRVIsCSJIQU5ET1ZFUiIgfSwKKwl7IE5NX09DX0JTMTFfUFdSX0NUUkwsCSJQT1dFUiBDT05UUk9MIiB9LAorCXsgTk1fT0NfQlMxMV9CVFNFLAkiQlRTRSIgfSwKKwl7IE5NX09DX0JTMTFfUkFDSywJIlJBQ0siIH0sCisJeyBOTV9PQ19CUzExX1RFU1QsCSJURVNUIiB9LAorCXsgTk1fT0NfQlMxMV9FTlZBQlRTRSwJIkVOVkFCVFNFIiB9LAorCXsgTk1fT0NfQlMxMV9CUE9SVCwJIkJQT1JUIiB9LAorCXsgTk1fT0NfR1BSU19OU0UsCSJHUFJTIE5TRSIgfSwKKwl7IE5NX09DX0dQUlNfQ0VMTCwJIkdQUlMgQ0VMTCIgfSwKKwl7IE5NX09DX0dQUlNfTlNWQywJIkdQUlMgTlNWQyIgfSwKKwl7IE5NX09DX0JTMTEsCQkiU0lFTUVOU0hXIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpvYmpfY2xhc3NfbmFtZSh1X2ludDhfdCBvYykKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhvYmpfY2xhc3NfbmFtZXMsIG9jKTsKK30KKworY29uc3QgY2hhciAqbm1fb3BzdGF0ZV9uYW1lKHVfaW50OF90IG9zKQoreworCXN3aXRjaCAob3MpIHsKKwljYXNlIE5NX09QU1RBVEVfRElTQUJMRUQ6CisJCXJldHVybiAiRGlzYWJsZWQiOworCWNhc2UgTk1fT1BTVEFURV9FTkFCTEVEOgorCQlyZXR1cm4gIkVuYWJsZWQiOworCWNhc2UgTk1fT1BTVEFURV9OVUxMOgorCQlyZXR1cm4gIk5VTEwiOworCWRlZmF1bHQ6CisJCXJldHVybiAiUkZVIjsKKwl9Cit9CisKKy8qIENoYXB0ZXIgOS40LjcgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGF2YWlsX25hbWVzW10gPSB7CisJeyAwLCAJIkluIHRlc3QiIH0sCisJeyAxLAkiRmFpbGVkIiB9LAorCXsgMiwJIlBvd2VyIG9mZiIgfSwKKwl7IDMsCSJPZmYgbGluZSIgfSwKKwkvKiBOb3QgdXNlZCAqLworCXsgNSwJIkRlcGVuZGVuY3kiIH0sCisJeyA2LAkiRGVncmFkZWQiIH0sCisJeyA3LAkiTm90IGluc3RhbGxlZCIgfSwKKwl7IDB4ZmYsICJPSyIgfSwKKwl7IDAsCU5VTEwgfQorfTsKKworY29uc3QgY2hhciAqbm1fYXZhaWxfbmFtZSh1X2ludDhfdCBhdmFpbCkKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhhdmFpbF9uYW1lcywgYXZhaWwpOworfQorCitzdGF0aWMgc3RydWN0IHZhbHVlX3N0cmluZyB0ZXN0X25hbWVzW10gPSB7CisJLyogRklYTUU6IHN0YW5kYXJkIHRlc3QgbmFtZXMgKi8KKwl7IE5NX0lQQUNDX1RFU1ROT19DSEFOX1VTQUdFLCAiQ2hhbm5lbCBVc2FnZSIgfSwKKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NIX0NIQU5fVVNBR0UsICJCQ0NIIENoYW5uZWwgVXNhZ2UiIH0sCisJeyBOTV9JUEFDQ19URVNUTk9fRlJFUV9TWU5DLCAiRnJlcXVlbmN5IFN5bmNocm9uaXphdGlvbiIgfSwKKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NIX0lORk8sICJCQ0NIIEluZm8iIH0sCisJeyBOTV9JUEFDQ19URVNUTk9fVFhfQkVBQ09OLCAiVHJhbnNtaXQgQmVhY29uIiB9LAorCXsgTk1fSVBBQ0NfVEVTVE5PX1NZU0lORk9fTU9OSVRPUiwgIlN5c3RlbSBJbmZvIE1vbml0b3IiIH0sCisJeyBOTV9JUEFDQ19URVNUTk9fQkNDQ0hfTU9OSVRPUiwgIkJDQ0ggTW9uaXRvciIgfSwKKwl7IDAsIE5VTEwgfQorfTsKKworY29uc3QgY2hhciAqbm1fYWRtX25hbWUodV9pbnQ4X3QgYWRtKQoreworCXN3aXRjaCAoYWRtKSB7CisJY2FzZSAxOgorCQlyZXR1cm4gIkxvY2tlZCI7CisJY2FzZSAyOgorCQlyZXR1cm4gIlVubG9ja2VkIjsKKwljYXNlIDM6CisJCXJldHVybiAiU2h1dGRvd24iOworCWRlZmF1bHQ6CisJCXJldHVybiAiPG5vdCB1c2VkPiI7CisJfQorfQorCitpbnQgbm1faXNfcnVubmluZyhzdHJ1Y3QgZ3NtX25tX3N0YXRlICpzKSB7CisJcmV0dXJuIChzLT5vcGVyYXRpb25hbCA9PSBOTV9PUFNUQVRFX0VOQUJMRUQpICYmICgKKwkJKHMtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX09LKSB8fAorCQkocy0+YXZhaWxhYmlsaXR5ID09IDB4ZmYpCisJKTsKK30KKworc3RhdGljIHZvaWQgZGVidWdwX2ZvaChzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2gpCit7CisJREVCVUdQKEROTSwgIk9DPSVzKCUwMngpIElOU1Q9KCUwMngsJTAyeCwlMDJ4KSAiLAorCQlvYmpfY2xhc3NfbmFtZShmb2gtPm9ial9jbGFzcyksIGZvaC0+b2JqX2NsYXNzLCAKKwkJZm9oLT5vYmpfaW5zdC5idHNfbnIsIGZvaC0+b2JqX2luc3QudHJ4X25yLAorCQlmb2gtPm9ial9pbnN0LnRzX25yKTsKK30KKworLyogb2J0YWluIHRoZSBnc21fbm1fc3RhdGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIGEgZ2l2ZW4gb2JqZWN0IGluc3RhbmNlICovCitzdGF0aWMgc3RydWN0IGdzbV9ubV9zdGF0ZSAqCitvYmpjbGFzczJubXN0YXRlKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJIHN0cnVjdCBhYmlzX29tX29ial9pbnN0ICpvYmpfaW5zdCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlICpubV9zdGF0ZSA9IE5VTEw7CisKKwlzd2l0Y2ggKG9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfQlRTOgorCQlubV9zdGF0ZSA9ICZidHMtPm5tX3N0YXRlOworCQlicmVhazsKKwljYXNlIE5NX09DX1JBRElPX0NBUlJJRVI6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJREVCVUdQQyhETk0sICJUUlggJXUgZG9lcyBub3QgZXhpc3QgIiwgb2JqX2luc3QtPnRyeF9ucik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJbm1fc3RhdGUgPSAmdHJ4LT5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19CQVNFQl9UUkFOU0M6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJREVCVUdQQyhETk0sICJUUlggJXUgZG9lcyBub3QgZXhpc3QgIiwgb2JqX2luc3QtPnRyeF9ucik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJbm1fc3RhdGUgPSAmdHJ4LT5iYl90cmFuc2Mubm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfQ0hBTk5FTDoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQlERUJVR1BDKEROTSwgIlRSWCAldSBkb2VzIG5vdCBleGlzdCAiLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQlpZiAob2JqX2luc3QtPnRzX25yID49IFRSWF9OUl9UUykKKwkJCXJldHVybiBOVUxMOworCQlubV9zdGF0ZSA9ICZ0cngtPnRzW29ial9pbnN0LT50c19ucl0ubm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfU0lURV9NQU5BR0VSOgorCQlubV9zdGF0ZSA9ICZidHMtPnNpdGVfbWdyLm5tX3N0YXRlOworCQlicmVhazsKKwljYXNlIE5NX09DX0JTMTE6CisJCXN3aXRjaCAob2JqX2luc3QtPmJ0c19ucikgeworCQljYXNlIEJTMTFfT0JKX0NDTEs6CisJCQlubV9zdGF0ZSA9ICZidHMtPmJzMTEuY2Nsay5ubV9zdGF0ZTsKKwkJCWJyZWFrOworCQljYXNlIEJTMTFfT0JKX0JCU0lHOgorCQkJaWYgKG9ial9pbnN0LT50c19uciA+IGJ0cy0+bnVtX3RyeCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQkJbm1fc3RhdGUgPSAmdHJ4LT5iczExLmJic2lnLm5tX3N0YXRlOworCQkJYnJlYWs7CisJCWNhc2UgQlMxMV9PQkpfUEE6CisJCQlpZiAob2JqX2luc3QtPnRzX25yID4gYnRzLT5udW1fdHJ4KQorCQkJCXJldHVybiBOVUxMOworCQkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgb2JqX2luc3QtPnRyeF9ucik7CisJCQlubV9zdGF0ZSA9ICZ0cngtPmJzMTEucGEubm1fc3RhdGU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBOVUxMOworCQl9CisJY2FzZSBOTV9PQ19CUzExX1JBQ0s6CisJCW5tX3N0YXRlID0gJmJ0cy0+YnMxMS5yYWNrLm5tX3N0YXRlOworCQlicmVhazsKKwljYXNlIE5NX09DX0JTMTFfRU5WQUJUU0U6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IEFSUkFZX1NJWkUoYnRzLT5iczExLmVudmFidHNlKSkKKwkJCXJldHVybiBOVUxMOworCQlubV9zdGF0ZSA9ICZidHMtPmJzMTEuZW52YWJ0c2Vbb2JqX2luc3QtPnRyeF9ucl0ubm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19OU0U6CisJCW5tX3N0YXRlID0gJmJ0cy0+Z3Bycy5uc2Uubm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19DRUxMOgorCQlubV9zdGF0ZSA9ICZidHMtPmdwcnMuY2VsbC5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX05TVkM6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IEFSUkFZX1NJWkUoYnRzLT5ncHJzLm5zdmMpKQorCQkJcmV0dXJuIE5VTEw7CisJCW5tX3N0YXRlID0gJmJ0cy0+Z3Bycy5uc3ZjW29ial9pbnN0LT50cnhfbnJdLm5tX3N0YXRlOworCQlicmVhazsKKwl9CisJcmV0dXJuIG5tX3N0YXRlOworfQorCisvKiBvYnRhaW4gdGhlIGluLW1lbW9yeSBkYXRhIHN0cnVjdHVyZSBvZiBhIGdpdmVuIG9iamVjdCBpbnN0YW5jZSAqLworc3RhdGljIHZvaWQgKgorb2JqY2xhc3Myb2JqKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkgICAgIHN0cnVjdCBhYmlzX29tX29ial9pbnN0ICpvYmpfaW5zdCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwl2b2lkICpvYmogPSBOVUxMOworCisJc3dpdGNoIChvYmpfY2xhc3MpIHsKKwljYXNlIE5NX09DX0JUUzoKKwkJb2JqID0gYnRzOworCQlicmVhazsKKwljYXNlIE5NX09DX1JBRElPX0NBUlJJRVI6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJREVCVUdQQyhETk0sICJUUlggJXUgZG9lcyBub3QgZXhpc3QgIiwgb2JqX2luc3QtPnRyeF9ucik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJb2JqID0gdHJ4OworCQlicmVhazsKKwljYXNlIE5NX09DX0JBU0VCX1RSQU5TQzoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQlERUJVR1BDKEROTSwgIlRSWCAldSBkb2VzIG5vdCBleGlzdCAiLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQlvYmogPSAmdHJ4LT5iYl90cmFuc2M7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfQ0hBTk5FTDoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQlERUJVR1BDKEROTSwgIlRSWCAldSBkb2VzIG5vdCBleGlzdCAiLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQlpZiAob2JqX2luc3QtPnRzX25yID49IFRSWF9OUl9UUykKKwkJCXJldHVybiBOVUxMOworCQlvYmogPSAmdHJ4LT50c1tvYmpfaW5zdC0+dHNfbnJdOworCQlicmVhazsKKwljYXNlIE5NX09DX1NJVEVfTUFOQUdFUjoKKwkJb2JqID0gJmJ0cy0+c2l0ZV9tZ3I7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19OU0U6CisJCW9iaiA9ICZidHMtPmdwcnMubnNlOworCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfQ0VMTDoKKwkJb2JqID0gJmJ0cy0+Z3Bycy5jZWxsOworCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfTlNWQzoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gQVJSQVlfU0laRShidHMtPmdwcnMubnN2YykpCisJCQlyZXR1cm4gTlVMTDsKKwkJb2JqID0gJmJ0cy0+Z3Bycy5uc3ZjW29ial9pbnN0LT50cnhfbnJdOworCQlicmVhazsKKwl9CisJcmV0dXJuIG9iajsKK30KKworLyogVXBkYXRlIHRoZSBhZG1pbmlzdHJhdGl2ZSBzdGF0ZSBvZiBhIGdpdmVuIG9iamVjdCBpbiBvdXIgaW4tbWVtb3J5IGRhdGEKKyAqIHN0cnVjdHVyZXMgYW5kIHNlbmQgYW4gZXZlbnQgdG8gdGhlIGhpZ2hlciBsYXllciAqLworc3RhdGljIGludCB1cGRhdGVfYWRtc3RhdGUoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLAorCQkJICAgc3RydWN0IGFiaXNfb21fb2JqX2luc3QgKm9ial9pbnN0LCB1X2ludDhfdCBhZG1fc3RhdGUpCit7CisJc3RydWN0IGdzbV9ubV9zdGF0ZSAqbm1fc3RhdGUsIG5ld19zdGF0ZTsKKwl2b2lkICpvYmo7CisJaW50IHJjOworCisJb2JqID0gb2JqY2xhc3Myb2JqKGJ0cywgb2JqX2NsYXNzLCBvYmpfaW5zdCk7CisJaWYgKCFvYmopCisJCXJldHVybiAtRUlOVkFMOworCW5tX3N0YXRlID0gb2JqY2xhc3Mybm1zdGF0ZShidHMsIG9ial9jbGFzcywgb2JqX2luc3QpOworCWlmICghbm1fc3RhdGUpCisJCXJldHVybiAtMTsKKworCW5ld19zdGF0ZSA9ICpubV9zdGF0ZTsKKwluZXdfc3RhdGUuYWRtaW5pc3RyYXRpdmUgPSBhZG1fc3RhdGU7CisKKwlyYyA9IG5tX3N0YXRlX2V2ZW50KEVWVF9TVEFURUNIR19BRE0sIG9ial9jbGFzcywgb2JqLCBubV9zdGF0ZSwgJm5ld19zdGF0ZSk7CisKKwlubV9zdGF0ZS0+YWRtaW5pc3RyYXRpdmUgPSBhZG1fc3RhdGU7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yeF9zdGF0ZWNoZ19yZXAoc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1iKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbWItPnRyeC0+YnRzOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbm1fc3RhdGUgKm5tX3N0YXRlLCBuZXdfc3RhdGU7CisJaW50IHJjOworCisJREVCVUdQQyhETk0sICJTVEFURSBDSEc6ICIpOworCisJbWVtc2V0KCZuZXdfc3RhdGUsIDAsIHNpemVvZihuZXdfc3RhdGUpKTsKKworCW5tX3N0YXRlID0gb2JqY2xhc3Mybm1zdGF0ZShidHMsIGZvaC0+b2JqX2NsYXNzLCAmZm9oLT5vYmpfaW5zdCk7CisJaWYgKCFubV9zdGF0ZSkgeworCQlERUJVR1BDKEROTSwgInVua25vd24gb2JqZWN0IGNsYXNzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbmV3X3N0YXRlID0gKm5tX3N0YXRlOworCQorCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgYnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX09QRVJfU1RBVEUpKSB7CisJCW5ld19zdGF0ZS5vcGVyYXRpb25hbCA9ICpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9PUEVSX1NUQVRFKTsKKwkJREVCVUdQQyhETk0sICJPUF9TVEFURT0lcyAiLCBubV9vcHN0YXRlX25hbWUobmV3X3N0YXRlLm9wZXJhdGlvbmFsKSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfQVZBSUxfU1RBVFVTKSkgeworCQlpZiAoVExWUF9MRU4oJnRwLCBOTV9BVFRfQVZBSUxfU1RBVFVTKSA9PSAwKQorCQkJbmV3X3N0YXRlLmF2YWlsYWJpbGl0eSA9IDB4ZmY7CisJCWVsc2UKKwkJCW5ld19zdGF0ZS5hdmFpbGFiaWxpdHkgPSAqVExWUF9WQUwoJnRwLCBOTV9BVFRfQVZBSUxfU1RBVFVTKTsKKwkJREVCVUdQQyhETk0sICJBVkFJTD0lcyglMDJ4KSAiLCBubV9hdmFpbF9uYW1lKG5ld19zdGF0ZS5hdmFpbGFiaWxpdHkpLAorCQkJbmV3X3N0YXRlLmF2YWlsYWJpbGl0eSk7CisJfSBlbHNlCisJCW5ld19zdGF0ZS5hdmFpbGFiaWxpdHkgPSAweGZmOworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfQURNX1NUQVRFKSkgeworCQluZXdfc3RhdGUuYWRtaW5pc3RyYXRpdmUgPSAqVExWUF9WQUwoJnRwLCBOTV9BVFRfQURNX1NUQVRFKTsKKwkJREVCVUdQQyhETk0sICJBRE09JTJzICIsIG5tX2FkbV9uYW1lKG5ld19zdGF0ZS5hZG1pbmlzdHJhdGl2ZSkpOworCX0KKwlERUJVR1BDKEROTSwgIlxuIik7CisKKwlpZiAoKG5ld19zdGF0ZS5hZG1pbmlzdHJhdGl2ZSAhPSAwICYmIG5tX3N0YXRlLT5hZG1pbmlzdHJhdGl2ZSA9PSAwKSB8fAorCSAgICBuZXdfc3RhdGUub3BlcmF0aW9uYWwgIT0gbm1fc3RhdGUtPm9wZXJhdGlvbmFsIHx8CisJICAgIG5ld19zdGF0ZS5hdmFpbGFiaWxpdHkgIT0gbm1fc3RhdGUtPmF2YWlsYWJpbGl0eSkgeworCQkvKiBVcGRhdGUgdGhlIG9wZXJhdGlvbmFsIHN0YXRlIG9mIGEgZ2l2ZW4gb2JqZWN0IGluIG91ciBpbi1tZW1vcnkgZGF0YQorIAkJKiBzdHJ1Y3R1cmVzIGFuZCBzZW5kIGFuIGV2ZW50IHRvIHRoZSBoaWdoZXIgbGF5ZXIgKi8KKwkJdm9pZCAqb2JqID0gb2JqY2xhc3Myb2JqKGJ0cywgZm9oLT5vYmpfY2xhc3MsICZmb2gtPm9ial9pbnN0KTsKKwkJcmMgPSBubV9zdGF0ZV9ldmVudChFVlRfU1RBVEVDSEdfT1BFUiwgZm9oLT5vYmpfY2xhc3MsIG9iaiwgbm1fc3RhdGUsICZuZXdfc3RhdGUpOworCQlubV9zdGF0ZS0+b3BlcmF0aW9uYWwgPSBuZXdfc3RhdGUub3BlcmF0aW9uYWw7CisJCW5tX3N0YXRlLT5hdmFpbGFiaWxpdHkgPSBuZXdfc3RhdGUuYXZhaWxhYmlsaXR5OworCQlpZiAobm1fc3RhdGUtPmFkbWluaXN0cmF0aXZlID09IDApCisJCQlubV9zdGF0ZS0+YWRtaW5pc3RyYXRpdmUgPSBuZXdfc3RhdGUuYWRtaW5pc3RyYXRpdmU7CisJfQorI2lmIDAKKwlpZiAob3Bfc3RhdGUgPT0gMSkgeworCQkvKiB0cnkgdG8gZW5hYmxlIG9iamVjdHMgdGhhdCBhcmUgZGlzYWJsZWQgKi8KKwkJYWJpc19ubV9vcHN0YXJ0KGJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJZm9oLT5vYmpfaW5zdC5idHNfbnIsCisJCQkJZm9oLT5vYmpfaW5zdC50cnhfbnIsCisJCQkJZm9oLT5vYmpfaW5zdC50c19ucik7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnhfZmFpbF9ldnRfcmVwKHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwlERUJVR1BDKEROTSwgIkZhaWx1cmUgRXZlbnQgUmVwb3J0ICIpOworCQorCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgbWItPnRyeC0+YnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfRVZFTlRfVFlQRSkpCisJCURFQlVHUEMoRE5NLCAiVHlwZT0lcyAiLCBldmVudF90eXBlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX0VWRU5UX1RZUEUpKSk7CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9TRVZFUklUWSkpCisJCURFQlVHUEMoRE5NLCAiU2V2ZXJpdHk9JXMgIiwgc2V2ZXJpdHlfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfU0VWRVJJVFkpKSk7CisKKwlERUJVR1BDKEROTSwgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX25tX3Jjdm1zZ19yZXBvcnQoc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXVfaW50OF90IG10ID0gZm9oLT5tc2dfdHlwZTsKKworCWRlYnVncF9mb2goZm9oKTsKKworCS8vbm1oLT5jZmctPnJlcG9ydF9jYihtYiwgZm9oKTsKKworCXN3aXRjaCAobXQpIHsKKwljYXNlIE5NX01UX1NUQVRFQ0hHX0VWRU5UX1JFUDoKKwkJcmV0dXJuIGFiaXNfbm1fcnhfc3RhdGVjaGdfcmVwKG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9TV19BQ1RJVkFURURfUkVQOgorCQlERUJVR1BDKEROTSwgIlNvZnR3YXJlIEFjdGl2YXRlZCBSZXBvcnRcbiIpOworCQlkaXNwYXRjaF9zaWduYWwoU1NfTk0sIFNfTk1fU1dfQUNUSVZfUkVQLCBtYik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfRkFJTFVSRV9FVkVOVF9SRVA6CisJCXJ4X2ZhaWxfZXZ0X3JlcChtYik7CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9GQUlMX1JFUCwgbWIpOworCQlicmVhazsKKwljYXNlIE5NX01UX1RFU1RfUkVQOgorCQlERUJVR1BDKEROTSwgIlRlc3QgUmVwb3J0XG4iKTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX1RFU1RfUkVQLCBtYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUEMoRE5NLCAicmVwb3J0aW5nIE5NIE1UIDB4JTAyeFxuIiwgbXQpOworCQlicmVhazsKKwkJCisJfTsKKworCXJldHVybiAwOworfQorCisvKiBBY3RpdmF0ZSB0aGUgc3BlY2lmaWVkIHNvZnR3YXJlIGludG8gdGhlIEJUUyAqLworc3RhdGljIGludCBpcGFjY19zd19hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkwLCB1X2ludDhfdCBpMSwKKwkJCSAgICAgdV9pbnQ4X3QgaTIsIGNvbnN0IHVfaW50OF90ICpzd19kZXNjLCB1X2ludDhfdCBzd2Rlc2NfbGVuKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBsZW4gPSBzd2Rlc2NfbGVuOworCXVfaW50OF90ICp0cmFpbGVyOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9BQ1RJVkFURV9TVywgb2JqX2NsYXNzLCBpMCwgaTEsIGkyKTsKKworCXRyYWlsZXIgPSBtc2diX3B1dChtc2csIHN3ZGVzY19sZW4pOworCW1lbWNweSh0cmFpbGVyLCBzd19kZXNjLCBzd2Rlc2NfbGVuKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitzdGF0aWMgaW50IGFiaXNfbm1fcnhfc3dfYWN0X3JlcShzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobWIpOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCWNvbnN0IHVfaW50OF90ICpzd19jb25maWc7CisJaW50IHN3X2NvbmZpZ19sZW47CisJaW50IGZpbGVfaWRfbGVuOworCWludCByZXQ7CisKKwlkZWJ1Z3BfZm9oKGZvaCk7CisKKwlERUJVR1BDKEROTSwgIlNXIEFjdGl2YXRlIFJlcXVlc3Q6ICIpOworCisJREVCVUdQKEROTSwgIlNvZnR3YXJlIEFjdGl2YXRlIFJlcXVlc3QsIEFDS2luZyBhbmQgQWN0aXZhdGluZ1xuIik7CisKKwlyZXQgPSBhYmlzX25tX3N3X2FjdF9yZXFfYWNrKG1iLT50cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJICAgICAgZm9oLT5vYmpfaW5zdC5idHNfbnIsCisJCQkJICAgICAgZm9oLT5vYmpfaW5zdC50cnhfbnIsCisJCQkJICAgICAgZm9oLT5vYmpfaW5zdC50c19uciwgMCwKKwkJCQkgICAgICBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKworCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgbWItPnRyeC0+YnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwlzd19jb25maWcgPSBUTFZQX1ZBTCgmdHAsIE5NX0FUVF9TV19DT05GSUcpOworCXN3X2NvbmZpZ19sZW4gPSBUTFZQX0xFTigmdHAsIE5NX0FUVF9TV19DT05GSUcpOworCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX1NXX0NPTkZJRykpIHsKKwkJREVCVUdQKEROTSwgIlNXIGNvbmZpZyBub3QgZm91bmQhIENhbid0IGNvbnRpbnVlLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCURFQlVHUChETk0sICJGb3VuZCBTVyBjb25maWc6ICVzXG4iLCBoZXhkdW1wKHN3X2NvbmZpZywgc3dfY29uZmlnX2xlbikpOworCX0KKworCWlmIChzd19jb25maWdbMF0gIT0gTk1fQVRUX1NXX0RFU0NSKQorCQlERUJVR1AoRE5NLCAiU1dfREVTQ1IgYXR0cmlidXRlIGlkZW50aWZpZXIgbm90IGZvdW5kIVxuIik7CisJaWYgKHN3X2NvbmZpZ1sxXSAhPSBOTV9BVFRfRklMRV9JRCkKKwkJREVCVUdQKEROTSwgIkZJTEVfSUQgYXR0cmlidXRlIGlkZW50aWZpZXIgbm90IGZvdW5kIVxuIik7CisJZmlsZV9pZF9sZW4gPSBzd19jb25maWdbMl0gKiAyNTYgKyBzd19jb25maWdbM107CisKKwkvKiBBc3N1bWVzIGZpcnN0IFNXIGZpbGUgaW4gbGlzdCBpcyB0aGUgb25lIHRvIGJlIGFjdGl2YXRlZCAqLworCS8qIHN3X2NvbmZpZyArIDQgdG8gc2tpcCBvdmVyIDIgYXR0cmlidXRlIElEIGJ5dGVzIGFuZCAxNi1iaXQgbGVuZ3RoIGZpZWxkICovCisJcmV0dXJuIGlwYWNjX3N3X2FjdGl2YXRlKG1iLT50cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJIGZvaC0+b2JqX2luc3QuYnRzX25yLAorCQkJCSBmb2gtPm9ial9pbnN0LnRyeF9uciwKKwkJCQkgZm9oLT5vYmpfaW5zdC50c19uciwKKwkJCQkgc3dfY29uZmlnICsgNCwKKwkJCQkgZmlsZV9pZF9sZW4pOworfQorCisvKiBSZWNlaXZlIGEgQ0hBTkdFX0FETV9TVEFURV9BQ0ssIHBhcnNlIHRoZSBUTFYgYW5kIHVwZGF0ZSBsb2NhbCBzdGF0ZSAqLworc3RhdGljIGludCBhYmlzX25tX3J4X2NoZ19hZG1fc3RhdGVfYWNrKHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJdV9pbnQ4X3QgYWRtX3N0YXRlOworCisJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBtYi0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0FETV9TVEFURSkpCisJCXJldHVybiAtRUlOVkFMOworCisJYWRtX3N0YXRlID0gKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX0FETV9TVEFURSk7CisKKwlyZXR1cm4gdXBkYXRlX2FkbXN0YXRlKG1iLT50cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsICZmb2gtPm9ial9pbnN0LCBhZG1fc3RhdGUpOworfQorCitzdGF0aWMgaW50IGFiaXNfbm1fcnhfbG10X2V2ZW50KHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwlERUJVR1AoRE5NLCAiTE1UIEV2ZW50ICIpOworCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgbWItPnRyeC0+YnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT04pICYmCisJICAgIFRMVlBfTEVOKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT04pID49IDEpIHsKKwkJdV9pbnQ4X3Qgb25vZmYgPSAqVExWUF9WQUwoJnRwLCBOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTik7CisJCURFQlVHUEMoRE5NLCAiTE9HJXMgIiwgb25vZmYgPyAiT04iIDogIk9GRiIpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVikgJiYKKwkgICAgVExWUF9MRU4oJnRwLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWKSA+PSAxKSB7CisJCXVfaW50OF90IGxldmVsID0gKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVik7CisJCURFQlVHUEMoRE5NLCAiTGV2ZWw9JXUgIiwgbGV2ZWwpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRSkgJiYKKwkgICAgVExWUF9MRU4oJnRwLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FKSA+PSAxKSB7CisJCWNoYXIgKm5hbWUgPSAoY2hhciAqKSBUTFZQX1ZBTCgmdHAsIE5NX0FUVF9CUzExX0xNVF9VU0VSX05BTUUpOworCQlERUJVR1BDKEROTSwgIlVzZXJuYW1lPSVzICIsIG5hbWUpOworCX0KKwlERUJVR1BDKEROTSwgIlxuIik7CisJLyogRklYTUU6IHBhcnNlIExNVCBMT0dPTiBUSU1FICovCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlY2VpdmUgYSBPTUwgTk0gTWVzc2FnZSBmcm9tIEJUUyAqLworc3RhdGljIGludCBhYmlzX25tX3Jjdm1zZ19mb20oc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1iKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwl1X2ludDhfdCBtdCA9IGZvaC0+bXNnX3R5cGU7CisKKwkvKiBjaGVjayBmb3IgdW5zb2xpY2l0ZWQgbWVzc2FnZSAqLworCWlmIChpc19yZXBvcnQobXQpKQorCQlyZXR1cm4gYWJpc19ubV9yY3Ztc2dfcmVwb3J0KG1iKTsKKworCWlmIChpc19pbl9hcnIobXQsIHN3X2xvYWRfbXNncywgQVJSQVlfU0laRShzd19sb2FkX21zZ3MpKSkKKwkJcmV0dXJuIGFiaXNfbm1fcmN2bXNnX3N3KG1iKTsKKworCWlmIChpc19pbl9hcnIobXQsIG5hY2tzLCBBUlJBWV9TSVpFKG5hY2tzKSkpIHsKKwkJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwkJZGVidWdwX2ZvaChmb2gpOworCisJCURFQlVHUEMoRE5NLCAiJXMgTkFDSyAiLCBnZXRfdmFsdWVfc3RyaW5nKG5hY2tfbmFtZXMsIG10KSk7CisKKwkJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBtYi0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkKKwkJCURFQlVHUEMoRE5NLCAiQ0FVU0U9JXNcbiIsIAorCQkJCW5hY2tfY2F1c2VfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKSk7CisJCWVsc2UKKwkJCURFQlVHUEMoRE5NLCAiXG4iKTsKKworCQlkaXNwYXRjaF9zaWduYWwoU1NfTk0sIFNfTk1fTkFDSywgKHZvaWQqKSAmbXQpOworCQlyZXR1cm4gMDsKKwl9CisjaWYgMAorCS8qIGNoZWNrIGlmIGxhc3QgbWVzc2FnZSBpcyB0byBiZSBhY2tlZCAqLworCWlmIChpc19hY2tfbmFjayhubWgtPmxhc3RfbXNndHlwZSkpIHsKKwkJaWYgKG10ID09IE1UX0FDSyhubWgtPmxhc3RfbXNndHlwZSkpIHsKKwkJCURFQlVHUChETk0sICJyZWNlaXZlZCBBQ0sgKDB4JXgpXG4iLCBmb2gtPm1zZ190eXBlKTsKKwkJCS8qIHdlIGdvdCBvdXIgQUNLLCBjb250aW51ZSBzZW5kaW5nIHRoZSBuZXh0IG1zZyAqLworCQl9IGVsc2UgaWYgKG10ID09IE1UX05BQ0sobm1oLT5sYXN0X21zZ3R5cGUpKSB7CisJCQkvKiB3ZSBnb3QgYSBOQUNLLCBzaWduYWwgdGhpcyB0byB0aGUgY2FsbGVyICovCisJCQlERUJVR1AoRE5NLCAicmVjZWl2ZWQgTkFDSyAoMHgleClcbiIsIGZvaC0+bXNnX3R5cGUpOworCQkJLyogRklYTUU6IHNvbWVob3cgc2lnbmFsIHRoaXMgdG8gdGhlIGNhbGxlciAqLworCQl9IGVsc2UgeworCQkJLyogcmVhbGx5IHN0cmFuZ2UgdGhpbmdzIGhhcHBlbiAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisjZW5kaWYKKworCXN3aXRjaCAobXQpIHsKKwljYXNlIE5NX01UX0NIR19BRE1fU1RBVEVfQUNLOgorCQlyZXR1cm4gYWJpc19ubV9yeF9jaGdfYWRtX3N0YXRlX2FjayhtYik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfU1dfQUNUX1JFUToKKwkJcmV0dXJuIGFiaXNfbm1fcnhfc3dfYWN0X3JlcShtYik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQlMxMV9MTVRfU0VTU0lPTjoKKwkJcmV0dXJuIGFiaXNfbm1fcnhfbG10X2V2ZW50KG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9DT05OX01EUk9QX0xJTktfQUNLOgorCQlERUJVR1AoRE5NLCAiQ09OTiBNRFJPUCBMSU5LIEFDS1xuIik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfSVBBQ0NfUkVTVEFSVF9BQ0s6CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9JUEFDQ19SRVNUQVJUX0FDSywgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfSVBBQ0NfUkVTVEFSVF9OQUNLOgorCQlkaXNwYXRjaF9zaWduYWwoU1NfTk0sIFNfTk1fSVBBQ0NfUkVTVEFSVF9OQUNLLCBOVUxMKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yeF9pcGFjYyhzdHJ1Y3QgbXNnYiAqbWIpOworCitzdGF0aWMgaW50IGFiaXNfbm1fcmN2bXNnX21hbnVmKHN0cnVjdCBtc2diICptYikKK3sKKwlpbnQgcmM7CisJaW50IGJ0c190eXBlID0gbWItPnRyeC0+YnRzLT50eXBlOworCisJc3dpdGNoIChidHNfdHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCXJjID0gYWJpc19ubV9yeF9pcGFjYyhtYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiZG9uJ3Qga25vdyBob3cgdG8gcGFyc2UgT01MIGZvciB0aGlzICIKKwkJICAgICAiQlRTIHR5cGUgKCV1KVxuIiwgYnRzX3R5cGUpOworCQlyYyA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogSGlnaC1MZXZlbCBBUEkgKi8KKy8qIEVudHJ5LXBvaW50IHdoZXJlIEwyIE9NTCBmcm9tIEJUUyBlbnRlcnMgdGhlIE5NIGNvZGUgKi8KK2ludCBhYmlzX25tX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1zZyk7CisJaW50IHJjID0gMDsKKworCS8qIFZhcmlvdXMgY29uc2lzdGVuY3kgY2hlY2tzICovCisJaWYgKG9oLT5wbGFjZW1lbnQgIT0gQUJJU19PTV9QTEFDRU1FTlRfT05MWSkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkFCSVMgT01MIHBsYWNlbWVudCAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQlvaC0+cGxhY2VtZW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChvaC0+c2VxdWVuY2UgIT0gMCkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkFCSVMgT01MIHNlcXVlbmNlIDB4JXggIT0gMHgwMFxuIiwKKwkJCW9oLT5zZXF1ZW5jZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKyNpZiAwCisJdW5zaWduZWQgaW50IGwyX2xlbiA9IG1zZy0+dGFpbCAtICh1X2ludDhfdCAqKW1zZ2JfbDIobXNnKTsKKwl1bnNpZ25lZCBpbnQgaGxlbiA9IHNpemVvZigqb2gpICsgc2l6ZW9mKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIpOworCWlmIChvaC0+bGVuZ3RoICsgaGxlbiA+IGwyX2xlbikgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkFCSVMgT01MIHRydW5jYXRlZCBtZXNzYWdlICgldSA+ICV1KVxuIiwKKwkJCW9oLT5sZW5ndGggKyBzaXplb2YoKm9oKSwgbDJfbGVuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChvaC0+bGVuZ3RoICsgaGxlbiA8IGwyX2xlbikKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJBQklTIE9NTCBtZXNzYWdlIHdpdGggZXh0cmEgdHJhaWxlcj8hPyAob2gtPmxlbj0lZCwgc2l6ZW9mX29oPSVkIGwyX2xlbj0lZFxuIiwgb2gtPmxlbmd0aCwgc2l6ZW9mKCpvaCksIGwyX2xlbik7CisjZW5kaWYKKwltc2ctPmwzaCA9ICh1bnNpZ25lZCBjaGFyICopb2ggKyBzaXplb2YoKm9oKTsKKworCXN3aXRjaCAob2gtPm1kaXNjKSB7CisJY2FzZSBBQklTX09NX01ESVNDX0ZPTToKKwkJcmMgPSBhYmlzX25tX3Jjdm1zZ19mb20obXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX09NX01ESVNDX01BTlVGOgorCQlyYyA9IGFiaXNfbm1fcmN2bXNnX21hbnVmKG1zZyk7CisJCWJyZWFrOworCWNhc2UgQUJJU19PTV9NRElTQ19NTUk6CisJY2FzZSBBQklTX09NX01ESVNDX1RSQVU6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAidW5pbXBsZW1lbnRlZCBBQklTIE9NTCBtZXNzYWdlIGRpc2NyaW1pbmF0b3IgMHgleFxuIiwKKwkJCW9oLT5tZGlzYyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAidW5rbm93biBBQklTIE9NTCBtZXNzYWdlIGRpc2NyaW1pbmF0b3IgMHgleFxuIiwKKwkJCW9oLT5tZGlzYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1zZ2JfZnJlZShtc2cpOworCXJldHVybiByYzsKK30KKworI2lmIDAKKy8qIGluaXRpYWxpemVkIGFsbCByZXNvdXJjZXMgKi8KK3N0cnVjdCBhYmlzX25tX2ggKmFiaXNfbm1faW5pdChzdHJ1Y3QgYWJpc19ubV9jZmcgKmNmZykKK3sKKwlzdHJ1Y3QgYWJpc19ubV9oICpubWg7CisKKwlubWggPSBtYWxsb2Moc2l6ZW9mKCpubWgpKTsKKwlpZiAoIW5taCkKKwkJcmV0dXJuIE5VTEw7CisKKwlubWgtPmNmZyA9IGNmZzsKKworCXJldHVybiBubWg7Cit9CisKKy8qIGZyZWUgYWxsIHJlc291cmNlcyAqLwordm9pZCBhYmlzX25tX2Zpbmkoc3RydWN0IGFiaXNfbm1faCAqbm1oKQoreworCWZyZWUobm1oKTsKK30KKyNlbmRpZgorCisvKiBIZXJlIHdlIGFyZSB0cnlpbmcgdG8gZGVmaW5lIGEgaGlnaC1sZXZlbCBBUEkgdGhhdCBjYW4gYmUgdXNlZCBieQorICogdGhlIGFjdHVhbCBCU0MgaW1wbGVtZW50YXRpb24uICBIb3dldmVyLCB0aGUgYXJjaGl0ZWN0dXJlIGlzIGN1cnJlbnRseQorICogc3RpbGwgdW5kZXIgZGVzaWduLiAgSWRlYWxseSB0aGUgY2FsbHMgdG8gdGhpcyBBUEkgd291bGQgYmUgc3luY2hyb25vdXMsCisgKiB3aGlsZSB0aGUgdW5kZXJseWluZyBzdGFjayBiZWhpbmQgdGhlIEFQaSBydW5zIGluIGEgdHJhZGl0aW9uYWwgc2VsZWN0CisgKiBiYXNlZCBzdGF0ZSBtYWNoaW5lLgorICovCisKKy8qIDYuMiBTb2Z0d2FyZSBMb2FkOiAqLworZW51bSBzd19zdGF0ZSB7CisJU1dfU1RBVEVfTk9ORSwKKwlTV19TVEFURV9XQUlUX0lOSVRBQ0ssCisJU1dfU1RBVEVfV0FJVF9TRUdBQ0ssCisJU1dfU1RBVEVfV0FJVF9FTkRBQ0ssCisJU1dfU1RBVEVfV0FJVF9BQ1RBQ0ssCisJU1dfU1RBVEVfRVJST1IsCit9OworCitzdHJ1Y3QgYWJpc19ubV9zdyB7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlnc21fY2JmbiAqY2JmbjsKKwl2b2lkICpjYl9kYXRhOworCWludCBmb3JjZWQ7CisKKwkvKiB0aGlzIHdpbGwgYmVjb21lIHBhcnQgb2YgdGhlIFNXIExPQUQgSU5JVElBVEUgKi8KKwl1X2ludDhfdCBvYmpfY2xhc3M7CisJdV9pbnQ4X3Qgb2JqX2luc3RhbmNlWzNdOworCisJdV9pbnQ4X3QgZmlsZV9pZFsyNTVdOworCXVfaW50OF90IGZpbGVfaWRfbGVuOworCisJdV9pbnQ4X3QgZmlsZV92ZXJzaW9uWzI1NV07CisJdV9pbnQ4X3QgZmlsZV92ZXJzaW9uX2xlbjsKKworCXVfaW50OF90IHdpbmRvd19zaXplOworCXVfaW50OF90IHNlZ19pbl93aW5kb3c7CisKKwlpbnQgZmQ7CisJRklMRSAqc3RyZWFtOworCWVudW0gc3dfc3RhdGUgc3RhdGU7CisJaW50IGxhc3Rfc2VnOworfTsKKworc3RhdGljIHN0cnVjdCBhYmlzX25tX3N3IGdfc3c7CisKK3N0YXRpYyB2b2lkIHN3X2FkZF9maWxlX2lkX2FuZF92ZXIoc3RydWN0IGFiaXNfbm1fc3cgKnN3LCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCWlmIChzdy0+YnRzLT50eXBlID09IEdTTV9CVFNfVFlQRV9OQU5PQlRTKSB7CisJCW1zZ2Jfdl9wdXQobXNnLCBOTV9BVFRfU1dfREVTQ1IpOworCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9GSUxFX0lELCBzdy0+ZmlsZV9pZF9sZW4sIHN3LT5maWxlX2lkKTsKKwkJbXNnYl90bDE2dl9wdXQobXNnLCBOTV9BVFRfRklMRV9WRVJTSU9OLCBzdy0+ZmlsZV92ZXJzaW9uX2xlbiwKKwkJCSAgICAgICBzdy0+ZmlsZV92ZXJzaW9uKTsKKwl9IGVsc2UgaWYgKHN3LT5idHMtPnR5cGUgPT0gR1NNX0JUU19UWVBFX0JTMTEpIHsKKwkJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfSUQsIHN3LT5maWxlX2lkX2xlbiwgc3ctPmZpbGVfaWQpOworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfRklMRV9WRVJTSU9OLCBzdy0+ZmlsZV92ZXJzaW9uX2xlbiwKKwkJCSAgICAgc3ctPmZpbGVfdmVyc2lvbik7CisJfSBlbHNlIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJQbGVhc2UgaW1wbGVtZW50IHRoaXMgZm9yIHRoZSBCVFMuXG4iKTsKKwl9Cit9CisKKy8qIDYuMi4xIC8gOC4zLjE6IExvYWQgRGF0YSBJbml0aWF0ZSAqLworc3RhdGljIGludCBzd19sb2FkX2luaXQoc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBsZW4gPSAzKjIgKyBzdy0+ZmlsZV9pZF9sZW4gKyBzdy0+ZmlsZV92ZXJzaW9uX2xlbjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGxlbiwgTk1fTVRfTE9BRF9JTklULCBzdy0+b2JqX2NsYXNzLAorCQkJc3ctPm9ial9pbnN0YW5jZVswXSwgc3ctPm9ial9pbnN0YW5jZVsxXSwKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMl0pOworCisJc3dfYWRkX2ZpbGVfaWRfYW5kX3ZlcihzdywgbXNnKTsKKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9XSU5ET1dfU0laRSwgc3ctPndpbmRvd19zaXplKTsKKwkKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHN3LT5idHMsIG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgaXNfbGFzdF9saW5lKEZJTEUgKnN0cmVhbSkKK3sKKwljaGFyIG5leHRfc2VnX2J1ZlsyNTZdOworCWxvbmcgcG9zOworCisJLyogY2hlY2sgaWYgd2UncmUgc2VuZGluZyB0aGUgbGFzdCBsaW5lICovCisJcG9zID0gZnRlbGwoc3RyZWFtKTsKKwlpZiAoIWZnZXRzKG5leHRfc2VnX2J1Ziwgc2l6ZW9mKG5leHRfc2VnX2J1ZiktMiwgc3RyZWFtKSkgeworCQlmc2VlayhzdHJlYW0sIHBvcywgU0VFS19TRVQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlmc2VlayhzdHJlYW0sIHBvcywgU0VFS19TRVQpOworCXJldHVybiAwOworfQorCisvKiA2LjIuMiAvIDguMy4yIExvYWQgRGF0YSBTZWdtZW50ICovCitzdGF0aWMgaW50IHN3X2xvYWRfc2VnbWVudChzdHJ1Y3QgYWJpc19ubV9zdyAqc3cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCWNoYXIgc2VnX2J1ZlsyNTZdOworCWNoYXIgKmxpbmVfYnVmID0gc2VnX2J1ZisyOworCXVuc2lnbmVkIGNoYXIgKnRsdjsKKwl1X2ludDhfdCBsZW47CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisKKwlzd2l0Y2ggKHN3LT5idHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlpZiAoZmdldHMobGluZV9idWYsIHNpemVvZihzZWdfYnVmKS0yLCBzdy0+c3RyZWFtKSA9PSBOVUxMKSB7CisJCQlwZXJyb3IoImZnZXRzIHJlYWRpbmcgc2VnbWVudCIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJc2VnX2J1ZlswXSA9IDB4MDA7CisKKwkJLyogY2hlY2sgaWYgd2UncmUgc2VuZGluZyB0aGUgbGFzdCBsaW5lICovCisJCXN3LT5sYXN0X3NlZyA9IGlzX2xhc3RfbGluZShzdy0+c3RyZWFtKTsKKwkJaWYgKHN3LT5sYXN0X3NlZykKKwkJCXNlZ19idWZbMV0gPSAwOworCQllbHNlCisJCQlzZWdfYnVmWzFdID0gMSArIHN3LT5zZWdfaW5fd2luZG93Kys7CisKKwkJbGVuID0gc3RybGVuKGxpbmVfYnVmKSArIDI7CisJCXRsdiA9IG1zZ2JfcHV0KG1zZywgVExWX0dST1NTX0xFTihsZW4pKTsKKwkJdGx2X3B1dCh0bHYsIE5NX0FUVF9CUzExX0ZJTEVfREFUQSwgbGVuLCAodV9pbnQ4X3QgKilzZWdfYnVmKTsKKwkJLyogQlMxMSB3YW50cyBDUiArIExGIGluIGV4Y2VzcyBvZiB0aGUgVExWIGxlbmd0aCAhPyEgKi8KKwkJdGx2WzFdIC09IDI7CisKKwkJLyogd2Ugb25seSBub3cga25vdyB0aGUgZXhhY3QgbGVuZ3RoIGZvciB0aGUgT00gaGRyICovCisJCWxlbiA9IHN0cmxlbihsaW5lX2J1ZikrMjsKKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzogeworCQlzdGF0aWNfYXNzZXJ0KHNpemVvZihzZWdfYnVmKSA+PSBJUEFDQ19TRUdNRU5UX1NJWkUsIGJ1ZmZlcl9iaWdfZW5vdWdoKTsKKwkJbGVuID0gcmVhZChzdy0+ZmQsICZzZWdfYnVmLCBJUEFDQ19TRUdNRU5UX1NJWkUpOworCQlpZiAobGVuIDwgMCkgeworCQkJcGVycm9yKCJyZWFkIGZhaWxlZCIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAobGVuICE9IElQQUNDX1NFR01FTlRfU0laRSkKKwkJCXN3LT5sYXN0X3NlZyA9IDE7CisKKwkJKytzdy0+c2VnX2luX3dpbmRvdzsKKwkJbXNnYl90bDE2dl9wdXQobXNnLCBOTV9BVFRfSVBBQ0NfRklMRV9EQVRBLCBsZW4sIChjb25zdCB1X2ludDhfdCAqKSBzZWdfYnVmKTsKKwkJbGVuICs9IDM7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgInN3X2xvYWRfc2VnbWVudCBuZWVkcyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEJUUy5cbiIpOworCQkvKiBGSVhNRTogT3RoZXIgQlRTIHR5cGVzICovCisJCXJldHVybiAtMTsKKwl9CisKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGxlbiwgTk1fTVRfTE9BRF9TRUcsIHN3LT5vYmpfY2xhc3MsCisJCQlzdy0+b2JqX2luc3RhbmNlWzBdLCBzdy0+b2JqX2luc3RhbmNlWzFdLAorCQkJc3ctPm9ial9pbnN0YW5jZVsyXSk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHN3LT5idHMsIG1zZyk7Cit9CisKKy8qIDYuMi40IC8gOC4zLjQgTG9hZCBEYXRhIEVuZCAqLworc3RhdGljIGludCBzd19sb2FkX2VuZChzdHJ1Y3QgYWJpc19ubV9zdyAqc3cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGxlbiA9IDIqMiArIHN3LT5maWxlX2lkX2xlbiArIHN3LT5maWxlX3ZlcnNpb25fbGVuOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9MT0FEX0VORCwgc3ctPm9ial9jbGFzcywKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMF0sIHN3LT5vYmpfaW5zdGFuY2VbMV0sCisJCQlzdy0+b2JqX2luc3RhbmNlWzJdKTsKKworCXN3X2FkZF9maWxlX2lkX2FuZF92ZXIoc3csIG1zZyk7CisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhzdy0+YnRzLCBtc2cpOworfQorCisvKiBBY3RpdmF0ZSB0aGUgc3BlY2lmaWVkIHNvZnR3YXJlIGludG8gdGhlIEJUUyAqLworc3RhdGljIGludCBzd19hY3RpdmF0ZShzdHJ1Y3QgYWJpc19ubV9zdyAqc3cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGxlbiA9IDIqMiArIHN3LT5maWxlX2lkX2xlbiArIHN3LT5maWxlX3ZlcnNpb25fbGVuOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9BQ1RJVkFURV9TVywgc3ctPm9ial9jbGFzcywKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMF0sIHN3LT5vYmpfaW5zdGFuY2VbMV0sCisJCQlzdy0+b2JqX2luc3RhbmNlWzJdKTsKKworCS8qIEZJWE1FOiB0aGlzIGlzIEJTMTEgc3BlY2lmaWMgZm9ybWF0ICovCisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfSUQsIHN3LT5maWxlX2lkX2xlbiwgc3ctPmZpbGVfaWQpOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9GSUxFX1ZFUlNJT04sIHN3LT5maWxlX3ZlcnNpb25fbGVuLAorCQkgICAgIHN3LT5maWxlX3ZlcnNpb24pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhzdy0+YnRzLCBtc2cpOworfQorCitzdHJ1Y3Qgc2RwX2Zpcm13YXJlIHsKKwljaGFyIG1hZ2ljWzRdOworCWNoYXIgbW9yZV9tYWdpY1s0XTsKKwl1bnNpZ25lZCBpbnQgaGVhZGVyX2xlbmd0aDsKKwl1bnNpZ25lZCBpbnQgZmlsZV9sZW5ndGg7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIGludCBwYXJzZV9zZHBfaGVhZGVyKHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3Qgc2RwX2Zpcm13YXJlIGZpcm13YXJlX2hlYWRlcjsKKwlpbnQgcmM7CisJc3RydWN0IHN0YXQgc3RhdDsKKworCXJjID0gcmVhZChzdy0+ZmQsICZmaXJtd2FyZV9oZWFkZXIsIHNpemVvZihmaXJtd2FyZV9oZWFkZXIpKTsKKwlpZiAocmMgIT0gc2l6ZW9mKGZpcm13YXJlX2hlYWRlcikpIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJDb3VsZCBub3QgcmVhZCBTRFAgZmlsZSBoZWFkZXIuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChzdHJuY21wKGZpcm13YXJlX2hlYWRlci5tYWdpYywgIiBTRFAiLCA0KSAhPSAwKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiVGhlIG1hZ2ljIG51bWJlcjEgaXMgd3JvbmcuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChmaXJtd2FyZV9oZWFkZXIubW9yZV9tYWdpY1swXSAhPSAweDEwIHx8CisJICAgIGZpcm13YXJlX2hlYWRlci5tb3JlX21hZ2ljWzFdICE9IDB4MDIgfHwKKwkgICAgZmlybXdhcmVfaGVhZGVyLm1vcmVfbWFnaWNbMl0gIT0gMHgwMCB8fAorCSAgICBmaXJtd2FyZV9oZWFkZXIubW9yZV9tYWdpY1szXSAhPSAweDAwKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiVGhlIG1vcmUgbWFnaWMgbnVtYmVyIGlzIHdyb25nLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKworCWlmIChmc3RhdChzdy0+ZmQsICZzdGF0KSA9PSAtMSkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkNvdWxkIG5vdCBzdGF0IHRoZSBmaWxlLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobnRvaGwoZmlybXdhcmVfaGVhZGVyLmZpbGVfbGVuZ3RoKSAhPSBzdGF0LnN0X3NpemUpIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJUaGUgZmlsZXNpemVzIGRvIG5vdCBtYXRjaC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogZ28gYmFjayB0byB0aGUgc3RhcnQgYXMgd2UgY2hlY2tlZCB0aGUgd2hvbGUgZmlsZXNpemUuLiAqLworCWxzZWVrKHN3LT5mZCwgMGwsIFNFRUtfU0VUKTsKKwlMT0dQKEROTSwgTE9HTF9OT1RJQ0UsICJUaGUgaXBhY2Nlc3MgU0RQIGhlYWRlciBpcyBub3QgZnVsbHkgdW5kZXJzdG9vZC5cbiIKKwkJCSAgICAgICAiVGhlcmUgbWlnaHQgYmUgY2hlY2tzdW1zIGluIHRoZSBmaWxlIHRoYXQgYXJlIG5vdFxuIgorCQkJICAgICAgICJ2ZXJpZmllZCBhbmQgaW5jb21wbGV0ZSBmaXJtd2FyZSBtaWdodCBiZSBmbGFzaGVkLlxuIgorCQkJICAgICAgICJUaGVyZSBpcyBhYnNvbHV0ZWx5IG5vIFdBUlJBTlRZIHRoYXQgZmxhc2hpbmcgd2lsbFxuIgorCQkJICAgICAgICJ3b3JrLlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3dfb3Blbl9maWxlKHN0cnVjdCBhYmlzX25tX3N3ICpzdywgY29uc3QgY2hhciAqZm5hbWUpCit7CisJY2hhciBmaWxlX2lkWzEyKzFdOworCWNoYXIgZmlsZV92ZXJzaW9uWzgwKzFdOworCWludCByYzsKKworCXN3LT5mZCA9IG9wZW4oZm5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoc3ctPmZkIDwgMCkKKwkJcmV0dXJuIHN3LT5mZDsKKworCXN3aXRjaCAoc3ctPmJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCXN3LT5zdHJlYW0gPSBmZG9wZW4oc3ctPmZkLCAiciIpOworCQlpZiAoIXN3LT5zdHJlYW0pIHsKKwkJCXBlcnJvcigiZmRvcGVuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJLyogcmVhZCBmaXJzdCBsaW5lIGFuZCBwYXJzZSBmaWxlIElEIGFuZCBWRVJTSU9OICovCisJCXJjID0gZnNjYW5mKHN3LT5zdHJlYW0sICJAKCMpJTEyczolODBzXHJcbiIsIAorCQkJICAgIGZpbGVfaWQsIGZpbGVfdmVyc2lvbik7CisJCWlmIChyYyAhPSAyKSB7CisJCQlwZXJyb3IoInBhcnNpbmcgaGVhZGVyIGxpbmUgb2Ygc29mdHdhcmUgZmlsZSIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXN0cmNweSgoY2hhciAqKXN3LT5maWxlX2lkLCBmaWxlX2lkKTsKKwkJc3ctPmZpbGVfaWRfbGVuID0gc3RybGVuKGZpbGVfaWQpOworCQlzdHJjcHkoKGNoYXIgKilzdy0+ZmlsZV92ZXJzaW9uLCBmaWxlX3ZlcnNpb24pOworCQlzdy0+ZmlsZV92ZXJzaW9uX2xlbiA9IHN0cmxlbihmaWxlX3ZlcnNpb24pOworCQkvKiByZXdpbmQgdG8gc3RhcnQgb2YgZmlsZSAqLworCQlyZXdpbmQoc3ctPnN0cmVhbSk7CisJCWJyZWFrOwkKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQkvKiBUT0RPOiBleHRyYWN0IHRoYXQgZnJvbSB0aGUgZmlsZW5hbWUgb3IgY29udGVudCAqLworCQlyYyA9IHBhcnNlX3NkcF9oZWFkZXIoc3cpOworCQlpZiAocmMgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBwYXJzZSB0aGUgaXBhY2Nlc3MgU0RQIGhlYWRlclxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlzdHJjcHkoKGNoYXIgKilzdy0+ZmlsZV9pZCwgImlkIik7CisJCXN3LT5maWxlX2lkX2xlbiA9IDM7CisJCXN0cmNweSgoY2hhciAqKXN3LT5maWxlX3ZlcnNpb24sICJ2ZXJzaW9uIik7CisJCXN3LT5maWxlX3ZlcnNpb25fbGVuID0gODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogV2UgZG9uJ3Qga25vdyBob3cgdG8gdHJlYXQgdGhlbSB5ZXQgKi8KKwkJY2xvc2Uoc3ctPmZkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisJCitzdGF0aWMgdm9pZCBzd19jbG9zZV9maWxlKHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzd2l0Y2ggKHN3LT5idHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlmY2xvc2Uoc3ctPnN0cmVhbSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNsb3NlKHN3LT5mZCk7CisJCWJyZWFrOworCX0KK30KKworLyogRmlsbCB0aGUgd2luZG93ICovCitzdGF0aWMgaW50IHN3X2ZpbGxfd2luZG93KHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlpbnQgcmM7CisKKwl3aGlsZSAoc3ctPnNlZ19pbl93aW5kb3cgPCBzdy0+d2luZG93X3NpemUpIHsKKwkJcmMgPSBzd19sb2FkX3NlZ21lbnQoc3cpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCQlpZiAoc3ctPmxhc3Rfc2VnKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKiBjYWxsYmFjayBmdW5jdGlvbiBmcm9tIGFiaXNfbm1fcmN2bXNnKCkgaGFuZGxlciAqLworc3RhdGljIGludCBhYmlzX25tX3Jjdm1zZ19zdyhzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJaW50IHJjID0gLTE7CisJc3RydWN0IGFiaXNfbm1fc3cgKnN3ID0gJmdfc3c7CisJZW51bSBzd19zdGF0ZSBvbGRfc3RhdGUgPSBzdy0+c3RhdGU7CisJCisJLy9ERUJVR1AoRE5NLCAic3RhdGUgJXUsIE5NIE1UIDB4JTAyeFxuIiwgc3ctPnN0YXRlLCBmb2gtPm1zZ190eXBlKTsKKworCXN3aXRjaCAoc3ctPnN0YXRlKSB7CisJY2FzZSBTV19TVEFURV9XQUlUX0lOSVRBQ0s6CisJCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCQljYXNlIE5NX01UX0xPQURfSU5JVF9BQ0s6CisJCQkvKiBmaWxsIHdpbmRvdyB3aXRoIHNlZ21lbnRzICovCisJCQlpZiAoc3ctPmNiZm4pCisJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkgTk1fTVRfTE9BRF9JTklUX0FDSywgbWIsCisJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQlyYyA9IHN3X2ZpbGxfd2luZG93KHN3KTsKKwkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX1dBSVRfU0VHQUNLOworCQkJYnJlYWs7CisJCWNhc2UgTk1fTVRfTE9BRF9JTklUX05BQ0s6CisJCQlpZiAoc3ctPmZvcmNlZCkgeworCQkJCURFQlVHUChETk0sICJGT1JDRUQ6IElnbm9yaW5nIFNvZnR3YXJlIExvYWQgIgorCQkJCQkiSW5pdCBOQUNLXG4iKTsKKwkJCQlpZiAoc3ctPmNiZm4pCisJCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJCSBOTV9NVF9MT0FEX0lOSVRfQUNLLCBtYiwKKwkJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQkJcmMgPSBzd19maWxsX3dpbmRvdyhzdyk7CisJCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfV0FJVF9TRUdBQ0s7CisJCQl9IGVsc2UgeworCQkJCURFQlVHUChETk0sICJTb2Z0d2FyZSBMb2FkIEluaXQgTkFDS1xuIik7CisJCQkJLyogRklYTUU6IGNhdXNlICovCisJCQkJaWYgKHN3LT5jYmZuKQorCQkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCQkgTk1fTVRfTE9BRF9JTklUX05BQ0ssIG1iLAorCQkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9FUlJPUjsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgU1dfU1RBVEVfV0FJVF9TRUdBQ0s6CisJCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCQljYXNlIE5NX01UX0xPQURfU0VHX0FDSzoKKwkJCWlmIChzdy0+Y2JmbikKKwkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCSBOTV9NVF9MT0FEX1NFR19BQ0ssIG1iLAorCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJc3ctPnNlZ19pbl93aW5kb3cgPSAwOworCQkJaWYgKCFzdy0+bGFzdF9zZWcpIHsKKwkJCQkvKiBmaWxsIHdpbmRvdyB3aXRoIG1vcmUgc2VnbWVudHMgKi8KKwkJCQlyYyA9IHN3X2ZpbGxfd2luZG93KHN3KTsKKwkJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9XQUlUX1NFR0FDSzsKKwkJCX0gZWxzZSB7CisJCQkJLyogZW5kIHRoZSB0cmFuc2ZlciAqLworCQkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX1dBSVRfRU5EQUNLOworCQkJCXJjID0gc3dfbG9hZF9lbmQoc3cpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTk1fTVRfTE9BRF9BQk9SVDoKKwkJCWlmIChzdy0+Y2JmbikKKwkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCSBOTV9NVF9MT0FEX0FCT1JULCBtYiwKKwkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgU1dfU1RBVEVfV0FJVF9FTkRBQ0s6CisJCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCQljYXNlIE5NX01UX0xPQURfRU5EX0FDSzoKKwkJCXN3X2Nsb3NlX2ZpbGUoc3cpOworCQkJREVCVUdQKEROTSwgIlNvZnR3YXJlIExvYWQgRW5kIChCVFMgJXUpXG4iLAorCQkJCXN3LT5idHMtPm5yKTsKKwkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX05PTkU7CisJCQlpZiAoc3ctPmNiZm4pCisJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkgTk1fTVRfTE9BRF9FTkRfQUNLLCBtYiwKKwkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE5NX01UX0xPQURfRU5EX05BQ0s6CisJCQlpZiAoc3ctPmZvcmNlZCkgeworCQkJCURFQlVHUChETk0sICJGT1JDRUQ6IElnbm9yaW5nIFNvZnR3YXJlIExvYWQiCisJCQkJCSJFbmQgTkFDS1xuIik7CisJCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfTk9ORTsKKwkJCQlpZiAoc3ctPmNiZm4pCisJCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJCSBOTV9NVF9MT0FEX0VORF9BQ0ssIG1iLAorCQkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCX0gZWxzZSB7CisJCQkJREVCVUdQKEROTSwgIlNvZnR3YXJlIExvYWQgRW5kIE5BQ0tcbiIpOworCQkJCS8qIEZJWE1FOiBjYXVzZSAqLworCQkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX0VSUk9SOworCQkJCWlmIChzdy0+Y2JmbikKKwkJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkJIE5NX01UX0xPQURfRU5EX05BQ0ssIG1iLAorCQkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJY2FzZSBTV19TVEFURV9XQUlUX0FDVEFDSzoKKwkJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfQUNLOgorCQkJLyogd2UncmUgZG9uZSAqLworCQkJREVCVUdQKEROTSwgIkFjdGl2YXRlIFNvZnR3YXJlIERPTkUhXG4iKTsKKwkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX05PTkU7CisJCQlyYyA9IDA7CisJCQlpZiAoc3ctPmNiZm4pCisJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkgTk1fTVRfQUNUSVZBVEVfU1dfQUNLLCBtYiwKKwkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIE5NX01UX0FDVElWQVRFX1NXX05BQ0s6CisJCQlERUJVR1AoRE5NLCAiQWN0aXZhdGUgU29mdHdhcmUgTkFDS1xuIik7CisJCQkvKiBGSVhNRTogY2F1c2UgKi8KKwkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX0VSUk9SOworCQkJaWYgKHN3LT5jYmZuKQorCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJIE5NX01UX0FDVElWQVRFX1NXX05BQ0ssIG1iLAorCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwljYXNlIFNXX1NUQVRFX05PTkU6CisJCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCQljYXNlIE5NX01UX0FDVElWQVRFX1NXX0FDSzoKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgU1dfU1RBVEVfRVJST1I6CisJCWJyZWFrOworCX0KKworCWlmIChyYykKKwkJREVCVUdQKEROTSwgInVuZXhwZWN0ZWQgTk0gTVQgMHglMDJ4IGluIHN0YXRlICV1IC0+ICV1XG4iLAorCQkJZm9oLT5tc2dfdHlwZSwgb2xkX3N0YXRlLCBzdy0+c3RhdGUpOworCisJcmV0dXJuIHJjOworfQorCisvKiBMb2FkIHRoZSBzcGVjaWZpZWQgc29mdHdhcmUgaW50byB0aGUgQlRTICovCitpbnQgYWJpc19ubV9zb2Z0d2FyZV9sb2FkKHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJICB1X2ludDhfdCB3aW5fc2l6ZSwgaW50IGZvcmNlZCwKKwkJCSAgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IGFiaXNfbm1fc3cgKnN3ID0gJmdfc3c7CisJaW50IHJjOworCisJREVCVUdQKEROTSwgIlNvZnR3YXJlIExvYWQgKEJUUyAldSwgRmlsZSBcIiVzXCIpXG4iLAorCQlidHMtPm5yLCBmbmFtZSk7CisKKwlpZiAoc3ctPnN0YXRlICE9IFNXX1NUQVRFX05PTkUpCisJCXJldHVybiAtRUJVU1k7CisKKwlzdy0+YnRzID0gYnRzOworCisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlzdy0+b2JqX2NsYXNzID0gTk1fT0NfU0lURV9NQU5BR0VSOworCQlzdy0+b2JqX2luc3RhbmNlWzBdID0gMHhmZjsKKwkJc3ctPm9ial9pbnN0YW5jZVsxXSA9IDB4ZmY7CisJCXN3LT5vYmpfaW5zdGFuY2VbMl0gPSAweGZmOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlzdy0+b2JqX2NsYXNzID0gTk1fT0NfQkFTRUJfVFJBTlNDOworCQlzdy0+b2JqX2luc3RhbmNlWzBdID0gMHgwMDsKKwkJc3ctPm9ial9pbnN0YW5jZVsxXSA9IDB4MDA7CisJCXN3LT5vYmpfaW5zdGFuY2VbMl0gPSAweGZmOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9VTktOT1dOOgorCWRlZmF1bHQ6CisJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIlNvZnR3YXJlIExvYWQgbm90IHByb3Blcmx5IGltcGxlbWVudGVkLlxuIik7CisJCXJldHVybiAtMTsKKwkJYnJlYWs7CisJfQorCXN3LT53aW5kb3dfc2l6ZSA9IHdpbl9zaXplOworCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX1dBSVRfSU5JVEFDSzsKKwlzdy0+Y2JmbiA9IGNiZm47CisJc3ctPmNiX2RhdGEgPSBjYl9kYXRhOworCXN3LT5mb3JjZWQgPSBmb3JjZWQ7CisKKwlyYyA9IHN3X29wZW5fZmlsZShzdywgZm5hbWUpOworCWlmIChyYyA8IDApIHsKKwkJc3ctPnN0YXRlID0gU1dfU1RBVEVfTk9ORTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiBzd19sb2FkX2luaXQoc3cpOworfQorCitpbnQgYWJpc19ubV9zb2Z0d2FyZV9sb2FkX3N0YXR1cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBhYmlzX25tX3N3ICpzdyA9ICZnX3N3OworCXN0cnVjdCBzdGF0IHN0OworCWludCByYywgcGVyY2VudDsKKworCXJjID0gZnN0YXQoc3ctPmZkLCAmc3QpOworCWlmIChyYyA8IDApIHsKKwkJcGVycm9yKCJFUlJPUiBkdXJpbmcgc3RhdCIpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKHN3LT5zdHJlYW0pCisJCXBlcmNlbnQgPSAoZnRlbGwoc3ctPnN0cmVhbSkgKiAxMDApIC8gc3Quc3Rfc2l6ZTsKKwllbHNlCisJCXBlcmNlbnQgPSAobHNlZWsoc3ctPmZkLCAwLCBTRUVLX0NVUikgKiAxMDApIC8gc3Quc3Rfc2l6ZTsKKwlyZXR1cm4gcGVyY2VudDsKK30KKworLyogQWN0aXZhdGUgdGhlIHNwZWNpZmllZCBzb2Z0d2FyZSBpbnRvIHRoZSBCVFMgKi8KK2ludCBhYmlzX25tX3NvZnR3YXJlX2FjdGl2YXRlKHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJICAgICAgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmNiX2RhdGEpCit7CisJc3RydWN0IGFiaXNfbm1fc3cgKnN3ID0gJmdfc3c7CisJaW50IHJjOworCisJREVCVUdQKEROTSwgIkFjdGl2YXRpbmcgU29mdHdhcmUgKEJUUyAldSwgRmlsZSBcIiVzXCIpXG4iLAorCQlidHMtPm5yLCBmbmFtZSk7CisKKwlpZiAoc3ctPnN0YXRlICE9IFNXX1NUQVRFX05PTkUpCisJCXJldHVybiAtRUJVU1k7CisKKwlzdy0+YnRzID0gYnRzOworCXN3LT5vYmpfY2xhc3MgPSBOTV9PQ19TSVRFX01BTkFHRVI7CisJc3ctPm9ial9pbnN0YW5jZVswXSA9IDB4ZmY7CisJc3ctPm9ial9pbnN0YW5jZVsxXSA9IDB4ZmY7CisJc3ctPm9ial9pbnN0YW5jZVsyXSA9IDB4ZmY7CisJc3ctPnN0YXRlID0gU1dfU1RBVEVfV0FJVF9BQ1RBQ0s7CisJc3ctPmNiZm4gPSBjYmZuOworCXN3LT5jYl9kYXRhID0gY2JfZGF0YTsKKworCS8qIE9wZW4gdGhlIGZpbGUgaW4gb3JkZXIgdG8gZmlsbCBzb21lIHN3IHN0cnVjdCBtZW1iZXJzICovCisJcmMgPSBzd19vcGVuX2ZpbGUoc3csIGZuYW1lKTsKKwlpZiAocmMgPCAwKSB7CisJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX05PTkU7CisJCXJldHVybiByYzsKKwl9CisJc3dfY2xvc2VfZmlsZShzdyk7CisKKwlyZXR1cm4gc3dfYWN0aXZhdGUoc3cpOworfQorCitzdGF0aWMgdm9pZCBmaWxsX25tX2NoYW5uZWwoc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqY2gsIHVfaW50OF90IGJ0c19wb3J0LAorCQkgICAgICAgdV9pbnQ4X3QgdHNfbnIsIHVfaW50OF90IHN1YnNsb3RfbnIpCit7CisJY2gtPmF0dHJpYiA9IE5NX0FUVF9BQklTX0NIQU5ORUw7CisJY2gtPmJ0c19wb3J0ID0gYnRzX3BvcnQ7CisJY2gtPnRpbWVzbG90ID0gdHNfbnI7CisJY2gtPnN1YnNsb3QgPSBzdWJzbG90X25yOwkKK30KKworaW50IGFiaXNfbm1fZXN0YWJsaXNoX3RlaShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCB0cnhfbnIsCisJCQkgIHVfaW50OF90IGUxX3BvcnQsIHVfaW50OF90IGUxX3RpbWVzbG90LCB1X2ludDhfdCBlMV9zdWJzbG90LAorCQkJICB1X2ludDhfdCB0ZWkpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICpjaDsKKwl1X2ludDhfdCBsZW4gPSBzaXplb2YoKmNoKSArIDI7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGxlbiwgTk1fTVRfRVNUQUJMSVNIX1RFSSwgTk1fT0NfUkFESU9fQ0FSUklFUiwKKwkJCWJ0cy0+YnRzX25yLCB0cnhfbnIsIDB4ZmYpOworCQorCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX1RFSSwgdGVpKTsKKworCWNoID0gKHN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJZmlsbF9ubV9jaGFubmVsKGNoLCBlMV9wb3J0LCBlMV90aW1lc2xvdCwgZTFfc3Vic2xvdCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogY29ubmVjdCBzaWduYWxsaW5nIG9mIG9uZSAoQlRTLFRSWCkgdG8gYSBwYXJ0aWN1bGFyIHRpbWVzbG90IG9uIHRoZSBFMSAqLworaW50IGFiaXNfbm1fY29ubl90ZXJyX3NpZ24oc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsCisJCQkgICB1X2ludDhfdCBlMV9wb3J0LCB1X2ludDhfdCBlMV90aW1lc2xvdCwgdV9pbnQ4X3QgZTFfc3Vic2xvdCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdHJ4LT5idHM7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICpjaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgc2l6ZW9mKCpjaCksIE5NX01UX0NPTk5fVEVSUl9TSUdOLAorCQkJTk1fT0NfUkFESU9fQ0FSUklFUiwgYnRzLT5idHNfbnIsIHRyeC0+bnIsIDB4ZmYpOworCQorCWNoID0gKHN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJZmlsbF9ubV9jaGFubmVsKGNoLCBlMV9wb3J0LCBlMV90aW1lc2xvdCwgZTFfc3Vic2xvdCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworI2lmIDAKK2ludCBhYmlzX25tX2Rpc2NfdGVycl9zaWduKHN0cnVjdCBhYmlzX25tX2ggKmgsIHN0cnVjdCBhYmlzX29tX29ial9pbnN0ICppbnN0LAorCQkJICAgc3RydWN0IGFiaXNfbm1fYWJpc19jaGFubmVsICpjaGFuKQoreworfQorI2VuZGlmCisKK2ludCBhYmlzX25tX2Nvbm5fdGVycl90cmFmKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsCisJCQkgICB1X2ludDhfdCBlMV9wb3J0LCB1X2ludDhfdCBlMV90aW1lc2xvdCwKKwkJCSAgIHVfaW50OF90IGUxX3N1YnNsb3QpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKmNoOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBzaXplb2YoKmNoKSwgTk1fTVRfQ09OTl9URVJSX1RSQUYsCisJCQlOTV9PQ19DSEFOTkVMLCBidHMtPmJ0c19uciwgdHMtPnRyeC0+bnIsIHRzLT5ucik7CisKKwljaCA9IChzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpjaCkpOworCWZpbGxfbm1fY2hhbm5lbChjaCwgZTFfcG9ydCwgZTFfdGltZXNsb3QsIGUxX3N1YnNsb3QpOworCisJREVCVUdQKEROTSwgIkNPTk5FQ1QgVEVSUiBUUkFGIFVtPSVzIEUxPSgldSwldSwldSlcbiIsCisJCWdzbV90c19uYW1lKHRzKSwKKwkJZTFfcG9ydCwgZTFfdGltZXNsb3QsIGUxX3N1YnNsb3QpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKyNpZiAwCitpbnQgYWJpc19ubV9kaXNjX3RlcnJfdHJhZihzdHJ1Y3QgYWJpc19ubV9oICpoLCBzdHJ1Y3QgYWJpc19vbV9vYmpfaW5zdCAqaW5zdCwKKwkJCSAgIHN0cnVjdCBhYmlzX25tX2FiaXNfY2hhbm5lbCAqY2hhbiwKKwkJCSAgIHVfaW50OF90IHN1YmNoYW4pCit7Cit9CisjZW5kaWYKKworLyogQ2hhcHRlciA4LjYuMSAqLworaW50IGFiaXNfbm1fc2V0X2J0c19hdHRyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90ICphdHRyLCBpbnQgYXR0cl9sZW4pCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90ICpjdXI7CisKKwlERUJVR1AoRE5NLCAiU2V0IEJUUyBBdHRyIChidHM9JWQpXG4iLCBidHMtPm5yKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGF0dHJfbGVuLCBOTV9NVF9TRVRfQlRTX0FUVFIsIE5NX09DX0JUUywgYnRzLT5idHNfbnIsIDB4ZmYsIDB4ZmYpOworCWN1ciA9IG1zZ2JfcHV0KG1zZywgYXR0cl9sZW4pOworCW1lbWNweShjdXIsIGF0dHIsIGF0dHJfbGVuKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBDaGFwdGVyIDguNi4yICovCitpbnQgYWJpc19ubV9zZXRfcmFkaW9fYXR0cihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgKmN1cjsKKworCURFQlVHUChETk0sICJTZXQgVFJYIEF0dHIgKGJ0cz0lZCx0cng9JWQpXG4iLCB0cngtPmJ0cy0+bnIsIHRyeC0+bnIpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgYXR0cl9sZW4sIE5NX01UX1NFVF9SQURJT19BVFRSLCBOTV9PQ19SQURJT19DQVJSSUVSLAorCQkJdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgMHhmZik7CisJY3VyID0gbXNnYl9wdXQobXNnLCBhdHRyX2xlbik7CisJbWVtY3B5KGN1ciwgYXR0ciwgYXR0cl9sZW4pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyh0cngtPmJ0cywgbXNnKTsKK30KKworc3RhdGljIGludCB2ZXJpZnlfY2hhbl9jb21iKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsIHVfaW50OF90IGNoYW5fY29tYikKK3sKKwlpbnQgaTsKKworCS8qIEFzIGl0IHR1cm5zIG91dCwgdGhlIEJTLTExIGhhcyBzb21lIHZlcnkgcGVjdWxpYXIgcmVzdHJpY3Rpb25zCisJICogb24gdGhlIGNoYW5uZWwgY29tYmluYXRpb25zIGl0IGFsbG93cyAqLworCXN3aXRjaCAodHMtPnRyeC0+YnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJY2FzZSBOTV9DSEFOQ19UQ0hIYWxmOgorCQljYXNlIE5NX0NIQU5DX1RDSEhhbGYyOgorCQkJLyogbm90IHN1cHBvcnRlZCAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNhc2UgTk1fQ0hBTkNfU0RDQ0g6CisJCQkvKiBvbmx5IG9uZSBTRENDSC84IHBlciBUUlggKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBUUlhfTlJfVFM7IGkrKykgeworCQkJCWlmIChpID09IHRzLT5ucikKKwkJCQkJY29udGludWU7CisJCQkJaWYgKHRzLT50cngtPnRzW2ldLm5tX2NoYW5fY29tYiA9PQorCQkJCSAgICBOTV9DSEFOQ19TRENDSCkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQkvKiBub3QgYWxsb3dlZCBmb3IgVFMwIG9mIEJDQ0gtVFJYICovCisJCQlpZiAodHMtPnRyeCA9PSB0cy0+dHJ4LT5idHMtPmMwICYmCisJCQkgICAgdHMtPm5yID09IDApCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJLyogbm90IG9uIHRoZSBzYW1lIFRSWCB0aGF0IGhhcyBhIEJDQ0grU0RDQ0g0CisJCQkgKiBjb21iaW5hdGlvbiAqLworCQkJaWYgKHRzLT50cnggPT0gdHMtPnRyeC0+YnRzLT5jMCAmJgorCQkJICAgICh0cy0+dHJ4LT50c1swXS5ubV9jaGFuX2NvbWIgPT0gNSB8fAorCQkJICAgICB0cy0+dHJ4LT50c1swXS5ubV9jaGFuX2NvbWIgPT0gOCkpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgTk1fQ0hBTkNfbWFpbkJDQ0g6CisJCWNhc2UgTk1fQ0hBTkNfQkNDSENvbWI6CisJCQkvKiBhbGxvd2VkIG9ubHkgZm9yIFRTMCBvZiBDMCAqLworCQkJaWYgKHRzLT50cnggIT0gdHMtPnRyeC0+YnRzLT5jMCB8fAorCQkJICAgIHRzLT5uciAhPSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgTk1fQ0hBTkNfQkNDSDoKKwkJCS8qIGFsbG93ZWQgb25seSBmb3IgVFMgMi80LzYgb2YgQzAgKi8KKwkJCWlmICh0cy0+dHJ4ICE9IHRzLT50cngtPmJ0cy0+YzApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAodHMtPm5yICE9IDIgJiYgdHMtPm5yICE9IDQgJiYKKwkJCSAgICB0cy0+bnIgIT0gNikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCQljYXNlIDg6IC8qIHRoaXMgaXMgbm90IGxpa2UgMDguNTgsIGJ1dCBpbiBmYWN0CisJCQkgKiBGQ0NIK1NDSCtCQ0NIK0NDQ0grU0RDQ0gvNCtTQUNDSC9DNCtDQkNIICovCisJCQkvKiBGSVhNRTogb25seSBvbmUgQ0JDSCBhbGxvd2VkIHBlciBjZWxsICovCisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlzd2l0Y2ggKHRzLT5ucikgeworCQljYXNlIDA6CisJCQlpZiAodHMtPnRyeC0+bnIgPT0gMCkgeworCQkJCS8qIG9ubHkgb24gVFJYMCAqLworCQkJCXN3aXRjaCAoY2hhbl9jb21iKSB7CisJCQkJY2FzZSBOTV9DSEFOQ19CQ0NIOgorCQkJCWNhc2UgTk1fQ0hBTkNfbWFpbkJDQ0g6CisJCQkJY2FzZSBOTV9DSEFOQ19CQ0NIQ29tYjoKKwkJCQkJcmV0dXJuIDA7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJCQljYXNlIE5NX0NIQU5DX1RDSEZ1bGw6CisJCQkJY2FzZSBOTV9DSEFOQ19UQ0hIYWxmOgorCQkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1RDSEhhbGY6CisJCQkJCXJldHVybiAwOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpZiAodHMtPnRyeC0+bnIgPT0gMCkgeworCQkJCXN3aXRjaCAoY2hhbl9jb21iKSB7CisJCQkJY2FzZSBOTV9DSEFOQ19TRENDSF9DQkNIOgorCQkJCQlpZiAodHMtPnRyeC0+dHNbMF0ubm1fY2hhbl9jb21iID09CisJCQkJCSAgICBOTV9DSEFOQ19tYWluQkNDSCkKKwkJCQkJCXJldHVybiAwOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQljYXNlIE5NX0NIQU5DX1NEQ0NIOgorCQkJCWNhc2UgTk1fQ0hBTkNfVENIRnVsbDoKKwkJCQljYXNlIE5NX0NIQU5DX1RDSEhhbGY6CisJCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfVENISGFsZjoKKwkJCQljYXNlIE5NX0NIQU5DX0lQQUNfVENIRnVsbF9QRENIOgorCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXN3aXRjaCAoY2hhbl9jb21iKSB7CisJCQkJY2FzZSBOTV9DSEFOQ19TRENDSDoKKwkJCQljYXNlIE5NX0NIQU5DX1RDSEZ1bGw6CisJCQkJY2FzZSBOTV9DSEFOQ19UQ0hIYWxmOgorCQkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1RDSEhhbGY6CisJCQkJCXJldHVybiAwOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDI6CisJCWNhc2UgMzoKKwkJY2FzZSA0OgorCQljYXNlIDU6CisJCWNhc2UgNjoKKwkJY2FzZSA3OgorCQkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJCWNhc2UgTk1fQ0hBTkNfVENIRnVsbDoKKwkJCWNhc2UgTk1fQ0hBTkNfVENISGFsZjoKKwkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1RDSEhhbGY6CisJCQkJcmV0dXJuIDA7CisJCQljYXNlIE5NX0NIQU5DX0lQQUNfUERDSDoKKwkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1BEQ0g6CisJCQkJaWYgKHRzLT50cngtPm5yID09IDApCisJCQkJCXJldHVybiAwOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZWZhdWx0OgorCQkvKiB1bmtub3duIEJUUyB0eXBlICovCisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA4LjYuMyAqLworaW50IGFiaXNfbm1fc2V0X2NoYW5uZWxfYXR0cihzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzLCB1X2ludDhfdCBjaGFuX2NvbWIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXVfaW50MTZfdCBhcmZjbiA9IGh0b25zKHRzLT50cngtPmFyZmNuKTsKKwl1X2ludDhfdCB6ZXJvID0gMHgwMDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGxlbiA9IDIgKyAyOworCisJaWYgKGJ0cy0+dHlwZSA9PSBHU01fQlRTX1RZUEVfQlMxMSkKKwkJbGVuICs9IDQgKyAyICsgMiArIDM7CisKKwlERUJVR1AoRE5NLCAiU2V0IENoYW4gQXR0ciAlc1xuIiwgZ3NtX3RzX25hbWUodHMpKTsKKwlpZiAodmVyaWZ5X2NoYW5fY29tYih0cywgY2hhbl9jb21iKSA8IDApIHsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCURFQlVHUChETk0sICJJbnZhbGlkIENoYW5uZWwgQ29tYmluYXRpb24hISFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdHMtPm5tX2NoYW5fY29tYiA9IGNoYW5fY29tYjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGxlbiwgTk1fTVRfU0VUX0NIQU5fQVRUUiwKKwkJCU5NX09DX0NIQU5ORUwsIGJ0cy0+YnRzX25yLAorCQkJdHMtPnRyeC0+bnIsIHRzLT5ucik7CisJLyogRklYTUU6IGRvbid0IHNlbmQgQVJGQ04gbGlzdCwgaG9wcGluZyBzZXF1ZW5jZSwgbUFJTywgLi4uKi8KKwlpZiAoYnRzLT50eXBlID09IEdTTV9CVFNfVFlQRV9CUzExKQorCQltc2diX3RsdjE2X3B1dChtc2csIE5NX0FUVF9BUkZDTl9MSVNULCAxLCAmYXJmY24pOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX0NIQU5fQ09NQiwgY2hhbl9jb21iKTsKKwlpZiAoYnRzLT50eXBlID09IEdTTV9CVFNfVFlQRV9CUzExKSB7CisJCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX0hTTiwgMHgwMCk7CisJCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX01BSU8sIDB4MDApOworCX0KKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9UU0MsIGJ0cy0+dHNjKTsJLyogdHJhaW5pbmcgc2VxdWVuY2UgKi8KKwlpZiAoYnRzLT50eXBlID09IEdTTV9CVFNfVFlQRV9CUzExKQorCQltc2diX3Rsdl9wdXQobXNnLCAweDU5LCAxLCAmemVybyk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fc3dfYWN0X3JlcV9hY2soc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMSwKKwkJCXVfaW50OF90IGkyLCB1X2ludDhfdCBpMywgaW50IG5hY2ssIHVfaW50OF90ICphdHRyLCBpbnQgYXR0X2xlbikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbXNndHlwZSA9IE5NX01UX1NXX0FDVF9SRVFfQUNLOworCXVfaW50OF90IGxlbiA9IGF0dF9sZW47CisKKwlpZiAobmFjaykgeworCQlsZW4gKz0gMjsKKwkJbXNndHlwZSA9IE5NX01UX1NXX0FDVF9SRVFfTkFDSzsKKwl9CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBhdHRfbGVuLCBtc2d0eXBlLCBvYmpfY2xhc3MsIGkxLCBpMiwgaTMpOworCisJaWYgKGF0dHIpIHsKKwkJdV9pbnQ4X3QgKnB0ciA9IG1zZ2JfcHV0KG1zZywgYXR0X2xlbik7CisJCW1lbWNweShwdHIsIGF0dHIsIGF0dF9sZW4pOworCX0KKwlpZiAobmFjaykKKwkJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfTkFDS19DQVVTRVMsIE5NX05BQ0tfT0JKQ0xBU1NfTk9UU1VQUCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fcmF3X21zZyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgbGVuLCB1X2ludDhfdCAqcmF3bXNnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwl1X2ludDhfdCAqZGF0YTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqb2gpKTsKKwlmaWxsX29tX2hkcihvaCwgbGVuKTsKKwlkYXRhID0gbXNnYl9wdXQobXNnLCBsZW4pOworCW1lbWNweShkYXRhLCByYXdtc2csIGxlbik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogU2llbWVucyBzcGVjaWZpYyBjb21tYW5kcyAqLworc3RhdGljIGludCBfX3NpbXBsZV9jbWQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbXNnX3R5cGUpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgbXNnX3R5cGUsIE5NX09DX1NJVEVfTUFOQUdFUiwKKwkJCTB4ZmYsIDB4ZmYsIDB4ZmYpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC45LjIgKi8KK2ludCBhYmlzX25tX29wc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMCwgdV9pbnQ4X3QgaTEsIHVfaW50OF90IGkyKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDAsIE5NX01UX09QU1RBUlQsIG9ial9jbGFzcywgaTAsIGkxLCBpMik7CisKKwlkZWJ1Z3BfZm9oKChzdHJ1Y3QgYWJpc19vbV9mb21faGRyICopIG9oLT5kYXRhKTsKKwlERUJVR1BDKEROTSwgIlNlbmRpbmcgT1BTVEFSVFxuIik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogQ2hhcHRlciA4LjguNSAqLworaW50IGFiaXNfbm1fY2hnX2FkbV9zdGF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkwLAorCQkJICB1X2ludDhfdCBpMSwgdV9pbnQ4X3QgaTIsIGVudW0gYWJpc19ubV9hZG1fc3RhdGUgYWRtX3N0YXRlKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIsIE5NX01UX0NIR19BRE1fU1RBVEUsIG9ial9jbGFzcywgaTAsIGkxLCBpMik7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfQURNX1NUQVRFLCBhZG1fc3RhdGUpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2Nvbm5fbWRyb3BfbGluayhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBlMV9wb3J0MCwgdV9pbnQ4X3QgdHMwLAorCQkJICAgIHVfaW50OF90IGUxX3BvcnQxLCB1X2ludDhfdCB0czEpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90ICphdHRyOworCisJREVCVUdQKEROTSwgIkNPTk5FQ1QgTURST1AgTElOSyBFMT0oJXUsJXUpIC0+IEUxPSgldSwgJXUpXG4iLAorCQllMV9wb3J0MCwgdHMwLCBlMV9wb3J0MSwgdHMxKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDYsIE5NX01UX0NPTk5fTURST1BfTElOSywKKwkJCU5NX09DX1NJVEVfTUFOQUdFUiwgMHgwMCwgMHgwMCwgMHgwMCk7CisKKwlhdHRyID0gbXNnYl9wdXQobXNnLCAzKTsKKwlhdHRyWzBdID0gTk1fQVRUX01EUk9QX0xJTks7CisJYXR0clsxXSA9IGUxX3BvcnQwOworCWF0dHJbMl0gPSB0czA7CisKKwlhdHRyID0gbXNnYl9wdXQobXNnLCAzKTsKKwlhdHRyWzBdID0gTk1fQVRUX01EUk9QX05FWFQ7CisJYXR0clsxXSA9IGUxX3BvcnQxOworCWF0dHJbMl0gPSB0czE7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogQ2hhcHRlciA4LjcuMSAqLworaW50IGFiaXNfbm1fcGVyZm9ybV90ZXN0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJCSB1X2ludDhfdCBidHNfbnIsIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkgdV9pbnQ4X3QgdGVzdF9uciwgdV9pbnQ4X3QgYXV0b25fcmVwb3J0LAorCQkJIHVfaW50OF90ICpwaHlzX2NvbmZpZywgdV9pbnQxNl90IHBoeXNfY29uZmlnX2xlbikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJaW50IGxlbiA9IDQ7IC8qIDIgVFYgYXR0cmlidXRlcyAqLworCisJREVCVUdQKEROTSwgIlBFRk9STSBURVNUXG4iKTsKKwkKKwlpZiAocGh5c19jb25maWdfbGVuKQorCQlsZW4gKz0gMyArIHBoeXNfY29uZmlnX2xlbjsKKwkKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX1BFUkZfVEVTVCwKKwkJCW9ial9jbGFzcywgYnRzX25yLCB0cnhfbnIsIHRzX25yKTsKKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9URVNUX05PLCB0ZXN0X25yKTsKKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9BVVRPTl9SRVBPUlQsIGF1dG9uX3JlcG9ydCk7CisJaWYgKHBoeXNfY29uZmlnX2xlbikKKwkJbXNnYl90bDE2dl9wdXQobXNnLCBOTV9BVFRfUEhZU19DT05GLCBwaHlzX2NvbmZpZ19sZW4sCisJCQkJcGh5c19jb25maWcpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2V2ZW50X3JlcG9ydHMoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG9uKQoreworCWlmIChvbiA9PSAwKQorCQlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfU1RPUF9FVkVOVF9SRVApOworCWVsc2UKKwkJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX1JFU1RfRVZFTlRfUkVQKTsKK30KKworLyogU2llbWVucyAob3IgQlMtMTEpIHNwZWNpZmljIGNvbW1hbmRzICovCisKK2ludCBhYmlzX25tX2JzMTFfYnNjX2Rpc2Nvbm5lY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHJlY29ubmVjdCkKK3sKKwlpZiAocmVjb25uZWN0ID09IDApCisJCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX0RJU0NPTk5FQ1QpOworCWVsc2UKKwkJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfUkVDT05ORUNUKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9yZXN0YXJ0KHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfUkVTVEFSVCk7Cit9CisKKworc3RydWN0IGJzMTFfZGF0ZV90aW1lIHsKKwl1X2ludDE2X3QJeWVhcjsKKwl1X2ludDhfdAltb250aDsKKwl1X2ludDhfdAlkYXk7CisJdV9pbnQ4X3QJaG91cjsKKwl1X2ludDhfdAltaW47CisJdV9pbnQ4X3QJc2VjOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCit2b2lkIGdldF9iczExX2RhdGVfdGltZShzdHJ1Y3QgYnMxMV9kYXRlX3RpbWUgKmFldCkKK3sKKwl0aW1lX3QgdDsKKwlzdHJ1Y3QgdG0gKnRtOworCisJdCA9IHRpbWUoTlVMTCk7CisJdG0gPSBsb2NhbHRpbWUoJnQpOworCWFldC0+c2VjID0gdG0tPnRtX3NlYzsKKwlhZXQtPm1pbiA9IHRtLT50bV9taW47CisJYWV0LT5ob3VyID0gdG0tPnRtX2hvdXI7CisJYWV0LT5kYXkgPSB0bS0+dG1fbWRheTsKKwlhZXQtPm1vbnRoID0gdG0tPnRtX21vbjsKKwlhZXQtPnllYXIgPSBodG9ucygxOTAwICsgdG0tPnRtX3llYXIpOworfQorCitpbnQgYWJpc19ubV9iczExX3Jlc2V0X3Jlc291cmNlKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfUkVTRVRfUkVTT1VSQ0UpOworfQorCitpbnQgYWJpc19ubV9iczExX2RiX3RyYW5zbWlzc2lvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgYmVnaW4pCit7CisJaWYgKGJlZ2luKQorCQlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfQlMxMV9CRUdJTl9EQl9UWCk7CisJZWxzZQorCQlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfQlMxMV9FTkRfREJfVFgpOworfQorCitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQllbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHR5cGUsIHVfaW50OF90IGlkeCwKKwkJCQl1X2ludDhfdCBhdHRyX2xlbiwgY29uc3QgdV9pbnQ4X3QgKmF0dHIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90ICpjdXI7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBhdHRyX2xlbiwgTk1fTVRfQlMxMV9DUkVBVEVfT0JKLAorCQkJTk1fT0NfQlMxMSwgdHlwZSwgMCwgaWR4KTsKKwljdXIgPSBtc2diX3B1dChtc2csIGF0dHJfbGVuKTsKKwltZW1jcHkoY3VyLCBhdHRyLCBhdHRyX2xlbik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9kZWxldGVfb2JqZWN0KHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJZW51bSBhYmlzX2JzMTFfb2JqdHlwZSB0eXBlLCB1X2ludDhfdCBpZHgpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfQlMxMV9ERUxFVEVfT0JKLAorCQkJTk1fT0NfQlMxMSwgdHlwZSwgMCwgaWR4KTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9lbnZhQlRTRShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBpZHgpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IHplcm8gPSAweDAwOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMywgTk1fTVRfQlMxMV9DUkVBVEVfT0JKLAorCQkJTk1fT0NfQlMxMV9FTlZBQlRTRSwgMCwgaWR4LCAweGZmKTsKKwltc2diX3Rsdl9wdXQobXNnLCAweDk5LCAxLCAmemVybyk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9jcmVhdGVfYnBvcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgaWR4KQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDAsIE5NX01UX0JTMTFfQ1JFQVRFX09CSiwgTk1fT0NfQlMxMV9CUE9SVCwKKwkJCWlkeCwgMHhmZiwgMHhmZik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9kZWxldGVfYnBvcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgaWR4KQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDAsIE5NX01UX0JTMTFfREVMRVRFX09CSiwgTk1fT0NfQlMxMV9CUE9SVCwKKwkJCWlkeCwgMHhmZiwgMHhmZik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworc3RhdGljIGNvbnN0IHVfaW50OF90IHNtX2F0dHJbXSA9IHsgTk1fQVRUX1RFSSwgTk1fQVRUX0FCSVNfQ0hBTk5FTCB9OworaW50IGFiaXNfbm1fYnMxMV9nZXRfb21sX3RlaV90cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKHNtX2F0dHIpLCBOTV9NVF9HRVRfQVRUUiwgTk1fT0NfU0lURV9NQU5BR0VSLAorCQkJMHhmZiwgMHhmZiwgMHhmZik7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0xJU1RfUkVRX0FUVFIsIHNpemVvZihzbV9hdHRyKSwgc21fYXR0cik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogbGlrZSBhYmlzX25tX2Nvbm5fdGVycl90cmFmICsgc2V0X3RlaSAqLworaW50IGFiaXNfbm1fYnMxMV9jb25uX29tbF90ZWkoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgZTFfcG9ydCwgCisJCQkgIHVfaW50OF90IGUxX3RpbWVzbG90LCB1X2ludDhfdCBlMV9zdWJzbG90LAorCQkJICB1X2ludDhfdCB0ZWkpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICpjaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgc2l6ZW9mKCpjaCkrMiwgTk1fTVRfQlMxMV9TRVRfQVRUUiwKKwkJCU5NX09DX1NJVEVfTUFOQUdFUiwgMHhmZiwgMHhmZiwgMHhmZik7CisKKwljaCA9IChzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpjaCkpOworCWZpbGxfbm1fY2hhbm5lbChjaCwgZTFfcG9ydCwgZTFfdGltZXNsb3QsIGUxX3N1YnNsb3QpOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX1RFSSwgdGVpKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX3NldF90cnhfcG93ZXIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IGxldmVsKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDMsIE5NX01UX0JTMTFfU0VUX0FUVFIsCisJCQlOTV9PQ19CUzExLCBCUzExX09CSl9QQSwgMHgwMCwgdHJ4LT5ucik7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfVFhQV1IsIDEsICZsZXZlbCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHRyeC0+YnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2dldF90cnhfcG93ZXIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGF0dHIgPSBOTV9BVFRfQlMxMV9UWFBXUjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGF0dHIpLCBOTV9NVF9HRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX1BBLCAweDAwLCB0cngtPm5yKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKGF0dHIpLCAmYXR0cik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHRyeC0+YnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2dldF9wbGxfbW9kZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBhdHRyW10gPSB7IE5NX0FUVF9CUzExX1BMTF9NT0RFIH07CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAyK3NpemVvZihhdHRyKSwgTk1fTVRfR0VUX0FUVFIsCisJCQlOTV9PQ19CUzExLCBCUzExX09CSl9MSSwgMHgwMCwgMHgwMCk7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0xJU1RfUkVRX0FUVFIsIHNpemVvZihhdHRyKSwgYXR0cik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9nZXRfY2NsayhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBhdHRyW10gPSB7IE5NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1ksCisJCQkgICAgTk1fQVRUX0JTMTFfQ0NMS19UWVBFIH07CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAyK3NpemVvZihhdHRyKSwgTk1fTVRfR0VUX0FUVFIsCisJCQlOTV9PQ19CUzExLCBCUzExX09CSl9DQ0xLLCAweDAwLCAweDAwKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKGF0dHIpLCBhdHRyKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworCit9CisKKy8vc3RhdGljIGNvbnN0IHVfaW50OF90IGJzMTFfbG9nb25fYzdbXSA9IHsgMHgwNywgMHhkOSwgMHgwMSwgMHgxMSwgMHgwZCwgMHgxMCwgMHgyMCB9OworCitpbnQgYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG9uKQoreworCXJldHVybiBhYmlzX25tX2JzMTFfbG9nb24oYnRzLCAweDAyLCAiRkFDVE9SWSIsIG9uKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9pbmZpZWxkX2xvZ29uKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBvbikKK3sKKwlyZXR1cm4gYWJpc19ubV9iczExX2xvZ29uKGJ0cywgMHgwMywgIkZJRUxEICAiLCBvbik7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbGV2ZWwsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBvbikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJc3RydWN0IGJzMTFfZGF0ZV90aW1lIGJkdDsKKworCWdldF9iczExX2RhdGVfdGltZSgmYmR0KTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlpZiAob24pIHsKKwkJdV9pbnQ4X3QgbGVuID0gMyoyICsgc2l6ZW9mKGJkdCkKKwkJCQkrIDEgKyBzdHJsZW4obmFtZSk7CisJCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9CUzExX0xNVF9MT0dPTiwKKwkJCQlOTV9PQ19CUzExX0JUU0UsIDB4ZmYsIDB4ZmYsIDB4ZmYpOworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MTVRfTE9HSU5fVElNRSwKKwkJCSAgICAgc2l6ZW9mKGJkdCksICh1X2ludDhfdCAqKSAmYmR0KTsKKwkJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFViwKKwkJCSAgICAgMSwgJmxldmVsKTsKKwkJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRSwKKwkJCSAgICAgc3RybGVuKG5hbWUpLCAodV9pbnQ4X3QgKiluYW1lKTsKKwl9IGVsc2UgeworCQlmaWxsX29tX2ZvbV9oZHIob2gsIDAsIE5NX01UX0JTMTFfTE1UX0xPR09GRiwKKwkJCQlOTV9PQ19CUzExX0JUU0UsIDB4ZmYsIDB4ZmYsIDB4ZmYpOworCX0KKwkKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9zZXRfdHJ4MV9wdyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpwYXNzd29yZCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2c7CisKKwlpZiAoc3RybGVuKHBhc3N3b3JkKSAhPSAxMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKyAJbXNnID0gbm1fbXNnYl9hbGxvYygpOworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc3RybGVuKHBhc3N3b3JkKSwgTk1fTVRfQlMxMV9TRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX1RSWDEsIDB4MDAsIDB4MDApOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX1BBU1NXT1JELCAxMCwgKGNvbnN0IHVfaW50OF90ICopcGFzc3dvcmQpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIGNoYW5nZSB0aGUgQlMtMTEgUExMIE1vZGUgdG8gZWl0aGVyIGxvY2tlZCAoRTEgZGVyaXZlZCkgb3Igc3RhbmRhbG9uZSAqLworaW50IGFiaXNfbm1fYnMxMV9zZXRfcGxsX2xvY2tlZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgbG9ja2VkKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwl1X2ludDhfdCB0bHZfdmFsdWU7CisJCisJbXNnID0gbm1fbXNnYl9hbGxvYygpOworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDMsIE5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX0JTMTEsCisJCQlCUzExX09CSl9MSSwgMHgwMCwgMHgwMCk7CisKKwlpZiAobG9ja2VkKQorCQl0bHZfdmFsdWUgPSBCUzExX0xJX1BMTF9MT0NLRUQ7CisJZWxzZQorCQl0bHZfdmFsdWUgPSBCUzExX0xJX1BMTF9TVEFOREFMT05FOworCQorCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX1BMTF9NT0RFLCAxLCAmdGx2X3ZhbHVlKTsKKwkKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogU2V0IHRoZSBjYWxpYnJhdGlvbiB2YWx1ZSBvZiB0aGUgUExMICh3b3JrIHZhbHVlL3NldCB2YWx1ZSkKKyAqIEl0IGRlcGVuZHMgb24gdGhlIGxvZ2luIHdoaWNoIG9uZSBpcyBjaGFuZ2VkICovCitpbnQgYWJpc19ubV9iczExX3NldF9wbGwoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHZhbHVlKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwl1X2ludDhfdCB0bHZfdmFsdWVbMl07CisKKwltc2cgPSBubV9tc2diX2FsbG9jKCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMywgTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMSwKKwkJCUJTMTFfT0JKX1RSWDEsIDB4MDAsIDB4MDApOworCisJdGx2X3ZhbHVlWzBdID0gdmFsdWU+Pjg7CisJdGx2X3ZhbHVlWzFdID0gdmFsdWUmMHhmZjsKKworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX1BMTCwgMiwgdGx2X3ZhbHVlKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2dldF9zdGF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX0dFVF9TVEFURSk7Cit9CisKKy8qIEJTMTEgU1dMICovCisKK3ZvaWQgKnRhbGxfZmxlX2N0eDsKKworc3RydWN0IGFiaXNfbm1fYnMxMV9zdyB7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwljaGFyIHN3bF9mbmFtZVtQQVRIX01BWF07CisJdV9pbnQ4X3Qgd2luX3NpemU7CisJaW50IGZvcmNlZDsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBmaWxlX2xpc3Q7CisJZ3NtX2NiZm4gKnVzZXJfY2I7CS8qIHNwZWNpZmllZCBieSB0aGUgdXNlciAqLworfTsKK3N0YXRpYyBzdHJ1Y3QgYWJpc19ubV9iczExX3N3IF9nX2JzMTFfc3csICpnX2JzMTFfc3cgPSAmX2dfYnMxMV9zdzsKKworc3RydWN0IGZpbGVfbGlzdF9lbnRyeSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwljaGFyIGZuYW1lW1BBVEhfTUFYXTsKK307CisKK3N0cnVjdCBmaWxlX2xpc3RfZW50cnkgKmZsX2RlcXVldWUoc3RydWN0IGxsaXN0X2hlYWQgKnF1ZXVlKQoreworCXN0cnVjdCBsbGlzdF9oZWFkICpsaDsKKworCWlmIChsbGlzdF9lbXB0eShxdWV1ZSkpCisJCXJldHVybiBOVUxMOworCisJbGggPSBxdWV1ZS0+bmV4dDsKKwlsbGlzdF9kZWwobGgpOworCQorCXJldHVybiBsbGlzdF9lbnRyeShsaCwgc3RydWN0IGZpbGVfbGlzdF9lbnRyeSwgbGlzdCk7Cit9CisKK3N0YXRpYyBpbnQgYnMxMV9yZWFkX3N3bF9maWxlKHN0cnVjdCBhYmlzX25tX2JzMTFfc3cgKmJzMTFfc3cpCit7CisJY2hhciBsaW5lYnVmWzI1NV07CisJc3RydWN0IGxsaXN0X2hlYWQgKmxoLCAqbGgyOworCUZJTEUgKnN3bDsKKwlpbnQgcmMgPSAwOworCisJc3dsID0gZm9wZW4oYnMxMV9zdy0+c3dsX2ZuYW1lLCAiciIpOworCWlmICghc3dsKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIHplcm8gdGhlIHN0YWxlIGZpbGUgbGlzdCwgaWYgYW55ICovCisJbGxpc3RfZm9yX2VhY2hfc2FmZShsaCwgbGgyLCAmYnMxMV9zdy0+ZmlsZV9saXN0KSB7CisJCWxsaXN0X2RlbChsaCk7CisJCXRhbGxvY19mcmVlKGxoKTsKKwl9CisKKwl3aGlsZSAoZmdldHMobGluZWJ1Ziwgc2l6ZW9mKGxpbmVidWYpLCBzd2wpKSB7CisJCWNoYXIgZmlsZV9pZFsxMisxXTsKKwkJY2hhciBmaWxlX3ZlcnNpb25bODArMV07CisJCXN0cnVjdCBmaWxlX2xpc3RfZW50cnkgKmZsZTsKKwkJc3RhdGljIGNoYXIgZGlyW1BBVEhfTUFYXTsKKworCQlpZiAoc3RybGVuKGxpbmVidWYpIDwgNCkKKwkJCWNvbnRpbnVlOworCQorCQlyYyA9IHNzY2FuZihsaW5lYnVmKzQsICIlMTJzOiU4MHNcclxuIiwgZmlsZV9pZCwgZmlsZV92ZXJzaW9uKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcGVycm9yKCJFUlIgcGFyc2luZyBTV0wgZmlsZSIpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKHJjIDwgMikKKwkJCWNvbnRpbnVlOworCisJCWZsZSA9IHRhbGxvY196ZXJvKHRhbGxfZmxlX2N0eCwgc3RydWN0IGZpbGVfbGlzdF9lbnRyeSk7CisJCWlmICghZmxlKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIGNvbnN0cnVjdCBuZXcgZmlsZW5hbWUgKi8KKwkJc3RybmNweShkaXIsIGJzMTFfc3ctPnN3bF9mbmFtZSwgc2l6ZW9mKGRpcikpOworCQlzdHJuY2F0KGZsZS0+Zm5hbWUsIGRpcm5hbWUoZGlyKSwgc2l6ZW9mKGZsZS0+Zm5hbWUpIC0gMSk7CisJCXN0cmNhdChmbGUtPmZuYW1lLCAiLyIpOworCQlzdHJuY2F0KGZsZS0+Zm5hbWUsIGZpbGVfaWQsIHNpemVvZihmbGUtPmZuYW1lKSAtIDEgLXN0cmxlbihmbGUtPmZuYW1lKSk7CisJCQorCQlsbGlzdF9hZGRfdGFpbCgmZmxlLT5saXN0LCAmYnMxMV9zdy0+ZmlsZV9saXN0KTsKKwl9CisKK291dDoKKwlmY2xvc2Uoc3dsKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGJzMTEgc3dsb2FkIHNwZWNpZmljIGNhbGxiYWNrLCBwYXNzZWQgdG8gYWJpc19ubSBjb3JlIHN3bG9hZCAqLworc3RhdGljIGludCBiczExX3N3bG9hZF9jYmZuKHVuc2lnbmVkIGludCBob29rLCB1bnNpZ25lZCBpbnQgZXZlbnQsCisJCQkgICAgc3RydWN0IG1zZ2IgKm1zZywgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IGFiaXNfbm1fYnMxMV9zdyAqYnMxMV9zdyA9IGRhdGE7CisJc3RydWN0IGZpbGVfbGlzdF9lbnRyeSAqZmxlOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBOTV9NVF9MT0FEX0VORF9BQ0s6CisJCWZsZSA9IGZsX2RlcXVldWUoJmJzMTFfc3ctPmZpbGVfbGlzdCk7CisJCWlmIChmbGUpIHsKKwkJCS8qIHN0YXJ0IGRvd25sb2FkIHRoZSBuZXh0IGZpbGUgb2Ygb3VyIGZpbGUgbGlzdCAqLworCQkJcmMgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWQoYnMxMV9zdy0+YnRzLCBmbGUtPmZuYW1lLAorCQkJCQkJICAgYnMxMV9zdy0+d2luX3NpemUsCisJCQkJCQkgICBiczExX3N3LT5mb3JjZWQsCisJCQkJCQkgICAmYnMxMV9zd2xvYWRfY2JmbiwgYnMxMV9zdyk7CisJCQl0YWxsb2NfZnJlZShmbGUpOworCQl9IGVsc2UgeworCQkJLyogYWN0aXZhdGUgdGhlIFNXTCAqLworCQkJcmMgPSBhYmlzX25tX3NvZnR3YXJlX2FjdGl2YXRlKGJzMTFfc3ctPmJ0cywKKwkJCQkJCQliczExX3N3LT5zd2xfZm5hbWUsCisJCQkJCQkJYnMxMV9zd2xvYWRfY2JmbiwKKwkJCQkJCQliczExX3N3KTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfU0VHX0FDSzoKKwljYXNlIE5NX01UX0xPQURfRU5EX05BQ0s6CisJY2FzZSBOTV9NVF9MT0FEX0lOSVRfQUNLOgorCWNhc2UgTk1fTVRfTE9BRF9JTklUX05BQ0s6CisJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19OQUNLOgorCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfQUNLOgorCWRlZmF1bHQ6CisJCS8qIGZhbGx0aHJvdWdoIHRvIHRoZSB1c2VyIGNhbGxiYWNrICovCisJCWlmIChiczExX3N3LT51c2VyX2NiKQorCQkJcmMgPSBiczExX3N3LT51c2VyX2NiKGhvb2ssIGV2ZW50LCBtc2csIE5VTEwsIE5VTEwpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFNpZW1lbnMgcHJvdmlkZXMgYSBTV0wgZmlsZSB0aGF0IGlzIGEgbWVyZSBsaXN0aW5nIG9mIGFsbCB0aGUgb3RoZXIKKyAqIGZpbGVzIHRoYXQgYXJlIHBhcnQgb2YgYSBzb2Z0d2FyZSByZWxlYXNlLiAgV2UgbmVlZCB0byB1cGxvYWQgZmlyc3QKKyAqIHRoZSBsaXN0IGZpbGUsIGFuZCB0aGVuIGVhY2ggZmlsZSB0aGF0IGlzIGxpc3RlZCBpbiB0aGUgbGlzdCBmaWxlICovCitpbnQgYWJpc19ubV9iczExX2xvYWRfc3dsKHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJICB1X2ludDhfdCB3aW5fc2l6ZSwgaW50IGZvcmNlZCwgZ3NtX2NiZm4gKmNiZm4pCit7CisJc3RydWN0IGFiaXNfbm1fYnMxMV9zdyAqYnMxMV9zdyA9IGdfYnMxMV9zdzsKKwlzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5ICpmbGU7CisJaW50IHJjID0gMDsKKworCUlOSVRfTExJU1RfSEVBRCgmYnMxMV9zdy0+ZmlsZV9saXN0KTsKKwliczExX3N3LT5idHMgPSBidHM7CisJYnMxMV9zdy0+d2luX3NpemUgPSB3aW5fc2l6ZTsKKwliczExX3N3LT51c2VyX2NiID0gY2JmbjsKKwliczExX3N3LT5mb3JjZWQgPSBmb3JjZWQ7CisKKwlzdHJuY3B5KGJzMTFfc3ctPnN3bF9mbmFtZSwgZm5hbWUsIHNpemVvZihiczExX3N3LT5zd2xfZm5hbWUpKTsKKwlyYyA9IGJzMTFfcmVhZF9zd2xfZmlsZShiczExX3N3KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiBkZXF1ZXVlIG5leHQgaXRlbSBpbiBmaWxlIGxpc3QgKi8KKwlmbGUgPSBmbF9kZXF1ZXVlKCZiczExX3N3LT5maWxlX2xpc3QpOworCWlmICghZmxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHN0YXJ0IGRvd25sb2FkIHRoZSBuZXh0IGZpbGUgb2Ygb3VyIGZpbGUgbGlzdCAqLworCXJjID0gYWJpc19ubV9zb2Z0d2FyZV9sb2FkKGJ0cywgZmxlLT5mbmFtZSwgd2luX3NpemUsIGZvcmNlZCwKKwkJCQkgICBiczExX3N3bG9hZF9jYmZuLCBiczExX3N3KTsKKwl0YWxsb2NfZnJlZShmbGUpOworCXJldHVybiByYzsKK30KKworI2lmIDAKK3N0YXRpYyB1X2ludDhfdCByZXFfYXR0cl9idHNlW10gPSB7CisJTk1fQVRUX0FETV9TVEFURSwgTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT04sCisJTk1fQVRUX0JTMTFfTE1UX0xPR0lOX1RJTUUsIE5NX0FUVF9CUzExX0xNVF9VU0VSX0FDQ19MRVYsCisJTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRSwKKworCTB4YWYsIE5NX0FUVF9CUzExX1JYX09GRlNFVCwgTk1fQVRUX0JTMTFfVkVORE9SX05BTUUsCisKKwlOTV9BVFRfQlMxMV9TV19MT0FEX0lOVEVOREVELCBOTV9BVFRfQlMxMV9TV19MT0FEX1NBRkVUWSwKKworCU5NX0FUVF9CUzExX1NXX0xPQURfU1RPUkVEIH07CisKK3N0YXRpYyB1X2ludDhfdCByZXFfYXR0cl9idHNtW10gPSB7CisJTk1fQVRUX0FCSVNfQ0hBTk5FTCwgTk1fQVRUX1RFSSwgTk1fQVRUX0JTMTFfQUJJU19FWFRfVElNRSwKKwlOTV9BVFRfQURNX1NUQVRFLCBOTV9BVFRfQVZBSUxfU1RBVFVTLCAweGNlLCBOTV9BVFRfRklMRV9JRCwKKwlOTV9BVFRfRklMRV9WRVJTSU9OLCBOTV9BVFRfT1BFUl9TVEFURSwgMHhlOCwgTk1fQVRUX0JTMTFfQUxMX1RFU1RfQ0FURywKKwlOTV9BVFRfU1dfREVTQ1IsIE5NX0FUVF9HRVRfQVJJIH07CisjZW5kaWYKKwkKK3N0YXRpYyB1X2ludDhfdCByZXFfYXR0cltdID0geyAKKwlOTV9BVFRfQURNX1NUQVRFLCBOTV9BVFRfQVZBSUxfU1RBVFVTLCAweGE4LCBOTV9BVFRfT1BFUl9TVEFURSwKKwkweGQ1LCAweGExLCBOTV9BVFRfQlMxMV9FU05fRldfQ09ERV9OTywgTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk8sCisJMHg0MiwgTk1fQVRUX0JTMTFfRVNOX1BDQl9TRVJJQUwsIE5NX0FUVF9CUzExX1BMTCB9OworCitpbnQgYWJpc19ubV9iczExX2dldF9zZXJubyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwkvKiBTaWVtZW5zSFcgQ0NUUkwgb2JqZWN0ICovCisJZmlsbF9vbV9mb21faGRyKG9oLCAyK3NpemVvZihyZXFfYXR0ciksIE5NX01UX0dFVF9BVFRSLCBOTV9PQ19CUzExLAorCQkJMHgwMywgMHgwMCwgMHgwMCk7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0xJU1RfUkVRX0FUVFIsIHNpemVvZihyZXFfYXR0ciksIHJlcV9hdHRyKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX3NldF9leHRfdGltZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYnMxMV9kYXRlX3RpbWUgYWV0OworCisJZ2V0X2JzMTFfZGF0ZV90aW1lKCZhZXQpOworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwkvKiBTaWVtZW5zSFcgQ0NUUkwgb2JqZWN0ICovCisJZmlsbF9vbV9mb21faGRyKG9oLCAyK3NpemVvZihhZXQpLCBOTV9NVF9CUzExX1NFVF9BVFRSLCBOTV9PQ19TSVRFX01BTkFHRVIsCisJCQkweGZmLCAweGZmLCAweGZmKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9BQklTX0VYVF9USU1FLCBzaXplb2YoYWV0KSwgKHVfaW50OF90ICopICZhZXQpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfc2V0X2Jwb3J0X2xpbmVfY2ZnKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGJwb3J0LCBlbnVtIGFiaXNfYnMxMV9saW5lX2NmZyBsaW5lX2NmZykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJc3RydWN0IGJzMTFfZGF0ZV90aW1lIGFldDsKKworCWdldF9iczExX2RhdGVfdGltZSgmYWV0KTsKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAyLCBOTV9NVF9CUzExX1NFVF9BVFRSLCBOTV9PQ19CUzExX0JQT1JULAorCQkJYnBvcnQsIDB4ZmYsIDB4MDIpOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfTElORV9DRkcsIGxpbmVfY2ZnKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBpcC5hY2Nlc3MgbmFub0JUUyBzcGVjaWZpYyBjb21tYW5kcyAqLworc3RhdGljIGNvbnN0IGNoYXIgaXBhY2Nlc3NfbWFnaWNbXSA9ICJjb20uaXBhY2Nlc3MiOworCisKK3N0YXRpYyBpbnQgYWJpc19ubV9yeF9pcGFjYyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oOworCXVfaW50OF90IGlkc3RybGVuID0gb2gtPmRhdGFbMF07CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGlwYWNjX2Fja19zaWduYWxfZGF0YSBzaWduYWw7CisKKwlpZiAoc3RybmNtcCgoY2hhciAqKSZvaC0+ZGF0YVsxXSwgaXBhY2Nlc3NfbWFnaWMsIGlkc3RybGVuKSkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgImlkIHN0cmluZyBpcyBub3QgY29tLmlwYWNjZXNzICE/IVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvaCA9IChzdHJ1Y3QgYWJpc19vbV9mb21faGRyICopIChvaC0+ZGF0YSArIDEgKyBpZHN0cmxlbik7CisJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBtc2ctPnRyeC0+YnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKworCWRlYnVncF9mb2goZm9oKTsKKworCURFQlVHUEMoRE5NLCAiSVBBQ0NFU1MoMHglMDJ4KTogIiwgZm9oLT5tc2dfdHlwZSk7CisKKwlzd2l0Y2ggKGZvaC0+bXNnX3R5cGUpIHsKKwljYXNlIE5NX01UX0lQQUNDX1JTTF9DT05ORUNUX0FDSzoKKwkJREVCVUdQQyhETk0sICJSU0wgQ09OTkVDVCBBQ0sgIik7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfSVBBQ0NfRFNUX0lQKSkKKwkJCURFQlVHUEMoRE5NLCAiSVA9JXMgIiwKKwkJCQlpbmV0X250b2EoKigoc3RydWN0IGluX2FkZHIgKikgCisJCQkJCVRMVlBfVkFMKCZ0cCwgTk1fQVRUX0lQQUNDX0RTVF9JUCkpKSk7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlQpKQorCQkJREVCVUdQQyhETk0sICJQT1JUPSV1ICIsCisJCQkJbnRvaHMoKigodV9pbnQxNl90ICopIAorCQkJCQlUTFZQX1ZBTCgmdHAsIE5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVCkpKSk7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfSVBBQ0NfU1RSRUFNX0lEKSkKKwkJCURFQlVHUEMoRE5NLCAiU1RSRUFNPTB4JTAyeCAiLAorCQkJCQkqVExWUF9WQUwoJnRwLCBOTV9BVFRfSVBBQ0NfU1RSRUFNX0lEKSk7CisJCURFQlVHUEMoRE5NLCAiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9OQUNLOgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlJTTCBDT05ORUNUIE5BQ0sgIik7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKQorCQkJREVCVUdQQyhETk0sICIgQ0FVU0U9JXNcbiIsIAorCQkJCW5hY2tfY2F1c2VfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKSk7CisJCWVsc2UKKwkJCURFQlVHUEMoRE5NLCAiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX0FDSzoKKwkJREVCVUdQQyhETk0sICJTRVQgTlZBVFRSIEFDS1xuIik7CisJCS8qIEZJWE1FOiBkZWNvZGUgYW5kIHNob3cgdGhlIGFjdHVhbCBhdHRyaWJ1dGVzICovCisJCWJyZWFrOworCWNhc2UgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9OQUNLOgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlNFVCBOVkFUVFIgTkFDSyAiKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpCisJCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICIgQ0FVU0U9JXNcbiIsIAorCQkJCW5hY2tfY2F1c2VfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKSk7CisJCWVsc2UKKwkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIlxuIik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9BQ0s6CisJCURFQlVHUEMoRE5NLCAiR0VUIE5WQVRUUiBBQ0tcbiIpOworCQkvKiBGSVhNRTogZGVjb2RlIGFuZCBzaG93IHRoZSBhY3R1YWwgYXR0cmlidXRlcyAqLworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX0dFVF9OVkFUVFJfTkFDSzoKKwkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiR0VUIE5WQVRUUiBOQUNLICIpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkKKwkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIiBDQVVTRT0lc1xuIiwgCisJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKKwkJZWxzZQorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19TRVRfQVRUUl9BQ0s6CisJCURFQlVHUEMoRE5NLCAiU0VUIEFUVFIgQUNLXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19TRVRfQVRUUl9OQUNLOgorCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJTRVQgQVRUUiBOQUNLICIpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkKKwkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIiBDQVVTRT0lc1xuIiwgCisJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKKwkJZWxzZQorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQQyhETk0sICJ1bmtub3duXG4iKTsKKwkJYnJlYWs7CisJfQorCisJLyogc2lnbmFsIGhhbmRsaW5nICovCisJc3dpdGNoICAoZm9oLT5tc2dfdHlwZSkgeworCWNhc2UgTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfTkFDSzoKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfTkFDSzoKKwljYXNlIE5NX01UX0lQQUNDX0dFVF9OVkFUVFJfTkFDSzoKKwkJc2lnbmFsLmJ0cyA9IG1zZy0+dHJ4LT5idHM7CisJCXNpZ25hbC5tc2dfdHlwZSA9IGZvaC0+bXNnX3R5cGU7CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9JUEFDQ19OQUNLLCAmc2lnbmFsKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX0FDSzoKKwkJc2lnbmFsLmJ0cyA9IG1zZy0+dHJ4LT5idHM7CisJCXNpZ25hbC5tc2dfdHlwZSA9IGZvaC0+bXNnX3R5cGU7CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9JUEFDQ19BQ0ssICZzaWduYWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogc2VuZCBhbiBpcC1hY2Nlc3MgbWFudWZhY3R1cmVyIHNwZWNpZmljIG1lc3NhZ2UgKi8KK2ludCBhYmlzX25tX2lwYWNjZXNzX21zZyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBtc2dfdHlwZSwKKwkJCSB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGJ0c19uciwKKwkJCSB1X2ludDhfdCB0cnhfbnIsIHVfaW50OF90IHRzX25yLAorCQkJIHVfaW50OF90ICphdHRyLCBpbnQgYXR0cl9sZW4pCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaDsKKwl1X2ludDhfdCAqZGF0YTsKKworCS8qIGNvbnN0cnVjdCB0aGUgMTIuMjEgT00gaGVhZGVyLCBvYnNlcnZlIHRoZSBlcnJvbmVvdXMgbGVuZ3RoICovCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpvaCkpOworCWZpbGxfb21faGRyKG9oLCBzaXplb2YoKmZvaCkgKyBhdHRyX2xlbik7CisJb2gtPm1kaXNjID0gQUJJU19PTV9NRElTQ19NQU5VRjsKKworCS8qIGFkZCB0aGUgaXAuYWNjZXNzIG1hZ2ljICovCisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgc2l6ZW9mKGlwYWNjZXNzX21hZ2ljKSsxKTsKKwkqZGF0YSsrID0gc2l6ZW9mKGlwYWNjZXNzX21hZ2ljKTsKKwltZW1jcHkoZGF0YSwgaXBhY2Nlc3NfbWFnaWMsIHNpemVvZihpcGFjY2Vzc19tYWdpYykpOworCisJLyogZmlsbCB0aGUgMTIuMjEgRk9NIGhlYWRlciAqLworCWZvaCA9IChzdHJ1Y3QgYWJpc19vbV9mb21faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpmb2gpKTsKKwlmb2gtPm1zZ190eXBlID0gbXNnX3R5cGU7CisJZm9oLT5vYmpfY2xhc3MgPSBvYmpfY2xhc3M7CisJZm9oLT5vYmpfaW5zdC5idHNfbnIgPSBidHNfbnI7CisJZm9oLT5vYmpfaW5zdC50cnhfbnIgPSB0cnhfbnI7CisJZm9oLT5vYmpfaW5zdC50c19uciA9IHRzX25yOworCisJaWYgKGF0dHIgJiYgYXR0cl9sZW4pIHsKKwkJZGF0YSA9IG1zZ2JfcHV0KG1zZywgYXR0cl9sZW4pOworCQltZW1jcHkoZGF0YSwgYXR0ciwgYXR0cl9sZW4pOworCX0KKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBzZXQgc29tZSBhdHRyaWJ1dGVzIGluIE5WUkFNICovCitpbnQgYWJpc19ubV9pcGFjY2Vzc19zZXRfbnZhdHRyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCAqYXR0ciwKKwkJCQlpbnQgYXR0cl9sZW4pCit7CisJcmV0dXJuIGFiaXNfbm1faXBhY2Nlc3NfbXNnKHRyeC0+YnRzLCBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSLAorCQkJCSAgICBOTV9PQ19CQVNFQl9UUkFOU0MsIDAsIHRyeC0+bnIsIDB4ZmYsIGF0dHIsCisJCQkJICAgIGF0dHJfbGVuKTsKK30KKworaW50IGFiaXNfbm1faXBhY2Nlc3NfcnNsX2Nvbm5lY3Qoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIAorCQkJCSB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0LCB1X2ludDhfdCBzdHJlYW0pCit7CisJc3RydWN0IGluX2FkZHIgaWE7CisJdV9pbnQ4X3QgYXR0cltdID0geyBOTV9BVFRfSVBBQ0NfU1RSRUFNX0lELCAwLAorCQkJICAgIE5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVCwgMCwgMCwKKwkJCSAgICBOTV9BVFRfSVBBQ0NfRFNUX0lQLCAwLCAwLCAwLCAwIH07CisKKwlpbnQgYXR0cl9sZW4gPSBzaXplb2YoYXR0cik7CisKKwlpYS5zX2FkZHIgPSBodG9ubChpcCk7CisJYXR0clsxXSA9IHN0cmVhbTsKKwlhdHRyWzNdID0gcG9ydCA+PiA4OworCWF0dHJbNF0gPSBwb3J0ICYgMHhmZjsKKwkqKHVfaW50MzJfdCAqKShhdHRyKzYpID0gaWEuc19hZGRyOworCisJLyogaWYgaXAgPT0gMCwgd2UgdXNlIHRoZSBkZWZhdWx0IElQICovCisJaWYgKGlwID09IDApCisJCWF0dHJfbGVuIC09IDU7CisKKwlERUJVR1AoRE5NLCAiaXAuYWNjZXNzIFJTTCBDT05ORUNUIElQPSVzIFBPUlQ9JXUgU1RSRUFNPTB4JTAyeFxuIiwKKwkJaW5ldF9udG9hKGlhKSwgcG9ydCwgc3RyZWFtKTsKKworCXJldHVybiBhYmlzX25tX2lwYWNjZXNzX21zZyh0cngtPmJ0cywgTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1QsCisJCQkJICAgIE5NX09DX0JBU0VCX1RSQU5TQywgdHJ4LT5idHMtPmJ0c19uciwKKwkJCQkgICAgdHJ4LT5uciwgMHhmZiwgYXR0ciwgYXR0cl9sZW4pOworfQorCisvKiByZXN0YXJ0IC8gcmVib290IGFuIGlwLmFjY2VzcyBuYW5vQlRTICovCitpbnQgYWJpc19ubV9pcGFjY2Vzc19yZXN0YXJ0KHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0lQQUNDX1JFU1RBUlQpOworfQorCitpbnQgYWJpc19ubV9pcGFjY2Vzc19zZXRfYXR0cihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCQkJdV9pbnQ4X3QgYnRzX25yLCB1X2ludDhfdCB0cnhfbnIsIHVfaW50OF90IHRzX25yLAorCQkJCXVfaW50OF90ICphdHRyLCB1X2ludDhfdCBhdHRyX2xlbikKK3sKKwlyZXR1cm4gYWJpc19ubV9pcGFjY2Vzc19tc2coYnRzLCBOTV9NVF9JUEFDQ19TRVRfQVRUUiwKKwkJCQkgICAgb2JqX2NsYXNzLCBidHNfbnIsIHRyeF9uciwgdHNfbnIsCisJCQkJICAgICBhdHRyLCBhdHRyX2xlbik7Cit9CisKK3ZvaWQgYWJpc19ubV9pcGFjY2Vzc19jZ2kodV9pbnQ4X3QgKmJ1Ziwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwkvKiB3ZSBzaW1wbHkgcmV1c2UgdGhlIEdTTTQ4IGZ1bmN0aW9uIGFuZCBvdmVyd3JpdGUgdGhlIFJBQworCSAqIHdpdGggdGhlIENlbGwgSUQgKi8KKwlnc200OF9yYV9pZF9ieV9idHMoYnVmLCBidHMpOworCSooKHVfaW50MTZfdCAqKShidWYgKyA1KSkgPSBodG9ucyhidHMtPmNlbGxfaWRlbnRpdHkpOworfQorCit2b2lkIGdzbV90cnhfbG9ja19yZihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgaW50IGxvY2tlZCkKK3sKKwlpbnQgbmV3X3N0YXRlID0gbG9ja2VkID8gTk1fU1RBVEVfTE9DS0VEIDogTk1fU1RBVEVfVU5MT0NLRUQ7CisKKwl0cngtPm5tX3N0YXRlLmFkbWluaXN0cmF0aXZlID0gbmV3X3N0YXRlOworCWlmICghdHJ4LT5idHMgfHwgIXRyeC0+YnRzLT5vbWxfbGluaykKKwkJcmV0dXJuOworCisJYWJpc19ubV9jaGdfYWRtX3N0YXRlKHRyeC0+YnRzLCBOTV9PQ19SQURJT19DQVJSSUVSLAorCQkJICAgICAgdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgMHhmZiwKKwkJCSAgICAgIG5ld19zdGF0ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGlwYWNjX3Rlc3RyZXNfbmFtZXNbXSA9IHsKKwl7IE5NX0lQQUNDX1RFU1RSRVNfU1VDQ0VTUywJIlNVQ0NFU1MiIH0sCisJeyBOTV9JUEFDQ19URVNUUkVTX1RJTUVPVVQsCSJUSU1FT1VUIiB9LAorCXsgTk1fSVBBQ0NfVEVTVFJFU19OT19DSEFOUywJIk5PIENIQU5ORUxTIiB9LAorCXsgTk1fSVBBQ0NfVEVTVFJFU19QQVJUSUFMLAkiUEFSVElBTCIgfSwKKwl7IE5NX0lQQUNDX1RFU1RSRVNfU1RPUFBFRCwJIlNUT1BQRUQiIH0sCisJeyAwLAkJCQlOVUxMIH0KK307CisKK2NvbnN0IGNoYXIgKmlwYWNjX3Rlc3RyZXNfbmFtZSh1X2ludDhfdCByZXMpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcoaXBhY2NfdGVzdHJlc19uYW1lcywgcmVzKTsKK30KKwordm9pZCBpcGFjX3BhcnNlX2NnaShzdHJ1Y3QgY2VsbF9nbG9iYWxfaWQgKmNpZCwgY29uc3QgdV9pbnQ4X3QgKmJ1ZikKK3sKKwljaWQtPm1jYyA9IChidWZbMF0gJiAweGYpICogMTAwOworCWNpZC0+bWNjICs9IChidWZbMF0gPj4gNCkgKiAgMTA7CisJY2lkLT5tY2MgKz0gKGJ1ZlsxXSAmIDB4ZikgKiAgMTsKKworCWlmIChidWZbMV0gPj4gNCA9PSAweGYpIHsKKwkJY2lkLT5tbmMgPSAoYnVmWzJdICYgMHhmKSAqIDEwOworCQljaWQtPm1uYyArPSAoYnVmWzJdID4+IDQpICogIDE7CisJfSBlbHNlIHsKKwkJY2lkLT5tbmMgPSAoYnVmWzJdICYgMHhmKSAqIDEwMDsKKwkJY2lkLT5tbmMgKz0gKGJ1ZlsyXSA+PiA0KSAqICAxMDsKKwkJY2lkLT5tbmMgKz0gKGJ1ZlsxXSA+PiA0KSAqICAgMTsKKwl9CisKKwljaWQtPmxhYyA9IG50b2hzKCooKHVfaW50MTZfdCAqKSZidWZbM10pKTsKKwljaWQtPmNpID0gbnRvaHMoKigodV9pbnQxNl90ICopJmJ1Zls1XSkpOworfQorCisvKiBwYXJzZSBCQ0NIIGluZm9ybWF0aW9uIElFSSBmcm9tIHdpcmUgZm9ybWF0IHRvIHN0cnVjdCBpcGFjX2JjY2hfaW5mbyAqLworaW50IGlwYWNfcGFyc2VfYmNjaF9pbmZvKHN0cnVjdCBpcGFjX2JjY2hfaW5mbyAqYmluZiwgdV9pbnQ4X3QgKmJ1ZikKK3sKKwl1X2ludDhfdCAqY3VyID0gYnVmOworCXVfaW50MTZfdCBsZW47CisKKwltZW1zZXQoYmluZiwgMCwgc2l6ZW9mKGJpbmYpKTsKKworCWlmIChjdXJbMF0gIT0gTk1fSVBBQ19FSUVfQkNDSF9JTkZPKQorCQlyZXR1cm4gLUVJTlZBTDsKKwljdXIrKzsKKworCWxlbiA9IG50b2hzKCoodV9pbnQxNl90ICopY3VyKTsKKwljdXIgKz0gMjsKKworCWJpbmYtPmluZm9fdHlwZSA9IG50b2hzKCoodV9pbnQxNl90ICopY3VyKTsKKwljdXIgKz0gMjsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfRlJFUV9FUlJfUVVBTCkKKwkJYmluZi0+ZnJlcV9xdWFsID0gKmN1ciA+PiAyOworCisJYmluZi0+YXJmY24gPSAqY3VyKysgJiAzIDw8IDg7CisJYmluZi0+YXJmY24gfD0gKmN1cisrOworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9SWExFVikKKwkJYmluZi0+cnhfbGV2ID0gKmN1ciAmIDB4M2Y7CisJY3VyKys7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX1JYUVVBTCkKKwkJYmluZi0+cnhfcXVhbCA9ICpjdXIgJiAweDc7CisJY3VyKys7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX0ZSRVFfRVJSX1FVQUwpCisJCWJpbmYtPmZyZXFfZXJyID0gbnRvaHMoKih1X2ludDE2X3QgKiljdXIpOworCWN1ciArPSAyOworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9GUkFNRV9PRkZTRVQpCisJCWJpbmYtPmZyYW1lX29mZnNldCA9IG50b2hzKCoodV9pbnQxNl90ICopY3VyKTsKKwljdXIgKz0gMjsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfRlJBTUVfTlJfT0ZGU0VUKQorCQliaW5mLT5mcmFtZV9ucl9vZmZzZXQgPSBudG9obCgqKHVfaW50MzJfdCAqKWN1cik7CisJY3VyICs9IDQ7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX0JTSUMpCisJCWJpbmYtPmJzaWMgPSAqY3VyICYgMHgzZjsKKwljdXIrKzsKKworCWlwYWNfcGFyc2VfY2dpKCZiaW5mLT5jZ2ksIGN1cik7CisJY3VyICs9IDc7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX05FSUdIX0JBX1NJMikgeworCQltZW1jcHkoYmluZi0+YmFfbGlzdF9zaTIsIGN1ciwgc2l6ZW9mKGJpbmYtPmJhX2xpc3Rfc2kyKSk7CisJCWN1ciArPSBzaXplb2YoYmluZi0+YmFfbGlzdF9zaTIpOworCX0KKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfTkVJR0hfQkFfU0kyYmlzKSB7CisJCW1lbWNweShiaW5mLT5iYV9saXN0X3NpMmJpcywgY3VyLAorCQkJc2l6ZW9mKGJpbmYtPmJhX2xpc3Rfc2kyYmlzKSk7CisJCWN1ciArPSBzaXplb2YoYmluZi0+YmFfbGlzdF9zaTJiaXMpOworCX0KKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfTkVJR0hfQkFfU0kydGVyKSB7CisJCW1lbWNweShiaW5mLT5iYV9saXN0X3NpMnRlciwgY3VyLAorCQkJc2l6ZW9mKGJpbmYtPmJhX2xpc3Rfc2kydGVyKSk7CisJCWN1ciArPSBzaXplb2YoYmluZi0+YmFfbGlzdF9zaTJ0ZXIpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYWJpc19yc2wuYyBiL29wZW5ic2Mvc3JjL2FiaXNfcnNsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwYzAxNAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2FiaXNfcnNsLmMKQEAgLTAsMCArMSwxNjg4IEBACisvKiBHU00gUmFkaW8gU2lnbmFsbGluZyBMaW5rIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UgCisgKiAzR1BQIFRTIDA4LjU4IHZlcnNpb24gOC42LjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNTk2IFY4LjYuMCAqLworCisvKiAoQykgMjAwOC0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYnNjX3JsbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZWFzX3JlcC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcnRwX3Byb3h5Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcnNsLmg+CisKKyNkZWZpbmUgUlNMX0FMTE9DX1NJWkUJCTEwMjQKKyNkZWZpbmUgUlNMX0FMTE9DX0hFQURST09NCTEyOAorCisjZGVmaW5lIE1BWChhLCBiKSAoYSkgPj0gKGIpID8gKGEpIDogKGIpCisKK3N0YXRpYyB1X2ludDhfdCBtZGlzY19ieV9tc2d0eXBlKHVfaW50OF90IG1zZ190eXBlKQoreworCS8qIG1hc2sgb2ZmIHRoZSB0cmFuc3BhcmVudCBiaXQgPyAqLworCW1zZ190eXBlICY9IDB4ZmU7CisKKwlpZiAoKG1zZ190eXBlICYgMHhmMCkgPT0gMHgwMCkKKwkJcmV0dXJuIEFCSVNfUlNMX01ESVNDX1JMTDsKKwlpZiAoKG1zZ190eXBlICYgMHhmMCkgPT0gMHgxMCkgeworCQlpZiAobXNnX3R5cGUgPj0gMHgxOSAmJiBtc2dfdHlwZSA8PSAweDIyKQorCQkJcmV0dXJuIEFCSVNfUlNMX01ESVNDX1RSWDsKKwkJZWxzZQorCQkJcmV0dXJuIEFCSVNfUlNMX01ESVNDX0NPTV9DSEFOOworCX0KKwlpZiAoKG1zZ190eXBlICYgMHhlMCkgPT0gMHgyMCkKKwkJcmV0dXJuIEFCSVNfUlNMX01ESVNDX0RFRF9DSEFOOworCQorCXJldHVybiBBQklTX1JTTF9NRElTQ19MT0M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2RjaGFuX2hkcihzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCwKKwkJCQkgIHVfaW50OF90IG1zZ190eXBlKQoreworCWRoLT5jLm1zZ19kaXNjciA9IG1kaXNjX2J5X21zZ3R5cGUobXNnX3R5cGUpOworCWRoLT5jLm1zZ190eXBlID0gbXNnX3R5cGU7CisJZGgtPmllX2NoYW4gPSBSU0xfSUVfQ0hBTl9OUjsKK30KKworLyogZGV0ZXJtaW5lIGxvZ2ljYWwgY2hhbm5lbCBiYXNlZCBvbiBUUlggYW5kIGNoYW5uZWwgbnVtYmVyIElFICovCitzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9sb29rdXAoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IGNoYW5fbnIpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJdV9pbnQ4X3QgdHNfbnIgPSBjaGFuX25yICYgMHgwNzsKKwl1X2ludDhfdCBjYml0cyA9IGNoYW5fbnIgPj4gMzsKKwl1X2ludDhfdCBsY2hfaWR4OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSAmdHJ4LT50c1t0c19ucl07CisKKwlpZiAoY2JpdHMgPT0gMHgwMSkgeworCQlsY2hfaWR4ID0gMDsJLyogVENIL0YgKi8JCisJCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX1RDSF9GICYmCisJCSAgICB0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX1BEQ0ggJiYKKwkJICAgIHRzLT5wY2hhbiAhPSBHU01fUENIQU5fVENIX0ZfUERDSCkKKwkJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgImNoYW5fbnI9MHglMDJ4IGJ1dCBwY2hhbj0ldVxuIiwKKwkJCQljaGFuX25yLCB0cy0+cGNoYW4pOworCX0gZWxzZSBpZiAoKGNiaXRzICYgMHgxZSkgPT0gMHgwMikgeworCQlsY2hfaWR4ID0gY2JpdHMgJiAweDE7CS8qIFRDSC9IICovCisJCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX1RDSF9IKQorCQkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2hhbl9ucj0weCUwMnggYnV0IHBjaGFuPSV1XG4iLAorCQkJCWNoYW5fbnIsIHRzLT5wY2hhbik7CisJfSBlbHNlIGlmICgoY2JpdHMgJiAweDFjKSA9PSAweDA0KSB7CisJCWxjaF9pZHggPSBjYml0cyAmIDB4MzsJLyogU0RDQ0gvNCAqLworCQlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINCkKKwkJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgImNoYW5fbnI9MHglMDJ4IGJ1dCBwY2hhbj0ldVxuIiwKKwkJCQljaGFuX25yLCB0cy0+cGNoYW4pOworCX0gZWxzZSBpZiAoKGNiaXRzICYgMHgxOCkgPT0gMHgwOCkgeworCQlsY2hfaWR4ID0gY2JpdHMgJiAweDc7CS8qIFNEQ0NILzggKi8KKwkJaWYgKHRzLT5wY2hhbiAhPSBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEMpCisJCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJjaGFuX25yPTB4JTAyeCBidXQgcGNoYW49JXVcbiIsCisJCQkJY2hhbl9uciwgdHMtPnBjaGFuKTsKKwl9IGVsc2UgaWYgKGNiaXRzID09IDB4MTAgfHwgY2JpdHMgPT0gMHgxMSB8fCBjYml0cyA9PSAweDEyKSB7CisJCWxjaF9pZHggPSAwOworCQlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9DQ0NIICYmCisJCSAgICB0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0KQorCQkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2hhbl9ucj0weCUwMnggYnV0IHBjaGFuPSV1XG4iLAorCQkJCWNoYW5fbnIsIHRzLT5wY2hhbik7CisJCS8qIEZJWE1FOiB3ZSBzaG91bGQgbm90IHJldHVybiBmaXJzdCBzZGNjaDQgISEhICovCisJfSBlbHNlIHsKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAidW5rbm93biBjaGFuX25yPTB4JTAyeFxuIiwgY2hhbl9ucik7CisJCXJldHVybiBOVUxMOworCX0KKworCWxjaGFuID0gJnRzLT5sY2hhbltsY2hfaWR4XTsKKwlsb2dfc2V0X2NvbnRleHQoQlNDX0NUWF9MQ0hBTiwgbGNoYW4pOworCWxvZ19zZXRfY29udGV4dChCU0NfQ1RYX1NVQlNDUiwgbGNoYW4tPmNvbm4uc3Vic2NyKTsKKworCXJldHVybiBsY2hhbjsKK30KKworLyogU2VlIFRhYmxlIDEwLjUuMjUgb2YgR1NNMDQuMDggKi8KK3VfaW50OF90IGxjaGFuMmNoYW5fbnIoY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IGxjaGFuLT50czsKKwl1X2ludDhfdCBjYml0cywgY2hhbl9ucjsKKworCXN3aXRjaCAodHMtPnBjaGFuKSB7CisJY2FzZSBHU01fUENIQU5fVENIX0Y6CisJY2FzZSBHU01fUENIQU5fUERDSDoKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfRl9QRENIOgorCQljYml0cyA9IDB4MDE7CisJCWJyZWFrOworCWNhc2UgR1NNX1BDSEFOX1RDSF9IOgorCQljYml0cyA9IDB4MDI7CisJCWNiaXRzICs9IGxjaGFuLT5ucjsKKwkJYnJlYWs7CisJY2FzZSBHU01fUENIQU5fQ0NDSF9TRENDSDQ6CisJCWNiaXRzID0gMHgwNDsKKwkJY2JpdHMgKz0gbGNoYW4tPm5yOworCQlicmVhazsKKwljYXNlIEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QzoKKwkJY2JpdHMgPSAweDA4OworCQljYml0cyArPSBsY2hhbi0+bnI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSBHU01fUENIQU5fQ0NDSDoKKwkJY2JpdHMgPSAweDEwOworCQlicmVhazsKKwl9CisKKwljaGFuX25yID0gKGNiaXRzIDw8IDMpIHwgKHRzLT5uciAmIDB4Nyk7CisKKwlyZXR1cm4gY2hhbl9ucjsKK30KKworLyogQXMgcGVyIFRTIDAzLjAzIFNlY3Rpb24gMi4yLCB0aGUgSU1TSSBoYXMgJ25vdCBtb3JlIHRoYW4gMTUgZGlnaXRzJyAqLwordV9pbnQ2NF90IHN0cl90b19pbXNpKGNvbnN0IGNoYXIgKmltc2lfc3RyKQoreworCXVfaW50NjRfdCByZXQ7CisKKwlyZXQgPSBzdHJ0b3VsbChpbXNpX3N0ciwgTlVMTCwgMTApOworCisJcmV0dXJuIHJldDsKK30KKworLyogVGFibGUgNSBDbGF1c2UgNyBUUyAwNS4wMiAqLwordW5zaWduZWQgaW50IG5fcGFnX2Jsb2NrcyhpbnQgYnNfY2NjaF9zZGNjaF9jb21iLCB1bnNpZ25lZCBpbnQgYnNfYWdfYmxrc19yZXMpCit7CisJaWYgKCFic19jY2NoX3NkY2NoX2NvbWIpCisJCXJldHVybiA5IC0gYnNfYWdfYmxrc19yZXM7CisJZWxzZQorCQlyZXR1cm4gMyAtIGJzX2FnX2Jsa3NfcmVzOworfQorCisvKiBDaGFwdGVyIDYuNS4yIG9mIFRTIDA1LjAyICovCit1bnNpZ25lZCBpbnQgZ2V0X2NjY2hfZ3JvdXAodV9pbnQ2NF90IGltc2ksIHVuc2lnbmVkIGludCBic19jY19jaGFucywKKwkJCSAgICB1bnNpZ25lZCBpbnQgbl9wYWdfYmxvY2tzKQoreworCXJldHVybiAoaW1zaSAlIDEwMDApICUgKGJzX2NjX2NoYW5zICogbl9wYWdfYmxvY2tzKSAvIG5fcGFnX2Jsb2NrczsKK30KKworLyogQ2hhcHRlciA2LjUuMiBvZiBUUyAwNS4wMiAqLwordW5zaWduZWQgaW50IGdldF9wYWdpbmdfZ3JvdXAodV9pbnQ2NF90IGltc2ksIHVuc2lnbmVkIGludCBic19jY19jaGFucywKKwkJCSAgICAgIGludCBuX3BhZ19ibG9ja3MpCit7CisJcmV0dXJuIChpbXNpICUgMTAwMCkgJSAoYnNfY2NfY2hhbnMgKiBuX3BhZ19ibG9ja3MpICUgbl9wYWdfYmxvY2tzOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKnJzbF9tc2diX2FsbG9jKHZvaWQpCit7CisJcmV0dXJuIG1zZ2JfYWxsb2NfaGVhZHJvb20oUlNMX0FMTE9DX1NJWkUsIFJTTF9BTExPQ19IRUFEUk9PTSwKKwkJCQkgICAiUlNMIik7Cit9CisKKyNkZWZpbmUgTUFDQkxPQ0tfU0laRQkyMworc3RhdGljIHZvaWQgcGFkX21hY2Jsb2NrKHVfaW50OF90ICpvdXQsIGNvbnN0IHVfaW50OF90ICppbiwgaW50IGxlbikKK3sKKwltZW1jcHkob3V0LCBpbiwgbGVuKTsKKworCWlmIChsZW4gPCBNQUNCTE9DS19TSVpFKQorCQltZW1zZXQob3V0K2xlbiwgMHgyYiwgTUFDQkxPQ0tfU0laRS1sZW4pOworfQorCisvKiBDaGFwdGVyIDkuMy43OiBFbmNyeXB0aW9uIEluZm9ybWF0aW9uICovCitzdGF0aWMgaW50IGJ1aWxkX2VuY3JfaW5mbyh1X2ludDhfdCAqb3V0LCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwkqb3V0KysgPSBsY2hhbi0+ZW5jci5hbGdfaWQgJiAweGZmOworCWlmIChsY2hhbi0+ZW5jci5rZXlfbGVuKQorCQltZW1jcHkob3V0LCBsY2hhbi0+ZW5jci5rZXksIGxjaGFuLT5lbmNyLmtleV9sZW4pOworCXJldHVybiBsY2hhbi0+ZW5jci5rZXlfbGVuICsgMTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcnNsX2NhdXNlKGludCBsdmwsIGNvbnN0IHVfaW50OF90ICpjYXVzZV92LCB1X2ludDhfdCBjYXVzZV9sZW4pCit7CisJaW50IGk7CisKKwlMT0dQQyhEUlNMLCBsdmwsICJDQVVTRT0weCUwMngoJXMpICIsCisJCWNhdXNlX3ZbMF0sIHJzbF9lcnJfbmFtZShjYXVzZV92WzBdKSk7CisJZm9yIChpID0gMTsgaSA8IGNhdXNlX2xlbi0xOyBpKyspIAorCQlMT0dQQyhEUlNMLCBsdmwsICIlMDJ4ICIsIGNhdXNlX3ZbaV0pOworfQorCisvKiBTZW5kIGEgQkNDSF9JTkZPIG1lc3NhZ2UgYXMgcGVyIENoYXB0ZXIgOC41LjEgKi8KK2ludCByc2xfYmNjaF9pbmZvKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCB0eXBlLAorCQkgIGNvbnN0IHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZipkaCk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9CQ0NIX0lORk8pOworCWRoLT5jaGFuX25yID0gUlNMX0NIQU5fQkNDSDsKKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1NZU0lORk9fVFlQRSwgdHlwZSk7CisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0ZVTExfQkNDSF9JTkZPLCBsZW4sIGRhdGEpOworCisJbXNnLT50cnggPSB0cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitpbnQgcnNsX3NhY2NoX2ZpbGxpbmcoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IHR5cGUsIAorCQkgICAgICBjb25zdCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkciAqY2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisKKwljaCA9IChzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqY2gpKTsKKwljaC0+bXNnX2Rpc2NyID0gQUJJU19SU0xfTURJU0NfVFJYOworCWNoLT5tc2dfdHlwZSA9IFJTTF9NVF9TQUNDSF9GSUxMOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfU1lTSU5GT19UWVBFLCB0eXBlKTsKKwltc2diX3RsMTZ2X3B1dChtc2csIFJTTF9JRV9MM19JTkZPLCBsZW4sIGRhdGEpOworCisJbXNnLT50cnggPSB0cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitpbnQgcnNsX2NoYW5fYnNfcG93ZXJfY3RybChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdW5zaWduZWQgaW50IGZwYywgaW50IGRiKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2c7CisJdV9pbnQ4X3QgY2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJZGIgPSBhYnMoZGIpOworCWlmIChkYiA+IDMwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisKKwlsY2hhbi0+YnNfcG93ZXIgPSBkYi8yOworCWlmIChmcGMpCisJCWxjaGFuLT5ic19wb3dlciB8PSAweDEwOworCQorCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9CU19QT1dFUl9DT05UUk9MKTsKKwlkaC0+Y2hhbl9uciA9IGNoYW5fbnI7CisKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9CU19QT1dFUiwgbGNoYW4tPmJzX3Bvd2VyKTsKKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitpbnQgcnNsX2NoYW5fbXNfcG93ZXJfY3RybChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdW5zaWduZWQgaW50IGZwYywgaW50IGRibSkKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IGNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwlpbnQgY3RsX2x2bDsKKworCWN0bF9sdmwgPSBtc19wd3JfY3RsX2x2bChsY2hhbi0+dHMtPnRyeC0+YnRzLT5iYW5kLCBkYm0pOworCWlmIChjdGxfbHZsIDwgMCkKKwkJcmV0dXJuIGN0bF9sdmw7CisKKwltc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJbGNoYW4tPm1zX3Bvd2VyID0gY3RsX2x2bDsKKworCWlmIChmcGMpCisJCWxjaGFuLT5tc19wb3dlciB8PSAweDIwOworCQorCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9NU19QT1dFUl9DT05UUk9MKTsKKwlkaC0+Y2hhbl9uciA9IGNoYW5fbnI7CisKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9NU19QT1dFUiwgbGNoYW4tPm1zX3Bvd2VyKTsKKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitzdGF0aWMgaW50IGNoYW5uZWxfbW9kZV9mcm9tX2xjaGFuKHN0cnVjdCByc2xfaWVfY2hhbl9tb2RlICpjbSwKKwkJCQkgICBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwltZW1zZXQoY20sIDAsIHNpemVvZihjbSkpOworCisJLyogRklYTUU6IHdoYXQgdG8gZG8gd2l0aCBkYXRhIGNhbGxzID8gKi8KKwljbS0+ZHR4X2R0dSA9IDB4MDA7CisKKwkvKiBzZXQgVENIIFNwZWVjaC9EYXRhICovCisJY20tPnNwZF9pbmQgPSBsY2hhbi0+cnNsX2Ntb2RlOworCisJaWYgKGxjaGFuLT5yc2xfY21vZGUgPT0gUlNMX0NNT0RfU1BEX1NJR04gJiYKKwkgICAgbGNoYW4tPnRjaF9tb2RlICE9IEdTTTQ4X0NNT0RFX1NJR04pCisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgInVuc3VwcG9ydGVkOiByc2xfbW9kZSA9PSBzaWduYWxsaW5nLCAiCisJCQkiYnV0IHRjaF9tb2RlICE9IHNpZ25hbGxpbmdcbiIpOworCisJc3dpdGNoIChsY2hhbi0+dHlwZSkgeworCWNhc2UgR1NNX0xDSEFOX1NEQ0NIOgorCQljbS0+Y2hhbl9ydCA9IFJTTF9DTU9EX0NSVF9TRENDSDsKKwkJYnJlYWs7CisJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCWNtLT5jaGFuX3J0ID0gUlNMX0NNT0RfQ1JUX1RDSF9CbTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTENIQU5fVENIX0g6CisJCWNtLT5jaGFuX3J0ID0gUlNMX0NNT0RfQ1JUX1RDSF9MbTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTENIQU5fTk9ORToKKwljYXNlIEdTTV9MQ0hBTl9VTktOT1dOOgorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAobGNoYW4tPnRjaF9tb2RlKSB7CisJY2FzZSBHU000OF9DTU9ERV9TSUdOOgorCQljbS0+Y2hhbl9yYXRlID0gMDsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfVjE6CisJCWNtLT5jaGFuX3JhdGUgPSBSU0xfQ01PRF9TUF9HU00xOworCQlicmVhazsKKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9FRlI6CisJCWNtLT5jaGFuX3JhdGUgPSBSU0xfQ01PRF9TUF9HU00yOworCQlicmVhazsKKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVI6CisJCWNtLT5jaGFuX3JhdGUgPSBSU0xfQ01PRF9TUF9HU00zOworCQlicmVhazsKKwljYXNlIEdTTTQ4X0NNT0RFX0RBVEFfMTRrNToKKwkJY20tPmNoYW5fcmF0ZSA9IFJTTF9DTU9EX1NQX05UXzE0azU7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfREFUQV8xMmswOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfTlRfMTJrMDsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9EQVRBXzZrMDoKKwkJY20tPmNoYW5fcmF0ZSA9IFJTTF9DTU9EX1NQX05UXzZrMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC40LjEgKi8KKyNpZiAwCitpbnQgcnNsX2NoYW5fYWN0aXZhdGUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IGNoYW5fbnIsCisJCSAgICAgIHVfaW50OF90IGFjdF90eXBlLAorCQkgICAgICBzdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSAqY2hhbl9tb2RlLAorCQkgICAgICBzdHJ1Y3QgcnNsX2llX2NoYW5faWRlbnQgKmNoYW5faWRlbnQsCisJCSAgICAgIHVfaW50OF90IGJzX3Bvd2VyLCB1X2ludDhfdCBtc19wb3dlciwKKwkJICAgICAgdV9pbnQ4X3QgdGEpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfQ0hBTl9BQ1RJVik7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQUNUX1RZUEUsIGFjdF90eXBlKTsKKwkvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFBoYXNlIDEgKi8KKwltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfQ0hBTl9NT0RFLCBzaXplb2YoKmNoYW5fbW9kZSksCisJCSAgICAgKHVfaW50OF90ICopIGNoYW5fbW9kZSk7CisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fSURFTlQsIDQsCisJCSAgICAgKHVfaW50OF90ICopIGNoYW5faWRlbnQpOworI2lmIDAKKwltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfRU5DUl9JTkZPLCAxLAorCQkgICAgICh1X2ludDhfdCAqKSAmZW5jcl9pbmZvKTsKKyNlbmRpZgorCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0JTX1BPV0VSLCBic19wb3dlcik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfTVNfUE9XRVIsIG1zX3Bvd2VyKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9USU1JTkdfQURWQU5DRSwgdGEpOworCisJbXNnLT50cnggPSB0cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorI2VuZGlmCisKK2ludCByc2xfY2hhbl9hY3RpdmF0ZV9sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgYWN0X3R5cGUsIAorCQkJICAgIHVfaW50OF90IHRhLCB1X2ludDhfdCBob19yZWYpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlpbnQgcmM7CisKKwl1X2ludDhfdCBjaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJdV9pbnQxNl90IGFyZmNuID0gbGNoYW4tPnRzLT50cngtPmFyZmNuOworCXN0cnVjdCByc2xfaWVfY2hhbl9tb2RlIGNtOworCXN0cnVjdCByc2xfaWVfY2hhbl9pZGVudCBjaTsKKworCXJjID0gY2hhbm5lbF9tb2RlX2Zyb21fbGNoYW4oJmNtLCBsY2hhbik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJbWVtc2V0KCZjaSwgMCwgc2l6ZW9mKGNpKSk7CisJY2kuY2hhbl9kZXNjLmllaSA9IDB4NjQ7CisJY2kuY2hhbl9kZXNjLmNoYW5fbnIgPSBjaGFuX25yOworCWNpLmNoYW5fZGVzYy5vY3QzID0gKGxjaGFuLT50cy0+dHJ4LT5idHMtPnRzYyA8PCA1KSB8ICgoYXJmY24gJiAweDNmZikgPj4gOCk7CisJY2kuY2hhbl9kZXNjLm9jdDQgPSBhcmZjbiAmIDB4ZmY7CisKKwltc2cgPSByc2xfbXNnYl9hbGxvYygpOworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9DSEFOX0FDVElWKTsKKwlkaC0+Y2hhbl9uciA9IGNoYW5fbnI7CisKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9BQ1RfVFlQRSwgYWN0X3R5cGUpOworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9DSEFOX01PREUsIHNpemVvZihjbSksCisJCSAgICAgKHVfaW50OF90ICopICZjbSk7CisJLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQaGFzZSAxICovCisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fSURFTlQsIDQsCisJCSAgICAgKHVfaW50OF90ICopICZjaSk7CisKKwlpZiAobGNoYW4tPmVuY3IuYWxnX2lkID4gUlNMX0VOQ19BTEdfQTUoMCkpIHsKKwkJdV9pbnQ4X3QgZW5jcl9pbmZvW01BWF9BNV9LRVlfTEVOKzJdOworCQlyYyA9IGJ1aWxkX2VuY3JfaW5mbyhlbmNyX2luZm8sIGxjaGFuKTsKKwkJaWYgKHJjID4gMCkKKwkJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9FTkNSX0lORk8sIHJjLCBlbmNyX2luZm8pOworCX0KKworCXN3aXRjaCAoYWN0X3R5cGUpIHsKKwljYXNlIFJTTF9BQ1RfSU5URVJfQVNZTkM6CisJY2FzZSBSU0xfQUNUX0lOVEVSX1NZTkM6CisJCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0hBTkRPX1JFRiwgaG9fcmVmKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQlNfUE9XRVIsIGxjaGFuLT5ic19wb3dlcik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfTVNfUE9XRVIsIGxjaGFuLT5tc19wb3dlcik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfVElNSU5HX0FEVkFOQ0UsIHRhKTsKKworCWlmIChsY2hhbi0+dGNoX21vZGUgPT0gR1NNNDhfQ01PREVfU1BFRUNIX0FNUikKKwkJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX01SX0NPTkZJRywgc2l6ZW9mKGxjaGFuLT5tcl9jb25mKSwKKwkJCSAgICAgKHVfaW50OF90ICopICZsY2hhbi0+bXJfY29uZik7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogQ2hhcHRlciA4LjQuOTogTW9kaWZ5IGNoYW5uZWwgbW9kZSBvbiBCVFMgc2lkZSAqLworaW50IHJzbF9jaGFuX21vZGVfbW9kaWZ5X3JlcShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWludCByYzsKKworCXVfaW50OF90IGNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwlzdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSBjbTsKKworCXJjID0gY2hhbm5lbF9tb2RlX2Zyb21fbGNoYW4oJmNtLCBsY2hhbik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfTU9ERV9NT0RJRllfUkVRKTsKKwlkaC0+Y2hhbl9uciA9IGNoYW5fbnI7CisKKwltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfQ0hBTl9NT0RFLCBzaXplb2YoY20pLAorCQkgICAgICh1X2ludDhfdCAqKSAmY20pOworCisJaWYgKGxjaGFuLT5lbmNyLmFsZ19pZCA+IFJTTF9FTkNfQUxHX0E1KDApKSB7CisJCXVfaW50OF90IGVuY3JfaW5mb1tNQVhfQTVfS0VZX0xFTisyXTsKKwkJcmMgPSBidWlsZF9lbmNyX2luZm8oZW5jcl9pbmZvLCBsY2hhbik7CisJCWlmIChyYyA+IDApCisJCQltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfRU5DUl9JTkZPLCByYywgZW5jcl9pbmZvKTsKKwl9CisKKwlpZiAobGNoYW4tPnRjaF9tb2RlID09IEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVIpIHsKKwkJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX01SX0NPTkZJRywgc2l6ZW9mKGxjaGFuLT5tcl9jb25mKSwKKwkJCSAgICAgKHVfaW50OF90ICopICZsY2hhbi0+bXJfY29uZik7CisJfQorCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC40LjY6IFNlbmQgdGhlIGVuY3J5cHRpb24gY29tbWFuZCB3aXRoIGdpdmVuIEwzIGluZm8gKi8KK2ludCByc2xfZW5jcnlwdGlvbl9jbWQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisJdV9pbnQ4X3QgY2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCXVfaW50OF90IGVuY3JfaW5mb1tNQVhfQTVfS0VZX0xFTisyXTsKKwl1X2ludDhfdCBsM19sZW4gPSBtc2ctPmxlbjsKKwlpbnQgcmM7CisKKwkvKiBGaXJzdCBwdXNoIHRoZSBMMyBJRSB0YWcgYW5kIGxlbmd0aCAqLworCW1zZ2JfdHYxNl9wdXNoKG1zZywgUlNMX0lFX0wzX0lORk8sIGwzX2xlbik7CisKKwkvKiB0aGVuIHRoZSBsaW5rIGlkZW50aWZpZXIgKFNBUEkwLCBtYWluIHNpZ24gbGluaykgKi8KKwltc2diX3R2X3B1c2gobXNnLCBSU0xfSUVfTElOS19JREVOVCwgMCk7CisKKwkvKiB0aGVuIGVuY3J5cHRpb24gaW5mb3JtYXRpb24gKi8KKwlyYyA9IGJ1aWxkX2VuY3JfaW5mbyhlbmNyX2luZm8sIGxjaGFuKTsKKwlpZiAocmMgPD0gMCkKKwkJcmV0dXJuIHJjOworCW1zZ2JfdGx2X3B1c2gobXNnLCBSU0xfSUVfRU5DUl9JTkZPLCByYywgZW5jcl9pbmZvKTsKKworCS8qIGFuZCBmaW5hbGx5IHRoZSBEQ0hBTiBoZWFkZXIgKi8KKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0VOQ1JfQ01EKTsKKwlkaC0+Y2hhbl9uciA9IGNoYW5fbnI7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogQ2hhcHRlciA4LjQuNSAvIDQuNjogRGVhY3RpdmF0ZSB0aGUgU0FDQ0ggYWZ0ZXIgMDQuMDggUlIgQ0hBTiBSRUxFQVNFICovCitpbnQgcnNsX2RlYWN0X3NhY2NoKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0RFQUNUSVZBVEVfU0FDQ0gpOworCWRoLT5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCURFQlVHUChEUlNMLCAiJXMgREVBQ1RpdmF0ZSBTQUNDSCBDTURcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSk7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisvKiBDaGFwdGVyIDguNC4xNCAvIDQuNzogVGVsbCBCVFMgdG8gcmVsZWFzZSB0aGUgcmFkaW8gY2hhbm5lbCAqLworaW50IHJzbF9yZl9jaGFuX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfUkZfQ0hBTl9SRUwpOworCWRoLT5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCURFQlVHUChEUlNMLCAiJXMgUkYgQ2hhbm5lbCBSZWxlYXNlIENNRFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pKTsKKworCS8qIEJUUyB3aWxsIHJlc3BvbmQgYnkgUkYgQ0hBTiBSRUwgQUNLICovCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9wYWdpbmdfY21kKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHBhZ2luZ19ncm91cCwgdV9pbnQ4X3QgbGVuLAorCQkgICB1X2ludDhfdCAqbXNfaWRlbnQsIHVfaW50OF90IGNoYW5fbmVlZGVkKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX1BBR0lOR19DTUQpOworCWRoLT5jaGFuX25yID0gUlNMX0NIQU5fUENIX0FHQ0g7CisKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9QQUdJTkdfR1JPVVAsIHBhZ2luZ19ncm91cCk7CisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX01TX0lERU5USVRZLCBsZW4tMiwgbXNfaWRlbnQrMik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQ0hBTl9ORUVERUQsIGNoYW5fbmVlZGVkKTsKKworCW1zZy0+dHJ4ID0gYnRzLT5jMDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKK2ludCByc2xfcGFnaW5nX2NtZF9zdWJzY3Ioc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgY2hhbl9uZWVkLAorCQkJICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKyNpZiAwCisJdV9pbnQ4X3QgbWlbMTI4XTsKKwl1bnNpZ25lZCBpbnQgbWlfbGVuOworCXVfaW50OF90IHBhZ2luZ19ncm91cDsKKyNlbmRpZgorCisJcmV0dXJuIC0xOworfQorCitpbnQgaW1zaV9zdHIyYmNkKHVfaW50OF90ICpiY2Rfb3V0LCBjb25zdCBjaGFyICpzdHJfaW4pCit7CisJaW50IGksIGxlbiA9IHN0cmxlbihzdHJfaW4pOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWludCBudW0gPSBzdHJfaW5baV0gLSAweDMwOworCQlpZiAobnVtIDwgMCB8fCBudW0gPiA5KQorCQkJcmV0dXJuIC0xOworCQlpZiAoaSAlIDIgPT0gMCkKKwkJCWJjZF9vdXRbaS8yXSA9IG51bTsKKwkJZWxzZQorCQkJYmNkX291dFtpLzJdIHw9IChudW0gPDwgNCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC41LjYgKi8KK2ludCByc2xfaW1tX2Fzc2lnbl9jbWQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbGVuLCB1X2ludDhfdCAqdmFsKQoreworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXVfaW50OF90IGJ1ZltNQUNCTE9DS19TSVpFXTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9JTU1FRElBVEVfQVNTSUdOX0NNRCk7CisJZGgtPmNoYW5fbnIgPSBSU0xfQ0hBTl9QQ0hfQUdDSDsKKworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0lNTV9BU1NfSU5GTywgbGVuLCB2YWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBJZiBwaGFzZSAyLCBjb25zdHJ1Y3QgYSBGVUxMX0lNTV9BU1NfSU5GTyAqLworCQlwYWRfbWFjYmxvY2soYnVmLCB2YWwsIGxlbik7CisJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9GVUxMX0lNTV9BU1NfSU5GTywgTUFDQkxPQ0tfU0laRSwgYnVmKTsKKwkJYnJlYWs7CisJfQorCisJbXNnLT50cnggPSBidHMtPmMwOworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogU2VuZCBTaWVtZW5zIHNwZWNpZmljIE1TIFJGIFBvd2VyIENhcGFiaWxpdHkgSW5kaWNhdGlvbiAqLworaW50IHJzbF9zaWVtZW5zX21ycGNpKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBzdHJ1Y3QgcnNsX21ycGNpICptcnBjaSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9TSUVNRU5TX01SUENJKTsKKwlkaC0+Yy5tc2dfZGlzY3IgPSBBQklTX1JTTF9NRElTQ19ERURfQ0hBTjsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1NJRU1FTlNfTVJQQ0ksICoodV9pbnQ4X3QgKiltcnBjaSk7CisKKwlERUJVR1AoRFJTTCwgIiVzIFRYIFNpZW1lbnMgTVJQQ0kgMHglMDJ4XG4iLAorCQlnc21fbGNoYW5fbmFtZShsY2hhbiksICoodV9pbnQ4X3QgKiltcnBjaSk7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworCisvKiBTZW5kICJEQVRBIFJFUVVFU1QiIG1lc3NhZ2Ugd2l0aCBnaXZlbiBMMyBJbmZvIHBheWxvYWQgKi8KKy8qIENoYXB0ZXIgOC4zLjEgKi8KK2ludCByc2xfZGF0YV9yZXF1ZXN0KHN0cnVjdCBtc2diICptc2csIHVfaW50OF90IGxpbmtfaWQpCit7CisJaWYgKG1zZy0+bGNoYW4gPT0gTlVMTCkgeworCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJjYW5ub3Qgc2VuZCBEQVRBIFJFUVVFU1QgdG8gdW5rbm93biBsY2hhblxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJzbF9ybGxfcHVzaF9sMyhtc2csIFJTTF9NVF9EQVRBX1JFUSwgbGNoYW4yY2hhbl9ucihtc2ctPmxjaGFuKSwKKwkJCWxpbmtfaWQsIDEpOworCisJbXNnLT50cnggPSBtc2ctPmxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogU2VuZCAiRVNUQUJMSVNIIFJFUVVFU1QiIG1lc3NhZ2Ugd2l0aCBnaXZlbiBMMyBJbmZvIHBheWxvYWQgKi8KKy8qIENoYXB0ZXIgOC4zLjEgKi8KK2ludCByc2xfZXN0YWJsaXNoX3JlcXVlc3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKworCW1zZyA9IHJzbF9ybGxfc2ltcGxlKFJTTF9NVF9FU1RfUkVRLCBsY2hhbjJjaGFuX25yKGxjaGFuKSwKKwkJCSAgICAgbGlua19pZCwgMCk7CisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC4zLjcgUmVxdWVzdCB0aGUgcmVsZWFzZSBvZiBtdWx0aWZyYW1lIG1vZGUgb2YgUkxMIGNvbm5lY3Rpb24uCisgICBUaGlzIGlzIHdoYXQgaGlnaGVyIGxheWVycyBzaG91bGQgY2FsbC4gIFRoZSBCVFMgdGhlbiByZXNwb25kcyB3aXRoCisgICBSRUxFQVNFIENPTkZJUk0sIHdoaWNoIHdlIGluIHR1cm4gdXNlIHRvIHRyaWdnZXIgUlNMIENIQU5ORUwgUkVMRUFTRSwKKyAgIHdoaWNoIGluIHR1cm4gaXMgYWNrbm93bGVkZ2VkIGJ5IFJTTCBDSEFOTkVMIFJFTEVBU0UgQUNLLCB3aGljaCBjYWxscworICAgbGNoYW5fZnJlZSgpICovCitpbnQgcnNsX3JlbGVhc2VfcmVxdWVzdChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCkKK3sKKworCXN0cnVjdCBtc2diICptc2c7CisKKwltc2cgPSByc2xfcmxsX3NpbXBsZShSU0xfTVRfUkVMX1JFUSwgbGNoYW4yY2hhbl9ucihsY2hhbiksCisJCQkgICAgIGxpbmtfaWQsIDApOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1JFTEVBU0VfTU9ERSwgMCk7CS8qIG5vcm1hbCByZWxlYXNlICovCisKKwlsY2hhbi0+c3RhdGUgPSBMQ0hBTl9TX1JFTF9SRVE7CisJLyogRklYTUU6IHN0YXJ0IHNvbWUgdGltZXIgaW4gY2FzZSB3ZSBkb24ndCByZWNlaXZlIGEgUkVMIEFDSyA/ICovCisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogQ2hhcHRlciA4LjQuMjogQ2hhbm5lbCBBY3RpdmF0ZSBBY2tub3dsZWRnZSAqLworc3RhdGljIGludCByc2xfcnhfY2hhbl9hY3RfYWNrKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqcnNsaCA9IG1zZ2JfbDIobXNnKTsKKworCS8qIEJUUyBoYXMgY29uZmlybWVkIGNoYW5uZWwgYWN0aXZhdGlvbiwgd2Ugbm93IG5lZWQKKwkgKiB0byBhc3NpZ24gdGhlIGFjdGl2YXRlZCBjaGFubmVsIHRvIHRoZSBNUyAqLworCWlmIChyc2xoLT5pZV9jaGFuICE9IFJTTF9JRV9DSEFOX05SKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChtc2ctPmxjaGFuLT5zdGF0ZSAhPSBMQ0hBTl9TX0FDVF9SRVEpCisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBDSEFOIEFDVCBBQ0ssIGJ1dCBzdGF0ZSAlc1xuIiwKKwkJCWdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pLAorCQkJZ3NtX2xjaGFuc19uYW1lKG1zZy0+bGNoYW4tPnN0YXRlKSk7CisJbXNnLT5sY2hhbi0+c3RhdGUgPSBMQ0hBTl9TX0FDVElWRTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9BQ1RJVkFURV9BQ0ssIG1zZy0+bGNoYW4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC40LjM6IENoYW5uZWwgQWN0aXZhdGUgTkFDSyAqLworc3RhdGljIGludCByc2xfcnhfY2hhbl9hY3RfbmFjayhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCisJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgQ0hBTk5FTCBBQ1RJVkFURSBOQUNLIiwKKwkJZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbikpOworCisJLyogQlRTIGhhcyByZWplY3RlZCBjaGFubmVsIGFjdGl2YXRpb24gPyE/ICovCisJaWYgKGRoLT5pZV9jaGFuICE9IFJTTF9JRV9DSEFOX05SKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJzbF90bHZfcGFyc2UoJnRwLCBkaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqZGgpKTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0NBVVNFKSkgeworCQljb25zdCB1X2ludDhfdCAqY2F1c2UgPSBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9DQVVTRSk7CisJCXByaW50X3JzbF9jYXVzZShMT0dMX0VSUk9SLCBjYXVzZSwKKwkJCQlUTFZQX0xFTigmdHAsIFJTTF9JRV9DQVVTRSkpOworCQlpZiAoKmNhdXNlICE9IFJTTF9FUlJfUkNIX0FMUl9BQ1RWX0FMTE9DKQorCQkJbXNnLT5sY2hhbi0+c3RhdGUgPSBMQ0hBTl9TX05PTkU7CisJfSBlbHNlCisJCW1zZy0+bGNoYW4tPnN0YXRlID0gTENIQU5fU19OT05FOworIAorCUxPR1BDKERSU0wsIExPR0xfRVJST1IsICJcbiIpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX0FDVElWQVRFX05BQ0ssIG1zZy0+bGNoYW4pOworCisJbGNoYW5fZnJlZShtc2ctPmxjaGFuKTsKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA4LjQuNDogQ29ubmVjdGlvbiBGYWlsdXJlIEluZGljYXRpb24gKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2Nvbm5fZmFpbChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCisJLyogRklYTUU6IHByaW50IHdoaWNoIGNoYW5uZWwgKi8KKwlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgQ09OTkVDVElPTiBGQUlMOiBSRUxFQVNJTkcgIiwKKwkgICAgIGdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pKTsKKworCXJzbF90bHZfcGFyc2UoJnRwLCBkaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqZGgpKTsKKworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfQ0FVU0UpKQorCQlwcmludF9yc2xfY2F1c2UoTE9HTF9OT1RJQ0UsIFRMVlBfVkFMKCZ0cCwgUlNMX0lFX0NBVVNFKSwKKwkJCQlUTFZQX0xFTigmdHAsIFJTTF9JRV9DQVVTRSkpOworCisJTE9HUEMoRFJTTCwgTE9HTF9OT1RJQ0UsICJcbiIpOworCS8qIEZJWE1FOiBvbmx5IGZyZWUgaXQgYWZ0ZXIgY2hhbm5lbCByZWxlYXNlIEFDSyAqLworCXJldHVybiByc2xfcmZfY2hhbl9yZWxlYXNlKG1zZy0+bGNoYW4pOworfQorCitzdGF0aWMgdm9pZCBwcmludF9tZWFzX3JlcF91bmkoc3RydWN0IGdzbV9tZWFzX3JlcF91bmlkaXIgKm1ydSwKKwkJCQljb25zdCBjaGFyICpwcmVmaXgpCit7CisJREVCVUdQQyhETUVBUywgIlJYTC1GVUxMLSVzPSUzZGRCbSBSWEwtU1VCLSVzPSUzZGRCbSAiLAorCQlwcmVmaXgsIHJ4bGV2MmRibShtcnUtPmZ1bGwucnhfbGV2KSwKKwkJcHJlZml4LCByeGxldjJkYm0obXJ1LT5zdWIucnhfbGV2KSk7CisJREVCVUdQQyhETUVBUywgIlJYUS1GVUxMLSVzPSVkIFJYUS1TVUItJXM9JWQgIiwKKwkJcHJlZml4LCBtcnUtPmZ1bGwucnhfcXVhbCwgcHJlZml4LCBtcnUtPnN1Yi5yeF9xdWFsKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbWVhc19yZXAoc3RydWN0IGdzbV9tZWFzX3JlcCAqbXIpCit7CisJaW50IGk7CisKKwlERUJVR1AoRE1FQVMsICJNRUFTVVJFTUVOVCBSRVNVTFQgTlI9JWQgIiwgbXItPm5yKTsKKworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0RMX0RUWCkKKwkJREVCVUdQQyhETUVBUywgIkRUWGQgIik7CisKKwlwcmludF9tZWFzX3JlcF91bmkoJm1yLT51bCwgInVsIik7CisJREVCVUdQQyhETUVBUywgIkJTX1BPV0VSPSVkICIsIG1yLT5ic19wb3dlcik7CisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfTVNfVE8pCisJCURFQlVHUEMoRE1FQVMsICJNU19UTz0lZCAiLCBtci0+bXNfdGltaW5nX29mZnNldCk7CisKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9NU19MMSkgeworCQlERUJVR1BDKERNRUFTLCAiTDFfTVNfUFdSPSUzZGRCbSAiLCBtci0+bXNfbDEucHdyKTsKKwkJREVCVUdQQyhETUVBUywgIkwxX0ZQQz0ldSAiLAorCQkJbXItPmZsYWdzICYgTUVBU19SRVBfRl9GUEMgPyAxIDogMCk7CisJCURFQlVHUEMoRE1FQVMsICJMMV9UQT0ldSAiLCBtci0+bXNfbDEudGEpOworCX0KKworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX1VMX0RUWCkKKwkJREVCVUdQQyhETUVBUywgIkRUWHUgIik7CisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfQkExKQorCQlERUJVR1BDKERNRUFTLCAiQkExICIpOworCWlmICghKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRExfVkFMSUQpKQorCQlERUJVR1BDKERNRUFTLCAiTk9UIFZBTElEICIpOworCWVsc2UKKwkJcHJpbnRfbWVhc19yZXBfdW5pKCZtci0+ZGwsICJkbCIpOworCisJREVCVUdQQyhETUVBUywgIk5VTV9ORUlHSD0ldVxuIiwgbXItPm51bV9jZWxsKTsKKwlpZiAobXItPm51bV9jZWxsID09IDcpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgbXItPm51bV9jZWxsOyBpKyspIHsKKwkJc3RydWN0IGdzbV9tZWFzX3JlcF9jZWxsICptcmMgPSAmbXItPmNlbGxbaV07CisJCURFQlVHUChETUVBUywgIklEWD0ldSBBUkZDTj0ldSBCU0lDPSV1ID0+ICVkIGRCbVxuIiwKKwkJCW1yYy0+bmVpZ2hfaWR4LCBtcmMtPmFyZmNuLCBtcmMtPmJzaWMsIHJ4bGV2MmRibShtcmMtPnJ4bGV2KSk7CisJfQorfQorCitzdGF0aWMgaW50IHJzbF9yeF9tZWFzX3JlcyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbWVhc19yZXAgKm1yID0gbGNoYW5fbmV4dF9tZWFzX3JlcChtc2ctPmxjaGFuKTsKKwl1X2ludDhfdCBsZW47CisJY29uc3QgdV9pbnQ4X3QgKnZhbDsKKwlpbnQgcmM7CisKKwkvKiBjaGVjayBpZiB0aGlzIGNoYW5uZWwgaXMgYWN0dWFsbHkgYWN0aXZlICovCisJLyogRklYTUU6IG1heWJlIHRoaXMgY2hlY2sgc2hvdWxkIGJlIHdheSBtb3JlIGdlbmVyaWMvY2VudHJhbGl6ZWQgKi8KKwlpZiAobXNnLT5sY2hhbi0+c3RhdGUgIT0gTENIQU5fU19BQ1RJVkUpIHsKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzOiBNRUFTIFJFUyBmb3IgaW5hY3RpdmUgY2hhbm5lbFxuIiwKKwkJCWdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtc2V0KG1yLCAwLCBzaXplb2YoKm1yKSk7CisJbXItPmxjaGFuID0gbXNnLT5sY2hhbjsKKworCXJzbF90bHZfcGFyc2UoJnRwLCBkaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqZGgpKTsKKworCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX01FQVNfUkVTX05SKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX1VQTElOS19NRUFTKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0JTX1BPV0VSKSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBNYW5kYXRvcnkgUGFydHMgKi8KKwltci0+bnIgPSAqVExWUF9WQUwoJnRwLCBSU0xfSUVfTUVBU19SRVNfTlIpOworCisJbGVuID0gVExWUF9MRU4oJnRwLCBSU0xfSUVfVVBMSU5LX01FQVMpOworCXZhbCA9IFRMVlBfVkFMKCZ0cCwgUlNMX0lFX1VQTElOS19NRUFTKTsKKwlpZiAobGVuID49IDMpIHsKKwkJaWYgKHZhbFswXSAmIDB4NDApCisJCQltci0+ZmxhZ3MgfD0gTUVBU19SRVBfRl9ETF9EVFg7CisJCW1yLT51bC5mdWxsLnJ4X2xldiA9IHZhbFswXSAmIDB4M2Y7CisJCW1yLT51bC5zdWIucnhfbGV2ID0gdmFsWzFdICYgMHgzZjsKKwkJbXItPnVsLmZ1bGwucnhfcXVhbCA9IHZhbFsyXT4+MyAmIDB4NzsKKwkJbXItPnVsLnN1Yi5yeF9xdWFsID0gdmFsWzJdICYgMHg3OworCX0KKworCW1yLT5ic19wb3dlciA9ICpUTFZQX1ZBTCgmdHAsIFJTTF9JRV9CU19QT1dFUik7CisKKwkvKiBPcHRpb25hbCBQYXJ0cyAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfTVNfVElNSU5HX09GRlNFVCkpCisJCW1yLT5tc190aW1pbmdfb2Zmc2V0ID0KKwkJCSpUTFZQX1ZBTCgmdHAsIFJTTF9JRV9NU19USU1JTkdfT0ZGU0VUKTsKKworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfTDFfSU5GTykpIHsKKwkJdmFsID0gVExWUF9WQUwoJnRwLCBSU0xfSUVfTDFfSU5GTyk7CisJCW1yLT5mbGFncyB8PSBNRUFTX1JFUF9GX01TX0wxOworCQltci0+bXNfbDEucHdyID0gbXNfcHdyX2RibShtc2ctPnRyeC0+YnRzLT5iYW5kLCB2YWxbMF0gPj4gMyk7CisJCWlmICh2YWxbMF0gJiAweDA0KQorCQkJbXItPmZsYWdzIHw9IE1FQVNfUkVQX0ZfRlBDOworCQltci0+bXNfbDEudGEgPSB2YWxbMV07CisJfQorCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBSU0xfSUVfTDNfSU5GTykpIHsKKwkJbXNnLT5sM2ggPSAodV9pbnQ4X3QgKikgVExWUF9WQUwoJnRwLCBSU0xfSUVfTDNfSU5GTyk7CisJCXJjID0gZ3NtNDhfcGFyc2VfbWVhc19yZXAobXIsIG1zZyk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJfQorCisJcHJpbnRfbWVhc19yZXAobXIpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX01FQVNfUkVQLCBtcik7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA4LjQuNyAqLworc3RhdGljIGludCByc2xfcnhfaGFuZG9fZGV0KHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwlERUJVR1AoRFJTTCwgIiVzIEhBTkRPVkVSIERFVEVDVCAiLCBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSk7CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0FDQ0VTU19ERUxBWSkpCisJCURFQlVHUEMoRFJTTCwgImFjY2VzcyBkZWxheSA9ICV1XG4iLAorCQkJKlRMVlBfVkFMKCZ0cCwgUlNMX0lFX0FDQ0VTU19ERUxBWSkpOworCWVsc2UKKwkJREVCVUdQQyhEUlNMLCAiXG4iKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9IQU5ET1ZFUl9ERVRFQ1QsIG1zZy0+bGNoYW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfZGNoYW4oc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpyc2xoID0gbXNnYl9sMihtc2cpOworCWludCByYyA9IDA7CisJY2hhciAqdHNfbmFtZTsKKworCW1zZy0+bGNoYW4gPSBsY2hhbl9sb29rdXAobXNnLT50cngsIHJzbGgtPmNoYW5fbnIpOworCXRzX25hbWUgPSBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKTsKKworCXN3aXRjaCAocnNsaC0+Yy5tc2dfdHlwZSkgeworCWNhc2UgUlNMX01UX0NIQU5fQUNUSVZfQUNLOgorCQlERUJVR1AoRFJTTCwgIiVzIENIQU5ORUwgQUNUSVZBVEUgQUNLXG4iLCB0c19uYW1lKTsKKwkJcmMgPSByc2xfcnhfY2hhbl9hY3RfYWNrKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0NIQU5fQUNUSVZfTkFDSzoKKwkJcmMgPSByc2xfcnhfY2hhbl9hY3RfbmFjayhtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9DT05OX0ZBSUw6CisJCXJjID0gcnNsX3J4X2Nvbm5fZmFpbChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9NRUFTX1JFUzoKKwkJcmMgPSByc2xfcnhfbWVhc19yZXMobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSEFORE9fREVUOgorCQlyYyA9IHJzbF9yeF9oYW5kb19kZXQobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfUkZfQ0hBTl9SRUxfQUNLOgorCQlERUJVR1AoRFJTTCwgIiVzIFJGIENIQU5ORUwgUkVMRUFTRSBBQ0tcbiIsIHRzX25hbWUpOworCQlpZiAobXNnLT5sY2hhbi0+c3RhdGUgIT0gTENIQU5fU19SRUxfUkVRKQorCQkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIENIQU4gUkVMIEFDSyBidXQgc3RhdGUgJXNcbiIsCisJCQkJZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbiksCisJCQkJZ3NtX2xjaGFuc19uYW1lKG1zZy0+bGNoYW4tPnN0YXRlKSk7CisJCW1zZy0+bGNoYW4tPnN0YXRlID0gTENIQU5fU19OT05FOworCQlsY2hhbl9mcmVlKG1zZy0+bGNoYW4pOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9NT0RFX01PRElGWV9BQ0s6CisJCURFQlVHUChEUlNMLCAiJXMgQ0hBTk5FTCBNT0RFIE1PRElGWSBBQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9NT0RFX01PRElGWV9OQUNLOgorCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBDSEFOTkVMIE1PREUgTU9ESUZZIE5BQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX1BEQ0hfQUNUX0FDSzoKKwkJREVCVUdQQyhEUlNMLCAiJXMgSVBBQyBQRENIIEFDVCBBQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX1BEQ0hfQUNUX05BQ0s6CisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIElQQUMgUERDSCBBQ1QgTkFDS1xuIiwgdHNfbmFtZSk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0lQQUNfUERDSF9ERUFDVF9BQ0s6CisJCURFQlVHUChEUlNMLCAiJXMgSVBBQyBQRENIIERFQUNUIEFDS1xuIiwgdHNfbmFtZSk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0lQQUNfUERDSF9ERUFDVF9OQUNLOgorCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBJUEFDIFBEQ0ggREVBQ1QgTkFDS1xuIiwgdHNfbmFtZSk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX1BIWV9DT05URVhUX0NPTkY6CisJY2FzZSBSU0xfTVRfUFJFUFJPQ19NRUFTX1JFUzoKKwljYXNlIFJTTF9NVF9UQUxLRVJfREVUOgorCWNhc2UgUlNMX01UX0xJU1RFTkVSX0RFVDoKKwljYXNlIFJTTF9NVF9SRU1PVEVfQ09ERUNfQ09ORl9SRVA6CisJY2FzZSBSU0xfTVRfTVJfQ09ERUNfTU9EX0FDSzoKKwljYXNlIFJTTF9NVF9NUl9DT0RFQ19NT0RfTkFDSzoKKwljYXNlIFJTTF9NVF9NUl9DT0RFQ19NT0RfUEVSOgorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgVW5pbXBsZW1lbnRlZCBBYmlzIFJTTCBEQ2hhbiAiCisJCQkibXNnIDB4JTAyeFxuIiwgdHNfbmFtZSwgcnNsaC0+Yy5tc2dfdHlwZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyB1bmtub3duIEFiaXMgUlNMIERDaGFuIG1zZyAweCUwMnhcbiIsCisJCQl0c19uYW1lLCByc2xoLT5jLm1zZ190eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHJzbF9yeF9lcnJvcl9yZXAoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkciAqcnNsaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIEVSUk9SIFJFUE9SVCAiLCBnc21fdHJ4X25hbWUobXNnLT50cngpKTsKKworCXJzbF90bHZfcGFyc2UoJnRwLCByc2xoLT5kYXRhLCBtc2diX2wybGVuKG1zZyktc2l6ZW9mKCpyc2xoKSk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0NBVVNFKSkKKwkJcHJpbnRfcnNsX2NhdXNlKExPR0xfRVJST1IsIFRMVlBfVkFMKCZ0cCwgUlNMX0lFX0NBVVNFKSwKKwkJCQlUTFZQX0xFTigmdHAsIFJTTF9JRV9DQVVTRSkpOworCisJTE9HUEMoRFJTTCwgTE9HTF9FUlJPUiwgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX3JzbF9yeF90cngoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkciAqcnNsaCA9IG1zZ2JfbDIobXNnKTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChyc2xoLT5tc2dfdHlwZSkgeworCWNhc2UgUlNMX01UX0VSUk9SX1JFUE9SVDoKKwkJcmMgPSByc2xfcnhfZXJyb3JfcmVwKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX1JGX1JFU19JTkQ6CisJCS8qIGludGVyZmVyZW5jZSBvbiBpZGxlIGNoYW5uZWxzIG9mIFRSWCAqLworCQkvL0RFQlVHUChEUlNMLCAiJXMgUkYgUmVzb3VyY2UgSW5kaWNhdGlvblxuIiwgZ3NtX3RyeF9uYW1lKG1zZy0+dHJ4KSk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX09WRVJMT0FEOgorCQkvKiBpbmRpY2F0ZSBDQ0NIIC8gQUNDSCAvIHByb2Nlc3NvciBvdmVybG9hZCAqLyAKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgQ0NDSC9BQ0NIL0NQVSBPdmVybG9hZFxuIiwKKwkJICAgICBnc21fdHJ4X25hbWUobXNnLT50cngpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIFVua25vd24gQWJpcyBSU0wgVFJYIG1lc3NhZ2UgIgorCQkJInR5cGUgMHglMDJ4XG4iLCBnc21fdHJ4X25hbWUobXNnLT50cngpLCByc2xoLT5tc2dfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qIElmIFQzMTAxIGV4cGlyZXMsIHdlIG5ldmVyIHJlY2VpdmVkIGEgcmVzcG9uc2UgdG8gSU1NRURJQVRFIEFTU0lHTiAqLworc3RhdGljIHZvaWQgdDMxMDFfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gZGF0YTsKKworCXJzbF9yZl9jaGFuX3JlbGVhc2UobGNoYW4pOworfQorCisvKiBNUyBoYXMgcmVxdWVzdGVkIGEgY2hhbm5lbCBvbiB0aGUgUkFDSCAqLworc3RhdGljIGludCByc2xfcnhfY2hhbl9ycWQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbXNnLT50cngtPmJ0czsKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpycWRfaGRyID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCBnc200OF9yZXFfcmVmICpycWRfcmVmOworCXN0cnVjdCBnc200OF9pbW1fYXNzIGlhOworCWVudW0gZ3NtX2NoYW5fdCBsY3R5cGU7CisJZW51bSBnc21fY2hyZXFfcmVhc29uX3QgY2hyZXFfcmVhc29uOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXVfaW50OF90IHJxZF90YTsKKwlpbnQgcmV0OworCisJdV9pbnQxNl90IGFyZmNuOworCXVfaW50OF90IHRzX251bWJlciwgc3ViY2g7CisKKwkvKiBwYXJzZSByZXF1ZXN0IHJlZmVyZW5jZSB0byBiZSB1c2VkIGluIGltbWVkaWF0ZSBhc3NpZ24gKi8KKwlpZiAocnFkX2hkci0+ZGF0YVswXSAhPSBSU0xfSUVfUkVRX1JFRkVSRU5DRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlycWRfcmVmID0gKHN0cnVjdCBnc200OF9yZXFfcmVmICopICZycWRfaGRyLT5kYXRhWzFdOworCisJLyogcGFyc2UgYWNjZXNzIGRlbGF5IGFuZCB1c2UgYXMgVEEgKi8KKwlpZiAocnFkX2hkci0+ZGF0YVtzaXplb2Yoc3RydWN0IGdzbTQ4X3JlcV9yZWYpKzFdICE9IFJTTF9JRV9BQ0NFU1NfREVMQVkpCisJCXJldHVybiAtRUlOVkFMOworCXJxZF90YSA9IHJxZF9oZHItPmRhdGFbc2l6ZW9mKHN0cnVjdCBnc200OF9yZXFfcmVmKSsyXTsKKworCS8qIGRldGVybWluZSBjaGFubmVsIHR5cGUgKFNEQ0NIL1RDSF9GL1RDSF9IKSBiYXNlZCBvbgorCSAqIHJlcXVlc3QgcmVmZXJlbmNlIFJBICovCisJbGN0eXBlID0gZ2V0X2N0eXBlX2J5X2NocmVxKGJ0cywgcnFkX3JlZi0+cmEsIGJ0cy0+bmV0d29yay0+bmVjaSk7CisJY2hyZXFfcmVhc29uID0gZ2V0X3JlYXNvbl9ieV9jaHJlcShidHMsIHJxZF9yZWYtPnJhLCBidHMtPm5ldHdvcmstPm5lY2kpOworCisJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5jaHJlcS50b3RhbCk7CisKKwkvKiBjaGVjayBhdmFpbGFiaWxpdHkgLyBhbGxvY2F0ZSBjaGFubmVsICovCisJbGNoYW4gPSBsY2hhbl9hbGxvYyhidHMsIGxjdHlwZSk7CisJaWYgKCFsY2hhbikgeworCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiQlRTICVkIENIQU4gUlFEOiBubyByZXNvdXJjZXMgZm9yICVzIDB4JXhcbiIsCisJCSAgICAgbXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwgZ3NtX2xjaGFudF9uYW1lKGxjdHlwZSksIHJxZF9yZWYtPnJhKTsKKwkJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5jaHJlcS5ub19jaGFubmVsKTsKKwkJLyogRklYTUU6IHNlbmQgc29tZSBraW5kIG9mIHJlamVjdCA/IT8gKi8KKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGxjaGFuLT5zdGF0ZSAhPSBMQ0hBTl9TX05PTkUpCisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBsY2hhbl9hbGxvYygpIHJldHVybmVkIGNoYW5uZWwgIgorCQkgICAgICJpbiBzdGF0ZSAlc1xuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pLAorCQkgICAgIGdzbV9sY2hhbnNfbmFtZShsY2hhbi0+c3RhdGUpKTsKKwlsY2hhbi0+c3RhdGUgPSBMQ0hBTl9TX0FDVF9SRVE7CisKKwl0c19udW1iZXIgPSBsY2hhbi0+dHMtPm5yOworCWFyZmNuID0gbGNoYW4tPnRzLT50cngtPmFyZmNuOworCXN1YmNoID0gbGNoYW4tPm5yOworCQorCWxjaGFuLT5lbmNyLmFsZ19pZCA9IFJTTF9FTkNfQUxHX0E1KDApOwkvKiBubyBlbmNyeXB0aW9uICovCisJbGNoYW4tPm1zX3Bvd2VyID0gbXNfcHdyX2N0bF9sdmwoYnRzLT5iYW5kLCBidHMtPm1zX21heF9wb3dlcik7CisJbGNoYW4tPmJzX3Bvd2VyID0gMDsgLyogMGRCIHJlZHVjdGlvbiwgb3V0cHV0IHBvd2VyID0gUG4gKi8KKwlsY2hhbi0+cnNsX2Ntb2RlID0gUlNMX0NNT0RfU1BEX1NJR047CisJbGNoYW4tPnRjaF9tb2RlID0gR1NNNDhfQ01PREVfU0lHTjsKKwlyc2xfY2hhbl9hY3RpdmF0ZV9sY2hhbihsY2hhbiwgMHgwMCwgcnFkX3RhLCAwKTsKKworCS8qIGNyZWF0ZSBJTU1FRElBVEUgQVNTSUdOIDA0LjA4IG1lc3NnZSAqLworCW1lbXNldCgmaWEsIDAsIHNpemVvZihpYSkpOworCWlhLmwyX3BsZW4gPSAweDJkOworCWlhLnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfUlI7CisJaWEubXNnX3R5cGUgPSBHU000OF9NVF9SUl9JTU1fQVNTOworCWlhLnBhZ2VfbW9kZSA9IEdTTTQ4X1BNX1NBTUU7CisJaWEuY2hhbl9kZXNjLmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwlpYS5jaGFuX2Rlc2MuaDAuaCA9IDA7CisJaWEuY2hhbl9kZXNjLmgwLmFyZmNuX2hpZ2ggPSBhcmZjbiA+PiA4OworCWlhLmNoYW5fZGVzYy5oMC5hcmZjbl9sb3cgPSBhcmZjbiAmIDB4ZmY7CisJaWEuY2hhbl9kZXNjLmgwLnRzYyA9IGJ0cy0+dHNjOworCS8qIHVzZSByZXF1ZXN0IHJlZmVyZW5jZSBleHRyYWN0ZWQgZnJvbSBDSEFOX1JRRCAqLworCW1lbWNweSgmaWEucmVxX3JlZiwgcnFkX3JlZiwgc2l6ZW9mKGlhLnJlcV9yZWYpKTsKKwlpYS50aW1pbmdfYWR2YW5jZSA9IHJxZF90YTsKKwlpYS5tb2JfYWxsb2NfbGVuID0gMDsKKworCURFQlVHUChEUlNMLCAiJXMgQWN0aXZhdGluZyBBUkZDTigldSkgU1MoJXUpIGxjdHlwZSAlcyAiCisJCSJyPSVzIHJhPTB4JTAyeFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pLCBhcmZjbiwgc3ViY2gsCisJCWdzbV9sY2hhbnRfbmFtZShsY2hhbi0+dHlwZSksIGdzbV9jaHJlcV9uYW1lKGNocmVxX3JlYXNvbiksCisJCXJxZF9yZWYtPnJhKTsKKworCS8qIFN0YXJ0IHRpbWVyIFQzMTAxIHRvIHdhaXQgZm9yIEdTTTQ4X01UX1JSX1BBR19SRVNQICovCisJbGNoYW4tPlQzMTAxLmNiID0gdDMxMDFfZXhwaXJlZDsKKwlsY2hhbi0+VDMxMDEuZGF0YSA9IGxjaGFuOworCWJzY19zY2hlZHVsZV90aW1lcigmbGNoYW4tPlQzMTAxLCBidHMtPm5ldHdvcmstPlQzMTAxLCAwKTsKKworCS8qIHNlbmQgSU1NRURJQVRFIEFTU0lHTiBDTUQgb24gUlNMIHRvIEJUUyAodG8gc2VuZCBvbiBDQ0NIIHRvIE1TKSAqLworCXJldCA9IHJzbF9pbW1fYXNzaWduX2NtZChidHMsIHNpemVvZihpYSksICh1X2ludDhfdCAqKSAmaWEpOworCisJcmV0dXJuIHJldDsKK30KKworLyogTVMgaGFzIHJlcXVlc3RlZCBhIGNoYW5uZWwgb24gdGhlIFJBQ0ggKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2NjY2hfbG9hZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZyk7CisJdV9pbnQxNl90IHBnX2J1Zl9zcGFjZTsKKwl1X2ludDE2X3QgcmFjaF9zbG90X2NvdW50ID0gLTE7CisJdV9pbnQxNl90IHJhY2hfYnVzeV9jb3VudCA9IC0xOworCXVfaW50MTZfdCByYWNoX2FjY2Vzc19jb3VudCA9IC0xOworCisJc3dpdGNoIChyc2xoLT5kYXRhWzBdKSB7CisJY2FzZSBSU0xfSUVfUEFHSU5HX0xPQUQ6CisJCXBnX2J1Zl9zcGFjZSA9IHJzbGgtPmRhdGFbMV0gPDwgOCB8IHJzbGgtPmRhdGFbMl07CisJCXBhZ2luZ191cGRhdGVfYnVmZmVyX3NwYWNlKG1zZy0+dHJ4LT5idHMsIHBnX2J1Zl9zcGFjZSk7CisJCWJyZWFrOworCWNhc2UgUlNMX0lFX1JBQ0hfTE9BRDoKKwkJaWYgKG1zZy0+ZGF0YV9sZW4gPj0gNykgeworCQkJcmFjaF9zbG90X2NvdW50ID0gcnNsaC0+ZGF0YVsyXSA8PCA4IHwgcnNsaC0+ZGF0YVszXTsKKwkJCXJhY2hfYnVzeV9jb3VudCA9IHJzbGgtPmRhdGFbNF0gPDwgOCB8IHJzbGgtPmRhdGFbNV07CisJCQlyYWNoX2FjY2Vzc19jb3VudCA9IHJzbGgtPmRhdGFbNl0gPDwgOCB8IHJzbGgtPmRhdGFbN107CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfY2NoYW4oc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpyc2xoID0gbXNnYl9sMihtc2cpOworCWludCByYyA9IDA7CisKKwltc2ctPmxjaGFuID0gbGNoYW5fbG9va3VwKG1zZy0+dHJ4LCByc2xoLT5jaGFuX25yKTsKKworCXN3aXRjaCAocnNsaC0+Yy5tc2dfdHlwZSkgeworCWNhc2UgUlNMX01UX0NIQU5fUlFEOgorCQkvKiBNUyBoYXMgcmVxdWVzdGVkIGEgY2hhbm5lbCBvbiB0aGUgUkFDSCAqLworCQlyYyA9IHJzbF9yeF9jaGFuX3JxZChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9DQ0NIX0xPQURfSU5EOgorCQkvKiBjdXJyZW50IGxvYWQgb24gdGhlIENDQ0ggKi8KKwkJcmMgPSByc2xfcnhfY2NjaF9sb2FkKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0RFTEVURV9JTkQ6CisJCS8qIENDQ0ggb3ZlcmxvYWRlZCwgSU1NX0FTU0lHTiB3YXMgZHJvcHBlZCAqLworCWNhc2UgUlNMX01UX0NCQ0hfTE9BRF9JTkQ6CisJCS8qIGN1cnJlbnQgbG9hZCBvbiB0aGUgQ0JDSCAqLworCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiVW5pbXBsZW1lbnRlZCBBYmlzIFJTTCBUUlggbWVzc2FnZSAiCisJCQkidHlwZSAweCUwMnhcbiIsIHJzbGgtPmMubXNnX3R5cGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiVW5rbm93biBBYmlzIFJTTCBUUlggbWVzc2FnZSB0eXBlICIKKwkJCSIweCUwMnhcbiIsIHJzbGgtPmMubXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcnNsX3J4X3JsbF9lcnJfaW5kKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX3JsbF9oZHIgKnJsbGggPSBtc2diX2wyKG1zZyk7CisJdV9pbnQ4X3QgKnJsbV9jYXVzZSA9IHJsbGgtPmRhdGE7CisKKwlMT0dQKERSTEwsIExPR0xfRVJST1IsICIlcyBFUlJPUiBJTkRJQ0FUSU9OIGNhdXNlPSVzXG4iLAorCQlnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSwKKwkJcnNsX3JsbV9jYXVzZV9uYW1lKHJsbV9jYXVzZVsxXSkpOworCisJcmxsX2luZGljYXRpb24obXNnLT5sY2hhbiwgcmxsaC0+bGlua19pZCwgQlNDX1JMTFJfSU5EX0VSUl9JTkQpOworCisJaWYgKHJsbV9jYXVzZVsxXSA9PSBSTExfQ0FVU0VfVDIwMF9FWFBJUkVEKQorCQlyZXR1cm4gcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuKTsKKworCXJldHVybiAwOworfQorCisvKglFU1RBQkxJU0ggSU5ESUNBVElPTiwgTE9DQVRJT04gQVJFQSBVUERBVEUgUkVRVUVTVCAKKwkweDAyLCAweDA2LAorCTB4MDEsIDB4MjAsCisJMHgwMiwgMHgwMCwKKwkweDBiLCAweDAwLCAweDBmLCAweDA1LCAweDA4LCAuLi4gKi8KKworc3RhdGljIGludCBhYmlzX3JzbF9yeF9ybGwoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfcmxsX2hkciAqcmxsaCA9IG1zZ2JfbDIobXNnKTsKKwlpbnQgcmMgPSAwOworCWNoYXIgKnRzX25hbWU7CisJdV9pbnQ4X3Qgc2FwaSA9IHJsbGgtPmxpbmtfaWQgJiA3OworCisJbXNnLT5sY2hhbiA9IGxjaGFuX2xvb2t1cChtc2ctPnRyeCwgcmxsaC0+Y2hhbl9ucik7CisJdHNfbmFtZSA9IGdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pOworCURFQlVHUChEUkxMLCAiJXMgU0FQST0ldSAiLCB0c19uYW1lLCBzYXBpKTsKKwkKKwlzd2l0Y2ggKHJsbGgtPmMubXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9EQVRBX0lORDoKKwkJREVCVUdQQyhEUkxMLCAiREFUQSBJTkRJQ0FUSU9OXG4iKTsKKwkJaWYgKG1zZ2JfbDJsZW4obXNnKSA+IAorCQkgICAgc2l6ZW9mKHN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyKSArIHNpemVvZigqcmxsaCkgJiYKKwkJICAgIHJsbGgtPmRhdGFbMF0gPT0gUlNMX0lFX0wzX0lORk8pIHsKKwkJCW1zZy0+bDNoID0gJnJsbGgtPmRhdGFbM107CisJCQlyZXR1cm4gZ3NtMDQwOF9yY3Ztc2cobXNnLCBybGxoLT5saW5rX2lkKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJTTF9NVF9FU1RfSU5EOgorCQlERUJVR1BDKERSTEwsICJFU1RBQkxJU0ggSU5ESUNBVElPTlxuIik7CisJCS8qIGxjaGFuIGlzIGVzdGFibGlzaGVkLCBzdG9wIFQzMTAxICovCisJCW1zZy0+bGNoYW4tPnNhcGlzW3JsbGgtPmxpbmtfaWQgJiAweDddID0gTENIQU5fU0FQSV9NUzsKKwkJYnNjX2RlbF90aW1lcigmbXNnLT5sY2hhbi0+VDMxMDEpOworCQlpZiAobXNnYl9sMmxlbihtc2cpID4gCisJCSAgICBzaXplb2Yoc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIpICsgc2l6ZW9mKCpybGxoKSAmJgorCQkgICAgcmxsaC0+ZGF0YVswXSA9PSBSU0xfSUVfTDNfSU5GTykgeworCQkJbXNnLT5sM2ggPSAmcmxsaC0+ZGF0YVszXTsKKwkJCXJldHVybiBnc20wNDA4X3Jjdm1zZyhtc2csIHJsbGgtPmxpbmtfaWQpOworCQl9CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0VTVF9DT05GOgorCQlERUJVR1BDKERSTEwsICJFU1RBQkxJU0ggQ09ORklSTVxuIik7CisJCW1zZy0+bGNoYW4tPnNhcGlzW3JsbGgtPmxpbmtfaWQgJiAweDddID0gTENIQU5fU0FQSV9ORVQ7CisJCXJsbF9pbmRpY2F0aW9uKG1zZy0+bGNoYW4sIHJsbGgtPmxpbmtfaWQsCisJCQkJICBCU0NfUkxMUl9JTkRfRVNUX0NPTkYpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9SRUxfSU5EOgorCQkvKiBCVFMgaW5mb3JtcyB1cyBvZiBoYXZpbmcgcmVjZWl2ZWQgIERJU0MgZnJvbSBNUyAqLworCQlERUJVR1BDKERSTEwsICJSRUxFQVNFIElORElDQVRJT05cbiIpOworCQltc2ctPmxjaGFuLT5zYXBpc1tybGxoLT5saW5rX2lkICYgMHg3XSA9IExDSEFOX1NBUElfVU5VU0VEOworCQlybGxfaW5kaWNhdGlvbihtc2ctPmxjaGFuLCBybGxoLT5saW5rX2lkLAorCQkJCSAgQlNDX1JMTFJfSU5EX1JFTF9JTkQpOworCQkvKiB3ZSBjYW4gbm93IHJlbGVhZSB0aGUgY2hhbm5lbCBvbiB0aGUgQlRTL0FiaXMgc2lkZSAqLworCQkvKiBGSVhNRTogb2ZmaWNpYWxseSB3ZSBuZWVkIHRvIHN0YXJ0IFQzMTExIGFuZCB3YWl0IGZvcgorCQkgKiBzb21lIGdyYWNlIHBlcmlvZCAqLworCQlyc2xfcmZfY2hhbl9yZWxlYXNlKG1zZy0+bGNoYW4pOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9SRUxfQ09ORjoKKwkJLyogQlRTIGluZm9ybXMgdXMgb2YgaGF2aW5nIHJlY2VpdmVkIFVBIGZyb20gTVMsCisJCSAqIGluIHJlc3BvbnNlIHRvIERJU0MgdGhhdCB3ZSd2ZSBzZW50IGVhcmxpZXIgKi8KKwkJREVCVUdQQyhEUkxMLCAiUkVMRUFTRSBDT05GSVJNQVRJT05cbiIpOworCQltc2ctPmxjaGFuLT5zYXBpc1tybGxoLT5saW5rX2lkICYgMHg3XSA9IExDSEFOX1NBUElfVU5VU0VEOworCQkvKiB3ZSBjYW4gbm93IHJlbGVhZSB0aGUgY2hhbm5lbCBvbiB0aGUgQlRTL0FiaXMgc2lkZSAqLworCQkvKiBGSVhNRTogb2ZmaWNpYWxseSB3ZSBuZWVkIHRvIHN0YXJ0IFQzMTExIGFuZCB3YWl0IGZvcgorCQkgKiBzb21lIGdyYWNlIHBlcmlvZCAqLworCQlyc2xfcmZfY2hhbl9yZWxlYXNlKG1zZy0+bGNoYW4pOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9FUlJPUl9JTkQ6CisJCXJjID0gcnNsX3J4X3JsbF9lcnJfaW5kKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX1VOSVRfREFUQV9JTkQ6CisJCUxPR1AoRFJMTCwgTE9HTF9OT1RJQ0UsICJ1bmltcGxlbWVudGVkIEFiaXMgUkxMIG1lc3NhZ2UgIgorCQkJInR5cGUgMHglMDJ4XG4iLCBybGxoLT5jLm1zZ190eXBlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUkxMLCBMT0dMX05PVElDRSwgInVua25vd24gQWJpcyBSTEwgbWVzc2FnZSAiCisJCQkidHlwZSAweCUwMnhcbiIsIHJsbGgtPmMubXNnX3R5cGUpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB1X2ludDhfdCBpcGFfc21vZF9zX2Zvcl9sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzd2l0Y2ggKGxjaGFuLT50Y2hfbW9kZSkgeworCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX1YxOgorCQlzd2l0Y2ggKGxjaGFuLT50eXBlKSB7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQkJcmV0dXJuIDB4MDA7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9IOgorCQkJcmV0dXJuIDB4MDM7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX0VGUjoKKwkJc3dpdGNoIChsY2hhbi0+dHlwZSkgeworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwkJCXJldHVybiAweDAxOworCQkvKiB0aGVyZSdzIG5vIGhhbGYtcmF0ZSBFRlIgKi8KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SOgorCQlzd2l0Y2ggKGxjaGFuLT50eXBlKSB7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQkJcmV0dXJuIDB4MDI7CisJCWNhc2UgR1NNX0xDSEFOX1RDSF9IOgorCQkJcmV0dXJuIDB4MDU7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlMT0dQKERSU0wsIExPR0xfRVJST1IsICJDYW5ub3QgZGV0ZXJtaW5lIGlwLmFjY2VzcyBzcGVlY2ggbW9kZSBmb3IgIgorCQkidGNoX21vZGUgPT0gMHglMDJ4XG4iLCBsY2hhbi0+dGNoX21vZGUpOworCXJldHVybiAwOworfQorCisvKiBpcC5hY2Nlc3Mgc3BlY2lmaWMgUlNMIGV4dGVuc2lvbnMgKi8KK3N0YXRpYyB2b2lkIGlwYWNfcGFyc2VfcnRwKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdHYpCit7CisJc3RydWN0IGluX2FkZHIgaXA7CisJdV9pbnQxNl90IHBvcnQsIGNvbm5faWQ7CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19MT0NBTF9JUCkpIHsKKwkJaXAuc19hZGRyID0gKigodV9pbnQzMl90ICopIFRMVlBfVkFMKHR2LCBSU0xfSUVfSVBBQ19MT0NBTF9JUCkpOworCQlERUJVR1BDKERSU0wsICJMT0NBTF9JUD0lcyAiLCBpbmV0X250b2EoaXApKTsKKwkJbGNoYW4tPmFiaXNfaXAuYm91bmRfaXAgPSBudG9obChpcC5zX2FkZHIpOworCX0KKworCWlmIChUTFZQX1BSRVNFTlQodHYsIFJTTF9JRV9JUEFDX0xPQ0FMX1BPUlQpKSB7CisJCXBvcnQgPSAqKCh1X2ludDE2X3QgKikgVExWUF9WQUwodHYsIFJTTF9JRV9JUEFDX0xPQ0FMX1BPUlQpKTsKKwkJcG9ydCA9IG50b2hzKHBvcnQpOworCQlERUJVR1BDKERSU0wsICJMT0NBTF9QT1JUPSV1ICIsIHBvcnQpOworCQlsY2hhbi0+YWJpc19pcC5ib3VuZF9wb3J0ID0gcG9ydDsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19DT05OX0lEKSkgeworCQljb25uX2lkID0gKigodV9pbnQxNl90ICopIFRMVlBfVkFMKHR2LCBSU0xfSUVfSVBBQ19DT05OX0lEKSk7CisJCWNvbm5faWQgPSBudG9ocyhjb25uX2lkKTsKKwkJREVCVUdQQyhEUlNMLCAiQ09OX0lEPSV1ICIsIGNvbm5faWQpOworCQlsY2hhbi0+YWJpc19pcC5jb25uX2lkID0gY29ubl9pZDsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDIpKSB7CisJCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkMiA9CisJCQkJKlRMVlBfVkFMKHR2LCBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDIpOworCQlERUJVR1BDKERSU0wsICJSVFBfUEFZTE9BRDI9MHglMDJ4ICIsCisJCQlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIpOworCX0KKworCWlmIChUTFZQX1BSRVNFTlQodHYsIFJTTF9JRV9JUEFDX1NQRUVDSF9NT0RFKSkgeworCQlsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSA9CisJCQkJKlRMVlBfVkFMKHR2LCBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERSk7CisJCURFQlVHUEMoRFJTTCwgInNwZWVjaF9tb2RlPTB4JTAyeCAiLAorCQkJbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUpOworCX0KKworCWlmIChUTFZQX1BSRVNFTlQodHYsIFJTTF9JRV9JUEFDX1JFTU9URV9JUCkpIHsKKwkJaXAuc19hZGRyID0gKigodV9pbnQzMl90ICopIFRMVlBfVkFMKHR2LCBSU0xfSUVfSVBBQ19SRU1PVEVfSVApKTsKKwkJREVCVUdQQyhEUlNMLCAiUkVNT1RFX0lQPSVzICIsIGluZXRfbnRvYShpcCkpOworCQlsY2hhbi0+YWJpc19pcC5jb25uZWN0X2lwID0gbnRvaGwoaXAuc19hZGRyKTsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19SRU1PVEVfUE9SVCkpIHsKKwkJcG9ydCA9ICooKHVfaW50MTZfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlQpKTsKKwkJcG9ydCA9IG50b2hzKHBvcnQpOworCQlERUJVR1BDKERSU0wsICJSRU1PVEVfUE9SVD0ldSAiLCBwb3J0KTsKKwkJbGNoYW4tPmFiaXNfaXAuY29ubmVjdF9wb3J0ID0gcG9ydDsKKwl9Cit9CisKK2ludCByc2xfaXBhY2NfY3JjeChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9JUEFDX0NSQ1gpOworCWRoLT5jLm1zZ19kaXNjciA9IEFCSVNfUlNMX01ESVNDX0lQQUNDRVNTOworCWRoLT5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisKKwkvKiAweDEtID09IHJlY2VpdmUtb25seSwgMHgtMSA9PSBFRlIgY29kZWMgKi8KKwlsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSA9IDB4MTAgfCBpcGFfc21vZF9zX2Zvcl9sY2hhbihsY2hhbik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERSwgbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUpOworCisJREVCVUdQKERSU0wsICIlcyBJUEFDX0JJTkQgc3BlZWNoX21vZGU9MHglMDJ4XG4iLAorCQlnc21fbGNoYW5fbmFtZShsY2hhbiksIGxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlKTsKKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitpbnQgcnNsX2lwYWNjX21kY3goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQsCisJCSAgIHVfaW50OF90IHJ0cF9wYXlsb2FkMikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwl1X2ludDMyX3QgKmF0dF9pcDsKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9JUEFDX01EQ1gpOworCWRoLT5jLm1zZ19kaXNjciA9IEFCSVNfUlNMX01ESVNDX0lQQUNDRVNTOworCWRoLT5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisKKwkvKiB3ZSBuZWVkIHRvIHN0b3JlIHRoZXNlIG5vdyBhcyBNRENYX0FDSyBkb2VzIG5vdCByZXR1cm4gdGhlbSA6KCAqLworCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkMiA9IHJ0cF9wYXlsb2FkMjsKKwlsY2hhbi0+YWJpc19pcC5jb25uZWN0X3BvcnQgPSBwb3J0OworCWxjaGFuLT5hYmlzX2lwLmNvbm5lY3RfaXAgPSBpcDsKKworCS8qIDB4MC0gPT0gYm90aCBkaXJlY3Rpb25zLCAweC0xID09IEVGUiBjb2RlYyAqLworCWxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlID0gMHgwMCB8IGlwYV9zbW9kX3NfZm9yX2xjaGFuKGxjaGFuKTsKKworCWlhLnNfYWRkciA9IGh0b25sKGlwKTsKKwlERUJVR1AoRFJTTCwgIiVzIElQQUNfTURDWCBJUD0lcyBQT1JUPSVkIFJUUF9QQVlMT0FEMj0lZCBDT05OX0lEPSVkICIKKwkJInNwZWVjaF9tb2RlPTB4JTAyeFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pLCBpbmV0X250b2EoaWEpLCBwb3J0LAorCQlydHBfcGF5bG9hZDIsIGxjaGFuLT5hYmlzX2lwLmNvbm5faWQsIGxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlKTsKKworCW1zZ2JfdHYxNl9wdXQobXNnLCBSU0xfSUVfSVBBQ19DT05OX0lELCBsY2hhbi0+YWJpc19pcC5jb25uX2lkKTsKKwltc2diX3ZfcHV0KG1zZywgUlNMX0lFX0lQQUNfUkVNT1RFX0lQKTsKKwlhdHRfaXAgPSAodV9pbnQzMl90ICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKGlwKSk7CisJKmF0dF9pcCA9IGlhLnNfYWRkcjsKKwltc2diX3R2MTZfcHV0KG1zZywgUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlQsIHBvcnQpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0lQQUNfU1BFRUNIX01PREUsIGxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlKTsKKwlpZiAocnRwX3BheWxvYWQyKQorCQltc2diX3R2X3B1dChtc2csIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FEMiwgcnRwX3BheWxvYWQyKTsKKwkKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogdGVsbCBCVFMgdG8gY29ubmVjdCBSVFAgc3RyZWFtIHRvIG91ciBsb2NhbCBSVFAgc29ja2V0ICovCitpbnQgcnNsX2lwYWNjX21kY3hfdG9fcnRwc29jayhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgcnRwX3NvY2tldCAqcnMgPSBsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0OworCWludCByYzsKKworCXJjID0gcnNsX2lwYWNjX21kY3gobGNoYW4sIG50b2hsKHJzLT5ydHAuc2luX2xvY2FsLnNpbl9hZGRyLnNfYWRkciksCisJCQkJbnRvaHMocnMtPnJ0cC5zaW5fbG9jYWwuc2luX3BvcnQpLAorCQkJLyogRklYTUU6IHVzZSBSVFAgcGF5bG9hZCBvZiBib3VuZCBzb2NrZXQsIG5vdCBCVFMqLworCQkJCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkMik7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCByc2xfaXBhY2NfcGRjaF9hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9JUEFDX1BEQ0hfQUNUKTsKKwlkaC0+Yy5tc2dfZGlzY3IgPSBBQklTX1JTTF9NRElTQ19ERURfQ0hBTjsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJREVCVUdQKERSU0wsICIlcyBJUEFDX1BEQ0hfQUNUXG4iLCBnc21fbGNoYW5fbmFtZShsY2hhbikpOworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfaXBhY2NfY3JjeF9hY2soc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0djsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisKKwkvKiB0aGUgQlRTIGhhcyBhY2tub3dsZWRnZWQgYSBsb2NhbCBiaW5kLCBpdCBub3cgdGVsbHMgdXMgdGhlIElQCisJKiBhZGRyZXNzIGFuZCBwb3J0IG51bWJlciB0byB3aGljaCBpdCBoYXMgYm91bmQgdGhlIGdpdmVuIGxvZ2ljYWwKKwkqIGNoYW5uZWwgKi8KKworCXJzbF90bHZfcGFyc2UoJnR2LCBkaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqZGgpKTsKKwlpZiAoIVRMVlBfUFJFU0VOVCgmdHYsIFJTTF9JRV9JUEFDX0xPQ0FMX1BPUlQpIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnR2LCBSU0xfSUVfSVBBQ19MT0NBTF9JUCkgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCgmdHYsIFJTTF9JRV9JUEFDX0NPTk5fSUQpKSB7CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJtYW5kYXRvcnkgSUUgbWlzc2luZyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpcGFjX3BhcnNlX3J0cChsY2hhbiwgJnR2KTsKKworCS8qIGluIGNhc2Ugd2UgZG9uJ3QgdXNlIGRpcmVjdCBCVFMtdG8tQlRTIFJUUCAqLworCWlmICghaXBhY2NfcnRwX2RpcmVjdCkgeworCQlpbnQgcmM7CisJCS8qIHRoZSBCVFMgaGFzIHN1Y2Nlc3NmdWxseSBib3VuZCBhIFRDSCB0byBhIGxvY2FsIGlwL3BvcnQsCisJCSAqIHdoaWNoIG1lYW5zIHdlIGNhbiBjb25uZWN0IG91ciBVRFAgc29ja2V0IHRvIGl0ICovCisJCWlmIChsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0KSB7CisJCQlydHBfc29ja2V0X2ZyZWUobGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCk7CisJCQlsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0ID0gTlVMTDsKKwkJfQorCisJCWxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQgPSBydHBfc29ja2V0X2NyZWF0ZSgpOworCQlpZiAoIWxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpCisJCQlnb3RvIG91dF9lcnI7CisKKwkJcmMgPSBydHBfc29ja2V0X2Nvbm5lY3QobGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwKKwkJCQkgICBsY2hhbi0+YWJpc19pcC5ib3VuZF9pcCwKKwkJCQkgICBsY2hhbi0+YWJpc19pcC5ib3VuZF9wb3J0KTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfQUJJU0lQLCBTX0FCSVNJUF9DUkNYX0FDSywgbXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK291dF9lcnI6CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfaXBhY2NfbWRjeF9hY2soc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0djsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisKKwkvKiB0aGUgQlRTIGhhcyBhY2tub3dsZWRnZWQgYSByZW1vdGUgY29ubmVjdCByZXF1ZXN0IGFuZAorCSAqIGl0IG5vdyB0ZWxscyB1cyB0aGUgSVAgYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIgdG8gd2hpY2ggaXQgaGFzCisJICogY29ubmVjdGVkIHRoZSBnaXZlbiBsb2dpY2FsIGNoYW5uZWwgKi8KKworCXJzbF90bHZfcGFyc2UoJnR2LCBkaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqZGgpKTsKKwlpcGFjX3BhcnNlX3J0cChsY2hhbiwgJnR2KTsKKwlkaXNwYXRjaF9zaWduYWwoU1NfQUJJU0lQLCBTX0FCSVNJUF9NRENYX0FDSywgbXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX3JzbF9yeF9pcGFjY19kbGN4X2luZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHR2OworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gbXNnLT5sY2hhbjsKKworCXJzbF90bHZfcGFyc2UoJnR2LCBkaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqZGgpKTsKKworCWlmIChUTFZQX1BSRVNFTlQoJnR2LCBSU0xfSUVfQ0FVU0UpKQorCQlwcmludF9yc2xfY2F1c2UoTE9HTF9ERUJVRywgVExWUF9WQUwoJnR2LCBSU0xfSUVfQ0FVU0UpLAorCQkJCVRMVlBfTEVOKCZ0diwgUlNMX0lFX0NBVVNFKSk7CisKKwkvKiB0aGUgQlRTIHRlbGxzIHVzIGEgUlRQIHN0cmVhbSBoYXMgYmVlbiBkaXNjb25uZWN0ZWQgKi8KKwlpZiAobGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkgeworCQlydHBfc29ja2V0X2ZyZWUobGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCk7CisJCWxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQgPSBOVUxMOworCX0KKworCWRpc3BhdGNoX3NpZ25hbChTU19BQklTSVAsIFNfQUJJU0lQX0RMQ1hfSU5ELCBtc2ctPmxjaGFuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2lwYWNjKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX3JsbF9oZHIgKnJsbGggPSBtc2diX2wyKG1zZyk7CisJY2hhciAqdHNfbmFtZTsKKwlpbnQgcmMgPSAwOworCisJbXNnLT5sY2hhbiA9IGxjaGFuX2xvb2t1cChtc2ctPnRyeCwgcmxsaC0+Y2hhbl9ucik7CisJdHNfbmFtZSA9IGdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pOworCQorCXN3aXRjaCAocmxsaC0+Yy5tc2dfdHlwZSkgeworCWNhc2UgUlNMX01UX0lQQUNfQ1JDWF9BQ0s6CisJCURFQlVHUChEUlNMLCAiJXMgSVBBQ19DUkNYX0FDSyAiLCB0c19uYW1lKTsKKwkJcmMgPSBhYmlzX3JzbF9yeF9pcGFjY19jcmN4X2Fjayhtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX0NSQ1hfTkFDSzoKKwkJLyogc29tZWhvdyB0aGUgQlRTIHdhcyB1bmFibGUgdG8gYmluZCB0aGUgbGNoYW4gdG8gaXRzIGxvY2FsCisJCSAqIHBvcnQ/IT8gKi8KKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgSVBBQ19DUkNYX05BQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX01EQ1hfQUNLOgorCQkvKiB0aGUgQlRTIHRlbGxzIHVzIHRoYXQgYSBjb25uZWN0IG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCAqLworCQlERUJVR1AoRFJTTCwgIiVzIElQQUNfTURDWF9BQ0sgIiwgdHNfbmFtZSk7CisJCXJjID0gYWJpc19yc2xfcnhfaXBhY2NfbWRjeF9hY2sobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19NRENYX05BQ0s6CisJCS8qIHNvbWVob3cgdGhlIEJUUyB3YXMgdW5hYmxlIHRvIGNvbm5lY3QgdGhlIGxjaGFuIHRvIGEgcmVtb3RlCisJCSAqIHBvcnQgKi8KKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgSVBBQ19NRENYX05BQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX0RMQ1hfSU5EOgorCQlERUJVR1AoRFJTTCwgIiVzIElQQUNfRExDWF9JTkQgIiwgdHNfbmFtZSk7CisJCXJjID0gYWJpc19yc2xfcnhfaXBhY2NfZGxjeF9pbmQobXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIlVua25vd24gaXAuYWNjZXNzIG1zZ190eXBlIDB4JTAyeFxuIiwKKwkJCXJsbGgtPmMubXNnX3R5cGUpOworCQlicmVhazsKKwl9CisJREVCVUdQQyhEUlNMLCAiXG4iKTsKKworCXJldHVybiByYzsKK30KKworCisvKiBFbnRyeS1wb2ludCB3aGVyZSBMMiBSU0wgZnJvbSBCVFMgZW50ZXJzICovCitpbnQgYWJpc19yc2xfcmN2bXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZykJOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKHJzbGgtPm1zZ19kaXNjciAmIDB4ZmUpIHsKKwljYXNlIEFCSVNfUlNMX01ESVNDX1JMTDoKKwkJcmMgPSBhYmlzX3JzbF9yeF9ybGwobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX1JTTF9NRElTQ19ERURfQ0hBTjoKKwkJcmMgPSBhYmlzX3JzbF9yeF9kY2hhbihtc2cpOworCQlicmVhazsKKwljYXNlIEFCSVNfUlNMX01ESVNDX0NPTV9DSEFOOgorCQlyYyA9IGFiaXNfcnNsX3J4X2NjaGFuKG1zZyk7CisJCWJyZWFrOworCWNhc2UgQUJJU19SU0xfTURJU0NfVFJYOgorCQlyYyA9IGFiaXNfcnNsX3J4X3RyeChtc2cpOworCQlicmVhazsKKwljYXNlIEFCSVNfUlNMX01ESVNDX0xPQzoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgInVuaW1wbGVtZW50ZWQgUlNMIG1zZyBkaXNjIDB4JTAyeFxuIiwKKwkJCXJzbGgtPm1zZ19kaXNjcik7CisJCWJyZWFrOworCWNhc2UgQUJJU19SU0xfTURJU0NfSVBBQ0NFU1M6CisJCXJjID0gYWJpc19yc2xfcnhfaXBhY2MobXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgInVua25vd24gUlNMIG1lc3NhZ2UgZGlzY3JpbWluYXRvciAiCisJCQkiMHglMDJ4XG4iLCByc2xoLT5tc2dfZGlzY3IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbXNnYl9mcmVlKG1zZyk7CisJcmV0dXJuIHJjOworfQorCisvKiBGcm9tIFRhYmxlIDEwLjUuMzMgb2YgR1NNIDA0LjA4ICovCitpbnQgcnNsX251bWJlcl9vZl9wYWdpbmdfc3ViY2hhbm5lbHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlpZiAoYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmNjY2hfY29uZiA9PSBSU0xfQkNDSF9DQ0NIX0NPTkZfMV9DKSB7CisJCXJldHVybiBNQVgoMSwgKDMgLSBidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MuYnNfYWdfYmxrc19yZXMpKQorCQkJKiAoYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmJzX3BhX21mcm1zICsgMik7CisJfSBlbHNlIHsKKwkJcmV0dXJuICg5IC0gYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmJzX2FnX2Jsa3NfcmVzKQorCQkJKiAoYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmJzX3BhX21mcm1zICsgMik7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnMxMV9jb25maWcuYyBiL29wZW5ic2Mvc3JjL2JzMTFfY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg0ZWMyYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2JzMTFfY29uZmlnLmMKQEAgLTAsMCArMSw4NzIgQEAKKy8qIFNpZW1lbnMgQlMtMTEgbWljcm9CVFMgY29uZmlndXJhdGlvbiB0b29sICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBiYXNlZCBvbiBpZGVhcyAoYnV0IG5vdCBjb2RlKSBvZiBCUzExQ29uZmlnIAorICogKEMpIDIwMDkgYnkgRGlldGVyIFNwYWFyIDxzcGFhckBtaXJpZGVyLmF1Z3VzdGEuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcnMyMzIuaD4KKworLyogc3RhdGUgb2Ygb3VyIGJzMTFfY29uZmlnIGFwcGxpY2F0aW9uICovCitlbnVtIGJzMTFjZmdfc3RhdGUgeworCVNUQVRFX05PTkUsCisJU1RBVEVfTE9HT05fV0FJVCwKKwlTVEFURV9MT0dPTl9BQ0ssCisJU1RBVEVfU1dMT0FELAorCVNUQVRFX1FVRVJZLAorfTsKK3N0YXRpYyBlbnVtIGJzMTFjZmdfc3RhdGUgYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX05PTkU7CitzdGF0aWMgY2hhciAqY29tbWFuZCwgKnZhbHVlOworc3RydWN0IHRpbWVyX2xpc3Qgc3RhdHVzX3RpbWVyOworCitzdGF0aWMgY29uc3QgdV9pbnQ4X3Qgb2JqX2xpX2F0dHJbXSA9IHsgCisJTk1fQVRUX0JTMTFfQklUX0VSUl9USEVTSCwgMHgwOSwgMHgwMCwKKwlOTV9BVFRfQlMxMV9MMV9QUk9UX1RZUEUsIDB4MDAsIAorCU5NX0FUVF9CUzExX0xJTkVfQ0ZHLCAweDAwLAorfTsKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBvYmpfYmJzaWcwX2F0dHJbXSA9IHsKKwlOTV9BVFRfQlMxMV9SU1NJX09GRlMsIDB4MDIsIDB4MDAsIDB4MDAsCisJTk1fQVRUX0JTMTFfRElWRVJTSVRZLCAweDAxLCAweDAwLAorfTsKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBvYmpfcGEwX2F0dHJbXSA9IHsKKwlOTV9BVFRfQlMxMV9UWFBXUiwgMHgwMSwgQlMxMV9UUlhfUE9XRVJfR1NNXzMwbVcsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKnRyeDFfcGFzc3dvcmQgPSAiMTExMTExMTExMSI7CisjZGVmaW5lIFRFSV9PTUwJMjUKKworc3RhdGljIGNvbnN0IHVfaW50OF90IHRvb19mYXN0W10gPSB7IDB4MTIsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIgfTsKKworc3RhdGljIHN0cnVjdCBsb2dfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OworCisvKiBkdW1teSBmdW5jdGlvbiB0byBrZWVwIGdzbV9kYXRhLmMgaGFwcHkgKi8KK3N0cnVjdCBjb3VudGVyICpjb3VudGVyX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBoYW5kbGVfc2VyaWFsX21zZyhzdHJ1Y3QgbXNnYiAqcnhfbXNnKTsKKworLyogY3JlYXRlIGFsbCBvYmplY3RzIGZvciBhbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyBpbnQgY3JlYXRlX29iamVjdHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlmcHJpbnRmKHN0ZG91dCwgIkNyYXRpbmcgT2JqZWN0cyBmb3IgbWluaW1hbCBjb25maWdcbiIpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfTEksIDAsIHNpemVvZihvYmpfbGlfYXR0ciksCisJCQkJICAgb2JqX2xpX2F0dHIpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfR1BTVSwgMCwgMCwgTlVMTCk7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9BTENPLCAwLCAwLCBOVUxMKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX0NDTEssIDAsIDAsIE5VTEwpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfQkJTSUcsIDAsCisJCQkJICAgc2l6ZW9mKG9ial9iYnNpZzBfYXR0ciksIG9ial9iYnNpZzBfYXR0cik7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9QQSwgMCwKKwkJCQkgICBzaXplb2Yob2JqX3BhMF9hdHRyKSwgb2JqX3BhMF9hdHRyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKGJ0cywgMCk7CisJYWJpc19ubV9iczExX2NyZWF0ZV9lbnZhQlRTRShidHMsIDEpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfZW52YUJUU0UoYnRzLCAyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKGJ0cywgMyk7CisKKwlhYmlzX25tX2JzMTFfY29ubl9vbWxfdGVpKGJ0cywgMCwgMSwgMHhmZiwgVEVJX09NTCk7CisKKwlhYmlzX25tX2JzMTFfc2V0X3RyeF9wb3dlcihidHMtPmMwLCBCUzExX1RSWF9QT1dFUl9HU01fMzBtVyk7CisJCisJc2xlZXAoMSk7CisKKwlhYmlzX25tX2JzMTFfc2V0X3RyeDFfcHcoYnRzLCB0cngxX3Bhc3N3b3JkKTsKKworCXNsZWVwKDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX3RyeDEoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwl1X2ludDhfdCBiYnNpZzFfYXR0cltzaXplb2Yob2JqX2Jic2lnMF9hdHRyKSsxMl07CisJdV9pbnQ4X3QgKmN1ciA9IGJic2lnMV9hdHRyOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgMSk7CisKKwlpZiAoIXRyeCkKKwkJdHJ4ID0gZ3NtX2J0c190cnhfYWxsb2MoYnRzKTsKKworCWZwcmludGYoc3Rkb3V0LCAiQ3JhdGluZyBPYmplY3RzIGZvciBUUlgxXG4iKTsKKworCWFiaXNfbm1fYnMxMV9zZXRfdHJ4MV9wdyhidHMsIHRyeDFfcGFzc3dvcmQpOworCisJc2xlZXAoMSk7CisKKwljdXIgPSB0bHZfcHV0KGN1ciwgTk1fQVRUX0JTMTFfUEFTU1dPUkQsIDEwLAorCQkgICAgICAodV9pbnQ4X3QgKil0cngxX3Bhc3N3b3JkKTsKKwltZW1jcHkoY3VyLCBvYmpfYmJzaWcwX2F0dHIsIHNpemVvZihvYmpfYmJzaWcwX2F0dHIpKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX0JCU0lHLCAxLAorCQkJCSAgIHNpemVvZihiYnNpZzFfYXR0ciksIGJic2lnMV9hdHRyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX1BBLCAxLAorCQkJCSAgIHNpemVvZihvYmpfcGEwX2F0dHIpLCBvYmpfcGEwX2F0dHIpOworCWFiaXNfbm1fYnMxMV9zZXRfdHJ4X3Bvd2VyKHRyeCwgQlMxMV9UUlhfUE9XRVJfR1NNXzMwbVcpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqc2VyaWFsX3BvcnQgPSAiL2Rldi90dHlVU0IwIjsKK3N0YXRpYyBjaGFyICpmbmFtZV9zYWZldHkgPSAiQlRTQk1DNzYuU1dJIjsKK3N0YXRpYyBjaGFyICpmbmFtZV9zb2Z0d2FyZSA9ICJIUzAxMTEwNi5TV0wiOworc3RhdGljIGludCBkZWxheV9tcyA9IDA7CitzdGF0aWMgaW50IHdpbl9zaXplID0gODsKK3N0YXRpYyBpbnQgcGFyYW1fZGlzY29ubmVjdCA9IDA7CitzdGF0aWMgaW50IHBhcmFtX3Jlc3RhcnQgPSAwOworc3RhdGljIGludCBwYXJhbV9mb3JjZWQgPSAwOworc3RhdGljIHN0cnVjdCBnc21fYnRzICpnX2J0czsKKworc3RhdGljIGludCBmaWxlX2lzX3JlYWRhYmxlKGNvbnN0IGNoYXIgKmZuYW1lKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCXJjID0gc3RhdChmbmFtZSwgJnN0KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gMDsKKworCWlmIChTX0lTUkVHKHN0LnN0X21vZGUpICYmIChzdC5zdF9tb2RlICYgU19JUlVTUikpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGVyY2VudDsKK3N0YXRpYyBpbnQgcGVyY2VudF9vbGQ7CisKKy8qIGNhbGxiYWNrIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgQUJJUyBPTUwgY29kZSAqLworc3RhdGljIGludCBzd2xvYWRfY2Jmbih1bnNpZ25lZCBpbnQgaG9vaywgdW5zaWduZWQgaW50IGV2ZW50LCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkgICAgICAgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pCit7CisJaWYgKGhvb2sgIT0gR1NNX0hPT0tfTk1fU1dMT0FEKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5NX01UX0xPQURfSU5JVF9BQ0s6CisJCWZwcmludGYoc3Rkb3V0LCAiU29mdHdhcmUgTG9hZCBJbml0aWF0ZSBBQ0tcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfSU5JVF9OQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBTb2Z0d2FyZSBMb2FkIEluaXRpYXRlIE5BQ0tcbiIpOworCQlleGl0KDUpOworCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfRU5EX0FDSzoKKwkJaWYgKGRhdGEpIHsKKwkJCS8qIHdlIGRpZCBhIHNhZmV0eSBsb2FkIGFuZCBtdXN0IGFjdGl2YXRlIGl0ICovCisJCQlhYmlzX25tX3NvZnR3YXJlX2FjdGl2YXRlKGdfYnRzLCBmbmFtZV9zYWZldHksCisJCQkJCQkgIHN3bG9hZF9jYmZuLCBnX2J0cyk7CisJCQlzbGVlcCg1KTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfRU5EX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IFNvZnR3YXJlIExvYWQgRW5kIE5BQ0tcbiIpOworCQlleGl0KDMpOworCQlicmVhazsKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IEFjdGl2YXRlIFNvZnR3YXJlIE5BQ0tcbiIpOworCQlleGl0KDQpOworCQlicmVhazsKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX0FDSzoKKwkJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX05PTkU7CisJCQorCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfU0VHX0FDSzoKKwkJcGVyY2VudCA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZF9zdGF0dXMoZ19idHMpOworCQlpZiAocGVyY2VudCA+IHBlcmNlbnRfb2xkKQorCQkJcHJpbnRmKCJTb2Z0d2FyZSBEb3dubG9hZCBQcm9ncmVzczogJWQlJVxuIiwgcGVyY2VudCk7CisJCXBlcmNlbnRfb2xkID0gcGVyY2VudDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYnMxMV9saW5rX3N0YXRlW10gPSB7CisJWzB4MDBdCT0gIkRvd24iLAorCVsweDAxXQk9ICJVcCIsCisJWzB4MDJdCT0gIlJlc3RvcmluZyIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbGlua3N0YXRlX25hbWUodV9pbnQ4X3QgbGlua3N0YXRlKQoreworCWlmIChsaW5rc3RhdGUgPiBBUlJBWV9TSVpFKGJzMTFfbGlua19zdGF0ZSkpCisJCXJldHVybiAiVW5rbm93biI7CisKKwlyZXR1cm4gYnMxMV9saW5rX3N0YXRlW2xpbmtzdGF0ZV07Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICptYmNjdV9sb2FkW10gPSB7CisJWzBdCT0gIk5vIExvYWQiLAorCVsxXQk9ICJMb2FkIEJUU0NBQyIsCisJWzJdCT0gIkxvYWQgQlRTRFJYIiwKKwlbM10JPSAiTG9hZCBCVFNCQlgiLAorCVs0XQk9ICJMb2FkIEJUU0FSQyIsCisJWzVdCT0gIkxvYWQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm1iY2N1X2xvYWRfbmFtZSh1X2ludDhfdCBsaW5rc3RhdGUpCit7CisJaWYgKGxpbmtzdGF0ZSA+IEFSUkFZX1NJWkUobWJjY3VfbG9hZCkpCisJCXJldHVybiAiVW5rbm93biI7CisKKwlyZXR1cm4gbWJjY3VfbG9hZFtsaW5rc3RhdGVdOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYnRzX3BoYXNlX25hbWUodV9pbnQ4X3QgcGhhc2UpCit7CisJc3dpdGNoIChwaGFzZSkgeworCWNhc2UgQlMxMV9TVEFURV9XQVJNX1VQOgorCWNhc2UgQlMxMV9TVEFURV9XQVJNX1VQXzI6CisJCXJldHVybiAiV2FybSBVcCI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9MT0FEX1NNVV9TQUZFVFk6CisJCXJldHVybiAiTG9hZCBTTVUgU2FmZXR5IjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX0xPQURfU01VX0lOVEVOREVEOgorCQlyZXR1cm4gIkxvYWQgU01VIEludGVuZGVkIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX0xPQURfTUJDQ1U6CisJCXJldHVybiAiTG9hZCBNQkNDVSI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9TT0ZUV0FSRV9SUUQ6CisJCXJldHVybiAiU29mdHdhcmUgcmVxdWlyZWQiOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfV0FJVF9NSU5fQ0ZHOgorCWNhc2UgQlMxMV9TVEFURV9XQUlUX01JTl9DRkdfMjoKKwkJcmV0dXJuICJXYWl0IG1pbmltYWwgY29uZmlnIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX01BSU5URU5BTkNFOgorCQlyZXR1cm4gIk1haW50ZW5hbmNlIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX05PUk1BTDoKKwkJcmV0dXJuICJOb3JtYWwiOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfQUJJU19MT0FEOgorCQlyZXR1cm4gIkFiaXMgbG9hZCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAiVW5rbm93biI7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnRyeF9wb3dlcl9uYW1lKHVfaW50OF90IHB3cikKK3sKKwlzd2l0Y2ggKHB3cikgeworCWNhc2UgQlMxMV9UUlhfUE9XRVJfR1NNXzJXOgkKKwkJcmV0dXJuICIyVyAoR1NNKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9HU01fMjUwbVc6CisJCXJldHVybiAiMjUwbVcgKEdTTSkiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfR1NNXzgwbVc6CisJCXJldHVybiAiODBtVyAoR1NNKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9HU01fMzBtVzoKKwkJcmV0dXJuICIzMG1XIChHU00pIjsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0RDU18zVzoKKwkJcmV0dXJuICIzVyAoRENTKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9EQ1NfMVc2OgorCQlyZXR1cm4gIjEuNlcgKERDUykiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfRENTXzUwMG1XOgorCQlyZXR1cm4gIjUwMG1XIChEQ1MpIjsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0RDU18xNjBtVzoKKwkJcmV0dXJuICIxNjBtVyAoRENTKSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIHZhbHVlIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpwbGxfbW9kZV9uYW1lKHVfaW50OF90IG1vZGUpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBCUzExX0xJX1BMTF9MT0NLRUQ6CisJCXJldHVybiAiRTEgTG9ja2VkIjsKKwljYXNlIEJTMTFfTElfUExMX1NUQU5EQUxPTkU6CisJCXJldHVybiAiU3RhbmRhbG9uZSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjY2xrX2FjY19uYW1lKHVfaW50OF90IGFjYykKK3sKKwlzd2l0Y2ggKGFjYykgeworCWNhc2UgMDoKKwkJLyogT3V0IG9mIHRoZSBkZW1hbmRlZCArLy0gMC4wNXBwbSAqLworCQlyZXR1cm4gIk1lZGl1bSI7CisJY2FzZSAxOgorCQkvKiBTeW5jaHJvbml6ZWQgd2l0aCBBYmlzLCB3aXRoaW4gZGVtYW5kZWQgdG9sZXJhbmNlICsvLSAwLjA1cHBtICovCisJCXJldHVybiAiSGlnaCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpvYmpfbmFtZShzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2gpCit7CisJc3RhdGljIGNoYXIgcmV0YnVmWzI1Nl07CisKKwlyZXRidWZbMF0gPSAwOworCisJc3dpdGNoIChmb2gtPm9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfQlMxMToKKwkJc3RyY2F0KHJldGJ1ZiwgIkJTMTEgIik7CisJCXN3aXRjaCAoZm9oLT5vYmpfaW5zdC5idHNfbnIpIHsKKwkJY2FzZSBCUzExX09CSl9QQToKKwkJCXNwcmludGYocmV0YnVmK3N0cmxlbihyZXRidWYpLCAiUG93ZXIgQW1wbGlmaWVyICVkICIsCisJCQkJZm9oLT5vYmpfaW5zdC50c19ucik7CisJCQlicmVhazsKKwkJY2FzZSBCUzExX09CSl9MSToKKwkJCXNwcmludGYocmV0YnVmK3N0cmxlbihyZXRidWYpLCAiTGluZSBJbnRlcmZhY2UgIik7CisJCQlicmVhazsKKwkJY2FzZSBCUzExX09CSl9DQ0xLOgorCQkJc3ByaW50ZihyZXRidWYrc3RybGVuKHJldGJ1ZiksICJDQ0xLICIpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19TSVRFX01BTkFHRVI6CisJCXN0cmNhdChyZXRidWYsICJTSVRFIE1BTkFHRVIgIik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0YnVmOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdGF0ZShzdHJ1Y3QgdGx2X3BhcnNlZCAqdHApCit7CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSkgeworCQl1X2ludDhfdCBwaGFzZSwgbWJjY3U7CisJCWlmIChUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSA+PSAxKSB7CisJCQlwaGFzZSA9ICpUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKTsKKwkJCXByaW50ZigiUEhBU0U6ICV1ICUtMjBzICIsIHBoYXNlICYgMHhmLAorCQkJCWJ0c19waGFzZV9uYW1lKHBoYXNlKSk7CisJCX0KKwkJaWYgKFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9CVFNfU1RBVEUpID49IDIpIHsKKwkJCW1iY2N1ID0gKihUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSsxKTsKKwkJCXByaW50ZigiTUJDQ1UwOiAlLTExcyBNQkNDVTE6ICUtMTFzICIsCisJCQkJbWJjY3VfbG9hZF9uYW1lKG1iY2N1ICYgMHhmKSwgbWJjY3VfbG9hZF9uYW1lKG1iY2N1ID4+IDQpKTsKKwkJfQorCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9FMV9TVEFURSkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX0UxX1NUQVRFKSA+PSAxKSB7CisJCXVfaW50OF90IGUxX3N0YXRlID0gKlRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9FMV9TVEFURSk7CisJCXByaW50ZigiQWJpcy1saW5rOiAlLTlzICIsIGxpbmtzdGF0ZV9uYW1lKGUxX3N0YXRlICYgMHhmKSk7CisJfQorCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIGludCBwcmludF9hdHRyKHN0cnVjdCB0bHZfcGFyc2VkICp0cCkKK3sKKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTCkpIHsKKwkJcHJpbnRmKCJcdEJTLTExIEVTTiBQQ0IgU2VyaWFsIE51bWJlcjogJXNcbiIsCisJCQlUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfRVNOX1BDQl9TRVJJQUwpKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk8pKSB7CisJCXByaW50ZigiXHRCUy0xMSBFU04gSGFyZHdhcmUgQ29kZSBOdW1iZXI6ICVzXG4iLAorCQkJVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PKSs2KTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk8pKSB7CisJCXByaW50ZigiXHRCUy0xMSBFU04gRmlybXdhcmUgQ29kZSBOdW1iZXI6ICVzXG4iLAorCQkJVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PKSs2KTsKKwl9CisjaWYgMAorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0JPT1RfU1dfVkVSUykpIHsKKwkJcHJpbnRmKCJCUy0xMSBCb290IFNvZnR3YXJlIFZlcnNpb246ICVzXG4iLAorCQkJVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0JPT1RfU1dfVkVSUykrNik7CisJfQorI2VuZGlmCisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0FCSVNfQ0hBTk5FTCkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9BQklTX0NIQU5ORUwpID49IDMpIHsKKwkJY29uc3QgdV9pbnQ4X3QgKmNoYW4gPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0FCSVNfQ0hBTk5FTCk7CisJCXByaW50ZigiXHRFMSBDaGFubmVsOiBQb3J0PSV1IFRpbWVzbG90PSV1ICIsCisJCQljaGFuWzBdLCBjaGFuWzFdKTsKKwkJaWYgKGNoYW5bMl0gPT0gMHhmZikKKwkJCXByaW50ZigiKEZ1bGwgU2xvdClcbiIpOworCQllbHNlCisJCQlwcmludGYoIlN1YnNsb3Q9JXVcbiIsIGNoYW5bMl0pOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfVEVJKSkKKwkJcHJpbnRmKCJcdFRFSTogJWRcbiIsICpUTFZQX1ZBTCh0cCwgTk1fQVRUX1RFSSkpOworCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX1RYUFdSKSAmJgorCSAgICBUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfVFhQV1IpID49IDEpIHsKKwkJcHJpbnRmKCJcdFRSWCBQb3dlcjogJXNcbiIsCisJCQl0cnhfcG93ZXJfbmFtZSgqVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX1RYUFdSKSkpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9QTExfTU9ERSkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX1BMTF9NT0RFKSA+PSAxKSB7CisJCXByaW50ZigiXHRQTEwgTW9kZTogJXNcbiIsCisJCQlwbGxfbW9kZV9uYW1lKCpUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfUExMX01PREUpKSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX1BMTCkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX1BMTCkgPj0gNCkgeworCQljb25zdCB1X2ludDhfdCAqdnAgPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfUExMKTsKKwkJcHJpbnRmKCJcdFBMTCBTZXQgVmFsdWU9JWQsIFdvcmsgVmFsdWU9JWRcbiIsCisJCQl2cFswXSA8PCA4IHwgdnBbMV0sIHZwWzJdIDw8IDggfCB2cFszXSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1kpICYmCisJICAgIFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9DQ0xLX0FDQ1VSQUNZKSA+PSAxKSB7CisJCWNvbnN0IHVfaW50OF90ICphY2MgPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWSk7CisJCXByaW50ZigiXHRDQ0xLIEFjY3VyYWN5OiAlcyAoJWQpXG4iLCBjY2xrX2FjY19uYW1lKCphY2MpLCAqYWNjKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfQ0NMS19UWVBFKSAmJgorCSAgICBUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfQ0NMS19UWVBFKSA+PSAxKSB7CisJCWNvbnN0IHVfaW50OF90ICphY2MgPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQ0NMS19UWVBFKTsKKwkJcHJpbnRmKCJcdENDTEsgVHlwZT0lZFxuIiwgKmFjYyk7CisJfQorCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY21kX3F1ZXJ5KHZvaWQpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSBnX2J0cy0+YzA7CisKKwliczExY2ZnX3N0YXRlID0gU1RBVEVfUVVFUlk7CisJYWJpc19ubV9iczExX2dldF9zZXJubyhnX2J0cyk7CisJYWJpc19ubV9iczExX2dldF9vbWxfdGVpX3RzKGdfYnRzKTsKKwlhYmlzX25tX2JzMTFfZ2V0X3BsbF9tb2RlKGdfYnRzKTsKKwlhYmlzX25tX2JzMTFfZ2V0X2NjbGsoZ19idHMpOworCWFiaXNfbm1fYnMxMV9nZXRfdHJ4X3Bvd2VyKHRyeCk7CisJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGdfYnRzLCAxKTsKKwlpZiAodHJ4KQorCQlhYmlzX25tX2JzMTFfZ2V0X3RyeF9wb3dlcih0cngpOworCXNsZWVwKDEpOworCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwljb21tYW5kID0gTlVMTDsKK30KKworLyogaGFuZGxlIGEgcmVzcG9uc2UgZnJvbSB0aGUgQlRTIHRvIGEgR0VUIFNUQVRFIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3N0YXRlX3Jlc3AoZW51bSBhYmlzX2JzMTFfcGhhc2Ugc3RhdGUpCit7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEJTMTFfU1RBVEVfV0FSTV9VUDoKKwljYXNlIEJTMTFfU1RBVEVfTE9BRF9TTVVfU0FGRVRZOgorCWNhc2UgQlMxMV9TVEFURV9MT0FEX1NNVV9JTlRFTkRFRDoKKwljYXNlIEJTMTFfU1RBVEVfTE9BRF9NQkNDVToKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX1NPRlRXQVJFX1JRRDoKKwkJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX1NXTE9BRDsKKwkJLyogc2VuZCBzYWZldHkgbG9hZC4gVXNlIGdfYnRzIGFzIHByaXZhdGUgJ3BhcmFtJworCQkgKiBhcmd1bWVudCwgc28gb3VyIHN3bG9hZF9jYmZuIGNhbiBkaXN0aW5ndWlzaAorCQkgKiBhIHNhZmV0eSBsb2FkIGZyb20gYSByZWd1bGFyIHNvZnR3YXJlICovCisJCWlmIChmaWxlX2lzX3JlYWRhYmxlKGZuYW1lX3NhZmV0eSkpCisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZChnX2J0cywgZm5hbWVfc2FmZXR5LAorCQkJCQkJICAgd2luX3NpemUsIHBhcmFtX2ZvcmNlZCwKKwkJCQkJCSAgIHN3bG9hZF9jYmZuLCBnX2J0cyk7CisJCWVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAiTm8gdmFsaWQgU2FmZXR5IExvYWQgZmlsZSBcIiVzXCJcbiIsCisJCQkJZm5hbWVfc2FmZXR5KTsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX1dBSVRfTUlOX0NGRzoKKwljYXNlIEJTMTFfU1RBVEVfV0FJVF9NSU5fQ0ZHXzI6CisJCWJzMTFjZmdfc3RhdGUgPSBTVEFURV9TV0xPQUQ7CisJCXJjID0gY3JlYXRlX29iamVjdHMoZ19idHMpOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfTUFJTlRFTkFOQ0U6CisJCWlmIChjb21tYW5kKSB7CisJCQlpZiAoIXN0cmNtcChjb21tYW5kLCAiZGlzY29ubmVjdCIpKQorCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInJlY29ubmVjdCIpKQorCQkJCXJjID0gYWJpc19ubV9iczExX2JzY19kaXNjb25uZWN0KGdfYnRzLCAxKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInNvZnR3YXJlIikKKwkJCSAgICAmJiBiczExY2ZnX3N0YXRlICE9IFNUQVRFX1NXTE9BRCkgeworCQkJCWJzMTFjZmdfc3RhdGUgPSBTVEFURV9TV0xPQUQ7CisJCQkJLyogc2VuZCBzb2Z0d2FyZSAoRklYTUU6IG92ZXIgQS1iaXM/KSAqLworCQkJCWlmIChmaWxlX2lzX3JlYWRhYmxlKGZuYW1lX3NvZnR3YXJlKSkKKwkJCQkJcmMgPSBhYmlzX25tX2JzMTFfbG9hZF9zd2woZ19idHMsIGZuYW1lX3NvZnR3YXJlLAorCQkJCQkJCQkgICB3aW5fc2l6ZSwgcGFyYW1fZm9yY2VkLAorCQkJCQkJCQkgICBzd2xvYWRfY2Jmbik7CisJCQkJZWxzZQorCQkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHZhbGlkIFNvZnR3YXJlIGZpbGUgXCIlc1wiXG4iLAorCQkJCQkJZm5hbWVfc29mdHdhcmUpOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJkZWxldGUtdHJ4MSIpKSB7CisJCQkJcHJpbnRmKCJMb2NpbmcgQkJTSUcgYW5kIFBBIG9iamVjdHMgb2YgVFJYMVxuIik7CisJCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGdfYnRzLCBOTV9PQ19CUzExLAorCQkJCQkJICAgICAgQlMxMV9PQkpfQkJTSUcsIDAsIDEsCisJCQkJCQkgICAgICBOTV9TVEFURV9MT0NLRUQpOworCQkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShnX2J0cywgTk1fT0NfQlMxMSwKKwkJCQkJCSAgICAgIEJTMTFfT0JKX1BBLCAwLCAxLAorCQkJCQkJICAgICAgTk1fU1RBVEVfTE9DS0VEKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlwcmludGYoIkRlbGV0aW5nIEJCU0lHIGFuZCBQQSBvYmplY3RzIG9mIFRSWDFcbiIpOworCQkJCWFiaXNfbm1fYnMxMV9kZWxldGVfb2JqZWN0KGdfYnRzLCBCUzExX09CSl9CQlNJRywgMSk7CisJCQkJYWJpc19ubV9iczExX2RlbGV0ZV9vYmplY3QoZ19idHMsIEJTMTFfT0JKX1BBLCAxKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgImNyZWF0ZS10cngxIikpIHsKKwkJCQljcmVhdGVfdHJ4MShnX2J0cyk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJwbGwtZTEtbG9ja2VkIikpIHsKKwkJCQlhYmlzX25tX2JzMTFfc2V0X3BsbF9sb2NrZWQoZ19idHMsIDEpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAicGxsLXN0YW5kYWxvbmUiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfcGxsX2xvY2tlZChnX2J0cywgMCk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJwbGwtc2V0dmFsdWUiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfcGxsKGdfYnRzLCBhdG9pKHZhbHVlKSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJwbGwtd29ya3ZhbHVlIikpIHsKKwkJCQkvKiBUbyBzZXQgdGhlIHdvcmsgdmFsdWUgd2UgbmVlZCB0byBsb2dpbiBhcyBGSUVMRCAqLworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfaW5maWVsZF9sb2dvbihnX2J0cywgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX3NldF9wbGwoZ19idHMsIGF0b2kodmFsdWUpKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfaW5maWVsZF9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgIm9tbC10ZWkiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9jb25uX29tbF90ZWkoZ19idHMsIDAsIDEsIDB4ZmYsIFRFSV9PTUwpOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJyZXN0YXJ0IikpIHsKKwkJCQlhYmlzX25tX2JzMTFfcmVzdGFydChnX2J0cyk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInF1ZXJ5IikpIHsKKwkJCQljbWRfcXVlcnkoKTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAiY3JlYXRlLWJwb3J0MSIpKSB7CisJCQkJYWJpc19ubV9iczExX2NyZWF0ZV9icG9ydChnX2J0cywgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJkZWxldGUtYnBvcnQxIikpIHsKKwkJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUoZ19idHMsIE5NX09DX0JTMTFfQlBPUlQsIDEsIDB4ZmYsIDB4ZmYsIE5NX1NUQVRFX0xPQ0tFRCk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2RlbGV0ZV9icG9ydChnX2J0cywgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJicG9ydDAtc3RhciIpKSB7CisJCQkJYWJpc19ubV9iczExX3NldF9icG9ydF9saW5lX2NmZyhnX2J0cywgMCwgQlMxMV9MSU5FX0NGR19TVEFSKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgImJwb3J0MC1tdWx0aWRyb3AiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfYnBvcnRfbGluZV9jZmcoZ19idHMsIDAsIEJTMTFfTElORV9DRkdfTVVMVElEUk9QKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX05PUk1BTDoKKwkJaWYgKGNvbW1hbmQpIHsKKwkJCWlmICghc3RyY21wKGNvbW1hbmQsICJyZWNvbm5lY3QiKSkKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQllbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJkaXNjb25uZWN0IikpCisJCQkJYWJpc19ubV9iczExX2JzY19kaXNjb25uZWN0KGdfYnRzLCAwKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInF1ZXJ5IikpIHsKKwkJCQljbWRfcXVlcnkoKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChwYXJhbV9kaXNjb25uZWN0KSB7CisJCQlwYXJhbV9kaXNjb25uZWN0ID0gMDsKKwkJCWFiaXNfbm1fYnMxMV9ic2NfZGlzY29ubmVjdChnX2J0cywgMCk7CisJCQlpZiAocGFyYW1fcmVzdGFydCkgeworCQkJCXBhcmFtX3Jlc3RhcnQgPSAwOworCQkJCWFiaXNfbm1fYnMxMV9yZXN0YXJ0KGdfYnRzKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKiBoYW5kbGUgYSBmdWxseS1yZWNlaXZlZCBtZXNzYWdlL3BhY2tldCBmcm9tIHRoZSBSUzIzMiBwb3J0ICovCitpbnQgaGFuZGxlX3NlcmlhbF9tc2coc3RydWN0IG1zZ2IgKnJ4X21zZykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaDsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlpbnQgcmMgPSAtMTsKKworI2lmIDAKKwlpZiAocnhfbXNnLT5sZW4gPCBMQVBEX0hEUl9MRU4KKwkJCSAgKyBzaXplb2Yoc3RydWN0IGFiaXNfb21fZm9tX2hkcikKKwkJCSAgKyBzaXplb2Yoc3RydWN0IGFiaXNfb21faGRyKSkgeworCQlpZiAoIW1lbWNtcChyeF9tc2ctPmRhdGEgKyAyLCB0b29fZmFzdCwKKwkJCSAgICBzaXplb2YodG9vX2Zhc3QpKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJCUzExIHRlbGxzIHVzIHdlJ3JlIHRvbyAiCisJCQkJImZhc3QsIHRyeSAtLWRlbGF5IGJpZ2dlciB0aGFuICV1XG4iLAorCQkJCWRlbGF5X21zKTsKKwkJCXJldHVybiAtRTJCSUc7CisJCX0gZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICJ1bmtub3duIEJTMTEgbWVzc2FnZVxuIik7CisJfQorI2VuZGlmCisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9sMihyeF9tc2cpOworCWZvaCA9IChzdHJ1Y3QgYWJpc19vbV9mb21faGRyICopIG9oLT5kYXRhOworCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCWNhc2UgTk1fTVRfQlMxMV9MTVRfTE9HT05fQUNLOgorCQlwcmludGYoIkxNVCBMT0dPTjogQUNLXG5cbiIpOworCQlpZiAoYnMxMWNmZ19zdGF0ZSA9PSBTVEFURV9OT05FKQorCQkJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX0xPR09OX0FDSzsKKwkJcmMgPSBhYmlzX25tX2JzMTFfZ2V0X3N0YXRlKGdfYnRzKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9CUzExX0xNVF9MT0dPRkZfQUNLOgorCQlwcmludGYoIkxNVCBMT0dPRkY6IEFDS1xuIik7CisJCWV4aXQoMCk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQlMxMV9HRVRfU1RBVEVfQUNLOgorCQlyYyA9IGFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgZ19idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCQlwcmludF9zdGF0ZSgmdHApOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSAmJgorCQkgICAgVExWUF9MRU4oJnRwLCBOTV9BVFRfQlMxMV9CVFNfU1RBVEUpID49IDEpCisJCQlyYyA9IGhhbmRsZV9zdGF0ZV9yZXNwKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9CUzExX0JUU19TVEFURSkpOworCQlicmVhazsKKwljYXNlIE5NX01UX0dFVF9BVFRSX1JFU1A6CisJCXByaW50ZigiXG4lc0FUVFJJQlVURVM6XG4iLCBvYmpfbmFtZShmb2gpKTsKKwkJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBnX2J0cywgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJCXJjID0gcHJpbnRfYXR0cigmdHApOworCQkvL2hleGR1bXAoZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQlMxMV9TRVRfQVRUUl9BQ0s6CisJCXByaW50ZigiU0VUIEFUVFJJQlVURSBPYmpDbGFzcz0weCUwMnggT2JqSW5zdD0oJWQsJWQsJWQpIEFDS1xuIiwKKwkJCWZvaC0+b2JqX2NsYXNzLCBmb2gtPm9ial9pbnN0LmJ0c19uciwKKwkJCWZvaC0+b2JqX2luc3QudHJ4X25yLCBmb2gtPm9ial9pbnN0LnRzX25yKTsKKwkJcmMgPSAwOworCQlicmVhazsKKwljYXNlIE5NX01UX0JTMTFfU0VUX0FUVFJfTkFDSzoKKwkJcHJpbnRmKCJTRVQgQVRUUklCVVRFIE9iakNsYXNzPTB4JTAyeCBPYmpJbnN0PSglZCwlZCwlZCkgTkFDS1xuIiwKKwkJCWZvaC0+b2JqX2NsYXNzLCBmb2gtPm9ial9pbnN0LmJ0c19uciwKKwkJCWZvaC0+b2JqX2luc3QudHJ4X25yLCBmb2gtPm9ial9pbnN0LnRzX25yKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSBhYmlzX25tX3Jjdm1zZyhyeF9tc2cpOworCX0KKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigiRVJST1IgaW4gbWFpbiBsb29wIik7CisJCS8vYnJlYWs7CisJfQorCWlmIChyYyA9PSAxKQorCQlyZXR1cm4gcmM7CisKKwlzd2l0Y2ggKGJzMTFjZmdfc3RhdGUpIHsKKwljYXNlIFNUQVRFX05PTkU6CisJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBTVEFURV9MT0dPTl9BQ0s6CisJCWJzY19zY2hlZHVsZV90aW1lcigmc3RhdHVzX3RpbWVyLCA1LCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitpbnQgbm1fc3RhdGVfZXZlbnQoZW51bSBubV9ldnQgZXZ0LCB1X2ludDhfdCBvYmpfY2xhc3MsIHZvaWQgKm9iaiwKKwkJICAgc3RydWN0IGdzbV9ubV9zdGF0ZSAqb2xkX3N0YXRlLCBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpuZXdfc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3RhdHVzX3RpbWVyX2NiKHZvaWQgKmRhdGEpCit7CisJYWJpc19ubV9iczExX2dldF9zdGF0ZShnX2J0cyk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2Jhbm5lcih2b2lkKQoreworCXByaW50ZigiYnMxMV9jb25maWcgKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIGFuZCBEaWV0ZXIgU3BhYXJcbiIpOworCXByaW50ZigiVGhpcyBpcyBGUkVFIFNPRlRXQVJFIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWVxuXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCh2b2lkKQoreworCXByaW50ZigiYnMxMV9jb25maWcgW29wdGlvbnNdIFtjb21tYW5kXVxuIik7CisJcHJpbnRmKCJcblN1cHBvcnRlZCBvcHRpb25zOlxuIik7CisJcHJpbnRmKCJcdC1oIC0taGVscFx0XHRcdFByaW50IHRoaXMgaGVscCB0ZXh0XG4iKTsKKwlwcmludGYoIlx0LXAgLS1wb3J0IDwvZGV2L3R0eVhYWD5cdFx0U3BlY2lmeSBzZXJpYWwgcG9ydFxuIik7CisJcHJpbnRmKCJcdC1zIC0tc29mdHdhcmUgPGZpbGU+XHRcdFNwZWNpZnkgU29mdHdhcmUgZmlsZVxuIik7CisJcHJpbnRmKCJcdC1TIC0tc2FmZXR5IDxmaWxlPlx0XHRTcGVjaWZ5IFNhZmV0eSBMb2FkIGZpbGVcbiIpOworCXByaW50ZigiXHQtZCAtLWRlbGF5IDxtcz5cdFx0XHRTcGVjaWZ5IGRlbGF5IGluIG1pbGxpc2Vjb25kc1xuIik7CisJcHJpbnRmKCJcdC1EIC0tZGlzY29ubmVjdFx0XHRcdERpc2Nvbm5lY3QgQlRTIGZyb20gQlNDXG4iKTsKKwlwcmludGYoIlx0LXcgLS13aW4tc2l6ZSA8bnVtPlx0XHRTcGVjaWZ5IFdpbmRvdyBTaXplXG4iKTsKKwlwcmludGYoIlx0LWYgLS1mb3JjZWRcdFx0XHRGb3JjZSBTb2Z0d2FyZSBMb2FkXG4iKTsKKwlwcmludGYoIlxuU3VwcG9ydGVkIGNvbW1hbmRzOlxuIik7CisJcHJpbnRmKCJcdHF1ZXJ5XHRcdFx0UXVlcnkgdGhlIEJTLTExIGFib3V0IHNlcmlhbCBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb25cbiIpOworCXByaW50ZigiXHRkaXNjb25uZWN0XHRcdERpc2Nvbm5lY3QgQS1iaXMgbGluayAoZ28gaW50byBhZG1pbmlzdHJhdGl2ZSBzdGF0ZSlcbiIpOworCXByaW50ZigiXHRyZXNjb25uZWN0XHRcdFJlY29ubmVjdCBBLWJpcyBsaW5rIChnbyBpbnRvIG5vcm1hbCBzdGF0ZSlcbiIpOworCXByaW50ZigiXHRyZXN0YXJ0XHRcdFx0UmVzdGFydCB0aGUgQlRTXG4iKTsKKwlwcmludGYoIlx0c29mdHdhcmVcdFx0RG93bmxvYWQgU29mdHdhcmUgKG9ubHkgaW4gYWRtaW5pc3RyYXRpdmUgc3RhdGUpXG4iKTsKKwlwcmludGYoIlx0Y3JlYXRlLXRyeDFcdFx0Q3JlYXRlIG9iamVjdHMgZm9yIFRSWDEgKERhbmdlcjogWW91ciBCUy0xMSBtaWdodCBvdmVyaGVhdClcbiIpOworCXByaW50ZigiXHRkZWxldGUtdHJ4MVx0XHREZWxldGUgb2JqZWN0cyBmb3IgVFJYMVxuIik7CisJcHJpbnRmKCJcdHBsbC1lMS1sb2NrZWRcdFx0U2V0IHRoZSBQTEwgdG8gYmUgbG9ja2VkIHRvIEUxIGNsb2NrXG4iKTsKKwlwcmludGYoIlx0cGxsLXN0YW5kYWxvbmVcdFx0U2V0IHRoZSBQTEwgdG8gYmUgaW4gc3RhbmRhbG9uZSBtb2RlXG4iKTsKKwlwcmludGYoIlx0cGxsLXNldHZhbHVlIDx2YWx1ZT5cdFNldCB0aGUgUExMIHNldCB2YWx1ZVxuIik7CisJcHJpbnRmKCJcdHBsbC13b3JrdmFsdWUgPHZhbHVlPlx0U2V0IHRoZSBQTEwgd29yayB2YWx1ZVxuIik7CisJcHJpbnRmKCJcdG9tbC10ZWlcdFx0XHRTZXQgT01MIEUxIFRTIGFuZCBURUlcbiIpOworCXByaW50ZigiXHRicG9ydDAtc3Rhclx0XHRTZXQgQlBPUlQwIGxpbmUgY29uZmlnIHRvIHN0YXJcbiIpOworCXByaW50ZigiXHRicG9ydDAtbXVsdGlwb3J0XHRTZXQgQlBPUlQwIGxpbmUgY29uZmlnIHRvIG11bHRpcG9ydFxuIik7CisJcHJpbnRmKCJcdGNyZWF0ZS1icG9ydDFcdFx0Q3JlYXRlIEJQT1JUMSBvYmplY3RcbiIpOworCXByaW50ZigiXHRkZWxldGUtYnBvcnQxXHRcdERlbGV0ZSBCUE9SVDEgb2JqZWN0XG4iKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBvcHRpb25faW5kZXggPSAwOworCXByaW50X2Jhbm5lcigpOworCisJd2hpbGUgKDEpIHsKKwkJaW50IGM7CisJCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQkJeyAiaGVscCIsIDAsIDAsICdoJyB9LAorCQkJeyAicG9ydCIsIDEsIDAsICdwJyB9LAorCQkJeyAic29mdHdhcmUiLCAxLCAwLCAncycgfSwKKwkJCXsgInNhZmV0eSIsIDEsIDAsICdTJyB9LAorCQkJeyAiZGVsYXkiLCAxLCAwLCAnZCcgfSwKKwkJCXsgImRpc2Nvbm5lY3QiLCAwLCAwLCAnRCcgfSwKKwkJCXsgIndpbi1zaXplIiwgMSwgMCwgJ3cnIH0sCisJCQl7ICJmb3JjZWQiLCAwLCAwLCAnZicgfSwKKwkJCXsgInJlc3RhcnQiLCAwLCAwLCAncicgfSwKKwkJCXsgImRlYnVnIiwgMSwgMCwgJ2InfSwKKwkJfTsKKworCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhwOnM6Uzp0ZDpEdzpmcmE6IiwKKwkJCQlsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCisJCWlmIChjID09IC0xKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2gnOgorCQkJcHJpbnRfaGVscCgpOworCQkJZXhpdCgwKTsKKwkJY2FzZSAncCc6CisJCQlzZXJpYWxfcG9ydCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdiJzoKKwkJCWxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0ZGVycl90YXJnZXQsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlmbmFtZV9zb2Z0d2FyZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdTJzoKKwkJCWZuYW1lX3NhZmV0eSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWRlbGF5X21zID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3cnOgorCQkJd2luX3NpemUgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnRCc6CisJCQlwYXJhbV9kaXNjb25uZWN0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCXBhcmFtX2ZvcmNlZCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlwYXJhbV9kaXNjb25uZWN0ID0gMTsKKwkJCXBhcmFtX3Jlc3RhcnQgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAob3B0aW5kIDwgYXJnYykKKwkJY29tbWFuZCA9IGFyZ3Zbb3B0aW5kXTsKKwkgICAgICAgIGlmIChvcHRpbmQrMSA8IGFyZ2MpCisJCQl2YWx1ZSA9IGFyZ3Zbb3B0aW5kKzFdOworCit9CisKK3N0YXRpYyBpbnQgbnVtX3NpZ2ludDsKKworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZ25hbCkKK3sKKwlmcHJpbnRmKHN0ZG91dCwgIlxuc2lnbmFsICV1IHJlY2VpdmVkXG4iLCBzaWduYWwpOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNJR0lOVDoKKwkJbnVtX3NpZ2ludCsrOworCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCWlmIChudW1fc2lnaW50ID49IDMpCisJCQlleGl0KDApOworCQlicmVhazsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldDsKKwlpbnQgcmM7CisKKwlsb2dfaW5pdCgmbG9nX2luZm8pOworCXN0ZGVycl90YXJnZXQgPSBsb2dfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlsb2dfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKwlsb2dfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7CisJaGFuZGxlX29wdGlvbnMoYXJnYywgYXJndik7CisJYnRzX21vZGVsX2JzMTFfaW5pdCgpOworCisJZ3NtbmV0ID0gZ3NtX25ldHdvcmtfaW5pdCgxLCAxLCBOVUxMKTsKKwlpZiAoIWdzbW5ldCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBhbGxvY2F0ZSBnc20gbmV0d29ya1xuIik7CisJCWV4aXQoMSk7CisJfQorCWdfYnRzID0gZ3NtX2J0c19hbGxvYyhnc21uZXQsIEdTTV9CVFNfVFlQRV9CUzExLCBIQVJEQ09ERURfVFNDLAorCQkJCUhBUkRDT0RFRF9CU0lDKTsKKworCXJjID0gcnMyMzJfc2V0dXAoc2VyaWFsX3BvcnQsIGRlbGF5X21zLCBnX2J0cyk7CisJaWYgKHJjIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlByb2JsZW0gc2V0dGluZyB1cCBzZXJpYWwgcG9ydFxuIik7CisJCWV4aXQoMSk7CisJfQorCisJc2lnbmFsKFNJR0lOVCwgJnNpZ25hbF9oYW5kbGVyKTsKKworCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAxKTsKKwkvL2FiaXNfbm1fYnMxMV9nZXRfc2Vybm8oZ19idHMpOworCisJc3RhdHVzX3RpbWVyLmNiID0gc3RhdHVzX3RpbWVyX2NiOworCisJd2hpbGUgKDEpIHsKKwkJYnNjX3NlbGVjdF9tYWluKDApOworCX0KKworCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKworCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfYXBpLmMgYi9vcGVuYnNjL3NyYy9ic2NfYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwNDc1MgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2JzY19hcGkuYwpAQCAtMCwwICsxLDMzIEBACisvKiBHU00gMDguMDggbGlrZSBBUEkgZm9yIE9wZW5CU0MuIFRoZSBicmlkZ2UgZnJvbSBNU0MgdG8gQlNDICovCisKKy8qIChDKSAyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuYnNjL2JzY19hcGkuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisKKworaW50IGdzbTA4MDhfc3VibWl0X2R0YXAoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQlzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgbGlua19pZCkKK3sKKwltc2ctPmxjaGFuID0gY29ubi0+bGNoYW47CisJbXNnLT50cnggPSBtc2ctPmxjaGFuLT50cy0+dHJ4OworCXJldHVybiByc2xfZGF0YV9yZXF1ZXN0KG1zZywgbGlua19pZCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfaGFjay5jIGIvb3BlbmJzYy9zcmMvYnNjX2hhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTBkNGFiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnNjX2hhY2suYwpAQCAtMCwwICsxLDI2OCBAQAorLyogQSBoYWNraXNoIG1pbmltYWwgQlNDICgrTVNDICtITFIpIGltcGxlbWVudGF0aW9uICovCisKKy8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorCisvKiBNQ0MgYW5kIE1OQyBmb3IgdGhlIExvY2F0aW9uIEFyZWEgSWRlbnRpZmllciAqLworc3RhdGljIHN0cnVjdCBsb2dfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0Oworc3RydWN0IGdzbV9uZXR3b3JrICpic2NfZ3NtbmV0ID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICpkYXRhYmFzZV9uYW1lID0gImhsci5zcWxpdGUzIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25maWdfZmlsZSA9ICJvcGVuYnNjLmNmZyI7CitleHRlcm4gY29uc3QgY2hhciAqb3BlbmJzY192ZXJzaW9uOworZXh0ZXJuIGNvbnN0IGNoYXIgKm9wZW5ic2NfY29weXJpZ2h0OworCisvKiB0aW1lciB0byBzdG9yZSBzdGF0aXN0aWNzICovCisjZGVmaW5lIERCX1NZTkNfSU5URVJWQUwJNjAsIDAKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBkYl9zeW5jX3RpbWVyOworCitleHRlcm4gaW50IGJzY19ib290c3RyYXBfbmV0d29yayhpbnQgKCptbWNfcmV2KShzdHJ1Y3QgZ3NtX25ldHdvcmsgKiwgaW50LCB2b2lkICopLAorCQkJCSBjb25zdCBjaGFyICpjZmdfZmlsZSk7CitleHRlcm4gaW50IGJzY19zaHV0ZG93bl9uZXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpOworCitzdGF0aWMgdm9pZCBjcmVhdGVfcGNhcF9maWxlKGNoYXIgKmZpbGUpCit7CisJbW9kZV90IG1vZGUgPSBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIOworCWludCBmZCA9IG9wZW4oZmlsZSwgT19XUk9OTFl8T19UUlVOQ3xPX0NSRUFULCBtb2RlKTsKKworCWlmIChmZCA8IDApIHsKKwkJcGVycm9yKCJGYWlsZWQgdG8gb3BlbiBmaWxlIGZvciBwY2FwIik7CisJCXJldHVybjsKKwl9CisKKwllMV9zZXRfcGNhcF9mZChmZCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3VzYWdlKCkKK3sKKwlwcmludGYoIlVzYWdlOiBic2NfaGFja1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAoKQoreworCXByaW50ZigiICBTb21lIHVzZWZ1bCBoZWxwLi4uXG4iKTsKKwlwcmludGYoIiAgLWggLS1oZWxwIHRoaXMgdGV4dFxuIik7CisJcHJpbnRmKCIgIC1kIG9wdGlvbiAtLWRlYnVnPURSTEw6RENDOkRNTTpEUlI6RFJTTDpETk0gZW5hYmxlIGRlYnVnZ2luZ1xuIik7CisJcHJpbnRmKCIgIC1jIC0tY29uZmlnLWZpbGUgZmlsZW5hbWUgVGhlIGNvbmZpZyBmaWxlIHRvIHVzZS5cbiIpOworCXByaW50ZigiICAtcyAtLWRpc2FibGUtY29sb3JcbiIpOworCXByaW50ZigiICAtbCAtLWRhdGFiYXNlIGRiLW5hbWUgVGhlIGRhdGFiYXNlIHRvIHVzZVxuIik7CisJcHJpbnRmKCIgIC1hIC0tYXV0aG9yaXplLWV2ZXJ5b25lLiBBdXRob3JpemUgZXZlcnkgbmV3IHN1YnNjcmliZXIuIERhbmdlcm91cyEuXG4iKTsKKwlwcmludGYoIiAgLXAgLS1wY2FwIGZpbGUgIFRoZSBmaWxlbmFtZSBvZiB0aGUgcGNhcCBmaWxlXG4iKTsKKwlwcmludGYoIiAgLVQgLS10aW1lc3RhbXAgUHJlZml4IGV2ZXJ5IGxvZyBsaW5lIHdpdGggYSB0aW1lc3RhbXBcbiIpOworCXByaW50ZigiICAtViAtLXZlcnNpb24uIFByaW50IHRoZSB2ZXJzaW9uIG9mIE9wZW5CU0MuXG4iKTsKKwlwcmludGYoIiAgLVAgLS1ydHAtcHJveHkgRW5hYmxlIHRoZSBSVFAgUHJveHkgY29kZSBpbnNpZGUgT3BlbkJTQ1xuIik7CisJcHJpbnRmKCIgIC1lIC0tbG9nLWxldmVsIG51bWJlci4gU2V0IGEgZ2xvYmFsIGxvZ2xldmVsLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3ZlcnNpb24oKQoreworCXByaW50ZigiJXNcbiIsIG9wZW5ic2NfdmVyc2lvbik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2NvcHlyaWdodCgpCit7CisJcHV0cyhvcGVuYnNjX2NvcHlyaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9vcHRpb25zKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKwl3aGlsZSAoMSkgeworCQlpbnQgb3B0aW9uX2luZGV4ID0gMCwgYzsKKwkJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCQl7ImhlbHAiLCAwLCAwLCAnaCd9LAorCQkJeyJkZWJ1ZyIsIDEsIDAsICdkJ30sCisJCQl7ImNvbmZpZy1maWxlIiwgMSwgMCwgJ2MnfSwKKwkJCXsiZGlzYWJsZS1jb2xvciIsIDAsIDAsICdzJ30sCisJCQl7ImRhdGFiYXNlIiwgMSwgMCwgJ2wnfSwKKwkJCXsiYXV0aG9yaXplLWV2ZXJ5b25lIiwgMCwgMCwgJ2EnfSwKKwkJCXsicGNhcCIsIDEsIDAsICdwJ30sCisJCQl7InRpbWVzdGFtcCIsIDAsIDAsICdUJ30sCisJCQl7InZlcnNpb24iLCAwLCAwLCAnVicgfSwKKwkJCXsicnRwLXByb3h5IiwgMCwgMCwgJ1AnfSwKKwkJCXsibG9nLWxldmVsIiwgMSwgMCwgJ2UnfSwKKwkJCXswLCAwLCAwLCAwfQorCQl9OworCisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaGQ6c2w6YXI6cDpUUFZjOmU6IiwKKwkJCQlsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCQlpZiAoYyA9PSAtMSkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoYykgeworCQljYXNlICdoJzoKKwkJCXByaW50X3VzYWdlKCk7CisJCQlwcmludF9oZWxwKCk7CisJCQlleGl0KDApOworCQljYXNlICdzJzoKKwkJCWxvZ19zZXRfdXNlX2NvbG9yKHN0ZGVycl90YXJnZXQsIDApOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJbG9nX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCWRhdGFiYXNlX25hbWUgPSBzdHJkdXAob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWNvbmZpZ19maWxlID0gc3RyZHVwKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQljcmVhdGVfcGNhcF9maWxlKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnVCc6CisJCQlsb2dfc2V0X3ByaW50X3RpbWVzdGFtcChzdGRlcnJfdGFyZ2V0LCAxKTsKKwkJCWJyZWFrOworCQljYXNlICdQJzoKKwkJCWlwYWNjX3J0cF9kaXJlY3QgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ2UnOgorCQkJbG9nX3NldF9sb2dfbGV2ZWwoc3RkZXJyX3RhcmdldCwgYXRvaShvcHRhcmcpKTsKKwkJCWJyZWFrOworCQljYXNlICdWJzoKKwkJCXByaW50X3ZlcnNpb24oKTsKKwkJCXByaW50ZigiXG4iKTsKKwkJCXByaW50X2NvcHlyaWdodCgpOworCQkJZXhpdCgwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogaWdub3JlICovCisJCQlicmVhazsKKwkJfQorCX0KK30KKworZXh0ZXJuIHZvaWQgKnRhbGxfdnR5X2N0eDsKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWduYWwpCit7CisJZnByaW50ZihzdGRvdXQsICJzaWduYWwgJXUgcmVjZWl2ZWRcbiIsIHNpZ25hbCk7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU0lHSU5UOgorCQlic2Nfc2h1dGRvd25fbmV0KGJzY19nc21uZXQpOworCQlkaXNwYXRjaF9zaWduYWwoU1NfR0xPQkFMLCBTX0dMT0JBTF9TSFVURE9XTiwgTlVMTCk7CisJCXNsZWVwKDMpOworCQlleGl0KDApOworCQlicmVhazsKKwljYXNlIFNJR0FCUlQ6CisJCS8qIGluIGNhc2Ugb2YgYWJvcnQsIHdlIHdhbnQgdG8gb2J0YWluIGEgdGFsbG9jIHJlcG9ydAorCQkgKiBhbmQgdGhlbiByZXR1cm4gdG8gdGhlIGNhbGxlciwgd2hvIHdpbGwgYWJvcnQgdGhlIHByb2Nlc3MgKi8KKwljYXNlIFNJR1VTUjE6CisJCXRhbGxvY19yZXBvcnQodGFsbF92dHlfY3R4LCBzdGRlcnIpOworCQl0YWxsb2NfcmVwb3J0X2Z1bGwodGFsbF9ic2NfY3R4LCBzdGRlcnIpOworCQlicmVhazsKKwljYXNlIFNJR1VTUjI6CisJCXRhbGxvY19yZXBvcnRfZnVsbCh0YWxsX3Z0eV9jdHgsIHN0ZGVycik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyogdGltZXIgaGFuZGxpbmcgKi8KK3N0YXRpYyBpbnQgX2RiX3N0b3JlX2NvdW50ZXIoc3RydWN0IGNvdW50ZXIgKmNvdW50ZXIsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGRiX3N0b3JlX2NvdW50ZXIoY291bnRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGRiX3N5bmNfdGltZXJfY2Iodm9pZCAqZGF0YSkKK3sKKwkvKiBzdG9yZSBjb3VudGVycyB0byBkYXRhYmFzZSBhbmQgcmUtc2NoZWR1bGUgKi8KKwljb3VudGVyc19mb3JfZWFjaChfZGJfc3RvcmVfY291bnRlciwgTlVMTCk7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZkYl9zeW5jX3RpbWVyLCBEQl9TWU5DX0lOVEVSVkFMKTsKK30KKworZXh0ZXJuIGludCBidHNfbW9kZWxfdW5rbm93bl9pbml0KHZvaWQpOworZXh0ZXJuIGludCBidHNfbW9kZWxfYnMxMV9pbml0KHZvaWQpOworZXh0ZXJuIGludCBidHNfbW9kZWxfbmFub2J0c19pbml0KHZvaWQpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHJjOworCisJbG9nX2luaXQoJmxvZ19pbmZvKTsKKwl0YWxsX2JzY19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMSwgIm9wZW5ic2MiKTsKKwl0YWxsb2NfY3R4X2luaXQoKTsKKwlvbl9kc29fbG9hZF90b2tlbigpOworCW9uX2Rzb19sb2FkX3JybHAoKTsKKwlvbl9kc29fbG9hZF9ob19kZWMoKTsKKwlzdGRlcnJfdGFyZ2V0ID0gbG9nX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJbG9nX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7CisKKwlidHNfbW9kZWxfdW5rbm93bl9pbml0KCk7CisJYnRzX21vZGVsX2JzMTFfaW5pdCgpOworCWJ0c19tb2RlbF9uYW5vYnRzX2luaXQoKTsKKworCS8qIGVuYWJsZSBmaWx0ZXJzICovCisJbG9nX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCisJLyogcGFyc2Ugb3B0aW9ucyAqLworCWhhbmRsZV9vcHRpb25zKGFyZ2MsIGFyZ3YpOworCisJLyogc2VlZCB0aGUgUFJORyAqLworCXNyYW5kKHRpbWUoTlVMTCkpOworCisJaWYgKGRiX2luaXQoZGF0YWJhc2VfbmFtZSkpIHsKKwkJcHJpbnRmKCJEQjogRmFpbGVkIHRvIGluaXQgZGF0YWJhc2UuIFBsZWFzZSBjaGVjayB0aGUgb3B0aW9uIHNldHRpbmdzLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcHJpbnRmKCJEQjogRGF0YWJhc2UgaW5pdGlhbGl6ZWQuXG4iKTsKKworCWlmIChkYl9wcmVwYXJlKCkpIHsKKwkJcHJpbnRmKCJEQjogRmFpbGVkIHRvIHByZXBhcmUgZGF0YWJhc2UuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwcmludGYoIkRCOiBEYXRhYmFzZSBwcmVwYXJlZC5cbiIpOworCisJLyogc2V0dXAgdGhlIHRpbWVyICovCisJZGJfc3luY190aW1lci5jYiA9IGRiX3N5bmNfdGltZXJfY2I7CisJZGJfc3luY190aW1lci5kYXRhID0gTlVMTDsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmRiX3N5bmNfdGltZXIsIERCX1NZTkNfSU5URVJWQUwpOworCisJcmMgPSBic2NfYm9vdHN0cmFwX25ldHdvcmsobW5jY19yZWN2LCBjb25maWdfZmlsZSk7CisJaWYgKHJjIDwgMCkKKwkJZXhpdCgxKTsKKworCXNpZ25hbChTSUdJTlQsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR0FCUlQsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1VTUjEsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1VTUjIsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJd2hpbGUgKDEpIHsKKwkJYnNjX3VwcXVldWUoYnNjX2dzbW5ldCk7CisJCWxvZ19yZXNldF9jb250ZXh0KCk7CisJCWJzY19zZWxlY3RfbWFpbigwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfaW5pdC5jIGIvb3BlbmJzYy9zcmMvYnNjX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzQzNjYyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnNjX2luaXQuYwpAQCAtMCwwICsxLDEwMTYgQEAKKy8qIEEgaGFja2lzaCBtaW5pbWFsIEJTQyAoK01TQyArSExSKSBpbXBsZW1lbnRhdGlvbiAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9taXNkbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdGVsbmV0X2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3lzdGVtX2luZm9ybWF0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisvKiBnbG9iYWwgcG9pbnRlciB0byB0aGUgZ3NtIG5ldHdvcmsgZGF0YSBzdHJ1Y3R1cmUgKi8KK2V4dGVybiBzdHJ1Y3QgZ3NtX25ldHdvcmsgKmJzY19nc21uZXQ7CisKK3N0YXRpYyB2b2lkIHBhdGNoX25tX3RhYmxlcyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBhcmUgZm9yIE9NIGFuZCBOTSBwYWNrZXRzIHRoYXQgd2UgY2Fubm90IHlldAorICogZ2VuZXJhdGUgYnkgY29kZSBidXQgd2UganVzdCBwYXNzIG9uICovCisKKy8vIEJUUyBTaXRlIE1hbmFnZXIsIFNFVCBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogQlRTIFNpdGUgTWFuYWdlcgorICBJbnN0YW5jZSAxOiBGRgorICBJbnN0YW5jZSAyOiBGRgorICBJbnN0YW5jZSAzOiBGRgorU0VUIEFUVFJJQlVURVMKKyAgc0FiaXNFeHRlcm5hbFRpbWU6IDIwMDcvMDkvMDggICAxNDozNjoxMQorICBvbUxBUERSZWxUaW1lcjogMzBzZWMKKyAgc2hvcnRMQVBESW50VGltZXI6IDVzZWMKKyAgZW1lcmdlbmN5VGltZXIxOiAxMCBtaW51dGVzCisgIGVtZXJnZW5jeVRpbWVyMjogMCBtaW51dGVzCisqLworCit1bnNpZ25lZCBjaGFyIG1zZ18xW10gPQoreworCU5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX1NJVEVfTUFOQUdFUiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkJTk1fQVRUX0JTMTFfQUJJU19FWFRfVElNRSwgMHgwNywKKwkJCTB4RDcsIDB4MDksIDB4MDgsIDB4MEUsIDB4MjQsIDB4MEIsIDB4Q0UsCisJCTB4MDIsCisJCQkweDAwLCAweDFFLAorCQlOTV9BVFRfQlMxMV9TSF9MQVBEX0lOVF9USU1FUiwKKwkJCTB4MDEsIDB4MDUsCisJCTB4NDIsIDB4MDIsIDB4MDAsIDB4MEEsCisJCTB4NDQsIDB4MDIsIDB4MDAsIDB4MDAKK307CisKKy8vIEJUUywgU0VUIEJUUyBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogQlRTCisgIEJUUyByZWxhdC4gTnVtYmVyOiAwCisgIEluc3RhbmNlIDI6IEZGCisgIEluc3RhbmNlIDM6IEZGCitTRVQgQlRTIEFUVFJJQlVURVMKKyAgYnNJZGVudGl0eUNvZGUgLyBCU0lDOgorICAgIFBMTU5fY29sb3VyX2NvZGU6IDdoCisgICAgQlNfY29sb3VyX2NvZGU6ICAgN2gKKyAgQlRTIEFpciBUaW1lciBUMzEwNTogNCAgLHVuaXQgMTAgbXMKKyAgYnRzSXNIb3BwaW5nOiBGQUxTRQorICBwZXJpb2RDQ0NITG9hZEluZGljYXRpb246IDFzZWMKKyAgdGhyZXNob2xkQ0NDSExvYWRJbmRpY2F0aW9uOiAwJQorICBjZWxsQWxsb2NhdGlvbk51bWJlcjogMDBoID0gR1NNIDkwMAorICBlbmFibGVJbnRlcmZlcmVuY2VDbGFzczogMDBoID0gIERpc2FibGVkCisgIGZBQ0NIUXVhbDogNiAoRkFDQ0ggc3RlYWxpbmcgZmxhZ3MgbWludXMgMSkKKyAgaW50YXZlUGFyYW1ldGVyOiAzMSBTQUNDSCBtdWx0aWZyYW1lcworICBpbnRlcmZlcmVuY2VMZXZlbEJvdW5kYXJpZXM6CisgICAgSW50ZXJmZXJlbmNlIEJvdW5kYXJ5IDE6IDBBaAorICAgIEludGVyZmVyZW5jZSBCb3VuZGFyeSAyOiAwRmgKKyAgICBJbnRlcmZlcmVuY2UgQm91bmRhcnkgMzogMTRoCisgICAgSW50ZXJmZXJlbmNlIEJvdW5kYXJ5IDQ6IDE5aAorICAgIEludGVyZmVyZW5jZSBCb3VuZGFyeSA1OiAxRWgKKyAgbVNUeFB3ck1heDogMTEKKyAgICAgIEdTTSByYW5nZTogICAgIDI9MzlkQm0sIDE1PTEzZEJtLCBzdGVwc2l6ZSAyIGRCbQorICAgICAgRENTMTgwMCByYW5nZTogMD0zMGRCbSwgMTU9MGRCbSwgc3RlcHNpemUgMiBkQm0KKyAgICAgIFBDUzE5MDAgcmFuZ2U6IDA9MzBkQm0sIDE1PTBkQm0sIHN0ZXBzaXplIDIgZEJtCisgICAgICAgICAgICAgICAgICAgIDMwPTMzZEJtLCAzMT0zMmRCbQorICBueTE6CisgICAgTWF4aW11bSBudW1iZXIgb2YgcmVwZXRpdGlvbnMgZm9yIFBIWVNJQ0FMIElORk9STUFUSU9OIG1lc3NhZ2UgKEdTTSAwNC4wOCk6IDIwCisgIHBvd2VyT3V0cHV0VGhyZXNob2xkczoKKyAgICBPdXQgUG93ZXIgRmF1bHQgVGhyZXNob2xkOiAgICAgLTEwIGRCCisgICAgUmVkIE91dCBQb3dlciBUaHJlc2hvbGQ6ICAgICAgIC0gNiBkQgorICAgIEV4Y2Vzc2l2ZSBPdXQgUG93ZXIgVGhyZXNob2xkOiAgIDUgZEIKKyAgckFDSEJ1c3lUaHJlc2hvbGQ6IC0xMjcgZEJtCisgIHJBQ0hMb2FkQXZlcmFnaW5nU2xvdHM6IDI1MCAsbnVtYmVyIG9mIFJBQ0ggYnVyc3QgcGVyaW9kcworICByZlJlc291cmNlSW5kaWNhdGlvblBlcmlvZDogMTI1ICBTQUNDSCBtdWx0aWZyYW1lcworICBUMjAwOgorICAgIFNEQ0NIOiAgICAgICAgICAgICAgICAwNDQgaW4gIDUgbXMKKyAgICBGQUNDSC9GdWxsIHJhdGU6ICAgICAgMDMxIGluICA1IG1zCisgICAgRkFDQ0gvSGFsZiByYXRlOiAgICAgIDA0MSBpbiAgNSBtcworICAgIFNBQ0NIIHdpdGggVENIIFNBUEkwOiAwOTAgaW4gMTAgbXMKKyAgICBTQUNDSCB3aXRoIFNEQ0NIOiAgICAgMDkwIGluIDEwIG1zCisgICAgU0RDQ0ggd2l0aCBTQVBJMzogICAgIDA5MCBpbiAgNSBtcworICAgIFNBQ0NIIHdpdGggVENIIFNBUEkzOiAxMzUgaW4gMTAgbXMKKyAgdFN5bmM6IDkwMDAgdW5pdHMgb2YgMTAgbXNlYworICB0VHJhdTogOTAwMCB1bml0cyBvZiAxMCBtc2VjCisgIGVuYWJsZVVtTG9vcFRlc3Q6IDAwaCA9ICBkaXNhYmxlZAorICBlbmFibGVFeGNlc3NpdmVEaXN0YW5jZTogMDBoID0gIERpc2FibGVkCisgIGV4Y2Vzc2l2ZURpc3RhbmNlOiA2NGttCisgIGhvcHBpbmdNb2RlOiAwMGggPSBiYXNlYmFuZCBob3BwaW5nCisgIGNlbGxUeXBlOiAwMGggPSAgU3RhbmRhcmQgQ2VsbAorICBCQ0NIIEFSRkNOIC8gYkNDSEZyZXF1ZW5jeTogMQorKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYnMxMV9hdHRyX2J0c1tdID0KK3sKKwkJTk1fQVRUX0JTSUMsIEhBUkRDT0RFRF9CU0lDLAorCQlOTV9BVFRfQlRTX0FJUl9USU1FUiwgMHgwNCwKKwkJTk1fQVRUX0JTMTFfQlRTTFNfSE9QUElORywgMHgwMCwKKwkJTk1fQVRUX0NDQ0hfTF9JX1AsIDB4MDEsCisJCU5NX0FUVF9DQ0NIX0xfVCwgMHgwMCwKKwkJTk1fQVRUX0JTMTFfQ0VMTF9BTExPQ19OUiwgTk1fQlMxMV9DQU5SX0dTTSwKKwkJTk1fQVRUX0JTMTFfRU5BX0lOVEVSRl9DTEFTUywgMHgwMSwKKwkJTk1fQVRUX0JTMTFfRkFDQ0hfUVVBTCwgMHgwNiwKKwkJLyogaW50ZXJmZXJlbmNlIGF2Zy4gcGVyaW9kIGluIG51bWJlcnMgb2YgU0FDQ0ggbXVsdGlmciAqLworCQlOTV9BVFRfSU5UQVZFX1BBUkFNLCAweDFGLAorCQlOTV9BVFRfSU5URVJGX0JPVU5ELCAweDBBLCAweDBGLCAweDE0LCAweDE5LCAweDFFLCAweDdCLAorCQlOTV9BVFRfQ0NDSF9MX1QsIDB4MjMsCisJCU5NX0FUVF9HU01fVElNRSwgMHgyOCwgMHgwMCwKKwkJTk1fQVRUX0FETV9TVEFURSwgMHgwMywKKwkJTk1fQVRUX1JBQ0hfQl9USFJFU0gsIDB4N0YsCisJCU5NX0FUVF9MREFWR19TTE9UUywgMHgwMCwgMHhGQSwKKwkJTk1fQVRUX0JTMTFfUkZfUkVTX0lORF9QRVIsIDB4N0QsCisJCU5NX0FUVF9UMjAwLCAweDJDLCAweDFGLCAweDI5LCAweDVBLCAweDVBLCAweDVBLCAweDg3LAorCQlOTV9BVFRfQlMxMV9UU1lOQywgMHgyMywgMHgyOCwKKwkJTk1fQVRUX0JTMTFfVFRSQVUsIDB4MjMsIDB4MjgsCisJCU5NX0FUVF9URVNUX0RVUiwgMHgwMSwgMHgwMCwKKwkJTk1fQVRUX09VVFNUX0FMQVJNLCAweDAxLCAweDAwLAorCQlOTV9BVFRfQlMxMV9FWENFU1NJVkVfRElTVEFOQ0UsIDB4MDEsIDB4NDAsCisJCU5NX0FUVF9CUzExX0hPUFBJTkdfTU9ERSwgMHgwMSwgMHgwMCwKKwkJTk1fQVRUX0JTMTFfUExMLCAweDAxLCAweDAwLAorCQlOTV9BVFRfQkNDSF9BUkZDTiwgMHgwMCwgSEFSRENPREVEX0FSRkNOLyoweDAxKi8sCit9OworCisvLyBIYW5kb3ZlciBSZWNvZ25pdGlvbiwgU0VUIEFUVFJJQlVURVMKKworLyoKK0lsbGVnYWwgQ29udGVudHMgR1NNIEZvcm1hdHRlZCBPJk0gTXNnCisgIE9iamVjdCBDbGFzczogSGFuZG92ZXIgUmVjb2duaXRpb24KKyAgQlRTIHJlbGF0LiBOdW1iZXI6IDAKKyAgSW5zdGFuY2UgMjogRkYKKyAgSW5zdGFuY2UgMzogRkYKK1NFVCBBVFRSSUJVVEVTCisgIGVuYWJsZURlbGF5UG93ZXJCdWRnZXRITzogMDBoID0gRGlzYWJsZWQKKyAgZW5hYmxlRGlzdGFuY2VITzogMDBoID0gIERpc2FibGVkCisgIGVuYWJsZUludGVybmFsSW50ZXJDZWxsSGFuZG92ZXI6IDAwaCA9IERpc2FibGVkCisgIGVuYWJsZUludGVybmFsSW50cmFDZWxsSGFuZG92ZXI6IDAwaCA9ICBEaXNhYmxlZAorICBlbmFibGVQb3dlckJ1ZGdldEhPOiAwMGggPSBEaXNhYmxlZAorICBlbmFibGVSWExFVkhPOiAwMGggPSAgRGlzYWJsZWQKKyAgZW5hYmxlUlhRVUFMSE86IDAwaCA9ICBEaXNhYmxlZAorICBob0F2ZXJhZ2luZ0Rpc3RhbmNlOiA4ICBTQUNDSCBtdWx0aWZyYW1lcworICBob0F2ZXJhZ2luZ0xldjoKKyAgICBBX0xFVl9ITzogOCAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgICBXX0xFVl9ITzogMSAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgaG9BdmVyYWdpbmdQb3dlckJ1ZGdldDogIDE2ICBTQUNDSCBtdWx0aWZyYW1lcworICBob0F2ZXJhZ2luZ1F1YWw6CisgICAgQV9RVUFMX0hPOiA4ICBTQUNDSCBtdWx0aWZyYW1lcworICAgIFdfUVVBTF9ITzogMiAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgaG9Mb3dlclRocmVzaG9sZExldkRMOiAoMTAgLSAxMTApIGRCbQorICBob0xvd2VyVGhyZXNob2xkTGV2VUw6ICg1IC0gMTEwKSBkQm0KKyAgaG9Mb3dlclRocmVzaG9sZFF1YWxETDogMDZoID0gICA2LjQlIDwgQkVSIDwgMTIuOCUKKyAgaG9Mb3dlclRocmVzaG9sZFF1YWxVTDogMDZoID0gICA2LjQlIDwgQkVSIDwgMTIuOCUKKyAgaG9UaHJlc2hvbGRMZXZETGludHJhIDogKDIwIC0gMTEwKSBkQm0KKyAgaG9UaHJlc2hvbGRMZXZVTGludHJhOiAoMjAgLSAxMTApIGRCbQorICBob1RocmVzaG9sZE1zUmFuZ2VNYXg6IDIwIGttCisgIG5DZWxsOiAwNmgKKyAgdGltZXJIT1JlcXVlc3Q6IDMgICx1bml0IDIgU0FDQ0ggbXVsdGlmcmFtZXMKKyovCisKK3Vuc2lnbmVkIGNoYXIgbXNnXzNbXSA9Cit7CisJTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMV9IQU5ET1ZFUiwgMHgwMCwgMHhGRiwgMHhGRiwKKwkJMHhEMCwgMHgwMCwJCS8qIGVuYWJsZURlbGF5UG93ZXJCdWRnZXRITyAqLworCQkweDY0LCAweDAwLAkJLyogZW5hYmxlRGlzdGFuY2VITyAqLworCQkweDY3LCAweDAwLAkJLyogZW5hYmxlSW50ZXJuYWxJbnRlckNlbGxIYW5kb3ZlciAqLworCQkweDY4LCAweDAwLAkJLyogZW5hYmxlSW50ZXJuYWxJbnRlckNlbGxIYW5kb3ZlciAqLworCQkweDZBLCAweDAwLAkJLyogZW5hYmxlUG93ZXJCdWRnZXRITyAqLworCQkweDZDLCAweDAwLAkJLyogZW5hYmxlUlhMRVZITyAqLworCQkweDZELCAweDAwLAkJLyogZW5hYmxlUlhRVUFMSE8gKi8KKwkJMHg2RiwgMHgwOCwJCS8qIGhvQXZlcmFnaW5nRGlzdGFuY2UgKi8KKwkJMHg3MCwgMHgwOCwgMHgwMSwJLyogaG9BdmVyYWdpbmdMZXYgKi8KKwkJMHg3MSwgMHgxMCwgMHgxMCwgMHgxMCwKKwkJMHg3MiwgMHgwOCwgMHgwMiwJLyogaG9BdmVyYWdpbmdRdWFsICovCisJCTB4NzMsIDB4MEEsCQkvKiBob0xvd2VyVGhyZXNob2xkTGV2REwgKi8KKwkJMHg3NCwgMHgwNSwJCS8qIGhvTG93ZXJUaHJlc2hvbGRMZXZVTCAqLworCQkweDc1LCAweDA2LAkJLyogaG9Mb3dlclRocmVzaG9sZFF1YWxETCAqLworCQkweDc2LCAweDA2LAkJLyogaG9Mb3dlclRocmVzaG9sZFF1YWxVTCAqLworCQkweDc4LCAweDE0LAkJLyogaG9UaHJlc2hvbGRMZXZETGludHJhICovCisJCTB4NzksIDB4MTQsCQkvKiBob1RocmVzaG9sZExldlVMaW50cmEgKi8KKwkJMHg3QSwgMHgxNCwJCS8qIGhvVGhyZXNob2xkTXNSYW5nZU1heCAqLworCQkweDdELCAweDA2LAkJLyogbkNlbGwgKi8KKwkJTk1fQVRUX0JTMTFfVElNRVJfSE9fUkVRVUVTVCwgMHgwMywKKwkJMHgyMCwgMHgwMSwgMHgwMCwKKwkJMHg0NSwgMHgwMSwgMHgwMCwKKwkJMHg0OCwgMHgwMSwgMHgwMCwKKwkJMHg1QSwgMHgwMSwgMHgwMCwKKwkJMHg1QiwgMHgwMSwgMHgwNSwKKwkJMHg1RSwgMHgwMSwgMHgxQSwKKwkJMHg1RiwgMHgwMSwgMHgyMCwKKwkJMHg5RCwgMHgwMSwgMHgwMCwKKwkJMHg0NywgMHgwMSwgMHgwMCwKKwkJMHg1QywgMHgwMSwgMHg2NCwKKwkJMHg1RCwgMHgwMSwgMHgxRSwKKwkJMHg5NywgMHgwMSwgMHgyMCwKKwkJMHhGNywgMHgwMSwgMHgzQywKK307CisKKy8vIFBvd2VyIENvbnRyb2wsIFNFVCBBVFRSSUJVVEVTCisKKy8qCisgIE9iamVjdCBDbGFzczogUG93ZXIgQ29udHJvbAorICBCVFMgcmVsYXQuIE51bWJlcjogMAorICBJbnN0YW5jZSAyOiBGRgorICBJbnN0YW5jZSAzOiBGRgorU0VUIEFUVFJJQlVURVMKKyAgZW5hYmxlTXNQb3dlckNvbnRyb2w6IDAwaCA9ICBEaXNhYmxlZAorICBlbmFibGVQb3dlckNvbnRyb2xSTEZXOiAwMGggPSAgRGlzYWJsZWQKKyAgcGNBdmVyYWdpbmdMZXY6CisgICAgQV9MRVZfUEM6IDQgIFNBQ0NIIG11bHRpZnJhbWVzCisgICAgV19MRVZfUEM6IDEgIFNBQ0NIIG11bHRpZnJhbWVzCisgIHBjQXZlcmFnaW5nUXVhbDoKKyAgICBBX1FVQUxfUEM6IDQgIFNBQ0NIIG11bHRpZnJhbWVzCisgICAgV19RVUFMX1BDOiAyICBTQUNDSCBtdWx0aWZyYW1lcworICBwY0xvd2VyVGhyZXNob2xkTGV2REw6IDBGaAorICBwY0xvd2VyVGhyZXNob2xkTGV2VUw6IDBBaAorICBwY0xvd2VyVGhyZXNob2xkUXVhbERMOiAwNWggPSAgIDMuMiUgPCBCRVIgPCAgNi40JQorICBwY0xvd2VyVGhyZXNob2xkUXVhbFVMOiAwNWggPSAgIDMuMiUgPCBCRVIgPCAgNi40JQorICBwY1JMRlRocmVzaG9sZDogMENoCisgIHBjVXBwZXJUaHJlc2hvbGRMZXZETDogMTRoCisgIHBjVXBwZXJUaHJlc2hvbGRMZXZVTDogMEZoCisgIHBjVXBwZXJUaHJlc2hvbGRRdWFsREw6IDA0aCA9ICAgMS42JSA8IEJFUiA8ICAzLjIlCisgIHBjVXBwZXJUaHJlc2hvbGRRdWFsVUw6IDA0aCA9ICAgMS42JSA8IEJFUiA8ICAzLjIlCisgIHBvd2VyQ29uZmlybTogMiAgLHVuaXQgMiBTQUNDSCBtdWx0aWZyYW1lcworICBwb3dlckNvbnRyb2xJbnRlcnZhbDogMiAgLHVuaXQgMiBTQUNDSCBtdWx0aWZyYW1lcworICBwb3dlckluY3JTdGVwU2l6ZTogMDJoID0gNCBkQgorICBwb3dlclJlZFN0ZXBTaXplOiAwMWggPSAyIGRCCisgIHJhZGlvTGlua1RpbWVvdXRCczogNjQgIFNBQ0NIIG11bHRpZnJhbWVzCisgIGVuYWJsZUJTUG93ZXJDb250cm9sOiAwMGggPSAgZGlzYWJsZWQKKyovCisKK3Vuc2lnbmVkIGNoYXIgbXNnXzRbXSA9Cit7CisJTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMV9QV1JfQ1RSTCwgMHgwMCwgMHhGRiwgMHhGRiwKKwkJTk1fQVRUX0JTMTFfRU5BX01TX1BXUl9DVFJMLCAweDAwLAorCQlOTV9BVFRfQlMxMV9FTkFfUFdSX0NUUkxfUkxGVywgMHgwMCwKKwkJMHg3RSwgMHgwNCwgMHgwMSwJLyogcGNBdmVyYWdpbmdMZXYgKi8KKwkJMHg3RiwgMHgwNCwgMHgwMiwJLyogcGNBdmVyYWdpbmdRdWFsICovCisJCTB4ODAsIDB4MEYsCQkvKiBwY0xvd2VyVGhyZXNob2xkTGV2REwgKi8KKwkJMHg4MSwgMHgwQSwJCS8qIHBjTG93ZXJUaHJlc2hvbGRMZXZVTCAqLworCQkweDgyLCAweDA1LAkJLyogcGNMb3dlclRocmVzaG9sZFF1YWxETCAqLworCQkweDgzLCAweDA1LAkJLyogcGNMb3dlclRocmVzaG9sZFF1YWxVTCAqLworCQkweDg0LCAweDBDLCAJCS8qIHBjUkxGVGhyZXNob2xkICovCisJCTB4ODUsIDB4MTQsIAkJLyogcGNVcHBlclRocmVzaG9sZExldkRMICovCisJCTB4ODYsIDB4MEYsIAkJLyogcGNVcHBlclRocmVzaG9sZExldlVMICovCisJCTB4ODcsIDB4MDQsCQkvKiBwY1VwcGVyVGhyZXNob2xkUXVhbERMICovCisJCTB4ODgsIDB4MDQsCQkvKiBwY1VwcGVyVGhyZXNob2xkUXVhbFVMICovCisJCTB4ODksIDB4MDIsCQkvKiBwb3dlckNvbmZpcm0gKi8KKwkJMHg4QSwgMHgwMiwJCS8qIHBvd2VyQ29uZmlybUludGVydmFsICovCisJCTB4OEIsIDB4MDIsCQkvKiBwb3dlckluY3JTdGVwU2l6ZSAqLworCQkweDhDLCAweDAxLAkJLyogcG93ZXJSZWRTdGVwU2l6ZSAqLworCQkweDhELCAweDQwLAkJLyogcmFkaW9MaW5rVGltZW91dEJzICovCisJCTB4NjUsIDB4MDEsIDB4MDAgLy8gc2V0IHRvIDB4MDEgdG8gZW5hYmxlIEJTUG93ZXJDb250cm9sCit9OworCisKKy8vIFRyYW5zY2VpdmVyLCBTRVQgVFJYIEFUVFJJQlVURVMgKFRSWCAwKQorCisvKgorICBPYmplY3QgQ2xhc3M6IFRyYW5zY2VpdmVyCisgIEJUUyByZWxhdC4gTnVtYmVyOiAwCisgIFRyYW5jZWl2ZXIgbnVtYmVyOiAwCisgIEluc3RhbmNlIDM6IEZGCitTRVQgVFJYIEFUVFJJQlVURVMKKyAgYVJGQ05MaXN0IChIRVgpOiAgMDAwMQorICB0eFB3ck1heFJlZHVjdGlvbjogMDBoID0gICAzMGRCCisgIHJhZGlvTWVhc0dyYW46IDI1NCAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgcmFkaW9NZWFzUmVwOiAwMWggPSAgZW5hYmxlZAorICBtZW1iZXJPZkVtZXJnZW5jeUNvbmZpZzogMDFoID0gIFRSVUUKKyAgdHJ4QXJlYTogMDBoID0gVFJYIGRvZXNuJ3QgYmVsb25nIHRvIGEgY29uY2VudHJpYyBjZWxsCisqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBiczExX2F0dHJfcmFkaW9bXSA9Cit7CisJCU5NX0FUVF9BUkZDTl9MSVNULCAweDAxLCAweDAwLCBIQVJEQ09ERURfQVJGQ04gLyoweDAxKi8sCisJCU5NX0FUVF9SRl9NQVhQT1dSX1IsIDB4MDAsCisJCU5NX0FUVF9CUzExX1JBRElPX01FQVNfR1JBTiwgMHgwMSwgMHgwNSwKKwkJTk1fQVRUX0JTMTFfUkFESU9fTUVBU19SRVAsIDB4MDEsIDB4MDEsCisJCU5NX0FUVF9CUzExX0VNUkdfQ0ZHX01FTUJFUiwgMHgwMSwgMHgwMSwKKwkJTk1fQVRUX0JTMTFfVFJYX0FSRUEsIDB4MDEsIDB4MDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfYnRzW10gPSB7CisJTk1fQVRUX0lOVEVSRl9CT1VORCwgMHg1NSwgMHg1YiwgMHg2MSwgMHg2NywgMHg2ZCwgMHg3MywKKwkvKiBpbnRlcmZlcmVuY2UgYXZnLiBwZXJpb2QgaW4gbnVtYmVycyBvZiBTQUNDSCBtdWx0aWZyICovCisJTk1fQVRUX0lOVEFWRV9QQVJBTSwgMHgwNiwKKwkvKiBjb25uIGZhaWwgYmFzZWQgb24gU0FDQ0ggZXJyb3IgcmF0ZSAqLworCU5NX0FUVF9DT05OX0ZBSUxfQ1JJVCwgMHgwMCwgMHgwMiwgMHgwMSwgMHgxMCwKKwlOTV9BVFRfVDIwMCwgMHgxZSwgMHgyNCwgMHgyNCwgMHhhOCwgMHgzNCwgMHgyMSwgMHhhOCwKKwlOTV9BVFRfTUFYX1RBLCAweDNmLAorCU5NX0FUVF9PVkVSTF9QRVJJT0QsIDB4MDAsIDB4MDEsIDEwLCAvKiBzZWNvbmRzICovCisJTk1fQVRUX0NDQ0hfTF9ULCAxMCwgLyogcGVyY2VudCAqLworCU5NX0FUVF9DQ0NIX0xfSV9QLCAxLCAvKiBzZWNvbmRzICovCisJTk1fQVRUX1JBQ0hfQl9USFJFU0gsIDEwLCAvKiBidXN5IHRocmVzaG9sZCBpbiAtIGRCbSAqLworCU5NX0FUVF9MREFWR19TTE9UUywgMHgwMywgMHhlOCwgLyogcmFjaCBsb2FkIGF2ZXJhZ2luZyAxMDAwIHNsb3RzICovCisJTk1fQVRUX0JUU19BSVJfVElNRVIsIDEyOCwgLyogbWlsaXNlY29uZHMgKi8KKwlOTV9BVFRfTlkxLCAxMCwgLyogMTAgcmV0cmFuc21pc3Npb25zIG9mIHBoeXNpY2FsIGNvbmZpZyAqLworCU5NX0FUVF9CQ0NIX0FSRkNOLCBIQVJEQ09ERURfQVJGQ04gPj4gOCwgSEFSRENPREVEX0FSRkNOICYgMHhmZiwKKwlOTV9BVFRfQlNJQywgSEFSRENPREVEX0JTSUMsCisJTk1fQVRUX0lQQUNDX0NHSSwgMCwgNywgIDB4MDAsIDB4ZjEsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfcmFkaW9bXSA9IHsKKwlOTV9BVFRfUkZfTUFYUE9XUl9SLCAweDBjLCAvKiBudW1iZXIgb2YgLTJkQiByZWR1Y3Rpb24gc3RlcHMgLyBQbiAqLworCU5NX0FUVF9BUkZDTl9MSVNULCAweDAwLCAweDAyLCBIQVJEQ09ERURfQVJGQ04gPj4gOCwgSEFSRENPREVEX0FSRkNOICYgMHhmZiwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5hbm9idHNfYXR0cl9uc2VbXSA9IHsKKwlOTV9BVFRfSVBBQ0NfTlNFSSwgMCwgMiwgIDB4MDMsIDB4OWQsIC8qIE5TRUkgOTI1ICovCisJTk1fQVRUX0lQQUNDX05TX0NGRywgMCwgNywgIDMsICAvKiAodW4pYmxvY2tpbmcgdGltZXIgKFRucy1ibG9jaykgKi8KKwkJCQkgICAgMywgIC8qICh1bilibG9ja2luZyByZXRyaWVzICovCisJCQkJICAgIDMsICAvKiByZXNldCB0aW1lciAoVG5zLXJlc2V0KSAqLworCQkJCSAgICAzLCAgLyogcmVzZXQgcmV0cmllcyAqLworCQkJCSAgICAzMCwgIC8qIHRlc3QgdGltZXIgKFRucy10ZXN0KSAqLworCQkJCSAgICAzLCAgLyogYWxpdmUgdGltZXIgKFRucy1hbGl2ZSkgKi8KKwkJCQkgICAgMTAsIC8qIGFsaXZlIHJldHJpcmVzICovCisJTk1fQVRUX0lQQUNDX0JTU0dQX0NGRywgMCwgMTEsCisJCQkJICAgIDMsICAvKiBibG9ja2ltZyB0aW1lciAoVDEpICovCisJCQkJICAgIDMsICAvKiBibG9ja2luZyByZXRyaWVzICovCisJCQkJICAgIDMsICAvKiB1bmJsb2NraW5nIHJldHJpZXMgKi8KKwkJCQkgICAgMywgIC8qIHJlc2V0IHRpbWVyICovCisJCQkJICAgIDMsICAvKiByZXNldCByZXRyaWVzICovCisJCQkJICAgIDEwLCAvKiBzdXNwZW5kIHRpbWVyIChUMykgaW4gMTAwbXMgKi8KKwkJCQkgICAgMywgIC8qIHN1c3BlbmQgcmV0cmllcyAqLworCQkJCSAgICAxMCwgLyogcmVzdW1lIHRpbWVyIChUNCkgaW4gMTAwbXMgKi8KKwkJCQkgICAgMywgIC8qIHJlc3VtZSByZXRyaWVzICovCisJCQkJICAgIDEwLCAvKiBjYXBhYmlsaXR5IHVwZGF0ZSB0aW1lciAoVDUpICovCisJCQkJICAgIDMsICAvKiBjYXBhYmlsaXR5IHVwZGF0ZSByZXRyaWVzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBuYW5vYnRzX2F0dHJfY2VsbFtdID0geworCU5NX0FUVF9JUEFDQ19SQUMsIDAsIDEsICAxLCAvKiByb3V0aW5nIGFyZWEgY29kZSAqLworCU5NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkcsIDAsIDIsCisJCTUsCS8qIHJlcGVhdCB0aW1lICg1MG1zKSAqLworCQkzLAkvKiByZXBlYXQgY291bnQgKi8KKwlOTV9BVFRfSVBBQ0NfQlZDSSwgMCwgMiwgIDB4MDMsIDB4OWQsIC8qIEJWQ0kgOTI1ICovCisJTk1fQVRUX0lQQUNDX1JMQ19DRkcsIDAsIDksCisJCTIwLCAJLyogVDMxNDIgKi8KKwkJNSwgCS8qIFQzMTY5ICovCisJCTUsCS8qIFQzMTkxICovCisJCTIwMCwJLyogVDMxOTMgKi8KKwkJNSwJLyogVDMxOTUgKi8KKwkJMTAsCS8qIE4zMTAxICovCisJCTQsCS8qIE4zMTAzICovCisJCTgsCS8qIE4zMTA1ICovCisJCTE1LAkvKiBSTEMgQ1YgY291bnRkb3duICovCisJTk1fQVRUX0lQQUNDX0NPRElOR19TQ0hFTUVTLCAwLCAyLCAgMHgwZiwgMHgwMCwKKwlOTV9BVFRfSVBBQ0NfUkxDX0NGR18yLCAwLCA1LAorCQkweDAwLCAyNTAsCisJCTB4MDAsIDI1MCwKKwkJMiwJLyogTUNTMiAqLworI2lmIDAKKwkvKiBFREdFIG1vZGVsIG9ubHksIGJyZWFrcyBvbGRlciBtb2RlbHMuCisJICogU2hvdWxkIGlucXVpcmUgdGhlIEJUUyBjYXBhYmlsaXRpZXMgKi8KKwlOTV9BVFRfSVBBQ0NfUkxDX0NGR18zLCAwLCAxLAorCQkyLAkvKiBNQ1MyICovCisjZW5kaWYKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5hbm9idHNfYXR0cl9uc3ZjMFtdID0geworCU5NX0FUVF9JUEFDQ19OU1ZDSSwgMCwgMiwgIDB4MDMsIDB4OWQsIC8qIDkyNSAqLworCU5NX0FUVF9JUEFDQ19OU19MSU5LX0NGRywgMCwgOCwKKwkJMHg1OSwgMHhkOCwgLyogcmVtb3RlIHVkcCBwb3J0ICgyMzAwMCkgKi8KKwkJMTkyLCAxNjgsIDEwMCwgMTEsIC8qIHJlbW90ZSBpcCBhZGRyZXNzICovCisJCTB4NTksIDB4ZDgsIC8qIGxvY2FsIHVkcCBwb3J0ICgyMzAwMCkgKi8KK307CisKKy8qIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuZXZlciB3ZSBnZXQgYSBHU00gMTIuMjEgc3RhdGUgY2hhbmdlIGV2ZW50ICovCitpbnQgbm1fc3RhdGVfZXZlbnQoZW51bSBubV9ldnQgZXZ0LCB1X2ludDhfdCBvYmpfY2xhc3MsIHZvaWQgKm9iaiwKKwkJICAgc3RydWN0IGdzbV9ubV9zdGF0ZSAqb2xkX3N0YXRlLCBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpuZXdfc3RhdGUpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCXN0cnVjdCBnc21fYnRzX2dwcnNfbnN2YyAqbnN2YzsKKworCS8qIFRoaXMgZXZlbnQtZHJpdmVuIEJUUyBzZXR1cCBpcyBjdXJyZW50bHkgb25seSByZXF1aXJlZCBvbiBuYW5vQlRTICovCisKKwkvKiBFVlRfU1RBVEVDSEdfQURNIGlzIGNhbGxlZCBhZnRlciB3ZSBjYWxsIGNoZ19hZG1fc3RhdGUoKSBhbmQgd291bGQgY3JlYXRlCisJICogZW5kbGVzcyBsb29wICovCisJaWYgKGV2dCAhPSBFVlRfU1RBVEVDSEdfT1BFUikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKG9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfU0lURV9NQU5BR0VSOgorCQlidHMgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZ3NtX2J0cywgc2l0ZV9tZ3IpOworCQlpZiAoKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gMiAmJgorCQkgICAgIG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IE5NX0FWU1RBVEVfT0spIHx8CisJCSAgICAobmV3X3N0YXRlLT5vcGVyYXRpb25hbCA9PSAxICYmCisJCSAgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9PRkZfTElORSkpCisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsIDB4ZmYsIDB4ZmYsIDB4ZmYpOworCQlicmVhazsKKwljYXNlIE5NX09DX0JUUzoKKwkJYnRzID0gb2JqOworCQlpZiAobmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9ERVBFTkRFTkNZKSB7CisJCQlwYXRjaF9ubV90YWJsZXMoYnRzKTsKKwkJCWFiaXNfbm1fc2V0X2J0c19hdHRyKGJ0cywgbmFub2J0c19hdHRyX2J0cywKKwkJCQkJICAgICBzaXplb2YobmFub2J0c19hdHRyX2J0cykpOworCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGJ0cywgb2JqX2NsYXNzLAorCQkJCQkgICAgICBidHMtPmJ0c19uciwgMHhmZiwgMHhmZiwKKwkJCQkJICAgICAgTk1fU1RBVEVfVU5MT0NLRUQpOworCQkJYWJpc19ubV9vcHN0YXJ0KGJ0cywgb2JqX2NsYXNzLAorCQkJCQlidHMtPmJ0c19uciwgMHhmZiwgMHhmZik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19DSEFOTkVMOgorCQl0cyA9IG9iajsKKwkJdHJ4ID0gdHMtPnRyeDsKKwkJaWYgKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gMSAmJgorCQkgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9ERVBFTkRFTkNZKSB7CisJCQlwYXRjaF9ubV90YWJsZXModHJ4LT5idHMpOworCQkJZW51bSBhYmlzX25tX2NoYW5fY29tYiBjY29tYiA9CisJCQkJCQlhYmlzX25tX2NoY29tYjRwY2hhbih0cy0+cGNoYW4pOworCQkJYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHRzLCBjY29tYik7CisJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUodHJ4LT5idHMsIG9ial9jbGFzcywKKwkJCQkJICAgICAgdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgdHMtPm5yLAorCQkJCQkgICAgICBOTV9TVEFURV9VTkxPQ0tFRCk7CisJCQlhYmlzX25tX29wc3RhcnQodHJ4LT5idHMsIG9ial9jbGFzcywKKwkJCQkJdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgdHMtPm5yKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX09DX1JBRElPX0NBUlJJRVI6CisJCXRyeCA9IG9iajsKKwkJaWYgKG5ld19zdGF0ZS0+b3BlcmF0aW9uYWwgPT0gMSAmJgorCQkgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9PSykKKwkJCWFiaXNfbm1fb3BzdGFydCh0cngtPmJ0cywgb2JqX2NsYXNzLCB0cngtPmJ0cy0+YnRzX25yLAorCQkJCQl0cngtPm5yLCAweGZmKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX05TRToKKwkJYnRzID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGdzbV9idHMsIGdwcnMubnNlKTsKKwkJaWYgKCFidHMtPmdwcnMuZW5hYmxlZCkKKwkJCWJyZWFrOworCQlpZiAobmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gNSkgeworCQkJYWJpc19ubV9pcGFjY2Vzc19zZXRfYXR0cihidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCQkgIDB4ZmYsIDB4ZmYsIG5hbm9idHNfYXR0cl9uc2UsCisJCQkJCQkgIHNpemVvZihuYW5vYnRzX2F0dHJfbnNlKSk7CisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkweGZmLCAweGZmKTsKKwkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCSAgICAgIDB4ZmYsIDB4ZmYsIE5NX1NUQVRFX1VOTE9DS0VEKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfQ0VMTDoKKwkJYnRzID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IGdzbV9idHMsIGdwcnMuY2VsbCk7CisJCWlmICghYnRzLT5ncHJzLmVuYWJsZWQpCisJCQlicmVhazsKKwkJaWYgKG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IDUpIHsKKwkJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X2F0dHIoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkJICAwLCAweGZmLCBuYW5vYnRzX2F0dHJfY2VsbCwKKwkJCQkJCSAgc2l6ZW9mKG5hbm9idHNfYXR0cl9jZWxsKSk7CisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkwLCAweGZmKTsKKwkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCSAgICAgIDAsIDB4ZmYsIE5NX1NUQVRFX1VOTE9DS0VEKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfTlNWQzoKKwkJbnN2YyA9IG9iajsKKwkJYnRzID0gbnN2Yy0+YnRzOworCQlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKQorCQkJYnJlYWs7CisJICAgICAgICAvKiBXZSBza2lwIE5TVkMxIHNpbmNlIHdlIG9ubHkgdXNlIE5TVkMwICovCisJCWlmIChuc3ZjLT5pZCA9PSAxKQorCQkJYnJlYWs7CisJCWlmIChuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX09GRl9MSU5FKSB7CisJCQlhYmlzX25tX2lwYWNjZXNzX3NldF9hdHRyKGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJCSAgbnN2Yy0+aWQsIDB4ZmYsCisJCQkJCQkgIG5hbm9idHNfYXR0cl9uc3ZjMCwKKwkJCQkJCSAgc2l6ZW9mKG5hbm9idHNfYXR0cl9uc3ZjMCkpOworCQkJYWJpc19ubV9vcHN0YXJ0KGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJbnN2Yy0+aWQsIDB4ZmYpOworCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJICAgICAgbnN2Yy0+aWQsIDB4ZmYsCisJCQkJCSAgICAgIE5NX1NUQVRFX1VOTE9DS0VEKTsKKwkJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgd2UgcmVjZWl2ZSBhIDEyLjIxIFNXIGFjdGl2YXRlZCByZXBvcnQgKi8KK3N0YXRpYyBpbnQgc3dfYWN0aXZfcmVwKHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbWItPnRyeC0+YnRzOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgZm9oLT5vYmpfaW5zdC50cnhfbnIpOworCisJaWYgKCF0cngpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChmb2gtPm9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfQkFTRUJfVFJBTlNDOgorCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUodHJ4LT5idHMsIGZvaC0+b2JqX2NsYXNzLAorCQkJCSAgICAgIHRyeC0+YnRzLT5idHNfbnIsIHRyeC0+bnIsIDB4ZmYsCisJCQkJICAgICAgTk1fU1RBVEVfVU5MT0NLRUQpOworCQlhYmlzX25tX29wc3RhcnQodHJ4LT5idHMsIGZvaC0+b2JqX2NsYXNzLAorCQkJCXRyeC0+YnRzLT5idHNfbnIsIHRyeC0+bnIsIDB4ZmYpOworCQkvKiBUUlggc29mdHdhcmUgaXMgYWN0aXZlLCB0ZWxsIGl0IHRvIGluaXRpYXRlIFJTTCBMaW5rICovCisJCWFiaXNfbm1faXBhY2Nlc3NfcnNsX2Nvbm5lY3QodHJ4LCAwLCAzMDAzLCB0cngtPnJzbF90ZWkpOworCQlicmVhazsKKwljYXNlIE5NX09DX1JBRElPX0NBUlJJRVI6IHsKKwkJLyoKKwkJICogTG9ja2luZyB0aGUgcmFkaW8gY2FycmllciB3aWxsIG1ha2UgaXQgZ28KKwkJICogb2ZmbGluZSBhZ2FpbiBhbmQgd2Ugd291bGQgY29tZSBoZXJlLiBUaGUKKwkJICogZnJhbWV3b3JrIHNob3VsZCBkZXRlcm1pbmUgdGhhdCB0aGVyZSB3YXMKKwkJICogbm8gY2hhbmdlIGFuZCBhdm9pZCByZWN1cnNpb24uCisJCSAqCisJCSAqIFRoaXMgY29kZSBpcyBoZXJlIHRvIG1ha2Ugc3VyZSB0aGF0IG9uIHN0YXJ0CisJCSAqIGEgVFJYIHJlbWFpbnMgbG9ja2VkLgorCQkgKi8KKwkJaW50IHJjX3N0YXRlID0gdHJ4LT5ubV9zdGF0ZS5hZG1pbmlzdHJhdGl2ZTsKKwkJLyogUGF0Y2ggQVJGQ04gaW50byByYWRpbyBhdHRyaWJ1dGUgKi8KKwkJbmFub2J0c19hdHRyX3JhZGlvWzVdICY9IDB4ZjA7CisJCW5hbm9idHNfYXR0cl9yYWRpb1s1XSB8PSB0cngtPmFyZmNuID4+IDg7CisJCW5hbm9idHNfYXR0cl9yYWRpb1s2XSA9IHRyeC0+YXJmY24gJiAweGZmOworCQlhYmlzX25tX3NldF9yYWRpb19hdHRyKHRyeCwgbmFub2J0c19hdHRyX3JhZGlvLAorCQkJCSAgICAgICBzaXplb2YobmFub2J0c19hdHRyX3JhZGlvKSk7CisJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZSh0cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJICAgICAgdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgMHhmZiwKKwkJCQkgICAgICByY19zdGF0ZSk7CisJCWFiaXNfbm1fb3BzdGFydCh0cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsIHRyeC0+YnRzLT5idHNfbnIsCisJCQkJdHJ4LT5uciwgMHhmZik7CisJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBDYWxsYmFjayBmdW5jdGlvbiBmb3IgTkFDSyBvbiB0aGUgT01MIE5NICovCitzdGF0aWMgaW50IG9tbF9tc2dfbmFjayh1X2ludDhfdCBtdCkKK3sKKwlpZiAobXQgPT0gTk1fTVRfU0VUX0JUU19BVFRSX05BQ0spIHsKKwkJTE9HUChETk0sIExPR0xfRkFUQUwsICJGYWlsZWQgdG8gc2V0IEJUUyBhdHRyaWJ1dGVzLiBUaGF0IGlzIGZhdGFsLiAiCisJCQkJIldhcyB0aGUgYnRzIHR5cGUgYW5kIGZyZXF1ZW5jeSBwcm9wZXJseSBzcGVjaWZpZWQ/XG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBldmVyeSB0aW1lIHdlIHJlY2VpdmUgYSBzaWduYWwgZnJvbSBOTSAqLworc3RhdGljIGludCBubV9zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJICAgICB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXVfaW50OF90ICptc2dfdHlwZTsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTX05NX1NXX0FDVElWX1JFUDoKKwkJcmV0dXJuIHN3X2FjdGl2X3JlcChzaWduYWxfZGF0YSk7CisJY2FzZSBTX05NX05BQ0s6CisJCW1zZ190eXBlID0gc2lnbmFsX2RhdGE7CisJCXJldHVybiBvbWxfbXNnX25hY2soKm1zZ190eXBlKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJvb3RzdHJhcF9vbV9uYW5vYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJLyogV2UgZG9uJ3QgZG8gY2FsbGJhY2sgYmFzZWQgYm9vdHN0cmFwcGluZywgYnV0IGV2ZW50IGRyaXZlbiAoc2VlIGFib3ZlKSAqLworfQorCitzdGF0aWMgdm9pZCBubV9yZWNvbmZpZ190cyhzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCWVudW0gYWJpc19ubV9jaGFuX2NvbWIgY2NvbWIgPSBhYmlzX25tX2NoY29tYjRwY2hhbih0cy0+cGNoYW4pOworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZTFsID0gJnRzLT5lMV9saW5rOworCisJYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHRzLCBjY29tYik7CisKKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKHRzLT50cngtPmJ0cykpCisJCXJldHVybjsKKworCXN3aXRjaCAodHMtPnBjaGFuKSB7CisJY2FzZSBHU01fUENIQU5fVENIX0Y6CisJY2FzZSBHU01fUENIQU5fVENIX0g6CisJCWFiaXNfbm1fY29ubl90ZXJyX3RyYWYodHMsIGUxbC0+ZTFfbnIsIGUxbC0+ZTFfdHMsCisJCQkJCWUxbC0+ZTFfdHNfc3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5tX3JlY29uZmlnX3RyeChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxbCA9ICZ0cngtPnJzbF9lMV9saW5rOworCWludCBpOworCisJcGF0Y2hfbm1fdGFibGVzKHRyeC0+YnRzKTsKKworCXN3aXRjaCAodHJ4LT5idHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQkvKiBGSVhNRTogZGlzY292ZXIgdGhpcyBieSBmZXRjaGluZyBhbiBhdHRyaWJ1dGUgKi8KKyNpZiAwCisJCXRyeC0+bm9taW5hbF9wb3dlciA9IDE1OyAvKiAxNWRCbSA9PSAzMG1XIFBBIGNvbmZpZ3VyYXRpb24gKi8KKyNlbHNlCisJCXRyeC0+bm9taW5hbF9wb3dlciA9IDI0OyAvKiAyNGRCbSA9PSAyNTBtVyBQQSBjb25maWd1cmF0aW9uICovCisjZW5kaWYKKwkJYWJpc19ubV9jb25uX3RlcnJfc2lnbih0cngsIGUxbC0+ZTFfbnIsIGUxbC0+ZTFfdHMsCisJCQkJCWUxbC0+ZTFfdHNfc3MpOworCQlhYmlzX25tX2VzdGFibGlzaF90ZWkodHJ4LT5idHMsIHRyeC0+bnIsIGUxbC0+ZTFfbnIsCisJCQkJICAgICAgZTFsLT5lMV90cywgZTFsLT5lMV90c19zcywgdHJ4LT5yc2xfdGVpKTsKKworCQkvKiBTZXQgUmFkaW8gQXR0cmlidXRlcyAqLworCQlpZiAodHJ4ID09IHRyeC0+YnRzLT5jMCkKKwkJCWFiaXNfbm1fc2V0X3JhZGlvX2F0dHIodHJ4LCBiczExX2F0dHJfcmFkaW8sCisJCQkJCSAgICAgICBzaXplb2YoYnMxMV9hdHRyX3JhZGlvKSk7CisJCWVsc2UgeworCQkJdV9pbnQ4X3QgdHJ4MV9hdHRyX3JhZGlvW3NpemVvZihiczExX2F0dHJfcmFkaW8pXTsKKwkJCXVfaW50OF90IGFyZmNuX2xvdyA9IHRyeC0+YXJmY24gJiAweGZmOworCQkJdV9pbnQ4X3QgYXJmY25faGlnaCA9ICh0cngtPmFyZmNuID4+IDgpICYgMHgwZjsKKwkJCW1lbWNweSh0cngxX2F0dHJfcmFkaW8sIGJzMTFfYXR0cl9yYWRpbywKKwkJCQlzaXplb2YodHJ4MV9hdHRyX3JhZGlvKSk7CisKKwkJCS8qIHBhdGNoIEFSRkNOIGludG8gVFJYIEF0dHJpYnV0ZXMgKi8KKwkJCXRyeDFfYXR0cl9yYWRpb1syXSAmPSAweGYwOworCQkJdHJ4MV9hdHRyX3JhZGlvWzJdIHw9IGFyZmNuX2hpZ2g7CisJCQl0cngxX2F0dHJfcmFkaW9bM10gPSBhcmZjbl9sb3c7CisKKwkJCWFiaXNfbm1fc2V0X3JhZGlvX2F0dHIodHJ4LCB0cngxX2F0dHJfcmFkaW8sCisJCQkJCSAgICAgICBzaXplb2YodHJ4MV9hdHRyX3JhZGlvKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJc3dpdGNoICh0cngtPmJ0cy0+YmFuZCkgeworCQljYXNlIEdTTV9CQU5EXzg1MDoKKwkJY2FzZSBHU01fQkFORF85MDA6CisJCQl0cngtPm5vbWluYWxfcG93ZXIgPSAyMDsKKwkJCWJyZWFrOworCQljYXNlIEdTTV9CQU5EXzE4MDA6CisJCWNhc2UgR1NNX0JBTkRfMTkwMDoKKwkJCXRyeC0+bm9taW5hbF9wb3dlciA9IDIzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlVuc3VwcG9ydGVkIG5hbm9CVFMgR1NNIGJhbmQgJXNcbiIsCisJCQkJZ3NtX2JhbmRfbmFtZSh0cngtPmJ0cy0+YmFuZCkpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRSWF9OUl9UUzsgaSsrKQorCQlubV9yZWNvbmZpZ190cygmdHJ4LT50c1tpXSk7Cit9CisKK3N0YXRpYyB2b2lkIG5tX3JlY29uZmlnX2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlwYXRjaF9ubV90YWJsZXMoYnRzKTsKKwkJYWJpc19ubV9yYXdfbXNnKGJ0cywgc2l6ZW9mKG1zZ18xKSwgbXNnXzEpOyAvKiBzZXQgQlRTIFNpdGVNZ3IgYXR0ciovCisJCWFiaXNfbm1fc2V0X2J0c19hdHRyKGJ0cywgYnMxMV9hdHRyX2J0cywgc2l6ZW9mKGJzMTFfYXR0cl9idHMpKTsKKwkJYWJpc19ubV9yYXdfbXNnKGJ0cywgc2l6ZW9mKG1zZ18zKSwgbXNnXzMpOyAvKiBzZXQgQlRTIGhhbmRvdmVyIGF0dHIgKi8KKwkJYWJpc19ubV9yYXdfbXNnKGJ0cywgc2l6ZW9mKG1zZ180KSwgbXNnXzQpOyAvKiBzZXQgQlRTIHBvd2VyIGNvbnRyb2wgYXR0ciAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KQorCQlubV9yZWNvbmZpZ190cngodHJ4KTsKK30KKworc3RhdGljIHZvaWQgYm9vdHN0cmFwX29tX2JzMTEoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwkvKiBzdG9wIHNlbmRpbmcgZXZlbnQgcmVwb3J0cyAqLworCWFiaXNfbm1fZXZlbnRfcmVwb3J0cyhidHMsIDApOworCisJLyogYmVnaW4gREIgdHJhbnNtaXNzaW9uICovCisJYWJpc19ubV9iczExX2RiX3RyYW5zbWlzc2lvbihidHMsIDEpOworCisJLyogZW5kIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAwKTsKKworCS8qIFJlc2V0IEJUUyBTaXRlIG1hbmFnZXIgcmVzb3VyY2UgKi8KKwlhYmlzX25tX2JzMTFfcmVzZXRfcmVzb3VyY2UoYnRzKTsKKworCS8qIGJlZ2luIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAxKTsKKworCS8qIHJlY29uZmlndXJlIEJUUyB3aXRoIGFsbCBUUlggYW5kIGFsbCBUUyAqLworCW5tX3JlY29uZmlnX2J0cyhidHMpOworCisJLyogZW5kIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAwKTsKKworCS8qIFJlc2V0IEJUUyBTaXRlIG1hbmFnZXIgcmVzb3VyY2UgKi8KKwlhYmlzX25tX2JzMTFfcmVzZXRfcmVzb3VyY2UoYnRzKTsKKworCS8qIHJlc3RhcnQgc2VuZGluZyBldmVudCByZXBvcnRzICovCisJYWJpc19ubV9ldmVudF9yZXBvcnRzKGJ0cywgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGJvb3RzdHJhcF9vbShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCUxPR1AoRE5NLCBMT0dMX05PVElDRSwgImJvb3RzdHJhcHBpbmcgT01MIGZvciBCVFMgJXVcbiIsIGJ0cy0+bnIpOworCisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlib290c3RyYXBfb21fYnMxMShidHMpOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlib290c3RyYXBfb21fbmFub2J0cyhidHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlVuYWJsZSB0byBib290c3RyYXAgT01MOiBVbmtub3duIEJUUyB0eXBlICVkXG4iLCBidHMtPnR5cGUpOworCX0KK30KKworc3RhdGljIGludCBzaHV0ZG93bl9vbShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCUxPR1AoRE5NLCBMT0dMX05PVElDRSwgInNodXR0aW5nIGRvd24gT01MIGZvciBCVFMgJXVcbiIsIGJ0cy0+bnIpOworCisJLyogc3RvcCBzZW5kaW5nIGV2ZW50IHJlcG9ydHMgKi8KKwlhYmlzX25tX2V2ZW50X3JlcG9ydHMoYnRzLCAwKTsKKworCS8qIGJlZ2luIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAxKTsKKworCS8qIGVuZCBEQiB0cmFuc21pc3Npb24gKi8KKwlhYmlzX25tX2JzMTFfZGJfdHJhbnNtaXNzaW9uKGJ0cywgMCk7CisKKwkvKiBSZXNldCBCVFMgU2l0ZSBtYW5hZ2VyIHJlc291cmNlICovCisJYWJpc19ubV9iczExX3Jlc2V0X3Jlc291cmNlKGJ0cyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGJzY19zaHV0ZG93bl9uZXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJm5ldC0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJaW50IHJjOworCQlyYyA9IHNodXRkb3duX29tKGJ0cyk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHNldCBhbGwgc3lzdGVtIGluZm9ybWF0aW9uIHR5cGVzICovCitzdGF0aWMgaW50IHNldF9zeXN0ZW1faW5mb3Moc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJaW50IGksIHJjOworCXVfaW50OF90IHNpX3RtcFsyM107CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHRyeC0+YnRzOworCisJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLm1zX3R4cHdyX21heF9jY2NoID0KKwkJCW1zX3B3cl9jdGxfbHZsKGJ0cy0+YmFuZCwgYnRzLT5tc19tYXhfcG93ZXIpOworCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5uZWNpID0gYnRzLT5uZXR3b3JrLT5uZWNpOworCisJaWYgKHRyeCA9PSB0cngtPmJ0cy0+YzApIHsKKwkJZm9yIChpID0gMTsgaSA8PSA0OyBpKyspIHsKKwkJCXJjID0gZ3NtX2dlbmVyYXRlX3NpKHNpX3RtcCwgdHJ4LT5idHMsIGkpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQlERUJVR1AoRFJSLCAiU0klMnU6ICVzXG4iLCBpLCBoZXhkdW1wKHNpX3RtcCwgcmMpKTsKKwkJCXJzbF9iY2NoX2luZm8odHJ4LCBpLCBzaV90bXAsIHNpemVvZihzaV90bXApKTsKKwkJfQorCQlpZiAoYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJCWkgPSAxMzsKKwkJCXJjID0gZ3NtX2dlbmVyYXRlX3NpKHNpX3RtcCwgdHJ4LT5idHMsIFJTTF9TWVNURU1fSU5GT18xMyk7CisJCQlpZiAocmMgPCAwKQorCQkJCWdvdG8gZXJyX291dDsKKwkJCURFQlVHUChEUlIsICJTSSUydTogJXNcbiIsIGksIGhleGR1bXAoc2lfdG1wLCByYykpOworCQkJcnNsX2JjY2hfaW5mbyh0cngsIFJTTF9TWVNURU1fSU5GT18xMywgc2lfdG1wLCByYyk7CisJCX0KKwl9CisKKwlpID0gNTsKKwlyYyA9IGdzbV9nZW5lcmF0ZV9zaShzaV90bXAsIHRyeC0+YnRzLCBSU0xfU1lTVEVNX0lORk9fNSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnJfb3V0OworCURFQlVHUChEUlIsICJTSSUydTogJXNcbiIsIGksIGhleGR1bXAoc2lfdG1wLCByYykpOworCXJzbF9zYWNjaF9maWxsaW5nKHRyeCwgUlNMX1NZU1RFTV9JTkZPXzUsIHNpX3RtcCwgcmMpOworCisJaSA9IDY7CisJcmMgPSBnc21fZ2VuZXJhdGVfc2koc2lfdG1wLCB0cngtPmJ0cywgUlNMX1NZU1RFTV9JTkZPXzYpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyX291dDsKKwlERUJVR1AoRFJSLCAiU0klMnU6ICVzXG4iLCBpLCBoZXhkdW1wKHNpX3RtcCwgcmMpKTsKKwlyc2xfc2FjY2hfZmlsbGluZyh0cngsIFJTTF9TWVNURU1fSU5GT182LCBzaV90bXAsIHJjKTsKKworCXJldHVybiAwOworZXJyX291dDoKKwlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIkNhbm5vdCBnZW5lcmF0ZSBTSSAldSBmb3IgQlRTICV1LCBtb3N0IGxpa2VseSAiCisJCSJhIHByb2JsZW0gd2l0aCBuZWlnaGJvciBjZWxsIGxpc3QgZ2VuZXJhdGlvblxuIiwKKwkJaSwgdHJ4LT5idHMtPm5yKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBQYXRjaCB0aGUgdmFyaW91cyBTWVNURU0gSU5GT1JNQVRJT04gdGFibGVzIHRvIHVwZGF0ZQorICogdGhlIExBSQorICovCitzdGF0aWMgdm9pZCBwYXRjaF9ubV90YWJsZXMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwl1X2ludDhfdCBhcmZjbl9sb3cgPSBidHMtPmMwLT5hcmZjbiAmIDB4ZmY7CisJdV9pbnQ4X3QgYXJmY25faGlnaCA9IChidHMtPmMwLT5hcmZjbiA+PiA4KSAmIDB4MGY7CisKKwkvKiBwYXRjaCBBUkZDTiBpbnRvIEJUUyBBdHRyaWJ1dGVzICovCisJYnMxMV9hdHRyX2J0c1s2OV0gJj0gMHhmMDsKKwliczExX2F0dHJfYnRzWzY5XSB8PSBhcmZjbl9oaWdoOworCWJzMTFfYXR0cl9idHNbNzBdID0gYXJmY25fbG93OworCW5hbm9idHNfYXR0cl9idHNbNDJdICY9IDB4ZjA7CisJbmFub2J0c19hdHRyX2J0c1s0Ml0gfD0gYXJmY25faGlnaDsKKwluYW5vYnRzX2F0dHJfYnRzWzQzXSA9IGFyZmNuX2xvdzsKKworCS8qIHBhdGNoIEFSRkNOIGludG8gVFJYIEF0dHJpYnV0ZXMgKi8KKwliczExX2F0dHJfcmFkaW9bMl0gJj0gMHhmMDsKKwliczExX2F0dHJfcmFkaW9bMl0gfD0gYXJmY25faGlnaDsKKwliczExX2F0dHJfcmFkaW9bM10gPSBhcmZjbl9sb3c7CisKKwkvKiBwYXRjaCBCU0lDICovCisJYnMxMV9hdHRyX2J0c1sxXSA9IGJ0cy0+YnNpYzsKKwluYW5vYnRzX2F0dHJfYnRzW3NpemVvZihuYW5vYnRzX2F0dHJfYnRzKS0xMV0gPSBidHMtPmJzaWM7CisKKwkvKiBwYXRjaCBDR0kgKi8KKwlhYmlzX25tX2lwYWNjZXNzX2NnaShuYW5vYnRzX2F0dHJfYnRzK3NpemVvZihuYW5vYnRzX2F0dHJfYnRzKS03LCBidHMpOworCisJLyogcGF0Y2ggdGhlIHBvd2VyIHJlZHVjdGlvbiAqLworCWJzMTFfYXR0cl9yYWRpb1s1XSA9IGJ0cy0+YzAtPm1heF9wb3dlcl9yZWQgLyAyOworCW5hbm9idHNfYXR0cl9yYWRpb1sxXSA9IGJ0cy0+YzAtPm1heF9wb3dlcl9yZWQgLyAyOworCisJLyogcGF0Y2ggTlNFSSAqLworCW5hbm9idHNfYXR0cl9uc2VbM10gPSBidHMtPmdwcnMubnNlLm5zZWkgPj4gODsKKwluYW5vYnRzX2F0dHJfbnNlWzRdID0gYnRzLT5ncHJzLm5zZS5uc2VpICYgMHhmZjsKKworCS8qIHBhdGNoIE5TVkNJICovCisJbmFub2J0c19hdHRyX25zdmMwWzNdID0gYnRzLT5ncHJzLm5zdmNbMF0ubnN2Y2kgPj4gODsKKwluYW5vYnRzX2F0dHJfbnN2YzBbNF0gPSBidHMtPmdwcnMubnN2Y1swXS5uc3ZjaSAmIDB4ZmY7CisKKwkvKiBwYXRjaCBJUCBhZGRyZXNzIGFzIFNHU04gSVAgKi8KKwkqKHVfaW50MTZfdCAqKShuYW5vYnRzX2F0dHJfbnN2YzArOCkgPQorCQkJCWh0b25zKGJ0cy0+Z3Bycy5uc3ZjWzBdLnJlbW90ZV9wb3J0KTsKKwkqKHVfaW50MzJfdCAqKShuYW5vYnRzX2F0dHJfbnN2YzArMTApID0KKwkJCQlodG9ubChidHMtPmdwcnMubnN2Y1swXS5yZW1vdGVfaXApOworCSoodV9pbnQxNl90ICopKG5hbm9idHNfYXR0cl9uc3ZjMCsxNCkgPQorCQkJCWh0b25zKGJ0cy0+Z3Bycy5uc3ZjWzBdLmxvY2FsX3BvcnQpOworCisJLyogcGF0Y2ggQlZDSSAqLworCW5hbm9idHNfYXR0cl9jZWxsWzEyXSA9IGJ0cy0+Z3Bycy5jZWxsLmJ2Y2kgPj4gODsKKwluYW5vYnRzX2F0dHJfY2VsbFsxM10gPSBidHMtPmdwcnMuY2VsbC5idmNpICYgMHhmZjsKKwkvKiBwYXRjaCBSQUMgKi8KKwluYW5vYnRzX2F0dHJfY2VsbFszXSA9IGJ0cy0+Z3Bycy5yYWM7CisKK30KKworc3RhdGljIHZvaWQgYm9vdHN0cmFwX3JzbChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiYm9vdHN0cmFwcGluZyBSU0wgZm9yIEJUUy9UUlggKCV1LyV1KSAiCisJCSJvbiBBUkZDTiAldSB1c2luZyBNQ0M9JXUgTU5DPSV1IExBQz0ldSBDSUQ9JXUgQlNJQz0ldSBUU0M9JXVcbiIsCisJCXRyeC0+YnRzLT5uciwgdHJ4LT5uciwgdHJ4LT5hcmZjbiwgYnNjX2dzbW5ldC0+Y291bnRyeV9jb2RlLAorCQlic2NfZ3NtbmV0LT5uZXR3b3JrX2NvZGUsIHRyeC0+YnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUsCisJCXRyeC0+YnRzLT5jZWxsX2lkZW50aXR5LCB0cngtPmJ0cy0+YnNpYywgdHJ4LT5idHMtPnRzYyk7CisJc2V0X3N5c3RlbV9pbmZvcyh0cngpOworfQorCit2b2lkIGlucHV0X2V2ZW50KGludCBldmVudCwgZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZSwgc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgRVZUX0UxX1RFSV9VUDoKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgRTFJTlBfU0lHTl9PTUw6CisJCQlib290c3RyYXBfb20odHJ4LT5idHMpOworCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfU0lHTl9SU0w6CisJCQlib290c3RyYXBfcnNsKHRyeCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgRVZUX0UxX1RFSV9ETjoKKwkJTE9HUChETUksIExPR0xfTk9USUNFLCAiTG9zdCBzb21lIEUxIFRFSSBsaW5rXG4iKTsKKwkJLyogRklYTUU6IGRlYWwgd2l0aCBURUkgb3IgTDEgbGluayBsb3NzICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBib290c3RyYXBfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3dpdGNoIChidHMtPmJhbmQpIHsKKwljYXNlIEdTTV9CQU5EXzE4MDA6CisJCWlmIChidHMtPmMwLT5hcmZjbiA8IDUxMiB8fCBidHMtPmMwLT5hcmZjbiA+IDg4NSkgeworCQkJTE9HUChETk0sIExPR0xfRVJST1IsICJHU00xODAwIGNoYW5uZWwgbXVzdCBiZSBiZXR3ZWVuIDUxMi04ODUuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX0JBTkRfMTkwMDoKKwkJaWYgKGJ0cy0+YzAtPmFyZmNuIDwgNTEyIHx8IGJ0cy0+YzAtPmFyZmNuID4gODEwKSB7CisJCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkdTTTE5MDAgY2hhbm5lbCBtdXN0IGJlIGJldHdlZW4gNTEyLTgxMC5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fQkFORF85MDA6CisJCWlmIChidHMtPmMwLT5hcmZjbiA8IDEgfHwKKwkJICAgKGJ0cy0+YzAtPmFyZmNuID4gMTI0ICYmIGJ0cy0+YzAtPmFyZmNuIDwgOTU1KSB8fAorCQkgICAgYnRzLT5jMC0+YXJmY24gPiAxMDIzKSAgeworCQkJTE9HUChETk0sIExPR0xfRVJST1IsICJHU005MDAgY2hhbm5lbCBtdXN0IGJlIGJldHdlZW4gMS0xMjQsIDk1NS0xMDIzLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlVuc3VwcG9ydGVkIGZyZXF1ZW5jeSBiYW5kLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChidHMtPm5ldHdvcmstPmF1dGhfcG9saWN5ID09IEdTTV9BVVRIX1BPTElDWV9BQ0NFUFRfQUxMICYmCisJICAgICFidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wuY2VsbF9iYXIpCisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiXG5XQVJOSU5HOiBZb3UgYXJlIHJ1bm5pbmcgYW4gJ2FjY2VwdC1hbGwnICIKKwkJCSJuZXR3b3JrIG9uIGEgQlRTIHRoYXQgaXMgbm90IGJhcnJlZC4gIFRoaXMgIgorCQkJImNvbmZpZ3VyYXRpb24gaXMgbGlrZWx5IHRvIGludGVyZmVyZSB3aXRoIHByb2R1Y3Rpb24gIgorCQkJIkdTTSBuZXR3b3JrcyBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBhIFJGICIKKwkJCSJzaGllbGRlZCBlbnZpcm9ubWVudCBzdWNoIGFzIGEgZmFyYWRheSBjYWdlIVxuXG4iKTsKKworCS8qIENvbnRyb2wgQ2hhbm5lbCBEZXNjcmlwdGlvbiAqLworCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5hdHQgPSAxOworCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5jY2NoX2NvbmYgPSBSU0xfQkNDSF9DQ0NIX0NPTkZfMV9DOworCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19wYV9tZnJtcyA9IFJTTF9CU19QQV9NRlJNU181OworCS8qIFQzMjEyIGlzIHNldCBmcm9tIHZ0eS9jb25maWcgKi8KKworCS8qIHNvbWUgZGVmYXVsdHMgZm9yIG91ciBzeXN0ZW0gaW5mb3JtYXRpb24gKi8KKwlidHMtPnNpX2NvbW1vbi5jZWxsX29wdGlvbnMucmFkaW9fbGlua190aW1lb3V0ID0gMjsgLyogMTIgKi8KKwlidHMtPnNpX2NvbW1vbi5jZWxsX29wdGlvbnMuZHR4ID0gMjsgLyogTVMgc2hhbGwgbm90IHVzZSB1cHBsaW5rIERUWCAqLworCWJ0cy0+c2lfY29tbW9uLmNlbGxfb3B0aW9ucy5wd3JjID0gMDsgLyogUFdSQyBub3Qgc2V0ICovCisKKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuYWNzID0gMDsKKworCWJ0cy0+c2lfY29tbW9uLm5jY19wZXJtaXR0ZWQgPSAweGZmOworCisJcGFnaW5nX2luaXQoYnRzKTsKKworCXJldHVybiAwOworfQorCitpbnQgYnNjX2Jvb3RzdHJhcF9uZXR3b3JrKGludCAoKm1uY2NfcmVjdikoc3RydWN0IGdzbV9uZXR3b3JrICosIGludCwgdm9pZCAqKSwKKwkJCSAgY29uc3QgY2hhciAqY29uZmlnX2ZpbGUpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpbnQgcmM7CisKKwkvKiBpbml0aWFsaXplIG91ciBkYXRhIHN0cnVjdHVyZXMgKi8KKwlic2NfZ3NtbmV0ID0gZ3NtX25ldHdvcmtfaW5pdCgxLCAxLCBtbmNjX3JlY3YpOworCWlmICghYnNjX2dzbW5ldCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlic2NfZ3NtbmV0LT5uYW1lX2xvbmcgPSB0YWxsb2Nfc3RyZHVwKGJzY19nc21uZXQsICJPcGVuQlNDIik7CisJYnNjX2dzbW5ldC0+bmFtZV9zaG9ydCA9IHRhbGxvY19zdHJkdXAoYnNjX2dzbW5ldCwgIk9wZW5CU0MiKTsKKworCXRlbG5ldF9pbml0KGJzY19nc21uZXQsIDQyNDIpOworCXJjID0gdnR5X3JlYWRfY29uZmlnX2ZpbGUoY29uZmlnX2ZpbGUpOworCWlmIChyYyA8IDApIHsKKwkJTE9HUChETk0sIExPR0xfRkFUQUwsICJGYWlsZWQgdG8gcGFyc2UgdGhlIGNvbmZpZyBmaWxlOiAnJXMnXG4iLCBjb25maWdfZmlsZSk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19OTSwgbm1fc2lnX2NiLCBOVUxMKTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJmJzY19nc21uZXQtPmJ0c19saXN0LCBsaXN0KSB7CisJCWJvb3RzdHJhcF9idHMoYnRzKTsKKwkJaWYgKCFpc19pcGFjY2Vzc19idHMoYnRzKSkKKwkJCXJjID0gZTFfcmVjb25maWdfYnRzKGJ0cyk7CisKKwkJaWYgKHJjIDwgMCkKKwkJCWV4aXQgKDEpOworCX0KKworCS8qIGluaXRpYWxpemUgbmFub0JUUyBzdXBwb3J0IG9tY2UgKi8KKwlyYyA9IGlwYWNjZXNzX3NldHVwKGJzY19nc21uZXQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9ic2NfcmxsLmMgYi9vcGVuYnNjL3NyYy9ic2NfcmxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0ZjVhYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2JzY19ybGwuYwpAQCAtMCwwICsxLDEyMiBAQAorLyogR1NNIEJTQyBSYWRpbyBMaW5rIExheWVyIEFQSQorICogM0dQUCBUUyAwOC41OCB2ZXJzaW9uIDguNi4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDU5NiBWOC42LjAgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2JzY19ybGwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorCitzdHJ1Y3QgYnNjX3JsbF9yZXEgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwl1X2ludDhfdCBsaW5rX2lkOworCisJdm9pZCAoKmNiKShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwKKwkJICAgdm9pZCAqZGF0YSwgZW51bSBic2Nfcmxscl9pbmQpOworCXZvaWQgKmRhdGE7Cit9OworCisvKiB3ZSBvbmx5IGNvbXBhcmUgQzEsIEMyIGFuZCBTQVBJICovCisjZGVmaW5lIExJTktJRF9NQVNLCTB4QzcKKworc3RhdGljIExMSVNUX0hFQUQoYnNjX3JsbF9yZXFzKTsKKworc3RhdGljIHZvaWQgY29tcGxldGVfcmxscihzdHJ1Y3QgYnNjX3JsbF9yZXEgKnJsbHIsIGVudW0gYnNjX3JsbHJfaW5kIHR5cGUpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gJnJsbHItPmxjaGFuLT5jb25uOworCWxsaXN0X2RlbCgmcmxsci0+bGlzdCk7CisJcHV0X3N1YnNjcl9jb24oY29ubik7CisJcmxsci0+Y2Iocmxsci0+bGNoYW4sIHJsbHItPmxpbmtfaWQsIHJsbHItPmRhdGEsIHR5cGUpOworCXRhbGxvY19mcmVlKHJsbHIpOworfQorCitzdGF0aWMgdm9pZCB0aW1lcl9jYih2b2lkICpfcmxscikKK3sKKwlzdHJ1Y3QgYnNjX3JsbF9yZXEgKnJsbHIgPSBfcmxscjsKKworCWNvbXBsZXRlX3JsbHIocmxsciwgQlNDX1JMTFJfSU5EX1RJTUVPVVQpOworfQorCisvKiBlc3RhYmxpc2ggYSBSTEwgY29ubmVjdGlvbiB3aXRoIGdpdmVuIFNBUEkgLyBwcmlvcml0eSAqLworaW50IHJsbF9lc3RhYmxpc2goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IHNhcGksCisJCSAgdm9pZCAoKmNiKShzdHJ1Y3QgZ3NtX2xjaGFuICosIHVfaW50OF90LCB2b2lkICosCisJCQkgICAgIGVudW0gYnNjX3JsbHJfaW5kKSwKKwkJICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCBic2NfcmxsX3JlcSAqcmxsciA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGJzY19ybGxfcmVxKTsKKwl1X2ludDhfdCBsaW5rX2lkOworCWlmICghcmxscikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsaW5rX2lkID0gc2FwaTsKKworCS8qIElmIHdlIGFyZSBhIFRDSCBhbmQgbm90IGluIHNpZ25hbGxpbmcgbW9kZSwgd2UgbmVlZCB0bworCSAqIGluZGljYXRlIHRoYXQgdGhlIG5ldyBSTEwgY29ubmVjdGlvbiBpcyB0byBiZSBtYWRlIG9uIHRoZSBTQUNDSCAqLworCWlmICgobGNoYW4tPnR5cGUgPT0gR1NNX0xDSEFOX1RDSF9GIHx8CisJICAgICBsY2hhbi0+dHlwZSA9PSBHU01fTENIQU5fVENIX0gpICYmIHNhcGkgIT0gMCkKKwkJbGlua19pZCB8PSAweDQwOworCisJY29ubiA9ICZsY2hhbi0+Y29ubjsKKwl1c2Vfc3Vic2NyX2Nvbihjb25uKTsKKwlybGxyLT5sY2hhbiA9IGxjaGFuOworCXJsbHItPmxpbmtfaWQgPSBsaW5rX2lkOworCXJsbHItPmNiID0gY2I7CisJcmxsci0+ZGF0YSA9IGRhdGE7CisKKwlsbGlzdF9hZGQoJnJsbHItPmxpc3QsICZic2NfcmxsX3JlcXMpOworCisJcmxsci0+dGltZXIuY2IgPSAmdGltZXJfY2I7CisJcmxsci0+dGltZXIuZGF0YSA9IHJsbHI7CisKKwlic2Nfc2NoZWR1bGVfdGltZXIoJnJsbHItPnRpbWVyLCAxMCwgMCk7CisKKwkvKiBzZW5kIHRoZSBSU0wgUkxMIEVTVGFibGlzaCBSRVF1ZXN0ICovCisJcmV0dXJuIHJzbF9lc3RhYmxpc2hfcmVxdWVzdChybGxyLT5sY2hhbiwgcmxsci0+bGlua19pZCk7Cit9CisKKy8qIENhbGxlZCBmcm9tIFJTTCBjb2RlIGluIGNhc2Ugd2UgaGF2ZSByZWNlaXZlZCBhbiBpbmRpY2F0aW9uIHJlZ2FyZGluZworICogYW55IFJMTCBsaW5rICovCit2b2lkIHJsbF9pbmRpY2F0aW9uKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkLCB1X2ludDhfdCB0eXBlKQoreworCXN0cnVjdCBic2NfcmxsX3JlcSAqcmxsciwgKnJsbHIyOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShybGxyLCBybGxyMiwgJmJzY19ybGxfcmVxcywgbGlzdCkgeworCQlpZiAocmxsci0+bGNoYW4gPT0gbGNoYW4gJiYKKwkJICAgIChybGxyLT5saW5rX2lkICYgTElOS0lEX01BU0spID09IChsaW5rX2lkICYgTElOS0lEX01BU0spKSB7CisJCQlic2NfZGVsX3RpbWVyKCZybGxyLT50aW1lcik7CisJCQljb21wbGV0ZV9ybGxyKHJsbHIsIHR5cGUpOworCQkJcmV0dXJuOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnNjX3ZlcnNpb24uYyBiL29wZW5ic2Mvc3JjL2JzY192ZXJzaW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI2NjE5NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2JzY192ZXJzaW9uLmMKQEAgLTAsMCArMSwzMiBAQAorLyogSG9sZCB0aGUgY29weXJpZ2h0IGFuZCB2ZXJzaW9uIHN0cmluZyAqLworLyogKEMpIDIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiYnNjY29uZmlnLmgiCisKK2NvbnN0IGNoYXIgKm9wZW5ic2NfdmVyc2lvbiA9ICJPcGVuQlNDICIgUEFDS0FHRV9WRVJTSU9OOworY29uc3QgY2hhciAqb3BlbmJzY19jb3B5cmlnaHQgPQorCSJDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCBIYXJhbGQgV2VsdGUsIEhvbGdlciBGcmV5dGhlclxuIgorCSJDb250cmlidXRpb25zIGJ5IERhbmllbCBXaWxsbWFubiwgSmFuIEzDvGJiZSxTdGVmYW4gU2NobWlkdFxuIgorCSJEaWV0ZXIgU3BhYXIsIEFuZHJlYXMgRXZlcnNiZXJnXG5cbiIKKwkiTGljZW5zZSBHUEx2Mis6IEdOVSBHUEwgdmVyc2lvbiAyIG9yIGxhdGVyIDxodHRwOi8vZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbD5cbiIKKwkiVGhpcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgYXJlIGZyZWUgdG8gY2hhbmdlIGFuZCByZWRpc3RyaWJ1dGUgaXQuXG4iCisJIlRoZXJlIGlzIE5PIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuXG4iOworCisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2J0c19pcGFjY2Vzc19uYW5vYnRzLmMgYi9vcGVuYnNjL3NyYy9idHNfaXBhY2Nlc3NfbmFub2J0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNDhlYTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9idHNfaXBhY2Nlc3NfbmFub2J0cy5jCkBAIC0wLDAgKzEsODQgQEAKKy8qIGlwLmFjY2VzcyBuYW5vQlRTIHNwZWNpZmljIGNvZGUgKi8KKworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2J0c19tb2RlbCBtb2RlbF9uYW5vYnRzID0geworCS50eXBlID0gR1NNX0JUU19UWVBFX05BTk9CVFMsCisJLm5tX2F0dF90bHZkZWYgPSB7CisJCS5kZWYgPSB7CisJCQkvKiBpcC5hY2Nlc3Mgc3BlY2lmaWNzICovCisJCQlbTk1fQVRUX0lQQUNDX0RTVF9JUF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgNCB9LAorCQkJW05NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NUUkVBTV9JRF0gPQl7IFRMVl9UWVBFX1RWLCB9LAorCQkJW05NX0FUVF9JUEFDQ19GUkVRX0NUUkxdID0JeyBUTFZfVFlQRV9UViwgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfU0VDX09NTF9DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgNiB9LAorCQkJW05NX0FUVF9JUEFDQ19JUF9JRl9DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgOCB9LAorCQkJW05NX0FUVF9JUEFDQ19JUF9HV19DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgMTIgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfSU5fU0VSVl9USU1FXSA9CXsgVExWX1RZUEVfRklYRUQsIDQgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTE9DQVRJT05dID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19QQUdJTkdfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfVU5JVF9JRF0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1VOSVRfTkFNRV0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NOTVBfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHX0xJU1RdID0geyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19OVl9GTEFHU10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0ZSRVFfQ1RSTF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCQlbTk1fQVRUX0lQQUNDX1BSSU1fT01MX0ZCX1RPVVRdID0geyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19DVVJfU1dfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfVElNSU5HX0JVU10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0NHSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19SQUNdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfT0JKX1ZFUlNJT05dID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkddPSB7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX05TRUldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfQlZDSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19OU1ZDSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19OU19DRkddID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfQlNTR1BfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTlNfTElOS19DRkddID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19STENfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfQUxNX1RIUkVTSF9MSVNUXT0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19NT05JVF9WQUxfTElTVF0gPSB7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1RJQl9DT05UUk9MXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfU1VQUF9GRUFUVVJFU10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0NPRElOR19TQ0hFTUVTXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR18yXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfSEVBUlRCX1RPVVRdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19VUFRJTUVdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR18zXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfU1NMX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NFQ19QT1NTSUJMRV0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0lNTF9TU0xfU1RBVEVdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19SRVZPQ19EQVRFXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJfSwKKwl9LAorfTsKKworaW50IGJ0c19tb2RlbF9uYW5vYnRzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZ3NtX2J0c19tb2RlbF9yZWdpc3RlcigmbW9kZWxfbmFub2J0cyk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9idHNfc2llbWVuc19iczExLmMgYi9vcGVuYnNjL3NyYy9idHNfc2llbWVuc19iczExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2NjgyNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2J0c19zaWVtZW5zX2JzMTEuYwpAQCAtMCwwICsxLDY2IEBACisvKiBTaWVtZW5zIEJTLTExIHNwZWNpZmljIGNvZGUgKi8KKworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2J0c19tb2RlbCBtb2RlbF9iczExID0geworCS50eXBlID0gR1NNX0JUU19UWVBFX0JTMTEsCisJLm5tX2F0dF90bHZkZWYgPSB7CisJCS5kZWYgPSB7CisJCQlbTk1fQVRUX0FWQUlMX1NUQVRVU10gPQkJeyBUTFZfVFlQRV9UTFYgfSwKKwkJCS8qIEJTMTEgc3BlY2lmaWNzICovCisJCQlbTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk9dID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OT10gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfQk9PVF9TV19WRVJTXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbMHhkNV0gPQkJCXsgVExWX1RZUEVfVExWIH0sCisJCQlbMHhhOF0gPQkJCXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfUEFTU1dPUkRdID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9UWFBXUl0gPQkJeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9SU1NJX09GRlNdID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9MSU5FX0NGR10gPSAJeyBUTFZfVFlQRV9UViB9LAorCQkJW05NX0FUVF9CUzExX0wxX1BST1RfVFlQRV0gPQl7IFRMVl9UWVBFX1RWIH0sCisJCQlbTk1fQVRUX0JTMTFfQklUX0VSUl9USEVTSF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCQlbTk1fQVRUX0JTMTFfRElWRVJTSVRZXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT05dPXsgVExWX1RZUEVfVExWIH0sCQorCQkJW05NX0FUVF9CUzExX0xNVF9MT0dJTl9USU1FXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVl0gPXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRV0gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0JUU19TVEFURV0JPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0UxX1NUQVRFXQk9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfUExMX01PREVdCT0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9QTExdCT0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9DQ0xLX0FDQ1VSQUNZXSA9CXsgVExWX1RZUEVfVFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9DQ0xLX1RZUEVdID0JeyBUTFZfVFlQRV9UViB9LAorCQkJWzB4OTVdID0JCQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCX0sCisJfSwKK307CisKK2ludCBidHNfbW9kZWxfYnMxMV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGdzbV9idHNfbW9kZWxfcmVnaXN0ZXIoJm1vZGVsX2JzMTEpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnRzX3Vua25vd24uYyBiL29wZW5ic2Mvc3JjL2J0c191bmtub3duLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjNWQ5OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2J0c191bmtub3duLmMKQEAgLTAsMCArMSw0MCBAQAorLyogR2VuZXJpYyBCVFMgLSBWVFkgY29kZSB0cmllcyB0byBhbGxvY2F0ZSB0aGlzIEJUUyBiZWZvcmUgdHlwZSBpcyBrbm93biAqLworCisvKiAoQykgMjAxMCBieSBEYW5pZWwgV2lsbG1hbm4gPGRhbmllbEB0b3RhbHVlYmVyd2FjaHVuZy5kZT4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorCitzdGF0aWMgc3RydWN0IGdzbV9idHNfbW9kZWwgbW9kZWxfdW5rbm93biA9IHsKKwkudHlwZSA9IEdTTV9CVFNfVFlQRV9VTktOT1dOLAorCS5ubV9hdHRfdGx2ZGVmID0geworCQkuZGVmID0geworCQl9LAorCX0sCit9OworCitpbnQgYnRzX21vZGVsX3Vua25vd25faW5pdCh2b2lkKQoreworCXJldHVybiBnc21fYnRzX21vZGVsX3JlZ2lzdGVyKCZtb2RlbF91bmtub3duKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2NoYW5fYWxsb2MuYyBiL29wZW5ic2Mvc3JjL2NoYW5fYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGUzNThkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvY2hhbl9hbGxvYy5jCkBAIC0wLDAgKzEsNDIzIEBACisvKiBHU00gQ2hhbm5lbCBhbGxvY2F0aW9uIHJvdXRpbmVzCisgKgorICogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisKK3N0YXRpYyB2b2lkIGF1dG9fcmVsZWFzZV9jaGFubmVsKHZvaWQgKl9sY2hhbik7CisKK3N0YXRpYyBpbnQgdHNfaXNfdXNhYmxlKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpCit7CisJLyogRklYTUU6IEhvdyBkb2VzIHRoaXMgYmVoYXZlIGZvciBCUy0xMSA/ICovCisJaWYgKGlzX2lwYWNjZXNzX2J0cyh0cy0+dHJ4LT5idHMpKSB7CisJCWlmICghbm1faXNfcnVubmluZygmdHMtPm5tX3N0YXRlKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgdHJ4X2lzX3VzYWJsZShzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwkvKiBGSVhNRTogSG93IGRvZXMgdGhpcyBiZWhhdmUgZm9yIEJTLTExID8gKi8KKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKHRyeC0+YnRzKSkgeworCQlpZiAoIW5tX2lzX3J1bm5pbmcoJnRyeC0+bm1fc3RhdGUpIHx8CisJCSAgICAhbm1faXNfcnVubmluZygmdHJ4LT5iYl90cmFuc2Mubm1fc3RhdGUpKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBnc21fYnRzX3RyeF90cyAqdHNfYzBfYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQkgICBlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gYnRzLT5jMDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gJnRyeC0+dHNbMF07CisKKwlpZiAocGNoYW4gIT0gR1NNX1BDSEFOX0NDQ0ggJiYKKwkgICAgcGNoYW4gIT0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX05PTkUpCisJCXJldHVybiBOVUxMOworCisJdHMtPnBjaGFuID0gcGNoYW47CisKKwlyZXR1cm4gdHM7Cit9CisKKy8qIEFsbG9jYXRlIGEgcGh5c2ljYWwgY2hhbm5lbCAoVFMpICovCitzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbikKK3sKKwlpbnQgajsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpIHsKKwkJaW50IGZyb20sIHRvOworCisJCWlmICghdHJ4X2lzX3VzYWJsZSh0cngpKQorCQkJY29udGludWU7CisKKwkJLyogdGhlIGZvbGxvd2luZyBjb25zdHJhaW50cyBhcmUgcHVyZSBwb2xpY3ksCisJCSAqIG5vIHJlcXVpcmVtZW50IHRvIHB1dCB0aGlzIHJlc3RyaWN0aW9uIGluIHBsYWNlICovCisJCWlmICh0cnggPT0gYnRzLT5jMCkgeworCQkJLyogT24gdGhlIGZpcnN0IFRSWCB3ZSBydW4gb25lIENDQ0ggYW5kIG9uZSBTRENDSDggKi8KKwkJCXN3aXRjaCAocGNoYW4pIHsKKwkJCWNhc2UgR1NNX1BDSEFOX0NDQ0g6CisJCQljYXNlIEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINDoKKwkJCQlmcm9tID0gMDsgdG8gPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSBHU01fUENIQU5fVENIX0Y6CisJCQljYXNlIEdTTV9QQ0hBTl9UQ0hfSDoKKwkJCQlmcm9tID0gMTsgdG8gPSA3OworCQkJCWJyZWFrOworCQkJY2FzZSBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEM6CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogRXZlcnkgc2Vjb25kYXJ5IFRSWCBpcyBjb25maWd1cmVkIGZvciBUQ0gvRgorCQkJICogYW5kIFRDSC9IIG9ubHkgKi8KKwkJCXN3aXRjaCAocGNoYW4pIHsKKwkJCWNhc2UgR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDOgorCQkJCWZyb20gPSAxOyB0byA9IDE7CisJCQljYXNlIEdTTV9QQ0hBTl9UQ0hfRjoKKwkJCWNhc2UgR1NNX1BDSEFOX1RDSF9IOgorCQkJCWZyb20gPSAxOyB0byA9IDc7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisKKwkJZm9yIChqID0gZnJvbTsgaiA8PSB0bzsgaisrKSB7CisJCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gJnRyeC0+dHNbal07CisKKwkJCWlmICghdHNfaXNfdXNhYmxlKHRzKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHRzLT5wY2hhbiA9PSBHU01fUENIQU5fTk9ORSkgeworCQkJCXRzLT5wY2hhbiA9IHBjaGFuOworCQkJCS8qIHNldCBjaGFubmVsIGF0dHJpYnV0ZSBvbiBPTUwgKi8KKwkJCQlhYmlzX25tX3NldF9jaGFubmVsX2F0dHIodHMsIGFiaXNfbm1fY2hjb21iNHBjaGFuKHBjaGFuKSk7CisJCQkJcmV0dXJuIHRzOworCQkJfQorCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBGcmVlIGEgcGh5c2ljYWwgY2hhbm5lbCAoVFMpICovCit2b2lkIHRzX2ZyZWUoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cykKK3sKKwl0cy0+cGNoYW4gPSBHU01fUENIQU5fTk9ORTsKK30KKworc3RhdGljIGNvbnN0IHVfaW50OF90IHN1YnNsb3RzX3Blcl9wY2hhbltdID0geworCVtHU01fUENIQU5fTk9ORV0gPSAwLAorCVtHU01fUENIQU5fQ0NDSF0gPSAwLAorCVtHU01fUENIQU5fQ0NDSF9TRENDSDRdID0gNCwKKwlbR1NNX1BDSEFOX1RDSF9GXSA9IDEsCisJW0dTTV9QQ0hBTl9UQ0hfSF0gPSAyLAorCVtHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOENdID0gOCwKKwkvKiBGSVhNRTogd2hhdCBhYm91dCBkeW5hbWljIFRDSF9GX1RDSF9IID8gKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2xjaGFuICoKK19sY19maW5kX3RyeChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCWludCBqLCBzczsKKworCWlmICghdHJ4X2lzX3VzYWJsZSh0cngpKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJdHMgPSAmdHJ4LT50c1tqXTsKKwkJaWYgKCF0c19pc191c2FibGUodHMpKQorCQkJY29udGludWU7CisJCWlmICh0cy0+cGNoYW4gIT0gcGNoYW4pCisJCQljb250aW51ZTsKKwkJLyogY2hlY2sgaWYgYWxsIHN1Yi1zbG90cyBhcmUgYWxsb2NhdGVkIHlldCAqLworCQlmb3IgKHNzID0gMDsgc3MgPCBzdWJzbG90c19wZXJfcGNoYW5bcGNoYW5dOyBzcysrKSB7CisJCQlzdHJ1Y3QgZ3NtX2xjaGFuICpsYyA9ICZ0cy0+bGNoYW5bc3NdOworCQkJaWYgKGxjLT50eXBlID09IEdTTV9MQ0hBTl9OT05FICYmCisJCQkgICAgbGMtPnN0YXRlID09IExDSEFOX1NfTk9ORSkKKwkJCQlyZXR1cm4gbGM7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2xjaGFuICoKK19sY19maW5kX2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisJc3RydWN0IGdzbV9sY2hhbiAqbGM7CisKKwlpZiAoYnRzLT5jaGFuX2FsbG9jX3JldmVyc2UpIHsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCQlsYyA9IF9sY19maW5kX3RyeCh0cngsIHBjaGFuKTsKKwkJCWlmIChsYykKKwkJCQlyZXR1cm4gbGM7CisJCX0KKwl9IGVsc2UgeworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCQlsYyA9IF9sY19maW5kX3RyeCh0cngsIHBjaGFuKTsKKwkJCWlmIChsYykKKwkJCQlyZXR1cm4gbGM7CisJCX0KKwl9CisKKwkvKiB3ZSBjYW5ub3QgYWxsb2NhdGUgbW9yZSBvZiB0aGVzZSAqLworCWlmIChwY2hhbiA9PSBHU01fUENIQU5fQ0NDSF9TRENDSDQpCisJCXJldHVybiBOVUxMOworCisJLyogaWYgd2UndmUgcmVhY2hlZCBoZXJlLCB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IHBoeXNpY2FsCisJICogY2hhbm5lbCBmb3IgdGhlIGxvZ2ljYWwgY2hhbm5lbCB0eXBlIHJlcXVlc3RlZCAqLworCXRzID0gdHNfYWxsb2MoYnRzLCBwY2hhbik7CisJaWYgKCF0cykgeworCQkvKiBubyBtb3JlIHJhZGlvIHJlc291cmNlcyAqLworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuICZ0cy0+bGNoYW5bMF07Cit9CisKKy8qIEFsbG9jYXRlIGEgbG9naWNhbCBjaGFubmVsICovCitzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBlbnVtIGdzbV9jaGFuX3QgdHlwZSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IE5VTEw7CisJZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBmaXJzdCwgc2Vjb25kOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBHU01fTENIQU5fU0RDQ0g6CisJCWlmIChidHMtPmNoYW5fYWxsb2NfcmV2ZXJzZSkgeworCQkJZmlyc3QgPSBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEM7CisJCQlzZWNvbmQgPSBHU01fUENIQU5fQ0NDSF9TRENDSDQ7CisJCX0gZWxzZSB7CisJCQlmaXJzdCA9IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINDsKKwkJCXNlY29uZCA9IEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QzsKKwkJfQorCisJCWxjaGFuID0gX2xjX2ZpbmRfYnRzKGJ0cywgZmlyc3QpOworCQlpZiAobGNoYW4gPT0gTlVMTCkKKwkJCWxjaGFuID0gX2xjX2ZpbmRfYnRzKGJ0cywgc2Vjb25kKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCWxjaGFuID0gX2xjX2ZpbmRfYnRzKGJ0cywgR1NNX1BDSEFOX1RDSF9GKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTENIQU5fVENIX0g6CisJCWxjaGFuID1fbGNfZmluZF9idHMoYnRzLCBHU01fUENIQU5fVENIX0gpOworCQkvKiBJZiB3ZSBkb24ndCBoYXZlIFRDSC9IIGF2YWlsYWJsZSwgZmFsbC1iYWNrIHRvIFRDSC9GICovCisJCWlmICghbGNoYW4pIHsKKwkJCWxjaGFuID0gX2xjX2ZpbmRfYnRzKGJ0cywgR1NNX1BDSEFOX1RDSF9GKTsKKwkJCXR5cGUgPSBHU01fTENIQU5fVENIX0Y7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUkxMLCBMT0dMX0VSUk9SLCAiVW5rbm93biBnc21fY2hhbl90ICV1XG4iLCB0eXBlKTsKKwl9CisKKwlpZiAobGNoYW4pIHsKKwkJbGNoYW4tPnR5cGUgPSB0eXBlOworCisJCS8qIGNsZWFyIHNhcGlzICovCisJCW1lbXNldChsY2hhbi0+c2FwaXMsIDAsIEFSUkFZX1NJWkUobGNoYW4tPnNhcGlzKSk7CisKKwkJLyogY2xlYXIgbXVsdGkgcmF0ZSBjb25maWcgKi8KKwkJbWVtc2V0KCZsY2hhbi0+bXJfY29uZiwgMCwgc2l6ZW9mKGxjaGFuLT5tcl9jb25mKSk7CisKKwkJLyogY2xlYXIgcGVyIE1TQy9CU0MgZGF0YSAqLworCQltZW1zZXQoJmxjaGFuLT5jb25uLCAwLCBzaXplb2YobGNoYW4tPmNvbm4pKTsKKworCQkvKiBDb25maWd1cmUgdGhlIHRpbWUgYW5kIHN0YXJ0IGl0IHNvIGl0IHdpbGwgYmUgY2xvc2VkICovCisJCWxjaGFuLT5jb25uLmxjaGFuID0gbGNoYW47CisJCWxjaGFuLT5jb25uLmJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisJCWxjaGFuLT5jb25uLnJlbGVhc2VfdGltZXIuY2IgPSBhdXRvX3JlbGVhc2VfY2hhbm5lbDsKKwkJbGNoYW4tPmNvbm4ucmVsZWFzZV90aW1lci5kYXRhID0gbGNoYW47CisJCWJzY19zY2hlZHVsZV90aW1lcigmbGNoYW4tPmNvbm4ucmVsZWFzZV90aW1lciwgTENIQU5fUkVMRUFTRV9USU1FT1VUKTsKKworCX0KKworCXJldHVybiBsY2hhbjsKK30KKworLyogRnJlZSBhIGxvZ2ljYWwgY2hhbm5lbCAqLwordm9pZCBsY2hhbl9mcmVlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCWludCBpOworCisJbGNoYW4tPnR5cGUgPSBHU01fTENIQU5fTk9ORTsKKwlpZiAobGNoYW4tPmNvbm4uc3Vic2NyKSB7CisJCXN1YnNjcl9wdXQobGNoYW4tPmNvbm4uc3Vic2NyKTsKKwkJbGNoYW4tPmNvbm4uc3Vic2NyID0gTlVMTDsKKwl9CisKKwkvKiBXZSBtaWdodCBraWxsIGFuIGFjdGl2ZSBjaGFubmVsLi4uICovCisJaWYgKGxjaGFuLT5jb25uLnVzZV9jb3VudCAhPSAwKSB7CisJCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9VTkVYUEVDVEVEX1JFTEVBU0UsIGxjaGFuKTsKKwkJbGNoYW4tPmNvbm4udXNlX2NvdW50ID0gMDsKKwl9CisKKwkvKiBzdG9wIHRoZSB0aW1lciAqLworCWJzY19kZWxfdGltZXIoJmxjaGFuLT5jb25uLnJlbGVhc2VfdGltZXIpOworCWJzY19kZWxfdGltZXIoJmxjaGFuLT5UMzEwMSk7CisKKwkvKiBjbGVhciBjYWNoZWQgbWVhc3VlbWVudCByZXBvcnRzICovCisJbGNoYW4tPm1lYXNfcmVwX2lkeCA9IDA7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGNoYW4tPm1lYXNfcmVwKTsgaSsrKSB7CisJCWxjaGFuLT5tZWFzX3JlcFtpXS5mbGFncyA9IDA7CisJCWxjaGFuLT5tZWFzX3JlcFtpXS5uciA9IDA7CisJfQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxjaGFuLT5uZWlnaF9tZWFzKTsgaSsrKQorCQlsY2hhbi0+bmVpZ2hfbWVhc1tpXS5hcmZjbiA9IDA7CisKKwlsY2hhbi0+Y29ubi5zaWxlbnRfY2FsbCA9IDA7CisKKwkvKiBGSVhNRTogdHNfZnJlZSgpIHRoZSB0aW1lc2xvdCwgaWYgd2UncmUgdGhlIGxhc3QgbG9naWNhbAorCSAqIGNoYW5uZWwgdXNpbmcgaXQgKi8KK30KKworLyogQ29uc2lkZXIgcmVsZWFzaW5nIHRoZSBjaGFubmVsIG5vdyAqLworaW50IGxjaGFuX2F1dG9fcmVsZWFzZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlpZiAobGNoYW4tPmNvbm4udXNlX2NvdW50ID4gMCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBBc3N1bWUgd2UgaGF2ZSBHU00wNC4wOCBydW5uaW5nIGFuZCBzZW5kIGEgcmVsZWFzZSAqLworCWlmIChsY2hhbi0+Y29ubi5zdWJzY3IpIHsKKwkJZ3NtNDhfc2VuZF9ycl9yZWxlYXNlKGxjaGFuKTsKKwl9CisKKwkvKiBzcG9vZmVkPyBtZXNzYWdlICovCisJaWYgKGxjaGFuLT5jb25uLnVzZV9jb3VudCA8IDApCisJCUxPR1AoRFJMTCwgTE9HTF9FUlJPUiwgIkNoYW5uZWwgY291bnQgaXMgbmVnYXRpdmU6ICVkXG4iLAorCQkJbGNoYW4tPmNvbm4udXNlX2NvdW50KTsKKworCURFQlVHUChEUkxMLCAiJXMgUmVjeWNsaW5nIENoYW5uZWxcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSk7CisJcnNsX3JlbGVhc2VfcmVxdWVzdChsY2hhbiwgMCk7CisJcmV0dXJuIDE7Cit9CisKKy8qIEF1dG8gcmVsZWFzZSB0aGUgY2hhbm5lbCB3aGVuIHRoZSB1c2UgY291bnQgaXMgemVybyAqLworc3RhdGljIHZvaWQgYXV0b19yZWxlYXNlX2NoYW5uZWwodm9pZCAqX2xjaGFuKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gX2xjaGFuOworCisJaWYgKCFsY2hhbl9hdXRvX3JlbGVhc2UobGNoYW4pKQorCQlic2Nfc2NoZWR1bGVfdGltZXIoJmxjaGFuLT5jb25uLnJlbGVhc2VfdGltZXIsIExDSEFOX1JFTEVBU0VfVElNRU9VVCk7Cit9CisKK3N0cnVjdCBnc21fbGNoYW4qIGxjaGFuX2ZpbmQoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpIHsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlpbnQgdHNfbm8sIGxjaGFuX25vOyAKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpIHsKKwkJZm9yICh0c19ubyA9IDA7IHRzX25vIDwgODsgKyt0c19ubykgeworCQkJZm9yIChsY2hhbl9ubyA9IDA7IGxjaGFuX25vIDwgVFNfTUFYX0xDSEFOOyArK2xjaGFuX25vKSB7CisJCQkJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPQorCQkJCQkmdHJ4LT50c1t0c19ub10ubGNoYW5bbGNoYW5fbm9dOworCQkJCWlmIChzdWJzY3IgPT0gbGNoYW4tPmNvbm4uc3Vic2NyKQorCQkJCQlyZXR1cm4gbGNoYW47CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGdzbV9sY2hhbiAqbGNoYW5fZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gc3Vic2NyLT5uZXQ7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShidHMsICZuZXQtPmJ0c19saXN0LCBsaXN0KSB7CisJCWxjaGFuID0gbGNoYW5fZmluZChidHMsIHN1YnNjcik7CisJCWlmIChsY2hhbikKKwkJCXJldHVybiBsY2hhbjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBidHNfY2hhbl9sb2FkKHN0cnVjdCBwY2hhbl9sb2FkICpjbCwgY29uc3Qgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpIHsKKwkJaW50IGk7CisKKwkJLyogc2tpcCBhZG1pbmlzdHJhdGl2ZWx5IGRlYWN0aXZhdGVkIHRyYW54c2NlaXZlcnMgKi8KKwkJaWYgKCFubV9pc19ydW5uaW5nKCZ0cngtPm5tX3N0YXRlKSB8fAorCQkgICAgIW5tX2lzX3J1bm5pbmcoJnRyeC0+YmJfdHJhbnNjLm5tX3N0YXRlKSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRyeC0+dHMpOyBpKyspIHsKKwkJCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSAmdHJ4LT50c1tpXTsKKwkJCXN0cnVjdCBsb2FkX2NvdW50ZXIgKnBsID0gJmNsLT5wY2hhblt0cy0+cGNoYW5dOworCQkJaW50IGo7CisKKwkJCS8qIHNraXAgYWRtaW5pc3RyYXRpdmVseSBkZWFjdGl2YXRlZCB0aW1lc2xvdHMgKi8KKwkJCWlmICghbm1faXNfcnVubmluZygmdHMtPm5tX3N0YXRlKSkKKwkJCQljb250aW51ZTsKKworCQkJZm9yIChqID0gMDsgaiA8IHN1YnNsb3RzX3Blcl9wY2hhblt0cy0+cGNoYW5dOyBqKyspIHsKKwkJCQlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9ICZ0cy0+bGNoYW5bal07CisKKwkJCQlwbC0+dG90YWwrKzsKKworCQkJCXN3aXRjaCAobGNoYW4tPnN0YXRlKSB7CisJCQkJY2FzZSBMQ0hBTl9TX05PTkU6CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXBsLT51c2VkKys7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKwordm9pZCBuZXR3b3JrX2NoYW5fbG9hZChzdHJ1Y3QgcGNoYW5fbG9hZCAqcGwsIHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwltZW1zZXQocGwsIDAsIHNpemVvZigqcGwpKTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJm5ldC0+YnRzX2xpc3QsIGxpc3QpCisJCWJ0c19jaGFuX2xvYWQocGwsIGJ0cyk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9kYi5jIGIvb3BlbmJzYy9zcmMvZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDA5YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZGIuYwpAQCAtMCwwICsxLDExNzkgQEAKKy8qIFNpbXBsZSBITFIvVkxSIGRhdGFiYXNlIGJhY2tlbmQgdXNpbmcgZGJpICovCisvKiAoQykgMjAwOCBieSBKYW4gTHVlYmJlIDxqbHVlYmJlQGRlYmlhbi5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMTEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3N0YXRpc3RpY3MuaD4KKworI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxkYmkvZGJpLmg+CisKK3N0YXRpYyBjaGFyICpkYl9iYXNlbmFtZSA9IE5VTEw7CitzdGF0aWMgY2hhciAqZGJfZGlybmFtZSA9IE5VTEw7CitzdGF0aWMgZGJpX2Nvbm4gY29ubjsKKworc3RhdGljIGNoYXIgKmNyZWF0ZV9zdG10c1tdID0geworCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBNZXRhICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJImtleSBURVhUIFVOSVFVRSBOT1QgTlVMTCwgIgorCQkidmFsdWUgVEVYVCBOT1QgTlVMTCIKKwkJIikiLAorCSJJTlNFUlQgT1IgSUdOT1JFIElOVE8gTWV0YSAiCisJCSIoa2V5LCB2YWx1ZSkgIgorCQkiVkFMVUVTICIKKwkJIigncmV2aXNpb24nLCAnMicpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgU3Vic2NyaWJlciAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidXBkYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJImltc2kgTlVNRVJJQyBVTklRVUUgTk9UIE5VTEwsICIKKwkJIm5hbWUgVEVYVCwgIgorCQkiZXh0ZW5zaW9uIFRFWFQgVU5JUVVFLCAiCisJCSJhdXRob3JpemVkIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwLCAiCisJCSJ0bXNpIFRFWFQgVU5JUVVFLCAiCisJCSJsYWMgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgQXV0aFRva2VuICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJInN1YnNjcmliZXJfaWQgSU5URUdFUiBVTklRVUUgTk9UIE5VTEwsICIKKwkJImNyZWF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ0b2tlbiBURVhUIFVOSVFVRSBOT1QgTlVMTCIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBFcXVpcG1lbnQgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInVwZGF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJuYW1lIFRFWFQsICIKKwkJImNsYXNzbWFyazEgTlVNRVJJQywgIgorCQkiY2xhc3NtYXJrMiBCTE9CLCAiCisJCSJjbGFzc21hcmszIEJMT0IsICIKKwkJImltZWkgTlVNRVJJQyBVTklRVUUgTk9UIE5VTEwiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgRXF1aXBtZW50V2F0Y2ggKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInVwZGF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJzdWJzY3JpYmVyX2lkIE5VTUVSSUMgTk9UIE5VTEwsICIKKwkJImVxdWlwbWVudF9pZCBOVU1FUklDIE5PVCBOVUxMLCAiCisJCSJVTklRVUUgKHN1YnNjcmliZXJfaWQsIGVxdWlwbWVudF9pZCkgIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIFNNUyAoIgorCQkvKiBtZXRhZGF0YSwgbm90IHBhcnQgb2Ygc21zICovCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJImNyZWF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJzZW50IFRJTUVTVEFNUCwgIgorCQkic2VuZGVyX2lkIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJInJlY2VpdmVyX2lkIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJImRlbGl2ZXJfYXR0ZW1wdHMgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAsICIKKwkJLyogZGF0YSBkaXJlY3RseSBjb3BpZWQvZGVyaXZlZCBmcm9tIFNNUyAqLworCQkidmFsaWRfdW50aWwgVElNRVNUQU1QLCAiCisJCSJyZXBseV9wYXRoX3JlcSBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJzdGF0dXNfcmVwX3JlcSBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJwcm90b2NvbF9pZCBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJkYXRhX2NvZGluZ19zY2hlbWUgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkidWRfaGRyX2luZCBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJkZXN0X2FkZHIgVEVYVCwgIgorCQkidXNlcl9kYXRhIEJMT0IsICIJLyogVFAtVUQgKi8KKwkJLyogYWRkaXRpb25hbCBkYXRhLCBpbnRlcnByZXRlZCBmcm9tIFNNUyAqLworCQkiaGVhZGVyIEJMT0IsICIJCS8qIFVEIEhlYWRlciAqLworCQkidGV4dCBURVhUICIJCS8qIGRlY29kZWQgVUQgYWZ0ZXIgVURIICovCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgVkxSICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJImNyZWF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ1cGRhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkic3Vic2NyaWJlcl9pZCBOVU1FUklDIFVOSVFVRSBOT1QgTlVMTCwgIgorCQkibGFzdF9idHMgTlVNRVJJQyBOT1QgTlVMTCAiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgQXBkdUJsb2JzICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJImNyZWF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJhcGR1X2lkX2ZsYWdzIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJInN1YnNjcmliZXJfaWQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkiYXBkdSBCTE9CICIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBDb3VudGVycyAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJ0aW1lc3RhbXAgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ2YWx1ZSBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJuYW1lIFRFWFQgTk9UIE5VTEwgIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEF1dGhLZXlzICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJInN1YnNjcmliZXJfaWQgSU5URUdFUiBVTklRVUUgTk9UIE5VTEwsICIKKwkJImFsZ29yaXRobV9pZCBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJhM2E4X2tpIEJMT0IgIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEF1dGhUdXBsZXMgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkic3Vic2NyaWJlcl9pZCBOVU1FUklDIFVOSVFVRSBOT1QgTlVMTCwgIgorCQkiaXNzdWVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidXNlX2NvdW50IElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwLCAiCisJCSJrZXlfc2VxIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJInJhbmQgQkxPQiBOT1QgTlVMTCwgIgorCQkic3JlcyBCTE9CIE5PVCBOVUxMLCAiCisJCSJrYyBCTE9CIE5PVCBOVUxMICIKKwkJIikiLAorfTsKKwordm9pZCBkYl9lcnJvcl9mdW5jKGRiaV9jb25uIGNvbm4sIHZvaWQgKmRhdGEpCit7CisJY29uc3QgY2hhciAqbXNnOworCWRiaV9jb25uX2Vycm9yKGNvbm4sICZtc2cpOworCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiREJJOiAlc1xuIiwgbXNnKTsKK30KKworc3RhdGljIGludCBjaGVja19kYl9yZXZpc2lvbih2b2lkKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWNvbnN0IGNoYXIgKnJldjsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5KGNvbm4sCisJCQkJIlNFTEVDVCB2YWx1ZSBGUk9NIE1ldGEgV0hFUkUga2V5PSdyZXZpc2lvbiciKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldiA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJ2YWx1ZSIpOworCWlmICghcmV2IHx8IGF0b2kocmV2KSAhPSAyKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRiX2luaXQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlkYmlfaW5pdGlhbGl6ZShOVUxMKTsKKworCWNvbm4gPSBkYmlfY29ubl9uZXcoInNxbGl0ZTMiKTsKKwlpZiAoY29ubiA9PSBOVUxMKSB7CisJCUxPR1AoRERCLCBMT0dMX0ZBVEFMLCAiRmFpbGVkIHRvIGNyZWF0ZSBjb25uZWN0aW9uLlxuIik7CisJCXJldHVybiAxOworCX0KKworCWRiaV9jb25uX2Vycm9yX2hhbmRsZXIoIGNvbm4sIGRiX2Vycm9yX2Z1bmMsIE5VTEwgKTsKKworCS8qIE15U1FMCisJZGJpX2Nvbm5fc2V0X29wdGlvbihjb25uLCAiaG9zdCIsICJsb2NhbGhvc3QiKTsKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJ1c2VybmFtZSIsICJ5b3VyX25hbWUiKTsKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJwYXNzd29yZCIsICJ5b3VyX3Bhc3N3b3JkIik7CisJZGJpX2Nvbm5fc2V0X29wdGlvbihjb25uLCAiZGJuYW1lIiwgInlvdXJfZGJuYW1lIik7CisJZGJpX2Nvbm5fc2V0X29wdGlvbihjb25uLCAiZW5jb2RpbmciLCAiVVRGLTgiKTsKKwkqLworCisJLyogU3FMaXRlIDMgKi8KKwlkYl9iYXNlbmFtZSA9IHN0cmR1cChuYW1lKTsKKwlkYl9kaXJuYW1lID0gc3RyZHVwKG5hbWUpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgInNxbGl0ZTNfZGJkaXIiLCBkaXJuYW1lKGRiX2Rpcm5hbWUpKTsKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJkYm5hbWUiLCBiYXNlbmFtZShkYl9iYXNlbmFtZSkpOworCisJaWYgKGRiaV9jb25uX2Nvbm5lY3QoY29ubikgPCAwKQorCQlnb3RvIG91dF9lcnI7CisKKwlyZXR1cm4gMDsKKworb3V0X2VycjoKKwlmcmVlKGRiX2Rpcm5hbWUpOworCWZyZWUoZGJfYmFzZW5hbWUpOworCWRiX2Rpcm5hbWUgPSBkYl9iYXNlbmFtZSA9IE5VTEw7CisJcmV0dXJuIC0xOworfQorCisKK2ludCBkYl9wcmVwYXJlKCkKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNyZWF0ZV9zdG10cyk7IGkrKykgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeShjb25uLCBjcmVhdGVfc3RtdHNbaV0pOworCQlpZiAoIXJlc3VsdCkgeworCQkJTE9HUChEREIsIExPR0xfRVJST1IsCisJCQkgICAgICJGYWlsZWQgdG8gY3JlYXRlIHNvbWUgdGFibGUuXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCX0KKworCWlmIChjaGVja19kYl9yZXZpc2lvbigpIDwgMCkgeworCQlMT0dQKEREQiwgTE9HTF9GQVRBTCwgIkRhdGFiYXNlIHNjaGVtYSByZXZpc2lvbiBpbnZhbGlkLCAiCisJCQkicGxlYXNlIHVwZGF0ZSB5b3VyIGRhdGFiYXNlIHNjaGVtYVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZGJfZmluaSgpCit7CisJZGJpX2Nvbm5fY2xvc2UoY29ubik7CisJZGJpX3NodXRkb3duKCk7CisKKwlpZiAoZGJfZGlybmFtZSkKKwkgICAgZnJlZShkYl9kaXJuYW1lKTsKKwlpZiAoZGJfYmFzZW5hbWUpCisJICAgIGZyZWUoZGJfYmFzZW5hbWUpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKmRiX2NyZWF0ZV9zdWJzY3JpYmVyKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBjaGFyICppbXNpKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJLyogSXMgdGhpcyBzdWJzY3JpYmVyIGtub3duIGluIHRoZSBkYj8gKi8KKwlzdWJzY3IgPSBkYl9nZXRfc3Vic2NyaWJlcihuZXQsIEdTTV9TVUJTQ1JJQkVSX0lNU0ksIGltc2kpOyAKKwlpZiAoc3Vic2NyKSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICJVUERBVEUgU3Vic2NyaWJlciBzZXQgdXBkYXRlZCA9IGRhdGV0aW1lKCdub3cnKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIldIRVJFIGltc2kgPSAlcyAiICwgaW1zaSk7CisJCWlmICghcmVzdWx0KQorCQkJTE9HUChEREIsIExPR0xfRVJST1IsICJmYWlsZWQgdG8gdXBkYXRlIHRpbWVzdGFtcFxuIik7CisJCWVsc2UKKwkJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gc3Vic2NyOworCX0KKworCXN1YnNjciA9IHN1YnNjcl9hbGxvYygpOworCXN1YnNjci0+ZmxhZ3MgfD0gR1NNX1NVQlNDUklCRVJfRklSU1RfQ09OVEFDVDsKKwlpZiAoIXN1YnNjcikKKwkJcmV0dXJuIE5VTEw7CisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgSU5UTyBTdWJzY3JpYmVyICIKKwkJIihpbXNpLCBjcmVhdGVkLCB1cGRhdGVkKSAiCisJCSJWQUxVRVMgIgorCQkiKCVzLCBkYXRldGltZSgnbm93JyksIGRhdGV0aW1lKCdub3cnKSkgIiwKKwkJaW1zaQorCSk7CisJaWYgKCFyZXN1bHQpCisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBTdWJzY3JpYmVyIGJ5IElNU0kuXG4iKTsKKwlzdWJzY3ItPm5ldCA9IG5ldDsKKwlzdWJzY3ItPmlkID0gZGJpX2Nvbm5fc2VxdWVuY2VfbGFzdChjb25uLCBOVUxMKTsKKwlzdHJuY3B5KHN1YnNjci0+aW1zaSwgaW1zaSwgR1NNX0lNU0lfTEVOR1RILTEpOworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCUxPR1AoRERCLCBMT0dMX0lORk8sICJOZXcgU3Vic2NyaWJlcjogSUQgJWxsdSwgSU1TSSAlc1xuIiwgc3Vic2NyLT5pZCwgc3Vic2NyLT5pbXNpKTsKKwlkYl9zdWJzY3JpYmVyX2FsbG9jX2V4dGVuKHN1YnNjcik7CisJcmV0dXJuIHN1YnNjcjsKK30KKworc3RhdGljIGludCBnZXRfZXF1aXBtZW50X2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljb25zdCBjaGFyICpzdHJpbmc7CisJdW5zaWduZWQgY2hhciBjbTE7CisJY29uc3QgdW5zaWduZWQgY2hhciAqY20yLCAqY20zOworCXN0cnVjdCBnc21fZXF1aXBtZW50ICplcXVpcCA9ICZzdWJzY3ItPmVxdWlwbWVudDsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJCSJTRUxFQ1QgZXF1aXBtZW50LiogRlJPTSBFcXVpcG1lbnQsRXF1aXBtZW50V2F0Y2ggIgorCQkJCSJXSEVSRSBFcXVpcG1lbnRXYXRjaC5lcXVpcG1lbnRfaWQ9RXF1aXBtZW50LmlkICIKKwkJCQkiQU5EIEVxdWlwbWVudFdhdGNoLnN1YnNjcmliZXJfaWQgPSAlbGx1ICIKKwkJCQkiT1JERVIgQlkgdXBkYXRlZCBERVNDIiwgc3Vic2NyLT5pZCk7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWVxdWlwLT5pZCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJpZCIpOworCisJc3RyaW5nID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgImltZWkiKTsKKwlpZiAoc3RyaW5nKQorCQlzdHJuY3B5KGVxdWlwLT5pbWVpLCBzdHJpbmcsIHNpemVvZihlcXVpcC0+aW1laSkpOworCisJc3RyaW5nID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgImNsYXNzbWFyazEiKTsKKwlpZiAoc3RyaW5nKQorCQkgY20xID0gYXRvaShzdHJpbmcpICYgMHhmZjsKKwllcXVpcC0+Y2xhc3NtYXJrMSA9ICooKHN0cnVjdCBnc200OF9jbGFzc21hcmsxICopICZjbTEpOworCisJZXF1aXAtPmNsYXNzbWFyazJfbGVuID0gZGJpX3Jlc3VsdF9nZXRfZmllbGRfbGVuZ3RoKHJlc3VsdCwgImNsYXNzbWFyazIiKTsKKwljbTIgPSBkYmlfcmVzdWx0X2dldF9iaW5hcnkocmVzdWx0LCAiY2xhc3NtYXJrMiIpOworCWlmIChlcXVpcC0+Y2xhc3NtYXJrMl9sZW4gPiBzaXplb2YoZXF1aXAtPmNsYXNzbWFyazIpKQorCQllcXVpcC0+Y2xhc3NtYXJrMl9sZW4gPSBzaXplb2YoZXF1aXAtPmNsYXNzbWFyazIpOworCW1lbWNweShlcXVpcC0+Y2xhc3NtYXJrMiwgY20yLCBlcXVpcC0+Y2xhc3NtYXJrMl9sZW4pOworCisJZXF1aXAtPmNsYXNzbWFyazNfbGVuID0gZGJpX3Jlc3VsdF9nZXRfZmllbGRfbGVuZ3RoKHJlc3VsdCwgImNsYXNzbWFyazMiKTsKKwljbTMgPSBkYmlfcmVzdWx0X2dldF9iaW5hcnkocmVzdWx0LCAiY2xhc3NtYXJrMyIpOworCWlmIChlcXVpcC0+Y2xhc3NtYXJrM19sZW4gPiBzaXplb2YoZXF1aXAtPmNsYXNzbWFyazMpKQorCQllcXVpcC0+Y2xhc3NtYXJrM19sZW4gPSBzaXplb2YoZXF1aXAtPmNsYXNzbWFyazMpOworCW1lbWNweShlcXVpcC0+Y2xhc3NtYXJrMywgY20zLCBlcXVpcC0+Y2xhc3NtYXJrM19sZW4pOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdldF9hdXRoaW5mb19ieV9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX2luZm8gKmFpbmZvLAorCQkJICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY29uc3QgdW5zaWduZWQgY2hhciAqYTNhOF9raTsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJIlNFTEVDVCAqIEZST00gQXV0aEtleXMgV0hFUkUgc3Vic2NyaWJlcl9pZD0ldSIsCisJCQkgc3Vic2NyLT5pZCk7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWFpbmZvLT5hdXRoX2FsZ28gPSBkYmlfcmVzdWx0X2dldF91bG9uZ2xvbmcocmVzdWx0LCAiYWxnb3JpdGhtX2lkIik7CisJYWluZm8tPmEzYThfa2lfbGVuID0gZGJpX3Jlc3VsdF9nZXRfZmllbGRfbGVuZ3RoKHJlc3VsdCwgImEzYThfa2kiKTsKKwlhM2E4X2tpID0gZGJpX3Jlc3VsdF9nZXRfYmluYXJ5KHJlc3VsdCwgImEzYThfa2kiKTsKKwlpZiAoYWluZm8tPmEzYThfa2lfbGVuID4gc2l6ZW9mKGFpbmZvLT5hM2E4X2tpKSkKKwkJYWluZm8tPmEzYThfa2lfbGVuID0gc2l6ZW9mKGFpbmZvLT5hM2E4X2tpX2xlbik7CisJbWVtY3B5KGFpbmZvLT5hM2E4X2tpLCBhM2E4X2tpLCBhaW5mby0+YTNhOF9raV9sZW4pOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNldF9hdXRoaW5mb19mb3Jfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF9pbmZvICphaW5mbywKKwkJCSAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyBhaW5mb19vbGQ7CisJaW50IHJjLCB1cGQ7CisJdW5zaWduZWQgY2hhciAqa2lfc3RyOworCisJLyogRGVsZXRpb24gPyAqLworCWlmIChhaW5mbyA9PSBOVUxMKSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJIkRFTEVURSBGUk9NIEF1dGhLZXlzIFdIRVJFIHN1YnNjcmliZXJfaWQ9JXUiLAorCQkJc3Vic2NyLT5pZCk7CisKKwkJaWYgKCFyZXN1bHQpCisJCQlyZXR1cm4gLUVJTzsKKworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDaGVjayBpZiBhbHJlYWR5IGV4aXN0aW5nICovCisJcmMgPSBnZXRfYXV0aGluZm9fYnlfc3Vic2NyKCZhaW5mb19vbGQsIHN1YnNjcik7CisJaWYgKHJjICYmIHJjICE9IC1FTk9FTlQpCisJCXJldHVybiByYzsKKwl1cGQgPSByYyA/IDAgOiAxOworCisJLyogVXBkYXRlIC8gSW5zZXJ0ICovCisJZGJpX2Nvbm5fcXVvdGVfYmluYXJ5X2NvcHkoY29ubiwKKwkJYWluZm8tPmEzYThfa2ksIGFpbmZvLT5hM2E4X2tpX2xlbiwgJmtpX3N0cik7CisKKwlpZiAoIXVwZCkgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCQkiSU5TRVJUIElOVE8gQXV0aEtleXMgIgorCQkJCSIoc3Vic2NyaWJlcl9pZCwgYWxnb3JpdGhtX2lkLCBhM2E4X2tpKSAiCisJCQkJIlZBTFVFUyAoJXUsICV1LCAlcykiLAorCQkJCXN1YnNjci0+aWQsIGFpbmZvLT5hdXRoX2FsZ28sIGtpX3N0cik7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkJIlVQREFURSBBdXRoS2V5cyAiCisJCQkJIlNFVCBhbGdvcml0aG1faWQ9JXUsIGEzYThfa2k9JXMgIgorCQkJCSJXSEVSRSBzdWJzY3JpYmVyX2lkPSV1IiwKKwkJCQlhaW5mby0+YXV0aF9hbGdvLCBraV9zdHIsIHN1YnNjci0+aWQpOworCX0KKworCWZyZWUoa2lfc3RyKTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBnZXRfYXV0aHR1cGxlX2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgKmF0dXBsZSwKKwkJCSAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwlpbnQgbGVuOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsb2I7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgKiBGUk9NIEF1dGhUdXBsZXMgV0hFUkUgc3Vic2NyaWJlcl9pZD0ldSIsCisJCQlzdWJzY3ItPmlkKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJbWVtc2V0KGF0dXBsZSwgMCwgc2l6ZW9mKGF0dXBsZSkpOworCisJYXR1cGxlLT51c2VfY291bnQgPSBkYmlfcmVzdWx0X2dldF91bG9uZ2xvbmcocmVzdWx0LCAidXNlX2NvdW50Iik7CisJYXR1cGxlLT5rZXlfc2VxID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgImtleV9zZXEiKTsKKworCWxlbiA9IGRiaV9yZXN1bHRfZ2V0X2ZpZWxkX2xlbmd0aChyZXN1bHQsICJyYW5kIik7CisJaWYgKGxlbiAhPSBzaXplb2YoYXR1cGxlLT5yYW5kKSkKKwkJZ290byBlcnJfc2l6ZTsKKworCWJsb2IgPSBkYmlfcmVzdWx0X2dldF9iaW5hcnkocmVzdWx0LCAicmFuZCIpOworCW1lbWNweShhdHVwbGUtPnJhbmQsIGJsb2IsIGxlbik7CisKKwlsZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAic3JlcyIpOworCWlmIChsZW4gIT0gc2l6ZW9mKGF0dXBsZS0+c3JlcykpCisJCWdvdG8gZXJyX3NpemU7CisKKwlibG9iID0gZGJpX3Jlc3VsdF9nZXRfYmluYXJ5KHJlc3VsdCwgInNyZXMiKTsKKwltZW1jcHkoYXR1cGxlLT5zcmVzLCBibG9iLCBsZW4pOworCisJbGVuID0gZGJpX3Jlc3VsdF9nZXRfZmllbGRfbGVuZ3RoKHJlc3VsdCwgImtjIik7CisJaWYgKGxlbiAhPSBzaXplb2YoYXR1cGxlLT5rYykpCisJCWdvdG8gZXJyX3NpemU7CisKKwlibG9iID0gZGJpX3Jlc3VsdF9nZXRfYmluYXJ5KHJlc3VsdCwgImtjIik7CisJbWVtY3B5KGF0dXBsZS0+a2MsIGJsb2IsIGxlbik7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiAwOworCitlcnJfc2l6ZToKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gLUVJTzsKK30KKworaW50IHNldF9hdXRodHVwbGVfZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgKmF0dXBsZSwKKwkJCSAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJaW50IHJjLCB1cGQ7CisJc3RydWN0IGdzbV9hdXRoX3R1cGxlIGF0dXBsZV9vbGQ7CisJdW5zaWduZWQgY2hhciAqcmFuZF9zdHIsICpzcmVzX3N0ciwgKmtjX3N0cjsKKworCS8qIERlbGV0aW9uID8gKi8KKwlpZiAoYXR1cGxlID09IE5VTEwpIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiREVMRVRFIEZST00gQXV0aFR1cGxlcyBXSEVSRSBzdWJzY3JpYmVyX2lkPSV1IiwKKwkJCXN1YnNjci0+aWQpOworCisJCWlmICghcmVzdWx0KQorCQkJcmV0dXJuIC1FSU87CisKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2hlY2sgaWYgYWxyZWFkeSBleGlzdGluZyAqLworCXJjID0gZ2V0X2F1dGh0dXBsZV9ieV9zdWJzY3IoJmF0dXBsZV9vbGQsIHN1YnNjcik7CisJaWYgKHJjICYmIHJjICE9IC1FTk9FTlQpCisJCXJldHVybiByYzsKKwl1cGQgPSByYyA/IDAgOiAxOworCisJLyogVXBkYXRlIC8gSW5zZXJ0ICovCisJZGJpX2Nvbm5fcXVvdGVfYmluYXJ5X2NvcHkoY29ubiwKKwkJYXR1cGxlLT5yYW5kLCBzaXplb2YoYXR1cGxlLT5yYW5kKSwgJnJhbmRfc3RyKTsKKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLAorCQlhdHVwbGUtPnNyZXMsIHNpemVvZihhdHVwbGUtPnNyZXMpLCAmc3Jlc19zdHIpOworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sCisJCWF0dXBsZS0+a2MsIHNpemVvZihhdHVwbGUtPmtjKSwgJmtjX3N0cik7CisKKwlpZiAoIXVwZCkgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCQkiSU5TRVJUIElOVE8gQXV0aFR1cGxlcyAiCisJCQkJIihzdWJzY3JpYmVyX2lkLCBpc3N1ZWQsIHVzZV9jb3VudCwgIgorCQkJCSAia2V5X3NlcSwgcmFuZCwgc3Jlcywga2MpICIKKwkJCQkiVkFMVUVTICgldSwgZGF0ZXRpbWUoJ25vdycpLCAldSwgIgorCQkJCSAiJXUsICVzLCAlcywgJXMgKSAiLAorCQkJCXN1YnNjci0+aWQsIGF0dXBsZS0+dXNlX2NvdW50LCBhdHVwbGUtPmtleV9zZXEsCisJCQkJcmFuZF9zdHIsIHNyZXNfc3RyLCBrY19zdHIpOworCX0gZWxzZSB7CisJCWNoYXIgKmlzc3VlZCA9IGF0dXBsZS0+a2V5X3NlcSA9PSBhdHVwbGVfb2xkLmtleV9zZXEgPworCQkJCQkiaXNzdWVkIiA6ICJkYXRldGltZSgnbm93JykiOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCQkiVVBEQVRFIEF1dGhLZXlzICIKKwkJCQkiU0VUIGlzc3VlZD0lcywgdXNlX2NvdW50PSV1LCAiCisJCQkJICJrZXlfc2VxPSV1LCByYW5kPSVzLCBzcmVzPSVzLCBrYz0lcyAiCisJCQkJIldIRVJFIHN1YnNjcmliZXJfaWQgPSAldSIsCisJCQkJaXNzdWVkLCBhdHVwbGUtPnVzZV9jb3VudCwgYXR1cGxlLT5rZXlfc2VxLAorCQkJCXJhbmRfc3RyLCBzcmVzX3N0ciwga2Nfc3RyLCBzdWJzY3ItPmlkKTsKKwl9CisKKwlmcmVlKHJhbmRfc3RyKTsKKwlmcmVlKHNyZXNfc3RyKTsKKwlmcmVlKGtjX3N0cik7CisKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIEJBU0VfUVVFUlkgIlNFTEVDVCAqIEZST00gU3Vic2NyaWJlciAiCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKmRiX2dldF9zdWJzY3JpYmVyKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQkgZW51bSBnc21fc3Vic2NyaWJlcl9maWVsZCBmaWVsZCwKKwkJCQkJIGNvbnN0IGNoYXIgKmlkKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWNvbnN0IGNoYXIgKnN0cmluZzsKKwljaGFyICpxdW90ZWQ7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwlzd2l0Y2ggKGZpZWxkKSB7CisJY2FzZSBHU01fU1VCU0NSSUJFUl9JTVNJOgorCQlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCBpZCwgJnF1b3RlZCk7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJQkFTRV9RVUVSWQorCQkJIldIRVJFIGltc2kgPSAlcyAiLAorCQkJcXVvdGVkCisJCSk7CisJCWZyZWUocXVvdGVkKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fU1VCU0NSSUJFUl9UTVNJOgorCQlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCBpZCwgJnF1b3RlZCk7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJQkFTRV9RVUVSWQorCQkJIldIRVJFIHRtc2kgPSAlcyAiLAorCQkJcXVvdGVkCisJCSk7CisJCWZyZWUocXVvdGVkKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fU1VCU0NSSUJFUl9FWFRFTlNJT046CisJCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIGlkLCAmcXVvdGVkKTsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQlCQVNFX1FVRVJZCisJCQkiV0hFUkUgZXh0ZW5zaW9uID0gJXMgIiwKKwkJCXF1b3RlZAorCQkpOworCQlmcmVlKHF1b3RlZCk7CisJCWJyZWFrOworCWNhc2UgR1NNX1NVQlNDUklCRVJfSUQ6CisJCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIGlkLCAmcXVvdGVkKTsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQlCQVNFX1FVRVJZCisJCQkiV0hFUkUgaWQgPSAlcyAiLCBxdW90ZWQpOworCQlmcmVlKHF1b3RlZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRERCLCBMT0dMX05PVElDRSwgIlVua25vd24gcXVlcnkgc2VsZWN0b3IgZm9yIFN1YnNjcmliZXIuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXJ5IFN1YnNjcmliZXIuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCURFQlVHUChEREIsICJGYWlsZWQgdG8gZmluZCB0aGUgU3Vic2NyaWJlci4gJyV1JyAnJXMnXG4iLAorCQkJZmllbGQsIGlkKTsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXN1YnNjciA9IHN1YnNjcl9hbGxvYygpOworCXN1YnNjci0+bmV0ID0gbmV0OworCXN1YnNjci0+aWQgPSBkYmlfcmVzdWx0X2dldF91bG9uZ2xvbmcocmVzdWx0LCAiaWQiKTsKKwlzdHJpbmcgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAiaW1zaSIpOworCWlmIChzdHJpbmcpCisJCXN0cm5jcHkoc3Vic2NyLT5pbXNpLCBzdHJpbmcsIEdTTV9JTVNJX0xFTkdUSCk7CisKKwlzdHJpbmcgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAidG1zaSIpOworCWlmIChzdHJpbmcpCisJCXN1YnNjci0+dG1zaSA9IHRtc2lfZnJvbV9zdHJpbmcoc3RyaW5nKTsKKworCXN0cmluZyA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJuYW1lIik7CisJaWYgKHN0cmluZykKKwkJc3RybmNweShzdWJzY3ItPm5hbWUsIHN0cmluZywgR1NNX05BTUVfTEVOR1RIKTsKKworCXN0cmluZyA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJleHRlbnNpb24iKTsKKwlpZiAoc3RyaW5nKQorCQlzdHJuY3B5KHN1YnNjci0+ZXh0ZW5zaW9uLCBzdHJpbmcsIEdTTV9FWFRFTlNJT05fTEVOR1RIKTsKKworCXN1YnNjci0+bGFjID0gZGJpX3Jlc3VsdF9nZXRfdWludChyZXN1bHQsICJsYWMiKTsKKwlzdWJzY3ItPmF1dGhvcml6ZWQgPSBkYmlfcmVzdWx0X2dldF91aW50KHJlc3VsdCwgImF1dGhvcml6ZWQiKTsKKwlERUJVR1AoRERCLCAiRm91bmQgU3Vic2NyaWJlcjogSUQgJWxsdSwgSU1TSSAlcywgTkFNRSAnJXMnLCBUTVNJICV1LCBFWFRFTiAnJXMnLCBMQUMgJWh1LCBBVVRIICV1XG4iLAorCQlzdWJzY3ItPmlkLCBzdWJzY3ItPmltc2ksIHN1YnNjci0+bmFtZSwgc3Vic2NyLT50bXNpLCBzdWJzY3ItPmV4dGVuc2lvbiwKKwkJc3Vic2NyLT5sYWMsIHN1YnNjci0+YXV0aG9yaXplZCk7CisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlnZXRfZXF1aXBtZW50X2J5X3N1YnNjcihzdWJzY3IpOworCisJcmV0dXJuIHN1YnNjcjsKK30KKworaW50IGRiX3N5bmNfc3Vic2NyaWJlcihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcmliZXIpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY2hhciB0bXNpWzE0XTsKKwljaGFyICpxX3Rtc2k7CisKKwlpZiAoc3Vic2NyaWJlci0+dG1zaSAhPSBHU01fUkVTRVJWRURfVE1TSSkgeworCQlzcHJpbnRmKHRtc2ksICIldSIsIHN1YnNjcmliZXItPnRtc2kpOworCQlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLAorCQkJCSAgIHRtc2ksCisJCQkJICAgJnFfdG1zaSk7CisJfSBlbHNlCisJCXFfdG1zaSA9IHN0cmR1cCgiTlVMTCIpOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJVUERBVEUgU3Vic2NyaWJlciAiCisJCSJTRVQgdXBkYXRlZCA9IGRhdGV0aW1lKCdub3cnKSwgIgorCQkibmFtZSA9ICclcycsICIKKwkJImV4dGVuc2lvbiA9ICclcycsICIKKwkJImF1dGhvcml6ZWQgPSAlaSwgIgorCQkidG1zaSA9ICVzLCAiCisJCSJsYWMgPSAlaSAiCisJCSJXSEVSRSBpbXNpID0gJXMgIiwKKwkJc3Vic2NyaWJlci0+bmFtZSwKKwkJc3Vic2NyaWJlci0+ZXh0ZW5zaW9uLAorCQlzdWJzY3JpYmVyLT5hdXRob3JpemVkLAorCQlxX3Rtc2ksCisJCXN1YnNjcmliZXItPmxhYywKKwkJc3Vic2NyaWJlci0+aW1zaSk7CisKKwlmcmVlKHFfdG1zaSk7CisKKwlpZiAoIXJlc3VsdCkgeworCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byB1cGRhdGUgU3Vic2NyaWJlciAoYnkgSU1TSSkuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRiX3N5bmNfZXF1aXBtZW50KHN0cnVjdCBnc21fZXF1aXBtZW50ICplcXVpcCkKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyICpjbTIsICpjbTM7CisJdV9pbnQ4X3QgY2xhc3NtYXJrMTsKKworCW1lbWNweSgmY2xhc3NtYXJrMSwgJmVxdWlwLT5jbGFzc21hcmsxLCBzaXplb2YoY2xhc3NtYXJrMSkpOworCURFQlVHUChEREIsICJTeW5jIEVxdWlwbWVudCBJTUVJPSVzLCBjbGFzc21hcmsxPSUwMngiLAorCQllcXVpcC0+aW1laSwgY2xhc3NtYXJrMSk7CisJaWYgKGVxdWlwLT5jbGFzc21hcmsyX2xlbikKKwkJREVCVUdQQyhEREIsICIsIGNsYXNzbWFyazI9JXMiLAorCQkJaGV4ZHVtcChlcXVpcC0+Y2xhc3NtYXJrMiwgZXF1aXAtPmNsYXNzbWFyazJfbGVuKSk7CisJaWYgKGVxdWlwLT5jbGFzc21hcmszX2xlbikKKwkJREVCVUdQQyhEREIsICIsIGNsYXNzbWFyazM9JXMiLAorCQkJaGV4ZHVtcChlcXVpcC0+Y2xhc3NtYXJrMywgZXF1aXAtPmNsYXNzbWFyazNfbGVuKSk7CisJREVCVUdQQyhEREIsICJcbiIpOworCisJZGJpX2Nvbm5fcXVvdGVfYmluYXJ5X2NvcHkoY29ubiwgZXF1aXAtPmNsYXNzbWFyazIsCisJCQkJICAgZXF1aXAtPmNsYXNzbWFyazJfbGVuLCAmY20yKTsKKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLCBlcXVpcC0+Y2xhc3NtYXJrMywKKwkJCQkgICBlcXVpcC0+Y2xhc3NtYXJrM19sZW4sICZjbTMpOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJVUERBVEUgRXF1aXBtZW50IFNFVCAiCisJCQkidXBkYXRlZCA9IGRhdGV0aW1lKCdub3cnKSwgIgorCQkJImNsYXNzbWFyazEgPSAldSwgIgorCQkJImNsYXNzbWFyazIgPSAlcywgIgorCQkJImNsYXNzbWFyazMgPSAlcyAiCisJCSJXSEVSRSBpbWVpID0gJyVzJyAiLAorCQljbGFzc21hcmsxLCBjbTIsIGNtMywgZXF1aXAtPmltZWkpOworCisJZnJlZShjbTIpOworCWZyZWUoY20zKTsKKworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHVwZGF0ZSBFcXVpcG1lbnRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRiX3N1YnNjcmliZXJfYWxsb2NfdG1zaShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcmliZXIpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQgPSBOVUxMOworCWNoYXIgdG1zaVsxNF07CisJY2hhciogdG1zaV9xdW90ZWQ7CisKKwlmb3IgKDs7KSB7CisJCXN1YnNjcmliZXItPnRtc2kgPSByYW5kKCk7CisJCWlmIChzdWJzY3JpYmVyLT50bXNpID09IEdTTV9SRVNFUlZFRF9UTVNJKQorCQkJY29udGludWU7CisKKwkJc3ByaW50Zih0bXNpLCAiJXUiLCBzdWJzY3JpYmVyLT50bXNpKTsKKwkJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgdG1zaSwgJnRtc2lfcXVvdGVkKTsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiU0VMRUNUICogRlJPTSBTdWJzY3JpYmVyICIKKwkJCSJXSEVSRSB0bXNpID0gJXMgIiwKKwkJCXRtc2lfcXVvdGVkKTsKKworCQlmcmVlKHRtc2lfcXVvdGVkKTsKKworCQlpZiAoIXJlc3VsdCkgeworCQkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgU3Vic2NyaWJlciAiCisJCQkJIndoaWxlIGFsbG9jYXRpbmcgbmV3IFRNU0kuXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChkYmlfcmVzdWx0X2dldF9udW1yb3dzKHJlc3VsdCkpIHsKKwkJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQkJREVCVUdQKEREQiwgIkFsbG9jYXRlZCBUTVNJICV1IGZvciBJTVNJICVzLlxuIiwKKwkJCQlzdWJzY3JpYmVyLT50bXNpLCBzdWJzY3JpYmVyLT5pbXNpKTsKKwkJCXJldHVybiBkYl9zeW5jX3N1YnNjcmliZXIoc3Vic2NyaWJlcik7CisJCX0KKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZGJfc3Vic2NyaWJlcl9hbGxvY19leHRlbihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcmliZXIpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQgPSBOVUxMOworCXVfaW50MzJfdCB0cnk7CisKKwlmb3IgKDs7KSB7CisJCXRyeSA9IChyYW5kKCklKEdTTV9NQVhfRVhURU4tR1NNX01JTl9FWFRFTisxKStHU01fTUlOX0VYVEVOKTsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiU0VMRUNUICogRlJPTSBTdWJzY3JpYmVyICIKKwkJCSJXSEVSRSBleHRlbnNpb24gPSAlaSIsCisJCQl0cnkKKwkJKTsKKwkJaWYgKCFyZXN1bHQpIHsKKwkJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXJ5IFN1YnNjcmliZXIgIgorCQkJCSJ3aGlsZSBhbGxvY2F0aW5nIG5ldyBleHRlbnNpb24uXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChkYmlfcmVzdWx0X2dldF9udW1yb3dzKHJlc3VsdCkpeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQlicmVhazsKKwkJfQorCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwl9CisJc3ByaW50ZihzdWJzY3JpYmVyLT5leHRlbnNpb24sICIlaSIsIHRyeSk7CisJREVCVUdQKEREQiwgIkFsbG9jYXRlZCBleHRlbnNpb24gJWkgZm9yIElNU0kgJXMuXG4iLCB0cnksIHN1YnNjcmliZXItPmltc2kpOworCXJldHVybiBkYl9zeW5jX3N1YnNjcmliZXIoc3Vic2NyaWJlcik7Cit9CisvKgorICogdHJ5IHRvIGFsbG9jYXRlIGEgbmV3IHVuaXF1ZSB0b2tlbiBmb3IgdGhpcyBzdWJzY3JpYmVyIGFuZCByZXR1cm4gaXQKKyAqIHZpYSBhIHBhcmFtZXRlci4gaWYgdGhlIHN1YnNjcmliZXIgYWxyZWFkeSBoYXMgYSB0b2tlbiwgcmV0dXJuCisgKiBhbiBlcnJvci4KKyAqLworCitpbnQgZGJfc3Vic2NyaWJlcl9hbGxvY190b2tlbihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcmliZXIsIHVfaW50MzJfdCAqdG9rZW4pCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJdV9pbnQzMl90IHRyeTsKKworCWZvciAoOzspIHsKKwkJdHJ5ID0gcmFuZCgpOworCQlpZiAoIXRyeSkgLyogMCBpcyBhbiBpbnZhbGlkIHRva2VuICovCisJCQljb250aW51ZTsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiU0VMRUNUICogRlJPTSBBdXRoVG9rZW4gIgorCQkJIldIRVJFIHN1YnNjcmliZXJfaWQgPSAlbGx1IE9SIHRva2VuID0gXCIlMDhYXCIgIiwKKwkJCXN1YnNjcmliZXItPmlkLCB0cnkpOworCQlpZiAoIXJlc3VsdCkgeworCQkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgQXV0aFRva2VuICIKKwkJCQkid2hpbGUgYWxsb2NhdGluZyBuZXcgdG9rZW4uXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChkYmlfcmVzdWx0X2dldF9udW1yb3dzKHJlc3VsdCkpIHsKKwkJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQkJYnJlYWs7CisJCX0KKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJfQorCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiSU5TRVJUIElOVE8gQXV0aFRva2VuICIKKwkJIihzdWJzY3JpYmVyX2lkLCBjcmVhdGVkLCB0b2tlbikgIgorCQkiVkFMVUVTICIKKwkJIiglbGx1LCBkYXRldGltZSgnbm93JyksIFwiJTA4WFwiKSAiLAorCQlzdWJzY3JpYmVyLT5pZCwgdHJ5KTsKKwlpZiAoIXJlc3VsdCkgeworCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgdG9rZW4gJTA4WCBmb3IgIgorCQkJIklNU0kgJXMuXG4iLCB0cnksIHN1YnNjcmliZXItPmltc2kpOworCQlyZXR1cm4gMTsKKwl9CisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJKnRva2VuID0gdHJ5OworCURFQlVHUChEREIsICJBbGxvY2F0ZWQgdG9rZW4gJTA4WCBmb3IgSU1TSSAlcy5cbiIsIHRyeSwgc3Vic2NyaWJlci0+aW1zaSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRiX3N1YnNjcmliZXJfYXNzb2NfaW1laShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcmliZXIsIGNoYXIgaW1laVtHU01fSU1FSV9MRU5HVEhdKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBlcXVpcG1lbnRfaWQsIHdhdGNoX2lkOworCWRiaV9yZXN1bHQgcmVzdWx0OworCisJc3RybmNweShzdWJzY3JpYmVyLT5lcXVpcG1lbnQuaW1laSwgaW1laSwKKwkJc2l6ZW9mKHN1YnNjcmliZXItPmVxdWlwbWVudC5pbWVpKS0xKSwKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiSU5TRVJUIE9SIElHTk9SRSBJTlRPIEVxdWlwbWVudCAiCisJCSIoaW1laSwgY3JlYXRlZCwgdXBkYXRlZCkgIgorCQkiVkFMVUVTICIKKwkJIiglcywgZGF0ZXRpbWUoJ25vdycpLCBkYXRldGltZSgnbm93JykpICIsCisJCWltZWkpOworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBFcXVpcG1lbnQgYnkgSU1FSS5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwllcXVpcG1lbnRfaWQgPSAwOworCWlmIChkYmlfcmVzdWx0X2dldF9udW1yb3dzX2FmZmVjdGVkKHJlc3VsdCkpIHsKKwkJZXF1aXBtZW50X2lkID0gZGJpX2Nvbm5fc2VxdWVuY2VfbGFzdChjb25uLCBOVUxMKTsKKwl9CisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlpZiAoZXF1aXBtZW50X2lkKQorCQlERUJVR1AoRERCLCAiTmV3IEVxdWlwbWVudDogSUQgJWxsdSwgSU1FSSAlc1xuIiwgZXF1aXBtZW50X2lkLCBpbWVpKTsKKwllbHNlIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiU0VMRUNUIGlkIEZST00gRXF1aXBtZW50ICIKKwkJCSJXSEVSRSBpbWVpID0gJXMgIiwKKwkJCWltZWkKKwkJKTsKKwkJaWYgKCFyZXN1bHQpIHsKKwkJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXJ5IEVxdWlwbWVudCBieSBJTUVJLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gZmluZCB0aGUgRXF1aXBtZW50LlxuIik7CisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJCXJldHVybiAxOworCQl9CisJCWVxdWlwbWVudF9pZCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJpZCIpOworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwl9CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIklOU0VSVCBPUiBJR05PUkUgSU5UTyBFcXVpcG1lbnRXYXRjaCAiCisJCSIoc3Vic2NyaWJlcl9pZCwgZXF1aXBtZW50X2lkLCBjcmVhdGVkLCB1cGRhdGVkKSAiCisJCSJWQUxVRVMgIgorCQkiKCVsbHUsICVsbHUsIGRhdGV0aW1lKCdub3cnKSwgZGF0ZXRpbWUoJ25vdycpKSAiLAorCQlzdWJzY3JpYmVyLT5pZCwgZXF1aXBtZW50X2lkKTsKKwlpZiAoIXJlc3VsdCkgeworCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgRXF1aXBtZW50V2F0Y2guXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJd2F0Y2hfaWQgPSAwOworCWlmIChkYmlfcmVzdWx0X2dldF9udW1yb3dzX2FmZmVjdGVkKHJlc3VsdCkpCisJCXdhdGNoX2lkID0gZGJpX2Nvbm5fc2VxdWVuY2VfbGFzdChjb25uLCBOVUxMKTsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCWlmICh3YXRjaF9pZCkKKwkJREVCVUdQKEREQiwgIk5ldyBFcXVpcG1lbnRXYXRjaDogSUQgJWxsdSwgSU1TSSAlcywgSU1FSSAlc1xuIiwKKwkJCWVxdWlwbWVudF9pZCwgc3Vic2NyaWJlci0+aW1zaSwgaW1laSk7CisJZWxzZSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJIlVQREFURSBFcXVpcG1lbnRXYXRjaCAiCisJCQkiU0VUIHVwZGF0ZWQgPSBkYXRldGltZSgnbm93JykgIgorCQkJIldIRVJFIHN1YnNjcmliZXJfaWQgPSAlbGx1IEFORCBlcXVpcG1lbnRfaWQgPSAlbGx1ICIsCisJCQlzdWJzY3JpYmVyLT5pZCwgZXF1aXBtZW50X2lkKTsKKwkJaWYgKCFyZXN1bHQpIHsKKwkJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHVwZGF0ZSBFcXVpcG1lbnRXYXRjaC5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCURFQlVHUChEREIsICJVcGRhdGVkIEVxdWlwbWVudFdhdGNoOiBJRCAlbGx1LCBJTVNJICVzLCBJTUVJICVzXG4iLAorCQkJZXF1aXBtZW50X2lkLCBzdWJzY3JpYmVyLT5pbXNpLCBpbWVpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogc3RvcmUgYW4gW3Vuc2VudF0gU01TIHRvIHRoZSBkYXRhYmFzZSAqLworaW50IGRiX3Ntc19zdG9yZShzdHJ1Y3QgZ3NtX3NtcyAqc21zKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWNoYXIgKnFfdGV4dCwgKnFfZGFkZHI7CisJdW5zaWduZWQgY2hhciAqcV91ZGF0YTsKKwljaGFyICp2YWxpZGl0eV90aW1lc3RhbXAgPSAiMjIyMi0yLTIiOworCisJLyogRklYTUU6IGdlbmVyYXRlIHZhbGlkaXR5IHRpbWVzdGFtcCBiYXNlZCBvbiB2YWxpZGl0eV9taW51dGVzICovCisKKwlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCAoY2hhciAqKXNtcy0+dGV4dCwgJnFfdGV4dCk7CisJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgKGNoYXIgKilzbXMtPmRlc3RfYWRkciwgJnFfZGFkZHIpOworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sIHNtcy0+dXNlcl9kYXRhLCBzbXMtPnVzZXJfZGF0YV9sZW4sCisJCQkJICAgJnFfdWRhdGEpOworCS8qIEZJWE1FOiBjb3JyZWN0IHZhbGlkaXR5IHBlcmlvZCAqLworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiSU5TRVJUIElOVE8gU01TICIKKwkJIihjcmVhdGVkLCBzZW5kZXJfaWQsIHJlY2VpdmVyX2lkLCB2YWxpZF91bnRpbCwgIgorCQkgInJlcGx5X3BhdGhfcmVxLCBzdGF0dXNfcmVwX3JlcSwgcHJvdG9jb2xfaWQsICIKKwkJICJkYXRhX2NvZGluZ19zY2hlbWUsIHVkX2hkcl9pbmQsIGRlc3RfYWRkciwgIgorCQkgInVzZXJfZGF0YSwgdGV4dCkgVkFMVUVTICIKKwkJIihkYXRldGltZSgnbm93JyksICVsbHUsICVsbHUsICV1LCAiCisJCSAiJXUsICV1LCAldSwgJXUsICV1LCAlcywgJXMsICVzKSIsCisJCXNtcy0+c2VuZGVyLT5pZCwKKwkJc21zLT5yZWNlaXZlciA/IHNtcy0+cmVjZWl2ZXItPmlkIDogMCwgdmFsaWRpdHlfdGltZXN0YW1wLAorCQlzbXMtPnJlcGx5X3BhdGhfcmVxLCBzbXMtPnN0YXR1c19yZXBfcmVxLCBzbXMtPnByb3RvY29sX2lkLAorCQlzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSwgc21zLT51ZF9oZHJfaW5kLAorCQlxX2RhZGRyLCBxX3VkYXRhLCBxX3RleHQpOworCWZyZWUocV90ZXh0KTsKKwlmcmVlKHFfZGFkZHIpOworCWZyZWUocV91ZGF0YSk7CisKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBnc21fc21zICpzbXNfZnJvbV9yZXN1bHQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGRiaV9yZXN1bHQgcmVzdWx0KQoreworCXN0cnVjdCBnc21fc21zICpzbXMgPSBzbXNfYWxsb2MoKTsKKwlsb25nIGxvbmcgdW5zaWduZWQgaW50IHNlbmRlcl9pZCwgcmVjZWl2ZXJfaWQ7CisJY29uc3QgY2hhciAqdGV4dCwgKmRhZGRyOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzZXJfZGF0YTsKKworCWlmICghc21zKQorCQlyZXR1cm4gTlVMTDsKKworCXNtcy0+aWQgPSBkYmlfcmVzdWx0X2dldF91bG9uZ2xvbmcocmVzdWx0LCAiaWQiKTsKKworCXNlbmRlcl9pZCA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJzZW5kZXJfaWQiKTsKKwlzbXMtPnNlbmRlciA9IHN1YnNjcl9nZXRfYnlfaWQobmV0LCBzZW5kZXJfaWQpOworCisJcmVjZWl2ZXJfaWQgPSBkYmlfcmVzdWx0X2dldF91bG9uZ2xvbmcocmVzdWx0LCAicmVjZWl2ZXJfaWQiKTsKKwlzbXMtPnJlY2VpdmVyID0gc3Vic2NyX2dldF9ieV9pZChuZXQsIHJlY2VpdmVyX2lkKTsKKworCS8qIEZJWE1FOiB2YWxpZGl0eSAqLworCS8qIEZJWE1FOiB0aG9zZSBzaG91bGQgYWxsIGJlIGdldF91Y2hhciwgYnV0IHNxbGl0ZTMgaXMgYnJhaW5kZWFkICovCisJc21zLT5yZXBseV9wYXRoX3JlcSA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LCAicmVwbHlfcGF0aF9yZXEiKTsKKwlzbXMtPnN0YXR1c19yZXBfcmVxID0gZGJpX3Jlc3VsdF9nZXRfdWludChyZXN1bHQsICJzdGF0dXNfcmVwX3JlcSIpOworCXNtcy0+dWRfaGRyX2luZCA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LCAidWRfaGRyX2luZCIpOworCXNtcy0+cHJvdG9jb2xfaWQgPSBkYmlfcmVzdWx0X2dldF91aW50KHJlc3VsdCwgInByb3RvY29sX2lkIik7CisJc21zLT5kYXRhX2NvZGluZ19zY2hlbWUgPSBkYmlfcmVzdWx0X2dldF91aW50KHJlc3VsdCwKKwkJCQkJCSAgImRhdGFfY29kaW5nX3NjaGVtZSIpOworCS8qIHNtcy0+bXNnX3JlZiBpcyB0ZW1wb3JhcnkgYW5kIG5vdCBzdG9yZWQgaW4gREIgKi8KKworCWRhZGRyID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgImRlc3RfYWRkciIpOworCWlmIChkYWRkcikgeworCQlzdHJuY3B5KHNtcy0+ZGVzdF9hZGRyLCBkYWRkciwgc2l6ZW9mKHNtcy0+ZGVzdF9hZGRyKSk7CisJCXNtcy0+ZGVzdF9hZGRyW3NpemVvZihzbXMtPmRlc3RfYWRkciktMV0gPSAnXDAnOworCX0KKworCXNtcy0+dXNlcl9kYXRhX2xlbiA9IGRiaV9yZXN1bHRfZ2V0X2ZpZWxkX2xlbmd0aChyZXN1bHQsICJ1c2VyX2RhdGEiKTsKKwl1c2VyX2RhdGEgPSBkYmlfcmVzdWx0X2dldF9iaW5hcnkocmVzdWx0LCAidXNlcl9kYXRhIik7CisJaWYgKHNtcy0+dXNlcl9kYXRhX2xlbiA+IHNpemVvZihzbXMtPnVzZXJfZGF0YSkpCisJCXNtcy0+dXNlcl9kYXRhX2xlbiA9ICh1X2ludDhfdCkgc2l6ZW9mKHNtcy0+dXNlcl9kYXRhKTsKKwltZW1jcHkoc21zLT51c2VyX2RhdGEsIHVzZXJfZGF0YSwgc21zLT51c2VyX2RhdGFfbGVuKTsKKworCXRleHQgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAidGV4dCIpOworCWlmICh0ZXh0KSB7CisJCXN0cm5jcHkoc21zLT50ZXh0LCB0ZXh0LCBzaXplb2Yoc21zLT50ZXh0KSk7CisJCXNtcy0+dGV4dFtzaXplb2Yoc21zLT50ZXh0KS0xXSA9ICdcMCc7CisJfQorCXJldHVybiBzbXM7Cit9CisKKy8qIHJldHJpZXZlIHRoZSBuZXh0IHVuc2VudCBTTVMgd2l0aCBJRCA+PSBtaW5faWQgKi8KK3N0cnVjdCBnc21fc21zICpkYl9zbXNfZ2V0X3Vuc2VudChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdW5zaWduZWQgbG9uZyBsb25nIG1pbl9pZCkKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJTRUxFQ1QgKiBGUk9NIFNNUyxTdWJzY3JpYmVyICIKKwkJIldIRVJFIHNtcy5pZCA+PSAlbGx1IEFORCBzbXMuc2VudCBpcyBOVUxMICIKKwkJCSJBTkQgc21zLnJlY2VpdmVyX2lkID0gc3Vic2NyaWJlci5pZCAiCisJCQkiQU5EIHN1YnNjcmliZXIubGFjID4gMCAiCisJCSJPUkRFUiBCWSBzbXMuaWQgTElNSVQgMSIsCisJCW1pbl9pZCk7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNtcyA9IHNtc19mcm9tX3Jlc3VsdChuZXQsIHJlc3VsdCk7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiBzbXM7Cit9CisKK3N0cnVjdCBnc21fc21zICpkYl9zbXNfZ2V0X3Vuc2VudF9ieV9zdWJzY3Ioc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVuc2lnbmVkIGxvbmcgbG9uZyBtaW5fc3Vic2NyX2lkKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBnc21fc21zICpzbXM7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIlNFTEVDVCAqIEZST00gU01TLFN1YnNjcmliZXIgIgorCQkiV0hFUkUgc21zLnJlY2VpdmVyX2lkID49ICVsbHUgQU5EIHNtcy5zZW50IGlzIE5VTEwgIgorCQkJIkFORCBzbXMucmVjZWl2ZXJfaWQgPSBzdWJzY3JpYmVyLmlkICIgCisJCQkiQU5EIHN1YnNjcmliZXIubGFjID4gMCAiCisJCSJPUkRFUiBCWSBzbXMucmVjZWl2ZXJfaWQsIGlkIExJTUlUIDEiLAorCQltaW5fc3Vic2NyX2lkKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc21zID0gc21zX2Zyb21fcmVzdWx0KG5ldCwgcmVzdWx0KTsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIHNtczsKK30KKworLyogcmV0cmlldmUgdGhlIG5leHQgdW5zZW50IFNNUyBmb3IgYSBnaXZlbiBzdWJzY3JpYmVyICovCitzdHJ1Y3QgZ3NtX3NtcyAqZGJfc21zX2dldF91bnNlbnRfZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJTRUxFQ1QgKiBGUk9NIFNNUyxTdWJzY3JpYmVyICIKKwkJIldIRVJFIHNtcy5yZWNlaXZlcl9pZCA9ICVsbHUgQU5EIHNtcy5zZW50IGlzIE5VTEwgIgorCQkJIkFORCBzbXMucmVjZWl2ZXJfaWQgPSBzdWJzY3JpYmVyLmlkICIKKwkJCSJBTkQgc3Vic2NyaWJlci5sYWMgPiAwICIKKwkJIk9SREVSIEJZIHNtcy5pZCBMSU1JVCAxIiwKKwkJc3Vic2NyLT5pZCk7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNtcyA9IHNtc19mcm9tX3Jlc3VsdChzdWJzY3ItPm5ldCwgcmVzdWx0KTsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIHNtczsKK30KKworLyogbWFyayBhIGdpdmVuIFNNUyBhcyByZWFkICovCitpbnQgZGJfc21zX21hcmtfc2VudChzdHJ1Y3QgZ3NtX3NtcyAqc21zKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJVUERBVEUgU01TICIKKwkJIlNFVCBzZW50ID0gZGF0ZXRpbWUoJ25vdycpICIKKwkJIldIRVJFIGlkID0gJWxsdSIsIHNtcy0+aWQpOworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIG1hcmsgU01TICVsbHUgYXMgc2VudC5cbiIsIHNtcy0+aWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KKworLyogaW5jcmVhc2UgdGhlIG51bWJlciBvZiBhdHRlbXB0ZWQgZGVsaXZlcmllcyAqLworaW50IGRiX3Ntc19pbmNfZGVsaXZlcl9hdHRlbXB0cyhzdHJ1Y3QgZ3NtX3NtcyAqc21zKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJVUERBVEUgU01TICIKKwkJIlNFVCBkZWxpdmVyX2F0dGVtcHRzID0gZGVsaXZlcl9hdHRlbXB0cyArIDEgIgorCQkiV0hFUkUgaWQgPSAlbGx1Iiwgc21zLT5pZCk7CisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gaW5jIGRlbGl2ZXIgYXR0ZW1wdHMgZm9yICIKKwkJCSJTTVMgJWxsdS5cbiIsIHNtcy0+aWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRiX2FwZHVfYmxvYl9zdG9yZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwgCisJCQl1X2ludDhfdCBhcGR1X2lkX2ZsYWdzLCB1X2ludDhfdCBsZW4sCisJCQl1X2ludDhfdCAqYXBkdSkKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyICpxX2FwZHU7CisKKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLCBhcGR1LCBsZW4sICZxX2FwZHUpOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgSU5UTyBBcGR1QmxvYnMgIgorCQkiKGNyZWF0ZWQsc3Vic2NyaWJlcl9pZCxhcGR1X2lkX2ZsYWdzLGFwZHUpIFZBTFVFUyAiCisJCSIoZGF0ZXRpbWUoJ25vdycpLCVsbHUsJXUsJXMpIiwKKwkJc3Vic2NyLT5pZCwgYXBkdV9pZF9mbGFncywgcV9hcGR1KTsKKworCWZyZWUocV9hcGR1KTsKKworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCXJldHVybiAwOworfQorCitpbnQgZGJfc3RvcmVfY291bnRlcihzdHJ1Y3QgY291bnRlciAqY3RyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWNoYXIgKnFfbmFtZTsKKworCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIGN0ci0+bmFtZSwgJnFfbmFtZSk7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIklOU0VSVCBJTlRPIENvdW50ZXJzICIKKwkJIih0aW1lc3RhbXAsbmFtZSx2YWx1ZSkgVkFMVUVTICIKKwkJIihkYXRldGltZSgnbm93JyksJXMsJWx1KSIsIHFfbmFtZSwgY3RyLT52YWx1ZSk7CisKKwlmcmVlKHFfbmFtZSk7CisKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2RlYnVnLmMgYi9vcGVuYnNjL3NyYy9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNTViZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9kZWJ1Zy5jCkBAIC0wLDAgKzEsMTg3IEBACisvKiBPcGVuQlNDIERlYnVnZ2luZy9Mb2dnaW5nIHN1cHBvcnQgY29kZSAqLworCisvKiAoQykgMjAwOC0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdXRpbHMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKy8qIGRlZmF1bHQgY2F0ZWdvcmllcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBsb2dfaW5mb19jYXQgZGVmYXVsdF9jYXRlZ29yaWVzW10gPSB7CisJW0RSTExdID0geworCQkubmFtZSA9ICJEUkxMIiwKKwkJLmRlc2NyaXB0aW9uID0gIlJhZGlvIExpbmsgTGF5ZXIiLAorCQkuY29sb3IgPSAiXDAzM1sxOzMxbSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRENDXSA9IHsKKwkJLm5hbWUgPSAiRENDIiwKKwkJLmRlc2NyaXB0aW9uID0gIkNhbGwgQ29udHJvbCIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzJtIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtETU1dID0geworCQkubmFtZSA9ICJETU0iLAorCQkuZGVzY3JpcHRpb24gPSAiTW9iaWxpdHkgTWFuYWdlbWVudCIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzNtIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtEUlJdID0geworCQkubmFtZSA9ICJEUlIiLAorCQkuZGVzY3JpcHRpb24gPSAiUmFkaW8gUmVzb3VyY2UiLAorCQkuY29sb3IgPSAiXDAzM1sxOzM0bSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRFJTTF0gPSB7CisJCS5uYW1lID0gIkRSU0wiLAorCQkuZGVzY3JpcHRpb24gPSAiUmFkaW8gU2lnYW5sbGluZyBMaW5rIiwKKwkJLmNvbG9yID0gIlwwMzNbMTszNW0iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0ROTV0gPQl7CisJCS5uYW1lID0gIkROTSIsCisJCS5kZXNjcmlwdGlvbiA9ICJOZXR3b3JrIE1hbmFnZW1lbnQgKE9NTCkiLAorCQkuY29sb3IgPSAiXDAzM1sxOzM2bSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9JTkZPLAorCX0sCisJW0RNTkNDXSA9IHsKKwkJLm5hbWUgPSAiRE1OQ0MiLAorCQkuZGVzY3JpcHRpb24gPSAiQlNDPC0+TVNDIGludGVyZmFjZSIsCisJCS5jb2xvciA9ICJcMDMzWzE7MzltIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtEU01TXSA9IHsKKwkJLm5hbWUgPSAiRFNNUyIsCisJCS5kZXNjcmlwdGlvbiA9ICJTaG9ydCBNZXNzYWdlIFNlcnZpY2UiLAorCQkuY29sb3IgPSAiXDAzM1sxOzM3bSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRFBBR10JPSB7CisJCS5uYW1lID0gIkRQQUciLAorCQkuZGVzY3JpcHRpb24gPSAiUGFnaW5nIiwKKwkJLmNvbG9yID0gIlwwMzNbMTszOG0iLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RNRUFTXSA9IHsKKwkJLm5hbWUgPSAiRE1FQVMiLAorCQkuZGVzY3JpcHRpb24gPSAiTWVhc3VyZW1lbnQgUHJvY2Vzc2luZyIsCisJCS5lbmFibGVkID0gMCwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1JXSA9IHsKKwkJLm5hbWUgPSAiRE1JIiwKKwkJLmRlc2NyaXB0aW9uID0gIm1JU0ROIElucHV0IERyaXZlciIsCisJCS5lbmFibGVkID0gMCwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1JQl0gPSB7CisJCS5uYW1lID0gIkRNSUIiLAorCQkuZGVzY3JpcHRpb24gPSAibUlTRE4gQi1DaGFubmVscyIsCisJCS5lbmFibGVkID0gMCwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1VWF0gPSB7CisJCS5uYW1lID0gIkRNVVgiLAorCQkuZGVzY3JpcHRpb24gPSAiVFJBVSBGcmFtZSBNdWx0aXBsZXgiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RJTlBdID0geworCQkubmFtZSA9ICJESU5QIiwKKwkJLmRlc2NyaXB0aW9uID0gIklucHV0IERyaXZlciIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRFNDQ1BdID0geworCQkubmFtZSA9ICJEU0NDUCIsCisJCS5kZXNjcmlwdGlvbiA9ICJTQ0NQIFByb3RvY29sIiwKKwkJLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorCVtETVNDXSA9IHsKKwkJLm5hbWUgPSAiRE1TQyIsCisJCS5kZXNjcmlwdGlvbiA9ICJNb2JpbGUgU3dpdGNoaW5nIENlbnRlciIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRE1HQ1BdID0geworCQkubmFtZSA9ICJETUdDUCIsCisJCS5kZXNjcmlwdGlvbiA9ICJNZWRpYSBHYXRld2F5IENvbnRyb2wgUHJvdG9jb2wiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0RIT10gPSB7CisJCS5uYW1lID0gIkRITyIsCisJCS5kZXNjcmlwdGlvbiA9ICJIYW5kLU92ZXIiLAorCQkuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFLAorCX0sCisJW0REQl0gPSB7CisJCS5uYW1lID0gIkREQiIsCisJCS5kZXNjcmlwdGlvbiA9ICJEYXRhYmFzZSIsCisJCS5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UsCisJfSwKKwlbRFJFRl0gPSB7CisJCS5uYW1lID0gIkRSRUYiLAorCQkuZGVzY3JpcHRpb24gPSAiUmVmZXJlbmNlIENvdW50aW5nIiwKKwkJLmVuYWJsZWQgPSAwLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSwKKwl9LAorfTsKKworZW51bSBsb2dfY3R4dCB7CisJQ1RYX1NVQlNDUklCRVIsCit9OworCitlbnVtIGxvZ19maWx0ZXIgeworCUZMVF9JTVNJLAorfTsKKworc3RhdGljIGludCBmaWx0ZXJfZm4oY29uc3Qgc3RydWN0IGxvZ19jb250ZXh0ICpjdHgsCisJCSAgICAgc3RydWN0IGxvZ190YXJnZXQgKnRhcikKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IGN0eC0+Y3R4W0NUWF9TVUJTQ1JJQkVSXTsKKworCWlmICgodGFyLT5maWx0ZXJfbWFwICYgKDEgPDwgRkxUX0lNU0kpKSAhPSAwCisJICAgICYmIHN1YnNjciAmJiBzdHJjbXAoc3Vic2NyLT5pbXNpLCB0YXItPmZpbHRlcl9kYXRhW0ZMVF9JTVNJXSkgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IGxvZ19pbmZvIGxvZ19pbmZvID0geworCS5maWx0ZXJfZm4gPSBmaWx0ZXJfZm4sCisJLmNhdCA9IGRlZmF1bHRfY2F0ZWdvcmllcywKKwkubnVtX2NhdCA9IEFSUkFZX1NJWkUoZGVmYXVsdF9jYXRlZ29yaWVzKSwKK307CisKK3ZvaWQgbG9nX3NldF9pbXNpX2ZpbHRlcihzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyICppbXNpKQoreworCWlmIChpbXNpKSB7CisJCXRhcmdldC0+ZmlsdGVyX21hcCB8PSAoMSA8PCBGTFRfSU1TSSk7CisJCXRhcmdldC0+ZmlsdGVyX2RhdGFbRkxUX0lNU0ldID0gdGFsbG9jX3N0cmR1cCh0YXJnZXQsIGltc2kpOworCX0gZWxzZSBpZiAodGFyZ2V0LT5maWx0ZXJfZGF0YVtGTFRfSU1TSV0pIHsKKwkJdGFyZ2V0LT5maWx0ZXJfbWFwICY9IH4oMSA8PCBGTFRfSU1TSSk7CisJCXRhbGxvY19mcmVlKHRhcmdldC0+ZmlsdGVyX2RhdGFbRkxUX0lNU0ldKTsKKwkJdGFyZ2V0LT5maWx0ZXJfZGF0YVtGTFRfSU1TSV0gPSBOVUxMOworCX0KK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2UxX2NvbmZpZy5jIGIvb3BlbmJzYy9zcmMvZTFfY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmYmNlYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2UxX2NvbmZpZy5jCkBAIC0wLDAgKzEsMjM2IEBACisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X2ZyYW1lLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X211eC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWlzZG4uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2lwYWNjZXNzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCisjZGVmaW5lIFNBUElfTDJNTAkwCisjZGVmaW5lIFNBUElfT01MCTYyCisjZGVmaW5lIFNBUElfUlNMCTAJLyogNjMgPyAqLworCisvKiBUaGUgZTFfcmVjb25maWdfKigpIGZ1bmN0aW9ucyBiZWxvdyB0YWxlIHRoZSBjb25maWd1cmF0aW9uIHByZXNlbnQgaW4gdGhlCisgKiBidHMvdHJ4L3RzIGRhdGEgc3RydWN0dXJlcyBhbmQgZW5zdXJlIHRoZSBFMSBjb25maWd1cmF0aW9uIHJlZmxlY3RzIHRoZQorICogdGltZXNsb3Qvc3Vic2xvdC9URUkgY29uZmlndXJhdGlvbiAqLworCitpbnQgZTFfcmVjb25maWdfdHMoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cykKK3sKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxX2xpbmsgPSAmdHMtPmUxX2xpbms7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJc3RydWN0IGUxaW5wX3RzICplMV90czsKKworCURFQlVHUChETUksICJlMV9yZWNvbmZpZ190cygldSwldSwldSlcbiIsIHRzLT50cngtPmJ0cy0+bnIsIHRzLT50cngtPm5yLCB0cy0+bnIpOworCisJaWYgKCFlMV9saW5rLT5lMV90cykKKwkJcmV0dXJuIDA7CisKKwlsaW5lID0gZTFpbnBfbGluZV9nZXRfY3JlYXRlKGUxX2xpbmstPmUxX25yKTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiAtRU5PTUVNOworCisJc3dpdGNoICh0cy0+cGNoYW4pIHsKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfRjoKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfSDoKKwkJZTFfdHMgPSAmbGluZS0+dHNbZTFfbGluay0+ZTFfdHMtMV07CisJCWUxaW5wX3RzX2NvbmZpZyhlMV90cywgbGluZSwgRTFJTlBfVFNfVFlQRV9UUkFVKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmUxX3RzLT50cmF1LmRlbXV4LCBlMV9saW5rLT5lMV90c19zcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZTFfcmVjb25maWdfdHJ4KHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZTFfbGluayA9ICZ0cngtPnJzbF9lMV9saW5rOworCXN0cnVjdCBlMWlucF90cyAqc2lnbl90czsKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpyc2xfbGluazsKKwlpbnQgaTsKKworCWlmICghZTFfbGluay0+ZTFfdHMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogUlNMIExpbmsgKi8KKwlsaW5lID0gZTFpbnBfbGluZV9nZXRfY3JlYXRlKGUxX2xpbmstPmUxX25yKTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiAtRU5PTUVNOworCXNpZ25fdHMgPSAmbGluZS0+dHNbZTFfbGluay0+ZTFfdHMtMV07CisJZTFpbnBfdHNfY29uZmlnKHNpZ25fdHMsIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisJcnNsX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHNpZ25fdHMsIEUxSU5QX1NJR05fUlNMLAorCQkJCQkgIHRyeCwgdHJ4LT5yc2xfdGVpLCBTQVBJX1JTTCk7CisJaWYgKCFyc2xfbGluaykKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKHRyeC0+cnNsX2xpbmspCisJCWUxaW5wX3NpZ25fbGlua19kZXN0cm95KHRyeC0+cnNsX2xpbmspOworCXRyeC0+cnNsX2xpbmsgPSByc2xfbGluazsKKworCWZvciAoaSA9IDA7IGkgPCBUUlhfTlJfVFM7IGkrKykKKwkJZTFfcmVjb25maWdfdHMoJnRyeC0+dHNbaV0pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlMV9yZWNvbmZpZ19idHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxX2xpbmsgPSAmYnRzLT5vbWxfZTFfbGluazsKKwlzdHJ1Y3QgZTFpbnBfdHMgKnNpZ25fdHM7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqb21sX2xpbms7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlERUJVR1AoRE1JLCAiZTFfcmVjb25maWdfYnRzKCV1KVxuIiwgYnRzLT5ucik7CisKKwlpZiAoIWUxX2xpbmstPmUxX3RzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE9NTCBsaW5rICovCisJbGluZSA9IGUxaW5wX2xpbmVfZ2V0X2NyZWF0ZShlMV9saW5rLT5lMV9ucik7CisJaWYgKCFsaW5lKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzaWduX3RzID0gJmxpbmUtPnRzW2UxX2xpbmstPmUxX3RzLTFdOworCWUxaW5wX3RzX2NvbmZpZyhzaWduX3RzLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCW9tbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzaWduX3RzLCBFMUlOUF9TSUdOX09NTCwKKwkJCQkJICBidHMtPmMwLCBidHMtPm9tbF90ZWksIFNBUElfT01MKTsKKwlpZiAoIW9tbF9saW5rKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoYnRzLT5vbWxfbGluaykKKwkJZTFpbnBfc2lnbl9saW5rX2Rlc3Ryb3koYnRzLT5vbWxfbGluayk7CisJYnRzLT5vbWxfbGluayA9IG9tbF9saW5rOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkKKwkJZTFfcmVjb25maWdfdHJ4KHRyeCk7CisKKwkvKiBub3RpZnkgRTEgaW5wdXQgc29tZXRoaW5nIGhhcyBjaGFuZ2VkICovCisJcmV0dXJuIGUxaW5wX2xpbmVfdXBkYXRlKGxpbmUpOworfQorCisjaWYgMAorLyogZG8gc29tZSBjb21waWxlZC1pbiBjb25maWd1cmF0aW9uIGZvciBvdXIgQlRTL0UxIHNldHVwICovCitpbnQgZTFfY29uZmlnKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBjYXJkbnIsIGludCByZWxlYXNlX2wyKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBlMWlucF90cyAqc2lnbl90czsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpvbWxfbGluaywgKnJzbF9saW5rOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gYnRzLT5jMDsKKwlpbnQgYmFzZV90czsKKworCXN3aXRjaCAoYnRzLT5ucikgeworCWNhc2UgMDoKKwkJLyogRmlyc3QgQlRTIHVzZXMgRTEgVFMgMDEsMDIsMDMsMDQsMDUgKi8KKwkJYmFzZV90cyA9IEhBUkRDT0RFRF9CVFMwX1RTIC0gMTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKiBTZWNvbmQgQlRTIHVzZXMgRTEgVFMgMDYsMDcsMDgsMDksMTAgKi8KKwkJYmFzZV90cyA9IEhBUkRDT0RFRF9CVFMxX1RTIC0gMTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvKiBUaGlyZCBCVFMgdXNlcyBFMSBUUyAxMSwxMiwxMywxNCwxNSAqLworCQliYXNlX3RzID0gSEFSRENPREVEX0JUUzJfVFMgLSAxOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxpbmUgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBlMWlucF9saW5lKTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogY3JlYXRlIEUxIHRpbWVzbG90cyBmb3Igc2lnbmFsbGluZyBhbmQgVFJBVSBmcmFtZXMgKi8KKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzW2Jhc2VfdHMrMS0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9TSUdOKTsKKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzW2Jhc2VfdHMrMi0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9UUkFVKTsKKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzW2Jhc2VfdHMrMy0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9UUkFVKTsKKworCS8qIGNyZWF0ZSBzaWduYWxsaW5nIGxpbmtzIGZvciBUUzEgKi8KKwlzaWduX3RzID0gJmxpbmUtPnRzW2Jhc2VfdHMrMS0xXTsKKwlvbWxfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoc2lnbl90cywgRTFJTlBfU0lHTl9PTUwsCisJCQkJCSAgdHJ4LCBURUlfT01MLCBTQVBJX09NTCk7CisJcnNsX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHNpZ25fdHMsIEUxSU5QX1NJR05fUlNMLAorCQkJCQkgIHRyeCwgVEVJX1JTTCwgU0FQSV9SU0wpOworCisJLyogY3JlYXRlIGJhY2stbGlua3MgZnJvbSBidHMvdHJ4ICovCisJYnRzLT5vbWxfbGluayA9IG9tbF9saW5rOworCXRyeC0+cnNsX2xpbmsgPSByc2xfbGluazsKKworCS8qIGVuYWJsZSBzdWJjaGFubmVsIGRlbXV4ZXIgb24gVFMyICovCisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMi0xXS50cmF1LmRlbXV4LCAxKTsKKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cysyLTFdLnRyYXUuZGVtdXgsIDIpOworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzItMV0udHJhdS5kZW11eCwgMyk7CisKKwkvKiBlbmFibGUgc3ViY2hhbm5lbCBkZW11eGVyIG9uIFRTMyAqLworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzMtMV0udHJhdS5kZW11eCwgMCk7CisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMy0xXS50cmF1LmRlbXV4LCAxKTsKKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cyszLTFdLnRyYXUuZGVtdXgsIDIpOworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzMtMV0udHJhdS5kZW11eCwgMyk7CisKKwl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCAxKTsKKwlpZiAodHJ4KSB7CisJCS8qIGNyZWF0ZSBFMSB0aW1lc2xvdHMgZm9yIFRSQVUgZnJhbWVzIG9mIFRSWDEgKi8KKwkJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1tiYXNlX3RzKzQtMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfVFJBVSk7CisJCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbYmFzZV90cys1LTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1RSQVUpOworCisJCS8qIGNyZWF0ZSBSU0wgc2lnbmFsbGluZyBsaW5rIGZvciBUUlgxICovCisJCXNpZ25fdHMgPSAmbGluZS0+dHNbYmFzZV90cysxLTFdOworCQlyc2xfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoc2lnbl90cywgRTFJTlBfU0lHTl9SU0wsCisJCQkJCSAgdHJ4LCBURUlfUlNMKzEsIFNBUElfUlNMKTsKKwkJLyogY3JlYXRlIGJhY2stbGlua3MgZnJvbSB0cnggKi8KKwkJdHJ4LT5yc2xfbGluayA9IHJzbF9saW5rOworCisJCS8qIGVuYWJsZSBzdWJjaGFubmVsIGRlbXV4ZXIgb24gVFMyICovCisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzQtMV0udHJhdS5kZW11eCwgMCk7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzQtMV0udHJhdS5kZW11eCwgMSk7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzQtMV0udHJhdS5kZW11eCwgMik7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzQtMV0udHJhdS5kZW11eCwgMyk7CisKKwkJLyogZW5hYmxlIHN1YmNoYW5uZWwgZGVtdXhlciBvbiBUUzMgKi8KKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNS0xXS50cmF1LmRlbXV4LCAwKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNS0xXS50cmF1LmRlbXV4LCAxKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNS0xXS50cmF1LmRlbXV4LCAyKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNS0xXS50cmF1LmRlbXV4LCAzKTsKKwl9CisKKwlyZXR1cm4gbWlfc2V0dXAoY2FyZG5yLCBsaW5lLCByZWxlYXNlX2wyKTsKK30KKyNlbmRpZgorCisvKiBjb25maWd1cmUgcHNldWRvIEUxIGxpbmUgaW4gaXAuYWNjZXNzIHN0eWxlIGFuZCBjb25uZWN0IHRvIEJUUyAqLworaW50IGlhX2NvbmZpZ19jb25uZWN0KHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBlMWlucF90cyAqc2lnbl90cywgKnJzbF90czsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpvbWxfbGluaywgKnJzbF9saW5rOworCisJbGluZSA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGUxaW5wX2xpbmUpOworCWlmICghbGluZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBjcmVhdGUgRTEgdGltZXNsb3RzIGZvciBzaWduYWxsaW5nIGFuZCBUUkFVIGZyYW1lcyAqLworCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbMS0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9TSUdOKTsKKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzWzItMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisKKwkvKiBjcmVhdGUgc2lnbmFsbGluZyBsaW5rcyBmb3IgVFMxICovCisJc2lnbl90cyA9ICZsaW5lLT50c1sxLTFdOworCXJzbF90cyA9ICZsaW5lLT50c1syLTFdOworCW9tbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzaWduX3RzLCBFMUlOUF9TSUdOX09NTCwKKwkJCQkJICBidHMtPmMwLCAweGZmLCAwKTsKKwlyc2xfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUocnNsX3RzLCBFMUlOUF9TSUdOX1JTTCwKKwkJCQkJICBidHMtPmMwLCAwLCAwKTsKKworCS8qIGNyZWF0ZSBiYWNrLWxpbmtzIGZyb20gYnRzL3RyeCAqLworCWJ0cy0+b21sX2xpbmsgPSBvbWxfbGluazsKKwlidHMtPmMwLT5yc2xfbGluayA9IHJzbF9saW5rOworCisJLyogZGVmYXVsdCBwb3J0IGF0IEJUUyBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMgaXMgMzAwNiAqLworCWlmIChzaW4tPnNpbl9wb3J0ID09IDApCisJCXNpbi0+c2luX3BvcnQgPSBodG9ucygzMDA2KTsKKworCXJldHVybiBpcGFjY2Vzc19jb25uZWN0KGxpbmUsIHNpbik7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9lMV9pbnB1dC5jIGIvb3BlbmJzYy9zcmMvZTFfaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmE1OWE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZTFfaW5wdXQuYwpAQCAtMCwwICsxLDU1NSBAQAorLyogT3BlbkJTQyBBYmlzIGludGVyZmFjZSB0byBFMSAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxtSVNETmlmLmg+CisKKy8vI2RlZmluZSBBRl9DT01QQVRJQklMSVRZX0ZVTkMKKy8vI2luY2x1ZGUgPGNvbXBhdF9hZl9pc2RuLmg+CisjaWZuZGVmIEFGX0lTRE4KKyNkZWZpbmUgQUZfSVNETiAzNAorI2RlZmluZSBQRl9JU0ROIEFGX0lTRE4KKyNlbmRpZgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfZnJhbWUuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfbXV4Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21pc2RuLmg+CisKKyNkZWZpbmUgTlVNX0UxX1RTCTMyCisKKy8qIGxpc3Qgb2YgYWxsIEUxIGRyaXZlcnMgKi8KK0xMSVNUX0hFQUQoZTFpbnBfZHJpdmVyX2xpc3QpOworCisvKiBsaXN0IG9mIGFsbCBFMSBsaW5lcyAqLworTExJU1RfSEVBRChlMWlucF9saW5lX2xpc3QpOworCitzdGF0aWMgdm9pZCAqdGFsbF9zaWdsX2N0eDsKKworLyogdG8gYmUgaW1wbGVtZW50ZWQsIGUuZy4gYnkgYnNjX2hhY2suYyAqLwordm9pZCBpbnB1dF9ldmVudChpbnQgZXZlbnQsIGVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGUsIHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKKworLyoKKyAqIHBjYXAgd3JpdGluZyBvZiB0aGUgbWlzZG4gbG9hZAorICogcGNhcCBmb3JtYXQgaXMgZnJvbSBodHRwOi8vd2lraS53aXJlc2hhcmsub3JnL0RldmVsb3BtZW50L0xpYnBjYXBGaWxlRm9ybWF0CisgKi8KKyNkZWZpbmUgRExUX0xJTlVYX0xBUEQJCTE3NworI2RlZmluZSBQQ0FQX0lOUFVUCQkwCisjZGVmaW5lIFBDQVBfT1VUUFVUCQkxCisKK3N0cnVjdCBwY2FwX2hkciB7CisJdV9pbnQzMl90IG1hZ2ljX251bWJlcjsKKwl1X2ludDE2X3QgdmVyc2lvbl9tYWpvcjsKKwl1X2ludDE2X3QgdmVyc2lvbl9taW5vcjsKKwlpbnQzMl90ICB0aGlzem9uZTsKKwl1X2ludDMyX3Qgc2lnZmlnczsKKwl1X2ludDMyX3Qgc25hcGxlbjsKKwl1X2ludDMyX3QgbmV0d29yazsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBwY2FwcmVjX2hkciB7CisJdV9pbnQzMl90IHRzX3NlYzsKKwl1X2ludDMyX3QgdHNfdXNlYzsKKwl1X2ludDMyX3QgaW5jbF9sZW47CisJdV9pbnQzMl90IG9yaWdfbGVuOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIgeworICAgICAgICB1X2ludDE2X3QgcGt0dHlwZTsKKwl1X2ludDE2X3QgaGF0eXBlOworCXVfaW50MTZfdCBoYWxlbjsKKwl1X2ludDY0X3QgYWRkcjsKKwlpbnQxNl90IHByb3RvY29sOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGxhcGRfaGVhZGVyIHsKKwl1X2ludDhfdCBlYTEgOiAxOworCXVfaW50OF90IGNyIDogMTsKKwl1X2ludDhfdCBzYXBpIDogNjsKKwl1X2ludDhfdCBlYTIgOiAxOworCXVfaW50OF90IHRlaSA6IDc7CisJdV9pbnQ4X3QgY29udHJvbF9mb287IC8qIGZha2UgVU0ncyAuLi4gKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0YXRpY19hc3NlcnQoKGludCkmKChzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlciopTlVMTCktPmhhdHlwZSA9PSAyLAloYXR5cGVfb2Zmc2V0KTsKK3N0YXRpY19hc3NlcnQoKGludCkmKChzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlciopTlVMTCktPmhhbGVuID09IDQsCQloYWxlbl9vZmZzZXQpOworc3RhdGljX2Fzc2VydCgoaW50KSYoKHN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyKilOVUxMKS0+YWRkciA9PSA2LAkJYWRkcl9vZmZzZXQpOworc3RhdGljX2Fzc2VydCgoaW50KSYoKHN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyKilOVUxMKS0+cHJvdG9jb2wgPT0gMTQsCXByb3RvX29mZnNldCk7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlcikgPT0gMTYsCQkJbGFwZF9oZWFkZXJfc2l6ZSk7CisKKworc3RhdGljIGludCBwY2FwX2ZkID0gLTE7CisKK3ZvaWQgZTFfc2V0X3BjYXBfZmQoaW50IGZkKQoreworCWludCByZXQ7CisJc3RydWN0IHBjYXBfaGRyIGhlYWRlciA9IHsKKwkJLm1hZ2ljX251bWJlcgk9IDB4YTFiMmMzZDQsCisJCS52ZXJzaW9uX21ham9yCT0gMiwKKwkJLnZlcnNpb25fbWlub3IJPSA0LAorCQkudGhpc3pvbmUJPSAwLAorCQkuc2lnZmlncwk9IDAsCisJCS5zbmFwbGVuCT0gNjU1MzUsCisJCS5uZXR3b3JrCT0gRExUX0xJTlVYX0xBUEQsCisJfTsKKworCXBjYXBfZmQgPSBmZDsKKwlyZXQgPSB3cml0ZShwY2FwX2ZkLCAmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7Cit9CisKKy8qIFRoaXMgY3VycmVudGx5IG9ubHkgd29ya3MgZm9yIHRoZSBELUNoYW5uZWwgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX3BjYXBfcGFja2V0KGludCBkaXJlY3Rpb24sIGludCBzYXBpLCBpbnQgdGVpLAorCQkJICAgICAgc3RydWN0IG1zZ2IgKm1zZykgeworCWlmIChwY2FwX2ZkIDwgMCkKKwkJcmV0dXJuOworCisJaW50IHJldDsKKwl0aW1lX3QgY3VyX3RpbWU7CisJc3RydWN0IHRtICp0bTsKKwlpbnQgbWlfaGVhZCA9IChkaXJlY3Rpb249PVBDQVBfSU5QVVQpID8gTUlTRE5fSEVBREVSX0xFTiA6IDA7CisKKwlzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlciBoZWFkZXIgPSB7CisJCS5wa3R0eXBlCT0gNCwKKwkJLmhhdHlwZQkJPSAwLAorCQkuaGFsZW4JCT0gMCwKKwkJLmFkZHIJCT0gZGlyZWN0aW9uID09IFBDQVBfT1VUUFVUID8gMHgwIDogMHgxLAorCQkucHJvdG9jb2wJPSBudG9ocyg0OCksCisJfTsKKworCXN0cnVjdCBsYXBkX2hlYWRlciBsYXBkX2hlYWRlciA9IHsKKwkJLmVhMQkJPSAwLAorCQkuY3IJCT0gZGlyZWN0aW9uID09IFBDQVBfT1VUUFVUID8gMSA6IDAsCisJCS5zYXBpCQk9IHNhcGkgJiAweDNGLAorCQkuZWEyCQk9IDEsCisJCS50ZWkJCT0gdGVpICYgMHg3RiwKKwkJLmNvbnRyb2xfZm9vCT0gMHgwMyAvKiBVSSAqLywKKwl9OwkKKworCXN0cnVjdCBwY2FwcmVjX2hkciBwYXlsb2FkX2hlYWRlciA9IHsKKwkJLnRzX3NlYwkgICAgPSAwLAorCQkudHNfdXNlYyAgICA9IDAsCisJCS5pbmNsX2xlbiAgID0gbXNnLT5sZW4gKyBzaXplb2Yoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIpCisJCQkJKyBzaXplb2Yoc3RydWN0IGxhcGRfaGVhZGVyKQorCQkJCS0gbWlfaGVhZCwKKwkJLm9yaWdfbGVuICAgPSBtc2ctPmxlbiArIHNpemVvZihzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlcikKKwkJCQkrIHNpemVvZihzdHJ1Y3QgbGFwZF9oZWFkZXIpCisJCQkJLSBtaV9oZWFkLAorCX07CisKKworCWN1cl90aW1lID0gdGltZShOVUxMKTsKKwl0bSA9IGxvY2FsdGltZSgmY3VyX3RpbWUpOworCXBheWxvYWRfaGVhZGVyLnRzX3NlYyA9IG1rdGltZSh0bSk7CisKKwlyZXQgPSB3cml0ZShwY2FwX2ZkLCAmcGF5bG9hZF9oZWFkZXIsIHNpemVvZihwYXlsb2FkX2hlYWRlcikpOworCXJldCA9IHdyaXRlKHBjYXBfZmQsICZoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKKwlyZXQgPSB3cml0ZShwY2FwX2ZkLCAmbGFwZF9oZWFkZXIsIHNpemVvZihsYXBkX2hlYWRlcikpOworCXJldCA9IHdyaXRlKHBjYXBfZmQsIG1zZy0+ZGF0YSArIG1pX2hlYWQsCisJCQltc2ctPmxlbiAtIG1pX2hlYWQpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc2lnbl90eXBlc1tdID0geworCVtFMUlOUF9TSUdOX05PTkVdCT0gIk5vbmUiLAorCVtFMUlOUF9TSUdOX09NTF0JPSAiT01MIiwKKwlbRTFJTlBfU0lHTl9SU0xdCT0gIlJTTCIsCit9OworY29uc3QgY2hhciAqZTFpbnBfc2lnbnR5cGVfbmFtZShlbnVtIGUxaW5wX3NpZ25fdHlwZSB0cCkKK3sKKwlpZiAodHAgPj0gQVJSQVlfU0laRShzaWduX3R5cGVzKSkKKwkJcmV0dXJuICJ1bmRlZmluZWQiOworCXJldHVybiBzaWduX3R5cGVzW3RwXTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnRzX3R5cGVzW10gPSB7CisJW0UxSU5QX1RTX1RZUEVfTk9ORV0JPSAiTm9uZSIsCisJW0UxSU5QX1RTX1RZUEVfU0lHTl0JPSAiU2lnbmFsbGluZyIsCisJW0UxSU5QX1RTX1RZUEVfVFJBVV0JPSAiVFJBVSIsCit9OworCitjb25zdCBjaGFyICplMWlucF90c3R5cGVfbmFtZShlbnVtIGUxaW5wX3RzX3R5cGUgdHApCit7CisJaWYgKHRwID49IEFSUkFZX1NJWkUodHNfdHlwZXMpKQorCQlyZXR1cm4gInVuZGVmaW5lZCI7CisJcmV0dXJuIHRzX3R5cGVzW3RwXTsKK30KKworLyogY2FsbGJhY2sgd2hlbiBhIFRSQVUgZnJhbWUgd2FzIHJlY2VpdmVkICovCitzdGF0aWMgaW50IHN1YmNoX2NiKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCBpbnQgY2gsIHVfaW50OF90ICpkYXRhLCBpbnQgbGVuLAorCQkgICAgdm9pZCAqX3ByaXYpCit7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSBfcHJpdjsKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3Qgc3JjX3NzOworCisJc3JjX3NzLmUxX25yID0gZTFpX3RzLT5saW5lLT5udW07CisJc3JjX3NzLmUxX3RzID0gZTFpX3RzLT5udW07CisJc3JjX3NzLmUxX3RzX3NzID0gY2g7CisKKwlyZXR1cm4gdHJhdV9tdXhfaW5wdXQoJnNyY19zcywgZGF0YSwgbGVuKTsKK30KKworaW50IGFiaXNfcnNsX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpzaWduX2xpbms7CisJc3RydWN0IGUxaW5wX2RyaXZlciAqZTFpbnBfZHJpdmVyOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzOworCisJbXNnLT5sMmggPSBtc2ctPmRhdGE7CisKKwlpZiAoIW1zZy0+dHJ4KSB7CisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgInJzbF9zZW5kbXNnOiBtc2ctPnRyeCA9PSBOVUxMOiAlc1xuIiwKKwkJCWhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCQl0YWxsb2NfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKCFtc2ctPnRyeC0+cnNsX2xpbmspIHsKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAicnNsX3NlbmRtc2c6IG1zZy0+dHJ4LT5yc2xfbGluayA9PSBOVUxMOiAlc1xuIiwKKwkJCWhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCQl0YWxsb2NfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzaWduX2xpbmsgPSBtc2ctPnRyeC0+cnNsX2xpbms7CisJZTFpX3RzID0gc2lnbl9saW5rLT50czsKKwlpZiAoIWJzY190aW1lcl9wZW5kaW5nKCZlMWlfdHMtPnNpZ24udHhfdGltZXIpKSB7CisJCS8qIG5vdGlmeSB0aGUgZHJpdmVyIHdlIGhhdmUgc29tZXRoaW5nIHRvIHdyaXRlICovCisJCWUxaW5wX2RyaXZlciA9IHNpZ25fbGluay0+dHMtPmxpbmUtPmRyaXZlcjsKKwkJZTFpbnBfZHJpdmVyLT53YW50X3dyaXRlKGUxaV90cyk7CisJfQorCW1zZ2JfZW5xdWV1ZSgmc2lnbl9saW5rLT50eF9saXN0LCBtc2cpOworCisJLyogZHVtcCBpdCAqLworCXdyaXRlX3BjYXBfcGFja2V0KFBDQVBfT1VUUFVULCBzaWduX2xpbmstPnNhcGksIHNpZ25fbGluay0+dGVpLCBtc2cpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBfYWJpc19ubV9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqc2lnbl9saW5rOworCXN0cnVjdCBlMWlucF9kcml2ZXIgKmUxaW5wX2RyaXZlcjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90czsKKworCW1zZy0+bDJoID0gbXNnLT5kYXRhOworCisJaWYgKCFtc2ctPnRyeCB8fCAhbXNnLT50cngtPmJ0cyB8fCAhbXNnLT50cngtPmJ0cy0+b21sX2xpbmspIHsKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAibm1fc2VuZG1zZzogbXNnLT50cnggPT0gTlVMTFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNpZ25fbGluayA9IG1zZy0+dHJ4LT5idHMtPm9tbF9saW5rOworCWUxaV90cyA9IHNpZ25fbGluay0+dHM7CisJaWYgKCFic2NfdGltZXJfcGVuZGluZygmZTFpX3RzLT5zaWduLnR4X3RpbWVyKSkgeworCQkvKiBub3RpZnkgdGhlIGRyaXZlciB3ZSBoYXZlIHNvbWV0aGluZyB0byB3cml0ZSAqLworCQllMWlucF9kcml2ZXIgPSBzaWduX2xpbmstPnRzLT5saW5lLT5kcml2ZXI7CisJCWUxaW5wX2RyaXZlci0+d2FudF93cml0ZShlMWlfdHMpOworCX0KKwltc2diX2VucXVldWUoJnNpZ25fbGluay0+dHhfbGlzdCwgbXNnKTsKKworCS8qIGR1bXAgaXQgKi8KKwl3cml0ZV9wY2FwX3BhY2tldChQQ0FQX09VVFBVVCwgc2lnbl9saW5rLT5zYXBpLCBzaWduX2xpbmstPnRlaSwgbXNnKTsKKworCXJldHVybiAwOworfQorCisvKiBUaW1lc2xvdCAqLworCisvKiBjb25maWd1cmUgYW5kIGluaXRpYWxpemUgb25lIGUxaW5wX3RzICovCitpbnQgZTFpbnBfdHNfY29uZmlnKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBlMWlucF9saW5lICpsaW5lLAorCQkgICAgZW51bSBlMWlucF90c190eXBlIHR5cGUpCit7CisJaWYgKHRzLT50eXBlID09IHR5cGUgJiYgdHMtPmxpbmUgJiYgbGluZSkKKwkJcmV0dXJuIDA7CisKKwl0cy0+dHlwZSA9IHR5cGU7CisJdHMtPmxpbmUgPSBsaW5lOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBFMUlOUF9UU19UWVBFX1NJR046CisJCUlOSVRfTExJU1RfSEVBRCgmdHMtPnNpZ24uc2lnbl9saW5rcyk7CisJCWJyZWFrOworCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQlzdWJjaGFuX211eF9pbml0KCZ0cy0+dHJhdS5tdXgpOworCQl0cy0+dHJhdS5kZW11eC5vdXRfY2IgPSBzdWJjaF9jYjsKKwkJdHMtPnRyYXUuZGVtdXguZGF0YSA9IHRzOworCQlzdWJjaF9kZW11eF9pbml0KCZ0cy0+dHJhdS5kZW11eCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1JLCBMT0dMX0VSUk9SLCAidW5zdXBwb3J0ZWQgRTEgdGltZXNsb3QgdHlwZSAldVxuIiwKKwkJCXRzLT50eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGUxaW5wX2xpbmUgKmUxaW5wX2xpbmVfZ2V0KHVfaW50OF90IGUxX25yKQoreworCXN0cnVjdCBlMWlucF9saW5lICplMWlfbGluZTsKKworCS8qIGl0ZXJhdGUgb3ZlciBnbG9iYWwgbGlzdCBvZiBlMSBsaW5lcyAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGUxaV9saW5lLCAmZTFpbnBfbGluZV9saXN0LCBsaXN0KSB7CisJCWlmIChlMWlfbGluZS0+bnVtID09IGUxX25yKQorCQkJcmV0dXJuIGUxaV9saW5lOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGUxaW5wX2xpbmUgKmUxaW5wX2xpbmVfZ2V0X2NyZWF0ZSh1X2ludDhfdCBlMV9ucikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlpbnQgaTsKKworCWxpbmUgPSBlMWlucF9saW5lX2dldChlMV9ucik7CisJaWYgKGxpbmUpCisJCXJldHVybiBsaW5lOworCisJbGluZSA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGUxaW5wX2xpbmUpOworCWlmICghbGluZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaW5lLT5udW0gPSBlMV9ucjsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0UxX1RTOyBpKyspIHsKKwkJbGluZS0+dHNbaV0ubnVtID0gaSsxOworCQlsaW5lLT50c1tpXS5saW5lID0gbGluZTsKKwl9CisJbGxpc3RfYWRkX3RhaWwoJmxpbmUtPmxpc3QsICZlMWlucF9saW5lX2xpc3QpOworCisJcmV0dXJuIGxpbmU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZTFpbnBfdHMgKmUxaW5wX3RzX2dldCh1X2ludDhfdCBlMV9uciwgdV9pbnQ4X3QgdHNfbnIpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmUxaV9saW5lOworCisJZTFpX2xpbmUgPSBlMWlucF9saW5lX2dldChlMV9ucik7CisJaWYgKCFlMWlfbGluZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gJmUxaV9saW5lLT50c1t0c19uci0xXTsKK30KKworc3RydWN0IHN1YmNoX211eCAqZTFpbnBfZ2V0X211eCh1X2ludDhfdCBlMV9uciwgdV9pbnQ4X3QgdHNfbnIpCit7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSBlMWlucF90c19nZXQoZTFfbnIsIHRzX25yKTsKKworCWlmICghZTFpX3RzKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmZTFpX3RzLT50cmF1Lm11eDsKK30KKworLyogU2lnbmFsbGluZyBMaW5rICovCisKK3N0cnVjdCBlMWlucF9zaWduX2xpbmsgKmUxaW5wX2xvb2t1cF9zaWduX2xpbmsoc3RydWN0IGUxaW5wX3RzICplMWksCisJCQkJCSAJdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5rLCAmZTFpLT5zaWduLnNpZ25fbGlua3MsIGxpc3QpIHsKKwkJaWYgKGxpbmstPnNhcGkgPT0gc2FwaSAmJiBsaW5rLT50ZWkgPT0gdGVpKQorCQkJcmV0dXJuIGxpbms7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGNyZWF0ZSBhIG5ldyBzaWduYWxsaW5nIGxpbmsgaW4gYSBFMSB0aW1lc2xvdCAqLworCitzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICoKK2UxaW5wX3NpZ25fbGlua19jcmVhdGUoc3RydWN0IGUxaW5wX3RzICp0cywgZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZSwKKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCB0ZWksCisJCQl1X2ludDhfdCBzYXBpKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisKKwlpZiAodHMtPnR5cGUgIT0gRTFJTlBfVFNfVFlQRV9TSUdOKQorCQlyZXR1cm4gTlVMTDsKKworCWxpbmsgPSB0YWxsb2NfemVybyh0YWxsX3NpZ2xfY3R4LCBzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rKTsKKwlpZiAoIWxpbmspCisJCXJldHVybiBOVUxMOworCisJbGluay0+dHMgPSB0czsKKwlsaW5rLT50eXBlID0gdHlwZTsKKwlJTklUX0xMSVNUX0hFQUQoJmxpbmstPnR4X2xpc3QpOworCWxpbmstPnRyeCA9IHRyeDsKKwlsaW5rLT50ZWkgPSB0ZWk7CisJbGluay0+c2FwaSA9IHNhcGk7CisKKwlsbGlzdF9hZGRfdGFpbCgmbGluay0+bGlzdCwgJnRzLT5zaWduLnNpZ25fbGlua3MpOworCisJcmV0dXJuIGxpbms7Cit9CisKK3ZvaWQgZTFpbnBfc2lnbl9saW5rX2Rlc3Ryb3koc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluaykKK3sKKwlsbGlzdF9kZWwoJmxpbmstPmxpc3QpOworCXRhbGxvY19mcmVlKGxpbmspOworfQorCisvKiB0aGUgRTEgZHJpdmVyIHRlbGxzIHVzIGhlIGhhcyByZWNlaXZlZCBzb21ldGhpbmcgb24gYSBUUyAqLworaW50IGUxaW5wX3J4X3RzKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBtc2diICptc2csCisJCXVfaW50OF90IHRlaSwgdV9pbnQ4X3Qgc2FwaSkKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHRzLT50eXBlKSB7CisJY2FzZSBFMUlOUF9UU19UWVBFX1NJR046CisJCS8qIGNvbnN1bHQgdGhlIGxpc3Qgb2Ygc2lnbmFsbGluZyBsaW5rcyAqLworCQl3cml0ZV9wY2FwX3BhY2tldChQQ0FQX0lOUFVULCBzYXBpLCB0ZWksIG1zZyk7CisJCWxpbmsgPSBlMWlucF9sb29rdXBfc2lnbl9saW5rKHRzLCB0ZWksIHNhcGkpOworCQlpZiAoIWxpbmspIHsKKwkJCUxPR1AoRE1JLCBMT0dMX0VSUk9SLCAiZGlkbid0IGZpbmQgc2lnbmFsbGluZyBsaW5rIGZvciAiCisJCQkJInRlaSAlZCwgc2FwaSAlZFxuIiwgdGVpLCBzYXBpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJbG9nX3NldF9jb250ZXh0KEJTQ19DVFhfQlRTLCBsaW5rLT50cngtPmJ0cyk7CisJCXN3aXRjaCAobGluay0+dHlwZSkgeworCQljYXNlIEUxSU5QX1NJR05fT01MOgorCQkJbXNnLT50cnggPSBsaW5rLT50cng7CisJCQlyZXQgPSBhYmlzX25tX3Jjdm1zZyhtc2cpOworCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfU0lHTl9SU0w6CisJCQltc2ctPnRyeCA9IGxpbmstPnRyeDsKKwkJCXJldCA9IGFiaXNfcnNsX3Jjdm1zZyhtc2cpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCQkJTE9HUChETUksIExPR0xfRVJST1IsICJ1bmtub3duIGxpbmsgdHlwZSAldVxuIiwgbGluay0+dHlwZSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEUxSU5QX1RTX1RZUEVfVFJBVToKKwkJcmV0ID0gc3ViY2hfZGVtdXhfaW4oJnRzLT50cmF1LmRlbXV4LCBtc2ctPmwyaCwgbXNnYl9sMmxlbihtc2cpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJTE9HUChETUksIExPR0xfRVJST1IsICJ1bmtub3duIFRTIHR5cGUgJXVcbiIsIHRzLT50eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBUU1hfQUxMT0NfU0laRSA0MDk2CisKKy8qIGNhbGxlZCBieSBkcml2ZXIgaWYgaXQgd2FudHMgdG8gdHJhbnNtaXQgb24gYSBnaXZlbiBUUyAqLworc3RydWN0IG1zZ2IgKmUxaW5wX3R4X3RzKHN0cnVjdCBlMWlucF90cyAqZTFpX3RzLAorCQkJIHN0cnVjdCBlMWlucF9zaWduX2xpbmsgKipzaWduX2xpbmspCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluazsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gTlVMTDsKKwlpbnQgbGVuOworCisJc3dpdGNoIChlMWlfdHMtPnR5cGUpIHsKKwljYXNlIEUxSU5QX1RTX1RZUEVfU0lHTjoKKwkJLyogRklYTUU6IGltcGxlbWVudCB0aGlzIHJvdW5kIHJvYmluICovCisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmssICZlMWlfdHMtPnNpZ24uc2lnbl9saW5rcywgbGlzdCkgeworCQkJbXNnID0gbXNnYl9kZXF1ZXVlKCZsaW5rLT50eF9saXN0KTsKKwkJCWlmIChtc2cpIHsKKwkJCQlpZiAoc2lnbl9saW5rKQorCQkJCQkqc2lnbl9saW5rID0gbGluazsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlicmVhazsKKwljYXNlIEUxSU5QX1RTX1RZUEVfVFJBVToKKwkJbXNnID0gbXNnYl9hbGxvYyhUU1hfQUxMT0NfU0laRSwgIlRSQVVfVFgiKTsKKwkJaWYgKCFtc2cpCisJCQlyZXR1cm4gTlVMTDsKKwkJbGVuID0gc3ViY2hhbl9tdXhfb3V0KCZlMWlfdHMtPnRyYXUubXV4LCBtc2ctPmRhdGEsIDQwKTsKKwkJbXNnYl9wdXQobXNnLCA0MCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1JLCBMT0dMX0VSUk9SLCAidW5zdXBwb3J0ZWQgRTEgVFMgdHlwZSAldVxuIiwgZTFpX3RzLT50eXBlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBtc2c7Cit9CisKKy8qIGNhbGxlZCBieSBkcml2ZXIgaW4gY2FzZSBzb21lIGtpbmQgb2YgbGluayBzdGF0ZSBldmVudCAqLworaW50IGUxaW5wX2V2ZW50KHN0cnVjdCBlMWlucF90cyAqdHMsIGludCBldnQsIHVfaW50OF90IHRlaSwgdV9pbnQ4X3Qgc2FwaSkKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCisJbGluayA9IGUxaW5wX2xvb2t1cF9zaWduX2xpbmsodHMsIHRlaSwgc2FwaSk7CisJaWYgKCFsaW5rKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEZJWE1FOiByZXBvcnQgZnVydGhlciB1cHdhcmRzICovCisJaW5wdXRfZXZlbnQoZXZ0LCBsaW5rLT50eXBlLCBsaW5rLT50cngpOworCXJldHVybiAwOworfQorCisvKiByZWdpc3RlciBhIGRyaXZlciB3aXRoIHRoZSBFMSBjb3JlICovCitpbnQgZTFpbnBfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBlMWlucF9kcml2ZXIgKmRydikKK3sKKwlsbGlzdF9hZGRfdGFpbCgmZHJ2LT5saXN0LCAmZTFpbnBfZHJpdmVyX2xpc3QpOworCXJldHVybiAwOworfQorCitpbnQgZTFpbnBfbGluZV91cGRhdGUoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUpCit7CisJcmV0dXJuIG1pX2UxX2xpbmVfdXBkYXRlKGxpbmUpOworfQorCitzdGF0aWMgaW50IGUxaV9zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJICAgICAgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlpZiAoc3Vic3lzICE9IFNTX0dMT0JBTCB8fAorCSAgICBzaWduYWwgIT0gU19HTE9CQUxfU0hVVERPV04pCisJCXJldHVybiAwOworCisJaWYgKHBjYXBfZmQpIHsKKwkJY2xvc2UocGNhcF9mZCk7CisJCXBjYXBfZmQgPSAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZCBvbl9kc29fbG9hZF9lMV9pbnAodm9pZCkKK3sKKwl0YWxsX3NpZ2xfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMSwKKwkJCQkJICAgImUxaW5wX3NpZ25fbGluayIpOworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX0dMT0JBTCwgZTFpX3NpZ19jYiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fMDRfMDguYyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8wOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNzZjNjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9nc21fMDRfMDguYwpAQCAtMCwwICsxLDI5MzYgQEAKKy8qIEdTTSBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlIExheWVyIDMgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMDQuMDggdmVyc2lvbiA3LjIxLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQwIFY3LjIxLjAgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDgsIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvYml0dmVjLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMTEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X2ZyYW1lLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X211eC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcnRwX3Byb3h5Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtNDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYW5zYWN0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy91c3NkLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWxlbnRfY2FsbC5oPgorCit2b2lkICp0YWxsX2xvY29wX2N0eDsKKworaW50IGdzbTA0MDhfbG9jX3VwZF9hY2Moc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50MzJfdCB0bXNpKTsKK3N0YXRpYyBpbnQgZ3NtNDhfdHhfc2ltcGxlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkJICAgdV9pbnQ4X3QgcGRpc2MsIHVfaW50OF90IG1zZ190eXBlKTsKK3N0YXRpYyB2b2lkIHNjaGVkdWxlX3JlamVjdChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubik7CisKK3N0cnVjdCBnc21fbGFpIHsKKwl1X2ludDE2X3QgbWNjOworCXVfaW50MTZfdCBtbmM7CisJdV9pbnQxNl90IGxhYzsKK307CisKK3N0YXRpYyB1X2ludDMyX3QgbmV3X2NhbGxyZWYgPSAweDgwMDAwMDAxOworCitzdGF0aWMgaW50IGF1dGhvcml6ZV9zdWJzY3JpYmVyKHN0cnVjdCBnc21fbG9jX3VwZGF0aW5nX29wZXJhdGlvbiAqbG9jLAorCQkJCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKK3sKKwlpZiAoIXN1YnNjcmliZXIpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBEbyBub3Qgc2VuZCBhY2NlcHQgeWV0IGFzIG1vcmUgaW5mb3JtYXRpb24gc2hvdWxkIGFycml2ZS4gU29tZQorCSAqIHBob25lcyB3aWxsIG5vdCBzZW5kIHVzIHRoZSBpbmZvcm1hdGlvbiBhbmQgd2Ugd2lsbCBoYXZlIHRvIGNoZWNrCisJICogd2hhdCB3ZSB3YW50IHRvIGRvIHdpdGggdGhhdC4KKwkgKi8KKwlpZiAobG9jICYmIChsb2MtPndhaXRpbmdfZm9yX2ltc2kgfHwgbG9jLT53YWl0aW5nX2Zvcl9pbWVpKSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHN1YnNjcmliZXItPm5ldC0+YXV0aF9wb2xpY3kpIHsKKwljYXNlIEdTTV9BVVRIX1BPTElDWV9DTE9TRUQ6CisJCXJldHVybiBzdWJzY3JpYmVyLT5hdXRob3JpemVkOworCWNhc2UgR1NNX0FVVEhfUE9MSUNZX1RPS0VOOgorCQlpZiAoc3Vic2NyaWJlci0+YXV0aG9yaXplZCkKKwkJCXJldHVybiBzdWJzY3JpYmVyLT5hdXRob3JpemVkOworCQlyZXR1cm4gKHN1YnNjcmliZXItPmZsYWdzICYgR1NNX1NVQlNDUklCRVJfRklSU1RfQ09OVEFDVCk7CisJY2FzZSBHU01fQVVUSF9QT0xJQ1lfQUNDRVBUX0FMTDoKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2xvY191cGRhdGluZ19yZXEoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJaWYgKCFjb25uLT5sb2Nfb3BlcmF0aW9uKQorCQlyZXR1cm47CisKKwlic2NfZGVsX3RpbWVyKCZjb25uLT5sb2Nfb3BlcmF0aW9uLT51cGRhdGluZ190aW1lcik7CisJdGFsbG9jX2ZyZWUoY29ubi0+bG9jX29wZXJhdGlvbik7CisJY29ubi0+bG9jX29wZXJhdGlvbiA9IDA7CisJcHV0X3N1YnNjcl9jb24oY29ubik7Cit9CisKK3N0YXRpYyB2b2lkIGFsbG9jYXRlX2xvY191cGRhdGluZ19yZXEoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJdXNlX3N1YnNjcl9jb24oY29ubikKKwlyZWxlYXNlX2xvY191cGRhdGluZ19yZXEoY29ubik7CisKKwljb25uLT5sb2Nfb3BlcmF0aW9uID0gdGFsbG9jX3plcm8odGFsbF9sb2NvcF9jdHgsCisJCQkJCSAgIHN0cnVjdCBnc21fbG9jX3VwZGF0aW5nX29wZXJhdGlvbik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtMDQwOF9hdXRob3JpemUoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBtc2diICptc2cpCit7CisJaWYgKGF1dGhvcml6ZV9zdWJzY3JpYmVyKGNvbm4tPmxvY19vcGVyYXRpb24sIGNvbm4tPnN1YnNjcikpIHsKKwkJaW50IHJjOworCisJCWRiX3N1YnNjcmliZXJfYWxsb2NfdG1zaShjb25uLT5zdWJzY3IpOworCQlyZWxlYXNlX2xvY191cGRhdGluZ19yZXEoY29ubik7CisJCXJjID0gZ3NtMDQwOF9sb2NfdXBkX2FjYyhtc2ctPmxjaGFuLCBjb25uLT5zdWJzY3ItPnRtc2kpOworCQlpZiAobXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrLT5zZW5kX21tX2luZm8pIHsKKwkJCS8qIHNlbmQgTU0gSU5GTyB3aXRoIG5ldHdvcmsgbmFtZSAqLworCQkJcmMgPSBnc200OF90eF9tbV9pbmZvKG1zZy0+bGNoYW4pOworCQl9CisKKwkJLyogY2FsbCBzdWJzY3JfdXBkYXRlIGFmdGVyIHB1dHRpbmcgdGhlIGxvY191cGRfYWNjCisJCSAqIGluIHRoZSB0cmFuc21pdCBxdWV1ZSwgc2luY2UgU19TVUJTQ1JfQVRUQUNIRUQgbWlnaHQKKwkJICogdHJpZ2dlciBmdXJ0aGVyIGFjdGlvbiBsaWtlIFNNUyBkZWxpdmVyeSAqLworCQlzdWJzY3JfdXBkYXRlKGNvbm4tPnN1YnNjciwgbXNnLT50cngtPmJ0cywKKwkJCSAgICAgIEdTTV9TVUJTQ1JJQkVSX1VQREFURV9BVFRBQ0hFRCk7CisKKwkJLyogdHJ5IHRvIGNsb3NlIGNoYW5uZWwgQVNBUCAqLworCQlsY2hhbl9hdXRvX3JlbGVhc2UoY29ubi0+bGNoYW4pOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtMDQwOF9oYW5kbGVfbGNoYW5fc2lnbmFsKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQkJCXZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnMsICp0ZW1wOworCisJaWYgKHN1YnN5cyAhPSBTU19MQ0hBTiB8fCBzaWduYWwgIT0gU19MQ0hBTl9VTkVYUEVDVEVEX1JFTEVBU0UpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBDYW5jZWwgYW55IG91dHN0YW5kaW5nIGxvY2F0aW9uIHVwZGF0aW5nIHJlcXVlc3QKKwkgKiBvcGVyYXRpb24gdGFraW5nIHBsYWNlIG9uIHRoZSBsY2hhbi4KKwkgKi8KKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IChzdHJ1Y3QgZ3NtX2xjaGFuICopc2lnbmFsX2RhdGE7CisJaWYgKCFsY2hhbikKKwkJcmV0dXJuIDA7CisKKwlyZWxlYXNlX2xvY191cGRhdGluZ19yZXEoJmxjaGFuLT5jb25uKTsKKworCS8qIEZyZWUgYWxsIHRyYW5zYWN0aW9ucyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbGVhc2VkIGxjaGFuICovCisJLyogRklYTUU6IHRoaXMgaXMgbm90IG5lY2Nlc3NhcmlseSB0aGUgcmlnaHQgdGhpbmcgdG8gZG8sIHdlIHNob3VsZAorCSAqIG9ubHkgc2V0IHRyYW5zLT5sY2hhbiB0byBOVUxMIGFuZCB3YWl0IGZvciBhbm90aGVyIGxjaGFuIHRvIGJlCisJICogZXN0YWJsaXNoZWQgdG8gdGhlIHNhbWUgTU0gZW50aXR5IChwaG9uZS9zdWJzY3JpYmVyKSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHJhbnMsIHRlbXAsICZsY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrLT50cmFuc19saXN0LCBlbnRyeSkgeworCQlpZiAodHJhbnMtPmNvbm4gJiYgdHJhbnMtPmNvbm4tPmxjaGFuID09IGxjaGFuKQorCQkJdHJhbnNfZnJlZSh0cmFucyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOS4yLjE0IDogU2VuZCBMT0NBVElPTiBVUERBVElORyBSRUpFQ1QgKi8KK2ludCBnc20wNDA4X2xvY191cGRfcmVqKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBjYXVzZSkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCQorCW1zZy0+bGNoYW4gPSBsY2hhbjsKKwljb25uID0gJmxjaGFuLT5jb25uOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpICsgMSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTU07CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfTU1fTE9DX1VQRF9SRUpFQ1Q7CisJZ2gtPmRhdGFbMF0gPSBjYXVzZTsKKworCUxPR1AoRE1NLCBMT0dMX0lORk8sICJTdWJzY3JpYmVyICVzOiBMT0NBVElPTiBVUERBVElORyBSRUpFQ1QgIgorCSAgICAgIkxBQz0ldSBCVFM9JXVcbiIsIGNvbm4tPnN1YnNjciA/CisJICAgICAJCQlzdWJzY3JfbmFtZShjb25uLT5zdWJzY3IpIDogInVua25vd24iLAorCSAgICAgbGNoYW4tPnRzLT50cngtPmJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlLCBsY2hhbi0+dHMtPnRyeC0+YnRzLT5ucik7CisKKwljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLmxvY191cGRfcmVzcC5yZWplY3QpOworCQorCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qIENoYXB0ZXIgOS4yLjEzIDogU2VuZCBMT0NBVElPTiBVUERBVEUgQUNDRVBUICovCitpbnQgZ3NtMDQwOF9sb2NfdXBkX2FjYyhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQzMl90IHRtc2kpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKwlzdHJ1Y3QgZ3NtNDhfbG9jX2FyZWFfaWQgKmxhaTsKKwl1X2ludDhfdCAqbWlkOworCQorCW1zZy0+bGNoYW4gPSBsY2hhbjsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTU07CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfTU1fTE9DX1VQRF9BQ0NFUFQ7CisKKwlsYWkgPSAoc3RydWN0IGdzbTQ4X2xvY19hcmVhX2lkICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpsYWkpKTsKKwlnc200OF9nZW5lcmF0ZV9sYWkobGFpLCBidHMtPm5ldHdvcmstPmNvdW50cnlfY29kZSwKKwkJICAgICBidHMtPm5ldHdvcmstPm5ldHdvcmtfY29kZSwgYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUpOworCisJbWlkID0gbXNnYl9wdXQobXNnLCBHU000OF9NSURfVE1TSV9MRU4pOworCWdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX3Rtc2kobWlkLCB0bXNpKTsKKworCURFQlVHUChETU0sICItPiBMT0NBVElPTiBVUERBVEUgQUNDRVBUXG4iKTsKKworCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMubG9jX3VwZF9yZXNwLmFjY2VwdCk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCisvKiBUcmFuc21pdCBDaGFwdGVyIDkuMi4xMCBJZGVudGl0eSBSZXF1ZXN0ICovCitzdGF0aWMgaW50IG1tX3R4X2lkZW50aXR5X3JlcShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgaWRfdHlwZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpICsgMSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTU07CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfTU1fSURfUkVROworCWdoLT5kYXRhWzBdID0gaWRfdHlwZTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKworLyogUGFyc2UgQ2hhcHRlciA5LjIuMTEgSWRlbnRpdHkgUmVzcG9uc2UgKi8KK3N0YXRpYyBpbnQgbW1fcnhfaWRfcmVzcChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gbXNnLT5sY2hhbjsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGJ0cy0+bmV0d29yazsKKwl1X2ludDhfdCBtaV90eXBlID0gZ2gtPmRhdGFbMV0gJiBHU01fTUlfVFlQRV9NQVNLOworCWNoYXIgbWlfc3RyaW5nW0dTTTQ4X01JX1NJWkVdOworCisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3N0cmluZywgc2l6ZW9mKG1pX3N0cmluZyksICZnaC0+ZGF0YVsxXSwgZ2gtPmRhdGFbMF0pOworCURFQlVHUChETU0sICJJREVOVElUWSBSRVNQT05TRTogbWlfdHlwZT0weCUwMnggTUkoJXMpXG4iLAorCQltaV90eXBlLCBtaV9zdHJpbmcpOworCisJY29ubiA9ICZsY2hhbi0+Y29ubjsKKworCWRpc3BhdGNoX3NpZ25hbChTU19TVUJTQ1IsIFNfU1VCU0NSX0lERU5USVRZLCBnaC0+ZGF0YSk7CisKKwlzd2l0Y2ggKG1pX3R5cGUpIHsKKwljYXNlIEdTTV9NSV9UWVBFX0lNU0k6CisJCS8qIGxvb2sgdXAgc3Vic2NyaWJlciBiYXNlZCBvbiBJTVNJLCBjcmVhdGUgaWYgbm90IGZvdW5kICovCisJCWlmICghY29ubi0+c3Vic2NyKSB7CisJCQljb25uLT5zdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2ltc2kobmV0LCBtaV9zdHJpbmcpOworCQkJaWYgKCFjb25uLT5zdWJzY3IpCisJCQkJY29ubi0+c3Vic2NyID0gZGJfY3JlYXRlX3N1YnNjcmliZXIobmV0LCBtaV9zdHJpbmcpOworCQl9CisJCWlmIChjb25uLT5sb2Nfb3BlcmF0aW9uKQorCQkJY29ubi0+bG9jX29wZXJhdGlvbi0+d2FpdGluZ19mb3JfaW1zaSA9IDA7CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1FSToKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUlTVjoKKwkJLyogdXBkYXRlIHN1YnNjcmliZSA8LT4gSU1FSSBtYXBwaW5nICovCisJCWlmIChjb25uLT5zdWJzY3IpIHsKKwkJCWRiX3N1YnNjcmliZXJfYXNzb2NfaW1laShjb25uLT5zdWJzY3IsIG1pX3N0cmluZyk7CisJCQlkYl9zeW5jX2VxdWlwbWVudCgmY29ubi0+c3Vic2NyLT5lcXVpcG1lbnQpOworCQl9CisJCWlmIChjb25uLT5sb2Nfb3BlcmF0aW9uKQorCQkJY29ubi0+bG9jX29wZXJhdGlvbi0+d2FpdGluZ19mb3JfaW1laSA9IDA7CisJCWJyZWFrOworCX0KKworCS8qIENoZWNrIGlmIHdlIGNhbiBsZXQgdGhlIG1vYmlsZSBzdGF0aW9uIGVudGVyICovCisJcmV0dXJuIGdzbTA0MDhfYXV0aG9yaXplKGNvbm4sIG1zZyk7Cit9CisKKworc3RhdGljIHZvaWQgbG9jX3VwZF9yZWpfY2Iodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiA9IGRhdGE7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBjb25uLT5sY2hhbjsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKworCXJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcShjb25uKTsKKwlnc20wNDA4X2xvY191cGRfcmVqKGxjaGFuLCBidHMtPm5ldHdvcmstPnJlamVjdF9jYXVzZSk7CisJbGNoYW5fYXV0b19yZWxlYXNlKGxjaGFuKTsKK30KKworc3RhdGljIHZvaWQgc2NoZWR1bGVfcmVqZWN0KHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uKQoreworCWNvbm4tPmxvY19vcGVyYXRpb24tPnVwZGF0aW5nX3RpbWVyLmNiID0gbG9jX3VwZF9yZWpfY2I7CisJY29ubi0+bG9jX29wZXJhdGlvbi0+dXBkYXRpbmdfdGltZXIuZGF0YSA9IGNvbm47CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZjb25uLT5sb2Nfb3BlcmF0aW9uLT51cGRhdGluZ190aW1lciwgNSwgMCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpsdXBkX25hbWUodV9pbnQ4X3QgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEdTTTQ4X0xVUERfTk9STUFMOgorCQlyZXR1cm4gIk5PUk1BTCI7CisJY2FzZSBHU000OF9MVVBEX1BFUklPRElDOgorCQlyZXR1cm4gIlBFUk9JRE9DIjsKKwljYXNlIEdTTTQ4X0xVUERfSU1TSV9BVFQ6CisJCXJldHVybiAiSU1TSSBBVFRBQ0giOworCWRlZmF1bHQ6CisJCXJldHVybiAiVU5LTk9XTiI7CisJfQorfQorCisvKiBDaGFwdGVyIDkuMi4xNTogUmVjZWl2ZSBMb2NhdGlvbiBVcGRhdGluZyBSZXF1ZXN0ICovCitzdGF0aWMgaW50IG1tX3J4X2xvY191cGRfcmVxKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm47CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbTQ4X2xvY191cGRfcmVxICpsdTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IE5VTEw7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCXVfaW50OF90IG1pX3R5cGU7CisJY2hhciBtaV9zdHJpbmdbR1NNNDhfTUlfU0laRV07CisJaW50IHJjOworCisgCWx1ID0gKHN0cnVjdCBnc200OF9sb2NfdXBkX3JlcSAqKSBnaC0+ZGF0YTsKKwljb25uID0gJmxjaGFuLT5jb25uOworCisJbWlfdHlwZSA9IGx1LT5taVswXSAmIEdTTV9NSV9UWVBFX01BU0s7CisKKwlnc200OF9taV90b19zdHJpbmcobWlfc3RyaW5nLCBzaXplb2YobWlfc3RyaW5nKSwgbHUtPm1pLCBsdS0+bWlfbGVuKTsKKworCURFQlVHUEMoRE1NLCAibWlfdHlwZT0weCUwMnggTUkoJXMpIHR5cGU9JXMgIiwgbWlfdHlwZSwgbWlfc3RyaW5nLAorCQlsdXBkX25hbWUobHUtPnR5cGUpKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19TVUJTQ1IsIFNfU1VCU0NSX0lERU5USVRZLCAmbHUtPm1pX2xlbik7CisKKwlzd2l0Y2ggKGx1LT50eXBlKSB7CisJY2FzZSBHU000OF9MVVBEX05PUk1BTDoKKwkJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5sb2NfdXBkX3R5cGUubm9ybWFsKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9MVVBEX0lNU0lfQVRUOgorCQljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLmxvY191cGRfdHlwZS5hdHRhY2gpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X0xVUERfUEVSSU9ESUM6CisJCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMubG9jX3VwZF90eXBlLnBlcmlvZGljKTsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBQc2V1ZG8gU3Bvb2YgZGV0ZWN0aW9uOiBKdXN0IGRyb3AgYSBzZWNvbmQvY29uY3VycmVudAorCSAqIGxvY2F0aW9uIHVwZGF0aW5nIHJlcXVlc3QuCisJICovCisJaWYgKGNvbm4tPmxvY19vcGVyYXRpb24pIHsKKwkJREVCVUdQQyhETU0sICJpZ25vcmluZyByZXF1ZXN0IGR1ZSBhbiBleGlzdGluZyBvbmU6ICVwLlxuIiwKKwkJCWNvbm4tPmxvY19vcGVyYXRpb24pOworCQlnc20wNDA4X2xvY191cGRfcmVqKGxjaGFuLCBHU000OF9SRUpFQ1RfUFJPVE9DT0xfRVJST1IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlhbGxvY2F0ZV9sb2NfdXBkYXRpbmdfcmVxKCZsY2hhbi0+Y29ubik7CisKKwlzd2l0Y2ggKG1pX3R5cGUpIHsKKwljYXNlIEdTTV9NSV9UWVBFX0lNU0k6CisJCURFQlVHUEMoRE1NLCAiXG4iKTsKKwkJLyogd2UgYWx3YXlzIHdhbnQgdGhlIElNRUksIHRvbyAqLworCQlyYyA9IG1tX3R4X2lkZW50aXR5X3JlcShsY2hhbiwgR1NNX01JX1RZUEVfSU1FSSk7CisJCWNvbm4tPmxvY19vcGVyYXRpb24tPndhaXRpbmdfZm9yX2ltZWkgPSAxOworCisJCS8qIGxvb2sgdXAgc3Vic2NyaWJlciBiYXNlZCBvbiBJTVNJLCBjcmVhdGUgaWYgbm90IGZvdW5kICovCisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShidHMtPm5ldHdvcmssIG1pX3N0cmluZyk7CisJCWlmICghc3Vic2NyKSB7CisJCQlzdWJzY3IgPSBkYl9jcmVhdGVfc3Vic2NyaWJlcihidHMtPm5ldHdvcmssIG1pX3N0cmluZyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9UTVNJOgorCQlERUJVR1BDKERNTSwgIlxuIik7CisJCS8qIHdlIGFsd2F5cyB3YW50IHRoZSBJTUVJLCB0b28gKi8KKwkJcmMgPSBtbV90eF9pZGVudGl0eV9yZXEobGNoYW4sIEdTTV9NSV9UWVBFX0lNRUkpOworCQljb25uLT5sb2Nfb3BlcmF0aW9uLT53YWl0aW5nX2Zvcl9pbWVpID0gMTsKKworCQkvKiBsb29rIHVwIHRoZSBzdWJzY3JpYmVyIGJhc2VkIG9uIFRNU0ksIHJlcXVlc3QgSU1TSSBpZiBpdCBmYWlscyAqLworCQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X3Rtc2koYnRzLT5uZXR3b3JrLAorCQkJCQkgICAgdG1zaV9mcm9tX3N0cmluZyhtaV9zdHJpbmcpKTsKKwkJaWYgKCFzdWJzY3IpIHsKKwkJCS8qIHNlbmQgSURFTlRJVFkgUkVRVUVTVCBtZXNzYWdlIHRvIGdldCBJTVNJICovCisJCQlyYyA9IG1tX3R4X2lkZW50aXR5X3JlcShsY2hhbiwgR1NNX01JX1RZUEVfSU1TSSk7CisJCQljb25uLT5sb2Nfb3BlcmF0aW9uLT53YWl0aW5nX2Zvcl9pbXNpID0gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUk6CisJY2FzZSBHU01fTUlfVFlQRV9JTUVJU1Y6CisJCS8qIG5vIHNpbSBjYXJkLi4uIEZJWE1FOiB3aGF0IHRvIGRvID8gKi8KKwkJREVCVUdQQyhETU0sICJ1bmltcGxlbWVudGVkIG1vYmlsZSBpZGVudGl0eSB0eXBlXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCisJCURFQlVHUEMoRE1NLCAidW5rbm93biBtb2JpbGUgaWRlbnRpdHkgdHlwZVxuIik7CisJCWJyZWFrOworCX0KKworCS8qIHNjaGVkdWxlIHRoZSByZWplY3QgdGltZXIgKi8KKwlzY2hlZHVsZV9yZWplY3QoY29ubik7CisKKwlpZiAoIXN1YnNjcikgeworCQlERUJVR1BDKERSUiwgIjwtIENhbid0IGZpbmQgYW55IHN1YnNjcmliZXIgZm9yIHRoaXMgSURcbiIpOworCQkvKiBGSVhNRTogcmVxdWVzdCBpZD8gY2xvc2UgY2hhbm5lbD8gKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY29ubi0+c3Vic2NyID0gc3Vic2NyOworCWNvbm4tPnN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazEgPSBsdS0+Y2xhc3NtYXJrMTsKKworCS8qIGNoZWNrIGlmIHdlIGNhbiBsZXQgdGhlIHN1YnNjcmliZXIgaW50byBvdXIgbmV0d29yayBpbW1lZGlhdGVseQorCSAqIG9yIGlmIHdlIG5lZWQgdG8gd2FpdCBmb3IgaWRlbnRpdHkgcmVzcG9uc2VzLiAqLworCXJldHVybiBnc20wNDA4X2F1dGhvcml6ZShjb25uLCBtc2cpOworfQorCisjaWYgMAorc3RhdGljIHVfaW50OF90IHRvX2JjZDgodV9pbnQ4X3QgdmFsKQoreworICAgICAgIHJldHVybiAoKHZhbCAvIDEwKSA8PCA0KSB8ICh2YWwgJSAxMCk7Cit9CisjZW5kaWYKKworLyogU2VjdGlvbiA5LjIuMTVhICovCitpbnQgZ3NtNDhfdHhfbW1faW5mbyhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwl1X2ludDhfdCAqcHRyODsKKwlpbnQgbmFtZV9sZW4sIG5hbWVfcGFkOworI2lmIDAKKwl0aW1lX3QgY3VyX3Q7CisJc3RydWN0IHRtKiBjdXJfdGltZTsKKwlpbnQgdHoxNW1pbjsKKyNlbmRpZgorCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9NTV9JTkZPOworCisJaWYgKG5ldC0+bmFtZV9sb25nKSB7CisjaWYgMAorCQluYW1lX2xlbiA9IHN0cmxlbihuZXQtPm5hbWVfbG9uZyk7CisJCS8qIDEwLjUuMy41YSAqLworCQlwdHI4ID0gbXNnYl9wdXQobXNnLCAzKTsKKwkJcHRyOFswXSA9IEdTTTQ4X0lFX05BTUVfTE9ORzsKKwkJcHRyOFsxXSA9IG5hbWVfbGVuKjIgKzE7CisJCXB0cjhbMl0gPSAweDkwOyAvKiBVQ1MyLCBubyBzcGFyZSBiaXRzLCBubyBDSSAqLworCisJCXB0cjE2ID0gKHVfaW50MTZfdCAqKSBtc2diX3B1dChtc2csIG5hbWVfbGVuKjIpOworCQlmb3IgKGkgPSAwOyBpIDwgbmFtZV9sZW47IGkrKykKKwkJCXB0cjE2W2ldID0gaHRvbnMobmV0LT5uYW1lX2xvbmdbaV0pOworCisJCS8qIEZJWE1FOiBVc2UgQ2VsbCBCcm9hZGNhc3QsIG5vdCBVQ1MtMiwgc2luY2UKKwkJICogVUNTLTIgaXMgb25seSBzdXBwb3J0ZWQgYnkgbGF0ZXIgcmV2aXNpb25zIG9mIHRoZSBzcGVjICovCisjZW5kaWYKKwkJbmFtZV9sZW4gPSAoc3RybGVuKG5ldC0+bmFtZV9sb25nKSo3KS84OworCQluYW1lX3BhZCA9ICg4IC0gc3RybGVuKG5ldC0+bmFtZV9sb25nKSo3KSU4OworCQlpZiAobmFtZV9wYWQgPiAwKQorCQkJbmFtZV9sZW4rKzsKKwkJLyogMTAuNS4zLjVhICovCisJCXB0cjggPSBtc2diX3B1dChtc2csIDMpOworCQlwdHI4WzBdID0gR1NNNDhfSUVfTkFNRV9MT05HOworCQlwdHI4WzFdID0gbmFtZV9sZW4gKzE7CisJCXB0cjhbMl0gPSAweDgwIHwgbmFtZV9wYWQ7IC8qIENlbGwgQnJvYWRjYXN0IERDUywgbm8gQ0kgKi8KKworCQlwdHI4ID0gbXNnYl9wdXQobXNnLCBuYW1lX2xlbik7CisJCWdzbV83Yml0X2VuY29kZShwdHI4LCBuZXQtPm5hbWVfbG9uZyk7CisKKwl9CisKKwlpZiAobmV0LT5uYW1lX3Nob3J0KSB7CisjaWYgMAorCQluYW1lX2xlbiA9IHN0cmxlbihuZXQtPm5hbWVfc2hvcnQpOworCQkvKiAxMC41LjMuNWEgKi8KKwkJcHRyOCA9ICh1X2ludDhfdCAqKSBtc2diX3B1dChtc2csIDMpOworCQlwdHI4WzBdID0gR1NNNDhfSUVfTkFNRV9TSE9SVDsKKwkJcHRyOFsxXSA9IG5hbWVfbGVuKjIgKyAxOworCQlwdHI4WzJdID0gMHg5MDsgLyogVUNTMiwgbm8gc3BhcmUgYml0cywgbm8gQ0kgKi8KKworCQlwdHIxNiA9ICh1X2ludDE2X3QgKikgbXNnYl9wdXQobXNnLCBuYW1lX2xlbioyKTsKKwkJZm9yIChpID0gMDsgaSA8IG5hbWVfbGVuOyBpKyspCisJCQlwdHIxNltpXSA9IGh0b25zKG5ldC0+bmFtZV9zaG9ydFtpXSk7CisjZW5kaWYKKwkJbmFtZV9sZW4gPSAoc3RybGVuKG5ldC0+bmFtZV9zaG9ydCkqNykvODsKKwkJbmFtZV9wYWQgPSAoOCAtIHN0cmxlbihuZXQtPm5hbWVfc2hvcnQpKjcpJTg7CisJCWlmIChuYW1lX3BhZCA+IDApCisJCQluYW1lX2xlbisrOworCQkvKiAxMC41LjMuNWEgKi8KKwkJcHRyOCA9ICh1X2ludDhfdCAqKSBtc2diX3B1dChtc2csIDMpOworCQlwdHI4WzBdID0gR1NNNDhfSUVfTkFNRV9TSE9SVDsKKwkJcHRyOFsxXSA9IG5hbWVfbGVuICsxOworCQlwdHI4WzJdID0gMHg4MCB8IG5hbWVfcGFkOyAvKiBDZWxsIEJyb2FkY2FzdCBEQ1MsIG5vIENJICovCisKKwkJcHRyOCA9IG1zZ2JfcHV0KG1zZywgbmFtZV9sZW4pOworCQlnc21fN2JpdF9lbmNvZGUocHRyOCwgbmV0LT5uYW1lX3Nob3J0KTsKKworCX0KKworI2lmIDAKKwkvKiBTZWN0aW9uIDEwLjUuMy45ICovCisJY3VyX3QgPSB0aW1lKE5VTEwpOworCWN1cl90aW1lID0gZ210aW1lKCZjdXJfdCk7CisJcHRyOCA9IG1zZ2JfcHV0KG1zZywgOCk7CisJcHRyOFswXSA9IEdTTTQ4X0lFX05FVF9USU1FX1RaOworCXB0cjhbMV0gPSB0b19iY2Q4KGN1cl90aW1lLT50bV95ZWFyICUgMTAwKTsKKwlwdHI4WzJdID0gdG9fYmNkOChjdXJfdGltZS0+dG1fbW9uKTsKKwlwdHI4WzNdID0gdG9fYmNkOChjdXJfdGltZS0+dG1fbWRheSk7CisJcHRyOFs0XSA9IHRvX2JjZDgoY3VyX3RpbWUtPnRtX2hvdXIpOworCXB0cjhbNV0gPSB0b19iY2Q4KGN1cl90aW1lLT50bV9taW4pOworCXB0cjhbNl0gPSB0b19iY2Q4KGN1cl90aW1lLT50bV9zZWMpOworCS8qIDAyLjQyOiBjb2RlZCBhcyBCQ0QgZW5jb2RlZCBzaWduZWQgdmFsdWUgaW4gdW5pdHMgb2YgMTUgbWludXRlcyAqLworCXR6MTVtaW4gPSAoY3VyX3RpbWUtPnRtX2dtdG9mZikvKDYwKjE1KTsKKwlwdHI4WzddID0gdG9fYmNkOCh0ejE1bWluKTsKKwlpZiAodHoxNW1pbiA8IDApCisJCXB0cjhbN10gfD0gMHg4MDsKKyNlbmRpZgorCisJREVCVUdQKERNTSwgIi0+IE1NIElORk9cbiIpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworLyogU2VjdGlvbiA5LjIuMiAqLworaW50IGdzbTQ4X3R4X21tX2F1dGhfcmVxKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCAqcmFuZCwgaW50IGtleV9zZXEpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCXN0cnVjdCBnc200OF9hdXRoX3JlcSAqYXIgPSAoc3RydWN0IGdzbTQ4X2F1dGhfcmVxICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCphcikpOworCisJREVCVUdQKERNTSwgIi0+IEFVVEggUkVRIChyYW5kID0gJXMpXG4iLCBoZXhkdW1wKHJhbmQsIDE2KSk7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTU07CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfTU1fQVVUSF9SRVE7CisKKwlhci0+a2V5X3NlcSA9IGtleV9zZXE7CisKKwkvKiAxNiBieXRlcyBSQU5EIHBhcmFtZXRlcnMgKi8KKwlpZiAocmFuZCkKKwkJbWVtY3B5KGFyLT5yYW5kLCByYW5kLCAxNik7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCisvKiBTZWN0aW9uIDkuMi4xICovCitpbnQgZ3NtNDhfdHhfbW1fYXV0aF9yZWooc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJREVCVUdQKERNTSwgIi0+IEFVVEggUkVKRUNUXG4iKTsKKwlyZXR1cm4gZ3NtNDhfdHhfc2ltcGxlKGxjaGFuLCBHU000OF9QRElTQ19NTSwgR1NNNDhfTVRfTU1fQVVUSF9SRUopOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3R4X21tX3NlcnZfYWNrKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCURFQlVHUChETU0sICItPiBDTSBTRVJWSUNFIEFDS1xuIik7CisJcmV0dXJuIGdzbTQ4X3R4X3NpbXBsZShsY2hhbiwgR1NNNDhfUERJU0NfTU0sIEdTTTQ4X01UX01NX0NNX1NFUlZfQUNDKTsKK30KKworLyogOS4yLjYgQ00gc2VydmljZSByZWplY3QgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfdHhfbW1fc2Vydl9yZWooc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkJZW51bSBnc200OF9yZWplY3RfdmFsdWUgdmFsdWUpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSArIDEpOworCisJbXNnLT5sY2hhbiA9IGNvbm4tPmxjaGFuOworCXVzZV9zdWJzY3JfY29uKGNvbm4pOworCisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTU07CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfTU1fQ01fU0VSVl9SRUo7CisJZ2gtPmRhdGFbMF0gPSB2YWx1ZTsKKwlERUJVR1AoRE1NLCAiLT4gQ00gU0VSVklDRSBSZWplY3QgY2F1c2U6ICVkXG4iLCB2YWx1ZSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCisvKgorICogSGFuZGxlIENNIFNlcnZpY2UgUmVxdWVzdHMKKyAqIGEpIFZlcmlmeSB0aGF0IHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8gY29udGFpbiB0aGUgaW5mb3JtYXRpb24KKyAqICAgIHdlIHJlcXVpcmUgb3RoZXJ3c2llIHJlamVjdCB3aXRoIElOQ09SUkVDVF9NRVNTQUdFCisgKiBiKSBUcnkgdG8gcGFyc2UgdGhlIFRNU0kuIElmIHdlIGRvIG5vdCBoYXZlIG9uZSByZWplY3QKKyAqIGMpIENoZWNrIHRoYXQgd2Uga25vdyB0aGUgc3Vic2NyaWJlciB3aXRoIHRoZSBUTVNJIG90aGVyd2lzZSByZWplY3QKKyAqICAgIHdpdGggYSBITFIgY2F1c2UKKyAqIGQpIFNldCB0aGUgc3Vic2NyaWJlciBvbiB0aGUgZ3NtX2xjaGFuIGFuZCBhY2NlcHQKKyAqLworc3RhdGljIGludCBnc200OF9yeF9tbV9zZXJ2X3JlcShzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXVfaW50OF90IG1pX3R5cGU7CisJY2hhciBtaV9zdHJpbmdbR1NNNDhfTUlfU0laRV07CisKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXN0cnVjdCBnc200OF9zZXJ2aWNlX3JlcXVlc3QgKnJlcSA9CisJCQkoc3RydWN0IGdzbTQ4X3NlcnZpY2VfcmVxdWVzdCAqKWdoLT5kYXRhOworCS8qIHVuZm9ydHVuYXRlbHkgaW4gUGhhc2UxIHRoZSBjbGFzc21hcjIgbGVuZ3RoIGlzIHZhcmlhYmxlICovCisJdV9pbnQ4X3QgY2xhc3NtYXJrMl9sZW4gPSBnaC0+ZGF0YVsxXTsKKwl1X2ludDhfdCAqY2xhc3NtYXJrMiA9IGdoLT5kYXRhKzI7CisJdV9pbnQ4X3QgbWlfbGVuID0gKihjbGFzc21hcmsyICsgY2xhc3NtYXJrMl9sZW4pOworCXVfaW50OF90ICptaSA9IChjbGFzc21hcmsyICsgY2xhc3NtYXJrMl9sZW4gKyAxKTsKKworCURFQlVHUChETU0sICI8LSBDTSBTRVJWSUNFIFJFUVVFU1QgIik7CisJaWYgKG1zZy0+ZGF0YV9sZW4gPCBzaXplb2Yoc3RydWN0IGdzbTQ4X3NlcnZpY2VfcmVxdWVzdCopKSB7CisJCURFQlVHUEMoRE1NLCAid3Jvbmcgc2l6ZWQgbWVzc2FnZVxuIik7CisJCXJldHVybiBnc200OF90eF9tbV9zZXJ2X3JlaigmbXNnLT5sY2hhbi0+Y29ubiwKKwkJCQkJICAgIEdTTTQ4X1JFSkVDVF9JTkNPUlJFQ1RfTUVTU0FHRSk7CisJfQorCisJaWYgKG1zZy0+ZGF0YV9sZW4gPCByZXEtPm1pX2xlbiArIDYpIHsKKwkJREVCVUdQQyhETU0sICJkb2VzIG5vdCBmaXQgaW4gcGFja2V0XG4iKTsKKwkJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfcmVqKCZtc2ctPmxjaGFuLT5jb25uLAorCQkJCQkgICAgR1NNNDhfUkVKRUNUX0lOQ09SUkVDVF9NRVNTQUdFKTsKKwl9CisKKwltaV90eXBlID0gbWlbMF0gJiBHU01fTUlfVFlQRV9NQVNLOworCWlmIChtaV90eXBlICE9IEdTTV9NSV9UWVBFX1RNU0kpIHsKKwkJREVCVUdQQyhETU0sICJtaV90eXBlIGlzIG5vdCBUTVNJOiAlZFxuIiwgbWlfdHlwZSk7CisJCXJldHVybiBnc200OF90eF9tbV9zZXJ2X3JlaigmbXNnLT5sY2hhbi0+Y29ubiwKKwkJCQkJICAgIEdTTTQ4X1JFSkVDVF9JTkNPUlJFQ1RfTUVTU0FHRSk7CisJfQorCisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3N0cmluZywgc2l6ZW9mKG1pX3N0cmluZyksIG1pLCBtaV9sZW4pOworCURFQlVHUEMoRE1NLCAic2Vydl90eXBlPTB4JTAyeCBtaV90eXBlPTB4JTAyeCBNKCVzKVxuIiwKKwkJcmVxLT5jbV9zZXJ2aWNlX3R5cGUsIG1pX3R5cGUsIG1pX3N0cmluZyk7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfU1VCU0NSLCBTX1NVQlNDUl9JREVOVElUWSwgKGNsYXNzbWFyazIgKyBjbGFzc21hcmsyX2xlbikpOworCisJaWYgKGlzX3NpZW1lbnNfYnRzKGJ0cykpCisJCXNlbmRfc2llbWVuc19tcnBjaShtc2ctPmxjaGFuLCBjbGFzc21hcmsyLTEpOworCisJc3Vic2NyID0gc3Vic2NyX2dldF9ieV90bXNpKGJ0cy0+bmV0d29yaywKKwkJCQkgICAgdG1zaV9mcm9tX3N0cmluZyhtaV9zdHJpbmcpKTsKKworCS8qIEZJWE1FOiBpZiB3ZSBkb24ndCBrbm93IHRoZSBUTVNJLCBpbnF1aXJlIGFiaXQgSU1TSSBhbmQgYWxsb2NhdGUgbmV3IFRNU0kgKi8KKwlpZiAoIXN1YnNjcikKKwkJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfcmVqKCZtc2ctPmxjaGFuLT5jb25uLAorCQkJCQkgICAgR1NNNDhfUkVKRUNUX0lNU0lfVU5LTk9XTl9JTl9ITFIpOworCisJaWYgKCFtc2ctPmxjaGFuLT5jb25uLnN1YnNjcikKKwkJbXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IgPSBzdWJzY3I7CisJZWxzZSBpZiAobXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IgPT0gc3Vic2NyKQorCQlzdWJzY3JfcHV0KHN1YnNjcik7IC8qIGxjaGFuIGFscmVhZHkgaGFzIGEgcmVmLCBkb24ndCBuZWVkIGFub3RoZXIgb25lICovCisJZWxzZSB7CisJCURFQlVHUChETU0sICI8LSBDTSBDaGFubmVsIGFscmVhZHkgb3duZWQgYnkgc29tZW9uZSBlbHNlP1xuIik7CisJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwl9CisKKwlzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyX2xlbiA9IGNsYXNzbWFyazJfbGVuOworCW1lbWNweShzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyLCBjbGFzc21hcmsyLCBjbGFzc21hcmsyX2xlbik7CisJZGJfc3luY19lcXVpcG1lbnQoJnN1YnNjci0+ZXF1aXBtZW50KTsKKworCXJldHVybiBnc200OF90eF9tbV9zZXJ2X2Fjayhtc2ctPmxjaGFuKTsKK30KKworc3RhdGljIGludCBnc200OF9yeF9tbV9pbXNpX2RldGFjaF9pbmQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXN0cnVjdCBnc200OF9pbXNpX2RldGFjaF9pbmQgKmlkaSA9CisJCQkJKHN0cnVjdCBnc200OF9pbXNpX2RldGFjaF9pbmQgKikgZ2gtPmRhdGE7CisJdV9pbnQ4X3QgbWlfdHlwZSA9IGlkaS0+bWlbMF0gJiBHU01fTUlfVFlQRV9NQVNLOworCWNoYXIgbWlfc3RyaW5nW0dTTTQ4X01JX1NJWkVdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gTlVMTDsKKworCWdzbTQ4X21pX3RvX3N0cmluZyhtaV9zdHJpbmcsIHNpemVvZihtaV9zdHJpbmcpLCBpZGktPm1pLCBpZGktPm1pX2xlbik7CisJREVCVUdQKERNTSwgIklNU0kgREVUQUNIIElORElDQVRJT046IG1pX3R5cGU9MHglMDJ4IE1JKCVzKTogIiwKKwkJbWlfdHlwZSwgbWlfc3RyaW5nKTsKKworCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMubG9jX3VwZF90eXBlLmRldGFjaCk7CisKKwlzd2l0Y2ggKG1pX3R5cGUpIHsKKwljYXNlIEdTTV9NSV9UWVBFX1RNU0k6CisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfdG1zaShidHMtPm5ldHdvcmssCisJCQkJCSAgICB0bXNpX2Zyb21fc3RyaW5nKG1pX3N0cmluZykpOworCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX0lNU0k6CisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShidHMtPm5ldHdvcmssIG1pX3N0cmluZyk7CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1FSToKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUlTVjoKKwkJLyogbm8gc2ltIGNhcmQuLi4gRklYTUU6IHdoYXQgdG8gZG8gPyAqLworCQlERUJVR1BDKERNTSwgInVuaW1wbGVtZW50ZWQgbW9iaWxlIGlkZW50aXR5IHR5cGVcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgkKKwkJREVCVUdQQyhETU0sICJ1bmtub3duIG1vYmlsZSBpZGVudGl0eSB0eXBlXG4iKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHN1YnNjcikgeworCQlzdWJzY3JfdXBkYXRlKHN1YnNjciwgbXNnLT50cngtPmJ0cywKKwkJCQlHU01fU1VCU0NSSUJFUl9VUERBVEVfREVUQUNIRUQpOworCQlERUJVR1AoRE1NLCAiU3Vic2NyaWJlcjogJXNcbiIsIHN1YnNjcl9uYW1lKHN1YnNjcikpOworCisJCXN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazEgPSBpZGktPmNsYXNzbWFyazE7CisJCWRiX3N5bmNfZXF1aXBtZW50KCZzdWJzY3ItPmVxdWlwbWVudCk7CisKKwkJc3Vic2NyX3B1dChzdWJzY3IpOworCX0gZWxzZQorCQlERUJVR1AoRE1NLCAiVW5rbm93biBTdWJzY3JpYmVyID8hP1xuIik7CisKKwkvKiBGSVhNRTogaXRlcmF0ZSBvdmVyIGFsbCB0cmFuc2FjdGlvbnMgYW5kIHJlbGVhc2UgdGhlbSwKKwkgKiBpbWFnaW5lIGFuIElNU0kgREVUQUNIIGhhcHBlbmluZyBkdXJpbmcgYW4gYWN0aXZlIGNhbGwhICovCisKKwkvKiBzdWJzY3JpYmVyIGlzIGRldGFjaGVkOiBzaG91bGQgd2UgcmVsZWFzZSBsY2hhbj8gKi8KKwlsY2hhbl9hdXRvX3JlbGVhc2UobXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc200OF9yeF9tbV9zdGF0dXMoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKworCURFQlVHUChETU0sICJNTSBTVEFUVVMgKHJlamVjdCBjYXVzZSAweCUwMngpXG4iLCBnaC0+ZGF0YVswXSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVjZWl2ZSBhIEdTTSAwNC4wOCBNb2JpbGl0eSBNYW5hZ2VtZW50IChNTSkgbWVzc2FnZSAqLworc3RhdGljIGludCBnc20wNDA4X3Jjdl9tbShzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGdoLT5tc2dfdHlwZSAmIDB4YmYpIHsKKwljYXNlIEdTTTQ4X01UX01NX0xPQ19VUERfUkVRVUVTVDoKKwkJREVCVUdQKERNTSwgIkxPQ0FUSU9OIFVQREFUSU5HIFJFUVVFU1Q6ICIpOworCQlyYyA9IG1tX3J4X2xvY191cGRfcmVxKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fSURfUkVTUDoKKwkJcmMgPSBtbV9yeF9pZF9yZXNwKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fQ01fU0VSVl9SRVE6CisJCXJjID0gZ3NtNDhfcnhfbW1fc2Vydl9yZXEobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9TVEFUVVM6CisJCXJjID0gZ3NtNDhfcnhfbW1fc3RhdHVzKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fVE1TSV9SRUFMTF9DT01QTDoKKwkJREVCVUdQKERNTSwgIlRNU0kgUmVhbGxvY2F0aW9uIENvbXBsZXRlZC4gU3Vic2NyaWJlcjogJXNcbiIsCisJCSAgICAgICBtc2ctPmxjaGFuLT5jb25uLnN1YnNjciA/CisJCQkJc3Vic2NyX25hbWUobXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IpIDoKKwkJCQkidW5rbm93biBzdWJzY3JpYmVyIik7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fSU1TSV9ERVRBQ0hfSU5EOgorCQlyYyA9IGdzbTQ4X3J4X21tX2ltc2lfZGV0YWNoX2luZChtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX01NX0NNX1JFRVNUX1JFUToKKwkJREVCVUdQKERNTSwgIkNNIFJFRVNUQUJMSVNIIFJFUVVFU1Q6IE5vdCBpbXBsZW1lbnRlZFxuIik7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfTU1fQVVUSF9SRVNQOgorCQlERUJVR1AoRE1NLCAiQVVUSEVOVElDQVRJT04gUkVTUE9OU0U6IE5vdCBpbXBsZW1lbnRlZFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1NLCBMT0dMX05PVElDRSwgIlVua25vd24gR1NNIDA0LjA4IE1NIG1zZyB0eXBlIDB4JTAyeFxuIiwKKwkJCWdoLT5tc2dfdHlwZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogUmVjZWl2ZSBhIFBBR0lORyBSRVNQT05TRSBtZXNzYWdlIGZyb20gdGhlIE1TICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX3BhZ19yZXNwKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCAqY2xhc3NtYXJrMl9sdiA9IGdoLT5kYXRhICsgMTsKKwl1X2ludDhfdCBtaV90eXBlOworCWNoYXIgbWlfc3RyaW5nW0dTTTQ4X01JX1NJWkVdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCisJZ3NtNDhfcGFnaW5nX2V4dHJhY3RfbWkobXNnLCBtaV9zdHJpbmcsICZtaV90eXBlKTsKKwlERUJVR1AoRFJSLCAiUEFHSU5HIFJFU1BPTlNFOiBtaV90eXBlPTB4JTAyeCBNSSglcylcbiIsCisJCW1pX3R5cGUsIG1pX3N0cmluZyk7CisKKwlzd2l0Y2ggKG1pX3R5cGUpIHsKKwljYXNlIEdTTV9NSV9UWVBFX1RNU0k6CisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfdG1zaShidHMtPm5ldHdvcmssCisJCQkJCSAgICB0bXNpX2Zyb21fc3RyaW5nKG1pX3N0cmluZykpOworCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX0lNU0k6CisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShidHMtPm5ldHdvcmssIG1pX3N0cmluZyk7CisJCWJyZWFrOworCX0KKworCWlmICghc3Vic2NyKSB7CisJCURFQlVHUChEUlIsICI8LSBDYW4ndCBmaW5kIGFueSBzdWJzY3JpYmVyIGZvciB0aGlzIElEXG4iKTsKKwkJLyogRklYTUU6IHJlcXVlc3QgaWQ/IGNsb3NlIGNoYW5uZWw/ICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlERUJVR1AoRFJSLCAiPC0gQ2hhbm5lbCB3YXMgcmVxdWVzdGVkIGJ5ICVzXG4iLAorCQlzdWJzY3ItPm5hbWUgJiYgc3RybGVuKHN1YnNjci0+bmFtZSkgPyBzdWJzY3ItPm5hbWUgOiBzdWJzY3ItPmltc2kpOworCisJc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMl9sZW4gPSAqY2xhc3NtYXJrMl9sdjsKKwltZW1jcHkoc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMiwgY2xhc3NtYXJrMl9sdisxLCAqY2xhc3NtYXJrMl9sdik7CisJZGJfc3luY19lcXVpcG1lbnQoJnN1YnNjci0+ZXF1aXBtZW50KTsKKworCXJjID0gZ3NtNDhfaGFuZGxlX3BhZ2luZ19yZXNwKG1zZywgc3Vic2NyKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfY2xhc3NtYXJrKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBtc2ctPmxjaGFuLT5jb25uLnN1YnNjcjsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwl1X2ludDhfdCBjbTJfbGVuLCBjbTNfbGVuID0gMDsKKwl1X2ludDhfdCAqY20yLCAqY20zID0gTlVMTDsKKworCURFQlVHUChEUlIsICJDTEFTU01BUksgQ0hBTkdFICIpOworCisJLyogY2xhc3NtYXJrIDIgKi8KKwljbTJfbGVuID0gZ2gtPmRhdGFbMF07CisJY20yID0gJmdoLT5kYXRhWzFdOworCURFQlVHUEMoRFJSLCAiQ00yKGxlbj0ldSkgIiwgY20yX2xlbik7CisKKwlpZiAocGF5bG9hZF9sZW4gPiBjbTJfbGVuICsgMSkgeworCQkvKiB3ZSBtdXN0IGhhdmUgYSBjbGFzc21hcmszICovCisJCWlmIChnaC0+ZGF0YVtjbTJfbGVuKzFdICE9IDB4MjApIHsKKwkJCURFQlVHUEMoRFJSLCAiRVJSIENNMyBUQUdcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKGNtMl9sZW4gPiAzKSB7CisJCQlERUJVR1BDKERSUiwgIkNNMiB0b28gbG9uZyFcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJCisJCWNtM19sZW4gPSBnaC0+ZGF0YVtjbTJfbGVuKzJdOworCQljbTMgPSAmZ2gtPmRhdGFbY20yX2xlbiszXTsKKwkJaWYgKGNtM19sZW4gPiAxNCkgeworCQkJREVCVUdQQyhEUlIsICJDTTMgbGVuICV1IHRvbyBsb25nIVxuIiwgY20zX2xlbik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlERUJVR1BDKERSUiwgIkNNMyhsZW49JXUpXG4iLCBjbTNfbGVuKTsKKwl9CisJaWYgKHN1YnNjcikgeworCQlzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyX2xlbiA9IGNtMl9sZW47CisJCW1lbWNweShzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmsyLCBjbTIsIGNtMl9sZW4pOworCQlpZiAoY20zKSB7CisJCQlzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmszX2xlbiA9IGNtM19sZW47CisJCQltZW1jcHkoc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMywgY20zLCBjbTNfbGVuKTsKKwkJfQorCQlkYl9zeW5jX2VxdWlwbWVudCgmc3Vic2NyLT5lcXVpcG1lbnQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX3N0YXR1cyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCisJREVCVUdQKERSUiwgIlNUQVRVUyBycl9jYXVzZSA9ICVzXG4iLCAKKwkJcnJfY2F1c2VfbmFtZShnaC0+ZGF0YVswXSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfbWVhc19yZXAoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwICptZWFzX3JlcCA9IGxjaGFuX25leHRfbWVhc19yZXAobXNnLT5sY2hhbik7CisKKwkvKiBUaGlzIHNob3VsZG4ndCBhY3R1YWxseSBlbmQgdXAgaGVyZSwgYXMgUlNMIHRyZWF0cworCSAqIEwzIEluZm8gb2YgMDguNTggTUVBU1VSRU1FTlQgUkVQT1JUIGRpZmZlcmVudCBieSBjYWxsaW5nCisJICogZGlyZWN0bHkgaW50byBnc200OF9wYXJzZV9tZWFzX3JlcCAqLworCURFQlVHUChETUVBUywgIkRJUkVDVCBHU000OCBNRUFTVVJFTUVOVCBSRVBPUlQgPyE/ICIpOworCWdzbTQ4X3BhcnNlX21lYXNfcmVwKG1lYXNfcmVwLCBtc2cpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfYXBwX2luZm8oc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCBhcGR1X2lkX2ZsYWdzOworCXVfaW50OF90IGFwZHVfbGVuOworCXVfaW50OF90ICphcGR1X2RhdGE7CisKKwlhcGR1X2lkX2ZsYWdzID0gZ2gtPmRhdGFbMF07CisJYXBkdV9sZW4gPSBnaC0+ZGF0YVsxXTsKKwlhcGR1X2RhdGEgPSBnaC0+ZGF0YSsyOworCQorCURFQlVHUChETk0sICJSWCBBUFBMSUNBVElPTiBJTkZPIGlkL2ZsYWdzPTB4JTAyeCBhcGR1X2xlbj0ldSBhcGR1PSVzIiwKKwkJYXBkdV9pZF9mbGFncywgYXBkdV9sZW4sIGhleGR1bXAoYXBkdV9kYXRhLCBhcGR1X2xlbikpOworCisJcmV0dXJuIGRiX2FwZHVfYmxvYl9zdG9yZShtc2ctPmxjaGFuLT5jb25uLnN1YnNjciwgYXBkdV9pZF9mbGFncywgYXBkdV9sZW4sIGFwZHVfZGF0YSk7Cit9CisKKy8qIENoYXB0ZXIgOS4xLjE2IEhhbmRvdmVyIGNvbXBsZXRlICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX2hvX2NvbXBsKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisKKwlERUJVR1AoRFJSLCAiSEFORE9WRVIgQ09NUExFVEUgY2F1c2UgPSAlc1xuIiwKKwkJcnJfY2F1c2VfbmFtZShnaC0+ZGF0YVswXSkpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX0hBTkRPVkVSX0NPTVBMLCBtc2ctPmxjaGFuKTsKKwkvKiBGSVhNRTogcmVsZWFzZSBvbGQgY2hhbm5lbCAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOS4xLjE3IEhhbmRvdmVyIEZhaWx1cmUgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfaG9fZmFpbChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCisJREVCVUdQKERSUiwgIkhBTkRPVkVSIEZBSUxFRCBjYXVzZSA9ICVzXG4iLAorCQlycl9jYXVzZV9uYW1lKGdoLT5kYXRhWzBdKSk7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfTENIQU4sIFNfTENIQU5fSEFORE9WRVJfRkFJTCwgbXNnLT5sY2hhbik7CisJLyogRklYTUU6IHJlbGVhc2UgYWxsb2NhdGVkIG5ldyBjaGFubmVsICovCisKKwlyZXR1cm4gMDsKK30KKworLyogUmVjZWl2ZSBhIEdTTSAwNC4wOCBSYWRpbyBSZXNvdXJjZSAoUlIpIG1lc3NhZ2UgKi8KK3N0YXRpYyBpbnQgZ3NtMDQwOF9yY3ZfcnIoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChnaC0+bXNnX3R5cGUpIHsKKwljYXNlIEdTTTQ4X01UX1JSX0NMU01fQ0hHOgorCQlyYyA9IGdzbTQ4X3J4X3JyX2NsYXNzbWFyayhtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX0dQUlNfU1VTUF9SRVE6CisJCURFQlVHUChEUlIsICJHUlBTIFNVU1BFTkQgUkVRVUVTVFxuIik7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfUEFHX1JFU1A6CisJCXJjID0gZ3NtNDhfcnhfcnJfcGFnX3Jlc3AobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9DSEFOX01PREVfTU9ESUZfQUNLOgorCQlyYyA9IGdzbTQ4X3J4X3JyX21vZGlmX2Fjayhtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX1NUQVRVUzoKKwkJcmMgPSBnc200OF9yeF9ycl9zdGF0dXMobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9NRUFTX1JFUDoKKwkJcmMgPSBnc200OF9yeF9ycl9tZWFzX3JlcChtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX0FQUF9JTkZPOgorCQlyYyA9IGdzbTQ4X3J4X3JyX2FwcF9pbmZvKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfQ0lQSF9NX0NPTVBMOgorCQlERUJVR1AoRFJSLCAiQ0lQSEVSSU5HIE1PREUgQ09NUExFVEVcbiIpOworCQkvKiBGSVhNRTogY2hlY2sgZm9yIE1JIChpZiBhbnkpICovCisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfSEFORE9fQ09NUEw6CisJCXJjID0gZ3NtNDhfcnhfcnJfaG9fY29tcGwobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9IQU5ET19GQUlMOgorCQlyYyA9IGdzbTQ4X3J4X3JyX2hvX2ZhaWwobXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUlIsIExPR0xfTk9USUNFLCAiVW5pbXBsZW1lbnRlZCAiCisJCQkiR1NNIDA0LjA4IFJSIG1zZyB0eXBlIDB4JTAyeFxuIiwgZ2gtPm1zZ190eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitpbnQgZ3NtNDhfc2VuZF9ycl9hcHBfaW5mbyhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgYXBkdV9pZCwKKwkJCSAgIHVfaW50OF90IGFwZHVfbGVuLCBjb25zdCB1X2ludDhfdCAqYXBkdSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCQorCURFQlVHUChEUlIsICJUWCBBUFBMSUNBVElPTiBJTkZPIGlkPTB4JTAyeCwgbGVuPSV1XG4iLAorCQlhcGR1X2lkLCBhcGR1X2xlbik7CisJCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpICsgMiArIGFwZHVfbGVuKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19SUjsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9SUl9BUFBfSU5GTzsKKwlnaC0+ZGF0YVswXSA9IGFwZHVfaWQ7CisJZ2gtPmRhdGFbMV0gPSBhcGR1X2xlbjsKKwltZW1jcHkoZ2gtPmRhdGErMiwgYXBkdSwgYXBkdV9sZW4pOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworLyogQ2FsbCBDb250cm9sICovCisKKy8qIFRoZSBlbnRpcmUgY2FsbCBjb250cm9sIGNvZGUgaXMgd3JpdHRlbiBpbiBhY2NvcmRhbmNlIHdpdGggRmlndXJlIDcuMTBjCisgKiBmb3IgJ3ZlcnkgZWFybHkgYXNzaWdubWVudCcsIGkuZS4gd2UgYWxsb2NhdGUgYSBUQ0gvRiBkdXJpbmcgSU1NRURJQVRFCisgKiBBU1NJR04sIHRoZW4gZmlyc3QgdXNlIHRoYXQgVENIL0YgZm9yIHNpZ25hbGxpbmcgYW5kIGxhdGVyIE1PREUgTU9ESUZZCisgKiBpdCBmb3Igdm9pY2UgKi8KKworc3RhdGljIHZvaWQgbmV3X2NjX3N0YXRlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBpbnQgc3RhdGUpCit7CisJaWYgKHN0YXRlID4gMzEgfHwgc3RhdGUgPCAwKQorCQlyZXR1cm47CisKKwlERUJVR1AoRENDLCAibmV3IHN0YXRlICVzIC0+ICVzXG4iLAorCQlnc200OF9jY19zdGF0ZV9uYW1lKHRyYW5zLT5jYy5zdGF0ZSksCisJCWdzbTQ4X2NjX3N0YXRlX25hbWUoc3RhdGUpKTsKKworCXRyYW5zLT5jYy5zdGF0ZSA9IHN0YXRlOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3N0YXR1cyhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwl1X2ludDhfdCAqY2F1c2UsICpjYWxsX3N0YXRlOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfU1RBVFVTOworCisJY2F1c2UgPSBtc2diX3B1dChtc2csIDMpOworCWNhdXNlWzBdID0gMjsKKwljYXVzZVsxXSA9IEdTTTQ4X0NBVVNFX0NTX0dTTSB8IEdTTTQ4X0NBVVNFX0xPQ19VU0VSOworCWNhdXNlWzJdID0gMHg4MCB8IDMwOwkvKiByZXNwb25zZSB0byBzdGF0dXMgaW5xdWlyeSAqLworCisJY2FsbF9zdGF0ZSA9IG1zZ2JfcHV0KG1zZywgMSk7CisJY2FsbF9zdGF0ZVswXSA9IDB4YzAgfCAweDAwOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfdHhfc2ltcGxlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkJICAgdV9pbnQ4X3QgcGRpc2MsIHVfaW50OF90IG1zZ190eXBlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKworCWdoLT5wcm90b19kaXNjciA9IHBkaXNjOworCWdoLT5tc2dfdHlwZSA9IG1zZ190eXBlOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgZ3NtNDhfc3RvcF9jY190aW1lcihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucykKK3sKKwlpZiAoYnNjX3RpbWVyX3BlbmRpbmcoJnRyYW5zLT5jYy50aW1lcikpIHsKKwkJREVCVUdQKERDQywgInN0b3BwaW5nIHBlbmRpbmcgdGltZXIgVCV4XG4iLCB0cmFucy0+Y2MuVGN1cnJlbnQpOworCQlic2NfZGVsX3RpbWVyKCZ0cmFucy0+Y2MudGltZXIpOworCQl0cmFucy0+Y2MuVGN1cnJlbnQgPSAwOworCX0KK30KKyAKK3N0YXRpYyBpbnQgbW5jY19yZWN2bXNnKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCWludCBtc2dfdHlwZSwgc3RydWN0IGdzbV9tbmNjICptbmNjKQoreworCXN0cnVjdCBtc2diICptc2c7CisKKwlpZiAodHJhbnMpCisJCWlmICh0cmFucy0+Y29ubikKKwkJCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCB0aSAleCBzdWIgJXMpICIKKwkJCQkiU2VuZGluZyAnJXMnIHRvIE1OQ0MuXG4iLAorCQkJCXRyYW5zLT5jb25uLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwKKwkJCQl0cmFucy0+Y29ubi0+bGNoYW4tPnRzLT50cngtPm5yLAorCQkJCXRyYW5zLT5jb25uLT5sY2hhbi0+dHMtPm5yLCB0cmFucy0+dHJhbnNhY3Rpb25faWQsCisJCQkJKHRyYW5zLT5zdWJzY3IpPyh0cmFucy0+c3Vic2NyLT5leHRlbnNpb24pOiItIiwKKwkJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisJCWVsc2UKKwkJCURFQlVHUChEQ0MsICIoYnRzIC0gdHJ4IC0gdHMgLSB0aSAtLSBzdWIgJXMpICIKKwkJCQkiU2VuZGluZyAnJXMnIHRvIE1OQ0MuXG4iLAorCQkJCSh0cmFucy0+c3Vic2NyKT8odHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uKToiLSIsCisJCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCWVsc2UKKwkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpIC0tIHN1YiAtKSAiCisJCQkiU2VuZGluZyAnJXMnIHRvIE1OQ0MuXG4iLCBnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisKKwltbmNjLT5tc2dfdHlwZSA9IG1zZ190eXBlOworCQorCW1zZyA9IG1zZ2JfYWxsb2Moc2l6ZW9mKHN0cnVjdCBnc21fbW5jYyksICJNTkNDIik7CisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShtc2ctPmRhdGEsIG1uY2MsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwltc2diX2VucXVldWUoJm5ldC0+dXBxdWV1ZSwgbXNnKTsKKworCXJldHVybiAwOworfQorCitpbnQgbW5jY19yZWxlYXNlX2luZChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCSAgICAgdV9pbnQzMl90IGNhbGxyZWYsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKQoreworCXN0cnVjdCBnc21fbW5jYyByZWw7CisKKwltZW1zZXQoJnJlbCwgMCwgc2l6ZW9mKHJlbCkpOworCXJlbC5jYWxscmVmID0gY2FsbHJlZjsKKwltbmNjX3NldF9jYXVzZSgmcmVsLCBsb2NhdGlvbiwgdmFsdWUpOworCXJldHVybiBtbmNjX3JlY3Ztc2cobmV0LCB0cmFucywgTU5DQ19SRUxfSU5ELCAmcmVsKTsKK30KKworLyogQ2FsbCBDb250cm9sIFNwZWNpZmljIHRyYW5zYWN0aW9uIHJlbGVhc2UuCisgKiBnZXRzIGNhbGxlZCBieSB0cmFuc19mcmVlLCBETyBOT1QgQ0FMTCBZT1VSU0VMRiEgKi8KK3ZvaWQgX2dzbTQ4X2NjX3RyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpCit7CisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwkvKiBzZW5kIHJlbGVhc2UgdG8gTDQsIGlmIGNhbGxyZWYgc3RpbGwgZXhpc3RzICovCisJaWYgKHRyYW5zLT5jYWxscmVmKSB7CisJCS8qIFJlc3NvdXJjZSB1bmF2YWlsYWJsZSAqLworCQltbmNjX3JlbGVhc2VfaW5kKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIHRyYW5zLT5jYWxscmVmLAorCQkJCSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJIEdTTTQ4X0NDX0NBVVNFX1JFU09VUkNFX1VOQVZBSUwpOworCX0KKwlpZiAodHJhbnMtPmNjLnN0YXRlICE9IEdTTV9DU1RBVEVfTlVMTCkKKwkJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX05VTEwpOworCWlmICh0cmFucy0+Y29ubikKKwkJdHJhdV9tdXhfdW5tYXAoJnRyYW5zLT5jb25uLT5sY2hhbi0+dHMtPmUxX2xpbmssIHRyYW5zLT5jYWxscmVmKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9zZXR1cChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKTsKKyAKKy8qIGNhbGwtYmFjayBmcm9tIHBhZ2luZyB0aGUgQi1lbmQgb2YgdGhlIGNvbm5lY3Rpb24gKi8KK3N0YXRpYyBpbnQgc2V0dXBfdHJpZ19wYWdfZXZ0KHVuc2lnbmVkIGludCBob29rbnVtLCB1bnNpZ25lZCBpbnQgZXZlbnQsCisJCQkgICAgICBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpfbGNoYW4sIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gX2xjaGFuOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gcGFyYW07CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnN0LCAqdG1wOworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0OworCisJaWYgKGhvb2tudW0gIT0gR1NNX0hPT0tfUlJfUEFHSU5HKQorCQlyZXR1cm4gLUVJTlZBTDsKKyAgCisJaWYgKCFzdWJzY3IpCisJCXJldHVybiAtRUlOVkFMOworCW5ldCA9IHN1YnNjci0+bmV0OworCWlmICghbmV0KSB7CisJCURFQlVHUChEQ0MsICJFcnJvciBOZXR3b3JrIG5vdCBzZXQhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogY2hlY2sgYWxsIHRyYW5hY3Rpb25zICh3aXRob3V0IGxjaGFuKSBmb3Igc3Vic2NyaWJlciAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHJhbnN0LCB0bXAsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCWlmICh0cmFuc3QtPnN1YnNjciAhPSBzdWJzY3IgfHwgdHJhbnN0LT5jb25uKQorCQkJY29udGludWU7CisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJY2FzZSBHU01fUEFHSU5HX1NVQ0NFRURFRDoKKwkJCWlmICghbGNoYW4pIC8vIHBhcmFub2lkCisJCQkJYnJlYWs7CisJCQlERUJVR1AoRENDLCAiUGFnaW5nIHN1YnNjciAlcyBzdWNjZWVkZWQhXG4iLAorCQkJCXN1YnNjci0+ZXh0ZW5zaW9uKTsKKwkJCS8qIEFzc2lnbiBsY2hhbiAqLworCQkJaWYgKCF0cmFuc3QtPmNvbm4pIHsKKwkJCQl0cmFuc3QtPmNvbm4gPSAmbGNoYW4tPmNvbm47CisJCQkJdXNlX3N1YnNjcl9jb24odHJhbnN0LT5jb25uKTsKKwkJCX0KKwkJCS8qIHNlbmQgU0VUVVAgcmVxdWVzdCB0byBjYWxsZWQgcGFydHkgKi8KKwkJCWdzbTQ4X2NjX3R4X3NldHVwKHRyYW5zdCwgJnRyYW5zdC0+Y2MubXNnKTsKKwkJCWJyZWFrOworCQljYXNlIEdTTV9QQUdJTkdfRVhQSVJFRDoKKwkJCURFQlVHUChEQ0MsICJQYWdpbmcgc3Vic2NyICVzIGV4cGlyZWQhXG4iLAorCQkJCXN1YnNjci0+ZXh0ZW5zaW9uKTsKKwkJCS8qIFRlbXBvcmFyaWx5IG91dCBvZiBvcmRlciAqLworCQkJbW5jY19yZWxlYXNlX2luZCh0cmFuc3QtPnN1YnNjci0+bmV0LCB0cmFuc3QsCisJCQkJCSB0cmFuc3QtPmNhbGxyZWYsCisJCQkJCSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJCSBHU000OF9DQ19DQVVTRV9ERVNUX09PTyk7CisJCQl0cmFuc3QtPmNhbGxyZWYgPSAwOworCQkJdHJhbnNfZnJlZSh0cmFuc3QpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGNoX3JlY3ZfbW5jYyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdV9pbnQzMl90IGNhbGxyZWYsIGludCBlbmFibGUpOworCisvKiBzb21lIG90aGVyIHBhcnQgb2YgdGhlIGNvZGUgc2VuZHMgdXMgYSBzaWduYWwgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX2FiaXNpcF9zaWduYWwodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCQkgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IHNpZ25hbF9kYXRhOworCWludCByYzsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldDsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKworCWlmIChzdWJzeXMgIT0gU1NfQUJJU0lQKQorCQlyZXR1cm4gMDsKKworCS8qIGluIGNhc2Ugd2UgdXNlIGRpcmVjdCBCVFMtdG8tQlRTIFJUUCAqLworCWlmIChpcGFjY19ydHBfZGlyZWN0KQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTX0FCSVNJUF9DUkNYX0FDSzoKKwkJLyogY2hlY2sgaWYgYW55IHRyYW5zYWN0aW9ucyBvbiB0aGlzIGxjaGFuIHN0aWxsIGhhdmUKKwkJICogYSB0Y2hfcmVjdl9tbmNjIHJlcXVlc3QgcGVuZGluZyAqLworCQluZXQgPSBsY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywgJm5ldC0+dHJhbnNfbGlzdCwgZW50cnkpIHsKKwkJCWlmICh0cmFucy0+Y29ubiAmJiB0cmFucy0+Y29ubi0+bGNoYW4gPT0gbGNoYW4gJiYgdHJhbnMtPnRjaF9yZWN2KSB7CisJCQkJREVCVUdQKERDQywgInBlbmRpbmcgdGNoX3JlY3ZfbW5jYyByZXF1ZXN0XG4iKTsKKwkJCQl0Y2hfcmVjdl9tbmNjKG5ldCwgdHJhbnMtPmNhbGxyZWYsIDEpOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBtYXAgdHdvIGlwYWNjZXNzIFJUUCBzdHJlYW1zIG9udG8gZWFjaCBvdGhlciAqLworc3RhdGljIGludCB0Y2hfbWFwKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBzdHJ1Y3QgZ3NtX2xjaGFuICpyZW1vdGVfbGNoYW4pCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGdzbV9idHMgKnJlbW90ZV9idHMgPSByZW1vdGVfbGNoYW4tPnRzLT50cngtPmJ0czsKKwlpbnQgcmM7CisKKwlERUJVR1AoRENDLCAiU2V0dGluZyB1cCBUQ0ggbWFwIGJldHdlZW4gKGJ0cz0ldSx0cng9JXUsdHM9JXUpIGFuZCAoYnRzPSV1LHRyeD0ldSx0cz0ldSlcbiIsCisJCWJ0cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgbGNoYW4tPnRzLT5uciwKKwkJcmVtb3RlX2J0cy0+bnIsIHJlbW90ZV9sY2hhbi0+dHMtPnRyeC0+bnIsIHJlbW90ZV9sY2hhbi0+dHMtPm5yKTsKKworCWlmIChidHMtPnR5cGUgIT0gcmVtb3RlX2J0cy0+dHlwZSkgeworCQlERUJVR1AoRENDLCAiQ2Fubm90IHN3aXRjaCBjYWxscyBiZXR3ZWVuIGRpZmZlcmVudCBCVFMgdHlwZXMgeWV0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLy8gdG9kbzogbWFwIGJldHdlZW4gZGlmZmVyZW50IGJ0cyB0eXBlcworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJaWYgKCFpcGFjY19ydHBfZGlyZWN0KSB7CisJCQkvKiBjb25uZWN0IHRoZSBUQ0gncyB0byBvdXIgUlRQIHByb3h5ICovCisJCQlyYyA9IHJzbF9pcGFjY19tZGN4X3RvX3J0cHNvY2sobGNoYW4pOworCQkJaWYgKHJjIDwgMCkKKwkJCQlyZXR1cm4gcmM7CisJCQlyYyA9IHJzbF9pcGFjY19tZGN4X3RvX3J0cHNvY2socmVtb3RlX2xjaGFuKTsKKyN3YXJuaW5nIGRvIHdlIG5lZWQgYSBjaGVjayBvZiByYyBoZXJlPworCisJCQkvKiBjb25uZWN0IHRoZW0gd2l0aCBlYWNoIG90aGVyICovCisJCQlydHBfc29ja2V0X3Byb3h5KGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQsCisJCQkJCSByZW1vdGVfbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCk7CisJCX0gZWxzZSB7CisJCQkvKiBkaXJlY3RseSBjb25uZWN0IFRDSCBSVFAgc3RyZWFtcyB0byBlYWNoIG90aGVyICovCisJCQlyYyA9IHJzbF9pcGFjY19tZGN4KGxjaGFuLCByZW1vdGVfbGNoYW4tPmFiaXNfaXAuYm91bmRfaXAsCisJCQkJCQlyZW1vdGVfbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCwKKwkJCQkJCXJlbW90ZV9sY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlyZXR1cm4gcmM7CisJCQlyYyA9IHJzbF9pcGFjY19tZGN4KHJlbW90ZV9sY2hhbiwgbGNoYW4tPmFiaXNfaXAuYm91bmRfaXAsCisJCQkJCQlsY2hhbi0+YWJpc19pcC5ib3VuZF9wb3J0LAorCQkJCQkJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQl0cmF1X211eF9tYXBfbGNoYW4obGNoYW4sIHJlbW90ZV9sY2hhbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChEQ0MsICJVbmtub3duIEJUUyB0eXBlICV1XG4iLCBidHMtPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogYnJpZGdlIGNoYW5uZWxzIG9mIHR3byB0cmFuc2FjdGlvbnMgKi8KK3N0YXRpYyBpbnQgdGNoX2JyaWRnZShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdV9pbnQzMl90ICpyZWZzKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zMSA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihuZXQsIHJlZnNbMF0pOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zMiA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihuZXQsIHJlZnNbMV0pOworCisJaWYgKCF0cmFuczEgfHwgIXRyYW5zMikKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIXRyYW5zMS0+Y29ubiB8fCAhdHJhbnMyLT5jb25uKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIHRocm91Z2gtY29ubmVjdCBjaGFubmVsICovCisJcmV0dXJuIHRjaF9tYXAodHJhbnMxLT5jb25uLT5sY2hhbiwgdHJhbnMyLT5jb25uLT5sY2hhbik7Cit9CisKKy8qIGVuYWJsZSByZWNlaXZlIG9mIGNoYW5uZWxzIHRvIE1OQ0MgdXBxdWV1ZSAqLworc3RhdGljIGludCB0Y2hfcmVjdl9tbmNjKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCB1X2ludDMyX3QgY2FsbHJlZiwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWludCByYzsKKworCS8qIEZpbmQgY2FsbHJlZiAqLworCXRyYW5zID0gdHJhbnNfZmluZF9ieV9jYWxscmVmKG5ldCwgY2FsbHJlZik7CisJaWYgKCF0cmFucykKKwkJcmV0dXJuIC1FSU87CisJaWYgKCF0cmFucy0+Y29ubikKKwkJcmV0dXJuIDA7CisJbGNoYW4gPSB0cmFucy0+Y29ubi0+bGNoYW47CisJYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJaWYgKGlwYWNjX3J0cF9kaXJlY3QpIHsKKwkJCURFQlVHUChEQ0MsICJFcnJvcjogUlRQIHByb3h5IGlzIGRpc2FibGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIGluIGNhc2UsIHdlIGRvbid0IGhhdmUgYSBSVFAgc29ja2V0IHlldCwgd2Ugbm90ZSB0aGlzCisJCSAqIGluIHRoZSB0cmFuc2FjdGlvbiBhbmQgdHJ5IGxhdGVyICovCisJCWlmICghbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkgeworCQkJdHJhbnMtPnRjaF9yZWN2ID0gZW5hYmxlOworCQkJREVCVUdQKERDQywgInF1ZXVlIHRjaF9yZWN2X21uY2MgcmVxdWVzdCAoJWQpXG4iLCBlbmFibGUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGVuYWJsZSkgeworCQkJLyogY29ubmVjdCB0aGUgVENIJ3MgdG8gb3VyIFJUUCBwcm94eSAqLworCQkJcmMgPSByc2xfaXBhY2NfbWRjeF90b19ydHBzb2NrKGxjaGFuKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCQkJLyogYXNzaWduIHNvY2tldCB0byBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgKi8KKwkJCXJ0cF9zb2NrZXRfdXBzdHJlYW0obGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwKKwkJCQluZXQsIGNhbGxyZWYpOworCQl9IGVsc2UKKwkJCXJ0cF9zb2NrZXRfdXBzdHJlYW0obGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwKKwkJCQluZXQsIDApOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlpZiAoZW5hYmxlKQorCQkJcmV0dXJuIHRyYXVfcmVjdl9sY2hhbihsY2hhbiwgY2FsbHJlZik7CisJCXJldHVybiB0cmF1X211eF91bm1hcChOVUxMLCBjYWxscmVmKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKERDQywgIlVua25vd24gQlRTIHR5cGUgJXVcbiIsIGJ0cy0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X3N0YXR1c19lbnEoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJREVCVUdQKERDQywgIi0+IFNUQVRVUyBFTlFcbiIpOworCXJldHVybiBnc200OF9jY190eF9zdGF0dXModHJhbnMsIG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfcmVsZWFzZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfZGlzY29ubmVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKTsKKworc3RhdGljIHZvaWQgZ3NtNDhfY2NfdGltZW91dCh2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnMgPSBhcmc7CisJaW50IGRpc2Nvbm5lY3QgPSAwLCByZWxlYXNlID0gMDsKKwlpbnQgbW9fY2F1c2UgPSBHU000OF9DQ19DQVVTRV9SRUNPVkVSWV9USU1FUjsKKwlpbnQgbW9fbG9jYXRpb24gPSBHU000OF9DQVVTRV9MT0NfVVNFUjsKKwlpbnQgbDRfY2F1c2UgPSBHU000OF9DQ19DQVVTRV9OT1JNQUxfVU5TUEVDOworCWludCBsNF9sb2NhdGlvbiA9IEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVTsKKwlzdHJ1Y3QgZ3NtX21uY2MgbW9fcmVsLCBsNF9yZWw7CisKKwltZW1zZXQoJm1vX3JlbCwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1vX3JlbC5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJbWVtc2V0KCZsNF9yZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlsNF9yZWwuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCisJc3dpdGNoKHRyYW5zLT5jYy5UY3VycmVudCkgeworCWNhc2UgMHgzMDM6CisJCXJlbGVhc2UgPSAxOworCQlsNF9jYXVzZSA9IEdTTTQ4X0NDX0NBVVNFX1VTRVJfTk9UUkVTUE9ORDsKKwkJYnJlYWs7CisJY2FzZSAweDMxMDoKKwkJZGlzY29ubmVjdCA9IDE7CisJCWw0X2NhdXNlID0gR1NNNDhfQ0NfQ0FVU0VfVVNFUl9OT1RSRVNQT05EOworCQlicmVhazsKKwljYXNlIDB4MzEzOgorCQlkaXNjb25uZWN0ID0gMTsKKwkJLyogdW5rbm93biwgZGlkIG5vdCBmaW5kIGl0IGluIHRoZSBzcGVjcyAqLworCQlicmVhazsKKwljYXNlIDB4MzAxOgorCQlkaXNjb25uZWN0ID0gMTsKKwkJbDRfY2F1c2UgPSBHU000OF9DQ19DQVVTRV9VU0VSX05PVFJFU1BPTkQ7CisJCWJyZWFrOworCWNhc2UgMHgzMDg6CisJCWlmICghdHJhbnMtPmNjLlQzMDhfc2Vjb25kKSB7CisJCQkvKiByZXN0YXJ0IFQzMDggYSBzZWNvbmQgdGltZSAqLworCQkJZ3NtNDhfY2NfdHhfcmVsZWFzZSh0cmFucywgJnRyYW5zLT5jYy5tc2cpOworCQkJdHJhbnMtPmNjLlQzMDhfc2Vjb25kID0gMTsKKwkJCWJyZWFrOyAvKiBzdGF5IGluIHJlbGVhc2Ugc3RhdGUgKi8KKwkJfQorCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJcmV0dXJuOworLy8JCXJlbGVhc2UgPSAxOworLy8JCWw0X2NhdXNlID0gMTQ7CisvLwkJYnJlYWs7CisJY2FzZSAweDMwNjoKKwkJcmVsZWFzZSA9IDE7CisJCW1vX2NhdXNlID0gdHJhbnMtPmNjLm1zZy5jYXVzZS52YWx1ZTsKKwkJbW9fbG9jYXRpb24gPSB0cmFucy0+Y2MubXNnLmNhdXNlLmxvY2F0aW9uOworCQlicmVhazsKKwljYXNlIDB4MzIzOgorCQlkaXNjb25uZWN0ID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVsZWFzZSA9IDE7CisJfQorCisJaWYgKHJlbGVhc2UgJiYgdHJhbnMtPmNhbGxyZWYpIHsKKwkJLyogcHJvY2VzcyByZWxlYXNlIHRvd2FyZHMgbGF5ZXIgNCAqLworCQltbmNjX3JlbGVhc2VfaW5kKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIHRyYW5zLT5jYWxscmVmLAorCQkJCSBsNF9sb2NhdGlvbiwgbDRfY2F1c2UpOworCQl0cmFucy0+Y2FsbHJlZiA9IDA7CisJfQorCisJaWYgKGRpc2Nvbm5lY3QgJiYgdHJhbnMtPmNhbGxyZWYpIHsKKwkJLyogcHJvY2VzcyBkaXNjb25uZWN0IHRvd2FyZHMgbGF5ZXIgNCAqLworCQltbmNjX3NldF9jYXVzZSgmbDRfcmVsLCBsNF9sb2NhdGlvbiwgbDRfY2F1c2UpOworCQltbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19ESVNDX0lORCwgJmw0X3JlbCk7CisJfQorCisJLyogcHJvY2VzcyBkaXNjb25uZWN0IHRvd2FyZHMgbW9iaWxlIHN0YXRpb24gKi8KKwlpZiAoZGlzY29ubmVjdCB8fCByZWxlYXNlKSB7CisJCW1uY2Nfc2V0X2NhdXNlKCZtb19yZWwsIG1vX2xvY2F0aW9uLCBtb19jYXVzZSk7CisJCW1vX3JlbC5jYXVzZS5kaWFnWzBdID0gKCh0cmFucy0+Y2MuVGN1cnJlbnQgJiAweGYwMCkgPj4gOCkgKyAnMCc7CisJCW1vX3JlbC5jYXVzZS5kaWFnWzFdID0gKCh0cmFucy0+Y2MuVGN1cnJlbnQgJiAweDBmMCkgPj4gNCkgKyAnMCc7CisJCW1vX3JlbC5jYXVzZS5kaWFnWzJdID0gKHRyYW5zLT5jYy5UY3VycmVudCAmIDB4MDBmKSArICcwJzsKKwkJbW9fcmVsLmNhdXNlLmRpYWdfbGVuID0gMzsKKworCQlpZiAoZGlzY29ubmVjdCkKKwkJCWdzbTQ4X2NjX3R4X2Rpc2Nvbm5lY3QodHJhbnMsICZtb19yZWwpOworCQlpZiAocmVsZWFzZSkKKwkJCWdzbTQ4X2NjX3R4X3JlbGVhc2UodHJhbnMsICZtb19yZWwpOworCX0KKworfQorCitzdGF0aWMgdm9pZCBnc200OF9zdGFydF9jY190aW1lcihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgaW50IGN1cnJlbnQsCisJCQkJIGludCBzZWMsIGludCBtaWNybykKK3sKKwlERUJVR1AoRENDLCAic3RhcnRpbmcgdGltZXIgVCV4IHdpdGggJWQgc2Vjb25kc1xuIiwgY3VycmVudCwgc2VjKTsKKwl0cmFucy0+Y2MudGltZXIuY2IgPSBnc200OF9jY190aW1lb3V0OworCXRyYW5zLT5jYy50aW1lci5kYXRhID0gdHJhbnM7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZ0cmFucy0+Y2MudGltZXIsIHNlYywgbWljcm8pOworCXRyYW5zLT5jYy5UY3VycmVudCA9IGN1cnJlbnQ7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2Nfcnhfc2V0dXAoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSBnaC0+bXNnX3R5cGUgJiAweGJmOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBzZXR1cDsKKworCW1lbXNldCgmc2V0dXAsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlzZXR1cC5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgMCwgMCk7CisJLyogZW1lcmdlbmN5IHNldHVwIGlzIGlkZW50aWZpZWQgYnkgbXNnX3R5cGUgKi8KKwlpZiAobXNnX3R5cGUgPT0gR1NNNDhfTVRfQ0NfRU1FUkdfU0VUVVApCisJCXNldHVwLmVtZXJnZW5jeSA9IDE7CisKKwkvKiB1c2Ugc3Vic2NyaWJlciBhcyBjYWxsaW5nIHBhcnR5IG51bWJlciAqLworCWlmICh0cmFucy0+c3Vic2NyKSB7CisJCXNldHVwLmZpZWxkcyB8PSBNTkNDX0ZfQ0FMTElORzsKKwkJc3RybmNweShzZXR1cC5jYWxsaW5nLm51bWJlciwgdHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uLAorCQkJc2l6ZW9mKHNldHVwLmNhbGxpbmcubnVtYmVyKS0xKTsKKwkJc3RybmNweShzZXR1cC5pbXNpLCB0cmFucy0+c3Vic2NyLT5pbXNpLAorCQkJc2l6ZW9mKHNldHVwLmltc2kpLTEpOworCX0KKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX0JFQVJFUl9DQVA7CisJCWdzbTQ4X2RlY29kZV9iZWFyZXJfY2FwKCZzZXR1cC5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisJLyogZmFjaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpKSB7CisJCXNldHVwLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmc2V0dXAuZmFjaWxpdHksCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9GQUNJTElUWSktMSk7CisJfQorCS8qIGNhbGxlZCBwYXJ0eSBiY2QgbnVtYmVyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBTExFRF9CQ0QpKSB7CisJCXNldHVwLmZpZWxkcyB8PSBNTkNDX0ZfQ0FMTEVEOworCQlnc200OF9kZWNvZGVfY2FsbGVkKCZzZXR1cC5jYWxsZWQsCisJCQkgICAgICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0NBTExFRF9CQ0QpLTEpOworCX0KKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX1VTRVJVU0VSOworCQlnc200OF9kZWNvZGVfdXNlcnVzZXIoJnNldHVwLnVzZXJ1c2VyLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKS0xKTsKKwl9CisJLyogc3MtdmVyc2lvbiAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9TU19WRVJTKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX1NTVkVSU0lPTjsKKwkJZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbigmc2V0dXAuc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKwkvKiBDTElSIHN1cHByZXNzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NMSVJfU1VQUCkpCisJCXNldHVwLmNsaXIuc3VwID0gMTsKKwkvKiBDTElSIGludm9jYXRpb24gKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0xJUl9JTlZPQykpCisJCXNldHVwLmNsaXIuaW52ID0gMTsKKwkvKiBjYyBjYXAgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0NfQ0FQKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX0NDQ0FQOworCQlnc200OF9kZWNvZGVfY2NjYXAoJnNldHVwLmNjY2FwLAorCQkJICAgICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0NDX0NBUCktMSk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0lOSVRJQVRFRCk7CisKKwlMT0dQKERDQywgTE9HTF9JTkZPLCAiU3Vic2NyaWJlciAlcyAoJXMpIHNlbmRzIFNFVFVQIHRvICVzXG4iLAorCSAgICAgc3Vic2NyX25hbWUodHJhbnMtPnN1YnNjciksIHRyYW5zLT5zdWJzY3ItPmV4dGVuc2lvbiwKKwkgICAgIHNldHVwLmNhbGxlZC5udW1iZXIpOworCisJLyogaW5kaWNhdGUgc2V0dXAgdG8gTU5DQyAqLworCW1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX1NFVFVQX0lORCwgJnNldHVwKTsKKworCS8qIE1OQ0MgY29kZSB3aWxsIG1vZGlmeSB0aGUgY2hhbm5lbCBhc3luY2hyb25vdXNseSwgd2Ugc2hvdWxkCisJICogaXBhY2Nlc3MtYmluZCBvbmx5IGFmdGVyIHRoZSBtb2RpZmljYXRpb24gaGFzIGJlZW4gbWFkZSB0byB0aGUKKwkgKiBsY2hhbi0+dGNoX21vZGUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9zZXR1cChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJc3RydWN0IGdzbV9tbmNjICpzZXR1cCA9IGFyZzsKKwlpbnQgcmMsIHRyYW5zX2lkOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCS8qIHRyYW5zYWN0aW9uIGlkIG11c3Qgbm90IGJlIGFzc2lnbmVkICovCisJaWYgKHRyYW5zLT50cmFuc2FjdGlvbl9pZCAhPSAweGZmKSB7IC8qIHVuYXNzc2lnbmVkICovCisJCURFQlVHUChEQ0MsICJUWCBTZXR1cCB3aXRoIGFzc2lnbmVkIHRyYW5zYWN0aW9uLiAiCisJCQkiVGhpcyBpcyBub3QgYWxsb3dlZCFcbiIpOworCQkvKiBUZW1wb3JhcmlseSBvdXQgb2Ygb3JkZXIgKi8KKwkJcmMgPSBtbmNjX3JlbGVhc2VfaW5kKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIHRyYW5zLT5jYWxscmVmLAorCQkJCSAgICAgIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkgICAgICBHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMKTsKKwkJdHJhbnMtPmNhbGxyZWYgPSAwOworCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJcmV0dXJuIHJjOworCX0KKwkKKwkvKiBHZXQgZnJlZSB0cmFuc2FjdGlvbl9pZCAqLworCXRyYW5zX2lkID0gdHJhbnNfYXNzaWduX3RyYW5zX2lkKHRyYW5zLT5zdWJzY3IsIEdTTTQ4X1BESVNDX0NDLCAwKTsKKwlpZiAodHJhbnNfaWQgPCAwKSB7CisJCS8qIG5vIGZyZWUgdHJhbnNhY3Rpb24gSUQgKi8KKwkJcmMgPSBtbmNjX3JlbGVhc2VfaW5kKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIHRyYW5zLT5jYWxscmVmLAorCQkJCSAgICAgIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkgICAgICBHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMKTsKKwkJdHJhbnMtPmNhbGxyZWYgPSAwOworCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJcmV0dXJuIHJjOworCX0KKwl0cmFucy0+dHJhbnNhY3Rpb25faWQgPSB0cmFuc19pZDsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1NFVFVQOworCisJZ3NtNDhfc3RhcnRfY2NfdGltZXIodHJhbnMsIDB4MzAzLCBHU000OF9UMzAzKTsKKworCS8qIGJlYXJlciBjYXBhYmlsaXR5ICovCisJaWYgKHNldHVwLT5maWVsZHMgJiBNTkNDX0ZfQkVBUkVSX0NBUCkKKwkJZ3NtNDhfZW5jb2RlX2JlYXJlcl9jYXAobXNnLCAwLCAmc2V0dXAtPmJlYXJlcl9jYXApOworCS8qIGZhY2lsaXR5ICovCisJaWYgKHNldHVwLT5maWVsZHMgJiBNTkNDX0ZfRkFDSUxJVFkpCisJCWdzbTQ4X2VuY29kZV9mYWNpbGl0eShtc2csIDAsICZzZXR1cC0+ZmFjaWxpdHkpOworCS8qIHByb2dyZXNzICovCisJaWYgKHNldHVwLT5maWVsZHMgJiBNTkNDX0ZfUFJPR1JFU1MpCisJCWdzbTQ4X2VuY29kZV9wcm9ncmVzcyhtc2csIDAsICZzZXR1cC0+cHJvZ3Jlc3MpOworCS8qIGNhbGxpbmcgcGFydHkgQkNEIG51bWJlciAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX0NBTExJTkcpCisJCWdzbTQ4X2VuY29kZV9jYWxsaW5nKG1zZywgJnNldHVwLT5jYWxsaW5nKTsKKwkvKiBjYWxsZWQgcGFydHkgQkNEIG51bWJlciAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX0NBTExFRCkKKwkJZ3NtNDhfZW5jb2RlX2NhbGxlZChtc2csICZzZXR1cC0+Y2FsbGVkKTsKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoc2V0dXAtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJnNldHVwLT51c2VydXNlcik7CisJLyogcmVkaXJlY3RpbmcgcGFydHkgQkNEIG51bWJlciAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX1JFRElSRUNUSU5HKQorCQlnc200OF9lbmNvZGVfcmVkaXJlY3RpbmcobXNnLCAmc2V0dXAtPnJlZGlyZWN0aW5nKTsKKwkvKiBzaWduYWwgKi8KKwlpZiAoc2V0dXAtPmZpZWxkcyAmIE1OQ0NfRl9TSUdOQUwpCisJCWdzbTQ4X2VuY29kZV9zaWduYWwobXNnLCBzZXR1cC0+c2lnbmFsKTsKKwkKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQ0FMTF9QUkVTRU5UKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2NhbGxfY29uZihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgY2FsbF9jb25mOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisJZ3NtNDhfc3RhcnRfY2NfdGltZXIodHJhbnMsIDB4MzEwLCBHU000OF9UMzEwKTsKKworCW1lbXNldCgmY2FsbF9jb25mLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJY2FsbF9jb25mLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKyNpZiAwCisJLyogcmVwZWF0ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1JFUEVBVF9DSVIpKQorCQljYWxsX2NvbmYucmVwZWF0ID0gMTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfUkVQRUFUX1NFUSkpCisJCWNhbGxfY29uZi5yZXBlYXQgPSAyOworI2VuZGlmCisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCkpIHsKKwkJY2FsbF9jb25mLmZpZWxkcyB8PSBNTkNDX0ZfQkVBUkVSX0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2JlYXJlcl9jYXAoJmNhbGxfY29uZi5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisJLyogY2F1c2UgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpKSB7CisJCWNhbGxfY29uZi5maWVsZHMgfD0gTU5DQ19GX0NBVVNFOworCQlnc200OF9kZWNvZGVfY2F1c2UoJmNhbGxfY29uZi5jYXVzZSwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQVVTRSktMSk7CisJfQorCS8qIGNjIGNhcCAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9DQ19DQVApKSB7CisJCWNhbGxfY29uZi5maWVsZHMgfD0gTU5DQ19GX0NDQ0FQOworCQlnc200OF9kZWNvZGVfY2NjYXAoJmNhbGxfY29uZi5jY2NhcCwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQ19DQVApLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9NT19URVJNX0NBTExfQ09ORik7CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfQ0FMTF9DT05GX0lORCwKKwkJCSAgICAmY2FsbF9jb25mKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9jYWxsX3Byb2Moc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnByb2NlZWRpbmcgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfQ0FMTF9QUk9DOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX01PX0NBTExfUFJPQyk7CisKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWlmIChwcm9jZWVkaW5nLT5maWVsZHMgJiBNTkNDX0ZfQkVBUkVSX0NBUCkKKwkJZ3NtNDhfZW5jb2RlX2JlYXJlcl9jYXAobXNnLCAwLCAmcHJvY2VlZGluZy0+YmVhcmVyX2NhcCk7CisJLyogZmFjaWxpdHkgKi8KKwlpZiAocHJvY2VlZGluZy0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmcHJvY2VlZGluZy0+ZmFjaWxpdHkpOworCS8qIHByb2dyZXNzICovCisJaWYgKHByb2NlZWRpbmctPmZpZWxkcyAmIE1OQ0NfRl9QUk9HUkVTUykKKwkJZ3NtNDhfZW5jb2RlX3Byb2dyZXNzKG1zZywgMCwgJnByb2NlZWRpbmctPnByb2dyZXNzKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2FsZXJ0aW5nKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBhbGVydGluZzsKKwkKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKwlnc200OF9zdGFydF9jY190aW1lcih0cmFucywgMHgzMDEsIEdTTTQ4X1QzMDEpOworCisJbWVtc2V0KCZhbGVydGluZywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWFsZXJ0aW5nLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJYWxlcnRpbmcuZmllbGRzIHw9IE1OQ0NfRl9GQUNJTElUWTsKKwkJZ3NtNDhfZGVjb2RlX2ZhY2lsaXR5KCZhbGVydGluZy5mYWNpbGl0eSwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKS0xKTsKKwl9CisKKwkvKiBwcm9ncmVzcyAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9QUk9HUl9JTkQpKSB7CisJCWFsZXJ0aW5nLmZpZWxkcyB8PSBNTkNDX0ZfUFJPR1JFU1M7CisJCWdzbTQ4X2RlY29kZV9wcm9ncmVzcygmYWxlcnRpbmcucHJvZ3Jlc3MsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9QUk9HUl9JTkQpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCWFsZXJ0aW5nLmZpZWxkcyB8PSBNTkNDX0ZfU1NWRVJTSU9OOworCQlnc200OF9kZWNvZGVfc3N2ZXJzaW9uKCZhbGVydGluZy5zc3ZlcnNpb24sCisJCQkJIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfU1NfVkVSUyktMSk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0NBTExfUkVDRUlWRUQpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX0FMRVJUX0lORCwKKwkJCSAgICAmYWxlcnRpbmcpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X2FsZXJ0aW5nKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICphbGVydGluZyA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19BTEVSVElORzsKKworCS8qIGZhY2lsaXR5ICovCisJaWYgKGFsZXJ0aW5nLT5maWVsZHMgJiBNTkNDX0ZfRkFDSUxJVFkpCisJCWdzbTQ4X2VuY29kZV9mYWNpbGl0eShtc2csIDAsICZhbGVydGluZy0+ZmFjaWxpdHkpOworCS8qIHByb2dyZXNzICovCisJaWYgKGFsZXJ0aW5nLT5maWVsZHMgJiBNTkNDX0ZfUFJPR1JFU1MpCisJCWdzbTQ4X2VuY29kZV9wcm9ncmVzcyhtc2csIDAsICZhbGVydGluZy0+cHJvZ3Jlc3MpOworCS8qIHVzZXItdXNlciAqLworCWlmIChhbGVydGluZy0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAwLCAmYWxlcnRpbmctPnVzZXJ1c2VyKTsKKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9DQUxMX0RFTElWRVJFRCk7CisJCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfcHJvZ3Jlc3Moc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnByb2dyZXNzID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1BST0dSRVNTOworCisJLyogcHJvZ3Jlc3MgKi8KKwlnc200OF9lbmNvZGVfcHJvZ3Jlc3MobXNnLCAxLCAmcHJvZ3Jlc3MtPnByb2dyZXNzKTsKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAocHJvZ3Jlc3MtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJnByb2dyZXNzLT51c2VydXNlcik7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9jb25uZWN0KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpjb25uZWN0ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0NPTk5FQ1Q7CisKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKwlnc200OF9zdGFydF9jY190aW1lcih0cmFucywgMHgzMTMsIEdTTTQ4X1QzMTMpOworCisJLyogZmFjaWxpdHkgKi8KKwlpZiAoY29ubmVjdC0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmY29ubmVjdC0+ZmFjaWxpdHkpOworCS8qIHByb2dyZXNzICovCisJaWYgKGNvbm5lY3QtPmZpZWxkcyAmIE1OQ0NfRl9QUk9HUkVTUykKKwkJZ3NtNDhfZW5jb2RlX3Byb2dyZXNzKG1zZywgMCwgJmNvbm5lY3QtPnByb2dyZXNzKTsKKwkvKiBjb25uZWN0ZWQgbnVtYmVyICovCisJaWYgKGNvbm5lY3QtPmZpZWxkcyAmIE1OQ0NfRl9DT05ORUNURUQpCisJCWdzbTQ4X2VuY29kZV9jb25uZWN0ZWQobXNnLCAmY29ubmVjdC0+Y29ubmVjdGVkKTsKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoY29ubmVjdC0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAwLCAmY29ubmVjdC0+dXNlcnVzZXIpOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0NPTk5FQ1RfSU5EKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2Nvbm5lY3Qoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIGNvbm5lY3Q7CisKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKworCW1lbXNldCgmY29ubmVjdCwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWNvbm5lY3QuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIDAsIDApOworCS8qIHVzZSBzdWJzY3JpYmVyIGFzIGNvbm5lY3RlZCBwYXJ0eSBudW1iZXIgKi8KKwlpZiAodHJhbnMtPnN1YnNjcikgeworCQljb25uZWN0LmZpZWxkcyB8PSBNTkNDX0ZfQ09OTkVDVEVEOworCQlzdHJuY3B5KGNvbm5lY3QuY29ubmVjdGVkLm51bWJlciwgdHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uLAorCQkJc2l6ZW9mKGNvbm5lY3QuY29ubmVjdGVkLm51bWJlciktMSk7CisJCXN0cm5jcHkoY29ubmVjdC5pbXNpLCB0cmFucy0+c3Vic2NyLT5pbXNpLAorCQkJc2l6ZW9mKGNvbm5lY3QuaW1zaSktMSk7CisJfQorCS8qIGZhY2lsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKSkgeworCQljb25uZWN0LmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmY29ubmVjdC5mYWNpbGl0eSwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKS0xKTsKKwl9CisJLyogdXNlci11c2VyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUikpIHsKKwkJY29ubmVjdC5maWVsZHMgfD0gTU5DQ19GX1VTRVJVU0VSOworCQlnc200OF9kZWNvZGVfdXNlcnVzZXIoJmNvbm5lY3QudXNlcnVzZXIsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCWNvbm5lY3QuZmllbGRzIHw9IE1OQ0NfRl9TU1ZFUlNJT047CisJCWdzbTQ4X2RlY29kZV9zc3ZlcnNpb24oJmNvbm5lY3Quc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9DT05ORUNUX1JFUVVFU1QpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX1NFVFVQX0NORiwgJmNvbm5lY3QpOworfQorCisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfY29ubmVjdF9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9tbmNjIGNvbm5lY3RfYWNrOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQUNUSVZFKTsKKwkKKwltZW1zZXQoJmNvbm5lY3RfYWNrLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJY29ubmVjdF9hY2suY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19TRVRVUF9DT01QTF9JTkQsCisJCQkgICAgJmNvbm5lY3RfYWNrKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9jb25uZWN0X2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0NPTk5FQ1RfQUNLOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0FDVElWRSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9kaXNjb25uZWN0KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBkaXNjOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfRElTQ09OTkVDVF9SRVEpOworCisJbWVtc2V0KCZkaXNjLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJZGlzYy5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfQ0FVU0UsIDApOworCS8qIGNhdXNlICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBVVNFKSkgeworCQlkaXNjLmZpZWxkcyB8PSBNTkNDX0ZfQ0FVU0U7CisJCWdzbTQ4X2RlY29kZV9jYXVzZSgmZGlzYy5jYXVzZSwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQVVTRSktMSk7CisJfQorCS8qIGZhY2lsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKSkgeworCQlkaXNjLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmZGlzYy5mYWNpbGl0eSwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKS0xKTsKKwl9CisJLyogdXNlci11c2VyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUikpIHsKKwkJZGlzYy5maWVsZHMgfD0gTU5DQ19GX1VTRVJVU0VSOworCQlnc200OF9kZWNvZGVfdXNlcnVzZXIoJmRpc2MudXNlcnVzZXIsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCWRpc2MuZmllbGRzIHw9IE1OQ0NfRl9TU1ZFUlNJT047CisJCWdzbTQ4X2RlY29kZV9zc3ZlcnNpb24oJmRpc2Muc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19ESVNDX0lORCwgJmRpc2MpOworCit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX21uY2NfY2F1c2UgZGVmYXVsdF9jYXVzZSA9IHsKKwkubG9jYXRpb24JPSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJLmNvZGluZwkJPSAwLAorCS5yZWMJCT0gMCwKKwkucmVjX3ZhbAk9IDAsCisJLnZhbHVlCQk9IEdTTTQ4X0NDX0NBVVNFX05PUk1BTF9VTlNQRUMsCisJLmRpYWdfbGVuCT0gMCwKKwkuZGlhZwkJPSB7IDAgfSwKK307CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfZGlzY29ubmVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqZGlzYyA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19ESVNDT05ORUNUOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisJZ3NtNDhfc3RhcnRfY2NfdGltZXIodHJhbnMsIDB4MzA2LCBHU000OF9UMzA2KTsKKworCS8qIGNhdXNlICovCisJaWYgKGRpc2MtPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJmRpc2MtPmNhdXNlKTsKKwllbHNlCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZkZWZhdWx0X2NhdXNlKTsKKworCS8qIGZhY2lsaXR5ICovCisJaWYgKGRpc2MtPmZpZWxkcyAmIE1OQ0NfRl9GQUNJTElUWSkKKwkJZ3NtNDhfZW5jb2RlX2ZhY2lsaXR5KG1zZywgMCwgJmRpc2MtPmZhY2lsaXR5KTsKKwkvKiBwcm9ncmVzcyAqLworCWlmIChkaXNjLT5maWVsZHMgJiBNTkNDX0ZfUFJPR1JFU1MpCisJCWdzbTQ4X2VuY29kZV9wcm9ncmVzcyhtc2csIDAsICZkaXNjLT5wcm9ncmVzcyk7CisJLyogdXNlci11c2VyICovCisJaWYgKGRpc2MtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJmRpc2MtPnVzZXJ1c2VyKTsKKworCS8qIHN0b3JlIGRpc2Nvbm5lY3QgY2F1c2UgZm9yIFQzMDYgZXhwaXJ5ICovCisJbWVtY3B5KCZ0cmFucy0+Y2MubXNnLCBkaXNjLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfRElTQ09OTkVDVF9JTkQpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfcmVsZWFzZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgcmVsOworCWludCByYzsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJbWVtc2V0KCZyZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlyZWwuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIDAsIDApOworCS8qIGNhdXNlICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBVVNFKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9DQVVTRTsKKwkJZ3NtNDhfZGVjb2RlX2NhdXNlKCZyZWwuY2F1c2UsCisJCQkgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpLTEpOworCX0KKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJcmVsLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmcmVsLmZhY2lsaXR5LAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpLTEpOworCX0KKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZyZWwudXNlcnVzZXIsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCXJlbC5maWVsZHMgfD0gTU5DQ19GX1NTVkVSU0lPTjsKKwkJZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbigmcmVsLnNzdmVyc2lvbiwKKwkJCQkgVExWUF9WQUwoJnRwLCBHU000OF9JRV9TU19WRVJTKS0xKTsKKwl9CisKKwlpZiAodHJhbnMtPmNjLnN0YXRlID09IEdTTV9DU1RBVEVfUkVMRUFTRV9SRVEpIHsKKwkJLyogcmVsZWFzZSBjb2xsaXNpb24gNS40LjUgKi8KKwkJcmMgPSBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19SRUxfQ05GLCAmcmVsKTsKKwl9IGVsc2UgeworCQlyYyA9IGdzbTQ4X3R4X3NpbXBsZShtc2ctPmxjaGFuLAorCQkJCSAgICAgR1NNNDhfUERJU0NfQ0MgfCAodHJhbnMtPnRyYW5zYWN0aW9uX2lkIDw8IDQpLAorCQkJCSAgICAgR1NNNDhfTVRfQ0NfUkVMRUFTRV9DT01QTCk7CisJCXJjID0gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfUkVMX0lORCwgJnJlbCk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX05VTEwpOworCisJdHJhbnMtPmNhbGxyZWYgPSAwOworCXRyYW5zX2ZyZWUodHJhbnMpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3JlbGVhc2Uoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnJlbCA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19SRUxFQVNFOworCisJdHJhbnMtPmNhbGxyZWYgPSAwOworCQorCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCWdzbTQ4X3N0YXJ0X2NjX3RpbWVyKHRyYW5zLCAweDMwOCwgR1NNNDhfVDMwOCk7CisKKwkvKiBjYXVzZSAqLworCWlmIChyZWwtPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMCwgJnJlbC0+Y2F1c2UpOworCS8qIGZhY2lsaXR5ICovCisJaWYgKHJlbC0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmcmVsLT5mYWNpbGl0eSk7CisJLyogdXNlci11c2VyICovCisJaWYgKHJlbC0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAwLCAmcmVsLT51c2VydXNlcik7CisKKwl0cmFucy0+Y2MuVDMwOF9zZWNvbmQgPSAwOworCW1lbWNweSgmdHJhbnMtPmNjLm1zZywgcmVsLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisKKwlpZiAodHJhbnMtPmNjLnN0YXRlICE9IEdTTV9DU1RBVEVfUkVMRUFTRV9SRVEpCisJCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9SRUxFQVNFX1JFUSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9yZWxlYXNlX2NvbXBsKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyByZWw7CisJaW50IHJjID0gMDsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJbWVtc2V0KCZyZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlyZWwuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIDAsIDApOworCS8qIGNhdXNlICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBVVNFKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9DQVVTRTsKKwkJZ3NtNDhfZGVjb2RlX2NhdXNlKCZyZWwuY2F1c2UsCisJCQkgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpLTEpOworCX0KKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJcmVsLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmcmVsLmZhY2lsaXR5LAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpLTEpOworCX0KKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZyZWwudXNlcnVzZXIsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCXJlbC5maWVsZHMgfD0gTU5DQ19GX1NTVkVSU0lPTjsKKwkJZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbigmcmVsLnNzdmVyc2lvbiwKKwkJCQkgVExWUF9WQUwoJnRwLCBHU000OF9JRV9TU19WRVJTKS0xKTsKKwl9CisKKwlpZiAodHJhbnMtPmNhbGxyZWYpIHsKKwkJc3dpdGNoICh0cmFucy0+Y2Muc3RhdGUpIHsKKwkJY2FzZSBHU01fQ1NUQVRFX0NBTExfUFJFU0VOVDoKKwkJCXJjID0gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsCisJCQkJCSAgTU5DQ19SRUpfSU5ELCAmcmVsKTsKKwkJCWJyZWFrOworCQljYXNlIEdTTV9DU1RBVEVfUkVMRUFTRV9SRVE6CisJCQlyYyA9IG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLAorCQkJCQkgIE1OQ0NfUkVMX0NORiwgJnJlbCk7CisJCQkvKiBGSVhNRTogaW4gY2FzZSBvZiBtdWx0aXBsZSBjYWxscywgd2UgY2FuJ3Qgc2ltcGx5CisJCQkgKiBoYW5nIHVwIGhlcmUgISAqLworCQkJbGNoYW5fYXV0b19yZWxlYXNlKG1zZy0+bGNoYW4pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyYyA9IG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLAorCQkJCQkgIE1OQ0NfUkVMX0lORCwgJnJlbCk7CisJCX0KKwl9CisKKwl0cmFucy0+Y2FsbHJlZiA9IDA7CisJdHJhbnNfZnJlZSh0cmFucyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfcmVsZWFzZV9jb21wbChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqcmVsID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1JFTEVBU0VfQ09NUEw7CisKKwl0cmFucy0+Y2FsbHJlZiA9IDA7CisJCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwkvKiBjYXVzZSAqLworCWlmIChyZWwtPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMCwgJnJlbC0+Y2F1c2UpOworCS8qIGZhY2lsaXR5ICovCisJaWYgKHJlbC0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmcmVsLT5mYWNpbGl0eSk7CisJLyogdXNlci11c2VyICovCisJaWYgKHJlbC0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAwLCAmcmVsLT51c2VydXNlcik7CisKKwl0cmFuc19mcmVlKHRyYW5zKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2ZhY2lsaXR5KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBmYWM7CisKKwltZW1zZXQoJmZhYywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWZhYy5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfRkFDSUxJVFksIDApOworCS8qIGZhY2lsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKSkgeworCQlmYWMuZmllbGRzIHw9IE1OQ0NfRl9GQUNJTElUWTsKKwkJZ3NtNDhfZGVjb2RlX2ZhY2lsaXR5KCZmYWMuZmFjaWxpdHksCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9GQUNJTElUWSktMSk7CisJfQorCS8qIHNzLXZlcnNpb24gKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfU1NfVkVSUykpIHsKKwkJZmFjLmZpZWxkcyB8PSBNTkNDX0ZfU1NWRVJTSU9OOworCQlnc200OF9kZWNvZGVfc3N2ZXJzaW9uKCZmYWMuc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19GQUNJTElUWV9JTkQsICZmYWMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X2ZhY2lsaXR5KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpmYWMgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfRkFDSUxJVFk7CisKKwkvKiBmYWNpbGl0eSAqLworCWdzbTQ4X2VuY29kZV9mYWNpbGl0eShtc2csIDEsICZmYWMtPmZhY2lsaXR5KTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2hvbGQoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9tbmNjIGhvbGQ7CisKKwltZW1zZXQoJmhvbGQsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlob2xkLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfSE9MRF9JTkQsICZob2xkKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9ob2xkX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0hPTERfQUNLOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfaG9sZF9yZWooc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKmhvbGRfcmVqID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0hPTERfUkVKOworCisJLyogY2F1c2UgKi8KKwlpZiAoaG9sZF9yZWotPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJmhvbGRfcmVqLT5jYXVzZSk7CisJZWxzZQorCQlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmZGVmYXVsdF9jYXVzZSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9yZXRyaWV2ZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgcmV0cmlldmU7CisKKwltZW1zZXQoJnJldHJpZXZlLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJcmV0cmlldmUuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19SRVRSSUVWRV9JTkQsCisJCQkgICAgJnJldHJpZXZlKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9yZXRyaWV2ZV9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19SRVRSX0FDSzsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3JldHJpZXZlX3JlaihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqcmV0cmlldmVfcmVqID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1JFVFJfUkVKOworCisJLyogY2F1c2UgKi8KKwlpZiAocmV0cmlldmVfcmVqLT5maWVsZHMgJiBNTkNDX0ZfQ0FVU0UpCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZyZXRyaWV2ZV9yZWotPmNhdXNlKTsKKwllbHNlCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZkZWZhdWx0X2NhdXNlKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X3N0YXJ0X2R0bWYoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIGR0bWY7CisKKwltZW1zZXQoJmR0bWYsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlkdG1mLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKwkvKiBrZXlwYWQgZmFjaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfS1BEX0ZBQ0lMSVRZKSkgeworCQlkdG1mLmZpZWxkcyB8PSBNTkNDX0ZfS0VZUEFEOworCQlnc200OF9kZWNvZGVfa2V5cGFkKCZkdG1mLmtleXBhZCwKKwkJCSAgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfS1BEX0ZBQ0lMSVRZKS0xKTsKKwl9CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfU1RBUlRfRFRNRl9JTkQsICZkdG1mKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9zdGFydF9kdG1mX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqZHRtZiA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19TVEFSVF9EVE1GX0FDSzsKKworCS8qIGtleXBhZCAqLworCWlmIChkdG1mLT5maWVsZHMgJiBNTkNDX0ZfS0VZUEFEKQorCQlnc200OF9lbmNvZGVfa2V5cGFkKG1zZywgZHRtZi0+a2V5cGFkKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3N0YXJ0X2R0bWZfcmVqKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpkdG1mID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1NUQVJUX0RUTUZfUkVKOworCisJLyogY2F1c2UgKi8KKwlpZiAoZHRtZi0+ZmllbGRzICYgTU5DQ19GX0NBVVNFKQorCQlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmZHRtZi0+Y2F1c2UpOworCWVsc2UKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJmRlZmF1bHRfY2F1c2UpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfc3RvcF9kdG1mX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1NUT1BfRFRNRl9BQ0s7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9zdG9wX2R0bWYoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9tbmNjIGR0bWY7CisKKwltZW1zZXQoJmR0bWYsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlkdG1mLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19TVE9QX0RUTUZfSU5ELCAmZHRtZik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfbW9kaWZ5KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBtb2RpZnk7CisKKwltZW1zZXQoJm1vZGlmeSwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1vZGlmeS5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfQkVBUkVSX0NBUCwgMCk7CisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCkpIHsKKwkJbW9kaWZ5LmZpZWxkcyB8PSBNTkNDX0ZfQkVBUkVSX0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2JlYXJlcl9jYXAoJm1vZGlmeS5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfTU9fT1JJR19NT0RJRlkpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX01PRElGWV9JTkQsICZtb2RpZnkpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X21vZGlmeShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbW9kaWZ5ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX01PRElGWTsKKworCWdzbTQ4X3N0YXJ0X2NjX3RpbWVyKHRyYW5zLCAweDMyMywgR1NNNDhfVDMyMyk7CisKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWdzbTQ4X2VuY29kZV9iZWFyZXJfY2FwKG1zZywgMSwgJm1vZGlmeS0+YmVhcmVyX2NhcCk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfTU9fVEVSTV9NT0RJRlkpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfbW9kaWZ5X2NvbXBsZXRlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBtb2RpZnk7CisKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKworCW1lbXNldCgmbW9kaWZ5LCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJbW9kaWZ5LmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCBHU000OF9JRV9CRUFSRVJfQ0FQLCAwKTsKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKSkgeworCQltb2RpZnkuZmllbGRzIHw9IE1OQ0NfRl9CRUFSRVJfQ0FQOworCQlnc200OF9kZWNvZGVfYmVhcmVyX2NhcCgmbW9kaWZ5LmJlYXJlcl9jYXAsCisJCQkJICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0JFQVJFUl9DQVApLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9BQ1RJVkUpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX01PRElGWV9DTkYsICZtb2RpZnkpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X21vZGlmeV9jb21wbGV0ZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbW9kaWZ5ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX01PRElGWV9DT01QTDsKKworCS8qIGJlYXJlciBjYXBhYmlsaXR5ICovCisJZ3NtNDhfZW5jb2RlX2JlYXJlcl9jYXAobXNnLCAxLCAmbW9kaWZ5LT5iZWFyZXJfY2FwKTsKKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9BQ1RJVkUpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfbW9kaWZ5X3JlamVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgbW9kaWZ5OworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwltZW1zZXQoJm1vZGlmeSwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1vZGlmeS5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfQkVBUkVSX0NBUCwgR1NNNDhfSUVfQ0FVU0UpOworCS8qIGJlYXJlciBjYXBhYmlsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0JFQVJFUl9DQVApKSB7CisJCW1vZGlmeS5maWVsZHMgfD0gR1NNNDhfSUVfQkVBUkVSX0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2JlYXJlcl9jYXAoJm1vZGlmeS5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisJLyogY2F1c2UgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpKSB7CisJCW1vZGlmeS5maWVsZHMgfD0gTU5DQ19GX0NBVVNFOworCQlnc200OF9kZWNvZGVfY2F1c2UoJm1vZGlmeS5jYXVzZSwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQVVTRSktMSk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0FDVElWRSk7CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfTU9ESUZZX1JFSiwgJm1vZGlmeSk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfbW9kaWZ5X3JlamVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbW9kaWZ5ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX01PRElGWV9SRUpFQ1Q7CisKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWdzbTQ4X2VuY29kZV9iZWFyZXJfY2FwKG1zZywgMSwgJm1vZGlmeS0+YmVhcmVyX2NhcCk7CisJLyogY2F1c2UgKi8KKwlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmbW9kaWZ5LT5jYXVzZSk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQUNUSVZFKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X25vdGlmeShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbm90aWZ5ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX05PVElGWTsKKworCS8qIG5vdGlmeSAqLworCWdzbTQ4X2VuY29kZV9ub3RpZnkobXNnLCBub3RpZnktPm5vdGlmeSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9ub3RpZnkoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisvLwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2Mgbm90aWZ5OworCisJbWVtc2V0KCZub3RpZnksIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlub3RpZnkuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworLy8JdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbik7CisJaWYgKHBheWxvYWRfbGVuID49IDEpCisJCWdzbTQ4X2RlY29kZV9ub3RpZnkoJm5vdGlmeS5ub3RpZnksIGdoLT5kYXRhKTsKKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19OT1RJRllfSU5ELCAmbm90aWZ5KTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF91c2VyaW5mbyhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqdXNlciA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19VU0VSX0lORk87CisKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAodXNlci0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAxLCAmdXNlci0+dXNlcnVzZXIpOworCS8qIG1vcmUgZGF0YSAqLworCWlmICh1c2VyLT5tb3JlKQorCQlnc200OF9lbmNvZGVfbW9yZShtc2cpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfdXNlcmluZm8oc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIHVzZXI7CisKKwltZW1zZXQoJnVzZXIsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwl1c2VyLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCBHU000OF9JRV9VU0VSX1VTRVIsIDApOworCS8qIHVzZXItdXNlciAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpKSB7CisJCXVzZXIuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZ1c2VyLnVzZXJ1c2VyLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKS0xKTsKKwl9CisJLyogbW9yZSBkYXRhICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX01PUkVfREFUQSkpCisJCXVzZXIubW9yZSA9IDE7CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfVVNFUklORk9fSU5ELCAmdXNlcik7Cit9CisKK3N0YXRpYyBpbnQgX2dzbTQ4X2xjaGFuX21vZGlmeShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbW9kZSA9IGFyZzsKKworCXJldHVybiBnc200OF9sY2hhbl9tb2RpZnkodHJhbnMtPmNvbm4tPmxjaGFuLCBtb2RlLT5sY2hhbl9tb2RlKTsKK30KKworc3RhdGljIHN0cnVjdCBkb3duc3RhdGUgeworCXVfaW50MzJfdAlzdGF0ZXM7CisJaW50CQl0eXBlOworCWludAkJKCpyb3V0KSAoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZyk7Cit9IGRvd25zdGF0ZWxpc3RbXSA9IHsKKwkvKiBtb2JpbGUgb3JpZ2luYXRpbmcgY2FsbCBlc3RhYmxpc2htZW50ICovCisJe1NCSVQoR1NNX0NTVEFURV9JTklUSUFURUQpLCAvKiA1LjIuMS4yICovCisJIE1OQ0NfQ0FMTF9QUk9DX1JFUSwgZ3NtNDhfY2NfdHhfY2FsbF9wcm9jfSwKKwl7U0JJVChHU01fQ1NUQVRFX0lOSVRJQVRFRCkgfCBTQklUKEdTTV9DU1RBVEVfTU9fQ0FMTF9QUk9DKSwgLyogNS4yLjEuMiB8IDUuMi4xLjUgKi8KKwkgTU5DQ19BTEVSVF9SRVEsIGdzbTQ4X2NjX3R4X2FsZXJ0aW5nfSwKKwl7U0JJVChHU01fQ1NUQVRFX0lOSVRJQVRFRCkgfCBTQklUKEdTTV9DU1RBVEVfTU9fQ0FMTF9QUk9DKSB8IFNCSVQoR1NNX0NTVEFURV9DQUxMX0RFTElWRVJFRCksIC8qIDUuMi4xLjIgfCA1LjIuMS42IHwgNS4yLjEuNiAqLworCSBNTkNDX1NFVFVQX1JTUCwgZ3NtNDhfY2NfdHhfY29ubmVjdH0sCisJe1NCSVQoR1NNX0NTVEFURV9NT19DQUxMX1BST0MpLCAvKiA1LjIuMS40LjIgKi8KKwkgTU5DQ19QUk9HUkVTU19SRVEsIGdzbTQ4X2NjX3R4X3Byb2dyZXNzfSwKKwkvKiBtb2JpbGUgdGVybWluYXRpbmcgY2FsbCBlc3RhYmxpc2htZW50ICovCisJe1NCSVQoR1NNX0NTVEFURV9OVUxMKSwgLyogNS4yLjIuMSAqLworCSBNTkNDX1NFVFVQX1JFUSwgZ3NtNDhfY2NfdHhfc2V0dXB9LAorCXtTQklUKEdTTV9DU1RBVEVfQ09OTkVDVF9SRVFVRVNUKSwKKwkgTU5DQ19TRVRVUF9DT01QTF9SRVEsIGdzbTQ4X2NjX3R4X2Nvbm5lY3RfYWNrfSwKKwkgLyogc2lnbmFsbGluZyBkdXJpbmcgY2FsbCAqLworCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgTU5DQ19OT1RJRllfUkVRLCBnc200OF9jY190eF9ub3RpZnl9LAorCXtBTExfU1RBVEVTIC0gU0JJVChHU01fQ1NUQVRFX05VTEwpIC0gU0JJVChHU01fQ1NUQVRFX1JFTEVBU0VfUkVRKSwKKwkgTU5DQ19GQUNJTElUWV9SRVEsIGdzbTQ4X2NjX3R4X2ZhY2lsaXR5fSwKKwl7QUxMX1NUQVRFUywKKwkgTU5DQ19TVEFSVF9EVE1GX1JTUCwgZ3NtNDhfY2NfdHhfc3RhcnRfZHRtZl9hY2t9LAorCXtBTExfU1RBVEVTLAorCSBNTkNDX1NUQVJUX0RUTUZfUkVKLCBnc200OF9jY190eF9zdGFydF9kdG1mX3Jlan0sCisJe0FMTF9TVEFURVMsCisJIE1OQ0NfU1RPUF9EVE1GX1JTUCwgZ3NtNDhfY2NfdHhfc3RvcF9kdG1mX2Fja30sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX0hPTERfQ05GLCBnc200OF9jY190eF9ob2xkX2Fja30sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX0hPTERfUkVKLCBnc200OF9jY190eF9ob2xkX3Jlan0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX1JFVFJJRVZFX0NORiwgZ3NtNDhfY2NfdHhfcmV0cmlldmVfYWNrfSwKKwl7U0JJVChHU01fQ1NUQVRFX0FDVElWRSksCisJIE1OQ0NfUkVUUklFVkVfUkVKLCBnc200OF9jY190eF9yZXRyaWV2ZV9yZWp9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgTU5DQ19NT0RJRllfUkVRLCBnc200OF9jY190eF9tb2RpZnl9LAorCXtTQklUKEdTTV9DU1RBVEVfTU9fT1JJR19NT0RJRlkpLAorCSBNTkNDX01PRElGWV9SU1AsIGdzbTQ4X2NjX3R4X21vZGlmeV9jb21wbGV0ZX0sCisJe1NCSVQoR1NNX0NTVEFURV9NT19PUklHX01PRElGWSksCisJIE1OQ0NfTU9ESUZZX1JFSiwgZ3NtNDhfY2NfdHhfbW9kaWZ5X3JlamVjdH0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX1VTRVJJTkZPX1JFUSwgZ3NtNDhfY2NfdHhfdXNlcmluZm99LAorCS8qIGNsZWFyaW5nICovCisJe1NCSVQoR1NNX0NTVEFURV9JTklUSUFURUQpLAorCSBNTkNDX1JFSl9SRVEsIGdzbTQ4X2NjX3R4X3JlbGVhc2VfY29tcGx9LAorCXtBTExfU1RBVEVTIC0gU0JJVChHU01fQ1NUQVRFX05VTEwpIC0gU0JJVChHU01fQ1NUQVRFX0RJU0NPTk5FQ1RfSU5EKSAtIFNCSVQoR1NNX0NTVEFURV9SRUxFQVNFX1JFUSkgLSBTQklUKEdTTV9DU1RBVEVfRElTQ09OTkVDVF9SRVEpLCAvKiA1LjQuNCAqLworCSBNTkNDX0RJU0NfUkVRLCBnc200OF9jY190eF9kaXNjb25uZWN0fSwKKwl7QUxMX1NUQVRFUyAtIFNCSVQoR1NNX0NTVEFURV9OVUxMKSAtIFNCSVQoR1NNX0NTVEFURV9SRUxFQVNFX1JFUSksIC8qIDUuNC4zLjIgKi8KKwkgTU5DQ19SRUxfUkVRLCBnc200OF9jY190eF9yZWxlYXNlfSwKKwkvKiBzcGVjaWFsICovCisJe0FMTF9TVEFURVMsCisJIE1OQ0NfTENIQU5fTU9ESUZZLCBfZ3NtNDhfbGNoYW5fbW9kaWZ5fSwKK307CisKKyNkZWZpbmUgRE9XTlNMTEVOIFwKKwkoc2l6ZW9mKGRvd25zdGF0ZWxpc3QpIC8gc2l6ZW9mKHN0cnVjdCBkb3duc3RhdGUpKQorCisKK2ludCBtbmNjX3NlbmQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtc2dfdHlwZSwgdm9pZCAqYXJnKQoreworCWludCBpLCByYyA9IDA7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnMgPSBOVUxMLCAqdHJhbnN0OworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX21uY2MgKmRhdGEgPSBhcmcsIHJlbDsKKworCS8qIGhhbmRsZSBzcGVjaWFsIG1lc3NhZ2VzICovCisJc3dpdGNoKG1zZ190eXBlKSB7CisJY2FzZSBNTkNDX0JSSURHRToKKwkJcmV0dXJuIHRjaF9icmlkZ2UobmV0LCBhcmcpOworCWNhc2UgTU5DQ19GUkFNRV9EUk9QOgorCQlyZXR1cm4gdGNoX3JlY3ZfbW5jYyhuZXQsIGRhdGEtPmNhbGxyZWYsIDApOworCWNhc2UgTU5DQ19GUkFNRV9SRUNWOgorCQlyZXR1cm4gdGNoX3JlY3ZfbW5jYyhuZXQsIGRhdGEtPmNhbGxyZWYsIDEpOworCWNhc2UgR1NNX1RDSEZfRlJBTUU6CisJCS8qIEZpbmQgY2FsbHJlZiAqLworCQl0cmFucyA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihuZXQsIGRhdGEtPmNhbGxyZWYpOworCQlpZiAoIXRyYW5zKQorCQkJcmV0dXJuIC1FSU87CisJCWlmICghdHJhbnMtPmNvbm4pCisJCQlyZXR1cm4gMDsKKwkJaWYgKHRyYW5zLT5jb25uLT5sY2hhbi0+dHlwZSAhPSBHU01fTENIQU5fVENIX0YpCisJCQlyZXR1cm4gMDsKKwkJYnRzID0gdHJhbnMtPmNvbm4tPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCQlpZiAoIXRyYW5zLT5jb25uLT5sY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0KQorCQkJCXJldHVybiAwOworCQkJcmV0dXJuIHJ0cF9zZW5kX2ZyYW1lKHRyYW5zLT5jb25uLT5sY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0LCBhcmcpOworCQljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQkJcmV0dXJuIHRyYXVfc2VuZF9mcmFtZSh0cmFucy0+Y29ubi0+bGNoYW4sIGFyZyk7CisJCWRlZmF1bHQ6CisJCQlERUJVR1AoRENDLCAiVW5rbm93biBCVFMgdHlwZSAldVxuIiwgYnRzLT50eXBlKTsKKwkJfQorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltZW1zZXQoJnJlbCwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCXJlbC5jYWxscmVmID0gZGF0YS0+Y2FsbHJlZjsKKworCS8qIEZpbmQgY2FsbHJlZiAqLworCXRyYW5zID0gdHJhbnNfZmluZF9ieV9jYWxscmVmKG5ldCwgZGF0YS0+Y2FsbHJlZik7CisKKwkvKiBDYWxscmVmIHVua25vd24gKi8KKwlpZiAoIXRyYW5zKSB7CisJCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJCWlmIChtc2dfdHlwZSAhPSBNTkNDX1NFVFVQX1JFUSkgeworCQkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpIC0tIHN1YiAlcykgIgorCQkJCSJSZWNlaXZlZCAnJXMnIGZyb20gTU5DQyB3aXRoICIKKwkJCQkidW5rbm93biBjYWxscmVmICVkXG4iLCBkYXRhLT5jYWxsZWQubnVtYmVyLAorCQkJCWdldF9tbmNjX25hbWUobXNnX3R5cGUpLCBkYXRhLT5jYWxscmVmKTsKKwkJCS8qIEludmFsaWQgY2FsbCByZWZlcmVuY2UgKi8KKwkJCXJldHVybiBtbmNjX3JlbGVhc2VfaW5kKG5ldCwgTlVMTCwgZGF0YS0+Y2FsbHJlZiwKKwkJCQkJCUdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkJCUdTTTQ4X0NDX0NBVVNFX0lOVkFMX1RSQU5TX0lEKTsKKwkJfQorCQlpZiAoIWRhdGEtPmNhbGxlZC5udW1iZXJbMF0gJiYgIWRhdGEtPmltc2lbMF0pIHsKKwkJCURFQlVHUChEQ0MsICIoYnRzIC0gdHJ4IC0gdHMgLSB0aSkgIgorCQkJCSJSZWNlaXZlZCAnJXMnIGZyb20gTU5DQyB3aXRoICIKKwkJCQkibm8gbnVtYmVyIG9yIElNU0lcbiIsIGdldF9tbmNjX25hbWUobXNnX3R5cGUpKTsKKwkJCS8qIEludmFsaWQgbnVtYmVyICovCisJCQlyZXR1cm4gbW5jY19yZWxlYXNlX2luZChuZXQsIE5VTEwsIGRhdGEtPmNhbGxyZWYsCisJCQkJCQlHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJCQlHU000OF9DQ19DQVVTRV9JTlZfTlJfRk9STUFUKTsKKwkJfQorCQkvKiBOZXcgdHJhbnNhY3Rpb24gZHVlIHRvIHNldHVwLCBmaW5kIHN1YnNjcmliZXIgKi8KKwkJaWYgKGRhdGEtPmNhbGxlZC5udW1iZXJbMF0pCisJCQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2V4dGVuc2lvbihuZXQsCisJCQkJCQkJZGF0YS0+Y2FsbGVkLm51bWJlcik7CisJCWVsc2UKKwkJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShuZXQsIGRhdGEtPmltc2kpOworCQkvKiBJZiBzdWJzY3JpYmVyIGlzIG5vdCBmb3VuZCAqLworCQlpZiAoIXN1YnNjcikgeworCQkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpIC0tIHN1YiAlcykgIgorCQkJCSJSZWNlaXZlZCAnJXMnIGZyb20gTU5DQyB3aXRoICIKKwkJCQkidW5rbm93biBzdWJzY3JpYmVyICVzXG4iLCBkYXRhLT5jYWxsZWQubnVtYmVyLAorCQkJCWdldF9tbmNjX25hbWUobXNnX3R5cGUpLCBkYXRhLT5jYWxsZWQubnVtYmVyKTsKKwkJCS8qIFVua25vd24gc3Vic2NyaWJlciAqLworCQkJcmV0dXJuIG1uY2NfcmVsZWFzZV9pbmQobmV0LCBOVUxMLCBkYXRhLT5jYWxscmVmLAorCQkJCQkJR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCQkJR1NNNDhfQ0NfQ0FVU0VfVU5BU1NJR05FRF9OUik7CisJCX0KKwkJLyogSWYgc3Vic2NyaWJlciBpcyBub3QgImF0dGFjaGVkIiAqLworCQlpZiAoIXN1YnNjci0+bGFjKSB7CisJCQlERUJVR1AoRENDLCAiKGJ0cyAtIHRyeCAtIHRzIC0gdGkgLS0gc3ViICVzKSAiCisJCQkJIlJlY2VpdmVkICclcycgZnJvbSBNTkNDIHdpdGggIgorCQkJCSJkZXRhY2hlZCBzdWJzY3JpYmVyICVzXG4iLCBkYXRhLT5jYWxsZWQubnVtYmVyLAorCQkJCWdldF9tbmNjX25hbWUobXNnX3R5cGUpLCBkYXRhLT5jYWxsZWQubnVtYmVyKTsKKwkJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwkJCS8qIFRlbXBvcmFyaWx5IG91dCBvZiBvcmRlciAqLworCQkJcmV0dXJuIG1uY2NfcmVsZWFzZV9pbmQobmV0LCBOVUxMLCBkYXRhLT5jYWxscmVmLAorCQkJCQkJR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCQkJR1NNNDhfQ0NfQ0FVU0VfREVTVF9PT08pOworCQl9CisJCS8qIENyZWF0ZSB0cmFuc2FjdGlvbiAqLworCQl0cmFucyA9IHRyYW5zX2FsbG9jKHN1YnNjciwgR1NNNDhfUERJU0NfQ0MsIDB4ZmYsIGRhdGEtPmNhbGxyZWYpOworCQlpZiAoIXRyYW5zKSB7CisJCQlERUJVR1AoRENDLCAiTm8gbWVtb3J5IGZvciB0cmFucy5cbiIpOworCQkJc3Vic2NyX3B1dChzdWJzY3IpOworCQkJLyogUmVzc291cmNlIHVuYXZhaWxhYmxlICovCisJCQltbmNjX3JlbGVhc2VfaW5kKG5ldCwgTlVMTCwgZGF0YS0+Y2FsbHJlZiwKKwkJCQkJIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkJIEdTTTQ4X0NDX0NBVVNFX1JFU09VUkNFX1VOQVZBSUwpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJLyogRmluZCBsY2hhbiAqLworCQlsY2hhbiA9IGxjaGFuX2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKworCQkvKiBJZiBzdWJzY3JpYmVyIGhhcyBubyBsY2hhbiAqLworCQlpZiAoIWxjaGFuKSB7CisJCQkvKiBmaW5kIHRyYW5zYWN0aW9uIHdpdGggdGhpcyBzdWJzY3JpYmVyIGFscmVhZHkgcGFnaW5nICovCisJCQlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFuc3QsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCQkJLyogVHJhbnNhY3Rpb24gb2Ygb3VyIGxjaGFuPyAqLworCQkJCWlmICh0cmFuc3QgPT0gdHJhbnMgfHwKKwkJCQkgICAgdHJhbnN0LT5zdWJzY3IgIT0gc3Vic2NyKQorCQkJCQljb250aW51ZTsKKwkJCQlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggLSB0cyAtIHRpIC0tIHN1YiAlcykgIgorCQkJCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0Mgd2l0aCAiCisJCQkJCSJ1bmFsbG9jYXRlZCBjaGFubmVsLCBwYWdpbmcgYWxyZWFkeSAiCisJCQkJCSJzdGFydGVkLlxuIiwgYnRzLT5uciwKKwkJCQkJZGF0YS0+Y2FsbGVkLm51bWJlciwKKwkJCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCQkJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwkJCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCS8qIHN0b3JlIHNldHVwIGluZm9ybWF0aW9ucyB1bnRpbCBwYWdpbmcgd2FzIHN1Y2Nlc3NmdWxsICovCisJCQltZW1jcHkoJnRyYW5zLT5jYy5tc2csIGRhdGEsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwkJCS8qIFRyaWdnZXIgcGFnaW5nICovCisJCQlwYWdpbmdfcmVxdWVzdChuZXQsIHN1YnNjciwgUlNMX0NIQU5ORUVEX1RDSF9GLAorCQkJCQlzZXR1cF90cmlnX3BhZ19ldnQsIHN1YnNjcik7CisJCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBBc3NpZ24gbGNoYW4gKi8KKwkJdHJhbnMtPmNvbm4gPSAmbGNoYW4tPmNvbm47CisJCXVzZV9zdWJzY3JfY29uKHRyYW5zLT5jb25uKTsKKwkJc3Vic2NyX3B1dChzdWJzY3IpOworCX0KKworCWlmICh0cmFucy0+Y29ubikKKwkJbGNoYW4gPSB0cmFucy0+Y29ubi0+bGNoYW47CisKKwkvKiBpZiBwYWdpbmcgZGlkIG5vdCByZXNwb25kIHlldCAqLworCWlmICghbGNoYW4pIHsKKwkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpIC0tIHN1YiAlcykgIgorCQkJIlJlY2VpdmVkICclcycgZnJvbSBNTkNDIGluIHBhZ2luZyBzdGF0ZVxuIiwgCisJCQkodHJhbnMtPnN1YnNjcik/KHRyYW5zLT5zdWJzY3ItPmV4dGVuc2lvbik6Ii0iLAorCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCQltbmNjX3NldF9jYXVzZSgmcmVsLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJR1NNNDhfQ0NfQ0FVU0VfTk9STV9DQUxMX0NMRUFSKTsKKwkJaWYgKG1zZ190eXBlID09IE1OQ0NfUkVMX1JFUSkKKwkJCXJjID0gbW5jY19yZWN2bXNnKG5ldCwgdHJhbnMsIE1OQ0NfUkVMX0NORiwgJnJlbCk7CisJCWVsc2UKKwkJCXJjID0gbW5jY19yZWN2bXNnKG5ldCwgdHJhbnMsIE1OQ0NfUkVMX0lORCwgJnJlbCk7CisJCXRyYW5zLT5jYWxscmVmID0gMDsKKwkJdHJhbnNfZnJlZSh0cmFucyk7CisJCXJldHVybiByYzsKKwl9CisKKwlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgdGkgJTAyeCBzdWIgJXMpICIKKwkJIlJlY2VpdmVkICclcycgZnJvbSBNTkNDIGluIHN0YXRlICVkICglcylcbiIsCisJCWxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBsY2hhbi0+dHMtPnRyeC0+bnIsIGxjaGFuLT50cy0+bnIsCisJCXRyYW5zLT50cmFuc2FjdGlvbl9pZCwKKwkJKHRyYW5zLT5jb25uLT5zdWJzY3IpPyh0cmFucy0+Y29ubi0+c3Vic2NyLT5leHRlbnNpb24pOiItIiwKKwkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSksIHRyYW5zLT5jYy5zdGF0ZSwKKwkJZ3NtNDhfY2Nfc3RhdGVfbmFtZSh0cmFucy0+Y2Muc3RhdGUpKTsKKworCS8qIEZpbmQgZnVuY3Rpb24gZm9yIGN1cnJlbnQgc3RhdGUgYW5kIG1lc3NhZ2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgRE9XTlNMTEVOOyBpKyspCisJCWlmICgobXNnX3R5cGUgPT0gZG93bnN0YXRlbGlzdFtpXS50eXBlKQorCQkgJiYgKCgxIDw8IHRyYW5zLT5jYy5zdGF0ZSkgJiBkb3duc3RhdGVsaXN0W2ldLnN0YXRlcykpCisJCQlicmVhazsKKwlpZiAoaSA9PSBET1dOU0xMRU4pIHsKKwkJREVCVUdQKERDQywgIk1lc3NhZ2UgdW5oYW5kbGVkIGF0IHRoaXMgc3RhdGUuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmMgPSBkb3duc3RhdGVsaXN0W2ldLnJvdXQodHJhbnMsIGFyZyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHN0cnVjdCBkYXRhc3RhdGUgeworCXVfaW50MzJfdAlzdGF0ZXM7CisJaW50CQl0eXBlOworCWludAkJKCpyb3V0KSAoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpOworfSBkYXRhc3RhdGVsaXN0W10gPSB7CisJLyogbW9iaWxlIG9yaWdpbmF0aW5nIGNhbGwgZXN0YWJsaXNobWVudCAqLworCXtTQklUKEdTTV9DU1RBVEVfTlVMTCksIC8qIDUuMi4xLjIgKi8KKwkgR1NNNDhfTVRfQ0NfU0VUVVAsIGdzbTQ4X2NjX3J4X3NldHVwfSwKKwl7U0JJVChHU01fQ1NUQVRFX05VTEwpLCAvKiA1LjIuMS4yICovCisJIEdTTTQ4X01UX0NDX0VNRVJHX1NFVFVQLCBnc200OF9jY19yeF9zZXR1cH0sCisJe1NCSVQoR1NNX0NTVEFURV9DT05ORUNUX0lORCksIC8qIDUuMi4xLjIgKi8KKwkgR1NNNDhfTVRfQ0NfQ09OTkVDVF9BQ0ssIGdzbTQ4X2NjX3J4X2Nvbm5lY3RfYWNrfSwKKwkvKiBtb2JpbGUgdGVybWluYXRpbmcgY2FsbCBlc3RhYmxpc2htZW50ICovCisJe1NCSVQoR1NNX0NTVEFURV9DQUxMX1BSRVNFTlQpLCAvKiA1LjIuMi4zLjIgKi8KKwkgR1NNNDhfTVRfQ0NfQ0FMTF9DT05GLCBnc200OF9jY19yeF9jYWxsX2NvbmZ9LAorCXtTQklUKEdTTV9DU1RBVEVfQ0FMTF9QUkVTRU5UKSB8IFNCSVQoR1NNX0NTVEFURV9NT19URVJNX0NBTExfQ09ORiksIC8qID8/Pz8gfCA1LjIuMi4zLjIgKi8KKwkgR1NNNDhfTVRfQ0NfQUxFUlRJTkcsIGdzbTQ4X2NjX3J4X2FsZXJ0aW5nfSwKKwl7U0JJVChHU01fQ1NUQVRFX0NBTExfUFJFU0VOVCkgfCBTQklUKEdTTV9DU1RBVEVfTU9fVEVSTV9DQUxMX0NPTkYpIHwgU0JJVChHU01fQ1NUQVRFX0NBTExfUkVDRUlWRUQpLCAvKiAoNS4yLjIuNikgfCA1LjIuMi42IHwgNS4yLjIuNiAqLyAgCisJIEdTTTQ4X01UX0NDX0NPTk5FQ1QsIGdzbTQ4X2NjX3J4X2Nvbm5lY3R9LAorCSAvKiBzaWduYWxsaW5nIGR1cmluZyBjYWxsICovCisJe0FMTF9TVEFURVMgLSBTQklUKEdTTV9DU1RBVEVfTlVMTCksCisJIEdTTTQ4X01UX0NDX0ZBQ0lMSVRZLCBnc200OF9jY19yeF9mYWNpbGl0eX0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBHU000OF9NVF9DQ19OT1RJRlksIGdzbTQ4X2NjX3J4X25vdGlmeX0sCisJe0FMTF9TVEFURVMsCisJIEdTTTQ4X01UX0NDX1NUQVJUX0RUTUYsIGdzbTQ4X2NjX3J4X3N0YXJ0X2R0bWZ9LAorCXtBTExfU1RBVEVTLAorCSBHU000OF9NVF9DQ19TVE9QX0RUTUYsIGdzbTQ4X2NjX3J4X3N0b3BfZHRtZn0sCisJe0FMTF9TVEFURVMsCisJIEdTTTQ4X01UX0NDX1NUQVRVU19FTlEsIGdzbTQ4X2NjX3J4X3N0YXR1c19lbnF9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgR1NNNDhfTVRfQ0NfSE9MRCwgZ3NtNDhfY2NfcnhfaG9sZH0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBHU000OF9NVF9DQ19SRVRSLCBnc200OF9jY19yeF9yZXRyaWV2ZX0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBHU000OF9NVF9DQ19NT0RJRlksIGdzbTQ4X2NjX3J4X21vZGlmeX0sCisJe1NCSVQoR1NNX0NTVEFURV9NT19URVJNX01PRElGWSksCisJIEdTTTQ4X01UX0NDX01PRElGWV9DT01QTCwgZ3NtNDhfY2NfcnhfbW9kaWZ5X2NvbXBsZXRlfSwKKwl7U0JJVChHU01fQ1NUQVRFX01PX1RFUk1fTU9ESUZZKSwKKwkgR1NNNDhfTVRfQ0NfTU9ESUZZX1JFSkVDVCwgZ3NtNDhfY2NfcnhfbW9kaWZ5X3JlamVjdH0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBHU000OF9NVF9DQ19VU0VSX0lORk8sIGdzbTQ4X2NjX3J4X3VzZXJpbmZvfSwKKwkvKiBjbGVhcmluZyAqLworCXtBTExfU1RBVEVTIC0gU0JJVChHU01fQ1NUQVRFX05VTEwpIC0gU0JJVChHU01fQ1NUQVRFX1JFTEVBU0VfUkVRKSwgLyogNS40LjMuMiAqLworCSBHU000OF9NVF9DQ19ESVNDT05ORUNULCBnc200OF9jY19yeF9kaXNjb25uZWN0fSwKKwl7QUxMX1NUQVRFUyAtIFNCSVQoR1NNX0NTVEFURV9OVUxMKSwgLyogNS40LjQuMS4yLjIgKi8KKwkgR1NNNDhfTVRfQ0NfUkVMRUFTRSwgZ3NtNDhfY2NfcnhfcmVsZWFzZX0sCisJe0FMTF9TVEFURVMsIC8qIDUuNC4zLjQgKi8KKwkgR1NNNDhfTVRfQ0NfUkVMRUFTRV9DT01QTCwgZ3NtNDhfY2NfcnhfcmVsZWFzZV9jb21wbH0sCit9OworCisjZGVmaW5lIERBVEFTTExFTiBcCisJKHNpemVvZihkYXRhc3RhdGVsaXN0KSAvIHNpemVvZihzdHJ1Y3QgZGF0YXN0YXRlKSkKKworc3RhdGljIGludCBnc20wNDA4X3Jjdl9jYyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90IG1zZ190eXBlID0gZ2gtPm1zZ190eXBlICYgMHhiZjsKKwl1X2ludDhfdCB0cmFuc2FjdGlvbl9pZCA9ICgoZ2gtPnByb3RvX2Rpc2NyICYgMHhmMCkgXiAweDgwKSA+PiA0OyAvKiBmbGlwICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zID0gTlVMTDsKKwlpbnQgaSwgcmMgPSAwOworCisJaWYgKG1zZ190eXBlICYgMHg4MCkgeworCQlERUJVR1AoRENDLCAiTVNHIDB4JTJ4IG5vdCBkZWZpbmVkIGZvciBQRCBlcnJvclxuIiwgbXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljb25uID0gJmxjaGFuLT5jb25uOworCisJLyogRmluZCB0cmFuc2FjdGlvbiAqLworCXRyYW5zID0gdHJhbnNfZmluZF9ieV9pZChjb25uLT5zdWJzY3IsIEdTTTQ4X1BESVNDX0NDLCB0cmFuc2FjdGlvbl9pZCk7CisKKwlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgdGkgJXggc3ViICVzKSAiCisJCSJSZWNlaXZlZCAnJXMnIGZyb20gTVMgaW4gc3RhdGUgJWQgKCVzKVxuIiwKKwkJbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgbGNoYW4tPnRzLT5uciwKKwkJdHJhbnNhY3Rpb25faWQsIChjb25uLT5zdWJzY3IpPyhjb25uLT5zdWJzY3ItPmV4dGVuc2lvbik6Ii0iLAorCQlnc200OF9jY19tc2dfbmFtZShtc2dfdHlwZSksIHRyYW5zPyh0cmFucy0+Y2Muc3RhdGUpOjAsCisJCWdzbTQ4X2NjX3N0YXRlX25hbWUodHJhbnM/KHRyYW5zLT5jYy5zdGF0ZSk6MCkpOworCisJLyogQ3JlYXRlIHRyYW5zYWN0aW9uICovCisJaWYgKCF0cmFucykgeworCQlERUJVR1AoRENDLCAiVW5rbm93biB0cmFuc2FjdGlvbiBJRCAleCwgIgorCQkJImNyZWF0aW5nIG5ldyB0cmFucy5cbiIsIHRyYW5zYWN0aW9uX2lkKTsKKwkJLyogQ3JlYXRlIHRyYW5zYWN0aW9uICovCisJCXRyYW5zID0gdHJhbnNfYWxsb2MoY29ubi0+c3Vic2NyLCBHU000OF9QRElTQ19DQywKKwkJCQkgICAgdHJhbnNhY3Rpb25faWQsIG5ld19jYWxscmVmKyspOworCQlpZiAoIXRyYW5zKSB7CisJCQlERUJVR1AoRENDLCAiTm8gbWVtb3J5IGZvciB0cmFucy5cbiIpOworCQkJcmMgPSBnc200OF90eF9zaW1wbGUobXNnLT5sY2hhbiwKKwkJCQkJICAgICBHU000OF9QRElTQ19DQyB8ICh0cmFuc2FjdGlvbl9pZCA8PCA0KSwKKwkJCQkJICAgICBHU000OF9NVF9DQ19SRUxFQVNFX0NPTVBMKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCS8qIEFzc2lnbiB0cmFuc2FjdGlvbiAqLworCQl0cmFucy0+Y29ubiA9ICZsY2hhbi0+Y29ubjsKKwkJdXNlX3N1YnNjcl9jb24odHJhbnMtPmNvbm4pOworCX0KKworCS8qIGZpbmQgZnVuY3Rpb24gZm9yIGN1cnJlbnQgc3RhdGUgYW5kIG1lc3NhZ2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgREFUQVNMTEVOOyBpKyspCisJCWlmICgobXNnX3R5cGUgPT0gZGF0YXN0YXRlbGlzdFtpXS50eXBlKQorCQkgJiYgKCgxIDw8IHRyYW5zLT5jYy5zdGF0ZSkgJiBkYXRhc3RhdGVsaXN0W2ldLnN0YXRlcykpCisJCQlicmVhazsKKwlpZiAoaSA9PSBEQVRBU0xMRU4pIHsKKwkJREVCVUdQKERDQywgIk1lc3NhZ2UgdW5oYW5kbGVkIGF0IHRoaXMgc3RhdGUuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmMgPSBkYXRhc3RhdGVsaXN0W2ldLnJvdXQodHJhbnMsIG1zZyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGhlcmUgd2UgcGFzcyBpbiBhIG1zZ2IgZnJvbSB0aGUgUlNMLT5STEwuICBXZSBleHBlY3QgdGhlIGwzIHBvaW50ZXIgdG8gYmUgc2V0ICovCitpbnQgZ3NtMDQwOF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCkKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCBwZGlzYyA9IGdoLT5wcm90b19kaXNjciAmIDB4MGY7CisJaW50IHJjID0gMDsKKworCWlmIChzaWxlbnRfY2FsbF9yZXJvdXRlKG1zZykpCisJCXJldHVybiBzaWxlbnRfY2FsbF9yeChtc2cpOworCQorCXN3aXRjaCAocGRpc2MpIHsKKwljYXNlIEdTTTQ4X1BESVNDX0NDOgorCQlyYyA9IGdzbTA0MDhfcmN2X2NjKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfUERJU0NfTU06CisJCXJjID0gZ3NtMDQwOF9yY3ZfbW0obXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9QRElTQ19SUjoKKwkJcmMgPSBnc20wNDA4X3Jjdl9ycihtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X1BESVNDX1NNUzoKKwkJcmMgPSBnc20wNDExX3Jjdl9zbXMobXNnLCBsaW5rX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9QRElTQ19NTV9HUFJTOgorCWNhc2UgR1NNNDhfUERJU0NfU01fR1BSUzoKKwkJTE9HUChEUkxMLCBMT0dMX05PVElDRSwgIlVuaW1wbGVtZW50ZWQgIgorCQkJIkdTTSAwNC4wOCBkaXNjcmltaW5hdG9yIDB4JTAyeFxuIiwgcGRpc2MpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X1BESVNDX05DX1NTOgorCQlyYyA9IGhhbmRsZV9yY3ZfdXNzZChtc2cpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSTEwsIExPR0xfTk9USUNFLCAiVW5rbm93biAiCisJCQkiR1NNIDA0LjA4IGRpc2NyaW1pbmF0b3IgMHglMDJ4XG4iLCBwZGlzYyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogZGVxdWV1ZSBtZXNzYWdlcyB0byBsYXllciA0ICovCitpbnQgYnNjX3VwcXVldWUoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJc3RydWN0IGdzbV9tbmNjICptbmNjOworCXN0cnVjdCBtc2diICptc2c7CisJaW50IHdvcmsgPSAwOworCisJaWYgKG5ldCkKKwkJd2hpbGUgKChtc2cgPSBtc2diX2RlcXVldWUoJm5ldC0+dXBxdWV1ZSkpKSB7CisJCQltbmNjID0gKHN0cnVjdCBnc21fbW5jYyAqKW1zZy0+ZGF0YTsKKwkJCWlmIChuZXQtPm1uY2NfcmVjdikKKwkJCQluZXQtPm1uY2NfcmVjdihuZXQsIG1uY2MtPm1zZ190eXBlLCBtbmNjKTsKKwkJCXdvcmsgPSAxOyAvKiB3b3JrIGRvbmUgKi8KKwkJCXRhbGxvY19mcmVlKG1zZyk7CisJCX0KKworCXJldHVybiB3b3JrOworfQorCisvKgorICogVGhpcyB3aWxsIGJlIHJhbiBieSB0aGUgbGlua2VyIHdoZW4gbG9hZGluZyB0aGUgRFNPLiBXZSB1c2UgaXQgdG8KKyAqIGRvIHN5c3RlbSBpbml0aWFsaXphdGlvbiwgZS5nLiByZWdpc3RyYXRpb24gb2Ygc2lnbmFsIGhhbmRsZXJzLgorICovCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkXzA0MDgodm9pZCkKK3sKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19MQ0hBTiwgZ3NtMDQwOF9oYW5kbGVfbGNoYW5fc2lnbmFsLCBOVUxMKTsKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19BQklTSVAsIGhhbmRsZV9hYmlzaXBfc2lnbmFsLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dzbV8wNF8wOF91dGlscy5jIGIvb3BlbmJzYy9zcmMvZ3NtXzA0XzA4X3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQzZjkwNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8wOF91dGlscy5jCkBAIC0wLDAgKzEsNjI5IEBACisvKiBHU00gTW9iaWxlIFJhZGlvIEludGVyZmFjZSBMYXllciAzIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UKKyAqIDNHUFAgVFMgMDQuMDggdmVyc2lvbiA3LjIxLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQwIFY3LjIxLjAKKyAqIHV0aWxpdHkgZnVuY3Rpb25zCisgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDgsIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtNDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYW5zYWN0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorCisjZGVmaW5lIEdTTTQ4X0FMTE9DX1NJWkUJMTAyNAorI2RlZmluZSBHU000OF9BTExPQ19IRUFEUk9PTQkxMjgKKworLyogc2hvdWxkIGlwLmFjY2VzcyBCVFMgdXNlIGRpcmVjdCBSVFAgc3RyZWFtcyBiZXR3ZWVuIGVhY2ggb3RoZXIgKDEpLAorICogb3Igc2hvdWxkIE9wZW5CU0MgYWx3YXlzIGFjdCBhcyBSVFAgcmVsYXkvcHJveHkgaW4gYmV0d2VlbiAoMCkgPyAqLworaW50IGlwYWNjX3J0cF9kaXJlY3QgPSAxOworCitzdHJ1Y3QgbXNnYiAqZ3NtNDhfbXNnYl9hbGxvYyh2b2lkKQoreworCXJldHVybiBtc2diX2FsbG9jX2hlYWRyb29tKEdTTTQ4X0FMTE9DX1NJWkUsIEdTTTQ4X0FMTE9DX0hFQURST09NLAorCQkJCSAgICJHU00gMDQuMDgiKTsKK30KKworaW50IGdzbTQ4X3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2ctPmRhdGE7CisKKwkvKiBpZiB3ZSBnZXQgcGFzc2VkIGEgdHJhbnNhY3Rpb24gcmVmZXJlbmNlLCBkbyBzb21lIGNvbW1vbgorCSAqIHdvcmsgdGhhdCB0aGUgY2FsbGVyIG5vIGxvbmdlciBoYXMgdG8gZG8gKi8KKwlpZiAodHJhbnMpIHsKKwkJZ2gtPnByb3RvX2Rpc2NyID0gdHJhbnMtPnByb3RvY29sIHwgKHRyYW5zLT50cmFuc2FjdGlvbl9pZCA8PCA0KTsKKwkJbXNnLT5sY2hhbiA9IHRyYW5zLT5jb25uLT5sY2hhbjsKKwl9CisKKwlpZiAobXNnLT5sY2hhbikgeworCQltc2ctPnRyeCA9IG1zZy0+bGNoYW4tPnRzLT50cng7CisKKwkJaWYgKChnaC0+cHJvdG9fZGlzY3IgJiBHU000OF9QRElTQ19NQVNLKSA9PSBHU000OF9QRElTQ19DQykKKwkJCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCB0aSAlMDJ4KSAiCisJCQkJIlNlbmRpbmcgJyVzJyB0byBNUy5cbiIsIG1zZy0+dHJ4LT5idHMtPm5yLAorCQkJCW1zZy0+dHJ4LT5uciwgbXNnLT5sY2hhbi0+dHMtPm5yLAorCQkJCWdoLT5wcm90b19kaXNjciAmIDB4ZjAsCisJCQkJZ3NtNDhfY2NfbXNnX25hbWUoZ2gtPm1zZ190eXBlKSk7CisJCWVsc2UKKwkJCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCBwZCAlMDJ4KSAiCisJCQkJIlNlbmRpbmcgMHglMDJ4IHRvIE1TLlxuIiwgbXNnLT50cngtPmJ0cy0+bnIsCisJCQkJbXNnLT50cngtPm5yLCBtc2ctPmxjaGFuLT50cy0+bnIsCisJCQkJZ2gtPnByb3RvX2Rpc2NyLCBnaC0+bXNnX3R5cGUpOworCX0KKworCW1zZy0+bDNoID0gbXNnLT5kYXRhOworCisJcmV0dXJuIHJzbF9kYXRhX3JlcXVlc3QobXNnLCAwKTsKK30KKworLyogU2VjdGlvbiA5LjEuOCAvIFRhYmxlIDkuOSAqLworc3RydWN0IGNocmVxIHsKKwl1X2ludDhfdCB2YWw7CisJdV9pbnQ4X3QgbWFzazsKKwllbnVtIGNocmVxX3R5cGUgdHlwZTsKK307CisKKy8qIElmIFNZU1RFTSBJTkZPUk1BVElPTiBUWVBFIDQgTkVDSSBiaXQgPT0gMSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjaHJlcSBjaHJlcV90eXBlX25lY2kxW10gPSB7CisJeyAweGEwLCAweGUwLCBDSFJFUV9UX0VNRVJHX0NBTEwgfSwKKwl7IDB4YzAsIDB4ZTAsIENIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfRiB9LAorCXsgMHg2OCwgMHhmYywgQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IIH0sCisJeyAweDZjLCAweGZjLCBDSFJFUV9UX0NBTExfUkVFU1RfVENIX0hfREJMIH0sCisJeyAweGUwLCAweGUwLCBDSFJFUV9UX1NEQ0NIIH0sCisJeyAweDQwLCAweGYwLCBDSFJFUV9UX1ZPSUNFX0NBTExfVENIX0ggfSwKKwl7IDB4NTAsIDB4ZjAsIENIUkVRX1RfREFUQV9DQUxMX1RDSF9IIH0sCisJeyAweDAwLCAweGYwLCBDSFJFUV9UX0xPQ0FUSU9OX1VQRCB9LAorCXsgMHgxMCwgMHhmMCwgQ0hSRVFfVF9TRENDSCB9LAorCXsgMHg4MCwgMHhlMCwgQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTEgfSwKKwl7IDB4MjAsIDB4ZjAsIENIUkVRX1RfUEFHX1JfVENIX0YgfSwKKwl7IDB4MzAsIDB4ZjAsIENIUkVRX1RfUEFHX1JfVENIX0ZIIH0sCisJeyAweDY3LCAweGZmLCBDSFJFUV9UX0xNVSB9LAorCXsgMHg2MCwgMHhmOSwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg2MSwgMHhmYiwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg2MywJMHhmZiwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg3ZiwgMHhmZiwgQ0hSRVFfVF9SRVNFUlZFRF9JR05PUkUgfSwKK307CisKKy8qIElmIFNZU1RFTSBJTkZPUk1BVElPTiBUWVBFIDQgTkVDSSBiaXQgPT0gMCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjaHJlcSBjaHJlcV90eXBlX25lY2kwW10gPSB7CisJeyAweGEwLCAweGUwLCBDSFJFUV9UX0VNRVJHX0NBTEwgfSwKKwl7IDB4YzAsIDB4ZTAsIENIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSCB9LAorCXsgMHhlMCwgMHhlMCwgQ0hSRVFfVF9UQ0hfRiB9LAorCXsgMHg1MCwgMHhmMCwgQ0hSRVFfVF9EQVRBX0NBTExfVENIX0ggfSwKKwl7IDB4MDAsIDB4ZTAsIENIUkVRX1RfTE9DQVRJT05fVVBEIH0sCisJeyAweDgwLCAweGUwLCBDSFJFUV9UX1BBR19SX0FOWV9ORUNJMCB9LAorCXsgMHgyMCwgMHhmMCwgQ0hSRVFfVF9QQUdfUl9UQ0hfRiB9LAorCXsgMHgzMCwgMHhmMCwgQ0hSRVFfVF9QQUdfUl9UQ0hfRkggfSwKKwl7IDB4NjcsIDB4ZmYsIENIUkVRX1RfTE1VIH0sCisJeyAweDYwLCAweGY5LCBDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIIH0sCisJeyAweDYxLCAweGZiLCBDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIIH0sCisJeyAweDYzLAkweGZmLCBDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIIH0sCisJeyAweDdmLCAweGZmLCBDSFJFUV9UX1JFU0VSVkVEX0lHTk9SRSB9LAorfTsKKworc3RhdGljIGNvbnN0IGVudW0gZ3NtX2NoYW5fdCBjdHlwZV9ieV9jaHJlcVtdID0geworCVtDSFJFUV9UX0VNRVJHX0NBTExdCQk9IEdTTV9MQ0hBTl9UQ0hfRiwKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9GXQk9IEdTTV9MQ0hBTl9UQ0hfRiwKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IXQk9IEdTTV9MQ0hBTl9UQ0hfSCwKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IX0RCTF0JPSBHU01fTENIQU5fVENIX0gsCisJW0NIUkVRX1RfU0RDQ0hdCQkJPSBHU01fTENIQU5fU0RDQ0gsCisJW0NIUkVRX1RfVENIX0ZdCQkJPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfVk9JQ0VfQ0FMTF9UQ0hfSF0JPSBHU01fTENIQU5fVENIX0gsCisJW0NIUkVRX1RfREFUQV9DQUxMX1RDSF9IXQk9IEdTTV9MQ0hBTl9UQ0hfSCwKKwlbQ0hSRVFfVF9MT0NBVElPTl9VUERdCQk9IEdTTV9MQ0hBTl9TRENDSCwKKwlbQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTFdCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1BBR19SX0FOWV9ORUNJMF0JPSBHU01fTENIQU5fU0RDQ0gsCisJW0NIUkVRX1RfUEFHX1JfVENIX0ZdCQk9IEdTTV9MQ0hBTl9UQ0hfRiwKKwlbQ0hSRVFfVF9QQUdfUl9UQ0hfRkhdCQk9IEdTTV9MQ0hBTl9UQ0hfRiwKKwlbQ0hSRVFfVF9MTVVdCQkJPSBHU01fTENIQU5fU0RDQ0gsCisJW0NIUkVRX1RfUkVTRVJWRURfU0RDQ0hdCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1JFU0VSVkVEX0lHTk9SRV0JPSBHU01fTENIQU5fVU5LTk9XTiwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIGdzbV9jaHJlcV9yZWFzb25fdCByZWFzb25fYnlfY2hyZXFbXSA9IHsKKwlbQ0hSRVFfVF9FTUVSR19DQUxMXQkJPSBHU01fQ0hSRVFfUkVBU09OX0VNRVJHLAorCVtDSFJFUV9UX0NBTExfUkVFU1RfVENIX0ZdCT0gR1NNX0NIUkVRX1JFQVNPTl9DQUxMLAorCVtDSFJFUV9UX0NBTExfUkVFU1RfVENIX0hdCT0gR1NNX0NIUkVRX1JFQVNPTl9DQUxMLAorCVtDSFJFUV9UX0NBTExfUkVFU1RfVENIX0hfREJMXQk9IEdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlbQ0hSRVFfVF9TRENDSF0JCQk9IEdTTV9DSFJFUV9SRUFTT05fT1RIRVIsCisJW0NIUkVRX1RfVENIX0ZdCQkJPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorCVtDSFJFUV9UX1ZPSUNFX0NBTExfVENIX0hdCT0gR1NNX0NIUkVRX1JFQVNPTl9DQUxMLAorCVtDSFJFUV9UX0RBVEFfQ0FMTF9UQ0hfSF0JPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorCVtDSFJFUV9UX0xPQ0FUSU9OX1VQRF0JCT0gR1NNX0NIUkVRX1JFQVNPTl9MT0NBVElPTl9VUEQsCisJW0NIUkVRX1RfUEFHX1JfQU5ZX05FQ0kxXQk9IEdTTV9DSFJFUV9SRUFTT05fUEFHLAorCVtDSFJFUV9UX1BBR19SX0FOWV9ORUNJMF0JPSBHU01fQ0hSRVFfUkVBU09OX1BBRywKKwlbQ0hSRVFfVF9QQUdfUl9UQ0hfRl0JCT0gR1NNX0NIUkVRX1JFQVNPTl9QQUcsCisJW0NIUkVRX1RfUEFHX1JfVENIX0ZIXQkJPSBHU01fQ0hSRVFfUkVBU09OX1BBRywKKwlbQ0hSRVFfVF9MTVVdCQkJPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorCVtDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIXQk9IEdTTV9DSFJFUV9SRUFTT05fT1RIRVIsCisJW0NIUkVRX1RfUkVTRVJWRURfSUdOT1JFXQk9IEdTTV9DSFJFUV9SRUFTT05fT1RIRVIsCit9OworCitlbnVtIGdzbV9jaGFuX3QgZ2V0X2N0eXBlX2J5X2NocmVxKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHJhLCBpbnQgbmVjaSkKK3sKKwlpbnQgaTsKKwlpbnQgbGVuZ3RoOworCWNvbnN0IHN0cnVjdCBjaHJlcSAqY2hyZXE7CisKKwlpZiAobmVjaSkgeworCQljaHJlcSA9IGNocmVxX3R5cGVfbmVjaTE7CisJCWxlbmd0aCA9IEFSUkFZX1NJWkUoY2hyZXFfdHlwZV9uZWNpMSk7CisJfSBlbHNlIHsKKwkJY2hyZXEgPSBjaHJlcV90eXBlX25lY2kwOworCQlsZW5ndGggPSBBUlJBWV9TSVpFKGNocmVxX3R5cGVfbmVjaTApOworCX0KKworCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBjaHJlcSAqY2hyID0gJmNocmVxW2ldOworCQlpZiAoKHJhICYgY2hyLT5tYXNrKSA9PSBjaHItPnZhbCkKKwkJCXJldHVybiBjdHlwZV9ieV9jaHJlcVtjaHItPnR5cGVdOworCX0KKwlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIlVua25vd24gQ0hBTk5FTCBSRVFVRVNUIFJRRCAweCUwMnhcbiIsIHJhKTsKKwlyZXR1cm4gR1NNX0xDSEFOX1NEQ0NIOworfQorCitlbnVtIGdzbV9jaHJlcV9yZWFzb25fdCBnZXRfcmVhc29uX2J5X2NocmVxKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHJhLCBpbnQgbmVjaSkKK3sKKwlpbnQgaTsKKwlpbnQgbGVuZ3RoOworCWNvbnN0IHN0cnVjdCBjaHJlcSAqY2hyZXE7CisKKwlpZiAobmVjaSkgeworCQljaHJlcSA9IGNocmVxX3R5cGVfbmVjaTE7CisJCWxlbmd0aCA9IEFSUkFZX1NJWkUoY2hyZXFfdHlwZV9uZWNpMSk7CisJfSBlbHNlIHsKKwkJY2hyZXEgPSBjaHJlcV90eXBlX25lY2kwOworCQlsZW5ndGggPSBBUlJBWV9TSVpFKGNocmVxX3R5cGVfbmVjaTApOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgY2hyZXEgKmNociA9ICZjaHJlcVtpXTsKKwkJaWYgKChyYSAmIGNoci0+bWFzaykgPT0gY2hyLT52YWwpCisJCQlyZXR1cm4gcmVhc29uX2J5X2NocmVxW2Noci0+dHlwZV07CisJfQorCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiVW5rbm93biBDSEFOTkVMIFJFUVVFU1QgUkVBU09OIDB4JTAyeFxuIiwgcmEpOworCXJldHVybiBHU01fQ0hSRVFfUkVBU09OX09USEVSOworfQorCisvKiA3LjEuNyBhbmQgOS4xLjc6IFJSIENIQU5uZWwgUkVMZWFzZSAqLworaW50IGdzbTQ4X3NlbmRfcnJfcmVsZWFzZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJdV9pbnQ4X3QgKmNhdXNlOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1JSOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX1JSX0NIQU5fUkVMOworCisJY2F1c2UgPSBtc2diX3B1dChtc2csIDEpOworCWNhdXNlWzBdID0gR1NNNDhfUlJfQ0FVU0VfTk9STUFMOworCisJREVCVUdQKERSUiwgIlNlbmRpbmcgQ2hhbm5lbCBSZWxlYXNlOiBDaGFuOiBOdW1iZXI6ICVkIFR5cGU6ICVkXG4iLAorCQlsY2hhbi0+bnIsIGxjaGFuLT50eXBlKTsKKworCS8qIFNlbmQgYWN0dWFsIHJlbGVhc2UgcmVxdWVzdCB0byBNUyAqLworCWdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKKwkvKiBGSVhNRTogU3RhcnQgVGltZXIgVDMxMDkgKi8KKworCS8qIERlYWN0aXZhdGUgdGhlIFNBQ0NIIG9uIHRoZSBCVFMgc2lkZSAqLworCXJldHVybiByc2xfZGVhY3Rfc2FjY2gobGNoYW4pOworfQorCisvKiBDb252ZXJ0IE1vYmlsZSBJZGVudGl0eSAoMTAuNS4xLjQpIHRvIHN0cmluZyAqLworaW50IGdzbTQ4X21pX3RvX3N0cmluZyhjaGFyICpzdHJpbmcsIGNvbnN0IGludCBzdHJfbGVuLCBjb25zdCB1X2ludDhfdCAqbWksIGNvbnN0IGludCBtaV9sZW4pCit7CisJaW50IGk7CisJdV9pbnQ4X3QgbWlfdHlwZTsKKwljaGFyICpzdHJfY3VyID0gc3RyaW5nOworCXVfaW50MzJfdCB0bXNpOworCisJbWlfdHlwZSA9IG1pWzBdICYgR1NNX01JX1RZUEVfTUFTSzsKKworCXN3aXRjaCAobWlfdHlwZSkgeworCWNhc2UgR1NNX01JX1RZUEVfTk9ORToKKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9UTVNJOgorCQkvKiBUYWJsZSAxMC41LjQuMywgcmV2ZXJzZSBnZW5lcmF0ZV9taWRfZnJvbV90bXNpICovCisJCWlmIChtaV9sZW4gPT0gR1NNNDhfVE1TSV9MRU4gJiYgbWlbMF0gPT0gKDB4ZjAgfCBHU01fTUlfVFlQRV9UTVNJKSkgeworCQkJbWVtY3B5KCZ0bXNpLCAmbWlbMV0sIDQpOworCQkJdG1zaSA9IG50b2hsKHRtc2kpOworCQkJcmV0dXJuIHNucHJpbnRmKHN0cmluZywgc3RyX2xlbiwgIiV1IiwgdG1zaSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9JTVNJOgorCWNhc2UgR1NNX01JX1RZUEVfSU1FSToKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUlTVjoKKwkJKnN0cl9jdXIrKyA9IGJjZDJjaGFyKG1pWzBdID4+IDQpOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IG1pX2xlbjsgaSsrKSB7CisJCQlpZiAoc3RyX2N1ciArIDIgPj0gc3RyaW5nICsgc3RyX2xlbikKKwkJCQlyZXR1cm4gc3RyX2N1ciAtIHN0cmluZzsKKwkJCSpzdHJfY3VyKysgPSBiY2QyY2hhcihtaVtpXSAmIDB4Zik7CisJCQkvKiBza2lwIGxhc3QgbmliYmxlIGluIGxhc3QgaW5wdXQgYnl0ZSB3aGVuIEdTTV9FVkVOICovCisJCQlpZiggKGkgIT0gbWlfbGVuLTEpIHx8IChtaVswXSAmIEdTTV9NSV9PREQpKQorCQkJCSpzdHJfY3VyKysgPSBiY2QyY2hhcihtaVtpXSA+PiA0KTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJKnN0cl9jdXIrKyA9ICdcMCc7CisKKwlyZXR1cm4gc3RyX2N1ciAtIHN0cmluZzsKK30KKworCitpbnQgc2VuZF9zaWVtZW5zX21ycGNpKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkgICAgICAgdV9pbnQ4X3QgKmNsYXNzbWFyazJfbHYpCit7CisJc3RydWN0IHJzbF9tcnBjaSBtcnBjaTsKKworCWlmIChjbGFzc21hcmsyX2x2WzBdIDwgMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltcnBjaS5wb3dlcl9jbGFzcyA9IGNsYXNzbWFyazJfbHZbMV0gJiAweDc7CisJbXJwY2kudmdjc19jYXBhYmxlID0gY2xhc3NtYXJrMl9sdlsyXSAmICgxIDw8IDEpOworCW1ycGNpLnZic19jYXBhYmxlID0gY2xhc3NtYXJrMl9sdlsyXSAmICgxIDw8Mik7CisJbXJwY2kuZ3NtX3BoYXNlID0gKGNsYXNzbWFyazJfbHZbMV0pID4+IDUgJiAweDM7CisKKwlyZXR1cm4gcnNsX3NpZW1lbnNfbXJwY2kobGNoYW4sICZtcnBjaSk7Cit9CisKK2ludCBnc200OF9wYWdpbmdfZXh0cmFjdF9taShzdHJ1Y3QgbXNnYiAqbXNnLCBjaGFyICptaV9zdHJpbmcsIHVfaW50OF90ICptaV90eXBlKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90ICpjbGFzc21hcmsyX2x2ID0gZ2gtPmRhdGEgKyAxOworCXVfaW50OF90ICptaV9sdiA9IGdoLT5kYXRhICsgMiArICpjbGFzc21hcmsyX2x2OworCSptaV90eXBlID0gbWlfbHZbMV0gJiBHU01fTUlfVFlQRV9NQVNLOworCisJcmV0dXJuIGdzbTQ4X21pX3RvX3N0cmluZyhtaV9zdHJpbmcsIEdTTTQ4X01JX1NJWkUsIG1pX2x2KzEsICptaV9sdik7Cit9CisKK2ludCBnc200OF9oYW5kbGVfcGFnaW5nX3Jlc3Aoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCAqY2xhc3NtYXJrMl9sdiA9IGdoLT5kYXRhICsgMTsKKwlzdHJ1Y3QgcGFnaW5nX3NpZ25hbF9kYXRhIHNpZ19kYXRhOworCisJaWYgKGlzX3NpZW1lbnNfYnRzKGJ0cykpCisJCXNlbmRfc2llbWVuc19tcnBjaShtc2ctPmxjaGFuLCBjbGFzc21hcmsyX2x2KTsKKworCWlmICghbXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IpIHsKKwkJbXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IgPSBzdWJzY3I7CisJfSBlbHNlIGlmIChtc2ctPmxjaGFuLT5jb25uLnN1YnNjciAhPSBzdWJzY3IpIHsKKwkJTE9HUChEUlIsIExPR0xfRVJST1IsICI8LSBDaGFubmVsIGFscmVhZHkgb3duZWQgYnkgc29tZW9uZSBlbHNlP1xuIik7CisJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJREVCVUdQKERSUiwgIjwtIENoYW5uZWwgYWxyZWFkeSBvd25lZCBieSB1c1xuIik7CisJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwkJc3Vic2NyID0gbXNnLT5sY2hhbi0+Y29ubi5zdWJzY3I7CisJfQorCisJc2lnX2RhdGEuc3Vic2NyID0gc3Vic2NyOworCXNpZ19kYXRhLmJ0cwk9IG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0czsKKwlzaWdfZGF0YS5sY2hhbgk9IG1zZy0+bGNoYW47CisKKwlidHMtPm5ldHdvcmstPnN0YXRzLnBhZ2luZy5jb21wbGV0ZWQrKzsKKworCWRpc3BhdGNoX3NpZ25hbChTU19QQUdJTkcsIFNfUEFHSU5HX1NVQ0NFRURFRCwgJnNpZ19kYXRhKTsKKworCS8qIFN0b3AgcGFnaW5nIG9uIHRoZSBidHMgd2UgcmVjZWl2ZWQgdGhlIHBhZ2luZyByZXNwb25zZSAqLworCXBhZ2luZ19yZXF1ZXN0X3N0b3AobXNnLT50cngtPmJ0cywgc3Vic2NyLCBtc2ctPmxjaGFuKTsKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA5LjEuOTogQ2lwaGVyaW5nIE1vZGUgQ29tbWFuZCAqLworaW50IGdzbTQ4X3NlbmRfcnJfY2lwaF9tb2RlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBpbnQgd2FudF9pbWVpc3YpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKwl1X2ludDhfdCBjaXBoX21vZF9zZXQ7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisKKwlERUJVR1AoRFJSLCAiVFggQ0lQSEVSSU5HIE1PREUgQ01EXG4iKTsKKworCWlmIChsY2hhbi0+ZW5jci5hbGdfaWQgPD0gUlNMX0VOQ19BTEdfQTUoMCkpCisJCWNpcGhfbW9kX3NldCA9IDA7CisJZWxzZQorCQljaXBoX21vZF9zZXQgPSAobGNoYW4tPmVuY3IuYWxnX2lkLTIpPDwxIHwgMTsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSArIDEpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1JSOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX1JSX0NJUEhfTV9DTUQ7CisJZ2gtPmRhdGFbMF0gPSAod2FudF9pbWVpc3YgJiAweDEpIDw8IDQgfCAoY2lwaF9tb2Rfc2V0ICYgMHhmKTsKKworCXJldHVybiByc2xfZW5jcnlwdGlvbl9jbWQobXNnKTsKK30KKworc3RhdGljIHZvaWQgZ3NtNDhfY2VsbF9kZXNjKHN0cnVjdCBnc200OF9jZWxsX2Rlc2MgKmNkLAorCQkJICAgIGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJY2QtPm5jYyA9IChidHMtPmJzaWMgPj4gMyAmIDB4Nyk7CisJY2QtPmJjYyA9IChidHMtPmJzaWMgJiAweDcpOworCWNkLT5hcmZjbl9oaSA9IGJ0cy0+YzAtPmFyZmNuID4+IDg7CisJY2QtPmFyZmNuX2xvID0gYnRzLT5jMC0+YXJmY24gJiAweGZmOworfQorCitzdGF0aWMgdm9pZCBnc200OF9jaGFuX2Rlc2Moc3RydWN0IGdzbTQ4X2NoYW5fZGVzYyAqY2QsCisJCQkgICAgY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJdV9pbnQxNl90IGFyZmNuID0gbGNoYW4tPnRzLT50cngtPmFyZmNuICYgMHgzZmY7CisKKwljZC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCWNkLT5oMC50c2MgPSBsY2hhbi0+dHMtPnRyeC0+YnRzLT50c2M7CisJY2QtPmgwLmggPSAwOworCWNkLT5oMC5hcmZjbl9oaWdoID0gYXJmY24gPj4gODsKKwljZC0+aDAuYXJmY25fbG93ID0gYXJmY24gJiAweGZmOworfQorCisvKiBDaGFwdGVyIDkuMS4xNTogSGFuZG92ZXIgQ29tbWFuZCAqLworaW50IGdzbTQ4X3NlbmRfaG9fY21kKHN0cnVjdCBnc21fbGNoYW4gKm9sZF9sY2hhbiwgc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuLAorCQkgICAgICB1X2ludDhfdCBwb3dlcl9jb21tYW5kLCB1X2ludDhfdCBob19yZWYpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCXN0cnVjdCBnc200OF9ob19jbWQgKmhvID0KKwkJKHN0cnVjdCBnc200OF9ob19jbWQgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmhvKSk7CisKKwltc2ctPmxjaGFuID0gb2xkX2xjaGFuOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1JSOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX1JSX0hBTkRPX0NNRDsKKworCS8qIG1hbmRhdG9yeSBiaXRzICovCisJZ3NtNDhfY2VsbF9kZXNjKCZoby0+Y2VsbF9kZXNjLCBuZXdfbGNoYW4tPnRzLT50cngtPmJ0cyk7CisJZ3NtNDhfY2hhbl9kZXNjKCZoby0+Y2hhbl9kZXNjLCBuZXdfbGNoYW4pOworCWhvLT5ob19yZWYgPSBob19yZWY7CisJaG8tPnBvd2VyX2NvbW1hbmQgPSBwb3dlcl9jb21tYW5kOworCisJLyogRklYTUU6IG9wdGlvbmFsIGJpdHMgZm9yIHR5cGUgb2Ygc3luY2hyb25pemF0aW9uPyAqLworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworLyogQ2hhcHRlciA5LjEuMjogQXNzaWdubWVudCBDb21tYW5kICovCitpbnQgZ3NtNDhfc2VuZF9ycl9hc3NfY21kKHN0cnVjdCBnc21fbGNoYW4gKmRlc3RfbGNoYW4sIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBwb3dlcl9jb21tYW5kKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlzdHJ1Y3QgZ3NtNDhfYXNzX2NtZCAqYXNzID0KKwkJKHN0cnVjdCBnc200OF9hc3NfY21kICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCphc3MpKTsKKworCURFQlVHUChEUlIsICItPiBBU1NJR05NRU5UIENPTU1BTkQgdGNoX21vZGU9MHglMDJ4XG4iLCBsY2hhbi0+dGNoX21vZGUpOworCisJbXNnLT5sY2hhbiA9IGRlc3RfbGNoYW47CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfUlI7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfUlJfQVNTX0NNRDsKKworCS8qCisJICogZmlsbCB0aGUgY2hhbm5lbCBpbmZvcm1hdGlvbiBlbGVtZW50LCB0aGlzIGNvZGUKKwkgKiBzaG91bGQgcHJvYmFibHkgYmUgc2hhcmVkIHdpdGggcnNsX3J4X2NoYW5fcnFkKCksCisJICogZ3NtNDhfdHhfY2hhbl9tb2RlX21vZGlmeS4gQnV0IGJld2FyZSB0aGF0IDEwLjUuMi41CisJICogMTAuNS4yLjUuYSBoYXZlIHNsaWdodGx5IGRpZmZlcmVudCBzZW1hbnRpYyBmb3IKKwkgKiB0aGUgY2hhbl9kZXNjLiBCdXQgYXMgbG9uZyBhcyBtdWx0aS1zbG90IGNvbmZpZ3VyYXRpb25zCisJICogYXJlIG5vdCB1c2VkIHdlIHNlZW0gdG8gYmUgZmluZS4KKwkgKi8KKwlnc200OF9jaGFuX2Rlc2MoJmFzcy0+Y2hhbl9kZXNjLCBsY2hhbik7CisJYXNzLT5wb3dlcl9jb21tYW5kID0gcG93ZXJfY29tbWFuZDsKKworCW1zZ2JfdHZfcHV0KG1zZywgR1NNNDhfSUVfQ0hBTk1PREVfMSwgbGNoYW4tPnRjaF9tb2RlKTsKKworCS8qIGluIGNhc2Ugb2YgbXVsdGkgcmF0ZSB3ZSBuZWVkIHRvIGF0dGFjaCBhIGNvbmZpZyAqLworCWlmIChsY2hhbi0+dGNoX21vZGUgPT0gR1NNNDhfQ01PREVfU1BFRUNIX0FNUikgeworCQlpZiAobGNoYW4tPm1yX2NvbmYudmVyID09IDApIHsKKwkJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiQlVHOiBVc2luZyBtdWx0aXJhdGUgY29kZWMgIgorCQkJCSJ3aXRob3V0IG11bHRpcmF0ZSBjb25maWcuXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXVfaW50OF90ICpkYXRhID0gbXNnYl9wdXQobXNnLCA0KTsKKwkJCWRhdGFbMF0gPSBHU000OF9JRV9NVUxfUkFURV9DRkc7CisJCQlkYXRhWzFdID0gMHgyOworCQkJbWVtY3B5KCZkYXRhWzJdLCAmbGNoYW4tPm1yX2NvbmYsIDIpOworCQl9CisJfQorCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworLyogOS4xLjUgQ2hhbm5lbCBtb2RlIG1vZGlmeTogTW9kaWZ5IHRoZSBtb2RlIG9uIHRoZSBNUyBzaWRlICovCitpbnQgZ3NtNDhfdHhfY2hhbl9tb2RlX21vZGlmeShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbW9kZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJc3RydWN0IGdzbTQ4X2NoYW5fbW9kZV9tb2RpZnkgKmNtbSA9CisJCShzdHJ1Y3QgZ3NtNDhfY2hhbl9tb2RlX21vZGlmeSAqKSBtc2diX3B1dChtc2csIHNpemVvZigqY21tKSk7CisJdV9pbnQxNl90IGFyZmNuID0gbGNoYW4tPnRzLT50cngtPmFyZmNuICYgMHgzZmY7CisKKwlERUJVR1AoRFJSLCAiLT4gQ0hBTk5FTCBNT0RFIE1PRElGWSBtb2RlPTB4JTAyeFxuIiwgbW9kZSk7CisKKwlsY2hhbi0+dGNoX21vZGUgPSBtb2RlOworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19SUjsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9SUl9DSEFOX01PREVfTU9ESUY7CisKKwkvKiBmaWxsIHRoZSBjaGFubmVsIGluZm9ybWF0aW9uIGVsZW1lbnQsIHRoaXMgY29kZQorCSAqIHNob3VsZCBwcm9iYWJseSBiZSBzaGFyZWQgd2l0aCByc2xfcnhfY2hhbl9ycWQoKSAqLworCWNtbS0+Y2hhbl9kZXNjLmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwljbW0tPmNoYW5fZGVzYy5oMC50c2MgPSBsY2hhbi0+dHMtPnRyeC0+YnRzLT50c2M7CisJY21tLT5jaGFuX2Rlc2MuaDAuaCA9IDA7CisJY21tLT5jaGFuX2Rlc2MuaDAuYXJmY25faGlnaCA9IGFyZmNuID4+IDg7CisJY21tLT5jaGFuX2Rlc2MuaDAuYXJmY25fbG93ID0gYXJmY24gJiAweGZmOworCWNtbS0+bW9kZSA9IG1vZGU7CisKKwkvKiBpbiBjYXNlIG9mIG11bHRpIHJhdGUgd2UgbmVlZCB0byBhdHRhY2ggYSBjb25maWcgKi8KKwlpZiAobGNoYW4tPnRjaF9tb2RlID09IEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVIpIHsKKwkJaWYgKGxjaGFuLT5tcl9jb25mLnZlciA9PSAwKSB7CisJCQlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIkJVRzogVXNpbmcgbXVsdGlyYXRlIGNvZGVjICIKKwkJCQkid2l0aG91dCBtdWx0aXJhdGUgY29uZmlnLlxuIik7CisJCX0gZWxzZSB7CisJCQl1X2ludDhfdCAqZGF0YSA9IG1zZ2JfcHV0KG1zZywgNCk7CisJCQlkYXRhWzBdID0gR1NNNDhfSUVfTVVMX1JBVEVfQ0ZHOworCQkJZGF0YVsxXSA9IDB4MjsKKwkJCW1lbWNweSgmZGF0YVsyXSwgJmxjaGFuLT5tcl9jb25mLCAyKTsKKwkJfQorCX0KKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKK2ludCBnc200OF9sY2hhbl9tb2RpZnkoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxjaGFuX21vZGUpCit7CisJaW50IHJjOworCisJcmMgPSBnc200OF90eF9jaGFuX21vZGVfbW9kaWZ5KGxjaGFuLCBsY2hhbl9tb2RlKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBnc200OF9yeF9ycl9tb2RpZl9hY2soc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlpbnQgcmM7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbTQ4X2NoYW5fbW9kZV9tb2RpZnkgKm1vZCA9CisJCQkJKHN0cnVjdCBnc200OF9jaGFuX21vZGVfbW9kaWZ5ICopIGdoLT5kYXRhOworCisJREVCVUdQKERSUiwgIkNIQU5ORUwgTU9ERSBNT0RJRlkgQUNLXG4iKTsKKworCWlmIChtb2QtPm1vZGUgIT0gbXNnLT5sY2hhbi0+dGNoX21vZGUpIHsKKwkJTE9HUChEUlIsIExPR0xfRVJST1IsICJDSEFOTkVMIE1PREUgY2hhbmdlIGZhaWxlZC4gV2FudGVkOiAlZCBHb3Q6ICVkXG4iLAorCQkJbXNnLT5sY2hhbi0+dGNoX21vZGUsIG1vZC0+bW9kZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiB1cGRhdGUgdGhlIGNoYW5uZWwgdHlwZSAqLworCXN3aXRjaCAobW9kLT5tb2RlKSB7CisJY2FzZSBHU000OF9DTU9ERV9TSUdOOgorCQltc2ctPmxjaGFuLT5yc2xfY21vZGUgPSBSU0xfQ01PRF9TUERfU0lHTjsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfVjE6CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfRUZSOgorCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX0FNUjoKKwkJbXNnLT5sY2hhbi0+cnNsX2Ntb2RlID0gUlNMX0NNT0RfU1BEX1NQRUVDSDsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9EQVRBXzE0azU6CisJY2FzZSBHU000OF9DTU9ERV9EQVRBXzEyazA6CisJY2FzZSBHU000OF9DTU9ERV9EQVRBXzZrMDoKKwljYXNlIEdTTTQ4X0NNT0RFX0RBVEFfM2s2OgorCQltc2ctPmxjaGFuLT5yc2xfY21vZGUgPSBSU0xfQ01PRF9TUERfREFUQTsKKwkJYnJlYWs7CisJfQorCisJLyogV2UndmUgc3VjY2Vzc2Z1bGx5IG1vZGlmaWVkIHRoZSBNUyBzaWRlIG9mIHRoZSBjaGFubmVsLAorCSAqIG5vdyBnbyBvbiB0byBtb2RpZnkgdGhlIEJUUyBzaWRlIG9mIHRoZSBjaGFubmVsICovCisJcmMgPSByc2xfY2hhbl9tb2RlX21vZGlmeV9yZXEobXNnLT5sY2hhbik7CisKKwkvKiBGSVhNRTogd2Ugbm90IG9ubHkgbmVlZCB0byBkbyB0aGlzIGFmdGVyIG1vZGUgbW9kaWZ5LCBidXQKKwkgKiBhbHNvIGFmdGVyIGNoYW5uZWwgYWN0aXZhdGlvbiAqLworCWlmIChpc19pcGFjY2Vzc19idHMobXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzKSAmJiBtb2QtPm1vZGUgIT0gR1NNNDhfQ01PREVfU0lHTikKKwkJcnNsX2lwYWNjX2NyY3gobXNnLT5sY2hhbik7CisJcmV0dXJuIHJjOworfQorCitpbnQgZ3NtNDhfcGFyc2VfbWVhc19yZXAoc3RydWN0IGdzbV9tZWFzX3JlcCAqcmVwLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXVfaW50OF90ICpkYXRhID0gZ2gtPmRhdGE7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgYml0dmVjICpuYnYgPSAmYnRzLT5zaV9jb21tb24ubmVpZ2hfbGlzdDsKKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwX2NlbGwgKm1yYzsKKworCWlmIChnaC0+bXNnX3R5cGUgIT0gR1NNNDhfTVRfUlJfTUVBU19SRVApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGRhdGFbMF0gJiAweDgwKQorCQlyZXAtPmZsYWdzIHw9IE1FQVNfUkVQX0ZfQkExOworCWlmIChkYXRhWzBdICYgMHg0MCkKKwkJcmVwLT5mbGFncyB8PSBNRUFTX1JFUF9GX1VMX0RUWDsKKwlpZiAoKGRhdGFbMV0gJiAweDQwKSA9PSAweDAwKQorCQlyZXAtPmZsYWdzIHw9IE1FQVNfUkVQX0ZfRExfVkFMSUQ7CisKKwlyZXAtPmRsLmZ1bGwucnhfbGV2ID0gZGF0YVswXSAmIDB4M2Y7CisJcmVwLT5kbC5zdWIucnhfbGV2ID0gZGF0YVsxXSAmIDB4M2Y7CisJcmVwLT5kbC5mdWxsLnJ4X3F1YWwgPSAoZGF0YVszXSA+PiA0KSAmIDB4NzsKKwlyZXAtPmRsLnN1Yi5yeF9xdWFsID0gKGRhdGFbM10gPj4gMSkgJiAweDc7CisKKwlyZXAtPm51bV9jZWxsID0gKChkYXRhWzNdID4+IDYpICYgMHgzKSB8ICgoZGF0YVsyXSAmIDB4MDEpIDw8IDIpOworCWlmIChyZXAtPm51bV9jZWxsIDwgMSB8fCByZXAtPm51bV9jZWxsID4gNikKKwkJcmV0dXJuIDA7CisKKwkvKiBhbiBlbmNvZGluZyBuaWdodG1hcmUgaW4gcGVyZmVjdGlvbiAqLworCW1yYyA9ICZyZXAtPmNlbGxbMF07CisJbXJjLT5yeGxldiA9IGRhdGFbM10gJiAweDNmOworCW1yYy0+bmVpZ2hfaWR4ID0gZGF0YVs0XSA+PiAzOworCW1yYy0+YXJmY24gPSBiaXR2ZWNfZ2V0X250aF9zZXRfYml0KG5idiwgbXJjLT5uZWlnaF9pZHggKyAxKTsKKwltcmMtPmJzaWMgPSAoKGRhdGFbNF0gJiAweDA3KSA8PCAzKSB8IChkYXRhWzVdID4+IDUpOworCWlmIChyZXAtPm51bV9jZWxsIDwgMikKKwkJcmV0dXJuIDA7CisKKwltcmMgPSAmcmVwLT5jZWxsWzFdOworCW1yYy0+cnhsZXYgPSAoKGRhdGFbNV0gJiAweDFmKSA8PCAxKSB8IChkYXRhWzZdID4+IDcpOworCW1yYy0+bmVpZ2hfaWR4ID0gKGRhdGFbNl0gPj4gMikgJiAweDFmOworCW1yYy0+YXJmY24gPSBiaXR2ZWNfZ2V0X250aF9zZXRfYml0KG5idiwgbXJjLT5uZWlnaF9pZHggKyAxKTsKKwltcmMtPmJzaWMgPSAoKGRhdGFbNl0gJiAweDAzKSA8PCA0KSB8IChkYXRhWzddID4+IDQpOworCWlmIChyZXAtPm51bV9jZWxsIDwgMykKKwkJcmV0dXJuIDA7CisKKwltcmMgPSAmcmVwLT5jZWxsWzJdOworCW1yYy0+cnhsZXYgPSAoKGRhdGFbN10gJiAweDBmKSA8PCAyKSB8IChkYXRhWzhdID4+IDYpOworCW1yYy0+bmVpZ2hfaWR4ID0gKGRhdGFbOF0gPj4gMSkgJiAweDFmOworCW1yYy0+YXJmY24gPSBiaXR2ZWNfZ2V0X250aF9zZXRfYml0KG5idiwgbXJjLT5uZWlnaF9pZHggKyAxKTsKKwltcmMtPmJzaWMgPSAoKGRhdGFbOF0gJiAweDAxKSA8PCA1KSB8IChkYXRhWzldID4+IDMpOworCWlmIChyZXAtPm51bV9jZWxsIDwgNCkKKwkJcmV0dXJuIDA7CisKKwltcmMgPSAmcmVwLT5jZWxsWzNdOworCW1yYy0+cnhsZXYgPSAoKGRhdGFbOV0gJiAweDA3KSA8PCAzKSB8IChkYXRhWzEwXSA+PiA1KTsKKwltcmMtPm5laWdoX2lkeCA9IGRhdGFbMTBdICYgMHgxZjsKKwltcmMtPmFyZmNuID0gYml0dmVjX2dldF9udGhfc2V0X2JpdChuYnYsIG1yYy0+bmVpZ2hfaWR4ICsgMSk7CisJbXJjLT5ic2ljID0gZGF0YVsxMV0gPj4gMjsKKwlpZiAocmVwLT5udW1fY2VsbCA8IDUpCisJCXJldHVybiAwOworCisJbXJjID0gJnJlcC0+Y2VsbFs0XTsKKwltcmMtPnJ4bGV2ID0gKChkYXRhWzExXSAmIDB4MDMpIDw8IDQpIHwgKGRhdGFbMTJdID4+IDQpOworCW1yYy0+bmVpZ2hfaWR4ID0gKChkYXRhWzEyXSAmIDB4ZikgPDwgMSkgfCAoZGF0YVsxM10gPj4gNyk7CisJbXJjLT5hcmZjbiA9IGJpdHZlY19nZXRfbnRoX3NldF9iaXQobmJ2LCBtcmMtPm5laWdoX2lkeCArIDEpOworCW1yYy0+YnNpYyA9IChkYXRhWzEzXSA+PiAxKSAmIDB4M2Y7CisJaWYgKHJlcC0+bnVtX2NlbGwgPCA2KQorCQlyZXR1cm4gMDsKKworCW1yYyA9ICZyZXAtPmNlbGxbNV07CisJbXJjLT5yeGxldiA9ICgoZGF0YVsxM10gJiAweDAxKSA8PCA1KSB8IChkYXRhWzE0XSA+PiAzKTsKKwltcmMtPm5laWdoX2lkeCA9ICgoZGF0YVsxNF0gJiAweDA3KSA8PCAyKSB8IChkYXRhWzE1XSA+PiA2KTsKKwltcmMtPmFyZmNuID0gYml0dmVjX2dldF9udGhfc2V0X2JpdChuYnYsIG1yYy0+bmVpZ2hfaWR4ICsgMSk7CisJbXJjLT5ic2ljID0gZGF0YVsxNV0gJiAweDNmOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dzbV8wNF8xMS5jIGIvb3BlbmJzYy9zcmMvZ3NtXzA0XzExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmMzdmNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8xMS5jCkBAIC0wLDAgKzEsMTIzOCBAQAorLyogUG9pbnQtdG8tUG9pbnQgKFBQKSBTaG9ydCBNZXNzYWdlIFNlcnZpY2UgKFNNUykKKyAqIFN1cHBvcnQgb24gTW9iaWxlIFJhZGlvIEludGVyZmFjZQorICogM0dQUCBUUyAwNC4xMSB2ZXJzaW9uIDcuMS4wIFJlbGVhc2UgMTk5OCAvIEVUU0kgVFMgMTAwIDk0MiBWNy4xLjAgKi8KKworLyogKEMpIDIwMDggYnkgRGFuaWVsIFdpbGxtYW5uIDxkYW5pZWxAdG90YWx1ZWJlcndhY2h1bmcuZGU+CisgKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhbnNhY3Rpb24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYnNjX3JsbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorCisjZGVmaW5lIEdTTTQxMV9BTExPQ19TSVpFCTEwMjQKKyNkZWZpbmUgR1NNNDExX0FMTE9DX0hFQURST09NCTEyOAorCisjZGVmaW5lIFVNX1NBUElfU01TIDMJLyogU2VlIEdTTSAwNC4wNS8wNC4wNiAqLworCit2b2lkICp0YWxsX2dzbXNfY3R4Oworc3RhdGljIHVfaW50MzJfdCBuZXdfY2FsbHJlZiA9IDB4NDAwMDAwMDE7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGNwX2NhdXNlX3N0cnNbXSA9IHsKKwl7IEdTTTQxMV9DUF9DQVVTRV9ORVRfRkFJTCwJIk5ldHdvcmsgRmFpbHVyZSIgfSwKKwl7IEdTTTQxMV9DUF9DQVVTRV9DT05HRVNUSU9OLAkiQ29uZ2VzdGlvbiIgfSwKKwl7IEdTTTQxMV9DUF9DQVVTRV9JTlZfVFJBTlNfSUQsCSJJbnZhbGlkIFRyYW5zYWN0aW9uIElEIiB9LAorCXsgR1NNNDExX0NQX0NBVVNFX1NFTUFOVF9JTkNfTVNHLCAiU2VtYW50aWNhbGx5IEluY29ycmVjdCBNZXNzYWdlIiB9LAorCXsgR1NNNDExX0NQX0NBVVNFX0lOVl9NQU5EX0lORiwJIkludmFsaWQgTWFuZGF0b3J5IEluZm9ybWF0aW9uIiB9LAorCXsgR1NNNDExX0NQX0NBVVNFX01TR1RZUEVfTk9URVhJU1QsICJNZXNzYWdlIFR5cGUgZG9lc24ndCBleGlzdCIgfSwKKwl7IEdTTTQxMV9DUF9DQVVTRV9NU0dfSU5DT01QX1NUQVRFLCAKKwkJCQkiTWVzc2FnZSBpbmNvbXBhdGlibGUgd2l0aCBwcm90b2NvbCBzdGF0ZSIgfSwKKwl7IEdTTTQxMV9DUF9DQVVTRV9JRV9OT1RFWElTVCwJIklFIGRvZXMgbm90IGV4aXN0IiB9LAorCXsgR1NNNDExX0NQX0NBVVNFX1BST1RPQ09MX0VSUiwJIlByb3RvY29sIEVycm9yIiB9LAorCXsgMCwgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBycF9jYXVzZV9zdHJzW10gPSB7CisJeyBHU000MTFfUlBfQ0FVU0VfTU9fTlVNX1VOQVNTSUdORUQsICIoTU8pIE51bWJlciBub3QgYXNzaWduZWQiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fT1BfREVUX0JBUlIsICIoTU8pIE9wZXJhdG9yIGRldGVybWluZWQgYmFycmluZyIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19DQUxMX0JBUlJFRCwgIihNTykgQ2FsbCBiYXJyZWQiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fU01TX1JFSkVDVEVELCAiKE1PKSBTTVMgcmVqZWN0ZWQiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fREVTVF9PVVRfT0ZfT1JERVIsICIoTU8pIERlc3RpbmF0aW9uIG91dCBvZiBvcmRlciIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19VTklERU5USUZJRURfU1VCU0NSLCAiKE1PKSBVbmlkZW50aWZpZWQgc3Vic2NyaWJlciIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19GQUNJTElUWV9SRUosICIoTU8pIEZhY2lsaXR5IHJlamVjdCIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19VTktOT1dOX1NVQlNDUiwgIihNTykgVW5rbm93biBzdWJzY3JpYmVyIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX05FVF9PVVRfT0ZfT1JERVIsICIoTU8pIE5ldHdvcmsgb3V0IG9mIG9yZGVyIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX1RFTVBfRkFJTCwgIihNTykgVGVtcG9yYXJ5IGZhaWx1cmUiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fQ09OR0VTVElPTiwgIihNTykgQ29uZ2VzdGlvbiIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19SRVNfVU5BVkFJTCwgIihNTykgUmVzb3VyY2UgdW5hdmFpbGFibGUiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fUkVRX0ZBQ19OT1RTVUJTQ1IsICIoTU8pIFJlcXVlc3RlZCBmYWNpbGl0eSBub3Qgc3Vic2NyaWJlZCIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19SRVFfRkFDX05PVElNUEwsICIoTU8pIFJlcXVlc3RlZCBmYWNpbGl0eSBub3QgaW1wbGVtZW50ZWQiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fSU5URVJXT1JLSU5HLCAiKE1PKSBJbnRlcndvcmtpbmciIH0sCisJLyogdmFsaWQgb25seSBmb3IgTVQgKi8KKwl7IEdTTTQxMV9SUF9DQVVTRV9NVF9NRU1fRVhDRUVERUQsICIoTVQpIE1lbW9yeSBFeGNlZWRlZCIgfSwKKwkvKiB2YWxpZCBmb3IgYm90aCBkaXJlY3Rpb25zICovCisJeyBHU000MTFfUlBfQ0FVU0VfSU5WX1RSQU5TX1JFRiwgIkludmFsaWQgVHJhbnNhY3Rpb24gUmVmZXJlbmNlIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX1NFTUFOVF9JTkNfTVNHLCAiU2VtYW50aWNhbGx5IEluY29ycmVjdCBNZXNzYWdlIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX0lOVl9NQU5EX0lORiwgIkludmFsaWQgTWFuZGF0b3J5IEluZm9ybWF0aW9uIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01TR1RZUEVfTk9URVhJU1QsICJNZXNzYWdlIFR5cGUgbm9uLWV4aXN0YW50IiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01TR19JTkNPTVBfU1RBVEUsICJNZXNzYWdlIGluY29tcGF0aWJsZSB3aXRoIHByb3RvY29sIHN0YXRlIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX0lFX05PVEVYSVNULCAiSW5mb3JtYXRpb24gRWxlbWVudCBub3QgZXhpc3RpbmciIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfUFJPVE9DT0xfRVJSLCAiUHJvdG9jb2wgRXJyb3IiIH0sCisJeyAwLCBOVUxMIH0KK307CisKK3N0cnVjdCBnc21fc21zICpzbXNfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gdGFsbG9jX3plcm8odGFsbF9nc21zX2N0eCwgc3RydWN0IGdzbV9zbXMpOworfQorCit2b2lkIHNtc19mcmVlKHN0cnVjdCBnc21fc21zICpzbXMpCit7CisJLyogZHJvcCByZWZlcmVuY2VzIHRvIHN1YnNjcmliZXIgc3RydWN0dXJlICovCisJaWYgKHNtcy0+c2VuZGVyKQorCQlzdWJzY3JfcHV0KHNtcy0+c2VuZGVyKTsKKwlpZiAoc21zLT5yZWNlaXZlcikKKwkJc3Vic2NyX3B1dChzbXMtPnJlY2VpdmVyKTsKKworCXRhbGxvY19mcmVlKHNtcyk7Cit9CisKK3N0cnVjdCBtc2diICpnc200MTFfbXNnYl9hbGxvYyh2b2lkKQoreworCXJldHVybiBtc2diX2FsbG9jX2hlYWRyb29tKEdTTTQxMV9BTExPQ19TSVpFLCBHU000MTFfQUxMT0NfSEVBRFJPT00sCisJCQkJICAgIkdTTSAwNC4xMSIpOworfQorCitzdGF0aWMgaW50IGdzbTQxMV9zZW5kbXNnKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKQoreworCURFQlVHUChEU01TLCAiR1NNNC4xMSBUWCAlc1xuIiwgaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisJbXNnLT5sM2ggPSBtc2ctPmRhdGE7CisJcmV0dXJuIGdzbTA4MDhfc3VibWl0X2R0YXAoY29ubiwgbXNnLCBsaW5rX2lkKTsKK30KKworLyogU01DIFRDMSogaXMgZXhwaXJlZCAqLworc3RhdGljIHZvaWQgY3BfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zID0gZGF0YTsKKworCURFQlVHUChEU01TLCAiU01DIFRpbWVyIFRDMSogaXMgZXhwaXJlZCwgY2FsbGluZyB0cmFuc19mcmVlKClcbiIpOworCS8qIEZJWE1FOiB3ZSBuZWVkIHRvIHJlLXRyYW5zbWl0IHRoZSBsYXN0IENQLURBVEEgMS4uMyB0aW1lcyAqLworCXRyYW5zX2ZyZWUodHJhbnMpOworfQorCisvKiBQcmVmaXggbXNnIHdpdGggYSAwNC4wOC8wNC4xMSBDUCBoZWFkZXIgKi8KK3N0YXRpYyBpbnQgZ3NtNDExX2NwX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkgICAgIHVfaW50OF90IG1zZ190eXBlKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmdoKSk7CisJLyogT3V0Z29pbmcgbmVlZHMgdGhlIGhpZ2hlc3QgYml0IHNldCAqLworCWdoLT5wcm90b19kaXNjciA9IHRyYW5zLT5wcm90b2NvbCB8ICh0cmFucy0+dHJhbnNhY3Rpb25faWQ8PDQpOworCWdoLT5tc2dfdHlwZSA9IG1zZ190eXBlOworCisJLyogbW9iaWxlIG9yaWdpbmF0aW5nICovCisJc3dpdGNoIChnaC0+bXNnX3R5cGUpIHsKKwljYXNlIEdTTTQxMV9NVF9DUF9EQVRBOgorCQkvKiA1LjIuMy4xLjI6IGVudGVyIE1PLXdhaXQgZm9yIENQLWFjayAqLworCQkvKiA1LjIuMy4yLjM6IGVudGVyIE1ULXdhaXQgZm9yIENQLUFDSyAqLworCQl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19XQUlUX0NQX0FDSzsKKwkJdHJhbnMtPnNtcy5jcF90aW1lci5kYXRhID0gdHJhbnM7CisJCXRyYW5zLT5zbXMuY3BfdGltZXIuY2IgPSBjcF90aW1lcl9leHBpcmVkOworCQkvKiA1LjMuMi4xOiBTZXQgVGltZXIgVEMxQSAqLworCQlic2Nfc2NoZWR1bGVfdGltZXIoJnRyYW5zLT5zbXMuY3BfdGltZXIsIEdTTTQxMV9UTVJfVEMxQSk7CisJCURFQlVHUChEU01TLCAiVFg6IENQLURBVEEgIik7CisJCWJyZWFrOworCWNhc2UgR1NNNDExX01UX0NQX0FDSzoKKwkJREVCVUdQKERTTVMsICJUWDogQ1AtQUNLICIpOworCQlicmVhazsKKwljYXNlIEdTTTQxMV9NVF9DUF9FUlJPUjoKKwkJREVCVUdQKERTTVMsICJUWDogQ1AtRVJST1IgIik7CisJCWJyZWFrOworCX0KKworCURFQlVHUEMoRFNNUywgInRyYW5zPSV4XG4iLCB0cmFucy0+dHJhbnNhY3Rpb25faWQpOworCisJcmV0dXJuIGdzbTQxMV9zZW5kbXNnKHRyYW5zLT5jb25uLCBtc2csIHRyYW5zLT5zbXMubGlua19pZCk7Cit9CisKKy8qIFByZWZpeCBtc2cgd2l0aCBhIFJQLURBVEEgaGVhZGVyIGFuZCBzZW5kIGFzIENQLURBVEEgKi8KK3N0YXRpYyBpbnQgZ3NtNDExX3JwX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkgICAgIHVfaW50OF90IHJwX21zZ190eXBlLCB1X2ludDhfdCBycF9tc2dfcmVmKQoreworCXN0cnVjdCBnc200MTFfcnBfaGRyICpycDsKKwl1X2ludDhfdCBsZW4gPSBtc2ctPmxlbjsKKworCS8qIEdTTSAwNC4xMSBSUC1EQVRBIGhlYWRlciAqLworCXJwID0gKHN0cnVjdCBnc200MTFfcnBfaGRyICopbXNnYl9wdXNoKG1zZywgc2l6ZW9mKCpycCkpOworCXJwLT5sZW4gPSBsZW4gKyAyOworCXJwLT5tc2dfdHlwZSA9IHJwX21zZ190eXBlOworCXJwLT5tc2dfcmVmID0gcnBfbXNnX3JlZjsgLyogRklYTUU6IENob29zZSByYW5kb21seSAqLworCisJcmV0dXJuIGdzbTQxMV9jcF9zZW5kbXNnKG1zZywgdHJhbnMsIEdTTTQxMV9NVF9DUF9EQVRBKTsKK30KKworLyogVHVybiBpbnQgaW50byBzZW1pLW9jdGV0IHJlcHJlc2VudGF0aW9uOiA5OCA9PiAweDg5ICovCitzdGF0aWMgdV9pbnQ4X3QgYmNkaWZ5KHVfaW50OF90IHZhbHVlKQoreworCXVfaW50OF90IHJldDsKKworCXJldCA9IHZhbHVlIC8gMTA7CisJcmV0IHw9ICh2YWx1ZSAlIDEwKSA8PCA0OworCisJcmV0dXJuIHJldDsKK30KKworLyogVHVybiBzZW1pLW9jdGV0IHJlcHJlc2VudGF0aW9uIGludG8gaW50OiAweDg5ID0+IDk4ICovCitzdGF0aWMgdV9pbnQ4X3QgdW5iY2RpZnkodV9pbnQ4X3QgdmFsdWUpCit7CisJdV9pbnQ4X3QgcmV0OworCisJaWYgKCh2YWx1ZSAmIDB4MEYpID4gOSB8fCAodmFsdWUgPj4gNCkgPiA5KQorCQlMT0dQKERTTVMsIExPR0xfRVJST1IsIAorCQkgICAgICJ1bmJjZGlmeSBnb3QgdG9vIGJpZyBuaWJibGU6IDB4JTAyWFxuIiwgdmFsdWUpOworCisJcmV0ID0gKHZhbHVlJjB4MEYpKjEwOworCXJldCArPSB2YWx1ZT4+NDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIEdlbmVyYXRlIDAzLjQwIFRQLVNDVFMgKi8KK3N0YXRpYyB2b2lkIGdzbTM0MF9nZW5fc2N0cyh1X2ludDhfdCAqc2N0cywgdGltZV90IHRpbWUpCit7CisJc3RydWN0IHRtICp0bSA9IGxvY2FsdGltZSgmdGltZSk7CisKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV95ZWFyICUgMTAwKTsKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV9tb24gKyAxKTsKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV9tZGF5KTsKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV9ob3VyKTsKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV9taW4pOworCSpzY3RzKysgPSBiY2RpZnkodG0tPnRtX3NlYyk7CisJKnNjdHMrKyA9IGJjZGlmeSh0bS0+dG1fZ210b2ZmLyg2MCoxNSkpOworfQorCisvKiBEZWNvZGUgMDMuNDAgVFAtU0NUUyAoaW50byB1dGMvZ210IHRpbWVzdGFtcCkgKi8KK3N0YXRpYyB0aW1lX3QgZ3NtMzQwX3NjdHModV9pbnQ4X3QgKnNjdHMpCit7CisJc3RydWN0IHRtIHRtOworCisJdV9pbnQ4X3QgeXIgPSB1bmJjZGlmeSgqc2N0cysrKTsKKworCWlmICh5ciA8PSA4MCkKKwkJdG0udG1feWVhciA9IDEwMCArIHlyOworCWVsc2UKKwkJdG0udG1feWVhciA9IHlyOworCXRtLnRtX21vbiAgPSB1bmJjZGlmeSgqc2N0cysrKSAtIDE7CisJdG0udG1fbWRheSA9IHVuYmNkaWZ5KCpzY3RzKyspOworCXRtLnRtX2hvdXIgPSB1bmJjZGlmeSgqc2N0cysrKTsKKwl0bS50bV9taW4gID0gdW5iY2RpZnkoKnNjdHMrKyk7CisJdG0udG1fc2VjICA9IHVuYmNkaWZ5KCpzY3RzKyspOworCS8qIGFjY29yZGluZyB0byBnc20gMDMuNDAgdGltZSB6b25lIGlzCisJICAgImV4cHJlc3NlZCBpbiBxdWFydGVycyBvZiBhbiBob3VyIiAqLworCXRtLnRtX2dtdG9mZiA9IHVuYmNkaWZ5KCpzY3RzKyspICogMTUqNjA7CisKKwlyZXR1cm4gbWt0aW1lKCZ0bSk7Cit9CisKKy8qIFJldHVybiB0aGUgZGVmYXVsdCB2YWxpZGl0eSBwZXJpb2QgaW4gbWludXRlcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ3NtMzQwX3ZwX2RlZmF1bHQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG1pbnV0ZXM7CisJLyogRGVmYXVsdCB2YWxpZGl0eTogdHdvIGRheXMgKi8KKwltaW51dGVzID0gMjQgKiA2MCAqIDI7CisJcmV0dXJuIG1pbnV0ZXM7Cit9CisKKy8qIERlY29kZSB2YWxpZGl0eSBwZXJpb2QgZm9ybWF0ICdyZWxhdGl2ZScgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdzbTM0MF92cF9yZWxhdGl2ZSh1X2ludDhfdCAqc21zX3ZwKQoreworCS8qIENoYXB0ZXIgOS4yLjMuMTIuMSAqLworCXVfaW50OF90IHZwOworCXVuc2lnbmVkIGxvbmcgbWludXRlczsKKworCXZwID0gKihzbXNfdnApOworCWlmICh2cCA8PSAxNDMpCisJCW1pbnV0ZXMgPSB2cCArIDEgKiA1OworCWVsc2UgaWYgKHZwIDw9IDE2NykKKwkJbWludXRlcyA9IDEyKjYwICsgKHZwLTE0MykgKiAzMDsKKwllbHNlIGlmICh2cCA8PSAxOTYpCisJCW1pbnV0ZXMgPSB2cC0xNjYgKiA2MCAqIDI0OworCWVsc2UKKwkJbWludXRlcyA9IHZwLTE5MiAqIDYwICogMjQgKiA3OworCXJldHVybiBtaW51dGVzOworfQorCisvKiBEZWNvZGUgdmFsaWRpdHkgcGVyaW9kIGZvcm1hdCAnYWJzb2x1dGUnICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnc20zNDBfdnBfYWJzb2x1dGUodV9pbnQ4X3QgKnNtc192cCkKK3sKKwkvKiBDaGFwdGVyIDkuMi4zLjEyLjIgKi8KKwl0aW1lX3QgZXhwaXJlcywgbm93OworCXVuc2lnbmVkIGxvbmcgbWludXRlczsKKworCWV4cGlyZXMgPSBnc20zNDBfc2N0cyhzbXNfdnApOworCW5vdyA9IG1rdGltZShnbXRpbWUoTlVMTCkpOworCWlmIChleHBpcmVzIDw9IG5vdykKKwkJbWludXRlcyA9IDA7CisJZWxzZQorCQltaW51dGVzID0gKGV4cGlyZXMtbm93KS82MDsKKwlyZXR1cm4gbWludXRlczsKK30KKworLyogRGVjb2RlIHZhbGlkaXR5IHBlcmlvZCBmb3JtYXQgJ3JlbGF0aXZlIGluIGludGVnZXIgcmVwcmVzZW50YXRpb24nICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnc20zNDBfdnBfcmVsYXRpdmVfaW50ZWdlcih1X2ludDhfdCAqc21zX3ZwKQoreworCXVfaW50OF90IHZwOworCXVuc2lnbmVkIGxvbmcgbWludXRlczsKKwl2cCA9ICooc21zX3ZwKTsKKwlpZiAodnAgPT0gMCkgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsCisJCSAgICAgInJlc2VydmVkIHJlbGF0aXZlX2ludGVnZXIgdmFsaWRpdHkgcGVyaW9kXG4iKTsKKwkJcmV0dXJuIGdzbTM0MF92cF9kZWZhdWx0KCk7CisJfQorCW1pbnV0ZXMgPSB2cC82MDsKKwlyZXR1cm4gbWludXRlczsKK30KKworLyogRGVjb2RlIHZhbGlkaXR5IHBlcmlvZCBmb3JtYXQgJ3JlbGF0aXZlIGluIHNlbWktb2N0ZXQgcmVwcmVzZW50YXRpb24nICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnc20zNDBfdnBfcmVsYXRpdmVfc2VtaW9jdGV0KHVfaW50OF90ICpzbXNfdnApCit7CisJdW5zaWduZWQgbG9uZyBtaW51dGVzOworCW1pbnV0ZXMgPSB1bmJjZGlmeSgqc21zX3ZwKyspKjYwOyAgLyogaG91cnMgKi8KKwltaW51dGVzICs9IHVuYmNkaWZ5KCpzbXNfdnArKyk7ICAgIC8qIG1pbnV0ZXMgKi8KKwltaW51dGVzICs9IHVuYmNkaWZ5KCpzbXNfdnArKykvNjA7IC8qIHNlY29uZHMgKi8KKwlyZXR1cm4gbWludXRlczsKK30KKworLyogZGVjb2RlIHZhbGlkaXR5IHBlcmlvZC4gcmV0dXJuIG1pbnV0ZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdzbTM0MF92YWxpZGl0eV9wZXJpb2QodV9pbnQ4X3Qgc21zX3ZwZiwgdV9pbnQ4X3QgKnNtc192cCkKK3sKKwl1X2ludDhfdCBmaTsgLyogZnVuY3Rpb25hbGl0eSBpbmRpY2F0b3IgKi8KKworCXN3aXRjaCAoc21zX3ZwZikgeworCWNhc2UgR1NNMzQwX1RQX1ZQRl9SRUxBVElWRToKKwkJcmV0dXJuIGdzbTM0MF92cF9yZWxhdGl2ZShzbXNfdnApOworCWNhc2UgR1NNMzQwX1RQX1ZQRl9BQlNPTFVURToKKwkJcmV0dXJuIGdzbTM0MF92cF9hYnNvbHV0ZShzbXNfdnApOworCWNhc2UgR1NNMzQwX1RQX1ZQRl9FTkhBTkNFRDoKKwkJLyogQ2hhcHRlciA5LjIuMy4xMi4zICovCisJCWZpID0gKnNtc192cCsrOworCQkvKiBpZ25vcmUgYWRkaXRpb25hbCBmaSAqLworCQlpZiAoZmkgJiAoMTw8NykpIHNtc192cCsrOworCQkvKiByZWFkIHZhbGlkaXR5IHBlcmlvZCBmb3JtYXQgKi8KKwkJc3dpdGNoIChmaSAmIDBiMTExKSB7CisJCWNhc2UgMGIwMDA6CisJCQlyZXR1cm4gZ3NtMzQwX3ZwX2RlZmF1bHQoKTsgLyogbm8gdnBmIHNwZWNpZmllZCAqLworCQljYXNlIDBiMDAxOgorCQkJcmV0dXJuIGdzbTM0MF92cF9yZWxhdGl2ZShzbXNfdnApOworCQljYXNlIDBiMDEwOgorCQkJcmV0dXJuIGdzbTM0MF92cF9yZWxhdGl2ZV9pbnRlZ2VyKHNtc192cCk7CisJCWNhc2UgMGIwMTE6CisJCQlyZXR1cm4gZ3NtMzQwX3ZwX3JlbGF0aXZlX3NlbWlvY3RldChzbXNfdnApOworCQlkZWZhdWx0OgorCQkJLyogVGhlIEdTTSBzcGVjIHNheXMgdGhhdCB0aGUgU0Mgc2hvdWxkIHJlamVjdCBhbnkKKwkJCSAgIHVuc3VwcG9ydGVkIGFuZC9vciB1bmRlZmluZWQgdmFsdWVzLiBGSVhNRSAqLworCQkJTE9HUChEU01TLCBMT0dMX0VSUk9SLAorCQkJICAgICAiUmVzZXJ2ZWQgZW5oYW5jZWQgdmFsaWRpdHkgcGVyaW9kIGZvcm1hdFxuIik7CisJCQlyZXR1cm4gZ3NtMzQwX3ZwX2RlZmF1bHQoKTsKKwkJfQorCWNhc2UgR1NNMzQwX1RQX1ZQRl9OT05FOgorCWRlZmF1bHQ6CisJCXJldHVybiBnc20zNDBfdnBfZGVmYXVsdCgpOworCX0KK30KKworLyogZGV0ZXJtaW5lIGNvZGluZyBhbHBoYWJldCBkZXBlbmRlbnQgb24gR1NNIDAzLjM4IFNlY3Rpb24gNCBEQ1MgKi8KK2VudW0gc21zX2FscGhhYmV0IGdzbTMzOF9nZXRfc21zX2FscGhhYmV0KHVfaW50OF90IGRjcykKK3sKKwl1X2ludDhfdCBjZ2JpdHMgPSBkY3MgPj4gNDsKKwllbnVtIHNtc19hbHBoYWJldCBhbHBoYSA9IERDU19OT05FOworCisJaWYgKChjZ2JpdHMgJiAweGMpID09IDApIHsKKwkJaWYgKGNnYml0cyAmIDIpCisJCQlMT0dQKERTTVMsIExPR0xfTk9USUNFLAorCQkJICAgICAiQ29tcHJlc3NlZCBTTVMgbm90IHN1cHBvcnRlZCB5ZXRcbiIpOworCisJCXN3aXRjaCAoKGRjcyA+PiAyKSYweDAzKSB7CisJCWNhc2UgMDoKKwkJCWFscGhhID0gRENTXzdCSVRfREVGQVVMVDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlhbHBoYSA9IERDU184QklUX0RBVEE7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJYWxwaGEgPSBEQ1NfVUNTMjsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChjZ2JpdHMgPT0gMHhjIHx8IGNnYml0cyA9PSAweGQpCisJCWFscGhhID0gRENTXzdCSVRfREVGQVVMVDsKKwllbHNlIGlmIChjZ2JpdHMgPT0gMHhlKQorCQlhbHBoYSA9IERDU19VQ1MyOworCWVsc2UgaWYgKGNnYml0cyA9PSAweGYpIHsKKwkJaWYgKGRjcyAmIDQpCisJCQlhbHBoYSA9IERDU184QklUX0RBVEE7CisJCWVsc2UKKwkJCWFscGhhID0gRENTXzdCSVRfREVGQVVMVDsKKwl9CisKKwlyZXR1cm4gYWxwaGE7Cit9CisKK3N0YXRpYyBpbnQgZ3NtMzQwX3J4X3Ntc19zdWJtaXQoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV9zbXMgKmdzbXMpCit7CisJaWYgKGRiX3Ntc19zdG9yZShnc21zKSAhPSAwKSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBzdG9yZSBTTVMgaW4gRGF0YWJhc2VcbiIpOworCQlyZXR1cm4gR1NNNDExX1JQX0NBVVNFX01PX05FVF9PVVRfT0ZfT1JERVI7CisJfQorCS8qIGRpc3BhdGNoIGEgc2lnbmFsIHRvIHRlbGwgaGlnaGVyIGxldmVsIGFib3V0IGl0ICovCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1NNUywgU19TTVNfU1VCTUlUVEVELCBnc21zKTsKKwkvKiB0cnkgZGVsaXZlcmluZyB0aGUgU01TIHJpZ2h0IG5vdyAqLworCS8vZ3NtNDExX3NlbmRfc21zX3N1YnNjcihnc21zLT5yZWNlaXZlciwgZ3Ntcyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZ2VuZXJhdGUgYSBUUERVIGFkZHJlc3MgZmllbGQgY29tcGxpYW50IHdpdGggMDMuNDAgc2VjLiA5LjEuMi41ICovCitzdGF0aWMgaW50IGdzbTM0MF9nZW5fb2EodV9pbnQ4X3QgKm9hLCB1bnNpZ25lZCBpbnQgb2FfbGVuLAorCQkJIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWludCBsZW5faW5fYnl0ZXM7CisKKwlvYVsxXSA9IDB4Yjk7IC8qIG5ldHdvcmtzLXNwZWNpZmljIG51bWJlciwgcHJpdmF0ZSBudW1iZXJpbmcgcGxhbiAqLworCisJbGVuX2luX2J5dGVzID0gZ3NtNDhfZW5jb2RlX2JjZF9udW1iZXIob2EsIG9hX2xlbiwgMSwgc3Vic2NyLT5leHRlbnNpb24pOworCisJLyogR1NNIDAzLjQwIHRlbGxzIHVzIHRoZSBsZW5ndGggaXMgaW4gJ3VzZWZ1bCBzZW1pLW9jdGV0cycgKi8KKwlvYVswXSA9IHN0cmxlbihzdWJzY3ItPmV4dGVuc2lvbikgJiAweGZmOworCisJcmV0dXJuIGxlbl9pbl9ieXRlczsKK30KKworLyogZ2VuZXJhdGUgYSBtc2diIGNvbnRhaW5pbmcgYSBUUERVIGRlcml2ZWQgZnJvbSBzdHJ1Y3QgZ3NtX3NtcywKKyAqIHJldHVybnMgdG90YWwgc2l6ZSBvZiBUUERVICovCitzdGF0aWMgaW50IGdzbTM0MF9nZW5fdHBkdShzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3NtcyAqc21zKQoreworCXVfaW50OF90ICpzbXNwOworCXVfaW50OF90IG9hWzEyXTsJLyogbWF4IGxlbiBwZXIgMDMuNDAgKi8KKwl1X2ludDhfdCBvYV9sZW4gPSAwOworCXVfaW50OF90IG9jdGV0X2xlbjsKKwl1bnNpZ25lZCBpbnQgb2xkX21zZ19sZW4gPSBtc2ctPmxlbjsKKworCS8qIGdlbmVyYXRlIGZpcnN0IG9jdGV0IHdpdGggbWFza2VkIGJpdHMgKi8KKwlzbXNwID0gbXNnYl9wdXQobXNnLCAxKTsKKwkvKiBUUC1NVEkgKG1lc3NhZ2UgdHlwZSBpbmRpY2F0b3IpICovCisJKnNtc3AgPSBHU00zNDBfU01TX0RFTElWRVJfU0MyTVM7CisJLyogVFAtTU1TIChtb3JlIG1lc3NhZ2VzIHRvIHNlbmQpICovCisJaWYgKDAgLyogRklYTUUgKi8pCisJCSpzbXNwIHw9IDB4MDQ7CisJLyogVFAtU1JJKGRlbGl2ZXIpL1NSUihzdWJtaXQpICovCisJaWYgKHNtcy0+c3RhdHVzX3JlcF9yZXEpCisJCSpzbXNwIHw9IDB4MjA7CisJLyogVFAtVURISSAoaW5kaWNhdGluZyBUUC1VRCBjb250YWlucyBhIGhlYWRlcikgKi8KKwlpZiAoc21zLT51ZF9oZHJfaW5kKQorCQkqc21zcCB8PSAweDQwOworI2lmIDAKKwkvKiBUUC1SUCAoaW5kaWNhdGluZyB0aGF0IGEgcmVwbHkgcGF0aCBleGlzdHMpICovCisJaWYgKHNtcy0+CisJCSpzbXNwIHw9IDB4ODA7CisjZW5kaWYKKwkKKwkvKiBnZW5lcmF0ZSBvcmlnaW5hdG9yIGFkZHJlc3MgKi8KKwlvYV9sZW4gPSBnc20zNDBfZ2VuX29hKG9hLCBzaXplb2Yob2EpLCBzbXMtPnNlbmRlcik7CisJc21zcCA9IG1zZ2JfcHV0KG1zZywgb2FfbGVuKTsKKwltZW1jcHkoc21zcCwgb2EsIG9hX2xlbik7CisKKwkvKiBnZW5lcmF0ZSBUUC1QSUQgKi8KKwlzbXNwID0gbXNnYl9wdXQobXNnLCAxKTsKKwkqc21zcCA9IHNtcy0+cHJvdG9jb2xfaWQ7CisKKwkvKiBnZW5lcmF0ZSBUUC1EQ1MgKi8KKwlzbXNwID0gbXNnYl9wdXQobXNnLCAxKTsKKwkqc21zcCA9IHNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lOworCisJLyogZ2VuZXJhdGUgVFAtU0NUUyAqLworCXNtc3AgPSBtc2diX3B1dChtc2csIDcpOworCWdzbTM0MF9nZW5fc2N0cyhzbXNwLCB0aW1lKE5VTEwpKTsKKworCS8qIGdlbmVyYXRlIFRQLVVETCAqLworCXNtc3AgPSBtc2diX3B1dChtc2csIDEpOworCSpzbXNwID0gc21zLT51c2VyX2RhdGFfbGVuOworCisJLyogZ2VuZXJhdGUgVFAtVUQgKi8KKwlzd2l0Y2ggKGdzbTMzOF9nZXRfc21zX2FscGhhYmV0KHNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lKSkgeworCWNhc2UgRENTXzdCSVRfREVGQVVMVDoKKwkJb2N0ZXRfbGVuID0gc21zLT51c2VyX2RhdGFfbGVuKjcvODsKKwkJaWYgKHNtcy0+dXNlcl9kYXRhX2xlbio3JTggIT0gMCkKKwkJCW9jdGV0X2xlbisrOworCQkvKiBXYXJuaW5nLCB1c2VyX2RhdGFfbGVuIGluZGljYXRlcyB0aGUgYW1vdW50IG9mIHNlcHRldHMKKwkJICogKGNoYXJhY3RlcnMpLCB3ZSBuZWVkIGFtb3VudCBvZiBvY3RldHMgb2NjdXBpZWQgKi8KKwkJc21zcCA9IG1zZ2JfcHV0KG1zZywgb2N0ZXRfbGVuKTsKKwkJbWVtY3B5KHNtc3AsIHNtcy0+dXNlcl9kYXRhLCBvY3RldF9sZW4pOworCQlicmVhazsKKwljYXNlIERDU19VQ1MyOgorCWNhc2UgRENTXzhCSVRfREFUQToKKwkJc21zcCA9IG1zZ2JfcHV0KG1zZywgc21zLT51c2VyX2RhdGFfbGVuKTsKKwkJbWVtY3B5KHNtc3AsIHNtcy0+dXNlcl9kYXRhLCBzbXMtPnVzZXJfZGF0YV9sZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAiVW5oYW5kbGVkIERhdGEgQ29kaW5nIFNjaGVtZTogMHglMDJYXG4iLAorCQkgICAgIHNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIG1zZy0+bGVuIC0gb2xkX21zZ19sZW47Cit9CisKKy8qIHByb2Nlc3MgYW4gaW5jb21pbmcgVFBEVSAoY2FsbGVkIGZyb20gUlAtREFUQSkgCisgKiByZXR1cm4gdmFsdWUgPiAwOiBSUCBDQVVTRSBmb3IgRVJST1I7IDwgMDogc2lsZW50IGVycm9yOyAwID0gc3VjY2VzcyAqLyAKK3N0YXRpYyBpbnQgZ3NtMzQwX3J4X3RwZHUoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBtc2diICptc2cpCit7CisJdV9pbnQ4X3QgKnNtc3AgPSBtc2diX3Ntcyhtc2cpOworCXN0cnVjdCBnc21fc21zICpnc21zOworCXVfaW50OF90IHNtc19tdGksIHNtc19tbXMsIHNtc192cGYsIHNtc19hbHBoYWJldCwgc21zX3JwOworCXVfaW50OF90ICpzbXNfdnA7CisJdV9pbnQ4X3QgZGFfbGVuX2J5dGVzOworCXVfaW50OF90IGFkZHJlc3NfbHZbMTJdOyAvKiBhY2NvcmRpbmcgdG8gMDMuNDAgLyA5LjEuMi41ICovCisJaW50IHJjID0gMDsKKworCWNvdW50ZXJfaW5jKGNvbm4tPmJ0cy0+bmV0d29yay0+c3RhdHMuc21zLnN1Ym1pdHRlZCk7CisKKwlnc21zID0gc21zX2FsbG9jKCk7CisJaWYgKCFnc21zKQorCQlyZXR1cm4gR1NNNDExX1JQX0NBVVNFX01PX05FVF9PVVRfT0ZfT1JERVI7CisKKwkvKiBpbnZlcnQgdGhvc2UgZmllbGRzIHdoZXJlIDAgbWVhbnMgYWN0aXZlL3ByZXNlbnQgKi8KKwlzbXNfbXRpID0gKnNtc3AgJiAweDAzOworCXNtc19tbXMgPSAhISgqc21zcCAmIDB4MDQpOworCXNtc192cGYgPSAoKnNtc3AgJiAweDE4KSA+PiAzOworCWdzbXMtPnN0YXR1c19yZXBfcmVxID0gKCpzbXNwICYgMHgyMCk7CisJZ3Ntcy0+dWRfaGRyX2luZCA9ICgqc21zcCAmIDB4NDApOworCXNtc19ycCAgPSAoKnNtc3AgJiAweDgwKTsKKworCXNtc3ArKzsKKwlnc21zLT5tc2dfcmVmID0gKnNtc3ArKzsKKworCS8qIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyAqLworCWRhX2xlbl9ieXRlcyA9IDIgKyAqc21zcC8yICsgKnNtc3AlMjsKKwlpZiAoZGFfbGVuX2J5dGVzID4gMTIpIHsKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLCAiRGVzdGluYXRpb24gQWRkcmVzcyA+IDEyIGJ5dGVzID8hP1xuIik7CisJCXJjID0gR1NNNDExX1JQX0NBVVNFX1NFTUFOVF9JTkNfTVNHOworCQlnb3RvIG91dDsKKwl9CisJbWVtc2V0KGFkZHJlc3NfbHYsIDAsIHNpemVvZihhZGRyZXNzX2x2KSk7CisJbWVtY3B5KGFkZHJlc3NfbHYsIHNtc3AsIGRhX2xlbl9ieXRlcyk7CisJLyogbWFuZ2xlIGZpcnN0IGJ5dGUgdG8gcmVmbGVjdCBsZW5ndGggaW4gYnl0ZXMsIG5vdCBkaWdpdHMgKi8KKwlhZGRyZXNzX2x2WzBdID0gZGFfbGVuX2J5dGVzIC0gMTsKKwkvKiBjb252ZXJ0IHRvIHJlYWwgbnVtYmVyICovCisJZ3NtNDhfZGVjb2RlX2JjZF9udW1iZXIoZ3Ntcy0+ZGVzdF9hZGRyLCBzaXplb2YoZ3Ntcy0+ZGVzdF9hZGRyKSwgYWRkcmVzc19sdiwgMSk7CisJc21zcCArPSBkYV9sZW5fYnl0ZXM7CisKKwlnc21zLT5wcm90b2NvbF9pZCA9ICpzbXNwKys7CisJZ3Ntcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lID0gKnNtc3ArKzsKKworCXNtc19hbHBoYWJldCA9IGdzbTMzOF9nZXRfc21zX2FscGhhYmV0KGdzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSk7CisKKwlzd2l0Y2ggKHNtc192cGYpIHsKKwljYXNlIEdTTTM0MF9UUF9WUEZfUkVMQVRJVkU6CisJCXNtc192cCA9IHNtc3ArKzsKKwkJYnJlYWs7CisJY2FzZSBHU00zNDBfVFBfVlBGX0FCU09MVVRFOgorCWNhc2UgR1NNMzQwX1RQX1ZQRl9FTkhBTkNFRDoKKwkJc21zX3ZwID0gc21zcDsKKwkJLyogdGhlIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBpbmRpY2F0b3IuLi4gKi8KKwkJaWYgKHNtc192cGYgPT0gR1NNMzQwX1RQX1ZQRl9FTkhBTkNFRCAmJiAqc21zcCAmICgxPDw3KSkKKwkJCXNtc3ArKzsKKwkJc21zcCArPSA3OworCQlicmVhazsKKwljYXNlIEdTTTM0MF9UUF9WUEZfTk9ORToKKwkJc21zX3ZwID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEU01TLCBMT0dMX05PVElDRSwgCisJCSAgICAgIlNNUyBWYWxpZGl0eSBwZXJpb2Qgbm90IGltcGxlbWVudGVkOiAweCUwMnhcbiIsIHNtc192cGYpOworCQlyZXR1cm4gR1NNNDExX1JQX0NBVVNFX01PX05FVF9PVVRfT0ZfT1JERVI7CisJfQorCWdzbXMtPnVzZXJfZGF0YV9sZW4gPSAqc21zcCsrOworCWlmIChnc21zLT51c2VyX2RhdGFfbGVuKSB7CisJCW1lbWNweShnc21zLT51c2VyX2RhdGEsIHNtc3AsIGdzbXMtPnVzZXJfZGF0YV9sZW4pOworCisJCXN3aXRjaCAoc21zX2FscGhhYmV0KSB7CisJCWNhc2UgRENTXzdCSVRfREVGQVVMVDoKKwkJCWdzbV83Yml0X2RlY29kZShnc21zLT50ZXh0LCBzbXNwLCBnc21zLT51c2VyX2RhdGFfbGVuKTsKKwkJCWJyZWFrOworCQljYXNlIERDU184QklUX0RBVEE6CisJCWNhc2UgRENTX1VDUzI6CisJCWNhc2UgRENTX05PTkU6CisJCQlicmVhazsKKwkJfQorCX0KKworCWdzbXMtPnNlbmRlciA9IHN1YnNjcl9nZXQobXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IpOworCisJTE9HUChEU01TLCBMT0dMX0lORk8sICJSWCBTTVM6IFNlbmRlcjogJXMsIE1USTogMHglMDJ4LCBWUEY6IDB4JTAyeCwgIgorCSAgICAgIk1SOiAweCUwMnggUElEOiAweCUwMngsIERDUzogMHglMDJ4LCBEQTogJXMsICIKKwkgICAgICJVc2VyRGF0YUxlbmd0aDogMHglMDJ4LCBVc2VyRGF0YTogXCIlc1wiXG4iLAorCSAgICAgc3Vic2NyX25hbWUoZ3Ntcy0+c2VuZGVyKSwgc21zX210aSwgc21zX3ZwZiwgZ3Ntcy0+bXNnX3JlZiwKKwkgICAgIGdzbXMtPnByb3RvY29sX2lkLCBnc21zLT5kYXRhX2NvZGluZ19zY2hlbWUsIGdzbXMtPmRlc3RfYWRkciwKKwkgICAgIGdzbXMtPnVzZXJfZGF0YV9sZW4sCisJCQlzbXNfYWxwaGFiZXQgPT0gRENTXzdCSVRfREVGQVVMVCA/IGdzbXMtPnRleHQgOiAKKwkJCQloZXhkdW1wKGdzbXMtPnVzZXJfZGF0YSwgZ3Ntcy0+dXNlcl9kYXRhX2xlbikpOworCisJZ3Ntcy0+dmFsaWRpdHlfbWludXRlcyA9IGdzbTM0MF92YWxpZGl0eV9wZXJpb2Qoc21zX3ZwZiwgc21zX3ZwKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19TTVMsIDAsIGdzbXMpOworCisJLyogZGV0ZXJtaW5lIGdzbXMtPnJlY2VpdmVyIGJhc2VkIG9uIGRpYWxsZWQgbnVtYmVyICovCisJZ3Ntcy0+cmVjZWl2ZXIgPSBzdWJzY3JfZ2V0X2J5X2V4dGVuc2lvbihjb25uLT5idHMtPm5ldHdvcmssIGdzbXMtPmRlc3RfYWRkcik7CisJaWYgKCFnc21zLT5yZWNlaXZlcikgeworCQlyYyA9IDE7IC8qIGNhdXNlIDE6IHVua25vd24gc3Vic2NyaWJlciAqLworCQljb3VudGVyX2luYyhjb25uLT5idHMtPm5ldHdvcmstPnN0YXRzLnNtcy5ub19yZWNlaXZlcik7CisJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAoc21zX210aSkgeworCWNhc2UgR1NNMzQwX1NNU19TVUJNSVRfTVMyU0M6CisJCS8qIE1TIGlzIHN1Ym1pdHRpbmcgYSBTTVMgKi8KKwkJcmMgPSBnc20zNDBfcnhfc21zX3N1Ym1pdChtc2csIGdzbXMpOworCQlicmVhazsKKwljYXNlIEdTTTM0MF9TTVNfQ09NTUFORF9NUzJTQzoKKwljYXNlIEdTTTM0MF9TTVNfREVMSVZFUl9SRVBfTVMyU0M6CisJCUxPR1AoRFNNUywgTE9HTF9OT1RJQ0UsICJVbmltcGxlbWVudGVkIE1USSAweCUwMnhcbiIsIHNtc19tdGkpOworCQlyYyA9IEdTTTQxMV9SUF9DQVVTRV9JRV9OT1RFWElTVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEU01TLCBMT0dMX05PVElDRSwgIlVuZGVmaW5lZCBNVEkgMHglMDJ4XG4iLCBzbXNfbXRpKTsKKwkJcmMgPSBHU000MTFfUlBfQ0FVU0VfSUVfTk9URVhJU1Q7CisJCWJyZWFrOworCX0KKworCWlmICghcmMgJiYgIWdzbXMtPnJlY2VpdmVyKQorCQlyYyA9IEdTTTQxMV9SUF9DQVVTRV9NT19OVU1fVU5BU1NJR05FRDsKKworb3V0OgorCXNtc19mcmVlKGdzbXMpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGdzbTQxMV9zZW5kX3JwX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdV9pbnQ4X3QgbXNnX3JlZikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDExX21zZ2JfYWxsb2MoKTsKKworCURFQlVHUChEU01TLCAiVFg6IFNNUyBSUCBBQ0tcbiIpOworCisJcmV0dXJuIGdzbTQxMV9ycF9zZW5kbXNnKG1zZywgdHJhbnMsIEdTTTQxMV9NVF9SUF9BQ0tfTVQsIG1zZ19yZWYpOworfQorCitzdGF0aWMgaW50IGdzbTQxMV9zZW5kX3JwX2Vycm9yKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkJCXVfaW50OF90IG1zZ19yZWYsIHVfaW50OF90IGNhdXNlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200MTFfbXNnYl9hbGxvYygpOworCisJbXNnYl90dl9wdXQobXNnLCAxLCBjYXVzZSk7CisKKwlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAiVFg6IFNNUyBSUCBFUlJPUiwgY2F1c2UgJWQgKCVzKVxuIiwgY2F1c2UsCisJCWdldF92YWx1ZV9zdHJpbmcocnBfY2F1c2Vfc3RycywgY2F1c2UpKTsKKworCXJldHVybiBnc200MTFfcnBfc2VuZG1zZyhtc2csIHRyYW5zLCBHU000MTFfTVRfUlBfRVJST1JfTVQsIG1zZ19yZWYpOworfQorCisvKiBSZWNlaXZlIGEgMDQuMTEgVFBEVSBpbnNpZGUgUlAtREFUQSAvIHVzZXIgZGF0YSAqLworc3RhdGljIGludCBnc200MTFfcnhfcnBfdWQoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkgIHN0cnVjdCBnc200MTFfcnBfaGRyICpycGgsCisJCQkgIHVfaW50OF90IHNyY19sZW4sIHVfaW50OF90ICpzcmMsCisJCQkgIHVfaW50OF90IGRzdF9sZW4sIHVfaW50OF90ICpkc3QsCisJCQkgIHVfaW50OF90IHRwZHVfbGVuLCB1X2ludDhfdCAqdHBkdSkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHNyY19sZW4gJiYgc3JjKQorCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJSUC1EQVRBIChNTykgd2l0aCBTUkMgPyE/XG4iKTsKKworCWlmICghZHN0X2xlbiB8fCAhZHN0IHx8ICF0cGR1X2xlbiB8fCAhdHBkdSkgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsCisJCQkiUlAtREFUQSAoTU8pIHdpdGhvdXQgRFNUIG9yIFRQRFUgPyE/XG4iKTsKKwkJZ3NtNDExX3NlbmRfcnBfZXJyb3IodHJhbnMsIHJwaC0+bXNnX3JlZiwKKwkJCQkgICAgIEdTTTQxMV9SUF9DQVVTRV9JTlZfTUFORF9JTkYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbXNnLT5zbXNoID0gdHBkdTsKKworCURFQlVHUChEU01TLCAiRFNUKCV1LCVzKVxuIiwgZHN0X2xlbiwgaGV4ZHVtcChkc3QsIGRzdF9sZW4pKTsKKworCXJjID0gZ3NtMzQwX3J4X3RwZHUodHJhbnMtPmNvbm4sIG1zZyk7CisJaWYgKHJjID09IDApCisJCXJldHVybiBnc200MTFfc2VuZF9ycF9hY2sodHJhbnMsIHJwaC0+bXNnX3JlZik7CisJZWxzZSBpZiAocmMgPiAwKQorCQlyZXR1cm4gZ3NtNDExX3NlbmRfcnBfZXJyb3IodHJhbnMsIHJwaC0+bXNnX3JlZiwgcmMpOworCWVsc2UKKwkJcmV0dXJuIHJjOworfQorCisvKiBSZWNlaXZlIGEgMDQuMTEgUlAtREFUQSBtZXNzYWdlIGluIGFjY29yZGFuY2Ugd2l0aCBTZWN0aW9uIDcuMy4xLjIgKi8KK3N0YXRpYyBpbnQgZ3NtNDExX3J4X3JwX2RhdGEoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkgICAgIHN0cnVjdCBnc200MTFfcnBfaGRyICpycGgpCit7CisJdV9pbnQ4X3Qgc3JjX2xlbiwgZHN0X2xlbiwgcnB1ZF9sZW47CisJdV9pbnQ4X3QgKnNyYyA9IE5VTEwsICpkc3QgPSBOVUxMICwgKnJwX3VkID0gTlVMTDsKKworCS8qIGluIHRoZSBNTyBjYXNlLCB0aGlzIHNob3VsZCBhbHdheXMgYmUgemVybyBsZW5ndGggKi8KKwlzcmNfbGVuID0gcnBoLT5kYXRhWzBdOworCWlmIChzcmNfbGVuKQorCQlzcmMgPSAmcnBoLT5kYXRhWzFdOworCisJZHN0X2xlbiA9IHJwaC0+ZGF0YVsxK3NyY19sZW5dOworCWlmIChkc3RfbGVuKQorCQlkc3QgPSAmcnBoLT5kYXRhWzErc3JjX2xlbisxXTsKKworCXJwdWRfbGVuID0gcnBoLT5kYXRhWzErc3JjX2xlbisxK2RzdF9sZW5dOworCWlmIChycHVkX2xlbikKKwkJcnBfdWQgPSAmcnBoLT5kYXRhWzErc3JjX2xlbisxK2RzdF9sZW4rMV07CisKKwlERUJVR1AoRFNNUywgIlJYX1JQLURBVEE6IHNyY19sZW49JXUsIGRzdF9sZW49JXUgdWRfbGVuPSV1XG4iLAorCQlzcmNfbGVuLCBkc3RfbGVuLCBycHVkX2xlbik7CisJcmV0dXJuIGdzbTQxMV9yeF9ycF91ZChtc2csIHRyYW5zLCBycGgsIHNyY19sZW4sIHNyYywgZHN0X2xlbiwgZHN0LAorCQkJCXJwdWRfbGVuLCBycF91ZCk7Cit9CisKKy8qIFJlY2VpdmUgYSAwNC4xMSBSUC1BQ0sgbWVzc2FnZSAocmVzcG9uc2UgdG8gUlAtREFUQSBmcm9tIHVzKSAqLworc3RhdGljIGludCBnc200MTFfcnhfcnBfYWNrKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkJICAgIHN0cnVjdCBnc200MTFfcnBfaGRyICpycGgpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IHRyYW5zLT5zbXMuc21zOworCisJLyogQWNua293bGVkZ2VtZW50IHRvIE1UIFJQX0RBVEEsIGkuZS4gdGhlIE1TIGNvbmZpcm1zIGl0CisJICogc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGEgU01TLiAgV2UgY2FuIG5vdyBzYWZlbHkgbWFyayBpdCBhcworCSAqIHRyYW5zbWl0dGVkICovCisKKwlpZiAoIXRyYW5zLT5zbXMuaXNfbXQpIHsKKwkJTE9HUChEU01TLCBMT0dMX0VSUk9SLCAiUlggUlAtQUNLIG9uIGEgTU8gdHJhbnNmZXIgP1xuIik7CisJCXJldHVybiBnc200MTFfc2VuZF9ycF9lcnJvcih0cmFucywgcnBoLT5tc2dfcmVmLAorCQkJCQkgICAgR1NNNDExX1JQX0NBVVNFX01TR19JTkNPTVBfU1RBVEUpOworCX0KKworCWlmICghc21zKSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIlJYIFJQLUFDSyBidXQgbm8gc21zIGluIHRyYW5zYWN0aW9uPyE/XG4iKTsKKwkJcmV0dXJuIGdzbTQxMV9zZW5kX3JwX2Vycm9yKHRyYW5zLCBycGgtPm1zZ19yZWYsCisJCQkJCSAgICBHU000MTFfUlBfQ0FVU0VfUFJPVE9DT0xfRVJSKTsKKwl9CisKKwkvKiBtYXJrIHRoaXMgU01TIGFzIHNlbnQgaW4gZGF0YWJhc2UgKi8KKwlkYl9zbXNfbWFya19zZW50KHNtcyk7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfU01TLCBTX1NNU19ERUxJVkVSRUQsIHNtcyk7CisKKwlzbXNfZnJlZShzbXMpOworCXRyYW5zLT5zbXMuc21zID0gTlVMTDsKKworCS8qIGNoZWNrIGZvciBtb3JlIG1lc3NhZ2VzIGZvciB0aGlzIHN1YnNjcmliZXIgKi8KKwlhc3NlcnQobXNnLT5sY2hhbi0+Y29ubi5zdWJzY3IgPT0gdHJhbnMtPnN1YnNjcik7CisKKwlzbXMgPSBkYl9zbXNfZ2V0X3Vuc2VudF9mb3Jfc3Vic2NyKHRyYW5zLT5zdWJzY3IpOworCWlmIChzbXMpCisJCWdzbTQxMV9zZW5kX3Ntc19sY2hhbih0cmFucy0+Y29ubiwgc21zKTsKKworCS8qIGZyZWUgdGhlIHRyYW5zYWN0aW9uIGhlcmUgKi8KKwl0cmFuc19mcmVlKHRyYW5zKTsKKworCS8qIHJlbGVhc2UgY2hhbm5lbCBpZiBkb25lICovCisjd2FybmluZyAiQlJPS0VOLiBUaGUgU0FQSSB3aWxsIGJlIHJlbGVhc2VkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIEJTQyIKKwlpZiAoIXNtcykKKwkJcnNsX3JlbGVhc2VfcmVxdWVzdChtc2ctPmxjaGFuLCB0cmFucy0+c21zLmxpbmtfaWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDExX3J4X3JwX2Vycm9yKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkJICAgICAgc3RydWN0IGdzbTQxMV9ycF9oZHIgKnJwaCkKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IHRyYW5zLT5jb25uLT5idHMtPm5ldHdvcms7CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IHRyYW5zLT5zbXMuc21zOworCXVfaW50OF90IGNhdXNlX2xlbiA9IHJwaC0+ZGF0YVswXTsKKwl1X2ludDhfdCBjYXVzZSA9IHJwaC0+ZGF0YVsxXTsKKworCS8qIEVycm9yIGluIHJlc3BvbnNlIHRvIE1UIFJQX0RBVEEsIGkuZS4gdGhlIE1TIGRpZCBub3QKKwkgKiBzdWNjZXNzZnVsbHkgcmVjZWl2ZSB0aGUgU01TLiAgV2UgbmVlZCB0byBpbnZlc3RpZ2F0ZQorCSAqIHRoZSBjYXVzZSBhbmQgdGFrZSBhY3Rpb24gZGVwZW5kaW5nIG9uIGl0ICovCisKKwlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAiJXM6IFJYIFNNUyBSUC1FUlJPUiwgY2F1c2UgJWQ6JWQgKCVzKVxuIiwKKwkgICAgIHN1YnNjcl9uYW1lKHRyYW5zLT5jb25uLT5zdWJzY3IpLCBjYXVzZV9sZW4sIGNhdXNlLAorCSAgICAgZ2V0X3ZhbHVlX3N0cmluZyhycF9jYXVzZV9zdHJzLCBjYXVzZSkpOworCisJaWYgKCF0cmFucy0+c21zLmlzX210KSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIlJYIFJQLUVSUiBvbiBhIE1PIHRyYW5zZmVyID9cbiIpOworI2lmIDAKKwkJcmV0dXJuIGdzbTQxMV9zZW5kX3JwX2Vycm9yKHRyYW5zLCBycGgtPm1zZ19yZWYsCisJCQkJCSAgICBHU000MTFfUlBfQ0FVU0VfTVNHX0lOQ09NUF9TVEFURSk7CisjZW5kaWYKKwl9CisKKwlpZiAoIXNtcykgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsCisJCQkiUlggUlAtRVJSLCBidXQgbm8gc21zIGluIHRyYW5zYWN0aW9uPyE/XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisjaWYgMAorCQlyZXR1cm4gZ3NtNDExX3NlbmRfcnBfZXJyb3IodHJhbnMsIHJwaC0+bXNnX3JlZiwKKwkJCQkJICAgIEdTTTQxMV9SUF9DQVVTRV9QUk9UT0NPTF9FUlIpOworI2VuZGlmCisJfQorCisJaWYgKGNhdXNlID09IEdTTTQxMV9SUF9DQVVTRV9NVF9NRU1fRVhDRUVERUQpIHsKKwkJLyogTVMgaGFzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHN0b3JlIHRoZSBtZXNzYWdlLiAgV2UgbmVlZAorCQkgKiB0byBzdG9yZSB0aGlzIGluIG91ciBkYXRhYmFzZSBhbmQgd2F0aSBmb3IgYSBTTU1BIG1lc3NhZ2UgKi8KKwkJLyogRklYTUUgKi8KKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX1NNUywgU19TTVNfTUVNX0VYQ0VFREVELCB0cmFucy0+c3Vic2NyKTsKKwkJY291bnRlcl9pbmMobmV0LT5zdGF0cy5zbXMucnBfZXJyX21lbSk7CisJfSBlbHNlCisJCWNvdW50ZXJfaW5jKG5ldC0+c3RhdHMuc21zLnJwX2Vycl9vdGhlcik7CisKKwlzbXNfZnJlZShzbXMpOworCXRyYW5zLT5zbXMuc21zID0gTlVMTDsKKworCS8vdHJhbnNfZnJlZSh0cmFucyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc200MTFfcnhfcnBfc21tYShzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCSAgICAgc3RydWN0IGdzbTQxMV9ycF9oZHIgKnJwaCkKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCWludCByYzsKKworCXJjID0gZ3NtNDExX3NlbmRfcnBfYWNrKHRyYW5zLCBycGgtPm1zZ19yZWYpOworCXRyYW5zLT5zbXMucnBfc3RhdGUgPSBHU000MTFfUlBTX0lETEU7CisKKwkvKiBNUyB0ZWxscyB1cyB0aGF0IGl0IGhhcyBtZW1vcnkgZm9yIG1vcmUgU01TLCB3ZSBuZWVkCisJICogdG8gY2hlY2sgaWYgd2UgaGF2ZSBhbnkgcGVuZGluZyBtZXNzYWdlcyBmb3IgaXQgYW5kIHRoZW4KKwkgKiB0cmFuc2ZlciB0aG9zZSAqLworCWRpc3BhdGNoX3NpZ25hbChTU19TTVMsIFNfU01TX1NNTUEsIHRyYW5zLT5zdWJzY3IpOworCisJLyogY2hlY2sgZm9yIG1vcmUgbWVzc2FnZXMgZm9yIHRoaXMgc3Vic2NyaWJlciAqLworCWFzc2VydChtc2ctPmxjaGFuLT5jb25uLnN1YnNjciA9PSB0cmFucy0+c3Vic2NyKTsKKwlzbXMgPSBkYl9zbXNfZ2V0X3Vuc2VudF9mb3Jfc3Vic2NyKHRyYW5zLT5zdWJzY3IpOworCWlmIChzbXMpCisJCWdzbTQxMV9zZW5kX3Ntc19sY2hhbih0cmFucy0+Y29ubiwgc21zKTsKKwllbHNlCisJCXJzbF9yZWxlYXNlX3JlcXVlc3QobXNnLT5sY2hhbiwgdHJhbnMtPnNtcy5saW5rX2lkKTsKKyN3YXJuaW5nICJCUk9LRU46IFRoZSBTQVBJPTMgd2lsbCBiZSByZWxlYXNlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBCU0MiCisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDExX3J4X2NwX2RhdGEoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbTQ4X2hkciAqZ2gsCisJCQkgICAgIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBnc200MTFfcnBfaGRyICpycF9kYXRhID0gKHN0cnVjdCBnc200MTFfcnBfaGRyKikmZ2gtPmRhdGE7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSAgcnBfZGF0YS0+bXNnX3R5cGUgJiAweDA3OworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBHU000MTFfTVRfUlBfREFUQV9NTzoKKwkJREVCVUdQKERTTVMsICJSWCBTTVMgUlAtREFUQSAoTU8pXG4iKTsKKwkJLyogc3RhcnQgVFIyTiBhbmQgZW50ZXIgJ3dhaXQgdG8gc2VuZCBSUC1BQ0sgc3RhdGUnICovCisJCXRyYW5zLT5zbXMucnBfc3RhdGUgPSBHU000MTFfUlBTX1dBSVRfVE9fVFhfUlBfQUNLOworCQlyYyA9IGdzbTQxMV9yeF9ycF9kYXRhKG1zZywgdHJhbnMsIHJwX2RhdGEpOworCQlicmVhazsKKwljYXNlIEdTTTQxMV9NVF9SUF9BQ0tfTU86CisJCURFQlVHUChEU01TLCJSWCBTTVMgUlAtQUNLIChNTylcbiIpOworCQlyYyA9IGdzbTQxMV9yeF9ycF9hY2sobXNnLCB0cmFucywgcnBfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgR1NNNDExX01UX1JQX1NNTUFfTU86CisJCURFQlVHUChEU01TLCAiUlggU01TIFJQLVNNTUFcbiIpOworCQkvKiBzdGFydCBUUjJOIGFuZCBlbnRlciAnd2FpdCB0byBzZW5kIFJQLUFDSyBzdGF0ZScgKi8KKwkJdHJhbnMtPnNtcy5ycF9zdGF0ZSA9IEdTTTQxMV9SUFNfV0FJVF9UT19UWF9SUF9BQ0s7CisJCXJjID0gZ3NtNDExX3J4X3JwX3NtbWEobXNnLCB0cmFucywgcnBfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgR1NNNDExX01UX1JQX0VSUk9SX01POgorCQlyYyA9IGdzbTQxMV9yeF9ycF9lcnJvcihtc2csIHRyYW5zLCBycF9kYXRhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEU01TLCBMT0dMX05PVElDRSwgIkludmFsaWQgUlAgdHlwZSAweCUwMnhcbiIsIG1zZ190eXBlKTsKKwkJcmMgPSBnc200MTFfc2VuZF9ycF9lcnJvcih0cmFucywgcnBfZGF0YS0+bXNnX3JlZiwKKwkJCQkJICBHU000MTFfUlBfQ0FVU0VfTVNHVFlQRV9OT1RFWElTVCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogc2VuZCBDUC1BQ0sgdG8gZ2l2ZW4gdHJhbnNhY3Rpb24gKi8KK3N0YXRpYyBpbnQgZ3NtNDExX3R4X2NwX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDExX21zZ2JfYWxsb2MoKTsKKwlpbnQgcmM7CisKKwlyYyA9IGdzbTQxMV9jcF9zZW5kbXNnKG1zZywgdHJhbnMsIEdTTTQxMV9NVF9DUF9BQ0spOworCisJaWYgKHRyYW5zLT5zbXMuaXNfbXQpIHsKKwkJLyogSWYgdGhpcyBpcyBhIE1UIFNNUyBERUxJVkVSLCB3ZSBjYW4gY2xlYXIgdHJhbnNhY3Rpb24gaGVyZSAqLworCQl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19JRExFOworCQkvL3RyYW5zX2ZyZWUodHJhbnMpOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBnc200MTFfdHhfY3BfZXJyb3Ioc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHVfaW50OF90IGNhdXNlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200MTFfbXNnYl9hbGxvYygpOworCXVfaW50OF90ICpjYXVzZXA7CisKKwlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAiVFggQ1AtRVJST1IsIGNhdXNlICVkICglcylcbiIsIGNhdXNlLAorCQlnZXRfdmFsdWVfc3RyaW5nKGNwX2NhdXNlX3N0cnMsIGNhdXNlKSk7CisKKwljYXVzZXAgPSBtc2diX3B1dChtc2csIDEpOworCSpjYXVzZXAgPSBjYXVzZTsKKworCXJldHVybiBnc200MTFfY3Bfc2VuZG1zZyhtc2csIHRyYW5zLCBHU000MTFfTVRfQ1BfRVJST1IpOworfQorCisvKiBFbnRyeSBwb2ludCBmb3IgaW5jb21pbmcgR1NNNDhfUERJU0NfU01TIGZyb20gYWJpc19yc2wuYyAqLworaW50IGdzbTA0MTFfcmN2X3NtcyhzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90IG1zZ190eXBlID0gZ2gtPm1zZ190eXBlOworCXVfaW50OF90IHRyYW5zYWN0aW9uX2lkID0gKChnaC0+cHJvdG9fZGlzY3IgPj4gNCkgXiAweDgpOyAvKiBmbGlwICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOworCWludCByYyA9IDA7CisKKwlpZiAoIWxjaGFuLT5jb25uLnN1YnNjcikKKwkJcmV0dXJuIC1FSU87CisJCS8qIEZJWE1FOiBzZW5kIHNvbWUgZXJyb3IgbWVzc2FnZSAqLworCisJREVCVUdQKERTTVMsICJ0cmFuc19pZD0leCAiLCB0cmFuc2FjdGlvbl9pZCk7CisJdHJhbnMgPSB0cmFuc19maW5kX2J5X2lkKGxjaGFuLT5jb25uLnN1YnNjciwgR1NNNDhfUERJU0NfU01TLAorCQkJCSB0cmFuc2FjdGlvbl9pZCk7CisJaWYgKCF0cmFucykgeworCQlERUJVR1BDKERTTVMsICIobmV3KSAiKTsKKwkJdHJhbnMgPSB0cmFuc19hbGxvYyhsY2hhbi0+Y29ubi5zdWJzY3IsIEdTTTQ4X1BESVNDX1NNUywKKwkJCQkgICAgdHJhbnNhY3Rpb25faWQsIG5ld19jYWxscmVmKyspOworCQlpZiAoIXRyYW5zKSB7CisJCQlERUJVR1BDKERTTVMsICJObyBtZW1vcnkgZm9yIHRyYW5zXG4iKTsKKwkJCS8qIEZJWE1FOiBzZW5kIHNvbWUgZXJyb3IgbWVzc2FnZSAqLworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfSURMRTsKKwkJdHJhbnMtPnNtcy5ycF9zdGF0ZSA9IEdTTTQxMV9SUFNfSURMRTsKKwkJdHJhbnMtPnNtcy5pc19tdCA9IDA7CisJCXRyYW5zLT5zbXMubGlua19pZCA9IGxpbmtfaWQ7CisKKwkJdHJhbnMtPmNvbm4gPSAmbGNoYW4tPmNvbm47CisJCXVzZV9zdWJzY3JfY29uKHRyYW5zLT5jb25uKTsKKwl9CisKKwlzd2l0Y2gobXNnX3R5cGUpIHsKKwljYXNlIEdTTTQxMV9NVF9DUF9EQVRBOgorCQlERUJVR1BDKERTTVMsICJSWCBTTVMgQ1AtREFUQVxuIik7CisKKwkJLyogNS40OiBGb3IgTU8sIGlmIGEgQ1AtREFUQSBpcyByZWNlaXZlZCBmb3IgYSBuZXcKKwkJICogdHJhbnNhY3Rpb24sIGVxdWFscyByZWNlcHRpb24gb2YgYW4gaW1wbGljaXQKKwkJICogbGFzdCBDUC1BQ0sgZm9yIHByZXZpb3VzIHRyYW5zYWN0aW9uICovCisJCWlmICh0cmFucy0+c21zLmNwX3N0YXRlID09IEdTTTQxMV9DUFNfSURMRSkgeworCQkJaW50IGk7CisJCQlzdHJ1Y3QgZ3NtX3RyYW5zICpwdHJhbnM7CisKKwkJCS8qIFNjYW4gdGhyb3VnaCBhbGwgcmVtb3RlIGluaXRpYXRlZCB0cmFuc2FjdGlvbnMgKi8KKwkJCWZvciAoaT04OyBpPDE1OyBpKyspIHsKKwkJCQlpZiAoaSA9PSB0cmFuc2FjdGlvbl9pZCkKKwkJCQkJY29udGludWU7CisKKwkJCQlwdHJhbnMgPSB0cmFuc19maW5kX2J5X2lkKGxjaGFuLT5jb25uLnN1YnNjciwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgIEdTTTQ4X1BESVNDX1NNUywgaSk7CisJCQkJaWYgKCFwdHJhbnMpCisJCQkJCWNvbnRpbnVlOworCisJCQkJREVCVUdQKERTTVMsICJJbXBsaWNpdCBDUC1BQ0sgZm9yIHRyYW5zX2lkPSV4XG4iLCBpKTsKKworCQkJCS8qIEZpbmlzaCBpdCBmb3IgZ29vZCAqLworCQkJCWJzY19kZWxfdGltZXIoJnB0cmFucy0+c21zLmNwX3RpbWVyKTsKKwkJCQlwdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfSURMRTsKKwkJCQl0cmFuc19mcmVlKHB0cmFucyk7CisJCQl9CisJCX0KKworCQkvKiA1LjIuMy4xLjM6IE1PIHN0YXRlIGV4aXN0cyB3aGVuIFNNQyBoYXMgcmVjZWl2ZWQKKwkJICogQ1AtREFUQSwgaW5jbHVkaW5nIHNlbmRpbmcgb2YgdGhlIGFzc29jLiBDUC1BQ0sgKi8KKwkJLyogNS4yLjMuMi40OiBNVCBzdGF0ZSBleGlzdHMgd2hlbiBTTUMgaGFzIHJlY2VpdmVkCisJCSAqIENQLURBVEEsIGluY2x1ZGluZyBzZW5kaW5nIG9mIHRoZSBhc3NvYy4gQ1AtQUNLICovCisJCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX01NX0VTVEFCTElTSEVEOworCisJCS8qIFNNQyBpbnN0YW5jZSBhY2tub3dsZWRnZXMgdGhlIENQLURBVEEgZnJhbWUgKi8KKwkJZ3NtNDExX3R4X2NwX2Fjayh0cmFucyk7CisJCQorCQlyYyA9IGdzbTQxMV9yeF9jcF9kYXRhKG1zZywgZ2gsIHRyYW5zKTsKKyNpZiAwCisJCS8qIFNlbmQgQ1AtQUNLIG9yIENQLUVST1JSIGluIHJlc3BvbnNlICovCisJCWlmIChyYyA8IDApIHsKKwkJCXJjID0gZ3NtNDExX3R4X2NwX2Vycm9yKHRyYW5zLCBHU000MTFfQ1BfQ0FVU0VfTkVUX0ZBSUwpOworCQl9IGVsc2UKKwkJCXJjID0gZ3NtNDExX3R4X2NwX2Fjayh0cmFucyk7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBHU000MTFfTVRfQ1BfQUNLOgorCQkvKiBwcmV2aW91cyBDUC1EQVRBIGluIHRoaXMgdHJhbnNhY3Rpb24gd2FzIGNvbmZpcm1lZCAqLworCQlERUJVR1BDKERTTVMsICJSWCBTTVMgQ1AtQUNLXG4iKTsKKwkJLyogNS4yLjMuMS4zOiBNTyBzdGF0ZSBleGlzdHMgd2hlbiBTTUMgaGFzIHJlY2VpdmVkIENQLUFDSyAqLworCQkvKiA1LjIuMy4yLjQ6IE1UIHN0YXRlIGV4aXN0cyB3aGVuIFNNQyBoYXMgcmVjZWl2ZWQgQ1AtQUNLICovCisJCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX01NX0VTVEFCTElTSEVEOworCQkvKiBTdG9wIFRDMSogYWZ0ZXIgQ1AtQUNLIGhhcyBiZWVuIHJlY2VpdmVkICovCisJCWJzY19kZWxfdGltZXIoJnRyYW5zLT5zbXMuY3BfdGltZXIpOworCisJCWlmICghdHJhbnMtPnNtcy5pc19tdCkgeworCQkJLyogRklYTUU6IHdlIGhhdmUgc29udCBvbmUgQ1AtREFUQSwgd2hpY2ggd2FzIG5vdworCQkJICogYWNrbm93bGVkZ2VkLiAgQ2hlY2sgaWYgd2Ugd2FudCB0byB0cmFuc2ZlciBtb3JlLAorCQkJICogaS5lLiBtdWx0aS1wYXJ0IG1lc3NhZ2UgKi8KKwkJCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX0lETEU7CisJCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTTQxMV9NVF9DUF9FUlJPUjoKKwkJREVCVUdQQyhEU01TLCAiUlggU01TIENQLUVSUk9SLCBjYXVzZSAlZCAoJXMpXG4iLCBnaC0+ZGF0YVswXSwKKwkJCWdldF92YWx1ZV9zdHJpbmcoY3BfY2F1c2Vfc3RycywgZ2gtPmRhdGFbMF0pKTsKKwkJYnNjX2RlbF90aW1lcigmdHJhbnMtPnNtcy5jcF90aW1lcik7CisJCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX0lETEU7CisJCXRyYW5zX2ZyZWUodHJhbnMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1BDKERTTVMsICJSWCBVbmltcGxlbWVudGVkIENQIG1zZ190eXBlOiAweCUwMnhcbiIsIG1zZ190eXBlKTsKKwkJcmMgPSBnc200MTFfdHhfY3BfZXJyb3IodHJhbnMsIEdTTTQxMV9DUF9DQVVTRV9NU0dUWVBFX05PVEVYSVNUKTsKKwkJdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfSURMRTsKKwkJdHJhbnNfZnJlZSh0cmFucyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworI2lmIDAKKy8qIFRlc3QgVFBEVSAtIEFMTCBZT1VSICovCitzdGF0aWMgdV9pbnQ4X3QgdHBkdV90ZXN0W10gPSB7CisJMHgwNCwgMHgwNCwgMHg4MSwgMHgzMiwgMHgyNCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgyMSwgMHgwMywgMHg0MSwgMHgyNCwKKwkweDMyLCAweDQwLCAweDFGLCAweDQxLCAweDI2LCAweDEzLCAweDk0LCAweDdELCAweDU2LCAweEE1LCAweDIwLCAweDI4LAorCTB4RjIsIDB4RTksIDB4MkMsIDB4ODIsIDB4ODIsIDB4RDIsIDB4MjIsIDB4NDgsIDB4NTgsIDB4NjQsIDB4M0UsIDB4OUQsCisJMHg0NywgMHgxMCwgMHhGNSwgMHgwOSwgMHhBQSwgMHg0RSwgMHgwMQorfTsKKyNlbmRpZgorCisvKiBUYWtlIGEgU01TIGluIGdzbV9zbXMgc3RydWN0dXJlIGFuZCBzZW5kIGl0IHRocm91Z2ggYW4gYWxyZWFkeQorICogZXhpc3RpbmcgbGNoYW4uIFdlIGFsc28gYXNzdW1lIHRoYXQgdGhlIGNhbGxlciBlbnN1cmVkIHRoaXMgbGNoYW4gYWxyZWFkeQorICogaGFzIGEgU0FQSTMgUkxMIGNvbm5lY3Rpb24hICovCitpbnQgZ3NtNDExX3NlbmRfc21zX2xjaGFuKHN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgZ3NtX3NtcyAqc21zKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200MTFfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOworCXVfaW50OF90ICpkYXRhLCAqcnBfdWRfbGVuOworCXVfaW50OF90IG1zZ19yZWYgPSA0MjsKKwlpbnQgdHJhbnNhY3Rpb25faWQ7CisJaW50IHJjOworCisJdHJhbnNhY3Rpb25faWQgPSB0cmFuc19hc3NpZ25fdHJhbnNfaWQoY29ubi0+c3Vic2NyLCBHU000OF9QRElTQ19TTVMsIDApOworCWlmICh0cmFuc2FjdGlvbl9pZCA9PSAtMSkgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJObyBhdmFpbGFibGUgdHJhbnNhY3Rpb24gaWRzXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlERUJVR1AoRFNNUywgInNlbmRfc21zX2xjaGFuKClcbiIpOworCisJLyogRklYTUU6IGFsbG9jYXRlIHRyYW5zYWN0aW9uIHdpdGggbWVzc2FnZSByZWZlcmVuY2UgKi8KKwl0cmFucyA9IHRyYW5zX2FsbG9jKGNvbm4tPnN1YnNjciwgR1NNNDhfUERJU0NfU01TLAorCQkJICAgIHRyYW5zYWN0aW9uX2lkLCBuZXdfY2FsbHJlZisrKTsKKwlpZiAoIXRyYW5zKSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIk5vIG1lbW9yeSBmb3IgdHJhbnNcbiIpOworCQkvKiBGSVhNRTogc2VuZCBzb21lIGVycm9yIG1lc3NhZ2UgKi8KKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX0lETEU7CisJdHJhbnMtPnNtcy5ycF9zdGF0ZSA9IEdTTTQxMV9SUFNfSURMRTsKKwl0cmFucy0+c21zLmlzX210ID0gMTsKKwl0cmFucy0+c21zLnNtcyA9IHNtczsKKwl0cmFucy0+c21zLmxpbmtfaWQgPSBVTV9TQVBJX1NNUzsJLyogRklYTUU6IG1haW4gb3IgU0FDQ0ggPyAqLworCisJdHJhbnMtPmNvbm4gPSBjb25uOworCXVzZV9zdWJzY3JfY29uKHRyYW5zLT5jb25uKTsKKworCS8qIEhhcmRjb2RlIFNNU0MgT3JpZ2luYXRpbmcgQWRkcmVzcyBmb3Igbm93ICovCisJZGF0YSA9ICh1X2ludDhfdCAqKW1zZ2JfcHV0KG1zZywgOCk7CisJZGF0YVswXSA9IDB4MDc7CS8qIG9yaWdpbmF0b3IgbGVuZ3RoID09IDcgKi8KKwlkYXRhWzFdID0gMHg5MTsgLyogdHlwZSBvZiBudW1iZXI6IGludGVybmF0aW9uYWwsIElTRE4gKi8KKwlkYXRhWzJdID0gMHg0NDsgLyogNDQ3Nzg1MDE2MDA1ICovCisJZGF0YVszXSA9IDB4Nzc7CisJZGF0YVs0XSA9IDB4NTg7CisJZGF0YVs1XSA9IDB4MTA7CisJZGF0YVs2XSA9IDB4MDY7CisJZGF0YVs3XSA9IDB4NTA7CisKKwkvKiBIYXJkY29kZWQgRGVzdGluYXRpb24gQWRkcmVzcyAqLworCWRhdGEgPSAodV9pbnQ4X3QgKiltc2diX3B1dChtc2csIDEpOworCWRhdGFbMF0gPSAwOwkvKiBkZXN0aW5hdGlvbiBsZW5ndGggPT0gMCAqLworCisJLyogb2J0YWluIGEgcG9pbnRlciBmb3IgdGhlIHJwX3VkX2xlbiwgc28gd2UgY2FuIGZpbGwgaXQgbGF0ZXIgKi8KKwlycF91ZF9sZW4gPSAodV9pbnQ4X3QgKiltc2diX3B1dChtc2csIDEpOworCisjaWYgMQorCS8qIGdlbmVyYXRlIHRoZSAwMy40MCBUUERVICovCisJcmMgPSBnc20zNDBfZ2VuX3RwZHUobXNnLCBzbXMpOworCWlmIChyYyA8IDApIHsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiByYzsKKwl9CisKKwkqcnBfdWRfbGVuID0gcmM7CisjZWxzZQorCWRhdGEgPSBtc2diX3B1dChtc2csIHNpemVvZih0cGR1X3Rlc3QpKTsKKwltZW1jcHkoZGF0YSwgdHBkdV90ZXN0LCBzaXplb2YodHBkdV90ZXN0KSk7CisJKnJwX3VkX2xlbiA9IHNpemVvZih0cGR1X3Rlc3QpOworI2VuZGlmCisKKwlERUJVR1AoRFNNUywgIlRYOiBTTVMgREVMSVZFUlxuIik7CisKKwljb3VudGVyX2luYyhjb25uLT5idHMtPm5ldHdvcmstPnN0YXRzLnNtcy5kZWxpdmVyZWQpOworCisJcmV0dXJuIGdzbTQxMV9ycF9zZW5kbXNnKG1zZywgdHJhbnMsIEdTTTQxMV9NVF9SUF9EQVRBX01ULCBtc2dfcmVmKTsKKwkvKiBGSVhNRTogZW50ZXIgJ3dhaXQgZm9yIFJQLUFDSycgc3RhdGUsIHN0YXJ0IFRSMU4gKi8KK30KKworLyogUkxMIFNBUEkzIGVzdGFibGlzaCBjYWxsYmFjay4gTm93IHdlIGhhdmUgYSBSTEwgY29ubmVjdGlvbiBhbmQKKyAqIGNhbiBkZWxpdmVyIHRoZSBhY3R1YWwgbWVzc2FnZSAqLworc3RhdGljIHZvaWQgcmxsX2luZF9jYihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwKKwkJCXZvaWQgKl9zbXMsIGVudW0gYnNjX3JsbHJfaW5kIHR5cGUpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IF9zbXM7CisKKwlERUJVR1AoRFNNUywgInJsbF9pbmRfY2IobGNoYW49JXAsIGxpbmtfaWQ9JXUsIHNtcz0lcCwgdHlwZT0ldVxuIiwKKwkJbGNoYW4sIGxpbmtfaWQsIHNtcywgdHlwZSk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEJTQ19STExSX0lORF9FU1RfQ09ORjoKKyN3YXJuaW5nICJCUk9LRU46IFRoZSBCU0Mgd2lsbCBlc3RhYmxpc2ggdGhpcyB0cmFuc3BhcmVudGx5IgorCQlnc200MTFfc2VuZF9zbXNfbGNoYW4oJmxjaGFuLT5jb25uLCBzbXMpOworCQlicmVhazsKKwljYXNlIEJTQ19STExSX0lORF9SRUxfSU5EOgorCWNhc2UgQlNDX1JMTFJfSU5EX0VSUl9JTkQ6CisJY2FzZSBCU0NfUkxMUl9JTkRfVElNRU9VVDoKKyN3YXJuaW5nICJCUk9LRU46IFdlIHdpbGwgbmVlZCB0byBoYW5kbGUgU0FQSSBuIFJlamVjdCIKKwkJc21zX2ZyZWUoc21zKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBwYWdpbmcgY2FsbGJhY2suIEhlcmUgd2UgZ2V0IGNhbGxlZCBpZiBwYWdpbmcgYSBzdWJzY3JpYmVyIGhhcworICogc3VjY2VlZGVkIG9yIGZhaWxlZC4gKi8KK3N0YXRpYyBpbnQgcGFnaW5nX2NiX3NlbmRfc21zKHVuc2lnbmVkIGludCBob29rbnVtLCB1bnNpZ25lZCBpbnQgZXZlbnQsCisJCQkgICAgICBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpfbGNoYW4sIHZvaWQgKl9zbXMpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBfbGNoYW47CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IF9zbXM7CisJaW50IHJjOworCisJREVCVUdQKERTTVMsICJwYWdpbmdfY2Jfc2VuZF9zbXMoaG9va251bT0ldSwgZXZlbnQ9JXUsIG1zZz0lcCwiCisJCSJsY2hhbj0lcCwgc21zPSVwKVxuIiwgaG9va251bSwgZXZlbnQsIG1zZywgbGNoYW4sIHNtcyk7CisKKwlpZiAoaG9va251bSAhPSBHU01fSE9PS19SUl9QQUdJTkcpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgR1NNX1BBR0lOR19TVUNDRUVERUQ6CisJCS8qIFBhZ2luZyBhYm9ydGVkIHdpdGhvdXQgbGNoYW4gPyE/ICovCisJCWlmICghbGNoYW4pIHsKKwkJCXNtc19mcmVlKHNtcyk7CisJCQlyYyA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQkvKiBFc3RhYmxpc2ggYSBTQVBJMyBSTEwgY29ubmVjdGlvbiBmb3IgU01TICovCisJCXJjID0gcmxsX2VzdGFibGlzaChsY2hhbiwgVU1fU0FQSV9TTVMsIHJsbF9pbmRfY2IsIHNtcyk7CisJCWJyZWFrOworCWNhc2UgR1NNX1BBR0lOR19FWFBJUkVEOgorCQlzbXNfZnJlZShzbXMpOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBoaWdoLWxldmVsIGZ1bmN0aW9uIHRvIHNlbmQgYSBTTVMgdG8gYSBnaXZlbiBzdWJzY3JpYmVyLiBUaGUgZnVuY3Rpb24KKyAqIHdpbGwgdGFrZSBjYXJlIG9mIHBhZ2luZyB0aGUgc3Vic2NyaWJlciwgZXN0YWJsaXNoaW5nIHRoZSBSTEwgU0FQSTMKKyAqIGNvbm5lY3Rpb24sIGV0Yy4gKi8KK2ludCBnc200MTFfc2VuZF9zbXNfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICAgc3RydWN0IGdzbV9zbXMgKnNtcykKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwlpbnQgcmM7CisKKwkvKiBjaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgYW4gb3BlbiBsY2hhbiB0byB0aGUgc3Vic2NyaWJlci4KKwkgKiBpZiB5ZXMsIHNlbmQgdGhlIFNNUyB0aGlzIHdheSAqLworCWxjaGFuID0gbGNoYW5fZm9yX3N1YnNjcihzdWJzY3IpOworCWlmIChsY2hhbikKKwkJcmV0dXJuIHJsbF9lc3RhYmxpc2gobGNoYW4sIFVNX1NBUElfU01TLAorCQkJCSAgICAgcmxsX2luZF9jYiwgc21zKTsKKworCS8qIGlmIG5vdCwgd2UgaGF2ZSB0byBzdGFydCBwYWdpbmcgKi8KKwlyYyA9IHBhZ2luZ19yZXF1ZXN0KHN1YnNjci0+bmV0LCBzdWJzY3IsIFJTTF9DSEFOTkVFRF9TRENDSCwKKwkJCSAgICBwYWdpbmdfY2Jfc2VuZF9zbXMsIHNtcyk7CisJaWYgKHJjIDw9IDApCisJCXNtc19mcmVlKHNtcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJzY3Jfc2lnX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQkgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNfU1VCU0NSX0FUVEFDSEVEOgorCQkvKiBBIHN1YnNjcmliZXIgaGFzIGF0dGFjaGVkLiBDaGVjayBpZiB0aGVyZSBhcmUKKwkJICogYW55IHBlbmRpbmcgU01TIGZvciBoaW0gdG8gYmUgZGVsaXZlcmVkICovCisJCXN1YnNjciA9IHNpZ25hbF9kYXRhOworCQlsY2hhbiA9IGxjaGFuX2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKwkJaWYgKCFsY2hhbikKKwkJCWJyZWFrOworCQlzbXMgPSBkYl9zbXNfZ2V0X3Vuc2VudF9mb3Jfc3Vic2NyKHN1YnNjcik7CisJCWlmICghc21zKQorCQkJYnJlYWs7CisJCS8qIEVzdGFibGlzaCBhIFNBUEkzIFJMTCBjb25uZWN0aW9uIGZvciBTTVMgKi8KKwkJcmxsX2VzdGFibGlzaChsY2hhbiwgVU1fU0FQSV9TTVMsIHJsbF9pbmRfY2IsIHNtcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBfZ3NtNDExX3Ntc190cmFuc19mcmVlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCWJzY19kZWxfdGltZXIoJnRyYW5zLT5zbXMuY3BfdGltZXIpOworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkX3Ntcyh2b2lkKQoreworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1NVQlNDUiwgc3Vic2NyX3NpZ19jYiwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fMDRfODAuYyBiL29wZW5ic2Mvc3JjL2dzbV8wNF84MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNzEyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9nc21fMDRfODAuYwpAQCAtMCwwICsxLDMzMCBAQAorLyogR1NNIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UgTGF5ZXIgMyBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlCisgKiAzR1BQIFRTIDA0LjA4IHZlcnNpb24gNy4yMS4wIFJlbGVhc2UgMTk5OCAvIEVUU0kgVFMgMTAwIDk0MCBWNy4yMS4wICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5IGJ5IE1pa2UgSGFiZW4gPG1pY2hhZWwuaGFiZW5AYnRpbnRlcm5ldC5jb20+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfODAuaD4KKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQgcGFyc2VfdXNzZCh1X2ludDhfdCAqdXNzZCwgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKTsKK3N0YXRpYyBpbnQgcGFyc2VfdXNzZF9pbmZvX2VsZW1lbnRzKHVfaW50OF90ICp1c3NkX2llLAorCQkJCQlzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpOworc3RhdGljIGludCBwYXJzZV9mYWNpbGl0eV9pZSh1X2ludDhfdCAqZmFjaWxpdHlfaWUsIHVfaW50OF90IGxlbmd0aCwKKwkJCQkJc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKTsKK3N0YXRpYyBpbnQgcGFyc2Vfc3NfaW52b2tlKHVfaW50OF90ICppbnZva2VfZGF0YSwgdV9pbnQ4X3QgbGVuZ3RoLAorCQkJCQlzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpOworc3RhdGljIGludCBwYXJzZV9wcm9jZXNzX3Vzc19yZXEodV9pbnQ4X3QgKnVzc19yZXFfZGF0YSwgdV9pbnQ4X3QgbGVuZ3RoLAorCQkJCQlzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKm1zZ2Jfd3JhcF93aXRoX1RMKHN0cnVjdCBtc2diICptc2diLCB1X2ludDhfdCB0YWcpCit7CisJbXNnYi0+ZGF0YSAtPSAyOworCW1zZ2ItPmRhdGFbMF0gPSB0YWc7CisJbXNnYi0+ZGF0YVsxXSA9IG1zZ2ItPmxlbjsKKwltc2diLT5sZW4gKz0gMjsKKwlyZXR1cm4gbXNnYi0+ZGF0YTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICptc2diX3B1c2hfVExWMShzdHJ1Y3QgbXNnYiAqbXNnYiwgdV9pbnQ4X3QgdGFnLAorCQkJCQkgICAgdV9pbnQ4X3QgdmFsdWUpCit7CisJbXNnYi0+ZGF0YSAtPSAzOworCW1zZ2ItPmxlbiArPSAzOworCW1zZ2ItPmRhdGFbMF0gPSB0YWc7CisJbXNnYi0+ZGF0YVsxXSA9IDE7CisJbXNnYi0+ZGF0YVsyXSA9IHZhbHVlOworCXJldHVybiBtc2diLT5kYXRhOworfQorCisKKy8qIERlY29kZSBhIG1vYmlsZS1vcmlnaW5hdGVkIFVTU0QtcmVxdWVzdCBtZXNzYWdlICovCitpbnQgZ3NtMDQ4MF9kZWNvZGVfdXNzZF9yZXF1ZXN0KGNvbnN0IHN0cnVjdCBtc2diICptc2csIHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmMgPSAwOworCXVfaW50OF90ICpwYXJzZV9wdHIgPSBtc2diX2wzKG1zZyk7CisKKwlpZiAoKCpwYXJzZV9wdHIgJiAweDBGKSA9PSBHU000OF9QRElTQ19OQ19TUykgeworCQlyZXEtPnRyYW5zYWN0aW9uX2lkID0gKnBhcnNlX3B0ciAmIDB4NzA7CisJCXJjID0gcGFyc2VfdXNzZChwYXJzZV9wdHIrMSwgcmVxKTsKKwl9CisKKwlpZiAoIXJjKQorCQlERUJVR1AoRE1NLCAiRXJyb3Igb2NjdXJyZWQgd2hpbGUgcGFyc2luZyByZWNlaXZlZCBVU1NEIVxuIik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdXNzZCh1X2ludDhfdCAqdXNzZCwgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCWludCByYyA9IDE7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSB1c3NkWzBdICYgMHhCRjsgIC8qIG1lc3NhZ2UtdHlwZSAtIHNlY3Rpb24gMy40ICovCisKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBHU00wNDgwX01UWVBFX1JFTEVBU0VfQ09NUExFVEU6CisJCURFQlVHUChETU0sICJVU1MgUmVsZWFzZSBDb21wbGV0ZVxuIik7CisJCS8qIGNvdWxkIGFsc28gcGFyc2Ugb3V0IHRoZSBvcHRpb25hbCBDYXVzZS9GYWNpbGl0eSBkYXRhICovCisJCXJlcS0+dGV4dFswXSA9IDB4RkY7CisJCWJyZWFrOworCWNhc2UgR1NNMDQ4MF9NVFlQRV9SRUdJU1RFUjoKKwljYXNlIEdTTTA0ODBfTVRZUEVfRkFDSUxJVFk6CisJCXJjICY9IHBhcnNlX3Vzc2RfaW5mb19lbGVtZW50cyh1c3NkKzEsIHJlcSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBHU00gMDQuODAgbWVzc2FnZS10eXBlIGZpZWxkIDB4JTAyeFxuIiwKKwkJCXVzc2RbMF0pOworCQlyYyA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwYXJzZV91c3NkX2luZm9fZWxlbWVudHModV9pbnQ4X3QgKnVzc2RfaWUsIHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmM7CisJLyogSW5mb3JtYXRpb24gRWxlbWVudCBJZGVudGlmaWVyIC0gdGFibGUgMy4yICYgR1NNIDA0LjA4IHNlY3Rpb24gMTAuNSAqLworCXVfaW50OF90IGllaSA9IHVzc2RfaWVbMF07CisJdV9pbnQ4X3QgaWVpX2xlbmd0aCA9IHVzc2RfaWVbMV07CisKKwlzd2l0Y2ggKGllaSkgeworCWNhc2UgR1NNNDhfSUVfQ0FVU0U6CisJCWJyZWFrOworCWNhc2UgR1NNMDQ4MF9JRV9GQUNJTElUWToKKwkJcmMgPSBwYXJzZV9mYWNpbGl0eV9pZSh1c3NkX2llKzIsIGllaV9sZW5ndGgsIHJlcSk7CisJCWJyZWFrOworCWNhc2UgR1NNMDQ4MF9JRV9TU19WRVJTSU9OOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgIlVuaGFuZGxlZCBHU00gMDQuMDggb3IgMDQuODAgSUVJIDB4JTAyeFxuIiwKKwkJCWllaSk7CisJCXJjID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHBhcnNlX2ZhY2lsaXR5X2llKHVfaW50OF90ICpmYWNpbGl0eV9pZSwgdV9pbnQ4X3QgbGVuZ3RoLAorCQkJCQkJc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCWludCByYyA9IDE7CisJdV9pbnQ4X3Qgb2Zmc2V0ID0gMDsKKworCWRvIHsKKwkJLyogQ29tcG9uZW50IFR5cGUgdGFnIC0gdGFibGUgMy43ICovCisJCXVfaW50OF90IGNvbXBvbmVudF90eXBlID0gZmFjaWxpdHlfaWVbb2Zmc2V0XTsKKwkJdV9pbnQ4X3QgY29tcG9uZW50X2xlbmd0aCA9IGZhY2lsaXR5X2llW29mZnNldCsxXTsKKworCQlzd2l0Y2ggKGNvbXBvbmVudF90eXBlKSB7CisJCWNhc2UgR1NNMDQ4MF9DVFlQRV9JTlZPS0U6CisJCQlyYyAmPSBwYXJzZV9zc19pbnZva2UoZmFjaWxpdHlfaWUrMiwKKwkJCQkJCWNvbXBvbmVudF9sZW5ndGgsCisJCQkJCQlyZXEpOworCQkJYnJlYWs7CisJCWNhc2UgR1NNMDQ4MF9DVFlQRV9SRVRVUk5fUkVTVUxUOgorCQkJYnJlYWs7CisJCWNhc2UgR1NNMDQ4MF9DVFlQRV9SRVRVUk5fRVJST1I6CisJCQlicmVhazsKKwkJY2FzZSBHU00wNDgwX0NUWVBFX1JFSkVDVDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIEdTTSAwNC44MCBGYWNpbGl0eSAiCisJCQkJIkNvbXBvbmVudCBUeXBlIDB4JTAyeFxuIiwgY29tcG9uZW50X3R5cGUpOworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJb2Zmc2V0ICs9IChjb21wb25lbnRfbGVuZ3RoKzIpOworCX0gd2hpbGUgKG9mZnNldCA8IGxlbmd0aCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFBhcnNlIGFuIEludm9rZSBjb21wb25lbnQgLSBzZWUgdGFibGUgMy4zICovCitzdGF0aWMgaW50IHBhcnNlX3NzX2ludm9rZSh1X2ludDhfdCAqaW52b2tlX2RhdGEsIHVfaW50OF90IGxlbmd0aCwKKwkJCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmMgPSAxOworCXVfaW50OF90IG9mZnNldDsKKworCS8qIG1hbmRhdG9yeSBwYXJ0ICovCisJaWYgKGludm9rZV9kYXRhWzBdICE9IEdTTTA0ODBfQ09NUElEVEFHX0lOVk9LRV9JRCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuZXhwZWN0ZWQgR1NNIDA0LjgwIENvbXBvbmVudC1JRCB0YWcgIgorCQkJIjB4JTAyeCAoZXhwZWN0aW5nIEludm9rZSBJRCB0YWcpXG4iLCBpbnZva2VfZGF0YVswXSk7CisJfQorCisJb2Zmc2V0ID0gaW52b2tlX2RhdGFbMV0gKyAyOworCXJlcS0+aW52b2tlX2lkID0gaW52b2tlX2RhdGFbMl07CisKKwkvKiBvcHRpb25hbCBwYXJ0ICovCisJaWYgKGludm9rZV9kYXRhW29mZnNldF0gPT0gR1NNMDQ4MF9DT01QSURUQUdfTElOS0VEX0lEKQorCQlvZmZzZXQgKz0gaW52b2tlX2RhdGFbb2Zmc2V0KzFdICsgMjsgIC8qIHNraXAgb3ZlciBpdCAqLworCisJLyogbWFuZGF0b3J5IHBhcnQgKi8KKwlpZiAoaW52b2tlX2RhdGFbb2Zmc2V0XSA9PSBHU00wNDgwX09QRVJBVElPTl9DT0RFKSB7CisJCXVfaW50OF90IG9wZXJhdGlvbl9jb2RlID0gaW52b2tlX2RhdGFbb2Zmc2V0KzJdOworCQlzd2l0Y2ggKG9wZXJhdGlvbl9jb2RlKSB7CisJCWNhc2UgR1NNMDQ4MF9PUF9DT0RFX1BST0NFU1NfVVNTX1JFUToKKwkJCXJjID0gcGFyc2VfcHJvY2Vzc191c3NfcmVxKGludm9rZV9kYXRhICsgb2Zmc2V0ICsgMywKKwkJCQkJCSAgIGxlbmd0aCAtIG9mZnNldCAtIDMsCisJCQkJCQkgICByZXEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwgIkdTTSAwNC44MCBvcGVyYXRpb24gY29kZSAweCUwMnggIgorCQkJCSJpcyBub3QgeWV0IGhhbmRsZWRcbiIsIG9wZXJhdGlvbl9jb2RlKTsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmV4cGVjdGVkIEdTTSAwNC44MCBDb21wb25lbnQtSUQgdGFnIDB4JTAyeCAiCisJCQkiKGV4cGVjdGluZyBPcGVyYXRpb24gQ29kZSB0YWcpXG4iLAorCQkJaW52b2tlX2RhdGFbMF0pOworCQlyYyA9IDA7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBQYXJzZSB0aGUgcGFyYW1ldGVycyBvZiBhIFByb2Nlc3MgVW5zdHJ1Y3R1cmVkU1MgUmVxdWVzdCAqLworc3RhdGljIGludCBwYXJzZV9wcm9jZXNzX3Vzc19yZXEodV9pbnQ4X3QgKnVzc19yZXFfZGF0YSwgdV9pbnQ4X3QgbGVuZ3RoLAorCQkJCQlzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJaW50IHJjID0gMDsKKwlpbnQgbnVtX2NoYXJzOworCXVfaW50OF90IGRjczsKKworCWlmICh1c3NfcmVxX2RhdGFbMF0gPT0gR1NNXzA0ODBfU0VRVUVOQ0VfVEFHKSB7CisJCWlmICh1c3NfcmVxX2RhdGFbMl0gPT0gQVNOMV9PQ1RFVF9TVFJJTkdfVEFHKSB7CisJCQlkY3MgPSB1c3NfcmVxX2RhdGFbNF07CisJCQlpZiAoKGRjcyA9PSAweDBGKSAmJgorCQkJICAgICh1c3NfcmVxX2RhdGFbNV0gPT0gQVNOMV9PQ1RFVF9TVFJJTkdfVEFHKSkgeworCQkJCW51bV9jaGFycyA9ICh1c3NfcmVxX2RhdGFbNl0gKiA4KSAvIDc7CisJCQkJLyogUHJldmVudCBhIG1vYmlsZS1vcmlnaW5hdGVkIGJ1ZmZlci1vdmVycnVuISAqLworCQkJCWlmIChudW1fY2hhcnMgPiBNQVhfTEVOX1VTU0RfU1RSSU5HKQorCQkJCQludW1fY2hhcnMgPSBNQVhfTEVOX1VTU0RfU1RSSU5HOworCQkJCWdzbV83Yml0X2RlY29kZShyZXEtPnRleHQsCisJCQkJCQkmKHVzc19yZXFfZGF0YVs3XSksIG51bV9jaGFycyk7CisJCQkJLyogYXBwZW5kIG51bGwtdGVybWluYXRvciAqLworCQkJCXJlcS0+dGV4dFtudW1fY2hhcnMrMV0gPSAwOyAgCisJCQkJcmMgPSAxOworCQkJfQorCQl9CisJfQorCXJldHVybiByYzsKK30KKworLyogU2VuZCByZXNwb25zZSB0byBhIG1vYmlsZS1vcmlnaW5hdGVkIFByb2Nlc3NVbnN0cnVjdHVyZWRTUy1SZXF1ZXN0ICovCitpbnQgZ3NtMDQ4MF9zZW5kX3Vzc2RfcmVzcG9uc2UoY29uc3Qgc3RydWN0IG1zZ2IgKmluX21zZywgY29uc3QgY2hhciAqcmVzcG9uc2VfdGV4dCwKKwkJCQkJCWNvbnN0IHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCXVfaW50OF90ICpwdHI4OworCWludCByZXNwb25zZV9sZW47CisKKwlyZXNwb25zZV9sZW4gPSAoc3RybGVuKHJlc3BvbnNlX3RleHQpICogNykgLyA4OworCWlmICgoKHN0cmxlbihyZXNwb25zZV90ZXh0KSAqIDcpICUgOCkgIT0gMCkKKwkJcmVzcG9uc2VfbGVuICs9IDE7CisKKwltc2ctPmJ0c19saW5rID0gaW5fbXNnLT5idHNfbGluazsKKwltc2ctPmxjaGFuID0gaW5fbXNnLT5sY2hhbjsKKworCS8qIEZpcnN0IHB1dCB0aGUgcGF5bG9hZCB0ZXh0IGludG8gdGhlIG1lc3NhZ2UgKi8KKwlwdHI4ID0gbXNnYl9wdXQobXNnLCByZXNwb25zZV9sZW4pOworCWdzbV83Yml0X2VuY29kZShwdHI4LCByZXNwb25zZV90ZXh0KTsKKworCS8qIFRoZW4gd3JhcCBpdCBhcyBhbiBPY3RldCBTdHJpbmcgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEFTTjFfT0NURVRfU1RSSU5HX1RBRyk7CisKKwkvKiBQcmUtcGVuZCB0aGUgRENTIG9jdGV0IHN0cmluZyAqLworCW1zZ2JfcHVzaF9UTFYxKG1zZywgQVNOMV9PQ1RFVF9TVFJJTkdfVEFHLCAweDBGKTsKKworCS8qIFRoZW4gd3JhcCB0aGVzZSBhcyBhIFNlcXVlbmNlICovCisJbXNnYl93cmFwX3dpdGhfVEwobXNnLCBHU01fMDQ4MF9TRVFVRU5DRV9UQUcpOworCisJLyogUHJlLXBlbmQgdGhlIG9wZXJhdGlvbiBjb2RlICovCisJbXNnYl9wdXNoX1RMVjEobXNnLCBHU00wNDgwX09QRVJBVElPTl9DT0RFLAorCQkJR1NNMDQ4MF9PUF9DT0RFX1BST0NFU1NfVVNTX1JFUSk7CisKKwkvKiBXcmFwIHRoZSBvcGVyYXRpb24gY29kZSBhbmQgSUE1IHN0cmluZyBhcyBhIHNlcXVlbmNlICovCisJbXNnYl93cmFwX3dpdGhfVEwobXNnLCBHU01fMDQ4MF9TRVFVRU5DRV9UQUcpOworCisJLyogUHJlLXBlbmQgdGhlIGludm9rZSBJRCAqLworCW1zZ2JfcHVzaF9UTFYxKG1zZywgR1NNMDQ4MF9DT01QSURUQUdfSU5WT0tFX0lELCByZXEtPmludm9rZV9pZCk7CisKKwkvKiBXcmFwIHRoaXMgdXAgYXMgYSBSZXR1cm4gUmVzdWx0IGNvbXBvbmVudCAqLworCW1zZ2Jfd3JhcF93aXRoX1RMKG1zZywgR1NNMDQ4MF9DVFlQRV9SRVRVUk5fUkVTVUxUKTsKKworCS8qIFdyYXAgdGhlIGNvbXBvbmVudCBpbiBhIEZhY2lsaXR5IG1lc3NhZ2UgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEdTTTA0ODBfSUVfRkFDSUxJVFkpOworCisJLyogQW5kIGZpbmFsbHkgcHJlLXBlbmQgdGhlIEwzIGhlYWRlciAqLworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXNoKG1zZywgc2l6ZW9mKCpnaCkpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX05DX1NTIHwgcmVxLT50cmFuc2FjdGlvbl9pZAorCQkJCQl8ICgxPDw3KTsgIC8qIFRJIGRpcmVjdGlvbiA9IDEgKi8KKwlnaC0+bXNnX3R5cGUgPSBHU00wNDgwX01UWVBFX1JFTEVBU0VfQ09NUExFVEU7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCitpbnQgZ3NtMDQ4MF9zZW5kX3Vzc2RfcmVqZWN0KGNvbnN0IHN0cnVjdCBtc2diICppbl9tc2csCisJCQkJY29uc3Qgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisKKwltc2ctPmJ0c19saW5rID0gaW5fbXNnLT5idHNfbGluazsKKwltc2ctPmxjaGFuID0gaW5fbXNnLT5sY2hhbjsKKworCS8qIEZpcnN0IGluc2VydCB0aGUgcHJvYmxlbSBjb2RlICovCisJbXNnYl9wdXNoX1RMVjEobXNnLCBHU01fMDQ4MF9QUk9CTEVNX0NPREVfVEFHX0dFTkVSQUwsCisJCQlHU01fMDQ4MF9HRU5fUFJPQl9DT0RFX1VOUkVDT0dOSVNFRCk7CisKKwkvKiBCZWZvcmUgaXQgaW5zZXJ0IHRoZSBpbnZva2UgSUQgKi8KKwltc2diX3B1c2hfVExWMShtc2csIEdTTTA0ODBfQ09NUElEVEFHX0lOVk9LRV9JRCwgcmVxLT5pbnZva2VfaWQpOworCisJLyogV3JhcCB0aGlzIHVwIGFzIGEgUmVqZWN0IGNvbXBvbmVudCAqLworCW1zZ2Jfd3JhcF93aXRoX1RMKG1zZywgR1NNMDQ4MF9DVFlQRV9SRUpFQ1QpOworCisJLyogV3JhcCB0aGUgY29tcG9uZW50IGluIGEgRmFjaWxpdHkgbWVzc2FnZSAqLworCW1zZ2Jfd3JhcF93aXRoX1RMKG1zZywgR1NNMDQ4MF9JRV9GQUNJTElUWSk7CisKKwkvKiBBbmQgZmluYWxseSBwcmUtcGVuZCB0aGUgTDMgaGVhZGVyICovCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmdoKSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTkNfU1M7CisJZ2gtPnByb3RvX2Rpc2NyIHw9IHJlcS0+dHJhbnNhY3Rpb25faWQgfCAoMTw8Nyk7ICAvKiBUSSBkaXJlY3Rpb24gPSAxICovCisJZ2gtPm1zZ190eXBlID0gR1NNMDQ4MF9NVFlQRV9SRUxFQVNFX0NPTVBMRVRFOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dzbV9kYXRhLmMgYi9vcGVuYnNjL3NyYy9nc21fZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NjM2N2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9nc21fZGF0YS5jCkBAIC0wLDAgKzEsNTM2IEBACisvKiAoQykgMjAwOC0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3N0YXRpc3RpY3MuaD4KKwordm9pZCAqdGFsbF9ic2NfY3R4OworCitzdGF0aWMgTExJU1RfSEVBRChidHNfbW9kZWxzKTsKKwordm9pZCBzZXRfdHNfZTFsaW5rKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsIHVfaW50OF90IGUxX25yLAorCQkgICB1X2ludDhfdCBlMV90cywgdV9pbnQ4X3QgZTFfdHNfc3MpCit7CisJdHMtPmUxX2xpbmsuZTFfbnIgPSBlMV9ucjsKKwl0cy0+ZTFfbGluay5lMV90cyA9IGUxX3RzOworCXRzLT5lMV9saW5rLmUxX3RzX3NzID0gZTFfdHNfc3M7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIHBjaGFuX25hbWVzW10gPSB7CisJeyBHU01fUENIQU5fTk9ORSwJIk5PTkUiIH0sCisJeyBHU01fUENIQU5fQ0NDSCwJIkNDQ0giIH0sCisJeyBHU01fUENIQU5fQ0NDSF9TRENDSDQsIkNDQ0grU0RDQ0g0IiB9LAorCXsgR1NNX1BDSEFOX1RDSF9GLAkiVENIL0YiIH0sCisJeyBHU01fUENIQU5fVENIX0gsCSJUQ0gvSCIgfSwKKwl7IEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QywgIlNEQ0NIOCIgfSwKKwl7IEdTTV9QQ0hBTl9QRENILAkiUERDSCIgfSwKKwl7IEdTTV9QQ0hBTl9UQ0hfRl9QRENILAkiVENIL0ZfUERDSCIgfSwKKwl7IEdTTV9QQ0hBTl9VTktOT1dOLAkiVU5LTk9XTiIgfSwKKwl7IDAsCQkJTlVMTCB9Cit9OworCitjb25zdCBjaGFyICpnc21fcGNoYW5fbmFtZShlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIGMpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcocGNoYW5fbmFtZXMsIGMpOworfQorCitlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIGdzbV9wY2hhbl9wYXJzZShjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBnZXRfc3RyaW5nX3ZhbHVlKHBjaGFuX25hbWVzLCBuYW1lKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgbGNoYW50X25hbWVzW10gPSB7CisJeyBHU01fTENIQU5fTk9ORSwJIk5PTkUiIH0sCisJeyBHU01fTENIQU5fU0RDQ0gsCSJTRENDSCIgfSwKKwl7IEdTTV9MQ0hBTl9UQ0hfRiwJIlRDSC9GIiB9LAorCXsgR1NNX0xDSEFOX1RDSF9ILAkiVENIL0giIH0sCisJeyBHU01fTENIQU5fVU5LTk9XTiwJIlVOS05PV04iIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworY29uc3QgY2hhciAqZ3NtX2xjaGFudF9uYW1lKGVudW0gZ3NtX2NoYW5fdCBjKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGxjaGFudF9uYW1lcywgYyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGxjaGFuX3NfbmFtZXNbXSA9IHsKKwl7IExDSEFOX1NfTk9ORSwJCSJOT05FIiB9LAorCXsgTENIQU5fU19BQ1RfUkVRLAkiQUNUSVZBVElPTiBSRVFVRVNURUQiIH0sCisJeyBMQ0hBTl9TX0FDVElWRSwJIkFDVElWRSIgfSwKKwl7IExDSEFOX1NfSU5BQ1RJVkUsCSJJTkFDVElWRSIgfSwKKwl7IExDSEFOX1NfUkVMX1JFUSwJIlJFTEVBU0UgUkVRVUVTVEVEIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK2NvbnN0IGNoYXIgKmdzbV9sY2hhbnNfbmFtZShlbnVtIGdzbV9sY2hhbl9zdGF0ZSBzKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGxjaGFuX3NfbmFtZXMsIHMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBjaHJlcV9uYW1lc1tdID0geworCXsgR1NNX0NIUkVRX1JFQVNPTl9FTUVSRywJIkVNRVJHRU5DWSIgfSwKKwl7IEdTTV9DSFJFUV9SRUFTT05fUEFHLAkJIlBBR0lORyIgfSwKKwl7IEdTTV9DSFJFUV9SRUFTT05fQ0FMTCwJIkNBTEwiIH0sCisJeyBHU01fQ0hSRVFfUkVBU09OX0xPQ0FUSU9OX1VQRCwiTE9DQVRJT05fVVBEQVRFIiB9LAorCXsgR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwJIk9USEVSIiB9LAorCXsgMCwJCQkJTlVMTCB9Cit9OworCitjb25zdCBjaGFyICpnc21fY2hyZXFfbmFtZShlbnVtIGdzbV9jaHJlcV9yZWFzb25fdCBjKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGNocmVxX25hbWVzLCBjKTsKK30KKworc3RhdGljIHN0cnVjdCBnc21fYnRzX21vZGVsICpidHNfbW9kZWxfZmluZChlbnVtIGdzbV9idHNfdHlwZSB0eXBlKQoreworCXN0cnVjdCBnc21fYnRzX21vZGVsICptb2RlbDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZGVsLCAmYnRzX21vZGVscywgbGlzdCkgeworCQlpZiAobW9kZWwtPnR5cGUgPT0gdHlwZSkKKwkJCXJldHVybiBtb2RlbDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGdzbV9idHNfbW9kZWxfcmVnaXN0ZXIoc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsKQoreworCWlmIChidHNfbW9kZWxfZmluZChtb2RlbC0+dHlwZSkpCisJCXJldHVybiAtRUVYSVNUOworCisJdGx2X2RlZl9wYXRjaCgmbW9kZWwtPm5tX2F0dF90bHZkZWYsICZubV9hdHRfdGx2ZGVmKTsKKwlsbGlzdF9hZGRfdGFpbCgmbW9kZWwtPmxpc3QsICZidHNfbW9kZWxzKTsKKwlyZXR1cm4gMDsKK30KKworCitzdHJ1Y3QgZ3NtX2J0c190cnggKmdzbV9idHNfdHJ4X2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB0YWxsb2NfemVybyhidHMsIHN0cnVjdCBnc21fYnRzX3RyeCk7CisJaW50IGs7CisKKwlpZiAoIXRyeCkKKwkJcmV0dXJuIE5VTEw7CisKKwl0cngtPmJ0cyA9IGJ0czsKKwl0cngtPm5yID0gYnRzLT5udW1fdHJ4Kys7CisJdHJ4LT5ubV9zdGF0ZS5hZG1pbmlzdHJhdGl2ZSA9IE5NX1NUQVRFX1VOTE9DS0VEOworCisJZm9yIChrID0gMDsgayA8IFRSWF9OUl9UUzsgaysrKSB7CisJCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSAmdHJ4LT50c1trXTsKKwkJaW50IGw7CisJCQorCQl0cy0+dHJ4ID0gdHJ4OworCQl0cy0+bnIgPSBrOworCQl0cy0+cGNoYW4gPSBHU01fUENIQU5fTk9ORTsKKworCQlmb3IgKGwgPSAwOyBsIDwgVFNfTUFYX0xDSEFOOyBsKyspIHsKKwkJCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCQkJbGNoYW4gPSAmdHMtPmxjaGFuW2xdOworCisJCQlsY2hhbi0+dHMgPSB0czsKKwkJCWxjaGFuLT5uciA9IGw7CisJCQlsY2hhbi0+dHlwZSA9IEdTTV9MQ0hBTl9OT05FOworCQl9CisJfQorCisJaWYgKHRyeC0+bnIgIT0gMCkKKwkJdHJ4LT5ub21pbmFsX3Bvd2VyID0gYnRzLT5jMC0+bm9taW5hbF9wb3dlcjsKKworCWxsaXN0X2FkZF90YWlsKCZ0cngtPmxpc3QsICZidHMtPnRyeF9saXN0KTsKKworCXJldHVybiB0cng7Cit9CisKK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX2FsbG9jKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBlbnVtIGdzbV9idHNfdHlwZSB0eXBlLAorCQkJICAgICAgdV9pbnQ4X3QgdHNjLCB1X2ludDhfdCBic2ljKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB0YWxsb2NfemVybyhuZXQsIHN0cnVjdCBnc21fYnRzKTsKKwlzdHJ1Y3QgZ3NtX2J0c19tb2RlbCAqbW9kZWwgPSBidHNfbW9kZWxfZmluZCh0eXBlKTsKKwlpbnQgaTsKKworCWlmICghYnRzKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghbW9kZWwgJiYgdHlwZSAhPSBHU01fQlRTX1RZUEVfVU5LTk9XTikgeworCQl0YWxsb2NfZnJlZShidHMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlidHMtPm5ldHdvcmsgPSBuZXQ7CisJYnRzLT5uciA9IG5ldC0+bnVtX2J0cysrOworCWJ0cy0+dHlwZSA9IHR5cGU7CisJYnRzLT5tb2RlbCA9IG1vZGVsOworCWJ0cy0+dHNjID0gdHNjOworCWJ0cy0+YnNpYyA9IGJzaWM7CisJYnRzLT5udW1fdHJ4ID0gMDsKKwlJTklUX0xMSVNUX0hFQUQoJmJ0cy0+dHJ4X2xpc3QpOworCWJ0cy0+bXNfbWF4X3Bvd2VyID0gMTU7CS8qIGRCbSAqLworCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5jZWxsX3Jlc2VsX2h5c3QgPSAyOyAvKiA0IGRCICovCisJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLnJ4bGV2X2FjY19taW4gPSAwOworCWJ0cy0+c2lfY29tbW9uLm5laWdoX2xpc3QuZGF0YSA9IGJ0cy0+c2lfY29tbW9uLmRhdGEubmVpZ2hfbGlzdDsKKwlidHMtPnNpX2NvbW1vbi5uZWlnaF9saXN0LmRhdGFfbGVuID0KKwkJCQlzaXplb2YoYnRzLT5zaV9jb21tb24uZGF0YS5uZWlnaF9saXN0KTsKKwlidHMtPnNpX2NvbW1vbi5jZWxsX2FsbG9jLmRhdGEgPSBidHMtPnNpX2NvbW1vbi5kYXRhLmNlbGxfYWxsb2M7CisJYnRzLT5zaV9jb21tb24uY2VsbF9hbGxvYy5kYXRhX2xlbiA9CisJCQkJc2l6ZW9mKGJ0cy0+c2lfY29tbW9uLmRhdGEuY2VsbF9hbGxvYyk7CisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLnJlID0gMTsgLyogbm8gcmUtZXN0YWJsaXNobWVudCAqLworCWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC50eF9pbnRlZ2VyID0gOTsgIC8qIDEyIHNsb3RzIHNwcmVhZCAtIDIxNy8xMTUgc2xvdHMgZGVsYXkgKi8KKwlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wubWF4X3RyYW5zID0gMzsgLyogNyByZXRyYW5zbWlzc2lvbnMgKi8KKwlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wudDIgPSA0OyAvKiBubyBlbWVyZ2VuY3kgY2FsbHMgKi8KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ0cy0+Z3Bycy5uc3ZjKTsgaSsrKSB7CisJCWJ0cy0+Z3Bycy5uc3ZjW2ldLmJ0cyA9IGJ0czsKKwkJYnRzLT5ncHJzLm5zdmNbaV0uaWQgPSBpOworCX0KKworCS8qIGNyZWF0ZSBvdXIgcHJpbWFyeSBUUlggKi8KKwlidHMtPmMwID0gZ3NtX2J0c190cnhfYWxsb2MoYnRzKTsKKwlpZiAoIWJ0cy0+YzApIHsKKwkJdGFsbG9jX2ZyZWUoYnRzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWJ0cy0+YzAtPnRzWzBdLnBjaGFuID0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0OworCisJbGxpc3RfYWRkX3RhaWwoJmJ0cy0+bGlzdCwgJm5ldC0+YnRzX2xpc3QpOworCisJcmV0dXJuIGJ0czsKK30KKworc3RydWN0IGdzbV9uZXR3b3JrICpnc21fbmV0d29ya19pbml0KHVfaW50MTZfdCBjb3VudHJ5X2NvZGUsIHVfaW50MTZfdCBuZXR3b3JrX2NvZGUsCisJCQkJICAgICBpbnQgKCptbmNjX3JlY3YpKHN0cnVjdCBnc21fbmV0d29yayAqLCBpbnQsIHZvaWQgKikpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQ7CisKKwluZXQgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBnc21fbmV0d29yayk7CisJaWYgKCFuZXQpCisJCXJldHVybiBOVUxMOworCisJbmV0LT5jb3VudHJ5X2NvZGUgPSBjb3VudHJ5X2NvZGU7CisJbmV0LT5uZXR3b3JrX2NvZGUgPSBuZXR3b3JrX2NvZGU7CisJbmV0LT5udW1fYnRzID0gMDsKKwluZXQtPnJlamVjdF9jYXVzZSA9IEdTTTQ4X1JFSkVDVF9ST0FNSU5HX05PVF9BTExPV0VEOworCW5ldC0+VDMxMDEgPSBHU01fVDMxMDFfREVGQVVMVDsKKwluZXQtPlQzMTEzID0gR1NNX1QzMTEzX0RFRkFVTFQ7CisJLyogRklYTUU6IGluaXRpYWxpemUgYWxsIG90aGVyIHRpbWVycyEgKi8KKworCS8qIGRlZmF1bHQgc2V0IG9mIGhhbmRvdmVyIHBhcmFtZXRlcnMgKi8KKwluZXQtPmhhbmRvdmVyLndpbl9yeGxldl9hdmcgPSAxMDsKKwluZXQtPmhhbmRvdmVyLndpbl9yeHF1YWxfYXZnID0gMTsKKwluZXQtPmhhbmRvdmVyLndpbl9yeGxldl9hdmdfbmVpZ2ggPSAxMDsKKwluZXQtPmhhbmRvdmVyLnB3cl9pbnRlcnZhbCA9IDY7CisJbmV0LT5oYW5kb3Zlci5wd3JfaHlzdGVyZXNpcyA9IDM7CisJbmV0LT5oYW5kb3Zlci5tYXhfZGlzdGFuY2UgPSA5OTk5OworCisJSU5JVF9MTElTVF9IRUFEKCZuZXQtPnRyYW5zX2xpc3QpOworCUlOSVRfTExJU1RfSEVBRCgmbmV0LT51cHF1ZXVlKTsKKwlJTklUX0xMSVNUX0hFQUQoJm5ldC0+YnRzX2xpc3QpOworCisJbmV0LT5zdGF0cy5jaHJlcS50b3RhbCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5jaHJlcS50b3RhbCIpOworCW5ldC0+c3RhdHMuY2hyZXEubm9fY2hhbm5lbCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5jaHJlcS5ub19jaGFubmVsIik7CisJbmV0LT5zdGF0cy5oYW5kb3Zlci5hdHRlbXB0ZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQuaGFuZG92ZXIuYXR0ZW1wdGVkIik7CisJbmV0LT5zdGF0cy5oYW5kb3Zlci5ub19jaGFubmVsID0gY291bnRlcl9hbGxvYygibmV0LmhhbmRvdmVyLm5vX2NoYW5uZWwiKTsKKwluZXQtPnN0YXRzLmhhbmRvdmVyLnRpbWVvdXQgPSBjb3VudGVyX2FsbG9jKCJuZXQuaGFuZG92ZXIudGltZW91dCIpOworCW5ldC0+c3RhdHMuaGFuZG92ZXIuY29tcGxldGVkID0gY291bnRlcl9hbGxvYygibmV0LmhhbmRvdmVyLmNvbXBsZXRlZCIpOworCW5ldC0+c3RhdHMuaGFuZG92ZXIuZmFpbGVkID0gY291bnRlcl9hbGxvYygibmV0LmhhbmRvdmVyLmZhaWxlZCIpOworCW5ldC0+c3RhdHMubG9jX3VwZF90eXBlLmF0dGFjaCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5sb2NfdXBkX3R5cGUuYXR0YWNoIik7CisJbmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUubm9ybWFsID0gY291bnRlcl9hbGxvYygibmV0LmxvY191cGRfdHlwZS5ub3JtYWwiKTsKKwluZXQtPnN0YXRzLmxvY191cGRfdHlwZS5wZXJpb2RpYyA9IGNvdW50ZXJfYWxsb2MoIm5ldC5sb2NfdXBkX3R5cGUucGVyaW9kaWMiKTsKKwluZXQtPnN0YXRzLmxvY191cGRfdHlwZS5kZXRhY2ggPSBjb3VudGVyX2FsbG9jKCJuZXQuaW1zaV9kZXRhY2guY291bnQiKTsKKwluZXQtPnN0YXRzLmxvY191cGRfcmVzcC5yZWplY3QgPSBjb3VudGVyX2FsbG9jKCJuZXQubG9jX3VwZF9yZXNwLnJlamVjdCIpOworCW5ldC0+c3RhdHMubG9jX3VwZF9yZXNwLmFjY2VwdCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5sb2NfdXBkX3Jlc3AuYWNjZXB0Iik7CisJbmV0LT5zdGF0cy5wYWdpbmcuYXR0ZW1wdGVkID0gY291bnRlcl9hbGxvYygibmV0LnBhZ2luZy5hdHRlbXB0ZWQiKTsKKwluZXQtPnN0YXRzLnBhZ2luZy5kZXRhY2hlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5wYWdpbmcuZGV0YWNoZWQiKTsKKwluZXQtPnN0YXRzLnBhZ2luZy5jb21wbGV0ZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQucGFnaW5nLmNvbXBsZXRlZCIpOworCW5ldC0+c3RhdHMucGFnaW5nLmV4cGlyZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQucGFnaW5nLmV4cGlyZWQiKTsKKwluZXQtPnN0YXRzLnNtcy5zdWJtaXR0ZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQuc21zLnN1Ym1pdHRlZCIpOworCW5ldC0+c3RhdHMuc21zLm5vX3JlY2VpdmVyID0gY291bnRlcl9hbGxvYygibmV0LnNtcy5ub19yZWNlaXZlciIpOworCW5ldC0+c3RhdHMuc21zLmRlbGl2ZXJlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5zbXMuZGVsaXZlcmVkIik7CisJbmV0LT5zdGF0cy5zbXMucnBfZXJyX21lbSA9IGNvdW50ZXJfYWxsb2MoIm5ldC5zbXMucnBfZXJyX21lbSIpOworCW5ldC0+c3RhdHMuc21zLnJwX2Vycl9vdGhlciA9IGNvdW50ZXJfYWxsb2MoIm5ldC5zbXMucnBfZXJyX290aGVyIik7CisJbmV0LT5zdGF0cy5jYWxsLmRpYWxsZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQuY2FsbC5kaWFsbGVkIik7CisJbmV0LT5zdGF0cy5jYWxsLmFsZXJ0ZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQuY2FsbC5hbGVydGVkIik7CisJbmV0LT5zdGF0cy5jYWxsLmNvbm5lY3RlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5jYWxsLmNvbm5lY3RlZCIpOworCisJbmV0LT5tbmNjX3JlY3YgPSBtbmNjX3JlY3Y7CisKKwlyZXR1cm4gbmV0OworfQorCitzdHJ1Y3QgZ3NtX2J0cyAqZ3NtX2J0c19udW0oc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBudW0pCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCWlmIChudW0gPj0gbmV0LT5udW1fYnRzKQorCQlyZXR1cm4gTlVMTDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJm5ldC0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGJ0cy0+bnIgPT0gbnVtKQorCQkJcmV0dXJuIGJ0czsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogR2V0IHJlZmVyZW5jZSB0byBhIG5laWdoYm9yIGNlbGwgb24gYSBnaXZlbiBCQ0NIIEFSRkNOICovCitzdHJ1Y3QgZ3NtX2J0cyAqZ3NtX2J0c19uZWlnaGJvcihjb25zdCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCSB1X2ludDE2X3QgYXJmY24sIHVfaW50OF90IGJzaWMpCit7CisJc3RydWN0IGdzbV9idHMgKm5laWdoOworCS8qIEZJWE1FOiB1c2Ugc29tZSBiZXR0ZXIgaGV1cmlzdGljcyBoZXJlIHRvIGRldGVybWluZSB3aGljaCBjZWxsCisJICogdXNpbmcgdGhpcyBBUkZDTiByZWFsbHkgaXMgY2xvc2VzdCB0byB0aGUgdGFyZ2V0IGNlbGwuICBGb3IKKwkgKiBub3cgd2Ugc2ltcGx5IGFzc3VtZSB0aGF0IGVhY2ggQVJGQ04gd2lsbCBvbmx5IGJlIHVzZWQgYnkgb25lCisJICogY2VsbCAqLworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobmVpZ2gsICZidHMtPm5ldHdvcmstPmJ0c19saXN0LCBsaXN0KSB7CisJCWlmIChuZWlnaC0+YzAtPmFyZmNuID09IGFyZmNuICYmCisJCSAgICBuZWlnaC0+YnNpYyA9PSBic2ljKQorCQkJcmV0dXJuIG5laWdoOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgZ3NtX2J0c190cnggKmdzbV9idHNfdHJ4X251bShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgbnVtKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJaWYgKG51bSA+PSBidHMtPm51bV90cngpCisJCXJldHVybiBOVUxMOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkgeworCQlpZiAodHJ4LT5uciA9PSBudW0pCisJCQlyZXR1cm4gdHJ4OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY2hhciB0czJzdHJbMjU1XTsKKworY2hhciAqZ3NtX3RyeF9uYW1lKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCXNucHJpbnRmKHRzMnN0ciwgc2l6ZW9mKHRzMnN0ciksICIoYnRzPSVkLHRyeD0lZCkiLAorCQkgdHJ4LT5idHMtPm5yLCB0cngtPm5yKTsKKworCXJldHVybiB0czJzdHI7Cit9CisKKworY2hhciAqZ3NtX3RzX25hbWUoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cykKK3sKKwlzbnByaW50Zih0czJzdHIsIHNpemVvZih0czJzdHIpLCAiKGJ0cz0lZCx0cng9JWQsdHM9JWQpIiwKKwkJIHRzLT50cngtPmJ0cy0+bnIsIHRzLT50cngtPm5yLCB0cy0+bnIpOworCisJcmV0dXJuIHRzMnN0cjsKK30KKworY2hhciAqZ3NtX2xjaGFuX25hbWUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IGxjaGFuLT50czsKKworCXNucHJpbnRmKHRzMnN0ciwgc2l6ZW9mKHRzMnN0ciksICIoYnRzPSVkLHRyeD0lZCx0cz0lZCxzcz0lZCkiLAorCQkgdHMtPnRyeC0+YnRzLT5uciwgdHMtPnRyeC0+bnIsIHRzLT5uciwgbGNoYW4tPm5yKTsKKworCXJldHVybiB0czJzdHI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIGJ0c190eXBlc1tdID0geworCXsgR1NNX0JUU19UWVBFX1VOS05PV04sCSJ1bmtub3duIiB9LAorCXsgR1NNX0JUU19UWVBFX0JTMTEsCSJiczExIiB9LAorCXsgR1NNX0JUU19UWVBFX05BTk9CVFMsCSJuYW5vYnRzIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK2VudW0gZ3NtX2J0c190eXBlIHBhcnNlX2J0c3R5cGUoY29uc3QgY2hhciAqYXJnKQoreworCXJldHVybiBnZXRfc3RyaW5nX3ZhbHVlKGJ0c190eXBlcywgYXJnKTsKK30KKworY29uc3QgY2hhciAqYnRzdHlwZTJzdHIoZW51bSBnc21fYnRzX3R5cGUgdHlwZSkKK3sKKwlyZXR1cm4gZ2V0X3ZhbHVlX3N0cmluZyhidHNfdHlwZXMsIHR5cGUpOworfQorCitzdHJ1Y3QgZ3NtX2J0c190cnggKmdzbV9idHNfdHJ4X2J5X25yKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBucikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpIHsKKwkJaWYgKHRyeC0+bnIgPT0gbnIpCisJCQlyZXR1cm4gdHJ4OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogU2VhcmNoIGZvciBhIEJUUyBpbiB0aGUgZ2l2ZW4gTG9jYXRpb24gQXJlYTsgb3B0aW9uYWxseSBzdGFydCBzZWFyY2hpbmcKKyAqIHdpdGggc3RhcnRfYnRzIChmb3IgY29udGludWluZyB0byBzZWFyY2ggYWZ0ZXIgdGhlIGZpcnN0IHJlc3VsdCkgKi8KK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX2J5X2xhYyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdW5zaWduZWQgaW50IGxhYywKKwkJCQlzdHJ1Y3QgZ3NtX2J0cyAqc3RhcnRfYnRzKQoreworCWludCBpOworCXN0cnVjdCBnc21fYnRzICpidHM7CisJaW50IHNraXAgPSAwOworCisJaWYgKHN0YXJ0X2J0cykKKwkJc2tpcCA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmV0LT5udW1fYnRzOyBpKyspIHsKKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBpKTsKKworCQlpZiAoc2tpcCkgeworCQkJaWYgKHN0YXJ0X2J0cyA9PSBidHMpCisJCQkJc2tpcCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChsYWMgPT0gR1NNX0xBQ19SRVNFUlZFRF9BTExfQlRTIHx8IGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlID09IGxhYykKKwkJCXJldHVybiBidHM7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBhdXRoX3BvbGljeV9uYW1lc1tdID0geworCXsgR1NNX0FVVEhfUE9MSUNZX0NMT1NFRCwJImNsb3NlZCIgfSwKKwl7IEdTTV9BVVRIX1BPTElDWV9BQ0NFUFRfQUxMLAkiYWNjZXB0LWFsbCIgfSwKKwl7IEdTTV9BVVRIX1BPTElDWV9UT0tFTiwJInRva2VuIiB9LAorCXsgMCwJCQkJTlVMTCB9Cit9OworCitlbnVtIGdzbV9hdXRoX3BvbGljeSBnc21fYXV0aF9wb2xpY3lfcGFyc2UoY29uc3QgY2hhciAqYXJnKQoreworCXJldHVybiBnZXRfc3RyaW5nX3ZhbHVlKGF1dGhfcG9saWN5X25hbWVzLCBhcmcpOworfQorCitjb25zdCBjaGFyICpnc21fYXV0aF9wb2xpY3lfbmFtZShlbnVtIGdzbV9hdXRoX3BvbGljeSBwb2xpY3kpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcoYXV0aF9wb2xpY3lfbmFtZXMsIHBvbGljeSk7Cit9CisKKy8qIHRoaXMgc2hvdWxkIG5vdCBiZSBoZXJlIGJ1dCBpbiBnc21fMDRfMDguLi4gYnV0IHRoYXQgY3JlYXRlcworICAgaW4gdHVybiBhIGRlcGVuZGVuY3kgbmlnaHRtYXJlIChhYmlzX25tIGRlcGVuZGluZyBvbiAwNF8wOCwgLi4uKSAqLworc3RhdGljIGludCBnc200OF9jb25zdHJ1Y3RfcmEodV9pbnQ4X3QgKmJ1ZiwgY29uc3Qgc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQpCit7CisJdV9pbnQxNl90IG1jYyA9IHJhaWQtPm1jYzsKKwl1X2ludDE2X3QgbW5jID0gcmFpZC0+bW5jOworCisJYnVmWzBdID0gKChtY2MgLyAxMDApICUgMTApIHwgKCgobWNjIC8gMTApICUgMTApIDw8IDQpOworCWJ1ZlsxXSA9IChtY2MgJSAxMCk7CisKKwkvKiBJIHdvbmRlciB3aG8gY2FtZSB1cCB3aXRoIHRoZSBzdHVwaWRpdHkgb2YgZW5jb2RpbmcgdGhlIE1OQworCSAqIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiBob3cgbWFueSBkaWdpdHMgaXRzIGRlY2ltYWwgbnVtYmVyIGhhcyEgKi8KKwlpZiAobW5jIDwgMTAwKSB7CisJCWJ1ZlsxXSB8PSAweGYwOworCQlidWZbMl0gPSAoKG1uYyAvIDEwKSAlIDEwKSB8ICgobW5jICUgMTApIDw8IDQpOworCX0gZWxzZSB7CisJCWJ1ZlsxXSB8PSAobW5jICUgMTApIDw8IDQ7CisJCWJ1ZlsyXSA9ICgobW5jIC8gMTAwKSAlIDEwKSB8ICgoKG1jYyAvIDEwKSAlIDEwKSA8PCA0KTsKKwl9CisKKwkqKHVfaW50MTZfdCAqKShidWYrMykgPSBodG9ucyhyYWlkLT5sYWMpOworCisJYnVmWzVdID0gcmFpZC0+cmFjOworCisJcmV0dXJuIDY7Cit9CisKK3ZvaWQgZ3Byc19yYV9pZF9ieV9idHMoc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJcmFpZC0+bWNjID0gYnRzLT5uZXR3b3JrLT5jb3VudHJ5X2NvZGU7CisJcmFpZC0+bW5jID0gYnRzLT5uZXR3b3JrLT5uZXR3b3JrX2NvZGU7CisJcmFpZC0+bGFjID0gYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGU7CisJcmFpZC0+cmFjID0gYnRzLT5ncHJzLnJhYzsKK30KKworaW50IGdzbTQ4X3JhX2lkX2J5X2J0cyh1X2ludDhfdCAqYnVmLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBncHJzX3JhX2lkIHJhaWQ7CisKKwlncHJzX3JhX2lkX2J5X2J0cygmcmFpZCwgYnRzKTsKKworCXJldHVybiBnc200OF9jb25zdHJ1Y3RfcmEoYnVmLCAmcmFpZCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmFsdWVfc3RyaW5nIHJybHBfbW9kZV9uYW1lc1tdID0geworCXsgUlJMUF9NT0RFX05PTkUsCSJub25lIiB9LAorCXsgUlJMUF9NT0RFX01TX0JBU0VELAkibXMtYmFzZWQiIH0sCisJeyBSUkxQX01PREVfTVNfUFJFRiwJIm1zLXByZWZlcnJlZCIgfSwKKwl7IFJSTFBfTU9ERV9BU1NfUFJFRiwJImFzcy1wcmVmZXJyZWQiIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworZW51bSBycmxwX21vZGUgcnJscF9tb2RlX3BhcnNlKGNvbnN0IGNoYXIgKmFyZykKK3sKKwlyZXR1cm4gZ2V0X3N0cmluZ192YWx1ZShycmxwX21vZGVfbmFtZXMsIGFyZyk7Cit9CisKK2NvbnN0IGNoYXIgKnJybHBfbW9kZV9uYW1lKGVudW0gcnJscF9tb2RlIG1vZGUpCit7CisJcmV0dXJuIGdldF92YWx1ZV9zdHJpbmcocnJscF9tb2RlX25hbWVzLCBtb2RlKTsKK30KKworc3RydWN0IGdzbV9tZWFzX3JlcCAqbGNoYW5fbmV4dF9tZWFzX3JlcChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwICptZWFzX3JlcDsKKworCW1lYXNfcmVwID0gJmxjaGFuLT5tZWFzX3JlcFtsY2hhbi0+bWVhc19yZXBfaWR4XTsKKwltZW1zZXQobWVhc19yZXAsIDAsIHNpemVvZigqbWVhc19yZXApKTsKKwltZWFzX3JlcC0+bGNoYW4gPSBsY2hhbjsKKwlsY2hhbi0+bWVhc19yZXBfaWR4ID0gKGxjaGFuLT5tZWFzX3JlcF9pZHggKyAxKQorCQkJCQklIEFSUkFZX1NJWkUobGNoYW4tPm1lYXNfcmVwKTsKKworCXJldHVybiBtZWFzX3JlcDsKK30KKworaW50IGdzbV9zZXRfYnRzX3R5cGUoc3RydWN0IGdzbV9idHMgKmJ0cywgZW51bSBnc21fYnRzX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0c19tb2RlbCAqbW9kZWw7CisKKwltb2RlbCA9IGJ0c19tb2RlbF9maW5kKHR5cGUpOworCWlmICghbW9kZWwpCisJCXJldHVybiAtRUlOVkFMOworCisJYnRzLT50eXBlID0gdHlwZTsKKwlidHMtPm1vZGVsID0gbW9kZWw7CisKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCS8qIFNldCB0aGUgZGVmYXVsdCBPTUwgU3RyZWFtIElEIHRvIDB4ZmYgKi8KKwkJYnRzLT5vbWxfdGVpID0gMHhmZjsKKwkJYnRzLT5jMC0+bm9taW5hbF9wb3dlciA9IDIzOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dzbV9zdWJzY3JpYmVyLmMgYi9vcGVuYnNjL3NyYy9nc21fc3Vic2NyaWJlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MjUwODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9nc21fc3Vic2NyaWJlci5jCkBAIC0wLDAgKzEsMTMwIEBACisvKiBUaGUgY29uY2VwdCBvZiBhIHN1YnNjcmliZXIgZm9yIHRoZSBNU0MsIHJvdWdobHkgSExSL1ZMUiBmdW5jdGlvbmFsaXR5ICovCisKKy8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKworZXh0ZXJuIHN0cnVjdCBsbGlzdF9oZWFkICpzdWJzY3JfYnNjX2FjdGl2ZV9zdWJzY3JpYmVyKHZvaWQpOworCitjaGFyICpzdWJzY3JfbmFtZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlpZiAoc3RybGVuKHN1YnNjci0+bmFtZSkpCisJCXJldHVybiBzdWJzY3ItPm5hbWU7CisKKwlyZXR1cm4gc3Vic2NyLT5pbXNpOworfQorCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfdG1zaShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICB1X2ludDMyX3QgdG1zaSkKK3sKKwljaGFyIHRtc2lfc3RyaW5nWzE0XTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCS8qIHdlIG1pZ2h0IGhhdmUgYSByZWNvcmQgaW4gbWVtb3J5IGFscmVhZHkgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJzY3IsIHN1YnNjcl9ic2NfYWN0aXZlX3N1YnNjcmliZXIoKSwgZW50cnkpIHsKKwkJaWYgKHRtc2kgPT0gc3Vic2NyLT50bXNpKQorCQkJcmV0dXJuIHN1YnNjcl9nZXQoc3Vic2NyKTsKKwl9CisKKwlzcHJpbnRmKHRtc2lfc3RyaW5nLCAiJXUiLCB0bXNpKTsKKwlyZXR1cm4gZGJfZ2V0X3N1YnNjcmliZXIobmV0LCBHU01fU1VCU0NSSUJFUl9UTVNJLCB0bXNpX3N0cmluZyk7Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV9pbXNpKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQkgIGNvbnN0IGNoYXIgKmltc2kpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShzdWJzY3IsIHN1YnNjcl9ic2NfYWN0aXZlX3N1YnNjcmliZXIoKSwgZW50cnkpIHsKKwkJaWYgKHN0cmNtcChzdWJzY3ItPmltc2ksIGltc2kpID09IDApCisJCQlyZXR1cm4gc3Vic2NyX2dldChzdWJzY3IpOworCX0KKworCXJldHVybiBkYl9nZXRfc3Vic2NyaWJlcihuZXQsIEdTTV9TVUJTQ1JJQkVSX0lNU0ksIGltc2kpOworfQorCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfZXh0ZW5zaW9uKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQkgICAgICAgY29uc3QgY2hhciAqZXh0KQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoc3Vic2NyLCBzdWJzY3JfYnNjX2FjdGl2ZV9zdWJzY3JpYmVyKCksIGVudHJ5KSB7CisJCWlmIChzdHJjbXAoc3Vic2NyLT5leHRlbnNpb24sIGV4dCkgPT0gMCkKKwkJCXJldHVybiBzdWJzY3JfZ2V0KHN1YnNjcik7CisJfQorCisJcmV0dXJuIGRiX2dldF9zdWJzY3JpYmVyKG5ldCwgR1NNX1NVQlNDUklCRVJfRVhURU5TSU9OLCBleHQpOworfQorCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfaWQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBpZCkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKwljaGFyIGJ1ZlszMl07CisJc3ByaW50ZihidWYsICIlbGx1IiwgaWQpOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoc3Vic2NyLCBzdWJzY3JfYnNjX2FjdGl2ZV9zdWJzY3JpYmVyKCksIGVudHJ5KSB7CisJCWlmIChzdWJzY3ItPmlkID09IGlkKQorCQkJcmV0dXJuIHN1YnNjcl9nZXQoc3Vic2NyKTsKKwl9CisKKwlyZXR1cm4gZGJfZ2V0X3N1YnNjcmliZXIobmV0LCBHU01fU1VCU0NSSUJFUl9JRCwgYnVmKTsKK30KKworCitpbnQgc3Vic2NyX3VwZGF0ZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnMsIHN0cnVjdCBnc21fYnRzICpidHMsIGludCByZWFzb24pCit7CisJLyogRklYTUU6IE1pZ3JhdGUgcGVuZGluZyByZXF1ZXN0cyBmcm9tIG9uZSBCU0MgdG8gYW5vdGhlciAqLworCXN3aXRjaCAocmVhc29uKSB7CisJY2FzZSBHU01fU1VCU0NSSUJFUl9VUERBVEVfQVRUQUNIRUQ6CisJCXMtPm5ldCA9IGJ0cy0+bmV0d29yazsKKwkJLyogSW5kaWNhdGUgImF0dGFjaGVkIHRvIExBQyIgKi8KKwkJcy0+bGFjID0gYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGU7CisJCUxPR1AoRE1NLCBMT0dMX0lORk8sICJTdWJzY3JpYmVyICVzIEFUVEFDSEVEIExBQz0ldVxuIiwKKwkJCXN1YnNjcl9uYW1lKHMpLCBzLT5sYWMpOworCQlkaXNwYXRjaF9zaWduYWwoU1NfU1VCU0NSLCBTX1NVQlNDUl9BVFRBQ0hFRCwgcyk7CisJCWJyZWFrOworCWNhc2UgR1NNX1NVQlNDUklCRVJfVVBEQVRFX0RFVEFDSEVEOgorCQkvKiBPbmx5IGRldGFjaCBpZiB3ZSBhcmUgY3VycmVudGx5IGluIHRoaXMgYXJlYSAqLworCQlpZiAoYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUgPT0gcy0+bGFjKQorCQkJcy0+bGFjID0gR1NNX0xBQ19SRVNFUlZFRF9ERVRBQ0hFRDsKKwkJTE9HUChETU0sIExPR0xfSU5GTywgIlN1YnNjcmliZXIgJXMgREVUQUNIRURcbiIsIHN1YnNjcl9uYW1lKHMpKTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX1NVQlNDUiwgU19TVUJTQ1JfREVUQUNIRUQsIHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgInN1YnNjcl91cGRhdGUgd2l0aCB1bmtub3duIHJlYXNvbjogJWRcbiIsCisJCQlyZWFzb24pOworCQlicmVhazsKKwl9OworCXJldHVybiBkYl9zeW5jX3N1YnNjcmliZXIocyk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3NtX3N1YnNjcmliZXJfYmFzZS5jIGIvb3BlbmJzYy9zcmMvZ3NtX3N1YnNjcmliZXJfYmFzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYzNiYmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9nc21fc3Vic2NyaWJlcl9iYXNlLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qIFRoZSBjb25jZXB0IG9mIGEgc3Vic2NyaWJlciBhcyBzZWVuIGJ5IHRoZSBCU0MgKi8KKworLyogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKK0xMSVNUX0hFQUQoYWN0aXZlX3N1YnNjcmliZXJzKTsKK3ZvaWQgKnRhbGxfc3Vic2NyX2N0eDsKK3ZvaWQgKnRhbGxfc3ViX3JlcV9jdHg7CisKKy8qIGZvciB0aGUgZ3NtX3N1YnNjcmliZXIuYyAqLworc3RydWN0IGxsaXN0X2hlYWQgKnN1YnNjcl9ic2NfYWN0aXZlX3N1YnNjcmliZXIodm9pZCkKK3sKKwlyZXR1cm4gJmFjdGl2ZV9zdWJzY3JpYmVyczsKK30KKworLyoKKyAqIFN0cnVjdCBmb3IgcGVuZGluZyBjaGFubmVsIHJlcXVlc3RzLiBUaGlzIGlzIG1hbmFnZWQgaW4gdGhlCisgKiBsbGlzdF9oZWFkIHJlcXVlc3RzIG9mIGVhY2ggc3Vic2NyaWJlci4gVGhlIHJlZmVyZW5jZSBjb3VudGluZworICogc2hvdWxkIHdvcmsgaW4gc3VjaCBhIHdheSB0aGF0IGEgc3Vic2NyaWJlciB3aXRoIGEgcGVuZGluZyByZXF1ZXN0CisgKiByZW1haW5zIGluIG1lbW9yeS4KKyAqLworc3RydWN0IHN1YnNjcl9yZXF1ZXN0IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKworCS8qIGJhY2sgcmVmZXJlbmNlICovCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwkvKiB0aGUgcmVxdWVzdGVkIGNoYW5uZWwgdHlwZSAqLworCWludCBjaGFubmVsX3R5cGU7CisKKwkvKiB0aGUgY2FsbGJhY2sgZGF0YSAqLworCWdzbV9jYmZuICpjYmZuOworCXZvaWQgKnBhcmFtOworfTsKKworLyoKKyAqIFdlIGdvdCB0aGUgY2hhbm5lbCBhc3NpZ25lZCBhbmQgY2FuIG5vdyBoYW5kIHRoaXMgY2hhbm5lbAorICogb3ZlciB0byBvbmUgb2Ygb3VyIGNhbGxiYWNrcy4KKyAqLworc3RhdGljIGludCBzdWJzY3JfcGFnaW5nX2NiKHVuc2lnbmVkIGludCBob29rbnVtLCB1bnNpZ25lZCBpbnQgZXZlbnQsCisJCQkgICAgIHN0cnVjdCBtc2diICptc2csIHZvaWQgKmRhdGEsIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBzdWJzY3JfcmVxdWVzdCAqcmVxdWVzdDsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKilwYXJhbTsKKworCS8qIFRoZXJlIGlzIG5vIHJlcXVlc3QgYW55bW9yZS4uLiAqLworCWlmIChsbGlzdF9lbXB0eSgmc3Vic2NyLT5yZXF1ZXN0cykpCisJCXJldHVybiAtMTsKKworCS8qCisJICogRklYTUU6IFdoYXQgdG8gZG8gd2l0aCBwYWdpbmcgcmVxdWVzdHMgY29taW5nIGR1cmluZworCSAqIHRoaXMgY2FsbGJhY2s/IFdlIG11c3QgYmUgc3VyZSB0byBub3Qgc3RhcnQgcGFnaW5nIHdoZW4KKwkgKiB3ZSBoYXZlIGFuIGFjdGl2ZSBjb25uZWN0aW9uIHRvIGEgc3Vic2NyaWJlciBhbmQgdG8gbWFrZQorCSAqIHRoZSBzdWJzY3JfcHV0X2NoYW5uZWwgd29yayBhcyByZXF1aXJlZC4uLgorCSAqLworCXJlcXVlc3QgPSAoc3RydWN0IHN1YnNjcl9yZXF1ZXN0ICopc3Vic2NyLT5yZXF1ZXN0cy5uZXh0OworCWxsaXN0X2RlbCgmcmVxdWVzdC0+ZW50cnkpOworCXN1YnNjci0+aW5fY2FsbGJhY2sgPSAxOworCXJlcXVlc3QtPmNiZm4oaG9va251bSwgZXZlbnQsIG1zZywgZGF0YSwgcmVxdWVzdC0+cGFyYW0pOworCXN1YnNjci0+aW5fY2FsbGJhY2sgPSAwOworCisJdGFsbG9jX2ZyZWUocmVxdWVzdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN1YnNjcl9zZW5kX3BhZ2luZ19yZXF1ZXN0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCXN0cnVjdCBzdWJzY3JfcmVxdWVzdCAqcmVxdWVzdDsKKwlpbnQgcmM7CisKKwlhc3NlcnQoIWxsaXN0X2VtcHR5KCZzdWJzY3ItPnJlcXVlc3RzKSk7CisKKwlyZXF1ZXN0ID0gKHN0cnVjdCBzdWJzY3JfcmVxdWVzdCAqKXN1YnNjci0+cmVxdWVzdHMubmV4dDsKKwlyYyA9IHBhZ2luZ19yZXF1ZXN0KHN1YnNjci0+bmV0LCBzdWJzY3IsIHJlcXVlc3QtPmNoYW5uZWxfdHlwZSwKKwkJCSAgICBzdWJzY3JfcGFnaW5nX2NiLCBzdWJzY3IpOworCisJLyogcGFnaW5nIGZhaWxlZCwgcXVpdCBub3cgKi8KKwlpZiAocmMgPD0gMCkgeworCQlzdWJzY3JfcGFnaW5nX2NiKEdTTV9IT09LX1JSX1BBR0lORywgR1NNX1BBR0lOR19FWFBJUkVELAorCQkJCSBOVUxMLCBOVUxMLCByZXF1ZXN0LT5wYXJhbSk7CisJfQorfQorCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqczsKKworCXMgPSB0YWxsb2NfemVybyh0YWxsX3N1YnNjcl9jdHgsIHN0cnVjdCBnc21fc3Vic2NyaWJlcik7CisJaWYgKCFzKQorCQlyZXR1cm4gTlVMTDsKKworCWxsaXN0X2FkZF90YWlsKCZzLT5lbnRyeSwgJmFjdGl2ZV9zdWJzY3JpYmVycyk7CisJcy0+dXNlX2NvdW50ID0gMTsKKwlzLT50bXNpID0gR1NNX1JFU0VSVkVEX1RNU0k7CisKKwlJTklUX0xMSVNUX0hFQUQoJnMtPnJlcXVlc3RzKTsKKworCXJldHVybiBzOworfQorCitzdGF0aWMgdm9pZCBzdWJzY3JfZnJlZShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlsbGlzdF9kZWwoJnN1YnNjci0+ZW50cnkpOworCXRhbGxvY19mcmVlKHN1YnNjcik7Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlzdWJzY3ItPnVzZV9jb3VudCsrOworCURFQlVHUChEUkVGLCAic3Vic2NyICVzIHVzYWdlIGluY3JlYXNlcyB1c2FnZSB0bzogJWRcbiIsCisJCQlzdWJzY3ItPmV4dGVuc2lvbiwgc3Vic2NyLT51c2VfY291bnQpOworCXJldHVybiBzdWJzY3I7Cit9CisKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX3B1dChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlzdWJzY3ItPnVzZV9jb3VudC0tOworCURFQlVHUChEUkVGLCAic3Vic2NyICVzIHVzYWdlIGRlY3JlYXNlZCB1c2FnZSB0bzogJWRcbiIsCisJCQlzdWJzY3ItPmV4dGVuc2lvbiwgc3Vic2NyLT51c2VfY291bnQpOworCWlmIChzdWJzY3ItPnVzZV9jb3VudCA8PSAwKQorCQlzdWJzY3JfZnJlZShzdWJzY3IpOworCXJldHVybiBOVUxMOworfQorCit2b2lkIHN1YnNjcl9nZXRfY2hhbm5lbChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCWludCB0eXBlLCBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IHN1YnNjcl9yZXF1ZXN0ICpyZXF1ZXN0OworCisJcmVxdWVzdCA9IHRhbGxvYyh0YWxsX3N1Yl9yZXFfY3R4LCBzdHJ1Y3Qgc3Vic2NyX3JlcXVlc3QpOworCWlmICghcmVxdWVzdCkgeworCQlpZiAoY2JmbikKKwkJCWNiZm4oR1NNX0hPT0tfUlJfUEFHSU5HLCBHU01fUEFHSU5HX09PTSwKKwkJCQlOVUxMLCBOVUxMLCBwYXJhbSk7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQocmVxdWVzdCwgMCwgc2l6ZW9mKCpyZXF1ZXN0KSk7CisJcmVxdWVzdC0+c3Vic2NyID0gc3Vic2NyOworCXJlcXVlc3QtPmNoYW5uZWxfdHlwZSA9IHR5cGU7CisJcmVxdWVzdC0+Y2JmbiA9IGNiZm47CisJcmVxdWVzdC0+cGFyYW0gPSBwYXJhbTsKKworCS8qCisJICogRklYTUU6IFdlIG1pZ2h0IGJlIGFibGUgdG8gYXNzaWduIG1vcmUgdGhhbiBvbmUKKwkgKiBjaGFubmVsLCBlLmcuIHZvaWNlIGFuZCBTTVMgc3VibWl0IGF0IHRoZSBzYW1lCisJICogdGltZS4KKwkgKi8KKwlpZiAoIXN1YnNjci0+aW5fY2FsbGJhY2sgJiYgbGxpc3RfZW1wdHkoJnN1YnNjci0+cmVxdWVzdHMpKSB7CisJCS8qIGFkZCB0byB0aGUgbGlzdCwgc2VuZCBhIHJlcXVlc3QgKi8KKwkJbGxpc3RfYWRkX3RhaWwoJnJlcXVlc3QtPmVudHJ5LCAmc3Vic2NyLT5yZXF1ZXN0cyk7CisJCXN1YnNjcl9zZW5kX3BhZ2luZ19yZXF1ZXN0KHN1YnNjcik7CisJfSBlbHNlIHsKKwkJLyogdGhpcyB3aWxsIGJlIHBpY2tlZCB1cCBsYXRlciwgZnJvbSBzdWJzY3JfcHV0X2NoYW5uZWwgKi8KKwkJbGxpc3RfYWRkX3RhaWwoJnJlcXVlc3QtPmVudHJ5LCAmc3Vic2NyLT5yZXF1ZXN0cyk7CisJfQorfQorCit2b2lkIHN1YnNjcl9wdXRfY2hhbm5lbChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXJfY29ubmVjdGlvbiAqY29ubiA9ICZsY2hhbi0+Y29ubjsKKwkvKgorCSAqIEZJWE1FOiBDb250aW51ZSB3aXRoIG90aGVyIHJlcXVlc3RzIG5vdy4uLiBieSBjaGVja2luZworCSAqIHRoZSBnc21fc3Vic2NyaWJlciBpbnNpZGUgdGhlIGdzbV9sY2hhbi4gRHJvcCB0aGUgcmVmIGNvdW50CisJICogb2YgdGhlIGxjaGFuIGFmdGVyIGhhdmluZyBhc2tlZCB0aGUgbmV4dCByZXF1ZXN0ZWUgdG8gaGFuZGxlCisJICogdGhlIGNoYW5uZWwuCisJICovCisJLyoKKwkgKiBGSVhNRTogaXMgdGhlIGxjaGFuIGlzIG9mIGEgZGlmZmVyZW50IHR5cGUgd2UgY291bGQgc3RpbGwKKwkgKiBpc3N1ZSBhbiBpbW1lZGlhdGUgYXNzaWdubWVudCBmb3IgYW5vdGhlciBjaGFubmVsIGFuZCB0aGVuCisJICogY2xvc2UgdGhpcyBvbmUuCisJICovCisJLyoKKwkgKiBDdXJyZW50bHkgd2Ugd2lsbCBkcm9wIHRoZSBsYXN0IHJlZiBvZiB0aGUgbGNoYW4gd2hpY2gKKwkgKiB3aWxsIHJlc3VsdCBpbiBhIGNoYW5uZWwgcmVsZWFzZSBvbiBSU0wgYW5kIHdlIHdpbGwgc3RhcnQKKwkgKiB0aGUgcGFnaW5nLiBUaGlzIHNob3VsZCB3b3JrIG1vc3Qgb2YgdGhlIHRpbWUgYXMgdGhlIE1TCisJICogd2lsbCBsaXN0ZW4gdG8gdGhlIHBhZ2luZyByZXF1ZXN0cyBiZWZvcmUgd2UgdGltZW91dAorCSAqLworCisJcHV0X3N1YnNjcl9jb24oY29ubik7CisKKwlpZiAobGNoYW4tPmNvbm4uc3Vic2NyICYmICFsbGlzdF9lbXB0eSgmbGNoYW4tPmNvbm4uc3Vic2NyLT5yZXF1ZXN0cykpCisJCXN1YnNjcl9zZW5kX3BhZ2luZ19yZXF1ZXN0KGxjaGFuLT5jb25uLnN1YnNjcik7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2hhbmRvdmVyX2RlY2lzaW9uLmMgYi9vcGVuYnNjL3NyYy9oYW5kb3Zlcl9kZWNpc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYWZjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9oYW5kb3Zlcl9kZWNpc2lvbi5jCkBAIC0wLDAgKzEsMjk4IEBACisvKiBIYW5kb3ZlciBEZWNpc2lvbiBtYWtpbmcgZm9yIEludGVyLUJUUyAoSW50cmEtQlNDKSBIYW5kb3Zlci4gIFRoaXMKKyAqIG9ubHkgaW1wbGVtZW50cyB0aGUgaGFuZG92ZXIgYWxnb3JpdGhtL2RlY2lzaW9uLCBidXQgbm90IGV4ZWN1dGlvbgorICogb2YgaXQgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21lYXNfcmVwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2hhbmRvdmVyLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisKKy8qIGlzc3VlIGhhbmRvdmVyIHRvIGEgY2VsbCBpZGVudGlmaWVkIGJ5IEFSRkNOIGFuZCBCU0lDICovCitzdGF0aWMgaW50IGhhbmRvdmVyX3RvX2FyZmNuX2JzaWMoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCQkJICB1X2ludDE2X3QgYXJmY24sIHVfaW50OF90IGJzaWMpCit7CisJc3RydWN0IGdzbV9idHMgKm5ld19idHM7CisKKwkvKiByZXNvbHZlIHRoZSBnc21fYnRzIHN0cnVjdHVyZSBmb3IgdGhlIGJlc3QgbmVpZ2hib3IgKi8KKwluZXdfYnRzID0gZ3NtX2J0c19uZWlnaGJvcihsY2hhbi0+dHMtPnRyeC0+YnRzLCBhcmZjbiwgYnNpYyk7CisJaWYgKCFuZXdfYnRzKSB7CisJCUxPR1AoREhPLCBMT0dMX05PVElDRSwgInVuYWJsZSB0byBkZXRlcm1pbmUgbmVpZ2hib3IgQlRTICIKKwkJICAgICAiZm9yIEFSRkNOICV1IEJTSUMgJXUgPyE/XG4iLCBhcmZjbiwgYnNpYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGFuZCBhY3R1YWxseSB0cnkgdG8gaGFuZG92ZXIgdG8gdGhhdCBjZWxsICovCisJcmV0dXJuIGJzY19oYW5kb3Zlcl9zdGFydChsY2hhbiwgbmV3X2J0cyk7Cit9CisKKy8qIGRpZCB3ZSBnZXQgYSBSWExFViBmb3IgYSBnaXZlbiBjZWxsIGluIHRoZSBnaXZlbiByZXBvcnQ/ICovCitzdGF0aWMgaW50IHJ4bGV2X2Zvcl9jZWxsX2luX3JlcChzdHJ1Y3QgZ3NtX21lYXNfcmVwICptciwKKwkJCQkgdV9pbnQxNl90IGFyZmNuLCB1X2ludDhfdCBic2ljKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG1yLT5udW1fY2VsbDsgaSsrKSB7CisJCXN0cnVjdCBnc21fbWVhc19yZXBfY2VsbCAqbXJjID0gJm1yLT5jZWxsW2ldOworCisJCS8qIHNlYXJjaCBmb3IgbWF0Y2hpbmcgcmVwb3J0ICovCisJCWlmICghKG1yYy0+YXJmY24gPT0gYXJmY24gJiYgbXJjLT5ic2ljID09IGJzaWMpKQorCQkJY29udGludWU7CisKKwkJbXJjLT5mbGFncyB8PSBNUkNfRl9QUk9DRVNTRUQ7CisJCXJldHVybiBtcmMtPnJ4bGV2OworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyogb2J0YWluIGF2ZXJhZ2VkIHJ4bGV2IGZvciBnaXZlbiBuZWlnaGJvciAqLworc3RhdGljIGludCBuZWlnaF9tZWFzX2F2ZyhzdHJ1Y3QgbmVpZ2hfbWVhc19wcm9jICpubXAsIGludCB3aW5kb3cpCit7CisJdW5zaWduZWQgaW50IGksIGlkeDsKKwlpbnQgYXZnID0gMDsKKworCWlkeCA9IGNhbGNfaW5pdGlhbF9pZHgoQVJSQVlfU0laRShubXAtPnJ4bGV2KSwKKwkJCQlubXAtPnJ4bGV2X2NudCAlIEFSUkFZX1NJWkUobm1wLT5yeGxldiksCisJCQkJd2luZG93KTsKKworCWZvciAoaSA9IDA7IGkgPCB3aW5kb3c7IGkrKykgeworCQlpbnQgaiA9IChpZHgraSkgJSBBUlJBWV9TSVpFKG5tcC0+cnhsZXYpOworCisJCWF2ZyArPSBubXAtPnJ4bGV2W2pdOworCX0KKworCXJldHVybiBhdmcgLyB3aW5kb3c7Cit9CisKKy8qIGZpbmQgZW1wdHkgb3IgZXZpY3QgYmFkIG5laWdoYm9yICovCitzdGF0aWMgc3RydWN0IG5laWdoX21lYXNfcHJvYyAqZmluZF9ldmljdF9uZWlnaChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlpbnQgaiwgd29yc3QgPSA5OTk5OTk7CisJc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wX3dvcnN0OworCisJLyogZmlyc3QgdHJ5IHRvIGZpbmQgYW4gZW1wdHkvdW51c2VkIHNsb3QgKi8KKwlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShsY2hhbi0+bmVpZ2hfbWVhcyk7IGorKykgeworCQlzdHJ1Y3QgbmVpZ2hfbWVhc19wcm9jICpubXAgPSAmbGNoYW4tPm5laWdoX21lYXNbal07CisJCWlmICghbm1wLT5hcmZjbikKKwkJCXJldHVybiBubXA7CisJfQorCisJLyogbm8gZW1wdHkgc2xvdCBmb3VuZC4gZXZpY3Qgd29yc3QgbmVpZ2hib3IgZnJvbSBsaXN0ICovCisJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUobGNoYW4tPm5laWdoX21lYXMpOyBqKyspIHsKKwkJc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wID0gJmxjaGFuLT5uZWlnaF9tZWFzW2pdOworCQlpbnQgYXZnID0gbmVpZ2hfbWVhc19hdmcobm1wLCBNQVhfV0lOX05FSUdIX0FWRyk7CisJCWlmIChhdmcgPCB3b3JzdCkgeworCQkJd29yc3QgPSBhdmc7CisJCQlubXBfd29yc3QgPSBubXA7CisJCX0KKwl9CisKKwlyZXR1cm4gbm1wX3dvcnN0OworfQorCisvKiBwcm9jZXNzIG5laWdoYm9yIGNlbGwgbWVhc3VyZW1lbnQgcmVwb3J0cyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19tZWFzX25laWdoKHN0cnVjdCBnc21fbWVhc19yZXAgKm1yKQoreworCWludCBpLCBqLCBpZHg7CisKKwkvKiBmb3IgZWFjaCByZXBvcnRlZCBjZWxsLCB0cnkgdG8gdXBkYXRlIGdsb2JhbCBzdGF0ZSAqLworCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKG1yLT5sY2hhbi0+bmVpZ2hfbWVhcyk7IGorKykgeworCQlzdHJ1Y3QgbmVpZ2hfbWVhc19wcm9jICpubXAgPSAmbXItPmxjaGFuLT5uZWlnaF9tZWFzW2pdOworCQl1bnNpZ25lZCBpbnQgaWR4OworCQlpbnQgcnhsZXY7CisKKwkJLyogc2tpcCB1bnVzZWQgZW50cmllcyAqLworCQlpZiAoIW5tcC0+YXJmY24pCisJCQljb250aW51ZTsKKworCQlyeGxldiA9IHJ4bGV2X2Zvcl9jZWxsX2luX3JlcChtciwgbm1wLT5hcmZjbiwgbm1wLT5ic2ljKTsKKwkJaWR4ID0gbm1wLT5yeGxldl9jbnQgJSBBUlJBWV9TSVpFKG5tcC0+cnhsZXYpOworCQlpZiAocnhsZXYgPj0gMCkgeworCQkJbm1wLT5yeGxldltpZHhdID0gcnhsZXY7CisJCQlubXAtPmxhc3Rfc2Vlbl9uciA9IG1yLT5ucjsKKwkJfSBlbHNlCisJCQlubXAtPnJ4bGV2W2lkeF0gPSAwOworCQlubXAtPnJ4bGV2X2NudCsrOworCX0KKworCS8qIGl0ZXJhdGUgb3ZlciBsaXN0IG9mIHJlcG9ydGVkIGNlbGxzLCBjaGVjayBpZiB3ZSBkaWQgbm90CisJICogcHJvY2VzcyBhbGwgb2YgdGhlbSAqLworCWZvciAoaSA9IDA7IGkgPCBtci0+bnVtX2NlbGw7IGkrKykgeworCQlzdHJ1Y3QgZ3NtX21lYXNfcmVwX2NlbGwgKm1yYyA9ICZtci0+Y2VsbFtpXTsKKwkJc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wOworCisJCWlmIChtcmMtPmZsYWdzICYgTVJDX0ZfUFJPQ0VTU0VEKQorCQkJY29udGludWU7CisKKwkJbm1wID0gZmluZF9ldmljdF9uZWlnaChtci0+bGNoYW4pOworCisJCW5tcC0+YXJmY24gPSBtcmMtPmFyZmNuOworCQlubXAtPmJzaWMgPSBtcmMtPmJzaWM7CisKKwkJaWR4ID0gbm1wLT5yeGxldl9jbnQgJSBBUlJBWV9TSVpFKG5tcC0+cnhsZXYpOworCQlubXAtPnJ4bGV2W2lkeF0gPSBtcmMtPnJ4bGV2OworCQlubXAtPnJ4bGV2X2NudCsrOworCQlubXAtPmxhc3Rfc2Vlbl9uciA9IG1yLT5ucjsKKworCQltcmMtPmZsYWdzIHw9IE1SQ19GX1BST0NFU1NFRDsKKwl9Cit9CisKKy8qIGF0dGVtcHQgdG8gZG8gYSBoYW5kb3ZlciAqLworc3RhdGljIGludCBhdHRlbXB0X2hhbmRvdmVyKHN0cnVjdCBnc21fbWVhc19yZXAgKm1yKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gbXItPmxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisJc3RydWN0IG5laWdoX21lYXNfcHJvYyAqYmVzdF9jZWxsID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgYmVzdF9iZXR0ZXJfZGIgPSAwOworCWludCBpLCByYzsKKworCS8qIGZpbmQgdGhlIGJlc3QgY2VsbCBpbiB0aGlzIHJlcG9ydCB0aGF0IGlzIGF0IGxlYXN0IFJYTEVWX0hZU1QKKwkgKiBiZXR0ZXIgdGhhbiB0aGUgY3VycmVudCBzZXJ2aW5nIGNlbGwgKi8KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1yLT5sY2hhbi0+bmVpZ2hfbWVhcyk7IGkrKykgeworCQlzdHJ1Y3QgbmVpZ2hfbWVhc19wcm9jICpubXAgPSAmbXItPmxjaGFuLT5uZWlnaF9tZWFzW2ldOworCQlpbnQgYXZnLCBiZXR0ZXI7CisKKwkJLyogc2tpcCBlbXB0eSBzbG90cyAqLworCQlpZiAobm1wLT5hcmZjbiA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyogY2FjdWxhdGUgYXZlcmFnZSByeGxldiBmb3IgdGhpcyBjZWxsIG92ZXIgdGhlIHdpbmRvdyAqLworCQlhdmcgPSBuZWlnaF9tZWFzX2F2ZyhubXAsIG5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2Z19uZWlnaCk7CisKKwkJLyogY2hlY2sgaWYgaHlzdGVyZXNpcyBpcyBmdWxmaWxsZWQgKi8KKwkJaWYgKGF2ZyA8IG1yLT5kbC5mdWxsLnJ4X2xldiArIG5ldC0+aGFuZG92ZXIucHdyX2h5c3RlcmVzaXMpCisJCQljb250aW51ZTsKKworCQliZXR0ZXIgPSBhdmcgLSBtci0+ZGwuZnVsbC5yeF9sZXY7CisJCWlmIChiZXR0ZXIgPiBiZXN0X2JldHRlcl9kYikgeworCQkJYmVzdF9jZWxsID0gbm1wOworCQkJYmVzdF9iZXR0ZXJfZGIgPSBiZXR0ZXI7CisJCX0KKwl9CisKKwlpZiAoIWJlc3RfY2VsbCkKKwkJcmV0dXJuIDA7CisKKwlMT0dQKERITywgTE9HTF9JTkZPLCAiJXM6IENlbGwgb24gQVJGQ04gJXUgaXMgYmV0dGVyOiAiLAorCQlnc21fdHNfbmFtZShtci0+bGNoYW4tPnRzKSwgYmVzdF9jZWxsLT5hcmZjbik7CisJaWYgKCFuZXQtPmhhbmRvdmVyLmFjdGl2ZSkgeworCQlMT0dQQyhESE8sIExPR0xfSU5GTywgIlNraXBwaW5nLCBIYW5kb3ZlciBkaXNhYmxlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCXJjID0gaGFuZG92ZXJfdG9fYXJmY25fYnNpYyhtci0+bGNoYW4sIGJlc3RfY2VsbC0+YXJmY24sIGJlc3RfY2VsbC0+YnNpYyk7CisJc3dpdGNoIChyYykgeworCWNhc2UgMDoKKwkJTE9HUEMoREhPLCBMT0dMX0lORk8sICJTdGFydGluZyBoYW5kb3ZlclxuIik7CisJCWJyZWFrOworCWNhc2UgLUVOT1NQQzoKKwkJTE9HUEMoREhPLCBMT0dMX0lORk8sICJObyBjaGFubmVsIGF2YWlsYWJsZVxuIik7CisJCWJyZWFrOworCWNhc2UgLUVCVVNZOgorCQlMT0dQQyhESE8sIExPR0xfSU5GTywgIkhhbmRvdmVyIGFscmVhZHkgYWN0aXZlXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUEMoREhPLCBMT0dMX0VSUk9SLCAiVW5rbm93biBlcnJvclxuIik7CisJfQorCXJldHVybiByYzsKK30KKworLyogcHJvY2VzcyBhbiBhbHJlYWR5IHBhcnNlZCBtZWFzdXJlbWVudCByZXBvcnQgYW5kIGRlY2lkZSBpZiB3ZSB3YW50IHRvCisgKiBhdHRlbXB0IGEgaGFuZG92ZXIgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19tZWFzX3JlcChzdHJ1Y3QgZ3NtX21lYXNfcmVwICptcikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IG1yLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCWludCBhdl9yeGxldjsKKworCS8qIHdlIGN1cnJlbnRseSBvbmx5IGRvIGhhbmRvdmVyIGZvciBUQ0ggY2hhbm5lbHMgKi8KKwlzd2l0Y2ggKG1yLT5sY2hhbi0+dHlwZSkgeworCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCWNhc2UgR1NNX0xDSEFOX1RDSF9IOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBwYXJzZSBhY3R1YWwgbmVpZ2hib3IgY2VsbCBpbmZvICovCisJaWYgKG1yLT5udW1fY2VsbCA+IDAgJiYgbXItPm51bV9jZWxsIDwgNykKKwkJcHJvY2Vzc19tZWFzX25laWdoKG1yKTsKKworCWF2X3J4bGV2ID0gZ2V0X21lYXNfcmVwX2F2Zyhtci0+bGNoYW4sIE1FQVNfUkVQX0RMX1JYTEVWX0ZVTEwsCisJCQkJICAgIG5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2Zyk7CisKKwkvKiBJbnRlcmZlcmVuY2UgSE8gKi8KKwlpZiAocnhsZXYyZGJtKGF2X3J4bGV2KSA+IC04NSAmJgorCSAgICBtZWFzX3JlcF9uX291dF9vZl9tX2JlKG1yLT5sY2hhbiwgTUVBU19SRVBfRExfUlhRVUFMX0ZVTEwsCisJCQkJICAgMywgNCwgNSkpCisJCXJldHVybiBhdHRlbXB0X2hhbmRvdmVyKG1yKTsKKworCS8qIEJhZCBRdWFsaXR5ICovCisJaWYgKG1lYXNfcmVwX25fb3V0X29mX21fYmUobXItPmxjaGFuLCBNRUFTX1JFUF9ETF9SWFFVQUxfRlVMTCwKKwkJCQkgICAzLCA0LCA1KSkKKwkJcmV0dXJuIGF0dGVtcHRfaGFuZG92ZXIobXIpOworCisJLyogTG93IExldmVsICovCisJaWYgKHJ4bGV2MmRibShhdl9yeGxldikgPD0gLTExMCkKKwkJcmV0dXJuIGF0dGVtcHRfaGFuZG92ZXIobXIpOworCisJLyogRGlzdGFuY2UgKi8KKwlpZiAobXItPm1zX2wxLnRhID4gbmV0LT5oYW5kb3Zlci5tYXhfZGlzdGFuY2UpCisJCXJldHVybiBhdHRlbXB0X2hhbmRvdmVyKG1yKTsKKworCS8qIFBvd2VyIEJ1ZGdldCBBS0EgQmV0dGVyIENlbGwgKi8KKwlpZiAoKG1yLT5uciAlIG5ldC0+aGFuZG92ZXIucHdyX2ludGVydmFsKSA9PSAwKQorCQlyZXR1cm4gYXR0ZW1wdF9oYW5kb3Zlcihtcik7CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IGhvX2RlY19zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCSAgIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV9tZWFzX3JlcCAqbXI7CisKKwlpZiAoc3Vic3lzICE9IFNTX0xDSEFOKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTX0xDSEFOX01FQVNfUkVQOgorCQltciA9IHNpZ25hbF9kYXRhOworCQlwcm9jZXNzX21lYXNfcmVwKG1yKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb25fZHNvX2xvYWRfaG9fZGVjKHZvaWQpCit7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfTENIQU4sIGhvX2RlY19zaWdfY2IsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaGFuZG92ZXJfbG9naWMuYyBiL29wZW5ic2Mvc3JjL2hhbmRvdmVyX2xvZ2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiMGIxMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2hhbmRvdmVyX2xvZ2ljLmMKQEAgLTAsMCArMSwzNzggQEAKKy8qIEhhbmRvdmVyIExvZ2ljIGZvciBJbnRlci1CVFMgKEludHJhLUJTQykgSGFuZG92ZXIuICBUaGlzIGRvZXMgbm90CisgKiBhY3R1YWxseSBpbXBsZW1lbnQgdGhlIGhhbmRvdmVyIGFsZ29yaXRobS9kZWNpc2lvbiwgYnV0IGV4ZWN1dGVzIGEKKyAqIGhhbmRvdmVyIGRlY2lzaW9uICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhbnNhY3Rpb24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3J0cF9wcm94eS5oPgorCitzdHJ1Y3QgYnNjX2hhbmRvdmVyIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IGdzbV9sY2hhbiAqb2xkX2xjaGFuOworCXN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbjsKKworCXN0cnVjdCB0aW1lcl9saXN0IFQzMTAzOworCisJdV9pbnQ4X3QgaG9fcmVmOworfTsKKworc3RhdGljIExMSVNUX0hFQUQoYnNjX2hhbmRvdmVycyk7CisKK3N0YXRpYyBzdHJ1Y3QgYnNjX2hhbmRvdmVyICpic2NfaG9fYnlfbmV3X2xjaGFuKHN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbikKK3sKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobzsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGhvLCAmYnNjX2hhbmRvdmVycywgbGlzdCkgeworCQlpZiAoaG8tPm5ld19sY2hhbiA9PSBuZXdfbGNoYW4pCisJCQlyZXR1cm4gaG87CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnNjX2hhbmRvdmVyICpic2NfaG9fYnlfb2xkX2xjaGFuKHN0cnVjdCBnc21fbGNoYW4gKm9sZF9sY2hhbikKK3sKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobzsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGhvLCAmYnNjX2hhbmRvdmVycywgbGlzdCkgeworCQlpZiAoaG8tPm9sZF9sY2hhbiA9PSBvbGRfbGNoYW4pCisJCQlyZXR1cm4gaG87CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEhhbmQgb3ZlciB0aGUgc3BlY2lmaWVkIGxvZ2ljYWwgY2hhbm5lbCB0byB0aGUgc3BlY2lmaWVkIG5ldyBCVFMuCisgKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgYWN0dWFsIGhhbmRvdmVyIGFsZ29yaXRobSwKKyAqIGFmdGVyIGl0IGhhcyBkZWNpZGVkIGl0IHdhbnRzIHRvIGluaXRpYXRlIEhPIHRvIGEgc3BlY2lmaWMgQlRTICovCitpbnQgYnNjX2hhbmRvdmVyX3N0YXJ0KHN0cnVjdCBnc21fbGNoYW4gKm9sZF9sY2hhbiwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW47CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisJc3RhdGljIHVfaW50OF90IGhvX3JlZjsKKwlpbnQgcmM7CisKKwkvKiBkb24ndCBhdHRlbXB0IG11bHRpcGxlIGhhbmRvdmVycyBmb3IgdGhlIHNhbWUgbGNoYW4gYXQKKwkgKiB0aGUgc2FtZSB0aW1lICovCisJaWYgKGJzY19ob19ieV9vbGRfbGNoYW4ob2xkX2xjaGFuKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCURFQlVHUChESE8sICIob2xkX2xjaGFuIG9uIEJUUyAldSwgbmV3IEJUUyAldSlcbiIsCisJCW9sZF9sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwgYnRzLT5ucik7CisKKwljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLmhhbmRvdmVyLmF0dGVtcHRlZCk7CisKKwluZXdfbGNoYW4gPSBsY2hhbl9hbGxvYyhidHMsIG9sZF9sY2hhbi0+dHlwZSk7CisJaWYgKCFuZXdfbGNoYW4pIHsKKwkJTE9HUChESE8sIExPR0xfTk9USUNFLCAiTm8gZnJlZSBjaGFubmVsXG4iKTsKKwkJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5oYW5kb3Zlci5ub19jaGFubmVsKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJaG8gPSB0YWxsb2NfemVybyhOVUxMLCBzdHJ1Y3QgYnNjX2hhbmRvdmVyKTsKKwlpZiAoIWhvKSB7CisJCUxPR1AoREhPLCBMT0dMX0ZBVEFMLCAiT3V0IG9mIE1lbW9yeVxuIik7CisJCWxjaGFuX2ZyZWUobmV3X2xjaGFuKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWhvLT5vbGRfbGNoYW4gPSBvbGRfbGNoYW47CisJaG8tPm5ld19sY2hhbiA9IG5ld19sY2hhbjsKKwloby0+aG9fcmVmID0gaG9fcmVmKys7CisKKwkvKiBjb3B5IHNvbWUgcGFyYW1ldGVycyBmcm9tIG9sZCBsY2hhbiAqLworCW1lbWNweSgmbmV3X2xjaGFuLT5lbmNyLCAmb2xkX2xjaGFuLT5lbmNyLCBzaXplb2YobmV3X2xjaGFuLT5lbmNyKSk7CisJbmV3X2xjaGFuLT5tc19wb3dlciA9IG9sZF9sY2hhbi0+bXNfcG93ZXI7CisJbmV3X2xjaGFuLT5ic19wb3dlciA9IG9sZF9sY2hhbi0+YnNfcG93ZXI7CisJbmV3X2xjaGFuLT5yc2xfY21vZGUgPSBvbGRfbGNoYW4tPnJzbF9jbW9kZTsKKwluZXdfbGNoYW4tPnRjaF9tb2RlID0gb2xkX2xjaGFuLT50Y2hfbW9kZTsKKwluZXdfbGNoYW4tPmNvbm4uc3Vic2NyID0gc3Vic2NyX2dldChvbGRfbGNoYW4tPmNvbm4uc3Vic2NyKTsKKworCS8qIEZJWE1FOiBkbyB3ZSBoYXZlIGEgYmV0dGVyIGlkZWEgb2YgdGhlIHRpbWluZyBhZHZhbmNlPyAqLworCXJjID0gcnNsX2NoYW5fYWN0aXZhdGVfbGNoYW4obmV3X2xjaGFuLCBSU0xfQUNUX0lOVEVSX0FTWU5DLCAwLAorCQkJCSAgICAgaG8tPmhvX3JlZik7CisJaWYgKHJjIDwgMCkgeworCQlMT0dQKERITywgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBhY3RpdmF0ZSBjaGFubmVsXG4iKTsKKwkJdGFsbG9jX2ZyZWUoaG8pOworCQlsY2hhbl9mcmVlKG5ld19sY2hhbik7CisJCXJldHVybiByYzsKKwl9CisKKwlsbGlzdF9hZGQoJmhvLT5saXN0LCAmYnNjX2hhbmRvdmVycyk7CisJLyogd2UgY29udGludWUgaW4gdGhlIFNTX0xDSEFOIGhhbmRsZXIgLyBob19jaGFuX2FjdGl2X2FjayAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qIFQzMTAzIGV4cGlyZWQ6IEhhbmRvdmVyIGhhcyBmYWlsZWQgd2l0aG91dCBITyBDT01QTEVURSBvciBITyBGQUlMICovCitzdGF0aWMgdm9pZCBob19UMzEwM19jYih2b2lkICpfaG8pCit7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG8gPSBfaG87CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBoby0+bmV3X2xjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisKKwlERUJVR1AoREhPLCAiSE8gVDMxMDMgZXhwaXJlZFxuIik7CisJY291bnRlcl9pbmMobmV0LT5zdGF0cy5oYW5kb3Zlci50aW1lb3V0KTsKKworCWxjaGFuX2ZyZWUoaG8tPm5ld19sY2hhbik7CisJbGxpc3RfZGVsKCZoby0+bGlzdCk7CisJdGFsbG9jX2ZyZWUoaG8pOworfQorCisvKiBSU0wgaGFzIGFja25vd2xlZGdlZCBhY3RpdmF0aW9uIG9mIHRoZSBuZXcgbGNoYW4gKi8KK3N0YXRpYyBpbnQgaG9fY2hhbl9hY3Rpdl9hY2soc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuKQoreworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOworCWludCByYzsKKworCS8qIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBjaGFubmVsIGFjdGl2YXRpb24gaXMgcmVsYXRlZCB0bworCSAqIGEgaGFuZG92ZXIgYXQgYWxsIChhbmQgaWYsIHdoaWNoIHBhcnRpY3VsYXIgaGFuZG92ZXIpICovCisJaG8gPSBic2NfaG9fYnlfbmV3X2xjaGFuKG5ld19sY2hhbik7CisJaWYgKCFobykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlERUJVR1AoREhPLCAiaGFuZG92ZXIgYWN0aXZhdGUgYWNrLCBzZW5kIEhPIENvbW1hbmRcbiIpOworCisJLyogd2UgY2FuIG5vdyBzZW5kIHRoZSAwNC4wOCBIQU5ET1ZFUiBDT01NQU5EIHRvIHRoZSBNUworCSAqIHVzaW5nIHRoZSBvbGQgbGNoYW4gKi8KKworCXJjID0gZ3NtNDhfc2VuZF9ob19jbWQoaG8tPm9sZF9sY2hhbiwgbmV3X2xjaGFuLCAwLCBoby0+aG9fcmVmKTsKKworCS8qIHN0YXJ0IFQzMTAzLiAgV2UgY2FuIGNvbnRpbnVlIGVpdGhlciB3aXRoIFQzMTAzIGV4cGlyYXRpb24sCisJICogMDQuMDggSEFORE9WRVIgQ09NUExFVEUgb3IgMDQuMDggSEFORE9WRVIgRkFJTCAqLworCWhvLT5UMzEwMy5jYiA9IGhvX1QzMTAzX2NiOworCWhvLT5UMzEwMy5kYXRhID0gaG87CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZoby0+VDMxMDMsIDEwLCAwKTsKKworCS8qIGNyZWF0ZSBhIFJUUCBjb25uZWN0aW9uICovCisJaWYgKGlzX2lwYWNjZXNzX2J0cyhuZXdfbGNoYW4tPnRzLT50cngtPmJ0cykpCisJCXJzbF9pcGFjY19jcmN4KG5ld19sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworLyogUlNMIGhhcyBub3QgYWNrbm93bGVkZ2VkIGFjdGl2YXRpb24gb2YgdGhlIG5ldyBsY2hhbiAqLworc3RhdGljIGludCBob19jaGFuX2FjdGl2X25hY2soc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuKQoreworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOworCisJaG8gPSBic2NfaG9fYnlfbmV3X2xjaGFuKG5ld19sY2hhbik7CisJaWYgKCFobykgeworCQlMT0dQKERITywgTE9HTF9FUlJPUiwgInVuYWJsZSB0byBmaW5kIEhPIHJlY29yZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWxsaXN0X2RlbCgmaG8tPmxpc3QpOworCXRhbGxvY19mcmVlKGhvKTsKKworCS8qIEZJWE1FOiBtYXliZSB3ZSBzaG91bGQgdHJ5IHRvIGFsbG9jYXRlIGEgbmV3IExDSEFOIGhlcmU/ICovCisKKwlyZXR1cm4gMDsKK30KKworLyogR1NNIDA0LjA4IEhBTkRPVkVSIENPTVBMRVRFIGhhcyBiZWVuIHJlY2VpdmVkIG9uIG5ldyBjaGFubmVsICovCitzdGF0aWMgaW50IGhvX2dzbTQ4X2hvX2NvbXBsKHN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IG5ld19sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOworCisJaG8gPSBic2NfaG9fYnlfbmV3X2xjaGFuKG5ld19sY2hhbik7CisJaWYgKCFobykgeworCQlMT0dQKERITywgTE9HTF9FUlJPUiwgInVuYWJsZSB0byBmaW5kIEhPIHJlY29yZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCUxPR1AoREhPLCBMT0dMX0lORk8sICJTdWJzY3JpYmVyICVzIEhPIGZyb20gQlRTICV1LT4ldSBvbiBBUkZDTiAiCisJICAgICAiJXUtPiV1XG4iLCBzdWJzY3JfbmFtZShoby0+b2xkX2xjaGFuLT5jb25uLnN1YnNjciksCisJICAgICBoby0+b2xkX2xjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBuZXdfbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsCisJICAgICBoby0+b2xkX2xjaGFuLT50cy0+dHJ4LT5hcmZjbiwgbmV3X2xjaGFuLT50cy0+dHJ4LT5hcmZjbik7CisKKwljb3VudGVyX2luYyhuZXQtPnN0YXRzLmhhbmRvdmVyLmNvbXBsZXRlZCk7CisKKwlic2NfZGVsX3RpbWVyKCZoby0+VDMxMDMpOworCisJLyogdXBkYXRlIGxjaGFuIHBvaW50ZXIgb2YgdHJhbnNhY3Rpb24gKi8KKwl0cmFuc19sY2hhbl9jaGFuZ2UoJmhvLT5vbGRfbGNoYW4tPmNvbm4sICZuZXdfbGNoYW4tPmNvbm4pOworCisJaG8tPm9sZF9sY2hhbi0+c3RhdGUgPSBMQ0hBTl9TX0lOQUNUSVZFOworCWxjaGFuX2F1dG9fcmVsZWFzZShoby0+b2xkX2xjaGFuKTsKKworCS8qIGRvIHNvbWV0aGluZyB0byByZS1yb3V0ZSB0aGUgYWN0dWFsIHNwZWVjaCBmcmFtZXMgISAqLworCisJbGxpc3RfZGVsKCZoby0+bGlzdCk7CisJdGFsbG9jX2ZyZWUoaG8pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdTTSAwNC4wOCBIQU5ET1ZFUiBGQUlMIGhhcyBiZWVuIHJlY2VpdmVkICovCitzdGF0aWMgaW50IGhvX2dzbTQ4X2hvX2ZhaWwoc3RydWN0IGdzbV9sY2hhbiAqb2xkX2xjaGFuKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gb2xkX2xjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisKKwlobyA9IGJzY19ob19ieV9vbGRfbGNoYW4ob2xkX2xjaGFuKTsKKwlpZiAoIWhvKSB7CisJCUxPR1AoREhPLCBMT0dMX0VSUk9SLCAidW5hYmxlIHRvIGZpbmQgSE8gcmVjb3JkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY291bnRlcl9pbmMobmV0LT5zdGF0cy5oYW5kb3Zlci5mYWlsZWQpOworCisJYnNjX2RlbF90aW1lcigmaG8tPlQzMTAzKTsKKwlsbGlzdF9kZWwoJmhvLT5saXN0KTsKKwljb25uID0gJmhvLT5uZXdfbGNoYW4tPmNvbm47CisJcHV0X3N1YnNjcl9jb24oY29ubik7CisJdGFsbG9jX2ZyZWUoaG8pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdTTSAwOC41OCBIQU5ET1ZFUiBERVRFQ1QgaGFzIGJlZW4gcmVjZWl2ZWQgKi8KK3N0YXRpYyBpbnQgaG9fcnNsX2RldGVjdChzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW4pCit7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisKKwlobyA9IGJzY19ob19ieV9uZXdfbGNoYW4obmV3X2xjaGFuKTsKKwlpZiAoIWhvKSB7CisJCUxPR1AoREhPLCBMT0dMX0VSUk9SLCAidW5hYmxlIHRvIGZpbmQgSE8gcmVjb3JkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogRklYTUU6IGRvIHdlIGFjdHVhbGx5IHdhbnQgdG8gZG8gc29tZXRoaW5nIGhlcmUgPyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaG9faXBhY19jcmN4X2FjayhzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW4pCit7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisJc3RydWN0IHJ0cF9zb2NrZXQgKm9sZF9ycywgKm5ld19ycywgKm90aGVyX3JzOworCisJaG8gPSBic2NfaG9fYnlfbmV3X2xjaGFuKG5ld19sY2hhbik7CisJaWYgKCFobykgeworCQkvKiBpdCBpcyBwZXJmZWN0bHkgbm9ybWFsLCB3ZSBoYXZlIENSQ1ggZXZlbiBpbiBub24tSE8gY2FzZXMgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGlwYWNjX3J0cF9kaXJlY3QpIHsKKwkJTE9HUChESE8sIExPR0xfRVJST1IsICJ1bmFibGUgdG8gaGFuZG92ZXIgaW4gZGlyZWN0IFJUUCBtb2RlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUlRQIFByb3h5IG1vZGUgKi8KKwluZXdfcnMgPSBuZXdfbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldDsKKwlvbGRfcnMgPSBoby0+b2xkX2xjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQ7CisKKwlpZiAoIW5ld19ycykgeworCQlMT0dQKERITywgTE9HTF9FUlJPUiwgIm5vIFJUUCBzb2NrZXQgZm9yIG5ld19sY2hhblxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJzbF9pcGFjY19tZGN4X3RvX3J0cHNvY2sobmV3X2xjaGFuKTsKKworCWlmICghb2xkX3JzKSB7CisJCUxPR1AoREhPLCBMT0dMX0VSUk9SLCAibm8gUlRQIHNvY2VrdCBmb3Igb2xkX2xjaGFuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogY29weSByeF9hY3Rpb24gYW5kIHJlZmVyZW5jZSB0byBvdGhlciBzb2NrICovCisJbmV3X3JzLT5yeF9hY3Rpb24gPSBvbGRfcnMtPnJ4X2FjdGlvbjsKKwluZXdfcnMtPnR4X2FjdGlvbiA9IG9sZF9ycy0+dHhfYWN0aW9uOworCW5ld19ycy0+dHJhbnNtaXQgPSBvbGRfcnMtPnRyYW5zbWl0OworCisJc3dpdGNoIChoby0+b2xkX2xjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQtPnJ4X2FjdGlvbikgeworCWNhc2UgUlRQX1BST1hZOgorCQlvdGhlcl9ycyA9IG9sZF9ycy0+cHJveHkub3RoZXJfc29jazsKKwkJcnRwX3NvY2tldF9wcm94eShuZXdfcnMsIG90aGVyX3JzKTsKKwkJLyogZGVsZXRlIHJlZmVyZW5jZSB0byBvdGhlciBlbmQgc29ja2V0IHRvIHByZXZlbnQKKwkJICogcnRwX3NvY2tldF9mcmVlKCkgZnJvbSByZW1vdmluZyB0aGUgaW52ZXJzZSByZWZlcmVuY2UgKi8KKwkJb2xkX3JzLT5wcm94eS5vdGhlcl9zb2NrID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBSVFBfUkVDVl9VUFNUUkVBTToKKwkJbmV3X3JzLT5yZWNlaXZlID0gb2xkX3JzLT5yZWNlaXZlOworCQlicmVhazsKKwljYXNlIFJUUF9OT05FOgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBob19sb2dpY19zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCSAgIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisKKwlzd2l0Y2ggKHN1YnN5cykgeworCWNhc2UgU1NfTENIQU46CisJCWxjaGFuID0gc2lnbmFsX2RhdGE7CisJCXN3aXRjaCAoc2lnbmFsKSB7CisJCWNhc2UgU19MQ0hBTl9BQ1RJVkFURV9BQ0s6CisJCQlyZXR1cm4gaG9fY2hhbl9hY3Rpdl9hY2sobGNoYW4pOworCQljYXNlIFNfTENIQU5fQUNUSVZBVEVfTkFDSzoKKwkJCXJldHVybiBob19jaGFuX2FjdGl2X25hY2sobGNoYW4pOworCQljYXNlIFNfTENIQU5fSEFORE9WRVJfREVURUNUOgorCQkJcmV0dXJuIGhvX3JzbF9kZXRlY3QobGNoYW4pOworCQljYXNlIFNfTENIQU5fSEFORE9WRVJfQ09NUEw6CisJCQlyZXR1cm4gaG9fZ3NtNDhfaG9fY29tcGwobGNoYW4pOworCQljYXNlIFNfTENIQU5fSEFORE9WRVJfRkFJTDoKKwkJCXJldHVybiBob19nc200OF9ob19mYWlsKGxjaGFuKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNTX0FCSVNJUDoKKwkJbGNoYW4gPSBzaWduYWxfZGF0YTsKKwkJc3dpdGNoIChzaWduYWwpIHsKKwkJY2FzZSBTX0FCSVNJUF9DUkNYX0FDSzoKKwkJCXJldHVybiBob19pcGFjX2NyY3hfYWNrKGxjaGFuKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkX2hvX2xvZ2ljKHZvaWQpCit7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfTENIQU4sIGhvX2xvZ2ljX3NpZ19jYiwgTlVMTCk7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfQUJJU0lQLCBob19sb2dpY19zaWdfY2IsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaW5wdXQvaXBhY2Nlc3MuYyBiL29wZW5ic2Mvc3JjL2lucHV0L2lwYWNjZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkNzU2MwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lucHV0L2lwYWNjZXNzLmMKQEAgLTAsMCArMSw3MjUgQEAKKy8qIE9wZW5CU0MgQWJpcyBpbnB1dCBkcml2ZXIgZm9yIGlwLmFjY2VzcyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zdWJjaGFuX2RlbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvaXBhY2Nlc3MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworI2RlZmluZSBQUklWX09NTCAxCisjZGVmaW5lIFBSSVZfUlNMIDIKKworLyogZGF0YSBzdHJ1Y3R1cmUgZm9yIG9uZSBFMSBpbnRlcmZhY2Ugd2l0aCBBLWJpcyAqLworc3RydWN0IGlhX2UxX2hhbmRsZSB7CisJc3RydWN0IGJzY19mZCBsaXN0ZW5fZmQ7CisJc3RydWN0IGJzY19mZCByc2xfbGlzdGVuX2ZkOworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0OworfTsKKworc3RhdGljIHN0cnVjdCBpYV9lMV9oYW5kbGUgKmUxaDsKKworCisjZGVmaW5lIFRTMV9BTExPQ19TSVpFCTMwMAorCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgcG9uZ1tdID0geyAwLCAxLCBJUEFDX1BST1RPX0lQQUNDRVNTLCBJUEFDX01TR1RfUE9ORyB9Oworc3RhdGljIGNvbnN0IHVfaW50OF90IGlkX2Fja1tdID0geyAwLCAxLCBJUEFDX1BST1RPX0lQQUNDRVNTLCBJUEFDX01TR1RfSURfQUNLIH07CitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgaWRfcmVxW10gPSB7IDAsIDE3LCBJUEFDX1BST1RPX0lQQUNDRVNTLCBJUEFDX01TR1RfSURfR0VULAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1VOSVQsIAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX01BQ0FERFIsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTE9DQVRJT04xLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0xPQ0FUSU9OMiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19FUVVJUFZFUlMsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfU1dWRVJTSU9OLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1VOSVROQU1FLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1NFUk5SLAorCQkJCX07CisKK3N0YXRpYyBjb25zdCBjaGFyICppZHRhZ19uYW1lc1tdID0geworCVtJUEFDX0lEVEFHX1NFUk5SXQk9ICJTZXJpYWxfTnVtYmVyIiwKKwlbSVBBQ19JRFRBR19VTklUTkFNRV0JPSAiVW5pdF9OYW1lIiwKKwlbSVBBQ19JRFRBR19MT0NBVElPTjFdCT0gIkxvY2F0aW9uXzEiLAorCVtJUEFDX0lEVEFHX0xPQ0FUSU9OMl0JPSAiTG9jYXRpb25fMiIsCisJW0lQQUNfSURUQUdfRVFVSVBWRVJTXQk9ICJFcXVpcG1lbnRfVmVyc2lvbiIsCisJW0lQQUNfSURUQUdfU1dWRVJTSU9OXQk9ICJTb2Z0d2FyZV9WZXJzaW9uIiwKKwlbSVBBQ19JRFRBR19JUEFERFJdCT0gIklQX0FkZHJlc3MiLAorCVtJUEFDX0lEVEFHX01BQ0FERFJdCT0gIk1BQ19BZGRyZXNzIiwKKwlbSVBBQ19JRFRBR19VTklUXQk9ICJVbml0X0lEIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICppcGFjX2lkdGFnX25hbWUoaW50IHRhZykKK3sKKwlpZiAodGFnID49IEFSUkFZX1NJWkUoaWR0YWdfbmFtZXMpKQorCQlyZXR1cm4gInVua25vd24iOworCisJcmV0dXJuIGlkdGFnX25hbWVzW3RhZ107Cit9CisKK2ludCBpcGFjY2Vzc19pZHRhZ19wYXJzZShzdHJ1Y3QgdGx2X3BhcnNlZCAqZGVjLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisJdV9pbnQ4X3QgdF9sZW47CisJdV9pbnQ4X3QgdF90YWc7CisJdV9pbnQ4X3QgKmN1ciA9IGJ1ZjsKKworCXdoaWxlIChjdXIgPCBidWYgKyBsZW4pIHsKKwkJdF9sZW4gPSAqY3VyKys7CisJCXRfdGFnID0gKmN1cisrOworCisJCURFQlVHUEMoRE1JLCAiJXM9JyVzJyAiLCBpcGFjX2lkdGFnX25hbWUodF90YWcpLCBjdXIpOworCisJCWRlYy0+bHZbdF90YWddLmxlbiA9IHRfbGVuOworCQlkZWMtPmx2W3RfdGFnXS52YWwgPSBjdXI7CisKKwkJY3VyICs9IHRfbGVuOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGdzbV9idHMgKmZpbmRfYnRzX2J5X3VuaXRpZChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkgICB1X2ludDE2X3Qgc2l0ZV9pZCwgdV9pbnQxNl90IGJ0c19pZCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmbmV0LT5idHNfbGlzdCwgbGlzdCkgeworCisJCWlmICghaXNfaXBhY2Nlc3NfYnRzKGJ0cykpCisJCQljb250aW51ZTsKKworCQlpZiAoYnRzLT5pcF9hY2Nlc3Muc2l0ZV9pZCA9PSBzaXRlX2lkICYmCisJCSAgICBidHMtPmlwX2FjY2Vzcy5idHNfaWQgPT0gYnRzX2lkKQorCQkJcmV0dXJuIGJ0czsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBwYXJzZV91bml0aWQoY29uc3QgY2hhciAqc3RyLCB1X2ludDE2X3QgKnNpdGVfaWQsIHVfaW50MTZfdCAqYnRzX2lkLAorCQkJdV9pbnQxNl90ICp0cnhfaWQpCit7CisJdW5zaWduZWQgbG9uZyB1bDsKKwljaGFyICplbmRwdHI7CisJY29uc3QgY2hhciAqbnB0cjsKKworCW5wdHIgPSBzdHI7CisJdWwgPSBzdHJ0b3VsKG5wdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoZW5kcHRyIDw9IG5wdHIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzaXRlX2lkKQorCQkqc2l0ZV9pZCA9IHVsICYgMHhmZmZmOworCisJaWYgKCplbmRwdHIrKyAhPSAnLycpCisJCXJldHVybiAtRUlOVkFMOworCisJbnB0ciA9IGVuZHB0cjsKKwl1bCA9IHN0cnRvdWwobnB0ciwgJmVuZHB0ciwgMTApOworCWlmIChlbmRwdHIgPD0gbnB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGJ0c19pZCkKKwkJKmJ0c19pZCA9IHVsICYgMHhmZmZmOworCisJaWYgKCplbmRwdHIrKyAhPSAnLycpCisJCXJldHVybiAtRUlOVkFMOworCQorCW5wdHIgPSBlbmRwdHI7CisJdWwgPSBzdHJ0b3VsKG5wdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoZW5kcHRyIDw9IG5wdHIpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh0cnhfaWQpCisJCSp0cnhfaWQgPSB1bCAmIDB4ZmZmZjsKKworCXJldHVybiAwOworfQorCisvKiBzZW5kIHRoZSBpZCBhY2sgKi8KK2ludCBpcGFjY2Vzc19zZW5kX2lkX2FjayhpbnQgZmQpCit7CisJcmV0dXJuIHdyaXRlKGZkLCBpZF9hY2ssIHNpemVvZihpZF9hY2spKTsKK30KKworaW50IGlwYWNjZXNzX3NlbmRfaWRfcmVxKGludCBmZCkKK3sKKwlyZXR1cm4gd3JpdGUoZmQsIGlkX3JlcSwgc2l6ZW9mKGlkX3JlcSkpOworfQorCisvKiBiYXNlIGhhbmRsaW5nIG9mIHRoZSBpcC5hY2Nlc3MgcHJvdG9jb2wgKi8KK2ludCBpcGFjY2Vzc19yY3Ztc2dfYmFzZShzdHJ1Y3QgbXNnYiAqbXNnLAorCQkJIHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwl1X2ludDhfdCBtc2dfdHlwZSA9ICoobXNnLT5sMmgpOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChtc2dfdHlwZSkgeworCWNhc2UgSVBBQ19NU0dUX1BJTkc6CisJCXJldCA9IHdyaXRlKGJmZC0+ZmQsIHBvbmcsIHNpemVvZihwb25nKSk7CisJCWJyZWFrOworCWNhc2UgSVBBQ19NU0dUX1BPTkc6CisJCURFQlVHUChETUksICJQT05HIVxuIik7CisJCWJyZWFrOworCWNhc2UgSVBBQ19NU0dUX0lEX0FDSzoKKwkJREVCVUdQKERNSSwgIklEX0FDSz8gLT4gQUNLIVxuIik7CisJCXJldCA9IGlwYWNjZXNzX3NlbmRfaWRfYWNrKGJmZC0+ZmQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXBhY2Nlc3NfcmN2bXNnKHN0cnVjdCBlMWlucF9saW5lICpsaW5lLCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkJICAgc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCB0bHZfcGFyc2VkIHRsdnA7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSAqKG1zZy0+bDJoKTsKKwl1X2ludDE2X3Qgc2l0ZV9pZCA9IDAsIGJ0c19pZCA9IDAsIHRyeF9pZCA9IDA7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCS8qIGhhbmRsZSBiYXNlIG1lc3NhZ2VzICovCisJaXBhY2Nlc3NfcmN2bXNnX2Jhc2UobXNnLCBiZmQpOworCisJc3dpdGNoIChtc2dfdHlwZSkgeworCWNhc2UgSVBBQ19NU0dUX0lEX1JFU1A6CisJCURFQlVHUChETUksICJJRF9SRVNQICIpOworCQkvKiBwYXJzZSB0YWdzLCBzZWFyY2ggZm9yIFVuaXQgSUQgKi8KKwkJaXBhY2Nlc3NfaWR0YWdfcGFyc2UoJnRsdnAsICh1X2ludDhfdCAqKW1zZy0+bDJoICsgMiwKKwkJCQkgbXNnYl9sMmxlbihtc2cpLTIpOworCQlERUJVR1AoRE1JLCAiXG4iKTsKKworCQlpZiAoIVRMVlBfUFJFU0VOVCgmdGx2cCwgSVBBQ19JRFRBR19VTklUKSkKKwkJCWJyZWFrOworCisJCS8qIGxvb2t1cCBCVFMsIGNyZWF0ZSBzaWduX2xpbmssIC4uLiAqLworCQlwYXJzZV91bml0aWQoKGNoYXIgKilUTFZQX1ZBTCgmdGx2cCwgSVBBQ19JRFRBR19VTklUKSwKKwkJCSAgICAgJnNpdGVfaWQsICZidHNfaWQsICZ0cnhfaWQpOworCQlidHMgPSBmaW5kX2J0c19ieV91bml0aWQoZTFoLT5nc21uZXQsIHNpdGVfaWQsIGJ0c19pZCk7CisJCWlmICghYnRzKSB7CisJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJVbmFibGUgdG8gZmluZCBCVFMgY29uZmlndXJhdGlvbiBmb3IgIgorCQkJICAgICAgICIgJXUvJXUvJXUsIGRpc2Nvbm5lY3RpbmdcbiIsIHNpdGVfaWQsIGJ0c19pZCwKKwkJCQl0cnhfaWQpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJREVCVUdQKERJTlAsICJJZGVudGlmaWVkIEJUUyAldS8ldS8ldVxuIiwgc2l0ZV9pZCwgYnRzX2lkLCB0cnhfaWQpOworCQlpZiAoYmZkLT5wcml2X25yID09IFBSSVZfT01MKSB7CisJCQlidHMtPm9tbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZSgmbGluZS0+dHNbUFJJVl9PTUwgLSAxXSwKKwkJCQkJCSAgRTFJTlBfU0lHTl9PTUwsIGJ0cy0+YzAsCisJCQkJCQkgIGJ0cy0+b21sX3RlaSwgMCk7CisJCX0gZWxzZSBpZiAoYmZkLT5wcml2X25yID09IFBSSVZfUlNMKSB7CisJCQlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90czsKKwkJCXN0cnVjdCBic2NfZmQgKm5ld2JmZDsKKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X2lkKTsKKwkJCQorCQkJYmZkLT5kYXRhID0gbGluZSA9IGJ0cy0+b21sX2xpbmstPnRzLT5saW5lOworCQkJZTFpX3RzID0gJmxpbmUtPnRzW1BSSVZfUlNMICsgdHJ4X2lkIC0gMV07CisJCQluZXdiZmQgPSAmZTFpX3RzLT5kcml2ZXIuaXBhY2Nlc3MuZmQ7CisJCQllMWlucF90c19jb25maWcoZTFpX3RzLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCisJCQl0cngtPnJzbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShlMWlfdHMsCisJCQkJCQkJRTFJTlBfU0lHTl9SU0wsIHRyeCwKKwkJCQkJCQl0cngtPnJzbF90ZWksIDApOworCisJCQlpZiAobmV3YmZkLT5mZCA+PSAwKSB7CisJCQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiQlRTIGlzIHN0aWxsIHJlZ2lzdGVyZWQuIENsb3Npbmcgb2xkIGNvbm5lY3Rpb24uXG4iKTsKKwkJCQlic2NfdW5yZWdpc3Rlcl9mZChuZXdiZmQpOworCQkJCWNsb3NlKG5ld2JmZC0+ZmQpOworCQkJCW5ld2JmZC0+ZmQgPSAtMTsKKwkJCX0KKworCQkJLyogZ2V0IHJpZCBvZiBvdXIgb2xkIHRlbXBvcmFyeSBiZmQgKi8KKwkJCW1lbWNweShuZXdiZmQsIGJmZCwgc2l6ZW9mKCpuZXdiZmQpKTsKKwkJCW5ld2JmZC0+cHJpdl9uciA9IFBSSVZfUlNMICsgdHJ4X2lkOworCQkJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwkJCWJzY19yZWdpc3Rlcl9mZChuZXdiZmQpOworCQkJdGFsbG9jX2ZyZWUoYmZkKTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT01MX1VQCQkweDAwMDEKKyNkZWZpbmUgUlNMX1VQCQkweDAwMDIKKworLyoKKyAqIHJlYWQgb25lIGlwYSBtZXNzYWdlIGZyb20gdGhlIHNvY2tldAorICogcmV0dXJuIE5VTEwgaW4gY2FzZSBvZiBlcnJvcgorICovCitzdHJ1Y3QgbXNnYiAqaXBhY2Nlc3NfcmVhZF9tc2coc3RydWN0IGJzY19mZCAqYmZkLCBpbnQgKmVycm9yKQoreworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKFRTMV9BTExPQ19TSVpFLCAiQWJpcy9JUCIpOworCXN0cnVjdCBpcGFjY2Vzc19oZWFkICpoaDsKKwlpbnQgbGVuLCByZXQgPSAwOworCisJaWYgKCFtc2cpIHsKKwkJKmVycm9yID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogZmlyc3QgcmVhZCBvdXIgMy1ieXRlIGhlYWRlciAqLworCWhoID0gKHN0cnVjdCBpcGFjY2Vzc19oZWFkICopIG1zZy0+ZGF0YTsKKwlyZXQgPSByZWN2KGJmZC0+ZmQsIG1zZy0+ZGF0YSwgc2l6ZW9mKCpoaCksIDApOworCWlmIChyZXQgPT0gMCkgeworCQltc2diX2ZyZWUobXNnKTsKKwkJKmVycm9yID0gcmV0OworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKHJldCAhPSBzaXplb2YoKmhoKSkgeworCQlpZiAoZXJybm8gIT0gRUFHQUlOKQorCQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAicmVjdiBlcnJvciAlZCAlc1xuIiwgcmV0LCBzdHJlcnJvcihlcnJubykpOworCQltc2diX2ZyZWUobXNnKTsKKwkJKmVycm9yID0gcmV0OworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltc2diX3B1dChtc2csIHJldCk7CisKKwkvKiB0aGVuIHJlYWQgdGUgbGVuZ3RoIGFzIHNwZWNpZmllZCBpbiBoZWFkZXIgKi8KKwltc2ctPmwyaCA9IG1zZy0+ZGF0YSArIHNpemVvZigqaGgpOworCWxlbiA9IG50b2hzKGhoLT5sZW4pOworCisJaWYgKGxlbiA8IDAgfHwgVFMxX0FMTE9DX1NJWkUgPCBsZW4gKyBzaXplb2YoKmhoKSkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJDYW4gbm90IHJlYWQgdGhpcyBwYWNrZXQuICVkIGF2YWlsXG4iLCBsZW4pOworCQltc2diX2ZyZWUobXNnKTsKKwkJKmVycm9yID0gLUVJTzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0ID0gcmVjdihiZmQtPmZkLCBtc2ctPmwyaCwgbGVuLCAwKTsKKwlpZiAocmV0IDwgbGVuKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgInNob3J0IHJlYWQhIEdvdCAlZCBmcm9tICVkXG4iLCByZXQsIGxlbik7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSAtRUlPOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbXNnYl9wdXQobXNnLCByZXQpOworCisJcmV0dXJuIG1zZzsKK30KKworc3RhdGljIGludCBoYW5kbGVfdHMxX3JlYWQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1t0c19uci0xXTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IGlwYWNjZXNzX2hlYWQgKmhoOworCWludCByZXQgPSAwLCBlcnJvcjsKKworCW1zZyA9IGlwYWNjZXNzX3JlYWRfbXNnKGJmZCwgJmVycm9yKTsKKwlpZiAoIW1zZykgeworCQlpZiAoZXJyb3IgPT0gMCkgeworCQkJbGluayA9IGUxaW5wX2xvb2t1cF9zaWduX2xpbmsoZTFpX3RzLCBJUEFDX1BST1RPX09NTCwgMCk7CisJCQlpZiAobGluaykgeworCQkJCWxpbmstPnRyeC0+YnRzLT5pcF9hY2Nlc3MuZmxhZ3MgPSAwOworCQkJCUxPR1AoRElOUCwgTE9HTF9OT1RJQ0UsICJCVFMgJXUgZGlzYXBwZWFyZWQsIGRlYWQgc29ja2V0XG4iLAorCQkJCQlsaW5rLT50cngtPmJ0cy0+bnIpOworCQkJfSBlbHNlCisJCQkJTE9HUChESU5QLCBMT0dMX05PVElDRSwgInVua25vd24gQlRTIGRpc2FwcGVhcmVkLCBkZWFkIHNvY2tldFxuIik7CisJCQllMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfRE4sIDAsIElQQUNfUFJPVE9fUlNMKTsKKwkJCWUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9ETiwgMCwgSVBBQ19QUk9UT19PTUwpOworCQkJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwkJCWNsb3NlKGJmZC0+ZmQpOworCQkJYmZkLT5mZCA9IC0xOworCQl9CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlERUJVR1AoRE1JLCAiUlggJXU6ICVzXG4iLCB0c19uciwgaGV4ZHVtcChtc2diX2wyKG1zZyksIG1zZ2JfbDJsZW4obXNnKSkpOworCisJaGggPSAoc3RydWN0IGlwYWNjZXNzX2hlYWQgKikgbXNnLT5kYXRhOworCWlmIChoaC0+cHJvdG8gPT0gSVBBQ19QUk9UT19JUEFDQ0VTUykgeworCQlyZXQgPSBpcGFjY2Vzc19yY3Ztc2cobGluZSwgbXNnLCBiZmQpOworCQlpZiAocmV0IDwgMCkgeworCQkJZTFpbnBfZXZlbnQoZTFpX3RzLCBFVlRfRTFfVEVJX0ROLCAwLCBJUEFDX1BST1RPX1JTTCk7CisJCQllMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfRE4sIDAsIElQQUNfUFJPVE9fT01MKTsKKwkJCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJCQljbG9zZShiZmQtPmZkKTsKKwkJCWJmZC0+ZmQgPSAtMTsKKwkJfQorCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLyogQklHIEZBVCBXQVJOSU5HOiBiZmQgbWlnaHQgbm8gbG9uZ2VyIGV4aXN0IGhlcmUsIHNpbmNlIGlwYWNjZXNzX3Jjdm1zZygpCisJICogbWlnaHQgaGF2ZSBmcmVlJ2QgaXQgISEhICovCisKKwlsaW5rID0gZTFpbnBfbG9va3VwX3NpZ25fbGluayhlMWlfdHMsIGhoLT5wcm90bywgMCk7CisJaWYgKCFsaW5rKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgIm5vIG1hdGNoaW5nIHNpZ25hbGxpbmcgbGluayBmb3IgIgorCQkJImhoLT5wcm90bz0weCUwMnhcbiIsIGhoLT5wcm90byk7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbXNnLT50cnggPSBsaW5rLT50cng7CisKKwlzd2l0Y2ggKGxpbmstPnR5cGUpIHsKKwljYXNlIEUxSU5QX1NJR05fUlNMOgorCQlpZiAoIShtc2ctPnRyeC0+YnRzLT5pcF9hY2Nlc3MuZmxhZ3MgJiAoUlNMX1VQIDw8IG1zZy0+dHJ4LT5ucikpKSB7CisJCQllMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfVVAsIGxpbmstPnRlaSwgbGluay0+c2FwaSk7CisJCQltc2ctPnRyeC0+YnRzLT5pcF9hY2Nlc3MuZmxhZ3MgfD0gKFJTTF9VUCA8PCBtc2ctPnRyeC0+bnIpOworCQl9CisJCXJldCA9IGFiaXNfcnNsX3Jjdm1zZyhtc2cpOworCQlicmVhazsKKwljYXNlIEUxSU5QX1NJR05fT01MOgorCQlpZiAoIShtc2ctPnRyeC0+YnRzLT5pcF9hY2Nlc3MuZmxhZ3MgJiBPTUxfVVApKSB7CisJCQllMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfVVAsIGxpbmstPnRlaSwgbGluay0+c2FwaSk7CisJCQltc2ctPnRyeC0+YnRzLT5pcF9hY2Nlc3MuZmxhZ3MgfD0gT01MX1VQOworCQl9CisJCXJldCA9IGFiaXNfbm1fcmN2bXNnKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRElOUCwgTE9HTF9OT1RJQ0UsICJVbmtub3duIElQLmFjY2VzcyBwcm90b2NvbCBwcm90bz0weCUwMnhcbiIsIGhoLT5wcm90byk7CisJCW1zZ2JfZnJlZShtc2cpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBpcGFjY2Vzc19wcmVwZW5kX2hlYWRlcihzdHJ1Y3QgbXNnYiAqbXNnLCBpbnQgcHJvdG8pCit7CisJc3RydWN0IGlwYWNjZXNzX2hlYWQgKmhoOworCisJLyogcHJlcGVuZCB0aGUgaXAuYWNjZXNzIGhlYWRlciAqLworCWhoID0gKHN0cnVjdCBpcGFjY2Vzc19oZWFkICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqaGgpKTsKKwloaC0+bGVuID0gaHRvbnMobXNnLT5sZW4gLSBzaXplb2YoKmhoKSk7CisJaGgtPnByb3RvID0gcHJvdG87Cit9CisKK3N0YXRpYyBpbnQgdHNfd2FudF93cml0ZShzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cykKK3sKKwllMWlfdHMtPmRyaXZlci5pcGFjY2Vzcy5mZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0aW1lb3V0X3RzMV93cml0ZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gKHN0cnVjdCBlMWlucF90cyAqKWRhdGE7CisKKwkvKiB0cmlnZ2VyIHdyaXRlIG9mIHRzMSwgZHVlIHRvIHR4IGRlbGF5IHRpbWVyICovCisJdHNfd2FudF93cml0ZShlMWlfdHMpOworfQorCitzdGF0aWMgaW50IGhhbmRsZV90czFfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1t0c19uci0xXTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpzaWduX2xpbms7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwl1X2ludDhfdCBwcm90bzsKKwlpbnQgcmV0OworCisJYmZkLT53aGVuICY9IH5CU0NfRkRfV1JJVEU7CisKKwkvKiBnZXQgdGhlIG5leHQgbXNnIGZvciB0aGlzIHRpbWVzbG90ICovCisJbXNnID0gZTFpbnBfdHhfdHMoZTFpX3RzLCAmc2lnbl9saW5rKTsKKwlpZiAoIW1zZykgeworCQkvKiBubyBtZXNzYWdlIGFmdGVyIHR4IGRlbGF5IHRpbWVyICovCisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoc2lnbl9saW5rLT50eXBlKSB7CisJY2FzZSBFMUlOUF9TSUdOX09NTDoKKwkJcHJvdG8gPSBJUEFDX1BST1RPX09NTDsKKwkJYnJlYWs7CisJY2FzZSBFMUlOUF9TSUdOX1JTTDoKKwkJcHJvdG8gPSBJUEFDX1BST1RPX1JTTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbXNnYl9mcmVlKG1zZyk7CisJCWJmZC0+d2hlbiB8PSBCU0NfRkRfV1JJVEU7IC8qIGNvbWUgYmFjayBmb3IgbW9yZSBtc2cgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNnLT5sMmggPSBtc2ctPmRhdGE7CisJaXBhY2Nlc3NfcHJlcGVuZF9oZWFkZXIobXNnLCBzaWduX2xpbmstPnRlaSk7CisKKwlERUJVR1AoRE1JLCAiVFggJXU6ICVzXG4iLCB0c19uciwgaGV4ZHVtcChtc2ctPmwyaCwgbXNnYl9sMmxlbihtc2cpKSk7CisKKwlyZXQgPSBzZW5kKGJmZC0+ZmQsIG1zZy0+ZGF0YSwgbXNnLT5sZW4sIDApOworCW1zZ2JfZnJlZShtc2cpOworCisJLyogc2V0IHR4IGRlbGF5IHRpbWVyIGZvciBuZXh0IGV2ZW50ICovCisJZTFpX3RzLT5zaWduLnR4X3RpbWVyLmNiID0gdGltZW91dF90czFfd3JpdGU7CisJZTFpX3RzLT5zaWduLnR4X3RpbWVyLmRhdGEgPSBlMWlfdHM7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZlMWlfdHMtPnNpZ24udHhfdGltZXIsIDAsIDEwMCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBjYWxsYmFjayBmcm9tIHNlbGVjdC5jIGluIGNhc2Ugb25lIG9mIHRoZSBmZCdzIGNhbiBiZSByZWFkL3dyaXR0ZW4gKi8KK3N0YXRpYyBpbnQgaXBhY2Nlc3NfZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJdW5zaWduZWQgaW50IGlkeCA9IHRzX25yLTE7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHM7CisJaW50IHJjID0gMDsKKworCS8qIEluIGNhc2Ugb2YgZWFybHkgUlNMIHdlIG1pZ2h0IG5vdCB5ZXQgaGF2ZSBhIGxpbmUgKi8KKworCWlmIChsaW5lKQorIAkJZTFpX3RzID0gJmxpbmUtPnRzW2lkeF07CisKKwlpZiAoIWxpbmUgfHwgZTFpX3RzLT50eXBlID09IEUxSU5QX1RTX1RZUEVfU0lHTikgeworCQlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKQorCQkJcmMgPSBoYW5kbGVfdHMxX3JlYWQoYmZkKTsKKwkJaWYgKHdoYXQgJiBCU0NfRkRfV1JJVEUpCisJCQlyYyA9IGhhbmRsZV90czFfd3JpdGUoYmZkKTsKKwl9IGVsc2UKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAidW5rbm93biBFMSBUUyB0eXBlICV1XG4iLCBlMWlfdHMtPnR5cGUpOworCisJcmV0dXJuIHJjOworfQorCisKK3N0cnVjdCBlMWlucF9kcml2ZXIgaXBhY2Nlc3NfZHJpdmVyID0geworCS5uYW1lID0gImlwLmFjY2VzcyIsCisJLndhbnRfd3JpdGUgPSB0c193YW50X3dyaXRlLAorfTsKKworLyogY2FsbGJhY2sgb2YgdGhlIE9NTCBsaXN0ZW5pbmcgZmlsZWRlc2NyaXB0b3IgKi8KK3N0YXRpYyBpbnQgbGlzdGVuX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmxpc3Rlbl9iZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCWludCByZXQ7CisJaW50IGlkeCA9IDA7CisJaW50IGk7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHM7CisJc3RydWN0IGJzY19mZCAqYmZkOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKwlzb2NrbGVuX3Qgc2FfbGVuID0gc2l6ZW9mKHNhKTsKKworCWlmICghKHdoYXQgJiBCU0NfRkRfUkVBRCkpCisJCXJldHVybiAwOworCisJcmV0ID0gYWNjZXB0KGxpc3Rlbl9iZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYSwgJnNhX2xlbik7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJhY2NlcHQiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJTE9HUChESU5QLCBMT0dMX05PVElDRSwgImFjY2VwdCgpZWQgbmV3IE9NTCBsaW5rIGZyb20gJXNcbiIsCisJCWluZXRfbnRvYShzYS5zaW5fYWRkcikpOworCisJbGluZSA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGUxaW5wX2xpbmUpOworCWlmICghbGluZSkgeworCQljbG9zZShyZXQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbGluZS0+ZHJpdmVyID0gJmlwYWNjZXNzX2RyaXZlcjsKKwkvL2xpbmUtPmRyaXZlcl9kYXRhID0gZTFoOworCS8qIGNyZWF0ZSB2aXJydHVhbCBFMSB0aW1lc2xvdHMgZm9yIHNpZ25hbGxpbmcgKi8KKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzWzEtMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisKKwkvKiBpbml0aWFsaXplIHRoZSBmZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsaW5lLT50cyk7ICsraSkKKwkJbGluZS0+dHNbaV0uZHJpdmVyLmlwYWNjZXNzLmZkLmZkID0gLTE7CisKKwllMWlfdHMgPSAmbGluZS0+dHNbaWR4XTsKKworCWJmZCA9ICZlMWlfdHMtPmRyaXZlci5pcGFjY2Vzcy5mZDsKKwliZmQtPmZkID0gcmV0OworCWJmZC0+ZGF0YSA9IGxpbmU7CisJYmZkLT5wcml2X25yID0gUFJJVl9PTUw7CisJYmZkLT5jYiA9IGlwYWNjZXNzX2ZkX2NiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCByZWdpc3RlciBGRFxuIik7CisJCWNsb3NlKGJmZC0+ZmQpOworCQl0YWxsb2NfZnJlZShsaW5lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBSZXF1ZXN0IElELiBGSVhNRTogcmVxdWVzdCBMT0NBVElPTiwgSFcvU1cgVkVyc2lvbiwgVW5pdCBOYW1lLCBTZXJubyAqLworCXJldCA9IGlwYWNjZXNzX3NlbmRfaWRfcmVxKGJmZC0+ZmQpOworCisgICAgICAgIHJldHVybiByZXQ7CisJLy9yZXR1cm4gZTFpbnBfbGluZV9yZWdpc3RlcihsaW5lKTsKK30KKworc3RhdGljIGludCByc2xfbGlzdGVuX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmxpc3Rlbl9iZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKwlzb2NrbGVuX3Qgc2FfbGVuID0gc2l6ZW9mKHNhKTsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQ7CisJaW50IHJldDsKKworCWlmICghKHdoYXQgJiBCU0NfRkRfUkVBRCkpCisJCXJldHVybiAwOworCisJYmZkID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgYnNjX2ZkKTsKKwlpZiAoIWJmZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBTb21lIEJUUyBoYXMgY29ubmVjdGVkIHRvIHVzLCBidXQgd2UgZG9uJ3Qga25vdyB5ZXQgd2hpY2ggbGluZQorCSAqIChhcyBjcmVhdGVkIGJ5IHRoZSBPTUwgbGluaykgdG8gYXNzb2NpYXRlIGl0IHdpdGguICBUaHVzLCB3ZQorCSAqIGFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJmZCB1bnRpbCB3ZSBoYXZlIHJlY2VpdmVkIElEIGZyb20gQlRTICovCisKKwliZmQtPmZkID0gYWNjZXB0KGxpc3Rlbl9iZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYSwgJnNhX2xlbik7CisJaWYgKGJmZC0+ZmQgPCAwKSB7CisJCXBlcnJvcigiYWNjZXB0Iik7CisJCXJldHVybiBiZmQtPmZkOworCX0KKwlMT0dQKERJTlAsIExPR0xfTk9USUNFLCAiYWNjZXB0KCllZCBuZXcgUlNMIGxpbmsgZnJvbSAlc1xuIiwgaW5ldF9udG9hKHNhLnNpbl9hZGRyKSk7CisJYmZkLT5wcml2X25yID0gUFJJVl9SU0w7CisJYmZkLT5jYiA9IGlwYWNjZXNzX2ZkX2NiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCByZWdpc3RlciBGRFxuIik7CisJCWNsb3NlKGJmZC0+ZmQpOworCQl0YWxsb2NfZnJlZShiZmQpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiBSZXF1ZXN0IElELiBGSVhNRTogcmVxdWVzdCBMT0NBVElPTiwgSFcvU1cgVkVyc2lvbiwgVW5pdCBOYW1lLCBTZXJubyAqLworCXJldCA9IHdyaXRlKGJmZC0+ZmQsIGlkX3JlcSwgc2l6ZW9mKGlkX3JlcSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFrZV9zb2NrKHN0cnVjdCBic2NfZmQgKmJmZCwgdV9pbnQxNl90IHBvcnQsCisJCSAgICAgaW50ICgqY2IpKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkpCit7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJaW50IHJldCwgb24gPSAxOworCQorCWJmZC0+ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKwliZmQtPmNiID0gY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJLy9iZmQtPmRhdGEgPSBsaW5lOworCisJaWYgKGJmZC0+ZmQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBjcmVhdGUgVENQIHNvY2tldC5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCisJc2V0c29ja29wdChiZmQtPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisKKwlyZXQgPSBiaW5kKGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGJpbmQgbDIgc29ja2V0ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldCA9IGxpc3RlbihiZmQtPmZkLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoImxpc3RlbiIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJCisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJyZWdpc3Rlcl9saXN0ZW5fZmQiKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCisvKiBBY3RpdmVseSBjb25uZWN0IHRvIGEgQlRTLiAgQ3VycmVudGx5IHVzZWQgYnkgaXBhY2Nlc3MtY29uZmlnLmMgKi8KK2ludCBpcGFjY2Vzc19jb25uZWN0KHN0cnVjdCBlMWlucF9saW5lICpsaW5lLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhKQoreworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzWzBdOworCXN0cnVjdCBic2NfZmQgKmJmZCA9ICZlMWlfdHMtPmRyaXZlci5pcGFjY2Vzcy5mZDsKKwlpbnQgcmV0LCBvbiA9IDE7CisKKwliZmQtPmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7CisJYmZkLT5jYiA9IGlwYWNjZXNzX2ZkX2NiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEIHwgQlNDX0ZEX1dSSVRFOworCWJmZC0+ZGF0YSA9IGxpbmU7CisJYmZkLT5wcml2X25yID0gUFJJVl9PTUw7CisKKwlpZiAoYmZkLT5mZCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGNyZWF0ZSBUQ1Agc29ja2V0LlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXNldHNvY2tvcHQoYmZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJcmV0ID0gY29ubmVjdChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopIHNhLCBzaXplb2YoKnNhKSk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGNvbm5lY3Qgc29ja2V0XG4iKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXJldHVybiByZXQ7CisJfQorCQorCWxpbmUtPmRyaXZlciA9ICZpcGFjY2Vzc19kcml2ZXI7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKwkvL3JldHVybiBlMWlucF9saW5lX3JlZ2lzdGVyKGxpbmUpOworfQorCitpbnQgaXBhY2Nlc3Nfc2V0dXAoc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQpCit7CisJaW50IHJldDsKKworCS8qIHJlZ2lzdGVyIHRoZSBkcml2ZXIgd2l0aCB0aGUgY29yZSAqLworCS8qIEZJWE1FOiBkbyB0aGlzIGluIHRoZSBwbHVnaW4gaW5pdGlhbGl6ZXIgZnVuY3Rpb24gKi8KKwlyZXQgPSBlMWlucF9kcml2ZXJfcmVnaXN0ZXIoJmlwYWNjZXNzX2RyaXZlcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWUxaCA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGlhX2UxX2hhbmRsZSk7CisJaWYgKCFlMWgpCisJCXJldHVybiAtRU5PTUVNOworCisJZTFoLT5nc21uZXQgPSBnc21uZXQ7CisKKwkvKiBMaXN0ZW4gZm9yIE9NTCBjb25uZWN0aW9ucyAqLworCXJldCA9IG1ha2Vfc29jaygmZTFoLT5saXN0ZW5fZmQsIElQQV9UQ1BfUE9SVF9PTUwsIGxpc3Rlbl9mZF9jYik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBMaXN0ZW4gZm9yIFJTTCBjb25uZWN0aW9ucyAqLworCXJldCA9IG1ha2Vfc29jaygmZTFoLT5yc2xfbGlzdGVuX2ZkLCBJUEFfVENQX1BPUlRfUlNMLCByc2xfbGlzdGVuX2ZkX2NiKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pbnB1dC9taXNkbi5jIGIvb3BlbmJzYy9zcmMvaW5wdXQvbWlzZG4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjkzMGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaW5wdXQvbWlzZG4uYwpAQCAtMCwwICsxLDUzNiBAQAorLyogT3BlbkJTQyBBYmlzIGlucHV0IGRyaXZlciBmb3IgbUlTRE51c2VyICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG1JU0ROaWYuaD4KKworLy8jZGVmaW5lIEFGX0NPTVBBVElCSUxJVFlfRlVOQworLy8jaW5jbHVkZSA8Y29tcGF0X2FmX2lzZG4uaD4KKyNpZm5kZWYgQUZfSVNETgorI2RlZmluZSBBRl9JU0ROIDM0CisjZGVmaW5lIFBGX0lTRE4gQUZfSVNETgorI2VuZGlmCisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zdWJjaGFuX2RlbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjZGVmaW5lIFRTMV9BTExPQ19TSVpFCTMwMAorCitzdHJ1Y3QgcHJpbV9uYW1lIHsKKwl1bnNpZ25lZCBpbnQgcHJpbTsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworY29uc3Qgc3RydWN0IHByaW1fbmFtZSBwcmltX25hbWVzW10gPSB7CisJeyBQSF9DT05UUk9MX0lORCwgIlBIX0NPTlRST0xfSU5EIiB9LAorCXsgUEhfREFUQV9JTkQsICJQSF9EQVRBX0lORCIgfSwKKwl7IFBIX0RBVEFfQ05GLCAiUEhfREFUQV9DTkYiIH0sCisJeyBQSF9BQ1RJVkFURV9JTkQsICJQSF9BQ1RJVkFURV9JTkQiIH0sCisJeyBETF9FU1RBQkxJU0hfSU5ELCAiRExfRVNUQUJMSVNIX0lORCIgfSwKKwl7IERMX0VTVEFCTElTSF9DTkYsICJETF9FU1RBQkxJU0hfQ05GIiB9LAorCXsgRExfUkVMRUFTRV9JTkQsICJETF9SRUxFQVNFX0lORCIgfSwKKwl7IERMX1JFTEVBU0VfQ05GLCAiRExfUkVMRUFTRV9DTkYiIH0sCisJeyBETF9EQVRBX0lORCwgIkRMX0RBVEFfSU5EIiB9LAorCXsgRExfVU5JVERBVEFfSU5ELCAiRExfVU5JVERBVEFfSU5EIiB9LAorCXsgRExfSU5GT1JNQVRJT05fSU5ELCAiRExfSU5GT1JNQVRJT05fSU5EIiB9LAorCXsgTVBIX0FDVElWQVRFX0lORCwgIk1QSF9BQ1RJVkFURV9JTkQiIH0sCisJeyBNUEhfREVBQ1RJVkFURV9JTkQsICJNUEhfREVBQ1RJVkFURV9JTkQiIH0sCit9OworCitjb25zdCBjaGFyICpnZXRfcHJpbV9uYW1lKHVuc2lnbmVkIGludCBwcmltKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHJpbV9uYW1lcyk7IGkrKykgeworCQlpZiAocHJpbV9uYW1lc1tpXS5wcmltID09IHByaW0pCisJCQlyZXR1cm4gcHJpbV9uYW1lc1tpXS5uYW1lOworCX0KKworCXJldHVybiAiVU5LTk9XTiI7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3RzMV9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbdHNfbnItMV07CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluazsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhUUzFfQUxMT0NfU0laRSwgIm1JU0ROIFRTMSIpOworCXN0cnVjdCBzb2NrYWRkcl9tSVNETiBsMmFkZHI7CisJc3RydWN0IG1JU0ROaGVhZCAqaGg7CisJc29ja2xlbl90IGFsZW47CisJaW50IHJldDsKKworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhoID0gKHN0cnVjdCBtSVNETmhlYWQgKikgbXNnLT5kYXRhOworCisJYWxlbiA9IHNpemVvZihsMmFkZHIpOworCXJldCA9IHJlY3Zmcm9tKGJmZC0+ZmQsIG1zZy0+ZGF0YSwgMzAwLCAwLAorCQkgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmbDJhZGRyLCAmYWxlbik7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJyZWN2ZnJvbSBlcnJvciAgJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGFsZW4gIT0gc2l6ZW9mKGwyYWRkcikpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlcyBlcnJvciBsZW5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNnYl9wdXQobXNnLCByZXQpOworCisJREVCVUdQKERNSSwgImFsZW4gPSVkLCBkZXYoJWQpIGNoYW5uZWwoJWQpIHNhcGkoJWQpIHRlaSglZClcbiIsCisJCWFsZW4sIGwyYWRkci5kZXYsIGwyYWRkci5jaGFubmVsLCBsMmFkZHIuc2FwaSwgbDJhZGRyLnRlaSk7CisKKwlERUJVR1AoRE1JLCAiPD0gbGVuID0gJWQsIHByaW0oMHgleCkgaWQoMHgleCk6ICVzXG4iLAorCQlyZXQsIGhoLT5wcmltLCBoaC0+aWQsIGdldF9wcmltX25hbWUoaGgtPnByaW0pKTsKKworCXN3aXRjaCAoaGgtPnByaW0pIHsKKwljYXNlIERMX0lORk9STUFUSU9OX0lORDoKKwkJLyogbUlTRE4gdGVsbHMgdXMgd2hpY2ggY2hhbm5lbCBudW1iZXIgaXMgYWxsb2NhdGVkIGZvciB0aGlzCisJCSAqIHR1cGxlIG9mIChTQVBJLCBURUkpLiAqLworCQlERUJVR1AoRE1JLCAiRExfSU5GT1JNQVRJT05fSU5EOiB1c2UgY2hhbm5lbCglZCkgc2FwaSglZCkgdGVpKCVkKSBmb3Igbm93XG4iLAorCQkJbDJhZGRyLmNoYW5uZWwsIGwyYWRkci5zYXBpLCBsMmFkZHIudGVpKTsKKwkJbGluayA9IGUxaW5wX2xvb2t1cF9zaWduX2xpbmsoZTFpX3RzLCBsMmFkZHIudGVpLCBsMmFkZHIuc2FwaSk7CisJCWlmICghbGluaykgeworCQkJREVCVUdQQyhETUksICJtSVNETiBtZXNzYWdlIGZvciB1bmtub3duIHNpZ25fbGlua1xuIik7CisJCQltc2diX2ZyZWUobXNnKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIHNhdmUgdGhlIGNoYW5uZWwgbnVtYmVyIGluIHRoZSBkcml2ZXIgcHJpdmF0ZSBzdHJ1Y3QgKi8KKwkJbGluay0+ZHJpdmVyLm1pc2RuLmNoYW5uZWwgPSBsMmFkZHIuY2hhbm5lbDsKKwkJYnJlYWs7CisJY2FzZSBETF9FU1RBQkxJU0hfSU5EOgorCQlERUJVR1AoRE1JLCAiRExfRVNUQUJMSVNIX0lORDogY2hhbm5lbCglZCkgc2FwaSglZCkgdGVpKCVkKVxuIiwKKwkJbDJhZGRyLmNoYW5uZWwsIGwyYWRkci5zYXBpLCBsMmFkZHIudGVpKTsKKwkJcmV0ID0gZTFpbnBfZXZlbnQoZTFpX3RzLCBFVlRfRTFfVEVJX1VQLCBsMmFkZHIudGVpLCBsMmFkZHIuc2FwaSk7CisJCWJyZWFrOworCWNhc2UgRExfUkVMRUFTRV9JTkQ6CisJCURFQlVHUChETUksICJETF9SRUxFQVNFX0lORDogY2hhbm5lbCglZCkgc2FwaSglZCkgdGVpKCVkKVxuIiwKKwkJbDJhZGRyLmNoYW5uZWwsIGwyYWRkci5zYXBpLCBsMmFkZHIudGVpKTsKKwkJcmV0ID0gZTFpbnBfZXZlbnQoZTFpX3RzLCBFVlRfRTFfVEVJX0ROLCBsMmFkZHIudGVpLCBsMmFkZHIuc2FwaSk7CisJCWJyZWFrOworCWNhc2UgRExfREFUQV9JTkQ6CisJY2FzZSBETF9VTklUREFUQV9JTkQ6CisJCW1zZy0+bDJoID0gbXNnLT5kYXRhICsgTUlTRE5fSEVBREVSX0xFTjsKKwkJREVCVUdQKERNSSwgIlJYOiAlc1xuIiwgaGV4ZHVtcChtc2diX2wyKG1zZyksIHJldCAtIE1JU0ROX0hFQURFUl9MRU4pKTsKKwkJcmV0ID0gZTFpbnBfcnhfdHMoZTFpX3RzLCBtc2csIGwyYWRkci50ZWksIGwyYWRkci5zYXBpKTsKKwkJYnJlYWs7CisJY2FzZSBQSF9BQ1RJVkFURV9JTkQ6CisJCURFQlVHUChETUksICJQSF9BQ1RJVkFURV9JTkQ6IGNoYW5uZWwoJWQpIHNhcGkoJWQpIHRlaSglZClcbiIsCisJCWwyYWRkci5jaGFubmVsLCBsMmFkZHIuc2FwaSwgbDJhZGRyLnRlaSk7CisJCWJyZWFrOworCWNhc2UgUEhfREVBQ1RJVkFURV9JTkQ6CisJCURFQlVHUChETUksICJQSF9ERUFDVElWQVRFX0lORDogY2hhbm5lbCglZCkgc2FwaSglZCkgdGVpKCVkKVxuIiwKKwkJbDJhZGRyLmNoYW5uZWwsIGwyYWRkci5zYXBpLCBsMmFkZHIudGVpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHNfd2FudF93cml0ZShzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cykKK3sKKwkvKiBXZSBuZXZlciBpbmNsdWRlIHRoZSBtSVNETiBCLUNoYW5uZWwgRkQgaW50byB0aGUKKwkgKiB3cml0ZXNldCwgc2luY2UgaXQgZG9lc24ndCBzdXBwb3J0IHBvbGwoKSBiYXNlZAorCSAqIHdyaXRlIGZsb3cgY29udHJvbCAqLwkJCisJaWYgKGUxaV90cy0+dHlwZSA9PSBFMUlOUF9UU19UWVBFX1RSQVUpCisJCXJldHVybiAwOworCisJZTFpX3RzLT5kcml2ZXIubWlzZG4uZmQud2hlbiB8PSBCU0NfRkRfV1JJVEU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGltZW91dF90czFfd3JpdGUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9IChzdHJ1Y3QgZTFpbnBfdHMgKilkYXRhOworCisJLyogdHJpZ2dlciB3cml0ZSBvZiB0czEsIGR1ZSB0byB0eCBkZWxheSB0aW1lciAqLworCXRzX3dhbnRfd3JpdGUoZTFpX3RzKTsKK30KKworc3RhdGljIGludCBoYW5kbGVfdHMxX3dyaXRlKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbdHNfbnItMV07CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqc2lnbl9saW5rOworCXN0cnVjdCBzb2NrYWRkcl9tSVNETiBzYTsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXN0cnVjdCBtSVNETmhlYWQgKmhoOworCXVfaW50OF90ICpsMl9kYXRhOworCWludCByZXQ7CisKKwliZmQtPndoZW4gJj0gfkJTQ19GRF9XUklURTsKKworCS8qIGdldCB0aGUgbmV4dCBtc2cgZm9yIHRoaXMgdGltZXNsb3QgKi8KKwltc2cgPSBlMWlucF90eF90cyhlMWlfdHMsICZzaWduX2xpbmspOworCWlmICghbXNnKSB7CisJCS8qIG5vIG1lc3NhZ2UgYWZ0ZXIgdHggZGVsYXkgdGltZXIgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJbDJfZGF0YSA9IG1zZy0+ZGF0YTsKKworCS8qIHByZXBlbmQgdGhlIG1JU0ROaGVhZCAqLworCWhoID0gKHN0cnVjdCBtSVNETmhlYWQgKikgbXNnYl9wdXNoKG1zZywgc2l6ZW9mKCpoaCkpOworCWhoLT5wcmltID0gRExfREFUQV9SRVE7CisKKwlERUJVR1AoRE1JLCAiVFggVEVJKCVkKSBTQVBJKCVkKTogJXNcbiIsIHNpZ25fbGluay0+dGVpLAorCQlzaWduX2xpbmstPnNhcGksIGhleGR1bXAobDJfZGF0YSwgbXNnLT5sZW4gLSBNSVNETl9IRUFERVJfTEVOKSk7CisKKwkvKiBjb25zdHJ1Y3QgdGhlIHNvY2thZGRyICovCisJc2EuZmFtaWx5ID0gQUZfSVNETjsKKwlzYS5zYXBpID0gc2lnbl9saW5rLT5zYXBpOworCXNhLmRldiA9IHNpZ25fbGluay0+dGVpOworCXNhLmNoYW5uZWwgPSBzaWduX2xpbmstPmRyaXZlci5taXNkbi5jaGFubmVsOworCisJcmV0ID0gc2VuZHRvKGJmZC0+ZmQsIG1zZy0+ZGF0YSwgbXNnLT5sZW4sIDAsCisJCSAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgc2l6ZW9mKHNhKSk7CisJaWYgKHJldCA8IDApCisJCWZwcmludGYoc3RkZXJyLCAiJXMgc2VuZHRvIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJbXNnYl9mcmVlKG1zZyk7CisKKwkvKiBzZXQgdHggZGVsYXkgdGltZXIgZm9yIG5leHQgZXZlbnQgKi8KKwllMWlfdHMtPnNpZ24udHhfdGltZXIuY2IgPSB0aW1lb3V0X3RzMV93cml0ZTsKKwllMWlfdHMtPnNpZ24udHhfdGltZXIuZGF0YSA9IGUxaV90czsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmUxaV90cy0+c2lnbi50eF90aW1lciwgMCwgNTAwMDApOworCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBCQ0hBTl9UWF9HUkFOCTE2MAorLyogd3JpdGUgdG8gYSBCIGNoYW5uZWwgVFMgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3RzWF93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW3RzX25yLTFdOworCXN0cnVjdCBtSVNETmhlYWQgKmhoOworCXVfaW50OF90IHR4X2J1ZltCQ0hBTl9UWF9HUkFOICsgc2l6ZW9mKCpoaCldOworCXN0cnVjdCBzdWJjaF9tdXggKm14ID0gJmUxaV90cy0+dHJhdS5tdXg7CisJaW50IHJldDsKKworCWhoID0gKHN0cnVjdCBtSVNETmhlYWQgKikgdHhfYnVmOworCWhoLT5wcmltID0gUEhfREFUQV9SRVE7CisKKwlzdWJjaGFuX211eF9vdXQobXgsIHR4X2J1ZitzaXplb2YoKmhoKSwgQkNIQU5fVFhfR1JBTik7CisKKwlERUJVR1AoRE1JQiwgIkJDSEFOIFRYOiAlc1xuIiwKKwkJaGV4ZHVtcCh0eF9idWYrc2l6ZW9mKCpoaCksIEJDSEFOX1RYX0dSQU4pKTsKKworCXJldCA9IHNlbmQoYmZkLT5mZCwgdHhfYnVmLCBzaXplb2YoKmhoKSArIEJDSEFOX1RYX0dSQU4sIDApOworCWlmIChyZXQgPCBzaXplb2YoKmhoKSArIEJDSEFOX1RYX0dSQU4pCisJCURFQlVHUChETUlCLCAic2VuZCByZXR1cm5zICVkIGluc3RlYWQgb2YgJWx1XG4iLCByZXQsCisJCQlzaXplb2YoKmhoKSArIEJDSEFOX1RYX0dSQU4pOworCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBUU1hfQUxMT0NfU0laRSA0MDk2CisvKiBGSVhNRTogcmVhZCBmcm9tIGEgQiBjaGFubmVsIFRTICovCitzdGF0aWMgaW50IGhhbmRsZV90c1hfcmVhZChzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW3RzX25yLTFdOworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKFRTWF9BTExPQ19TSVpFLCAibUlTRE4gVFN4Iik7CisJc3RydWN0IG1JU0ROaGVhZCAqaGg7CisJaW50IHJldDsKKworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhoID0gKHN0cnVjdCBtSVNETmhlYWQgKikgbXNnLT5kYXRhOworCisJcmV0ID0gcmVjdihiZmQtPmZkLCBtc2ctPmRhdGEsIFRTWF9BTExPQ19TSVpFLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInJlY3Zmcm9tIGVycm9yICAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltc2diX3B1dChtc2csIHJldCk7CisKKwlpZiAoaGgtPnByaW0gIT0gUEhfQ09OVFJPTF9JTkQpCisJCURFQlVHUChETUlCLCAiPD0gQkNIQU4gbGVuID0gJWQsIHByaW0oMHgleCkgaWQoMHgleCk6ICVzXG4iLAorCQkJcmV0LCBoaC0+cHJpbSwgaGgtPmlkLCBnZXRfcHJpbV9uYW1lKGhoLT5wcmltKSk7CisKKwlzd2l0Y2ggKGhoLT5wcmltKSB7CisJY2FzZSBQSF9EQVRBX0lORDoKKwkJbXNnLT5sMmggPSBtc2ctPmRhdGEgKyBNSVNETl9IRUFERVJfTEVOOworCQlERUJVR1AoRE1JQiwgIkJDSEFOIFJYOiAlc1xuIiwKKwkJCWhleGR1bXAobXNnYl9sMihtc2cpLCByZXQgLSBNSVNETl9IRUFERVJfTEVOKSk7CisJCXJldCA9IGUxaW5wX3J4X3RzKGUxaV90cywgbXNnLCAwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBQSF9BQ1RJVkFURV9JTkQ6CisJY2FzZSBQSF9EQVRBX0NORjoKKwkJLyogcGh5c2ljYWwgbGF5ZXIgaW5kaWNhdGVzIHRoYXQgZGF0YSBoYXMgYmVlbiBzZW50LAorCQkgKiB3ZSB0aHVzIGNhbiBzZW5kIHNvbWUgbW9yZSBkYXRhICovCisJCXJldCA9IGhhbmRsZV90c1hfd3JpdGUoYmZkKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJLyogRklYTUU6IHdoeSBkbyB3ZSBmcmVlIHNpZ25hbGxpbmcgbXNncyBpbiB0aGUgY2FsbGVyLCBhbmQgdHJhdSBub3Q/ICovCisJbXNnYl9mcmVlKG1zZyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBjYWxsYmFjayBmcm9tIHNlbGVjdC5jIGluIGNhc2Ugb25lIG9mIHRoZSBmZCdzIGNhbiBiZSByZWFkL3dyaXR0ZW4gKi8KK3N0YXRpYyBpbnQgbWlzZG5fZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJdW5zaWduZWQgaW50IGlkeCA9IHRzX25yLTE7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbaWR4XTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChlMWlfdHMtPnR5cGUpIHsKKwljYXNlIEUxSU5QX1RTX1RZUEVfU0lHTjoKKwkJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkKKwkJCXJjID0gaGFuZGxlX3RzMV9yZWFkKGJmZCk7CisJCWlmICh3aGF0ICYgQlNDX0ZEX1dSSVRFKQorCQkJcmMgPSBoYW5kbGVfdHMxX3dyaXRlKGJmZCk7CisJCWJyZWFrOworCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKQorCQkJcmMgPSBoYW5kbGVfdHNYX3JlYWQoYmZkKTsKKwkJLyogV2UgbmV2ZXIgaW5jbHVkZSB0aGUgbUlTRE4gQi1DaGFubmVsIEZEIGludG8gdGhlCisJCSAqIHdyaXRlc2V0LCBzaW5jZSBpdCBkb2Vzbid0IHN1cHBvcnQgcG9sbCgpIGJhc2VkCisJCSAqIHdyaXRlIGZsb3cgY29udHJvbCAqLwkJCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAidW5rbm93biBFMSBUUyB0eXBlICV1XG4iLCBlMWlfdHMtPnR5cGUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYWN0aXZhdGVfYmNoYW4oc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIGludCB0cywgaW50IGFjdCkKK3sKKwlzdHJ1Y3QgbUlTRE5oZWFkIGhoOworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGlkeCA9IHRzLTE7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbaWR4XTsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQgPSAmZTFpX3RzLT5kcml2ZXIubWlzZG4uZmQ7CisKKwlmcHJpbnRmKHN0ZG91dCwgImFjdGl2YXRlIGJjaGFuXG4iKTsKKwlpZiAoYWN0KQorCQloaC5wcmltID0gUEhfQUNUSVZBVEVfUkVROworCWVsc2UKKwkJaGgucHJpbSA9IFBIX0RFQUNUSVZBVEVfUkVROworCisJaGguaWQgPSBNSVNETl9JRF9BTlk7CisJcmV0ID0gc2VuZHRvKGJmZC0+ZmQsICZoaCwgc2l6ZW9mKGhoKSwgMCwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRvdXQsICJjb3VsZCBub3Qgc2VuZCBBQ1RJVkFURV9SUSAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IGUxaW5wX2RyaXZlciBtaXNkbl9kcml2ZXIgPSB7CisJLm5hbWUgPSAibUlTRE51c2VyIiwKKwkud2FudF93cml0ZSA9IHRzX3dhbnRfd3JpdGUsCit9OworCitzdGF0aWMgaW50IG1pX2UxX3NldHVwKHN0cnVjdCBlMWlucF9saW5lICpsaW5lLCBpbnQgcmVsZWFzZV9sMikKK3sKKwlpbnQgdHMsIHJldDsKKworCS8qIFRTMCBpcyBDUkM0LCBkb24ndCBuZWVkIGFueSBmZCBmb3IgaXQgKi8KKwlmb3IgKHRzID0gMTsgdHMgPCBOVU1fRTFfVFM7IHRzKyspIHsKKwkJdW5zaWduZWQgaW50IGlkeCA9IHRzLTE7CisJCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW2lkeF07CisJCXN0cnVjdCBic2NfZmQgKmJmZCA9ICZlMWlfdHMtPmRyaXZlci5taXNkbi5mZDsKKwkJc3RydWN0IHNvY2thZGRyX21JU0ROIGFkZHI7CisKKwkJYmZkLT5kYXRhID0gbGluZTsKKwkJYmZkLT5wcml2X25yID0gdHM7CisJCWJmZC0+Y2IgPSBtaXNkbl9mZF9jYjsKKworCQlzd2l0Y2ggKGUxaV90cy0+dHlwZSkgeworCQljYXNlIEUxSU5QX1RTX1RZUEVfTk9ORToKKwkJCWNvbnRpbnVlOworCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfVFNfVFlQRV9TSUdOOgorCQkJYmZkLT5mZCA9IHNvY2tldChQRl9JU0ROLCBTT0NLX0RHUkFNLCBJU0ROX1BfTEFQRF9OVCk7CisJCQliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwkJCWJyZWFrOworCQljYXNlIEUxSU5QX1RTX1RZUEVfVFJBVToKKwkJCWJmZC0+ZmQgPSBzb2NrZXQoUEZfSVNETiwgU09DS19ER1JBTSwgSVNETl9QX0JfUkFXKTsKKwkJCS8qIFdlIG5ldmVyIGluY2x1ZGUgdGhlIG1JU0ROIEItQ2hhbm5lbCBGRCBpbnRvIHRoZQorCSAJCSogd3JpdGVzZXQsIHNpbmNlIGl0IGRvZXNuJ3Qgc3VwcG9ydCBwb2xsKCkgYmFzZWQKKwkgCQkqIHdyaXRlIGZsb3cgY29udHJvbCAqLwkJCisJCQliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGJmZC0+ZmQgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGNvdWxkIG5vdCBvcGVuIHNvY2tldCAlc1xuIiwKKwkJCQlfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiBiZmQtPmZkOworCQl9CisKKwkJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCQlhZGRyLmZhbWlseSA9IEFGX0lTRE47CisJCWFkZHIuZGV2ID0gbGluZS0+bnVtOworCQlzd2l0Y2ggKGUxaV90cy0+dHlwZSkgeworCQljYXNlIEUxSU5QX1RTX1RZUEVfU0lHTjoKKwkJCWFkZHIuY2hhbm5lbCA9IDA7CisJCQkvKiBTQVBJIG5vdCBzdXBwb3J0ZWQgeWV0IGluIGtlcm5lbCAqLworCQkJLy9hZGRyLnNhcGkgPSBlMWlucF90cy0+c2lnbi5zYXBpOworCQkJYWRkci5zYXBpID0gMDsKKwkJCWFkZHIudGVpID0gR1JPVVBfVEVJOworCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQkJYWRkci5jaGFubmVsID0gdHM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURFQlVHUChETUksICJ1bnN1cHBvcnRlZCBFMSBUUyB0eXBlOiAldVxuIiwKKwkJCQllMWlfdHMtPnR5cGUpOworCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSBiaW5kKGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBiaW5kIGwyIHNvY2tldCAlc1xuIiwKKwkJCQlzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlpZiAoZTFpX3RzLT50eXBlID09IEUxSU5QX1RTX1RZUEVfU0lHTikgeworCQkJcmV0ID0gaW9jdGwoYmZkLT5mZCwgSU1DTEVBUl9MMiwgJnJlbGVhc2VfbDIpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBzZW5kIElPQ1RMIElNQ0xFQU5fTDIgJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKworCQkvKiBGSVhNRTogb25seSBhY3RpdmF0ZSBCLUNoYW5uZWxzIG9uY2Ugd2Ugc3RhcnQgdG8KKwkJICogdXNlIHRoZW0gdG8gY29uc2VydmUgQ1BVIHBvd2VyICovCisJCWlmIChlMWlfdHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9UUkFVKQorCQkJYWN0aXZhdGVfYmNoYW4obGluZSwgdHMsIDEpOworCisJCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCQlpZiAocmV0IDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgcmVnaXN0ZXIgRkQ6ICVzXG4iLAorCQkJCXN0cmVycm9yKHJldCkpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQgbWlfZTFfbGluZV91cGRhdGUoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUpCit7CisJc3RydWN0IG1JU0ROX2RldmluZm8gZGV2aW5mbzsKKwlpbnQgc2ssIHJldCwgY250OworCisJaWYgKCFsaW5lLT5kcml2ZXIpIHsKKwkJLyogdGhpcyBtdXN0IGJlIHRoZSBmaXJzdCB1cGRhdGUgKi8KKwkJbGluZS0+ZHJpdmVyID0gJm1pc2RuX2RyaXZlcjsKKwl9IGVsc2UgeworCQkvKiB0aGlzIGlzIGEgc3Vic2VxdWVudCB1cGRhdGUgKi8KKwkJLyogRklYTUU6IGZpcnN0IGNsb3NlIGFsbCBzb2NrZXRzICovCisJCWZwcmludGYoc3RkZXJyLCAiaW5jcmVtZW50YWwgbGluZSB1cGRhdGVzIG5vdCBzdXBwb3J0ZWQgeWV0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxpbmUtPmRyaXZlciAhPSAmbWlzZG5fZHJpdmVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIG9wZW4gdGhlIElTRE4gY2FyZCBkZXZpY2UgKi8KKwlzayA9IHNvY2tldChQRl9JU0ROLCBTT0NLX1JBVywgSVNETl9QX0JBU0UpOworCWlmIChzayA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlcyBjb3VsZCBub3Qgb3BlbiBzb2NrZXQgJXNcbiIsCisJCQlfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIHNrOworCX0KKworCXJldCA9IGlvY3RsKHNrLCBJTUdFVENPVU5ULCAmY250KTsKKwlpZiAocmV0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXMgZXJyb3IgZ2V0dGluZyBpbnRlcmYgY291bnQ6ICVzXG4iLAorCQkJX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKHNrKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8vREVCVUdQKERNSSwiJWQgZGV2aWNlJXMgZm91bmRcbiIsIGNudCwgKGNudD09MSk/IiI6InMiKTsKKwlwcmludGYoIiVkIGRldmljZSVzIGZvdW5kXG4iLCBjbnQsIChjbnQ9PTEpPyIiOiJzIik7CisjaWYgMQorCWRldmluZm8uaWQgPSBsaW5lLT5udW07CisJcmV0ID0gaW9jdGwoc2ssIElNR0VUREVWSU5GTywgJmRldmluZm8pOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3Rkb3V0LCAiZXJyb3IgZ2V0dGluZyBpbmZvIGZvciBkZXZpY2UgJWQ6ICVzXG4iLAorCQkJbGluZS0+bnVtLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZnByaW50ZihzdGRvdXQsICIgICAgICAgIGlkOiAgICAgICAgICAgICAlZFxuIiwgZGV2aW5mby5pZCk7CisJZnByaW50ZihzdGRvdXQsICIgICAgICAgIERwcm90b2NvbHM6ICAgICAlMDh4XG4iLCBkZXZpbmZvLkRwcm90b2NvbHMpOworCWZwcmludGYoc3Rkb3V0LCAiICAgICAgICBCcHJvdG9jb2xzOiAgICAgJTA4eFxuIiwgZGV2aW5mby5CcHJvdG9jb2xzKTsKKwlmcHJpbnRmKHN0ZG91dCwgIiAgICAgICAgcHJvdG9jb2w6ICAgICAgICVkXG4iLCBkZXZpbmZvLnByb3RvY29sKTsKKwlmcHJpbnRmKHN0ZG91dCwgIiAgICAgICAgbnJiY2hhbjogICAgICAgICVkXG4iLCBkZXZpbmZvLm5yYmNoYW4pOworCWZwcmludGYoc3Rkb3V0LCAiICAgICAgICBuYW1lOiAgICAgICAgICAgJXNcbiIsIGRldmluZm8ubmFtZSk7CisjZW5kaWYKKworCWlmICghKGRldmluZm8uRHByb3RvY29scyAmICgxIDw8IElTRE5fUF9OVF9FMSkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGNhcmQgaXMgbm90IG9mIHR5cGUgRTEgKE5ULW1vZGUpXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gbWlfZTFfc2V0dXAobGluZSwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkX3Ntcyh2b2lkKQoreworCS8qIHJlZ2lzdGVyIHRoZSBkcml2ZXIgd2l0aCB0aGUgY29yZSAqLworCWUxaW5wX2RyaXZlcl9yZWdpc3RlcigmbWlzZG5fZHJpdmVyKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWNvbmZpZy5jIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwZTNmMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWNvbmZpZy5jCkBAIC0wLDAgKzEsNzM1IEBACisvKiBpcC5hY2Nlc3MgbmFub0JUUyBjb25maWd1cmF0aW9uIHRvb2wgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiAoQykgMjAwOSBieSBPbiBXYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RpbWVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9pcGFjY2Vzcy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldDsKKworc3RhdGljIGludCBuZXRfbGlzdGVuX3Rlc3RucjsKK3N0YXRpYyBpbnQgcmVzdGFydDsKK3N0YXRpYyBjaGFyICpwcmltX29tbF9pcDsKK3N0YXRpYyBjaGFyICp1bml0X2lkOworc3RhdGljIHVfaW50MTZfdCBudl9mbGFnczsKK3N0YXRpYyB1X2ludDE2X3QgbnZfbWFzazsKK3N0YXRpYyBjaGFyICpzb2Z0d2FyZSA9IE5VTEw7CitzdGF0aWMgaW50IHN3X2xvYWRfc3RhdGUgPSAwOworc3RhdGljIGludCBvbWxfc3RhdGUgPSAwOworc3RhdGljIGludCBkdW1wX2ZpbGVzID0gMDsKK3N0YXRpYyBjaGFyICpmaXJtd2FyZV9hbmFseXNpcyA9IE5VTEw7CisKK3N0cnVjdCBzd19sb2FkIHsKKwl1X2ludDhfdCBmaWxlX2lkWzI1NV07CisJdV9pbnQ4X3QgZmlsZV9pZF9sZW47CisKKwl1X2ludDhfdCBmaWxlX3ZlcnNpb25bMjU1XTsKKwl1X2ludDhfdCBmaWxlX3ZlcnNpb25fbGVuOworfTsKKworc3RhdGljIHZvaWQgKnRhbGxfY3R4X2NvbmZpZyA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHN3X2xvYWQgKnN3X2xvYWQxID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3Qgc3dfbG9hZCAqc3dfbG9hZDIgPSBOVUxMOworCisvKgorc3RhdGljIHVfaW50OF90IHByaW1fb21sX2F0dHJbXSA9IHsgMHg5NSwgMHgwMCwgNywgMHg4OCwgMTkyLCAxNjgsIDEwMCwgMTEsIDB4MDAsIDB4MDAgfTsKK3N0YXRpYyB1X2ludDhfdCB1bml0X2lkX2F0dHJbXSA9IHsgMHg5MSwgMHgwMCwgOSwgJzInLCAnMycsICc0JywgJzInLCAnLycgLCAnMCcsICcvJywgJzAnLCAweDAwIH07CisqLworCisvKgorICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIE5BQ0sgb24gdGhlIE9NTCBOTQorICoKKyAqIEN1cnJlbnRseSB3ZSBzZW5kIHRoZSBjb25maWcgcmVxdWVzdHMgYnV0IGRvbid0IGNoZWNrIHRoZQorICogcmVzdWx0LiBUaGUgbmFub0JUUyB3aWxsIHNlbmQgdXMgYSBOQUNLIHdoZW4gd2UgZGlkIHNvbWV0aGluZyB0aGUKKyAqIEJUUyBkaWRuJ3QgbGlrZS4KKyAqLworc3RhdGljIGludCBpcGFjY19tc2dfbmFjayh1X2ludDhfdCBtdCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIkZhaWx1cmUgdG8gc2V0IGF0dHJpYnV0ZS4gVGhpcyBzZWVtcyBmYXRhbFxuIik7CisJZXhpdCgtMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXBhY2NfbXNnX2Fjayh1X2ludDhfdCBtdCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlpZiAoc3dfbG9hZF9zdGF0ZSA9PSAxKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVGhlIG5ldyBzb2Z0d2FyZSBpcyBhY3RpdmFlZC5cbiIpOworCisJCWlmIChyZXN0YXJ0KSB7CisJCQlhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQoYnRzKTsKKwkJfSBlbHNlIHsKKwkJCWV4aXQoMCk7CisJCX0KKwl9IGVsc2UgaWYgKG9tbF9zdGF0ZSA9PSAxKSB7CisJCWZwcmludGYoc3RkZXJyLCAiU2V0IHRoZSBwcmltYXJ5IE9NTCBJUC5cbiIpOworCQlpZiAocmVzdGFydCkgeworCQkJYWJpc19ubV9pcGFjY2Vzc19yZXN0YXJ0KGJ0cyk7CisJCX0gZWxzZSB7CisJCQlleGl0KDApOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpcGFjY19mZXJyX2VsZW0geworCWludDE2X3QgZnJlcV9lcnI7CisJdV9pbnQ4X3QgZnJlcV9xdWFsOworCXVfaW50OF90IGFyZmNuOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGlwYWNjX2N1c2FnZV9lbGVtIHsKKwl1X2ludDE2X3QgYXJmY246MTAsCisJCSAgcnhsZXY6NjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgaW50IHRlc3RfcmVwKHZvaWQgKl9tc2cpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IF9tc2c7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtc2cpOworCXVfaW50MTZfdCB0ZXN0X3JlcF9sZW4sIGZlcnJfbGlzdF9sZW47CisJc3RydWN0IGlwYWNjX2ZlcnJfZWxlbSAqaWZlOworCXN0cnVjdCBpcGFjX2JjY2hfaW5mbyBiaW5mbzsKKwlpbnQgaSwgcmM7CisKKwlERUJVR1AoRE5NLCAiVEVTVCBSRVBPUlQ6ICIpOworCisJaWYgKGZvaC0+ZGF0YVswXSAhPSBOTV9BVFRfVEVTVF9OTyB8fAorCSAgICBmb2gtPmRhdGFbMl0gIT0gTk1fQVRUX1RFU1RfUkVQT1JUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCURFQlVHUEMoRE5NLCAidGVzdF9ubz0weCUwMnggIiwgZm9oLT5kYXRhWzFdKTsKKwkvKiBkYXRhWzJdID09IE5NX0FUVF9URVNUX1JFUE9SVCAqLworCS8qIGRhdGFbMy4uNF06IHRlc3RfcmVwX2xlbiAqLworCXRlc3RfcmVwX2xlbiA9IG50b2hzKCoodV9pbnQxNl90ICopICZmb2gtPmRhdGFbM10pOworCS8qIGRhdGFbNV06IGlwLmFjY2VzcyB0ZXN0IHJlc3VsdCAqLworCURFQlVHUEMoRE5NLCAidGVzdF9yZXM9JXNcbiIsIGlwYWNjX3Rlc3RyZXNfbmFtZShmb2gtPmRhdGFbNV0pKTsKKworCS8qIGRhdGFbNl06IGlwLmFjY2VzcyBuZXN0ZWQgSUUuIDMgPT0gZnJlcV9lcnJfbGlzdCAqLworCXN3aXRjaCAoZm9oLT5kYXRhWzZdKSB7CisJY2FzZSBOTV9JUEFDX0VJRV9GUkVRX0VSUl9MSVNUOgorCQkvKiBkYXRhWzcuLjhdOiBsZW5ndGggb2YgZmVycl9saXN0ICovCisJCWZlcnJfbGlzdF9sZW4gPSBudG9ocygqKHVfaW50MTZfdCAqKSAmZm9oLT5kYXRhWzddKTsKKworCQkvKiBkYXRhWzkuLi5dOiBmcmVxdWVuY3kgZXJyb3IgbGlzdCBlbGVtZW50cyAqLworCQlmb3IgKGkgPSAwOyBpIDwgZmVycl9saXN0X2xlbjsgaSs9IHNpemVvZigqaWZlKSkgeworCQkJaWZlID0gKHN0cnVjdCBpcGFjY19mZXJyX2VsZW0gKikgKGZvaC0+ZGF0YSArIDkgKyBpKTsKKwkJCURFQlVHUChETk0sICI9PT4gQVJGQ04gJTR1LCBGcmVxdWVuY3kgRXJyb3IgJTZoZFxuIiwKKwkJCWlmZS0+YXJmY24sIG50b2hzKGlmZS0+ZnJlcV9lcnIpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX0lQQUNfRUlFX0NIQU5fVVNFX0xJU1Q6CisJCS8qIGRhdGFbNy4uOF06IGxlbmd0aCBvZiBmZXJyX2xpc3QgKi8KKwkJZmVycl9saXN0X2xlbiA9IG50b2hzKCoodV9pbnQxNl90ICopICZmb2gtPmRhdGFbN10pOworCisJCS8qIGRhdGFbOS4uLl06IGNoYW5uZWwgdXNhZ2UgbGlzdCBlbGVtZW50cyAqLworCQlmb3IgKGkgPSAwOyBpIDwgZmVycl9saXN0X2xlbjsgaSs9IDIpIHsKKwkJCXVfaW50MTZfdCAqY3VfcHRyID0gKHVfaW50MTZfdCAqKShmb2gtPmRhdGEgKyA5ICsgaSk7CisJCQl1X2ludDE2X3QgY3UgPSBudG9ocygqY3VfcHRyKTsKKwkJCURFQlVHUChETk0sICI9PT4gQVJGQ04gJTR1LCBSeExldiAlMnVcbiIsCisJCQkJY3UgJiAweDNmZiwgY3UgPj4gMTApOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fSVBBQ19FSUVfQkNDSF9JTkZPX1RZUEU6CisJCWJyZWFrOworCWNhc2UgTk1fSVBBQ19FSUVfQkNDSF9JTkZPOgorCQlyYyA9IGlwYWNfcGFyc2VfYmNjaF9pbmZvKCZiaW5mbywgZm9oLT5kYXRhKzYpOworCQlpZiAocmMgPCAwKSB7CisJCQlERUJVR1AoRE5NLCAiQkNDSCBJbmZvIHBhcnNpbmcgZmFpbGVkXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCURFQlVHUChETk0sICI9PT4gQVJGQ04gJXUsIFJ4TGV2ICUydSwgUnhRdWFsICUydTogJTNkLSVkLCBMQUMgJWQgQ0kgJWRcbiIsCisJCQliaW5mby5hcmZjbiwgYmluZm8ucnhfbGV2LCBiaW5mby5yeF9xdWFsLAorCQkJYmluZm8uY2dpLm1jYywgYmluZm8uY2dpLm1uYywKKwkJCWJpbmZvLmNnaS5sYWMsIGJpbmZvLmNnaS5jaSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5tX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkgICAgIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGlwYWNjX2Fja19zaWduYWxfZGF0YSAqaXBhY2NfZGF0YTsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTX05NX0lQQUNDX05BQ0s6CisJCWlwYWNjX2RhdGEgPSBzaWduYWxfZGF0YTsKKwkJcmV0dXJuIGlwYWNjX21zZ19uYWNrKGlwYWNjX2RhdGEtPm1zZ190eXBlKTsKKwljYXNlIFNfTk1fSVBBQ0NfQUNLOgorCQlpcGFjY19kYXRhID0gc2lnbmFsX2RhdGE7CisJCXJldHVybiBpcGFjY19tc2dfYWNrKGlwYWNjX2RhdGEtPm1zZ190eXBlLCBpcGFjY19kYXRhLT5idHMpOworCWNhc2UgU19OTV9URVNUX1JFUDoKKwkJcmV0dXJuIHRlc3RfcmVwKHNpZ25hbF9kYXRhKTsKKwljYXNlIFNfTk1fSVBBQ0NfUkVTVEFSVF9BQ0s6CisJCXByaW50ZigiVGhlIEJUUyBoYXMgYWNrZWQgdGhlIHJlc3RhcnQuIEV4aXRpbmcuXG4iKTsKKwkJZXhpdCgwKTsKKwkJYnJlYWs7CisJY2FzZSBTX05NX0lQQUNDX1JFU1RBUlRfTkFDSzoKKwkJcHJpbnRmKCJUaGUgQlRTIGhhcyBuYWNrZWQgdGhlIHJlc3RhcnQuIEV4aXRpbmcuXG4iKTsKKwkJZXhpdCgwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxiYWNrIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgQUJJUyBPTUwgY29kZSAqLworc3RhdGljIGludCBwZXJjZW50Oworc3RhdGljIGludCBwZXJjZW50X29sZDsKK3N0YXRpYyBpbnQgc3dsb2FkX2NiZm4odW5zaWduZWQgaW50IGhvb2ssIHVuc2lnbmVkIGludCBldmVudCwgc3RydWN0IG1zZ2IgKl9tc2csCisJCSAgICAgICB2b2lkICpkYXRhLCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlpZiAoaG9vayAhPSBHU01fSE9PS19OTV9TV0xPQUQpCisJCXJldHVybiAwOworCisJYnRzID0gKHN0cnVjdCBnc21fYnRzICopIGRhdGE7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBOTV9NVF9MT0FEX0lOSVRfQUNLOgorCQlmcHJpbnRmKHN0ZG91dCwgIlNvZnR3YXJlIExvYWQgSW5pdGlhdGUgQUNLXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX0lOSVRfTkFDSzoKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogU29mdHdhcmUgTG9hZCBJbml0aWF0ZSBOQUNLXG4iKTsKKwkJZXhpdCg1KTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX0VORF9BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiTE9BRCBFTkQgQUNLLi4uIik7CisJCS8qIG5vdyBtYWtlIGl0IHRoZSBkZWZhdWx0ICovCisJCXN3X2xvYWRfc3RhdGUgPSAxOworCisJCW1zZyA9IG1zZ2JfYWxsb2MoMTAyNCwgInN3OiBudmF0dHIiKTsKKwkJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIDMpOworCQltc2ctPmwzaCA9ICZtc2ctPmwyaFszXTsKKworCQkvKiBhY3RpdmF0ZSBzb2Z0d2FyZSAqLworCQlpZiAoc3dfbG9hZDEpIHsKKwkJCW1zZ2Jfdl9wdXQobXNnLCBOTV9BVFRfU1dfREVTQ1IpOworCQkJbXNnYl90bDE2dl9wdXQobXNnLCBOTV9BVFRfRklMRV9JRCwgc3dfbG9hZDEtPmZpbGVfaWRfbGVuLCBzd19sb2FkMS0+ZmlsZV9pZCk7CisJCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9GSUxFX1ZFUlNJT04sIHN3X2xvYWQxLT5maWxlX3ZlcnNpb25fbGVuLAorCQkJCQlzd19sb2FkMS0+ZmlsZV92ZXJzaW9uKTsKKwkJfQorCisJCWlmIChzd19sb2FkMikgeworCQkJbXNnYl92X3B1dChtc2csIE5NX0FUVF9TV19ERVNDUik7CisJCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9GSUxFX0lELCBzd19sb2FkMi0+ZmlsZV9pZF9sZW4sIHN3X2xvYWQyLT5maWxlX2lkKTsKKwkJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfVkVSU0lPTiwgc3dfbG9hZDItPmZpbGVfdmVyc2lvbl9sZW4sCisJCQkJCXN3X2xvYWQyLT5maWxlX3ZlcnNpb24pOworCQl9CisKKwkJLyogZmlsbCBpbiB0aGUgZGF0YSAqLworCQltc2ctPmwyaFswXSA9IE5NX0FUVF9JUEFDQ19DVVJfU1dfQ0ZHOworCQltc2ctPmwyaFsxXSA9IG1zZ2JfbDNsZW4obXNnKSA+PiA4OworCQltc2ctPmwyaFsyXSA9IG1zZ2JfbDNsZW4obXNnKSAmIDB4ZmY7CisJCXByaW50ZigiRm9vIGwyaDogJXAgbDNoOiAlcC4uLiBsZW5ndGggbDI6ICV1ICBsMzogJXVcbiIsIG1zZy0+bDJoLCBtc2ctPmwzaCwgbXNnYl9sMmxlbihtc2cpLCBtc2diX2wzbGVuKG1zZykpOworCQlhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIoYnRzLT5jMCwgbXNnLT5sMmgsIG1zZ2JfbDJsZW4obXNnKSk7CisJCW1zZ2JfZnJlZShtc2cpOworCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfRU5EX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IFNvZnR3YXJlIExvYWQgRW5kIE5BQ0tcbiIpOworCQlleGl0KDMpOworCQlicmVhazsKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IEFjdGl2YXRlIFNvZnR3YXJlIE5BQ0tcbiIpOworCQlleGl0KDQpOworCQlicmVhazsKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX0FDSzoKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX1NFR19BQ0s6CisJCXBlcmNlbnQgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWRfc3RhdHVzKGJ0cyk7CisJCWlmIChwZXJjZW50ID4gcGVyY2VudF9vbGQpCisJCQlwcmludGYoIlNvZnR3YXJlIERvd25sb2FkIFByb2dyZXNzOiAlZCUlXG4iLCBwZXJjZW50KTsKKwkJcGVyY2VudF9vbGQgPSBwZXJjZW50OworCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfQUJPUlQ6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IExvYWQgYWJvcnRlZCBieSB0aGUgQlRTLlxuIik7CisJCWV4aXQoNik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm9vdHN0cmFwX29tKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaW50IGxlbjsKKwlzdGF0aWMgdV9pbnQ4X3QgYnVmWzEwMjRdOworCXVfaW50OF90ICpjdXIgPSBidWY7CisKKwlwcmludGYoIk9NTCBsaW5rIGVzdGFibGlzaGVkXG4iKTsKKworCWlmICh1bml0X2lkKSB7CisJCWxlbiA9IHN0cmxlbih1bml0X2lkKTsKKwkJaWYgKGxlbiA+IHNpemVvZihidWYpLTEwKQorCQkJcmV0dXJuOworCQlidWZbMF0gPSBOTV9BVFRfSVBBQ0NfVU5JVF9JRDsKKwkJYnVmWzFdID0gKGxlbisxKSA+PiA4OworCQlidWZbMl0gPSAobGVuKzEpICYgMHhmZjsKKwkJbWVtY3B5KGJ1ZiszLCB1bml0X2lkLCBsZW4pOworCQlidWZbMytsZW5dID0gMDsKKwkJcHJpbnRmKCJzZXR0aW5nIFVuaXQgSUQgdG8gJyVzJ1xuIiwgdW5pdF9pZCk7CisJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X252YXR0cihidHMtPmMwLCBidWYsIDMrbGVuKzEpOworCX0KKwlpZiAocHJpbV9vbWxfaXApIHsKKwkJc3RydWN0IGluX2FkZHIgaWE7CisKKwkJaWYgKCFpbmV0X2F0b24ocHJpbV9vbWxfaXAsICZpYSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBJUCBhZGRyZXNzOiAlc1xuIiwKKwkJCQlwcmltX29tbF9pcCk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiAweDg4ICsgSVAgKyBwb3J0ICovCisJCWxlbiA9IDEgKyBzaXplb2YoaWEpICsgMjsKKworCQkqY3VyKysgPSBOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHX0xJU1Q7CisJCSpjdXIrKyA9IChsZW4pID4+IDg7CisJCSpjdXIrKyA9IChsZW4pICYgMHhmZjsKKwkJKmN1cisrID0gMHg4ODsKKwkJbWVtY3B5KGN1ciwgJmlhLCBzaXplb2YoaWEpKTsKKwkJY3VyICs9IHNpemVvZihpYSk7CisJCSpjdXIrKyA9IDA7CisJCSpjdXIrKyA9IDA7CisJCXByaW50Zigic2V0dGluZyBwcmltYXJ5IE9NTCBsaW5rIElQIHRvICclcydcbiIsIGluZXRfbnRvYShpYSkpOworCQlvbWxfc3RhdGUgPSAxOworCQlhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIoYnRzLT5jMCwgYnVmLCAzK2xlbik7CisJfQorCWlmIChudl9tYXNrKSB7CisJCWxlbiA9IDQ7CisKKwkJKmN1cisrID0gTk1fQVRUX0lQQUNDX05WX0ZMQUdTOworCQkqY3VyKysgPSAobGVuKSA+PiA4OworCQkqY3VyKysgPSAobGVuKSAmIDB4ZmY7CisJCSpjdXIrKyA9IG52X2ZsYWdzICYgMHhmZjsKKwkJKmN1cisrID0gbnZfbWFzayAmIDB4ZmY7CisJCSpjdXIrKyA9IG52X2ZsYWdzID4+IDg7CisJCSpjdXIrKyA9IG52X21hc2sgPj4gODsKKwkJcHJpbnRmKCJzZXR0aW5nIE5WIEZsYWdzL01hc2sgdG8gMHglMDR4LzB4JTA0eFxuIiwKKwkJCW52X2ZsYWdzLCBudl9tYXNrKTsKKwkJYWJpc19ubV9pcGFjY2Vzc19zZXRfbnZhdHRyKGJ0cy0+YzAsIGJ1ZiwgMytsZW4pOworCX0KKworCWlmIChyZXN0YXJ0ICYmICFwcmltX29tbF9pcCAmJiAhc29mdHdhcmUpIHsKKwkJcHJpbnRmKCJyZXN0YXJ0aW5nIEJUU1xuIik7CisJCWFiaXNfbm1faXBhY2Nlc3NfcmVzdGFydChidHMpOworCX0KKworfQorCit2b2lkIGlucHV0X2V2ZW50KGludCBldmVudCwgZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZSwgc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgRVZUX0UxX1RFSV9VUDoKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgRTFJTlBfU0lHTl9PTUw6CisJCQlib290c3RyYXBfb20odHJ4LT5idHMpOworCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfU0lHTl9SU0w6CisJCQkvKiBGSVhNRSAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEVWVF9FMV9URUlfRE46CisJCWZwcmludGYoc3RkZXJyLCAiTG9zdCBzb21lIEUxIFRFSSBsaW5rXG4iKTsKKwkJLyogRklYTUU6IGRlYWwgd2l0aCBURUkgb3IgTDEgbGluayBsb3NzICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworaW50IG5tX3N0YXRlX2V2ZW50KGVudW0gbm1fZXZ0IGV2dCwgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB2b2lkICpvYmosCisJCSAgIHN0cnVjdCBnc21fbm1fc3RhdGUgKm9sZF9zdGF0ZSwgc3RydWN0IGdzbV9ubV9zdGF0ZSAqbmV3X3N0YXRlKQoreworCWlmIChldnQgPT0gRVZUX1NUQVRFQ0hHX09QRVIgJiYKKwkgICAgb2JqX2NsYXNzID09IE5NX09DX1JBRElPX0NBUlJJRVIgJiYKKwkgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gMykgeworCQlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IG9iajsKKworCQlpZiAobmV0X2xpc3Rlbl90ZXN0bnIpIHsKKwkJCXVfaW50OF90IHBoeXNfY29uZmlnW10gPSB7IDB4MDIsIDB4MGEsIDB4MDAsIDB4MDEsIDB4MDIgfTsKKwkJCWFiaXNfbm1fcGVyZm9ybV90ZXN0KHRyeC0+YnRzLCAyLCAwLCAwLCAweGZmLAorCQkJCQkgICAgIG5ldF9saXN0ZW5fdGVzdG5yLCAxLAorCQkJCQkgICAgIHBoeXNfY29uZmlnLCBzaXplb2YocGh5c19jb25maWcpKTsKKwkJfSBlbHNlIGlmIChzb2Z0d2FyZSkgeworCQkJaW50IHJjOworCQkJcHJpbnRmKCJBdHRlbXB0aW5nIHNvZnR3YXJlIHVwbG9hZCB3aXRoICclcydcbiIsIHNvZnR3YXJlKTsKKwkJCXJjID0gYWJpc19ubV9zb2Z0d2FyZV9sb2FkKHRyeC0+YnRzLCBzb2Z0d2FyZSwgMTksIDAsIHN3bG9hZF9jYmZuLCB0cngtPmJ0cyk7CisJCQlpZiAocmMgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gc3RhcnQgc29mdHdhcmUgbG9hZFxuIik7CisJCQkJZXhpdCgtMyk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3dfbG9hZCAqY3JlYXRlX3N3bG9hZChzdHJ1Y3Qgc2RwX2hlYWRlciAqaGVhZGVyKQoreworCXN0cnVjdCBzd19sb2FkICpsb2FkOworCisJbG9hZCA9IHRhbGxvY196ZXJvKHRhbGxfY3R4X2NvbmZpZywgc3RydWN0IHN3X2xvYWQpOworCisJc3RybmNweSgoY2hhciAqKWxvYWQtPmZpbGVfaWQsIGhlYWRlci0+ZmlybXdhcmVfaW5mby5zd19wYXJ0LCAyMCk7CisJbG9hZC0+ZmlsZV9pZF9sZW4gPSBzdHJsZW4oaGVhZGVyLT5maXJtd2FyZV9pbmZvLnN3X3BhcnQpICsgMTsKKworCXN0cm5jcHkoKGNoYXIgKilsb2FkLT5maWxlX3ZlcnNpb24sIGhlYWRlci0+ZmlybXdhcmVfaW5mby52ZXJzaW9uLCAyMCk7CisJbG9hZC0+ZmlsZV92ZXJzaW9uX2xlbiA9IHN0cmxlbihoZWFkZXItPmZpcm13YXJlX2luZm8udmVyc2lvbikgKyAxOworCisJcmV0dXJuIGxvYWQ7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9zd19sb2FkX3BhcmFtcyhjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdGF0OworCXN0cnVjdCBzZHBfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IGxsaXN0X2hlYWQgKmVudHJ5OworCWludCBmZDsKKwl2b2lkICp0YWxsX2Zpcm1fY3R4ID0gMDsKKworCWVudHJ5ID0gdGFsbG9jX3plcm8odGFsbF9maXJtX2N0eCwgc3RydWN0IGxsaXN0X2hlYWQpOworCUlOSVRfTExJU1RfSEVBRChlbnRyeSk7CisKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoIWZkKSB7CisJCXBlcnJvcigibmFkYSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogdmVyaWZ5IHRoZSBmaWxlICovCisJaWYgKGZzdGF0KGZkLCAmc3RhdCkgPT0gLTEpIHsKKwkJcGVycm9yKCJDYW4gbm90IHN0YXQgdGhlIGZpbGUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlwYWNjZXNzX2FuYWx5emVfZmlsZShmZCwgc3RhdC5zdF9zaXplLCAwLCBlbnRyeSk7CisJaWYgKGNsb3NlKGZkKSAhPSAwKSB7CisJCXBlcnJvcigiQ2xvc2UgZmFpbGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiB0cnkgdG8gZmluZCB3aGF0IHdlIGFyZSBsb29raW5nIGZvciAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGhlYWRlciwgZW50cnksIGVudHJ5KSB7CisJCWlmIChudG9ocyhoZWFkZXItPmZpcm13YXJlX2luZm8ubW9yZV9tb3JlX21hZ2ljKSA9PSAweDEwMDApIHsKKwkJCXN3X2xvYWQxID0gY3JlYXRlX3N3bG9hZChoZWFkZXIpOworCQl9IGVsc2UgaWYgKG50b2hzKGhlYWRlci0+ZmlybXdhcmVfaW5mby5tb3JlX21vcmVfbWFnaWMpID09IDB4MjAwMSkgeworCQkJc3dfbG9hZDIgPSBjcmVhdGVfc3dsb2FkKGhlYWRlcik7CisJCX0KKwl9CisKKwlpZiAoIXN3X2xvYWQxIHx8ICFzd19sb2FkMikgeworCQlmcHJpbnRmKHN0ZGVyciwgIkRpZCBub3QgZmluZCBkYXRhLlxuIik7CisJCXRhbGxvY19mcmVlKHRhbGxfZmlybV9jdHgpOworCQlyZXR1cm4gLTE7CisgICAgICAgIH0KKworCXRhbGxvY19mcmVlKHRhbGxfZmlybV9jdHgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2VudHJ5KHN0cnVjdCBzZHBfaGVhZGVyX2l0ZW0gKnN1Yl9lbnRyeSwgaW50IHBhcnQsIGludCBmZCkKK3sKKwlpbnQgb3V0X2ZkOworCWludCBjb3BpZWQ7CisJY2hhciBmaWxlbmFtZVs0MDk2XTsKKwlvZmZfdCB0YXJnZXQ7CisKKwlpZiAoIWR1bXBfZmlsZXMpCisJCXJldHVybjsKKworCWlmIChzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5zb21ldGhpbmcxID09IDApCisJCXJldHVybjsKKworCXNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAicGFydC4lZCIsIHBhcnQrKyk7CisJb3V0X2ZkID0gb3BlbihmaWxlbmFtZSwgT19XUk9OTFkgfCBPX0NSRUFULCAwNjYwKTsKKwlpZiAob3V0X2ZkIDwgMCkgeworCQlwZXJyb3IoIkNhbiBub3QgZHVtcCBmaXJtd2FyZSIpOworCQlyZXR1cm47CisJfQorCisJdGFyZ2V0ID0gc3ViX2VudHJ5LT5hYnNvbHV0ZV9vZmZzZXQgKyBudG9obChzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5zdGFydCkgKyA0OworCWlmIChsc2VlayhmZCwgdGFyZ2V0LCBTRUVLX1NFVCkgIT0gdGFyZ2V0KSB7CisJCXBlcnJvcigic2VlayBmYWlsZWQiKTsKKwkJY2xvc2Uob3V0X2ZkKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoY29waWVkID0gMDsgY29waWVkIDwgbnRvaGwoc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkubGVuZ3RoKTsgKytjb3BpZWQpIHsKKwkJY2hhciBjOworCQlpZiAocmVhZChmZCwgJmMsIHNpemVvZihjKSkgIT0gc2l6ZW9mKGMpKSB7CisJCQlwZXJyb3IoImNvcHkgZmFpbGVkIik7CisJCQlicmVhazsKKwkJfQorCisJCWlmICh3cml0ZShvdXRfZmQsICZjLCBzaXplb2YoYykpICE9IHNpemVvZihjKSkgeworCQkJcGVycm9yKCJ3cml0ZSBmYWlsZWQiKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJY2xvc2Uob3V0X2ZkKTsKK30KKworc3RhdGljIHZvaWQgYW5hbHl6ZV9maXJtd2FyZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdGF0OworCXN0cnVjdCBzZHBfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IHNkcF9oZWFkZXJfaXRlbSAqc3ViX2VudHJ5OworCXN0cnVjdCBsbGlzdF9oZWFkICplbnRyeTsKKwlpbnQgZmQ7CisJdm9pZCAqdGFsbF9maXJtX2N0eCA9IDA7CisJaW50IHBhcnQgPSAwOworCisJZW50cnkgPSB0YWxsb2NfemVybyh0YWxsX2Zpcm1fY3R4LCBzdHJ1Y3QgbGxpc3RfaGVhZCk7CisJSU5JVF9MTElTVF9IRUFEKGVudHJ5KTsKKworCXByaW50ZigiT3BlbmluZyBwb3NzaWJsZSBmaXJtd2FyZSAnJXMnXG4iLCBmaWxlbmFtZSk7CisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKCFmZCkgeworCQlwZXJyb3IoIm5hZGEiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHZlcmlmeSB0aGUgZmlsZSAqLworCWlmIChmc3RhdChmZCwgJnN0YXQpID09IC0xKSB7CisJCXBlcnJvcigiQ2FuIG5vdCBzdGF0IHRoZSBmaWxlIik7CisJCXJldHVybjsKKwl9CisKKwlpcGFjY2Vzc19hbmFseXplX2ZpbGUoZmQsIHN0YXQuc3Rfc2l6ZSwgMCwgZW50cnkpOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoaGVhZGVyLCBlbnRyeSwgZW50cnkpIHsKKwkJcHJpbnRmKCJQcmludGluZyBoZWFkZXIgaW5mb3JtYXRpb246XG4iKTsKKwkJcHJpbnRmKCJtb3JlX21vcmVfbWFnaWM6IDB4JXhcbiIsIG50b2hzKGhlYWRlci0+ZmlybXdhcmVfaW5mby5tb3JlX21vcmVfbWFnaWMpKTsKKwkJcHJpbnRmKCJoZWFkZXJfbGVuZ3RoOiAldVxuIiwgbnRvaGwoaGVhZGVyLT5maXJtd2FyZV9pbmZvLmhlYWRlcl9sZW5ndGgpKTsKKwkJcHJpbnRmKCJmaWxlX2xlbmd0aDogJXVcbiIsIG50b2hsKGhlYWRlci0+ZmlybXdhcmVfaW5mby5maWxlX2xlbmd0aCkpOworCQlwcmludGYoInN3X3BhcnQ6ICUuMjBzXG4iLCBoZWFkZXItPmZpcm13YXJlX2luZm8uc3dfcGFydCk7CisJCXByaW50ZigidGV4dDE6ICUuNjRzXG4iLCBoZWFkZXItPmZpcm13YXJlX2luZm8udGV4dDEpOworCQlwcmludGYoInRpbWU6ICUuMTJzXG4iLCBoZWFkZXItPmZpcm13YXJlX2luZm8udGltZSk7CisJCXByaW50ZigiZGF0ZTogJS4xNHNcbiIsIGhlYWRlci0+ZmlybXdhcmVfaW5mby5kYXRlKTsKKwkJcHJpbnRmKCJ0ZXh0MjogJS4xMHNcbiIsIGhlYWRlci0+ZmlybXdhcmVfaW5mby50ZXh0Mik7CisJCXByaW50ZigidmVyc2lvbjogJS4yMHNcbiIsIGhlYWRlci0+ZmlybXdhcmVfaW5mby52ZXJzaW9uKTsKKwkJcHJpbnRmKCJzdWJpdGVtcy4uLlxuIik7CisKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkoc3ViX2VudHJ5LCAmaGVhZGVyLT5oZWFkZXJfbGlzdCwgZW50cnkpIHsKKwkJCXByaW50ZigiXHRzb21ldGhpbmcxOiAldVxuIiwgc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuc29tZXRoaW5nMSk7CisJCQlwcmludGYoIlx0dGV4dDE6ICUuNjRzXG4iLCBzdWJfZW50cnktPmhlYWRlcl9lbnRyeS50ZXh0MSk7CisJCQlwcmludGYoIlx0dGltZTogJS4xMnNcbiIsIHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnRpbWUpOworCQkJcHJpbnRmKCJcdGRhdGU6ICUuMTRzXG4iLCBzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5kYXRlKTsKKwkJCXByaW50ZigiXHR0ZXh0MjogJS4xMHNcbiIsIHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnRleHQyKTsKKwkJCXByaW50ZigiXHR2ZXJzaW9uOiAlLjIwc1xuIiwgc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkudmVyc2lvbik7CisJCQlwcmludGYoIlx0bGVuZ3RoOiAldVxuIiwgbnRvaGwoc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkubGVuZ3RoKSk7CisJCQlwcmludGYoIlx0YWRkcjE6IDB4JXhcbiIsIG50b2hsKHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LmFkZHIxKSk7CisJCQlwcmludGYoIlx0YWRkcjI6IDB4JXhcbiIsIG50b2hsKHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LmFkZHIyKSk7CisJCQlwcmludGYoIlx0c3RhcnQ6IDB4JXhcbiIsIG50b2hsKHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnN0YXJ0KSk7CisJCQlwcmludGYoIlx0YWJzLiBvZmZzZXQ6IDB4JWx4XG4iLCBzdWJfZW50cnktPmFic29sdXRlX29mZnNldCk7CisJCQlwcmludGYoIlxuXG4iKTsKKworCQkJZHVtcF9lbnRyeShzdWJfZW50cnksIHBhcnQrKywgZmQpOworCQl9CisJCXByaW50ZigiXG5cbiIpOworCX0KKworCWlmIChjbG9zZShmZCkgIT0gMCkgeworCQlwZXJyb3IoIkNsb3NlIGZhaWxlZC5cbiIpOworCQlyZXR1cm47CisJfQorCisJdGFsbG9jX2ZyZWUodGFsbF9maXJtX2N0eCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3VzYWdlKHZvaWQpCit7CisJcHJpbnRmKCJVc2FnZTogaXBhY2Nlc3MtY29uZmlnXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCh2b2lkKQoreworCXByaW50ZigiICAtdSAtLXVuaXQtaWQgVU5JVF9JRFxuIik7CisJcHJpbnRmKCIgIC1vIC0tb21sLWlwIGlwXG4iKTsKKwlwcmludGYoIiAgLXIgLS1yZXN0YXJ0XG4iKTsKKwlwcmludGYoIiAgLW4gZmxhZ3MvbWFza1x0U2V0IE5WUkFNIGF0dHJpYnV0ZXMuXG4iKTsKKwlwcmludGYoIiAgLWwgLS1saXN0ZW4gdGVzdG5yIFx0UGVyZm9ybSBzcGVjaWZpZWQgdGVzdCBudW1iZXJcbiIpOworCXByaW50ZigiICAtaCAtLWhlbHAgdGhpcyB0ZXh0XG4iKTsKKwlwcmludGYoIiAgLXMgLS1zdHJlYW0taWQgSURcbiIpOworCXByaW50ZigiICAtZCAtLXNvZnR3YXJlIGZpcm13YXJlXG4iKTsKKwlwcmludGYoIiAgLWYgLS1maXJtd2FyZSBmaXJtd2FyZSBQcm92aWRlIGZpcm13YXJlIGluZm9ybWF0aW9uXG4iKTsKKwlwcmludGYoIiAgLXcgLS13cml0ZS1maXJtd2FyZS4gVGhpcyB3aWxsIGR1bXAgdGhlIGZpcm13YXJlIHBhcnRzIHRvIHRoZSBmaWxlc3lzdGVtLiBVc2Ugd2l0aCAtZi5cbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCWludCByYywgb3B0aW9uX2luZGV4ID0gMCwgc3RyZWFtX2lkID0gMHhmZjsKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKKworCWxvZ19pbml0KCZsb2dfaW5mbyk7CisJc3RkZXJyX3RhcmdldCA9IGxvZ190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWxvZ19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWxvZ19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKwlsb2dfc2V0X2xvZ19sZXZlbChzdGRlcnJfdGFyZ2V0LCAwKTsKKwlsb2dfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdGRlcnJfdGFyZ2V0LCAiRE5NLDAiKTsKKwlidHNfbW9kZWxfbmFub2J0c19pbml0KCk7CisKKwlwcmludGYoImlwYWNjZXNzLWNvbmZpZyAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGVcbiIpOworCXByaW50ZigiVGhpcyBpcyBGUkVFIFNPRlRXQVJFIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWVxuXG4iKTsKKworCXdoaWxlICgxKSB7CisJCWludCBjOworCQl1bnNpZ25lZCBsb25nIHVsOworCQljaGFyICpzbGFzaDsKKwkJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCQl7ICJ1bml0LWlkIiwgMSwgMCwgJ3UnIH0sCisJCQl7ICJvbWwtaXAiLCAxLCAwLCAnbycgfSwKKwkJCXsgInJlc3RhcnQiLCAwLCAwLCAncicgfSwKKwkJCXsgImhlbHAiLCAwLCAwLCAnaCcgfSwKKwkJCXsgImxpc3RlbiIsIDEsIDAsICdsJyB9LAorCQkJeyAic3RyZWFtLWlkIiwgMSwgMCwgJ3MnIH0sCisJCQl7ICJzb2Z0d2FyZSIsIDEsIDAsICdkJyB9LAorCQkJeyAiZmlybXdhcmUiLCAxLCAwLCAnZicgfSwKKwkJCXsgIndyaXRlLWZpcm13YXJlIiwgMCwgMCwgJ3cnIH0sCisJCX07CisKKwkJYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJ1Om86cm46bDpoczpkOmY6dyIsIGxvbmdfb3B0aW9ucywKKwkJCQkmb3B0aW9uX2luZGV4KTsKKworCQlpZiAoYyA9PSAtMSkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoYykgeworCQljYXNlICd1JzoKKwkJCXVuaXRfaWQgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQlwcmltX29tbF9pcCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXJlc3RhcnQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJc2xhc2ggPSBzdHJjaHIob3B0YXJnLCAnLycpOworCQkJaWYgKCFzbGFzaCkKKwkJCQlleGl0KDIpOworCQkJdWwgPSBzdHJ0b3VsKG9wdGFyZywgTlVMTCwgMTYpOworCQkJbnZfZmxhZ3MgPSB1bCAmIDB4ZmZmZjsKKwkJCXVsID0gc3RydG91bChzbGFzaCsxLCBOVUxMLCAxNik7CisJCQludl9tYXNrID0gdWwgJiAweGZmZmY7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQluZXRfbGlzdGVuX3Rlc3RuciA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCXN0cmVhbV9pZCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCXNvZnR3YXJlID0gc3RyZHVwKG9wdGFyZyk7CisJCQlpZiAoZmluZF9zd19sb2FkX3BhcmFtcyhvcHRhcmcpICE9IDApCisJCQkJZXhpdCgwKTsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCWZpcm13YXJlX2FuYWx5c2lzID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3cnOgorCQkJZHVtcF9maWxlcyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQlwcmludF91c2FnZSgpOworCQkJcHJpbnRfaGVscCgpOworCQkJZXhpdCgwKTsKKwkJfQorCX07CisKKwlpZiAoZmlybXdhcmVfYW5hbHlzaXMpCisJCWFuYWx5emVfZmlybXdhcmUoZmlybXdhcmVfYW5hbHlzaXMpOworCisJaWYgKG9wdGluZCA+PSBhcmdjKSB7CisJCS8qIG9ubHkgd2FybiBpZiB3ZSBoYXZlIG5vdCBkb25lIGFueXRoaW5nIGVsc2UgKi8KKwkJaWYgKCFmaXJtd2FyZV9hbmFseXNpcykKKwkJCWZwcmludGYoc3RkZXJyLCAieW91IGhhdmUgdG8gc3BlY2lmeSB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgQlRTLiBVc2UgLS1oZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uXG4iKTsKKwkJZXhpdCgyKTsKKwl9CisKKwlnc21uZXQgPSBnc21fbmV0d29ya19pbml0KDEsIDEsIE5VTEwpOworCWlmICghZ3NtbmV0KQorCQlleGl0KDEpOworCisJYnRzID0gZ3NtX2J0c19hbGxvYyhnc21uZXQsIEdTTV9CVFNfVFlQRV9OQU5PQlRTLCBIQVJEQ09ERURfVFNDLAorCQkJCUhBUkRDT0RFRF9CU0lDKTsKKwkvKiBpcC5hY2Nlc3Mgc3VwcG9ydHMgdXAgdG8gNCBjaGFpbmVkIFRSWCAqLworCWdzbV9idHNfdHJ4X2FsbG9jKGJ0cyk7CisJZ3NtX2J0c190cnhfYWxsb2MoYnRzKTsKKwlnc21fYnRzX3RyeF9hbGxvYyhidHMpOworCWJ0cy0+b21sX3RlaSA9IHN0cmVhbV9pZDsKKwkKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19OTSwgbm1fc2lnX2NiLCBOVUxMKTsKKwlwcmludGYoIlRyeWluZyB0byBjb25uZWN0IHRvIGlwLmFjY2VzcyBCVFMgLi4uXG4iKTsKKworCW1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7CisJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWluZXRfYXRvbihhcmd2W29wdGluZF0sICZzaW4uc2luX2FkZHIpOworCXJjID0gaWFfY29uZmlnX2Nvbm5lY3QoYnRzLCAmc2luKTsKKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigiRXJyb3IgY29ubmVjdGluZyB0byB0aGUgQlRTIik7CisJCWV4aXQoMSk7CisJfQorCQorCXdoaWxlICgxKSB7CisJCXJjID0gYnNjX3NlbGVjdF9tYWluKDApOworCQlpZiAocmMgPCAwKQorCQkJZXhpdCgzKTsKKwl9CisKKwlleGl0KDApOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1maW5kLmMgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1maW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFmOGEyZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWZpbmQuYwpAQCAtMCwwICsxLDIwOCBAQAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvaXBhY2Nlc3MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisKK3N0YXRpYyBjb25zdCBjaGFyICppZHRhZ19uYW1lc1tdID0geworCVtJUEFDX0lEVEFHX1NFUk5SXQk9ICJTZXJpYWwgTnVtYmVyIiwKKwlbSVBBQ19JRFRBR19VTklUTkFNRV0JPSAiVW5pdCBOYW1lIiwKKwlbSVBBQ19JRFRBR19MT0NBVElPTjFdCT0gIkxvY2F0aW9uIDEiLAorCVtJUEFDX0lEVEFHX0xPQ0FUSU9OMl0JPSAiTG9jYXRpb24gMiIsCisJW0lQQUNfSURUQUdfRVFVSVBWRVJTXQk9ICJFcXVpcG1lbnQgVmVyc2lvbiIsCisJW0lQQUNfSURUQUdfU1dWRVJTSU9OXQk9ICJTb2Z0d2FyZSBWZXJzaW9uIiwKKwlbSVBBQ19JRFRBR19JUEFERFJdCT0gIklQIEFkZHJlc3MiLAorCVtJUEFDX0lEVEFHX01BQ0FERFJdCT0gIk1BQyBBZGRyZXNzIiwKKwlbSVBBQ19JRFRBR19VTklUXQk9ICJVbml0IElEIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICppcGFjX2lkdGFnX25hbWUoaW50IHRhZykKK3sKKwlpZiAodGFnID49IEFSUkFZX1NJWkUoaWR0YWdfbmFtZXMpKQorCQlyZXR1cm4gInVua25vd24iOworCisJcmV0dXJuIGlkdGFnX25hbWVzW3RhZ107Cit9CisKK3N0YXRpYyBpbnQgdWRwX3NvY2soY29uc3QgY2hhciAqaWZuYW1lKQoreworCWludCBmZCwgcmMsIGJjID0gMTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisKKwlmZCA9IHNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOworCisJaWYgKGlmbmFtZSkgeworCQlyYyA9IHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX0JJTkRUT0RFVklDRSwgaWZuYW1lLAorCQkJCXN0cmxlbihpZm5hbWUpKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gZXJyOworCX0KKworCXNhLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNhLnNpbl9wb3J0ID0gaHRvbnMoMzAwNik7CisJc2Euc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKworCXJjID0gYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgc2l6ZW9mKHNhKSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnI7CisKKwlyYyA9IHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX0JST0FEQ0FTVCwgJmJjLCBzaXplb2YoYmMpKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycjsKKworI2lmIDAKKwkvKiB3ZSBjYW5ub3QgYmluZCwgc2luY2UgdGhlIHJlc3BvbnNlIHBhY2tldHMgZG9uJ3QgY29tZSBmcm9tCisJICogdGhlIGJyb2FkY2FzdCBhZGRyZXNzICovCisJc2Euc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2Euc2luX3BvcnQgPSBodG9ucygzMDA2KTsKKwlpbmV0X2F0b24oIjI1NS4yNTUuMjU1LjI1NSIsICZzYS5zaW5fYWRkcik7CisKKwlyYyA9IGNvbm5lY3QoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsIHNpemVvZihzYSkpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworI2VuZGlmCQkKKwlyZXR1cm4gZmQ7CisKK2VycjoKKwljbG9zZShmZCk7CisJcmV0dXJuIHJjOworfQorCitjb25zdCB1bnNpZ25lZCBjaGFyIGZpbmRfcGt0W10gPSB7IDB4MDAsIDB4MGIrOCwgSVBBQ19QUk9UT19JUEFDQ0VTUywgMHgwMCwgCisJCQkJSVBBQ19NU0dUX0lEX0dFVCwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19NQUNBRERSLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0lQQUREUiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19VTklULAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0xPQ0FUSU9OMSwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19MT0NBVElPTjIsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfRVFVSVBWRVJTLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1NXVkVSU0lPTiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19VTklUTkFNRSwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19TRVJOUiwKKwkJCQl9OworCisKK3N0YXRpYyBpbnQgYmNhc3RfZmluZChpbnQgZmQpCit7CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCisJc2Euc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2Euc2luX3BvcnQgPSBodG9ucygzMDA2KTsKKwlpbmV0X2F0b24oIjI1NS4yNTUuMjU1LjI1NSIsICZzYS5zaW5fYWRkcik7CisKKwlyZXR1cm4gc2VuZHRvKGZkLCBmaW5kX3BrdCwgc2l6ZW9mKGZpbmRfcGt0KSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2EsIHNpemVvZihzYSkpOworfQorCitzdGF0aWMgaW50IHBhcnNlX3Jlc3BvbnNlKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwl1X2ludDhfdCB0X2xlbjsKKwl1X2ludDhfdCB0X3RhZzsKKwl1X2ludDhfdCAqY3VyID0gYnVmOworCisJd2hpbGUgKGN1ciA8IGJ1ZiArIGxlbikgeworCQl0X2xlbiA9ICpjdXIrKzsKKwkJdF90YWcgPSAqY3VyKys7CisJCQorCQlwcmludGYoIiVzPSclcycgICIsIGlwYWNfaWR0YWdfbmFtZSh0X3RhZyksIGN1cik7CisKKwkJY3VyICs9IHRfbGVuOworCX0KKwlwcmludGYoIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9yZXNwb25zZShpbnQgZmQpCit7CisJdW5zaWduZWQgY2hhciBidWZbMjU1XTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisJaW50IGxlbjsKKwlzb2NrbGVuX3Qgc2FfbGVuID0gc2l6ZW9mKHNhKTsKKworCWxlbiA9IHJlY3Zmcm9tKGZkLCBidWYsIHNpemVvZihidWYpLCAwLCAoc3RydWN0IHNvY2thZGRyICopJnNhLCAmc2FfbGVuKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIGxlbjsKKworCS8qIDIgYnl0ZXMgbGVuZ3RoLCAxIGJ5dGUgcHJvdG9jb2wgKDB4ZmUpICovCisJaWYgKGJ1ZlsyXSAhPSAweGZlKQorCQlyZXR1cm4gMDsKKworCWlmIChidWZbNF0gIT0gSVBBQ19NU0dUX0lEX1JFU1ApCisJCXJldHVybiAwOworCisJcmV0dXJuIHBhcnNlX3Jlc3BvbnNlKGJ1Zis2LCBsZW4tNik7Cit9CisKK3N0YXRpYyBpbnQgYmZkX2NiKHN0cnVjdCBic2NfZmQgKmJmZCwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCWlmIChmbGFncyAmIEJTQ19GRF9SRUFEKQorCQlyZXR1cm4gcmVhZF9yZXNwb25zZShiZmQtPmZkKTsKKwlpZiAoZmxhZ3MgJiBCU0NfRkRfV1JJVEUpIHsKKwkJYmZkLT53aGVuICY9IH5CU0NfRkRfV1JJVEU7CisJCXJldHVybiBiY2FzdF9maW5kKGJmZC0+ZmQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCitzdGF0aWMgdm9pZCB0aW1lcl9jYih2b2lkICpfZGF0YSkKK3sKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQgPSBfZGF0YTsKKworCWJmZC0+d2hlbiB8PSBCU0NfRkRfV1JJVEU7CisKKwlic2Nfc2NoZWR1bGVfdGltZXIoJnRpbWVyLCA1LCAwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBic2NfZmQgYmZkOworCWNoYXIgKmlmbmFtZTsKKwlpbnQgcmM7CisKKwlwcmludGYoImlwYWNjZXNzLWZpbmQgKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlXG4iKTsKKwlwcmludGYoIlRoaXMgaXMgRlJFRSBTT0ZUV0FSRSB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFlcblxuIik7CisKKwlpZiAoYXJnYyA8IDIpIHsKKwkJZnByaW50ZihzdGRvdXQsICJ5b3UgbWlnaHQgbmVlZCB0byBzcGVjaWZ5IHRoZSBvdXRnb2luZ1xuIgorCQkJIiBuZXR3b3JrIGludGVyZmFjZSwgZS5nLiBgYCVzIGV0aDAnJ1xuIiwgYXJndlswXSk7CisJfQorCisJaWZuYW1lID0gYXJndlsxXTsKKwliZmQuY2IgPSBiZmRfY2I7CisJYmZkLndoZW4gPSBCU0NfRkRfUkVBRCB8IEJTQ19GRF9XUklURTsKKwliZmQuZmQgPSB1ZHBfc29jayhpZm5hbWUpOworCWlmIChiZmQuZmQgPCAwKSB7CisJCXBlcnJvcigiQ2Fubm90IGNyZWF0ZSBsb2NhbCBzb2NrZXQgZm9yIGJyb2FkY2FzdCB1ZHAiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlic2NfcmVnaXN0ZXJfZmQoJmJmZCk7CisKKwl0aW1lci5jYiA9IHRpbWVyX2NiOworCXRpbWVyLmRhdGEgPSAmYmZkOworCisJYnNjX3NjaGVkdWxlX3RpbWVyKCZ0aW1lciwgNSwgMCk7CisKKwlwcmludGYoIlRyeWluZyB0byBmaW5kIGlwLmFjY2VzcyBCVFMgYnkgYnJvYWRjYXN0IFVEUC4uLlxuIik7CisKKwl3aGlsZSAoMSkgeworCQlyYyA9IGJzY19zZWxlY3RfbWFpbigwKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWV4aXQoMyk7CisJfQorCisJZXhpdCgwKTsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtZmlybXdhcmUuYyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWZpcm13YXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0MGMxZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWZpcm13YXJlLmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qIFJvdXRpbmVzIGZvciBwYXJzaW5nIGFuIGlwYWNjZXMgU0RQIGZpcm13YXJlIGZpbGUgKi8KKworLyogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9pcGFjY2Vzcy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBQQVJUX0xFTkdUSCAxMzgKKworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHNkcF9oZWFkZXJfZW50cnkpID09IDEzOCwgcmlnaHRfZW50cnkpOworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHNkcF9maXJtd2FyZSkgPT0gMTU4LCBfcmlnaHRfaGVhZGVyX2xlbmd0aCk7CisKKy8qIG1vcmUgbWFnaWMsIHRoZSBzZWNvbmQgImludCIgaW4gdGhlIGhlYWRlciAqLworc3RhdGljIGNoYXIgbW9yZV9tYWdpY1tdID0geyAweDEwLCAweDAyIH07CisKK2ludCBpcGFjY2Vzc19hbmFseXplX2ZpbGUoaW50IGZkLCBjb25zdCB1bnNpZ25lZCBpbnQgc3Rfc2l6ZSwgY29uc3QgdW5zaWduZWQgaW50IGJhc2Vfb2Zmc2V0LCBzdHJ1Y3QgbGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3Qgc2RwX2Zpcm13YXJlICpmaXJtd2FyZV9oZWFkZXIgPSAwOworCXN0cnVjdCBzZHBfaGVhZGVyICpoZWFkZXI7CisJY2hhciBidWZbNDA5Nl07CisJaW50IHJjLCBpOworCXVfaW50MTZfdCB0YWJsZV9zaXplOworCXVfaW50MTZfdCB0YWJsZV9vZmZzZXQ7CisJb2ZmX3QgdGFibGVfc3RhcnQ7CisKKworCXJjID0gcmVhZChmZCwgYnVmLCBzaXplb2YoKmZpcm13YXJlX2hlYWRlcikpOworCWlmIChyYyA8IDApIHsKKwkJcGVycm9yKCJDYW4gbm90IHJlYWQgaGVhZGVyIHN0YXJ0LiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZmlybXdhcmVfaGVhZGVyID0gKHN0cnVjdCBzZHBfZmlybXdhcmUgKikgJmJ1ZlswXTsKKwlpZiAoc3RybmNtcChmaXJtd2FyZV9oZWFkZXItPm1hZ2ljLCAiIFNEUCIsIDQpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJXcm9uZyBtYWdpYy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG1lbWNtcChmaXJtd2FyZV9oZWFkZXItPm1vcmVfbWFnaWMsIG1vcmVfbWFnaWMsIDIpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJXcm9uZyBtb3JlIG1hZ2ljLiBHb3Q6IDB4JXggJXggJXggJXhcbiIsCisJCQlmaXJtd2FyZV9oZWFkZXItPm1vcmVfbWFnaWNbMF0gJiAweGZmLCBmaXJtd2FyZV9oZWFkZXItPm1vcmVfbWFnaWNbMV0gJiAweGZmLAorCQkJZmlybXdhcmVfaGVhZGVyLT5tb3JlX21hZ2ljWzJdICYgMHhmZiwgZmlybXdhcmVfaGVhZGVyLT5tb3JlX21hZ2ljWzNdICYgMHhmZik7CisJCXJldHVybiAtMTsKKwl9CisKKworCWlmIChudG9obChmaXJtd2FyZV9oZWFkZXItPmZpbGVfbGVuZ3RoKSAhPSBzdF9zaXplKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVGhlIGZpbGVzaXplIGFuZCB0aGUgaGVhZGVyIGRvIG5vdCBtYXRjaC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogYWRkIHRoZSBmaXJtd2FyZSAqLworCWhlYWRlciA9IHRhbGxvY196ZXJvKGxpc3QsIHN0cnVjdCBzZHBfaGVhZGVyKTsKKwloZWFkZXItPmZpcm13YXJlX2luZm8gPSAqZmlybXdhcmVfaGVhZGVyOworCUlOSVRfTExJU1RfSEVBRCgmaGVhZGVyLT5oZWFkZXJfbGlzdCk7CisJbGxpc3RfYWRkKCZoZWFkZXItPmVudHJ5LCBsaXN0KTsKKworCXRhYmxlX29mZnNldCA9IG50b2hzKGZpcm13YXJlX2hlYWRlci0+dGFibGVfb2Zmc2V0KTsKKwl0YWJsZV9zdGFydCA9IGxzZWVrKGZkLCB0YWJsZV9vZmZzZXQsIFNFRUtfQ1VSKTsKKwlpZiAodGFibGVfc3RhcnQgPT0gLTEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gc2VlayB0byB0aGUgcmVsIHBvc2l0aW9uOiAweCV4XG4iLCB0YWJsZV9vZmZzZXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHJlYWQoZmQsICZ0YWJsZV9zaXplLCBzaXplb2YodGFibGVfc2l6ZSkpICE9IHNpemVvZih0YWJsZV9zaXplKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlRoZSB0YWJsZSBzaXplIGNvdWxkIG5vdCBiZSByZWFkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwl0YWJsZV9zaXplID0gbnRvaHModGFibGVfc2l6ZSk7CisKKwlpZiAodGFibGVfc2l6ZSAlIFBBUlRfTEVOR1RIICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJUaGUgcGFydCBsZW5ndGggc2VlbXMgdG8gYmUgd3Jvbmc6IDB4JXhcbiIsIHRhYmxlX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogbG9vayBpbnRvIGVhY2ggZmlybXdhcmUgbm93ICovCisJZm9yIChpID0gMDsgaSA8IHRhYmxlX3NpemUgLyBQQVJUX0xFTkdUSDsgKytpKSB7CisJCXN0cnVjdCBzZHBfaGVhZGVyX2VudHJ5IGVudHJ5OworCQlzdHJ1Y3Qgc2RwX2hlYWRlcl9pdGVtICpoZWFkZXJfZW50cnk7CisJCXVuc2lnbmVkIGludCBvZmZzZXQgPSB0YWJsZV9zdGFydCArIDI7CisJCW9mZnNldCArPSBpICogMTM4OworCisJCWlmIChsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gb2Zmc2V0KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbiBub3Qgc2VlayB0byB0aGUgb2Zmc2V0OiAldS5cbiIsIG9mZnNldCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlyYyA9IHJlYWQoZmQsICZlbnRyeSwgc2l6ZW9mKGVudHJ5KSk7CisJCWlmIChyYyAhPSBzaXplb2YoZW50cnkpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbiBub3QgcmVhZCB0aGUgaGVhZGVyIGVudHJ5LlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQloZWFkZXJfZW50cnkgPSB0YWxsb2NfemVybyhoZWFkZXIsICBzdHJ1Y3Qgc2RwX2hlYWRlcl9pdGVtKTsKKwkJaGVhZGVyX2VudHJ5LT5oZWFkZXJfZW50cnkgPSBlbnRyeTsKKwkJaGVhZGVyX2VudHJ5LT5hYnNvbHV0ZV9vZmZzZXQgPSBiYXNlX29mZnNldDsKKwkJbGxpc3RfYWRkKCZoZWFkZXJfZW50cnktPmVudHJ5LCAmaGVhZGVyLT5oZWFkZXJfbGlzdCk7CisKKwkJLyogbm93IHdlIG5lZWQgdG8gZmluZCB0aGUgU0RQIGZpbGUuLi4gKi8KKwkJb2Zmc2V0ID0gbnRvaGwoZW50cnkuc3RhcnQpICsgNCArIGJhc2Vfb2Zmc2V0OworCQlpZiAobHNlZWsoZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IG9mZnNldCkgeworCQkJcGVycm9yKCJjYW4ndCBzZWVrIHRvIHNkcCIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKworCQlpcGFjY2Vzc19hbmFseXplX2ZpbGUoZmQsIG50b2hsKGVudHJ5Lmxlbmd0aCksIG9mZnNldCwgbGlzdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLXByb3h5LmMgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1wcm94eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMmMwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1wcm94eS5jCkBAIC0wLDAgKzEsMTEyNyBAQAorLyogT3BlbkJTQyBBYmlzL0lQIHByb3h5IGlwLmFjY2VzcyBuYW5vQlRTICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2lwYWNjZXNzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKK3N0YXRpYyBzdHJ1Y3QgbG9nX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKKworLyogb25lIGluc3RhbmNlIG9mIGFuIGlwLmFjY2VzcyBwcm90b2NvbCBwcm94eSAqLworc3RydWN0IGlwYV9wcm94eSB7CisJLyogc29ja2V0IHdoZXJlIHdlIGxpc3RlbiBmb3IgaW5jb21pbmcgT01MIGZyb20gQlRTICovCisJc3RydWN0IGJzY19mZCBvbWxfbGlzdGVuX2ZkOworCS8qIHNvY2tldCB3aGVyZSB3ZSBsaXN0ZW4gZm9yIGluY29taW5nIFJTTCBmcm9tIEJUUyAqLworCXN0cnVjdCBic2NfZmQgcnNsX2xpc3Rlbl9mZDsKKwkvKiBsaXN0IG9mIEJUUydzIChzdHJ1Y3QgaXBhX2J0c19jb25uICovCisJc3RydWN0IGxsaXN0X2hlYWQgYnRzX2xpc3Q7CisJLyogdGhlIEJTQyByZWNvbm5lY3QgdGltZXIgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCByZWNvbm5fdGltZXI7Cit9OworCisvKiBnbG9iYWwgcG9pbnRlciB0byB0aGUgcHJveHkgc3RydWN0dXJlICovCitzdGF0aWMgc3RydWN0IGlwYV9wcm94eSAqaXBwOworCitzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4geworCXN0cnVjdCBic2NfZmQgZmQ7CisJc3RydWN0IGxsaXN0X2hlYWQgdHhfcXVldWU7CisJc3RydWN0IGlwYV9idHNfY29ubiAqYnRzX2Nvbm47Cit9OworCisjZGVmaW5lIE1BWF9UUlggNAorCisvKiByZXByZXNlbnRzIGEgcGFydGljdWxhciBCVFMgaW4gb3VyIHByb3h5ICovCitzdHJ1Y3QgaXBhX2J0c19jb25uIHsKKwkvKiBsaXN0IG9mIEJUUydzIChpcGFfcHJveHktPmJ0c19saXN0KSAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJLyogYmFjayBwb2ludGVyIHRvIHRoZSBwcm94eSB3aGljaCB3ZSBiZWxvbmcgdG8gKi8KKwlzdHJ1Y3QgaXBhX3Byb3h5ICppcHA7CisJLyogdGhlIHVuaXQgSUQgYXMgZGV0ZXJtaW5lZCBieSBDQ00gKi8KKwlzdHJ1Y3QgeworCQl1X2ludDE2X3Qgc2l0ZV9pZDsKKwkJdV9pbnQxNl90IGJ0c19pZDsKKwl9IHVuaXRfaWQ7CisKKwkvKiBpbmNvbWluZyBjb25uZWN0aW9ucyBmcm9tIEJUUyAqLworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqb21sX2Nvbm47CisJc3RydWN0IGlwYV9wcm94eV9jb25uICpyc2xfY29ubltNQVhfVFJYXTsKKworCS8qIG91dGdvaW5nIGNvbm5lY3Rpb25zIHRvIEJTQyAqLworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqYnNjX29tbF9jb25uOworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqYnNjX3JzbF9jb25uW01BWF9UUlhdOworCisJLyogVURQIHNvY2tldHMgZm9yIEJUUyBhbmQgQlNDIGluamVjdGlvbiAqLworCXN0cnVjdCBic2NfZmQgdWRwX2J0c19mZDsKKwlzdHJ1Y3QgYnNjX2ZkIHVkcF9ic2NfZmQ7CisKKwljaGFyICppZF90YWdzWzB4ZmZdOworCXVfaW50OF90ICppZF9yZXNwOworCXVuc2lnbmVkIGludCBpZF9yZXNwX2xlbjsKK307CisKK2VudW0gaXBwX2ZkX3R5cGUgeworCU9NTF9GUk9NX0JUUyA9IDEsCisJUlNMX0ZST01fQlRTID0gMiwKKwlPTUxfVE9fQlNDID0gMywKKwlSU0xfVE9fQlNDID0gNCwKKwlVRFBfVE9fQlRTID0gNSwKKwlVRFBfVE9fQlNDID0gNiwKK307CisKKy8qIHNvbWUgb2YgdGhlIGNvZGUgYWdhaW5zdCB3ZSBsaW5rIGZyb20gT3BlbkJTQyBuZWVkcyB0aGlzICovCit2b2lkICp0YWxsX2JzY19jdHg7CisKK3N0YXRpYyBjaGFyICpsaXN0ZW5faXBhZGRyOworc3RhdGljIGNoYXIgKmJzY19pcGFkZHI7CisKKyNkZWZpbmUgUFJPWFlfQUxMT0NfU0laRQkzMDAKKworc3RhdGljIGNvbnN0IHVfaW50OF90IHBvbmdbXSA9IHsgMCwgMSwgSVBBQ19QUk9UT19JUEFDQ0VTUywgSVBBQ19NU0dUX1BPTkcgfTsKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBpZF9hY2tbXSA9IHsgMCwgMSwgSVBBQ19QUk9UT19JUEFDQ0VTUywgSVBBQ19NU0dUX0lEX0FDSyB9Oworc3RhdGljIGNvbnN0IHVfaW50OF90IGlkX3JlcVtdID0geyAwLCAxNywgSVBBQ19QUk9UT19JUEFDQ0VTUywgSVBBQ19NU0dUX0lEX0dFVCwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19VTklULAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX01BQ0FERFIsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTE9DQVRJT04xLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0xPQ0FUSU9OMiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19FUVVJUFZFUlMsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfU1dWRVJTSU9OLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1VOSVROQU1FLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1NFUk5SLAorCQkJCX07CisKK3N0YXRpYyBjb25zdCBjaGFyICppZHRhZ19uYW1lc1tdID0geworCVtJUEFDX0lEVEFHX1NFUk5SXQk9ICJTZXJpYWxfTnVtYmVyIiwKKwlbSVBBQ19JRFRBR19VTklUTkFNRV0JPSAiVW5pdF9OYW1lIiwKKwlbSVBBQ19JRFRBR19MT0NBVElPTjFdCT0gIkxvY2F0aW9uXzEiLAorCVtJUEFDX0lEVEFHX0xPQ0FUSU9OMl0JPSAiTG9jYXRpb25fMiIsCisJW0lQQUNfSURUQUdfRVFVSVBWRVJTXQk9ICJFcXVpcG1lbnRfVmVyc2lvbiIsCisJW0lQQUNfSURUQUdfU1dWRVJTSU9OXQk9ICJTb2Z0d2FyZV9WZXJzaW9uIiwKKwlbSVBBQ19JRFRBR19JUEFERFJdCT0gIklQX0FkZHJlc3MiLAorCVtJUEFDX0lEVEFHX01BQ0FERFJdCT0gIk1BQ19BZGRyZXNzIiwKKwlbSVBBQ19JRFRBR19VTklUXQk9ICJVbml0X0lEIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICppcGFjX2lkdGFnX25hbWUoaW50IHRhZykKK3sKKwlpZiAodGFnID49IEFSUkFZX1NJWkUoaWR0YWdfbmFtZXMpKQorCQlyZXR1cm4gInVua25vd24iOworCisJcmV0dXJuIGlkdGFnX25hbWVzW3RhZ107Cit9CisKK3N0YXRpYyBpbnQgaXBhY19pZHRhZ19wYXJzZShzdHJ1Y3QgdGx2X3BhcnNlZCAqZGVjLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisJdV9pbnQ4X3QgdF9sZW47CisJdV9pbnQ4X3QgdF90YWc7CisJdV9pbnQ4X3QgKmN1ciA9IGJ1ZjsKKworCXdoaWxlIChjdXIgPCBidWYgKyBsZW4pIHsKKwkJdF9sZW4gPSAqY3VyKys7CisJCXRfdGFnID0gKmN1cisrOworCisJCURFQlVHUEMoRE1JLCAiJXM9JyVzJyAiLCBpcGFjX2lkdGFnX25hbWUodF90YWcpLCBjdXIpOworCisJCWRlYy0+bHZbdF90YWddLmxlbiA9IHRfbGVuOworCQlkZWMtPmx2W3RfdGFnXS52YWwgPSBjdXI7CisKKwkJY3VyICs9IHRfbGVuOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV91bml0aWQoY29uc3QgY2hhciAqc3RyLCB1X2ludDE2X3QgKnNpdGVfaWQsIHVfaW50MTZfdCAqYnRzX2lkLAorCQkJdV9pbnQxNl90ICp0cnhfaWQpCit7CisJdW5zaWduZWQgbG9uZyB1bDsKKwljaGFyICplbmRwdHI7CisJY29uc3QgY2hhciAqbnB0cjsKKworCW5wdHIgPSBzdHI7CisJdWwgPSBzdHJ0b3VsKG5wdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoZW5kcHRyIDw9IG5wdHIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzaXRlX2lkKQorCQkqc2l0ZV9pZCA9IHVsICYgMHhmZmZmOworCisJaWYgKCplbmRwdHIrKyAhPSAnLycpCisJCXJldHVybiAtRUlOVkFMOworCisJbnB0ciA9IGVuZHB0cjsKKwl1bCA9IHN0cnRvdWwobnB0ciwgJmVuZHB0ciwgMTApOworCWlmIChlbmRwdHIgPD0gbnB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGJ0c19pZCkKKwkJKmJ0c19pZCA9IHVsICYgMHhmZmZmOworCisJaWYgKCplbmRwdHIrKyAhPSAnLycpCisJCXJldHVybiAtRUlOVkFMOworCisJbnB0ciA9IGVuZHB0cjsKKwl1bCA9IHN0cnRvdWwobnB0ciwgJmVuZHB0ciwgMTApOworCWlmIChlbmRwdHIgPD0gbnB0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHRyeF9pZCkKKwkJKnRyeF9pZCA9IHVsICYgMHhmZmZmOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBhX2J0c19jb25uICpmaW5kX2J0c19ieV91bml0aWQoc3RydWN0IGlwYV9wcm94eSAqaXBwLAorCQkJCQkJdV9pbnQxNl90IHNpdGVfaWQsCisJCQkJCQl1X2ludDE2X3QgYnRzX2lkKQoreworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmM7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShpcGJjLCAmaXBwLT5idHNfbGlzdCwgbGlzdCkgeworCQlpZiAoaXBiYy0+dW5pdF9pZC5zaXRlX2lkID09IHNpdGVfaWQgJiYKKwkJICAgIGlwYmMtPnVuaXRfaWQuYnRzX2lkID09IGJ0c19pZCkKKwkJCXJldHVybiBpcGJjOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmFsbG9jX2Nvbm4odm9pZCkKK3sKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYzsKKworCWlwYyA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGlwYV9wcm94eV9jb25uKTsKKwlpZiAoIWlwYykKKwkJcmV0dXJuIE5VTEw7CisKKwlJTklUX0xMSVNUX0hFQUQoJmlwYy0+dHhfcXVldWUpOworCisJcmV0dXJuIGlwYzsKK30KKworc3RhdGljIGludCBzdG9yZV9pZHRhZ3Moc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYywgc3RydWN0IHRsdl9wYXJzZWQgKnRsdnApCit7CisJdW5zaWduZWQgaW50IGksIGxlbjsKKworCWZvciAoaSA9IDA7IGkgPD0gMHhmZjsgaSsrKSB7CisJCWlmICghVExWUF9QUkVTRU5UKHRsdnAsIGkpKQorCQkJY29udGludWU7CisKKwkJbGVuID0gVExWUF9MRU4odGx2cCwgaSk7CisjaWYgMAorCQlpZiAoIWlwYmMtPmlkX3RhZ3NbaV0pCisJCQlpcGJjLT5pZF90YWdzW2ldID0gdGFsbG9jX3NpemUodGFsbF9ic2NfY3R4LCBsZW4pOworCQllbHNlCisjZW5kaWYKKwkJCWlwYmMtPmlkX3RhZ3NbaV0gPSB0YWxsb2NfcmVhbGxvY19zaXplKGlwYmMsCisJCQkJCQkJICBpcGJjLT5pZF90YWdzW2ldLCBsZW4pOworCQlpZiAoIWlwYmMtPmlkX3RhZ3NbaV0pCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQltZW1zZXQoaXBiYy0+aWRfdGFnc1tpXSwgMCwgbGVuKTsKKwkJLy9tZW1jcHkoaXBiYy0+aWRfdGFnc1tpXSwgVExWUF9WQUwodGx2cCwgaSksIGxlbik7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmNvbm5lY3RfYnNjKHN0cnVjdCBzb2NrYWRkcl9pbiAqc2EsIGludCBwcml2X25yLCB2b2lkICpkYXRhKTsKKworI2RlZmluZSBsb2dwX2lwYmNfdWlkKHNzLCBsdmwsIGlwYmMsIHRyeF9pZCkgX2xvZ3BfaXBiY191aWQoc3MsIGx2bCwgX19GSUxFX18sIF9fTElORV9fLCBpcGJjLCB0cnhfaWQpCisKK3N0YXRpYyB2b2lkIF9sb2dwX2lwYmNfdWlkKHVuc2lnbmVkIGludCBzcywgdW5zaWduZWQgaW50IGx2bCwgY2hhciAqZmlsZSwgaW50IGxpbmUsCisJCQkgICBzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjLCB1X2ludDhfdCB0cnhfaWQpCit7CisJaWYgKGlwYmMpCisJCWxvZ3AyKHNzLCBsdmwsIGZpbGUsIGxpbmUsIDAsICIoJXUvJXUvJXUpICIsIGlwYmMtPnVuaXRfaWQuc2l0ZV9pZCwKKwkJICAgICBpcGJjLT51bml0X2lkLmJ0c19pZCwgdHJ4X2lkKTsKKwllbHNlCisJCWxvZ3AyKHNzLCBsdmwsIGZpbGUsIGxpbmUsIDAsICJ1bmtub3duICIpOworfQorCisvKiBVRFAgc29ja2V0IGhhbmRsaW5nICovCisKK3N0YXRpYyBpbnQgbWFrZV9zb2NrKHN0cnVjdCBic2NfZmQgKmJmZCwgdV9pbnQxNl90IHBvcnQsIGludCBwcm90bywgaW50IHByaXZfbnIsCisJCSAgICAgaW50ICgqY2IpKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCksCisJCSAgICAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlpbnQgcmV0LCBvbiA9IDE7CisKKwliZmQtPmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIHByb3RvKTsKKwliZmQtPmNiID0gY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJYmZkLT5kYXRhID0gZGF0YTsKKwliZmQtPnByaXZfbnIgPSBwcml2X25yOworCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCWFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKworCXNldHNvY2tvcHQoYmZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJcmV0ID0gYmluZChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBiaW5kIHNvY2tldDogJXNcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoInJlZ2lzdGVyIFVEUCBmZCIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfdWRwX3JlYWQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmMgPSBiZmQtPmRhdGE7CisJc3RydWN0IGlwYV9wcm94eV9jb25uICpvdGhlcl9jb25uID0gTlVMTDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhQUk9YWV9BTExPQ19TSVpFLCAiQWJpcy9JUCBVRFAiKTsKKwlzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqaGg7CisJaW50IHJldDsKKworCS8qIHdpdGggVURQIHNvY2tldHMsIHdlIGNhbm5vdCByZWFkIHBhcnRpYWwgcGFja2V0cyBidXQgaGF2ZSB0byByZWFkCisJICogYWxsIG9mIGl0IGluIG9uZSBnbyAqLworCWhoID0gKHN0cnVjdCBpcGFjY2Vzc19oZWFkICopIG1zZy0+ZGF0YTsKKwlyZXQgPSByZWN2KGJmZC0+ZmQsIG1zZy0+ZGF0YSwgbXNnLT5kYXRhX2xlbiwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVBR0FJTikKKwkJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgInJlY3YgZXJyb3IgICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKHJldCA9PSAwKSB7CisJCURFQlVHUChESU5QLCAiVURQIHBlZXIgZGlzYXBwZWFyZWQsIGRlYWQgc29ja2V0XG4iKTsKKwkJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCWJmZC0+ZmQgPSAtMTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAocmV0IDwgc2l6ZW9mKCpoaCkpIHsKKwkJREVCVUdQKERJTlAsICJjb3VsZCBub3QgZXZlbiByZWFkIGhlYWRlciE/IVxuIik7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbXNnYl9wdXQobXNnLCByZXQpOworCW1zZy0+bDJoID0gbXNnLT5kYXRhICsgc2l6ZW9mKCpoaCk7CisJREVCVUdQKERNSSwgIlVEUCBSWDogJXNcbiIsIGhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCisJaWYgKGhoLT5sZW4gIT0gbXNnLT5sZW4gLSBzaXplb2YoKmhoKSkgeworCQlERUJVR1AoRElOUCwgImxlbmd0aCAoJXUvJXUpIGRpc2FncmVlcyB3aXRoIGhlYWRlcigldSlcbiIsCisJCQltc2ctPmxlbiwgbXNnLT5sZW4gLSAzLCBoaC0+bGVuKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXN3aXRjaCAoYmZkLT5wcml2X25yICYgMHhmZikgeworCWNhc2UgVURQX1RPX0JUUzoKKwkJLyogaW5qZWN0aW9uIHRvd2FyZHMgQlRTICovCisJCXN3aXRjaCAoaGgtPnByb3RvKSB7CisJCWNhc2UgSVBBQ19QUk9UT19SU0w6CisJCQkvKiBGSVhNRTogd2hhdCB0byBkbyBhYm91dCBUUlggPiAwICovCisJCQlvdGhlcl9jb25uID0gaXBiYy0+cnNsX2Nvbm5bMF07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURFQlVHUChESU5QLCAiVW5rbm93biBwcm90b2NvbCAweCUwMngsIHNlbmRpbmcgdG8gIgorCQkJCSJPTUwgRkRcbiIsIGhoLT5wcm90byk7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBJUEFDX1BST1RPX0lQQUNDRVNTOgorCQljYXNlIElQQUNfUFJPVE9fT01MOgorCQkJb3RoZXJfY29ubiA9IGlwYmMtPm9tbF9jb25uOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBVRFBfVE9fQlNDOgorCQkvKiBpbmplY3Rpb24gdG93YXJkcyBCU0MgKi8KKwkJc3dpdGNoIChoaC0+cHJvdG8pIHsKKwkJY2FzZSBJUEFDX1BST1RPX1JTTDoKKwkJCS8qIEZJWE1FOiB3aGF0IHRvIGRvIGFib3V0IFRSWCA+IDAgKi8KKwkJCW90aGVyX2Nvbm4gPSBpcGJjLT5ic2NfcnNsX2Nvbm5bMF07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCURFQlVHUChESU5QLCAiVW5rbm93biBwcm90b2NvbCAweCUwMngsIHNlbmRpbmcgdG8gIgorCQkJCSJPTUwgRkRcbiIsIGhoLT5wcm90byk7CisJCWNhc2UgSVBBQ19QUk9UT19JUEFDQ0VTUzoKKwkJY2FzZSBJUEFDX1BST1RPX09NTDoKKwkJCW90aGVyX2Nvbm4gPSBpcGJjLT5ic2Nfb21sX2Nvbm47CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1AoRElOUCwgIlVua25vd24gZmlsZWRlc2NyaXB0b3IgcHJpdl9ucj0lMDR4XG4iLCBiZmQtPnByaXZfbnIpOworCQlicmVhazsKKwl9CisKKwlpZiAob3RoZXJfY29ubikgeworCQkvKiBlbnF1ZXVlIHRoZSBtZXNzYWdlIGZvciBUWCBvbiB0aGUgcmVzcGVjdGl2ZSBGRCAqLworCQltc2diX2VucXVldWUoJm90aGVyX2Nvbm4tPnR4X3F1ZXVlLCBtc2cpOworCQlvdGhlcl9jb25uLT5mZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKwl9IGVsc2UKKwkJbXNnYl9mcmVlKG1zZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfdWRwX3dyaXRlKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwkvKiBub3QgaW1wbGVtZW50ZWQgeWV0ICovCisJYmZkLT53aGVuICY9IH5CU0NfRkRfV1JJVEU7CisKKwlyZXR1cm4gLUVJTzsKK30KKworLyogY2FsbGJhY2sgZnJvbSBzZWxlY3QuYyBpbiBjYXNlIG9uZSBvZiB0aGUgZmQncyBjYW4gYmUgcmVhZC93cml0dGVuICovCitzdGF0aWMgaW50IHVkcF9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCWludCByYyA9IDA7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKQorCQlyYyA9IGhhbmRsZV91ZHBfcmVhZChiZmQpOworCWlmICh3aGF0ICYgQlNDX0ZEX1dSSVRFKQorCQlyYyA9IGhhbmRsZV91ZHBfd3JpdGUoYmZkKTsKKworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgaW50IGlwYmNfYWxsb2NfY29ubmVjdChzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYywgc3RydWN0IGJzY19mZCAqYmZkLAorCQkJICAgICAgdV9pbnQxNl90IHNpdGVfaWQsIHVfaW50MTZfdCBidHNfaWQsCisJCQkgICAgICB1X2ludDE2X3QgdHJ4X2lkLCBzdHJ1Y3QgdGx2X3BhcnNlZCAqdGx2cCwKKwkJCSAgICAgIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYzsKKwl1X2ludDE2X3QgdWRwX3BvcnQ7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKworCW1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7CisJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWluZXRfYXRvbihic2NfaXBhZGRyLCAmc2luLnNpbl9hZGRyKTsKKworCURFQlVHUChESU5QLCAiKCV1LyV1LyV1KSBOZXcgQlRTIGNvbm5lY3Rpb246ICIsCisJCXNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkKTsKKworCS8qIE9NTCBuZWVkcyB0byBiZSBlc3RhYmxpc2hlZCBiZWZvcmUgUlNMICovCisJaWYgKChiZmQtPnByaXZfbnIgJiAweGZmKSAhPSBPTUxfRlJPTV9CVFMpIHsKKwkJREVCVUdQQyhESU5QLCAiTm90IGEgT01MIGNvbm5lY3Rpb24gPyE/XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogYWxsb2NhdGUgbmV3IEJUUyBjb25uZWN0aW9uIGRhdGEgc3RydWN0dXJlICovCisJaXBiYyA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGlwYV9idHNfY29ubik7CisJaWYgKCFpcGJjKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlERUJVR1BDKERJTlAsICJDcmVhdGVkIEJUUyBDb25uIGRhdGEgc3RydWN0dXJlXG4iKTsKKwlpcGJjLT5pcHAgPSBpcHA7CisJaXBiYy0+dW5pdF9pZC5zaXRlX2lkID0gc2l0ZV9pZDsKKwlpcGJjLT51bml0X2lkLmJ0c19pZCA9IGJ0c19pZDsKKwlpcGJjLT5vbWxfY29ubiA9IGlwYzsKKwlpcGMtPmJ0c19jb25uID0gaXBiYzsKKworCS8qIHN0b3JlIHRoZSBjb250ZW50IG9mIHRoZSBJRCBUQUdTIGZvciBsYXRlciByZWZlcmVuY2UgKi8KKwlzdG9yZV9pZHRhZ3MoaXBiYywgdGx2cCk7CisJaXBiYy0+aWRfcmVzcF9sZW4gPSBtc2ctPmxlbjsKKwlpcGJjLT5pZF9yZXNwID0gdGFsbG9jX3NpemUodGFsbF9ic2NfY3R4LCBpcGJjLT5pZF9yZXNwX2xlbik7CisJbWVtY3B5KGlwYmMtPmlkX3Jlc3AsIG1zZy0+ZGF0YSwgaXBiYy0+aWRfcmVzcF9sZW4pOworCisJLyogQ3JlYXRlIE9NTCBUQ1AgY29ubmVjdGlvbiB0b3dhcmRzIEJTQyAqLworCXNpbi5zaW5fcG9ydCA9IGh0b25zKElQQV9UQ1BfUE9SVF9PTUwpOworCWlwYmMtPmJzY19vbWxfY29ubiA9IGNvbm5lY3RfYnNjKCZzaW4sIE9NTF9UT19CU0MsIGlwYmMpOworCWlmICghaXBiYy0+YnNjX29tbF9jb25uKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX2JzY19jb25uOworCX0KKworCURFQlVHUChESU5QLCAiKCV1LyV1LyV1KSBPTUwgQ29ubmVjdGVkIHRvIEJTQ1xuIiwKKwkJc2l0ZV9pZCwgYnRzX2lkLCB0cnhfaWQpOworCisJLyogQ3JlYXRlIFVEUCBzb2NrZXQgZm9yIEJUUyBwYWNrZXQgaW5qZWN0aW9uICovCisJdWRwX3BvcnQgPSAxMDAwMCArIChzaXRlX2lkICUgMTAwMCkqMTAwICsgKGJ0c19pZCAlIDEwMCk7CisJcmV0ID0gbWFrZV9zb2NrKCZpcGJjLT51ZHBfYnRzX2ZkLCB1ZHBfcG9ydCwgSVBQUk9UT19VRFAsCisJCQlVRFBfVE9fQlRTLCB1ZHBfZmRfY2IsIGlwYmMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl91ZHBfYnRzOworCURFQlVHUChESU5QLCAiKCV1LyV1LyV1KSBDcmVhdGVkIFVEUCBzb2NrZXQgZm9yIGluamVjdGlvbiAiCisJCSJ0b3dhcmRzIEJUUyBhdCBwb3J0ICV1XG4iLCBzaXRlX2lkLCBidHNfaWQsIHRyeF9pZCwgdWRwX3BvcnQpOworCisJLyogQ3JlYXRlIFVEUCBzb2NrZXQgZm9yIEJTQyBwYWNrZXQgaW5qZWN0aW9uICovCisJdWRwX3BvcnQgPSAyMDAwMCArIChzaXRlX2lkICUgMTAwMCkqMTAwICsgKGJ0c19pZCAlIDEwMCk7CisJcmV0ID0gbWFrZV9zb2NrKCZpcGJjLT51ZHBfYnNjX2ZkLCB1ZHBfcG9ydCwgSVBQUk9UT19VRFAsCisJCQlVRFBfVE9fQlNDLCB1ZHBfZmRfY2IsIGlwYmMpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl91ZHBfYnNjOworCURFQlVHUChESU5QLCAiKCV1LyV1LyV1KSBDcmVhdGVkIFVEUCBzb2NrZXQgZm9yIGluamVjdGlvbiAiCisJCSJ0b3dhcmRzIEJTQyBhdCBwb3J0ICV1XG4iLCBzaXRlX2lkLCBidHNfaWQsIHRyeF9pZCwgdWRwX3BvcnQpOworCWxsaXN0X2FkZCgmaXBiYy0+bGlzdCwgJmlwcC0+YnRzX2xpc3QpOworCisJcmV0dXJuIDA7CisKK2Vycl91ZHBfYnNjOgorCWJzY191bnJlZ2lzdGVyX2ZkKCZpcGJjLT51ZHBfYnRzX2ZkKTsKK2Vycl91ZHBfYnRzOgorCWJzY191bnJlZ2lzdGVyX2ZkKCZpcGJjLT5ic2Nfb21sX2Nvbm4tPmZkKTsKKwljbG9zZShpcGJjLT5ic2Nfb21sX2Nvbm4tPmZkLmZkKTsKKwl0YWxsb2NfZnJlZShpcGJjLT5ic2Nfb21sX2Nvbm4pOworCWlwYmMtPmJzY19vbWxfY29ubiA9IE5VTEw7CitlcnJfYnNjX2Nvbm46CisJdGFsbG9jX2ZyZWUoaXBiYy0+aWRfcmVzcCk7CisJdGFsbG9jX2ZyZWUoaXBiYyk7CisjaWYgMAorCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJY2xvc2UoYmZkLT5mZCk7CisJdGFsbG9jX2ZyZWUoYmZkKTsKKyNlbmRpZgorZXJyX291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlwYWNjZXNzX3Jjdm1zZyhzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYywgc3RydWN0IG1zZ2IgKm1zZywKKwkJCSAgIHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0bHZwOworCXVfaW50OF90IG1zZ190eXBlID0gKihtc2ctPmwyaCk7CisJdV9pbnQxNl90IHNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkOworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmM7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisJY2FzZSBJUEFDX01TR1RfUElORzoKKwkJcmV0ID0gd3JpdGUoYmZkLT5mZCwgcG9uZywgc2l6ZW9mKHBvbmcpKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAocmV0IDwgc2l6ZW9mKHBvbmcpKSB7CisJCQlERUJVR1AoRElOUCwgInNob3J0IHdyaXRlXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWJyZWFrOworCWNhc2UgSVBBQ19NU0dUX1BPTkc6CisJCURFQlVHUChETUksICJQT05HIVxuIik7CisJCWJyZWFrOworCWNhc2UgSVBBQ19NU0dUX0lEX1JFU1A6CisJCURFQlVHUChETUksICJJRF9SRVNQICIpOworCQkvKiBwYXJzZSB0YWdzLCBzZWFyY2ggZm9yIFVuaXQgSUQgKi8KKwkJaXBhY19pZHRhZ19wYXJzZSgmdGx2cCwgKHVfaW50OF90ICopbXNnLT5sMmggKyAyLAorCQkJCSBtc2diX2wybGVuKG1zZyktMik7CisJCURFQlVHUChETUksICJcbiIpOworCisJCWlmICghVExWUF9QUkVTRU5UKCZ0bHZwLCBJUEFDX0lEVEFHX1VOSVQpKSB7CisJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJObyBVbml0IElEIGluIElEIFJFU1BPTlNFICE/IVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCS8qIGxvb2t1cCBCVFMsIGNyZWF0ZSBzaWduX2xpbmssIC4uLiAqLworCQlwYXJzZV91bml0aWQoKGNoYXIgKilUTFZQX1ZBTCgmdGx2cCwgSVBBQ19JRFRBR19VTklUKSwKKwkJCSAgICAgJnNpdGVfaWQsICZidHNfaWQsICZ0cnhfaWQpOworCQlpcGJjID0gZmluZF9idHNfYnlfdW5pdGlkKGlwcCwgc2l0ZV9pZCwgYnRzX2lkKTsKKwkJaWYgKCFpcGJjKSB7CisJCQkvKiBXZSBoYXZlIG5vdCBmb3VuZCBhbiBpcGJjIChwZXItYnRzIHByb3h5IGluc3RhbmNlKQorCQkJICogZm9yIHRoaXMgQlRTIHlldC4gIFRoZSBmaXJzdCBjb25uZWN0aW9uIG9mIGEgbmV3IEJUUyBtdXN0CisJCQkgKiBiZSBhIE9NTCBjb25uZWN0aW9uLiAgV2UgYWxsb2NhdGUgdGhlIGFzc29jaWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLAorCQkJICogYW5kIHRyeSB0byBjb25uZWN0IHRvIHRoZSByZW1vdGUgZW5kICovCisKKwkJCXJldHVybiBpcGJjX2FsbG9jX2Nvbm5lY3QoaXBjLCBiZmQsIHNpdGVfaWQsIGJ0c19pZCwKKwkJCQkJCSAgdHJ4X2lkLCAmdGx2cCwgbXNnKTsKKwkJCS8qIGlmIHRoaXMgZmFpbHMsIHRoZSBjYWxsZXIgd2lsbCBjbGVhbiB1cCBiZmQgKi8KKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJCQltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOworCQkJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJaW5ldF9hdG9uKGJzY19pcGFkZHIsICZzaW4uc2luX2FkZHIpOworCisJCQlERUJVR1AoRElOUCwgIklkZW50aWZpZWQgQlRTICV1LyV1LyV1XG4iLAorCQkJCXNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkKTsKKworCQkJaWYgKChiZmQtPnByaXZfbnIgJiAweGZmKSAhPSBSU0xfRlJPTV9CVFMpIHsKKwkJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJTZWNvbmQgT01MIGNvbm5lY3Rpb24gZnJvbSAiCisJCQkJICAgICAic2FtZSBCVFMgPyE/XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJaWYgKHRyeF9pZCA+IE1BWF9UUlgpIHsKKwkJCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJXZSBkb24ndCBzdXBwb3J0IG1vcmUgIgorCQkJCSAgICAgInRoYW4gJXUgVFJYXG4iLCBNQVhfVFJYKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJaXBjLT5idHNfY29ubiA9IGlwYmM7CisJCQkvKiBzdG9yZSBUUlggbnVtYmVyIGluIGhpZ2hlciA4IGJpdCBvZiB0aGUgYmZkIHByaXZhdGUgbnVtYmVyICovCisJCQliZmQtPnByaXZfbnIgfD0gdHJ4X2lkIDw8IDg7CisJCQlpcGJjLT5yc2xfY29ublt0cnhfaWRdID0gaXBjOworCisJCQkvKiBDcmVhdGUgUlNMIFRDUCBjb25uZWN0aW9uIHRvd2FyZHMgQlNDICovCisJCQlzaW4uc2luX3BvcnQgPSBodG9ucyhJUEFfVENQX1BPUlRfUlNMKTsKKwkJCWlwYmMtPmJzY19yc2xfY29ublt0cnhfaWRdID0KKwkJCQljb25uZWN0X2JzYygmc2luLCBSU0xfVE9fQlNDIHwgKHRyeF9pZCA8PCA4KSwgaXBiYyk7CisJCQlpZiAoIWlwYmMtPmJzY19vbWxfY29ubikKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCURFQlVHUChESU5QLCAiKCV1LyV1LyV1KSBDb25uZWN0ZWQgUlNMIHRvIEJTQ1xuIiwKKwkJCQlzaXRlX2lkLCBidHNfaWQsIHRyeF9pZCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJUEFDX01TR1RfSURfR0VUOgorCQlERUJVR1AoRE1JLCAiSURfR0VUXG4iKTsKKwkJaWYgKChiZmQtPnByaXZfbnIgJiAweGZmKSAhPSBPTUxfVE9fQlNDICYmCisJCSAgICAoYmZkLT5wcml2X25yICYgMHhmZikgIT0gUlNMX1RPX0JTQykgeworCQkJREVCVUdQKERJTlAsICJJRGVudGl0eSBSRVF1ZXN0IGZyb20gQlRTID8hP1xuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpcGJjID0gaXBjLT5idHNfY29ubjsKKwkJaWYgKCFpcGJjKSB7CisJCQlERUJVR1AoRElOUCwgIklEX0dFVCBmcm9tIEJTQyBiZWZvcmUgd2UgaGF2ZSBJRF9SRVNQIGZyb20gQlRTXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCXJldCA9IHdyaXRlKGJmZC0+ZmQsIGlwYmMtPmlkX3Jlc3AsIGlwYmMtPmlkX3Jlc3BfbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBJUEFDX01TR1RfSURfQUNLOgorCQlERUJVR1AoRE1JLCAiSURfQUNLPyAtPiBBQ0shXG4iKTsKKwkJcmV0ID0gd3JpdGUoYmZkLT5mZCwgaWRfYWNrLCBzaXplb2YoaWRfYWNrKSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG1zZ2IgKmlwYWNjZXNzX3JlYWRfbXNnKHN0cnVjdCBic2NfZmQgKmJmZCwgaW50ICplcnJvcikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhQUk9YWV9BTExPQ19TSVpFLCAiQWJpcy9JUCIpOworCXN0cnVjdCBpcGFjY2Vzc19oZWFkICpoaDsKKwlpbnQgbGVuLCByZXQgPSAwOworCisJaWYgKCFtc2cpIHsKKwkJKmVycm9yID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogZmlyc3QgcmVhZCBvdXIgMy1ieXRlIGhlYWRlciAqLworCWhoID0gKHN0cnVjdCBpcGFjY2Vzc19oZWFkICopIG1zZy0+ZGF0YTsKKwlyZXQgPSByZWN2KGJmZC0+ZmQsIG1zZy0+ZGF0YSwgMywgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVBR0FJTikKKwkJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgInJlY3YgZXJyb3I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQltc2diX2ZyZWUobXNnKTsKKwkJKmVycm9yID0gcmV0OworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSByZXQ7CisJCXJldHVybiBOVUxMOworCX0KKworCW1zZ2JfcHV0KG1zZywgcmV0KTsKKworCS8qIHRoZW4gcmVhZCB0ZSBsZW5ndGggYXMgc3BlY2lmaWVkIGluIGhlYWRlciAqLworCW1zZy0+bDJoID0gbXNnLT5kYXRhICsgc2l6ZW9mKCpoaCk7CisJbGVuID0gbnRvaHMoaGgtPmxlbik7CisJcmV0ID0gcmVjdihiZmQtPmZkLCBtc2ctPmwyaCwgbGVuLCAwKTsKKwlpZiAocmV0IDwgbGVuKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgInNob3J0IHJlYWQhXG4iKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IC1FSU87CisJCXJldHVybiBOVUxMOworCX0KKwltc2diX3B1dChtc2csIHJldCk7CisKKwlyZXR1cm4gbXNnOworfQorCitzdGF0aWMgc3RydWN0IGlwYV9wcm94eV9jb25uICppcGNfYnlfcHJpdl9ucihzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBwcml2X25yKQoreworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqYnNjX2Nvbm47CisJdW5zaWduZWQgaW50IHRyeF9pZCA9IHByaXZfbnIgPj4gODsKKworCXN3aXRjaCAocHJpdl9uciAmIDB4ZmYpIHsKKwljYXNlIE9NTF9GUk9NX0JUUzogLyogaW5jb21pbmcgT01MIGRhdGEgZnJvbSBCVFMsIGZvcndhcmQgdG8gQlNDIE9NTCAqLworCQlic2NfY29ubiA9IGlwYmMtPmJzY19vbWxfY29ubjsKKwkJYnJlYWs7CisJY2FzZSBSU0xfRlJPTV9CVFM6IC8qIGluY29taW5nIFJTTCBkYXRhIGZyb20gQlRTLCBmb3J3YXJkIHRvIEJTQyBSU0wgKi8KKwkJYnNjX2Nvbm4gPSBpcGJjLT5ic2NfcnNsX2Nvbm5bdHJ4X2lkXTsKKwkJYnJlYWs7CisJY2FzZSBPTUxfVE9fQlNDOiAvKiBpbmNvbWluZyBPTUwgZGF0YSBmcm9tIEJTQywgZm9yd2FyZCB0byBCVFMgT01MICovCisJCWJzY19jb25uID0gaXBiYy0+b21sX2Nvbm47CisJCWJyZWFrOworCWNhc2UgUlNMX1RPX0JTQzogLyogaW5jb21pbmcgUlNMIGRhdGEgZnJvbSBCU0MsIGZvcndhcmQgdG8gQlRTIFJTTCAqLworCQlic2NfY29ubiA9IGlwYmMtPnJzbF9jb25uW3RyeF9pZF07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJzY19jb25uID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBic2NfY29ubjsKK30KKworc3RhdGljIHZvaWQgcmVjb25uX3Rtcl9jYih2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcGFfcHJveHkgKmlwcCA9IGRhdGE7CisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYzsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCWludCBpOworCisJREVCVUdQKERJTlAsICJSdW5uaW5nIHJlY29ubmVjdCB0aW1lclxuIik7CisKKwltZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOworCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlpbmV0X2F0b24oYnNjX2lwYWRkciwgJnNpbi5zaW5fYWRkcik7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShpcGJjLCAmaXBwLT5idHNfbGlzdCwgbGlzdCkgeworCQkvKiBpZiBPTUwgdG8gQlNDIGlzIGRlYWQsIHRyeSB0byByZXN0b3JlIGl0ICovCisJCWlmIChpcGJjLT5vbWxfY29ubiAmJiAhaXBiYy0+YnNjX29tbF9jb25uKSB7CisJCQlzaW4uc2luX3BvcnQgPSBodG9ucyhJUEFfVENQX1BPUlRfT01MKTsKKwkJCWxvZ3BfaXBiY191aWQoRElOUCwgTE9HTF9OT1RJQ0UsIGlwYmMsIDApOworCQkJTE9HUEMoRElOUCwgTE9HTF9OT1RJQ0UsICJPTUwgVHJ5aW5nIHRvIHJlY29ubmVjdFxuIik7CisJCQlpcGJjLT5ic2Nfb21sX2Nvbm4gPSBjb25uZWN0X2JzYygmc2luLCBPTUxfVE9fQlNDLCBpcGJjKTsKKwkJCWlmICghaXBiYy0+YnNjX29tbF9jb25uKQorCQkJCWdvdG8gcmVzY2hlZHVsZTsKKwkJCWxvZ3BfaXBiY191aWQoRElOUCwgTE9HTF9OT1RJQ0UsIGlwYmMsIDApOworCQkJTE9HUEMoRElOUCwgTE9HTF9OT1RJQ0UsICJPTUwgUmVjb25uZWN0ZWRcbiIpOworCQl9CisJCS8qIGlmIHdlIChzdGlsbCkgZG9uJ3QgaGF2ZSBhIE9NTCBjb25uZWN0aW9uLCBza2lwIFJTTCAqLworCQlpZiAoIWlwYmMtPm9tbF9jb25uIHx8ICFpcGJjLT5ic2Nfb21sX2Nvbm4pCisJCQljb250aW51ZTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcGJjLT5yc2xfY29ubik7IGkrKykgeworCQkJdW5zaWduZWQgaW50IHByaXZfbnI7CisJCQkvKiBkb24ndCBlc3RhYmxpc2ggUlNMIGxpbmtzIHdoaWNoIHdlIGRvbid0IGhhdmUgKi8KKwkJCWlmICghaXBiYy0+cnNsX2Nvbm5baV0pCisJCQkJY29udGludWU7CisJCQlpZiAoaXBiYy0+YnNjX3JzbF9jb25uW2ldKQorCQkJCWNvbnRpbnVlOworCQkJcHJpdl9uciA9IGlwYmMtPnJzbF9jb25uW2ldLT5mZC5wcml2X25yOworCQkJcHJpdl9uciAmPSB+MHhmZjsKKwkJCXByaXZfbnIgfD0gUlNMX1RPX0JTQzsKKwkJCXNpbi5zaW5fcG9ydCA9IGh0b25zKElQQV9UQ1BfUE9SVF9SU0wpOworCQkJbG9ncF9pcGJjX3VpZChESU5QLCBMT0dMX05PVElDRSwgaXBiYywgcHJpdl9uciA+PiA4KTsKKwkJCUxPR1BDKERJTlAsIExPR0xfTk9USUNFLCAiUlNMIFRyeWluZyB0byByZWNvbm5lY3RcbiIpOworCQkJaXBiYy0+YnNjX3JzbF9jb25uW2ldID0gY29ubmVjdF9ic2MoJnNpbiwgcHJpdl9uciwgaXBiYyk7CisJCQlpZiAoIWlwYmMtPmJzY19yc2xfY29ubikKKwkJCQlnb3RvIHJlc2NoZWR1bGU7CisJCQlsb2dwX2lwYmNfdWlkKERJTlAsIExPR0xfTk9USUNFLCBpcGJjLCBwcml2X25yID4+IDgpOworCQkJTE9HUEMoRElOUCwgTE9HTF9OT1RJQ0UsICJSU0wgUmVjb25uZWN0ZWRcbiIpOworCQl9CisJfQorCXJldHVybjsKKworcmVzY2hlZHVsZToKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmlwcC0+cmVjb25uX3RpbWVyLCA1LCAwKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2RlYWRfc29ja2V0KHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYyA9IGJmZC0+ZGF0YTsJCS8qIGxvY2FsIGNvbm4gKi8KKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmJzY19jb25uOwkJLyogcmVtb3RlIGNvbm4gKi8KKwlzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjID0gaXBjLT5idHNfY29ubjsKKwl1bnNpZ25lZCBpbnQgdHJ4X2lkID0gYmZkLT5wcml2X25yID4+IDg7CisJc3RydWN0IG1zZ2IgKm1zZywgKm1zZzI7CisKKwlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCWNsb3NlKGJmZC0+ZmQpOworCWJmZC0+ZmQgPSAtMTsKKworCS8qIEZJWE1FOiBjbGVhciB0eF9xdWV1ZSwgcmVtb3ZlIGFsbCByZWZlcmVuY2VzLCBldGMuICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtc2csIG1zZzIsICZpcGMtPnR4X3F1ZXVlLCBsaXN0KQorCQltc2diX2ZyZWUobXNnKTsKKworCXN3aXRjaCAoYmZkLT5wcml2X25yICYgMHhmZikgeworCWNhc2UgT01MX0ZST01fQlRTOiAvKiBpbmNvbWluZyBPTUwgZGF0YSBmcm9tIEJUUywgZm9yd2FyZCB0byBCU0MgT01MICovCisJCWlwYmMtPm9tbF9jb25uID0gTlVMTDsKKwkJYnNjX2Nvbm4gPSBpcGJjLT5ic2Nfb21sX2Nvbm47CisJCS8qIGNsb3NlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBCU0MgKi8KKwkJYnNjX3VucmVnaXN0ZXJfZmQoJmJzY19jb25uLT5mZCk7CisJCWNsb3NlKGJzY19jb25uLT5mZC5mZCk7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXNnLCBtc2cyLCAmYnNjX2Nvbm4tPnR4X3F1ZXVlLCBsaXN0KQorCQkJbXNnYl9mcmVlKG1zZyk7CisJCXRhbGxvY19mcmVlKGJzY19jb25uKTsKKwkJaXBiYy0+YnNjX29tbF9jb25uID0gTlVMTDsKKwkJLyogRklYTUU6IGRvIHdlIG5lZWQgdG8gZGVsZXRlIHRoZSBlbnRpcmUgaXBiYyA/ICovCisJCWJyZWFrOworCWNhc2UgUlNMX0ZST01fQlRTOiAvKiBpbmNvbWluZyBSU0wgZGF0YSBmcm9tIEJUUywgZm9yd2FyZCB0byBCU0MgUlNMICovCisJCWlwYmMtPnJzbF9jb25uW3RyeF9pZF0gPSBOVUxMOworCQlic2NfY29ubiA9IGlwYmMtPmJzY19yc2xfY29ublt0cnhfaWRdOworCQkvKiBjbG9zZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgQlNDICovCisJCWJzY191bnJlZ2lzdGVyX2ZkKCZic2NfY29ubi0+ZmQpOworCQljbG9zZShic2NfY29ubi0+ZmQuZmQpOworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgbXNnMiwgJmJzY19jb25uLT50eF9xdWV1ZSwgbGlzdCkKKwkJCW1zZ2JfZnJlZShtc2cpOworCQl0YWxsb2NfZnJlZShic2NfY29ubik7CisJCWlwYmMtPmJzY19yc2xfY29ublt0cnhfaWRdID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBPTUxfVE9fQlNDOiAvKiBpbmNvbWluZyBPTUwgZGF0YSBmcm9tIEJTQywgZm9yd2FyZCB0byBCVFMgT01MICovCisJCWlwYmMtPmJzY19vbWxfY29ubiA9IE5VTEw7CisJCWJzY19jb25uID0gaXBiYy0+b21sX2Nvbm47CisJCS8qIHN0YXJ0IHJlY29ubmVjdCB0aW1lciAqLworCQlic2Nfc2NoZWR1bGVfdGltZXIoJmlwcC0+cmVjb25uX3RpbWVyLCA1LCAwKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfVE9fQlNDOiAvKiBpbmNvbWluZyBSU0wgZGF0YSBmcm9tIEJTQywgZm9yd2FyZCB0byBCVFMgUlNMICovCisJCWlwYmMtPmJzY19yc2xfY29ublt0cnhfaWRdID0gTlVMTDsKKwkJYnNjX2Nvbm4gPSBpcGJjLT5yc2xfY29ublt0cnhfaWRdOworCQkvKiBzdGFydCByZWNvbm5lY3QgdGltZXIgKi8KKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZpcHAtPnJlY29ubl90aW1lciwgNSwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJzY19jb25uID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCisJdGFsbG9jX2ZyZWUoaXBjKTsKK30KKworc3RhdGljIGludCBoYW5kbGVfdGNwX3JlYWQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjID0gYmZkLT5kYXRhOworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmMgPSBpcGMtPmJ0c19jb25uOworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqYnNjX2Nvbm47CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqaGg7CisJaW50IHJldCA9IDA7CisJY2hhciAqYnRzYnNjOworCisJaWYgKChiZmQtPnByaXZfbnIgJiAweGZmKSA8PSAyKQorCQlidHNic2MgPSAiQlRTIjsKKwllbHNlCisJCWJ0c2JzYyA9ICJCU0MiOworCisJbXNnID0gaXBhY2Nlc3NfcmVhZF9tc2coYmZkLCAmcmV0KTsKKwlpZiAoIW1zZykgeworCQlpZiAocmV0ID09IDApIHsKKwkJCWxvZ3BfaXBiY191aWQoRElOUCwgTE9HTF9OT1RJQ0UsIGlwYmMsIGJmZC0+cHJpdl9uciA+PiA4KTsKKwkJCUxPR1BDKERJTlAsIExPR0xfTk9USUNFLCAiJXMgZGlzYXBwZWFyZWQsICIKKwkJCSAgICAgImRlYWQgc29ja2V0XG4iLCBidHNic2MpOworCQkJaGFuZGxlX2RlYWRfc29ja2V0KGJmZCk7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CisKKwltc2diX3B1dChtc2csIHJldCk7CisJbG9ncF9pcGJjX3VpZChETUksIExPR0xfREVCVUcsIGlwYmMsIGJmZC0+cHJpdl9uciA+PiA4KTsKKwlERUJVR1BDKERNSSwgIlJYPC0lczogJXNcbiIsIGJ0c2JzYywgaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisKKwloaCA9IChzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqKSBtc2ctPmRhdGE7CisJaWYgKGhoLT5wcm90byA9PSBJUEFDX1BST1RPX0lQQUNDRVNTKSB7CisJCXJldCA9IGlwYWNjZXNzX3Jjdm1zZyhpcGMsIG1zZywgYmZkKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJCQljbG9zZShiZmQtPmZkKTsKKwkJCWJmZC0+ZmQgPSAtMTsKKwkJCXRhbGxvY19mcmVlKGJmZCk7CisJCX0KKwkJLyogd2UgZG8gbm90IGZvcndhcmQgdGhlIENDTSBwcm90b2NvbCB0aHJvdWdoIHRoZQorCQkgKiBwcm94eSBidXQgcmF0aGVyIHRlcm1pbmF0ZSBpdCBvdXJzZWx2ZXMgKi8KKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFpcGJjKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwKKwkJICAgICAicmVjZWl2ZWQgJXMgcGFja2V0IGJ1dCBubyBpcGMtPmJ0c19jb25uPyE/XG4iLCBidHNic2MpOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJYnNjX2Nvbm4gPSBpcGNfYnlfcHJpdl9ucihpcGJjLCBiZmQtPnByaXZfbnIpOworCWlmIChic2NfY29ubikgeworCQkvKiBlbnF1ZXVlIHBhY2tldCB0b3dhcmRzIEJTQyAqLworCQltc2diX2VucXVldWUoJmJzY19jb25uLT50eF9xdWV1ZSwgbXNnKTsKKwkJLyogbWFyayByZXNwZWN0aXZlIGZpbGVkZXNjcmlwdG9yIGFzICd3ZSB3YW50IHRvIHdyaXRlJyAqLworCQlic2NfY29ubi0+ZmQud2hlbiB8PSBCU0NfRkRfV1JJVEU7CisJfSBlbHNlIHsKKwkJbG9ncF9pcGJjX3VpZChESU5QLCBMT0dMX0lORk8sIGlwYmMsIGJmZC0+cHJpdl9uciA+PiA4KTsKKwkJTE9HUEMoRElOUCwgTE9HTF9JTkZPLCAiRHJvcHBpbmcgcGFja2V0IGZyb20gJXMsICIKKwkJICAgICAic2luY2UgcmVtb3RlIGNvbm5lY3Rpb24gaXMgZGVhZFxuIiwgYnRzYnNjKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogYSBUQ1Agc29ja2V0IGlzIHJlYWR5IHRvIGJlIHdyaXR0ZW4gdG8gKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3RjcF93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGlwYV9wcm94eV9jb25uICppcGMgPSBiZmQtPmRhdGE7CisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYyA9IGlwYy0+YnRzX2Nvbm47CisJc3RydWN0IGxsaXN0X2hlYWQgKmxoOworCXN0cnVjdCBtc2diICptc2c7CisJY2hhciAqYnRzYnNjOworCWludCByZXQ7CisKKwlpZiAoKGJmZC0+cHJpdl9uciAmIDB4ZmYpIDw9IDIpCisJCWJ0c2JzYyA9ICJCVFMiOworCWVsc2UKKwkJYnRzYnNjID0gIkJTQyI7CisKKworCS8qIGdldCB0aGUgbmV4dCBtc2cgZm9yIHRoaXMgdGltZXNsb3QgKi8KKwlpZiAobGxpc3RfZW1wdHkoJmlwYy0+dHhfcXVldWUpKSB7CisJCWJmZC0+d2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCQlyZXR1cm4gMDsKKwl9CisJbGggPSBpcGMtPnR4X3F1ZXVlLm5leHQ7CisJbGxpc3RfZGVsKGxoKTsKKwltc2cgPSBsbGlzdF9lbnRyeShsaCwgc3RydWN0IG1zZ2IsIGxpc3QpOworCisJbG9ncF9pcGJjX3VpZChETUksIExPR0xfREVCVUcsIGlwYmMsIGJmZC0+cHJpdl9uciA+PiA4KTsKKwlERUJVR1BDKERNSSwgIlRYICUwNHg6ICVzXG4iLCBiZmQtPnByaXZfbnIsCisJCWhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCisJcmV0ID0gc2VuZChiZmQtPmZkLCBtc2ctPmRhdGEsIG1zZy0+bGVuLCAwKTsKKwltc2diX2ZyZWUobXNnKTsKKworCWlmIChyZXQgPT0gMCkgeworCQlsb2dwX2lwYmNfdWlkKERJTlAsIExPR0xfTk9USUNFLCBpcGJjLCBiZmQtPnByaXZfbnIgPj4gOCk7CisJCUxPR1AoRElOUCwgTE9HTF9OT1RJQ0UsICIlcyBkaXNhcHBlYXJlZCwgZGVhZCBzb2NrZXRcbiIsIGJ0c2JzYyk7CisJCWhhbmRsZV9kZWFkX3NvY2tldChiZmQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIGNhbGxiYWNrIGZyb20gc2VsZWN0LmMgaW4gY2FzZSBvbmUgb2YgdGhlIGZkJ3MgY2FuIGJlIHJlYWQvd3JpdHRlbiAqLworc3RhdGljIGludCBpcGFjY2Vzc19mZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCWludCByYyA9IDA7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKSB7CisJCXJjID0gaGFuZGxlX3RjcF9yZWFkKGJmZCk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJfQorCWlmICh3aGF0ICYgQlNDX0ZEX1dSSVRFKQorCQlyYyA9IGhhbmRsZV90Y3Bfd3JpdGUoYmZkKTsKKworCXJldHVybiByYzsKK30KKworLyogY2FsbGJhY2sgb2YgdGhlIGxpc3RlbmluZyBmaWxlZGVzY3JpcHRvciAqLworc3RhdGljIGludCBsaXN0ZW5fZmRfY2Ioc3RydWN0IGJzY19mZCAqbGlzdGVuX2JmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYzsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQ7CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCXNvY2tsZW5fdCBzYV9sZW4gPSBzaXplb2Yoc2EpOworCisJaWYgKCEod2hhdCAmIEJTQ19GRF9SRUFEKSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBhY2NlcHQobGlzdGVuX2JmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhLCAmc2FfbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoImFjY2VwdCIpOworCQlyZXR1cm4gcmV0OworCX0KKwlERUJVR1AoRElOUCwgImFjY2VwdCgpZWQgbmV3ICVzIGxpbmsgZnJvbSAlc1xuIiwgCisJCShsaXN0ZW5fYmZkLT5wcml2X25yICYgMHhmZikgPT0gT01MX0ZST01fQlRTID8gIk9NTCIgOiAiUlNMIiwKKwkJaW5ldF9udG9hKHNhLnNpbl9hZGRyKSk7CisKKwlpcGMgPSBhbGxvY19jb25uKCk7CisJaWYgKCFpcGMpIHsKKwkJY2xvc2UocmV0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYmZkID0gJmlwYy0+ZmQ7CisJYmZkLT5mZCA9IHJldDsKKwliZmQtPmRhdGEgPSBpcGM7CisJYmZkLT5wcml2X25yID0gbGlzdGVuX2JmZC0+cHJpdl9ucjsKKwliZmQtPmNiID0gaXBhY2Nlc3NfZmRfY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IHJlZ2lzdGVyIEZEXG4iKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXRhbGxvY19mcmVlKGlwYyk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogUmVxdWVzdCBJRC4gRklYTUU6IHJlcXVlc3QgTE9DQVRJT04sIEhXL1NXIFZFcnNpb24sIFVuaXQgTmFtZSwgU2Vybm8gKi8KKwlyZXQgPSB3cml0ZShiZmQtPmZkLCBpZF9yZXEsIHNpemVvZihpZF9yZXEpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1ha2VfbGlzdGVuX3NvY2soc3RydWN0IGJzY19mZCAqYmZkLCB1X2ludDE2X3QgcG9ydCwgaW50IHByaXZfbnIsCisJCSAgICAgaW50ICgqY2IpKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkpCit7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJaW50IHJldCwgb24gPSAxOworCisJYmZkLT5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworCWJmZC0+Y2IgPSBjYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwliZmQtPnByaXZfbnIgPSBwcml2X25yOworCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCWlmICghbGlzdGVuX2lwYWRkcikKKwkJYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCWVsc2UKKwkJaW5ldF9hdG9uKGxpc3Rlbl9pcGFkZHIsICZhZGRyLnNpbl9hZGRyKTsKKworCXNldHNvY2tvcHQoYmZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJcmV0ID0gYmluZChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBiaW5kIGxpc3RlbiBzb2NrZXQgJXNcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXQgPSBsaXN0ZW4oYmZkLT5mZCwgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJsaXN0ZW4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoInJlZ2lzdGVyX2xpc3Rlbl9mZCIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworLyogQWN0aXZlbHkgY29ubmVjdCB0byBhIEJTQy4gICovCitzdGF0aWMgc3RydWN0IGlwYV9wcm94eV9jb25uICpjb25uZWN0X2JzYyhzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhLCBpbnQgcHJpdl9uciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYzsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQ7CisJaW50IHJldCwgb24gPSAxOworCisJaXBjID0gYWxsb2NfY29ubigpOworCWlmICghaXBjKQorCQlyZXR1cm4gTlVMTDsKKworCWlwYy0+YnRzX2Nvbm4gPSBkYXRhOworCisJYmZkID0gJmlwYy0+ZmQ7CisJYmZkLT5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworCWJmZC0+Y2IgPSBpcGFjY2Vzc19mZF9jYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRCB8IEJTQ19GRF9XUklURTsKKwliZmQtPmRhdGEgPSBpcGM7CisJYmZkLT5wcml2X25yID0gcHJpdl9ucjsKKworCXNldHNvY2tvcHQoYmZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJcmV0ID0gY29ubmVjdChiZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopIHNhLCBzaXplb2YoKnNhKSk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGNvbm5lY3Qgc29ja2V0XG4iKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXRhbGxvY19mcmVlKGlwYyk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIHByZS1maWxsIHR4X3F1ZXVlIHdpdGggaWRlbnRpdHkgcmVxdWVzdCAqLworCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCWNsb3NlKGJmZC0+ZmQpOworCQl0YWxsb2NfZnJlZShpcGMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gaXBjOworfQorCitzdGF0aWMgaW50IGlwYWNjZXNzX3Byb3h5X3NldHVwKHZvaWQpCit7CisJaW50IHJldDsKKworCWlwcCA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGlwYV9wcm94eSk7CisJaWYgKCFpcHApCisJCXJldHVybiAtRU5PTUVNOworCUlOSVRfTExJU1RfSEVBRCgmaXBwLT5idHNfbGlzdCk7CisJaXBwLT5yZWNvbm5fdGltZXIuY2IgPSByZWNvbm5fdG1yX2NiOworCWlwcC0+cmVjb25uX3RpbWVyLmRhdGEgPSBpcHA7CisKKwkvKiBMaXN0ZW4gZm9yIE9NTCBjb25uZWN0aW9ucyAqLworCXJldCA9IG1ha2VfbGlzdGVuX3NvY2soJmlwcC0+b21sX2xpc3Rlbl9mZCwgSVBBX1RDUF9QT1JUX09NTCwKKwkJCQlPTUxfRlJPTV9CVFMsIGxpc3Rlbl9mZF9jYik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBMaXN0ZW4gZm9yIFJTTCBjb25uZWN0aW9ucyAqLworCXJldCA9IG1ha2VfbGlzdGVuX3NvY2soJmlwcC0+cnNsX2xpc3Rlbl9mZCwgSVBBX1RDUF9QT1JUX1JTTCwKKwkJCQlSU0xfRlJPTV9CVFMsIGxpc3Rlbl9mZF9jYik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbmFsKQoreworCWZwcmludGYoc3Rkb3V0LCAic2lnbmFsICV1IHJlY2VpdmVkXG4iLCBzaWduYWwpOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNJR0FCUlQ6CisJCS8qIGluIGNhc2Ugb2YgYWJvcnQsIHdlIHdhbnQgdG8gb2J0YWluIGEgdGFsbG9jIHJlcG9ydAorCQkgKiBhbmQgdGhlbiByZXR1cm4gdG8gdGhlIGNhbGxlciwgd2hvIHdpbGwgYWJvcnQgdGhlIHByb2Nlc3MgKi8KKwljYXNlIFNJR1VTUjE6CisJCXRhbGxvY19yZXBvcnRfZnVsbCh0YWxsX2JzY19jdHgsIHN0ZGVycik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCByYzsKKworCWxpc3Rlbl9pcGFkZHIgPSAiMTkyLjE2OC4xMDAuMTEiOworCWJzY19pcGFkZHIgPSAiMTkyLjE2OC4xMDAuMjM5IjsKKworCXRhbGxfYnNjX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAxLCAiaXBhY2Nlc3MtcHJveHkiKTsKKworCWxvZ19pbml0KCZsb2dfaW5mbyk7CisJc3RkZXJyX3RhcmdldCA9IGxvZ190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWxvZ19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWxvZ19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKwlsb2dfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdGRlcnJfdGFyZ2V0LCAiRElOUDpETUkiKTsKKworCXJjID0gaXBhY2Nlc3NfcHJveHlfc2V0dXAoKTsKKwlpZiAocmMgPCAwKQorCQlleGl0KDEpOworCisJc2lnbmFsKFNJR1VTUjEsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR0FCUlQsICZzaWduYWxfaGFuZGxlcik7CisKKwl3aGlsZSAoMSkgeworCQlic2Nfc2VsZWN0X21haW4oMCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXNkbnN5bmMuYyBiL29wZW5ic2Mvc3JjL2lzZG5zeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg4MTlhYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lzZG5zeW5jLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qIGlzZG5zeW5jLmMKKyAqCisgKiBBdXRob3IgICAgICAgQW5kcmVhcyBFdmVyc2JlcmcgPGpvbGx5QGV2ZXJzYmVyZy5ldT4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlICJtSVNETmlmLmgiCisjZGVmaW5lIE1JU0ROX09MRF9BRl9DT01QQVRJQklMSVRZCisjZGVmaW5lIEFGX0NPTVBBVElCSUxJVFlfRlVOQworI2luY2x1ZGUgImNvbXBhdF9hZl9pc2RuLmgiCisKK2ludCBjYXJkID0gMDsKK2ludCBzb2NrID0gLTE7CisKK2ludCBtSVNETl9vcGVuKHZvaWQpCit7CisJaW50CQkJZmQsIHJldDsKKwlzdHJ1Y3QgbUlTRE5fZGV2aW5mbwlkZXZpbmZvOworCXN0cnVjdCBzb2NrYWRkcl9tSVNETglsMmFkZHI7CisKKwlmZCA9IHNvY2tldChQRl9JU0ROLCBTT0NLX1JBVywgSVNETl9QX0JBU0UpOworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3Qgb3BlbiBzb2NrZXQgKCVzKVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIGZkOworCX0KKwlkZXZpbmZvLmlkID0gY2FyZDsKKwlyZXQgPSBpb2N0bChmZCwgSU1HRVRERVZJTkZPLCAmZGV2aW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsImNvdWxkIG5vdCBzZW5kIElPQ1RMIElNR0VUQ09VTlQgKCVzKVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gcmV0OworCX0KKwljbG9zZShmZCk7CisJaWYgKCEoZGV2aW5mby5EcHJvdG9jb2xzICYgKDEgPDwgSVNETl9QX1RFX1MwKSkKKwkgJiYgIShkZXZpbmZvLkRwcm90b2NvbHMgJiAoMSA8PCBJU0ROX1BfVEVfRTEpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwiSW50ZXJmYWNlIGRvZXMgbm90IHN1cHBvcnQgVEUgbW9kZSAoJXMpXG4iLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShmZCk7CisJCXJldHVybiByZXQ7CisJfQorCWZkID0gc29ja2V0KFBGX0lTRE4sIFNPQ0tfREdSQU0sIElTRE5fUF9MQVBEX1RFKTsKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCJjb3VsZCBub3Qgb3BlbiBJU0ROX1BfTEFQRF9URSBzb2NrZXQgKCVzKVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIGZkOworCX0KKwlsMmFkZHIuZmFtaWx5ID0gQUZfSVNETjsKKwlsMmFkZHIuZGV2ID0gY2FyZDsKKwlsMmFkZHIuY2hhbm5lbCA9IDA7CisJbDJhZGRyLnNhcGkgPSAwOworCWwyYWRkci50ZWkgPSAwOworCXJldCA9IGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmbDJhZGRyLCBzaXplb2YobDJhZGRyKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsImNvdWxkIG5vdCBiaW5kIHNvY2tldCBmb3IgY2FyZCAlZCAoJXMpXG4iLCBjYXJkLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShmZCk7CisJCXJldHVybiByZXQ7CisJfQorCXNvY2sgPSBmZDsKKworCXJldHVybiBzb2NrOworfQorCisKK3ZvaWQgbUlTRE5faGFuZGxlKHZvaWQpCit7CisJaW50IHJldDsKKwlmZF9zZXQgcmZkOworCXN0cnVjdCB0aW1ldmFsIHR2OworCXN0cnVjdCBzb2NrYWRkcl9tSVNETiBhZGRyOworCXNvY2tsZW5fdCBhbGVuOworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzIwNDhdOworCXN0cnVjdCBtSVNETmhlYWQgKmhoID0gKHN0cnVjdCBtSVNETmhlYWQgKilidWZmZXI7CisJaW50IGwxID0gMCwgbDIgPSAwLCB0ZWkgPSAwOworCisJd2hpbGUoMSkgeworYWdhaW46CisJCUZEX1pFUk8oJnJmZCk7CisJCUZEX1NFVChzb2NrLCAmcmZkKTsKKwkJdHYudHZfc2VjID0gMjsKKwkJdHYudHZfdXNlYyA9IDA7CisJCXJldCA9IHNlbGVjdChzb2NrKzEsICZyZmQsIE5VTEwsIE5VTEwsICZ0dik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGFib3J0ZWQ6ICVzXG4iLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoRkRfSVNTRVQoc29jaywgJnJmZCkpIHsKKwkJCWFsZW4gPSBzaXplb2YoYWRkcik7CisJCQlyZXQgPSByZWN2ZnJvbShzb2NrLCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAwLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCAmYWxlbik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXMgcmVhZCBzb2NrZXQgZXJyb3IgJXNcbiIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0gZWxzZSBpZiAocmV0IDwgTUlTRE5fSEVBREVSX0xFTikgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIHJlYWQgc29ja2V0IHNob3IgZnJhbWVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQl9IGVsc2UgeworCQkJCXN3aXRjaChoaC0+cHJpbSkgeworCQkJCQljYXNlIE1QSF9BQ1RJVkFURV9JTkQ6CisJCQkJCWNhc2UgUEhfQUNUSVZBVEVfSU5EOgorCQkJCQkJaWYgKCFsMSkgeworCQkJCQkJCXByaW50ZigiUEhfQUNUSVZBVEVcbiIpOworCQkJCQkJCXByaW50ZigiKioqIFN5bmMgYXZhaWxhYmxlIGZyb20gaW50ZXJmYWNlIDotKVxuIik7CisJCQkJCQkJbDEgPSAxOworCQkJCQkJfQorCQkJCQkJZ290byBhZ2FpbjsKKwkJCQkJYnJlYWs7CisJCQkJCWNhc2UgTVBIX0RFQUNUSVZBVEVfSU5EOgorCQkJCQljYXNlIFBIX0RFQUNUSVZBVEVfSU5EOgorCQkJCQkJaWYgKGwxKSB7CisJCQkJCQkJcHJpbnRmKCJQSF9ERUFDVElWQVRFXG4iKTsKKwkJCQkJCQlwcmludGYoIioqKiBMb3N0IHN5bmMgb24gaW50ZXJmYWNlICAgICAgICA6LShcbiIpOworCQkJCQkJCWwxID0gMDsKKwkJCQkJCX0KKwkJCQkJCWdvdG8gYWdhaW47CisJCQkJCWJyZWFrOworCQkJCQljYXNlIERMX0VTVEFCTElTSF9JTkQ6CisJCQkJCWNhc2UgRExfRVNUQUJMSVNIX0NORjoKKwkJCQkJCXByaW50ZigiRExfRVNUQUJMSVNIXG4iKTsKKwkJCQkJCWwyID0gMTsKKwkJCQkJCWdvdG8gYWdhaW47CisJCQkJCWJyZWFrOworCQkJCQljYXNlIERMX1JFTEVBU0VfSU5EOgorCQkJCQljYXNlIERMX1JFTEVBU0VfQ05GOgorCQkJCQkJcHJpbnRmKCJETF9SRUxFQVNFXG4iKTsKKwkJCQkJCWwyID0gMDsKKwkJCQkJCWdvdG8gYWdhaW47CisJCQkJCWJyZWFrOworCQkJCQljYXNlIERMX0lORk9STUFUSU9OX0lORDoKKwkJCQkJCXByaW50ZigiRExfSU5GT1JNQVRJT04gKHRlaSAlZCBzYXBpICVkKVxuIiwgYWRkci50ZWksIGFkZHIuc2FwaSk7CisJCQkJCQl0ZWkgPSAxOworCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKy8vCQkJCQkJcHJpbnRmKCJwcmltICV4XG4iLCBoaC0+cHJpbSk7CisJCQkJCQlnb3RvIGFnYWluOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAodGVpICYmICFsMikgeworCQkJaGgtPnByaW0gPSBETF9FU1RBQkxJU0hfUkVROworCQkJcHJpbnRmKCItPiBhY3RpdmF0aW5nIGxheWVyIDJcbiIpOworCQkJc2VuZHRvKHNvY2ssIGJ1ZmZlciwgTUlTRE5fSEVBREVSX0xFTiwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgYWxlbik7CisJCX0KKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IHJldDsKKworCWlmIChhcmdjIDw9IDEpCisJeworCQlwcmludGYoIlVzYWdlOiAlcyA8Y2FyZD5cblxuIiwgYXJndlswXSk7CisJCXByaW50ZigiT3BlbnMgZ2l2ZW4gY2FyZCBudW1iZXIgaW4gVEUtbW9kZSBQVFAgYW5kIHRyaWVzIHRvIGtlZXAgbGF5ZXIgMiBlc3RhYmxpc2hlZC5cbiIpOworCQlwcmludGYoIlRoaXMga2VlcHMgbGF5ZXIgMSBhY3RpdmF0ZWQgdG8gcmV0cmlldmUgYSBzdGVhZHkgc3luYyBzaWduYWwgZnJvbSBuZXR3b3JrLlxuIik7CisJCXJldHVybigwKTsKKwl9CisKKwljYXJkID0gYXRvaShhcmd2WzFdKTsKKworCWluaXRfYWZfaXNkbigpOworCisJaWYgKChyZXQgPSBtSVNETl9vcGVuKCkgPCAwKSkKKwkJcmV0dXJuKHJldCk7CisKKwltSVNETl9oYW5kbGUoKTsKKworCWNsb3NlKHNvY2spOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tZWFzX3JlcC5jIGIvb3BlbmJzYy9zcmMvbWVhc19yZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjljYzFhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvbWVhc19yZXAuYwpAQCAtMCwwICsxLDExNCBAQAorLyogTWVhc3VyZW1lbnQgUmVwb3J0IFByb2Nlc3NpbmcgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWVhc19yZXAuaD4KKworc3RhdGljIGludCBnZXRfZmllbGQoY29uc3Qgc3RydWN0IGdzbV9tZWFzX3JlcCAqcmVwLAorCQkgICAgIGVudW0gbWVhc19yZXBfZmllbGQgZmllbGQpCit7CisJc3dpdGNoIChmaWVsZCkgeworCWNhc2UgTUVBU19SRVBfRExfUlhMRVZfRlVMTDoKKwkJcmV0dXJuIHJlcC0+ZGwuZnVsbC5yeF9sZXY7CisJY2FzZSBNRUFTX1JFUF9ETF9SWExFVl9TVUI6CisJCXJldHVybiByZXAtPmRsLnN1Yi5yeF9sZXY7CisJY2FzZSBNRUFTX1JFUF9ETF9SWFFVQUxfRlVMTDoKKwkJcmV0dXJuIHJlcC0+ZGwuZnVsbC5yeF9xdWFsOworCWNhc2UgTUVBU19SRVBfRExfUlhRVUFMX1NVQjoKKwkJcmV0dXJuIHJlcC0+ZGwuc3ViLnJ4X3F1YWw7CisJY2FzZSBNRUFTX1JFUF9VTF9SWExFVl9GVUxMOgorCQlyZXR1cm4gcmVwLT51bC5mdWxsLnJ4X2xldjsKKwljYXNlIE1FQVNfUkVQX1VMX1JYTEVWX1NVQjoKKwkJcmV0dXJuIHJlcC0+dWwuc3ViLnJ4X2xldjsKKwljYXNlIE1FQVNfUkVQX1VMX1JYUVVBTF9GVUxMOgorCQlyZXR1cm4gcmVwLT51bC5mdWxsLnJ4X3F1YWw7CisJY2FzZSBNRUFTX1JFUF9VTF9SWFFVQUxfU1VCOgorCQlyZXR1cm4gcmVwLT51bC5zdWIucnhfcXVhbDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCit1bnNpZ25lZCBpbnQgY2FsY19pbml0aWFsX2lkeCh1bnNpZ25lZCBpbnQgYXJyYXlfc2l6ZSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBtZWFzX3JlcF9pZHgsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtX3ZhbHVlcykKK3sKKwlpbnQgb2ZmcywgaWR4OworCisJLyogZnJvbSB3aGljaCBlbGVtZW50IGRvIHdlIG5lZWQgdG8gc3RhcnQgaWYgd2UncmUgaW50ZXJlc3RlZAorCSAqIGluIGFuIGF2ZXJhZ2Ugb2YgJ251bScgZWxlbWVudHMgKi8KKwlvZmZzID0gbWVhc19yZXBfaWR4IC0gbnVtX3ZhbHVlczsKKworCWlmIChvZmZzIDwgMCkKKwkJaWR4ID0gYXJyYXlfc2l6ZSArIG9mZnM7CisJZWxzZQorCQlpZHggPSBvZmZzOworCisJcmV0dXJuIGlkeDsKK30KKworLyogb2J0YWluIGFuIGF2ZXJhZ2Ugb3ZlciB0aGUgbGFzdCAnbnVtJyBmaWVsZHMgaW4gdGhlIG1lYXMgcmVwcyAqLworaW50IGdldF9tZWFzX3JlcF9hdmcoY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCSAgICAgZW51bSBtZWFzX3JlcF9maWVsZCBmaWVsZCwgdW5zaWduZWQgaW50IG51bSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgaWR4OworCWludCBhdmcgPSAwOworCisJaWR4ID0gY2FsY19pbml0aWFsX2lkeChBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCksCisJCQkJbGNoYW4tPm1lYXNfcmVwX2lkeCwgbnVtKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlpbnQgaiA9IChpZHgraSkgJSBBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCk7CisKKwkJYXZnICs9IGdldF9maWVsZCgmbGNoYW4tPm1lYXNfcmVwW2pdLCBmaWVsZCk7CisJfQorCisJcmV0dXJuIGF2ZyAvIG51bTsKK30KKworLyogQ2hlY2sgaWYgTiBvdXQgb2YgTSBsYXN0IHZhbHVlcyBmb3IgRklFTEQgYXJlID49IGJkICovCitpbnQgbWVhc19yZXBfbl9vdXRfb2ZfbV9iZShjb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJCWVudW0gbWVhc19yZXBfZmllbGQgZmllbGQsCisJCQl1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IG0sIGludCBiZSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgaWR4OworCWludCBjb3VudCA9IDA7CisKKwlpZHggPSBjYWxjX2luaXRpYWxfaWR4KEFSUkFZX1NJWkUobGNoYW4tPm1lYXNfcmVwKSwKKwkJCQlsY2hhbi0+bWVhc19yZXBfaWR4LCBtKTsKKworCWZvciAoaSA9IDA7IGkgPCBtOyBpKyspIHsKKwkJaW50IGogPSAoaWR4ICsgaSkgJSBBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCk7CisJCWludCB2YWwgPSBnZXRfZmllbGQoJmxjaGFuLT5tZWFzX3JlcFtqXSwgZmllbGQpOworCisJCWlmICh2YWwgPj0gYmUpCisJCQljb3VudCsrOworCisJCWlmIChjb3VudCA+PSBuKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tZ2NwLmNmZyBiL29wZW5ic2Mvc3JjL21nY3AuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OGY1NDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tZ2NwLmNmZwpAQCAtMCwwICsxLDE5IEBACishCishIE1HQ1AgY29uZmlndXJhdGlvbiBoYW5kIGVkaXRlZAorISAgICEKK3Bhc3N3b3JkIGZvbworIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorbWdjcAorISAgbG9jYWwgaXAgMjEzLjE2Ny4xMzQuMTQKKyAgYnRzIGlwIDE3Mi4xNi4yNTIuNDMKKyAgYmluZCBpcCAyMTMuMTY3LjEzNC4xNDEKKyAgYmluZCBwb3J0IDI0MjcKKyAgYmluZCBlYXJseSAxCisgIHJ0cCBiYXNlIDQwMDAKKyAgc2RwIGF1ZGlvIHBheWxvYWQgbnVtYmVyIDk4CisgIHNkcCBhdWRpbyBwYXlsb2FkIG5hbWUgQU1SLzgwMDAKKyAgbnVtYmVyIGVuZHBvaW50cyAzMQorICBsb29wIDEKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9tYWluLmMgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNjQwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfbWFpbi5jCkBAIC0wLDAgKzEsMjM3IEBACisvKiBBIE1lZGlhIEdhdGV3YXkgQ29udHJvbCBQcm90b2NvbCBNZWRpYSBHYXRld2F5OiBSRkMgMzQzNSAqLworLyogVGhlIG1haW4gbWV0aG9kIHRvIGRyaXZlIGl0IGFzIGEgc3RhbmRhbG9uZSBwcm9jZXNzICAgICAgKi8KKworLyoKKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5IGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIi4uLy4uL2JzY2NvbmZpZy5oIgorCisvKiB0aGlzIGlzIGhlcmUgZm9yIHRoZSB2dHkuLi4gaXQgd2lsbCBuZXZlciBiZSBjYWxsZWQgKi8KK3ZvaWQgc3Vic2NyX3B1dCgpIHsgYWJvcnQoKTsgfQorCisjZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKKyN3YXJuaW5nICJNYWtlIHVzZSBvZiB0aGUgcnRwIHByb3h5IGNvZGUiCisKK3N0YXRpYyBzdHJ1Y3QgYnNjX2ZkIGJmZDsKK3N0YXRpYyBpbnQgZmlyc3RfcmVxdWVzdCA9IDE7CitzdGF0aWMgc3RydWN0IG1nY3BfY29uZmlnICpjZmc7Citjb25zdCBjaGFyICpvcGVuYnNjX3ZlcnNpb24gPSAiT3BlbkJTQyBNR0NQICIgUEFDS0FHRV9WRVJTSU9OOworY29uc3QgY2hhciAqb3BlbmJzY19jb3B5cmlnaHQgPSAKKwkiQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgSG9sZ2VyIEZyZXl0aGVyIGFuZCBPbi1XYXZlc1xuIgorCSJDb250cmlidXRpb25zIGJ5IERhbmllbCBXaWxsbWFubiwgSmFuIEzDvGJiZSxTdGVmYW4gU2NobWlkdFxuIgorCSJEaWV0ZXIgU3BhYXIsIEFuZHJlYXMgRXZlcnNiZXJnLCBIYXJhbGQgV2VsdGVcblxuIgorCSJMaWNlbnNlIEdQTHYyKzogR05VIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIgPGh0dHA6Ly9nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sPlxuIgorCSJUaGlzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBhcmUgZnJlZSB0byBjaGFuZ2UgYW5kIHJlZGlzdHJpYnV0ZSBpdC5cbiIKKwkiVGhlcmUgaXMgTk8gV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdy5cbiI7CisKK3N0YXRpYyBjaGFyICpjb25maWdfZmlsZSA9ICJtZ2NwLmNmZyI7CisKKy8qIHVzZWQgYnkgbXNnYiBhbmQgbWdjcCAqLwordm9pZCAqdGFsbF9ic2NfY3R4ID0gTlVMTDsKKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCgpCit7CisJcHJpbnRmKCJTb21lIHVzZWZ1bCBoZWxwLi4uXG4iKTsKKwlwcmludGYoIiAtaCAtLWhlbHAgaXMgcHJpbnRpbmcgdGhpcyB0ZXh0LlxuIik7CisJcHJpbnRmKCIgLWMgLS1jb25maWctZmlsZSBmaWxlbmFtZSBUaGUgY29uZmlnIGZpbGUgdG8gdXNlLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3ZlcnNpb24oKQoreworCXByaW50ZigiJXNcblxuIiwgb3BlbmJzY192ZXJzaW9uKTsKKwlwcmludGYob3BlbmJzY19jb3B5cmlnaHQpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfb3B0aW9ucyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJd2hpbGUgKDEpIHsKKwkJaW50IG9wdGlvbl9pbmRleCA9IDAsIGM7CisJCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQkJeyJoZWxwIiwgMCwgMCwgJ2gnfSwKKwkJCXsiY29uZmlnLWZpbGUiLCAxLCAwLCAnYyd9LAorCQkJeyJ2ZXJzaW9uIiwgMCwgMCwgJ1YnfSwKKwkJCXswLCAwLCAwLCAwfSwKKwkJfTsKKworCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhjOlYiLCBsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCisJCWlmIChjID09IC0xKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoKGMpIHsKKwkJY2FzZSAnaCc6CisJCQlwcmludF9oZWxwKCk7CisJCQlleGl0KDApOworCQkJYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkJY29uZmlnX2ZpbGUgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfYnNjX2N0eCwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdWJzoKKwkJCXByaW50X3ZlcnNpb24oKTsKKwkJCWV4aXQoMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIGlnbm9yZSAqLworCQkJYnJlYWs7CisJCX07CisJfQorfQorCitzdGF0aWMgaW50IHJlYWRfY2FsbF9hZ2VudChzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJc29ja2xlbl90IHNsZW4gPSBzaXplb2YoYWRkcik7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3QgbXNnYiAqcmVzcDsKKworCW1zZyA9IChzdHJ1Y3QgbXNnYiAqKSBmZC0+ZGF0YTsKKworCS8qIHJlYWQgb25lIGxlc3Mgc28gd2UgY2FuIHVzZSBpdCBhcyBhIFwwICovCisJaW50IHJjID0gcmVjdmZyb20oYmZkLmZkLCBtc2ctPmRhdGEsIG1zZy0+ZGF0YV9sZW4gLSAxLCAwLAorCQkoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCAmc2xlbik7CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoIkdhdGV3YXkgZmFpbGVkIHRvIHJlYWQiKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSBpZiAoc2xlbiA+IHNpemVvZihhZGRyKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkdhdGV3YXkgcmVjZWl2ZWQgbWVzc2FnZSBmcm9tIG91dGVyc3BhY2U6ICVkICVkXG4iLAorCQkJc2xlbiwgc2l6ZW9mKGFkZHIpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChmaXJzdF9yZXF1ZXN0KSB7CisJCWZpcnN0X3JlcXVlc3QgPSAwOworCQlyZXNwID0gbWdjcF9jcmVhdGVfcnNpcCgpOworCisJCWlmIChyZXNwKSB7CisJCQlzZW5kdG8oYmZkLmZkLCByZXNwLT5sMmgsIG1zZ2JfbDJsZW4ocmVzcCksIDAsCisJCQkJKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwkJCW1zZ2JfZnJlZShyZXNwKTsKKwkJfQorCQlyZXR1cm4gMDsKKyAgICAgICAgfQorCisJLyogaGFuZGxlIG1lc3NhZ2Ugbm93ICovCisJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIHJjKTsKKwlyZXNwID0gbWdjcF9oYW5kbGVfbWVzc2FnZShjZmcsIG1zZyk7CisJbXNnYl9yZXNldChtc2cpOworCisJaWYgKHJlc3ApIHsKKwkJc2VuZHRvKGJmZC5mZCwgcmVzcC0+bDJoLCBtc2diX2wybGVuKHJlc3ApLCAwLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCQltc2diX2ZyZWUocmVzcCk7CisJfQorCXJldHVybiAwOworfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgZHVtbXlfbmV0d29yazsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlpbnQgb24gPSAxLCByYzsKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKKworCXRhbGxfYnNjX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAxLCAibWdjcC1jYWxsYWdlbnQiKTsKKworCWxvZ19pbml0KCZsb2dfaW5mbyk7CisJc3RkZXJyX3RhcmdldCA9IGxvZ190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWxvZ19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWxvZ19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKworCWNmZyA9IG1nY3BfY29uZmlnX2FsbG9jKCk7CisJaWYgKCFjZmcpCisJCXJldHVybiAtMTsKKworCWhhbmRsZV9vcHRpb25zKGFyZ2MsIGFyZ3YpOworCisJdGVsbmV0X2luaXQoJmR1bW15X25ldHdvcmssIDQyNDMpOworICAgICAgICByYyA9IG1nY3BfcGFyc2VfY29uZmlnKGNvbmZpZ19maWxlLCBjZmcpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCisgICAgICAgIC8qIHdlIG5lZWQgdG8gYmluZCBhIHNvY2tldCAqLworICAgICAgICBpZiAocmMgPT0gMCkgeworCQliZmQud2hlbiA9IEJTQ19GRF9SRUFEOworCQliZmQuY2IgPSByZWFkX2NhbGxfYWdlbnQ7CisJCWJmZC5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwkJaWYgKGJmZC5mZCA8IDApIHsKKwkJCXBlcnJvcigiR2F0ZXdheSBmYWlsZWQgdG8gbGlzdGVuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlzZXRzb2Nrb3B0KGJmZC5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCisJCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwkJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJYWRkci5zaW5fcG9ydCA9IGh0b25zKGNmZy0+c291cmNlX3BvcnQpOworCQlpbmV0X2F0b24oY2ZnLT5zb3VyY2VfYWRkciwgJmFkZHIuc2luX2FkZHIpOworCisJCWlmIChiaW5kKGJmZC5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKKwkJCXBlcnJvcigiR2F0ZXdheSBmYWlsZWQgdG8gYmluZCIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJYmZkLmRhdGEgPSBtc2diX2FsbG9jKDQwOTYsICJtZ2NwLW1zZyIpOworCQlpZiAoIWJmZC5kYXRhKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkdhdGV3YXkgbWVtb3J5IGVycm9yLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCisJCWlmIChic2NfcmVnaXN0ZXJfZmQoJmJmZCkgIT0gMCkgeworCQkJREVCVUdQKERNR0NQLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHRoZSBmZFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlERUJVR1AoRE1HQ1AsICJDb25maWd1cmVkIGZvciBNR0NQLlxuIik7CisJfQorCisJLyogaW5pdGlhbGlzYXRpb24gKi8KKwlzcmFuZCh0aW1lKE5VTEwpKTsKKworCS8qIG1haW4gbG9vcCAqLworCXdoaWxlICgxKSB7CisJCWJzY19zZWxlY3RfbWFpbigwKTsKKwl9CisKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX25ldHdvcmsuYyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9uZXR3b3JrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2Y2E0NwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9uZXR3b3JrLmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qIEEgTWVkaWEgR2F0ZXdheSBDb250cm9sIFByb3RvY29sIE1lZGlhIEdhdGV3YXk6IFJGQyAzNDM1ICovCisvKiBUaGUgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gKi8KKworLyoKKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3BfaW50ZXJuYWwuaD4KKworI3dhcm5pbmcgIk1ha2UgdXNlIG9mIHRoZSBydHAgcHJveHkgY29kZSIKKworLyogYWNjb3JkaW5nIHRvIHJ0cF9wcm94eS5jIFJGQyAzNTUwICovCitzdHJ1Y3QgcnRwX2hkciB7CisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCXVfaW50OF90ICBjc3JjX2NvdW50OjQsCisJCSAgZXh0ZW5zaW9uOjEsCisJCSAgcGFkZGluZzoxLAorCQkgIHZlcnNpb246MjsKKwl1X2ludDhfdCAgcGF5bG9hZF90eXBlOjcsCisJCSAgbWFya2VyOjE7CisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdV9pbnQ4X3QgIHZlcnNpb246MiwKKwkJICBwYWRkaW5nOjEsCisJCSAgZXh0ZW5zaW9uOjEsCisJCSAgY3NyY19jb3VudDo0OworCXVfaW50OF90ICBtYXJrZXI6MSwKKwkJICBwYXlsb2FkX3R5cGU6NzsKKyNlbmRpZgorCXVfaW50MTZfdCBzZXF1ZW5jZTsKKwl1X2ludDMyX3QgdGltZXN0YW1wOworCXVfaW50MzJfdCBzc3JjOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCitlbnVtIHsKKwlERVNUX05FVFdPUksgPSAwLAorCURFU1RfQlRTID0gMSwKK307CisKK2VudW0geworCVBST1RPX1JUUCwKKwlQUk9UT19SVENQLAorfTsKKworCitzdGF0aWMgaW50IHVkcF9zZW5kKGludCBmZCwgc3RydWN0IGluX2FkZHIgKmFkZHIsIGludCBwb3J0LCBjaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IHNvY2thZGRyX2luIG91dDsKKwlvdXQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJb3V0LnNpbl9wb3J0ID0gcG9ydDsKKwltZW1jcHkoJm91dC5zaW5fYWRkciwgYWRkciwgc2l6ZW9mKCphZGRyKSk7CisKKwlyZXR1cm4gc2VuZHRvKGZkLCBidWYsIGxlbiwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZvdXQsIHNpemVvZihvdXQpKTsKK30KKworc3RhdGljIHZvaWQgcGF0Y2hfcGF5bG9hZChpbnQgcGF5bG9hZCwgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcnRwX2hkciAqcnRwX2hkcjsKKworCWlmIChsZW4gPCBzaXplb2YoKnJ0cF9oZHIpKQorCQlyZXR1cm47CisKKwlydHBfaGRyID0gKHN0cnVjdCBydHBfaGRyICopIGRhdGE7CisJcnRwX2hkci0+cGF5bG9hZF90eXBlID0gcGF5bG9hZDsKK30KKworLyoKKyAqIFRoZXJlIGlzIGRhdGEgY29taW5nLiBXZSB3aWxsIGhhdmUgdG8gZmlndXJlIG91dCBpZiBpdAorICogY2FtZSBmcm9tIHRoZSBCVFMgb3IgdGhlIE1lZGlhR2F0ZXdheSBvZiB0aGUgTVNDLiBPbiB0b3AKKyAqIG9mIHRoYXQgd2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIGl0IHdhcyBSVFAgb3IgUlRDUC4KKyAqCisgKiBDdXJyZW50bHkgd2UgZG8gbm90IGNvbW11bmljYXRlIHdpdGggdGhlIEJTQyBzbyB3ZSBoYXZlCisgKiBubyBpZGVhIHdoZXJlIHRoZSBCVFMgaXMgbGlzdGVuaW5nIGZvciBSVFAgYW5kIG5lZWQgdG8KKyAqIGRvIHRoZSBjbGFzc2ljIHJvdXRpbmcgdHJpY2suIFdhaXQgZm9yIHRoZSBmaXJzdCBwYWNrZXQKKyAqIGZyb20gdGhlIEJUUyBhbmQgdGhlbiBnbyBhaGVhZC4KKyAqLworc3RhdGljIGludCBydHBfZGF0YV9jYihzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJY2hhciBidWZbNDA5Nl07CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJc29ja2xlbl90IHNsZW4gPSBzaXplb2YoYWRkcik7CisJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHA7CisJc3RydWN0IG1nY3BfY29uZmlnICpjZmc7CisJaW50IHJjLCBkZXN0LCBwcm90bzsKKworCWVuZHAgPSAoc3RydWN0IG1nY3BfZW5kcG9pbnQgKikgZmQtPmRhdGE7CisJY2ZnID0gZW5kcC0+Y2ZnOworCisJcmMgPSByZWN2ZnJvbShmZC0+ZmQsICZidWYsIHNpemVvZihidWYpLCAwLAorCQkJICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsICZzbGVuKTsKKwlpZiAocmMgPCAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcmVjZWl2ZSBtZXNzYWdlIG9uOiAweCV4XG4iLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGRvIG5vdCBmb3J3YXJkIGF5bnRoaW5nLi4uIG1heWJlIHRoZXJlIGlzIGEgcGFja2V0IGZyb20gdGhlIGJ0cyAqLworCWlmIChlbmRwLT5jaSA9PSBDSV9VTlVTRUQpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIlVua25vd24gbWVzc2FnZSBvbiBlbmRwb2ludDogMHgleFxuIiwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogRmlndXJlIG91dCB3aGVyZSB0byBmb3J3YXJkIGl0IHRvLiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHdlCisJICogaGF2ZSByZWNlaXZlZCB0aGUgQ29ubmVjdGlvbiBNb2RpZnkgYW5kIGtub3cgd2hvIGlzIGEgbGVnaXRpbWF0ZQorCSAqIHBhcnRuZXIuIEFjY29yZGluZyB0byB0aGUgc3BlYyB3ZSBjb3VsZCBhdHRlbXB0IHRvIGZvcndhcmQgZXZlbgorCSAqIGFmdGVyIHRoZSBDcmVhdGUgQ29ubmVjdGlvbiBidXQgd2Ugd2lsbCBub3QgYXMgd2UgYXJlIG5vdCByZWFsbHkKKwkgKiBhYmxlIHRvIHRlbGwgaWYgdGhpcyBpcyBsZWdpdGltYXRlLgorCSAqLworCSN3YXJuaW5nICJTbGlnaHQgc3BlYyB2aW9sYXRpb24uIFdpdGggY29ubmVjdGlvbiBtb2RlIHJlY3Zvbmx5IHdlIHNob3VsZCBhdHRlbXB0IHRvIGZvcndhcmQuIgorCWRlc3QgPSBtZW1jbXAoJmFkZHIuc2luX2FkZHIsICZlbmRwLT5yZW1vdGUsIHNpemVvZihhZGRyLnNpbl9hZGRyKSkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAoZW5kcC0+bmV0X3J0cCA9PSBhZGRyLnNpbl9wb3J0IHx8IGVuZHAtPm5ldF9ydGNwID09IGFkZHIuc2luX3BvcnQpCisJCQk/IERFU1RfQlRTIDogREVTVF9ORVRXT1JLOworCXByb3RvID0gZmQgPT0gJmVuZHAtPmxvY2FsX3J0cCA/IFBST1RPX1JUUCA6IFBST1RPX1JUQ1A7CisKKwkvKiBXZSBoYXZlIG5vIGlkZWEgd2hvIGNhbGxlZCB1cywgbWF5YmUgaXQgaXMgdGhlIEJUUy4gKi8KKwlpZiAoZGVzdCA9PSBERVNUX05FVFdPUksgJiYgKGVuZHAtPmJ0c19ydHAgPT0gMCB8fCBjZmctPmZvcndhcmRfaXApKSB7CisJCS8qIGl0IHdhcyB0aGUgQlRTLi4uICovCisJCWlmICghY2ZnLT5idHNfaXAgfHwgbWVtY21wKCZhZGRyLnNpbl9hZGRyLCAmY2ZnLT5idHNfaW4sIHNpemVvZihjZmctPmJ0c19pbikpID09IDApIHsKKwkJCWlmIChmZCA9PSAmZW5kcC0+bG9jYWxfcnRwKSB7CisJCQkJZW5kcC0+YnRzX3J0cCA9IGFkZHIuc2luX3BvcnQ7CisJCQl9IGVsc2UgeworCQkJCWVuZHAtPmJ0c19ydGNwID0gYWRkci5zaW5fcG9ydDsKKwkJCX0KKworCQkJZW5kcC0+YnRzID0gYWRkci5zaW5fYWRkcjsKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiRm91bmQgQlRTIGZvciBlbmRwb2ludDogMHgleCBvbiBwb3J0OiAlZC8lZFxuIiwKKwkJCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCksIG50b2hzKGVuZHAtPmJ0c19ydHApLCBudG9ocyhlbmRwLT5idHNfcnRjcCkpOworCQl9CisJfQorCisJLyogZGlzcGF0Y2ggKi8KKwlpZiAoY2ZnLT5hdWRpb19sb29wKQorCQlkZXN0ID0gIWRlc3Q7CisKKwlpZiAoZGVzdCA9PSBERVNUX05FVFdPUkspIHsKKwkJcGF0Y2hfcGF5bG9hZChlbmRwLT5uZXRfcGF5bG9hZF90eXBlLCBidWYsIHJjKTsKKwkJcmV0dXJuIHVkcF9zZW5kKGZkLT5mZCwgJmVuZHAtPnJlbW90ZSwKKwkJCSAgICAgcHJvdG8gPT0gUFJPVE9fUlRQID8gZW5kcC0+bmV0X3J0cCA6IGVuZHAtPm5ldF9ydGNwLAorCQkJICAgICBidWYsIHJjKTsKKwl9IGVsc2UgeworCQlwYXRjaF9wYXlsb2FkKGVuZHAtPmJ0c19wYXlsb2FkX3R5cGUsIGJ1ZiwgcmMpOworCQlyZXR1cm4gdWRwX3NlbmQoZmQtPmZkLCAmZW5kcC0+YnRzLAorCQkJICAgICBwcm90byA9PSBQUk9UT19SVFAgPyBlbmRwLT5idHNfcnRwIDogZW5kcC0+YnRzX3J0Y3AsCisJCQkgICAgIGJ1ZiwgcmMpOworCX0KK30KKworc3RhdGljIGludCBjcmVhdGVfYmluZChjb25zdCBjaGFyICpzb3VyY2VfYWRkciwgc3RydWN0IGJzY19mZCAqZmQsIGludCBwb3J0KQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCWludCBvbiA9IDE7CisKKwlmZC0+ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKGZkLT5mZCA8IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgVURQIHBvcnQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNldHNvY2tvcHQoZmQtPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCWluZXRfYXRvbihzb3VyY2VfYWRkciwgJmFkZHIuc2luX2FkZHIpOworCisJaWYgKGJpbmQoZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkgeworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmluZF9ydHAoc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHApCit7CisJc3RydWN0IG1nY3BfY29uZmlnICpjZmcgPSBlbmRwLT5jZmc7CisKKwlpZiAoY3JlYXRlX2JpbmQoY2ZnLT5zb3VyY2VfYWRkciwgJmVuZHAtPmxvY2FsX3J0cCwgZW5kcC0+cnRwX3BvcnQpICE9IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgUlRQIHBvcnQ6ICVzOiVkIG9uIDB4JXhcbiIsCisJCSAgICAgICBjZmctPnNvdXJjZV9hZGRyLCBlbmRwLT5ydHBfcG9ydCwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJZ290byBjbGVhbnVwMDsKKwl9CisKKwlpZiAoY3JlYXRlX2JpbmQoY2ZnLT5zb3VyY2VfYWRkciwgJmVuZHAtPmxvY2FsX3J0Y3AsIGVuZHAtPnJ0cF9wb3J0ICsgMSkgIT0gMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBSVENQIHBvcnQ6ICVzOiVkIG9uIDB4JXhcbiIsCisJCSAgICAgICBjZmctPnNvdXJjZV9hZGRyLCBlbmRwLT5ydHBfcG9ydCArIDEsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCWdvdG8gY2xlYW51cDE7CisJfQorCisJZW5kcC0+bG9jYWxfcnRwLmNiID0gcnRwX2RhdGFfY2I7CisJZW5kcC0+bG9jYWxfcnRwLmRhdGEgPSBlbmRwOworCWVuZHAtPmxvY2FsX3J0cC53aGVuID0gQlNDX0ZEX1JFQUQ7CisJaWYgKGJzY19yZWdpc3Rlcl9mZCgmZW5kcC0+bG9jYWxfcnRwKSAhPSAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcmVnaXN0ZXIgUlRQIHBvcnQgJWQgb24gMHgleFxuIiwKKwkJCWVuZHAtPnJ0cF9wb3J0LCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlnb3RvIGNsZWFudXAyOworCX0KKworCWVuZHAtPmxvY2FsX3J0Y3AuY2IgPSBydHBfZGF0YV9jYjsKKwllbmRwLT5sb2NhbF9ydGNwLmRhdGEgPSBlbmRwOworCWVuZHAtPmxvY2FsX3J0Y3Aud2hlbiA9IEJTQ19GRF9SRUFEOworCWlmIChic2NfcmVnaXN0ZXJfZmQoJmVuZHAtPmxvY2FsX3J0Y3ApICE9IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byByZWdpc3RlciBSVENQIHBvcnQgJWQgb24gMHgleFxuIiwKKwkJCWVuZHAtPnJ0cF9wb3J0ICsgMSwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJZ290byBjbGVhbnVwMzsKKwl9CisKKwlyZXR1cm4gMDsKKworY2xlYW51cDM6CisJYnNjX3VucmVnaXN0ZXJfZmQoJmVuZHAtPmxvY2FsX3J0cCk7CitjbGVhbnVwMjoKKwljbG9zZShlbmRwLT5sb2NhbF9ydGNwLmZkKTsKKwllbmRwLT5sb2NhbF9ydGNwLmZkID0gLTE7CitjbGVhbnVwMToKKwljbG9zZShlbmRwLT5sb2NhbF9ydHAuZmQpOworCWVuZHAtPmxvY2FsX3J0cC5mZCA9IC0xOworY2xlYW51cDA6CisJcmV0dXJuIC0xOworfQorCitpbnQgbWdjcF9iaW5kX3J0cF9wb3J0KHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwLCBpbnQgcnRwX3BvcnQpCit7CisJZW5kcC0+cnRwX3BvcnQgPSBydHBfcG9ydDsKKwlyZXR1cm4gYmluZF9ydHAoZW5kcCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfcHJvdG9jb2wuYyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9wcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZWY1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDc0NSBAQAorLyogQSBNZWRpYSBHYXRld2F5IENvbnRyb2wgUHJvdG9jb2wgTWVkaWEgR2F0ZXdheTogUkZDIDM0MzUgKi8KKy8qIFRoZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiAqLworCisvKgorICogKEMpIDIwMDktMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3BfaW50ZXJuYWwuaD4KKworZW51bSBtZ2NwX2Nvbm5lY3Rpb25fbW9kZSB7CisJTUdDUF9DT05OX05PTkUgPSAwLAorCU1HQ1BfQ09OTl9SRUNWX09OTFkgPSAxLAorCU1HQ1BfQ09OTl9TRU5EX09OTFkgPSAyLAorCU1HQ1BfQ09OTl9SRUNWX1NFTkQgPSBNR0NQX0NPTk5fUkVDVl9PTkxZIHwgTUdDUF9DT05OX1NFTkRfT05MWSwKK307CisKKy8qKgorICogTWFjcm8gZm9yIHRva2VuaXppbmcgTUdDUCBtZXNzYWdlcyBhbmQgU0RQIGluIG9uZSBnby4KKyAqCisgKi8KKyNkZWZpbmUgTVNHX1RPS0VOSVpFX1NUQVJUIFwKKwlsaW5lX3N0YXJ0ID0gMDsJCQkJCQlcCisJZm9yIChpID0gMDsgaSA8IG1zZ2JfbDNsZW4obXNnKTsgKytpKSB7CQkJXAorCQkvKiB3ZSBoYXZlIGEgbGluZSBlbmQgKi8JCQlcCisJCWlmIChtc2ctPmwzaFtpXSA9PSAnXG4nKSB7CQkJXAorCQkJLyogc2tpcCB0aGUgZmlyc3QgbGluZSAqLwkJXAorCQkJaWYgKGxpbmVfc3RhcnQgPT0gMCkgewkJCVwKKwkJCQlsaW5lX3N0YXJ0ID0gaSArIDE7CQlcCisJCQkJY29udGludWU7CQkJXAorCQkJfQkJCQkJXAorCQkJCQkJCQlcCisJCQkvKiBjaGVjayBpZiB3ZSBoYXZlIGEgcHJvcGVyIHBhcmFtICovCVwKKwkJCWlmIChpIC0gbGluZV9zdGFydCA9PSAxICYmIG1zZy0+bDNoW2xpbmVfc3RhcnRdID09ICdccicpIHsgXAorCQkJfSBlbHNlIGlmIChpIC0gbGluZV9zdGFydCA+IDIJCVwKKwkJCSAgICAmJiBpc2xvd2VyKG1zZy0+bDNoW2xpbmVfc3RhcnRdKQlcCisJCQkgICAgJiYgbXNnLT5sM2hbbGluZV9zdGFydCArIDFdID09ICc9JykgeyBcCisJCQl9IGVsc2UgaWYgKGkgLSBsaW5lX3N0YXJ0IDwgMwkJXAorCQkJICAgIHx8IG1zZy0+bDNoW2xpbmVfc3RhcnQgKyAxXSAhPSAnOicJXAorCQkJICAgIHx8IG1zZy0+bDNoW2xpbmVfc3RhcnQgKyAyXSAhPSAnICcpCVwKKwkJCQlnb3RvIGVycm9yOwkJCVwKKwkJCQkJCQkJXAorCQkJbXNnLT5sM2hbaV0gPSAnXDAnOwkJCVwKKwkJCWlmIChtc2ctPmwzaFtpLTFdID09ICdccicpCQlcCisJCQkJbXNnLT5sM2hbaS0xXSA9ICdcMCc7CisKKyNkZWZpbmUgTVNHX1RPS0VOSVpFX0VORCBcCisJCQlsaW5lX3N0YXJ0ID0gaSArIDE7IFwKKwkJfQkJCSAgICBcCisJfQorCisKK3N0cnVjdCBtZ2NwX21zZ19wdHIgeworCXVuc2lnbmVkIGludCBzdGFydDsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoOworfTsKKworc3RydWN0IG1nY3BfcmVxdWVzdCB7CisJY2hhciAqbmFtZTsKKwlzdHJ1Y3QgbXNnYiAqKCpoYW5kbGVfcmVxdWVzdCkgKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKKwljaGFyICpkZWJ1Z19uYW1lOworfTsKKworI2RlZmluZSBNR0NQX1JFUVVFU1QoTkFNRSwgUkVRLCBERUJVR19OQU1FKSBcCisJeyAubmFtZSA9IE5BTUUsIC5oYW5kbGVfcmVxdWVzdCA9IFJFUSwgLmRlYnVnX25hbWUgPSBERUJVR19OQU1FIH0sCisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2F1ZGl0X2VuZHBvaW50KHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2NyZWF0ZV9jb24oc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpOworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfZGVsZXRlX2NvbihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9tb2RpZnlfY29uKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKKworc3RhdGljIGludCBnZW5lcmF0ZV9jYWxsX2lkKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnKQoreworCWludCBpOworCisJLyogdXNlIHRoZSBjYWxsIGlkICovCisJKytjZmctPmxhc3RfY2FsbF9pZDsKKworCS8qIGhhbmRsZSB3cmFwIGFyb3VuZCAqLworCWlmIChjZmctPmxhc3RfY2FsbF9pZCA9PSBDSV9VTlVTRUQpCisJCSsrY2ZnLT5sYXN0X2NhbGxfaWQ7CisKKwkvKiBjYWxsc3RhY2sgY2FuIG9ubHkgYmUgb2Ygc2l6ZSBudW1iZXJfb2ZfZW5kcG9pbnRzICovCisJLyogdmVyaWZ5IHRoYXQgdGhlIGNhbGwgaWQgaXMgZnJlZSwgZS5nLiBpbiBjYXNlIG9mIG92ZXJydW4gKi8KKwlmb3IgKGkgPSAxOyBpIDwgY2ZnLT5udW1iZXJfZW5kcG9pbnRzOyArK2kpCisJCWlmIChjZmctPmVuZHBvaW50c1tpXS5jaSA9PSBjZmctPmxhc3RfY2FsbF9pZCkKKwkJCXJldHVybiBnZW5lcmF0ZV9jYWxsX2lkKGNmZyk7CisKKwlyZXR1cm4gY2ZnLT5sYXN0X2NhbGxfaWQ7Cit9CisKKy8qIEZJWElNRS9UT0RPOiBuZWVkIHRvIGhhdmUgYSBsaXN0IG9mIHBlbmRpbmcgdHJhbnNhY3Rpb25zIGFuZCBjaGVjayB0aGF0ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGdlbmVyYXRlX3RyYW5zYWN0aW9uX2lkKCkKK3sKKwlyZXR1cm4gYWJzKHJhbmQoKSk7Cit9CisKKy8qCisgKiBhcnJheSBvZiBmdW5jdGlvbiBwb2ludGVycyBmb3IgaGFuZGxpbmcgdmFyaW91cworICogbWVzc2FnZXMuIEluIHRoZSBmdXR1cmUgdGhpcyBtaWdodCBiZSBiaW5hcnkgc29ydGVkCisgKiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBtZ2NwX3JlcXVlc3QgbWdjcF9yZXF1ZXN0cyBbXSA9IHsKKwlNR0NQX1JFUVVFU1QoIkFVRVAiLCBoYW5kbGVfYXVkaXRfZW5kcG9pbnQsICJBdWRpdEVuZHBvaW50IikKKwlNR0NQX1JFUVVFU1QoIkNSQ1giLCBoYW5kbGVfY3JlYXRlX2NvbiwgIkNyZWF0ZUNvbm5lY3Rpb24iKQorCU1HQ1BfUkVRVUVTVCgiRExDWCIsIGhhbmRsZV9kZWxldGVfY29uLCAiRGVsZXRlQ29ubmVjdGlvbiIpCisJTUdDUF9SRVFVRVNUKCJNRENYIiwgaGFuZGxlX21vZGlmeV9jb24sICJNb2RpZml5Q29ubmVjdGlvbiIpCit9OworCitzdGF0aWMgc3RydWN0IG1zZ2IgKm1nY3BfbXNnYl9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBtc2diICptc2c7CisJbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbSg0MDk2LCAxMjgsICJNR0NQIG1zZyIpOworCWlmICghbXNnKQorCSAgICBMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIG1zZ2IgZm9yIE1HQ1AgZGF0YS5cbiIpOworCisJcmV0dXJuIG1zZzsKK30KKworc3RydWN0IG1zZ2IgKm1nY3BfY3JlYXRlX3Jlc3BvbnNlX3dpdGhfZGF0YShpbnQgY29kZSwgY29uc3QgY2hhciAqbXNnLCBjb25zdCBjaGFyICp0cmFucywKKwkJCQkgICAgY29uc3QgY2hhciAqZGF0YSkKK3sKKwlpbnQgbGVuOworCXN0cnVjdCBtc2diICpyZXM7CisKKwlyZXMgPSBtZ2NwX21zZ2JfYWxsb2MoKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZGF0YSkgeworCQlsZW4gPSBzbnByaW50ZigoY2hhciAqKSByZXMtPmRhdGEsIDIwNDgsICIlZCAlc1xuJXMiLCBjb2RlLCB0cmFucywgZGF0YSk7CisJfSBlbHNlIHsKKwkJbGVuID0gc25wcmludGYoKGNoYXIgKikgcmVzLT5kYXRhLCAyMDQ4LCAiJWQgJXNcbiIsIGNvZGUsIHRyYW5zKTsKKwl9CisKKwlyZXMtPmwyaCA9IG1zZ2JfcHV0KHJlcywgbGVuKTsKKwlMT0dQKERNR0NQLCBMT0dMX0RFQlVHLCAiU2VuZGluZyByZXNwb25zZTogY29kZTogJWQgZm9yICclcydcbiIsIGNvZGUsIHJlcy0+bDJoKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmNyZWF0ZV9yZXNwb25zZShpbnQgY29kZSwgY29uc3QgY2hhciAqbXNnLCBjb25zdCBjaGFyICp0cmFucykKK3sKKwlyZXR1cm4gbWdjcF9jcmVhdGVfcmVzcG9uc2Vfd2l0aF9kYXRhKGNvZGUsIG1zZywgdHJhbnMsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmNyZWF0ZV9yZXNwb25zZV93aXRoX3NkcChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCwKKwkJCQkJICAgICBjb25zdCBjaGFyICptc2csIGNvbnN0IGNoYXIgKnRyYW5zX2lkKQoreworCWNvbnN0IGNoYXIgKmFkZHIgPSBlbmRwLT5jZmctPmxvY2FsX2lwOworCWNoYXIgc2RwX3JlY29yZFs0MDk2XTsKKworCWlmICghYWRkcikKKwkJYWRkciA9IGVuZHAtPmNmZy0+c291cmNlX2FkZHI7CisKKwlzbnByaW50ZihzZHBfcmVjb3JkLCBzaXplb2Yoc2RwX3JlY29yZCkgLSAxLAorCQkJIkk6ICVkXG5cbiIKKwkJCSJ2PTBcclxuIgorCQkJImM9SU4gSVA0ICVzXHJcbiIKKwkJCSJtPWF1ZGlvICVkIFJUUC9BVlAgJWRcclxuIgorCQkJImE9cnRwbWFwOiVkICVzXHJcbiIsCisJCQllbmRwLT5jaSwgYWRkciwgZW5kcC0+cnRwX3BvcnQsCisJCQllbmRwLT5idHNfcGF5bG9hZF90eXBlLCBlbmRwLT5idHNfcGF5bG9hZF90eXBlLAorCQkgICAgICAgIGVuZHAtPmNmZy0+YXVkaW9fbmFtZSk7CisJcmV0dXJuIG1nY3BfY3JlYXRlX3Jlc3BvbnNlX3dpdGhfZGF0YSgyMDAsIG1zZywgdHJhbnNfaWQsIHNkcF9yZWNvcmQpOworfQorCisvKiBzZW5kIGEgc3RhdGljIHJlY29yZCAqLworc3RydWN0IG1zZ2IgKm1nY3BfY3JlYXRlX3JzaXAodm9pZCkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWludCBsZW47CisKKwltc2cgPSBtZ2NwX21zZ2JfYWxsb2MoKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIE5VTEw7CisKKwlsZW4gPSBzbnByaW50ZigoY2hhciAqKSBtc2ctPmRhdGEsIDIwNDgsCisJCQkiUlNJUCAldSAqQG1ndyBNR0NQIDEuMFxuIgorCQkJIlJNOiByZXN0YXJ0XG4iLCBnZW5lcmF0ZV90cmFuc2FjdGlvbl9pZCgpKTsKKwltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgbGVuKTsKKwlyZXR1cm4gbXNnOworfQorCisvKgorICogaGFuZGxlIGluY29taW5nIG1lc3NhZ2VzOgorICogICAtIHRoaXMgY2FuIGJlIGEgY29tbWFuZCAoZm91ciBsZXR0ZXJzLCBzcGFjZSwgdHJhbnNhY3Rpb24gaWQpCisgKiAgIC0gb3IgYSByZXNwb25zZSAodGhyZWUgbnVtYmVycywgc3BhY2UsIHRyYW5zYWN0aW9uIGlkKQorICovCitzdHJ1Y3QgbXNnYiAqbWdjcF9oYW5kbGVfbWVzc2FnZShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKyAgICAgICAgaW50IGNvZGU7CisJc3RydWN0IG1zZ2IgKnJlc3AgPSBOVUxMOworCisJaWYgKG1zZy0+bGVuIDwgNCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAibWdzIHRvbyBzaG9ydDogJWRcbiIsIG1zZy0+bGVuKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisgICAgICAgIC8qIGF0dGVtcHQgdG8gdHJlYXQgaXQgYXMgYSByZXNwb25zZSAqLworICAgICAgICBpZiAoc3NjYW5mKChjb25zdCBjaGFyICopJm1zZy0+ZGF0YVswXSwgIiUzZCAlKnMiLCAmY29kZSkgPT0gMSkgeworCQlMT0dQKERNR0NQLCBMT0dMX0RFQlVHLCAiUmVzcG9uc2U6IENvZGU6ICVkXG4iLCBjb2RlKTsKKwl9IGVsc2UgeworCQlpbnQgaSwgaGFuZGxlZCA9IDA7CisJCW1zZy0+bDNoID0gJm1zZy0+bDJoWzRdOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtZ2NwX3JlcXVlc3RzKTsgKytpKQorCQkJaWYgKHN0cm5jbXAobWdjcF9yZXF1ZXN0c1tpXS5uYW1lLCAoY29uc3QgY2hhciAqKSAmbXNnLT5kYXRhWzBdLCA0KSA9PSAwKSB7CisJCQkJaGFuZGxlZCA9IDE7CisJCQkJcmVzcCA9IG1nY3BfcmVxdWVzdHNbaV0uaGFuZGxlX3JlcXVlc3QoY2ZnLCBtc2cpOworCQkJCWJyZWFrOworCQkJfQorCQlpZiAoIWhhbmRsZWQpIHsKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiTVNHIHdpdGggdHlwZTogJyUuNHMnIG5vdCBoYW5kbGVkXG4iLCAmbXNnLT5kYXRhWzBdKTsKKwkJfQorCX0KKworCXJldHVybiByZXNwOworfQorCisvKiBzdHJpbmcgdG9rZW5pemVyIGZvciB0aGUgcG9vciAqLworc3RhdGljIGludCBmaW5kX21zZ19wb2ludGVycyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgbWdjcF9tc2dfcHRyICpwdHJzLCBpbnQgcHRyc19sZW5ndGgpCit7CisJaW50IGksIGZvdW5kID0gMDsKKworCWludCB3aGl0ZXNwYWNlID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgbXNnYl9sM2xlbihtc2cpICYmIHB0cnNfbGVuZ3RoID4gMDsgKytpKSB7CisJCS8qIGlmIHdlIGhhdmUgYSBzcGFjZSB3ZSBmb3VuZCBhbiBlbmQgKi8KKwkJaWYgKG1zZy0+bDNoW2ldCT09ICcgJyB8fCBtc2ctPmwzaFtpXSA9PSAnXHInIHx8IG1zZy0+bDNoW2ldID09ICdcbicpIHsKKwkJCWlmICghd2hpdGVzcGFjZSkgeworCQkJCSsrZm91bmQ7CisJCQkJd2hpdGVzcGFjZSA9IDE7CisJCQkJcHRycy0+bGVuZ3RoID0gaSAtIHB0cnMtPnN0YXJ0IC0gMTsKKwkJCQkrK3B0cnM7CisJCQkJLS1wdHJzX2xlbmd0aDsKKwkJCX0gZWxzZSB7CisJCQkgICAgLyogc2tpcCBhbnkgbnVtYmVyIG9mIHdoaXRlc3BhY2UgKi8KKwkJCX0KKworCQkJLyogbGluZSBlbmQuLi4gc3RvcCAqLworCQkJaWYgKG1zZy0+bDNoW2ldID09ICdccicgfHwgbXNnLT5sM2hbaV0gPT0gJ1xuJykKKwkJCQlicmVhazsKKwkJfSBlbHNlIGlmIChtc2ctPmwzaFtpXSA9PSAnXHInIHx8IG1zZy0+bDNoW2ldID09ICdcbicpIHsKKwkJCS8qIGxpbmUgZW5kLCBiZSBkb25lICovCisJCQlicmVhazsKKwkJfSBlbHNlIGlmICh3aGl0ZXNwYWNlKSB7CisJCQl3aGl0ZXNwYWNlID0gMDsKKwkJCXB0cnMtPnN0YXJ0ID0gaTsKKwkJfQorCX0KKworCWlmIChwdHJzX2xlbmd0aCA9PSAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgc3RydWN0IG1nY3BfZW5kcG9pbnQgKmZpbmRfZW5kcG9pbnQoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIGNvbnN0IGNoYXIgKm1nY3ApCit7CisJY2hhciAqZW5kcHRyID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgZ3cgPSBJTlRfTUFYOworCisJZ3cgPSBzdHJ0b3VsKG1nY3AsICZlbmRwdHIsIDE2KTsKKwlpZiAoZ3cgPT0gMCB8fCBndyA+PSBjZmctPm51bWJlcl9lbmRwb2ludHMgfHwgc3RyY21wKGVuZHB0ciwgIkBtZ3ciKSAhPSAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJOb3QgYWJsZSB0byBmaW5kIGVuZHBvaW50OiAnJXMnXG4iLCBtZ2NwKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuICZjZmctPmVuZHBvaW50c1tnd107Cit9CisKK3N0YXRpYyBpbnQgYW5hbHl6ZV9oZWFkZXIoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2csCisJCQkgIHN0cnVjdCBtZ2NwX21zZ19wdHIgKnB0ciwgaW50IHNpemUsCisJCQkgIGNvbnN0IGNoYXIgKip0cmFuc2FjdGlvbl9pZCwgc3RydWN0IG1nY3BfZW5kcG9pbnQgKiplbmRwKQoreworCWludCBmb3VuZDsKKworCSp0cmFuc2FjdGlvbl9pZCA9ICIwMDAwMDAiOworCisJaWYgKHNpemUgPCAzKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJOb3QgZW5vdWdoIHNwYWNlIGluIHB0clxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlmb3VuZCA9IGZpbmRfbXNnX3BvaW50ZXJzKG1zZywgcHRyLCBzaXplKTsKKworCWlmIChmb3VuZCA8PSAzKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJHYXRld2F5OiBOb3QgZW5vdWdoIHBhcmFtcy4gRm91bmQ6ICVkXG4iLCBmb3VuZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIHJlcGxhY2UgdGhlIHNwYWNlIHdpdGggXDAuIHRoZSBtYWluIG1ldGhvZCBndXJhbnRlc3MgdGhhdAorCSAqIHdlIHN0aWxsIGhhdmUgKyAxIGZvciBudWxsIHRlcm1pbmF0aW9uCisJICovCisJbXNnLT5sM2hbcHRyWzNdLnN0YXJ0ICsgcHRyWzNdLmxlbmd0aCArIDFdID0gJ1wwJzsKKwltc2ctPmwzaFtwdHJbMl0uc3RhcnQgKyBwdHJbMl0ubGVuZ3RoICsgMV0gPSAnXDAnOworCW1zZy0+bDNoW3B0clsxXS5zdGFydCArIHB0clsxXS5sZW5ndGggKyAxXSA9ICdcMCc7CisJbXNnLT5sM2hbcHRyWzBdLnN0YXJ0ICsgcHRyWzBdLmxlbmd0aCArIDFdID0gJ1wwJzsKKworCWlmIChzdHJuY21wKCIxLjAiLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtwdHJbM10uc3RhcnRdLCAzKSAhPSAwCisJICAgIHx8IHN0cm5jbXAoIk1HQ1AiLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtwdHJbMl0uc3RhcnRdLCA0KSAhPSAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJXcm9uZyBNR0NQIHZlcnNpb24uIE5vdCBoYW5kbGluZzogJyVzJyAnJXMnXG4iLAorCQkJKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbcHRyWzNdLnN0YXJ0XSwKKwkJCShjb25zdCBjaGFyICopJm1zZy0+bDNoW3B0clsyXS5zdGFydF0pOworCQlyZXR1cm4gLTE7CisJfQorCisJKnRyYW5zYWN0aW9uX2lkID0gKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbcHRyWzBdLnN0YXJ0XTsKKwkqZW5kcCA9IGZpbmRfZW5kcG9pbnQoY2ZnLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtwdHJbMV0uc3RhcnRdKTsKKwlyZXR1cm4gKmVuZHAgPT0gTlVMTDsKK30KKworc3RhdGljIGludCB2ZXJpZnlfY2FsbF9pZChjb25zdCBzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCwKKwkJCSAgY29uc3QgY2hhciAqY2FsbGlkKQoreworCWlmIChzdHJjbXAoZW5kcC0+Y2FsbGlkLCBjYWxsaWQpICE9IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkNhbGxJRHMgZG9lcyBub3QgbWF0Y2ggb24gMHgleC4gJyVzJyAhPSAnJXMnXG4iLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBlbmRwLT5jYWxsaWQsIGNhbGxpZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJpZnlfY2koY29uc3Qgc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAsCisJCSAgICAgY29uc3QgY2hhciAqY2kpCit7CisJaWYgKGF0b2koY2kpICE9IGVuZHAtPmNpKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJDb25uZWN0aW9uSWRlbnRpZmllcnMgZG8gbm90IG1hdGNoIG9uIDB4JXguICVkICE9ICVzXG4iLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBlbmRwLT5jaSwgY2kpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2F1ZGl0X2VuZHBvaW50KHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBtZ2NwX21zZ19wdHIgZGF0YV9wdHJzWzZdOworCWludCBmb3VuZCwgcmVzcG9uc2U7CisJY29uc3QgY2hhciAqdHJhbnNfaWQ7CisJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHA7CisKKwlmb3VuZCA9IGFuYWx5emVfaGVhZGVyKGNmZywgbXNnLCBkYXRhX3B0cnMsIEFSUkFZX1NJWkUoZGF0YV9wdHJzKSwgJnRyYW5zX2lkLCAmZW5kcCk7CisJaWYgKGZvdW5kICE9IDApCisJICAgIHJlc3BvbnNlID0gNTAwOworCWVsc2UKKwkgICAgcmVzcG9uc2UgPSAyMDA7CisKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKHJlc3BvbnNlLCAiQVVFUCIsIHRyYW5zX2lkKTsKK30KKworc3RhdGljIGludCBwYXJzZV9jb25uX21vZGUoY29uc3QgY2hhciogbXNnLCBpbnQgKmNvbm5fbW9kZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpZiAoc3RyY21wKG1zZywgInJlY3Zvbmx5IikgPT0gMCkKKwkJKmNvbm5fbW9kZSA9IE1HQ1BfQ09OTl9SRUNWX09OTFk7CisJZWxzZSBpZiAoc3RyY21wKG1zZywgInNlbmRyZWN2IikgPT0gMCkKKwkJKmNvbm5fbW9kZSA9IE1HQ1BfQ09OTl9SRUNWX1NFTkQ7CisJZWxzZSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJVbmtub3duIGNvbm5lY3Rpb24gbW9kZTogJyVzJ1xuIiwgbXNnKTsKKwkJcmV0ID0gLTE7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfY3JlYXRlX2NvbihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgbWdjcF9tc2dfcHRyIGRhdGFfcHRyc1s2XTsKKwlpbnQgZm91bmQsIGksIGxpbmVfc3RhcnQ7CisJY29uc3QgY2hhciAqdHJhbnNfaWQ7CisJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHA7CisJaW50IGVycm9yX2NvZGUgPSA1MDA7CisJaW50IHBvcnQ7CisKKwlmb3VuZCA9IGFuYWx5emVfaGVhZGVyKGNmZywgbXNnLCBkYXRhX3B0cnMsIEFSUkFZX1NJWkUoZGF0YV9wdHJzKSwgJnRyYW5zX2lkLCAmZW5kcCk7CisJaWYgKGZvdW5kICE9IDApCisJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoNTAwLCAiQ1JDWCIsIHRyYW5zX2lkKTsKKworCWlmIChlbmRwLT5jaSAhPSBDSV9VTlVTRUQpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkVuZHBvaW50IGlzIGFscmVhZHkgdXNlZC4gMHgleFxuIiwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSg1MDAsICJDUkNYIiwgdHJhbnNfaWQpOworCX0KKworCS8qIHBhcnNlIENhbGxJRCBDOiBhbmQgTG9jYWxQYXJhbWV0ZXJzIEw6ICovCisJTVNHX1RPS0VOSVpFX1NUQVJUCisJc3dpdGNoIChtc2ctPmwzaFtsaW5lX3N0YXJ0XSkgeworCWNhc2UgJ0wnOgorCQllbmRwLT5sb2NhbF9vcHRpb25zID0gdGFsbG9jX3N0cmR1cChjZmctPmVuZHBvaW50cywKKwkJCShjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSk7CisJCWJyZWFrOworCWNhc2UgJ0MnOgorCQllbmRwLT5jYWxsaWQgPSB0YWxsb2Nfc3RyZHVwKGNmZy0+ZW5kcG9pbnRzLAorCQkJKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKTsKKwkJYnJlYWs7CisJY2FzZSAnTSc6CisJCWlmIChwYXJzZV9jb25uX21vZGUoKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdLAorCQkJICAgICZlbmRwLT5jb25uX21vZGUpICE9IDApIHsKKwkJICAgIGVycm9yX2NvZGUgPSA1MTc7CisJCSAgICBnb3RvIGVycm9yMjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIlVuaGFuZGxlZCBvcHRpb246ICclYycvJWQgb24gMHgleFxuIiwKKwkJCW1zZy0+bDNoW2xpbmVfc3RhcnRdLCBtc2ctPmwzaFtsaW5lX3N0YXJ0XSwKKwkJCUVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCWJyZWFrOworCX0KKwlNU0dfVE9LRU5JWkVfRU5ECisKKwkvKiBpbml0aWFsaXplICovCisJZW5kcC0+bmV0X3J0cCA9IGVuZHAtPm5ldF9ydGNwID0gZW5kcC0+YnRzX3J0cCA9IGVuZHAtPmJ0c19ydGNwID0gMDsKKworCS8qIHNldCB0byB6ZXJvIHVudGlsIHdlIGdldCB0aGUgaW5mbyAqLworCW1lbXNldCgmZW5kcC0+cmVtb3RlLCAwLCBzaXplb2YoZW5kcC0+cmVtb3RlKSk7CisKKwkvKiBiaW5kIHRvIHRoZSBwb3J0IG5vdyAqLworCXBvcnQgPSBydHBfY2FsY3VsYXRlX3BvcnQoRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBjZmctPnJ0cF9iYXNlX3BvcnQpOworCWlmIChjZmctPmVhcmx5X2JpbmQpCisJCWVuZHAtPnJ0cF9wb3J0ID0gcG9ydDsKKwllbHNlIGlmIChtZ2NwX2JpbmRfcnRwX3BvcnQoZW5kcCwgcG9ydCkgIT0gMCkKKwkJZ290byBlcnJvcjI7CisKKwkvKiBhc3NpZ24gYSBsb2NhbCBjYWxsIGlkZW50aWZpZXIgb3IgZmFpbCAqLworCWVuZHAtPmNpID0gZ2VuZXJhdGVfY2FsbF9pZChjZmcpOworCWlmIChlbmRwLT5jaSA9PSBDSV9VTlVTRUQpCisJCWdvdG8gZXJyb3IyOworCisJZW5kcC0+YnRzX3BheWxvYWRfdHlwZSA9IGNmZy0+YXVkaW9fcGF5bG9hZDsKKworCS8qIHBvbGljeSBDQiAqLworCWlmIChjZmctPnBvbGljeV9jYikgeworCQlzd2l0Y2ggKGNmZy0+cG9saWN5X2NiKGNmZywgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBNR0NQX0VORFBfQ1JDWCwgdHJhbnNfaWQpKSB7CisJCWNhc2UgTUdDUF9QT0xJQ1lfUkVKRUNUOgorCQkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJDUkNYIHJlamVjdGVkIGJ5IHBvbGljeSBvbiAweCV4XG4iLAorCQkJICAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQkJbWdjcF9mcmVlX2VuZHAoZW5kcCk7CisJCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKDUwMCwgIkNSQ1giLCB0cmFuc19pZCk7CisJCQlicmVhazsKKwkJY2FzZSBNR0NQX1BPTElDWV9ERUZFUjoKKwkJCS8qIHN0b3AgcHJvY2Vzc2luZyAqLworCQkJcmV0dXJuIE5VTEw7CisJCQlicmVhazsKKwkJY2FzZSBNR0NQX1BPTElDWV9DT05UOgorCQkJLyoganVzdCBjb250aW51ZSAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkNyZWF0aW5nIGVuZHBvaW50IG9uOiAweCV4IENJOiAldSBwb3J0OiAldVxuIiwKKwkJRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBlbmRwLT5jaSwgZW5kcC0+cnRwX3BvcnQpOworCWlmIChjZmctPmNoYW5nZV9jYikKKwkJY2ZnLT5jaGFuZ2VfY2IoY2ZnLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIE1HQ1BfRU5EUF9DUkNYLCBlbmRwLT5ydHBfcG9ydCk7CisKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlX3dpdGhfc2RwKGVuZHAsICJDUkNYIiwgdHJhbnNfaWQpOworZXJyb3I6CisJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIk1hbGZvcm1lZCBsaW5lOiAlcyBvbiAweCV4IHdpdGg6IGxpbmVfc3RhcnQ6ICVkICVkXG4iLAorCQkgICAgaGV4ZHVtcChtc2ctPmwzaCwgbXNnYl9sM2xlbihtc2cpKSwKKwkJICAgIEVORFBPSU5UX05VTUJFUihlbmRwKSwgbGluZV9zdGFydCwgaSk7CisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiQ1JDWCIsIHRyYW5zX2lkKTsKKworZXJyb3IyOgorCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiUmVzb3VyY2UgZXJyb3Igb24gMHgleFxuIiwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJDUkNYIiwgdHJhbnNfaWQpOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9tb2RpZnlfY29uKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBtZ2NwX21zZ19wdHIgZGF0YV9wdHJzWzZdOworCWludCBmb3VuZCwgaSwgbGluZV9zdGFydDsKKwljb25zdCBjaGFyICp0cmFuc19pZDsKKwlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcDsKKwlpbnQgZXJyb3JfY29kZSA9IDUwMDsKKworCWZvdW5kID0gYW5hbHl6ZV9oZWFkZXIoY2ZnLCBtc2csIGRhdGFfcHRycywgQVJSQVlfU0laRShkYXRhX3B0cnMpLCAmdHJhbnNfaWQsICZlbmRwKTsKKwlpZiAoZm91bmQgIT0gMCkKKwkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiTURDWCIsIHRyYW5zX2lkKTsKKworCWlmIChlbmRwLT5jaSA9PSBDSV9VTlVTRUQpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkVuZHBvaW50IGlzIG5vdCBob2xkaW5nIGEgY29ubmVjdGlvbi4gMHgleFxuIiwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiTURDWCIsIHRyYW5zX2lkKTsKKwl9CisKKwlNU0dfVE9LRU5JWkVfU1RBUlQKKwlzd2l0Y2ggKG1zZy0+bDNoW2xpbmVfc3RhcnRdKSB7CisJY2FzZSAnQyc6IHsKKwkJaWYgKHZlcmlmeV9jYWxsX2lkKGVuZHAsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSkgIT0gMCkKKwkJCWdvdG8gZXJyb3IzOworCQlicmVhazsKKwl9CisJY2FzZSAnSSc6IHsKKwkJaWYgKHZlcmlmeV9jaShlbmRwLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10pICE9IDApCisJCQlnb3RvIGVycm9yMzsKKwkJYnJlYWs7CisJfQorCWNhc2UgJ0wnOgorCQkvKiBza2lwICovCisJCWJyZWFrOworCWNhc2UgJ00nOgorCQlpZiAocGFyc2VfY29ubl9tb2RlKChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSwKKwkJCSAgICAmZW5kcC0+Y29ubl9tb2RlKSAhPSAwKSB7CisJCSAgICBlcnJvcl9jb2RlID0gNTE3OworCQkgICAgZ290byBlcnJvcjM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAnXDAnOgorCQkvKiBTRFAgZmlsZSBiZWdpbnMgKi8KKwkJYnJlYWs7CisJY2FzZSAnYSc6CisJY2FzZSAnbyc6CisJY2FzZSAncyc6CisJY2FzZSAndCc6CisJY2FzZSAndic6CisJCS8qIHNraXAgdGhlc2UgU0RQIGF0dHJpYnV0ZXMgKi8KKwkJYnJlYWs7CisJY2FzZSAnbSc6IHsKKwkJaW50IHBvcnQ7CisJCWludCBwYXlsb2FkOworCQljb25zdCBjaGFyICpwYXJhbSA9IChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnRdOworCisJCWlmIChzc2NhbmYocGFyYW0sICJtPWF1ZGlvICVkIFJUUC9BVlAgJWQiLCAmcG9ydCwgJnBheWxvYWQpID09IDIpIHsKKwkJCWVuZHAtPm5ldF9ydHAgPSBodG9ucyhwb3J0KTsKKwkJCWVuZHAtPm5ldF9ydGNwID0gaHRvbnMocG9ydCArIDEpOworCQkJZW5kcC0+bmV0X3BheWxvYWRfdHlwZSA9IHBheWxvYWQ7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgJ2MnOiB7CisJCWNoYXIgaXB2NFsxNl07CisJCWNvbnN0IGNoYXIgKnBhcmFtID0gKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydF07CisKKwkJaWYgKHNzY2FuZihwYXJhbSwgImM9SU4gSVA0ICUxNXMiLCBpcHY0KSA9PSAxKSB7CisJCQlpbmV0X2F0b24oaXB2NCwgJmVuZHAtPnJlbW90ZSk7CisJCX0KKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiVW5oYW5kbGVkIG9wdGlvbjogJyVjJy8lZCBvbiAweCV4XG4iLAorCQkJbXNnLT5sM2hbbGluZV9zdGFydF0sIG1zZy0+bDNoW2xpbmVfc3RhcnRdLAorCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJYnJlYWs7CisJfQorCU1TR19UT0tFTklaRV9FTkQKKworCS8qIHBvbGljeSBDQiAqLworCWlmIChjZmctPnBvbGljeV9jYikgeworCQlzd2l0Y2ggKGNmZy0+cG9saWN5X2NiKGNmZywgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBNR0NQX0VORFBfTURDWCwgdHJhbnNfaWQpKSB7CisJCWNhc2UgTUdDUF9QT0xJQ1lfUkVKRUNUOgorCQkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJNRENYIHJlamVjdGVkIGJ5IHBvbGljeSBvbiAweCV4XG4iLAorCQkJICAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSg1MDAsICJNRENYIiwgdHJhbnNfaWQpOworCQkJYnJlYWs7CisJCWNhc2UgTUdDUF9QT0xJQ1lfREVGRVI6CisJCQkvKiBzdG9wIHByb2Nlc3NpbmcgKi8KKwkJCXJldHVybiBOVUxMOworCQkJYnJlYWs7CisJCWNhc2UgTUdDUF9QT0xJQ1lfQ09OVDoKKwkJCS8qIGp1c3QgY29udGludWUgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogbW9kaWZ5ICovCisJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJNb2RpZmllZCBlbmRwb2ludCBvbjogMHgleCBTZXJ2ZXI6ICVzOiV1XG4iLAorCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGluZXRfbnRvYShlbmRwLT5yZW1vdGUpLCBudG9ocyhlbmRwLT5uZXRfcnRwKSk7CisJaWYgKGNmZy0+Y2hhbmdlX2NiKQorCQljZmctPmNoYW5nZV9jYihjZmcsIEVORFBPSU5UX05VTUJFUihlbmRwKSwgTUdDUF9FTkRQX01EQ1gsIGVuZHAtPnJ0cF9wb3J0KTsKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlX3dpdGhfc2RwKGVuZHAsICJNRENYIiwgdHJhbnNfaWQpOworCitlcnJvcjoKKwlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiTWFsZm9ybWVkIGxpbmU6ICVzIG9uIDB4JXggd2l0aDogbGluZV9zdGFydDogJWQgJWQgJWRcbiIsCisJCSAgICBoZXhkdW1wKG1zZy0+bDNoLCBtc2diX2wzbGVuKG1zZykpLAorCQkgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBsaW5lX3N0YXJ0LCBpLCBtc2ctPmwzaFtsaW5lX3N0YXJ0XSk7CisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiTURDWCIsIHRyYW5zX2lkKTsKKworZXJyb3IzOgorCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIk1EQ1giLCB0cmFuc19pZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2RlbGV0ZV9jb24oc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IG1nY3BfbXNnX3B0ciBkYXRhX3B0cnNbNl07CisJaW50IGZvdW5kLCBpLCBsaW5lX3N0YXJ0OworCWNvbnN0IGNoYXIgKnRyYW5zX2lkOworCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwOworCWludCBlcnJvcl9jb2RlID0gNTAwOworCisJZm91bmQgPSBhbmFseXplX2hlYWRlcihjZmcsIG1zZywgZGF0YV9wdHJzLCBBUlJBWV9TSVpFKGRhdGFfcHRycyksICZ0cmFuc19pZCwgJmVuZHApOworCWlmIChmb3VuZCAhPSAwKQorCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJETENYIiwgdHJhbnNfaWQpOworCisJaWYgKGVuZHAtPmNpID09IENJX1VOVVNFRCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRW5kcG9pbnQgaXMgbm90IHVzZWQuIDB4JXhcbiIsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIkRMQ1giLCB0cmFuc19pZCk7CisJfQorCisJTVNHX1RPS0VOSVpFX1NUQVJUCisJc3dpdGNoIChtc2ctPmwzaFtsaW5lX3N0YXJ0XSkgeworCWNhc2UgJ0MnOiB7CisJCWlmICh2ZXJpZnlfY2FsbF9pZChlbmRwLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10pICE9IDApCisJCQlnb3RvIGVycm9yMzsKKwkJYnJlYWs7CisJfQorCWNhc2UgJ0knOiB7CisJCWlmICh2ZXJpZnlfY2koZW5kcCwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKSAhPSAwKQorCQkJZ290byBlcnJvcjM7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIlVuaGFuZGxlZCBvcHRpb246ICclYycvJWQgb24gMHgleFxuIiwKKwkJCW1zZy0+bDNoW2xpbmVfc3RhcnRdLCBtc2ctPmwzaFtsaW5lX3N0YXJ0XSwKKwkJCUVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCWJyZWFrOworCX0KKwlNU0dfVE9LRU5JWkVfRU5ECisKKwkvKiBwb2xpY3kgQ0IgKi8KKwlpZiAoY2ZnLT5wb2xpY3lfY2IpIHsKKwkJc3dpdGNoIChjZmctPnBvbGljeV9jYihjZmcsIEVORFBPSU5UX05VTUJFUihlbmRwKSwgTUdDUF9FTkRQX0RMQ1gsIHRyYW5zX2lkKSkgeworCQljYXNlIE1HQ1BfUE9MSUNZX1JFSkVDVDoKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiRExDWCByZWplY3RlZCBieSBwb2xpY3kgb24gMHgleFxuIiwKKwkJCSAgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoNTAwLCAiRExDWCIsIHRyYW5zX2lkKTsKKwkJCWJyZWFrOworCQljYXNlIE1HQ1BfUE9MSUNZX0RFRkVSOgorCQkJLyogc3RvcCBwcm9jZXNzaW5nICovCisJCQlyZXR1cm4gTlVMTDsKKwkJCWJyZWFrOworCQljYXNlIE1HQ1BfUE9MSUNZX0NPTlQ6CisJCQkvKiBqdXN0IGNvbnRpbnVlICovCisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIGZyZWUgdGhlIGNvbm5lY3Rpb24gKi8KKwltZ2NwX2ZyZWVfZW5kcChlbmRwKTsKKwlpZiAoY2ZnLT5jaGFuZ2VfY2IpCisJCWNmZy0+Y2hhbmdlX2NiKGNmZywgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBNR0NQX0VORFBfRExDWCwgZW5kcC0+cnRwX3BvcnQpOworCisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSgyNTAsICJETENYIiwgdHJhbnNfaWQpOworCitlcnJvcjoKKwlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiTWFsZm9ybWVkIGxpbmU6ICVzIG9uIDB4JXggd2l0aDogbGluZV9zdGFydDogJWQgJWRcbiIsCisJCSAgICBoZXhkdW1wKG1zZy0+bDNoLCBtc2diX2wzbGVuKG1zZykpLAorCQkgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBsaW5lX3N0YXJ0LCBpKTsKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJETENYIiwgdHJhbnNfaWQpOworCitlcnJvcjM6CisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiRExDWCIsIHRyYW5zX2lkKTsKK30KKworc3RydWN0IG1nY3BfY29uZmlnICptZ2NwX2NvbmZpZ19hbGxvYyh2b2lkKQoreworCXN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnOworCisJY2ZnID0gdGFsbG9jX3plcm8oTlVMTCwgc3RydWN0IG1nY3BfY29uZmlnKTsKKwlpZiAoIWNmZykgeworCQlMT0dQKERNR0NQLCBMT0dMX0ZBVEFMLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNvbmZpZy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljZmctPnNvdXJjZV9wb3J0ID0gMjQyNzsKKwljZmctPnNvdXJjZV9hZGRyID0gdGFsbG9jX3N0cmR1cChjZmcsICIwLjAuMC4wIik7CisJY2ZnLT5hdWRpb19uYW1lID0gdGFsbG9jX3N0cmR1cChjZmcsICJHU00tRUZSLzgwMDAiKTsKKwljZmctPmF1ZGlvX3BheWxvYWQgPSA5NzsKKwljZmctPnJ0cF9iYXNlX3BvcnQgPSBSVFBfUE9SVF9ERUZBVUxUOworCisJcmV0dXJuIGNmZzsKK30KKworaW50IG1nY3BfZW5kcG9pbnRzX2FsbG9jYXRlKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnKQoreworCWludCBpOworCisJLyogSW5pdGlhbGl6ZSBhbGwgZW5kcG9pbnRzICovCisJY2ZnLT5lbmRwb2ludHMgPSBfdGFsbG9jX3plcm9fYXJyYXkoY2ZnLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IG1nY3BfZW5kcG9pbnQpLAorCQkJCSAgICAgICBjZmctPm51bWJlcl9lbmRwb2ludHMsICJlbmRwb2ludHMiKTsKKwlpZiAoIWNmZy0+ZW5kcG9pbnRzKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5udW1iZXJfZW5kcG9pbnRzOyArK2kpIHsKKwkJY2ZnLT5lbmRwb2ludHNbaV0ubG9jYWxfcnRwLmZkID0gLTE7CisJCWNmZy0+ZW5kcG9pbnRzW2ldLmxvY2FsX3J0Y3AuZmQgPSAtMTsKKwkJY2ZnLT5lbmRwb2ludHNbaV0uY2kgPSBDSV9VTlVTRUQ7CisJCWNmZy0+ZW5kcG9pbnRzW2ldLmNmZyA9IGNmZzsKKwkJY2ZnLT5lbmRwb2ludHNbaV0ubmV0X3BheWxvYWRfdHlwZSA9IC0xOworCQljZmctPmVuZHBvaW50c1tpXS5idHNfcGF5bG9hZF90eXBlID0gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbWdjcF9mcmVlX2VuZHAoc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHApCit7CisJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJEZWxldGluZyBlbmRwb2ludCBvbjogMHgleFxuIiwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwllbmRwLT5jaT0gQ0lfVU5VU0VEOworCisJaWYgKGVuZHAtPmNhbGxpZCkgeworCQl0YWxsb2NfZnJlZShlbmRwLT5jYWxsaWQpOworCQllbmRwLT5jYWxsaWQgPSBOVUxMOworCX0KKworCWlmIChlbmRwLT5sb2NhbF9vcHRpb25zKSB7CisJCXRhbGxvY19mcmVlKGVuZHAtPmxvY2FsX29wdGlvbnMpOworCQllbmRwLT5jYWxsaWQgPSBOVUxMOworCX0KKworCWlmICghZW5kcC0+Y2ZnLT5lYXJseV9iaW5kKSB7CisJCWJzY191bnJlZ2lzdGVyX2ZkKCZlbmRwLT5sb2NhbF9ydHApOworCQlic2NfdW5yZWdpc3Rlcl9mZCgmZW5kcC0+bG9jYWxfcnRjcCk7CisJfQorCisJZW5kcC0+bmV0X3J0cCA9IGVuZHAtPm5ldF9ydGNwID0gZW5kcC0+YnRzX3J0cCA9IGVuZHAtPmJ0c19ydGNwID0gMDsKKwllbmRwLT5uZXRfcGF5bG9hZF90eXBlID0gZW5kcC0+YnRzX3BheWxvYWRfdHlwZSA9IC0xOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX3Z0eS5jIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX3Z0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxM2IzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfdnR5LmMKQEAgLTAsMCArMSwzMzkgQEAKKy8qIEEgTWVkaWEgR2F0ZXdheSBDb250cm9sIFByb3RvY29sIE1lZGlhIEdhdGV3YXk6IFJGQyAzNDM1ICovCisvKiBUaGUgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gKi8KKworLyoKKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWdjcF9pbnRlcm5hbC5oPgorCisjaW5jbHVkZSA8dnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisKK3N0YXRpYyBzdHJ1Y3QgbWdjcF9jb25maWcgKmdfY2ZnID0gTlVMTDsKKworLyoKKyAqIHZ0eSBjb2RlIGZvciBtZ2NwIGJlbG93CisgKi8KK3N0cnVjdCBjbWRfbm9kZSBtZ2NwX25vZGUgPSB7CisJTUdDUF9OT0RFLAorCSIlcyhtZ2NwKSMiLAorCTEsCit9OworCitzdGF0aWMgaW50IGNvbmZpZ193cml0ZV9tZ2NwKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfb3V0KHZ0eSwgIm1nY3AlcyIsIFZUWV9ORVdMSU5FKTsKKwlpZiAoZ19jZmctPmxvY2FsX2lwKQorCQl2dHlfb3V0KHZ0eSwgIiBsb2NhbCBpcCAlcyVzIiwgZ19jZmctPmxvY2FsX2lwLCBWVFlfTkVXTElORSk7CisJaWYgKGdfY2ZnLT5idHNfaXApCisJCXZ0eV9vdXQodnR5LCAiICBidHMgaXAgJXMlcyIsIGdfY2ZnLT5idHNfaXAsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgYmluZCBpcCAlcyVzIiwgZ19jZmctPnNvdXJjZV9hZGRyLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGJpbmQgcG9ydCAldSVzIiwgZ19jZmctPnNvdXJjZV9wb3J0LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGJpbmQgZWFybHkgJXUlcyIsICEhZ19jZmctPmVhcmx5X2JpbmQsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgcnRwIGJhc2UgJXUlcyIsIGdfY2ZnLT5ydHBfYmFzZV9wb3J0LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIHNkcCBhdWRpbyBwYXlsb2FkIG51bWJlciAldSVzIiwgZ19jZmctPmF1ZGlvX3BheWxvYWQsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgc2RwIGF1ZGlvIHBheWxvYWQgbmFtZSAlcyVzIiwgZ19jZmctPmF1ZGlvX25hbWUsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgbG9vcCAldSVzIiwgISFnX2NmZy0+YXVkaW9fbG9vcCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBlbmRwb2ludHMgJXUlcyIsIGdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzLCBWVFlfTkVXTElORSk7CisJaWYgKGdfY2ZnLT5mb3J3YXJkX2lwKQorCQl2dHlfb3V0KHZ0eSwgIiBmb3J3YXJkIGF1ZGlvIGlwICVzJXMiLCBnX2NmZy0+Zm9yd2FyZF9pcCwgVlRZX05FV0xJTkUpOworCWlmIChnX2NmZy0+Zm9yd2FyZF9wb3J0ICE9IDApCisJCXZ0eV9vdXQodnR5LCAiIGZvcndhcmQgYXVkaW8gcG9ydCAlZCVzIiwgZ19jZmctPmZvcndhcmRfcG9ydCwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzaG93X21jZ3AsIHNob3dfbWdjcF9jbWQsICJzaG93IG1nY3AiLAorICAgICAgU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE1HQ1AgTWVkaWEgR2F0ZXdheSIpCit7CisJaW50IGk7CisKKwl2dHlfb3V0KHZ0eSwgIk1HQ1AgaXMgdXAgYW5kIHJ1bm5pbmcgd2l0aCAldSBlbmRwb2ludHM6JXMiLCBnX2NmZy0+bnVtYmVyX2VuZHBvaW50cyAtIDEsIFZUWV9ORVdMSU5FKTsKKwlmb3IgKGkgPSAxOyBpIDwgZ19jZmctPm51bWJlcl9lbmRwb2ludHM7ICsraSkgeworCQlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCA9ICZnX2NmZy0+ZW5kcG9pbnRzW2ldOworCQl2dHlfb3V0KHZ0eSwgIiBFbmRwb2ludCAweCUuMng6IENJOiAlZCBuZXQ6ICV1LyV1IGJ0czogJXUvJXUlcyIsCisJCQlpLCBlbmRwLT5jaSwKKwkJCW50b2hzKGVuZHAtPm5ldF9ydHApLCBudG9ocyhlbmRwLT5uZXRfcnRjcCksCisJCQludG9ocyhlbmRwLT5idHNfcnRwKSwgbnRvaHMoZW5kcC0+YnRzX3J0Y3ApLCBWVFlfTkVXTElORSk7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcCwKKyAgICAgIGNmZ19tZ2NwX2NtZCwKKyAgICAgICJtZ2NwIiwKKyAgICAgICJDb25maWd1cmUgdGhlIE1HQ1AiKQoreworCXZ0eS0+bm9kZSA9IE1HQ1BfTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2xvY2FsX2lwLAorICAgICAgY2ZnX21nY3BfbG9jYWxfaXBfY21kLAorICAgICAgImxvY2FsIGlwIElQIiwKKyAgICAgICJTZXQgdGhlIElQIHRvIGJlIHVzZWQgaW4gU0RQIHJlY29yZHMiKQoreworCWlmIChnX2NmZy0+bG9jYWxfaXApCisJCXRhbGxvY19mcmVlKGdfY2ZnLT5sb2NhbF9pcCk7CisJZ19jZmctPmxvY2FsX2lwID0gdGFsbG9jX3N0cmR1cChnX2NmZywgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9idHNfaXAsCisgICAgICBjZmdfbWdjcF9idHNfaXBfY21kLAorICAgICAgImJ0cyBpcCBJUCIsCisgICAgICAiU2V0IHRoZSBJUCBvZiB0aGUgQlRTIGZvciBSVFAgZm9yd2FyZGluZyIpCit7CisJaWYgKGdfY2ZnLT5idHNfaXApCisJCXRhbGxvY19mcmVlKGdfY2ZnLT5idHNfaXApOworCWdfY2ZnLT5idHNfaXAgPSB0YWxsb2Nfc3RyZHVwKGdfY2ZnLCBhcmd2WzBdKTsKKwlpbmV0X2F0b24oZ19jZmctPmJ0c19pcCwgJmdfY2ZnLT5idHNfaW4pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfYmluZF9pcCwKKyAgICAgIGNmZ19tZ2NwX2JpbmRfaXBfY21kLAorICAgICAgImJpbmQgaXAgSVAiLAorICAgICAgIkJpbmQgdGhlIE1HQ1AgdG8gdGhpcyBsb2NhbCBhZGRyIikKK3sKKwlpZiAoZ19jZmctPnNvdXJjZV9hZGRyKQorCQl0YWxsb2NfZnJlZShnX2NmZy0+c291cmNlX2FkZHIpOworCWdfY2ZnLT5zb3VyY2VfYWRkciA9IHRhbGxvY19zdHJkdXAoZ19jZmcsIGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfYmluZF9wb3J0LAorICAgICAgY2ZnX21nY3BfYmluZF9wb3J0X2NtZCwKKyAgICAgICJiaW5kIHBvcnQgPDAtNjU1MzQ+IiwKKyAgICAgICJCaW5kIHRoZSBNR0NQIHRvIHRoaXMgcG9ydCIpCit7CisJdW5zaWduZWQgaW50IHBvcnQgPSBhdG9pKGFyZ3ZbMF0pOworCWlmIChwb3J0ID4gNjU1MzQpIHsKKwkJdnR5X291dCh2dHksICIlJSB3cm9uZyBiaW5kIHBvcnQgJyVzJyVzIiwgYXJndlswXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJZ19jZmctPnNvdXJjZV9wb3J0ID0gcG9ydDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2JpbmRfZWFybHksCisgICAgICBjZmdfbWdjcF9iaW5kX2Vhcmx5X2NtZCwKKyAgICAgICJiaW5kIGVhcmx5ICgwfDEpIiwKKyAgICAgICJCaW5kIGFsbCBSVFAgcG9ydHMgZWFybHkiKQoreworCXVuc2lnbmVkIGludCBiaW5kID0gYXRvaShhcmd2WzBdKTsKKwlpZiAoYmluZCAhPSAwICYmIGJpbmQgIT0gMSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIHBhcmFtIG11c3QgYmUgMCBvciAxLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJZ19jZmctPmVhcmx5X2JpbmQgPSBiaW5kID09IDE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9ydHBfYmFzZV9wb3J0LAorICAgICAgY2ZnX21nY3BfcnRwX2Jhc2VfcG9ydF9jbWQsCisgICAgICAicnRwIGJhc2UgPDAtNjU1MzQ+IiwKKyAgICAgICJCYXNlIHBvcnQgdG8gdXNlIikKK3sKKwl1bnNpZ25lZCBpbnQgcG9ydCA9IGF0b2koYXJndlswXSk7CisJaWYgKHBvcnQgPiA2NTUzNCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIHdyb25nIGJhc2UgcG9ydCAnJXMnJXMiLCBhcmd2WzBdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlnX2NmZy0+cnRwX2Jhc2VfcG9ydCA9IHBvcnQ7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9zZHBfcGF5bG9hZF9udW1iZXIsCisgICAgICBjZmdfbWdjcF9zZHBfcGF5bG9hZF9udW1iZXJfY21kLAorICAgICAgInNkcCBhdWRpbyBwYXlsb2FkIG51bWJlciA8MS0yNTU+IiwKKyAgICAgICJTZXQgdGhlIGF1ZGlvIGNvZGVjIHRvIHVzZSIpCit7CisJdW5zaWduZWQgaW50IHBheWxvYWQgPSBhdG9pKGFyZ3ZbMF0pOworCWlmIChwYXlsb2FkID4gMjU1KSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgd3JvbmcgcGF5bG9hZCBudW1iZXIgJyVzJyVzIiwgYXJndlswXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJZ19jZmctPmF1ZGlvX3BheWxvYWQgPSBwYXlsb2FkOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3Bfc2RwX3BheWxvYWRfbmFtZSwKKyAgICAgIGNmZ19tZ2NwX3NkcF9wYXlsb2FkX25hbWVfY21kLAorICAgICAgInNkcCBhdWRpbyBwYXlsb2FkIG5hbWUgTkFNRSIsCisgICAgICAiU2V0IHRoZSBhdWRpbyBuYW1lIHRvIHVzZSIpCit7CisJaWYgKGdfY2ZnLT5hdWRpb19uYW1lKQorCQl0YWxsb2NfZnJlZShnX2NmZy0+YXVkaW9fbmFtZSk7CisJZ19jZmctPmF1ZGlvX25hbWUgPSB0YWxsb2Nfc3RyZHVwKGdfY2ZnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2xvb3AsCisgICAgICBjZmdfbWdjcF9sb29wX2NtZCwKKyAgICAgICJsb29wICgwfDEpIiwKKyAgICAgICJMb29wIHRoZSBhdWRpbyIpCit7CisJZ19jZmctPmF1ZGlvX2xvb3AgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfbnVtYmVyX2VuZHAsCisgICAgICBjZmdfbWdjcF9udW1iZXJfZW5kcF9jbWQsCisgICAgICAibnVtYmVyIGVuZHBvaW50cyA8MC02NTUzND4iLAorICAgICAgIlRoZSBudW1iZXIgb2YgZW5kcG9pbnRzIHRvIGFsbG9jYXRlLiBUaGlzIGlzIG5vdCBkeW5hbWljLiIpCit7CisJLyogKyAxIGFzIHdlIHN0YXJ0IGNvdW50aW5nIGF0IG9uZSAqLworCWdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzID0gYXRvaShhcmd2WzBdKSArIDE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9mb3J3YXJkX2lwLAorICAgICAgY2ZnX21nY3BfZm9yd2FyZF9pcF9jbWQsCisgICAgICAiZm9yd2FyZCBhdWRpbyBpcCBJUCIsCisgICAgICAiRm9yd2FyZCBwYWNrZXRzIGZyb20gYW5kIHRvIHRoZSBJUC4gVGhpcyBkaXNhYmxlcyBtb3N0IG9mIHRoZSBNR0NQIGZlYXR1cmUuIikKK3sKKwlpZiAoZ19jZmctPmZvcndhcmRfaXApCisJCXRhbGxvY19mcmVlKGdfY2ZnLT5mb3J3YXJkX2lwKTsKKwlnX2NmZy0+Zm9yd2FyZF9pcCA9IHRhbGxvY19zdHJkdXAoZ19jZmcsIGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfZm9yd2FyZF9wb3J0LAorICAgICAgY2ZnX21nY3BfZm9yd2FyZF9wb3J0X2NtZCwKKyAgICAgICJmb3J3YXJkIGF1ZGlvIHBvcnQgPDEtMTUwMDA+IiwKKyAgICAgICJGb3J3YXJkIHBhY2tldHMgZnJvbSBhbmQgdG8gdGhlIHBvcnQuIFRoaXMgZGlzYWJsZXMgbW9zdCBvZiB0aGUgTUdDUCBmZWF0dXJlLiIpCit7CisJZ19jZmctPmZvcndhcmRfcG9ydCA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitpbnQgbWdjcF92dHlfaW5pdCh2b2lkKQoreworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X21nY3BfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmNmZ19tZ2NwX2NtZCk7CisJaW5zdGFsbF9ub2RlKCZtZ2NwX25vZGUsIGNvbmZpZ193cml0ZV9tZ2NwKTsKKwlpbnN0YWxsX2RlZmF1bHQoTUdDUF9OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfbG9jYWxfaXBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfYnRzX2lwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2JpbmRfaXBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfYmluZF9wb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2JpbmRfZWFybHlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfcnRwX2Jhc2VfcG9ydF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9zZHBfcGF5bG9hZF9udW1iZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3Bfc2RwX3BheWxvYWRfbmFtZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9sb29wX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX251bWJlcl9lbmRwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2ZvcndhcmRfaXBfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfZm9yd2FyZF9wb3J0X2NtZCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtZ2NwX3BhcnNlX2NvbmZpZyhjb25zdCBjaGFyICpjb25maWdfZmlsZSwgc3RydWN0IG1nY3BfY29uZmlnICpjZmcpCit7CisJaW50IGksIHJjOworCisJZ19jZmcgPSBjZmc7CisJcmMgPSB2dHlfcmVhZF9jb25maWdfZmlsZShjb25maWdfZmlsZSk7CisJaWYgKHJjIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSB0aGUgY29uZmlnIGZpbGU6ICclcydcbiIsIGNvbmZpZ19maWxlKTsKKwkJcmV0dXJuIHJjOworCX0KKworCisJaWYgKCFnX2NmZy0+YnRzX2lwKQorCQlmcHJpbnRmKHN0ZGVyciwgIk5vIEJUUyBpcCBhZGRyZXNzIHNwZWNpZmllZC4gVGhpcyB3aWxsIGFsbG93IGV2ZXJ5b25lIHRvIGNvbm5lY3QuXG4iKTsKKworCWlmIChtZ2NwX2VuZHBvaW50c19hbGxvY2F0ZShnX2NmZykgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBhbGxvY2F0ZSBlbmRwb2ludHM6ICVkLiBRdWl0dGluZy5cbiIsIGdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogVGhpcyBhcHBsaWNhdGlvbiBzdXBwb3J0cyB0d28gbW9kZXMuCisgICAgICAgICAqICAgIDEuKSBhIHRydWUgTUdDUCBnYXRld2F5IHdpdGggc3VwcG9ydCBmb3IgQVVFUCwgQ1JDWCwgTURDWCwgRExDWAorICAgICAgICAgKiAgICAyLikgcGxhaW4gZm9yd2FyZGluZyBvZiBSVFAgcGFja2V0cyBvbiB0aGUgZW5kcG9pbnRzLgorCSAqIGJvdGggbW9kZXMgYXJlIG11dHVhbCBleGNsdXNpdmUKKwkgKi8KKwlpZiAoZ19jZmctPmZvcndhcmRfaXApIHsKKwkJaW50IHBvcnQgPSBnX2NmZy0+cnRwX2Jhc2VfcG9ydDsKKwkJaWYgKGdfY2ZnLT5mb3J3YXJkX3BvcnQgIT0gMCkKKwkJCXBvcnQgPSBnX2NmZy0+Zm9yd2FyZF9wb3J0OworCisJCWlmICghZ19jZmctPmVhcmx5X2JpbmQpIHsKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiRm9yd2FyZGluZyByZXF1aXJlcyBlYXJseSBiaW5kLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKgorCQkgKiBTdG9yZSB0aGUgZm9yd2FyZCBJUCBhbmQgYXNzaWduIGEgY2kuIEZvciBlYXJseSBiaW5kCisJCSAqIHRoZSBzb2NrZXRzIHdpbGwgYmUgY3JlYXRlZCBhZnRlciB0aGlzLgorCQkgKi8KKwkJZm9yIChpID0gMTsgaSA8IGdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzOyArK2kpIHsKKwkJCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwID0gJmdfY2ZnLT5lbmRwb2ludHNbaV07CisJCQlpbmV0X2F0b24oZ19jZmctPmZvcndhcmRfaXAsICZlbmRwLT5yZW1vdGUpOworCQkJZW5kcC0+Y2kgPSBDSV9VTlVTRUQgKyAyMzsKKwkJCWVuZHAtPm5ldF9ydHAgPSBodG9ucyhydHBfY2FsY3VsYXRlX3BvcnQoRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBwb3J0KSk7CisJCQllbmRwLT5uZXRfcnRjcCA9IGh0b25zKHJ0cF9jYWxjdWxhdGVfcG9ydChFTkRQT0lOVF9OVU1CRVIoZW5kcCksIHBvcnQpICsgMSk7CisJCX0KKworCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkNvbmZpZ3VyZWQgZm9yIEF1ZGlvIEZvcndhcmRpbmcuXG4iKTsKKwl9CisKKwkvKiBlYXJseSBiaW5kICovCisJaWYgKGdfY2ZnLT5lYXJseV9iaW5kKSB7CisJCWZvciAoaSA9IDE7IGkgPCBnX2NmZy0+bnVtYmVyX2VuZHBvaW50czsgKytpKSB7CisJCQlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCA9ICZnX2NmZy0+ZW5kcG9pbnRzW2ldOworCQkJaW50IHJ0cF9wb3J0OworCisJCQlydHBfcG9ydCA9IHJ0cF9jYWxjdWxhdGVfcG9ydChFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGdfY2ZnLT5ydHBfYmFzZV9wb3J0KTsKKwkJCWlmIChtZ2NwX2JpbmRfcnRwX3BvcnQoZW5kcCwgcnRwX3BvcnQpICE9IDApIHsKKwkJCQlMT0dQKERNR0NQLCBMT0dMX0ZBVEFMLCAiRmFpbGVkIHRvIGJpbmQ6ICVkXG4iLCBydHBfcG9ydCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuICEhZ19jZmctPmZvcndhcmRfaXA7Cit9CisKK3N0cnVjdCBnc21fbmV0d29yazsKK2ludCBic2NfdnR5X2luaXQoc3RydWN0IGdzbV9uZXR3b3JrICpkdW1teSkKK3sKKwljbWRfaW5pdCgxKTsKKwl2dHlfaW5pdCgpOworCisgICAgICAgIG1nY3BfdnR5X2luaXQoKTsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbW5jYy5jIGIvb3BlbmJzYy9zcmMvbW5jYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZDUzNjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tbmNjLmMKQEAgLTAsMCArMSw0NjggQEAKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEFuZHJlYXMgRXZlcnNiZXJnIDxBbmRyZWFzLkV2ZXJzYmVyZ0B2ZXJzYXRlbC5kZT4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21uY2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmFuc2FjdGlvbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcnRwX3Byb3h5Lmg+CisKK3ZvaWQgKnRhbGxfY2FsbF9jdHg7CisKK3N0YXRpYyBzdHJ1Y3QgbW5jY19uYW1lcyB7CisJY2hhciAqbmFtZTsKKwlpbnQgdmFsdWU7Cit9IG1uY2NfbmFtZXNbXSA9IHsKKwl7Ik1OQ0NfU0VUVVBfUkVRIiwJMHgwMTAxfSwKKwl7Ik1OQ0NfU0VUVVBfSU5EIiwJMHgwMTAyfSwKKwl7Ik1OQ0NfU0VUVVBfUlNQIiwJMHgwMTAzfSwKKwl7Ik1OQ0NfU0VUVVBfQ05GIiwJMHgwMTA0fSwKKwl7Ik1OQ0NfU0VUVVBfQ09NUExfUkVRIiwweDAxMDV9LAorCXsiTU5DQ19TRVRVUF9DT01QTF9JTkQiLDB4MDEwNn0sCisJeyJNTkNDX0NBTExfQ09ORl9JTkQiLAkweDAxMDd9LAorCXsiTU5DQ19DQUxMX1BST0NfUkVRIiwJMHgwMTA4fSwKKwl7Ik1OQ0NfUFJPR1JFU1NfUkVRIiwJMHgwMTA5fSwKKwl7Ik1OQ0NfQUxFUlRfUkVRIiwJMHgwMTBhfSwKKwl7Ik1OQ0NfQUxFUlRfSU5EIiwJMHgwMTBifSwKKwl7Ik1OQ0NfTk9USUZZX1JFUSIsCTB4MDEwY30sCisJeyJNTkNDX05PVElGWV9JTkQiLAkweDAxMGR9LAorCXsiTU5DQ19ESVNDX1JFUSIsCTB4MDEwZX0sCisJeyJNTkNDX0RJU0NfSU5EIiwJMHgwMTBmfSwKKwl7Ik1OQ0NfUkVMX1JFUSIsCTB4MDExMH0sCisJeyJNTkNDX1JFTF9JTkQiLAkweDAxMTF9LAorCXsiTU5DQ19SRUxfQ05GIiwJMHgwMTEyfSwKKwl7Ik1OQ0NfRkFDSUxJVFlfUkVRIiwJMHgwMTEzfSwKKwl7Ik1OQ0NfRkFDSUxJVFlfSU5EIiwJMHgwMTE0fSwKKwl7Ik1OQ0NfU1RBUlRfRFRNRl9JTkQiLAkweDAxMTV9LAorCXsiTU5DQ19TVEFSVF9EVE1GX1JTUCIsCTB4MDExNn0sCisJeyJNTkNDX1NUQVJUX0RUTUZfUkVKIiwJMHgwMTE3fSwKKwl7Ik1OQ0NfU1RPUF9EVE1GX0lORCIsCTB4MDExOH0sCisJeyJNTkNDX1NUT1BfRFRNRl9SU1AiLAkweDAxMTl9LAorCXsiTU5DQ19NT0RJRllfUkVRIiwJMHgwMTFhfSwKKwl7Ik1OQ0NfTU9ESUZZX0lORCIsCTB4MDExYn0sCisJeyJNTkNDX01PRElGWV9SU1AiLAkweDAxMWN9LAorCXsiTU5DQ19NT0RJRllfQ05GIiwJMHgwMTFkfSwKKwl7Ik1OQ0NfTU9ESUZZX1JFSiIsCTB4MDExZX0sCisJeyJNTkNDX0hPTERfSU5EIiwJMHgwMTFmfSwKKwl7Ik1OQ0NfSE9MRF9DTkYiLAkweDAxMjB9LAorCXsiTU5DQ19IT0xEX1JFSiIsCTB4MDEyMX0sCisJeyJNTkNDX1JFVFJJRVZFX0lORCIsCTB4MDEyMn0sCisJeyJNTkNDX1JFVFJJRVZFX0NORiIsCTB4MDEyM30sCisJeyJNTkNDX1JFVFJJRVZFX1JFSiIsCTB4MDEyNH0sCisJeyJNTkNDX1VTRVJJTkZPX1JFUSIsCTB4MDEyNX0sCisJeyJNTkNDX1VTRVJJTkZPX0lORCIsCTB4MDEyNn0sCisJeyJNTkNDX1JFSl9SRVEiLAkweDAxMjd9LAorCXsiTU5DQ19SRUpfSU5EIiwJMHgwMTI4fSwKKworCXsiTU5DQ19CUklER0UiLAkJMHgwMjAwfSwKKwl7Ik1OQ0NfRlJBTUVfUkVDViIsCTB4MDIwMX0sCisJeyJNTkNDX0ZSQU1FX0RST1AiLAkweDAyMDJ9LAorCXsiTU5DQ19MQ0hBTl9NT0RJRlkiLAkweDAyMDN9LAorCisJeyJHU01fVENIX0ZSQU1FIiwJMHgwMzAwfSwKKworCXtOVUxMLCAwfSB9OworCitzdGF0aWMgTExJU1RfSEVBRChjYWxsX2xpc3QpOworCitzdGF0aWMgdV9pbnQzMl90IG5ld19jYWxscmVmID0gMHgwMDAwMDAwMTsKKworY2hhciAqZ2V0X21uY2NfbmFtZShpbnQgdmFsdWUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBtbmNjX25hbWVzW2ldLm5hbWU7IGkrKykgeworCQlpZiAobW5jY19uYW1lc1tpXS52YWx1ZSA9PSB2YWx1ZSkKKwkJCXJldHVybiBtbmNjX25hbWVzW2ldLm5hbWU7CisJfQorCisJcmV0dXJuICJNTkNDX1Vua25vd24iOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2NhbGwoc3RydWN0IGdzbV9jYWxsICpjYWxsKQoreworCWxsaXN0X2RlbCgmY2FsbC0+ZW50cnkpOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBDYWxsIHJlbW92ZWQuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwl0YWxsb2NfZnJlZShjYWxsKTsKK30KKworCitzdHJ1Y3QgZ3NtX2NhbGwgKmdldF9jYWxsX3JlZih1X2ludDMyX3QgY2FsbHJlZikKK3sKKwlzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGx0OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY2FsbHQsICZjYWxsX2xpc3QsIGVudHJ5KSB7CisJCWlmIChjYWxsdC0+Y2FsbHJlZiA9PSBjYWxscmVmKQorCQkJcmV0dXJuIGNhbGx0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBtbmNjX3NldF9jYXVzZShzdHJ1Y3QgZ3NtX21uY2MgKmRhdGEsIGludCBsb2MsIGludCB2YWwpCit7CisJZGF0YS0+ZmllbGRzIHw9IE1OQ0NfRl9DQVVTRTsKKwlkYXRhLT5jYXVzZS5sb2NhdGlvbiA9IGxvYzsKKwlkYXRhLT5jYXVzZS52YWx1ZSA9IHZhbDsKK30KKworLyogb24gaW5jb21pbmcgY2FsbCwgbG9vayB1cCBkYXRhYmFzZSBhbmQgc2VuZCBzZXR1cCB0byByZW1vdGUgc3Vic2NyLiAqLworc3RhdGljIGludCBtbmNjX3NldHVwX2luZChzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwsIGludCBtc2dfdHlwZSwKKwkJCSAgc3RydWN0IGdzbV9tbmNjICpzZXR1cCkKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgbW5jYzsKKwlzdHJ1Y3QgZ3NtX2NhbGwgKnJlbW90ZTsKKworCW1lbXNldCgmbW5jYywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1uY2MuY2FsbHJlZiA9IGNhbGwtPmNhbGxyZWY7CisKKwkvKiBhbHJlYWR5IGhhdmUgcmVtb3RlIGNhbGwgKi8KKwlpZiAoY2FsbC0+cmVtb3RlX3JlZikKKwkJcmV0dXJuIDA7CisJCisJLyogdHJhbnNmZXIgbW9kZSAxIHdvdWxkIGJlIHBhY2tldCBtb2RlLCB3aGljaCB3YXMgbmV2ZXIgc3BlY2lmaWVkICovCisJaWYgKHNldHVwLT5iZWFyZXJfY2FwLm1vZGUgIT0gMCkgeworCQlMT0dQKERNTkNDLCBMT0dMX05PVElDRSwgIihjYWxsICV4KSBXZSBkb24ndCBzdXBwb3J0ICIKKwkJCSJwYWNrZXQgbW9kZVxuIiwgY2FsbC0+Y2FsbHJlZik7CisJCW1uY2Nfc2V0X2NhdXNlKCZtbmNjLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJR1NNNDhfQ0NfQ0FVU0VfQkVBUkVSX0NBX1VOQVZBSUwpOworCQlnb3RvIG91dF9yZWplY3Q7CisJfQorCisJLyogd2UgY3VycmVudGx5IG9ubHkgZG8gc3BlZWNoICovCisJaWYgKHNldHVwLT5iZWFyZXJfY2FwLnRyYW5zZmVyICE9IEdTTV9NTkNDX0JDQVBfU1BFRUNIKSB7CisJCUxPR1AoRE1OQ0MsIExPR0xfTk9USUNFLCAiKGNhbGwgJXgpIFdlIG9ubHkgc3VwcG9ydCAiCisJCQkidm9pY2UgY2FsbHNcbiIsIGNhbGwtPmNhbGxyZWYpOworCQltbmNjX3NldF9jYXVzZSgmbW5jYywgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCUdTTTQ4X0NDX0NBVVNFX0JFQVJFUl9DQV9VTkFWQUlMKTsKKwkJZ290byBvdXRfcmVqZWN0OworCX0KKworCS8qIGNyZWF0ZSByZW1vdGUgY2FsbCAqLworCWlmICghKHJlbW90ZSA9IHRhbGxvYyh0YWxsX2NhbGxfY3R4LCBzdHJ1Y3QgZ3NtX2NhbGwpKSkgeworCQltbmNjX3NldF9jYXVzZSgmbW5jYywgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCUdTTTQ4X0NDX0NBVVNFX1JFU09VUkNFX1VOQVZBSUwpOworCQlnb3RvIG91dF9yZWplY3Q7CisJfQorCWxsaXN0X2FkZF90YWlsKCZyZW1vdGUtPmVudHJ5LCAmY2FsbF9saXN0KTsKKwlyZW1vdGUtPm5ldCA9IGNhbGwtPm5ldDsKKwlyZW1vdGUtPmNhbGxyZWYgPSBuZXdfY2FsbHJlZisrOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBDcmVhdGluZyBuZXcgcmVtb3RlIGluc3RhbmNlICV4LlxuIiwKKwkJY2FsbC0+Y2FsbHJlZiwgcmVtb3RlLT5jYWxscmVmKTsKKworCS8qIGxpbmsgcmVtb3RlIGNhbGwgKi8KKwljYWxsLT5yZW1vdGVfcmVmID0gcmVtb3RlLT5jYWxscmVmOworCXJlbW90ZS0+cmVtb3RlX3JlZiA9IGNhbGwtPmNhbGxyZWY7CisKKwkvKiBtb2RpZnkgbW9kZSAqLworCW1lbXNldCgmbW5jYywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1uY2MuY2FsbHJlZiA9IGNhbGwtPmNhbGxyZWY7CisJbW5jYy5sY2hhbl9tb2RlID0gR1NNNDhfQ01PREVfU1BFRUNIX0VGUjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgTW9kaWZ5IGNoYW5uZWwgbW9kZS5cbiIsIGNhbGwtPmNhbGxyZWYpOworCW1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfTENIQU5fTU9ESUZZLCAmbW5jYyk7CisKKwkvKiBzZW5kIGNhbGwgcHJvY2VlZGluZyAqLworCW1lbXNldCgmbW5jYywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1uY2MuY2FsbHJlZiA9IGNhbGwtPmNhbGxyZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIEFjY2VwdGluZyBjYWxsLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19DQUxMX1BST0NfUkVRLCAmbW5jYyk7CisKKwkvKiBzZW5kIHNldHVwIHRvIHJlbW90ZSAqLworLy8Jc2V0dXAtPmZpZWxkcyB8PSBNTkNDX0ZfU0lHTkFMOworLy8Jc2V0dXAtPnNpZ25hbCA9IEdTTTQ4X1NJR05BTF9ESUFMVE9ORTsKKwlzZXR1cC0+Y2FsbHJlZiA9IHJlbW90ZS0+Y2FsbHJlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgRm9yd2FyZGluZyBTRVRVUCB0byByZW1vdGUuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwlyZXR1cm4gbW5jY19zZW5kKHJlbW90ZS0+bmV0LCBNTkNDX1NFVFVQX1JFUSwgc2V0dXApOworCitvdXRfcmVqZWN0OgorCW1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfUkVKX1JFUSwgJm1uY2MpOworCWZyZWVfY2FsbChjYWxsKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtbmNjX2FsZXJ0X2luZChzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwsIGludCBtc2dfdHlwZSwKKwkJCSAgc3RydWN0IGdzbV9tbmNjICphbGVydCkKK3sKKwlzdHJ1Y3QgZ3NtX2NhbGwgKnJlbW90ZTsKKworCS8qIHNlbmQgYWxlcnRpbmcgdG8gcmVtb3RlICovCisJaWYgKCEocmVtb3RlID0gZ2V0X2NhbGxfcmVmKGNhbGwtPnJlbW90ZV9yZWYpKSkKKwkJcmV0dXJuIDA7CisJYWxlcnQtPmNhbGxyZWYgPSByZW1vdGUtPmNhbGxyZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIEZvcndhcmRpbmcgQUxFUlQgdG8gcmVtb3RlLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJcmV0dXJuIG1uY2Nfc2VuZChyZW1vdGUtPm5ldCwgTU5DQ19BTEVSVF9SRVEsIGFsZXJ0KTsKK30KKworc3RhdGljIGludCBtbmNjX25vdGlmeV9pbmQoc3RydWN0IGdzbV9jYWxsICpjYWxsLCBpbnQgbXNnX3R5cGUsCisJCQkgICBzdHJ1Y3QgZ3NtX21uY2MgKm5vdGlmeSkKK3sKKwlzdHJ1Y3QgZ3NtX2NhbGwgKnJlbW90ZTsKKworCS8qIHNlbmQgbm90aWZ5IHRvIHJlbW90ZSAqLworCWlmICghKHJlbW90ZSA9IGdldF9jYWxsX3JlZihjYWxsLT5yZW1vdGVfcmVmKSkpCisJCXJldHVybiAwOworCW5vdGlmeS0+Y2FsbHJlZiA9IHJlbW90ZS0+Y2FsbHJlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgRm9yd2FyZGluZyBOT1RJRiB0byByZW1vdGUuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwlyZXR1cm4gbW5jY19zZW5kKHJlbW90ZS0+bmV0LCBNTkNDX05PVElGWV9SRVEsIG5vdGlmeSk7Cit9CisKK3N0YXRpYyBpbnQgbW5jY19zZXR1cF9jbmYoc3RydWN0IGdzbV9jYWxsICpjYWxsLCBpbnQgbXNnX3R5cGUsCisJCQkgIHN0cnVjdCBnc21fbW5jYyAqY29ubmVjdCkKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgY29ubmVjdF9hY2ssIGZyYW1lX3JlY3Y7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBjYWxsLT5uZXQ7CisJc3RydWN0IGdzbV9jYWxsICpyZW1vdGU7CisJdV9pbnQzMl90IHJlZnNbMl07CisKKwkvKiBhY2tub3dsZWRnZSBjb25uZWN0ICovCisJbWVtc2V0KCZjb25uZWN0X2FjaywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWNvbm5lY3RfYWNrLmNhbGxyZWYgPSBjYWxsLT5jYWxscmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBBY2tub3dsZWRnZSBTRVRVUC5cbiIsIGNhbGwtPmNhbGxyZWYpOworCW1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfU0VUVVBfQ09NUExfUkVRLCAmY29ubmVjdF9hY2spOworCisJLyogc2VuZCBjb25uZWN0IG1lc3NhZ2UgdG8gcmVtb3RlICovCisJaWYgKCEocmVtb3RlID0gZ2V0X2NhbGxfcmVmKGNhbGwtPnJlbW90ZV9yZWYpKSkKKwkJcmV0dXJuIDA7CisJY29ubmVjdC0+Y2FsbHJlZiA9IHJlbW90ZS0+Y2FsbHJlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgU2VuZGluZyBDT05ORUNUIHRvIHJlbW90ZS5cbiIsIGNhbGwtPmNhbGxyZWYpOworCW1uY2Nfc2VuZChyZW1vdGUtPm5ldCwgTU5DQ19TRVRVUF9SU1AsIGNvbm5lY3QpOworCisJLyogYnJpZGdlIHRjaCAqLworCXJlZnNbMF0gPSBjYWxsLT5jYWxscmVmOworCXJlZnNbMV0gPSBjYWxsLT5yZW1vdGVfcmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBCcmlkZ2luZyB3aXRoIHJlbW90ZS5cbiIsIGNhbGwtPmNhbGxyZWYpOworCisJLyogaW4gZGlyZWN0IG1vZGUsIHdlIGFsd2F5cyBoYXZlIHRvIGJyaWRnZSB0aGUgY2hhbm5lbHMgKi8KKwlpZiAoaXBhY2NfcnRwX2RpcmVjdCkKKwkJcmV0dXJuIG1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfQlJJREdFLCByZWZzKTsKKworCS8qIHByb3h5IG1vZGUgKi8KKwlpZiAoIW5ldC0+aGFuZG92ZXIuYWN0aXZlKSB7CisJCS8qIGluIHRoZSBuby1oYW5kb3ZlciBjYXNlLCB3ZSBjYW4gYnJpZGdlLCBpLmUuIHVzZQorCQkgKiB0aGUgb2xkIFJUUCBwcm94eSBjb2RlICovCisJCXJldHVybiBtbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX0JSSURHRSwgcmVmcyk7CisJfSBlbHNlIHsKKwkJLyogaW4gY2FzZSBvZiBoYW5kb3Zlciwgd2UgbmVlZCB0byByZS13cml0ZSB0aGUgUlRQCisJCSAqIFNTUkMsIHNlcXVlbmNlIGFuZCB0aW1lc3RhbXAgdmFsdWVzIGFuZCB0aHVzCisJCSAqIG5lZWQgdG8gZW5hYmxlIFJUUCByZWNlaXZlIGZvciBib3RoIGRpcmVjdGlvbnMgKi8KKwkJbWVtc2V0KCZmcmFtZV9yZWN2LCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJCWZyYW1lX3JlY3YuY2FsbHJlZiA9IGNhbGwtPmNhbGxyZWY7CisJCW1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfRlJBTUVfUkVDViwgJmZyYW1lX3JlY3YpOworCQlmcmFtZV9yZWN2LmNhbGxyZWYgPSBjYWxsLT5yZW1vdGVfcmVmOworCQlyZXR1cm4gbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19GUkFNRV9SRUNWLCAmZnJhbWVfcmVjdik7CisJfQorfQorCitzdGF0aWMgaW50IG1uY2NfZGlzY19pbmQoc3RydWN0IGdzbV9jYWxsICpjYWxsLCBpbnQgbXNnX3R5cGUsCisJCQkgc3RydWN0IGdzbV9tbmNjICpkaXNjKQoreworCXN0cnVjdCBnc21fY2FsbCAqcmVtb3RlOworCisJLyogc2VuZCByZWxlYXNlICovCisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIFJlbGVhc2luZyBjYWxsIHdpdGggY2F1c2UgJWRcbiIsCisJCWNhbGwtPmNhbGxyZWYsIGRpc2MtPmNhdXNlLnZhbHVlKTsKKwltbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX1JFTF9SRVEsIGRpc2MpOworCisJLyogc2VuZCBkaXNjIHRvIHJlbW90ZSAqLworCWlmICghKHJlbW90ZSA9IGdldF9jYWxsX3JlZihjYWxsLT5yZW1vdGVfcmVmKSkpIHsKKwkJcmV0dXJuIDA7CisJfQorCWRpc2MtPmNhbGxyZWYgPSByZW1vdGUtPmNhbGxyZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIERpc2Nvbm5lY3RpbmcgcmVtb3RlIHdpdGggY2F1c2UgJWRcbiIsCisJCXJlbW90ZS0+Y2FsbHJlZiwgZGlzYy0+Y2F1c2UudmFsdWUpOworCXJldHVybiBtbmNjX3NlbmQocmVtb3RlLT5uZXQsIE1OQ0NfRElTQ19SRVEsIGRpc2MpOworfQorCitzdGF0aWMgaW50IG1uY2NfcmVsX2luZChzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwsIGludCBtc2dfdHlwZSwgc3RydWN0IGdzbV9tbmNjICpyZWwpCit7CisJc3RydWN0IGdzbV9jYWxsICpyZW1vdGU7CisKKwkvKiBzZW5kIHJlbGVhc2UgdG8gcmVtb3RlICovCisJaWYgKCEocmVtb3RlID0gZ2V0X2NhbGxfcmVmKGNhbGwtPnJlbW90ZV9yZWYpKSkgeworCQlmcmVlX2NhbGwoY2FsbCk7CisJCXJldHVybiAwOworCX0KKwlyZWwtPmNhbGxyZWYgPSByZW1vdGUtPmNhbGxyZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIFJlbGVhc2luZyByZW1vdGUgd2l0aCBjYXVzZSAlZFxuIiwKKwkJY2FsbC0+Y2FsbHJlZiwgcmVsLT5jYXVzZS52YWx1ZSk7CisJbW5jY19zZW5kKHJlbW90ZS0+bmV0LCBNTkNDX1JFTF9SRVEsIHJlbCk7CisKKwlmcmVlX2NhbGwoY2FsbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtbmNjX3JlbF9jbmYoc3RydWN0IGdzbV9jYWxsICpjYWxsLCBpbnQgbXNnX3R5cGUsIHN0cnVjdCBnc21fbW5jYyAqcmVsKQoreworCWZyZWVfY2FsbChjYWxsKTsKKwlyZXR1cm4gMDsKK30KKworLyogcmVjZWl2aW5nIGEgVENIL0YgZnJhbWUgZnJvbSB0aGUgQlNDIGNvZGUgKi8KK3N0YXRpYyBpbnQgbW5jY19yY3ZfdGNoZihzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwsIGludCBtc2dfdHlwZSwKKwkJCSBzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKmRmcikKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICpyZW1vdGVfdHJhbnM7CisKKwlyZW1vdGVfdHJhbnMgPSB0cmFuc19maW5kX2J5X2NhbGxyZWYoY2FsbC0+bmV0LCBjYWxsLT5yZW1vdGVfcmVmKTsKKworCS8qIHRoaXMgc2hvdWxkbid0IHJlYWxseSBoYXBwZW4gKi8KKwlpZiAoIXJlbW90ZV90cmFucyB8fCAhcmVtb3RlX3RyYW5zLT5jb25uKSB7CisJCUxPR1AoRE1OQ0MsIExPR0xfRVJST1IsICJObyB0cmFuc2FjdGlvbiBvciB0cmFuc2FjdGlvbiB3aXRob3V0IGxjaGFuPyE/XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogUlRQIHNvY2tldCBvZiByZW1vdGUgZW5kIGhhcyBtZWFud2hpbGUgZGllZCAqLworCWlmICghcmVtb3RlX3RyYW5zLT5jb25uLT5sY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBydHBfc2VuZF9mcmFtZShyZW1vdGVfdHJhbnMtPmNvbm4tPmxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQsIGRmcik7Cit9CisKKworaW50IG1uY2NfcmVjdihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG1zZ190eXBlLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpkYXRhID0gYXJnOworCWludCBjYWxscmVmOworCXN0cnVjdCBnc21fY2FsbCAqY2FsbCA9IE5VTEwsICpjYWxsdDsKKwlpbnQgcmMgPSAwOworCisJLyogU3BlY2lhbCBtZXNzYWdlcyAqLworCXN3aXRjaChtc2dfdHlwZSkgeworCX0KKwkKKwkvKiBmaW5kIGNhbGxyZWYgKi8KKwljYWxscmVmID0gZGF0YS0+Y2FsbHJlZjsKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjYWxsdCwgJmNhbGxfbGlzdCwgZW50cnkpIHsKKwkJaWYgKGNhbGx0LT5jYWxscmVmID09IGNhbGxyZWYpIHsKKwkJCWNhbGwgPSBjYWxsdDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogY3JlYXRlIGNhbGxyZWYsIGlmIHNldHVwIGlzIHJlY2VpdmVkICovCisJaWYgKCFjYWxsKSB7CisJCWlmIChtc2dfdHlwZSAhPSBNTkNDX1NFVFVQX0lORCkKKwkJCXJldHVybiAwOyAvKiBkcm9wICovCisJCS8qIGNyZWF0ZSBjYWxsICovCisJCWlmICghKGNhbGwgPSB0YWxsb2NfemVybyh0YWxsX2NhbGxfY3R4LCBzdHJ1Y3QgZ3NtX2NhbGwpKSkgeworCQkJc3RydWN0IGdzbV9tbmNjIHJlbDsKKwkJCQorCQkJbWVtc2V0KCZyZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwkJCXJlbC5jYWxscmVmID0gY2FsbHJlZjsKKwkJCW1uY2Nfc2V0X2NhdXNlKCZyZWwsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkgICAgICAgR1NNNDhfQ0NfQ0FVU0VfUkVTT1VSQ0VfVU5BVkFJTCk7CisJCQltbmNjX3NlbmQobmV0LCBNTkNDX1JFTF9SRVEsICZyZWwpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbGxpc3RfYWRkX3RhaWwoJmNhbGwtPmVudHJ5LCAmY2FsbF9saXN0KTsKKwkJY2FsbC0+bmV0ID0gbmV0OworCQljYWxsLT5jYWxscmVmID0gY2FsbHJlZjsKKwkJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIENhbGwgY3JlYXRlZC5cbiIsIGNhbGwtPmNhbGxyZWYpOworCX0KKworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FOgorCWNhc2UgR1NNX1RDSEZfRlJBTUVfRUZSOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgUmVjZWl2ZWQgbWVzc2FnZSAlc1xuIiwgY2FsbC0+Y2FsbHJlZiwKKwkJCWdldF9tbmNjX25hbWUobXNnX3R5cGUpKTsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoKG1zZ190eXBlKSB7CisJY2FzZSBNTkNDX1NFVFVQX0lORDoKKwkJcmMgPSBtbmNjX3NldHVwX2luZChjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX1NFVFVQX0NORjoKKwkJcmMgPSBtbmNjX3NldHVwX2NuZihjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX1NFVFVQX0NPTVBMX0lORDoKKwkJYnJlYWs7CisJY2FzZSBNTkNDX0NBTExfQ09ORl9JTkQ6CisJCS8qIHdlIG5vdyBuZWVkIHRvIE1PRElGWSB0aGUgY2hhbm5lbCAqLworCQlkYXRhLT5sY2hhbl9tb2RlID0gR1NNNDhfQ01PREVfU1BFRUNIX0VGUjsKKwkJbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19MQ0hBTl9NT0RJRlksIGRhdGEpOworCQlicmVhazsKKwljYXNlIE1OQ0NfQUxFUlRfSU5EOgorCQlyYyA9IG1uY2NfYWxlcnRfaW5kKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwljYXNlIE1OQ0NfTk9USUZZX0lORDoKKwkJcmMgPSBtbmNjX25vdGlmeV9pbmQoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19ESVNDX0lORDoKKwkJcmMgPSBtbmNjX2Rpc2NfaW5kKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwljYXNlIE1OQ0NfUkVMX0lORDoKKwljYXNlIE1OQ0NfUkVKX0lORDoKKwkJcmMgPSBtbmNjX3JlbF9pbmQoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19SRUxfQ05GOgorCQlyYyA9IG1uY2NfcmVsX2NuZihjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX0ZBQ0lMSVRZX0lORDoKKwkJYnJlYWs7CisJY2FzZSBNTkNDX1NUQVJUX0RUTUZfSU5EOgorCQlicmVhazsKKwljYXNlIE1OQ0NfU1RPUF9EVE1GX0lORDoKKwkJYnJlYWs7CisJY2FzZSBNTkNDX01PRElGWV9JTkQ6CisJCW1uY2Nfc2V0X2NhdXNlKGRhdGEsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9TRVJWX09QVF9VTklNUEwpOworCQlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgUmVqZWN0aW5nIE1PRElGWSB3aXRoIGNhdXNlICVkXG4iLAorCQkJY2FsbC0+Y2FsbHJlZiwgZGF0YS0+Y2F1c2UudmFsdWUpOworCQlyYyA9IG1uY2Nfc2VuZChuZXQsIE1OQ0NfTU9ESUZZX1JFSiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19NT0RJRllfQ05GOgorCQlicmVhazsKKwljYXNlIE1OQ0NfSE9MRF9JTkQ6CisJCW1uY2Nfc2V0X2NhdXNlKGRhdGEsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9TRVJWX09QVF9VTklNUEwpOworCQlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgUmVqZWN0aW5nIEhPTEQgd2l0aCBjYXVzZSAlZFxuIiwKKwkJCWNhbGwtPmNhbGxyZWYsIGRhdGEtPmNhdXNlLnZhbHVlKTsKKwkJcmMgPSBtbmNjX3NlbmQobmV0LCBNTkNDX0hPTERfUkVKLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX1JFVFJJRVZFX0lORDoKKwkJbW5jY19zZXRfY2F1c2UoZGF0YSwgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCUdTTTQ4X0NDX0NBVVNFX1NFUlZfT1BUX1VOSU1QTCk7CisJCURFQlVHUChETU5DQywgIihjYWxsICV4KSBSZWplY3RpbmcgUkVUUklFVkUgd2l0aCBjYXVzZSAlZFxuIiwKKwkJCWNhbGwtPmNhbGxyZWYsIGRhdGEtPmNhdXNlLnZhbHVlKTsKKwkJcmMgPSBtbmNjX3NlbmQobmV0LCBNTkNDX1JFVFJJRVZFX1JFSiwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgR1NNX1RDSEZfRlJBTUU6CisJY2FzZSBHU01fVENIRl9GUkFNRV9FRlI6CisJCXJjID0gbW5jY19yY3ZfdGNoZihjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETU5DQywgTE9HTF9OT1RJQ0UsICIoY2FsbCAleCkgTWVzc2FnZSB1bmhhbmRsZWRcbiIsIGNhbGxyZWYpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4xLTEgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4xLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1ODA0ZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjEtMQpAQCAtMCwwICsxLDU0IEBACishCishIE9wZW5CU0MgY29uZmlndXJhdGlvbiBzYXZlZCBmcm9tIHZ0eQorISAgICEKK3Bhc3N3b3JkIGZvbworIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorbmV0d29yaworIG5ldHdvcmsgY291bnRyeSBjb2RlIDEKKyBtb2JpbGUgbmV0d29yayBjb2RlIDEKKyBzaG9ydCBuYW1lIE9wZW5CU0MKKyBsb25nIG5hbWUgT3BlbkJTQworIHRpbWVyIHQzMTAxIDEwCisgdGltZXIgdDMxMTMgNjAKKyBidHMgMAorICB0eXBlIGJzMTEKKyAgYmFuZCBHU005MDAKKyAgY2VsbF9pZGVudGl0eSAxCisgIGxvY2F0aW9uX2FyZWFfY29kZSAxCisgIHRyYWluaW5nX3NlcXVlbmNlX2NvZGUgNworICBiYXNlX3N0YXRpb25faWRfY29kZSA2MworICBvbWwgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICBvbWwgZTEgdGVpIDI1CisgIHRyeCAwCisgICBhcmZjbiAxMjEKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMQorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBDQ0NIK1NEQ0NINAorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDMKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMS0yIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMS0yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZDUwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4xLTIKQEAgLTAsMCArMSw4MiBAQAorIQorISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHkKKyEgICAhCitwYXNzd29yZCBmb28KKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK25ldHdvcmsKKyBuZXR3b3JrIGNvdW50cnkgY29kZSAxCisgbW9iaWxlIG5ldHdvcmsgY29kZSAxCisgc2hvcnQgbmFtZSBPcGVuQlNDCisgbG9uZyBuYW1lIE9wZW5CU0MKKyB0aW1lciB0MzEwMSAxMAorIHRpbWVyIHQzMTEzIDYwCisgYnRzIDAKKyAgdHlwZSBiczExCisgIGJhbmQgR1NNOTAwCisgIGNlbGxfaWRlbnRpdHkgMQorICBsb2NhdGlvbl9hcmVhX2NvZGUgMQorICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDcKKyAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgNjMKKyAgb21sIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgb21sIGUxIHRlaSAyNQorICB0cnggMAorICAgYXJmY24gMTIxCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDEKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgQ0NDSCtTRENDSDQKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBTRENDSDgKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMworICB0cnggMQorICAgYXJmY24gMTIzCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDIKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAzCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4yLTIgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4yLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFlODAwMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjItMgpAQCAtMCwwICsxLDE0OCBAQAorIQorISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHkKKyEgICAhCitwYXNzd29yZCBmb28KKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK25ldHdvcmsKKyBuZXR3b3JrIGNvdW50cnkgY29kZSAxCisgbW9iaWxlIG5ldHdvcmsgY29kZSAxCisgc2hvcnQgbmFtZSBPcGVuQlNDCisgbG9uZyBuYW1lIE9wZW5CU0MKKyB0aW1lciB0MzEwMSAxMAorIHRpbWVyIHQzMTEzIDYwCisgYnRzIDAKKyAgdHlwZSBiczExCisgIGJhbmQgR1NNOTAwCisgIGNlbGxfaWRlbnRpdHkgMQorICBsb2NhdGlvbl9hcmVhX2NvZGUgMQorICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDcKKyAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgNjMKKyAgb21sIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgb21sIGUxIHRlaSAyNQorICB0cnggMAorICAgYXJmY24gMTIxCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDEKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgQ0NDSCtTRENDSDQKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAzCisgIHRyeCAxCisgICBhcmZjbiAxMjMKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMgorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDMKKyBidHMgMQorICB0eXBlIGJzMTEKKyAgYmFuZCBHU005MDAKKyAgbG9jYXRpb25fYXJlYV9jb2RlIDIKKyAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSA3CisgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlIDYzCisgIG9tbCBlMSBsaW5lIDEgdGltZXNsb3QgNiBzdWItc2xvdCBmdWxsCisgIG9tbCBlMSB0ZWkgMjUKKyAgdHJ4IDAKKyAgIGFyZmNuIDEyMgorICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAxIHRpbWVzbG90IDYgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAxCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA3IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgU0RDQ0g4CisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA3IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDcgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgNyBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA4IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDggc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOCBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA4IHN1Yi1zbG90IDMKKyAgdHJ4IDEKKyAgIGFyZmNuIDEyNAorICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAxIHRpbWVzbG90IDYgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAyCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA5IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDkgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOSBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA5IHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDEwIHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDEwIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDEwIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDEwIHN1Yi1zbG90IDMKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLm5hbm9idHMgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy5uYW5vYnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExY2VhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy5uYW5vYnRzCkBAIC0wLDAgKzEsNDAgQEAKKyEKKyEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5CishCitwYXNzd29yZCBmb28KKyEKK2xpbmUgdnR5Cisgbm8gbG9naW4KKyEKK25ldHdvcmsKKyBuZXR3b3JrIGNvdW50cnkgY29kZSAxCisgbW9iaWxlIG5ldHdvcmsgY29kZSAxCisgc2hvcnQgbmFtZSBPcGVuQlNDCisgbG9uZyBuYW1lIE9wZW5CU0MKKyB0aW1lciB0MzEwMSAxMAorIHRpbWVyIHQzMTEzIDYwCisgYnRzIDAKKyAgdHlwZSBuYW5vYnRzCisgIGlwLmFjY2VzcyB1bml0X2lkIDE4MDEgMAorICBiYW5kIEdTTTE4MDAKKyAgbG9jYXRpb25fYXJlYV9jb2RlIDEKKyAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSA3CisgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlIDYzCisgIHRyeCAwCisgICBhcmZjbiA1MTQKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgQ0NDSCtTRENDSDQKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgU0RDQ0g4CisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9wYWdpbmcuYyBiL29wZW5ic2Mvc3JjL3BhZ2luZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzc1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9wYWdpbmcuYwpAQCAtMCwwICsxLDMzOSBAQAorLyogUGFnaW5nIGhlbHBlciBhbmQgbWFuYWdlci4uLi4gKi8KKy8qIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisvKgorICogUmVsZXZhbnQgc3BlY3M6CisgKiAgICAgMTIuMjE6CisgKiAgICAgICAtIDkuNC4xMiBmb3IgQ0NDSCBMb2NhbCBUaHJlc2hvbGQKKyAqCisgKiAgICAgMDUuNTg6CisgKiAgICAgICAtIDguNS4yIENDQ0ggTG9hZCBpbmRpY2F0aW9uCisgKiAgICAgICAtIDkuMy4xNSBQYWdpbmcgTG9hZAorICoKKyAqIEFwcHJvYWNoOgorICogICAgICAgLSBTZW5kIHBhZ2luZyBjb21tYW5kIHRvIHN1YnNjcmliZXIKKyAqICAgICAgIC0gT24gQ2hhbm5lbCBSZXF1ZXN0IHdlIHdpbGwgcmVtZW1iZXIgdGhlIHJlYXNvbgorICogICAgICAgLSBBZnRlciB0aGUgQUNLIHdlIHdpbGwgcmVxdWVzdCB0aGUgaWRlbnRpdHkKKyAqCSAtIFRoZW4gd2Ugd2lsbCBzZW5kIGFzc2lnbiB0aGUgZ3NtX3N1YnNjcmliZXIgYW5kCisgKgkgLSBhbmQgY2FsbCBhIGNhbGxiYWNrCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisKK3ZvaWQgKnRhbGxfcGFnaW5nX2N0eDsKKworc3RhdGljIHVuc2lnbmVkIGludCBjYWxjdWxhdGVfZ3JvdXAoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJaW50IGNjY2hfY29uZjsKKwlpbnQgYnNfY2NfY2hhbnM7CisJaW50IGJsb2NrczsKKwl1bnNpZ25lZCBpbnQgZ3JvdXA7CisJCisJY2NjaF9jb25mID0gYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmNjY2hfY29uZjsKKwlic19jY19jaGFucyA9IHJzbF9jY2NoX2NvbmZfdG9fYnNfY2NfY2hhbnMoY2NjaF9jb25mKTsKKwkvKiBjb2RlIHdvcmQgKyAyLCBhcyAyIGNoYW5uZWxzIGVxdWFscyAweDAgKi8KKwlibG9ja3MgPSByc2xfbnVtYmVyX29mX3BhZ2luZ19zdWJjaGFubmVscyhidHMpOworCWdyb3VwID0gZ2V0X3BhZ2luZ19ncm91cChzdHJfdG9faW1zaShzdWJzY3ItPmltc2kpLAorCQkJCQlic19jY19jaGFucywgYmxvY2tzKTsKKwlyZXR1cm4gZ3JvdXA7Cit9CisKKy8qCisgKiBLaWxsIG9uZSBwYWdpbmcgcmVxdWVzdCB1cGRhdGUgdGhlIGludGVybmFsIGxpc3QuLi4KKyAqLworc3RhdGljIHZvaWQgcGFnaW5nX3JlbW92ZV9yZXF1ZXN0KHN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqcGFnaW5nX2J0cywKKwkJCQlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICp0b19iZV9kZWxldGVkKQoreworCS8qIFVwZGF0ZSB0aGUgbGFzdF9yZXF1ZXN0IGlmIHRoYXQgaXMgbmVjZXNzYXJ5ICovCisJaWYgKHRvX2JlX2RlbGV0ZWQgPT0gcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0KSB7CisJCXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCA9CisJCQkoc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqKXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdC0+ZW50cnkubmV4dDsKKwkJaWYgKCZ0b19iZV9kZWxldGVkLT5lbnRyeSA9PSAmcGFnaW5nX2J0cy0+cGVuZGluZ19yZXF1ZXN0cykKKwkJCXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCA9IE5VTEw7CisJfQorCisJYnNjX2RlbF90aW1lcigmdG9fYmVfZGVsZXRlZC0+VDMxMTMpOworCWxsaXN0X2RlbCgmdG9fYmVfZGVsZXRlZC0+ZW50cnkpOworCXN1YnNjcl9wdXQodG9fYmVfZGVsZXRlZC0+c3Vic2NyKTsKKwl0YWxsb2NfZnJlZSh0b19iZV9kZWxldGVkKTsKK30KKworc3RhdGljIHZvaWQgcGFnZV9tcyhzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpyZXF1ZXN0KQoreworCXVfaW50OF90IG1pWzEyOF07CisJdW5zaWduZWQgaW50IG1pX2xlbjsKKwl1bnNpZ25lZCBpbnQgcGFnZV9ncm91cDsKKworCURFQlVHUChEUEFHLCAiR29pbmcgdG8gc2VuZCBwYWdpbmcgY29tbWFuZHM6IGltc2k6ICclcycgdG1zaTogJzB4JXgnXG4iLAorCQlyZXF1ZXN0LT5zdWJzY3ItPmltc2ksIHJlcXVlc3QtPnN1YnNjci0+dG1zaSk7CisKKwlpZiAocmVxdWVzdC0+c3Vic2NyLT50bXNpID09IEdTTV9SRVNFUlZFRF9UTVNJKQorCQltaV9sZW4gPSBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV9pbXNpKG1pLCByZXF1ZXN0LT5zdWJzY3ItPmltc2kpOworCWVsc2UKKwkJbWlfbGVuID0gZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21fdG1zaShtaSwgcmVxdWVzdC0+c3Vic2NyLT50bXNpKTsKKworCXBhZ2VfZ3JvdXAgPSBjYWxjdWxhdGVfZ3JvdXAocmVxdWVzdC0+YnRzLCByZXF1ZXN0LT5zdWJzY3IpOworCXJzbF9wYWdpbmdfY21kKHJlcXVlc3QtPmJ0cywgcGFnZV9ncm91cCwgbWlfbGVuLCBtaSwKKwkJCXJlcXVlc3QtPmNoYW5fdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBhZ2luZ19tb3ZlX3RvX25leHQoc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlICpwYWdpbmdfYnRzKQoreworCXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCA9CisJCShzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICopcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0LT5lbnRyeS5uZXh0OworCWlmICgmcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0LT5lbnRyeSA9PSAmcGFnaW5nX2J0cy0+cGVuZGluZ19yZXF1ZXN0cykKKwkJcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0ID0gTlVMTDsKK30KKworLyoKKyAqIFRoaXMgaXMga2lja2VkIGJ5IHRoZSBwZXJpb2RpYyBQQUdJTkcgTE9BRCBJbmRpY2F0b3IKKyAqIGNvbWluZyBmcm9tIGFiaXNfcnNsLmMKKyAqCisgKiBXZSBhdHRlbXB0IHRvIGl0ZXJhdGUgb25jZSBvdmVyIHRoZSBsaXN0IG9mIGl0ZW1zIGJ1dAorICogb25seSB1cHRvIGF2YWlsYWJsZV9zbG90cy4KKyAqLworc3RhdGljIHZvaWQgcGFnaW5nX2hhbmRsZV9wZW5kaW5nX3JlcXVlc3RzKHN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqcGFnaW5nX2J0cykKK3sKKwlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICppbml0aWFsX3JlcXVlc3QgPSBOVUxMOworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKmN1cnJlbnRfcmVxdWVzdCA9IE5VTEw7CisKKwkvKgorCSAqIERldGVybWluZSBpZiB0aGUgcGVuZGluZ19yZXF1ZXN0cyBsaXN0IGlzIGVtcHR5IGFuZAorCSAqIHJldHVybiB0aGVuLgorCSAqLworCWlmIChsbGlzdF9lbXB0eSgmcGFnaW5nX2J0cy0+cGVuZGluZ19yZXF1ZXN0cykpIHsKKwkJcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0ID0gTlVMTDsKKwkJLyogc2luY2UgdGhlIGxpc3QgaXMgZW1wdHksIG5vIG5lZWQgdG8gcmVzY2hlZHVsZSB0aGUgdGltZXIgKi8KKwkJcmV0dXJuOworCX0KKworCWlmICghcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0KQorCQlwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QgPQorCQkJKHN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKilwYWdpbmdfYnRzLT5wZW5kaW5nX3JlcXVlc3RzLm5leHQ7CisKKwlhc3NlcnQocGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0KTsKKwlpbml0aWFsX3JlcXVlc3QgPSBwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3Q7CisJY3VycmVudF9yZXF1ZXN0ID0gaW5pdGlhbF9yZXF1ZXN0OworCisJZG8geworCQkvKiBoYW5kbGUgdGhlIHBhZ2luZyByZXF1ZXN0IG5vdyAqLworCQlwYWdlX21zKGN1cnJlbnRfcmVxdWVzdCk7CisJCXBhZ2luZ19idHMtPmF2YWlsYWJsZV9zbG90cy0tOworCisJCS8qCisJCSAqIG1vdmUgdG8gdGhlIG5leHQgaXRlbS4gV2UgbWlnaHQgd3JhcCBhcm91bmQKKwkJICogdGhpcyBtZWFucyBsYXN0X3JlcXVlc3Qgd2lsbCBiZSBOVUxMIGFuZCB3ZSBqdXN0CisJCSAqIGNhbGwgcGFnaW5nX3BhZ2VfdG9fbmV4dCBhZ2Fpbi4gSXQgaXQgZ3VyYW50ZWVkCisJCSAqIHRoYXQgdGhlIGxpc3QgaXMgbm90IGVtcHR5LgorCQkgKi8KKwkJcGFnaW5nX21vdmVfdG9fbmV4dChwYWdpbmdfYnRzKTsKKwkJaWYgKCFwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QpCisJCQlwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QgPQorCQkJCShzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICopcGFnaW5nX2J0cy0+cGVuZGluZ19yZXF1ZXN0cy5uZXh0OworCQljdXJyZW50X3JlcXVlc3QgPSBwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3Q7CisJfSB3aGlsZSAocGFnaW5nX2J0cy0+YXZhaWxhYmxlX3Nsb3RzID4gMAorCQkgICAgJiYgIGluaXRpYWxfcmVxdWVzdCAhPSBjdXJyZW50X3JlcXVlc3QpOworCisJYnNjX3NjaGVkdWxlX3RpbWVyKCZwYWdpbmdfYnRzLT53b3JrX3RpbWVyLCAxLCAwKTsKK30KKworc3RhdGljIHZvaWQgcGFnaW5nX3dvcmtlcih2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqcGFnaW5nX2J0cyA9IGRhdGE7CisKKwlwYWdpbmdfaGFuZGxlX3BlbmRpbmdfcmVxdWVzdHMocGFnaW5nX2J0cyk7Cit9CisKK3ZvaWQgcGFnaW5nX2luaXQoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlidHMtPnBhZ2luZy5idHMgPSBidHM7CisJSU5JVF9MTElTVF9IRUFEKCZidHMtPnBhZ2luZy5wZW5kaW5nX3JlcXVlc3RzKTsKKwlidHMtPnBhZ2luZy53b3JrX3RpbWVyLmNiID0gcGFnaW5nX3dvcmtlcjsKKwlidHMtPnBhZ2luZy53b3JrX3RpbWVyLmRhdGEgPSAmYnRzLT5wYWdpbmc7CisKKwkvKiBMYXJnZSBudW1iZXIsIHVudGlsIHdlIGdldCBhIHByb3BlciBtZXNzYWdlICovCisJYnRzLT5wYWdpbmcuYXZhaWxhYmxlX3Nsb3RzID0gMTAwOworfQorCitzdGF0aWMgaW50IHBhZ2luZ19wZW5kaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlICpidHMsCisJCQkJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpIHsKKwlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpyZXE7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShyZXEsICZidHMtPnBlbmRpbmdfcmVxdWVzdHMsIGVudHJ5KSB7CisJCWlmIChzdWJzY3IgPT0gcmVxLT5zdWJzY3IpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsJCit9CisKK3N0YXRpYyB2b2lkIHBhZ2luZ19UMzExM19leHBpcmVkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKilkYXRhOworCXN0cnVjdCBwYWdpbmdfc2lnbmFsX2RhdGEgc2lnX2RhdGE7CisJdm9pZCAqY2Jmbl9wYXJhbTsKKwlnc21fY2JmbiAqY2JmbjsKKworCURFQlVHUChEUEFHLCAiVDMxMTMgZXhwaXJlZCBmb3IgcmVxdWVzdCAlcCAoJXMpXG4iLAorCQlyZXEsIHJlcS0+c3Vic2NyLT5pbXNpKTsKKwkKKwlzaWdfZGF0YS5zdWJzY3IgPSByZXEtPnN1YnNjcjsKKwlzaWdfZGF0YS5idHMJPSByZXEtPmJ0czsKKwlzaWdfZGF0YS5sY2hhbgk9IE5VTEw7CisKKwkvKiBtdXN0IGJlIGRlc3Ryb3llZCBiZWZvcmUgY2FsbGluZyBjYmZuLCB0byBwcmV2ZW50IGRvdWJsZSBmcmVlICovCisJY2Jmbl9wYXJhbSA9IHJlcS0+Y2Jmbl9wYXJhbTsKKwljYmZuID0gcmVxLT5jYmZuOworCXBhZ2luZ19yZW1vdmVfcmVxdWVzdCgmcmVxLT5idHMtPnBhZ2luZywgcmVxKTsKKworCWNvdW50ZXJfaW5jKHJlcS0+YnRzLT5uZXR3b3JrLT5zdGF0cy5wYWdpbmcuZXhwaXJlZCk7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfUEFHSU5HLCBTX1BBR0lOR19FWFBJUkVELCAmc2lnX2RhdGEpOworCWlmIChjYmZuKQorCQljYmZuKEdTTV9IT09LX1JSX1BBR0lORywgR1NNX1BBR0lOR19FWFBJUkVELCBOVUxMLCBOVUxMLAorCQkJICBjYmZuX3BhcmFtKTsKK30KKworc3RhdGljIGludCBfcGFnaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICAgaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqYnRzX2VudHJ5ID0gJmJ0cy0+cGFnaW5nOworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnJlcTsKKworCWlmIChwYWdpbmdfcGVuZGluZ19yZXF1ZXN0KGJ0c19lbnRyeSwgc3Vic2NyKSkgeworCQlERUJVR1AoRFBBRywgIlBhZ2luZyByZXF1ZXN0IGFscmVhZHkgcGVuZGluZ1xuIik7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCURFQlVHUChEUEFHLCAiU3RhcnQgcGFnaW5nIG9mIHN1YnNjcmliZXIgJWxsdSBvbiBidHMgJWQuXG4iLAorCQlzdWJzY3ItPmlkLCBidHMtPm5yKTsKKwlyZXEgPSB0YWxsb2NfemVybyh0YWxsX3BhZ2luZ19jdHgsIHN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QpOworCXJlcS0+c3Vic2NyID0gc3Vic2NyX2dldChzdWJzY3IpOworCXJlcS0+YnRzID0gYnRzOworCXJlcS0+Y2hhbl90eXBlID0gdHlwZTsKKwlyZXEtPmNiZm4gPSBjYmZuOworCXJlcS0+Y2Jmbl9wYXJhbSA9IGRhdGE7CisJcmVxLT5UMzExMy5jYiA9IHBhZ2luZ19UMzExM19leHBpcmVkOworCXJlcS0+VDMxMTMuZGF0YSA9IHJlcTsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJnJlcS0+VDMxMTMsIGJ0cy0+bmV0d29yay0+VDMxMTMsIDApOworCWxsaXN0X2FkZF90YWlsKCZyZXEtPmVudHJ5LCAmYnRzX2VudHJ5LT5wZW5kaW5nX3JlcXVlc3RzKTsKKworCWlmICghYnNjX3RpbWVyX3BlbmRpbmcoJmJ0c19lbnRyeS0+d29ya190aW1lcikpCisJCWJzY19zY2hlZHVsZV90aW1lcigmYnRzX2VudHJ5LT53b3JrX3RpbWVyLCAxLCAwKTsKKworCXJldHVybiAwOworfQorCitpbnQgcGFnaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJICAgaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBOVUxMOworCWludCBudW1fcGFnZXMgPSAwOworCisJY291bnRlcl9pbmMobmV0d29yay0+c3RhdHMucGFnaW5nLmF0dGVtcHRlZCk7CisKKwkvKiBzdGFydCBwYWdpbmcgc3Vic2NyaWJlciBvbiBhbGwgQlRTIHdpdGhpbiBMb2NhdGlvbiBBcmVhICovCisJZG8geworCQlpbnQgcmM7CisKKwkJYnRzID0gZ3NtX2J0c19ieV9sYWMobmV0d29yaywgc3Vic2NyLT5sYWMsIGJ0cyk7CisJCWlmICghYnRzKQorCQkJYnJlYWs7CisKKwkJLyogc2tpcCBhbGwgY3VycmVudGx5IGluYWN0aXZlIFRSWCAqLworCQlpZiAoIXRyeF9pc191c2FibGUoYnRzLT5jMCkpCisJCQljb250aW51ZTsKKworCQludW1fcGFnZXMrKzsKKworCQkvKiBUcmlnZ2VyIHBhZ2luZywgcGFzcyBhbnkgZXJyb3IgdG8gY2FsbGVyICovCisJCXJjID0gX3BhZ2luZ19yZXF1ZXN0KGJ0cywgc3Vic2NyLCB0eXBlLCBjYmZuLCBkYXRhKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwl9IHdoaWxlICgxKTsKKworCWlmIChudW1fcGFnZXMgPT0gMCkKKwkJY291bnRlcl9pbmMobmV0d29yay0+c3RhdHMucGFnaW5nLmRldGFjaGVkKTsKKworCXJldHVybiBudW1fcGFnZXM7Cit9CisKKworLyogd2UgY29uc2Npb3VzbHkgaWdub3JlIHRoZSB0eXBlIG9mIHRoZSByZXF1ZXN0IGhlcmUgKi8KK3N0YXRpYyB2b2lkIF9wYWdpbmdfcmVxdWVzdF9zdG9wKHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJCSBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgKmJ0c19lbnRyeSA9ICZidHMtPnBhZ2luZzsKKwlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpyZXEsICpyZXEyOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIHJlcTIsICZidHNfZW50cnktPnBlbmRpbmdfcmVxdWVzdHMsCisJCQkJIGVudHJ5KSB7CisJCWlmIChyZXEtPnN1YnNjciA9PSBzdWJzY3IpIHsKKwkJCWlmIChsY2hhbiAmJiByZXEtPmNiZm4pIHsKKwkJCQlERUJVR1AoRFBBRywgIlN0b3AgcGFnaW5nIG9uIGJ0cyAlZCwgY2FsbGluZyBjYmZuLlxuIiwgYnRzLT5ucik7CisJCQkJcmVxLT5jYmZuKEdTTV9IT09LX1JSX1BBR0lORywgR1NNX1BBR0lOR19TVUNDRUVERUQsCisJCQkJCSAgTlVMTCwgbGNoYW4sIHJlcS0+Y2Jmbl9wYXJhbSk7CisJCQl9IGVsc2UKKwkJCQlERUJVR1AoRFBBRywgIlN0b3AgcGFnaW5nIG9uIGJ0cyAlZCBzaWxlbnRseS5cbiIsIGJ0cy0+bnIpOworCQkJcGFnaW5nX3JlbW92ZV9yZXF1ZXN0KCZidHMtPnBhZ2luZywgcmVxKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKiBTdG9wIHBhZ2luZyBvbiBhbGwgb3RoZXIgYnRzJyAqLwordm9pZCBwYWdpbmdfcmVxdWVzdF9zdG9wKHN0cnVjdCBnc21fYnRzICpfYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCSBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gTlVMTDsKKworCWlmIChfYnRzKQorCQlfcGFnaW5nX3JlcXVlc3Rfc3RvcChfYnRzLCBzdWJzY3IsIGxjaGFuKTsKKworCWRvIHsKKwkJLyoKKwkJICogRklYTUU6IERvbid0IHVzZSB0aGUgbGFjIG9mIHRoZSBzdWJzY3JpYmVyLi4uCisJCSAqIGFzIGl0IG1pZ2h0IGhhdmUgbWFnaWNhbGx5IGNoYW5nZWQgdGhlIGxhYy4uIHVzZSB0aGUKKwkJICogbG9jYXRpb24gYXJlYSBvZiB0aGUgX2J0cyBhcyByZWNvbmZpZ3VyYXRpb24gb2YgdGhlCisJCSAqIG5ldHdvcmsgaXMgcHJvYmFibHkgaGFwcGVuaW5nIGxlc3Mgb2Z0ZW4uCisJCSAqLworCQlidHMgPSBnc21fYnRzX2J5X2xhYyhzdWJzY3ItPm5ldCwgc3Vic2NyLT5sYWMsIGJ0cyk7CisJCWlmICghYnRzKQorCQkJYnJlYWs7CisKKwkJLyogU3RvcCBwYWdpbmcgKi8KKyAgICAgICAgICAgICAgICBpZiAoYnRzICE9IF9idHMpCisJCQlfcGFnaW5nX3JlcXVlc3Rfc3RvcChidHMsIHN1YnNjciwgTlVMTCk7CisJfSB3aGlsZSAoMSk7Cit9CisKK3ZvaWQgcGFnaW5nX3VwZGF0ZV9idWZmZXJfc3BhY2Uoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQxNl90IGZyZWVfc2xvdHMpCit7CisJYnRzLT5wYWdpbmcuYXZhaWxhYmxlX3Nsb3RzID0gZnJlZV9zbG90czsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Jlc3Rfb2N0ZXRzLmMgYi9vcGVuYnNjL3NyYy9yZXN0X29jdGV0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OTk2Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9yZXN0X29jdGV0cy5jCkBAIC0wLDAgKzEsMzk2IEBACisvKiBHU00gTW9iaWxlIFJhZGlvIEludGVyZmFjZSBMYXllciAzIG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UsCisgKiByZXN0IG9jdGV0IGhhbmRsaW5nIGFjY29yZGluZyB0bworICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9iaXR2ZWMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Jlc3Rfb2N0ZXRzLmg+CisKKy8qIGdlbmVyYXRlIFNJMSByZXN0IG9jdGV0cyAqLworaW50IHJlc3Rfb2N0ZXRzX3NpMSh1X2ludDhfdCAqZGF0YSwgdV9pbnQ4X3QgKm5jaF9wb3MpCit7CisJc3RydWN0IGJpdHZlYyBidjsKKworCW1lbXNldCgmYnYsIDAsIHNpemVvZihidikpOworCWJ2LmRhdGEgPSBkYXRhOworCWJ2LmRhdGFfbGVuID0gMTsKKworCWlmIChuY2hfcG9zKSB7CisJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJCWJpdHZlY19zZXRfdWludCgmYnYsICpuY2hfcG9zLCA1KTsKKwl9IGVsc2UKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKworCWJpdHZlY19zcGFyZV9wYWRkaW5nKCZidiwgNyk7CisJcmV0dXJuIGJ2LmRhdGFfbGVuOworfQorCisvKiBBcHBlbmQgc2VsZWN0aW9uIHBhcmFtZXRlcnMgdG8gYml0dmVjICovCitzdGF0aWMgdm9pZCBhcHBlbmRfc2VsZWN0aW9uX3BhcmFtcyhzdHJ1Y3QgYml0dmVjICpidiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGdzbTQ4X3NpX3NlbGVjdGlvbl9wYXJhbXMgKnNwKQoreworCWlmIChzcC0+cHJlc2VudCkgeworCQliaXR2ZWNfc2V0X2JpdChidiwgSCk7CisJCWJpdHZlY19zZXRfYml0KGJ2LCBzcC0+Y2JxKTsKKwkJYml0dmVjX3NldF91aW50KGJ2LCBzcC0+Y2VsbF9yZXNlbF9vZmYsIDYpOworCQliaXR2ZWNfc2V0X3VpbnQoYnYsIHNwLT50ZW1wX29mZnMsIDMpOworCQliaXR2ZWNfc2V0X3VpbnQoYnYsIHNwLT5wZW5hbHR5X3RpbWUsIDUpOworCX0gZWxzZQorCQliaXR2ZWNfc2V0X2JpdChidiwgTCk7Cit9CisKKy8qIEFwcGVuZCBwb3dlciBvZmZzZXQgdG8gYml0dmVjICovCitzdGF0aWMgdm9pZCBhcHBlbmRfcG93ZXJfb2Zmc2V0KHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJCWNvbnN0IHN0cnVjdCBnc200OF9zaV9wb3dlcl9vZmZzZXQgKnBvKQoreworCWlmIChwby0+cHJlc2VudCkgeworCQliaXR2ZWNfc2V0X2JpdChidiwgSCk7CisJCWJpdHZlY19zZXRfdWludChidiwgcG8tPnBvd2VyX29mZnNldCwgMik7CisJfSBlbHNlCisJCWJpdHZlY19zZXRfYml0KGJ2LCBMKTsKK30KKworLyogQXBwZW5kIEdQUlMgaW5kaWNhdG9yIHRvIGJpdHZlYyAqLworc3RhdGljIHZvaWQgYXBwZW5kX2dwcnNfaW5kKHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJICAgIGNvbnN0IHN0cnVjdCBnc200OF9zaTNfZ3Byc19pbmQgKmdpKQoreworCWlmIChnaS0+cHJlc2VudCkgeworCQliaXR2ZWNfc2V0X2JpdChidiwgSCk7CisJCWJpdHZlY19zZXRfdWludChidiwgZ2ktPnJhX2NvbG91ciwgMyk7CisJCS8qIDAgPT0gU0kxMyBpbiBCQ0NIIE5vcm0sIDEgPT0gU0kxMyBzZW50IG9uIEJDQ0ggRXh0ICovCisJCWJpdHZlY19zZXRfYml0KGJ2LCBnaS0+c2kxM19wb3NpdGlvbik7CisJfSBlbHNlCisJCWJpdHZlY19zZXRfYml0KGJ2LCBMKTsKK30KKworCisvKiBHZW5lcmF0ZSBTSTMgUmVzdCBPY3Rlc3RzIChDaGFwdGVyIDEwLjUuMi4zNCAvIFRhYmxlIDEwLjQuNzIpICovCitpbnQgcmVzdF9vY3RldHNfc2kzKHVfaW50OF90ICpkYXRhLCBjb25zdCBzdHJ1Y3QgZ3NtNDhfc2lfcm9faW5mbyAqc2kzKQoreworCXN0cnVjdCBiaXR2ZWMgYnY7CisKKwltZW1zZXQoJmJ2LCAwLCBzaXplb2YoYnYpKTsKKwlidi5kYXRhID0gZGF0YTsKKwlidi5kYXRhX2xlbiA9IDQ7CisKKwkvKiBPcHRpb25hbCBTZWxlY3Rpb24gUGFyYW1ldGVycyAqLworCWFwcGVuZF9zZWxlY3Rpb25fcGFyYW1zKCZidiwgJnNpMy0+c2VsZWN0aW9uX3BhcmFtcyk7CisKKwkvKiBPcHRpb25hbCBQb3dlciBPZmZzZXQgKi8KKwlhcHBlbmRfcG93ZXJfb2Zmc2V0KCZidiwgJnNpMy0+cG93ZXJfb2Zmc2V0KTsKKworCS8qIERvIHdlIGhhdmUgYSBTSTJ0ZXIgb24gdGhlIEJDQ0g/ICovCisJaWYgKHNpMy0+c2kydGVyX2luZGljYXRvcikKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwllbHNlCisJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisKKwkvKiBFYXJseSBDbGFzc21hcmsgU2VuZGluZyBDb250cm9sICovCisJaWYgKHNpMy0+ZWFybHlfY21fY3RybCkKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwllbHNlCisJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisKKwkvKiBEbyB3ZSBoYXZlIGEgU0kgVHlwZSA5IG9uIHRoZSBCQ0NIPyAqLworCWlmIChzaTMtPnNjaGVkdWxpbmcucHJlc2VudCkgeworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTMtPnNjaGVkdWxpbmcud2hlcmUsIDMpOworCX0gZWxzZQorCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCisJLyogR1BSUyBJbmRpY2F0b3IgKi8KKwlhcHBlbmRfZ3Byc19pbmQoJmJ2LCAmc2kzLT5ncHJzX2luZCk7CisKKwliaXR2ZWNfc3BhcmVfcGFkZGluZygmYnYsIChidi5kYXRhX2xlbio4KS0xKTsKKwlyZXR1cm4gYnYuZGF0YV9sZW47Cit9CisKK3N0YXRpYyBpbnQgYXBwZW5kX2xzYV9wYXJhbXMoc3RydWN0IGJpdHZlYyAqYnYsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBnc200OF9sc2FfcGFyYW1zICpsc2FfcGFyYW1zKQoreworCS8qIEZJWE1FICovCit9CisKKy8qIEdlbmVyYXRlIFNJNCBSZXN0IE9jdGV0cyAoQ2hhcHRlciAxMC41LjIuMzUpICovCitpbnQgcmVzdF9vY3RldHNfc2k0KHVfaW50OF90ICpkYXRhLCBjb25zdCBzdHJ1Y3QgZ3NtNDhfc2lfcm9faW5mbyAqc2k0KQoreworCXN0cnVjdCBiaXR2ZWMgYnY7CisKKwltZW1zZXQoJmJ2LCAwLCBzaXplb2YoYnYpKTsKKwlidi5kYXRhID0gZGF0YTsKKwlidi5kYXRhX2xlbiA9IDEwOyAvKiBGSVhNRTogdXAgdG8gPyAqLworCisJLyogU0k0IFJlc3QgT2N0ZXRzIE8gKi8KKwlhcHBlbmRfc2VsZWN0aW9uX3BhcmFtcygmYnYsICZzaTQtPnNlbGVjdGlvbl9wYXJhbXMpOworCWFwcGVuZF9wb3dlcl9vZmZzZXQoJmJ2LCAmc2k0LT5wb3dlcl9vZmZzZXQpOworCWFwcGVuZF9ncHJzX2luZCgmYnYsICZzaTQtPmdwcnNfaW5kKTsKKworCWlmICgwIC8qIEZJWE1FICovKSB7CisJCS8qIEggYW5kIFNJNCBSZXN0IE9jdGV0cyBTICovCisJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisKKwkJLyogTFNBIFBhcmFtZXRlcnMgKi8KKwkJaWYgKHNpNC0+bHNhX3BhcmFtcy5wcmVzZW50KSB7CisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCQkJYXBwZW5kX2xzYV9wYXJhbXMoJmJ2LCAmc2k0LT5sc2FfcGFyYW1zKTsKKwkJfSBlbHNlCisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCisJCS8qIENlbGwgSWRlbnRpdHkgKi8KKwkJaWYgKDEpIHsKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTQtPmNlbGxfaWQsIDE2KTsKKwkJfSBlbHNlCisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCisJCS8qIExTQSBJRCBJbmZvcm1hdGlvbiAqLworCQlpZiAoMCkgeworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwkJCS8qIEZJWE1FICovCisJCX0gZWxzZQorCQkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKwl9IGVsc2UgeworCQkvKiBMIGFuZCBicmVhayBpbmRpY2F0b3IgKi8KKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBzaTQtPmJyZWFrX2luZCA/IEggOiBMKTsKKwl9CisKKwlyZXR1cm4gYnYuZGF0YV9sZW47Cit9CisKKy8qIEdQUlMgTW9iaWxlIEFsbG9jYXRpb24gYXMgcGVyIFRTIDA0LjYwIENoYXB0ZXIgMTIuMTBhOgorICAgPCBHUFJTIE1vYmlsZSBBbGxvY2F0aW9uIElFID4gOjo9CisgICAgIDwgSFNOIDogYml0ICg2KSA+CisgICAgIHsgMCB8IDEgPCBSRkwgbnVtYmVyIGxpc3QgOiA8IFJGTCBudW1iZXIgbGlzdCBzdHJ1Y3QgPiA+IH0KKyAgICAgeyAwIDwgTUFfTEVOR1RIIDogYml0ICg2KSA+CisgICAgICAgICA8IE1BX0JJVE1BUDogYml0ICh2YWwoTUFfTEVOR1RIKSArIDEpID4KKyAgICAgfCAxIHsgMCB8IDEgPEFSRkNOIGluZGV4IGxpc3QgOiA8IEFSRkNOIGluZGV4IGxpc3Qgc3RydWN0ID4gPiB9IH0gOworCisgICAgIDwgUkZMIG51bWJlciBsaXN0IHN0cnVjdCA+IDo6ID0KKyAgICAgICA8IFJGTF9OVU1CRVIgOiBiaXQgKDQpID4KKyAgICAgICB7IDAgfCAxIDwgUkZMIG51bWJlciBsaXN0IHN0cnVjdCA+IH0gOworICAgICA8IEFSRkNOIGluZGV4IGxpc3Qgc3RydWN0ID4gOjo9CisgICAgICAgPCBBUkZDTl9JTkRFWCA6IGJpdCg2KSA+CisgICAgICAgeyAwIHwgMSA8IEFSRkNOIGluZGV4IGxpc3Qgc3RydWN0ID4gfSA7CisgKi8KK3N0YXRpYyBpbnQgYXBwZW5kX2dwcnNfbW9iaWxlX2FsbG9jKHN0cnVjdCBiaXR2ZWMgKmJ2KQoreworCS8qIEhvcHBpbmcgU2VxdWVuY2UgTnVtYmVyICovCisJYml0dmVjX3NldF91aW50KGJ2LCAwLCA2KTsKKworCWlmICgwKSB7CisJCS8qIFdlIHdhbnQgdG8gdXNlIGEgUkZMIG51bWJlciBsaXN0ICovCisJCWJpdHZlY19zZXRfYml0KGJ2LCAxKTsKKwkJLyogRklYTUU6IFJGTCBudW1iZXIgbGlzdCAqLworCX0gZWxzZQorCQliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisKKwlpZiAoMCkgeworCQkvKiBXZSB3YW50IHRvIHVzZSBhIE1BX0JJVE1BUCAqLworCQliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisJCS8qIEZJWE1FOiBNQV9MRU5HVEgsIE1BX0JJVE1BUCwgLi4uICovCisJfSBlbHNlIHsKKwkJYml0dmVjX3NldF9iaXQoYnYsIDEpOworCQlpZiAoMCkgeworCQkJLyogV2Ugd2FudCB0byBwcm92aWRlIGFuIEFSRkNOIGluZGV4IGxpc3QgKi8KKwkJCWJpdHZlY19zZXRfYml0KGJ2LCAxKTsKKwkJCS8qIEZJWE1FICovCisJCX0gZWxzZQorCQkJYml0dmVjX3NldF9iaXQoYnYsIDApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfdDMxOTIodW5zaWduZWQgaW50IHQzMTkyKQoreworCWlmICh0MzE5MiA9PSAwKQorCQlyZXR1cm4gMzsKKwllbHNlIGlmICh0MzE5MiA8PSA4MCkKKwkJcmV0dXJuIDQ7CisJZWxzZSBpZiAodDMxOTIgPD0gMTIwKQorCQlyZXR1cm4gNTsKKwllbHNlIGlmICh0MzE5MiA8PSAxNjApCisJCXJldHVybiA2OworCWVsc2UgaWYgKHQzMTkyIDw9IDIwMCkKKwkJcmV0dXJuIDc7CisJZWxzZSBpZiAodDMxOTIgPD0gNTAwKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmICh0MzE5MiA8PSAxMDAwKQorCQlyZXR1cm4gMTsKKwllbHNlIGlmICh0MzE5MiA8PSAxNTAwKQorCQlyZXR1cm4gMjsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGVuY29kZV9kcnhfdGltZXIodW5zaWduZWQgaW50IGRyeCkKK3sKKwlpZiAoZHJ4ID09IDApCisJCXJldHVybiAwOworCWVsc2UgaWYgKGRyeCA9PSAxKQorCQlyZXR1cm4gMTsKKwllbHNlIGlmIChkcnggPT0gMikKKwkJcmV0dXJuIDI7CisJZWxzZSBpZiAoZHJ4IDw9IDQpCisJCXJldHVybiAzOworCWVsc2UgaWYgKGRyeCA8PSA4KQorCQlyZXR1cm4gNDsKKwllbHNlIGlmIChkcnggPD0gMTYpCisJCXJldHVybiA1OworCWVsc2UgaWYgKGRyeCA8PSAzMikKKwkJcmV0dXJuIDY7CisJZWxzZSBpZiAoZHJ4IDw9IDY0KQorCQlyZXR1cm4gNzsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCisvKiBHUFJTIENlbGwgT3B0aW9ucyBhcyBwZXIgVFMgMDQuNjAgQ2hhcHRlciAxMi4yNAorCTwgR1BSUyBDZWxsIE9wdGlvbnMgSUUgPiA6Oj0KKwkJPCBOTU8gOiBiaXQoMikgPgorCQk8IFQzMTY4IDogYml0KDMpID4KKwkJPCBUMzE5MiA6IGJpdCgzKSA+CisJCTwgRFJYX1RJTUVSX01BWDogYml0KDMpID4KKwkJPCBBQ0NFU1NfQlVSU1RfVFlQRTogYml0ID4KKwkJPCBDT05UUk9MX0FDS19UWVBFIDogYml0ID4KKwkJPCBCU19DVl9NQVg6IGJpdCg0KSA+CisJCXsgMCB8IDEgPCBQQU5fREVDIDogYml0KDMpID4KKwkJCTwgUEFOX0lOQyA6IGJpdCgzKSA+CisJCQk8IFBBTl9NQVggOiBiaXQoMykgPgorCQl7IDAgfCAxIDwgRXh0ZW5zaW9uIExlbmd0aCA6IGJpdCg2KSA+CisJCQk8IGJpdCAodmFsKEV4dGVuc2lvbiBMZW5ndGgpICsgMQorCQkJJiB7IDwgRXh0ZW5zaW9uIEluZm9ybWF0aW9uID4gISB7IGJpdCAqKiA9IDxubyBzdHJpbmc+IH0gfSA7CisJPCBFeHRlbnNpb24gSW5mb3JtYXRpb24gPiA6Oj0KKwkJeyAwIHwgMSA8IEVHUFJTX1BBQ0tFVF9DSEFOTkVMX1JFUVVFU1QgOiBiaXQgPgorCQkJPCBCRVBfUEVSSU9EIDogYml0KDQpID4gfQorCQk8IFBGQ19GRUFUVVJFX01PREUgOiBiaXQgPgorCQk8IERUTV9TVVBQT1JUIDogYml0ID4KKwkJPEJTU19QQUdJTkdfQ09PUkRJTkFUSU9OOiBiaXQgPgorCQk8c3BhcmUgYml0ID4gKiogOworICovCitzdGF0aWMgaW50IGFwcGVuZF9ncHJzX2NlbGxfb3B0KHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJCWNvbnN0IHN0cnVjdCBncHJzX2NlbGxfb3B0aW9ucyAqZ2NvKQoreworCWludCB0MzE5MiwgZHJ4X3RpbWVyX21heDsKKworCXQzMTkyID0gZW5jb2RlX3QzMTkyKGdjby0+dDMxOTIpOworCWlmICh0MzE5MiA8IDApCisJCXJldHVybiB0MzE5MjsKKworCWRyeF90aW1lcl9tYXggPSBlbmNvZGVfZHJ4X3RpbWVyKGdjby0+ZHJ4X3RpbWVyX21heCk7CisJaWYgKGRyeF90aW1lcl9tYXggPCAwKQorCQlyZXR1cm4gZHJ4X3RpbWVyX21heDsKKworCWJpdHZlY19zZXRfdWludChidiwgZ2NvLT5ubW8sIDIpOworCWJpdHZlY19zZXRfdWludChidiwgZ2NvLT50MzE2OCAvIDUwMCwgMyk7CisJYml0dmVjX3NldF91aW50KGJ2LCB0MzE5MiwgMyk7CisJYml0dmVjX3NldF91aW50KGJ2LCBkcnhfdGltZXJfbWF4LCAzKTsKKwkvKiBBQ0NFU1NfQlVSU1RfVFlQRTogSGFyZC1jb2RlIDhiaXQgKi8KKwliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisJLyogQ09OVFJPTF9BQ0tfVFlQRTogSGFyZC1jb2RlIHRvIFJMQy9NQUMgY29udHJvbCBibG9jayAqLworCWJpdHZlY19zZXRfYml0KGJ2LCAxKTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIGdjby0+YnNfY3ZfbWF4LCA0KTsKKworCS8qIGhhcmQtY29kZSBubyBQQU5fe0RFQyxJTkMsTUFYfSAqLworCWJpdHZlY19zZXRfYml0KGJ2LCAwKTsKKworCS8qIG5vIGV4dGVuc2lvbiBpbmZvcm1hdGlvbiAoRURHRSkgKi8KKwliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXBwZW5kX2dwcnNfcHdyX2N0cmxfcGFycyhzdHJ1Y3QgYml0dmVjICpidiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgZ3Byc19wb3dlcl9jdHJsX3BhcnMgKnBjcCkKK3sKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIHBjcC0+YWxwaGEsIDQpOworCWJpdHZlY19zZXRfdWludChidiwgcGNwLT50X2F2Z193LCA1KTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIHBjcC0+dF9hdmdfdCwgNSk7CisJYml0dmVjX3NldF91aW50KGJ2LCBwY3AtPnBjX21lYXNfY2hhbiwgMSk7CisJYml0dmVjX3NldF91aW50KGJ2LCBwY3AtPm5fYXZnX2ksIDQpOworfQorCisvKiBHZW5lcmF0ZSBTSTEzIFJlc3QgT2N0ZXN0cyAoQ2hhcHRlciAxMC41LjIuMzdiKSAqLworaW50IHJlc3Rfb2N0ZXRzX3NpMTModV9pbnQ4X3QgKmRhdGEsIGNvbnN0IHN0cnVjdCBnc200OF9zaTEzX2luZm8gKnNpMTMpCit7CisJc3RydWN0IGJpdHZlYyBidjsKKworCW1lbXNldCgmYnYsIDAsIHNpemVvZihidikpOworCWJ2LmRhdGEgPSBkYXRhOworCWJ2LmRhdGFfbGVuID0gMjA7CisKKwlpZiAoMCkgeworCQkvKiBObyByZXN0IG9jdGV0cyAqLworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCX0gZWxzZSB7CisJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPmJjY2hfY2hhbmdlX21hcmssIDMpOworCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5zaV9jaGFuZ2VfZmllbGQsIDQpOworCQlpZiAoMSkgeworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAwKTsKKwkJfSBlbHNlIHsKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgMSk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5iY2NoX2NoYW5nZV9tYXJrLCAyKTsKKwkJCWFwcGVuZF9ncHJzX21vYmlsZV9hbGxvYygmYnYpOworCQl9CisJCWlmICghc2kxMy0+cGJjY2hfcHJlc2VudCkgeworCQkJLyogUEJDQ0ggbm90IHByZXNlbnQgaW4gY2VsbCAqLworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAwKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPm5vX3BiY2NoLnJhYywgOCk7CisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIHNpMTMtPm5vX3BiY2NoLnNwZ2NfY2NjaF9zdXApOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+bm9fcGJjY2gucHJpb19hY2NfdGhyLCAzKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPm5vX3BiY2NoLm5ldF9jdHJsX29yZCwgMik7CisJCQlhcHBlbmRfZ3Byc19jZWxsX29wdCgmYnYsICZzaTEzLT5jZWxsX29wdHMpOworCQkJYXBwZW5kX2dwcnNfcHdyX2N0cmxfcGFycygmYnYsICZzaTEzLT5wd3JfY3RybF9wYXJzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFBCQ0NIIHByZXNlbnQgaW4gY2VsbCAqLworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAxKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPnBiY2NoLnBzaTFfcmVwX3BlciwgNCk7CisJCQkvKiBQQkNDSCBEZXNjcmlwaXRvbiAqLworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+cGJjY2gucGIsIDQpOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+cGJjY2gudHNjLCAzKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPnBiY2NoLnRuLCAzKTsKKwkJCXN3aXRjaCAoc2kxMy0+cGJjY2guY2Fycmllcl90eXBlKSB7CisJCQljYXNlIFBCQ0NIX0JDQ0g6CisJCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAwKTsKKwkJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDApOworCQkJCWJyZWFrOworCQkJY2FzZSBQQkNDSF9BUkZDTjoKKwkJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDApOworCQkJCWJpdHZlY19zZXRfYml0KCZidiwgMSk7CisJCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+cGJjY2guYXJmY24sIDEwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUEJDQ0hfTUFJTzoKKwkJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDEpOworCQkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPnBiY2NoLm1haW8sIDYpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWJpdHZlY19zcGFyZV9wYWRkaW5nKCZidiwgKGJ2LmRhdGFfbGVuKjgpLTEpOworCXJldHVybiBidi5kYXRhX2xlbjsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3JybHAuYyBiL29wZW5ic2Mvc3JjL3JybHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTA0NDUxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvcnJscC5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiBSYWRpbyBSZXNvdXJjZSBMQ1MgKExvY2F0aW9uKSBQcm90b2NvbCwgR01TIFRTIDA0LjMxICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKworLyogUlJMUCBtc1Bvc2l0aW9uUmVxLCBuc0Jhc2VkLAorICoJQWNjdXJhY3k9NjAsIE1ldGhvZD1ncHMsIFJlc3BvbnNlVGltZT0yLCBvbmVTZXQgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBtc19iYXNlZF9wb3NfcmVxW10gPSB7IDB4NDAsIDB4MDEsIDB4NzgsIDB4YTggfTsKKworLyogUlJMUCBtc1Bvc2l0aW9uUmVxLCBtc0Jhc2VkUHJlZiwKKwlBY2N1cmFjeT02MCwgTWV0aG9kPWdwc09yRU9URCwgUmVzcG9uc2VUaW1lPTUsIG11bHRpcGxlU2V0cyAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IG1zX3ByZWZfcG9zX3JlcVtdICA9IHsgMHg0MCwgMHgwMiwgMHg3OSwgMHg1MCB9OworCisvKiBSUkxQIG1zUG9zaXRpb25SZXEsIG1zQXNzaXN0ZWRQcmVmLAorCUFjY3VyYWN5PTYwLCBNZXRob2Q9Z3BzT3JFT1RELCBSZXNwb25zZVRpbWU9NSwgbXVsdGlwbGVTZXRzICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYXNzX3ByZWZfcG9zX3JlcVtdID0geyAweDQwLCAweDAzLCAweDc5LCAweDUwIH07CisKK3N0YXRpYyBpbnQgc2VuZF9ycmxwX3JlcShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisJY29uc3QgdV9pbnQ4X3QgKnJlcTsKKworCXN3aXRjaCAobmV0LT5ycmxwLm1vZGUpIHsKKwljYXNlIFJSTFBfTU9ERV9NU19CQVNFRDoKKwkJcmVxID0gbXNfYmFzZWRfcG9zX3JlcTsKKwkJYnJlYWs7CisJY2FzZSBSUkxQX01PREVfTVNfUFJFRjoKKwkJcmVxID0gbXNfcHJlZl9wb3NfcmVxOworCQlicmVhazsKKwljYXNlIFJSTFBfTU9ERV9BU1NfUFJFRjoKKwkJcmVxID0gYXNzX3ByZWZfcG9zX3JlcTsKKwkJYnJlYWs7CisJY2FzZSBSUkxQX01PREVfTk9ORToKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gZ3NtNDhfc2VuZF9ycl9hcHBfaW5mbyhsY2hhbiwgMHgwMCwKKwkJCQkgICAgICBzaXplb2YobXNfYmFzZWRfcG9zX3JlcSksIHJlcSk7Cit9CisKK3N0YXRpYyBpbnQgc3Vic2NyX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19TVUJTQ1JfQVRUQUNIRUQ6CisJCS8qIEEgc3Vic2NyaWJlciBoYXMgYXR0YWNoZWQuICovCisJCXN1YnNjciA9IHNpZ25hbF9kYXRhOworCQlsY2hhbiA9IGxjaGFuX2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKwkJaWYgKCFsY2hhbikKKwkJCWJyZWFrOworCQlzZW5kX3JybHBfcmVxKGxjaGFuKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhZ2luZ19zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCSB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBwYWdpbmdfc2lnbmFsX2RhdGEgKnBzaWdfZGF0YSA9IHNpZ25hbF9kYXRhOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNfUEFHSU5HX1NVQ0NFRURFRDoKKwkJLyogQSBzdWJzY3JpYmVyIGhhcyBhdHRhY2hlZC4gKi8KKwkJc2VuZF9ycmxwX3JlcShwc2lnX2RhdGEtPmxjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBTX1BBR0lOR19FWFBJUkVEOgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb25fZHNvX2xvYWRfcnJscCh2b2lkKQoreworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1NVQlNDUiwgc3Vic2NyX3NpZ19jYiwgTlVMTCk7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfUEFHSU5HLCBwYWdpbmdfc2lnX2NiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3JzMjMyLmMgYi9vcGVuYnNjL3NyYy9yczIzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YWY1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9yczIzMi5jCkBAIC0wLDAgKzEsMjQ5IEBACisvKiBPcGVuQlNDIEJTLTExIFQtTGluayBpbnRlcmZhY2UgdXNpbmcgUE9TSVggc2VyaWFsIHBvcnQgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9yczIzMi5oPgorCisvKiBhZGFwdGlvbiBsYXllciBmcm9tIEdTTSAwOC41OSArIDEyLjIxIHRvIFJTMjMyICovCisKK3N0cnVjdCBzZXJpYWxfaGFuZGxlIHsKKwlzdHJ1Y3QgYnNjX2ZkIGZkOworCXN0cnVjdCBsbGlzdF9oZWFkIHR4X3F1ZXVlOworCisJc3RydWN0IG1zZ2IgKnJ4X21zZzsKKwl1bnNpZ25lZCBpbnQgcnhtc2dfYnl0ZXNfbWlzc2luZzsKKworCXVuc2lnbmVkIGludCBkZWxheV9tczsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworfTsKKworLyogRklYTUU6IHRoaXMgbmVlZHMgdG8gZ28gKi8KK3N0YXRpYyBzdHJ1Y3Qgc2VyaWFsX2hhbmRsZSBfc2VyX2hhbmRsZSwgKnNlcl9oYW5kbGUgPSAmX3Nlcl9oYW5kbGU7CisKKyNkZWZpbmUgTEFQRF9IRFJfTEVOCTEwCisKK3N0YXRpYyBpbnQgaGFuZGxlX3Nlcl93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpOworCisvKiBjYWxsYmFjayBmcm9tIGFiaXNfbm0gKi8KK2ludCBfYWJpc19ubV9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IHNlcmlhbF9oYW5kbGUgKnNoID0gc2VyX2hhbmRsZTsKKwl1X2ludDhfdCAqbGFwZDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJbXNnLT5sMmggPSBtc2ctPmRhdGE7CisKKwkvKiBwcmVwZW5kIExBUEQgaGVhZGVyICovCisJbGFwZCA9IG1zZ2JfcHVzaChtc2csIExBUERfSERSX0xFTik7CisKKwlsZW4gPSBtc2ctPmxlbiAtIDI7CisKKwlsYXBkWzBdID0gKGxlbiA+PiA4KSAmIDB4ZmY7CisJbGFwZFsxXSA9IGxlbiAmIDB4ZmY7IC8qIGxlbmd0aCBvZiBieXRlcyBzdGFydGlnbiBhdCBsYXBkWzJdICovCisJbGFwZFsyXSA9IDB4MDA7CisJbGFwZFszXSA9IDB4MDc7CisJbGFwZFs0XSA9IDB4MDE7CisJbGFwZFs1XSA9IDB4M2U7CisJbGFwZFs2XSA9IDB4MDA7CisJbGFwZFs3XSA9IDB4MDA7CisJbGFwZFs4XSA9IG1zZy0+bGVuIC0gMTA7IC8qIGxlbmd0aCBvZiBieXRlcyBzdGFydGluZyBhdCBsYXBkWzEwXSAqLworCWxhcGRbOV0gPSBsYXBkWzhdIF4gMHgzODsKKworCW1zZ2JfZW5xdWV1ZSgmc2gtPnR4X3F1ZXVlLCBtc2cpOworCXNoLT5mZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKworCS8qIHdlIHRyeSB0byBpbW1lZGlhdGVseSBzZW5kICovCisJaGFuZGxlX3Nlcl93cml0ZSgmc2gtPmZkKTsKKworCXJldHVybiAwOworfQorCisvKiBzZWxlY3QuYyBjYWxsYmFjayBpbiBjYXNlIHdlIGNhbiB3cml0ZSB0byB0aGUgUlMyMzIgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3Nlcl93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IHNlcmlhbF9oYW5kbGUgKnNoID0gYmZkLT5kYXRhOworCXN0cnVjdCBtc2diICptc2c7CisJaW50IHdyaXR0ZW47CisKKwltc2cgPSBtc2diX2RlcXVldWUoJnNoLT50eF9xdWV1ZSk7CisJaWYgKCFtc2cpIHsKKwkJYmZkLT53aGVuICY9IH5CU0NfRkRfV1JJVEU7CisJCXJldHVybiAwOworCX0KKworCURFQlVHUChETUksICJSUzIzMiBUWDogJXNcbiIsIGhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCisJLyogc2VuZCBvdmVyIHNlcmlhbCBsaW5lICovCisJd3JpdHRlbiA9IHdyaXRlKGJmZC0+ZmQsIG1zZy0+ZGF0YSwgbXNnLT5sZW4pOworCWlmICh3cml0dGVuIDwgbXNnLT5sZW4pIHsKKwkJcGVycm9yKCJzaG9ydCB3cml0ZToiKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtMTsKKwl9CisKKwltc2diX2ZyZWUobXNnKTsKKwl1c2xlZXAoc2gtPmRlbGF5X21zKjEwMDApOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU0VSSUFMX0FMTE9DX1NJWkUJMzAwCisKKy8qIHNlbGVjdC5jIGNhbGxiYWNrIGluIGNhc2Ugd2UgY2FuIHJlYWQgZnJvbSB0aGUgUlMyMzIgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3Nlcl9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3Qgc2VyaWFsX2hhbmRsZSAqc2ggPSBiZmQtPmRhdGE7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFzaC0+cnhfbXNnKSB7CisJCXNoLT5yeF9tc2cgPSBtc2diX2FsbG9jKFNFUklBTF9BTExPQ19TSVpFLCAiUlMyMzIgUngiKTsKKwkJc2gtPnJ4X21zZy0+bDJoID0gTlVMTDsKKwkJc2gtPnJ4X21zZy0+dHJ4ID0gc2gtPmJ0cy0+YzA7CisJfQorCW1zZyA9IHNoLT5yeF9tc2c7CisKKwkvKiBmaXJzdCByZWFkIHR3byBieWVzIHRvIG9idGFpbiBsZW5ndGggKi8KKwlpZiAobXNnLT5sZW4gPCAyKSB7CisJCXJjID0gcmVhZChzaC0+ZmQuZmQsIG1zZy0+dGFpbCwgMiAtIG1zZy0+bGVuKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcGVycm9yKCJFUlJPUiByZWFkaW5nIGZyb20gc2VyaWFsIHBvcnQiKTsKKwkJCW1zZ2JfZnJlZShtc2cpOworCQkJcmV0dXJuIHJjOworCQl9CisJCW1zZ2JfcHV0KG1zZywgcmMpOworCisJCWlmIChtc2ctPmxlbiA+PSAyKSB7CisJCQkvKiBwYXJzZSBMQVBEIHBheWxvYWQgbGVuZ3RoICovCisJCQlpZiAobXNnLT5kYXRhWzBdICE9IDApCisJCQkJZnByaW50ZihzdGRlcnIsICJTdXNwaWNpb3VzIGhlYWRlciBieXRlIDA6IDB4JTAyeFxuIiwKKwkJCQkJbXNnLT5kYXRhWzBdKTsKKworCQkJc2gtPnJ4bXNnX2J5dGVzX21pc3NpbmcgPSBtc2ctPmRhdGFbMF0gPDwgODsKKwkJCXNoLT5yeG1zZ19ieXRlc19taXNzaW5nICs9IG1zZy0+ZGF0YVsxXTsKKworCQkJaWYgKHNoLT5yeG1zZ19ieXRlc19taXNzaW5nIDwgTEFQRF9IRFJfTEVOIC0yKQorCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBsZW5ndGggaW4gaGRyOiAldVxuIiwKKwkJCQkJc2gtPnJ4bXNnX2J5dGVzX21pc3NpbmcpOworCQl9CisJfSBlbHNlIHsgCisJCS8qIHRyeSB0byByZWFkIGFzIG1hbnkgb2YgdGhlIG1pc3NpbmcgYnl0ZXMgYXMgYXJlIGF2YWlsYWJsZSAqLworCQlyYyA9IHJlYWQoc2gtPmZkLmZkLCBtc2ctPnRhaWwsIHNoLT5yeG1zZ19ieXRlc19taXNzaW5nKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcGVycm9yKCJFUlJPUiByZWFkaW5nIGZyb20gc2VyaWFsIHBvcnQiKTsKKwkJCW1zZ2JfZnJlZShtc2cpOworCQkJcmV0dXJuIHJjOworCQl9CisJCW1zZ2JfcHV0KG1zZywgcmMpOworCQlzaC0+cnhtc2dfYnl0ZXNfbWlzc2luZyAtPSByYzsKKworCQlpZiAoc2gtPnJ4bXNnX2J5dGVzX21pc3NpbmcgPT0gMCkgeworCQkJLyogd2UgaGF2ZSBvbmUgY29tcGxldGUgbWVzc2FnZSBub3cgKi8KKwkJCXNoLT5yeF9tc2cgPSBOVUxMOworCisJCQlpZiAobXNnLT5sZW4gPiBMQVBEX0hEUl9MRU4pCisJCQkJbXNnLT5sMmggPSBtc2ctPmRhdGEgKyBMQVBEX0hEUl9MRU47CisKKwkJCURFQlVHUChETUksICJSUzIzMiBSWDogJXNcbiIsIGhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCQkJcmMgPSBoYW5kbGVfc2VyaWFsX21zZyhtc2cpOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBzZWxlY3QuYyBjYWxsYmFjayAqLworc3RhdGljIGludCBzZXJpYWxfZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKHdoYXQgJiBCU0NfRkRfUkVBRCkKKwkJcmMgPSBoYW5kbGVfc2VyX3JlYWQoYmZkKTsKKworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCWlmICh3aGF0ICYgQlNDX0ZEX1dSSVRFKQorCQlyYyA9IGhhbmRsZV9zZXJfd3JpdGUoYmZkKTsKKworCXJldHVybiByYzsKK30KKworaW50IHJzMjMyX3NldHVwKGNvbnN0IGNoYXIgKnNlcmlhbF9wb3J0LCB1bnNpZ25lZCBpbnQgZGVsYXlfbXMsCisJCXN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaW50IHJjLCBzZXJpYWxfZmQ7CisJc3RydWN0IHRlcm1pb3MgdGlvOworCisJc2VyaWFsX2ZkID0gb3BlbihzZXJpYWxfcG9ydCwgT19SRFdSKTsKKwlpZiAoc2VyaWFsX2ZkIDwgMCkgeworCQlwZXJyb3IoImNhbm5vdCBvcGVuIHNlcmlhbCBwb3J0OiIpOworCQlyZXR1cm4gc2VyaWFsX2ZkOworCX0KKworCS8qIHNldCBiYXVkcmF0ZSAqLworCXJjID0gdGNnZXRhdHRyKHNlcmlhbF9mZCwgJnRpbyk7CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoInRjZ2V0YXR0cigpIik7CisJCXJldHVybiByYzsKKwl9CisJY2ZzZXRpc3BlZWQoJnRpbywgQjE5MjAwKTsKKwljZnNldG9zcGVlZCgmdGlvLCBCMTkyMDApOworCXRpby5jX2NmbGFnIHw9ICAoQ1JFQUQgfCBDTE9DQUwgfCBDUzgpOworCXRpby5jX2NmbGFnICY9IH4oUEFSRU5CIHwgQ1NUT1BCIHwgQ1NJWkUgfCBDUlRTQ1RTKTsKKwl0aW8uY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8gfCBFQ0hPRSB8IElTSUcpOworCXRpby5jX2lmbGFnIHw9ICAoSU5QQ0sgfCBJU1RSSVApOworCXRpby5jX2lmbGFnICY9IH4oSVNUUklQIHwgSVhPTiB8IElYT0ZGIHwgSUdOQlJLIHwgSU5MQ1IgfCBJQ1JOTCB8IElHTkNSKTsKKwl0aW8uY19vZmxhZyAmPSB+KE9QT1NUKTsKKwlyYyA9IHRjc2V0YXR0cihzZXJpYWxfZmQsIFRDU0FEUkFJTiwgJnRpbyk7CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoInRjc2V0YXR0cigpIik7CisJCXJldHVybiByYzsKKwl9CisKKwlJTklUX0xMSVNUX0hFQUQoJnNlcl9oYW5kbGUtPnR4X3F1ZXVlKTsKKwlzZXJfaGFuZGxlLT5mZC5mZCA9IHNlcmlhbF9mZDsKKwlzZXJfaGFuZGxlLT5mZC53aGVuID0gQlNDX0ZEX1JFQUQ7CisJc2VyX2hhbmRsZS0+ZmQuY2IgPSBzZXJpYWxfZmRfY2I7CisJc2VyX2hhbmRsZS0+ZmQuZGF0YSA9IHNlcl9oYW5kbGU7CisJc2VyX2hhbmRsZS0+ZGVsYXlfbXMgPSBkZWxheV9tczsKKwlzZXJfaGFuZGxlLT5idHMgPSBidHM7CisJcmMgPSBic2NfcmVnaXN0ZXJfZmQoJnNlcl9oYW5kbGUtPmZkKTsKKwlpZiAocmMgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IHJlZ2lzdGVyIEZEOiAlc1xuIiwKKwkJCXN0cmVycm9yKHJjKSk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3J0cF9wcm94eS5jIGIvb3BlbmJzYy9zcmMvcnRwX3Byb3h5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYyZTJmZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3J0cF9wcm94eS5jCkBAIC0wLDAgKzEsNzI0IEBACisvKiBSVFAgcHJveHkgaGFuZGxpbmcgZm9yIGlwLmFjY2VzcyBuYW5vQlRTICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPiAgICAvKiBnZXR0aW1lb2ZkYXkoKSAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPiAgICAgIC8qIGdldC4uKCkgKi8KKyNpbmNsdWRlIDx0aW1lLmg+ICAgICAgICAvKiBjbG9jaygpICovCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4gLyogdW5hbWUoKSAqLworCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ydHBfcHJveHkuaD4KKworc3RhdGljIExMSVNUX0hFQUQocnRwX3NvY2tldHMpOworCisvKiBzaG91bGQgd2UgbWFuZ2xlIHRoZSBDTkFNRSBpbnNpZGUgU0RFUyBvZiBSVENQIHBhY2tldHM/IFdlIGRpc2FibGUKKyAqIHRoaXMgYnkgZGVmYXVsdCwgYXMgaXQgc2VlbXMgdG8gYmUgbm90IG5lZWRlZCAqLworc3RhdGljIGludCBtYW5nbGVfcnRjcF9jbmFtZSA9IDA7CisKK2VudW0gcnRwX2JmZF9wcml2IHsKKwlSVFBfUFJJVl9OT05FLAorCVJUUF9QUklWX1JUUCwKKwlSVFBfUFJJVl9SVENQCit9OworCisjZGVmaW5lIFJUUF9BTExPQ19TSVpFCTE1MDAKKworLyogYWNjb3JkaW5nIHRvIFJGQyAxODg5ICovCitzdHJ1Y3QgcnRjcF9oZHIgeworCXVfaW50OF90IGJ5dGUwOworCXVfaW50OF90IHR5cGU7CisJdV9pbnQxNl90IGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKyNkZWZpbmUgUlRDUF9UWVBFX1NERVMJMjAyCisJCisjZGVmaW5lIFJUQ1BfSUVfQ05BTUUJMQorCisvKiBhY2NvcmRpbmcgdG8gUkZDIDM1NTAgKi8KK3N0cnVjdCBydHBfaGRyIHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdV9pbnQ4X3QgIGNzcmNfY291bnQ6NCwKKwkJICBleHRlbnNpb246MSwKKwkJICBwYWRkaW5nOjEsCisJCSAgdmVyc2lvbjoyOworCXVfaW50OF90ICBwYXlsb2FkX3R5cGU6NywKKwkJICBtYXJrZXI6MTsKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKwl1X2ludDhfdCAgdmVyc2lvbjoyLAorCQkgIHBhZGRpbmc6MSwKKwkJICBleHRlbnNpb246MSwKKwkJICBjc3JjX2NvdW50OjQ7CisJdV9pbnQ4X3QgIG1hcmtlcjoxLAorCQkgIHBheWxvYWRfdHlwZTo3OworI2VuZGlmCisJdV9pbnQxNl90IHNlcXVlbmNlOworCXVfaW50MzJfdCB0aW1lc3RhbXA7CisJdV9pbnQzMl90IHNzcmM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcnRwX3hfaGRyIHsKKwl1X2ludDE2X3QgYnlfcHJvZmlsZTsKKwl1X2ludDE2X3QgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBSVFBfVkVSU0lPTgkyCisKKyNkZWZpbmUgUlRQX1BUX0dTTV9GVUxMCTMKKyNkZWZpbmUgUlRQX1BUX0dTTV9FRlIJOTcKKworLyogZGVjb2RlIGFuIHJ0cCBmcmFtZSBhbmQgY3JlYXRlIGEgbmV3IGJ1ZmZlciB3aXRoIHBheWxvYWQgKi8KK3N0YXRpYyBpbnQgcnRwX2RlY29kZShzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDMyX3QgY2FsbHJlZiwgc3RydWN0IG1zZ2IgKipkYXRhKQoreworCXN0cnVjdCBtc2diICpuZXdfbXNnOworCXN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWU7CisJc3RydWN0IHJ0cF9oZHIgKnJ0cGggPSAoc3RydWN0IHJ0cF9oZHIgKiltc2ctPmRhdGE7CisJc3RydWN0IHJ0cF94X2hkciAqcnRweGg7CisJdV9pbnQ4X3QgKnBheWxvYWQ7CisJaW50IHBheWxvYWRfbGVuOworCWludCBtc2dfdHlwZTsKKwlpbnQgeF9sZW47CisKKwlpZiAobXNnLT5sZW4gPCAxMikgeworCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnJhbWUgdG9vIHNob3J0IChsZW4gPSAlZClcbiIsCisJCQltc2ctPmxlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocnRwaC0+dmVyc2lvbiAhPSBSVFBfVkVSU0lPTikgeworCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgdmVyc2lvbiAlZCBub3Qgc3VwcG9ydGVkLlxuIiwKKwkJCXJ0cGgtPnZlcnNpb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcGF5bG9hZCA9IG1zZy0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgcnRwX2hkcikgKyAocnRwaC0+Y3NyY19jb3VudCA8PCAyKTsKKwlwYXlsb2FkX2xlbiA9IG1zZy0+bGVuIC0gc2l6ZW9mKHN0cnVjdCBydHBfaGRyKSAtIChydHBoLT5jc3JjX2NvdW50IDw8IDIpOworCWlmIChwYXlsb2FkX2xlbiA8IDApIHsKKwkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZyYW1lIHRvbyBzaG9ydCAobGVuID0gJWQsICIKKwkJCSJjc3JjIGNvdW50ID0gJWQpXG4iLCBtc2ctPmxlbiwgcnRwaC0+Y3NyY19jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocnRwaC0+ZXh0ZW5zaW9uKSB7CisJCWlmIChwYXlsb2FkX2xlbiA8IHNpemVvZihzdHJ1Y3QgcnRwX3hfaGRyKSkgeworCQkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZyYW1lIHRvbyBzaG9ydCBmb3IgIgorCQkJCSJleHRlbnNpb24gaGVhZGVyXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJ0cHhoID0gKHN0cnVjdCBydHBfeF9oZHIgKilwYXlsb2FkOworCQl4X2xlbiA9IG50b2hzKHJ0cHhoLT5sZW5ndGgpICogNCArIHNpemVvZihzdHJ1Y3QgcnRwX3hfaGRyKTsKKwkJcGF5bG9hZCArPSB4X2xlbjsKKwkJcGF5bG9hZF9sZW4gLT0geF9sZW47CisJCWlmIChwYXlsb2FkX2xlbiA8IDApIHsKKwkJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCBmcmFtZSB0b28gc2hvcnQsICIKKwkJCQkiZXh0ZW5zaW9uIGhlYWRlciBleGNlZWRzIGZyYW1lIGxlbmd0aFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlpZiAocnRwaC0+cGFkZGluZykgeworCQlpZiAocGF5bG9hZF9sZW4gPCAwKSB7CisJCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnJhbWUgdG9vIHNob3J0IGZvciAiCisJCQkJInBhZGRpbmcgbGVuZ3RoXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXBheWxvYWRfbGVuIC09IHBheWxvYWRbcGF5bG9hZF9sZW4gLSAxXTsKKwkJaWYgKHBheWxvYWRfbGVuIDwgMCkgeworCQkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZyYW1lIHdpdGggcGFkZGluZyAiCisJCQkJImdyZWF0ZXIgdGhhbiBwYXlsb2FkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJc3dpdGNoIChydHBoLT5wYXlsb2FkX3R5cGUpIHsKKwljYXNlIFJUUF9QVF9HU01fRlVMTDoKKwkJbXNnX3R5cGUgPSBHU01fVENIRl9GUkFNRTsKKwkJaWYgKHBheWxvYWRfbGVuICE9IDMzKSB7CisJCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnVsbCByYXRlIGZyYW1lIHdpdGggIgorCQkJCSJwYXlsb2FkIGxlbmd0aCAhPSAzMiAobGVuID0gJWQpXG4iLAorCQkJCXBheWxvYWRfbGVuKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgUlRQX1BUX0dTTV9FRlI6CisJCW1zZ190eXBlID0gR1NNX1RDSEZfRlJBTUVfRUZSOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnJhbWUgd2l0aCB1bmtub3duIHBheWxvYWQgIgorCQkJInR5cGUgJWRcbiIsIHJ0cGgtPnBheWxvYWRfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW5ld19tc2cgPSBtc2diX2FsbG9jKHNpemVvZihzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUpICsgcGF5bG9hZF9sZW4sCisJCQkJIkdTTS1EQVRBIik7CisJaWYgKCFuZXdfbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmcmFtZSA9IChzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKikobmV3X21zZy0+ZGF0YSk7CisJZnJhbWUtPm1zZ190eXBlID0gbXNnX3R5cGU7CisJZnJhbWUtPmNhbGxyZWYgPSBjYWxscmVmOworCW1lbWNweShmcmFtZS0+ZGF0YSwgcGF5bG9hZCwgcGF5bG9hZF9sZW4pOworCW1zZ2JfcHV0KG5ld19tc2csIHNpemVvZihzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUpICsgcGF5bG9hZF9sZW4pOworCisJKmRhdGEgPSBuZXdfbXNnOworCXJldHVybiAwOworfQorCisvKiAidG8gLSBmcm9tIiAqLworc3RhdGljIHZvaWQgdHZfZGlmZmVyZW5jZShzdHJ1Y3QgdGltZXZhbCAqZGlmZiwgY29uc3Qgc3RydWN0IHRpbWV2YWwgKmZyb20sCisJCQkgIGNvbnN0IHN0cnVjdCB0aW1ldmFsICpfX3RvKQoreworCXN0cnVjdCB0aW1ldmFsIF90byA9ICpfX3RvLCAqdG8gPSAmX3RvOworCisJaWYgKHRvLT50dl91c2VjIDwgZnJvbS0+dHZfdXNlYykgeworCQl0by0+dHZfc2VjIC09IDE7CisJCXRvLT50dl91c2VjICs9IDEwMDAwMDA7CisJfQorCisJZGlmZi0+dHZfdXNlYyA9IHRvLT50dl91c2VjIC0gZnJvbS0+dHZfdXNlYzsKKwlkaWZmLT50dl9zZWMgPSB0by0+dHZfc2VjIC0gZnJvbS0+dHZfc2VjOworfQorCisvKiBlbmNvZGUgYW5kIHNlbmQgYSBydHAgZnJhbWUgKi8KK2ludCBydHBfc2VuZF9mcmFtZShzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWUpCit7CisJc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MgPSAmcnMtPnJ0cDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXN0cnVjdCBydHBfaGRyICpydHBoOworCWludCBwYXlsb2FkX3R5cGU7CisJaW50IHBheWxvYWRfbGVuOworCWludCBkdXJhdGlvbjsgLyogaW4gc2FtcGxlcyAqLworCisJaWYgKHJzLT50eF9hY3Rpb24gIT0gUlRQX1NFTkRfRE9XTlNUUkVBTSkgeworCQkvKiBpbml0aWFsaXplIHNlcXVlbmNlcyAqLworCQlycy0+dHhfYWN0aW9uID0gUlRQX1NFTkRfRE9XTlNUUkVBTTsKKwkJcnMtPnRyYW5zbWl0LnNzcmMgPSByYW5kKCk7CisJCXJzLT50cmFuc21pdC5zZXF1ZW5jZSA9IHJhbmRvbSgpOworCQlycy0+dHJhbnNtaXQudGltZXN0YW1wID0gcmFuZG9tKCk7CisJfQorCisJc3dpdGNoIChmcmFtZS0+bXNnX3R5cGUpIHsKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FOgorCQlwYXlsb2FkX3R5cGUgPSBSVFBfUFRfR1NNX0ZVTEw7CisJCXBheWxvYWRfbGVuID0gMzM7CisJCWR1cmF0aW9uID0gMTYwOworCQlicmVhazsKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FX0VGUjoKKwkJcGF5bG9hZF90eXBlID0gUlRQX1BUX0dTTV9FRlI7CisJCXBheWxvYWRfbGVuID0gMzE7CisJCWR1cmF0aW9uID0gMTYwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1BDKERNVVgsICJ1bnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUgJWRcbiIsCisJCQlmcmFtZS0+bXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl7CisJCXN0cnVjdCB0aW1ldmFsIHR2LCB0dl9kaWZmOworCQlsb25nIGludCB1c2VjX2RpZmYsIGZyYW1lX2RpZmY7CisKKwkJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJCXR2X2RpZmZlcmVuY2UoJnR2X2RpZmYsICZycy0+dHJhbnNtaXQubGFzdF90diwgJnR2KTsKKwkJcnMtPnRyYW5zbWl0Lmxhc3RfdHYgPSB0djsKKworCQl1c2VjX2RpZmYgPSB0dl9kaWZmLnR2X3NlYyAqIDEwMDAwMDAgKyB0dl9kaWZmLnR2X3VzZWM7CisJCWZyYW1lX2RpZmYgPSAodXNlY19kaWZmIC8gMjAwMDApOworCisJCWlmIChhYnMoZnJhbWVfZGlmZikgPiAxKSB7CisJCQlsb25nIGludCBmcmFtZV9kaWZmX2V4Y2VzcyA9IGZyYW1lX2RpZmYgLSAxOworCisJCQlMT0dQKERNVVgsIExPR0xfTk9USUNFLAorCQkJCSJDb3JyZWN0aW5nIGZyYW1lIGRpZmZlcmVuY2Ugb2YgJWxkIGZyYW1lc1xuIiwgZnJhbWVfZGlmZl9leGNlc3MpOworCQkJcnMtPnRyYW5zbWl0LnNlcXVlbmNlICs9IGZyYW1lX2RpZmZfZXhjZXNzOworCQkJcnMtPnRyYW5zbWl0LnRpbWVzdGFtcCArPSBmcmFtZV9kaWZmX2V4Y2VzcyAqIGR1cmF0aW9uOworCQl9CisJfQorCisJbXNnID0gbXNnYl9hbGxvYyhzaXplb2Yoc3RydWN0IHJ0cF9oZHIpICsgcGF5bG9hZF9sZW4sICJSVFAtR1NNLUZVTEwiKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisJcnRwaCA9IChzdHJ1Y3QgcnRwX2hkciAqKW1zZy0+ZGF0YTsKKwlydHBoLT52ZXJzaW9uID0gUlRQX1ZFUlNJT047CisJcnRwaC0+cGFkZGluZyA9IDA7CisJcnRwaC0+ZXh0ZW5zaW9uID0gMDsKKwlydHBoLT5jc3JjX2NvdW50ID0gMDsKKwlydHBoLT5tYXJrZXIgPSAwOworCXJ0cGgtPnBheWxvYWRfdHlwZSA9IHBheWxvYWRfdHlwZTsKKwlydHBoLT5zZXF1ZW5jZSA9IGh0b25zKHJzLT50cmFuc21pdC5zZXF1ZW5jZSsrKTsKKwlydHBoLT50aW1lc3RhbXAgPSBodG9ubChycy0+dHJhbnNtaXQudGltZXN0YW1wKTsKKwlycy0+dHJhbnNtaXQudGltZXN0YW1wICs9IGR1cmF0aW9uOworCXJ0cGgtPnNzcmMgPSBodG9ubChycy0+dHJhbnNtaXQuc3NyYyk7CisJbWVtY3B5KG1zZy0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgcnRwX2hkciksIGZyYW1lLT5kYXRhLCBwYXlsb2FkX2xlbik7CisJbXNnYl9wdXQobXNnLCBzaXplb2Yoc3RydWN0IHJ0cF9oZHIpICsgcGF5bG9hZF9sZW4pOworCW1zZ2JfZW5xdWV1ZSgmcnNzLT50eF9xdWV1ZSwgbXNnKTsKKwlyc3MtPmJmZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKworCXJldHVybiAwOworfQorCisvKiBpdGVyYXRlIG92ZXIgYWxsIGNodW5rcyBpbiBvbmUgUlRDUCBtZXNzYWdlLCBsb29rIGZvciBDTkFNRSBJRXMgYW5kCisgKiByZXBsYWNlIGFsbCBvZiB0aG9zZSB3aXRoICduZXdfY25hbWUnICovCitzdGF0aWMgaW50IHJ0Y3Bfc2Rlc19jbmFtZV9tYW5nbGUoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IHJ0Y3BfaGRyICpyaCwKKwkJCQkgIHVfaW50MTZfdCAqcnRjcF9sZW4sIGNvbnN0IGNoYXIgKm5ld19jbmFtZSkKK3sKKwl1X2ludDhfdCAqcnRjcF9lbmQ7CisJdV9pbnQ4X3QgKmN1ciA9ICh1X2ludDhfdCAqKSByaDsKKwl1X2ludDhfdCB0YWcsIGxlbiA9IDA7CisKKwlydGNwX2VuZCA9IGN1ciArICpydGNwX2xlbjsKKwkvKiBtb3ZlIGN1ciB0byBlbmQgb2YgUlRQIGhlYWRlciAqLworCWN1ciArPSBzaXplb2YoKnJoKTsKKworCS8qIGl0ZXJhdGUgb3ZlciBDaHVua3MgKi8KKwl3aGlsZSAoY3VyKzQgPCBydGNwX2VuZCkgeworCQkvKiBza2lwIGZvdXIgYnl0ZXMgU1NSQy9DU1JDICovCisJCWN1ciArPSA0OworCQorCQkvKiBpdGVyYXRlIG92ZXIgSUUncyBpbnNpZGUgdGhlIGNodW5rICovCisJCXdoaWxlIChjdXIrMSA8IHJ0Y3BfZW5kKSB7CisJCQl0YWcgPSAqY3VyKys7CisJCQlpZiAodGFnID09IDApIHsKKwkJCQkvKiBlbmQgb2YgY2h1bmssIHNraXAgYWRkaXRpb25hbCB6ZXJvICovCisJCQkJd2hpbGUgKCpjdXIrKyA9PSAwKSB7IH0KKwkJCQlicmVhazsKKwkJCX0KKwkJCWxlbiA9ICpjdXIrKzsKKwkKKwkJCWlmICh0YWcgPT0gUlRDUF9JRV9DTkFNRSkgeworCQkJCS8qIHdlJ3ZlIGZvdW5kIHRoZSBDTkFNRSwgbGV0cyBtYW5nbGUgaXQgKi8KKwkJCQlpZiAobGVuIDwgc3RybGVuKG5ld19jbmFtZSkpIHsKKwkJCQkJLyogd2UgbmVlZCB0byBtYWtlIG1vcmUgc3BhY2UgKi8KKwkJCQkJaW50IGluY3JlYXNlID0gc3RybGVuKG5ld19jbmFtZSkgLSBsZW47CisKKwkJCQkJbXNnYl9wdXNoKG1zZywgaW5jcmVhc2UpOworCQkJCQltZW1tb3ZlKGN1citsZW4raW5jcmVhc2UsIGN1citsZW4sCisJCQkJCQlydGNwX2VuZCAtIChjdXIrbGVuKSk7CisJCQkJCS8qIEZJWE1FOiB3ZSBoYXZlIHRvIHJlc3BlY3QgUlRDUAorCQkJCQkgKiBwYWRkaW5nL2FsaWdubWVudCBydWxlcyEgKi8KKwkJCQkJbGVuICs9IGluY3JlYXNlOworCQkJCQkqKGN1ci0xKSArPSBpbmNyZWFzZTsKKwkJCQkJcnRjcF9lbmQgKz0gaW5jcmVhc2U7CisJCQkJCSpydGNwX2xlbiArPSBpbmNyZWFzZTsKKwkJCQl9CisJCQkJLyogY29weSBuZXcgQ05BTUUgaW50byBtZXNzYWdlICovCisJCQkJbWVtY3B5KGN1ciwgbmV3X2NuYW1lLCBzdHJsZW4obmV3X2NuYW1lKSk7CisJCQkJLyogRklYTUU6IHplcm8gdGhlIHBhZGRpbmcgaW4gY2FzZSBuZXcgQ05BTUUKKwkJCQkgKiBpcyBzbWFsbGVyIHRoYW4gb2xkIG9uZSAhISEgKi8KKwkJCX0KKwkJCWN1ciArPSBsZW47CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGNwX21hbmdsZShzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgcnRwX3NvY2tldCAqcnMpCit7CisJc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MgPSAmcnMtPnJ0Y3A7CisJc3RydWN0IHJ0Y3BfaGRyICpydHBoOworCXVfaW50MTZfdCBvbGRfbGVuOworCWludCByYzsKKworCWlmICghbWFuZ2xlX3J0Y3BfY25hbWUpCisJCXJldHVybiAwOworCisJcHJpbnRmKCJSVENQXG4iKTsKKwkvKiBpdGVyYXRlIG92ZXIgbGlzdCBvZiBSVENQIG1lc3NhZ2VzICovCisJcnRwaCA9IChzdHJ1Y3QgcnRjcF9oZHIgKiltc2ctPmRhdGE7CisJd2hpbGUgKCh2b2lkICopcnRwaCArIHNpemVvZigqcnRwaCkgPD0gKHZvaWQgKiltc2ctPmRhdGEgKyBtc2ctPmxlbikgeworCQlvbGRfbGVuID0gKG50b2hzKHJ0cGgtPmxlbmd0aCkgKyAxKSAqIDQ7CisJCWlmICgodm9pZCAqKXJ0cGggKyBvbGRfbGVuID4gKHZvaWQgKiltc2ctPmRhdGEgKyBtc2ctPmxlbikgeworCQkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRDUCBwYWNrZXQgdG9vIHNob3J0IGZvciAiCisJCQkJImxlbmd0aCBlbGVtZW50XG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChydHBoLT50eXBlID09IFJUQ1BfVFlQRV9TREVTKSB7CisJCQljaGFyIG5ld19jbmFtZVsyNTVdOworCQkJc3RybmNweShuZXdfY25hbWUsIGluZXRfbnRvYShyc3MtPnNpbl9sb2NhbC5zaW5fYWRkciksCisJCQkJc2l6ZW9mKG5ld19jbmFtZSkpOworCQkJbmV3X2NuYW1lW3NpemVvZihuZXdfY25hbWUpLTFdID0gJ1wwJzsKKwkJCXJjID0gcnRjcF9zZGVzX2NuYW1lX21hbmdsZShtc2csIHJ0cGgsICZvbGRfbGVuLAorCQkJCQkJICAgIG5ld19jbmFtZSk7CisJCQlpZiAocmMgPCAwKQorCQkJCXJldHVybiByYzsKKwkJfQorCQlydHBoID0gKHZvaWQgKilydHBoICsgb2xkX2xlbjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogcmVhZCBmcm9tIGluY29taW5nIFJUUC9SVENQIHNvY2tldCAqLworc3RhdGljIGludCBydHBfc29ja2V0X3JlYWQoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCBzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcykKK3sKKwlpbnQgcmM7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoUlRQX0FMTE9DX1NJWkUsICJSVFAvUlRDUCIpOworCXN0cnVjdCBtc2diICpuZXdfbXNnOworCXN0cnVjdCBydHBfc3ViX3NvY2tldCAqb3RoZXJfcnNzOworCisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJcmMgPSByZWFkKHJzcy0+YmZkLmZkLCBtc2ctPmRhdGEsIFJUUF9BTExPQ19TSVpFKTsKKwlpZiAocmMgPD0gMCkgeworCQlyc3MtPmJmZC53aGVuICY9IH5CU0NfRkRfUkVBRDsKKwkJcmV0dXJuIHJjOworCX0KKworCW1zZ2JfcHV0KG1zZywgcmMpOworCisJc3dpdGNoIChycy0+cnhfYWN0aW9uKSB7CisJY2FzZSBSVFBfUFJPWFk6CisJCWlmICghcnMtPnByb3h5Lm90aGVyX3NvY2spIHsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJaWYgKHJzcy0+YmZkLnByaXZfbnIgPT0gUlRQX1BSSVZfUlRQKQorCQkJb3RoZXJfcnNzID0gJnJzLT5wcm94eS5vdGhlcl9zb2NrLT5ydHA7CisJCWVsc2UgaWYgKHJzcy0+YmZkLnByaXZfbnIgPT0gUlRQX1BSSVZfUlRDUCkgeworCQkJb3RoZXJfcnNzID0gJnJzLT5wcm94eS5vdGhlcl9zb2NrLT5ydGNwOworCQkJLyogbW9kaWZ5IFJUQ1AgU0RFUyBDTkFNRSAqLworCQkJcmMgPSBydGNwX21hbmdsZShtc2csIHJzKTsKKwkJCWlmIChyYyA8IDApCisJCQkJZ290byBvdXRfZnJlZTsKKwkJfSBlbHNlIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJbXNnYl9lbnF1ZXVlKCZvdGhlcl9yc3MtPnR4X3F1ZXVlLCBtc2cpOworCQlvdGhlcl9yc3MtPmJmZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKwkJYnJlYWs7CisKKwljYXNlIFJUUF9SRUNWX1VQU1RSRUFNOgorCQlpZiAoIXJzLT5yZWNlaXZlLmNhbGxyZWYgfHwgIXJzLT5yZWNlaXZlLm5ldCkgeworCQkJcmMgPSAtRUlPOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQlpZiAocnNzLT5iZmQucHJpdl9uciA9PSBSVFBfUFJJVl9SVENQKSB7CisJCQlpZiAoIW1hbmdsZV9ydGNwX2NuYW1lKSB7CisJCQkJbXNnYl9mcmVlKG1zZyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBtb2RpZnkgUlRDUCBTREVTIENOQU1FICovCisJCQlyYyA9IHJ0Y3BfbWFuZ2xlKG1zZywgcnMpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlnb3RvIG91dF9mcmVlOworCQkJbXNnYl9lbnF1ZXVlKCZyc3MtPnR4X3F1ZXVlLCBtc2cpOworCQkJcnNzLT5iZmQud2hlbiB8PSBCU0NfRkRfV1JJVEU7CisJCQlicmVhazsKKwkJfQorCQlpZiAocnNzLT5iZmQucHJpdl9uciAhPSBSVFBfUFJJVl9SVFApIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJcmMgPSBydHBfZGVjb2RlKG1zZywgcnMtPnJlY2VpdmUuY2FsbHJlZiwgJm5ld19tc2cpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXRfZnJlZTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCW1zZ2JfZW5xdWV1ZSgmcnMtPnJlY2VpdmUubmV0LT51cHF1ZXVlLCBuZXdfbXNnKTsKKwkJYnJlYWs7CisKKwljYXNlIFJUUF9OT05FOiAvKiBpZiBzb2NrZXQgZXhpc3RzLCBidXQgZGlzYWJsZWQgYnkgYXBwICovCisJCW1zZ2JfZnJlZShtc2cpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWU6CisJbXNnYl9mcmVlKG1zZyk7CisJcmV0dXJuIHJjOworfQorCisvKiB3cml0ZSBmcm9tIHR4X3F1ZXVlIHRvIFJUUC9SVENQIHNvY2tldCAqLworc3RhdGljIGludCBydHBfc29ja2V0X3dyaXRlKHN0cnVjdCBydHBfc29ja2V0ICpycywgc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlpbnQgd3JpdHRlbjsKKworCW1zZyA9IG1zZ2JfZGVxdWV1ZSgmcnNzLT50eF9xdWV1ZSk7CisJaWYgKCFtc2cpIHsKKwkJcnNzLT5iZmQud2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCQlyZXR1cm4gMDsKKwl9CisKKwl3cml0dGVuID0gd3JpdGUocnNzLT5iZmQuZmQsIG1zZy0+ZGF0YSwgbXNnLT5sZW4pOworCWlmICh3cml0dGVuIDwgbXNnLT5sZW4pIHsKKwkJTE9HUChETUlCLCBMT0dMX0VSUk9SLCAic2hvcnQgd3JpdGUiKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtRUlPOworCX0KKworCW1zZ2JfZnJlZShtc2cpOworCisJcmV0dXJuIDA7Cit9CisKKworLyogY2FsbGJhY2sgZm9yIHRoZSBzZWxlY3QuYzpiZmRfKiBsYXllciAqLworc3RhdGljIGludCBydHBfYmZkX2NiKHN0cnVjdCBic2NfZmQgKmJmZCwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBydHBfc29ja2V0ICpycyA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzczsKKworCXN3aXRjaCAoYmZkLT5wcml2X25yKSB7CisJY2FzZSBSVFBfUFJJVl9SVFA6CisJCXJzcyA9ICZycy0+cnRwOworCQlicmVhazsKKwljYXNlIFJUUF9QUklWX1JUQ1A6CisJCXJzcyA9ICZycy0+cnRjcDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZsYWdzICYgQlNDX0ZEX1JFQUQpCisJCXJ0cF9zb2NrZXRfcmVhZChycywgcnNzKTsKKworCWlmIChmbGFncyAmIEJTQ19GRF9XUklURSkKKwkJcnRwX3NvY2tldF93cml0ZShycywgcnNzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbml0X3JzcyhzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcywgCisJCSAgICAgc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCBpbnQgZmQsIGludCBwcml2X25yKQoreworCS8qIGluaXRpYWxpemUgYmZkICovCisJcnNzLT5iZmQuZmQgPSBmZDsKKwlyc3MtPmJmZC5kYXRhID0gcnM7CisJcnNzLT5iZmQucHJpdl9uciA9IHByaXZfbnI7CisJcnNzLT5iZmQuY2IgPSBydHBfYmZkX2NiOworfQorCitzdHJ1Y3QgcnRwX3NvY2tldCAqcnRwX3NvY2tldF9jcmVhdGUodm9pZCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IHJ0cF9zb2NrZXQgKnJzOworCisJREVCVUdQKERNVVgsICJydHBfc29ja2V0X2NyZWF0ZSgpOiAiKTsKKworCXJzID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgcnRwX3NvY2tldCk7CisJaWYgKCFycykKKwkJcmV0dXJuIE5VTEw7CisKKwlJTklUX0xMSVNUX0hFQUQoJnJzLT5ydHAudHhfcXVldWUpOworCUlOSVRfTExJU1RfSEVBRCgmcnMtPnJ0Y3AudHhfcXVldWUpOworCisJcmMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworCWlmIChyYyA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpbml0X3JzcygmcnMtPnJ0cCwgcnMsIHJjLCBSVFBfUFJJVl9SVFApOworCXJjID0gYnNjX3JlZ2lzdGVyX2ZkKCZycy0+cnRwLmJmZCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXRfcnRwX3NvY2tldDsKKworCXJjID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dF9ydHBfYmZkOworCisJaW5pdF9yc3MoJnJzLT5ydGNwLCBycywgcmMsIFJUUF9QUklWX1JUQ1ApOworCXJjID0gYnNjX3JlZ2lzdGVyX2ZkKCZycy0+cnRjcC5iZmQpOworCWlmIChyYyA8IDApCisJCWdvdG8gb3V0X3J0Y3Bfc29ja2V0OworCisJREVCVUdQQyhETVVYLCAic3VjY2Vzc1xuIik7CisKKwlyYyA9IHJ0cF9zb2NrZXRfYmluZChycywgSU5BRERSX0FOWSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXRfcnRjcF9iZmQ7CisKKwlyZXR1cm4gcnM7CisKK291dF9ydGNwX2JmZDoKKwlic2NfdW5yZWdpc3Rlcl9mZCgmcnMtPnJ0Y3AuYmZkKTsKK291dF9ydGNwX3NvY2tldDoKKwljbG9zZShycy0+cnRjcC5iZmQuZmQpOworb3V0X3J0cF9iZmQ6CisJYnNjX3VucmVnaXN0ZXJfZmQoJnJzLT5ydHAuYmZkKTsKK291dF9ydHBfc29ja2V0OgorCWNsb3NlKHJzLT5ydHAuYmZkLmZkKTsKK291dF9mcmVlOgorCXRhbGxvY19mcmVlKHJzKTsKKwlERUJVR1BDKERNVVgsICJmYWlsZWRcbiIpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHJ0cF9zdWJfc29ja2V0X2JpbmQoc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MsIHVfaW50MzJfdCBpcCwKKwkJCQl1X2ludDE2X3QgcG9ydCkKK3sKKwlpbnQgcmM7CisJc29ja2xlbl90IGFsZW4gPSBzaXplb2YocnNzLT5zaW5fbG9jYWwpOworCisJcnNzLT5zaW5fbG9jYWwuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJcnNzLT5zaW5fbG9jYWwuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoaXApOworCXJzcy0+c2luX2xvY2FsLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJcnNzLT5iZmQud2hlbiB8PSBCU0NfRkRfUkVBRDsKKworCXJjID0gYmluZChyc3MtPmJmZC5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZyc3MtPnNpbl9sb2NhbCwKKwkJICBzaXplb2YocnNzLT5zaW5fbG9jYWwpKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiByZXRyaWV2ZSB0aGUgYWRkcmVzcyB3ZSBhY3R1YWxseSBib3VuZCB0bywgaW4gY2FzZSB3ZQorCSAqIHBhc3NlZCBJTkFERFJfQU5ZIGFzIElQIGFkZHJlc3MgKi8KKwlyZXR1cm4gZ2V0c29ja25hbWUocnNzLT5iZmQuZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcnNzLT5zaW5fbG9jYWwsCisJCQkgICAmYWxlbik7Cit9CisKKyNkZWZpbmUgUlRQX1BPUlRfQkFTRQkzMDAwMAorc3RhdGljIHVuc2lnbmVkIGludCBuZXh0X3VkcF9wb3J0ID0gUlRQX1BPUlRfQkFTRTsKKworLyogYmluZCBhIFJUUCBzb2NrZXQgdG8gYSBsb2NhbCBhZGRyZXNzICovCitpbnQgcnRwX3NvY2tldF9iaW5kKHN0cnVjdCBydHBfc29ja2V0ICpycywgdV9pbnQzMl90IGlwKQoreworCWludCByYyA9IC1FSU87CisJc3RydWN0IGluX2FkZHIgaWE7CisKKwlpYS5zX2FkZHIgPSBodG9ubChpcCk7CisJREVCVUdQKERNVVgsICJydHBfc29ja2V0X2JpbmQocnM9JXAsIElQPSVzKTogIiwgcnMsCisJCWluZXRfbnRvYShpYSkpOworCisJLyogdHJ5IHRvIGJpbmQgdG8gYSBjb25zZWN1dGl2ZSBwYWlyIG9mIHBvcnRzICovCisJZm9yIChuZXh0X3VkcF9wb3J0ID0gbmV4dF91ZHBfcG9ydCAlIDB4ZmZmZjsKKwkgICAgIG5leHRfdWRwX3BvcnQgPCAweGZmZmY7IG5leHRfdWRwX3BvcnQgKz0gMikgeworCQlyYyA9IHJ0cF9zdWJfc29ja2V0X2JpbmQoJnJzLT5ydHAsIGlwLCBuZXh0X3VkcF9wb3J0KTsKKwkJaWYgKHJjICE9IDApCisJCQljb250aW51ZTsKKworCQlyYyA9IHJ0cF9zdWJfc29ja2V0X2JpbmQoJnJzLT5ydGNwLCBpcCwgbmV4dF91ZHBfcG9ydCsxKTsKKwkJaWYgKHJjID09IDApCisJCQlicmVhazsKKwl9CisJaWYgKHJjIDwgMCkgeworCQlERUJVR1BDKERNVVgsICJmYWlsZWRcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWEuc19hZGRyID0gcnMtPnJ0cC5zaW5fbG9jYWwuc2luX2FkZHIuc19hZGRyOworCURFQlVHUEMoRE1VWCwgIkJPVU5EX0lQPSVzLCBCT1VORF9QT1JUPSV1XG4iLAorCQlpbmV0X250b2EoaWEpLCBudG9ocyhycy0+cnRwLnNpbl9sb2NhbC5zaW5fcG9ydCkpOworCXJldHVybiBudG9ocyhycy0+cnRwLnNpbl9sb2NhbC5zaW5fcG9ydCk7Cit9CisKK3N0YXRpYyBpbnQgcnRwX3N1Yl9zb2NrZXRfY29ubmVjdChzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcywKKwkJCQkgIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQpCit7CisJaW50IHJjOworCXNvY2tsZW5fdCBhbGVuID0gc2l6ZW9mKHJzcy0+c2luX2xvY2FsKTsKKworCXJzcy0+c2luX3JlbW90ZS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlyc3MtPnNpbl9yZW1vdGUuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoaXApOworCXJzcy0+c2luX3JlbW90ZS5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCisJcmMgPSBjb25uZWN0KHJzcy0+YmZkLmZkLCAoc3RydWN0IHNvY2thZGRyICopICZyc3MtPnNpbl9yZW1vdGUsCisJCSAgICAgc2l6ZW9mKHJzcy0+c2luX3JlbW90ZSkpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiBnZXRzb2NrbmFtZShyc3MtPmJmZC5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZyc3MtPnNpbl9sb2NhbCwKKwkJCSAgICZhbGVuKTsKK30KKworLyogJ2Nvbm5lY3QnIGEgUlRQIHNvY2tldCB0byBhIHJlbW90ZSBwZWVyICovCitpbnQgcnRwX3NvY2tldF9jb25uZWN0KHN0cnVjdCBydHBfc29ja2V0ICpycywgdV9pbnQzMl90IGlwLCB1X2ludDE2X3QgcG9ydCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IGluX2FkZHIgaWE7CisKKwlpYS5zX2FkZHIgPSBodG9ubChpcCk7CisJREVCVUdQKERNVVgsICJydHBfc29ja2V0X2Nvbm5lY3QocnM9JXAsIGlwPSVzLCBwb3J0PSV1KVxuIiwKKwkJcnMsIGluZXRfbnRvYShpYSksIHBvcnQpOworCisJcmMgPSBydHBfc3ViX3NvY2tldF9jb25uZWN0KCZycy0+cnRwLCBpcCwgcG9ydCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIHJ0cF9zdWJfc29ja2V0X2Nvbm5lY3QoJnJzLT5ydGNwLCBpcCwgcG9ydCsxKTsKK30KKworLyogYmluZCB0d28gUlRQL1JUQ1Agc29ja2V0cyB0b2dldGhlciAqLworaW50IHJ0cF9zb2NrZXRfcHJveHkoc3RydWN0IHJ0cF9zb2NrZXQgKnRoaXMsIHN0cnVjdCBydHBfc29ja2V0ICpvdGhlcikKK3sKKwlERUJVR1AoRE1VWCwgInJ0cF9zb2NrZXRfcHJveHkodGhpcz0lcCwgb3RoZXI9JXApXG4iLAorCQl0aGlzLCBvdGhlcik7CisKKwl0aGlzLT5yeF9hY3Rpb24gPSBSVFBfUFJPWFk7CisJdGhpcy0+cHJveHkub3RoZXJfc29jayA9IG90aGVyOworCisJb3RoZXItPnJ4X2FjdGlvbiA9IFJUUF9QUk9YWTsKKwlvdGhlci0+cHJveHkub3RoZXJfc29jayA9IHRoaXM7CisKKwlyZXR1cm4gMDsKK30KKworLyogYmluZCBSVFAvUlRDUCBzb2NrZXQgdG8gYXBwbGljYXRpb24gKi8KK2ludCBydHBfc29ja2V0X3Vwc3RyZWFtKHN0cnVjdCBydHBfc29ja2V0ICp0aGlzLCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCXVfaW50MzJfdCBjYWxscmVmKQoreworCURFQlVHUChETVVYLCAicnRwX3NvY2tldF9wcm94eSh0aGlzPSVwLCBjYWxscmVmPSV1KVxuIiwKKwkJdGhpcywgY2FsbHJlZik7CisKKwlpZiAoY2FsbHJlZikgeworCQl0aGlzLT5yeF9hY3Rpb24gPSBSVFBfUkVDVl9VUFNUUkVBTTsKKwkJdGhpcy0+cmVjZWl2ZS5uZXQgPSBuZXQ7CisJCXRoaXMtPnJlY2VpdmUuY2FsbHJlZiA9IGNhbGxyZWY7CisJfSBlbHNlCisJCXRoaXMtPnJ4X2FjdGlvbiA9IFJUUF9OT05FOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfdHhfcXVldWUoc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpyc3MpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwkKKwl3aGlsZSAoKG1zZyA9IG1zZ2JfZGVxdWV1ZSgmcnNzLT50eF9xdWV1ZSkpKQorCQltc2diX2ZyZWUobXNnKTsKK30KKworaW50IHJ0cF9zb2NrZXRfZnJlZShzdHJ1Y3QgcnRwX3NvY2tldCAqcnMpCit7CisJREVCVUdQKERNVVgsICJydHBfc29ja2V0X2ZyZWUocnM9JXApXG4iLCBycyk7CisKKwkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgbGVhdmUgcmVmZXJlbmNlcyBkYW5nbGluZyB0byB1cyAqLworCWlmIChycy0+cnhfYWN0aW9uID09IFJUUF9QUk9YWSAmJgorCSAgICBycy0+cHJveHkub3RoZXJfc29jaykKKwkJcnMtPnByb3h5Lm90aGVyX3NvY2stPnByb3h5Lm90aGVyX3NvY2sgPSBOVUxMOworCisJYnNjX3VucmVnaXN0ZXJfZmQoJnJzLT5ydHAuYmZkKTsKKwljbG9zZShycy0+cnRwLmJmZC5mZCk7CisJZnJlZV90eF9xdWV1ZSgmcnMtPnJ0cCk7CisKKwlic2NfdW5yZWdpc3Rlcl9mZCgmcnMtPnJ0Y3AuYmZkKTsKKwljbG9zZShycy0+cnRjcC5iZmQuZmQpOworCWZyZWVfdHhfcXVldWUoJnJzLT5ydGNwKTsKKworCXRhbGxvY19mcmVlKHJzKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvc2NjcC9zY2NwLmMgYi9vcGVuYnNjL3NyYy9zY2NwL3NjY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWRhMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvc2NjcC9zY2NwLmMKQEAgLTAsMCArMSwxMzQ2IEBACisvKgorICogU0NDUCBtYW5hZ2VtZW50IGNvZGUKKyAqCisgKiAoQykgMjAwOSwgMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSwgMjAxMCBieSBPbi1XYXZlcworICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisjaW5jbHVkZSA8c2NjcC9zY2NwLmg+CisKKworc3RhdGljIHZvaWQgKnRhbGxfc2NjcF9jdHg7CitzdGF0aWMgTExJU1RfSEVBRChzY2NwX2Nvbm5lY3Rpb25zKTsKKworI2RlZmluZSBTQ0NQX01TR19TSVpFIDQwOTYKKyNkZWZpbmUgU0NDUF9NU0dfSEVBRFJPT00gMTI4CisKKy8qIGdsb2JhbCBkYXRhICovCitjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCBzY2NwX3Nzbl9ic3NhcCA9IHsKKwkuc2NjcF9mYW1pbHkJPSAwLAorCS5zY2NwX3Nzbgk9IFNDQ1BfU1NOX0JTU0FQLAorfTsKKworc3RydWN0IHNjY3Bfc3lzdGVtIHsKKwkvKiBsYXllcjMgLT4gbGF5ZXIyICovCisJaW50ICgqd3JpdGVfZGF0YSkoc3RydWN0IG1zZ2IgKmRhdGEsIHZvaWQgKmNvbnRleHQpOworCXZvaWQgKndyaXRlX2NvbnRleHQ7Cit9OworCisKK3N0YXRpYyBzdHJ1Y3Qgc2NjcF9zeXN0ZW0gc2NjcF9zeXN0ZW0gPSB7CisJLndyaXRlX2RhdGEgPSBOVUxMLAorfTsKKworc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayB7CisJLyogY29ubmVjdGlvbiBiYXNlZCAqLworCWludCAoKmFjY2VwdF9jYikoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqLCB2b2lkICopOworCXZvaWQgKmFjY2VwdF9jb250ZXh0OworCisJLyogY29ubmVjdGlvbiBsZXNzICovCisJaW50ICgqcmVhZF9jYikoc3RydWN0IG1zZ2IgKiwgdW5zaWduZWQgaW50LCB2b2lkICopOworCXZvaWQgKnJlYWRfY29udGV4dDsKKworCXVfaW50OF90IHNzbjsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBjYWxsYmFjazsKK307CisKK3N0YXRpYyBMTElTVF9IRUFEKHNjY3BfY2FsbGJhY2tzKTsKKworc3RhdGljIHN0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2sgKl9maW5kX3Nzbih1X2ludDhfdCBzc24pCit7CisJc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayAqY2I7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjYiwgJnNjY3BfY2FsbGJhY2tzLCBjYWxsYmFjaykgeworCQlpZiAoY2ItPnNzbiA9PSBzc24pCisJCQlyZXR1cm4gY2I7CisJfQorCisJLyogbmVlZCB0byBhZGQgb25lICovCisJY2IgPSB0YWxsb2NfemVybyh0YWxsX3NjY3BfY3R4LCBzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrKTsKKwlpZiAoIWNiKSB7CisJCURFQlVHUChEU0NDUCwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzY2NwIGNhbGxiYWNrLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWNiLT5zc24gPSBzc247CisJbGxpc3RfYWRkX3RhaWwoJmNiLT5jYWxsYmFjaywgJnNjY3BfY2FsbGJhY2tzKTsKKwlyZXR1cm4gY2I7Cit9CisKKworc3RhdGljIGludCBfc2VuZF9tc2coc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlyZXR1cm4gc2NjcF9zeXN0ZW0ud3JpdGVfZGF0YShtc2csIHNjY3Bfc3lzdGVtLndyaXRlX2NvbnRleHQpOworfQorCisvKgorICogcGFyc2luZyByb3V0aW5lcworICovCitzdGF0aWMgaW50IGNvcHlfYWRkcmVzcyhzdHJ1Y3Qgc2NjcF9hZGRyZXNzICphZGRyLCB1X2ludDhfdCBvZmZzZXQsIHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX2NhbGxlZF9wYXJ0eV9hZGRyZXNzICpwYXJ0eTsKKworCWludCByb29tID0gbXNnYl9sMmxlbihtc2diKSAtIG9mZnNldDsKKwl1X2ludDhfdCByZWFkID0gMDsKKwl1X2ludDhfdCBsZW5ndGg7CisKKwlpZiAocm9vbSA8PSAwKSB7CisJCURFQlVHUChEU0NDUCwgIk5vdCBlbm91Z2ggcm9vbSBmb3IgYW4gYWRkcmVzczogJXVcbiIsIHJvb20pOworCQlyZXR1cm4gLTE7CisJfQorCisJbGVuZ3RoID0gbXNnYi0+bDJoW29mZnNldF07CisJaWYgKHJvb20gPD0gbGVuZ3RoKSB7CisJCURFQlVHUChEU0NDUCwgIk5vdCBlbm91Z2ggcm9vbSBmb3Igb3B0aW9uYWwgZGF0YSAldSAldVxuIiwgcm9vbSwgbGVuZ3RoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJcGFydHkgPSAoc3RydWN0IHNjY3BfY2FsbGVkX3BhcnR5X2FkZHJlc3MgKikobXNnYi0+bDJoICsgb2Zmc2V0ICsgMSk7CisJaWYgKHBhcnR5LT5wb2ludF9jb2RlX2luZGljYXRvcikgeworCQlpZiAobGVuZ3RoIDw9IHJlYWQgKyAyKSB7CisJCSAgICBERUJVR1AoRFNDQ1AsICJQT0kgZG9lcyBub3QgZml0ICV1XG4iLCBsZW5ndGgpOworCQkgICAgcmV0dXJuIC0xOworCQl9CisKKworCQltZW1jcHkoJmFkZHItPnBvaSwgJnBhcnR5LT5kYXRhW3JlYWRdLCAyKTsKKwkJcmVhZCArPSAyOworCX0KKworCWlmIChwYXJ0eS0+c3NuX2luZGljYXRvcikgeworCQlpZiAobGVuZ3RoIDw9IHJlYWQgKyAxKSB7CisJCSAgICBERUJVR1AoRFNDQ1AsICJTU04gZG9lcyBub3QgZml0ICV1XG4iLCBsZW5ndGgpOworCQkgICAgcmV0dXJuIC0xOworCQl9CisKKwkJYWRkci0+c3NuID0gcGFydHktPmRhdGFbcmVhZF07CisJCXJlYWQgKz0gMTsKKwl9CisKKwlpZiAocGFydHktPmdsb2JhbF90aXRsZV9pbmRpY2F0b3IpIHsKKwkJREVCVUdQKERTQ0NQLCAiR1RJIG5vdCBzdXBwb3J0ZWQgJXVcbiIsICoodV9pbnQ4X3QgKilwYXJ0eSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlhZGRyLT5hZGRyZXNzID0gKnBhcnR5OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2FkZHJlc3Moc3RydWN0IHNjY3BfYWRkcmVzcyAqYWRkcikKK3sKKwkvKiBpZ25vcmUgcG9pbnRfY29kZV9pbmRpY2F0b3IuLi4gaXQgc2hvdWxkIGJlIHplcm8uLi4gYnV0ICovCisJaWYgKGFkZHItPmFkZHJlc3Muc3NuX2luZGljYXRvciAhPSAxCisJICAgIHx8IGFkZHItPmFkZHJlc3MuZ2xvYmFsX3RpdGxlX2luZGljYXRvciA9PSAxCisJICAgIHx8IGFkZHItPmFkZHJlc3Mucm91dGluZ19pbmRpY2F0b3IgIT0gMSkgeworCQlERUJVR1AoRFNDQ1AsICJJbnZhbGlkIGNhbGxlZCBhZGRyZXNzIGFjY29yZGluZyB0byAwOC4wNjogMHgleCAweCV4XG4iLAorCQkJKih1X2ludDhfdCAqKSZhZGRyLT5hZGRyZXNzLCBhZGRyLT5zc24pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3BfcGFyc2Vfb3B0aW9uYWxfZGF0YShjb25zdCBpbnQgb2Zmc2V0LAorCQkJCSAgICAgc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX29wdGlvbmFsX2RhdGEgKmRhdGEpCit7CisJdV9pbnQxNl90IHJvb20gPSBtc2diX2wybGVuKG1zZ2IpIC0gb2Zmc2V0OworCXVfaW50MTZfdCByZWFkID0gMDsKKworCXdoaWxlIChyb29tID4gcmVhZCkgeworCQl1X2ludDhfdCB0eXBlID0gbXNnYi0+bDJoW29mZnNldCArIHJlYWRdOworCQlpZiAodHlwZSA9PSBTQ0NQX1BOQ19FTkRfT0ZfT1BUSU9OQUwpCisJCQlyZXR1cm4gMDsKKworCQlpZiAocmVhZCArIDEgPj0gcm9vbSkgeworCQkJREVCVUdQKERTQ0NQLCAibm8gcGxhY2UgZm9yIGxlbmd0aFxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXVfaW50OF90IGxlbmd0aCA9IG1zZ2ItPmwyaFtvZmZzZXQgKyByZWFkICsgMV07CisJCXJlYWQgKz0gMiArIGxlbmd0aDsKKworCisJCWlmIChyb29tIDw9IHJlYWQpIHsKKwkJCURFQlVHUChEU0NDUCwgIm5vIHNwYWNlIGZvciB0aGUgZGF0YTogdHlwZTogJWQgcmVhZDogJWQgcm9vbTogJWQgbDI6ICVkXG4iLAorCQkJICAgICAgIHR5cGUsIHJlYWQsIHJvb20sIG1zZ2JfbDJsZW4obXNnYikpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAodHlwZSA9PSBTQ0NQX1BOQ19EQVRBKSB7CisJCQlkYXRhLT5kYXRhX2xlbiA9IGxlbmd0aDsKKwkJCWRhdGEtPmRhdGFfc3RhcnQgPSBvZmZzZXQgKyByZWFkIC0gbGVuZ3RoOworCQl9CisKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlcXVlc3Qoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgaGVhZGVyX3NpemUgPQorCQkJc2l6ZW9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCk7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBvcHRpb25hbF9vZmZzZXQgPQorCQkJb2Zmc2V0b2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0LCBvcHRpb25hbF9zdGFydCk7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBjYWxsZWRfb2Zmc2V0ID0KKwkJCW9mZnNldG9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCwgdmFyaWFibGVfY2FsbGVkKTsKKworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCAqKW1zZ2ItPmwyaDsKKwlzdHJ1Y3Qgc2NjcF9vcHRpb25hbF9kYXRhIG9wdGlvbmFsX2RhdGE7CisKKwkvKiBoZWFkZXIgY2hlY2sgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCURFQlVHUChEU0NDUCwgIm1zZ2IgPCBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBjb3B5IG91dCB0aGUgY2FsbGluZyBhbmQgY2FsbGVkIGFkZHJlc3MuIEFkZCB0aGUgb2Zmc2V0ICovCisJaWYgKGNvcHlfYWRkcmVzcygmcmVzdWx0LT5jYWxsZWQsIGNhbGxlZF9vZmZzZXQgKyByZXEtPnZhcmlhYmxlX2NhbGxlZCwgbXNnYikgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGNoZWNrX2FkZHJlc3MoJnJlc3VsdC0+Y2FsbGVkKSAhPSAwKSB7CisJCURFQlVHUChEU0NDUCwgIkludmFsaWQgY2FsbGVkIGFkZHJlc3MgYWNjb3JkaW5nIHRvIDA4LjA2OiAweCV4IDB4JXhcbiIsCisJCQkqKHVfaW50OF90ICopJnJlc3VsdC0+Y2FsbGVkLmFkZHJlc3MsIHJlc3VsdC0+Y2FsbGVkLnNzbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXN1bHQtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UgPSAmcmVxLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCisJLyoKKwkgKiBwYXJzZSBvcHRpb25hbCBkYXRhLgorCSAqLworCW1lbXNldCgmb3B0aW9uYWxfZGF0YSwgMCwgc2l6ZW9mKG9wdGlvbmFsX2RhdGEpKTsKKwlpZiAoX3NjY3BfcGFyc2Vfb3B0aW9uYWxfZGF0YShvcHRpb25hbF9vZmZzZXQgKyByZXEtPm9wdGlvbmFsX3N0YXJ0LCBtc2diLCAmb3B0aW9uYWxfZGF0YSkgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJwYXJzaW5nIG9mIG9wdGlvbmFsIGRhdGEgZmFpbGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAob3B0aW9uYWxfZGF0YS5kYXRhX2xlbiAhPSAwKSB7CisJCW1zZ2ItPmwzaCA9ICZtc2diLT5sMmhbb3B0aW9uYWxfZGF0YS5kYXRhX3N0YXJ0XTsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IG9wdGlvbmFsX2RhdGEuZGF0YV9sZW47CisJfSBlbHNlIHsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlbGVhc2VkKHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgaW50IGhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZWQpOworCXN0YXRpYyBpbnQgb3B0aW9uYWxfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCwgb3B0aW9uYWxfc3RhcnQpOworCisJc3RydWN0IHNjY3Bfb3B0aW9uYWxfZGF0YSBvcHRpb25hbF9kYXRhOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZWQgKnJscyA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VkICopIG1zZ2ItPmwyaDsKKworCS8qIHdlIGRvbid0IGhhdmUgZW5vdWdoIHNpemUgZm9yIHRoZSBzdHJ1Y3QgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCURFQlVHUChEU0NDUCwgIm1zZ2IgPiBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQoJm9wdGlvbmFsX2RhdGEsIDAsIHNpemVvZihvcHRpb25hbF9kYXRhKSk7CisJaWYgKF9zY2NwX3BhcnNlX29wdGlvbmFsX2RhdGEob3B0aW9uYWxfb2Zmc2V0ICsgcmxzLT5vcHRpb25hbF9zdGFydCwgbXNnYiwgJm9wdGlvbmFsX2RhdGEpICE9IDApIHsKKwkJREVCVUdQKERTQ0NQLCAicGFyc2luZyBvZiBvcHRpb25hbCBkYXRhIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmVzdWx0LT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlID0gJnJscy0+c291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwlyZXN1bHQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICZybHMtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKworCWlmIChvcHRpb25hbF9kYXRhLmRhdGFfbGVuICE9IDApIHsKKwkJbXNnYi0+bDNoID0gJm1zZ2ItPmwyaFtvcHRpb25hbF9kYXRhLmRhdGFfc3RhcnRdOworCQlyZXN1bHQtPmRhdGFfbGVuID0gb3B0aW9uYWxfZGF0YS5kYXRhX2xlbjsKKwl9IGVsc2UgeworCQlyZXN1bHQtPmRhdGFfbGVuID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVmdXNlZChzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBoZWFkZXJfc2l6ZSA9CisJCQlzaXplb2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWZ1c2VkKTsKKwlzdGF0aWMgaW50IG9wdGlvbmFsX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVmdXNlZCwgb3B0aW9uYWxfc3RhcnQpOworCisJc3RydWN0IHNjY3Bfb3B0aW9uYWxfZGF0YSBvcHRpb25hbF9kYXRhOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVmdXNlZCAqcmVmOworCisJLyogaGVhZGVyIGNoZWNrICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlERUJVR1AoRFNDQ1AsICJtc2diIDwgaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmVmID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVmdXNlZCAqKSBtc2diLT5sMmg7CisKKwlyZXN1bHQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICZyZWYtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKworCW1lbXNldCgmb3B0aW9uYWxfZGF0YSwgMCwgc2l6ZW9mKG9wdGlvbmFsX2RhdGEpKTsKKwlpZiAoX3NjY3BfcGFyc2Vfb3B0aW9uYWxfZGF0YShvcHRpb25hbF9vZmZzZXQgKyByZWYtPm9wdGlvbmFsX3N0YXJ0LCBtc2diLCAmb3B0aW9uYWxfZGF0YSkgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJwYXJzaW5nIG9mIG9wdGlvbmFsIGRhdGEgZmFpbGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBvcHRpb25hbCBkYXRhICovCisJaWYgKG9wdGlvbmFsX2RhdGEuZGF0YV9sZW4gIT0gMCkgeworCQltc2diLT5sM2ggPSAmbXNnYi0+bDJoW29wdGlvbmFsX2RhdGEuZGF0YV9zdGFydF07CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSBvcHRpb25hbF9kYXRhLmRhdGFfbGVuOworCX0gZWxzZSB7CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSAwOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9jb25maXJtKHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgdV9pbnQzMl90IGhlYWRlcl9zaXplID0KKwkJICAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX2NvbmZpcm0pOworCXN0YXRpYyBjb25zdCB1X2ludDMyX3Qgb3B0aW9uYWxfb2Zmc2V0ID0KKwkJCW9mZnNldG9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSwgb3B0aW9uYWxfc3RhcnQpOworCisJc3RydWN0IHNjY3Bfb3B0aW9uYWxfZGF0YSBvcHRpb25hbF9kYXRhOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSAqY29uOworCisJLyogaGVhZGVyIGNoZWNrICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlERUJVR1AoRFNDQ1AsICJtc2diIDwgaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJY29uID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSAqKSBtc2diLT5sMmg7CisJcmVzdWx0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAmY29uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJcmVzdWx0LT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlID0gJmNvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKworCW1lbXNldCgmb3B0aW9uYWxfZGF0YSwgMCwgc2l6ZW9mKG9wdGlvbmFsX2RhdGEpKTsKKwlpZiAoX3NjY3BfcGFyc2Vfb3B0aW9uYWxfZGF0YShvcHRpb25hbF9vZmZzZXQgKyBjb24tPm9wdGlvbmFsX3N0YXJ0LCBtc2diLCAmb3B0aW9uYWxfZGF0YSkgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJwYXJzaW5nIG9mIG9wdGlvbmFsIGRhdGEgZmFpbGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAob3B0aW9uYWxfZGF0YS5kYXRhX2xlbiAhPSAwKSB7CisJCW1zZ2ItPmwzaCA9ICZtc2diLT5sMmhbb3B0aW9uYWxfZGF0YS5kYXRhX3N0YXJ0XTsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IG9wdGlvbmFsX2RhdGEuZGF0YV9sZW47CisJfSBlbHNlIHsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBpbnQgaGVhZGVyX3NpemUgPSBzaXplb2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKTsKKworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZSAqY21wbDsKKworCS8qIGhlYWRlciBjaGVjayAqLworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJREVCVUdQKERTQ0NQLCAibXNnYiA8IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNtcGwgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlICopIG1zZ2ItPmwyaDsKKwlyZXN1bHQtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UgPSAmY21wbC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwlyZXN1bHQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICZjbXBsLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fZHQxKHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgaW50IGhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY2NwX2RhdGFfZm9ybTEpOworCXN0YXRpYyBpbnQgdmFyaWFibGVfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNjY3BfZGF0YV9mb3JtMSwgdmFyaWFibGVfc3RhcnQpOworCisJc3RydWN0IHNjY3BfZGF0YV9mb3JtMSAqZHQxID0gKHN0cnVjdCBzY2NwX2RhdGFfZm9ybTEgKiltc2diLT5sMmg7CisKKwkvKiB3ZSBkb24ndCBoYXZlIGVub3VnaCBzaXplIGZvciB0aGUgc3RydWN0ICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlERUJVR1AoRFNDQ1AsICJtc2diID4gaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGR0MS0+c2VnbWVudGluZyAhPSAwKSB7CisJCURFQlVHUChEU0NDUCwgIlRoaXMgcGFja2V0IGhhcyBzZWdtZW50aW5nLCBub3Qgc3VwcG9ydGVkOiAlZFxuIiwgZHQxLT5zZWdtZW50aW5nKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlc3VsdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gJmR0MS0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJLyogc29tZSBtb3JlICBzaXplIGNoZWNrcyBpbiBoZXJlICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCB2YXJpYWJsZV9vZmZzZXQgKyBkdDEtPnZhcmlhYmxlX3N0YXJ0ICsgMSkgeworCQlERUJVR1AoRFNDQ1AsICJOb3QgZW5vdWdoIHNwYWNlIGZvciB2YXJpYWJsZSBzdGFydDogJXUgJXVcbiIsCisJCQltc2diX2wybGVuKG1zZ2IpLCBkdDEtPnZhcmlhYmxlX3N0YXJ0KTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlc3VsdC0+ZGF0YV9sZW4gPSBtc2diLT5sMmhbdmFyaWFibGVfb2Zmc2V0ICsgZHQxLT52YXJpYWJsZV9zdGFydF07CisJbXNnYi0+bDNoID0gJm1zZ2ItPmwyaFtkdDEtPnZhcmlhYmxlX3N0YXJ0ICsgdmFyaWFibGVfb2Zmc2V0ICsgMV07CisKKwlpZiAobXNnYl9sM2xlbihtc2diKSA8IHJlc3VsdC0+ZGF0YV9sZW4pIHsKKwkJREVCVUdQKERTQ0NQLCAiTm90IGVub3VnaCByb29tIGZvciB0aGUgcGF5bG9hZDogJXUgJXVcbiIsCisJCQltc2diX2wzbGVuKG1zZ2IpLCByZXN1bHQtPmRhdGFfbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgX3NjY3BfcGFyc2VfdWR0KHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEpOworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgY2FsbGVkX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEsIHZhcmlhYmxlX2NhbGxlZCk7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBjYWxsaW5nX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEsIHZhcmlhYmxlX2NhbGxpbmcpOworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgZGF0YV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhLCB2YXJpYWJsZV9kYXRhKTsKKworCXN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEgKnVkdCA9IChzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhICopbXNnYi0+bDJoOworCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlERUJVR1AoRFNDQ1AsICJtc2diIDwgaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogY29weSBvdXQgdGhlIGNhbGxpbmcgYW5kIGNhbGxlZCBhZGRyZXNzLiBBZGQgdGhlIG9mZiAqLworCWlmIChjb3B5X2FkZHJlc3MoJnJlc3VsdC0+Y2FsbGVkLCBjYWxsZWRfb2Zmc2V0ICsgdWR0LT52YXJpYWJsZV9jYWxsZWQsIG1zZ2IpICE9IDApCisJCXJldHVybiAtMTsKKworCWlmIChjaGVja19hZGRyZXNzKCZyZXN1bHQtPmNhbGxlZCkgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJJbnZhbGlkIGNhbGxlZCBhZGRyZXNzIGFjY29yZGluZyB0byAwOC4wNjogMHgleCAweCV4XG4iLAorCQkJKih1X2ludDhfdCAqKSZyZXN1bHQtPmNhbGxlZC5hZGRyZXNzLCByZXN1bHQtPmNhbGxlZC5zc24pOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGNvcHlfYWRkcmVzcygmcmVzdWx0LT5jYWxsaW5nLCBjYWxsaW5nX29mZnNldCArIHVkdC0+dmFyaWFibGVfY2FsbGluZywgbXNnYikgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGNoZWNrX2FkZHJlc3MoJnJlc3VsdC0+Y2FsbGluZykgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJJbnZhbGlkIGNhbGxlZCBhZGRyZXNzIGFjY29yZGluZyB0byAwOC4wNjogMHgleCAweCV4XG4iLAorCQkJKih1X2ludDhfdCAqKSZyZXN1bHQtPmNhbGxlZC5hZGRyZXNzLCByZXN1bHQtPmNhbGxlZC5zc24pOworCX0KKworCS8qIHdlIGRvbid0IGhhdmUgZW5vdWdoIHNpemUgZm9yIHRoZSBkYXRhICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBkYXRhX29mZnNldCArIHVkdC0+dmFyaWFibGVfZGF0YSArIDEpIHsKKwkJREVCVUdQKERTQ0NQLCAibXNnYiA8IGhlYWRlciArIG9mZnNldCAldSAldSAldVxuIiwKKwkJCW1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplLCB1ZHQtPnZhcmlhYmxlX2RhdGEpOworCQlyZXR1cm4gLTE7CisJfQorCisKKwltc2diLT5sM2ggPSAmdWR0LT5kYXRhW3VkdC0+dmFyaWFibGVfZGF0YV07CisJcmVzdWx0LT5kYXRhX2xlbiA9IG1zZ2JfbDNsZW4obXNnYik7CisKKwlpZiAobXNnYl9sM2xlbihtc2diKSAhPSAgbXNnYi0+bDNoWy0xXSkgeworCQlERUJVR1AoRFNDQ1AsICJtc2diIGlzIHRydW5jYXRlZCBpczogJXUgc2hvdWxkOiAldVxuIiwKKwkJCW1zZ2JfbDNsZW4obXNnYiksIG1zZ2ItPmwzaFstMV0pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3BfcGFyc2VfaXQoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgaGVhZGVyX3NpemUgPSBzaXplb2Yoc3RydWN0IHNjY3BfZGF0YV9pdCk7CisKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2l0ICppdDsKKworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJREVCVUdQKERTQ0NQLCAibXNnYiA8IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWl0ID0gKHN0cnVjdCBzY2NwX2RhdGFfaXQgKikgbXNnYi0+bDJoOworCXJlc3VsdC0+ZGF0YV9sZW4gPSAwOworCXJlc3VsdC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSA9ICZpdC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwlyZXN1bHQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICZpdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBTZW5kIFVEVC4gQ3VycmVudGx5IHdlIGhhdmUgYSBmaXhlZCBhZGRyZXNzLi4uCisgKi8KK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9kYXRhKGludCBjbGFzcywgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKmluLAorCQkJICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKm91dCwgc3RydWN0IG1zZ2IgKnBheWxvYWQpCit7CisJc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSAqdWR0OworCXVfaW50OF90ICpkYXRhOworCWludCByZXQ7CisKKwlpZiAobXNnYl9sM2xlbihwYXlsb2FkKSA+IDI1NikgeworCQlERUJVR1AoRFNDQ1AsICJUaGUgcGF5bG9hZCBpcyB0b28gYmlnIGZvciBvbmUgdWR0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsCisJCQkJCSAgICAgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3A6IHVkdCIpOworCW1zZy0+bDJoID0gJm1zZy0+ZGF0YVswXTsKKwl1ZHQgPSAoc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSAqKW1zZ2JfcHV0KG1zZywgc2l6ZW9mKCp1ZHQpKTsKKworCXVkdC0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfVURUOworCXVkdC0+cHJvdG9fY2xhc3MgPSBjbGFzczsKKwl1ZHQtPnZhcmlhYmxlX2NhbGxlZCA9IDM7CisJdWR0LT52YXJpYWJsZV9jYWxsaW5nID0gNTsKKwl1ZHQtPnZhcmlhYmxlX2RhdGEgPSA3OworCisJLyogZm9yIHZhcmlhYmxlIGRhdGEgd2Ugc3RhcnQgd2l0aCBhIHNpemUgYW5kIHRoZSBkYXRhICovCisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgMSArIDIpOworCWRhdGFbMF0gPSAyOworCWRhdGFbMV0gPSAweDQyOworCWRhdGFbMl0gPSBvdXQtPnNjY3Bfc3NuOworCisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgMSArIDIpOworCWRhdGFbMF0gPSAyOworCWRhdGFbMV0gPSAweDQyOworCWRhdGFbMl0gPSBpbi0+c2NjcF9zc247CisKKwkvKiBjb3B5IHRoZSBwYXlsb2FkICovCisJZGF0YSA9IG1zZ2JfcHV0KG1zZywgMSArIG1zZ2JfbDNsZW4ocGF5bG9hZCkpOworCWRhdGFbMF0gPSBtc2diX2wzbGVuKHBheWxvYWQpOworCW1lbWNweSgmZGF0YVsxXSwgcGF5bG9hZC0+bDNoLCBtc2diX2wzbGVuKHBheWxvYWQpKTsKKworCXJldCA9IF9zZW5kX21zZyhtc2cpOworCW1zZ2JfZnJlZShtc2cpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfcmVhZChzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrICpjYjsKKwlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCisJaWYgKF9zY2NwX3BhcnNlX3VkdChtc2diLCAmcmVzdWx0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwljYiA9IF9maW5kX3NzbihyZXN1bHQuY2FsbGVkLnNzbik7CisJaWYgKCFjYiB8fCAhY2ItPnJlYWRfY2IpIHsKKwkJREVCVUdQKERTQ0NQLCAiTm8gcm91dGluZyBmb3IgVURUIGZvciBjYWxsZWQgU1NOOiAldVxuIiwgcmVzdWx0LmNhbGxlZC5zc24pOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogc2FuaXR5IGNoZWNrICovCisJcmV0dXJuIGNiLT5yZWFkX2NiKG1zZ2IsIG1zZ2JfbDNsZW4obXNnYiksIGNiLT5yZWFkX2NvbnRleHQpOworfQorCisvKgorICogaGFuZGxlIGNvbm5lY3Rpb24gb3JpZW50YXRlZCBtZXRob2RzCisgKi8KK3N0YXRpYyBpbnQgc291cmNlX2xvY2FsX3JlZmVyZW5jZV9pc19mcmVlKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKnJlZmVyZW5jZSkKK3sKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubmVjdGlvbiwgJnNjY3BfY29ubmVjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKG1lbWNtcChyZWZlcmVuY2UsICZjb25uZWN0aW9uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCBzaXplb2YoKnJlZmVyZW5jZSkpID09IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlX2lzX2ZyZWUoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSAqcmVmZXJlbmNlKQoreworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0aW9uLCAmc2NjcF9jb25uZWN0aW9ucywgbGlzdCkgeworCQlpZiAobWVtY21wKHJlZmVyZW5jZSwgJmNvbm5lY3Rpb24tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwgc2l6ZW9mKCpyZWZlcmVuY2UpKSA9PSAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzc2lnbl9zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RhdGljIHVfaW50MzJfdCBsYXN0X3JlZiA9IDB4MzAwMDA7CisJaW50IHdyYXBwZWQgPSAwOworCisJZG8geworCQlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlIHJlZmVyZW5jZTsKKwkJcmVmZXJlbmNlLm9jdGV0MSA9IChsYXN0X3JlZiA+PiAgMCkgJiAweGZmOworCQlyZWZlcmVuY2Uub2N0ZXQyID0gKGxhc3RfcmVmID4+ICA4KSAmIDB4ZmY7CisJCXJlZmVyZW5jZS5vY3RldDMgPSAobGFzdF9yZWYgPj4gMTYpICYgMHhmZjsKKworCQkrK2xhc3RfcmVmOworCQkvKiBkbyBub3QgdXNlIHRoZSByZXZlcnNlZCB3b3JkIGFuZCB3cmFwIGFyb3VuZCAqLworCQlpZiAoKGxhc3RfcmVmICYgMHgwMEZGRkZGRikgPT0gMHgwMEZGRkZGRikgeworCQkJREVCVUdQKERTQ0NQLCAiV3JhcHBlZCBzZWFyY2hpbmcgZm9yIGEgZnJlZSBjb2RlXG4iKTsKKwkJCWxhc3RfcmVmID0gMDsKKwkJCSsrd3JhcHBlZDsKKwkJfQorCisJCWlmIChzb3VyY2VfbG9jYWxfcmVmZXJlbmNlX2lzX2ZyZWUoJnJlZmVyZW5jZSkgPT0gMCkgeworCQkJY29ubmVjdGlvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSA9IHJlZmVyZW5jZTsKKwkJCXJldHVybiAwOworCQl9CisJfSB3aGlsZSAod3JhcHBlZCAhPSAyKTsKKworCURFQlVHUChEU0NDUCwgIkZpbmRpbmcgYSBmcmVlIHJlZmVyZW5jZSBmYWlsZWRcbiIpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IG5ld19zdGF0ZSkKK3sKKwlpbnQgb2xkX3N0YXRlID0gY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZTsKKworCWNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPSBuZXdfc3RhdGU7CisJaWYgKGNvbm5lY3Rpb24tPnN0YXRlX2NiKQorCQljb25uZWN0aW9uLT5zdGF0ZV9jYihjb25uZWN0aW9uLCBvbGRfc3RhdGUpOworfQorCitzdGF0aWMgaW50IF9zY2NwX3NlbmRfcmVmdXNlKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKnNyY19yZWYsIGludCBjYXVzZSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnYjsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlZnVzZWQgKnJlZjsKKwl1X2ludDhfdCAqZGF0YTsKKwlpbnQgcmV0OworCisJbXNnYiA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwKKwkJCQkgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3AgcmVmIik7CisJbXNnYi0+bDJoID0gJm1zZ2ItPmRhdGFbMF07CisKKwlyZWYgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWZ1c2VkICopIG1zZ2JfcHV0KG1zZ2IsIHNpemVvZigqcmVmKSk7CisJcmVmLT50eXBlID0gU0NDUF9NU0dfVFlQRV9DUkVGOworCW1lbWNweSgmcmVmLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsIHNyY19yZWYsCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisJcmVmLT5jYXVzZSA9IGNhdXNlOworCXJlZi0+b3B0aW9uYWxfc3RhcnQgPSAxOworCisJZGF0YSA9IG1zZ2JfcHV0KG1zZ2IsIDEpOworCWRhdGFbMF0gPSBTQ0NQX1BOQ19FTkRfT0ZfT1BUSU9OQUw7CisKKwlyZXQgPSBfc2VuZF9tc2cobXNnYik7CisJbXNnYl9mcmVlKG1zZ2IpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9jb25uZWN0aW9uX2NvbmZpcm0oc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdHJ1Y3QgbXNnYiAqcmVzcG9uc2U7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9jb25maXJtICpjb25maXJtOworCXVfaW50OF90ICpvcHRpb25hbF9kYXRhOworCWludCByZXQ7CisKKwlpZiAoYXNzaWduX3NvdXJjZV9sb2NhbF9yZWZlcmVuY2UoY29ubmVjdGlvbikgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJcmVzcG9uc2UgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsCisJCQkJICAgICAgIFNDQ1BfTVNHX0hFQURST09NLCAic2NjcCBjb25maXJtIik7CisJcmVzcG9uc2UtPmwyaCA9ICZyZXNwb25zZS0+ZGF0YVswXTsKKworCWNvbmZpcm0gPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9jb25maXJtICopIG1zZ2JfcHV0KHJlc3BvbnNlLCBzaXplb2YoKmNvbmZpcm0pKTsKKworCWNvbmZpcm0tPnR5cGUgPSBTQ0NQX01TR19UWVBFX0NDOworCW1lbWNweSgmY29uZmlybS0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICAmY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICBzaXplb2YoY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlKSk7CisJbWVtY3B5KCZjb25maXJtLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICAmY29ubmVjdGlvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgc2l6ZW9mKGNvbm5lY3Rpb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UpKTsKKwljb25maXJtLT5wcm90b19jbGFzcyA9IDI7CisJY29uZmlybS0+b3B0aW9uYWxfc3RhcnQgPSAxOworCisJb3B0aW9uYWxfZGF0YSA9ICh1X2ludDhfdCAqKSBtc2diX3B1dChyZXNwb25zZSwgMSk7CisJb3B0aW9uYWxfZGF0YVswXSA9IFNDQ1BfUE5DX0VORF9PRl9PUFRJT05BTDsKKworCXJldCA9IF9zZW5kX21zZyhyZXNwb25zZSk7CisJbXNnYl9mcmVlKHJlc3BvbnNlKTsKKworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm5lY3Rpb24sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9FU1RBQkxJU0hFRCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fcmVxdWVzdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLAorCQkJCQkgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKmNhbGxlZCwgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgbXNnYiAqcmVxdWVzdDsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlcXVlc3QgKnJlcTsKKwl1X2ludDhfdCAqZGF0YTsKKwl1X2ludDhfdCBleHRyYV9zaXplID0gMyArIDE7CisJaW50IHJldDsKKworCisJaWYgKG1zZyAmJiAobXNnYl9sM2xlbihtc2cpIDwgMyB8fCBtc2diX2wzbGVuKG1zZykgPiAxMzApKSB7CisJCURFQlVHUChEU0NDUCwgIkludmFsaWQgYW1vdW50IG9mIGRhdGEuLi4gJWRcbiIsIG1zZ2JfbDNsZW4obXNnKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiB0cnkgdG8gZmluZCBhIGlkICovCisJaWYgKGFzc2lnbl9zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKGNvbm5lY3Rpb24pICE9IDApIHsKKwkJREVCVUdQKERTQ0NQLCAiQXNzaWduaW5nIGEgbG9jYWwgcmVmZXJlbmNlIGZhaWxlZC5cbiIpOworCQlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0aW9uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfU0VUVVBfRVJST1IpOworCQlyZXR1cm4gLTE7CisJfQorCisKKwlpZiAobXNnKQorCQlleHRyYV9zaXplICs9IDIgKyBtc2diX2wzbGVuKG1zZyk7CisJcmVxdWVzdCA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwKKwkJCQkgICAgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3AgY29ubmVjdGlvbiByZXF1ZXN0Iik7CisJcmVxdWVzdC0+bDJoID0gJnJlcXVlc3QtPmRhdGFbMF07CisJcmVxID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCAqKSBtc2diX3B1dChyZXF1ZXN0LCBzaXplb2YoKnJlcSkpOworCisJcmVxLT50eXBlID0gU0NDUF9NU0dfVFlQRV9DUjsKKwltZW1jcHkoJnJlcS0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwgJmNvbm5lY3Rpb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgIHNpemVvZihjb25uZWN0aW9uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSk7CisJcmVxLT5wcm90b19jbGFzcyA9IDI7CisJcmVxLT52YXJpYWJsZV9jYWxsZWQgPSAyOworCXJlcS0+b3B0aW9uYWxfc3RhcnQgPSA0OworCisJLyogd3JpdGUgdGhlIGNhbGxlZCBwYXJ0eSBhZGRyZXNzICovCisJZGF0YSA9IG1zZ2JfcHV0KHJlcXVlc3QsIDEgKyAyKTsKKwlkYXRhWzBdID0gMjsKKwlkYXRhWzFdID0gMHg0MjsKKwlkYXRhWzJdID0gY2FsbGVkLT5zY2NwX3NzbjsKKworCS8qIHdyaXRlIHRoZSBwYXlsb2FkICovCisJaWYgKG1zZykgeworCSAgICBkYXRhID0gbXNnYl9wdXQocmVxdWVzdCwgMiArIG1zZ2JfbDNsZW4obXNnKSk7CisJICAgIGRhdGFbMF0gPSBTQ0NQX1BOQ19EQVRBOworCSAgICBkYXRhWzFdID0gbXNnYl9sM2xlbihtc2cpOworCSAgICBtZW1jcHkoJmRhdGFbMl0sIG1zZy0+bDNoLCBtc2diX2wzbGVuKG1zZykpOworCX0KKworCWRhdGEgPSBtc2diX3B1dChyZXF1ZXN0LCAxKTsKKwlkYXRhWzBdID0gU0NDUF9QTkNfRU5EX09GX09QVElPTkFMOworCisJbGxpc3RfYWRkX3RhaWwoJmNvbm5lY3Rpb24tPmxpc3QsICZzY2NwX2Nvbm5lY3Rpb25zKTsKKwlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0aW9uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVRVUVTVCk7CisKKwlyZXQgPSBfc2VuZF9tc2cocmVxdWVzdCk7CisJbXNnYl9mcmVlKHJlcXVlc3QpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fZGF0YShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgbXNnYiAqX2RhdGEpCit7CisJc3RydWN0IG1zZ2IgKm1zZ2I7CisJc3RydWN0IHNjY3BfZGF0YV9mb3JtMSAqZHQxOworCXVfaW50OF90ICpkYXRhOworCWludCBleHRyYV9zaXplOworCWludCByZXQ7CisKKwlpZiAobXNnYl9sM2xlbihfZGF0YSkgPCAyIHx8IG1zZ2JfbDNsZW4oX2RhdGEpID4gMjU2KSB7CisJCURFQlVHUChEU0NDUCwgImRhdGEgc2l6ZSB0b28gYmlnLCBzZWdtZW50aW5nIHVuaW1wbGVtZW50ZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWV4dHJhX3NpemUgPSAxICsgbXNnYl9sM2xlbihfZGF0YSk7CisJbXNnYiA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwKKwkJCQkgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3AgZHQxIik7CisJbXNnYi0+bDJoID0gJm1zZ2ItPmRhdGFbMF07CisKKwlkdDEgPSAoc3RydWN0IHNjY3BfZGF0YV9mb3JtMSAqKSBtc2diX3B1dChtc2diLCBzaXplb2YoKmR0MSkpOworCWR0MS0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfRFQxOworCW1lbWNweSgmZHQxLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsICZjb25uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisJZHQxLT5zZWdtZW50aW5nID0gMDsKKworCS8qIGNvcHkgdGhlIGRhdGEgKi8KKwlkdDEtPnZhcmlhYmxlX3N0YXJ0ID0gMTsKKwlkYXRhID0gbXNnYl9wdXQobXNnYiwgZXh0cmFfc2l6ZSk7CisJZGF0YVswXSA9IGV4dHJhX3NpemUgLSAxOworCW1lbWNweSgmZGF0YVsxXSwgX2RhdGEtPmwzaCwgZXh0cmFfc2l6ZSAtIDEpOworCisJcmV0ID0gX3NlbmRfbXNnKG1zZ2IpOworCW1zZ2JfZnJlZShtc2diKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9jb25uZWN0aW9uX2l0KHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJc3RydWN0IG1zZ2IgKm1zZ2I7CisJc3RydWN0IHNjY3BfZGF0YV9pdCAqaXQ7CisJaW50IHJldDsKKworCW1zZ2IgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsCisJCQkJICAgU0NDUF9NU0dfSEVBRFJPT00sICJzY2NwIGl0Iik7CisJbXNnYi0+bDJoID0gJm1zZ2ItPmRhdGFbMF07CisJaXQgPSAoc3RydWN0IHNjY3BfZGF0YV9pdCAqKSBtc2diX3B1dChtc2diLCBzaXplb2YoKml0KSk7CisJaXQtPnR5cGUgPSBTQ0NQX01TR19UWVBFX0lUOworCW1lbWNweSgmaXQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwgJmNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKwltZW1jcHkoJml0LT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCAmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKworCWl0LT5wcm90b19jbGFzcyA9IDB4MjsKKwlpdC0+c2VxdWVuY2luZ1swXSA9IGl0LT5zZXF1ZW5jaW5nWzFdID0gMDsKKwlpdC0+Y3JlZGl0ID0gMDsKKworCXJldCA9IF9zZW5kX21zZyhtc2diKTsKKwltc2diX2ZyZWUobXNnYik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fcmVsZWFzZWQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgaW50IGNhdXNlKQoreworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCAqcmVsOworCXVfaW50OF90ICpkYXRhOworCWludCByZXQ7CisKKwltc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsIFNDQ1BfTVNHX0hFQURST09NLAorCQkJCSAgInNjY3A6IGNvbm5lY3Rpb24gcmVsZWFzZWQiKTsKKwltc2ctPmwyaCA9ICZtc2ctPmRhdGFbMF07CisJcmVsID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZWQgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKnJlbCkpOworCXJlbC0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfUkxTRDsKKwlyZWwtPnJlbGVhc2VfY2F1c2UgPSBjYXVzZTsKKworCS8qIGNvcHkgdGhlIHNvdXJjZSByZWZlcmVuY2VzICovCisJbWVtY3B5KCZyZWwtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwgJmNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKwltZW1jcHkoJnJlbC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwgJmNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisKKwlkYXRhID0gbXNnYl9wdXQobXNnLCAxKTsKKwlkYXRhWzBdID0gU0NDUF9QTkNfRU5EX09GX09QVElPTkFMOworCisJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFTEVBU0UpOworCXJldCA9IF9zZW5kX21zZyhtc2cpOworCW1zZ2JfZnJlZShtc2cpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE9wZW4gYSBjb25uZWN0aW9uLiBUaGUgZm9sbG93aW5nIGlzIGdvaW5nIHRvIGhhcHBlbjoKKyAqCisgKgktIFZlcmlmeSB0aGUgcGFja2V0LCBlLmcuIHRoYXQgd2UgaGF2ZSBubyBvdGhlciBjb25uZWN0aW9uCisgKgkgIHRoYXQgaWQuCisgKiAgICAgIC0gQXNrIHRoZSB1c2VyIGlmIGhlIHdhbnRzIHRvIGFjY2VwdCB0aGUgY29ubmVjdGlvbgorICogICAgICAtIFRyeSB0byBvcGVuIHRoZSBjb25uZWN0aW9uIGJ5IGFzc2lnbmluZyBhIHNvdXJjZSBsb2NhbCByZWZlcmVuY2UKKyAqICAgICAgICBhbmQgc2VuZGluZyB0aGUgcGFja2V0CisgKi8KK3N0YXRpYyBpbnQgX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fcmVxdWVzdChzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCisJc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayAqY2I7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworCWlmIChfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlcXVlc3QobXNnYiwgJnJlc3VsdCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJY2IgPSBfZmluZF9zc24ocmVzdWx0LmNhbGxlZC5zc24pOworCWlmICghY2IgfHwgIWNiLT5hY2NlcHRfY2IpIHsKKwkJREVCVUdQKERTQ0NQLCAiTm8gcm91dGluZyBmb3IgQ1IgZm9yIGNhbGxlZCBTU046ICV1XG4iLCByZXN1bHQuY2FsbGVkLnNzbik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBjaGVjayBpZiB0aGUgc3lzdGVtIHdhbnRzIHRoaXMgY29ubmVjdGlvbiAqLworCWNvbm5lY3Rpb24gPSB0YWxsb2NfemVybyh0YWxsX3NjY3BfY3R4LCBzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uKTsKKwlpZiAoIWNvbm5lY3Rpb24pIHsKKwkJREVCVUdQKERTQ0NQLCAiQWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBzYW5pdHkgY2hlY2tzOgorCSAqCS0gSXMgdGhlIHNvdXJjZV9sb2NhbF9yZWZlcmVuY2UgaW4gYW55IG90aGVyIGNvbm5lY3Rpb24/CisJICogdGhlbiB3aWxsIGNhbGwgYWNjZXB0LCBhc3NpZ24gYSAiZGVzdGluYXRpb24iIGxvY2FsIHJlZmVyZW5jZQorCSAqIGFuZCBzZW5kIGEgY29ubmVjdGlvbiBjb25maXJtLCBvdGhlcndpc2Ugd2Ugd2lsbCBzZW5kIGEgcmVmdXNlZWQKKwkgKiBvbmUuLi4uCisJICovCisJaWYgKGRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZV9pc19mcmVlKHJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSAhPSAwKSB7CisJCURFQlVHUChEU0NDUCwgIk5lZWQgdG8gcmVqZWN0IGNvbm5lY3Rpb24gd2l0aCBleGlzdGluZyByZWZlcmVuY2VcbiIpOworCQlfc2NjcF9zZW5kX3JlZnVzZShyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZSwgU0NDUF9SRUZVU0FMX1NDQ1BfRkFJTFVSRSk7CisJCXRhbGxvY19mcmVlKGNvbm5lY3Rpb24pOworCQlyZXR1cm4gLTE7CisJfQorCisJY29ubmVjdGlvbi0+aW5jb21pbmcgPSAxOworCWNvbm5lY3Rpb24tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICpyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKworCWlmIChjYi0+YWNjZXB0X2NiKGNvbm5lY3Rpb24sIGNiLT5hY2NlcHRfY29udGV4dCkgIT0gMCkgeworCQlfc2NjcF9zZW5kX3JlZnVzZShyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZSwgU0NDUF9SRUZVU0FMX0VORF9VU0VSX09SSUdJTkFURUQpOworCQlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0aW9uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVGVVNFRCk7CisJCXRhbGxvY19mcmVlKGNvbm5lY3Rpb24pOworCQlyZXR1cm4gMDsKKwl9CisKKworCWxsaXN0X2FkZF90YWlsKCZjb25uZWN0aW9uLT5saXN0LCAmc2NjcF9jb25uZWN0aW9ucyk7CisKKwlpZiAoX3NjY3Bfc2VuZF9jb25uZWN0aW9uX2NvbmZpcm0oY29ubmVjdGlvbikgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJTZW5kaW5nIGNvbmZpcm0gZmFpbGVkLi4uIG5vIGF2YWlsYWJsZSBzb3VyY2UgcmVmZXJlbmNlP1xuIik7CisKKwkJX3NjY3Bfc2VuZF9yZWZ1c2UocmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsIFNDQ1BfUkVGVVNBTF9TQ0NQX0ZBSUxVUkUpOworCQlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uZWN0aW9uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVGVVNFRCk7CisJCWxsaXN0X2RlbCgmY29ubmVjdGlvbi0+bGlzdCk7CisJCXRhbGxvY19mcmVlKGNvbm5lY3Rpb24pOworCisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIElmIHdlIGhhdmUgZGF0YSBsZXQgdXMgZm9yd2FyZCB0aGluZ3MuCisJICovCisJaWYgKHJlc3VsdC5kYXRhX2xlbiAhPSAwICYmIGNvbm5lY3Rpb24tPmRhdGFfY2IpIHsKKwkJY29ubmVjdGlvbi0+ZGF0YV9jYihjb25uZWN0aW9uLCBtc2diLCByZXN1bHQuZGF0YV9sZW4pOworCX0KKworCXJldHVybiAwOworfQorCisvKiBIYW5kbGUgdGhlIHJlbGVhc2UgY29uZmlybWVkICovCitzdGF0aWMgaW50IF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uOworCisJaWYgKF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZShtc2diLCAmcmVzdWx0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBmaW5kIHRoZSBjb25uZWN0aW9uICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJnNjY3BfY29ubmVjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKGNvbm4tPmRhdGFfY2IKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpID09IDAKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgcmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlKSkgPT0gMCkgeworCQkgICAgZ290byBmb3VuZDsKKwkJfQorCX0KKworCisJREVCVUdQKERTQ0NQLCAiUmVsZWFzZSBjb21wbGV0ZSBvZiB1bmtub3duIGNvbm5lY3Rpb25cbiIpOworCXJldHVybiAtMTsKKworZm91bmQ6CisJbGxpc3RfZGVsKCZjb25uLT5saXN0KTsKKwlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEhhbmRsZSB0aGUgRGF0YSBGb3JtIDEgbWVzc2FnZSAqLworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9kdDEoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uOworCisJaWYgKF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fZHQxKG1zZ2IsICZyZXN1bHQpICE9IDApCisJCXJldHVybiAtMTsKKworCS8qIGxvb2t1cCBpZiB3ZSBoYXZlIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiByZWZlcmVuY2UgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uLCAmc2NjcF9jb25uZWN0aW9ucywgbGlzdCkgeworCQlpZiAoY29ubi0+ZGF0YV9jYgorCQkgICAgJiYgbWVtY21wKCZjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgcmVzdWx0LmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHNpemVvZihjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSkgPT0gMCkgeworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKworCURFQlVHUChEU0NDUCwgIk5vIGNvbm5lY3Rpb24gZm91bmQgZm9yIGR0MSBkYXRhXG4iKTsKKwlyZXR1cm4gLTE7CisKK2ZvdW5kOgorCWNvbm4tPmRhdGFfY2IoY29ubiwgbXNnYiwgcmVzdWx0LmRhdGFfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworLyogY29uZmlybSBhIGNvbm5lY3Rpb24gcmVsZWFzZSAqLworc3RhdGljIGludCBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXN0cnVjdCBtc2diICptc2diOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZSAqcmxjOworCWludCByZXQ7CisKKwltc2diID0gbXNnYl9hbGxvY19oZWFkcm9vbShTQ0NQX01TR19TSVpFLAorCQkJCSAgIFNDQ1BfTVNHX0hFQURST09NLCAic2NjcCBybGMiKTsKKwltc2diLT5sMmggPSAmbXNnYi0+ZGF0YVswXTsKKworCXJsYyA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUgKikgbXNnYl9wdXQobXNnYiwgc2l6ZW9mKCpybGMpKTsKKwlybGMtPnR5cGUgPSBTQ0NQX01TR19UWVBFX1JMQzsKKwltZW1jcHkoJnJsYy0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICAmY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLCBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpOworCW1lbWNweSgmcmxjLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICAmY29ubmVjdGlvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKworCXJldCA9IF9zZW5kX21zZyhtc2diKTsKKwltc2diX2ZyZWUobXNnYik7CisKKwkvKgorCSAqIFJlbW92ZSBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZSBjb25uZWN0aW9ucyBhbmQgc2V0IHRoZSBzdGF0ZS4gVXNlciBjb2RlCisJICogc2hvdWxkIG5vdyBmcmVlIHRoZSBlbnRyeS4KKwkgKi8KKwlsbGlzdF9kZWwoJmNvbm5lY3Rpb24tPmxpc3QpOworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm5lY3Rpb24sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIGNvbm5lY3Rpb24gcmVsZWFzZWQsIHNlbmQgYSByZWxlYXNlZCBjb25maXJtICovCitzdGF0aWMgaW50IF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlbGVhc2VkKHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubjsKKworCWlmIChfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlbGVhc2VkKG1zZ2IsICZyZXN1bHQpID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwkvKiBsb29rdXAgaWYgd2UgaGF2ZSBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcmVmZXJlbmNlICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJnNjY3BfY29ubmVjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKGNvbm4tPmRhdGFfY2IKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpID09IDAKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgcmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlKSkgPT0gMCkgeworCQkgICAgZ290byBmb3VuZDsKKwkJfQorCX0KKworCisJREVCVUdQKERTQ0NQLCAiVW5rbm93biBjb25uZWN0aW9uIHdhcyByZWxlYXNlZC5cbiIpOworCXJldHVybiAtMTsKKworCS8qIHdlIGhhdmUgZm91bmQgYSBjb25uZWN0aW9uICovCitmb3VuZDoKKwkvKiBvcHRpb25hbCBkYXRhICovCisJaWYgKHJlc3VsdC5kYXRhX2xlbiAhPSAwICYmIGNvbm4tPmRhdGFfY2IpIHsKKwkJY29ubi0+ZGF0YV9jYihjb25uLCBtc2diLCByZXN1bHQuZGF0YV9sZW4pOworCX0KKworCS8qIGdlbmVyYXRlIGEgcmVzcG9uc2UgKi8KKwlpZiAoX3NjY3Bfc2VuZF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUoY29ubikgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJTZW5kaW5nIHJlbGVhc2UgY29uZmlybWVkIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZWZ1c2VkKHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubjsKKworCWlmIChfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlZnVzZWQobXNnYiwgJnJlc3VsdCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJLyogbG9va3VwIGlmIHdlIGhhdmUgYSBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIHJlZmVyZW5jZSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm4sICZzY2NwX2Nvbm5lY3Rpb25zLCBsaXN0KSB7CisJCWlmIChjb25uLT5pbmNvbWluZyA9PSAwICYmIGNvbm4tPmRhdGFfY2IKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpID09IDApIHsKKwkJICAgIGdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwlERUJVR1AoRFNDQ1AsICJSZWZ1c2VkIGJ1dCBubyBjb25uZWN0aW9uIGZvdW5kXG4iKTsKKwlyZXR1cm4gLTE7CisKK2ZvdW5kOgorCS8qIG9wdGlvbmFsIGRhdGEgKi8KKwlpZiAocmVzdWx0LmRhdGFfbGVuICE9IDAgJiYgY29ubi0+ZGF0YV9jYikgeworCQljb25uLT5kYXRhX2NiKGNvbm4sIG1zZ2IsIHJlc3VsdC5kYXRhX2xlbik7CisJfQorCisKKwlsbGlzdF9kZWwoJmNvbm4tPmxpc3QpOworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm4sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUZVU0VEKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9jb25maXJtKHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubjsKKworCWlmIChfc2NjcF9wYXJzZV9jb25uZWN0aW9uX2NvbmZpcm0obXNnYiwgJnJlc3VsdCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJLyogbG9va3VwIGlmIHdlIGhhdmUgYSBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIHJlZmVyZW5jZSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm4sICZzY2NwX2Nvbm5lY3Rpb25zLCBsaXN0KSB7CisJCWlmIChjb25uLT5pbmNvbWluZyA9PSAwICYmIGNvbm4tPmRhdGFfY2IKKwkJICAgICYmIG1lbWNtcCgmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHJlc3VsdC5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICBzaXplb2YoY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpID09IDApIHsKKwkJICAgIGdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwlERUJVR1AoRFNDQ1AsICJDb25maXJtZWQgYnV0IG5vIGNvbm5lY3Rpb24gZm91bmRcbiIpOworCXJldHVybiAtMTsKKworZm91bmQ6CisJLyogY29weSB0aGUgYWRkcmVzc2VzIG9mIHRoZSBjb25uZWN0aW9uICovCisJY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gKnJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm4sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9FU1RBQkxJU0hFRCk7CisKKwkvKiBvcHRpb25hbCBkYXRhICovCisJaWYgKHJlc3VsdC5kYXRhX2xlbiAhPSAwICYmIGNvbm4tPmRhdGFfY2IpIHsKKwkJY29ubi0+ZGF0YV9jYihjb25uLCBtc2diLCByZXN1bHQuZGF0YV9sZW4pOworCX0KKworCXJldHVybiAwOworfQorCisKK2ludCBzY2NwX3N5c3RlbV9pbml0KGludCAoKm91dGdvaW5nKShzdHJ1Y3QgbXNnYiAqZGF0YSwgdm9pZCAqY3R4KSwgdm9pZCAqY3R4KQoreworCXNjY3Bfc3lzdGVtLndyaXRlX2RhdGEgPSBvdXRnb2luZzsKKwlzY2NwX3N5c3RlbS53cml0ZV9jb250ZXh0ID0gY3R4OworCisJcmV0dXJuIDA7Cit9CisKKy8qIG9oIG15IGdvZCBhIHJlYWwgU0NDUCBwYWNrZXQuIG5lZWQgdG8gZGlzcGF0Y2ggaXQgbm93ICovCitpbnQgc2NjcF9zeXN0ZW1faW5jb21pbmcoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCAxICkgeworCQlERUJVR1AoRFNDQ1AsICJUb28gc2hvcnQgcGFja2V0XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWludCB0eXBlID0gbXNnYi0+bDJoWzBdOworCisJc3dpdGNoKHR5cGUpIHsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfQ1I6CisJCXJldHVybiBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZXF1ZXN0KG1zZ2IpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfUkxTRDoKKwkJcmV0dXJuIF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlbGVhc2VkKG1zZ2IpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfQ1JFRjoKKwkJcmV0dXJuIF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlZnVzZWQobXNnYik7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9DQzoKKwkJcmV0dXJuIF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX2NvbmZpcm0obXNnYik7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9STEM6CisJCXJldHVybiBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKG1zZ2IpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfRFQxOgorCQlyZXR1cm4gX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fZHQxKG1zZ2IpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfVURUOgorCQlyZXR1cm4gX3NjY3BfaGFuZGxlX3JlYWQobXNnYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChEU0NDUCwgInVuaW1wbGVtZW50ZWQgbXNnIHR5cGU6ICVkXG4iLCB0eXBlKTsKKwl9OworCisJcmV0dXJuIC0xOworfQorCisvKiBjcmVhdGUgYSBwYWNrZXQgZnJvbSB0aGUgZGF0YSAqLworaW50IHNjY3BfY29ubmVjdGlvbl93cml0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgbXNnYiAqZGF0YSkKK3sKKwlpZiAoY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA8IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9DT05GSVJNCisJICAgIHx8IGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPiBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfRVNUQUJMSVNIRUQpIHsKKwkJREVCVUdQKERTQ0NQLCAic2NjcF9jb25uZWN0aW9uX3dyaXRlOiBXcm9uZyBjb25uZWN0aW9uIHN0YXRlOiAlcCAlZFxuIiwKKwkJICAgICAgIGNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIF9zY2NwX3NlbmRfY29ubmVjdGlvbl9kYXRhKGNvbm5lY3Rpb24sIGRhdGEpOworfQorCisvKgorICogU2VuZCBhIEluYWN0aXZpdHkgVGVzdCBtZXNzYWdlLiBUaGUgb3duZXIgb2YgdGhlIGNvbm5lY3Rpb24KKyAqIHNob3VsZCBzdGFydCBhIHRpbWVyIGFuZCBjYWxsIHRoaXMgbWV0aG9kIHJlZ3VsYXJpbHkuIENhbGxpbmcKKyAqIHRoaXMgZXZlcnkgNjAgc2Vjb25kcyBzaG91bGQgYmUgZ29vZCBlbm91Z2guCisgKi8KK2ludCBzY2NwX2Nvbm5lY3Rpb25fc2VuZF9pdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCWlmIChjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlIDwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX0NPTkZJUk0KKwkgICAgfHwgY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA+IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9FU1RBQkxJU0hFRCkgeworCQlERUJVR1AoRFNDQ1AsICJzY2NwX2Nvbm5lY3Rpb25fd3JpdGU6IFdyb25nIGNvbm5lY3Rpb24gc3RhdGU6ICVwICVkXG4iLAorCQkgICAgICAgY29ubmVjdGlvbiwgY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gX3NjY3Bfc2VuZF9jb25uZWN0aW9uX2l0KGNvbm5lY3Rpb24pOworfQorCisvKiBzZW5kIGEgY29ubmVjdGlvbiByZWxlYXNlIGFuZCB3YWl0IGZvciB0aGUgY29ubmVjdGlvbiByZWxlYXNlZCAqLworaW50IHNjY3BfY29ubmVjdGlvbl9jbG9zZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBpbnQgY2F1c2UpCit7CisJaWYgKGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfQ09ORklSTQorCSAgICB8fCBjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlID4gU0NDUF9DT05ORUNUSU9OX1NUQVRFX0VTVEFCTElTSEVEKSB7CisJCURFQlVHUEMoRFNDQ1AsICJDYW4gbm90IGNsb3NlIHRoZSBjb25uZWN0aW9uLiBJdCB3YXMgbmV2ZXIgb3BlbmVkOiAlcCAlZFxuIiwKKwkJCWNvbm5lY3Rpb24sIGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIF9zY2NwX3NlbmRfY29ubmVjdGlvbl9yZWxlYXNlZChjb25uZWN0aW9uLCBjYXVzZSk7Cit9CisKK2ludCBzY2NwX2Nvbm5lY3Rpb25fZnJlZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCWlmIChjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlID4gU0NDUF9DT05ORUNUSU9OX1NUQVRFX05PTkUKKwkgICAgJiYgY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA8IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFKSB7CisJCURFQlVHUChEU0NDUCwgIlRoZSBjb25uZWN0aW9uIG5lZWRzIHRvIGJlIHJlbGVhc2VkIGJlZm9yZSBpdCBpcyBmcmVlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJdGFsbG9jX2ZyZWUoY29ubmVjdGlvbik7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKnNjY3BfY29ubmVjdGlvbl9zb2NrZXQodm9pZCkKK3sKKwlyZXR1cm4gdGFsbG9jX3plcm8odGFsbF9zY2NwX2N0eCwgc3RydWN0IHNjY3BfY29ubmVjdGlvbik7Cit9CisKK2ludCBzY2NwX2Nvbm5lY3Rpb25fY29ubmVjdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLAorCQkJICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpsb2NhbCwKKwkJCSAgICBzdHJ1Y3QgbXNnYiAqZGF0YSkKK3sKKwlyZXR1cm4gX3NjY3Bfc2VuZF9jb25uZWN0aW9uX3JlcXVlc3QoY29ubiwgbG9jYWwsIGRhdGEpOworfQorCitpbnQgc2NjcF9jb25uZWN0aW9uX3NldF9pbmNvbWluZyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqc29jaywKKwkJCQkgaW50ICgqYWNjZXB0X2NiKShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICosIHZvaWQgKiksIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayAqY2I7CisKKwlpZiAoIXNvY2spCisJCXJldHVybiAtMjsKKworCWNiID0gX2ZpbmRfc3NuKHNvY2stPnNjY3Bfc3NuKTsKKwlpZiAoIWNiKQorCQlyZXR1cm4gLTE7CisKKwljYi0+YWNjZXB0X2NiID0gYWNjZXB0X2NiOworCWNiLT5hY2NlcHRfY29udGV4dCA9IGNvbnRleHQ7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzY2NwX3dyaXRlKHN0cnVjdCBtc2diICpkYXRhLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqaW4sCisJICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpvdXQsIGludCBjbGFzcykKK3sKKwlyZXR1cm4gX3NjY3Bfc2VuZF9kYXRhKGNsYXNzLCBpbiwgb3V0LCBkYXRhKTsKK30KKworaW50IHNjY3Bfc2V0X3JlYWQoY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNvY2ssCisJCSAgaW50ICgqcmVhZF9jYikoc3RydWN0IG1zZ2IgKiwgdW5zaWduZWQgaW50LCB2b2lkICopLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2sgKmNiOworCisJaWYgKCFzb2NrKQorCQlyZXR1cm4gLTI7CisKKwljYiAgPSBfZmluZF9zc24oc29jay0+c2NjcF9zc24pOworCWlmICghY2IpCisJCXJldHVybiAtMTsKKworCWNiLT5yZWFkX2NiID0gcmVhZF9jYjsKKwljYi0+cmVhZF9jb250ZXh0ID0gY29udGV4dDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkgPD0gc2l6ZW9mKHVfaW50MzJfdCksIGVub3VnaF9zcGFjZSk7CisKK3VfaW50MzJfdCBzY2NwX3NyY19yZWZfdG9faW50KHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKnJlZikKK3sKKwl1X2ludDMyX3Qgc3JjX3JlZiA9IDA7CisJbWVtY3B5KCZzcmNfcmVmLCByZWYsIHNpemVvZigqcmVmKSk7CisJcmV0dXJuIHNyY19yZWY7Cit9CisKK3N0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2Ugc2NjcF9zcmNfcmVmX2Zyb21faW50KHVfaW50MzJfdCBpbnRfcmVmKQoreworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgcmVmOworCW1lbWNweSgmcmVmLCAmaW50X3JlZiwgc2l6ZW9mKHJlZikpOworCXJldHVybiByZWY7Cit9CisKK2ludCBzY2NwX2RldGVybWluZV9tc2dfdHlwZShzdHJ1Y3QgbXNnYiAqbXNnKQoreworCWlmIChtc2diX2wybGVuKG1zZykgPCAxKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gbXNnLT5sMmhbMF07Cit9CisKK2ludCBzY2NwX3BhcnNlX2hlYWRlcihzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlpbnQgdHlwZTsKKworCWlmIChtc2diX2wybGVuKG1zZykgPCAxKQorCQlyZXR1cm4gLTE7CisKKwl0eXBlID0gbXNnLT5sMmhbMF07CisJc3dpdGNoKHR5cGUpIHsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfQ1I6CisJCXJldHVybiBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlcXVlc3QobXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfUkxTRDoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVsZWFzZWQobXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfQ1JFRjoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVmdXNlZChtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9DQzoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fY29uZmlybShtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9STEM6CisJCXJldHVybiBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUobXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfRFQxOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9kdDEobXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfVURUOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfdWR0KG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX0lUOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfaXQobXNnLCByZXN1bHQpOworCQlicmVhazsKKwl9OworCisJTE9HUChEU0NDUCwgTE9HTF9FUlJPUiwgIlVuaW1wbGVtZW50ZWQgTVNHIFR5cGU6IDB4JXhcbiIsIHR5cGUpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZCBvbl9kc29fbG9hZCh2b2lkKQoreworCXRhbGxfc2NjcF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMSwgInNjY3AiKTsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKGRlc3RydWN0b3IpKSB2b2lkIG9uX2Rzb191bmxvYWQodm9pZCkKK3sKKwl0YWxsb2NfcmVwb3J0X2Z1bGwodGFsbF9zY2NwX2N0eCwgc3RkZXJyKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3NpbGVudF9jYWxsLmMgYi9vcGVuYnNjL3NyYy9zaWxlbnRfY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDUzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9zaWxlbnRfY2FsbC5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKiBHU00gc2lsZW50IGNhbGwgZmVhdHVyZSAqLworCisvKgorICogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKworLyogcGFnaW5nIG9mIHRoZSByZXF1ZXN0ZWQgc3Vic2NyaWJlciBoYXMgY29tcGxldGVkICovCitzdGF0aWMgaW50IHBhZ2luZ19jYl9zaWxlbnQodW5zaWduZWQgaW50IGhvb2tudW0sIHVuc2lnbmVkIGludCBldmVudCwKKwkJCSAgICBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpfbGNoYW4sIHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlcl9jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gX2xjaGFuOworCXN0cnVjdCBzY2FsbF9zaWduYWxfZGF0YSBzaWdkYXRhOworCWludCByYzsKKworCWlmIChob29rbnVtICE9IEdTTV9IT09LX1JSX1BBR0lORykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlERUJVR1AoRFNNUywgInBhZ2luZ19jYl9zaWxlbnQ6ICIpOworCisJY29ubiA9ICZsY2hhbi0+Y29ubjsKKworCXNpZ2RhdGEubGNoYW4gPSBsY2hhbjsKKwlzaWdkYXRhLmRhdGEgPSBfZGF0YTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEdTTV9QQUdJTkdfU1VDQ0VFREVEOgorCQlERUJVR1BDKERTTVMsICJzdWNjZXNzLCB1c2luZyBUaW1lc2xvdCAldSBvbiBBUkZDTiAldVxuIiwKKwkJCWxjaGFuLT50cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5hcmZjbik7CisJCWNvbm4tPnNpbGVudF9jYWxsID0gMTsKKwkJLyogaW5jcmVtZW50IGxjaGFuIHJlZmVyZW5jZSBjb3VudCAqLworCQlkaXNwYXRjaF9zaWduYWwoU1NfU0NBTEwsIFNfU0NBTExfU1VDQ0VTUywgJnNpZ2RhdGEpOworCQl1c2Vfc3Vic2NyX2Nvbihjb25uKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fUEFHSU5HX0VYUElSRUQ6CisJCURFQlVHUChEU01TLCAiZXhwaXJlZFxuIik7CisJCWRpc3BhdGNoX3NpZ25hbChTU19TQ0FMTCwgU19TQ0FMTF9FWFBJUkVELCAmc2lnZGF0YSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiByZWNlaXZlIGEgbGF5ZXIgMyBtZXNzYWdlIGZyb20gYSBzaWxlbnQgY2FsbCAqLworaW50IHNpbGVudF9jYWxsX3J4KHN0cnVjdCBtc2diICptc2cpCit7CisJLyogRklYTUU6IGRvIHNvbWV0aGluZyBsaWtlIHNlbmRpbmcgaXQgdGhyb3VnaCBhIFVEUCBwb3J0ICovCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBtc2dfbWF0Y2ggeworCXVfaW50OF90IHBkaXNjOworCXVfaW50OF90IG1zZ190eXBlOworfTsKKworLyogbGlzdCBvZiBtZXNzYWdlcyB0aGF0IGFyZSBoYW5kbGVkIGluc2lkZSBPcGVuQlNDLCBldmVuIGluIGEgc2lsZW50IGNhbGwgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXNnX21hdGNoIHNpbGVudF9jYWxsX2FjY2VwdFtdID0geworCXsgR1NNNDhfUERJU0NfTU0sIEdTTTQ4X01UX01NX0xPQ19VUERfUkVRVUVTVCB9LAorCXsgR1NNNDhfUERJU0NfTU0sIEdTTTQ4X01UX01NX0NNX1NFUlZfUkVRIH0sCit9OworCisvKiBkZWNpZGUgaWYgd2UgbmVlZCB0byByZXJvdXRlIGEgbWVzc2FnZSBhcyBwYXJ0IG9mIGEgc2lsZW50IGNhbGwgKi8KK2ludCBzaWxlbnRfY2FsbF9yZXJvdXRlKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgcGRpc2MgPSBnaC0+cHJvdG9fZGlzY3IgJiAweDBmOworCWludCBpOworCisJLyogaWYgd2UncmUgbm90IHBhcnQgb2YgYSBzaWxlbnQgY2FsbCwgbmV2ZXIgcmVyb3V0ZSAqLworCWlmICghbXNnLT5sY2hhbi0+Y29ubi5zaWxlbnRfY2FsbCkKKwkJcmV0dXJuIDA7CisKKwkvKiBjaGVjayBpZiB3ZSBhcmUgYSBzcGVjaWFsIG1lc3NhZ2UgdGhhdCBpcyBoYW5kbGVkIGluIG9wZW5ic2MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzaWxlbnRfY2FsbF9hY2NlcHQpOyBpKyspIHsKKwkJaWYgKHNpbGVudF9jYWxsX2FjY2VwdFtpXS5wZGlzYyA9PSBwZGlzYyAmJgorCQkgICAgc2lsZW50X2NhbGxfYWNjZXB0W2ldLm1zZ190eXBlID09IGdoLT5tc2dfdHlwZSkKKwkJCXJldHVybiAwOworCX0KKworCS8qIG90aGVyd2lzZSwgcmVyb3V0ZSAqLworCXJldHVybiAxOworfQorCisKKy8qIGluaXRpYXRlIGEgc2lsZW50IGNhbGwgd2l0aCBhIGdpdmVuIHN1YnNjcmliZXIgKi8KK2ludCBnc21fc2lsZW50X2NhbGxfc3RhcnQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsIHZvaWQgKmRhdGEsIGludCB0eXBlKQoreworCWludCByYzsKKworCXJjID0gcGFnaW5nX3JlcXVlc3Qoc3Vic2NyLT5uZXQsIHN1YnNjciwgdHlwZSwKKwkJCSAgICBwYWdpbmdfY2Jfc2lsZW50LCBkYXRhKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGVuZCBhIHNpbGVudCBjYWxsIHdpdGggYSBnaXZlbiBzdWJzY3JpYmVyICovCitpbnQgZ3NtX3NpbGVudF9jYWxsX3N0b3Aoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm47CisKKwlsY2hhbiA9IGxjaGFuX2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKwlpZiAoIWxjaGFuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGRpZCB3ZSBhY3R1YWxseSBlc3RhYmxpc2ggYSBzaWxlbnQgY2FsbCBmb3IgdGhpcyBndXk/ICovCisJY29ubiA9ICZsY2hhbi0+Y29ubjsKKwlpZiAoIWNvbm4tPnNpbGVudF9jYWxsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXB1dF9zdWJzY3JfY29uKGNvbm4pOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9zdWJjaGFuX2RlbXV4LmMgYi9vcGVuYnNjL3NyYy9zdWJjaGFuX2RlbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ2YzFmZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3N1YmNoYW5fZGVtdXguYwpAQCAtMCwwICsxLDMyMiBAQAorLyogQSBFMSBzdWItY2hhbm5lbCAoZGUpbXVsdGlwbGV4ZXIgd2l0aCBUUkFVIGZyYW1lIHN5bmMgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9zdWJjaGFuX2RlbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X2ZyYW1lLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKwordm9pZCAqdGFsbF90cWVfY3R4OworCitzdGF0aWMgaW5saW5lIHZvaWQgYXBwZW5kX2JpdChzdHJ1Y3QgZGVtdXhfc3ViY2ggKnNjaCwgdV9pbnQ4X3QgYml0KQoreworCXNjaC0+b3V0X2JpdGJ1ZltzY2gtPm91dF9pZHgrK10gPSBiaXQ7Cit9CisKKyNkZWZpbmUgU1lOQ19IRFJfQklUUwkxNgorc3RhdGljIGNvbnN0IHVfaW50OF90IG51bGxieXRlc1tTWU5DX0hEUl9CSVRTXTsKKworLyogY2hlY2sgaWYgd2UgaGF2ZSBqdXN0IGNvbXBsZXRlZCB0aGUgMTYgYml0IHplcm8gc3luYyBoZWFkZXIsCisgKiBpbiBhY2NvcmRhbmNlIHdpdGggR1NNIFRTIDA4LjYwIENoYXB0ZXIgNC44LjEgKi8KK3N0YXRpYyBpbnQgc3luY19oZHJfY29tcGxldGUoc3RydWN0IGRlbXV4X3N1YmNoICpzY2gsIHVfaW50OF90IGJpdCkKK3sKKwlpZiAoYml0ID09IDApCisJCXNjaC0+Y29uc2VjdXRpdmVfemVyb3MrKzsKKwllbHNlCisJCXNjaC0+Y29uc2VjdXRpdmVfemVyb3MgPSAwOworCisJaWYgKHNjaC0+Y29uc2VjdXRpdmVfemVyb3MgPj0gU1lOQ19IRFJfQklUUykgeworCQlzY2gtPmNvbnNlY3V0aXZlX3plcm9zID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlc3luY2hyb25pemUgdG8gY3VycmVudCBsb2NhdGlvbiAqLworc3RhdGljIHZvaWQgcmVzeW5jX3RvX2hlcmUoc3RydWN0IGRlbXV4X3N1YmNoICpzY2gpCit7CisJbWVtc2V0KHNjaC0+b3V0X2JpdGJ1ZiwgMCwgU1lOQ19IRFJfQklUUyk7CisKKwkvKiBzZXQgaW5kZXggaW4gYSB3YXkgdGhhdCB3ZSBjYW4gY29udGludWUgcmVjZWl2aW5nIGJpdHMgYWZ0ZXIKKwkgKiB0aGUgZW5kIG9mIHRoZSBTWU5DIGhlYWRlciAqLworCXNjaC0+b3V0X2lkeCA9IFNZTkNfSERSX0JJVFM7CisJc2NoLT5pbl9zeW5jID0gMTsKK30KKworaW50IHN1YmNoX2RlbXV4X2luaXQoc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgpCit7CisJaW50IGk7CisKKwlkbXgtPmNoYW5fYWN0aXYgPSAwOworCWZvciAoaSA9IDA7IGkgPCBOUl9TVUJDSDsgaSsrKSB7CisJCXN0cnVjdCBkZW11eF9zdWJjaCAqc2NoID0gJmRteC0+c3ViY2hbaV07CisJCXNjaC0+b3V0X2lkeCA9IDA7CisJCW1lbXNldChzY2gtPm91dF9iaXRidWYsIDB4ZmYsIHNpemVvZihzY2gtPm91dF9iaXRidWYpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGlucHV0IHNvbWUgYXJiaXRyYXJ5IChtb2R1bG8gNCkgbnVtYmVyIG9mIGJ5dGVzIG9mIGEgNjRrIEUxIGNoYW5uZWwsCisgKiBzcGxpdCBpdCBpbnRvIHRoZSAxNmsgc3ViY2hhbm5lbHMgKi8KK2ludCBzdWJjaF9kZW11eF9pbihzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pCit7CisJaW50IGksIGM7CisKKwkvKiB3ZSBhdm9pZCBwYXJ0aWFsbHkgZmlsbGVkIGJ5dGVzIGluIG91dGJ1ZiAqLworCWlmIChsZW4gJSA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQl1X2ludDhfdCBpbmJ5dGUgPSBkYXRhW2ldOworCisJCWZvciAoYyA9IDA7IGMgPCBOUl9TVUJDSDsgYysrKSB7CisJCQlzdHJ1Y3QgZGVtdXhfc3ViY2ggKnNjaCA9ICZkbXgtPnN1YmNoW2NdOworCQkJdV9pbnQ4X3QgaW5iaXRzOworCQkJdV9pbnQ4X3QgYml0OworCisJCQkvKiBpZ25vcmUgaW5hY3RpdmUgc3ViY2hhbm5lbHMgKi8KKwkJCWlmICghKGRteC0+Y2hhbl9hY3RpdiAmICgxIDw8IGMpKSkKKwkJCQljb250aW51ZTsKKworCQkJaW5iaXRzID0gaW5ieXRlID4+IChjIDw8IDEpOworCisJCQkvKiB0d28gYml0cyBmb3IgZWFjaCBzdWJjaGFubmVsICovCisJCQlpZiAoaW5iaXRzICYgMHgwMSkKKwkJCQliaXQgPSAxOworCQkJZWxzZQorCQkJCWJpdCA9IDA7CisJCQlhcHBlbmRfYml0KHNjaCwgYml0KTsKKworCQkJaWYgKHN5bmNfaGRyX2NvbXBsZXRlKHNjaCwgYml0KSkKKwkJCQlyZXN5bmNfdG9faGVyZShzY2gpOworCisJCQlpZiAoaW5iaXRzICYgMHgwMikKKwkJCQliaXQgPSAxOworCQkJZWxzZQorCQkJCWJpdCA9IDA7CisJCQlhcHBlbmRfYml0KHNjaCwgYml0KTsKKworCQkJaWYgKHN5bmNfaGRyX2NvbXBsZXRlKHNjaCwgYml0KSkKKwkJCQlyZXN5bmNfdG9faGVyZShzY2gpOworCisJCQkvKiBGSVhNRTogdmVyaWZ5IHRoZSBmaXJzdCBiaXQgaW4gb2N0ZXQgMiwgNCwgNiwgLi4uCisJCQkgKiBhY2NvcmRpbmcgdG8gVFMgMDguNjAgNC44LjEgKi8KKworCQkJLyogb25jZSB3ZSBoYXZlIHJlYWNoZWQgVFJBVV9GUkFNRV9CSVRTLCBjYWxsCisJCQkgKiB0aGUgVFJBVSBmcmFtZSBoYW5kbGVyIGNhbGxiYWNrIGZ1bmN0aW9uICovCisJCQlpZiAoc2NoLT5vdXRfaWR4ID49IFRSQVVfRlJBTUVfQklUUykgeworCQkJCWlmIChzY2gtPmluX3N5bmMpIHsKKwkJCQkJZG14LT5vdXRfY2IoZG14LCBjLCBzY2gtPm91dF9iaXRidWYsCisJCQkJCSAgICBzY2gtPm91dF9pZHgsIGRteC0+ZGF0YSk7CisJCQkJCXNjaC0+aW5fc3luYyA9IDA7CisJCQkJfQorCQkJCXNjaC0+b3V0X2lkeCA9IDA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGk7Cit9CisKK2ludCBzdWJjaF9kZW11eF9hY3RpdmF0ZShzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgaW50IHN1YmNoKQoreworCWlmIChzdWJjaCA+PSBOUl9TVUJDSCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkbXgtPmNoYW5fYWN0aXYgfD0gKDEgPDwgc3ViY2gpOworCXJldHVybiAwOworfQorCitpbnQgc3ViY2hfZGVtdXhfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgaW50IHN1YmNoKQoreworCWlmIChzdWJjaCA+PSBOUl9TVUJDSCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkbXgtPmNoYW5fYWN0aXYgJj0gfigxIDw8IHN1YmNoKTsKKwlyZXR1cm4gMDsKK30KKworLyogTVVMVElQTEVYRVIgKi8KKworc3RhdGljIGludCBhbGxvY19hZGRfaWRsZV9mcmFtZShzdHJ1Y3Qgc3ViY2hfbXV4ICpteCwgaW50IHNjaF9ucikKK3sKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB3aXRoIGlkbGUgcGF0dGVybiAqLworCXJldHVybiBzdWJjaGFuX211eF9lbnF1ZXVlKG14LCBzY2hfbnIsIHRyYXVfaWRsZV9mcmFtZSgpLAorCQkJCSAgIFRSQVVfRlJBTUVfQklUUyk7Cit9CisKKy8qIHJldHVybiB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBiaXRzIGZyb20gdGhlIHNwZWNpZmllZCBzdWJjaGFubmVsICovCitzdGF0aWMgaW50IGdldF9zdWJjaF9iaXRzKHN0cnVjdCBzdWJjaF9tdXggKm14LCBpbnQgc3ViY2gsCisJCQkgIHVfaW50OF90ICpiaXRzLCBpbnQgbnVtX3JlcXVlc3RlZCkKK3sKKwlzdHJ1Y3QgbXV4X3N1YmNoICpzY2ggPSAmbXgtPnN1YmNoW3N1YmNoXTsKKwlpbnQgbnVtX2JpdHMgPSAwOworCisJd2hpbGUgKG51bV9iaXRzIDwgbnVtX3JlcXVlc3RlZCkgeworCQlzdHJ1Y3Qgc3ViY2hfdHhxX2VudHJ5ICp0eGU7CisJCWludCBudW1fYml0c19sZWZ0OworCQlpbnQgbnVtX2JpdHNfdGhpc3RpbWU7CisKKwkJLyogbWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBlbnRyeSBhdCB0b3Agb2YgdHggcXVldWUuCisJCSAqIGlmIG5vdCwgYWRkIGFuIGlkbGUgZnJhbWUgKi8KKwkJaWYgKGxsaXN0X2VtcHR5KCZzY2gtPnR4X3F1ZXVlKSkKKwkJCWFsbG9jX2FkZF9pZGxlX2ZyYW1lKG14LCBzdWJjaCk7CisJCisJCWlmIChsbGlzdF9lbXB0eSgmc2NoLT50eF9xdWV1ZSkpCisJCQlyZXR1cm4gLUVJTzsKKworCQl0eGUgPSBsbGlzdF9lbnRyeShzY2gtPnR4X3F1ZXVlLm5leHQsIHN0cnVjdCBzdWJjaF90eHFfZW50cnksIGxpc3QpOworCQludW1fYml0c19sZWZ0ID0gdHhlLT5iaXRfbGVuIC0gdHhlLT5uZXh0X2JpdDsKKworCQlpZiAobnVtX2JpdHNfbGVmdCA8IG51bV9yZXF1ZXN0ZWQpCisJCQludW1fYml0c190aGlzdGltZSA9IG51bV9iaXRzX2xlZnQ7CisJCWVsc2UKKwkJCW51bV9iaXRzX3RoaXN0aW1lID0gbnVtX3JlcXVlc3RlZDsKKworCQkvKiBwdWxsIHRoZSBiaXRzIGZyb20gdGhlIHR4ZSAqLworCQltZW1jcHkoYml0cyArIG51bV9iaXRzLCB0eGUtPmJpdHMgKyB0eGUtPm5leHRfYml0LCBudW1fYml0c190aGlzdGltZSk7CisJCXR4ZS0+bmV4dF9iaXQgKz0gbnVtX2JpdHNfdGhpc3RpbWU7CisKKwkJLyogZnJlZSB0aGUgdHhfcXVldWUgZW50cnkgaWYgaXQgaXMgZnVsbHkgY29uc3VtZWQgKi8KKwkJaWYgKHR4ZS0+bmV4dF9iaXQgPj0gdHhlLT5iaXRfbGVuKSB7CisJCQlsbGlzdF9kZWwoJnR4ZS0+bGlzdCk7CisJCQl0YWxsb2NfZnJlZSh0eGUpOworCQl9CisKKwkJLyogaW5jcmVtZW50IGdsb2JhbCBudW1iZXIgb2YgYml0cyBkZXF1ZXVlZCAqLworCQludW1fYml0cyArPSBudW1fYml0c190aGlzdGltZTsKKwl9CisKKwlyZXR1cm4gbnVtX3JlcXVlc3RlZDsKK30KKworLyogY29tcGFjdCBhbiBhcnJheSBvZiA4IHNpbmdsZS1iaXQgYnl0ZXMgaW50byBvbmUgYnl0ZSBvZiA4IGJpdHMgKi8KK3N0YXRpYyB1X2ludDhfdCBjb21wYWN0X2JpdHMoY29uc3QgdV9pbnQ4X3QgKmJpdHMpCit7CisJdV9pbnQ4X3QgcmV0ID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXJldCB8PSAoYml0c1tpXSA/IDEgOiAwKSA8PCBpOworCisJcmV0dXJuIHJldDsKK30KKworLyogb2J0YWluIGEgc2luZ2xlIG91dHB1dCBieXRlIGZyb20gdGhlIHN1YmNoYW5uZWwgbXV4ZXIgKi8KK3N0YXRpYyBpbnQgbXV4X291dHB1dF9ieXRlKHN0cnVjdCBzdWJjaF9tdXggKm14LCB1X2ludDhfdCAqYnl0ZSkKK3sKKwl1X2ludDhfdCBiaXRzWzhdOworCWludCByYzsKKworCS8qIGNvbWJpbmUgdHdvIGJpdHMgb2YgZXZlcnkgc3ViY2hhbiAqLworCXJjID0gZ2V0X3N1YmNoX2JpdHMobXgsIDAsICZiaXRzWzBdLCAyKTsKKwlyYyA9IGdldF9zdWJjaF9iaXRzKG14LCAxLCAmYml0c1syXSwgMik7CisJcmMgPSBnZXRfc3ViY2hfYml0cyhteCwgMiwgJmJpdHNbNF0sIDIpOworCXJjID0gZ2V0X3N1YmNoX2JpdHMobXgsIDMsICZiaXRzWzZdLCAyKTsKKworCSpieXRlID0gY29tcGFjdF9iaXRzKGJpdHMpOworCisJcmV0dXJuIHJjOworfQorCisvKiBSZXF1ZXN0IHRoZSBvdXRwdXQgb2Ygc29tZSBtdXhlZCBieXRlcyBmcm9tIHRoZSBzdWJjaGFuIG11eGVyICovCitpbnQgc3ViY2hhbl9tdXhfb3V0KHN0cnVjdCBzdWJjaF9tdXggKm14LCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpbnQgcmM7CisJCXJjID0gbXV4X291dHB1dF9ieXRlKG14LCAmZGF0YVtpXSk7CisJCWlmIChyYyA8IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgbGxpc3RfbGVuKHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBsbGlzdF9oZWFkICplbnRyeTsKKwlpbnQgaSA9IDA7CisKKwlsbGlzdF9mb3JfZWFjaChlbnRyeSwgaGVhZCkKKwkJaSsrOworCisJcmV0dXJuIGk7Cit9CisKKy8qIGV2aWN0IHRoZSAnbnVtX2V2aWN0JyBudW1iZXIgb2Ygb2xkZXN0IGVudHJpZXMgaW4gdGhlIHF1ZXVlICovCitzdGF0aWMgdm9pZCB0eF9xdWV1ZV9ldmljdChzdHJ1Y3QgbXV4X3N1YmNoICpzY2gsIGludCBudW1fZXZpY3QpCit7CisJc3RydWN0IHN1YmNoX3R4cV9lbnRyeSAqdHFlOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9ldmljdDsgaSsrKSB7CisJCWlmIChsbGlzdF9lbXB0eSgmc2NoLT50eF9xdWV1ZSkpCisJCQlyZXR1cm47CisKKwkJdHFlID0gbGxpc3RfZW50cnkoc2NoLT50eF9xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc3ViY2hfdHhxX2VudHJ5LCBsaXN0KTsKKwkJbGxpc3RfZGVsKCZ0cWUtPmxpc3QpOworCQl0YWxsb2NfZnJlZSh0cWUpOworCX0KK30KKworLyogZW5xdWV1ZSBzb21lIGRhdGEgaW50byB0aGUgdHhfcXVldWUgb2YgYSBnaXZlbiBzdWJjaGFubmVsICovCitpbnQgc3ViY2hhbl9tdXhfZW5xdWV1ZShzdHJ1Y3Qgc3ViY2hfbXV4ICpteCwgaW50IHNfbnIsIGNvbnN0IHVfaW50OF90ICpkYXRhLAorCQkJaW50IGxlbikKK3sKKwlzdHJ1Y3QgbXV4X3N1YmNoICpzY2ggPSAmbXgtPnN1YmNoW3NfbnJdOworCWludCBsaXN0X2xlbiA9IGxsaXN0X2xlbigmc2NoLT50eF9xdWV1ZSk7CisJc3RydWN0IHN1YmNoX3R4cV9lbnRyeSAqdHFlID0gdGFsbG9jX3plcm9fc2l6ZSh0YWxsX3RxZV9jdHgsCisJCQkJCQkJc2l6ZW9mKCp0cWUpICsgbGVuKTsKKwlpZiAoIXRxZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0cWUtPmJpdF9sZW4gPSBsZW47CisJbWVtY3B5KHRxZS0+Yml0cywgZGF0YSwgbGVuKTsKKworCWlmIChsaXN0X2xlbiA+IDIpCisJCXR4X3F1ZXVlX2V2aWN0KHNjaCwgbGlzdF9sZW4tMik7CisKKwlsbGlzdF9hZGRfdGFpbCgmdHFlLT5saXN0LCAmc2NoLT50eF9xdWV1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogaW5pdGlhbGl6ZSBvbmUgc3ViY2hhbm5lbCBtdXhlciBpbnN0YW5jZSAqLworaW50IHN1YmNoYW5fbXV4X2luaXQoc3RydWN0IHN1YmNoX211eCAqbXgpCit7CisJaW50IGk7CisKKwltZW1zZXQobXgsIDAsIHNpemVvZigqbXgpKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfU1VCQ0g7IGkrKykgeworCQlzdHJ1Y3QgbXV4X3N1YmNoICpzY2ggPSAmbXgtPnN1YmNoW2ldOworCQlJTklUX0xMSVNUX0hFQUQoJnNjaC0+dHhfcXVldWUpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvc3lzdGVtX2luZm9ybWF0aW9uLmMgYi9vcGVuYnNjL3NyYy9zeXN0ZW1faW5mb3JtYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjlkNjA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvc3lzdGVtX2luZm9ybWF0aW9uLmMKQEAgLTAsMCArMSw0NzMgQEAKKy8qIEdTTSAwNC4wOCBTeXN0ZW0gSW5mb3JtYXRpb24gKFNJKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKKyAqIDNHUFAgVFMgMDQuMDggdmVyc2lvbiA3LjIxLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQwIFY3LjIxLjAgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Jlc3Rfb2N0ZXRzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvYml0dmVjLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCisjZGVmaW5lIEdTTTQ4X0NFTExfQ0hBTl9ERVNDX1NJWkUJMTYKKyNkZWZpbmUgR1NNX01BQ0JMT0NLX0xFTiAJCTIzCisjZGVmaW5lIEdTTV9NQUNCTE9DS19QQURESU5HCQkweDJiCisKKy8qIHZlcmlmeSB0aGUgc2l6ZXMgb2YgdGhlIHN5c3RlbSBpbmZvcm1hdGlvbiB0eXBlIHN0cnVjdHMgKi8KKworLyogcmVzdCBvY3RldHMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBzdHJ1Y3QgKi8KK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV9oZWFkZXIpID09IDMsIF9zaV9oZWFkZXJfc2l6ZSk7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZ3NtNDhfcmFjaF9jb250cm9sKSA9PSAzLCBfc2lfcmFjaF9jb250cm9sKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8xKSA9PSAyMiwgX3NpMV9zaXplKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8yKSA9PSAyMywgX3NpMl9zaXplKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8zKSA9PSAxOSwgX3NpM19zaXplKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV80KSA9PSAxMywgX3NpNF9zaXplKTsKKworLyogYnMxMSBmb3Jnb3QgdGhlIGwyIGxlbiwgMC02IHJlc3Qgb2N0ZXRzICovCitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNSkgPT0gMTgsIF9zaTVfc2l6ZSk7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNikgPT0gMTEsIF9zaTZfc2l6ZSk7CisKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8xMykgPT0gMywgX3NpMTNfc2l6ZSk7CisKKy8qIEZyZXF1ZW5jeSBMaXN0cyBhcyBwZXIgVFMgMDQuMDggMTAuNS4yLjEzICovCisKKy8qIDEwLjUuMi4xMy4yOiBCaXQgbWFwIDAgZm9ybWF0ICovCitzdGF0aWMgaW50IGZyZXFfbGlzdF9ibTBfc2V0X2FyZmNuKHVfaW50OF90ICpjaGFuX2xpc3QsIHVuc2lnbmVkIGludCBhcmZjbikKK3sKKwl1bnNpZ25lZCBpbnQgYnl0ZSwgYml0OworCisJaWYgKGFyZmNuID4gMTI0IHx8IGFyZmNuIDwgMSkgeworCQlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIkJpdG1hcCAwIG9ubHkgc3VwcG9ydHMgQVJGQ04gMS4uLjEyNFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHRoZSBiaXRtYXNrIGlzIGZyb20gMS4uMTI0LCBub3QgZnJvbSAwLi4xMjMgKi8KKwlhcmZjbi0tOworCisJYnl0ZSA9IGFyZmNuIC8gODsKKwliaXQgPSBhcmZjbiAlIDg7CisKKwljaGFuX2xpc3RbR1NNNDhfQ0VMTF9DSEFOX0RFU0NfU0laRS0xLWJ5dGVdIHw9ICgxIDw8IGJpdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogMTAuNS4yLjEzLjc6IFZhcmlhYmxlIGJpdCBtYXAgZm9ybWF0ICovCitzdGF0aWMgaW50IGZyZXFfbGlzdF9ibXJlbF9zZXRfYXJmY24odV9pbnQ4X3QgKmNoYW5fbGlzdCwgdW5zaWduZWQgaW50IGFyZmNuKQoreworCXVuc2lnbmVkIGludCBieXRlLCBiaXQ7CisJdW5zaWduZWQgaW50IG1pbl9hcmZjbjsKKwl1bnNpZ25lZCBpbnQgYml0bm87CisKKwltaW5fYXJmY24gPSAoY2hhbl9saXN0WzBdICYgMSkgPDwgOTsKKwltaW5fYXJmY24gfD0gY2hhbl9saXN0WzFdIDw8IDE7CisJbWluX2FyZmNuIHw9IChjaGFuX2xpc3RbMl0gPj4gNykgJiAxOworCisJLyogVGhlIGxvd2VyIGVuZCBvZiBvdXIgYml0bWFrcyBpcyBhbHdheXMgaW1wbGljaXRseSBpbmNsdWRlZCAqLworCWlmIChhcmZjbiA9PSBtaW5fYXJmY24pCisJCXJldHVybiAwOworCisJaWYgKGFyZmNuIDwgbWluX2FyZmNuKSB7CisJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiYXJmY24oJXUpIDwgbWluKCV1KVxuIiwgYXJmY24sIG1pbl9hcmZjbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoYXJmY24gPiBtaW5fYXJmY24gKyAxMTEpIHsKKwkJTE9HUChEUlIsIExPR0xfRVJST1IsICJhcmZjbigldSkgPiBtaW4oJXUpICsgMTExXG4iLCBhcmZjbiwgbWluX2FyZmNuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYml0bm8gPSAoYXJmY24gLSBtaW5fYXJmY24pOworCWJ5dGUgPSBiaXRubyAvIDg7CisJYml0ID0gYml0bm8gJSA4OworCisJY2hhbl9saXN0WzIgKyBieXRlXSB8PSAxIDw8ICg3IC0gYml0KTsKKworCXJldHVybiAwOworfQorCisvKiBnZW5lcmF0ZSBhIGNlbGwgY2hhbm5lbCBsaXN0IGFzIHBlciBTZWN0aW9uIDEwLjUuMi4xYiBvZiAwNC4wOCAqLworc3RhdGljIGludCBiaXR2ZWMyZnJlcV9saXN0KHVfaW50OF90ICpjaGFuX2xpc3QsIHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJICAgIGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaW50IGksIHJjLCBtaW4gPSAxMDI0LCBtYXggPSAtMTsKKworCW1lbXNldChjaGFuX2xpc3QsIDAsIDE2KTsKKworCS8qIEdTTTkwMC1vbmx5IGhhbmRzZXRzIG9ubHkgc3VwcG9ydCAnYml0IG1hcCAwIGZvcm1hdCcgKi8KKwlpZiAoYnRzLT5iYW5kID09IEdTTV9CQU5EXzkwMCkgeworCQljaGFuX2xpc3RbMF0gPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBidi0+ZGF0YV9sZW4qODsgaSsrKSB7CisJCQlpZiAoYml0dmVjX2dldF9iaXRfcG9zKGJ2LCBpKSkgeworCQkJCXJjID0gZnJlcV9saXN0X2JtMF9zZXRfYXJmY24oY2hhbl9saXN0LCBpKTsKKwkJCQlpZiAocmMgPCAwKQorCQkJCQlyZXR1cm4gcmM7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGUgJ1ZhcmlhYmxlIGJpdG1hcCBmb3JtYXQnICovCisJY2hhbl9saXN0WzBdID0gMHg4ZTsKKworCWZvciAoaSA9IDA7IGkgPCBidi0+ZGF0YV9sZW4qODsgaSsrKSB7CisJCWlmIChiaXR2ZWNfZ2V0X2JpdF9wb3MoYnYsIGkpKSB7CisJCQlpZiAoaSA8IG1pbikKKwkJCQltaW4gPSBpOworCQkJaWYgKGkgPiBtYXgpCisJCQkJbWF4ID0gaTsKKwkJfQorCX0KKworCWlmIChtYXggPT0gLTEpIHsKKwkJLyogRW1wdHkgc2V0LCB1c2UgJ2JpdCBtYXAgMCBmb3JtYXQnICovCisJCWNoYW5fbGlzdFswXSA9IDA7CisJCXJldHVybiAwOworCX0KKworCWlmICgobWF4IC0gbWluKSA+IDExMSkgeworCQlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIm1pbl9hcmZjbj0ldSwgbWF4X2FyZmNuPSV1LCAiCisJCQkiZGlzdGFuY2UgPiAxMTFcbiIsIG1pbiwgbWF4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2hhbl9saXN0WzBdIHw9IChtaW4gPj4gOSkgJiAxOworCWNoYW5fbGlzdFsxXSA9IChtaW4gPj4gMSk7CisJY2hhbl9saXN0WzJdID0gKG1pbiAmIDEpIDw8IDc7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnYtPmRhdGFfbGVuKjg7IGkrKykgeworCQlpZiAoYml0dmVjX2dldF9iaXRfcG9zKGJ2LCBpKSkgeworCQkJcmMgPSBmcmVxX2xpc3RfYm1yZWxfc2V0X2FyZmNuKGNoYW5fbGlzdCwgaSk7CisJCQlpZiAocmMgPCAwKQorCQkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiBnZW5lcmF0ZSBhIGNlbGwgY2hhbm5lbCBsaXN0IGFzIHBlciBTZWN0aW9uIDEwLjUuMi4xYiBvZiAwNC4wOCAqLworc3RhdGljIGludCBnZW5lcmF0ZV9jZWxsX2NoYW5fbGlzdCh1X2ludDhfdCAqY2hhbl9saXN0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBiaXR2ZWMgKmJ2ID0gJmJ0cy0+c2lfY29tbW9uLmNlbGxfYWxsb2M7CisKKwkvKiBmaXJzdCB3ZSBnZW5lcmF0ZSBhIGJpdHZlYyBvZiBhbGwgVFJYIEFSRkNOJ3MgaW4gb3VyIEJUUyAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpCisJCWJpdHZlY19zZXRfYml0X3BvcyhidiwgdHJ4LT5hcmZjbiwgMSk7CisKKwkvKiB0aGVuIHdlIGdlbmVyYXRlIGEgR1NNIDA0LjA4IGZyZXF1ZW5jeSBsaXN0IGZyb20gdGhlIGJpdHZlYyAqLworCXJldHVybiBiaXR2ZWMyZnJlcV9saXN0KGNoYW5fbGlzdCwgYnYsIGJ0cyk7Cit9CisKKy8qIGdlbmVyYXRlIGEgY2VsbCBjaGFubmVsIGxpc3QgYXMgcGVyIFNlY3Rpb24gMTAuNS4yLjFiIG9mIDA0LjA4ICovCitzdGF0aWMgaW50IGdlbmVyYXRlX2JjY2hfY2hhbl9saXN0KHVfaW50OF90ICpjaGFuX2xpc3QsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9idHMgKmN1cl9idHM7CisJc3RydWN0IGJpdHZlYyAqYnYgPSAmYnRzLT5zaV9jb21tb24ubmVpZ2hfbGlzdDsKKworCS8qIGZpcnN0IHdlIGdlbmVyYXRlIGEgYml0dmVjIG9mIHRoZSBCQ0NIIEFSRkNOJ3MgaW4gb3VyIEJTQyAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGN1cl9idHMsICZidHMtPm5ldHdvcmstPmJ0c19saXN0LCBsaXN0KSB7CisJCWlmIChjdXJfYnRzID09IGJ0cykKKwkJCWNvbnRpbnVlOworCQliaXR2ZWNfc2V0X2JpdF9wb3MoYnYsIGN1cl9idHMtPmMwLT5hcmZjbiwgMSk7CisJfQorCisJLyogdGhlbiB3ZSBnZW5lcmF0ZSBhIEdTTSAwNC4wOCBmcmVxdWVuY3kgbGlzdCBmcm9tIHRoZSBiaXR2ZWMgKi8KKwlyZXR1cm4gYml0dmVjMmZyZXFfbGlzdChjaGFuX2xpc3QsIGJ2LCBidHMpOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpMSh1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMSAqc2kxID0KKwkJKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8xICopIG91dHB1dDsKKworCW1lbXNldChzaTEsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCXNpMS0+aGVhZGVyLmwyX3BsZW4gPSAoMjEgPDwgMikgfCAxOworCXNpMS0+aGVhZGVyLnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTEtPmhlYWRlci5za2lwX2luZGljYXRvciA9IDA7CisJc2kxLT5oZWFkZXIuc3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT18xOworCisJcmMgPSBnZW5lcmF0ZV9jZWxsX2NoYW5fbGlzdChzaTEtPmNlbGxfY2hhbm5lbF9kZXNjcmlwdGlvbiwgYnRzKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlzaTEtPnJhY2hfY29udHJvbCA9IGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbDsKKworCS8qIFNJMSBSZXN0IE9jdGV0cyAoMTAuNS4yLjMyKSwgY29udGFpbnMgTkNIIHBvc2l0aW9uICovCisJcmMgPSByZXN0X29jdGV0c19zaTEoc2kxLT5yZXN0X29jdGV0cywgTlVMTCk7CisJcmV0dXJuIHNpemVvZigqc2kxKSArIHJjOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpMih1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMiAqc2kyID0KKwkJKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8yICopIG91dHB1dDsKKworCW1lbXNldChzaTIsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCXNpMi0+aGVhZGVyLmwyX3BsZW4gPSAoMjIgPDwgMikgfCAxOworCXNpMi0+aGVhZGVyLnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTItPmhlYWRlci5za2lwX2luZGljYXRvciA9IDA7CisJc2kyLT5oZWFkZXIuc3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT18yOworCisJcmMgPSBnZW5lcmF0ZV9iY2NoX2NoYW5fbGlzdChzaTItPmJjY2hfZnJlcXVlbmN5X2xpc3QsIGJ0cyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJc2kyLT5uY2NfcGVybWl0dGVkID0gYnRzLT5zaV9jb21tb24ubmNjX3Blcm1pdHRlZDsKKwlzaTItPnJhY2hfY29udHJvbCA9IGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbDsKKworCXJldHVybiBzaXplb2YoKnNpMik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtNDhfc2lfcm9faW5mbyBzaV9pbmZvID0geworCS5zZWxlY3Rpb25fcGFyYW1zID0geworCQkucHJlc2VudCA9IDAsCisJfSwKKwkucG93ZXJfb2Zmc2V0ID0geworCQkucHJlc2VudCA9IDAsCisJfSwKKwkuc2kydGVyX2luZGljYXRvciA9IDAsCisJLmVhcmx5X2NtX2N0cmwgPSAxLAorCS5zY2hlZHVsaW5nID0geworCQkucHJlc2VudCA9IDAsCisJfSwKKwkuZ3Byc19pbmQgPSB7CisJCS5zaTEzX3Bvc2l0aW9uID0gMCwKKwkJLnJhX2NvbG91ciA9IDAsCisJCS5wcmVzZW50ID0gMSwKKwl9LAorCS5sc2FfcGFyYW1zID0geworCQkucHJlc2VudCA9IDAsCisJfSwKKwkuY2VsbF9pZCA9IDAsCS8qIEZJWE1FOiBkb2Vzbid0IHRoZSBidHMgaGF2ZSB0aGlzPyAqLworCS5icmVha19pbmQgPSAwLAorfTsKKworc3RhdGljIGludCBnZW5lcmF0ZV9zaTModV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlpbnQgcmM7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzMgKnNpMyA9CisJCShzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMyAqKSBvdXRwdXQ7CisKKwltZW1zZXQoc2kzLCBHU01fTUFDQkxPQ0tfUEFERElORywgR1NNX01BQ0JMT0NLX0xFTik7CisKKwlzaTMtPmhlYWRlci5sMl9wbGVuID0gKDE4IDw8IDIpIHwgMTsKKwlzaTMtPmhlYWRlci5ycl9wcm90b2NvbF9kaXNjcmltaW5hdG9yID0gR1NNNDhfUERJU0NfUlI7CisJc2kzLT5oZWFkZXIuc2tpcF9pbmRpY2F0b3IgPSAwOworCXNpMy0+aGVhZGVyLnN5c3RlbV9pbmZvcm1hdGlvbiA9IEdTTTQ4X01UX1JSX1NZU0lORk9fMzsKKworCXNpMy0+Y2VsbF9pZGVudGl0eSA9IGh0b25zKGJ0cy0+Y2VsbF9pZGVudGl0eSk7CisJZ3NtNDhfZ2VuZXJhdGVfbGFpKCZzaTMtPmxhaSwgYnRzLT5uZXR3b3JrLT5jb3VudHJ5X2NvZGUsCisJCQkgICBidHMtPm5ldHdvcmstPm5ldHdvcmtfY29kZSwKKwkJCSAgIGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlKTsKKwlzaTMtPmNvbnRyb2xfY2hhbm5lbF9kZXNjID0gYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjOworCXNpMy0+Y2VsbF9vcHRpb25zID0gYnRzLT5zaV9jb21tb24uY2VsbF9vcHRpb25zOworCXNpMy0+Y2VsbF9zZWxfcGFyID0gYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyOworCXNpMy0+cmFjaF9jb250cm9sID0gYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sOworCisJLyogU0kzIFJlc3QgT2N0ZXRzICgxMC41LjIuMzQpLCBjb250YWluaW5nCisJCUNCUSwgQ0VMTF9SRVNFTEVDVF9PRkZTRVQsIFRFTVBPUkFSWV9PRkZTRVQsIFBFTkFMVFlfVElNRQorCQlQb3dlciBPZmZzZXQsIDJ0ZXIgSW5kaWNhdG9yLCBFYXJseSBDbGFzc21hcmsgU2VuZGluZywKKwkJU2NoZWR1bGluZyBpZiBhbmQgV0hFUkUsIEdQUlMgSW5kaWNhdG9yLCBTSTEzIHBvc2l0aW9uICovCisJcmMgPSByZXN0X29jdGV0c19zaTMoc2kzLT5yZXN0X29jdGV0cywgJnNpX2luZm8pOworCisJcmV0dXJuIHNpemVvZigqc2kzKSArIHJjOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpNCh1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNCAqc2k0ID0KKwkJKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV80ICopIG91dHB1dDsKKworCS8qIGxlbmd0aCBvZiBhbGwgSUVzIHByZXNlbnQgZXhjZXB0IFNJNCByZXN0IG9jdGV0cyBhbmQgbDJfcGxlbiAqLworCWludCBsMl9wbGVuID0gc2l6ZW9mKCpzaTQpIC0gMTsKKworCW1lbXNldChzaTQsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCXNpNC0+aGVhZGVyLnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTQtPmhlYWRlci5za2lwX2luZGljYXRvciA9IDA7CisJc2k0LT5oZWFkZXIuc3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT180OworCisJZ3NtNDhfZ2VuZXJhdGVfbGFpKCZzaTQtPmxhaSwgYnRzLT5uZXR3b3JrLT5jb3VudHJ5X2NvZGUsCisJCQkgICBidHMtPm5ldHdvcmstPm5ldHdvcmtfY29kZSwKKwkJCSAgIGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlKTsKKwlzaTQtPmNlbGxfc2VsX3BhciA9IGJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3BhcjsKKwlzaTQtPnJhY2hfY29udHJvbCA9IGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbDsKKworCS8qIE9wdGlvbmFsOiBDQkNIIENoYW5uZWwgRGVzY3JpcHRpb24gKyBDQkNIIE1vYmlsZSBBbGxvY2F0aW9uICovCisKKwlzaTQtPmhlYWRlci5sMl9wbGVuID0gKGwyX3BsZW4gPDwgMikgfCAxOworCisJLyogU0k0IFJlc3QgT2N0ZXRzICgxMC41LjIuMzUpLCBjb250YWluaW5nCisJCU9wdGlvbmFsIFBvd2VyIG9mZnNldCwgR1BSUyBJbmRpY2F0b3IsCisJCUNlbGwgSWRlbnRpdHksIExTQSBJRCwgU2VsZWN0aW9uIFBhcmFtZXRlciAqLworCXJjID0gcmVzdF9vY3RldHNfc2k0KHNpNC0+ZGF0YSwgJnNpX2luZm8pOworCisJcmV0dXJuIHNpemVvZigqc2k0KSArIHJjOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpNSh1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV81ICpzaTU7CisJaW50IHJjLCBsMl9wbGVuID0gMTg7CisKKwltZW1zZXQob3V0cHV0LCBHU01fTUFDQkxPQ0tfUEFERElORywgR1NNX01BQ0JMT0NLX0xFTik7CisKKwkvKiBpcC5hY2Nlc3MgbmFub0JUUyBuZWVkcyBsMl9wbGVuISEgKi8KKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKGJ0cykpIHsKKwkJKm91dHB1dCsrID0gKGwyX3BsZW4gPDwgMikgfCAxOworCQlsMl9wbGVuKys7CisJfQorCisJc2k1ID0gKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV81ICopIG91dHB1dDsKKworCS8qIGwyIHBzZXVkbyBsZW5ndGgsIG5vdCBwYXJ0IG9mIG1zZzogMTggKi8KKwlzaTUtPnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTUtPnNraXBfaW5kaWNhdG9yID0gMDsKKwlzaTUtPnN5c3RlbV9pbmZvcm1hdGlvbiA9IEdTTTQ4X01UX1JSX1NZU0lORk9fNTsKKwlyYyA9IGdlbmVyYXRlX2JjY2hfY2hhbl9saXN0KHNpNS0+YmNjaF9mcmVxdWVuY3lfbGlzdCwgYnRzKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiAwNC4wOCA5LjEuMzc6IEwyIFBzZXVkbyBMZW5ndGggb2YgMTggKi8KKwlyZXR1cm4gbDJfcGxlbjsKK30KKworc3RhdGljIGludCBnZW5lcmF0ZV9zaTYodV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNiAqc2k2OworCWludCBsMl9wbGVuID0gMTE7CisKKwltZW1zZXQob3V0cHV0LCBHU01fTUFDQkxPQ0tfUEFERElORywgR1NNX01BQ0JMT0NLX0xFTik7CisKKwkvKiBpcC5hY2Nlc3MgbmFub0JUUyBuZWVkcyBsMl9wbGVuISEgKi8KKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKGJ0cykpIHsKKwkJKm91dHB1dCsrID0gKGwyX3BsZW4gPDwgMikgfCAxOworCQlsMl9wbGVuKys7CisJfQorCisJc2k2ID0gKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV82ICopIG91dHB1dDsKKworCS8qIGwyIHBzZXVkbyBsZW5ndGgsIG5vdCBwYXJ0IG9mIG1zZzogMTEgKi8KKwlzaTYtPnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTYtPnNraXBfaW5kaWNhdG9yID0gMDsKKwlzaTYtPnN5c3RlbV9pbmZvcm1hdGlvbiA9IEdTTTQ4X01UX1JSX1NZU0lORk9fNjsKKwlzaTYtPmNlbGxfaWRlbnRpdHkgPSBodG9ucyhidHMtPmNlbGxfaWRlbnRpdHkpOworCWdzbTQ4X2dlbmVyYXRlX2xhaSgmc2k2LT5sYWksIGJ0cy0+bmV0d29yay0+Y291bnRyeV9jb2RlLAorCQkJICAgYnRzLT5uZXR3b3JrLT5uZXR3b3JrX2NvZGUsCisJCQkgICBidHMtPmxvY2F0aW9uX2FyZWFfY29kZSk7CisJc2k2LT5jZWxsX29wdGlvbnMgPSBidHMtPnNpX2NvbW1vbi5jZWxsX29wdGlvbnM7CisJc2k2LT5uY2NfcGVybWl0dGVkID0gYnRzLT5zaV9jb21tb24ubmNjX3Blcm1pdHRlZDsKKworCS8qIFNJNiBSZXN0IE9jdGV0czogMTAuNS4yLjM1YTogUENIIC8gTkNIIGluZm8sIFZCUy9WR0NTIG9wdGlvbnMgKi8KKworCXJldHVybiBsMl9wbGVuOworfQorCitzdGF0aWMgc3RydWN0IGdzbTQ4X3NpMTNfaW5mbyBzaTEzX2RlZmF1bHQgPSB7CisJLmNlbGxfb3B0cyA9IHsKKwkJLm5tbyAJCT0gR1BSU19OTU9fSUlJLAorCQkudDMxNjgJCT0gMTUwMCwKKwkJLnQzMTkyCQk9IDUwMCwKKwkJLmRyeF90aW1lcl9tYXgJPSAzLAorCQkuYnNfY3ZfbWF4CT0gMTUsCisJfSwKKwkucHdyX2N0cmxfcGFycyA9IHsKKwkJLmFscGhhCQk9IDEwLAkvKiBhID0gMS4wICovCisJCS50X2F2Z193CT0gMjUsCisJCS50X2F2Z190CT0gMjUsCisJCS5wY19tZWFzX2NoYW4JPSAwLCAJLyogZG93bmxpbmcgbWVhc3VyZWQgb24gQ0NDSCAqLworCQkubl9hdmdfaQk9IDE1LAorCX0sCisJLmJjY2hfY2hhbmdlX21hcmsJPSAxLAorCS5zaV9jaGFuZ2VfZmllbGQJPSAwLAorCS5wYmNjaF9wcmVzZW50CQk9IDAsCisJeworCQkubm9fcGJjY2ggPSB7CisJCQkucmFjCQk9IDAsCS8qIG5lZWRzIHRvIGJlIHBhdGNoZWQgKi8KKwkJCS5zcGdjX2NjY2hfc3VwIAk9IDAsCisJCQkubmV0X2N0cmxfb3JkCT0gMCwKKwkJCS5wcmlvX2FjY190aHIJPSA2LAorCQl9LAorCX0sCit9OworCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpMTModV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMTMgKnNpMTMgPQorCQkoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzEzICopIG91dHB1dDsKKwlpbnQgcmV0OworCisJbWVtc2V0KHNpMTMsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCXNpMTMtPmhlYWRlci5ycl9wcm90b2NvbF9kaXNjcmltaW5hdG9yID0gR1NNNDhfUERJU0NfUlI7CisJc2kxMy0+aGVhZGVyLnNraXBfaW5kaWNhdG9yID0gMDsKKwlzaTEzLT5oZWFkZXIuc3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT18xMzsKKworCXNpMTNfZGVmYXVsdC5ub19wYmNjaC5yYWMgPSBidHMtPmdwcnMucmFjOworCisJcmV0ID0gcmVzdF9vY3RldHNfc2kxMyhzaTEzLT5yZXN0X29jdGV0cywgJnNpMTNfZGVmYXVsdCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzaTEzLT5oZWFkZXIubDJfcGxlbiA9IHJldCAmIDB4ZmY7CisKKwlyZXR1cm4gc2l6ZW9mICgqc2kxMykgKyByZXQ7Cit9CisKK2ludCBnc21fZ2VuZXJhdGVfc2kodV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHR5cGUpCit7CisJc2lfaW5mby5ncHJzX2luZC5wcmVzZW50ID0gYnRzLT5ncHJzLmVuYWJsZWQ7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFJTTF9TWVNURU1fSU5GT18xOgorCQlyZXR1cm4gZ2VuZXJhdGVfc2kxKG91dHB1dCwgYnRzKTsKKwljYXNlIFJTTF9TWVNURU1fSU5GT18yOgorCQlyZXR1cm4gZ2VuZXJhdGVfc2kyKG91dHB1dCwgYnRzKTsKKwljYXNlIFJTTF9TWVNURU1fSU5GT18zOgorCQlyZXR1cm4gZ2VuZXJhdGVfc2kzKG91dHB1dCwgYnRzKTsKKwljYXNlIFJTTF9TWVNURU1fSU5GT180OgorCQlyZXR1cm4gZ2VuZXJhdGVfc2k0KG91dHB1dCwgYnRzKTsKKwljYXNlIFJTTF9TWVNURU1fSU5GT181OgorCQlyZXR1cm4gZ2VuZXJhdGVfc2k1KG91dHB1dCwgYnRzKTsKKwljYXNlIFJTTF9TWVNURU1fSU5GT182OgorCQlyZXR1cm4gZ2VuZXJhdGVfc2k2KG91dHB1dCwgYnRzKTsKKwljYXNlIFJTTF9TWVNURU1fSU5GT18xMzoKKwkJcmV0dXJuIGdlbmVyYXRlX3NpMTMob3V0cHV0LCBidHMpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdGFsbG9jX2N0eC5jIGIvb3BlbmJzYy9zcmMvdGFsbG9jX2N0eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNzllMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy90YWxsb2NfY3R4LmMKQEAgLTAsMCArMSwzNiBAQAorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKworZXh0ZXJuIHZvaWQgKnRhbGxfbXNnYl9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9mbGVfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfbG9jb3BfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfZ3Ntc19jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9zdWJzY3JfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfc3ViX3JlcV9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9jYWxsX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX3BhZ2luZ19jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9zaWdoX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX3RxZV9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF90cmFuc19jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9tYXBfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfdXBxX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX2N0cl9jdHg7CisKK3ZvaWQgdGFsbG9jX2N0eF9pbml0KHZvaWQpCit7CisJdGFsbF9tc2diX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJtc2diIik7CisJdGFsbF9mbGVfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgCisJCQkJCSAgImJzMTFfZmlsZV9saXN0X2VudHJ5Iik7CisJdGFsbF9sb2NvcF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAibG9jX3VwZGF0aW5nX29wZXIiKTsKKwl0YWxsX2dzbXNfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInNtcyIpOworCXRhbGxfc3Vic2NyX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJzdWJzY3JpYmVyIik7CisJdGFsbF9zdWJfcmVxX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJzdWJzY3JfcmVxdWVzdCIpOworCXRhbGxfY2FsbF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAiZ3NtX2NhbGwiKTsKKwl0YWxsX3BhZ2luZ19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAicGFnaW5nX3JlcXVlc3QiKTsKKwl0YWxsX3NpZ2hfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInNpZ25hbF9oYW5kbGVyIik7CisJdGFsbF90cWVfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInN1YmNoX3R4cV9lbnRyeSIpOworCXRhbGxfdHJhbnNfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInRyYW5zYWN0aW9uIik7CisJdGFsbF9tYXBfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInRyYXVfbWFwX2VudHJ5Iik7CisJdGFsbF91cHFfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInRyYXVfdXBxX2VudHJ5Iik7CisJdGFsbF9jdHJfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgImNvdW50ZXIiKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3RlbG5ldF9pbnRlcmZhY2UuYyBiL29wZW5ic2Mvc3JjL3RlbG5ldF9pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RlMDI2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdGVsbmV0X2ludGVyZmFjZS5jCkBAIC0wLDAgKzEsMjA5IEBACisvKiBtaW5pbWFsaXN0aWMgdGVsbmV0L25ldHdvcmsgaW50ZXJmYWNlIGl0IG1pZ2h0IHR1cm4gaW50byBhIHdpcmUgaW50ZXJmYWNlICovCisvKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvdGVsbmV0X2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCisjaW5jbHVkZSA8dnR5L2J1ZmZlci5oPgorCisjZGVmaW5lIFdSSVRFX0NPTk5FQ1RJT04oZmQsIG1zZy4uLikgXAorCWludCByZXQ7IFwKKwljaGFyIGJ1Zls0MDk2XTsgXAorCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIG1zZyk7IFwKKwlyZXQgPSB3cml0ZShmZCwgYnVmLCBzdHJsZW4oYnVmKSk7CisKKworLyogcGVyIGNvbm5lY3Rpb24gZGF0YSAqLworTExJU1RfSEVBRChhY3RpdmVfY29ubmVjdGlvbnMpOworCitzdGF0aWMgdm9pZCAqdGFsbF90ZWxuZXRfY3R4OworCisvKiBwZXIgbmV0d29yayBkYXRhICovCitzdGF0aWMgaW50IHRlbG5ldF9uZXdfY29ubmVjdGlvbihzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpOworCitzdGF0aWMgc3RydWN0IGJzY19mZCBzZXJ2ZXJfc29ja2V0ID0geworCS53aGVuCSAgICA9IEJTQ19GRF9SRUFELAorCS5jYgkgICAgPSB0ZWxuZXRfbmV3X2Nvbm5lY3Rpb24sCisJLnByaXZfbnIgICAgPSAwLAorfTsKKwordm9pZCB0ZWxuZXRfaW5pdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcmssIGludCBwb3J0KSB7CisJc3RydWN0IHNvY2thZGRyX2luIHNvY2tfYWRkcjsKKwlpbnQgZmQsIG9uID0gMTsKKworCXRhbGxfdGVsbmV0X2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDEsCisJCQkJCSAgICAgInRlbG5ldF9jb25uZWN0aW9uIik7CisKKwlic2NfdnR5X2luaXQobmV0d29yayk7CisKKwlmZCA9IHNvY2tldChQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworCisJaWYgKGZkIDwgMCkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlRlbG5ldCBpbnRlcmZhY2Ugc29ja2V0IGNyZWF0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisKKwltZW1zZXQoJnNvY2tfYWRkciwgMCwgc2l6ZW9mKHNvY2tfYWRkcikpOworCXNvY2tfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzb2NrX2FkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwlzb2NrX2FkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKTsKKworCWlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyKikmc29ja19hZGRyLCBzaXplb2Yoc29ja19hZGRyKSkgPCAwKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiVGVsbmV0IGludGVyZmFjZSBmYWlsZWQgdG8gYmluZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAobGlzdGVuKGZkLCAwKSA8IDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJUZWxuZXQgaW50ZXJmYWNlIGZhaWxlZCB0byBsaXN0ZW5cbiIpOworCQlyZXR1cm47CisJfQorCisJc2VydmVyX3NvY2tldC5kYXRhID0gbmV0d29yazsKKwlzZXJ2ZXJfc29ja2V0LmZkID0gZmQ7CisJYnNjX3JlZ2lzdGVyX2ZkKCZzZXJ2ZXJfc29ja2V0KTsKK30KKworZXh0ZXJuIGNvbnN0IGNoYXIgKm9wZW5ic2NfY29weXJpZ2h0OworZXh0ZXJuIGNvbnN0IGNoYXIgKm9wZW5ic2NfdmVyc2lvbjsKKworc3RhdGljIHZvaWQgcHJpbnRfd2VsY29tZShpbnQgZmQpIHsKKwlpbnQgcmV0OworCXN0YXRpYyBjaGFyICptc2cgPQorCQkiV2VsY29tZSB0byB0aGUgT3BlbkJTQyBDb250cm9sIGludGVyZmFjZVxuIjsKKworCXJldCA9IHdyaXRlKGZkLCBtc2csIHN0cmxlbihtc2cpKTsKKwlyZXQgPSB3cml0ZShmZCwgb3BlbmJzY19jb3B5cmlnaHQsIHN0cmxlbihvcGVuYnNjX2NvcHlyaWdodCkpOworfQorCitpbnQgdGVsbmV0X2Nsb3NlX2NsaWVudChzdHJ1Y3QgYnNjX2ZkICpmZCkgeworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24qKWZkLT5kYXRhOworCisJY2xvc2UoZmQtPmZkKTsKKwlic2NfdW5yZWdpc3Rlcl9mZChmZCk7CisKKwlpZiAoY29ubi0+ZGJnKSB7CisJCWxvZ19kZWxfdGFyZ2V0KGNvbm4tPmRiZyk7CisJCXRhbGxvY19mcmVlKGNvbm4tPmRiZyk7CisJfQorCisJbGxpc3RfZGVsKCZjb25uLT5lbnRyeSk7CisJdGFsbG9jX2ZyZWUoY29ubik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2xpZW50X2RhdGEoc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubiA9IGZkLT5kYXRhOworCWludCByYyA9IDA7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKSB7CisJCWNvbm4tPmZkLndoZW4gJj0gfkJTQ19GRF9SRUFEOworCQlyYyA9IHZ0eV9yZWFkKGNvbm4tPnZ0eSk7CisJfQorCisJLyogdnR5IG1pZ2h0IGhhdmUgYmVlbiBjbG9zZWQgZnJvbSB2aXRoaW4gdnR5X3JlYWQoKSAqLworCWlmICghY29ubi0+dnR5KQorCQlyZXR1cm4gcmM7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkgeworCQlyYyA9IGJ1ZmZlcl9mbHVzaF9hbGwoY29ubi0+dnR5LT5vYnVmLCBmZC0+ZmQpOworCQlpZiAocmMgPT0gQlVGRkVSX0VNUFRZKQorCQkJY29ubi0+ZmQud2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB0ZWxuZXRfbmV3X2Nvbm5lY3Rpb24oc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KSB7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzb2NrYWRkcjsKKwlzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKHNvY2thZGRyKTsKKwlpbnQgbmV3X2Nvbm5lY3Rpb24gPSBhY2NlcHQoZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyKikmc29ja2FkZHIsICZsZW4pOworCisJaWYgKG5ld19jb25uZWN0aW9uIDwgMCkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgInRlbG5ldCBhY2NlcHQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJY29ubmVjdGlvbiA9IHRhbGxvY196ZXJvKHRhbGxfdGVsbmV0X2N0eCwgc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uKTsKKwljb25uZWN0aW9uLT5uZXR3b3JrID0gKHN0cnVjdCBnc21fbmV0d29yayopZmQtPmRhdGE7CisJY29ubmVjdGlvbi0+ZmQuZGF0YSA9IGNvbm5lY3Rpb247CisJY29ubmVjdGlvbi0+ZmQuZmQgPSBuZXdfY29ubmVjdGlvbjsKKwljb25uZWN0aW9uLT5mZC53aGVuID0gQlNDX0ZEX1JFQUQ7CisJY29ubmVjdGlvbi0+ZmQuY2IgPSBjbGllbnRfZGF0YTsKKwlic2NfcmVnaXN0ZXJfZmQoJmNvbm5lY3Rpb24tPmZkKTsKKwlsbGlzdF9hZGRfdGFpbCgmY29ubmVjdGlvbi0+ZW50cnksICZhY3RpdmVfY29ubmVjdGlvbnMpOworCisJcHJpbnRfd2VsY29tZShuZXdfY29ubmVjdGlvbik7CisKKwljb25uZWN0aW9uLT52dHkgPSB2dHlfY3JlYXRlKG5ld19jb25uZWN0aW9uLCBjb25uZWN0aW9uKTsKKwlpZiAoIWNvbm5lY3Rpb24tPnZ0eSkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgImNvdWxkbid0IGNyZWF0ZSBWVFlcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxiYWNrIGZyb20gVlRZIGNvZGUgKi8KK3ZvaWQgdnR5X2V2ZW50KGVudW0gZXZlbnQgZXZlbnQsIGludCBzb2NrLCBzdHJ1Y3QgdnR5ICp2dHkpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gdnR5LT5wcml2OworCXN0cnVjdCBic2NfZmQgKmJmZCA9ICZjb25uZWN0aW9uLT5mZDsKKworCWlmICh2dHktPnR5cGUgIT0gVlRZX1RFUk0pCisJCXJldHVybjsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFZUWV9SRUFEOgorCQliZmQtPndoZW4gfD0gQlNDX0ZEX1JFQUQ7CisJCWJyZWFrOworCWNhc2UgVlRZX1dSSVRFOgorCQliZmQtPndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCQlicmVhazsKKwljYXNlIFZUWV9DTE9TRUQ6CisJCS8qIHZ0eSBsYXllciBpcyBhYm91dCB0byBmcmVlKCkgdnR5ICovCisJCWNvbm5lY3Rpb24tPnZ0eSA9IE5VTEw7CisJCXRlbG5ldF9jbG9zZV9jbGllbnQoYmZkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy90b2tlbl9hdXRoLmMgYi9vcGVuYnNjL3NyYy90b2tlbl9hdXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZlZmVhNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Rva2VuX2F1dGguYwpAQCAtMCwwICsxLDE1NiBAQAorLyogU01TIGJhc2VkIHRva2VuIGF1dGhlbnRpY2F0aW9uIGZvciBhZC1ob2MgR1NNIG5ldHdvcmtzICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorCisjZGVmaW5lIFRPS0VOX1NNU19URVhUICJIQVIgMjAwOSBHU00uICBSZWdpc3RlciBhdCBodHRwOi8vaGFyMjAwOS5nbnVtb25rcy5vcmcvICIgXAorCQkJIllvdXIgSU1TSSBpcyAlcywgYXV0aCB0b2tlbiBpcyAlMDhYLCBwaG9uZSBubyBpcyAlcy4iCisKK2V4dGVybiBzdHJ1Y3QgZ3NtX3NtcyAqc21zX2Zyb21fdGV4dChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnJlY2VpdmVyLAorCQkJCSAgICAgY29uc3QgY2hhciAqdGV4dCk7CisKK3N0YXRpYyBjaGFyICpidWlsZF9zbXNfc3RyaW5nKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLCB1X2ludDMyX3QgdG9rZW4pCit7CisJY2hhciAqc21zX3N0cjsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJbGVuID0gc3RybGVuKHN1YnNjci0+aW1zaSkgKyA4ICsgc3RybGVuKFRPS0VOX1NNU19URVhUKTsKKwlzbXNfc3RyID0gdGFsbG9jX3NpemUodGFsbF9ic2NfY3R4LCBsZW4pOworCWlmICghc21zX3N0cikKKwkJcmV0dXJuIE5VTEw7CisKKwlzbnByaW50ZihzbXNfc3RyLCBsZW4sIFRPS0VOX1NNU19URVhULCBzdWJzY3ItPmltc2ksIHRva2VuLAorCQkgc3Vic2NyLT5leHRlbnNpb24pOworCXNtc19zdHJbbGVuLTFdID0gJ1wwJzsKKworCXJldHVybiBzbXNfc3RyOworfQorCitzdGF0aWMgaW50IHRva2VuX3N1YnNjcl9jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHNpZ25hbF9kYXRhOworCXN0cnVjdCBnc21fc21zICpzbXM7CisJaW50IHJjID0gMDsKKworCWlmIChzaWduYWwgIT0gU19TVUJTQ1JfQVRUQUNIRUQpCisJCXJldHVybiAwOworCisJaWYgKHN1YnNjci0+bmV0LT5hdXRoX3BvbGljeSAhPSBHU01fQVVUSF9QT0xJQ1lfVE9LRU4pCisJCXJldHVybiAwOworCisJaWYgKHN1YnNjci0+ZmxhZ3MgJiBHU01fU1VCU0NSSUJFUl9GSVJTVF9DT05UQUNUKSB7CisJCXVfaW50MzJfdCB0b2tlbjsKKwkJY2hhciAqc21zX3N0cjsKKworCQkvKiB3ZSd2ZSBzZWVuIHRoaXMgc3Vic2NyaWJlciBmb3IgdGhlIGZpcnN0IHRpbWUuICovCisJCXJjID0gZGJfc3Vic2NyaWJlcl9hbGxvY190b2tlbihzdWJzY3IsICZ0b2tlbik7CisJCWlmIChyYyAhPSAwKSB7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIHVuYXV0aDsKKwkJfQorCisJCXNtc19zdHIgPSBidWlsZF9zbXNfc3RyaW5nKHN1YnNjciwgdG9rZW4pOworCQlpZiAoIXNtc19zdHIpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gdW5hdXRoOworCQl9CisKKwkJc21zID0gc21zX2Zyb21fdGV4dChzdWJzY3IsIHNtc19zdHIpOworCQl0YWxsb2NfZnJlZShzbXNfc3RyKTsKKwkJaWYgKCFzbXMpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gdW5hdXRoOworCQl9CisKKwkJcmMgPSBnc200MTFfc2VuZF9zbXNfc3Vic2NyKHN1YnNjciwgc21zKTsKKworCQkvKiBGSVhNRTogZWxzZSwgZGVsZXRlIHRoZSBzdWJzY2lyYmVyIGZyb20gZGF0YWJhc2UgKi8KK3VuYXV0aDoKKworCQkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgYWxsb3cgaGltIGluIGFnYWluIHVubGVzcyBoZSBjbGlja3MgdGhlIHdlYiBVSSAqLworCQlzdWJzY3ItPmF1dGhvcml6ZWQgPSAwOworCQlkYl9zeW5jX3N1YnNjcmliZXIoc3Vic2NyKTsKKwkJaWYgKHJjKSB7CisJCQlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IGxjaGFuX2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKwkJCWlmIChsY2hhbikgeworCQkJCXVfaW50OF90IGF1dGhfcmFuZFsxNl07CisJCQkJLyoga2ljayB0aGUgc3Vic2NyaWJlciBvZmYgdGhlIG5ldHdvcmsgKi8KKwkJCQlnc200OF90eF9tbV9hdXRoX3JlcShsY2hhbiwgYXV0aF9yYW5kLCAwKTsKKwkJCQlnc200OF90eF9tbV9hdXRoX3JlaihsY2hhbik7CisJCQkJLyogRklYTUU6IGNsb3NlIHRoZSBjaGFubmVsIGVhcmx5ID8qLworCQkJCS8vZ3NtNDhfc2VuZF9ycl9SZWxlYXNlKGxjaGFuKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB0b2tlbl9zbXNfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCXZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IHNpZ25hbF9kYXRhOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXVfaW50OF90IGF1dGhfcmFuZFsxNl07CisKKworCWlmIChzaWduYWwgIT0gU19TTVNfREVMSVZFUkVEKQorCQlyZXR1cm4gMDsKKworCisJLyogdGhlc2UgYXJlIG5vdCB0aGUgZHJvaWRzIHdlJ3ZlIGJlZW4gbG9va2luZyBmb3IgKi8KKwlpZiAoIXNtcy0+cmVjZWl2ZXIgfHwKKwkgICAgIShzbXMtPnJlY2VpdmVyLT5mbGFncyAmIEdTTV9TVUJTQ1JJQkVSX0ZJUlNUX0NPTlRBQ1QpKQorCQlyZXR1cm4gMDsKKworCisJaWYgKHNtcy0+cmVjZWl2ZXItPm5ldC0+YXV0aF9wb2xpY3kgIT0gR1NNX0FVVEhfUE9MSUNZX1RPS0VOKQorCQlyZXR1cm4gMDsKKworCisJbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHNtcy0+cmVjZWl2ZXIpOworCWlmIChsY2hhbikgeworCQkvKiBraWNrIHRoZSBzdWJzY3JpYmVyIG9mZiB0aGUgbmV0d29yayAqLworCQlnc200OF90eF9tbV9hdXRoX3JlcShsY2hhbiwgYXV0aF9yYW5kLCAwKTsKKwkJZ3NtNDhfdHhfbW1fYXV0aF9yZWoobGNoYW4pOworCQkvKiBGSVhNRTogY2xvc2UgdGhlIGNoYW5uZWwgZWFybHkgPyovCisJCS8vZ3NtNDhfc2VuZF9ycl9SZWxlYXNlKGxjaGFuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLy9zdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkX3Rva2VuKHZvaWQpCit2b2lkIG9uX2Rzb19sb2FkX3Rva2VuKHZvaWQpCit7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfU1VCU0NSLCB0b2tlbl9zdWJzY3JfY2IsIE5VTEwpOworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1NNUywgdG9rZW5fc21zX2NiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3RyYW5zYWN0aW9uLmMgYi9vcGVuYnNjL3NyYy90cmFuc2FjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMGQ1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy90cmFuc2FjdGlvbi5jCkBAIC0wLDAgKzEsMTcyIEBACisvKiBHU00gMDQuMDcgVHJhbnNhY3Rpb24gaGFuZGxpbmcgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy90cmFuc2FjdGlvbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21uY2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tbmNjLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKwordm9pZCAqdGFsbF90cmFuc19jdHg7CisKK3ZvaWQgX2dzbTQ4X2NjX3RyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpOworCitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJCSAgIHVfaW50OF90IHByb3RvLCB1X2ludDhfdCB0cmFuc19pZCkKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IHN1YnNjci0+bmV0OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCWlmICh0cmFucy0+c3Vic2NyID09IHN1YnNjciAmJgorCQkgICAgdHJhbnMtPnByb3RvY29sID09IHByb3RvICYmCisJCSAgICB0cmFucy0+dHJhbnNhY3Rpb25faWQgPT0gdHJhbnNfaWQpCisJCQlyZXR1cm4gdHJhbnM7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2NhbGxyZWYoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCXVfaW50MzJfdCBjYWxscmVmKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCWlmICh0cmFucy0+Y2FsbHJlZiA9PSBjYWxscmVmKQorCQkJcmV0dXJuIHRyYW5zOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGdzbV90cmFucyAqdHJhbnNfYWxsb2Moc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICAgICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdHJhbnNfaWQsCisJCQkgICAgICB1X2ludDMyX3QgY2FsbHJlZikKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKworCURFQlVHUChEQ0MsICJzdWJzY3I9JXAsIHN1YnNjci0+bmV0PSVwXG4iLCBzdWJzY3IsIHN1YnNjci0+bmV0KTsKKworCXRyYW5zID0gdGFsbG9jX3plcm8odGFsbF90cmFuc19jdHgsIHN0cnVjdCBnc21fdHJhbnMpOworCWlmICghdHJhbnMpCisJCXJldHVybiBOVUxMOworCisJdHJhbnMtPnN1YnNjciA9IHN1YnNjcjsKKwlzdWJzY3JfZ2V0KHRyYW5zLT5zdWJzY3IpOworCisJdHJhbnMtPnByb3RvY29sID0gcHJvdG9jb2w7CisJdHJhbnMtPnRyYW5zYWN0aW9uX2lkID0gdHJhbnNfaWQ7CisJdHJhbnMtPmNhbGxyZWYgPSBjYWxscmVmOworCisJbGxpc3RfYWRkX3RhaWwoJnRyYW5zLT5lbnRyeSwgJnN1YnNjci0+bmV0LT50cmFuc19saXN0KTsKKworCXJldHVybiB0cmFuczsKK30KKwordm9pZCB0cmFuc19mcmVlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCXN3aXRjaCAodHJhbnMtPnByb3RvY29sKSB7CisJY2FzZSBHU000OF9QRElTQ19DQzoKKwkJX2dzbTQ4X2NjX3RyYW5zX2ZyZWUodHJhbnMpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X1BESVNDX1NNUzoKKwkJX2dzbTQxMV9zbXNfdHJhbnNfZnJlZSh0cmFucyk7CisJCWJyZWFrOworCX0KKworCWlmICh0cmFucy0+Y29ubikKKwkJcHV0X3N1YnNjcl9jb24odHJhbnMtPmNvbm4pOworCisJaWYgKCF0cmFucy0+Y29ubiAmJiB0cmFucy0+c3Vic2NyICYmIHRyYW5zLT5zdWJzY3ItPm5ldCkgeworCQkvKiBTdG9wIHBhZ2luZyBvbiBhbGwgYnRzJyAqLworCQlwYWdpbmdfcmVxdWVzdF9zdG9wKE5VTEwsIHRyYW5zLT5zdWJzY3IsIE5VTEwpOworCX0KKworCWlmICh0cmFucy0+c3Vic2NyKQorCQlzdWJzY3JfcHV0KHRyYW5zLT5zdWJzY3IpOworCisJbGxpc3RfZGVsKCZ0cmFucy0+ZW50cnkpOworCisJdGFsbG9jX2ZyZWUodHJhbnMpOworfQorCisvKiBhbGxvY2F0ZSBhbiB1bnVzZWQgdHJhbnNhY3Rpb24gSUQgZm9yIHRoZSBnaXZlbiBzdWJzY3JpYmVyCisgKiBpbiB0aGUgZ2l2ZW4gcHJvdG9jb2wgdXNpbmcgdGhlIHRpX2ZsYWcgc3BlY2lmaWVkICovCitpbnQgdHJhbnNfYXNzaWduX3RyYW5zX2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdGlfZmxhZykKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IHN1YnNjci0+bmV0OworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOworCXVuc2lnbmVkIGludCB1c2VkX3RpZF9iaXRtYXNrID0gMDsKKwlpbnQgaSwgaiwgaDsKKworCWlmICh0aV9mbGFnKQorCQl0aV9mbGFnID0gMHg4OworCisJLyogZ2VuZXJhdGUgYml0bWFzayBvZiBhbHJlYWR5LXVzZWQgVElEcyBmb3IgdGhpcyAoc3Vic2NyLHByb3RvKSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyYW5zLCAmbmV0LT50cmFuc19saXN0LCBlbnRyeSkgeworCQlpZiAodHJhbnMtPnN1YnNjciAhPSBzdWJzY3IgfHwKKwkJICAgIHRyYW5zLT5wcm90b2NvbCAhPSBwcm90b2NvbCB8fAorCQkgICAgdHJhbnMtPnRyYW5zYWN0aW9uX2lkID09IDB4ZmYpCisJCQljb250aW51ZTsKKwkJdXNlZF90aWRfYml0bWFzayB8PSAoMSA8PCB0cmFucy0+dHJhbnNhY3Rpb25faWQpOworCX0KKworCS8qIGZpbmQgYSBuZXcgb25lLCB0cnlpbmcgdG8gZ28gaW4gYSAnY2lyY3VsYXInIHBhdHRlcm4gKi8KKwlmb3IgKGggPSA2OyBoID4gMDsgaC0tKQorCQlpZiAodXNlZF90aWRfYml0bWFzayAmICgxIDw8IChoIHwgdGlfZmxhZykpKQorCQkJYnJlYWs7CisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQlqID0gKChoICsgaSkgJSA3KSB8IHRpX2ZsYWc7CisJCWlmICgodXNlZF90aWRfYml0bWFzayAmICgxIDw8IGopKSA9PSAwKQorCQkJcmV0dXJuIGo7CisJfQorCisJcmV0dXJuIC0xOworfQorCisvKiB1cGRhdGUgYWxsIHRyYW5zYWN0aW9ucyB0byB1c2UgYSBkaWZmZXJlbnQgTENIQU4sIGUuZy4KKyAqIGFmdGVyIGhhbmRvdmVyIGhhcyBzdWNjZWVkZWQgKi8KK2ludCB0cmFuc19sY2hhbl9jaGFuZ2Uoc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm5fb2xkLAorCQkgICAgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyX2Nvbm5lY3Rpb24gKmNvbm5fbmV3KQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gY29ubl9vbGQtPmxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnM7CisJaW50IG51bSA9IDA7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywgJm5ldC0+dHJhbnNfbGlzdCwgZW50cnkpIHsKKwkJaWYgKHRyYW5zLT5jb25uID09IGNvbm5fb2xkKSB7CisKKwkJCS8qIGRyb3Agb2xkIGNoYW5uZWwgdXNlIGNvdW50ICovCisJCQlwdXRfc3Vic2NyX2Nvbihjb25uX29sZCk7CisJCQkvKiBhc3NpZ24gbmV3IGNoYW5uZWwgKi8KKwkJCXRyYW5zLT5jb25uID0gY29ubl9uZXc7CisJCQkvKiBidW1wIG5ldyBjaGFubmVsIHVzZSBjb3VudCAqLworCQkJdXNlX3N1YnNjcl9jb24oY29ubl9uZXcpOworCQkJbnVtKys7CisJCX0KKwl9CisKKwlyZXR1cm4gbnVtOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdHJhdV9mcmFtZS5jIGIvb3BlbmJzYy9zcmMvdHJhdV9mcmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYzYxYTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy90cmF1X2ZyYW1lLmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qIFRSQVUgZnJhbWUgaGFuZGxpbmcgYWNjb3JkaW5nIHRvIEdTTSBUUyAwOC42MCAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfZnJhbWUuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKK3N0YXRpYyB1X2ludDMyX3QgZ2V0X2JpdHMoY29uc3QgdV9pbnQ4X3QgKmJpdGJ1ZiwgaW50IG9mZnNldCwgaW50IG51bSkKK3sKKwlpbnQgaTsKKwl1X2ludDMyX3QgcmV0ID0gMDsKKworCWZvciAoaSA9IG9mZnNldDsgaSA8IG9mZnNldCArIG51bTsgaSsrKSB7CisJCXJldCA9IHJldCA8PCAxOworCQlpZiAoYml0YnVmW2ldKQorCQkJcmV0IHw9IDE7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIERlY29kZSBhY2NvcmRpbmcgdG8gMy4xLjEgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9mcihzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmciwgY29uc3QgdV9pbnQ4X3QgKnRyYXVfYml0cykKK3sKKwlpbnQgaTsKKwlpbnQgZF9pZHggPSAwOworCisJLyogQzEgLi4gQzE1ICovCisJbWVtY3B5KGZyLT5jX2JpdHMrMCwgdHJhdV9iaXRzKzE3LCAxNSk7CisJLyogQzE2IC4uIEMyMSAqLworCW1lbWNweShmci0+Y19iaXRzKzE1LCB0cmF1X2JpdHMrMzEwLCA2KTsKKwkvKiBUMSAuLiBUNCAqLworCW1lbWNweShmci0+dF9iaXRzKzAsIHRyYXVfYml0cyszMTYsIDQpOworCS8qIEQxIC4uIEQyNTUgKi8KKwlmb3IgKGkgPSAzMjsgaSA8IDMwNDsgaSs9IDE2KSB7CisJCW1lbWNweShmci0+ZF9iaXRzICsgZF9pZHgsIHRyYXVfYml0cytpKzEsIDE1KTsKKwkJZF9pZHggKz0gMTU7CisJfQorCS8qIEQyNTYgLi4gRDI2MCAqLworCW1lbWNweShmci0+ZF9iaXRzICsgZF9pZHgsIHRyYXVfYml0cyArIDMwNSwgNSk7Cit9CisKKy8qIERlY29kZSBhY2NvcmRpbmcgdG8gMy4xLjIgKi8KK3N0YXRpYyB2b2lkIGRlY29kZV9hbXIoc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSAqZnIsIGNvbnN0IHVfaW50OF90ICp0cmF1X2JpdHMpCit7CisJaW50IGk7CisJaW50IGRfaWR4ID0gMDsKKworCS8qIEMxIC4uIEMxNSAqLworCW1lbWNweShmci0+Y19iaXRzKzAsIHRyYXVfYml0cysxNywgMTUpOworCS8qIEMxNiAuLiBDMjUgKi8KKwltZW1jcHkoZnItPmNfYml0cysxNSwgdHJhdV9iaXRzKzMzLCAxMCk7CisJLyogVDEgLi4gVDQgKi8KKwltZW1jcHkoZnItPnRfYml0cyswLCB0cmF1X2JpdHMrMzE2LCA0KTsKKwkvKiBEMSAuLiBENSAqLworCW1lbWNweShmci0+ZF9iaXRzLCB0cmF1X2JpdHMrNDMsIDUpOworCS8qIEQ2IC4uIEQyNDUgKi8KKwlmb3IgKGkgPSA0ODsgaSA8IDMwNDsgaSArPSAxNikgeworCQltZW1jcHkoZnItPmRfYml0cyArIGRfaWR4LCB0cmF1X2JpdHMraSsxLCAxNSk7CisJCWRfaWR4ICs9IDE1OworCX0KKwkvKiBEMjQ2IC4uIEQyNTYgKi8KKwltZW1jcHkoZnItPmRfYml0cyArIGRfaWR4LCB0cmF1X2JpdHMgKyAzMDUsIDExKTsKK30KKworaW50IGRlY29kZV90cmF1X2ZyYW1lKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyLCBjb25zdCB1X2ludDhfdCAqdHJhdV9iaXRzKQoreworCXVfaW50OF90IGNiaXRzNSA9IGdldF9iaXRzKHRyYXVfYml0cywgMTcsIDUpOworCisJc3dpdGNoIChjYml0czUpIHsKKwljYXNlIFRSQVVfRlRfRlJfVVA6CisJY2FzZSBUUkFVX0ZUX0ZSX0RPV046CisJY2FzZSBUUkFVX0ZUX0lETEVfVVA6CisJY2FzZSBUUkFVX0ZUX0lETEVfRE9XTjoKKwljYXNlIFRSQVVfRlRfRUZSOgorCQlkZWNvZGVfZnIoZnIsIHRyYXVfYml0cyk7CisJCWJyZWFrOworCWNhc2UgVFJBVV9GVF9BTVI6CisJCWRlY29kZV9hbXIoZnIsIHRyYXVfYml0cyk7CisJCWJyZWFrOworCWNhc2UgVFJBVV9GVF9PTV9VUDoKKwljYXNlIFRSQVVfRlRfT01fRE9XTjoKKwljYXNlIFRSQVVfRlRfREFUQV9VUDoKKwljYXNlIFRSQVVfRlRfREFUQV9ET1dOOgorCWNhc2UgVFJBVV9GVF9EMTQ1X1NZTkM6CisJY2FzZSBUUkFVX0ZUX0VEQVRBOgorCQlMT0dQKERNVVgsIExPR0xfTk9USUNFLCAiY2FuJ3QgZGVjb2RlIHVuaW1wbGVtZW50ZWQgVFJBVSAiCisJCQkiRnJhbWUgVHlwZSAweCUwMnhcbiIsIGNiaXRzNSk7CisJCXJldHVybiAtMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETVVYLCBMT0dMX05PVElDRSwgImNhbid0IGRlY29kZSB1bmtub3duIFRSQVUgIgorCQkJIkZyYW1lIFR5cGUgMHglMDJ4XG4iLCBjYml0czUpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitjb25zdCB1X2ludDhfdCBmdF9mcl9kb3duX2JpdHNbXSA9IHsgMSwgMSwgMSwgMCwgMCB9OworY29uc3QgdV9pbnQ4X3QgZnRfaWRsZV9kb3duX2JpdHNbXSA9IHsgMCwgMSwgMSwgMSwgMCB9OworCisvKiBtb2RpZnkgYW4gdXBsaW5rIFRSQVUgZnJhbWUgc28gd2UgY2FuIHNlbmQgaXQgZG93bmxpbmsgKi8KK2ludCB0cmF1X2ZyYW1lX3VwMmRvd24oc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSAqZnIpCit7CisJdV9pbnQ4X3QgY2JpdHM1ID0gZ2V0X2JpdHMoZnItPmNfYml0cywgMCwgNSk7CisKKwlzd2l0Y2ggKGNiaXRzNSkgeworCWNhc2UgVFJBVV9GVF9GUl9VUDoKKwkJbWVtY3B5KGZyLT5jX2JpdHMsIGZ0X2ZyX2Rvd25fYml0cywgNSk7CisJCS8qIGNsZWFyIHRpbWUgYWxpZ25tZW50ICovCisJCW1lbXNldChmci0+Y19iaXRzKzUsIDAsIDYpOworCQkvKiBGSVhNRTogU1AgLyBCRkkgaW4gY2FzZSBvZiBEVHggKi8KKwkJLyogQzEyIC4uIEMyMSBhcmUgc3BhcmUgYW5kIGNvZGVkIGFzICcxJyAqLworCQltZW1zZXQoZnItPmNfYml0cysxMSwgMHgwMSwgMTApOworCQlicmVhazsKKwljYXNlIFRSQVVfRlRfRUZSOgorCQkvKiBjbGVhciB0aW1lIGFsaWdubWVudCAqLworCQltZW1zZXQoZnItPmNfYml0cys1LCAwLCA2KTsKKwkJLyogRklYTUU6IHNldCBVRkUgYXBwcm9wcmlhdGVseSAqLworCQkvKiBGSVhNRTogU1AgLyBCRkkgaW4gY2FzZSBvZiBEVHggKi8KKwkJYnJlYWs7CisJY2FzZSBUUkFVX0ZUX0lETEVfVVA6CisJCW1lbWNweShmci0+Y19iaXRzLCBmdF9pZGxlX2Rvd25fYml0cywgNSk7CisJCS8qIGNsZWFyIHRpbWUgYWxpZ25tZW50ICovCisJCW1lbXNldChmci0+Y19iaXRzKzUsIDAsIDYpOworCQkvKiBGSVhNRTogU1AgLyBCRkkgaW4gY2FzZSBvZiBEVHggKi8KKwkJLyogQzEyIC4uIEMyMSBhcmUgc3BhcmUgYW5kIGNvZGVkIGFzICcxJyAqLworCQltZW1zZXQoZnItPmNfYml0cysxMSwgMHgwMSwgMTApOworCQlicmVhazsKKwljYXNlIFRSQVVfRlRfRlJfRE9XTjoKKwljYXNlIFRSQVVfRlRfSURMRV9ET1dOOgorCWNhc2UgVFJBVV9GVF9PTV9ET1dOOgorCWNhc2UgVFJBVV9GVF9EQVRBX0RPV046CisJCS8qIHdlIGNhbm5vdCBjb252ZXJ0IGEgZG93bmxpbmsgdG8gYSBkb3dubGluayBmcmFtZSAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBUUkFVX0ZUX0FNUjoKKwljYXNlIFRSQVVfRlRfT01fVVA6CisJY2FzZSBUUkFVX0ZUX0RBVEFfVVA6CisJY2FzZSBUUkFVX0ZUX0QxNDVfU1lOQzoKKwljYXNlIFRSQVVfRlRfRURBVEE6CisJCUxPR1AoRE1VWCwgTE9HTF9OT1RJQ0UsICJ1bmltcGxlbWVudGVkIFRSQVUgRnJhbWUgVHlwZSAiCisJCQkiMHglMDJ4XG4iLCBjYml0czUpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1VWCwgTE9HTF9OT1RJQ0UsICJ1bmtub3duIFRSQVUgRnJhbWUgVHlwZSAiCisJCQkiMHglMDJ4XG4iLCBjYml0czUpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworCit9CisKK3N0YXRpYyB2b2lkIGVuY29kZV9mcih1X2ludDhfdCAqdHJhdV9iaXRzLCBjb25zdCBzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmcikKK3sKKwlpbnQgaTsKKwlpbnQgZF9pZHggPSAwOworCisJdHJhdV9iaXRzWzE2XSA9IDE7CisJLyogQzEgLi4gQzE1ICovCisJbWVtY3B5KHRyYXVfYml0cysxNywgZnItPmNfYml0cyswLCAxNSk7CisJLyogRDEgLi4gRDI1NSAqLworCWZvciAoaSA9IDMyOyBpIDwgMzA0OyBpKz0gMTYpIHsKKwkJdHJhdV9iaXRzW2ldID0gMTsKKwkJbWVtY3B5KHRyYXVfYml0cytpKzEsIGZyLT5kX2JpdHMgKyBkX2lkeCwgMTUpOworCQlkX2lkeCArPSAxNTsKKwl9CisJLyogRDI1NiAuLiBEMjYwICovCisJdHJhdV9iaXRzWzMwNF0gPSAxOworCW1lbWNweSh0cmF1X2JpdHMgKyAzMDUsIGZyLT5kX2JpdHMgKyBkX2lkeCwgNSk7CisJLyogQzE2IC4uIEMyMSAqLworCW1lbWNweSh0cmF1X2JpdHMrMzEwLCBmci0+Y19iaXRzKzE1LCA2KTsKKworCS8qIEZJWE1FOiBoYW5kbGUgdGltaW5nIGFkanVzdG1lbnQgKi8KKworCS8qIFQxIC4uIFQ0ICovCisJbWVtY3B5KHRyYXVfYml0cyszMTYsIGZyLT50X2JpdHMrMCwgNCk7Cit9CisKKworaW50IGVuY29kZV90cmF1X2ZyYW1lKHVfaW50OF90ICp0cmF1X2JpdHMsIGNvbnN0IHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyKQoreworCXVfaW50OF90IGNiaXRzNSA9IGdldF9iaXRzKGZyLT5jX2JpdHMsIDAsIDUpOworCQorCS8qIDE2IGJpdHMgb2Ygc3luYyBoZWFkZXIgKi8KKwltZW1zZXQodHJhdV9iaXRzLCAwLCAxNik7CisKKwlzd2l0Y2ggKGNiaXRzNSkgeworCWNhc2UgVFJBVV9GVF9GUl9VUDoKKwljYXNlIFRSQVVfRlRfRlJfRE9XTjoKKwljYXNlIFRSQVVfRlRfSURMRV9VUDoKKwljYXNlIFRSQVVfRlRfSURMRV9ET1dOOgorCWNhc2UgVFJBVV9GVF9FRlI6CisJCWVuY29kZV9mcih0cmF1X2JpdHMsIGZyKTsKKwkJYnJlYWs7CisJY2FzZSBUUkFVX0ZUX0FNUjoKKwljYXNlIFRSQVVfRlRfT01fVVA6CisJY2FzZSBUUkFVX0ZUX09NX0RPV046CisJY2FzZSBUUkFVX0ZUX0RBVEFfVVA6CisJY2FzZSBUUkFVX0ZUX0RBVEFfRE9XTjoKKwljYXNlIFRSQVVfRlRfRDE0NV9TWU5DOgorCWNhc2UgVFJBVV9GVF9FREFUQToKKwkJTE9HUChETVVYLCBMT0dMX05PVElDRSwgInVuaW1wbGVtZW50ZWQgVFJBVSBGcmFtZSBUeXBlICIKKwkJCSIweCUwMnhcbiIsIGNiaXRzNSk7CisJCXJldHVybiAtMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETVVYLCBMT0dMX05PVElDRSwgInVua25vd24gVFJBVSBGcmFtZSBUeXBlICIKKwkJCSIweCUwMnhcbiIsIGNiaXRzNSk7CisJCXJldHVybiAtMTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lIGZyX2lkbGVfZnJhbWUgPSB7CisJLmNfYml0cyA9IHsgMCwgMSwgMSwgMSwgMCB9LAkvKiBJRExFIERPV05MSU5LIDMuNS41ICovCisJLnRfYml0cyA9IHsgMSwgMSwgMSwgMSB9LAorfTsKK3N0YXRpYyB1X2ludDhfdCBlbmNvZGVkX2lkbGVfZnJhbWVbVFJBVV9GUkFNRV9CSVRTXTsKK3N0YXRpYyBpbnQgZGJpdHNfaW5pdHRlZDsKKwordV9pbnQ4X3QgKnRyYXVfaWRsZV9mcmFtZSh2b2lkKQoreworCS8qIG9ubHkgaW5pdGlhbGl6ZSBkdXJpbmcgdGhlIGZpcnN0IGNhbGwgKi8KKwlpZiAoIWRiaXRzX2luaXR0ZWQpIHsKKwkJLyogc2V0IGFsbCBELWJpdHMgdG8gMSAqLworCQltZW1zZXQoJmZyX2lkbGVfZnJhbWUuZF9iaXRzLCAweDAxLCAyNjApOworCQllbmNvZGVfZnIoZW5jb2RlZF9pZGxlX2ZyYW1lLCAmZnJfaWRsZV9mcmFtZSk7CisJfQorCXJldHVybiBlbmNvZGVkX2lkbGVfZnJhbWU7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy90cmF1X211eC5jIGIvb3BlbmJzYy9zcmMvdHJhdV9tdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmZhNWMwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdHJhdV9tdXguYwpAQCAtMCwwICsxLDMxMyBAQAorLyogU2ltcGxlIFRSQVUgZnJhbWUgcmVmbGVjdG9yIHRvIHJvdXRlIHZvaWNlIGNhbGxzICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X2ZyYW1lLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X211eC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3ViY2hhbl9kZW11eC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKK3VfaW50OF90IGdzbV9mcl9tYXBbXSA9IHsKKwk2LCA2LCA1LCA1LCA0LCA0LCAzLCAzLAorCTcsIDIsIDIsIDYsIDMsIDMsIDMsIDMsCisJMywgMywgMywgMywgMywgMywgMywgMywKKwkzLCA3LCAyLCAyLCA2LCAzLCAzLCAzLAorCTMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisJMywgMywgNywgMiwgMiwgNiwgMywgMywKKwkzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorCTMsIDMsIDMsIDcsIDIsIDIsIDYsIDMsCisJMywgMywgMywgMywgMywgMywgMywgMywKKwkzLCAzLCAzLCAzCit9OworCitzdHJ1Y3QgbWFwX2VudHJ5IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCBzcmMsIGRzdDsKK307CisKK3N0cnVjdCB1cHF1ZXVlX2VudHJ5IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0OworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCBzcmM7CisJdV9pbnQzMl90IGNhbGxyZWY7Cit9OworCitzdGF0aWMgTExJU1RfSEVBRChzc19tYXApOworc3RhdGljIExMSVNUX0hFQUQoc3NfdXBxdWV1ZSk7CisKK3ZvaWQgKnRhbGxfbWFwX2N0eCwgKnRhbGxfdXBxX2N0eDsKKworLyogbWFwIG9uZSBwYXJ0aWN1bGFyIHN1YnNsb3QgdG8gYW5vdGhlciBzdWJzbG90ICovCitpbnQgdHJhdV9tdXhfbWFwKGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3JjLAorCQkgY29uc3Qgc3RydWN0IGdzbV9lMV9zdWJzbG90ICpkc3QpCit7CisJc3RydWN0IG1hcF9lbnRyeSAqbWU7CisKKwltZSA9IHRhbGxvYyh0YWxsX21hcF9jdHgsIHN0cnVjdCBtYXBfZW50cnkpOworCWlmICghbWUpIHsKKwkJTE9HUChETUlCLCBMT0dMX0ZBVEFMLCAiT3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCURFQlVHUChEQ0MsICJTZXR0aW5nIHVwIFRSQVUgbXV4IG1hcCBiZXR3ZWVuIChlMT0ldSx0cz0ldSxzcz0ldSkgIgorCQkiYW5kIChlMT0ldSx0cz0ldSxzcz0ldSlcbiIsCisJCXNyYy0+ZTFfbnIsIHNyYy0+ZTFfdHMsIHNyYy0+ZTFfdHNfc3MsCisJCWRzdC0+ZTFfbnIsIGRzdC0+ZTFfdHMsIGRzdC0+ZTFfdHNfc3MpOworCisJLyogbWFrZSBzdXJlIHRvIGdldCByaWQgb2YgYW55IHN0YWxlIG9sZCBtYXBwaW5ncyAqLworCXRyYXVfbXV4X3VubWFwKHNyYywgMCk7CisJdHJhdV9tdXhfdW5tYXAoZHN0LCAwKTsKKworCW1lbWNweSgmbWUtPnNyYywgc3JjLCBzaXplb2YobWUtPnNyYykpOworCW1lbWNweSgmbWUtPmRzdCwgZHN0LCBzaXplb2YobWUtPmRzdCkpOworCWxsaXN0X2FkZCgmbWUtPmxpc3QsICZzc19tYXApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB0cmF1X211eF9tYXBfbGNoYW4oY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqc3JjLAkKKwkJCWNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmRzdCkKK3sKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKnNyY19zcywgKmRzdF9zczsKKworCXNyY19zcyA9ICZzcmMtPnRzLT5lMV9saW5rOworCWRzdF9zcyA9ICZkc3QtPnRzLT5lMV9saW5rOworCisJcmV0dXJuIHRyYXVfbXV4X21hcChzcmNfc3MsIGRzdF9zcyk7Cit9CisKKworLyogdW5tYXAgb25lIHBhcnRpY3VsYXIgc3Vic2xvdCBmcm9tIGFub3RoZXIgc3Vic2xvdCAqLworaW50IHRyYXVfbXV4X3VubWFwKGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3MsIHVfaW50MzJfdCBjYWxscmVmKQoreworCXN0cnVjdCBtYXBfZW50cnkgKm1lLCAqbWUyOworCXN0cnVjdCB1cHF1ZXVlX2VudHJ5ICp1ZSwgKnVlMjsKKworCWlmIChzcykKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtZSwgbWUyLCAmc3NfbWFwLCBsaXN0KSB7CisJCQlpZiAoIW1lbWNtcCgmbWUtPnNyYywgc3MsIHNpemVvZigqc3MpKSB8fAorCQkJICAgICFtZW1jbXAoJm1lLT5kc3QsIHNzLCBzaXplb2YoKnNzKSkpIHsKKwkJCQlsbGlzdF9kZWwoJm1lLT5saXN0KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodWUsIHVlMiwgJnNzX3VwcXVldWUsIGxpc3QpIHsKKwkJaWYgKHVlLT5jYWxscmVmID09IGNhbGxyZWYpIHsKKwkJCWxsaXN0X2RlbCgmdWUtPmxpc3QpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHNzICYmICFtZW1jbXAoJnVlLT5zcmMsIHNzLCBzaXplb2YoKnNzKSkpIHsKKwkJCWxsaXN0X2RlbCgmdWUtPmxpc3QpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKKy8qIGxvb2stdXAgYW4gZW50eSBpbiB0aGUgVFJBVSBtdXggbWFwICovCitzdGF0aWMgc3RydWN0IGdzbV9lMV9zdWJzbG90ICoKK2xvb2t1cF90cmF1X211eF9tYXAoY29uc3Qgc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmMpCit7CisJc3RydWN0IG1hcF9lbnRyeSAqbWU7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShtZSwgJnNzX21hcCwgbGlzdCkgeworCQlpZiAoIW1lbWNtcCgmbWUtPnNyYywgc3JjLCBzaXplb2YoKnNyYykpKQorCQkJcmV0dXJuICZtZS0+ZHN0OworCQlpZiAoIW1lbWNtcCgmbWUtPmRzdCwgc3JjLCBzaXplb2YoKnNyYykpKQorCQkJcmV0dXJuICZtZS0+c3JjOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogbG9vay11cCBhbiBlbnR5IGluIHRoZSBUUkFVIHVwcXVldWUgKi8KK3N0cnVjdCB1cHF1ZXVlX2VudHJ5ICoKK2xvb2t1cF90cmF1X3VwcXVldWUoY29uc3Qgc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmMpCit7CisJc3RydWN0IHVwcXVldWVfZW50cnkgKnVlOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodWUsICZzc191cHF1ZXVlLCBsaXN0KSB7CisJCWlmICghbWVtY21wKCZ1ZS0+c3JjLCBzcmMsIHNpemVvZigqc3JjKSkpCisJCQlyZXR1cm4gdWU7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgY19iaXRzX2NoZWNrW10gPSB7IDAsIDAsIDAsIDEsIDAgfTsKKworLyogd2UgZ2V0IGNhbGxlZCBieSBzdWJjaGFuX2RlbXV4ICovCitpbnQgdHJhdV9tdXhfaW5wdXQoc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmNfZTFfc3MsCisJCSAgIGNvbnN0IHVfaW50OF90ICp0cmF1X2JpdHMsIGludCBudW1fYml0cykKK3sKKwlzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lIHRmOworCXVfaW50OF90IHRyYXVfYml0c19vdXRbVFJBVV9GUkFNRV9CSVRTXTsKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmRzdF9lMV9zcyA9IGxvb2t1cF90cmF1X211eF9tYXAoc3JjX2UxX3NzKTsKKwlzdHJ1Y3Qgc3ViY2hfbXV4ICpteDsKKwlzdHJ1Y3QgdXBxdWV1ZV9lbnRyeSAqdWU7CisJaW50IHJjOworCisJLyogZGVjb2RlIFRSQVUsIGNoYW5nZSBpdCB0byBkb3dubGluaywgcmUtZW5jb2RlICovCisJcmMgPSBkZWNvZGVfdHJhdV9mcmFtZSgmdGYsIHRyYXVfYml0cyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoIWRzdF9lMV9zcykgeworCQlzdHJ1Y3QgbXNnYiAqbXNnOworCQlzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKmZyYW1lOworCQl1bnNpZ25lZCBjaGFyICpkYXRhOworCQlpbnQgaSwgaiwgaywgbCwgbzsKKwkJLyogZnJhbWUgc2hhbGwgYmUgc2VudCB0byB1cHF1ZXVlICovCisJCWlmICghKHVlID0gbG9va3VwX3RyYXVfdXBxdWV1ZShzcmNfZTFfc3MpKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXVlLT5jYWxscmVmKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChtZW1jbXAodGYuY19iaXRzLCBjX2JpdHNfY2hlY2ssIHNpemVvZihjX2JpdHNfY2hlY2spKSkKKwkJCURFQlVHUEMoRE1VWCwgImlsbGVnYWwgdHJhdSAoQzEtQzUpICVzXG4iLAorCQkJCWhleGR1bXAodGYuY19iaXRzLCBzaXplb2YoY19iaXRzX2NoZWNrKSkpOworCQltc2cgPSBtc2diX2FsbG9jKHNpemVvZihzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUpICsgMzMsCisJCQkJICJHU00tREFUQSIpOworCQlpZiAoIW1zZykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWZyYW1lID0gKHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqKW1zZy0+ZGF0YTsKKwkJbWVtc2V0KGZyYW1lLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9kYXRhX2ZyYW1lKSk7CisJCWRhdGEgPSBmcmFtZS0+ZGF0YTsKKwkJZGF0YVswXSA9IDB4ZCA8PCA0OworCQkvKiByZWFzc2VtYmxlIGQtYml0cyAqLworCQlpID0gMDsgLyogY291bnRzIGJpdHMgKi8KKwkJaiA9IDQ7IC8qIGNvdW50cyBvdXRwdXQgYml0cyAqLworCQlrID0gZ3NtX2ZyX21hcFswXS0xOyAvKiBjdXJyZW50IG51bWJlciBiaXQgaW4gZWxlbWVudCAqLworCQlsID0gMDsgLyogY291bnRzIGVsZW1lbnQgYml0cyAqLworCQlvID0gMDsgLyogb2Zmc2V0IGlucHV0IGJpdHMgKi8KKwkJd2hpbGUgKGkgPCAyNjApIHsKKwkJCWRhdGFbai84XSB8PSAodGYuZF9iaXRzW2srb10gPDwgKDctKGolOCkpKTsKKwkJCWlmICgtLWsgPCAwKSB7CisJCQkJbyArPSBnc21fZnJfbWFwW2xdOworCQkJCWsgPSBnc21fZnJfbWFwWysrbF0tMTsKKwkJCX0KKwkJCWkrKzsKKwkJCWorKzsKKwkJfQorCQlmcmFtZS0+bXNnX3R5cGUgPSBHU01fVENIRl9GUkFNRTsKKwkJZnJhbWUtPmNhbGxyZWYgPSB1ZS0+Y2FsbHJlZjsKKwkJbXNnYl9lbnF1ZXVlKCZ1ZS0+bmV0LT51cHF1ZXVlLCBtc2cpOworCisJCXJldHVybiAwOworCX0KKworCW14ID0gZTFpbnBfZ2V0X211eChkc3RfZTFfc3MtPmUxX25yLCBkc3RfZTFfc3MtPmUxX3RzKTsKKwlpZiAoIW14KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRyYXVfZnJhbWVfdXAyZG93bigmdGYpOworCWVuY29kZV90cmF1X2ZyYW1lKHRyYXVfYml0c19vdXQsICZ0Zik7CisKKwkvKiBhbmQgc2VuZCBpdCB0byB0aGUgbXV4ZXIgKi8KKwlyZXR1cm4gc3ViY2hhbl9tdXhfZW5xdWV1ZShteCwgZHN0X2UxX3NzLT5lMV90c19zcywgdHJhdV9iaXRzX291dCwKKwkJCQkgICBUUkFVX0ZSQU1FX0JJVFMpOworfQorCisvKiBhZGQgcmVjZWl2ZXIgaW5zdGFuY2UgZm9yIGxjaGFuIGFuZCBjYWxscmVmICovCitpbnQgdHJhdV9yZWN2X2xjaGFuKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDMyX3QgY2FsbHJlZikKK3sKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKnNyY19zczsKKwlzdHJ1Y3QgdXBxdWV1ZV9lbnRyeSAqdWU7CisKKwl1ZSA9IHRhbGxvYyh0YWxsX3VwcV9jdHgsIHN0cnVjdCB1cHF1ZXVlX2VudHJ5KTsKKwlpZiAoIXVlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNyY19zcyA9ICZsY2hhbi0+dHMtPmUxX2xpbms7CisKKwlERUJVR1AoRENDLCAiU2V0dGluZyB1cCBUUkFVIHJlY2VpdmVyIChlMT0ldSx0cz0ldSxzcz0ldSkgIgorCQkiYW5kIChjYWxscmVmIDB4JXgpXG4iLAorCQlzcmNfc3MtPmUxX25yLCBzcmNfc3MtPmUxX3RzLCBzcmNfc3MtPmUxX3RzX3NzLAorCQljYWxscmVmKTsKKworCS8qIG1ha2Ugc3VyZSB0byBnZXQgcmlkIG9mIGFueSBzdGFsZSBvbGQgbWFwcGluZ3MgKi8KKwl0cmF1X211eF91bm1hcChzcmNfc3MsIGNhbGxyZWYpOworCisJbWVtY3B5KCZ1ZS0+c3JjLCBzcmNfc3MsIHNpemVvZih1ZS0+c3JjKSk7CisJdWUtPm5ldCA9IGxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisJdWUtPmNhbGxyZWYgPSBjYWxscmVmOworCWxsaXN0X2FkZCgmdWUtPmxpc3QsICZzc191cHF1ZXVlKTsKKworCXJldHVybiAwOworfQorCitpbnQgdHJhdV9zZW5kX2ZyYW1lKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKmZyYW1lKQoreworCXVfaW50OF90IHRyYXVfYml0c19vdXRbVFJBVV9GUkFNRV9CSVRTXTsKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmRzdF9lMV9zcyA9ICZsY2hhbi0+dHMtPmUxX2xpbms7CisJc3RydWN0IHN1YmNoX211eCAqbXg7CisJaW50IGksIGosIGssIGwsIG87CisJdW5zaWduZWQgY2hhciAqZGF0YSA9IGZyYW1lLT5kYXRhOworCXN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgdGY7CisKKwlteCA9IGUxaW5wX2dldF9tdXgoZHN0X2UxX3NzLT5lMV9uciwgZHN0X2UxX3NzLT5lMV90cyk7CisJaWYgKCFteCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGZyYW1lLT5tc2dfdHlwZSkgeworCWNhc2UgR1NNX1RDSEZfRlJBTUU6CisJCS8qIHNldCBjLWJpdHMgYW5kIHQtYml0cyAqLworCQl0Zi5jX2JpdHNbMF0gPSAxOworCQl0Zi5jX2JpdHNbMV0gPSAxOworCQl0Zi5jX2JpdHNbMl0gPSAxOworCQl0Zi5jX2JpdHNbM10gPSAwOworCQl0Zi5jX2JpdHNbNF0gPSAwOworCQltZW1zZXQoJnRmLmNfYml0c1s1XSwgMCwgNik7CisJCW1lbXNldCgmdGYuY19iaXRzWzExXSwgMSwgMTApOworCQltZW1zZXQoJnRmLnRfYml0c1swXSwgMSwgNCk7CisJCS8qIHJlYXNzZW1ibGUgZC1iaXRzICovCisJCWkgPSAwOyAvKiBjb3VudHMgYml0cyAqLworCQlqID0gNDsgLyogY291bnRzIGlucHV0IGJpdHMgKi8KKwkJayA9IGdzbV9mcl9tYXBbMF0tMTsgLyogY3VycmVudCBudW1iZXIgYml0IGluIGVsZW1lbnQgKi8KKwkJbCA9IDA7IC8qIGNvdW50cyBlbGVtZW50IGJpdHMgKi8KKwkJbyA9IDA7IC8qIG9mZnNldCBvdXRwdXQgYml0cyAqLworCQl3aGlsZSAoaSA8IDI2MCkgeworCQkJdGYuZF9iaXRzW2srb10gPSAoZGF0YVtqLzhdID4+ICg3LShqJTgpKSkgJiAxOworCQkJaWYgKC0tayA8IDApIHsKKwkJCQlvICs9IGdzbV9mcl9tYXBbbF07CisJCQkJayA9IGdzbV9mcl9tYXBbKytsXS0xOworCQkJfQorCQkJaSsrOworCQkJaisrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUEMoRE1VWCwgInVuc3VwcG9ydGVkIG1lc3NhZ2UgdHlwZSAlZFxuIiwKKwkJCWZyYW1lLT5tc2dfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVuY29kZV90cmF1X2ZyYW1lKHRyYXVfYml0c19vdXQsICZ0Zik7CisKKwkvKiBhbmQgc2VuZCBpdCB0byB0aGUgbXV4ZXIgKi8KKwlyZXR1cm4gc3ViY2hhbl9tdXhfZW5xdWV1ZShteCwgZHN0X2UxX3NzLT5lMV90c19zcywgdHJhdV9iaXRzX291dCwKKwkJCQkgICBUUkFVX0ZSQU1FX0JJVFMpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdXNzZC5jIGIvb3BlbmJzYy9zcmMvdXNzZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NzY5MTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy91c3NkLmMKQEAgLTAsMCArMSw3MSBAQAorLyogTmV0d29yay1zcGVjaWZpYyBoYW5kbGluZyBvZiBtb2JpbGUtb3JpZ2luYXRlZCBVU1NEcy4gKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDgsIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDkgYnkgTWlrZSBIYWJlbiA8bWljaGFlbC5oYWJlbkBidGludGVybmV0LmNvbT4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworLyogVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgbmV0d29yay1zcGVjaWZpYyBoYW5kbGluZyBvZiBtb2JpbGUtb3JpZ2luYXRlZAorICAgVVNTRCBtZXNzYWdlcy4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzgwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworLyogRGVjbGFyYXRpb25zIG9mIFVTU0Qgc3RyaW5ncyB0byBiZSByZWNvZ25pc2VkICovCitjb25zdCBjaGFyIFVTU0RfVEVYVF9PV05fTlVNQkVSW10gPSAiKiMxMDAjIjsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgbmV0d29yay1zcGVjaWZpYyBoYW5kbGVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBzZW5kX293bl9udW1iZXIoY29uc3Qgc3RydWN0IG1zZ2IgKm1zZywgY29uc3Qgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKTsKKworCisvKiBFbnRyeXBvaW50IC0gaGFuZGxlciBmdW5jdGlvbiBjb21tb24gdG8gYWxsIG1vYmlsZS1vcmlnaW5hdGVkIFVTU0RzICovCitpbnQgaGFuZGxlX3Jjdl91c3NkKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IHVzc2RfcmVxdWVzdCByZXE7CisKKwlnc20wNDgwX2RlY29kZV91c3NkX3JlcXVlc3QobXNnLCAmcmVxKTsKKwlpZiAocmVxLnRleHRbMF0gPT0gMHhGRikgIC8qIFJlbGVhc2UtQ29tcGxldGUgKi8KKwkJcmV0dXJuIDA7CisKKwlpZiAoc3Ryc3RyKFVTU0RfVEVYVF9PV05fTlVNQkVSLCByZXEudGV4dCkgIT0gTlVMTCkgeworCQlERUJVR1AoRE1NLCAiVVNTRDogT3duIG51bWJlciByZXF1ZXN0ZWRcbiIpOworCQlyZXR1cm4gc2VuZF9vd25fbnVtYmVyKG1zZywgJnJlcSk7CisJfSBlbHNlIHsKKwkJREVCVUdQKERNTSwgIlVuaGFuZGxlZCBVU1NEICVzXG4iLCByZXEudGV4dCk7CisJCXJldHVybiBnc20wNDgwX3NlbmRfdXNzZF9yZWplY3QobXNnLCAmcmVxKTsKKwl9Cit9CisKKy8qIEEgbmV0d29yay1zcGVjaWZpYyBoYW5kbGVyIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IHNlbmRfb3duX251bWJlcihjb25zdCBzdHJ1Y3QgbXNnYiAqbXNnLCBjb25zdCBzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJY2hhciAqb3duX251bWJlciA9IG1zZy0+bGNoYW4tPmNvbm4uc3Vic2NyLT5leHRlbnNpb247CisJY2hhciByZXNwb25zZV9zdHJpbmdbR1NNX0VYVEVOU0lPTl9MRU5HVEggKyAyMF07CisKKwkvKiBOZWVkIHRyYWlsaW5nIENSIGFzIEVPVCBjaGFyYWN0ZXIgKi8KKwlzbnByaW50ZihyZXNwb25zZV9zdHJpbmcsIHNpemVvZihyZXNwb25zZV9zdHJpbmcpLCAiWW91ciBleHRlbnNpb24gaXMgJXNcciIsIG93bl9udW1iZXIpOworCXJldHVybiBnc20wNDgwX3NlbmRfdXNzZF9yZXNwb25zZShtc2csIHJlc3BvbnNlX3N0cmluZywgcmVxKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eS9idWZmZXIuYyBiL29wZW5ic2Mvc3JjL3Z0eS9idWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTVkMDYyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5L2J1ZmZlci5jCkBAIC0wLDAgKzEsNDYzIEBACisvKgorICogQnVmZmVyaW5nIG9mIG91dHB1dCBhbmQgaW5wdXQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggS3VuaWhpcm8gSXNoaWd1cm8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCisgKgorICogR05VIFplYnJhIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPHZ0eS9idWZmZXIuaD4KKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisKKy8qIEJ1ZmZlciBtYXN0ZXIuICovCitzdHJ1Y3QgYnVmZmVyIHsKKwkvKiBEYXRhIGxpc3QuICovCisJc3RydWN0IGJ1ZmZlcl9kYXRhICpoZWFkOworCXN0cnVjdCBidWZmZXJfZGF0YSAqdGFpbDsKKworCS8qIFNpemUgb2YgZWFjaCBidWZmZXJfZGF0YSBjaHVuay4gKi8KKwlzaXplX3Qgc2l6ZTsKK307CisKKy8qIERhdGEgY29udGFpbmVyLiAqLworc3RydWN0IGJ1ZmZlcl9kYXRhIHsKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKm5leHQ7CisKKwkvKiBMb2NhdGlvbiB0byBhZGQgbmV3IGRhdGEuICovCisJc2l6ZV90IGNwOworCisJLyogUG9pbnRlciB0byBkYXRhIG5vdCB5ZXQgZmx1c2hlZC4gKi8KKwlzaXplX3Qgc3A7CisKKwkvKiBBY3R1YWwgZGF0YSBzdHJlYW0gKHZhcmlhYmxlIGxlbmd0aCkuICovCisJdW5zaWduZWQgY2hhciBkYXRhWzBdOwkvKiByZWFsIGRpbWVuc2lvbiBpcyBidWZmZXItPnNpemUgKi8KK307CisKKy8qIEl0IHNob3VsZCBhbHdheXMgYmUgdHJ1ZSB0aGF0OiAwIDw9IHNwIDw9IGNwIDw9IHNpemUgKi8KKworLyogRGVmYXVsdCBidWZmZXIgc2l6ZSAodXNlZCBpZiBub25lIHNwZWNpZmllZCkuICBJdCBpcyByb3VuZGVkIHVwIHRvIHRoZQorICAgbmV4dCBwYWdlIGJvdW5kZXJ5LiAqLworI2RlZmluZSBCVUZGRVJfU0laRV9ERUZBVUxUCQk0MDk2CisKKyNkZWZpbmUgQlVGRkVSX0RBVEFfRlJFRShEKSB0YWxsb2NfZnJlZSgoRCkpCisKKy8qIE1ha2UgbmV3IGJ1ZmZlci4gKi8KK3N0cnVjdCBidWZmZXIgKmJ1ZmZlcl9uZXcoc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGJ1ZmZlciAqYjsKKworCWIgPSB0YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsIHN0cnVjdCBidWZmZXIpOworCisJaWYgKHNpemUpCisJCWItPnNpemUgPSBzaXplOworCWVsc2UgeworCQlzdGF0aWMgc2l6ZV90IGRlZmF1bHRfc2l6ZTsKKwkJaWYgKCFkZWZhdWx0X3NpemUpIHsKKwkJCWxvbmcgcGdzeiA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKKwkJCWRlZmF1bHRfc2l6ZSA9CisJCQkgICAgKCgoKEJVRkZFUl9TSVpFX0RFRkFVTFQgLSAxKSAvIHBnc3opICsgMSkgKiBwZ3N6KTsKKwkJfQorCQliLT5zaXplID0gZGVmYXVsdF9zaXplOworCX0KKworCXJldHVybiBiOworfQorCisvKiBGcmVlIGJ1ZmZlci4gKi8KK3ZvaWQgYnVmZmVyX2ZyZWUoc3RydWN0IGJ1ZmZlciAqYikKK3sKKwlidWZmZXJfcmVzZXQoYik7CisJdGFsbG9jX2ZyZWUoYik7Cit9CisKKy8qIE1ha2Ugc3RyaW5nIGNsb25lLiAqLworY2hhciAqYnVmZmVyX2dldHN0cihzdHJ1Y3QgYnVmZmVyICpiKQoreworCXNpemVfdCB0b3RsZW4gPSAwOworCXN0cnVjdCBidWZmZXJfZGF0YSAqZGF0YTsKKwljaGFyICpzOworCWNoYXIgKnA7CisKKwlmb3IgKGRhdGEgPSBiLT5oZWFkOyBkYXRhOyBkYXRhID0gZGF0YS0+bmV4dCkKKwkJdG90bGVuICs9IGRhdGEtPmNwIC0gZGF0YS0+c3A7CisJaWYgKCEocyA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsICh0b3RsZW4gKyAxKSwgImJ1ZmZlcl9nZXRzdHIiKSkpCisJCXJldHVybiBOVUxMOworCXAgPSBzOworCWZvciAoZGF0YSA9IGItPmhlYWQ7IGRhdGE7IGRhdGEgPSBkYXRhLT5uZXh0KSB7CisJCW1lbWNweShwLCBkYXRhLT5kYXRhICsgZGF0YS0+c3AsIGRhdGEtPmNwIC0gZGF0YS0+c3ApOworCQlwICs9IGRhdGEtPmNwIC0gZGF0YS0+c3A7CisJfQorCSpwID0gJ1wwJzsKKwlyZXR1cm4gczsKK30KKworLyogUmV0dXJuIDEgaWYgYnVmZmVyIGlzIGVtcHR5LiAqLworaW50IGJ1ZmZlcl9lbXB0eShzdHJ1Y3QgYnVmZmVyICpiKQoreworCXJldHVybiAoYi0+aGVhZCA9PSBOVUxMKTsKK30KKworLyogQ2xlYXIgYW5kIGZyZWUgYWxsIGFsbG9jYXRlZCBkYXRhLiAqLwordm9pZCBidWZmZXJfcmVzZXQoc3RydWN0IGJ1ZmZlciAqYikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmRhdGE7CisJc3RydWN0IGJ1ZmZlcl9kYXRhICpuZXh0OworCisJZm9yIChkYXRhID0gYi0+aGVhZDsgZGF0YTsgZGF0YSA9IG5leHQpIHsKKwkJbmV4dCA9IGRhdGEtPm5leHQ7CisJCUJVRkZFUl9EQVRBX0ZSRUUoZGF0YSk7CisJfQorCWItPmhlYWQgPSBiLT50YWlsID0gTlVMTDsKK30KKworLyogQWRkIGJ1ZmZlcl9kYXRhIHRvIHRoZSBlbmQgb2YgYnVmZmVyLiAqLworc3RhdGljIHN0cnVjdCBidWZmZXJfZGF0YSAqYnVmZmVyX2FkZChzdHJ1Y3QgYnVmZmVyICpiKQoreworCXN0cnVjdCBidWZmZXJfZGF0YSAqZDsKKworCWQgPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY3R4LAorCQkJIG9mZnNldG9mKHN0cnVjdCBidWZmZXJfZGF0YSwgZGF0YVtiLT5zaXplXSksCisJCQkgImJ1ZmZlcl9hZGQiKTsKKwlpZiAoIWQpCisJCXJldHVybiBOVUxMOworCWQtPmNwID0gZC0+c3AgPSAwOworCWQtPm5leHQgPSBOVUxMOworCisJaWYgKGItPnRhaWwpCisJCWItPnRhaWwtPm5leHQgPSBkOworCWVsc2UKKwkJYi0+aGVhZCA9IGQ7CisJYi0+dGFpbCA9IGQ7CisKKwlyZXR1cm4gZDsKK30KKworLyogV3JpdGUgZGF0YSB0byBidWZmZXIuICovCit2b2lkIGJ1ZmZlcl9wdXQoc3RydWN0IGJ1ZmZlciAqYiwgY29uc3Qgdm9pZCAqcCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGJ1ZmZlcl9kYXRhICpkYXRhID0gYi0+dGFpbDsKKwljb25zdCBjaGFyICpwdHIgPSBwOworCisJLyogV2UgdXNlIGV2ZW4gbGFzdCBvbmUgYnl0ZSBvZiBkYXRhIGJ1ZmZlci4gKi8KKwl3aGlsZSAoc2l6ZSkgeworCQlzaXplX3QgY2h1bms7CisKKwkJLyogSWYgdGhlcmUgaXMgbm8gZGF0YSBidWZmZXIgYWRkIGl0LiAqLworCQlpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGEtPmNwID09IGItPnNpemUpCisJCQlkYXRhID0gYnVmZmVyX2FkZChiKTsKKworCQljaHVuayA9CisJCSAgICAoKHNpemUgPD0KKwkJICAgICAgKGItPnNpemUgLSBkYXRhLT5jcCkpID8gc2l6ZSA6IChiLT5zaXplIC0gZGF0YS0+Y3ApKTsKKwkJbWVtY3B5KChkYXRhLT5kYXRhICsgZGF0YS0+Y3ApLCBwdHIsIGNodW5rKTsKKwkJc2l6ZSAtPSBjaHVuazsKKwkJcHRyICs9IGNodW5rOworCQlkYXRhLT5jcCArPSBjaHVuazsKKwl9Cit9CisKKy8qIEluc2VydCBjaGFyYWN0ZXIgaW50byB0aGUgYnVmZmVyLiAqLwordm9pZCBidWZmZXJfcHV0YyhzdHJ1Y3QgYnVmZmVyICpiLCB1X2NoYXIgYykKK3sKKwlidWZmZXJfcHV0KGIsICZjLCAxKTsKK30KKworLyogUHV0IHN0cmluZyB0byB0aGUgYnVmZmVyLiAqLwordm9pZCBidWZmZXJfcHV0c3RyKHN0cnVjdCBidWZmZXIgKmIsIGNvbnN0IGNoYXIgKmMpCit7CisJYnVmZmVyX3B1dChiLCBjLCBzdHJsZW4oYykpOworfQorCisvKiBLZWVwIGZsdXNoaW5nIGRhdGEgdG8gdGhlIGZkIHVudGlsIHRoZSBidWZmZXIgaXMgZW1wdHkgb3IgYW4gZXJyb3IgaXMKKyAgIGVuY291bnRlcmVkIG9yIHRoZSBvcGVyYXRpb24gd291bGQgYmxvY2suICovCitidWZmZXJfc3RhdHVzX3QgYnVmZmVyX2ZsdXNoX2FsbChzdHJ1Y3QgYnVmZmVyICpiLCBpbnQgZmQpCit7CisJYnVmZmVyX3N0YXR1c190IHJldDsKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmhlYWQ7CisJc2l6ZV90IGhlYWRfc3A7CisKKwlpZiAoIWItPmhlYWQpCisJCXJldHVybiBCVUZGRVJfRU1QVFk7CisJaGVhZF9zcCA9IChoZWFkID0gYi0+aGVhZCktPnNwOworCS8qIEZsdXNoIGFsbCBkYXRhLiAqLworCXdoaWxlICgocmV0ID0gYnVmZmVyX2ZsdXNoX2F2YWlsYWJsZShiLCBmZCkpID09IEJVRkZFUl9QRU5ESU5HKSB7CisJCWlmICgoYi0+aGVhZCA9PSBoZWFkKSAmJiAoaGVhZF9zcCA9PSBoZWFkLT5zcCkKKwkJICAgICYmIChlcnJubyAhPSBFSU5UUikpCisJCQkvKiBObyBkYXRhIHdhcyBmbHVzaGVkLCBzbyBrZXJuZWwgYnVmZmVyIG11c3QgYmUgZnVsbC4gKi8KKwkJCXJldHVybiByZXQ7CisJCWhlYWRfc3AgPSAoaGVhZCA9IGItPmhlYWQpLT5zcDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjaWYgMAorLyogRmx1c2ggZW5vdWdoIGRhdGEgdG8gZmlsbCBhIHRlcm1pbmFsIHdpbmRvdyBvZiB0aGUgZ2l2ZW4gc2NlbmUgKHVzZWQgb25seQorICAgYnkgdnR5IHRlbG5ldCBpbnRlcmZhY2UpLiAqLworYnVmZmVyX3N0YXR1c190CitidWZmZXJfZmx1c2hfd2luZG93KHN0cnVjdCBidWZmZXIgKiBiLCBpbnQgZmQsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKwkJICAgIGludCBlcmFzZV9mbGFnLCBpbnQgbm9fbW9yZV9mbGFnKQoreworCWludCBuYnl0ZXM7CisJaW50IGlvdl9hbGxvYzsKKwlpbnQgaW92X2luZGV4OworCXN0cnVjdCBpb3ZlYyAqaW92OworCXN0cnVjdCBpb3ZlYyBzbWFsbF9pb3ZbM107CisJY2hhciBtb3JlW10gPSAiIC0tTW9yZS0tICI7CisJY2hhciBlcmFzZVtdID0KKwkgICAgeyAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LAorCQknICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsCisJCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgKKwl9OworCXN0cnVjdCBidWZmZXJfZGF0YSAqZGF0YTsKKwlpbnQgY29sdW1uOworCisJaWYgKCFiLT5oZWFkKQorCQlyZXR1cm4gQlVGRkVSX0VNUFRZOworCisJaWYgKGhlaWdodCA8IDEpIHsKKwkJemxvZ193YXJuCisJCSAgICAoIiVzIGNhbGxlZCB3aXRoIG5vbi1wb3NpdGl2ZSB3aW5kb3cgaGVpZ2h0ICVkLCBmb3JjaW5nIHRvIDEiLAorCQkgICAgIF9fZnVuY19fLCBoZWlnaHQpOworCQloZWlnaHQgPSAxOworCX0gZWxzZSBpZiAoaGVpZ2h0ID49IDIpCisJCWhlaWdodC0tOworCWlmICh3aWR0aCA8IDEpIHsKKwkJemxvZ193YXJuCisJCSAgICAoIiVzIGNhbGxlZCB3aXRoIG5vbi1wb3NpdGl2ZSB3aW5kb3cgd2lkdGggJWQsIGZvcmNpbmcgdG8gMSIsCisJCSAgICAgX19mdW5jX18sIHdpZHRoKTsKKwkJd2lkdGggPSAxOworCX0KKworCS8qIEZvciBlcmFzZSBhbmQgbW9yZSBkYXRhIGFkZCB0d28gdG8gYidzIGJ1ZmZlcl9kYXRhIGNvdW50LiAqLworCWlmIChiLT5oZWFkLT5uZXh0ID09IE5VTEwpIHsKKwkJaW92X2FsbG9jID0gc2l6ZW9mKHNtYWxsX2lvdikgLyBzaXplb2Yoc21hbGxfaW92WzBdKTsKKwkJaW92ID0gc21hbGxfaW92OworCX0gZWxzZSB7CisJCWlvdl9hbGxvYyA9ICgoaGVpZ2h0ICogKHdpZHRoICsgMikpIC8gYi0+c2l6ZSkgKyAxMDsKKwkJaW92ID0gWE1BTExPQyhNVFlQRV9UTVAsIGlvdl9hbGxvYyAqIHNpemVvZigqaW92KSk7CisJfQorCWlvdl9pbmRleCA9IDA7CisKKwkvKiBQcmV2aW91c2x5IHByaW50IG91dCBpcyBwZXJmb3JtZWQuICovCisJaWYgKGVyYXNlX2ZsYWcpIHsKKwkJaW92W2lvdl9pbmRleF0uaW92X2Jhc2UgPSBlcmFzZTsKKwkJaW92W2lvdl9pbmRleF0uaW92X2xlbiA9IHNpemVvZiBlcmFzZTsKKwkJaW92X2luZGV4Kys7CisJfQorCisJLyogT3V0cHV0IGRhdGEuICovCisJY29sdW1uID0gMTsJCS8qIENvbHVtbiBwb3NpdGlvbiBvZiBuZXh0IGNoYXJhY3RlciBkaXNwbGF5ZWQuICovCisJZm9yIChkYXRhID0gYi0+aGVhZDsgZGF0YSAmJiAoaGVpZ2h0ID4gMCk7IGRhdGEgPSBkYXRhLT5uZXh0KSB7CisJCXNpemVfdCBjcDsKKworCQljcCA9IGRhdGEtPnNwOworCQl3aGlsZSAoKGNwIDwgZGF0YS0+Y3ApICYmIChoZWlnaHQgPiAwKSkgeworCQkJLyogQ2FsY3VsYXRlIGxpbmVzIHJlbWFpbmluZyBhbmQgY29sdW1uIHBvc2l0aW9uIGFmdGVyIGRpc3BsYXlpbmcKKwkJCSAgIHRoaXMgY2hhcmFjdGVyLiAqLworCQkJaWYgKGRhdGEtPmRhdGFbY3BdID09ICdccicpCisJCQkJY29sdW1uID0gMTsKKwkJCWVsc2UgaWYgKChkYXRhLT5kYXRhW2NwXSA9PSAnXG4nKSB8fCAoY29sdW1uID09IHdpZHRoKSkgeworCQkJCWNvbHVtbiA9IDE7CisJCQkJaGVpZ2h0LS07CisJCQl9IGVsc2UKKwkJCQljb2x1bW4rKzsKKwkJCWNwKys7CisJCX0KKwkJaW92W2lvdl9pbmRleF0uaW92X2Jhc2UgPSAoY2hhciAqKShkYXRhLT5kYXRhICsgZGF0YS0+c3ApOworCQlpb3ZbaW92X2luZGV4KytdLmlvdl9sZW4gPSBjcCAtIGRhdGEtPnNwOworCQlkYXRhLT5zcCA9IGNwOworCisJCWlmIChpb3ZfaW5kZXggPT0gaW92X2FsbG9jKQorCQkJLyogVGhpcyBzaG91bGQgbm90IG9yZGluYXJpbHkgaGFwcGVuLiAqLworCQl7CisJCQlpb3ZfYWxsb2MgKj0gMjsKKwkJCWlmIChpb3YgIT0gc21hbGxfaW92KSB7CisJCQkJemxvZ193YXJuKCIlczogZ3Jvd2luZyBpb3YgYXJyYXkgdG8gJWQ7ICIKKwkJCQkJICAid2lkdGggJWQsIGhlaWdodCAlZCwgc2l6ZSAlbHUiLAorCQkJCQkgIF9fZnVuY19fLCBpb3ZfYWxsb2MsIHdpZHRoLCBoZWlnaHQsCisJCQkJCSAgKHVfbG9uZykgYi0+c2l6ZSk7CisJCQkJaW92ID0KKwkJCQkgICAgWFJFQUxMT0MoTVRZUEVfVE1QLCBpb3YsCisJCQkJCSAgICAgaW92X2FsbG9jICogc2l6ZW9mKCppb3YpKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogVGhpcyBzaG91bGQgYWJzb2x1dGVseSBuZXZlciBvY2N1ci4gKi8KKwkJCQl6bG9nX2VycgorCQkJCSAgICAoIiVzOiBjb3JydXB0aW9uIGRldGVjdGVkOiBpb3Zfc21hbGwgb3ZlcmZsb3dlZDsgIgorCQkJCSAgICAgImhlYWQgJXAsIHRhaWwgJXAsIGhlYWQtPm5leHQgJXAiLAorCQkJCSAgICAgX19mdW5jX18sIGItPmhlYWQsIGItPnRhaWwsIGItPmhlYWQtPm5leHQpOworCQkJCWlvdiA9CisJCQkJICAgIFhNQUxMT0MoTVRZUEVfVE1QLAorCQkJCQkgICAgaW92X2FsbG9jICogc2l6ZW9mKCppb3YpKTsKKwkJCQltZW1jcHkoaW92LCBzbWFsbF9pb3YsIHNpemVvZihzbWFsbF9pb3YpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIEluIGNhc2Ugb2YgYG1vcmUnIGRpc3BsYXkgbmVlZC4gKi8KKwlpZiAoYi0+dGFpbCAmJiAoYi0+dGFpbC0+c3AgPCBiLT50YWlsLT5jcCkgJiYgIW5vX21vcmVfZmxhZykgeworCQlpb3ZbaW92X2luZGV4XS5pb3ZfYmFzZSA9IG1vcmU7CisJCWlvdltpb3ZfaW5kZXhdLmlvdl9sZW4gPSBzaXplb2YgbW9yZTsKKwkJaW92X2luZGV4Kys7CisJfQorI2lmZGVmIElPVl9NQVgKKwkvKiBJT1ZfTUFYIGFyZSBub3JtYWxseSBkZWZpbmVkIGluIDxzeXMvdWlvLmg+ICwgUG9zaXguMWcuCisJICAgZXhhbXBsZTogU29sYXJpczIuNiBhcmUgZGVmaW5lZCBJT1ZfTUFYIHNpemUgYXQgMTYuICAgICAqLworCXsKKwkJc3RydWN0IGlvdmVjICpjX2lvdiA9IGlvdjsKKwkJbmJ5dGVzID0gMDsJLyogTWFrZSBzdXJlIGl0J3MgaW5pdGlhbGl6ZWQuICovCisKKwkJd2hpbGUgKGlvdl9pbmRleCA+IDApIHsKKwkJCWludCBpb3Zfc2l6ZTsKKworCQkJaW92X3NpemUgPQorCQkJICAgICgoaW92X2luZGV4ID4gSU9WX01BWCkgPyBJT1ZfTUFYIDogaW92X2luZGV4KTsKKwkJCWlmICgobmJ5dGVzID0gd3JpdGV2KGZkLCBjX2lvdiwgaW92X3NpemUpKSA8IDApIHsKKwkJCQl6bG9nX3dhcm4oIiVzOiB3cml0ZXYgdG8gZmQgJWQgZmFpbGVkOiAlcyIsCisJCQkJCSAgX19mdW5jX18sIGZkLCBzYWZlX3N0cmVycm9yKGVycm5vKSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIG1vdmUgcG9pbnRlciBpby12ZWN0b3IgKi8KKwkJCWNfaW92ICs9IGlvdl9zaXplOworCQkJaW92X2luZGV4IC09IGlvdl9zaXplOworCQl9CisJfQorI2Vsc2UJCQkJLyogSU9WX01BWCAqLworCWlmICgobmJ5dGVzID0gd3JpdGV2KGZkLCBpb3YsIGlvdl9pbmRleCkpIDwgMCkKKwkJemxvZ193YXJuKCIlczogd3JpdGV2IHRvIGZkICVkIGZhaWxlZDogJXMiLAorCQkJICBfX2Z1bmNfXywgZmQsIHNhZmVfc3RyZXJyb3IoZXJybm8pKTsKKyNlbmRpZgkJCQkvKiBJT1ZfTUFYICovCisKKwkvKiBGcmVlIHByaW50ZWQgYnVmZmVyIGRhdGEuICovCisJd2hpbGUgKGItPmhlYWQgJiYgKGItPmhlYWQtPnNwID09IGItPmhlYWQtPmNwKSkgeworCQlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmRlbDsKKwkJaWYgKCEoYi0+aGVhZCA9IChkZWwgPSBiLT5oZWFkKS0+bmV4dCkpCisJCQliLT50YWlsID0gTlVMTDsKKwkJQlVGRkVSX0RBVEFfRlJFRShkZWwpOworCX0KKworCWlmIChpb3YgIT0gc21hbGxfaW92KQorCQlYRlJFRShNVFlQRV9UTVAsIGlvdik7CisKKwlyZXR1cm4gKG5ieXRlcyA8IDApID8gQlVGRkVSX0VSUk9SIDoKKwkgICAgKGItPmhlYWQgPyBCVUZGRVJfUEVORElORyA6IEJVRkZFUl9FTVBUWSk7Cit9CisjZW5kaWYKKworLyogVGhpcyBmdW5jdGlvbiAodW5saWtlIG90aGVyIGJ1ZmZlcl9mbHVzaCogZnVuY3Rpb25zIGFib3ZlKSBpcyBkZXNpZ25lZAordG8gd29yayB3aXRoIG5vbi1ibG9ja2luZyBzb2NrZXRzLiAgSXQgZG9lcyBub3QgYXR0ZW1wdCB0byB3cml0ZSBvdXQKK2FsbCBvZiB0aGUgcXVldWVkIGRhdGEsIGp1c3QgYSAiYmlnIiBjaHVuay4gIEl0IHJldHVybnMgMCBpZiBpdCB3YXMKK2FibGUgdG8gZW1wdHkgb3V0IHRoZSBidWZmZXJzIGNvbXBsZXRlbHksIDEgaWYgbW9yZSBmbHVzaGluZyBpcworcmVxdWlyZWQgbGF0ZXIsIG9yIC0xIG9uIGEgZmF0YWwgd3JpdGUgZXJyb3IuICovCitidWZmZXJfc3RhdHVzX3QgYnVmZmVyX2ZsdXNoX2F2YWlsYWJsZShzdHJ1Y3QgYnVmZmVyICogYiwgaW50IGZkKQoreworCisvKiBUaGVzZSBhcmUganVzdCByZWFzb25hYmxlIHZhbHVlcyB0byBtYWtlIHN1cmUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YKK2RhdGEgaXMgd3JpdHRlbi4gIFRoZXJlJ3Mgbm8gbmVlZCB0byBnbyBjcmF6eSBhbmQgdHJ5IHRvIHdyaXRlIGl0IGFsbAoraW4gb25lIHNob3QuICovCisjaWZkZWYgSU9WX01BWAorI2RlZmluZSBNQVhfQ0hVTktTICgoSU9WX01BWCA+PSAxNikgPyAxNiA6IElPVl9NQVgpCisjZWxzZQorI2RlZmluZSBNQVhfQ0hVTktTIDE2CisjZW5kaWYKKyNkZWZpbmUgTUFYX0ZMVVNIIDEzMTA3MgorCisJc3RydWN0IGJ1ZmZlcl9kYXRhICpkOworCXNpemVfdCB3cml0dGVuOworCXN0cnVjdCBpb3ZlYyBpb3ZbTUFYX0NIVU5LU107CisJc2l6ZV90IGlvdmNudCA9IDA7CisJc2l6ZV90IG5ieXRlID0gMDsKKworCWZvciAoZCA9IGItPmhlYWQ7IGQgJiYgKGlvdmNudCA8IE1BWF9DSFVOS1MpICYmIChuYnl0ZSA8IE1BWF9GTFVTSCk7CisJICAgICBkID0gZC0+bmV4dCwgaW92Y250KyspIHsKKwkJaW92W2lvdmNudF0uaW92X2Jhc2UgPSBkLT5kYXRhICsgZC0+c3A7CisJCW5ieXRlICs9IChpb3ZbaW92Y250XS5pb3ZfbGVuID0gZC0+Y3AgLSBkLT5zcCk7CisJfQorCisJaWYgKCFuYnl0ZSkKKwkJLyogTm8gZGF0YSB0byBmbHVzaDogc2hvdWxkIHdlIGlzc3VlIGEgd2FybmluZyBtZXNzYWdlPyAqLworCQlyZXR1cm4gQlVGRkVSX0VNUFRZOworCisJLyogb25seSBwbGFjZSB3aGVyZSB3cml0dGVuIHNob3VsZCBiZSBzaWduIGNvbXBhcmVkICovCisJaWYgKChzc2l6ZV90KSAod3JpdHRlbiA9IHdyaXRldihmZCwgaW92LCBpb3ZjbnQpKSA8IDApIHsKKwkJaWYgKEVSUk5PX0lPX1JFVFJZKGVycm5vKSkKKwkJCS8qIENhbGxpbmcgY29kZSBzaG91bGQgdHJ5IGFnYWluIGxhdGVyLiAqLworCQkJcmV0dXJuIEJVRkZFUl9QRU5ESU5HOworCQlyZXR1cm4gQlVGRkVSX0VSUk9SOworCX0KKworCS8qIEZyZWUgcHJpbnRlZCBidWZmZXIgZGF0YS4gKi8KKwl3aGlsZSAod3JpdHRlbiA+IDApIHsKKwkJc3RydWN0IGJ1ZmZlcl9kYXRhICpkOworCQlpZiAoIShkID0gYi0+aGVhZCkpCisJCQlicmVhazsKKwkJaWYgKHdyaXR0ZW4gPCBkLT5jcCAtIGQtPnNwKSB7CisJCQlkLT5zcCArPSB3cml0dGVuOworCQkJcmV0dXJuIEJVRkZFUl9QRU5ESU5HOworCQl9CisKKwkJd3JpdHRlbiAtPSAoZC0+Y3AgLSBkLT5zcCk7CisJCWlmICghKGItPmhlYWQgPSBkLT5uZXh0KSkKKwkJCWItPnRhaWwgPSBOVUxMOworCQlCVUZGRVJfREFUQV9GUkVFKGQpOworCX0KKworCXJldHVybiBiLT5oZWFkID8gQlVGRkVSX1BFTkRJTkcgOiBCVUZGRVJfRU1QVFk7CisKKyN1bmRlZiBNQVhfQ0hVTktTCisjdW5kZWYgTUFYX0ZMVVNICit9CisKK2J1ZmZlcl9zdGF0dXNfdAorYnVmZmVyX3dyaXRlKHN0cnVjdCBidWZmZXIgKiBiLCBpbnQgZmQsIGNvbnN0IHZvaWQgKnAsIHNpemVfdCBzaXplKQoreworCXNzaXplX3QgbmJ5dGVzOworCisjaWYgMAorCS8qIFNob3VsZCB3ZSBhdHRlbXB0IHRvIGRyYWluIGFueSBwcmV2aW91c2x5IGJ1ZmZlcmVkIGRhdGE/ICBUaGlzIGNvdWxkIGhlbHAgcmVkdWNlIGxhdGVuY3kgaW4gcHVzaGluZyBvdXQgdGhlIGRhdGEgaWYgd2UgYXJlIHN0dWNrIGluIGEgbG9uZy1ydW5uaW5nIHRocmVhZCB0aGF0IGlzIHByZXZlbnRpbmcgdGhlIG1haW4gc2VsZWN0IGxvb3AgZnJvbSBjYWxsaW5nIHRoZSBmbHVzaCB0aHJlYWQuLi4gKi8KKworCWlmIChiLT5oZWFkICYmIChidWZmZXJfZmx1c2hfYXZhaWxhYmxlKGIsIGZkKSA9PSBCVUZGRVJfRVJST1IpKQorCQlyZXR1cm4gQlVGRkVSX0VSUk9SOworI2VuZGlmCisJaWYgKGItPmhlYWQpCisJCS8qIEJ1ZmZlciBpcyBub3QgZW1wdHksIHNvIGRvIG5vdCBhdHRlbXB0IHRvIHdyaXRlIHRoZSBuZXcgZGF0YS4gKi8KKwkJbmJ5dGVzID0gMDsKKwllbHNlIGlmICgobmJ5dGVzID0gd3JpdGUoZmQsIHAsIHNpemUpKSA8IDApIHsKKwkJaWYgKEVSUk5PX0lPX1JFVFJZKGVycm5vKSkKKwkJCW5ieXRlcyA9IDA7CisJCWVsc2UKKwkJCXJldHVybiBCVUZGRVJfRVJST1I7CisJfQorCS8qIEFkZCBhbnkgcmVtYWluaW5nIGRhdGEgdG8gdGhlIGJ1ZmZlci4gKi8KKwl7CisJCXNpemVfdCB3cml0dGVuID0gbmJ5dGVzOworCQlpZiAod3JpdHRlbiA8IHNpemUpCisJCQlidWZmZXJfcHV0KGIsICgoY29uc3QgY2hhciAqKXApICsgd3JpdHRlbiwKKwkJCQkgICBzaXplIC0gd3JpdHRlbik7CisJfQorCXJldHVybiBiLT5oZWFkID8gQlVGRkVSX1BFTkRJTkcgOiBCVUZGRVJfRU1QVFk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHkvY2FyZHNoZWxsLmggYi9vcGVuYnNjL3NyYy92dHkvY2FyZHNoZWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxNjRkMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eS9jYXJkc2hlbGwuaApAQCAtMCwwICsxLDYgQEAKKyNpbmNsdWRlICIuLi8uLi9ic2Njb25maWcuaCIKKyNkZWZpbmUgUVVBR0dBX1BST0dOQU1FCVBBQ0tBR0VfTkFNRQorI2RlZmluZSBRVUFHR0FfVkVSU0lPTglQQUNLQUdFX1ZFUlNJT04KKyNkZWZpbmUgUVVBR0dBX0NPUFlSSUdIVCAiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4iCisjZGVmaW5lIENPTkZJR0ZJTEVfTUFTSyAwMjIKKyNkZWZpbmUgU1lTQ09ORkRJUiAiL3Vzci9sb2NhbC9ldGMiCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHkvY29tbWFuZC5jIGIvb3BlbmJzYy9zcmMvdnR5L2NvbW1hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmFlZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5L2NvbW1hbmQuYwpAQCAtMCwwICsxLDM0MTEgQEAKKy8qCisgICAkSWQ6IGNvbW1hbmQuYyx2IDEuNDcgMjAwNS8wNC8yNSAxNjoyNjo0MiBwYXVsIEV4cCAkCisKKyAgIENvbW1hbmQgaW50ZXJwcmV0ZXIgcm91dGluZSBmb3IgdmlydHVhbCB0ZXJtaW5hbCBbYWthIFRlbGV0WXBlXQorICAgQ29weXJpZ2h0IChDKSAxOTk3LCA5OCwgOTkgS3VuaWhpcm8gSXNoaWd1cm8KKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorCitHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKK2J5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyCitvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCitHTlUgWmVicmEgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaW5jbHVkZSAiY2FyZHNoZWxsLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjZGVmaW5lIF9YT1BFTl9TT1VSQ0UKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKy8vI2luY2x1ZGUgIm1lbW9yeS5oIgorLy8jaW5jbHVkZSAibG9nLmgiCisvLyNpbmNsdWRlIDxsaWIvdmVyc2lvbi5oPgorLy8jaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSA8dnR5L3ZlY3Rvci5oPgorI2luY2x1ZGUgPHZ0eS92dHkuaD4KKyNpbmNsdWRlIDx2dHkvY29tbWFuZC5oPgorLy8jaW5jbHVkZSAid29ya3F1ZXVlLmgiCisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCit2b2lkICp0YWxsX3Z0eV9jbWRfY3R4OworCisvKiBDb21tYW5kIHZlY3RvciB3aGljaCBpbmNsdWRlcyBzb21lIGxldmVsIG9mIGNvbW1hbmQgbGlzdHMuIE5vcm1hbGx5CisgICBlYWNoIGRhZW1vbiBtYWludGFpbnMgZWFjaCBvd24gY21kdmVjLiAqLwordmVjdG9yIGNtZHZlYzsKKworLyogSG9zdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuICovCitzdHJ1Y3QgaG9zdCBob3N0OworCisvKiBTdGFuZGFyZCBjb21tYW5kIG5vZGUgc3RydWN0dXJlcy4gKi8KK3N0cnVjdCBjbWRfbm9kZSBhdXRoX25vZGUgPSB7CisJQVVUSF9OT0RFLAorCSJQYXNzd29yZDogIiwKK307CisKK3N0cnVjdCBjbWRfbm9kZSB2aWV3X25vZGUgPSB7CisJVklFV19OT0RFLAorCSIlcz4gIiwKK307CisKK3N0cnVjdCBjbWRfbm9kZSBhdXRoX2VuYWJsZV9ub2RlID0geworCUFVVEhfRU5BQkxFX05PREUsCisJIlBhc3N3b3JkOiAiLAorfTsKKworc3RydWN0IGNtZF9ub2RlIGVuYWJsZV9ub2RlID0geworCUVOQUJMRV9OT0RFLAorCSIlcyMgIiwKK307CisKK3N0cnVjdCBjbWRfbm9kZSBjb25maWdfbm9kZSA9IHsKKwlDT05GSUdfTk9ERSwKKwkiJXMoY29uZmlnKSMgIiwKKwkxCit9OworCisvKiBEZWZhdWx0IG1vdGQgc3RyaW5nLiAqLworY29uc3QgY2hhciAqZGVmYXVsdF9tb3RkID0gIlxyXG5cCitIZWxsbywgdGhpcyBpcyAiIFFVQUdHQV9QUk9HTkFNRSAiICh2ZXJzaW9uICIgUVVBR0dBX1ZFUlNJT04gIikuXHJcblwKKyIgUVVBR0dBX0NPUFlSSUdIVCAiXHJcblwKK1xyXG4iOworCisjaWYgMAorc3RhdGljIHN0cnVjdCBmYWNpbGl0eV9tYXAgeworCWludCBmYWNpbGl0eTsKKwljb25zdCBjaGFyICpuYW1lOworCXNpemVfdCBtYXRjaDsKK30gc3lzbG9nX2ZhY2lsaXRpZXNbXSA9IHsKKwl7CisJTE9HX0tFUk4sICJrZXJuIiwgMX0sIHsKKwlMT0dfVVNFUiwgInVzZXIiLCAyfSwgeworCUxPR19NQUlMLCAibWFpbCIsIDF9LCB7CisJTE9HX0RBRU1PTiwgImRhZW1vbiIsIDF9LCB7CisJTE9HX0FVVEgsICJhdXRoIiwgMX0sIHsKKwlMT0dfU1lTTE9HLCAic3lzbG9nIiwgMX0sIHsKKwlMT0dfTFBSLCAibHByIiwgMn0sIHsKKwlMT0dfTkVXUywgIm5ld3MiLCAxfSwgeworCUxPR19VVUNQLCAidXVjcCIsIDJ9LCB7CisJTE9HX0NST04sICJjcm9uIiwgMX0sCisjaWZkZWYgTE9HX0ZUUAorCXsKKwlMT0dfRlRQLCAiZnRwIiwgMX0sCisjZW5kaWYKKwl7CisJTE9HX0xPQ0FMMCwgImxvY2FsMCIsIDZ9LCB7CisJTE9HX0xPQ0FMMSwgImxvY2FsMSIsIDZ9LCB7CisJTE9HX0xPQ0FMMiwgImxvY2FsMiIsIDZ9LCB7CisJTE9HX0xPQ0FMMywgImxvY2FsMyIsIDZ9LCB7CisJTE9HX0xPQ0FMNCwgImxvY2FsNCIsIDZ9LCB7CisJTE9HX0xPQ0FMNSwgImxvY2FsNSIsIDZ9LCB7CisJTE9HX0xPQ0FMNiwgImxvY2FsNiIsIDZ9LCB7CisJTE9HX0xPQ0FMNywgImxvY2FsNyIsIDZ9LCB7CiswLCBOVUxMLCAwfSx9OworCitzdGF0aWMgY29uc3QgY2hhciAqZmFjaWxpdHlfbmFtZShpbnQgZmFjaWxpdHkpCit7CisJc3RydWN0IGZhY2lsaXR5X21hcCAqZm07CisKKwlmb3IgKGZtID0gc3lzbG9nX2ZhY2lsaXRpZXM7IGZtLT5uYW1lOyBmbSsrKQorCQlpZiAoZm0tPmZhY2lsaXR5ID09IGZhY2lsaXR5KQorCQkJcmV0dXJuIGZtLT5uYW1lOworCXJldHVybiAiIjsKK30KKworc3RhdGljIGludCBmYWNpbGl0eV9tYXRjaChjb25zdCBjaGFyICpzdHIpCit7CisJc3RydWN0IGZhY2lsaXR5X21hcCAqZm07CisKKwlmb3IgKGZtID0gc3lzbG9nX2ZhY2lsaXRpZXM7IGZtLT5uYW1lOyBmbSsrKQorCQlpZiAoIXN0cm5jbXAoc3RyLCBmbS0+bmFtZSwgZm0tPm1hdGNoKSkKKwkJCXJldHVybiBmbS0+ZmFjaWxpdHk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGxldmVsX21hdGNoKGNvbnN0IGNoYXIgKnMpCit7CisJaW50IGxldmVsOworCisJZm9yIChsZXZlbCA9IDA7IHpsb2dfcHJpb3JpdHlbbGV2ZWxdICE9IE5VTEw7IGxldmVsKyspCisJCWlmICghc3RybmNtcChzLCB6bG9nX3ByaW9yaXR5W2xldmVsXSwgMikpCisJCQlyZXR1cm4gbGV2ZWw7CisJcmV0dXJuIFpMT0dfRElTQUJMRUQ7Cit9CisjZW5kaWYKKworLyogVGhpcyBpcyBjYWxsZWQgZnJvbSBtYWluIHdoZW4gYSBkYWVtb24gaXMgaW52b2tlZCB3aXRoIC12IG9yIC0tdmVyc2lvbi4gKi8KK3ZvaWQgcHJpbnRfdmVyc2lvbihjb25zdCBjaGFyICpwcm9nbmFtZSkKK3sKKwlwcmludGYoIiVzIHZlcnNpb24gJXNcbiIsIHByb2duYW1lLCBRVUFHR0FfVkVSU0lPTik7CisJcHJpbnRmKCIlc1xuIiwgUVVBR0dBX0NPUFlSSUdIVCk7Cit9CisMCisvKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNvbmNhdGVuYXRlIGFyZ3YgYXJndW1lbnQgaW50byBhIHNpbmdsZSBzdHJpbmcKKyAgIHdpdGggaW5zZXJ0aW5nICcgJyBjaGFyYWN0ZXIgYmV0d2VlbiBlYWNoIGFyZ3VtZW50LiAgKi8KK2NoYXIgKmFyZ3ZfY29uY2F0KGNvbnN0IGNoYXIgKiphcmd2LCBpbnQgYXJnYywgaW50IHNoaWZ0KQoreworCWludCBpOworCXNpemVfdCBsZW47CisJY2hhciAqc3RyOworCWNoYXIgKnA7CisKKwlsZW4gPSAwOworCWZvciAoaSA9IHNoaWZ0OyBpIDwgYXJnYzsgaSsrKQorCQlsZW4gKz0gc3RybGVuKGFyZ3ZbaV0pICsgMTsKKwlpZiAoIWxlbikKKwkJcmV0dXJuIE5VTEw7CisJcCA9IHN0ciA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBsZW4sICJhcnZnX2NvbmNhdCIpOworCWZvciAoaSA9IHNoaWZ0OyBpIDwgYXJnYzsgaSsrKSB7CisJCXNpemVfdCBhcmdsZW47CisJCW1lbWNweShwLCBhcmd2W2ldLCAoYXJnbGVuID0gc3RybGVuKGFyZ3ZbaV0pKSk7CisJCXAgKz0gYXJnbGVuOworCQkqcCsrID0gJyAnOworCX0KKwkqKHAgLSAxKSA9ICdcMCc7CisJcmV0dXJuIHN0cjsKK30KKworLyogSW5zdGFsbCB0b3Agbm9kZSBvZiBjb21tYW5kIHZlY3Rvci4gKi8KK3ZvaWQgaW5zdGFsbF9ub2RlKHN0cnVjdCBjbWRfbm9kZSAqbm9kZSwgaW50ICgqZnVuYykgKHN0cnVjdCB2dHkgKikpCit7CisJdmVjdG9yX3NldF9pbmRleChjbWR2ZWMsIG5vZGUtPm5vZGUsIG5vZGUpOworCW5vZGUtPmZ1bmMgPSBmdW5jOworCW5vZGUtPmNtZF92ZWN0b3IgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOworfQorCisvKiBDb21wYXJlIHR3byBjb21tYW5kJ3Mgc3RyaW5nLiAgVXNlZCBpbiBzb3J0X25vZGUgKCkuICovCitzdGF0aWMgaW50IGNtcF9ub2RlKGNvbnN0IHZvaWQgKnAsIGNvbnN0IHZvaWQgKnEpCit7CisJc3RydWN0IGNtZF9lbGVtZW50ICphID0gKihzdHJ1Y3QgY21kX2VsZW1lbnQgKiopcDsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmIgPSAqKHN0cnVjdCBjbWRfZWxlbWVudCAqKilxOworCisJcmV0dXJuIHN0cmNtcChhLT5zdHJpbmcsIGItPnN0cmluZyk7Cit9CisKK3N0YXRpYyBpbnQgY21wX2Rlc2MoY29uc3Qgdm9pZCAqcCwgY29uc3Qgdm9pZCAqcSkKK3sKKwlzdHJ1Y3QgZGVzYyAqYSA9ICooc3RydWN0IGRlc2MgKiopcDsKKwlzdHJ1Y3QgZGVzYyAqYiA9ICooc3RydWN0IGRlc2MgKiopcTsKKworCXJldHVybiBzdHJjbXAoYS0+Y21kLCBiLT5jbWQpOworfQorCisvKiBTb3J0IGVhY2ggbm9kZSdzIGNvbW1hbmQgZWxlbWVudCBhY2NvcmRpbmcgdG8gY29tbWFuZCBzdHJpbmcuICovCit2b2lkIHNvcnRfbm9kZSgpCit7CisJdW5zaWduZWQgaW50IGksIGo7CisJc3RydWN0IGNtZF9ub2RlICpjbm9kZTsKKwl2ZWN0b3IgZGVzY3ZlYzsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kdmVjKTsgaSsrKQorCQlpZiAoKGNub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCBpKSkgIT0gTlVMTCkgeworCQkJdmVjdG9yIGNtZF92ZWN0b3IgPSBjbm9kZS0+Y21kX3ZlY3RvcjsKKwkJCXFzb3J0KGNtZF92ZWN0b3ItPmluZGV4LCB2ZWN0b3JfYWN0aXZlKGNtZF92ZWN0b3IpLAorCQkJICAgICAgc2l6ZW9mKHZvaWQgKiksIGNtcF9ub2RlKTsKKworCQkJZm9yIChqID0gMDsgaiA8IHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3Rvcik7IGorKykKKwkJCQlpZiAoKGNtZF9lbGVtZW50ID0KKwkJCQkgICAgIHZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGopKSAhPSBOVUxMCisJCQkJICAgICYmIHZlY3Rvcl9hY3RpdmUoY21kX2VsZW1lbnQtPnN0cnZlYykpIHsKKwkJCQkJZGVzY3ZlYyA9CisJCQkJCSAgICB2ZWN0b3Jfc2xvdChjbWRfZWxlbWVudC0+c3RydmVjLAorCQkJCQkJCXZlY3Rvcl9hY3RpdmUKKwkJCQkJCQkoY21kX2VsZW1lbnQtPnN0cnZlYykgLQorCQkJCQkJCTEpOworCQkJCQlxc29ydChkZXNjdmVjLT5pbmRleCwKKwkJCQkJICAgICAgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKSwKKwkJCQkJICAgICAgc2l6ZW9mKHZvaWQgKiksIGNtcF9kZXNjKTsKKwkJCQl9CisJCX0KK30KKworLyogQnJlYWtpbmcgdXAgc3RyaW5nIGludG8gZWFjaCBjb21tYW5kIHBpZWNlLiBJIGFzc3VtZSBnaXZlbgorICAgY2hhcmFjdGVyIGlzIHNlcGFyYXRlZCBieSBhIHNwYWNlIGNoYXJhY3Rlci4gUmV0dXJuIHZhbHVlIGlzIGEKKyAgIHZlY3RvciB3aGljaCBpbmNsdWRlcyBjaGFyICoqIGRhdGEgZWxlbWVudC4gKi8KK3ZlY3RvciBjbWRfbWFrZV9zdHJ2ZWMoY29uc3QgY2hhciAqc3RyaW5nKQoreworCWNvbnN0IGNoYXIgKmNwLCAqc3RhcnQ7CisJY2hhciAqdG9rZW47CisJaW50IHN0cmxlbjsKKwl2ZWN0b3Igc3RydmVjOworCisJaWYgKHN0cmluZyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWNwID0gc3RyaW5nOworCisJLyogU2tpcCB3aGl0ZSBzcGFjZXMuICovCisJd2hpbGUgKGlzc3BhY2UoKGludCkqY3ApICYmICpjcCAhPSAnXDAnKQorCQljcCsrOworCisJLyogUmV0dXJuIGlmIHRoZXJlIGlzIG9ubHkgd2hpdGUgc3BhY2VzICovCisJaWYgKCpjcCA9PSAnXDAnKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICgqY3AgPT0gJyEnIHx8ICpjcCA9PSAnIycpCisJCXJldHVybiBOVUxMOworCisJLyogUHJlcGFyZSByZXR1cm4gdmVjdG9yLiAqLworCXN0cnZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7CisKKwkvKiBDb3B5IGVhY2ggY29tbWFuZCBwaWVjZSBhbmQgc2V0IGludG8gdmVjdG9yLiAqLworCXdoaWxlICgxKSB7CisJCXN0YXJ0ID0gY3A7CisJCXdoaWxlICghKGlzc3BhY2UoKGludCkqY3ApIHx8ICpjcCA9PSAnXHInIHx8ICpjcCA9PSAnXG4nKSAmJgorCQkgICAgICAgKmNwICE9ICdcMCcpCisJCQljcCsrOworCQlzdHJsZW4gPSBjcCAtIHN0YXJ0OworCQl0b2tlbiA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBzdHJsZW4gKyAxLCAibWFrZV9zdHJ2ZWMiKTsKKwkJbWVtY3B5KHRva2VuLCBzdGFydCwgc3RybGVuKTsKKwkJKih0b2tlbiArIHN0cmxlbikgPSAnXDAnOworCQl2ZWN0b3Jfc2V0KHN0cnZlYywgdG9rZW4pOworCisJCXdoaWxlICgoaXNzcGFjZSgoaW50KSpjcCkgfHwgKmNwID09ICdcbicgfHwgKmNwID09ICdccicpICYmCisJCSAgICAgICAqY3AgIT0gJ1wwJykKKwkJCWNwKys7CisKKwkJaWYgKCpjcCA9PSAnXDAnKQorCQkJcmV0dXJuIHN0cnZlYzsKKwl9Cit9CisKKy8qIEZyZWUgYWxsb2NhdGVkIHN0cmluZyB2ZWN0b3IuICovCit2b2lkIGNtZF9mcmVlX3N0cnZlYyh2ZWN0b3IgdikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyICpjcDsKKworCWlmICghdikKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChjcCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKQorCQkJdGFsbG9jX2ZyZWUoY3ApOworCisJdmVjdG9yX2ZyZWUodik7Cit9CisKKy8qIEZldGNoIG5leHQgZGVzY3JpcHRpb24uICBVc2VkIGluIGNtZF9tYWtlX2Rlc2N2ZWMoKS4gKi8KK3N0YXRpYyBjaGFyICpjbWRfZGVzY19zdHIoY29uc3QgY2hhciAqKnN0cmluZykKK3sKKwljb25zdCBjaGFyICpjcCwgKnN0YXJ0OworCWNoYXIgKnRva2VuOworCWludCBzdHJsZW47CisKKwljcCA9ICpzdHJpbmc7CisKKwlpZiAoY3AgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBTa2lwIHdoaXRlIHNwYWNlcy4gKi8KKwl3aGlsZSAoaXNzcGFjZSgoaW50KSpjcCkgJiYgKmNwICE9ICdcMCcpCisJCWNwKys7CisKKwkvKiBSZXR1cm4gaWYgdGhlcmUgaXMgb25seSB3aGl0ZSBzcGFjZXMgKi8KKwlpZiAoKmNwID09ICdcMCcpCisJCXJldHVybiBOVUxMOworCisJc3RhcnQgPSBjcDsKKworCXdoaWxlICghKCpjcCA9PSAnXHInIHx8ICpjcCA9PSAnXG4nKSAmJiAqY3AgIT0gJ1wwJykKKwkJY3ArKzsKKworCXN0cmxlbiA9IGNwIC0gc3RhcnQ7CisJdG9rZW4gPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgc3RybGVuICsgMSwgImNtZF9kZXNjX3N0ciIpOworCW1lbWNweSh0b2tlbiwgc3RhcnQsIHN0cmxlbik7CisJKih0b2tlbiArIHN0cmxlbikgPSAnXDAnOworCisJKnN0cmluZyA9IGNwOworCisJcmV0dXJuIHRva2VuOworfQorCisvKiBOZXcgc3RyaW5nIHZlY3Rvci4gKi8KK3N0YXRpYyB2ZWN0b3IgY21kX21ha2VfZGVzY3ZlYyhjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKmRlc2NzdHIpCit7CisJaW50IG11bHRpcGxlID0gMDsKKwljb25zdCBjaGFyICpzcDsKKwljaGFyICp0b2tlbjsKKwlpbnQgbGVuOworCWNvbnN0IGNoYXIgKmNwOworCWNvbnN0IGNoYXIgKmRwOworCXZlY3RvciBhbGx2ZWM7CisJdmVjdG9yIHN0cnZlYyA9IE5VTEw7CisJc3RydWN0IGRlc2MgKmRlc2M7CisKKwljcCA9IHN0cmluZzsKKwlkcCA9IGRlc2NzdHI7CisKKwlpZiAoY3AgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlhbGx2ZWMgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOworCisJd2hpbGUgKDEpIHsKKwkJd2hpbGUgKGlzc3BhY2UoKGludCkqY3ApICYmICpjcCAhPSAnXDAnKQorCQkJY3ArKzsKKworCQlpZiAoKmNwID09ICcoJykgeworCQkJbXVsdGlwbGUgPSAxOworCQkJY3ArKzsKKwkJfQorCQlpZiAoKmNwID09ICcpJykgeworCQkJbXVsdGlwbGUgPSAwOworCQkJY3ArKzsKKwkJfQorCQlpZiAoKmNwID09ICd8JykgeworCQkJaWYgKCFtdWx0aXBsZSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiQ29tbWFuZCBwYXJzZSBlcnJvciE6ICVzXG4iLAorCQkJCQlzdHJpbmcpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQljcCsrOworCQl9CisKKwkJd2hpbGUgKGlzc3BhY2UoKGludCkqY3ApICYmICpjcCAhPSAnXDAnKQorCQkJY3ArKzsKKworCQlpZiAoKmNwID09ICcoJykgeworCQkJbXVsdGlwbGUgPSAxOworCQkJY3ArKzsKKwkJfQorCisJCWlmICgqY3AgPT0gJ1wwJykKKwkJCXJldHVybiBhbGx2ZWM7CisKKwkJc3AgPSBjcDsKKworCQl3aGlsZSAoIQorCQkgICAgICAgKGlzc3BhY2UoKGludCkqY3ApIHx8ICpjcCA9PSAnXHInIHx8ICpjcCA9PSAnXG4nCisJCQl8fCAqY3AgPT0gJyknIHx8ICpjcCA9PSAnfCcpICYmICpjcCAhPSAnXDAnKQorCQkJY3ArKzsKKworCQlsZW4gPSBjcCAtIHNwOworCisJCXRva2VuID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsIGxlbiArIDEsICJjbWRfbWFrZV9kZXNjdmVjIik7CisJCW1lbWNweSh0b2tlbiwgc3AsIGxlbik7CisJCSoodG9rZW4gKyBsZW4pID0gJ1wwJzsKKworCQlkZXNjID0gdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgc3RydWN0IGRlc2MpOworCQlkZXNjLT5jbWQgPSB0b2tlbjsKKwkJZGVzYy0+c3RyID0gY21kX2Rlc2Nfc3RyKCZkcCk7CisKKwkJaWYgKG11bHRpcGxlKSB7CisJCQlpZiAobXVsdGlwbGUgPT0gMSkgeworCQkJCXN0cnZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7CisJCQkJdmVjdG9yX3NldChhbGx2ZWMsIHN0cnZlYyk7CisJCQl9CisJCQltdWx0aXBsZSsrOworCQl9IGVsc2UgeworCQkJc3RydmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKKwkJCXZlY3Rvcl9zZXQoYWxsdmVjLCBzdHJ2ZWMpOworCQl9CisJCXZlY3Rvcl9zZXQoc3RydmVjLCBkZXNjKTsKKwl9Cit9CisKKy8qIENvdW50IG1hbmRhbnRvcnkgc3RyaW5nIHZlY3RvciBzaXplLiAgVGhpcyBpcyB0byBkZXRlcm1pbmUgaW5wdXRlZAorICAgY29tbWFuZCBoYXMgZW5vdWdoIGNvbW1hbmQgbGVuZ3RoLiAqLworc3RhdGljIGludCBjbWRfY21kc2l6ZSh2ZWN0b3Igc3RydmVjKQoreworCXVuc2lnbmVkIGludCBpOworCWludCBzaXplID0gMDsKKwl2ZWN0b3IgZGVzY3ZlYzsKKwlzdHJ1Y3QgZGVzYyAqZGVzYzsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHN0cnZlYyk7IGkrKykKKwkJaWYgKChkZXNjdmVjID0gdmVjdG9yX3Nsb3Qoc3RydmVjLCBpKSkgIT0gTlVMTCkgeworCQkJaWYgKCh2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpKSA9PSAxCisJCQkgICAgJiYgKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCAwKSkgIT0gTlVMTCkgeworCQkJCWlmIChkZXNjLT5jbWQgPT0gTlVMTCB8fCBDTURfT1BUSU9OKGRlc2MtPmNtZCkpCisJCQkJCXJldHVybiBzaXplOworCQkJCWVsc2UKKwkJCQkJc2l6ZSsrOworCQkJfSBlbHNlCisJCQkJc2l6ZSsrOworCQl9CisJcmV0dXJuIHNpemU7Cit9CisKKy8qIFJldHVybiBwcm9tcHQgY2hhcmFjdGVyIG9mIHNwZWNpZmllZCBub2RlLiAqLworY29uc3QgY2hhciAqY21kX3Byb21wdChlbnVtIG5vZGVfdHlwZSBub2RlKQoreworCXN0cnVjdCBjbWRfbm9kZSAqY25vZGU7CisKKwljbm9kZSA9IHZlY3Rvcl9zbG90KGNtZHZlYywgbm9kZSk7CisJcmV0dXJuIGNub2RlLT5wcm9tcHQ7Cit9CisKKy8qIEluc3RhbGwgYSBjb21tYW5kIGludG8gYSBub2RlLiAqLwordm9pZCBpbnN0YWxsX2VsZW1lbnQoZW51bSBub2RlX3R5cGUgbnR5cGUsIHN0cnVjdCBjbWRfZWxlbWVudCAqY21kKQoreworCXN0cnVjdCBjbWRfbm9kZSAqY25vZGU7CisKKwljbm9kZSA9IHZlY3Rvcl9zbG90KGNtZHZlYywgbnR5cGUpOworCisJaWYgKGNub2RlID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiQ29tbWFuZCBub2RlICVkIGRvZXNuJ3QgZXhpc3QsIHBsZWFzZSBjaGVjayBpdFxuIiwKKwkJCW50eXBlKTsKKwkJZXhpdCgxKTsKKwl9CisKKwl2ZWN0b3Jfc2V0KGNub2RlLT5jbWRfdmVjdG9yLCBjbWQpOworCisJY21kLT5zdHJ2ZWMgPSBjbWRfbWFrZV9kZXNjdmVjKGNtZC0+c3RyaW5nLCBjbWQtPmRvYyk7CisJY21kLT5jbWRzaXplID0gY21kX2NtZHNpemUoY21kLT5zdHJ2ZWMpOworfQorCisjaWZkZWYgVlRZX0NSWVBUX1BXCitzdGF0aWMgdW5zaWduZWQgY2hhciBpdG9hNjRbXSA9CisgICAgIi4vMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworCitzdGF0aWMgdm9pZCB0bzY0KGNoYXIgKnMsIGxvbmcgdiwgaW50IG4pCit7CisJd2hpbGUgKC0tbiA+PSAwKSB7CisJCSpzKysgPSBpdG9hNjRbdiAmIDB4M2ZdOworCQl2ID4+PSA2OworCX0KK30KKworc3RhdGljIGNoYXIgKnplbmNyeXB0KGNvbnN0IGNoYXIgKnBhc3N3ZCkKK3sKKwljaGFyIHNhbHRbNl07CisJc3RydWN0IHRpbWV2YWwgdHY7CisJY2hhciAqY3J5cHQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisJZ2V0dGltZW9mZGF5KCZ0diwgMCk7CisKKwl0bzY0KCZzYWx0WzBdLCByYW5kb20oKSwgMyk7CisJdG82NCgmc2FsdFszXSwgdHYudHZfdXNlYywgMyk7CisJc2FsdFs1XSA9ICdcMCc7CisKKwlyZXR1cm4gY3J5cHQocGFzc3dkLCBzYWx0KTsKK30KKyNlbmRpZgorCisvKiBUaGlzIGZ1bmN0aW9uIHdyaXRlIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBob3N0LiAqLworc3RhdGljIGludCBjb25maWdfd3JpdGVfaG9zdChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaWYgKGhvc3QubmFtZSkKKwkJdnR5X291dCh2dHksICJob3N0bmFtZSAlcyVzIiwgaG9zdC5uYW1lLCBWVFlfTkVXTElORSk7CisKKwlpZiAoaG9zdC5lbmNyeXB0KSB7CisJCWlmIChob3N0LnBhc3N3b3JkX2VuY3J5cHQpCisJCQl2dHlfb3V0KHZ0eSwgInBhc3N3b3JkIDggJXMlcyIsIGhvc3QucGFzc3dvcmRfZW5jcnlwdCwKKwkJCQlWVFlfTkVXTElORSk7CisJCWlmIChob3N0LmVuYWJsZV9lbmNyeXB0KQorCQkJdnR5X291dCh2dHksICJlbmFibGUgcGFzc3dvcmQgOCAlcyVzIiwKKwkJCQlob3N0LmVuYWJsZV9lbmNyeXB0LCBWVFlfTkVXTElORSk7CisJfSBlbHNlIHsKKwkJaWYgKGhvc3QucGFzc3dvcmQpCisJCQl2dHlfb3V0KHZ0eSwgInBhc3N3b3JkICVzJXMiLCBob3N0LnBhc3N3b3JkLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJaWYgKGhvc3QuZW5hYmxlKQorCQkJdnR5X291dCh2dHksICJlbmFibGUgcGFzc3dvcmQgJXMlcyIsIGhvc3QuZW5hYmxlLAorCQkJCVZUWV9ORVdMSU5FKTsKKwl9CisKKyNpZiAwCisJaWYgKHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwgIT0gTE9HX0RFQlVHKSB7CisJCXZ0eV9vdXQodnR5LCAiISBOLkIuIFRoZSAnbG9nIHRyYXAnIGNvbW1hbmQgaXMgZGVwcmVjYXRlZC4lcyIsCisJCQlWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAibG9nIHRyYXAgJXMlcyIsCisJCQl6bG9nX3ByaW9yaXR5W3psb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmxdLCBWVFlfTkVXTElORSk7CisJfQorCisJaWYgKGhvc3QubG9nZmlsZQorCSAgICAmJiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX0ZJTEVdICE9IFpMT0dfRElTQUJMRUQpKSB7CisJCXZ0eV9vdXQodnR5LCAibG9nIGZpbGUgJXMiLCBob3N0LmxvZ2ZpbGUpOworCQlpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX0ZJTEVdICE9CisJCSAgICB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKQorCQkJdnR5X291dCh2dHksICIgJXMiLAorCQkJCXpsb2dfcHJpb3JpdHlbemxvZ19kZWZhdWx0LT4KKwkJCQkJICAgICAgbWF4bHZsW1pMT0dfREVTVF9GSUxFXV0pOworCQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCX0KKworCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfU1RET1VUXSAhPSBaTE9HX0RJU0FCTEVEKSB7CisJCXZ0eV9vdXQodnR5LCAibG9nIHN0ZG91dCIpOworCQlpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX1NURE9VVF0gIT0KKwkJICAgIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpCisJCQl2dHlfb3V0KHZ0eSwgIiAlcyIsCisJCQkJemxvZ19wcmlvcml0eVt6bG9nX2RlZmF1bHQtPgorCQkJCQkgICAgICBtYXhsdmxbWkxPR19ERVNUX1NURE9VVF1dKTsKKwkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwl9CisKKwlpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX01PTklUT1JdID09IFpMT0dfRElTQUJMRUQpCisJCXZ0eV9vdXQodnR5LCAibm8gbG9nIG1vbml0b3IlcyIsIFZUWV9ORVdMSU5FKTsKKwllbHNlIGlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfTU9OSVRPUl0gIT0KKwkJIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpCisJCXZ0eV9vdXQodnR5LCAibG9nIG1vbml0b3IgJXMlcyIsCisJCQl6bG9nX3ByaW9yaXR5W3psb2dfZGVmYXVsdC0+bWF4bHZsW1pMT0dfREVTVF9NT05JVE9SXV0sCisJCQlWVFlfTkVXTElORSk7CisKKwlpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX1NZU0xPR10gIT0gWkxPR19ESVNBQkxFRCkgeworCQl2dHlfb3V0KHZ0eSwgImxvZyBzeXNsb2ciKTsKKwkJaWYgKHpsb2dfZGVmYXVsdC0+bWF4bHZsW1pMT0dfREVTVF9TWVNMT0ddICE9CisJCSAgICB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKQorCQkJdnR5X291dCh2dHksICIgJXMiLAorCQkJCXpsb2dfcHJpb3JpdHlbemxvZ19kZWZhdWx0LT4KKwkJCQkJICAgICAgbWF4bHZsW1pMT0dfREVTVF9TWVNMT0ddXSk7CisJCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisJfQorCisJaWYgKHpsb2dfZGVmYXVsdC0+ZmFjaWxpdHkgIT0gTE9HX0RBRU1PTikKKwkJdnR5X291dCh2dHksICJsb2cgZmFjaWxpdHkgJXMlcyIsCisJCQlmYWNpbGl0eV9uYW1lKHpsb2dfZGVmYXVsdC0+ZmFjaWxpdHkpLCBWVFlfTkVXTElORSk7CisKKwlpZiAoemxvZ19kZWZhdWx0LT5yZWNvcmRfcHJpb3JpdHkgPT0gMSkKKwkJdnR5X291dCh2dHksICJsb2cgcmVjb3JkLXByaW9yaXR5JXMiLCBWVFlfTkVXTElORSk7CisjZW5kaWYKKwlpZiAoaG9zdC5hZHZhbmNlZCkKKwkJdnR5X291dCh2dHksICJzZXJ2aWNlIGFkdmFuY2VkLXZ0eSVzIiwgVlRZX05FV0xJTkUpOworCisJaWYgKGhvc3QuZW5jcnlwdCkKKwkJdnR5X291dCh2dHksICJzZXJ2aWNlIHBhc3N3b3JkLWVuY3J5cHRpb24lcyIsIFZUWV9ORVdMSU5FKTsKKworCWlmIChob3N0LmxpbmVzID49IDApCisJCXZ0eV9vdXQodnR5LCAic2VydmljZSB0ZXJtaW5hbC1sZW5ndGggJWQlcyIsIGhvc3QubGluZXMsCisJCQlWVFlfTkVXTElORSk7CisKKwlpZiAoaG9zdC5tb3RkZmlsZSkKKwkJdnR5X291dCh2dHksICJiYW5uZXIgbW90ZCBmaWxlICVzJXMiLCBob3N0Lm1vdGRmaWxlLAorCQkJVlRZX05FV0xJTkUpOworCWVsc2UgaWYgKCFob3N0Lm1vdGQpCisJCXZ0eV9vdXQodnR5LCAibm8gYmFubmVyIG1vdGQlcyIsIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiAxOworfQorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciBnZXR0aW5nIGNvbW1hbmQgdmVjdG9yLiAqLworc3RhdGljIHZlY3RvciBjbWRfbm9kZV92ZWN0b3IodmVjdG9yIHYsIGVudW0gbm9kZV90eXBlIG50eXBlKQoreworCXN0cnVjdCBjbWRfbm9kZSAqY25vZGUgPSB2ZWN0b3Jfc2xvdCh2LCBudHlwZSk7CisJcmV0dXJuIGNub2RlLT5jbWRfdmVjdG9yOworfQorCisjaWYgMAorLyogRmlsdGVyIGNvbW1hbmQgdmVjdG9yIGJ5IHN5bWJvbC4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IGFjdHVhbGx5IHVzZWQ7CisgKiBzaG91bGQgaXQgYmUgZGVsZXRlZD8gKi8KK3N0YXRpYyBpbnQgY21kX2ZpbHRlcl9ieV9zeW1ib2woY2hhciAqY29tbWFuZCwgY2hhciAqc3ltYm9sKQoreworCWludCBpLCBsaW07CisKKwlpZiAoc3RyY21wKHN5bWJvbCwgIklQVjRfQUREUkVTUyIpID09IDApIHsKKwkJaSA9IDA7CisJCWxpbSA9IHN0cmxlbihjb21tYW5kKTsKKwkJd2hpbGUgKGkgPCBsaW0pIHsKKwkJCWlmICghCisJCQkgICAgKGlzZGlnaXQoKGludCljb21tYW5kW2ldKSB8fCBjb21tYW5kW2ldID09ICcuJworCQkJICAgICB8fCBjb21tYW5kW2ldID09ICcvJykpCisJCQkJcmV0dXJuIDE7CisJCQlpKys7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWlmIChzdHJjbXAoc3ltYm9sLCAiU1RSSU5HIikgPT0gMCkgeworCQlpID0gMDsKKwkJbGltID0gc3RybGVuKGNvbW1hbmQpOworCQl3aGlsZSAoaSA8IGxpbSkgeworCQkJaWYgKCEKKwkJCSAgICAoaXNhbHBoYSgoaW50KWNvbW1hbmRbaV0pIHx8IGNvbW1hbmRbaV0gPT0gJ18nCisJCQkgICAgIHx8IGNvbW1hbmRbaV0gPT0gJy0nKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWkrKzsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaWYgKHN0cmNtcChzeW1ib2wsICJJRk5BTUUiKSA9PSAwKSB7CisJCWkgPSAwOworCQlsaW0gPSBzdHJsZW4oY29tbWFuZCk7CisJCXdoaWxlIChpIDwgbGltKSB7CisJCQlpZiAoIWlzYWxudW0oKGludCljb21tYW5kW2ldKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWkrKzsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyogQ29tcGxldGlvbiBtYXRjaCB0eXBlcy4gKi8KK2VudW0gbWF0Y2hfdHlwZSB7CisJbm9fbWF0Y2gsCisJZXh0ZW5kX21hdGNoLAorCWlwdjRfcHJlZml4X21hdGNoLAorCWlwdjRfbWF0Y2gsCisJaXB2Nl9wcmVmaXhfbWF0Y2gsCisJaXB2Nl9tYXRjaCwKKwlyYW5nZV9tYXRjaCwKKwl2YXJhcmdfbWF0Y2gsCisJcGFydGx5X21hdGNoLAorCWV4YWN0X21hdGNoCit9OworCitzdGF0aWMgZW51bSBtYXRjaF90eXBlIGNtZF9pcHY0X21hdGNoKGNvbnN0IGNoYXIgKnN0cikKK3sKKwljb25zdCBjaGFyICpzcDsKKwlpbnQgZG90cyA9IDAsIG51bXMgPSAwOworCWNoYXIgYnVmWzRdOworCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJZm9yICg7OykgeworCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJCXNwID0gc3RyOworCQl3aGlsZSAoKnN0ciAhPSAnXDAnKSB7CisJCQlpZiAoKnN0ciA9PSAnLicpIHsKKwkJCQlpZiAoZG90cyA+PSAzKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCQlpZiAoKihzdHIgKyAxKSA9PSAnLicpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCWlmICgqKHN0ciArIDEpID09ICdcMCcpCisJCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwkJCQlkb3RzKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIWlzZGlnaXQoKGludCkqc3RyKSkKKwkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCXN0cisrOworCQl9CisKKwkJaWYgKHN0ciAtIHNwID4gMykKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlzdHJuY3B5KGJ1Ziwgc3AsIHN0ciAtIHNwKTsKKwkJaWYgKGF0b2koYnVmKSA+IDI1NSkKKwkJCXJldHVybiBub19tYXRjaDsKKworCQludW1zKys7CisKKwkJaWYgKCpzdHIgPT0gJ1wwJykKKwkJCWJyZWFrOworCisJCXN0cisrOworCX0KKworCWlmIChudW1zIDwgNCkKKwkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCXJldHVybiBleGFjdF9tYXRjaDsKK30KKworc3RhdGljIGVudW0gbWF0Y2hfdHlwZSBjbWRfaXB2NF9wcmVmaXhfbWF0Y2goY29uc3QgY2hhciAqc3RyKQoreworCWNvbnN0IGNoYXIgKnNwOworCWludCBkb3RzID0gMDsKKwljaGFyIGJ1Zls0XTsKKworCWlmIChzdHIgPT0gTlVMTCkKKwkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCWZvciAoOzspIHsKKwkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCQlzcCA9IHN0cjsKKwkJd2hpbGUgKCpzdHIgIT0gJ1wwJyAmJiAqc3RyICE9ICcvJykgeworCQkJaWYgKCpzdHIgPT0gJy4nKSB7CisJCQkJaWYgKGRvdHMgPT0gMykKKwkJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQkJaWYgKCooc3RyICsgMSkgPT0gJy4nIHx8ICooc3RyICsgMSkgPT0gJy8nKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCQlpZiAoKihzdHIgKyAxKSA9PSAnXDAnKQorCQkJCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJCQkJZG90cysrOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoIWlzZGlnaXQoKGludCkqc3RyKSkKKwkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCXN0cisrOworCQl9CisKKwkJaWYgKHN0ciAtIHNwID4gMykKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlzdHJuY3B5KGJ1Ziwgc3AsIHN0ciAtIHNwKTsKKwkJaWYgKGF0b2koYnVmKSA+IDI1NSkKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlpZiAoZG90cyA9PSAzKSB7CisJCQlpZiAoKnN0ciA9PSAnLycpIHsKKwkJCQlpZiAoKihzdHIgKyAxKSA9PSAnXDAnKQorCQkJCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJCQkJc3RyKys7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKCpzdHIgPT0gJ1wwJykKKwkJCQlyZXR1cm4gcGFydGx5X21hdGNoOworCQl9CisKKwkJaWYgKCpzdHIgPT0gJ1wwJykKKwkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwkJc3RyKys7CisJfQorCisJc3AgPSBzdHI7CisJd2hpbGUgKCpzdHIgIT0gJ1wwJykgeworCQlpZiAoIWlzZGlnaXQoKGludCkqc3RyKSkKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlzdHIrKzsKKwl9CisKKwlpZiAoYXRvaShzcCkgPiAzMikKKwkJcmV0dXJuIG5vX21hdGNoOworCisJcmV0dXJuIGV4YWN0X21hdGNoOworfQorCisjZGVmaW5lIElQVjZfQUREUl9TVFIJCSIwMTIzNDU2Nzg5YWJjZGVmQUJDREVGOi4lIgorI2RlZmluZSBJUFY2X1BSRUZJWF9TVFIJCSIwMTIzNDU2Nzg5YWJjZGVmQUJDREVGOi4lLyIKKyNkZWZpbmUgU1RBVEVfU1RBUlQJCTEKKyNkZWZpbmUgU1RBVEVfQ09MT04JCTIKKyNkZWZpbmUgU1RBVEVfRE9VQkxFCQkzCisjZGVmaW5lIFNUQVRFX0FERFIJCTQKKyNkZWZpbmUgU1RBVEVfRE9UICAgICAgICAgICAgICAgNQorI2RlZmluZSBTVEFURV9TTEFTSAkJNgorI2RlZmluZSBTVEFURV9NQVNLCQk3CisKKyNpZmRlZiBIQVZFX0lQVjYKKworc3RhdGljIGVudW0gbWF0Y2hfdHlwZSBjbWRfaXB2Nl9tYXRjaChjb25zdCBjaGFyICpzdHIpCit7CisJaW50IHN0YXRlID0gU1RBVEVfU1RBUlQ7CisJaW50IGNvbG9ucyA9IDAsIG51bXMgPSAwLCBkb3VibGVfY29sb24gPSAwOworCWNvbnN0IGNoYXIgKnNwID0gTlVMTDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNpbjZfZHVtbXk7CisJaW50IHJldDsKKworCWlmIChzdHIgPT0gTlVMTCkKKwkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCWlmIChzdHJzcG4oc3RyLCBJUFY2X0FERFJfU1RSKSAhPSBzdHJsZW4oc3RyKSkKKwkJcmV0dXJuIG5vX21hdGNoOworCisJLyogdXNlIGluZXRfcHRvbiB0aGF0IGhhcyBhIGJldHRlciBzdXBwb3J0LAorCSAqIGZvciBleGFtcGxlIGluZXRfcHRvbiBjYW4gc3VwcG9ydCB0aGUgYXV0b21hdGljIGFkZHJlc3NlczoKKwkgKiAgOjoxLjIuMy40CisJICovCisJcmV0ID0gaW5ldF9wdG9uKEFGX0lORVQ2LCBzdHIsICZzaW42X2R1bW15LnNpbjZfYWRkcik7CisKKwlpZiAocmV0ID09IDEpCisJCXJldHVybiBleGFjdF9tYXRjaDsKKworCXdoaWxlICgqc3RyICE9ICdcMCcpIHsKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFNUQVRFX1NUQVJUOgorCQkJaWYgKCpzdHIgPT0gJzonKSB7CisJCQkJaWYgKCooc3RyICsgMSkgIT0gJzonICYmICooc3RyICsgMSkgIT0gJ1wwJykKKwkJCQkJcmV0dXJuIG5vX21hdGNoOworCQkJCWNvbG9ucy0tOworCQkJCXN0YXRlID0gU1RBVEVfQ09MT047CisJCQl9IGVsc2UgeworCQkJCXNwID0gc3RyOworCQkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCX0KKworCQkJY29udGludWU7CisJCWNhc2UgU1RBVEVfQ09MT046CisJCQljb2xvbnMrKzsKKwkJCWlmICgqKHN0ciArIDEpID09ICc6JykKKwkJCQlzdGF0ZSA9IFNUQVRFX0RPVUJMRTsKKwkJCWVsc2UgeworCQkJCXNwID0gc3RyICsgMTsKKwkJCQlzdGF0ZSA9IFNUQVRFX0FERFI7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9ET1VCTEU6CisJCQlpZiAoZG91YmxlX2NvbG9uKQorCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJaWYgKCooc3RyICsgMSkgPT0gJzonKQorCQkJCXJldHVybiBub19tYXRjaDsKKwkJCWVsc2UgeworCQkJCWlmICgqKHN0ciArIDEpICE9ICdcMCcpCisJCQkJCWNvbG9ucysrOworCQkJCXNwID0gc3RyICsgMTsKKwkJCQlzdGF0ZSA9IFNUQVRFX0FERFI7CisJCQl9CisKKwkJCWRvdWJsZV9jb2xvbisrOworCQkJbnVtcysrOworCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfQUREUjoKKwkJCWlmICgqKHN0ciArIDEpID09ICc6JyB8fCAqKHN0ciArIDEpID09ICdcMCcpIHsKKwkJCQlpZiAoc3RyIC0gc3AgPiAzKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCQludW1zKys7CisJCQkJc3RhdGUgPSBTVEFURV9DT0xPTjsKKwkJCX0KKwkJCWlmICgqKHN0ciArIDEpID09ICcuJykKKwkJCQlzdGF0ZSA9IFNUQVRFX0RPVDsKKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX0RPVDoKKwkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAobnVtcyA+IDgpCisJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJaWYgKGNvbG9ucyA+IDcpCisJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJc3RyKys7CisJfQorCisjaWYgMAorCWlmIChudW1zIDwgMTEpCisJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisjZW5kaWYJCQkJLyogMCAqLworCisJcmV0dXJuIGV4YWN0X21hdGNoOworfQorCitzdGF0aWMgZW51bSBtYXRjaF90eXBlIGNtZF9pcHY2X3ByZWZpeF9tYXRjaChjb25zdCBjaGFyICpzdHIpCit7CisJaW50IHN0YXRlID0gU1RBVEVfU1RBUlQ7CisJaW50IGNvbG9ucyA9IDAsIG51bXMgPSAwLCBkb3VibGVfY29sb24gPSAwOworCWludCBtYXNrOworCWNvbnN0IGNoYXIgKnNwID0gTlVMTDsKKwljaGFyICplbmRwdHIgPSBOVUxMOworCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJaWYgKHN0cnNwbihzdHIsIElQVjZfUFJFRklYX1NUUikgIT0gc3RybGVuKHN0cikpCisJCXJldHVybiBub19tYXRjaDsKKworCXdoaWxlICgqc3RyICE9ICdcMCcgJiYgc3RhdGUgIT0gU1RBVEVfTUFTSykgeworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgU1RBVEVfU1RBUlQ6CisJCQlpZiAoKnN0ciA9PSAnOicpIHsKKwkJCQlpZiAoKihzdHIgKyAxKSAhPSAnOicgJiYgKihzdHIgKyAxKSAhPSAnXDAnKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisJCQkJY29sb25zLS07CisJCQkJc3RhdGUgPSBTVEFURV9DT0xPTjsKKwkJCX0gZWxzZSB7CisJCQkJc3AgPSBzdHI7CisJCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJfQorCisJCQljb250aW51ZTsKKwkJY2FzZSBTVEFURV9DT0xPTjoKKwkJCWNvbG9ucysrOworCQkJaWYgKCooc3RyICsgMSkgPT0gJy8nKQorCQkJCXJldHVybiBub19tYXRjaDsKKwkJCWVsc2UgaWYgKCooc3RyICsgMSkgPT0gJzonKQorCQkJCXN0YXRlID0gU1RBVEVfRE9VQkxFOworCQkJZWxzZSB7CisJCQkJc3AgPSBzdHIgKyAxOworCQkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX0RPVUJMRToKKwkJCWlmIChkb3VibGVfY29sb24pCisJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQlpZiAoKihzdHIgKyAxKSA9PSAnOicpCisJCQkJcmV0dXJuIG5vX21hdGNoOworCQkJZWxzZSB7CisJCQkJaWYgKCooc3RyICsgMSkgIT0gJ1wwJyAmJiAqKHN0ciArIDEpICE9ICcvJykKKwkJCQkJY29sb25zKys7CisJCQkJc3AgPSBzdHIgKyAxOworCisJCQkJaWYgKCooc3RyICsgMSkgPT0gJy8nKQorCQkJCQlzdGF0ZSA9IFNUQVRFX1NMQVNIOworCQkJCWVsc2UKKwkJCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJfQorCisJCQlkb3VibGVfY29sb24rKzsKKwkJCW51bXMgKz0gMTsKKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX0FERFI6CisJCQlpZiAoKihzdHIgKyAxKSA9PSAnOicgfHwgKihzdHIgKyAxKSA9PSAnLicKKwkJCSAgICB8fCAqKHN0ciArIDEpID09ICdcMCcgfHwgKihzdHIgKyAxKSA9PSAnLycpIHsKKwkJCQlpZiAoc3RyIC0gc3AgPiAzKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCQlmb3IgKDsgc3AgPD0gc3RyOyBzcCsrKQorCQkJCQlpZiAoKnNwID09ICcvJykKKwkJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCW51bXMrKzsKKworCQkJCWlmICgqKHN0ciArIDEpID09ICc6JykKKwkJCQkJc3RhdGUgPSBTVEFURV9DT0xPTjsKKwkJCQllbHNlIGlmICgqKHN0ciArIDEpID09ICcuJykKKwkJCQkJc3RhdGUgPSBTVEFURV9ET1Q7CisJCQkJZWxzZSBpZiAoKihzdHIgKyAxKSA9PSAnLycpCisJCQkJCXN0YXRlID0gU1RBVEVfU0xBU0g7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9ET1Q6CisJCQlzdGF0ZSA9IFNUQVRFX0FERFI7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9TTEFTSDoKKwkJCWlmICgqKHN0ciArIDEpID09ICdcMCcpCisJCQkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCQkJc3RhdGUgPSBTVEFURV9NQVNLOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmIChudW1zID4gMTEpCisJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJaWYgKGNvbG9ucyA+IDcpCisJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJc3RyKys7CisJfQorCisJaWYgKHN0YXRlIDwgU1RBVEVfTUFTSykKKwkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCW1hc2sgPSBzdHJ0b2woc3RyLCAmZW5kcHRyLCAxMCk7CisJaWYgKCplbmRwdHIgIT0gJ1wwJykKKwkJcmV0dXJuIG5vX21hdGNoOworCisJaWYgKG1hc2sgPCAwIHx8IG1hc2sgPiAxMjgpCisJCXJldHVybiBub19tYXRjaDsKKworLyogSSBkb24ndCBrbm93IHdoeSBtYXNrIDwgMTMgbWFrZXMgY29tbWFuZCBtYXRjaCBwYXJ0bHkuCisgICBGb3JnaXZlIG1lIHRvIG1ha2UgdGhpcyBjb21tZW50cy4gSSBXYW50IHRvIHNldCBzdGF0aWMgZGVmYXVsdCByb3V0ZQorICAgYmVjYXVzZSBvZiBsYWNrIG9mIGZ1bmN0aW9uIHRvIG9yaWdpbmF0ZSBkZWZhdWx0IGluIG9zcGY2ZDsgc29ycnkKKyAgICAgICB5YXN1CisgIGlmIChtYXNrIDwgMTMpCisgICAgcmV0dXJuIHBhcnRseV9tYXRjaDsKKyovCisKKwlyZXR1cm4gZXhhY3RfbWF0Y2g7Cit9CisKKyNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgICovCisKKyNkZWZpbmUgREVDSU1BTF9TVFJMRU5fTUFYIDEwCisKK3N0YXRpYyBpbnQgY21kX3JhbmdlX21hdGNoKGNvbnN0IGNoYXIgKnJhbmdlLCBjb25zdCBjaGFyICpzdHIpCit7CisJY2hhciAqcDsKKwljaGFyIGJ1ZltERUNJTUFMX1NUUkxFTl9NQVggKyAxXTsKKwljaGFyICplbmRwdHIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgbWluLCBtYXgsIHZhbDsKKworCWlmIChzdHIgPT0gTlVMTCkKKwkJcmV0dXJuIDE7CisKKwl2YWwgPSBzdHJ0b3VsKHN0ciwgJmVuZHB0ciwgMTApOworCWlmICgqZW5kcHRyICE9ICdcMCcpCisJCXJldHVybiAwOworCisJcmFuZ2UrKzsKKwlwID0gc3RyY2hyKHJhbmdlLCAnLScpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAwOworCWlmIChwIC0gcmFuZ2UgPiBERUNJTUFMX1NUUkxFTl9NQVgpCisJCXJldHVybiAwOworCXN0cm5jcHkoYnVmLCByYW5nZSwgcCAtIHJhbmdlKTsKKwlidWZbcCAtIHJhbmdlXSA9ICdcMCc7CisJbWluID0gc3RydG91bChidWYsICZlbmRwdHIsIDEwKTsKKwlpZiAoKmVuZHB0ciAhPSAnXDAnKQorCQlyZXR1cm4gMDsKKworCXJhbmdlID0gcCArIDE7CisJcCA9IHN0cmNocihyYW5nZSwgJz4nKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAocCAtIHJhbmdlID4gREVDSU1BTF9TVFJMRU5fTUFYKQorCQlyZXR1cm4gMDsKKwlzdHJuY3B5KGJ1ZiwgcmFuZ2UsIHAgLSByYW5nZSk7CisJYnVmW3AgLSByYW5nZV0gPSAnXDAnOworCW1heCA9IHN0cnRvdWwoYnVmLCAmZW5kcHRyLCAxMCk7CisJaWYgKCplbmRwdHIgIT0gJ1wwJykKKwkJcmV0dXJuIDA7CisKKwlpZiAodmFsIDwgbWluIHx8IHZhbCA+IG1heCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyogTWFrZSBjb21wbGV0aW9uIG1hdGNoIGFuZCByZXR1cm4gbWF0Y2ggdHlwZSBmbGFnLiAqLworc3RhdGljIGVudW0gbWF0Y2hfdHlwZQorY21kX2ZpbHRlcl9ieV9jb21wbGV0aW9uKGNoYXIgKmNvbW1hbmQsIHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJdW5zaWduZWQgaW50IGk7CisJY29uc3QgY2hhciAqc3RyOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJZW51bSBtYXRjaF90eXBlIG1hdGNoX3R5cGU7CisJdmVjdG9yIGRlc2N2ZWM7CisJc3RydWN0IGRlc2MgKmRlc2M7CisKKwltYXRjaF90eXBlID0gbm9fbWF0Y2g7CisKKwkvKiBJZiBjb21tYW5kIGFuZCBjbWRfZWxlbWVudCBzdHJpbmcgZG9lcyBub3QgbWF0Y2ggc2V0IE5VTEwgdG8gdmVjdG9yICovCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKSB7CisJCQlpZiAoaW5kZXggPj0gdmVjdG9yX2FjdGl2ZShjbWRfZWxlbWVudC0+c3RydmVjKSkKKwkJCQl2ZWN0b3Jfc2xvdCh2LCBpKSA9IE5VTEw7CisJCQllbHNlIHsKKwkJCQl1bnNpZ25lZCBpbnQgajsKKwkJCQlpbnQgbWF0Y2hlZCA9IDA7CisKKwkJCQlkZXNjdmVjID0KKwkJCQkgICAgdmVjdG9yX3Nsb3QoY21kX2VsZW1lbnQtPnN0cnZlYywgaW5kZXgpOworCisJCQkJZm9yIChqID0gMDsgaiA8IHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYyk7IGorKykKKwkJCQkJaWYgKChkZXNjID0gdmVjdG9yX3Nsb3QoZGVzY3ZlYywgaikpKSB7CisJCQkJCQlzdHIgPSBkZXNjLT5jbWQ7CisKKwkJCQkJCWlmIChDTURfVkFSQVJHKHN0cikpIHsKKwkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJICAgIHZhcmFyZ19tYXRjaCkKKwkJCQkJCQkJbWF0Y2hfdHlwZSA9CisJCQkJCQkJCSAgICB2YXJhcmdfbWF0Y2g7CisJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJfSBlbHNlIGlmIChDTURfUkFOR0Uoc3RyKSkgeworCQkJCQkJCWlmIChjbWRfcmFuZ2VfbWF0Y2gKKwkJCQkJCQkgICAgKHN0ciwgY29tbWFuZCkpIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgcmFuZ2VfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIHJhbmdlX21hdGNoOworCisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9CisjaWZkZWYgSEFWRV9JUFY2CisJCQkJCQllbHNlIGlmIChDTURfSVBWNihzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY2X21hdGNoCisJCQkJCQkJICAgIChjb21tYW5kKSkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY2X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY2X21hdGNoOworCisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKENNRF9JUFY2X1BSRUZJWChzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY2X3ByZWZpeF9tYXRjaChjb21tYW5kKSkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY2X3ByZWZpeF9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgaXB2Nl9wcmVmaXhfbWF0Y2g7CisKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0KKyNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgICovCisJCQkJCQllbHNlIGlmIChDTURfSVBWNChzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY0X21hdGNoCisJCQkJCQkJICAgIChjb21tYW5kKSkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY0X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY0X21hdGNoOworCisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKENNRF9JUFY0X1BSRUZJWChzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY0X3ByZWZpeF9tYXRjaChjb21tYW5kKSkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY0X3ByZWZpeF9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgaXB2NF9wcmVmaXhfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UKKwkJCQkJCQkvKiBDaGVjayBpcyB0aGlzIHBvaW50J3MgYXJndW1lbnQgb3B0aW9uYWwgPyAqLworCQkJCQkJaWYgKENNRF9PUFRJT04oc3RyKQorCQkJCQkJCSAgICB8fAorCQkJCQkJCSAgICBDTURfVkFSSUFCTEUoc3RyKSkgeworCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkgICAgZXh0ZW5kX21hdGNoKQorCQkJCQkJCQltYXRjaF90eXBlID0KKwkJCQkJCQkJICAgIGV4dGVuZF9tYXRjaDsKKwkJCQkJCQltYXRjaGVkKys7CisJCQkJCQl9IGVsc2UKKwkJCQkJCSAgICBpZiAoc3RybmNtcAorCQkJCQkJCShjb21tYW5kLCBzdHIsCisJCQkJCQkJIHN0cmxlbihjb21tYW5kKSkgPT0KKwkJCQkJCQkwKSB7CisJCQkJCQkJaWYgKHN0cmNtcChjb21tYW5kLCBzdHIpCisJCQkJCQkJICAgID09IDApCisJCQkJCQkJCW1hdGNoX3R5cGUgPQorCQkJCQkJCQkgICAgZXhhY3RfbWF0Y2g7CisJCQkJCQkJZWxzZSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIHBhcnRseV9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgcGFydGx5X21hdGNoOworCQkJCQkJCX0KKwkJCQkJCQltYXRjaGVkKys7CisJCQkJCQl9CisJCQkJCX0KKwkJCQlpZiAoIW1hdGNoZWQpCisJCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKKwkJCX0KKwkJfQorCXJldHVybiBtYXRjaF90eXBlOworfQorCisvKiBGaWx0ZXIgdmVjdG9yIGJ5IGNvbW1hbmQgY2hhcmFjdGVyIHdpdGggaW5kZXguICovCitzdGF0aWMgZW51bSBtYXRjaF90eXBlCitjbWRfZmlsdGVyX2J5X3N0cmluZyhjaGFyICpjb21tYW5kLCB2ZWN0b3IgdiwgdW5zaWduZWQgaW50IGluZGV4KQoreworCXVuc2lnbmVkIGludCBpOworCWNvbnN0IGNoYXIgKnN0cjsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCWVudW0gbWF0Y2hfdHlwZSBtYXRjaF90eXBlOworCXZlY3RvciBkZXNjdmVjOworCXN0cnVjdCBkZXNjICpkZXNjOworCisJbWF0Y2hfdHlwZSA9IG5vX21hdGNoOworCisJLyogSWYgY29tbWFuZCBhbmQgY21kX2VsZW1lbnQgc3RyaW5nIGRvZXMgbm90IG1hdGNoIHNldCBOVUxMIHRvIHZlY3RvciAqLworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHYpOyBpKyspCisJCWlmICgoY21kX2VsZW1lbnQgPSB2ZWN0b3Jfc2xvdCh2LCBpKSkgIT0gTlVMTCkgeworCQkJLyogSWYgZ2l2ZW4gaW5kZXggaXMgYmlnZ2VyIHRoYW4gbWF4IHN0cmluZyB2ZWN0b3Igb2YgY29tbWFuZCwKKwkJCSAgIHNldCBOVUxMICovCisJCQlpZiAoaW5kZXggPj0gdmVjdG9yX2FjdGl2ZShjbWRfZWxlbWVudC0+c3RydmVjKSkKKwkJCQl2ZWN0b3Jfc2xvdCh2LCBpKSA9IE5VTEw7CisJCQllbHNlIHsKKwkJCQl1bnNpZ25lZCBpbnQgajsKKwkJCQlpbnQgbWF0Y2hlZCA9IDA7CisKKwkJCQlkZXNjdmVjID0KKwkJCQkgICAgdmVjdG9yX3Nsb3QoY21kX2VsZW1lbnQtPnN0cnZlYywgaW5kZXgpOworCisJCQkJZm9yIChqID0gMDsgaiA8IHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYyk7IGorKykKKwkJCQkJaWYgKChkZXNjID0gdmVjdG9yX3Nsb3QoZGVzY3ZlYywgaikpKSB7CisJCQkJCQlzdHIgPSBkZXNjLT5jbWQ7CisKKwkJCQkJCWlmIChDTURfVkFSQVJHKHN0cikpIHsKKwkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJICAgIHZhcmFyZ19tYXRjaCkKKwkJCQkJCQkJbWF0Y2hfdHlwZSA9CisJCQkJCQkJCSAgICB2YXJhcmdfbWF0Y2g7CisJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJfSBlbHNlIGlmIChDTURfUkFOR0Uoc3RyKSkgeworCQkJCQkJCWlmIChjbWRfcmFuZ2VfbWF0Y2gKKwkJCQkJCQkgICAgKHN0ciwgY29tbWFuZCkpIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgcmFuZ2VfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIHJhbmdlX21hdGNoOworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfQorI2lmZGVmIEhBVkVfSVBWNgorCQkJCQkJZWxzZSBpZiAoQ01EX0lQVjYoc3RyKSkgeworCQkJCQkJCWlmIChjbWRfaXB2Nl9tYXRjaAorCQkJCQkJCSAgICAoY29tbWFuZCkgPT0KKwkJCQkJCQkgICAgZXhhY3RfbWF0Y2gpIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgaXB2Nl9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgaXB2Nl9tYXRjaDsKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoQ01EX0lQVjZfUFJFRklYKHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjZfcHJlZml4X21hdGNoKGNvbW1hbmQpID09IGV4YWN0X21hdGNoKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjZfcHJlZml4X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY2X3ByZWZpeF9tYXRjaDsKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0KKyNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgICovCisJCQkJCQllbHNlIGlmIChDTURfSVBWNChzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY0X21hdGNoCisJCQkJCQkJICAgIChjb21tYW5kKSA9PQorCQkJCQkJCSAgICBleGFjdF9tYXRjaCkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY0X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY0X21hdGNoOworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmIChDTURfSVBWNF9QUkVGSVgoc3RyKSkgeworCQkJCQkJCWlmIChjbWRfaXB2NF9wcmVmaXhfbWF0Y2goY29tbWFuZCkgPT0gZXhhY3RfbWF0Y2gpIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgaXB2NF9wcmVmaXhfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjRfcHJlZml4X21hdGNoOworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmIChDTURfT1BUSU9OKHN0cikKKwkJCQkJCQkgICB8fCBDTURfVkFSSUFCTEUoc3RyKSkKKwkJCQkJCXsKKwkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJICAgIGV4dGVuZF9tYXRjaCkKKwkJCQkJCQkJbWF0Y2hfdHlwZSA9CisJCQkJCQkJCSAgICBleHRlbmRfbWF0Y2g7CisJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlpZiAoc3RyY21wKGNvbW1hbmQsIHN0cikKKwkJCQkJCQkgICAgPT0gMCkgeworCQkJCQkJCQltYXRjaF90eXBlID0KKwkJCQkJCQkJICAgIGV4YWN0X21hdGNoOworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJaWYgKCFtYXRjaGVkKQorCQkJCQl2ZWN0b3Jfc2xvdCh2LCBpKSA9IE5VTEw7CisJCQl9CisJCX0KKwlyZXR1cm4gbWF0Y2hfdHlwZTsKK30KKworLyogQ2hlY2sgYW1iaWd1b3VzIG1hdGNoICovCitzdGF0aWMgaW50Citpc19jbWRfYW1iaWd1b3VzKGNoYXIgKmNvbW1hbmQsIHZlY3RvciB2LCBpbnQgaW5kZXgsIGVudW0gbWF0Y2hfdHlwZSB0eXBlKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBqOworCWNvbnN0IGNoYXIgKnN0ciA9IE5VTEw7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKKwljb25zdCBjaGFyICptYXRjaGVkID0gTlVMTDsKKwl2ZWN0b3IgZGVzY3ZlYzsKKwlzdHJ1Y3QgZGVzYyAqZGVzYzsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHYpOyBpKyspCisJCWlmICgoY21kX2VsZW1lbnQgPSB2ZWN0b3Jfc2xvdCh2LCBpKSkgIT0gTlVMTCkgeworCQkJaW50IG1hdGNoID0gMDsKKworCQkJZGVzY3ZlYyA9IHZlY3Rvcl9zbG90KGNtZF9lbGVtZW50LT5zdHJ2ZWMsIGluZGV4KTsKKworCQkJZm9yIChqID0gMDsgaiA8IHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYyk7IGorKykKKwkJCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKKwkJCQkJZW51bSBtYXRjaF90eXBlIHJldDsKKworCQkJCQlzdHIgPSBkZXNjLT5jbWQ7CisKKwkJCQkJc3dpdGNoICh0eXBlKSB7CisJCQkJCWNhc2UgZXhhY3RfbWF0Y2g6CisJCQkJCQlpZiAoIQorCQkJCQkJICAgIChDTURfT1BUSU9OKHN0cikKKwkJCQkJCSAgICAgfHwgQ01EX1ZBUklBQkxFKHN0cikpCismJiBzdHJjbXAoY29tbWFuZCwgc3RyKSA9PSAwKQorCQkJCQkJCW1hdGNoKys7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBwYXJ0bHlfbWF0Y2g6CisJCQkJCQlpZiAoIQorCQkJCQkJICAgIChDTURfT1BUSU9OKHN0cikKKwkJCQkJCSAgICAgfHwgQ01EX1ZBUklBQkxFKHN0cikpCismJiBzdHJuY21wKGNvbW1hbmQsIHN0ciwgc3RybGVuKGNvbW1hbmQpKSA9PSAwKSB7CisJCQkJCQkJaWYgKG1hdGNoZWQKKwkJCQkJCQkgICAgJiYgc3RyY21wKG1hdGNoZWQsCisJCQkJCQkJCSAgICAgIHN0cikgIT0gMCkKKwkJCQkJCQkJcmV0dXJuIDE7CS8qIFRoZXJlIGlzIGFtYmlndW91cyBtYXRjaC4gKi8KKwkJCQkJCQllbHNlCisJCQkJCQkJCW1hdGNoZWQgPSBzdHI7CisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIHJhbmdlX21hdGNoOgorCQkJCQkJaWYgKGNtZF9yYW5nZV9tYXRjaAorCQkJCQkJICAgIChzdHIsIGNvbW1hbmQpKSB7CisJCQkJCQkJaWYgKG1hdGNoZWQKKwkJCQkJCQkgICAgJiYgc3RyY21wKG1hdGNoZWQsCisJCQkJCQkJCSAgICAgIHN0cikgIT0gMCkKKwkJCQkJCQkJcmV0dXJuIDE7CisJCQkJCQkJZWxzZQorCQkJCQkJCQltYXRjaGVkID0gc3RyOworCQkJCQkJCW1hdGNoKys7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKyNpZmRlZiBIQVZFX0lQVjYKKwkJCQkJY2FzZSBpcHY2X21hdGNoOgorCQkJCQkJaWYgKENNRF9JUFY2KHN0cikpCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIGlwdjZfcHJlZml4X21hdGNoOgorCQkJCQkJaWYgKChyZXQgPQorCQkJCQkJICAgICBjbWRfaXB2Nl9wcmVmaXhfbWF0Y2gKKwkJCQkJCSAgICAgKGNvbW1hbmQpKSAhPSBub19tYXRjaCkgeworCQkJCQkJCWlmIChyZXQgPT0gcGFydGx5X21hdGNoKQorCQkJCQkJCQlyZXR1cm4gMjsJLyogVGhlcmUgaXMgaW5jb21wbGV0ZSBtYXRjaC4gKi8KKworCQkJCQkJCW1hdGNoKys7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKyNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgKi8KKwkJCQkJY2FzZSBpcHY0X21hdGNoOgorCQkJCQkJaWYgKENNRF9JUFY0KHN0cikpCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIGlwdjRfcHJlZml4X21hdGNoOgorCQkJCQkJaWYgKChyZXQgPQorCQkJCQkJICAgICBjbWRfaXB2NF9wcmVmaXhfbWF0Y2gKKwkJCQkJCSAgICAgKGNvbW1hbmQpKSAhPSBub19tYXRjaCkgeworCQkJCQkJCWlmIChyZXQgPT0gcGFydGx5X21hdGNoKQorCQkJCQkJCQlyZXR1cm4gMjsJLyogVGhlcmUgaXMgaW5jb21wbGV0ZSBtYXRjaC4gKi8KKworCQkJCQkJCW1hdGNoKys7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBleHRlbmRfbWF0Y2g6CisJCQkJCQlpZiAoQ01EX09QVElPTihzdHIpCisJCQkJCQkgICAgfHwgQ01EX1ZBUklBQkxFKHN0cikpCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIG5vX21hdGNoOgorCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQlpZiAoIW1hdGNoKQorCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKKwkJfQorCXJldHVybiAwOworfQorCisvKiBJZiBzcmMgbWF0Y2hlcyBkc3QgcmV0dXJuIGRzdCBzdHJpbmcsIG90aGVyd2lzZSByZXR1cm4gTlVMTCAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9lbnRyeV9mdW5jdGlvbihjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgKmRzdCkKK3sKKwkvKiBTa2lwIHZhcmlhYmxlIGFyZ3VtZW50cy4gKi8KKwlpZiAoQ01EX09QVElPTihkc3QpIHx8IENNRF9WQVJJQUJMRShkc3QpIHx8IENNRF9WQVJBUkcoZHN0KSB8fAorCSAgICBDTURfSVBWNChkc3QpIHx8IENNRF9JUFY0X1BSRUZJWChkc3QpIHx8IENNRF9SQU5HRShkc3QpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEluIGNhc2Ugb2YgJ2NvbW1hbmQgXHQnLCBnaXZlbiBzcmMgaXMgTlVMTCBzdHJpbmcuICovCisJaWYgKHNyYyA9PSBOVUxMKQorCQlyZXR1cm4gZHN0OworCisJLyogTWF0Y2hlZCB3aXRoIGlucHV0IHN0cmluZy4gKi8KKwlpZiAoc3RybmNtcChzcmMsIGRzdCwgc3RybGVuKHNyYykpID09IDApCisJCXJldHVybiBkc3Q7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogSWYgc3JjIG1hdGNoZXMgZHN0IHJldHVybiBkc3Qgc3RyaW5nLCBvdGhlcndpc2UgcmV0dXJuIE5VTEwgKi8KKy8qIFRoaXMgdmVyc2lvbiB3aWxsIHJldHVybiB0aGUgZHN0IHN0cmluZyBhbHdheXMgaWYgaXQgaXMKKyAgIENNRF9WQVJJQUJMRSBmb3IgJz8nIGtleSBwcm9jZXNzaW5nICovCitzdGF0aWMgY29uc3QgY2hhciAqY21kX2VudHJ5X2Z1bmN0aW9uX2Rlc2MoY29uc3QgY2hhciAqc3JjLCBjb25zdCBjaGFyICpkc3QpCit7CisJaWYgKENNRF9WQVJBUkcoZHN0KSkKKwkJcmV0dXJuIGRzdDsKKworCWlmIChDTURfUkFOR0UoZHN0KSkgeworCQlpZiAoY21kX3JhbmdlX21hdGNoKGRzdCwgc3JjKSkKKwkJCXJldHVybiBkc3Q7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOworCX0KKyNpZmRlZiBIQVZFX0lQVjYKKwlpZiAoQ01EX0lQVjYoZHN0KSkgeworCQlpZiAoY21kX2lwdjZfbWF0Y2goc3JjKSkKKwkJCXJldHVybiBkc3Q7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOworCX0KKworCWlmIChDTURfSVBWNl9QUkVGSVgoZHN0KSkgeworCQlpZiAoY21kX2lwdjZfcHJlZml4X21hdGNoKHNyYykpCisJCQlyZXR1cm4gZHN0OworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKKwl9CisjZW5kaWYJCQkJLyogSEFWRV9JUFY2ICovCisKKwlpZiAoQ01EX0lQVjQoZHN0KSkgeworCQlpZiAoY21kX2lwdjRfbWF0Y2goc3JjKSkKKwkJCXJldHVybiBkc3Q7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOworCX0KKworCWlmIChDTURfSVBWNF9QUkVGSVgoZHN0KSkgeworCQlpZiAoY21kX2lwdjRfcHJlZml4X21hdGNoKHNyYykpCisJCQlyZXR1cm4gZHN0OworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBPcHRpb25hbCBvciB2YXJpYWJsZSBjb21tYW5kcyBhbHdheXMgbWF0Y2ggb24gJz8nICovCisJaWYgKENNRF9PUFRJT04oZHN0KSB8fCBDTURfVkFSSUFCTEUoZHN0KSkKKwkJcmV0dXJuIGRzdDsKKworCS8qIEluIGNhc2Ugb2YgJ2NvbW1hbmQgXHQnLCBnaXZlbiBzcmMgaXMgTlVMTCBzdHJpbmcuICovCisJaWYgKHNyYyA9PSBOVUxMKQorCQlyZXR1cm4gZHN0OworCisJaWYgKHN0cm5jbXAoc3JjLCBkc3QsIHN0cmxlbihzcmMpKSA9PSAwKQorCQlyZXR1cm4gZHN0OworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKKy8qIENoZWNrIHNhbWUgc3RyaW5nIGVsZW1lbnQgZXhpc3RlbmNlLiAgSWYgaXQgaXNuJ3QgdGhlcmUgcmV0dXJuCisgICAgMS4gKi8KK3N0YXRpYyBpbnQgY21kX3VuaXF1ZV9zdHJpbmcodmVjdG9yIHYsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwljaGFyICptYXRjaDsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHYpOyBpKyspCisJCWlmICgobWF0Y2ggPSB2ZWN0b3Jfc2xvdCh2LCBpKSkgIT0gTlVMTCkKKwkJCWlmIChzdHJjbXAobWF0Y2gsIHN0cikgPT0gMCkKKwkJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyogQ29tcGFyZSBzdHJpbmcgdG8gZGVzY3JpcHRpb24gdmVjdG9yLiAgSWYgdGhlcmUgaXMgc2FtZSBzdHJpbmcKKyAgIHJldHVybiAxIGVsc2UgcmV0dXJuIDAuICovCitzdGF0aWMgaW50IGRlc2NfdW5pcXVlX3N0cmluZyh2ZWN0b3IgdiwgY29uc3QgY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBkZXNjICpkZXNjOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChkZXNjID0gdmVjdG9yX3Nsb3QodiwgaSkpICE9IE5VTEwpCisJCQlpZiAoc3RyY21wKGRlc2MtPmNtZCwgc3RyKSA9PSAwKQorCQkJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNtZF90cnlfZG9fc2hvcnRjdXQoZW51bSBub2RlX3R5cGUgbm9kZSwgY2hhciAqZmlyc3Rfd29yZCkKK3sKKwlpZiAoZmlyc3Rfd29yZCAhPSBOVUxMICYmCisJICAgIG5vZGUgIT0gQVVUSF9OT0RFICYmCisJICAgIG5vZGUgIT0gVklFV19OT0RFICYmCisJICAgIG5vZGUgIT0gQVVUSF9FTkFCTEVfTk9ERSAmJgorCSAgICBub2RlICE9IEVOQUJMRV9OT0RFICYmIDAgPT0gc3RyY21wKCJkbyIsIGZpcnN0X3dvcmQpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyogJz8nIGRlc2NyaWJlIGNvbW1hbmQgc3VwcG9ydC4gKi8KK3N0YXRpYyB2ZWN0b3IKK2NtZF9kZXNjcmliZV9jb21tYW5kX3JlYWwodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksIGludCAqc3RhdHVzKQoreworCXVuc2lnbmVkIGludCBpOworCXZlY3RvciBjbWRfdmVjdG9yOworI2RlZmluZSBJTklUX01BVENIVkVDX1NJWkUgMTAKKwl2ZWN0b3IgbWF0Y2h2ZWM7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJaW50IHJldDsKKwllbnVtIG1hdGNoX3R5cGUgbWF0Y2g7CisJY2hhciAqY29tbWFuZDsKKwlzdGF0aWMgc3RydWN0IGRlc2MgZGVzY19jciA9IHsgIjxjcj4iLCAiIiB9OworCisJLyogU2V0IGluZGV4LiAqLworCWlmICh2ZWN0b3JfYWN0aXZlKHZsaW5lKSA9PSAwKSB7CisJCSpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UKKwkJaW5kZXggPSB2ZWN0b3JfYWN0aXZlKHZsaW5lKSAtIDE7CisKKwkvKiBNYWtlIGNvcHkgdmVjdG9yIG9mIGN1cnJlbnQgbm9kZSdzIGNvbW1hbmQgdmVjdG9yLiAqLworCWNtZF92ZWN0b3IgPSB2ZWN0b3JfY29weShjbWRfbm9kZV92ZWN0b3IoY21kdmVjLCB2dHktPm5vZGUpKTsKKworCS8qIFByZXBhcmUgbWF0Y2ggdmVjdG9yICovCisJbWF0Y2h2ZWMgPSB2ZWN0b3JfaW5pdChJTklUX01BVENIVkVDX1NJWkUpOworCisJLyogRmlsdGVyIGNvbW1hbmRzLiAqLworCS8qIE9ubHkgd29yZHMgcHJlY2VkZXMgY3VycmVudCB3b3JkIHdpbGwgYmUgY2hlY2tlZCBpbiB0aGlzIGxvb3AuICovCisJZm9yIChpID0gMDsgaSA8IGluZGV4OyBpKyspCisJCWlmICgoY29tbWFuZCA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKSkpIHsKKwkJCW1hdGNoID0KKwkJCSAgICBjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY29tbWFuZCwgY21kX3ZlY3RvciwgaSk7CisKKwkJCWlmIChtYXRjaCA9PSB2YXJhcmdfbWF0Y2gpIHsKKwkJCQlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCQkJCXZlY3RvciBkZXNjdmVjOworCQkJCXVuc2lnbmVkIGludCBqLCBrOworCisJCQkJZm9yIChqID0gMDsgaiA8IHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3Rvcik7IGorKykKKwkJCQkJaWYgKChjbWRfZWxlbWVudCA9CisJCQkJCSAgICAgdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaikpICE9IE5VTEwKKwkJCQkJICAgICYmCisJCQkJCSAgICAodmVjdG9yX2FjdGl2ZQorCQkJCQkgICAgIChjbWRfZWxlbWVudC0+c3RydmVjKSkpIHsKKwkJCQkJCWRlc2N2ZWMgPQorCQkJCQkJICAgIHZlY3Rvcl9zbG90KGNtZF9lbGVtZW50LT4KKwkJCQkJCQkJc3RydmVjLAorCQkJCQkJCQl2ZWN0b3JfYWN0aXZlCisJCQkJCQkJCShjbWRfZWxlbWVudC0+CisJCQkJCQkJCSBzdHJ2ZWMpIC0gMSk7CisJCQkJCQlmb3IgKGsgPSAwOworCQkJCQkJICAgICBrIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsKKwkJCQkJCSAgICAgaysrKSB7CisJCQkJCQkJc3RydWN0IGRlc2MgKmRlc2MgPQorCQkJCQkJCSAgICB2ZWN0b3Jfc2xvdChkZXNjdmVjLAorCQkJCQkJCQkJayk7CisJCQkJCQkJdmVjdG9yX3NldChtYXRjaHZlYywKKwkJCQkJCQkJICAgZGVzYyk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCXZlY3Rvcl9zZXQobWF0Y2h2ZWMsICZkZXNjX2NyKTsKKwkJCQl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKworCQkJCXJldHVybiBtYXRjaHZlYzsKKwkJCX0KKworCQkJaWYgKChyZXQgPQorCQkJICAgICBpc19jbWRfYW1iaWd1b3VzKGNvbW1hbmQsIGNtZF92ZWN0b3IsIGksCisJCQkJCSAgICAgIG1hdGNoKSkgPT0gMSkgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCSpzdGF0dXMgPSBDTURfRVJSX0FNQklHVU9VUzsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0gZWxzZSBpZiAocmV0ID09IDIpIHsKKwkJCQl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKwkJCQkqc3RhdHVzID0gQ01EX0VSUl9OT19NQVRDSDsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCisJLyogUHJlcGFyZSBtYXRjaCB2ZWN0b3IgKi8KKwkvKiAgbWF0Y2h2ZWMgPSB2ZWN0b3JfaW5pdCAoSU5JVF9NQVRDSFZFQ19TSVpFKTsgKi8KKworCS8qIE1ha2Ugc3VyZSB0aGF0IGNtZF92ZWN0b3IgaXMgZmlsdGVyZWQgYmFzZWQgb24gY3VycmVudCB3b3JkICovCisJY29tbWFuZCA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCk7CisJaWYgKGNvbW1hbmQpCisJCW1hdGNoID0gY21kX2ZpbHRlcl9ieV9jb21wbGV0aW9uKGNvbW1hbmQsIGNtZF92ZWN0b3IsIGluZGV4KTsKKworCS8qIE1ha2UgZGVzY3JpcHRpb24gdmVjdG9yLiAqLworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGNtZF92ZWN0b3IpOyBpKyspCisJCWlmICgoY21kX2VsZW1lbnQgPSB2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBpKSkgIT0gTlVMTCkgeworCQkJY29uc3QgY2hhciAqc3RyaW5nID0gTlVMTDsKKwkJCXZlY3RvciBzdHJ2ZWMgPSBjbWRfZWxlbWVudC0+c3RydmVjOworCisJCQkvKiBpZiBjb21tYW5kIGlzIE5VTEwsIGluZGV4IG1heSBiZSBlcXVhbCB0byB2ZWN0b3JfYWN0aXZlICovCisJCQlpZiAoY29tbWFuZCAmJiBpbmRleCA+PSB2ZWN0b3JfYWN0aXZlKHN0cnZlYykpCisJCQkJdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkgPSBOVUxMOworCQkJZWxzZSB7CisJCQkJLyogQ2hlY2sgaWYgY29tbWFuZCBpcyBjb21wbGV0ZWQuICovCisJCQkJaWYgKGNvbW1hbmQgPT0gTlVMTAorCQkJCSAgICAmJiBpbmRleCA9PSB2ZWN0b3JfYWN0aXZlKHN0cnZlYykpIHsKKwkJCQkJc3RyaW5nID0gIjxjcj4iOworCQkJCQlpZiAoIWRlc2NfdW5pcXVlX3N0cmluZworCQkJCQkgICAgKG1hdGNodmVjLCBzdHJpbmcpKQorCQkJCQkJdmVjdG9yX3NldChtYXRjaHZlYywgJmRlc2NfY3IpOworCQkJCX0gZWxzZSB7CisJCQkJCXVuc2lnbmVkIGludCBqOworCQkJCQl2ZWN0b3IgZGVzY3ZlYyA9CisJCQkJCSAgICB2ZWN0b3Jfc2xvdChzdHJ2ZWMsIGluZGV4KTsKKwkJCQkJc3RydWN0IGRlc2MgKmRlc2M7CisKKwkJCQkJZm9yIChqID0gMDsgaiA8IHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYyk7CisJCQkJCSAgICAgaisrKQorCQkJCQkJaWYgKChkZXNjID0KKwkJCQkJCSAgICAgdmVjdG9yX3Nsb3QoZGVzY3ZlYywgaikpKSB7CisJCQkJCQkJc3RyaW5nID0KKwkJCQkJCQkgICAgY21kX2VudHJ5X2Z1bmN0aW9uX2Rlc2MKKwkJCQkJCQkgICAgKGNvbW1hbmQsCisJCQkJCQkJICAgICBkZXNjLT5jbWQpOworCQkJCQkJCWlmIChzdHJpbmcpIHsKKwkJCQkJCQkJLyogVW5pcXVlbmVzcyBjaGVjayAqLworCQkJCQkJCQlpZiAoIWRlc2NfdW5pcXVlX3N0cmluZyhtYXRjaHZlYywgc3RyaW5nKSkKKwkJCQkJCQkJCXZlY3Rvcl9zZXQKKwkJCQkJCQkJCSAgICAobWF0Y2h2ZWMsCisJCQkJCQkJCQkgICAgIGRlc2MpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKworCWlmICh2ZWN0b3Jfc2xvdChtYXRjaHZlYywgMCkgPT0gTlVMTCkgeworCQl2ZWN0b3JfZnJlZShtYXRjaHZlYyk7CisJCSpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCX0gZWxzZQorCQkqc3RhdHVzID0gQ01EX1NVQ0NFU1M7CisKKwlyZXR1cm4gbWF0Y2h2ZWM7Cit9CisKK3ZlY3RvciBjbWRfZGVzY3JpYmVfY29tbWFuZCh2ZWN0b3IgdmxpbmUsIHN0cnVjdCB2dHkgKiB2dHksIGludCAqc3RhdHVzKQoreworCXZlY3RvciByZXQ7CisKKwlpZiAoY21kX3RyeV9kb19zaG9ydGN1dCh2dHktPm5vZGUsIHZlY3Rvcl9zbG90KHZsaW5lLCAwKSkpIHsKKwkJZW51bSBub2RlX3R5cGUgb25vZGU7CisJCXZlY3RvciBzaGlmdGVkX3ZsaW5lOworCQl1bnNpZ25lZCBpbnQgaW5kZXg7CisKKwkJb25vZGUgPSB2dHktPm5vZGU7CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQkvKiBXZSBjYW4gdHJ5IGl0IG9uIGVuYWJsZSBub2RlLCBjb3MnIHRoZSB2dHkgaXMgYXV0aGVudGljYXRlZCAqLworCisJCXNoaWZ0ZWRfdmxpbmUgPSB2ZWN0b3JfaW5pdCh2ZWN0b3JfY291bnQodmxpbmUpKTsKKwkJLyogdXNlIG1lbWNweT8gKi8KKwkJZm9yIChpbmRleCA9IDE7IGluZGV4IDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGluZGV4KyspIHsKKwkJCXZlY3Rvcl9zZXRfaW5kZXgoc2hpZnRlZF92bGluZSwgaW5kZXggLSAxLAorCQkJCQkgdmVjdG9yX2xvb2t1cCh2bGluZSwgaW5kZXgpKTsKKwkJfQorCisJCXJldCA9IGNtZF9kZXNjcmliZV9jb21tYW5kX3JlYWwoc2hpZnRlZF92bGluZSwgdnR5LCBzdGF0dXMpOworCisJCXZlY3Rvcl9mcmVlKHNoaWZ0ZWRfdmxpbmUpOworCQl2dHktPm5vZGUgPSBvbm9kZTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gY21kX2Rlc2NyaWJlX2NvbW1hbmRfcmVhbCh2bGluZSwgdnR5LCBzdGF0dXMpOworfQorCisvKiBDaGVjayBMQ0Qgb2YgbWF0Y2hlZCBjb21tYW5kLiAqLworc3RhdGljIGludCBjbWRfbGNkKGNoYXIgKiptYXRjaGVkKQoreworCWludCBpOworCWludCBqOworCWludCBsY2QgPSAtMTsKKwljaGFyICpzMSwgKnMyOworCWNoYXIgYzEsIGMyOworCisJaWYgKG1hdGNoZWRbMF0gPT0gTlVMTCB8fCBtYXRjaGVkWzFdID09IE5VTEwpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMTsgbWF0Y2hlZFtpXSAhPSBOVUxMOyBpKyspIHsKKwkJczEgPSBtYXRjaGVkW2kgLSAxXTsKKwkJczIgPSBtYXRjaGVkW2ldOworCisJCWZvciAoaiA9IDA7IChjMSA9IHMxW2pdKSAmJiAoYzIgPSBzMltqXSk7IGorKykKKwkJCWlmIChjMSAhPSBjMikKKwkJCQlicmVhazsKKworCQlpZiAobGNkIDwgMCkKKwkJCWxjZCA9IGo7CisJCWVsc2UgeworCQkJaWYgKGxjZCA+IGopCisJCQkJbGNkID0gajsKKwkJfQorCX0KKwlyZXR1cm4gbGNkOworfQorCisvKiBDb21tYW5kIGxpbmUgY29tcGxldGlvbiBzdXBwb3J0LiAqLworc3RhdGljIGNoYXIgKipjbWRfY29tcGxldGVfY29tbWFuZF9yZWFsKHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqdnR5LAorCQkJCQlpbnQgKnN0YXR1cykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl2ZWN0b3IgY21kX3ZlY3RvciA9IHZlY3Rvcl9jb3B5KGNtZF9ub2RlX3ZlY3RvcihjbWR2ZWMsIHZ0eS0+bm9kZSkpOworI2RlZmluZSBJTklUX01BVENIVkVDX1NJWkUgMTAKKwl2ZWN0b3IgbWF0Y2h2ZWM7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJY2hhciAqKm1hdGNoX3N0cjsKKwlzdHJ1Y3QgZGVzYyAqZGVzYzsKKwl2ZWN0b3IgZGVzY3ZlYzsKKwljaGFyICpjb21tYW5kOworCWludCBsY2Q7CisKKwlpZiAodmVjdG9yX2FjdGl2ZSh2bGluZSkgPT0gMCkgeworCQkqc3RhdHVzID0gQ01EX0VSUl9OT19NQVRDSDsKKwkJcmV0dXJuIE5VTEw7CisJfSBlbHNlCisJCWluZGV4ID0gdmVjdG9yX2FjdGl2ZSh2bGluZSkgLSAxOworCisJLyogRmlyc3QsIGZpbHRlciBieSBwcmVjZWVkaW5nIGNvbW1hbmQgc3RyaW5nICovCisJZm9yIChpID0gMDsgaSA8IGluZGV4OyBpKyspCisJCWlmICgoY29tbWFuZCA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKSkpIHsKKwkJCWVudW0gbWF0Y2hfdHlwZSBtYXRjaDsKKwkJCWludCByZXQ7CisKKwkJCS8qIEZpcnN0IHRyeSBjb21wbGV0aW9uIG1hdGNoLCBpZiB0aGVyZSBpcyBleGFjdGx5IG1hdGNoIHJldHVybiAxICovCisJCQltYXRjaCA9CisJCQkgICAgY21kX2ZpbHRlcl9ieV9jb21wbGV0aW9uKGNvbW1hbmQsIGNtZF92ZWN0b3IsIGkpOworCisJCQkvKiBJZiB0aGVyZSBpcyBleGFjdCBtYXRjaCB0aGVuIGZpbHRlciBhbWJpZ3VvdXMgbWF0Y2ggZWxzZSBjaGVjaworCQkJICAgYW1iaWd1b3VzbmVzcy4gKi8KKwkJCWlmICgocmV0ID0KKwkJCSAgICAgaXNfY21kX2FtYmlndW91cyhjb21tYW5kLCBjbWRfdmVjdG9yLCBpLAorCQkJCQkgICAgICBtYXRjaCkpID09IDEpIHsKKwkJCQl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKwkJCQkqc3RhdHVzID0gQ01EX0VSUl9BTUJJR1VPVVM7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQkvKgorCQkJICAgZWxzZSBpZiAocmV0ID09IDIpCisJCQkgICB7CisJCQkgICB2ZWN0b3JfZnJlZSAoY21kX3ZlY3Rvcik7CisJCQkgICAqc3RhdHVzID0gQ01EX0VSUl9OT19NQVRDSDsKKwkJCSAgIHJldHVybiBOVUxMOworCQkJICAgfQorCQkJICovCisJCX0KKworCS8qIFByZXBhcmUgbWF0Y2ggdmVjdG9yLiAqLworCW1hdGNodmVjID0gdmVjdG9yX2luaXQoSU5JVF9NQVRDSFZFQ19TSVpFKTsKKworCS8qIE5vdyB3ZSBnb3QgaW50byBjb21wbGV0aW9uICovCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3Rvcik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpKSkgeworCQkJY29uc3QgY2hhciAqc3RyaW5nOworCQkJdmVjdG9yIHN0cnZlYyA9IGNtZF9lbGVtZW50LT5zdHJ2ZWM7CisKKwkJCS8qIENoZWNrIGZpZWxkIGxlbmd0aCAqLworCQkJaWYgKGluZGV4ID49IHZlY3Rvcl9hY3RpdmUoc3RydmVjKSkKKwkJCQl2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBpKSA9IE5VTEw7CisJCQllbHNlIHsKKwkJCQl1bnNpZ25lZCBpbnQgajsKKworCQkJCWRlc2N2ZWMgPSB2ZWN0b3Jfc2xvdChzdHJ2ZWMsIGluZGV4KTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsgaisrKQorCQkJCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKKwkJCQkJCWlmICgoc3RyaW5nID0gY21kX2VudHJ5X2Z1bmN0aW9uKHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCksIGRlc2MtPmNtZCkpKQorCQkJCQkJCWlmIChjbWRfdW5pcXVlX3N0cmluZyAobWF0Y2h2ZWMsIHN0cmluZykpCisJCQkJCQkJCXZlY3Rvcl9zZXQgKG1hdGNodmVjLCB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIHN0cmluZykpOworCQkJCQl9CisJCQl9CisJCX0KKworCS8qIFdlIGRvbid0IG5lZWQgY21kX3ZlY3RvciBhbnkgbW9yZS4gKi8KKwl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKworCS8qIE5vIG1hdGNoZWQgY29tbWFuZCAqLworCWlmICh2ZWN0b3Jfc2xvdChtYXRjaHZlYywgMCkgPT0gTlVMTCkgeworCQl2ZWN0b3JfZnJlZShtYXRjaHZlYyk7CisKKwkJLyogSW4gY2FzZSBvZiAnY29tbWFuZCBcdCcgcGF0dGVybi4gIERvIHlvdSBuZWVkICc/JyBjb21tYW5kIGF0CisJCSAgIHRoZSBlbmQgb2YgdGhlIGxpbmUuICovCisJCWlmICh2ZWN0b3Jfc2xvdCh2bGluZSwgaW5kZXgpID09ICdcMCcpCisJCQkqc3RhdHVzID0gQ01EX0VSUl9OT1RISU5HX1RPRE87CisJCWVsc2UKKwkJCSpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBPbmx5IG9uZSBtYXRjaGVkICovCisJaWYgKHZlY3Rvcl9zbG90KG1hdGNodmVjLCAxKSA9PSBOVUxMKSB7CisJCW1hdGNoX3N0ciA9IChjaGFyICoqKW1hdGNodmVjLT5pbmRleDsKKwkJdmVjdG9yX29ubHlfd3JhcHBlcl9mcmVlKG1hdGNodmVjKTsKKwkJKnN0YXR1cyA9IENNRF9DT01QTEVURV9GVUxMX01BVENIOworCQlyZXR1cm4gbWF0Y2hfc3RyOworCX0KKwkvKiBNYWtlIGl0IHN1cmUgbGFzdCBlbGVtZW50IGlzIE5VTEwuICovCisJdmVjdG9yX3NldChtYXRjaHZlYywgTlVMTCk7CisKKwkvKiBDaGVjayBMQ0Qgb2YgbWF0Y2hlZCBzdHJpbmdzLiAqLworCWlmICh2ZWN0b3Jfc2xvdCh2bGluZSwgaW5kZXgpICE9IE5VTEwpIHsKKwkJbGNkID0gY21kX2xjZCgoY2hhciAqKiltYXRjaHZlYy0+aW5kZXgpOworCisJCWlmIChsY2QpIHsKKwkJCWludCBsZW4gPSBzdHJsZW4odmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSk7CisKKwkJCWlmIChsZW4gPCBsY2QpIHsKKwkJCQljaGFyICpsY2RzdHI7CisKKwkJCQlsY2RzdHIgPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgbGNkICsgMSwKKwkJCQkJCSAgICAgICJjb21wbGV0ZS1sY2RzdHIiKTsKKwkJCQltZW1jcHkobGNkc3RyLCBtYXRjaHZlYy0+aW5kZXhbMF0sIGxjZCk7CisJCQkJbGNkc3RyW2xjZF0gPSAnXDAnOworCisJCQkJLyogbWF0Y2hfc3RyID0gKGNoYXIgKiopICZsY2RzdHI7ICovCisKKwkJCQkvKiBGcmVlIG1hdGNodmVjLiAqLworCQkJCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKG1hdGNodmVjKTsgaSsrKSB7CisJCQkJCWlmICh2ZWN0b3Jfc2xvdChtYXRjaHZlYywgaSkpCisJCQkJCQl0YWxsb2NfZnJlZSh2ZWN0b3Jfc2xvdChtYXRjaHZlYywgaSkpOworCQkJCX0KKwkJCQl2ZWN0b3JfZnJlZShtYXRjaHZlYyk7CisKKwkJCQkvKiBNYWtlIG5ldyBtYXRjaHZlYy4gKi8KKwkJCQltYXRjaHZlYyA9IHZlY3Rvcl9pbml0KElOSVRfTUFUQ0hWRUNfU0laRSk7CisJCQkJdmVjdG9yX3NldChtYXRjaHZlYywgbGNkc3RyKTsKKwkJCQltYXRjaF9zdHIgPSAoY2hhciAqKiltYXRjaHZlYy0+aW5kZXg7CisJCQkJdmVjdG9yX29ubHlfd3JhcHBlcl9mcmVlKG1hdGNodmVjKTsKKworCQkJCSpzdGF0dXMgPSBDTURfQ09NUExFVEVfTUFUQ0g7CisJCQkJcmV0dXJuIG1hdGNoX3N0cjsKKwkJCX0KKwkJfQorCX0KKworCW1hdGNoX3N0ciA9IChjaGFyICoqKW1hdGNodmVjLT5pbmRleDsKKwl2ZWN0b3Jfb25seV93cmFwcGVyX2ZyZWUobWF0Y2h2ZWMpOworCSpzdGF0dXMgPSBDTURfQ09NUExFVEVfTElTVF9NQVRDSDsKKwlyZXR1cm4gbWF0Y2hfc3RyOworfQorCitjaGFyICoqY21kX2NvbXBsZXRlX2NvbW1hbmQodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksIGludCAqc3RhdHVzKQoreworCWNoYXIgKipyZXQ7CisKKwlpZiAoY21kX3RyeV9kb19zaG9ydGN1dCh2dHktPm5vZGUsIHZlY3Rvcl9zbG90KHZsaW5lLCAwKSkpIHsKKwkJZW51bSBub2RlX3R5cGUgb25vZGU7CisJCXZlY3RvciBzaGlmdGVkX3ZsaW5lOworCQl1bnNpZ25lZCBpbnQgaW5kZXg7CisKKwkJb25vZGUgPSB2dHktPm5vZGU7CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQkvKiBXZSBjYW4gdHJ5IGl0IG9uIGVuYWJsZSBub2RlLCBjb3MnIHRoZSB2dHkgaXMgYXV0aGVudGljYXRlZCAqLworCisJCXNoaWZ0ZWRfdmxpbmUgPSB2ZWN0b3JfaW5pdCh2ZWN0b3JfY291bnQodmxpbmUpKTsKKwkJLyogdXNlIG1lbWNweT8gKi8KKwkJZm9yIChpbmRleCA9IDE7IGluZGV4IDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGluZGV4KyspIHsKKwkJCXZlY3Rvcl9zZXRfaW5kZXgoc2hpZnRlZF92bGluZSwgaW5kZXggLSAxLAorCQkJCQkgdmVjdG9yX2xvb2t1cCh2bGluZSwgaW5kZXgpKTsKKwkJfQorCisJCXJldCA9IGNtZF9jb21wbGV0ZV9jb21tYW5kX3JlYWwoc2hpZnRlZF92bGluZSwgdnR5LCBzdGF0dXMpOworCisJCXZlY3Rvcl9mcmVlKHNoaWZ0ZWRfdmxpbmUpOworCQl2dHktPm5vZGUgPSBvbm9kZTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gY21kX2NvbXBsZXRlX2NvbW1hbmRfcmVhbCh2bGluZSwgdnR5LCBzdGF0dXMpOworfQorCisvKiByZXR1cm4gcGFyZW50IG5vZGUgKi8KKy8qIE1VU1QgZXZlbnR1YWxseSBjb252ZXJnZSBvbiBDT05GSUdfTk9ERSAqLworZW51bSBub2RlX3R5cGUgdnR5X2dvX3BhcmVudChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJYXNzZXJ0KHZ0eS0+bm9kZSA+IENPTkZJR19OT0RFKTsKKworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBHU01ORVRfTk9ERToKKwkJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCQlicmVhazsKKwljYXNlIEJUU19OT0RFOgorCQl2dHktPm5vZGUgPSBHU01ORVRfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCQkJdnR5LT5pbmRleCA9IGJ0cy0+bmV0d29yazsKKwkJfQorCQlicmVhazsKKwljYXNlIFRSWF9OT0RFOgorCQl2dHktPm5vZGUgPSBCVFNfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKwkJCXZ0eS0+aW5kZXggPSB0cngtPmJ0czsKKwkJfQorCQlicmVhazsKKwljYXNlIFRTX05PREU6CisJCXZ0eS0+bm9kZSA9IFRSWF9OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IHZ0eS0+aW5kZXg7CisJCQl2dHktPmluZGV4ID0gdHMtPnRyeDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNVQlNDUl9OT0RFOgorCQl2dHktPm5vZGUgPSBWSUVXX05PREU7CisJCXN1YnNjcl9wdXQodnR5LT5pbmRleCk7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKwl9CisKKwlyZXR1cm4gdnR5LT5ub2RlOworfQorCisvKiBFeGVjdXRlIGNvbW1hbmQgYnkgYXJndW1lbnQgdmxpbmUgdmVjdG9yLiAqLworc3RhdGljIGludAorY21kX2V4ZWN1dGVfY29tbWFuZF9yZWFsKHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqdnR5LAorCQkJIHN0cnVjdCBjbWRfZWxlbWVudCAqKmNtZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJdmVjdG9yIGNtZF92ZWN0b3I7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKm1hdGNoZWRfZWxlbWVudDsKKwl1bnNpZ25lZCBpbnQgbWF0Y2hlZF9jb3VudCwgaW5jb21wbGV0ZV9jb3VudDsKKwlpbnQgYXJnYzsKKwljb25zdCBjaGFyICphcmd2W0NNRF9BUkdDX01BWF07CisJZW51bSBtYXRjaF90eXBlIG1hdGNoID0gMDsKKwlpbnQgdmFyZmxhZzsKKwljaGFyICpjb21tYW5kOworCisJLyogTWFrZSBjb3B5IG9mIGNvbW1hbmQgZWxlbWVudHMuICovCisJY21kX3ZlY3RvciA9IHZlY3Rvcl9jb3B5KGNtZF9ub2RlX3ZlY3RvcihjbWR2ZWMsIHZ0eS0+bm9kZSkpOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGluZGV4KyspCisJCWlmICgoY29tbWFuZCA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCkpKSB7CisJCQlpbnQgcmV0OworCisJCQltYXRjaCA9CisJCQkgICAgY21kX2ZpbHRlcl9ieV9jb21wbGV0aW9uKGNvbW1hbmQsIGNtZF92ZWN0b3IsCisJCQkJCQkgICAgIGluZGV4KTsKKworCQkJaWYgKG1hdGNoID09IHZhcmFyZ19tYXRjaCkKKwkJCQlicmVhazsKKworCQkJcmV0ID0KKwkJCSAgICBpc19jbWRfYW1iaWd1b3VzKGNvbW1hbmQsIGNtZF92ZWN0b3IsIGluZGV4LCBtYXRjaCk7CisKKwkJCWlmIChyZXQgPT0gMSkgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCXJldHVybiBDTURfRVJSX0FNQklHVU9VUzsKKwkJCX0gZWxzZSBpZiAocmV0ID09IDIpIHsKKwkJCQl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKwkJCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwkJCX0KKwkJfQorCisJLyogQ2hlY2sgbWF0Y2hlZCBjb3VudC4gKi8KKwltYXRjaGVkX2VsZW1lbnQgPSBOVUxMOworCW1hdGNoZWRfY291bnQgPSAwOworCWluY29tcGxldGVfY291bnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3Rvcik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpKSkgeworCQkJaWYgKG1hdGNoID09IHZhcmFyZ19tYXRjaAorCQkJICAgIHx8IGluZGV4ID49IGNtZF9lbGVtZW50LT5jbWRzaXplKSB7CisJCQkJbWF0Y2hlZF9lbGVtZW50ID0gY21kX2VsZW1lbnQ7CisjaWYgMAorCQkJCXByaW50ZigiREVCVUc6ICVzXG4iLCBjbWRfZWxlbWVudC0+c3RyaW5nKTsKKyNlbmRpZgorCQkJCW1hdGNoZWRfY291bnQrKzsKKwkJCX0gZWxzZSB7CisJCQkJaW5jb21wbGV0ZV9jb3VudCsrOworCQkJfQorCQl9CisKKwkvKiBGaW5pc2ggb2YgdXNpbmcgY21kX3ZlY3Rvci4gKi8KKwl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKworCS8qIFRvIGV4ZWN1dGUgY29tbWFuZCwgbWF0Y2hlZF9jb3VudCBtdXN0IGJlIDEuICovCisJaWYgKG1hdGNoZWRfY291bnQgPT0gMCkgeworCQlpZiAoaW5jb21wbGV0ZV9jb3VudCkKKwkJCXJldHVybiBDTURfRVJSX0lOQ09NUExFVEU7CisJCWVsc2UKKwkJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCX0KKworCWlmIChtYXRjaGVkX2NvdW50ID4gMSkKKwkJcmV0dXJuIENNRF9FUlJfQU1CSUdVT1VTOworCisJLyogQXJndW1lbnQgdHJlYXRtZW50ICovCisJdmFyZmxhZyA9IDA7CisJYXJnYyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGkrKykgeworCQlpZiAodmFyZmxhZykKKwkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKKwkJZWxzZSB7CisJCQl2ZWN0b3IgZGVzY3ZlYyA9CisJCQkgICAgdmVjdG9yX3Nsb3QobWF0Y2hlZF9lbGVtZW50LT5zdHJ2ZWMsIGkpOworCisJCQlpZiAodmVjdG9yX2FjdGl2ZShkZXNjdmVjKSA9PSAxKSB7CisJCQkJc3RydWN0IGRlc2MgKmRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCAwKTsKKworCQkJCWlmIChDTURfVkFSQVJHKGRlc2MtPmNtZCkpCisJCQkJCXZhcmZsYWcgPSAxOworCisJCQkJaWYgKHZhcmZsYWcgfHwgQ01EX1ZBUklBQkxFKGRlc2MtPmNtZCkKKwkJCQkgICAgfHwgQ01EX09QVElPTihkZXNjLT5jbWQpKQorCQkJCQlhcmd2W2FyZ2MrK10gPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSk7CisJCQl9IGVsc2UKKwkJCQlhcmd2W2FyZ2MrK10gPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSk7CisJCX0KKworCQlpZiAoYXJnYyA+PSBDTURfQVJHQ19NQVgpCisJCQlyZXR1cm4gQ01EX0VSUl9FWEVFRF9BUkdDX01BWDsKKwl9CisKKwkvKiBGb3IgdnR5c2ggZXhlY3V0aW9uLiAqLworCWlmIChjbWQpCisJCSpjbWQgPSBtYXRjaGVkX2VsZW1lbnQ7CisKKwlpZiAobWF0Y2hlZF9lbGVtZW50LT5kYWVtb24pCisJCXJldHVybiBDTURfU1VDQ0VTU19EQUVNT047CisKKwkvKiBFeGVjdXRlIG1hdGNoZWQgY29tbWFuZC4gKi8KKwlyZXR1cm4gKCptYXRjaGVkX2VsZW1lbnQtPmZ1bmMpIChtYXRjaGVkX2VsZW1lbnQsIHZ0eSwgYXJnYywgYXJndik7Cit9CisKK2ludAorY21kX2V4ZWN1dGVfY29tbWFuZCh2ZWN0b3IgdmxpbmUsIHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGNtZF9lbGVtZW50ICoqY21kLAorCQkgICAgaW50IHZ0eXNoKQoreworCWludCByZXQsIHNhdmVkX3JldCwgdHJpZWQgPSAwOworCWVudW0gbm9kZV90eXBlIG9ub2RlOworCXZvaWQgKm9pbmRleDsKKworCW9ub2RlID0gdnR5LT5ub2RlOworCW9pbmRleCA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoY21kX3RyeV9kb19zaG9ydGN1dCh2dHktPm5vZGUsIHZlY3Rvcl9zbG90KHZsaW5lLCAwKSkpIHsKKwkJdmVjdG9yIHNoaWZ0ZWRfdmxpbmU7CisJCXVuc2lnbmVkIGludCBpbmRleDsKKworCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwkJLyogV2UgY2FuIHRyeSBpdCBvbiBlbmFibGUgbm9kZSwgY29zJyB0aGUgdnR5IGlzIGF1dGhlbnRpY2F0ZWQgKi8KKworCQlzaGlmdGVkX3ZsaW5lID0gdmVjdG9yX2luaXQodmVjdG9yX2NvdW50KHZsaW5lKSk7CisJCS8qIHVzZSBtZW1jcHk/ICovCisJCWZvciAoaW5kZXggPSAxOyBpbmRleCA8IHZlY3Rvcl9hY3RpdmUodmxpbmUpOyBpbmRleCsrKSB7CisJCQl2ZWN0b3Jfc2V0X2luZGV4KHNoaWZ0ZWRfdmxpbmUsIGluZGV4IC0gMSwKKwkJCQkJIHZlY3Rvcl9sb29rdXAodmxpbmUsIGluZGV4KSk7CisJCX0KKworCQlyZXQgPSBjbWRfZXhlY3V0ZV9jb21tYW5kX3JlYWwoc2hpZnRlZF92bGluZSwgdnR5LCBjbWQpOworCisJCXZlY3Rvcl9mcmVlKHNoaWZ0ZWRfdmxpbmUpOworCQl2dHktPm5vZGUgPSBvbm9kZTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzYXZlZF9yZXQgPSByZXQgPSBjbWRfZXhlY3V0ZV9jb21tYW5kX3JlYWwodmxpbmUsIHZ0eSwgY21kKTsKKworCWlmICh2dHlzaCkKKwkJcmV0dXJuIHNhdmVkX3JldDsKKworCS8qIFRoaXMgYXNzdW1lcyBhbGwgbm9kZXMgYWJvdmUgQ09ORklHX05PREUgYXJlIGNoaWxkcyBvZiBDT05GSUdfTk9ERSAqLworCXdoaWxlIChyZXQgIT0gQ01EX1NVQ0NFU1MgJiYgcmV0ICE9IENNRF9XQVJOSU5HCisJICAgICAgICYmIHZ0eS0+bm9kZSA+IENPTkZJR19OT0RFKSB7CisJCXZ0eV9nb19wYXJlbnQodnR5KTsKKwkJcmV0ID0gY21kX2V4ZWN1dGVfY29tbWFuZF9yZWFsKHZsaW5lLCB2dHksIGNtZCk7CisJCXRyaWVkID0gMTsKKwkJaWYgKHJldCA9PSBDTURfU1VDQ0VTUyB8fCByZXQgPT0gQ01EX1dBUk5JTkcpIHsKKwkJCS8qIHN1Y2Nlc2Z1bGwgY29tbWFuZCwgbGVhdmUgdGhlIG5vZGUgYXMgaXMgKi8KKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJLyogbm8gY29tbWFuZCBzdWNjZWVkZWQsIHJlc2V0IHRoZSB2dHkgdG8gdGhlIG9yaWdpbmFsIG5vZGUgYW5kCisJICAgcmV0dXJuIHRoZSBlcnJvciBmb3IgdGhpcyBub2RlICovCisJaWYgKHRyaWVkKSB7CisJCXZ0eS0+bm9kZSA9IG9ub2RlOworCQl2dHktPmluZGV4ID0gb2luZGV4OworCX0KKwlyZXR1cm4gc2F2ZWRfcmV0OworfQorCisvKiBFeGVjdXRlIGNvbW1hbmQgYnkgYXJndW1lbnQgcmVhZGxpbmUuICovCitpbnQKK2NtZF9leGVjdXRlX2NvbW1hbmRfc3RyaWN0KHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqdnR5LAorCQkJICAgc3RydWN0IGNtZF9lbGVtZW50ICoqY21kKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBpbmRleDsKKwl2ZWN0b3IgY21kX3ZlY3RvcjsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCXN0cnVjdCBjbWRfZWxlbWVudCAqbWF0Y2hlZF9lbGVtZW50OworCXVuc2lnbmVkIGludCBtYXRjaGVkX2NvdW50LCBpbmNvbXBsZXRlX2NvdW50OworCWludCBhcmdjOworCWNvbnN0IGNoYXIgKmFyZ3ZbQ01EX0FSR0NfTUFYXTsKKwlpbnQgdmFyZmxhZzsKKwllbnVtIG1hdGNoX3R5cGUgbWF0Y2ggPSAwOworCWNoYXIgKmNvbW1hbmQ7CisKKwkvKiBNYWtlIGNvcHkgb2YgY29tbWFuZCBlbGVtZW50ICovCisJY21kX3ZlY3RvciA9IHZlY3Rvcl9jb3B5KGNtZF9ub2RlX3ZlY3RvcihjbWR2ZWMsIHZ0eS0+bm9kZSkpOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGluZGV4KyspCisJCWlmICgoY29tbWFuZCA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCkpKSB7CisJCQlpbnQgcmV0OworCisJCQltYXRjaCA9IGNtZF9maWx0ZXJfYnlfc3RyaW5nKHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCksCisJCQkJCQkgICAgIGNtZF92ZWN0b3IsIGluZGV4KTsKKworCQkJLyogSWYgY29tbWFuZCBtZWV0cyAnLlZBUkFSRycgdGhlbiBmaW5pc2ggbWF0Y2hpbmcuICovCisJCQlpZiAobWF0Y2ggPT0gdmFyYXJnX21hdGNoKQorCQkJCWJyZWFrOworCisJCQlyZXQgPQorCQkJICAgIGlzX2NtZF9hbWJpZ3VvdXMoY29tbWFuZCwgY21kX3ZlY3RvciwgaW5kZXgsIG1hdGNoKTsKKwkJCWlmIChyZXQgPT0gMSkgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCXJldHVybiBDTURfRVJSX0FNQklHVU9VUzsKKwkJCX0KKwkJCWlmIChyZXQgPT0gMikgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCQkJfQorCQl9CisKKwkvKiBDaGVjayBtYXRjaGVkIGNvdW50LiAqLworCW1hdGNoZWRfZWxlbWVudCA9IE5VTEw7CisJbWF0Y2hlZF9jb3VudCA9IDA7CisJaW5jb21wbGV0ZV9jb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3Rvcik7IGkrKykKKwkJaWYgKHZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpICE9IE5VTEwpIHsKKwkJCWNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSk7CisKKwkJCWlmIChtYXRjaCA9PSB2YXJhcmdfbWF0Y2gKKwkJCSAgICB8fCBpbmRleCA+PSBjbWRfZWxlbWVudC0+Y21kc2l6ZSkgeworCQkJCW1hdGNoZWRfZWxlbWVudCA9IGNtZF9lbGVtZW50OworCQkJCW1hdGNoZWRfY291bnQrKzsKKwkJCX0gZWxzZQorCQkJCWluY29tcGxldGVfY291bnQrKzsKKwkJfQorCisJLyogRmluaXNoIG9mIHVzaW5nIGNtZF92ZWN0b3IuICovCisJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisKKwkvKiBUbyBleGVjdXRlIGNvbW1hbmQsIG1hdGNoZWRfY291bnQgbXVzdCBiZSAxLiAqLworCWlmIChtYXRjaGVkX2NvdW50ID09IDApIHsKKwkJaWYgKGluY29tcGxldGVfY291bnQpCisJCQlyZXR1cm4gQ01EX0VSUl9JTkNPTVBMRVRFOworCQllbHNlCisJCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwl9CisKKwlpZiAobWF0Y2hlZF9jb3VudCA+IDEpCisJCXJldHVybiBDTURfRVJSX0FNQklHVU9VUzsKKworCS8qIEFyZ3VtZW50IHRyZWF0bWVudCAqLworCXZhcmZsYWcgPSAwOworCWFyZ2MgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodmxpbmUpOyBpKyspIHsKKwkJaWYgKHZhcmZsYWcpCisJCQlhcmd2W2FyZ2MrK10gPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSk7CisJCWVsc2UgeworCQkJdmVjdG9yIGRlc2N2ZWMgPQorCQkJICAgIHZlY3Rvcl9zbG90KG1hdGNoZWRfZWxlbWVudC0+c3RydmVjLCBpKTsKKworCQkJaWYgKHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYykgPT0gMSkgeworCQkJCXN0cnVjdCBkZXNjICpkZXNjID0gdmVjdG9yX3Nsb3QoZGVzY3ZlYywgMCk7CisKKwkJCQlpZiAoQ01EX1ZBUkFSRyhkZXNjLT5jbWQpKQorCQkJCQl2YXJmbGFnID0gMTsKKworCQkJCWlmICh2YXJmbGFnIHx8IENNRF9WQVJJQUJMRShkZXNjLT5jbWQpCisJCQkJICAgIHx8IENNRF9PUFRJT04oZGVzYy0+Y21kKSkKKwkJCQkJYXJndlthcmdjKytdID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpOworCQkJfSBlbHNlCisJCQkJYXJndlthcmdjKytdID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpOworCQl9CisKKwkJaWYgKGFyZ2MgPj0gQ01EX0FSR0NfTUFYKQorCQkJcmV0dXJuIENNRF9FUlJfRVhFRURfQVJHQ19NQVg7CisJfQorCisJLyogRm9yIHZ0eXNoIGV4ZWN1dGlvbi4gKi8KKwlpZiAoY21kKQorCQkqY21kID0gbWF0Y2hlZF9lbGVtZW50OworCisJaWYgKG1hdGNoZWRfZWxlbWVudC0+ZGFlbW9uKQorCQlyZXR1cm4gQ01EX1NVQ0NFU1NfREFFTU9OOworCisJLyogTm93IGV4ZWN1dGUgbWF0Y2hlZCBjb21tYW5kICovCisJcmV0dXJuICgqbWF0Y2hlZF9lbGVtZW50LT5mdW5jKSAobWF0Y2hlZF9lbGVtZW50LCB2dHksIGFyZ2MsIGFyZ3YpOworfQorCisvKiBDb25maWdyYXRpb24gbWFrZSBmcm9tIGZpbGUuICovCitpbnQgY29uZmlnX2Zyb21fZmlsZShzdHJ1Y3QgdnR5ICp2dHksIEZJTEUgKiBmcCkKK3sKKwlpbnQgcmV0OworCXZlY3RvciB2bGluZTsKKworCXdoaWxlIChmZ2V0cyh2dHktPmJ1ZiwgVlRZX0JVRlNJWiwgZnApKSB7CisJCXZsaW5lID0gY21kX21ha2Vfc3RydmVjKHZ0eS0+YnVmKTsKKworCQkvKiBJbiBjYXNlIG9mIGNvbW1lbnQgbGluZSAqLworCQlpZiAodmxpbmUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQkvKiBFeGVjdXRlIGNvbmZpZ3VyYXRpb24gY29tbWFuZCA6IHRoaXMgaXMgc3RyaWN0IG1hdGNoICovCisJCXJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmRfc3RyaWN0KHZsaW5lLCB2dHksIE5VTEwpOworCisJCS8qIFRyeSBhZ2FpbiB3aXRoIHNldHRpbmcgbm9kZSB0byBDT05GSUdfTk9ERSAqLworCQl3aGlsZSAocmV0ICE9IENNRF9TVUNDRVNTICYmIHJldCAhPSBDTURfV0FSTklORworCQkgICAgICAgJiYgcmV0ICE9IENNRF9FUlJfTk9USElOR19UT0RPCisJCSAgICAgICAmJiB2dHktPm5vZGUgIT0gQ09ORklHX05PREUpIHsKKwkJCXZ0eV9nb19wYXJlbnQodnR5KTsKKwkJCXJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmRfc3RyaWN0KHZsaW5lLCB2dHksIE5VTEwpOworCQl9CisKKwkJY21kX2ZyZWVfc3RydmVjKHZsaW5lKTsKKworCQlpZiAocmV0ICE9IENNRF9TVUNDRVNTICYmIHJldCAhPSBDTURfV0FSTklORworCQkgICAgJiYgcmV0ICE9IENNRF9FUlJfTk9USElOR19UT0RPKQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBDb25maWdyYXRpb24gZnJvbSB0ZXJtaW5hbCAqLworREVGVU4oY29uZmlnX3Rlcm1pbmFsLAorICAgICAgY29uZmlnX3Rlcm1pbmFsX2NtZCwKKyAgICAgICJjb25maWd1cmUgdGVybWluYWwiLAorICAgICAgIkNvbmZpZ3VyYXRpb24gZnJvbSB2dHkgaW50ZXJmYWNlXG4iICJDb25maWd1cmF0aW9uIHRlcm1pbmFsXG4iKQoreworCWlmICh2dHlfY29uZmlnX2xvY2sodnR5KSkKKwkJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisJZWxzZSB7CisJCXZ0eV9vdXQodnR5LCAiVlRZIGNvbmZpZ3VyYXRpb24gaXMgbG9ja2VkIGJ5IG90aGVyIFZUWSVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIEVuYWJsZSBjb21tYW5kICovCitERUZVTihlbmFibGUsIGNvbmZpZ19lbmFibGVfY21kLCAiZW5hYmxlIiwgIlR1cm4gb24gcHJpdmlsZWdlZCBtb2RlIGNvbW1hbmRcbiIpCit7CisJLyogSWYgZW5hYmxlIHBhc3N3b3JkIGlzIE5VTEwsIGNoYW5nZSB0byBFTkFCTEVfTk9ERSAqLworCWlmICgoaG9zdC5lbmFibGUgPT0gTlVMTCAmJiBob3N0LmVuYWJsZV9lbmNyeXB0ID09IE5VTEwpIHx8CisJICAgIHZ0eS0+dHlwZSA9PSBWVFlfU0hFTExfU0VSVikKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJZWxzZQorCQl2dHktPm5vZGUgPSBBVVRIX0VOQUJMRV9OT0RFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBEaXNhYmxlIGNvbW1hbmQgKi8KK0RFRlVOKGRpc2FibGUsCisgICAgICBjb25maWdfZGlzYWJsZV9jbWQsICJkaXNhYmxlIiwgIlR1cm4gb2ZmIHByaXZpbGVnZWQgbW9kZSBjb21tYW5kXG4iKQoreworCWlmICh2dHktPm5vZGUgPT0gRU5BQkxFX05PREUpCisJCXZ0eS0+bm9kZSA9IFZJRVdfTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIERvd24gdnR5IG5vZGUgbGV2ZWwuICovCitERUZVTihjb25maWdfZXhpdCwKKyAgICAgIGNvbmZpZ19leGl0X2NtZCwgImV4aXQiLCAiRXhpdCBjdXJyZW50IG1vZGUgYW5kIGRvd24gdG8gcHJldmlvdXMgbW9kZVxuIikKK3sKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgR1NNTkVUX05PREU6CisJCXZ0eS0+bm9kZSA9IENPTkZJR19OT0RFOworCQl2dHktPmluZGV4ID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBCVFNfTk9ERToKKwkJdnR5LT5ub2RlID0gR1NNTkVUX05PREU7CisJCXsKKwkJCS8qIHNldCB2dHktPmluZGV4IGNvcnJlY3RseSAhICovCisJCQlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwkJCXZ0eS0+aW5kZXggPSBidHMtPm5ldHdvcms7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUUlhfTk9ERToKKwkJdnR5LT5ub2RlID0gQlRTX05PREU7CisJCXsKKwkJCS8qIHNldCB2dHktPmluZGV4IGNvcnJlY3RseSAhICovCisJCQlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisJCQl2dHktPmluZGV4ID0gdHJ4LT5idHM7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUU19OT0RFOgorCQl2dHktPm5vZGUgPSBUUlhfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSB2dHktPmluZGV4OworCQkJdnR5LT5pbmRleCA9IHRzLT50cng7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTVUJTQ1JfTk9ERToKKwkJdnR5LT5ub2RlID0gVklFV19OT0RFOworCQlzdWJzY3JfcHV0KHZ0eS0+aW5kZXgpOworCQl2dHktPmluZGV4ID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBWSUVXX05PREU6CisJY2FzZSBFTkFCTEVfTk9ERToKKwkJaWYgKDApCQkvL3Z0eV9zaGVsbCAodnR5KSkKKwkJCWV4aXQoMCk7CisJCWVsc2UKKwkJCXZ0eS0+c3RhdHVzID0gVlRZX0NMT1NFOworCQlicmVhazsKKwljYXNlIENPTkZJR19OT0RFOgorCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwkJdnR5X2NvbmZpZ191bmxvY2sodnR5KTsKKwkJYnJlYWs7CisJY2FzZSBWVFlfTk9ERToKKwkJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIHF1aXQgaXMgYWxpYXMgb2YgZXhpdC4gKi8KK0FMSUFTKGNvbmZpZ19leGl0LAorICAgICAgY29uZmlnX3F1aXRfY21kLCAicXVpdCIsICJFeGl0IGN1cnJlbnQgbW9kZSBhbmQgZG93biB0byBwcmV2aW91cyBtb2RlXG4iKQorCisvKiBFbmQgb2YgY29uZmlndXJhdGlvbi4gKi8KKyAgICBERUZVTihjb25maWdfZW5kLAorICAgICAgY29uZmlnX2VuZF9jbWQsICJlbmQiLCAiRW5kIGN1cnJlbnQgbW9kZSBhbmQgY2hhbmdlIHRvIGVuYWJsZSBtb2RlLiIpCit7CisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIFZJRVdfTk9ERToKKwljYXNlIEVOQUJMRV9OT0RFOgorCQkvKiBOb3RoaW5nIHRvIGRvLiAqLworCQlicmVhazsKKwljYXNlIENPTkZJR19OT0RFOgorCWNhc2UgVlRZX05PREU6CisJCXZ0eV9jb25maWdfdW5sb2NrKHZ0eSk7CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBTaG93IHZlcnNpb24uICovCitERUZVTihzaG93X3ZlcnNpb24sCisgICAgICBzaG93X3ZlcnNpb25fY21kLCAic2hvdyB2ZXJzaW9uIiwgU0hPV19TVFIgIkRpc3BsYXlzIHByb2dyYW0gdmVyc2lvblxuIikKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzICVzICglcykuJXMiLCBRVUFHR0FfUFJPR05BTUUsIFFVQUdHQV9WRVJTSU9OLAorCQlob3N0Lm5hbWUgPyBob3N0Lm5hbWUgOiAiIiwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiJXMlcyIsIFFVQUdHQV9DT1BZUklHSFQsIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogSGVscCBkaXNwbGF5IGZ1bmN0aW9uIGZvciBhbGwgbm9kZS4gKi8KK0RFRlVOKGNvbmZpZ19oZWxwLAorICAgICAgY29uZmlnX2hlbHBfY21kLCAiaGVscCIsICJEZXNjcmlwdGlvbiBvZiB0aGUgaW50ZXJhY3RpdmUgaGVscCBzeXN0ZW1cbiIpCit7CisJdnR5X291dCh2dHksCisJCSJUaGlzIFZUWSBwcm92aWRlcyBhZHZhbmNlZCBoZWxwIGZlYXR1cmVzLiAgV2hlbiB5b3UgbmVlZCBoZWxwLCVzXAorYW55dGltZSBhdCB0aGUgY29tbWFuZCBsaW5lIHBsZWFzZSBwcmVzcyAnPycuJXNcCislc1wKK0lmIG5vdGhpbmcgbWF0Y2hlcywgdGhlIGhlbHAgbGlzdCB3aWxsIGJlIGVtcHR5IGFuZCB5b3UgbXVzdCBiYWNrdXAlc1wKKyB1bnRpbCBlbnRlcmluZyBhICc/JyBzaG93cyB0aGUgYXZhaWxhYmxlIG9wdGlvbnMuJXNcCitUd28gc3R5bGVzIG9mIGhlbHAgYXJlIHByb3ZpZGVkOiVzXAorMS4gRnVsbCBoZWxwIGlzIGF2YWlsYWJsZSB3aGVuIHlvdSBhcmUgcmVhZHkgdG8gZW50ZXIgYSVzXAorY29tbWFuZCBhcmd1bWVudCAoZS5nLiAnc2hvdyA/JykgYW5kIGRlc2NyaWJlcyBlYWNoIHBvc3NpYmxlJXNcCithcmd1bWVudC4lc1wKKzIuIFBhcnRpYWwgaGVscCBpcyBwcm92aWRlZCB3aGVuIGFuIGFiYnJldmlhdGVkIGFyZ3VtZW50IGlzIGVudGVyZWQlc1wKKyAgIGFuZCB5b3Ugd2FudCB0byBrbm93IHdoYXQgYXJndW1lbnRzIG1hdGNoIHRoZSBpbnB1dCVzXAorICAgKGUuZy4gJ3Nob3cgbWU/Jy4pJXMlcyIsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsCisJCVZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIEhlbHAgZGlzcGxheSBmdW5jdGlvbiBmb3IgYWxsIG5vZGUuICovCitERUZVTihjb25maWdfbGlzdCwgY29uZmlnX2xpc3RfY21kLCAibGlzdCIsICJQcmludCBjb21tYW5kIGxpc3RcbiIpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGNtZF9ub2RlICpjbm9kZSA9IHZlY3Rvcl9zbG90KGNtZHZlYywgdnR5LT5ub2RlKTsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZDsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGNub2RlLT5jbWRfdmVjdG9yKTsgaSsrKQorCQlpZiAoKGNtZCA9IHZlY3Rvcl9zbG90KGNub2RlLT5jbWRfdmVjdG9yLCBpKSkgIT0gTlVMTAorCQkgICAgJiYgIShjbWQtPmF0dHIgPT0gQ01EX0FUVFJfREVQUkVDQVRFRAorCQkJIHx8IGNtZC0+YXR0ciA9PSBDTURfQVRUUl9ISURERU4pKQorCQkJdnR5X291dCh2dHksICIgICVzJXMiLCBjbWQtPnN0cmluZywgVlRZX05FV0xJTkUpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogV3JpdGUgY3VycmVudCBjb25maWd1cmF0aW9uIGludG8gZmlsZS4gKi8KK0RFRlVOKGNvbmZpZ193cml0ZV9maWxlLAorICAgICAgY29uZmlnX3dyaXRlX2ZpbGVfY21kLAorICAgICAgIndyaXRlIGZpbGUiLAorICAgICAgIldyaXRlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiB0byBtZW1vcnksIG5ldHdvcmssIG9yIHRlcm1pbmFsXG4iCisgICAgICAiV3JpdGUgdG8gY29uZmlndXJhdGlvbiBmaWxlXG4iKQoreworCXVuc2lnbmVkIGludCBpOworCWludCBmZDsKKwlzdHJ1Y3QgY21kX25vZGUgKm5vZGU7CisJY2hhciAqY29uZmlnX2ZpbGU7CisJY2hhciAqY29uZmlnX2ZpbGVfdG1wID0gTlVMTDsKKwljaGFyICpjb25maWdfZmlsZV9zYXYgPSBOVUxMOworCXN0cnVjdCB2dHkgKmZpbGVfdnR5OworCisJLyogQ2hlY2sgYW5kIHNlZSBpZiB3ZSBhcmUgb3BlcmF0aW5nIHVuZGVyIHZ0eXNoIGNvbmZpZ3VyYXRpb24gKi8KKwlpZiAoaG9zdC5jb25maWcgPT0gTlVMTCkgeworCQl2dHlfb3V0KHZ0eSwgIkNhbid0IHNhdmUgdG8gY29uZmlndXJhdGlvbiBmaWxlLCB1c2luZyB2dHlzaC4lcyIsCisJCQlWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwkvKiBHZXQgZmlsZW5hbWUuICovCisJY29uZmlnX2ZpbGUgPSBob3N0LmNvbmZpZzsKKworCWNvbmZpZ19maWxlX3NhdiA9CisJICAgIF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LAorCQkJIHN0cmxlbihjb25maWdfZmlsZSkgKyBzdHJsZW4oQ09ORl9CQUNLVVBfRVhUKSArIDEsCisJCQkgImNvbmZpZ19maWxlX3NhdiIpOworCXN0cmNweShjb25maWdfZmlsZV9zYXYsIGNvbmZpZ19maWxlKTsKKwlzdHJjYXQoY29uZmlnX2ZpbGVfc2F2LCBDT05GX0JBQ0tVUF9FWFQpOworCisJY29uZmlnX2ZpbGVfdG1wID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsIHN0cmxlbihjb25maWdfZmlsZSkgKyA4LAorCQkJCQkiY29uZmlnX2ZpbGVfdG1wIik7CisJc3ByaW50Zihjb25maWdfZmlsZV90bXAsICIlcy5YWFhYWFgiLCBjb25maWdfZmlsZSk7CisKKwkvKiBPcGVuIGZpbGUgdG8gY29uZmlndXJhdGlvbiB3cml0ZS4gKi8KKwlmZCA9IG1rc3RlbXAoY29uZmlnX2ZpbGVfdG1wKTsKKwlpZiAoZmQgPCAwKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3Qgb3BlbiBjb25maWd1cmF0aW9uIGZpbGUgJXMuJXMiLAorCQkJY29uZmlnX2ZpbGVfdG1wLCBWVFlfTkVXTElORSk7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3RtcCk7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3Nhdik7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwkvKiBNYWtlIHZ0eSBmb3IgY29uZmlndXJhdGlvbiBmaWxlLiAqLworCWZpbGVfdnR5ID0gdnR5X25ldygpOworCWZpbGVfdnR5LT5mZCA9IGZkOworCWZpbGVfdnR5LT50eXBlID0gVlRZX0ZJTEU7CisKKwkvKiBDb25maWcgZmlsZSBoZWFkZXIgcHJpbnQuICovCisJdnR5X291dChmaWxlX3Z0eSwgIiFcbiEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5XG4hICAgIik7CisJLy92dHlfdGltZV9wcmludCAoZmlsZV92dHksIDEpOworCXZ0eV9vdXQoZmlsZV92dHksICIhXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGNtZHZlYyk7IGkrKykKKwkJaWYgKChub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCBpKSkgJiYgbm9kZS0+ZnVuYykgeworCQkJaWYgKCgqbm9kZS0+ZnVuYykgKGZpbGVfdnR5KSkKKwkJCQl2dHlfb3V0KGZpbGVfdnR5LCAiIVxuIik7CisJCX0KKwl2dHlfY2xvc2UoZmlsZV92dHkpOworCisJaWYgKHVubGluayhjb25maWdfZmlsZV9zYXYpICE9IDApCisJCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJCXZ0eV9vdXQodnR5LAorCQkJCSJDYW4ndCB1bmxpbmsgYmFja3VwIGNvbmZpZ3VyYXRpb24gZmlsZSAlcy4lcyIsCisJCQkJY29uZmlnX2ZpbGVfc2F2LCBWVFlfTkVXTElORSk7CisJCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV9zYXYpOworCQkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfdG1wKTsKKwkJCXVubGluayhjb25maWdfZmlsZV90bXApOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJaWYgKGxpbmsoY29uZmlnX2ZpbGUsIGNvbmZpZ19maWxlX3NhdikgIT0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIkNhbid0IGJhY2t1cCBvbGQgY29uZmlndXJhdGlvbiBmaWxlICVzLiVzIiwKKwkJCWNvbmZpZ19maWxlX3NhdiwgVlRZX05FV0xJTkUpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV9zYXYpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOworCQl1bmxpbmsoY29uZmlnX2ZpbGVfdG1wKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlzeW5jKCk7CisJaWYgKHVubGluayhjb25maWdfZmlsZSkgIT0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIkNhbid0IHVubGluayBjb25maWd1cmF0aW9uIGZpbGUgJXMuJXMiLAorCQkJY29uZmlnX2ZpbGUsIFZUWV9ORVdMSU5FKTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfdG1wKTsKKwkJdW5saW5rKGNvbmZpZ19maWxlX3RtcCk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJaWYgKGxpbmsoY29uZmlnX2ZpbGVfdG1wLCBjb25maWdfZmlsZSkgIT0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIkNhbid0IHNhdmUgY29uZmlndXJhdGlvbiBmaWxlICVzLiVzIiwgY29uZmlnX2ZpbGUsCisJCQlWVFlfTkVXTElORSk7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3Nhdik7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3RtcCk7CisJCXVubGluayhjb25maWdfZmlsZV90bXApOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCXVubGluayhjb25maWdfZmlsZV90bXApOworCXN5bmMoKTsKKworCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3Nhdik7CisJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfdG1wKTsKKworCWlmIChjaG1vZChjb25maWdfZmlsZSwgMDY2NiAmIH5DT05GSUdGSUxFX01BU0spICE9IDApIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCBjaG1vZCBjb25maWd1cmF0aW9uIGZpbGUgJXM6ICVzICglZCkuJXMiLAorCQkJY29uZmlnX2ZpbGUsIHN0cmVycm9yKGVycm5vKSwgZXJybm8sIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCXZ0eV9vdXQodnR5LCAiQ29uZmlndXJhdGlvbiBzYXZlZCB0byAlcyVzIiwgY29uZmlnX2ZpbGUsIFZUWV9ORVdMSU5FKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0FMSUFTKGNvbmZpZ193cml0ZV9maWxlLAorICAgICAgY29uZmlnX3dyaXRlX2NtZCwKKyAgICAgICJ3cml0ZSIsICJXcml0ZSBydW5uaW5nIGNvbmZpZ3VyYXRpb24gdG8gbWVtb3J5LCBuZXR3b3JrLCBvciB0ZXJtaW5hbFxuIikKKworICAgIEFMSUFTKGNvbmZpZ193cml0ZV9maWxlLAorICAgICAgY29uZmlnX3dyaXRlX21lbW9yeV9jbWQsCisgICAgICAid3JpdGUgbWVtb3J5IiwKKyAgICAgICJXcml0ZSBydW5uaW5nIGNvbmZpZ3VyYXRpb24gdG8gbWVtb3J5LCBuZXR3b3JrLCBvciB0ZXJtaW5hbFxuIgorICAgICAgIldyaXRlIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGZpbGUgKHNhbWUgYXMgd3JpdGUgZmlsZSlcbiIpCisKKyAgICBBTElBUyhjb25maWdfd3JpdGVfZmlsZSwKKyAgICAgIGNvcHlfcnVubmluZ2NvbmZpZ19zdGFydHVwY29uZmlnX2NtZCwKKyAgICAgICJjb3B5IHJ1bm5pbmctY29uZmlnIHN0YXJ0dXAtY29uZmlnIiwKKyAgICAgICJDb3B5IGNvbmZpZ3VyYXRpb25cbiIKKyAgICAgICJDb3B5IHJ1bm5pbmcgY29uZmlnIHRvLi4uIFxuIgorICAgICAgIkNvcHkgcnVubmluZyBjb25maWcgdG8gc3RhcnR1cCBjb25maWcgKHNhbWUgYXMgd3JpdGUgZmlsZSlcbiIpCisKKy8qIFdyaXRlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBpbnRvIHRoZSB0ZXJtaW5hbC4gKi8KKyAgICBERUZVTihjb25maWdfd3JpdGVfdGVybWluYWwsCisgICAgICBjb25maWdfd3JpdGVfdGVybWluYWxfY21kLAorICAgICAgIndyaXRlIHRlcm1pbmFsIiwKKyAgICAgICJXcml0ZSBydW5uaW5nIGNvbmZpZ3VyYXRpb24gdG8gbWVtb3J5LCBuZXR3b3JrLCBvciB0ZXJtaW5hbFxuIgorICAgICAgIldyaXRlIHRvIHRlcm1pbmFsXG4iKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBjbWRfbm9kZSAqbm9kZTsKKworCWlmICh2dHktPnR5cGUgPT0gVlRZX1NIRUxMX1NFUlYpIHsKKwkJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kdmVjKTsgaSsrKQorCQkJaWYgKChub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCBpKSkgJiYgbm9kZS0+ZnVuYworCQkJICAgICYmIG5vZGUtPnZ0eXNoKSB7CisJCQkJaWYgKCgqbm9kZS0+ZnVuYykgKHZ0eSkpCisJCQkJCXZ0eV9vdXQodnR5LCAiISVzIiwgVlRZX05FV0xJTkUpOworCQkJfQorCX0gZWxzZSB7CisJCXZ0eV9vdXQodnR5LCAiJXNDdXJyZW50IGNvbmZpZ3VyYXRpb246JXMiLCBWVFlfTkVXTElORSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIhJXMiLCBWVFlfTkVXTElORSk7CisKKwkJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kdmVjKTsgaSsrKQorCQkJaWYgKChub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCBpKSkgJiYgbm9kZS0+ZnVuYykgeworCQkJCWlmICgoKm5vZGUtPmZ1bmMpICh2dHkpKQorCQkJCQl2dHlfb3V0KHZ0eSwgIiElcyIsIFZUWV9ORVdMSU5FKTsKKwkJCX0KKwkJdnR5X291dCh2dHksICJlbmQlcyIsIFZUWV9ORVdMSU5FKTsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBXcml0ZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaW50byB0aGUgdGVybWluYWwuICovCitBTElBUyhjb25maWdfd3JpdGVfdGVybWluYWwsCisgICAgICBzaG93X3J1bm5pbmdfY29uZmlnX2NtZCwKKyAgICAgICJzaG93IHJ1bm5pbmctY29uZmlnIiwgU0hPV19TVFIgInJ1bm5pbmcgY29uZmlndXJhdGlvblxuIikKKworLyogV3JpdGUgc3RhcnR1cCBjb25maWd1cmF0aW9uIGludG8gdGhlIHRlcm1pbmFsLiAqLworICAgIERFRlVOKHNob3dfc3RhcnR1cF9jb25maWcsCisgICAgICBzaG93X3N0YXJ0dXBfY29uZmlnX2NtZCwKKyAgICAgICJzaG93IHN0YXJ0dXAtY29uZmlnIiwgU0hPV19TVFIgIkNvbnRlbnRlcyBvZiBzdGFydHVwIGNvbmZpZ3VyYXRpb25cbiIpCit7CisJY2hhciBidWZbQlVGU0laXTsKKwlGSUxFICpjb25mcDsKKworCWNvbmZwID0gZm9wZW4oaG9zdC5jb25maWcsICJyIik7CisJaWYgKGNvbmZwID09IE5VTEwpIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCBvcGVuIGNvbmZpZ3VyYXRpb24gZmlsZSBbJXNdJXMiLAorCQkJaG9zdC5jb25maWcsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCXdoaWxlIChmZ2V0cyhidWYsIEJVRlNJWiwgY29uZnApKSB7CisJCWNoYXIgKmNwID0gYnVmOworCisJCXdoaWxlICgqY3AgIT0gJ1xyJyAmJiAqY3AgIT0gJ1xuJyAmJiAqY3AgIT0gJ1wwJykKKwkJCWNwKys7CisJCSpjcCA9ICdcMCc7CisKKwkJdnR5X291dCh2dHksICIlcyVzIiwgYnVmLCBWVFlfTkVXTElORSk7CisJfQorCisJZmNsb3NlKGNvbmZwKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogSG9zdG5hbWUgY29uZmlndXJhdGlvbiAqLworREVGVU4oY29uZmlnX2hvc3RuYW1lLAorICAgICAgaG9zdG5hbWVfY21kLAorICAgICAgImhvc3RuYW1lIFdPUkQiLAorICAgICAgIlNldCBzeXN0ZW0ncyBuZXR3b3JrIG5hbWVcbiIgIlRoaXMgc3lzdGVtJ3MgbmV0d29yayBuYW1lXG4iKQoreworCWlmICghaXNhbHBoYSgoaW50KSphcmd2WzBdKSkgeworCQl2dHlfb3V0KHZ0eSwgIlBsZWFzZSBzcGVjaWZ5IHN0cmluZyBzdGFydGluZyB3aXRoIGFscGhhYmV0JXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGhvc3QubmFtZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5uYW1lKTsKKworCWhvc3QubmFtZSA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbm9faG9zdG5hbWUsCisgICAgICBub19ob3N0bmFtZV9jbWQsCisgICAgICAibm8gaG9zdG5hbWUgW0hPU1ROQU1FXSIsCisgICAgICBOT19TVFIgIlJlc2V0IHN5c3RlbSdzIG5ldHdvcmsgbmFtZVxuIiAiSG9zdCBuYW1lIG9mIHRoaXMgcm91dGVyXG4iKQoreworCWlmIChob3N0Lm5hbWUpCisJCXRhbGxvY19mcmVlKGhvc3QubmFtZSk7CisJaG9zdC5uYW1lID0gTlVMTDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIFZUWSBpbnRlcmZhY2UgcGFzc3dvcmQgc2V0LiAqLworREVGVU4oY29uZmlnX3Bhc3N3b3JkLCBwYXNzd29yZF9jbWQsCisgICAgICAicGFzc3dvcmQgKDh8KSBXT1JEIiwKKyAgICAgICJBc3NpZ24gdGhlIHRlcm1pbmFsIGNvbm5lY3Rpb24gcGFzc3dvcmRcbiIKKyAgICAgICJTcGVjaWZpZXMgYSBISURERU4gcGFzc3dvcmQgd2lsbCBmb2xsb3dcbiIKKyAgICAgICJkdW1teSBzdHJpbmcgXG4iICJUaGUgSElEREVOIGxpbmUgcGFzc3dvcmQgc3RyaW5nXG4iKQoreworCS8qIEFyZ3VtZW50IGNoZWNrLiAqLworCWlmIChhcmdjID09IDApIHsKKwkJdnR5X291dCh2dHksICJQbGVhc2Ugc3BlY2lmeSBwYXNzd29yZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChhcmdjID09IDIpIHsKKwkJaWYgKCphcmd2WzBdID09ICc4JykgeworCQkJaWYgKGhvc3QucGFzc3dvcmQpCisJCQkJdGFsbG9jX2ZyZWUoaG9zdC5wYXNzd29yZCk7CisJCQlob3N0LnBhc3N3b3JkID0gTlVMTDsKKwkJCWlmIChob3N0LnBhc3N3b3JkX2VuY3J5cHQpCisJCQkJdGFsbG9jX2ZyZWUoaG9zdC5wYXNzd29yZF9lbmNyeXB0KTsKKwkJCWhvc3QucGFzc3dvcmRfZW5jcnlwdCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgYXJndlsxXSk7CisJCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJCX0gZWxzZSB7CisJCQl2dHlfb3V0KHZ0eSwgIlVua25vd24gZW5jcnlwdGlvbiB0eXBlLiVzIiwgVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJfQorCisJaWYgKCFpc2FsbnVtKChpbnQpKmFyZ3ZbMF0pKSB7CisJCXZ0eV9vdXQodnR5LAorCQkJIlBsZWFzZSBzcGVjaWZ5IHN0cmluZyBzdGFydGluZyB3aXRoIGFscGhhbnVtZXJpYyVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChob3N0LnBhc3N3b3JkKQorCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkKTsKKwlob3N0LnBhc3N3b3JkID0gTlVMTDsKKworI2lmZGVmIFZUWV9DUllQVF9QVworCWlmIChob3N0LmVuY3J5cHQpIHsKKwkJaWYgKGhvc3QucGFzc3dvcmRfZW5jcnlwdCkKKwkJCXRhbGxvY19mcmVlKGhvc3QucGFzc3dvcmRfZW5jcnlwdCk7CisJCWhvc3QucGFzc3dvcmRfZW5jcnlwdCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgemVuY3J5cHQoYXJndlswXSkpOworCX0gZWxzZQorI2VuZGlmCisJCWhvc3QucGFzc3dvcmQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitBTElBUyhjb25maWdfcGFzc3dvcmQsIHBhc3N3b3JkX3RleHRfY21kLAorICAgICAgInBhc3N3b3JkIExJTkUiLAorICAgICAgIkFzc2lnbiB0aGUgdGVybWluYWwgY29ubmVjdGlvbiBwYXNzd29yZFxuIgorICAgICAgIlRoZSBVTkVOQ1JZUFRFRCAoY2xlYXJ0ZXh0KSBsaW5lIHBhc3N3b3JkXG4iKQorCisvKiBWVFkgZW5hYmxlIHBhc3N3b3JkIHNldC4gKi8KKyAgICBERUZVTihjb25maWdfZW5hYmxlX3Bhc3N3b3JkLCBlbmFibGVfcGFzc3dvcmRfY21kLAorICAgICAgImVuYWJsZSBwYXNzd29yZCAoOHwpIFdPUkQiLAorICAgICAgIk1vZGlmeSBlbmFibGUgcGFzc3dvcmQgcGFyYW1ldGVyc1xuIgorICAgICAgIkFzc2lnbiB0aGUgcHJpdmlsZWdlZCBsZXZlbCBwYXNzd29yZFxuIgorICAgICAgIlNwZWNpZmllcyBhIEhJRERFTiBwYXNzd29yZCB3aWxsIGZvbGxvd1xuIgorICAgICAgImR1bW15IHN0cmluZyBcbiIgIlRoZSBISURERU4gJ2VuYWJsZScgcGFzc3dvcmQgc3RyaW5nXG4iKQoreworCS8qIEFyZ3VtZW50IGNoZWNrLiAqLworCWlmIChhcmdjID09IDApIHsKKwkJdnR5X291dCh2dHksICJQbGVhc2Ugc3BlY2lmeSBwYXNzd29yZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCS8qIENyeXB0IHR5cGUgaXMgc3BlY2lmaWVkLiAqLworCWlmIChhcmdjID09IDIpIHsKKwkJaWYgKCphcmd2WzBdID09ICc4JykgeworCQkJaWYgKGhvc3QuZW5hYmxlKQorCQkJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlKTsKKwkJCWhvc3QuZW5hYmxlID0gTlVMTDsKKworCQkJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCisJCQkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGVfZW5jcnlwdCk7CisJCQlob3N0LmVuYWJsZV9lbmNyeXB0ID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzFdKTsKKworCQkJcmV0dXJuIENNRF9TVUNDRVNTOworCQl9IGVsc2UgeworCQkJdnR5X291dCh2dHksICJVbmtub3duIGVuY3J5cHRpb24gdHlwZS4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCX0KKworCWlmICghaXNhbG51bSgoaW50KSphcmd2WzBdKSkgeworCQl2dHlfb3V0KHZ0eSwKKwkJCSJQbGVhc2Ugc3BlY2lmeSBzdHJpbmcgc3RhcnRpbmcgd2l0aCBhbHBoYW51bWVyaWMlcyIsCisJCQlWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoaG9zdC5lbmFibGUpCisJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlKTsKKwlob3N0LmVuYWJsZSA9IE5VTEw7CisKKwkvKiBQbGFpbiBwYXNzd29yZCBpbnB1dC4gKi8KKyNpZmRlZiBWVFlfQ1JZUFRfUFcKKwlpZiAoaG9zdC5lbmNyeXB0KSB7CisJCWlmIChob3N0LmVuYWJsZV9lbmNyeXB0KQorCQkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGVfZW5jcnlwdCk7CisJCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIHplbmNyeXB0KGFyZ3ZbMF0pKTsKKwl9IGVsc2UKKyNlbmRpZgorCQlob3N0LmVuYWJsZSA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0FMSUFTKGNvbmZpZ19lbmFibGVfcGFzc3dvcmQsCisgICAgICBlbmFibGVfcGFzc3dvcmRfdGV4dF9jbWQsCisgICAgICAiZW5hYmxlIHBhc3N3b3JkIExJTkUiLAorICAgICAgIk1vZGlmeSBlbmFibGUgcGFzc3dvcmQgcGFyYW1ldGVyc1xuIgorICAgICAgIkFzc2lnbiB0aGUgcHJpdmlsZWdlZCBsZXZlbCBwYXNzd29yZFxuIgorICAgICAgIlRoZSBVTkVOQ1JZUFRFRCAoY2xlYXJ0ZXh0KSAnZW5hYmxlJyBwYXNzd29yZFxuIikKKworLyogVlRZIGVuYWJsZSBwYXNzd29yZCBkZWxldGUuICovCisgICAgREVGVU4obm9fY29uZmlnX2VuYWJsZV9wYXNzd29yZCwgbm9fZW5hYmxlX3Bhc3N3b3JkX2NtZCwKKyAgICAgICJubyBlbmFibGUgcGFzc3dvcmQiLAorICAgICAgTk9fU1RSCisgICAgICAiTW9kaWZ5IGVuYWJsZSBwYXNzd29yZCBwYXJhbWV0ZXJzXG4iCisgICAgICAiQXNzaWduIHRoZSBwcml2aWxlZ2VkIGxldmVsIHBhc3N3b3JkXG4iKQoreworCWlmIChob3N0LmVuYWJsZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGUpOworCWhvc3QuZW5hYmxlID0gTlVMTDsKKworCWlmIChob3N0LmVuYWJsZV9lbmNyeXB0KQorCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZV9lbmNyeXB0KTsKKwlob3N0LmVuYWJsZV9lbmNyeXB0ID0gTlVMTDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworI2lmZGVmIFZUWV9DUllQVF9QVworREVGVU4oc2VydmljZV9wYXNzd29yZF9lbmNyeXB0LAorICAgICAgc2VydmljZV9wYXNzd29yZF9lbmNyeXB0X2NtZCwKKyAgICAgICJzZXJ2aWNlIHBhc3N3b3JkLWVuY3J5cHRpb24iLAorICAgICAgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIgIkVuYWJsZSBlbmNyeXB0ZWQgcGFzc3dvcmRzXG4iKQoreworCWlmIChob3N0LmVuY3J5cHQpCisJCXJldHVybiBDTURfU1VDQ0VTUzsKKworCWhvc3QuZW5jcnlwdCA9IDE7CisKKwlpZiAoaG9zdC5wYXNzd29yZCkgeworCQlpZiAoaG9zdC5wYXNzd29yZF9lbmNyeXB0KQorCQkJdGFsbG9jX2ZyZWUoaG9zdC5wYXNzd29yZF9lbmNyeXB0KTsKKwkJaG9zdC5wYXNzd29yZF9lbmNyeXB0ID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCB6ZW5jcnlwdChob3N0LnBhc3N3b3JkKSk7CisJfQorCWlmIChob3N0LmVuYWJsZSkgeworCQlpZiAoaG9zdC5lbmFibGVfZW5jcnlwdCkKKwkJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlX2VuY3J5cHQpOworCQlob3N0LmVuYWJsZV9lbmNyeXB0ID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCB6ZW5jcnlwdChob3N0LmVuYWJsZSkpOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fc2VydmljZV9wYXNzd29yZF9lbmNyeXB0LAorICAgICAgbm9fc2VydmljZV9wYXNzd29yZF9lbmNyeXB0X2NtZCwKKyAgICAgICJubyBzZXJ2aWNlIHBhc3N3b3JkLWVuY3J5cHRpb24iLAorICAgICAgTk9fU1RSICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iICJFbmFibGUgZW5jcnlwdGVkIHBhc3N3b3Jkc1xuIikKK3sKKwlpZiAoIWhvc3QuZW5jcnlwdCkKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCisJaG9zdC5lbmNyeXB0ID0gMDsKKworCWlmIChob3N0LnBhc3N3b3JkX2VuY3J5cHQpCisJCXRhbGxvY19mcmVlKGhvc3QucGFzc3dvcmRfZW5jcnlwdCk7CisJaG9zdC5wYXNzd29yZF9lbmNyeXB0ID0gTlVMTDsKKworCWlmIChob3N0LmVuYWJsZV9lbmNyeXB0KQorCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZV9lbmNyeXB0KTsKKwlob3N0LmVuYWJsZV9lbmNyeXB0ID0gTlVMTDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKyNlbmRpZgorCitERUZVTihjb25maWdfdGVybWluYWxfbGVuZ3RoLCBjb25maWdfdGVybWluYWxfbGVuZ3RoX2NtZCwKKyAgICAgICJ0ZXJtaW5hbCBsZW5ndGggPDAtNTEyPiIsCisgICAgICAiU2V0IHRlcm1pbmFsIGxpbmUgcGFyYW1ldGVyc1xuIgorICAgICAgIlNldCBudW1iZXIgb2YgbGluZXMgb24gYSBzY3JlZW5cbiIKKyAgICAgICJOdW1iZXIgb2YgbGluZXMgb24gc2NyZWVuICgwIGZvciBubyBwYXVzaW5nKVxuIikKK3sKKwlpbnQgbGluZXM7CisJY2hhciAqZW5kcHRyID0gTlVMTDsKKworCWxpbmVzID0gc3RydG9sKGFyZ3ZbMF0sICZlbmRwdHIsIDEwKTsKKwlpZiAobGluZXMgPCAwIHx8IGxpbmVzID4gNTEyIHx8ICplbmRwdHIgIT0gJ1wwJykgeworCQl2dHlfb3V0KHZ0eSwgImxlbmd0aCBpcyBtYWxmb3JtZWQlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwl2dHktPmxpbmVzID0gbGluZXM7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ190ZXJtaW5hbF9ub19sZW5ndGgsIGNvbmZpZ190ZXJtaW5hbF9ub19sZW5ndGhfY21kLAorICAgICAgInRlcm1pbmFsIG5vIGxlbmd0aCIsCisgICAgICAiU2V0IHRlcm1pbmFsIGxpbmUgcGFyYW1ldGVyc1xuIgorICAgICAgTk9fU1RSICJTZXQgbnVtYmVyIG9mIGxpbmVzIG9uIGEgc2NyZWVuXG4iKQoreworCXZ0eS0+bGluZXMgPSAtMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNlcnZpY2VfdGVybWluYWxfbGVuZ3RoLCBzZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aF9jbWQsCisgICAgICAic2VydmljZSB0ZXJtaW5hbC1sZW5ndGggPDAtNTEyPiIsCisgICAgICAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIgorICAgICAgIlN5c3RlbSB3aWRlIHRlcm1pbmFsIGxlbmd0aCBjb25maWd1cmF0aW9uXG4iCisgICAgICAiTnVtYmVyIG9mIGxpbmVzIG9mIFZUWSAoMCBtZWFucyBubyBsaW5lIGNvbnRyb2wpXG4iKQoreworCWludCBsaW5lczsKKwljaGFyICplbmRwdHIgPSBOVUxMOworCisJbGluZXMgPSBzdHJ0b2woYXJndlswXSwgJmVuZHB0ciwgMTApOworCWlmIChsaW5lcyA8IDAgfHwgbGluZXMgPiA1MTIgfHwgKmVuZHB0ciAhPSAnXDAnKSB7CisJCXZ0eV9vdXQodnR5LCAibGVuZ3RoIGlzIG1hbGZvcm1lZCVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWhvc3QubGluZXMgPSBsaW5lczsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fc2VydmljZV90ZXJtaW5hbF9sZW5ndGgsIG5vX3NlcnZpY2VfdGVybWluYWxfbGVuZ3RoX2NtZCwKKyAgICAgICJubyBzZXJ2aWNlIHRlcm1pbmFsLWxlbmd0aCBbPDAtNTEyPl0iLAorICAgICAgTk9fU1RSCisgICAgICAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIgorICAgICAgIlN5c3RlbSB3aWRlIHRlcm1pbmFsIGxlbmd0aCBjb25maWd1cmF0aW9uXG4iCisgICAgICAiTnVtYmVyIG9mIGxpbmVzIG9mIFZUWSAoMCBtZWFucyBubyBsaW5lIGNvbnRyb2wpXG4iKQoreworCWhvc3QubGluZXMgPSAtMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOX0hJRERFTihkb19lY2hvLAorCSAgICAgZWNob19jbWQsCisJICAgICAiZWNobyAuTUVTU0FHRSIsCisJICAgICAiRWNobyBhIG1lc3NhZ2UgYmFjayB0byB0aGUgdnR5XG4iICJUaGUgbWVzc2FnZSB0byBlY2hvXG4iKQoreworCWNoYXIgKm1lc3NhZ2U7CisKKwl2dHlfb3V0KHZ0eSwgIiVzJXMiLAorCQkoKG1lc3NhZ2UgPQorCQkgIGFyZ3ZfY29uY2F0KGFyZ3YsIGFyZ2MsIDApKSA/IG1lc3NhZ2UgOiAiIiksIFZUWV9ORVdMSU5FKTsKKwlpZiAobWVzc2FnZSkKKwkJdGFsbG9jX2ZyZWUobWVzc2FnZSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjaWYgMAorREVGVU4oY29uZmlnX2xvZ21zZywKKyAgICAgIGNvbmZpZ19sb2dtc2dfY21kLAorICAgICAgImxvZ21zZyAiIExPR19MRVZFTFMgIiAuTUVTU0FHRSIsCisgICAgICAiU2VuZCBhIG1lc3NhZ2UgdG8gZW5hYmxlZCBsb2dnaW5nIGRlc3RpbmF0aW9uc1xuIgorICAgICAgTE9HX0xFVkVMX0RFU0MgIlRoZSBtZXNzYWdlIHRvIHNlbmRcbiIpCit7CisJaW50IGxldmVsOworCWNoYXIgKm1lc3NhZ2U7CisKKwlpZiAoKGxldmVsID0gbGV2ZWxfbWF0Y2goYXJndlswXSkpID09IFpMT0dfRElTQUJMRUQpCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCisJemxvZyhOVUxMLCBsZXZlbCwKKwkgICAgICgobWVzc2FnZSA9IGFyZ3ZfY29uY2F0KGFyZ3YsIGFyZ2MsIDEpKSA/IG1lc3NhZ2UgOiAiIikpOworCWlmIChtZXNzYWdlKQorCQl0YWxsb2NfZnJlZShtZXNzYWdlKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNob3dfbG9nZ2luZywKKyAgICAgIHNob3dfbG9nZ2luZ19jbWQsCisgICAgICAic2hvdyBsb2dnaW5nIiwgU0hPV19TVFIgIlNob3cgY3VycmVudCBsb2dnaW5nIGNvbmZpZ3VyYXRpb25cbiIpCit7CisJc3RydWN0IHpsb2cgKnpsID0gemxvZ19kZWZhdWx0OworCisJdnR5X291dCh2dHksICJTeXNsb2cgbG9nZ2luZzogIik7CisJaWYgKHpsLT5tYXhsdmxbWkxPR19ERVNUX1NZU0xPR10gPT0gWkxPR19ESVNBQkxFRCkKKwkJdnR5X291dCh2dHksICJkaXNhYmxlZCIpOworCWVsc2UKKwkJdnR5X291dCh2dHksICJsZXZlbCAlcywgZmFjaWxpdHkgJXMsIGlkZW50ICVzIiwKKwkJCXpsb2dfcHJpb3JpdHlbemwtPm1heGx2bFtaTE9HX0RFU1RfU1lTTE9HXV0sCisJCQlmYWNpbGl0eV9uYW1lKHpsLT5mYWNpbGl0eSksIHpsLT5pZGVudCk7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCXZ0eV9vdXQodnR5LCAiU3Rkb3V0IGxvZ2dpbmc6ICIpOworCWlmICh6bC0+bWF4bHZsW1pMT0dfREVTVF9TVERPVVRdID09IFpMT0dfRElTQUJMRUQpCisJCXZ0eV9vdXQodnR5LCAiZGlzYWJsZWQiKTsKKwllbHNlCisJCXZ0eV9vdXQodnR5LCAibGV2ZWwgJXMiLAorCQkJemxvZ19wcmlvcml0eVt6bC0+bWF4bHZsW1pMT0dfREVTVF9TVERPVVRdXSk7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCXZ0eV9vdXQodnR5LCAiTW9uaXRvciBsb2dnaW5nOiAiKTsKKwlpZiAoemwtPm1heGx2bFtaTE9HX0RFU1RfTU9OSVRPUl0gPT0gWkxPR19ESVNBQkxFRCkKKwkJdnR5X291dCh2dHksICJkaXNhYmxlZCIpOworCWVsc2UKKwkJdnR5X291dCh2dHksICJsZXZlbCAlcyIsCisJCQl6bG9nX3ByaW9yaXR5W3psLT5tYXhsdmxbWkxPR19ERVNUX01PTklUT1JdXSk7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCXZ0eV9vdXQodnR5LCAiRmlsZSBsb2dnaW5nOiAiKTsKKwlpZiAoKHpsLT5tYXhsdmxbWkxPR19ERVNUX0ZJTEVdID09IFpMT0dfRElTQUJMRUQpIHx8ICF6bC0+ZnApCisJCXZ0eV9vdXQodnR5LCAiZGlzYWJsZWQiKTsKKwllbHNlCisJCXZ0eV9vdXQodnR5LCAibGV2ZWwgJXMsIGZpbGVuYW1lICVzIiwKKwkJCXpsb2dfcHJpb3JpdHlbemwtPm1heGx2bFtaTE9HX0RFU1RfRklMRV1dLAorCQkJemwtPmZpbGVuYW1lKTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJdnR5X291dCh2dHksICJQcm90b2NvbCBuYW1lOiAlcyVzIiwKKwkJemxvZ19wcm90b19uYW1lc1t6bC0+cHJvdG9jb2xdLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJSZWNvcmQgcHJpb3JpdHk6ICVzJXMiLAorCQkoemwtPnJlY29yZF9wcmlvcml0eSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpLCBWVFlfTkVXTElORSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfc3Rkb3V0LAorICAgICAgY29uZmlnX2xvZ19zdGRvdXRfY21kLAorICAgICAgImxvZyBzdGRvdXQiLCAiTG9nZ2luZyBjb250cm9sXG4iICJTZXQgc3Rkb3V0IGxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NURE9VVCwgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX3N0ZG91dF9sZXZlbCwKKyAgICAgIGNvbmZpZ19sb2dfc3Rkb3V0X2xldmVsX2NtZCwKKyAgICAgICJsb2cgc3Rkb3V0ICIgTE9HX0xFVkVMUywKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIgIlNldCBzdGRvdXQgbG9nZ2luZyBsZXZlbFxuIiBMT0dfTEVWRUxfREVTQykKK3sKKwlpbnQgbGV2ZWw7CisKKwlpZiAoKGxldmVsID0gbGV2ZWxfbWF0Y2goYXJndlswXSkpID09IFpMT0dfRElTQUJMRUQpCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TVERPVVQsIGxldmVsKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX2NvbmZpZ19sb2dfc3Rkb3V0LAorICAgICAgbm9fY29uZmlnX2xvZ19zdGRvdXRfY21kLAorICAgICAgIm5vIGxvZyBzdGRvdXQgW0xFVkVMXSIsCisgICAgICBOT19TVFIgIkxvZ2dpbmcgY29udHJvbFxuIiAiQ2FuY2VsIGxvZ2dpbmcgdG8gc3Rkb3V0XG4iICJMb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TVERPVVQsIFpMT0dfRElTQUJMRUQpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19tb25pdG9yLAorICAgICAgY29uZmlnX2xvZ19tb25pdG9yX2NtZCwKKyAgICAgICJsb2cgbW9uaXRvciIsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iICJTZXQgdGVybWluYWwgbGluZSAobW9uaXRvcikgbG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfTU9OSVRPUiwgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX21vbml0b3JfbGV2ZWwsCisgICAgICBjb25maWdfbG9nX21vbml0b3JfbGV2ZWxfY21kLAorICAgICAgImxvZyBtb25pdG9yICIgTE9HX0xFVkVMUywKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJTZXQgdGVybWluYWwgbGluZSAobW9uaXRvcikgbG9nZ2luZyBsZXZlbFxuIiBMT0dfTEVWRUxfREVTQykKK3sKKwlpbnQgbGV2ZWw7CisKKwlpZiAoKGxldmVsID0gbGV2ZWxfbWF0Y2goYXJndlswXSkpID09IFpMT0dfRElTQUJMRUQpCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9NT05JVE9SLCBsZXZlbCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19jb25maWdfbG9nX21vbml0b3IsCisgICAgICBub19jb25maWdfbG9nX21vbml0b3JfY21kLAorICAgICAgIm5vIGxvZyBtb25pdG9yIFtMRVZFTF0iLAorICAgICAgTk9fU1RSCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiRGlzYWJsZSB0ZXJtaW5hbCBsaW5lIChtb25pdG9yKSBsb2dnaW5nXG4iICJMb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9NT05JVE9SLCBaTE9HX0RJU0FCTEVEKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2xvZ19maWxlKHN0cnVjdCB2dHkgKnZ0eSwgY29uc3QgY2hhciAqZm5hbWUsIGludCBsb2dsZXZlbCkKK3sKKwlpbnQgcmV0OworCWNoYXIgKnAgPSBOVUxMOworCWNvbnN0IGNoYXIgKmZ1bGxwYXRoOworCisJLyogUGF0aCBkZXRlY3Rpb24uICovCisJaWYgKCFJU19ESVJFQ1RPUllfU0VQKCpmbmFtZSkpIHsKKwkJY2hhciBjd2RbTUFYUEFUSExFTiArIDFdOworCQljd2RbTUFYUEFUSExFTl0gPSAnXDAnOworCisJCWlmIChnZXRjd2QoY3dkLCBNQVhQQVRITEVOKSA9PSBOVUxMKSB7CisJCQl6bG9nX2VycigiY29uZmlnX2xvZ19maWxlOiBVbmFibGUgdG8gYWxsb2MgbWVtISIpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisKKwkJaWYgKChwID0gX3RhbGxvY196ZXJvKHRhbGxfdmNtZF9jdHgsCisJCQkJICAgICAgc3RybGVuKGN3ZCkgKyBzdHJsZW4oZm5hbWUpICsgMiksCisJCQkJICAgICAgInNldF9sb2dfZmlsZSIpCisJCSAgICA9PSBOVUxMKSB7CisJCQl6bG9nX2VycigiY29uZmlnX2xvZ19maWxlOiBVbmFibGUgdG8gYWxsb2MgbWVtISIpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXNwcmludGYocCwgIiVzLyVzIiwgY3dkLCBmbmFtZSk7CisJCWZ1bGxwYXRoID0gcDsKKwl9IGVsc2UKKwkJZnVsbHBhdGggPSBmbmFtZTsKKworCXJldCA9IHpsb2dfc2V0X2ZpbGUoTlVMTCwgZnVsbHBhdGgsIGxvZ2xldmVsKTsKKworCWlmIChwKQorCQl0YWxsb2NfZnJlZShwKTsKKworCWlmICghcmV0KSB7CisJCXZ0eV9vdXQodnR5LCAiY2FuJ3Qgb3BlbiBsb2dmaWxlICVzXG4iLCBmbmFtZSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoaG9zdC5sb2dmaWxlKQorCQl0YWxsb2NfZnJlZShob3N0LmxvZ2ZpbGUpOworCisJaG9zdC5sb2dmaWxlID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBmbmFtZSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfZmlsZSwKKyAgICAgIGNvbmZpZ19sb2dfZmlsZV9jbWQsCisgICAgICAibG9nIGZpbGUgRklMRU5BTUUiLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIiAiTG9nZ2luZyB0byBmaWxlXG4iICJMb2dnaW5nIGZpbGVuYW1lXG4iKQoreworCXJldHVybiBzZXRfbG9nX2ZpbGUodnR5LCBhcmd2WzBdLCB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKTsKK30KKworREVGVU4oY29uZmlnX2xvZ19maWxlX2xldmVsLAorICAgICAgY29uZmlnX2xvZ19maWxlX2xldmVsX2NtZCwKKyAgICAgICJsb2cgZmlsZSBGSUxFTkFNRSAiIExPR19MRVZFTFMsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiTG9nZ2luZyB0byBmaWxlXG4iICJMb2dnaW5nIGZpbGVuYW1lXG4iIExPR19MRVZFTF9ERVNDKQoreworCWludCBsZXZlbDsKKworCWlmICgobGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzFdKSkgPT0gWkxPR19ESVNBQkxFRCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJcmV0dXJuIHNldF9sb2dfZmlsZSh2dHksIGFyZ3ZbMF0sIGxldmVsKTsKK30KKworREVGVU4obm9fY29uZmlnX2xvZ19maWxlLAorICAgICAgbm9fY29uZmlnX2xvZ19maWxlX2NtZCwKKyAgICAgICJubyBsb2cgZmlsZSBbRklMRU5BTUVdIiwKKyAgICAgIE5PX1NUUgorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIiAiQ2FuY2VsIGxvZ2dpbmcgdG8gZmlsZVxuIiAiTG9nZ2luZyBmaWxlIG5hbWVcbiIpCit7CisJemxvZ19yZXNldF9maWxlKE5VTEwpOworCisJaWYgKGhvc3QubG9nZmlsZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5sb2dmaWxlKTsKKworCWhvc3QubG9nZmlsZSA9IE5VTEw7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0FMSUFTKG5vX2NvbmZpZ19sb2dfZmlsZSwKKyAgICAgIG5vX2NvbmZpZ19sb2dfZmlsZV9sZXZlbF9jbWQsCisgICAgICAibm8gbG9nIGZpbGUgRklMRU5BTUUgTEVWRUwiLAorICAgICAgTk9fU1RSCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiQ2FuY2VsIGxvZ2dpbmcgdG8gZmlsZVxuIiAiTG9nZ2luZyBmaWxlIG5hbWVcbiIgIkxvZ2dpbmcgbGV2ZWxcbiIpCisKKyAgICBERUZVTihjb25maWdfbG9nX3N5c2xvZywKKyAgICAgIGNvbmZpZ19sb2dfc3lzbG9nX2NtZCwKKyAgICAgICJsb2cgc3lzbG9nIiwgIkxvZ2dpbmcgY29udHJvbFxuIiAiU2V0IHN5c2xvZyBsb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TWVNMT0csIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19zeXNsb2dfbGV2ZWwsCisgICAgICBjb25maWdfbG9nX3N5c2xvZ19sZXZlbF9jbWQsCisgICAgICAibG9nIHN5c2xvZyAiIExPR19MRVZFTFMsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iICJTZXQgc3lzbG9nIGxvZ2dpbmcgbGV2ZWxcbiIgTE9HX0xFVkVMX0RFU0MpCit7CisJaW50IGxldmVsOworCisJaWYgKChsZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMF0pKSA9PSBaTE9HX0RJU0FCTEVEKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1lTTE9HLCBsZXZlbCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTl9ERVBSRUNBVEVEKGNvbmZpZ19sb2dfc3lzbG9nX2ZhY2lsaXR5LAorCQkgY29uZmlnX2xvZ19zeXNsb2dfZmFjaWxpdHlfY21kLAorCQkgImxvZyBzeXNsb2cgZmFjaWxpdHkgIiBMT0dfRkFDSUxJVElFUywKKwkJICJMb2dnaW5nIGNvbnRyb2xcbiIKKwkJICJMb2dnaW5nIGdvZXMgdG8gc3lzbG9nXG4iCisJCSAiKERlcHJlY2F0ZWQpIEZhY2lsaXR5IHBhcmFtZXRlciBmb3Igc3lzbG9nIG1lc3NhZ2VzXG4iCisJCSBMT0dfRkFDSUxJVFlfREVTQykKK3sKKwlpbnQgZmFjaWxpdHk7CisKKwlpZiAoKGZhY2lsaXR5ID0gZmFjaWxpdHlfbWF0Y2goYXJndlswXSkpIDwgMCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1lTTE9HLCB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKTsKKwl6bG9nX2RlZmF1bHQtPmZhY2lsaXR5ID0gZmFjaWxpdHk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19jb25maWdfbG9nX3N5c2xvZywKKyAgICAgIG5vX2NvbmZpZ19sb2dfc3lzbG9nX2NtZCwKKyAgICAgICJubyBsb2cgc3lzbG9nIFtMRVZFTF0iLAorICAgICAgTk9fU1RSICJMb2dnaW5nIGNvbnRyb2xcbiIgIkNhbmNlbCBsb2dnaW5nIHRvIHN5c2xvZ1xuIiAiTG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1lTTE9HLCBaTE9HX0RJU0FCTEVEKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0FMSUFTKG5vX2NvbmZpZ19sb2dfc3lzbG9nLAorICAgICAgbm9fY29uZmlnX2xvZ19zeXNsb2dfZmFjaWxpdHlfY21kLAorICAgICAgIm5vIGxvZyBzeXNsb2cgZmFjaWxpdHkgIiBMT0dfRkFDSUxJVElFUywKKyAgICAgIE5PX1NUUgorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkxvZ2dpbmcgZ29lcyB0byBzeXNsb2dcbiIKKyAgICAgICJGYWNpbGl0eSBwYXJhbWV0ZXIgZm9yIHN5c2xvZyBtZXNzYWdlc1xuIiBMT0dfRkFDSUxJVFlfREVTQykKKworICAgIERFRlVOKGNvbmZpZ19sb2dfZmFjaWxpdHksCisgICAgICBjb25maWdfbG9nX2ZhY2lsaXR5X2NtZCwKKyAgICAgICJsb2cgZmFjaWxpdHkgIiBMT0dfRkFDSUxJVElFUywKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJGYWNpbGl0eSBwYXJhbWV0ZXIgZm9yIHN5c2xvZyBtZXNzYWdlc1xuIiBMT0dfRkFDSUxJVFlfREVTQykKK3sKKwlpbnQgZmFjaWxpdHk7CisKKwlpZiAoKGZhY2lsaXR5ID0gZmFjaWxpdHlfbWF0Y2goYXJndlswXSkpIDwgMCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJemxvZ19kZWZhdWx0LT5mYWNpbGl0eSA9IGZhY2lsaXR5OworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fY29uZmlnX2xvZ19mYWNpbGl0eSwKKyAgICAgIG5vX2NvbmZpZ19sb2dfZmFjaWxpdHlfY21kLAorICAgICAgIm5vIGxvZyBmYWNpbGl0eSBbRkFDSUxJVFldIiwKKyAgICAgIE5PX1NUUgorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIlJlc2V0IHN5c2xvZyBmYWNpbGl0eSB0byBkZWZhdWx0IChkYWVtb24pXG4iICJTeXNsb2cgZmFjaWxpdHlcbiIpCit7CisJemxvZ19kZWZhdWx0LT5mYWNpbGl0eSA9IExPR19EQUVNT047CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTl9ERVBSRUNBVEVEKGNvbmZpZ19sb2dfdHJhcCwKKwkJIGNvbmZpZ19sb2dfdHJhcF9jbWQsCisJCSAibG9nIHRyYXAgIiBMT0dfTEVWRUxTLAorCQkgIkxvZ2dpbmcgY29udHJvbFxuIgorCQkgIihEZXByZWNhdGVkKSBTZXQgbG9nZ2luZyBsZXZlbCBhbmQgZGVmYXVsdCBmb3IgYWxsIGRlc3RpbmF0aW9uc1xuIgorCQkgTE9HX0xFVkVMX0RFU0MpCit7CisJaW50IG5ld19sZXZlbDsKKwlpbnQgaTsKKworCWlmICgobmV3X2xldmVsID0gbGV2ZWxfbWF0Y2goYXJndlswXSkpID09IFpMT0dfRElTQUJMRUQpCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCisJemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCA9IG5ld19sZXZlbDsKKwlmb3IgKGkgPSAwOyBpIDwgWkxPR19OVU1fREVTVFM7IGkrKykKKwkJaWYgKHpsb2dfZGVmYXVsdC0+bWF4bHZsW2ldICE9IFpMT0dfRElTQUJMRUQpCisJCQl6bG9nX2RlZmF1bHQtPm1heGx2bFtpXSA9IG5ld19sZXZlbDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOX0RFUFJFQ0FURUQobm9fY29uZmlnX2xvZ190cmFwLAorCQkgbm9fY29uZmlnX2xvZ190cmFwX2NtZCwKKwkJICJubyBsb2cgdHJhcCBbTEVWRUxdIiwKKwkJIE5PX1NUUgorCQkgIkxvZ2dpbmcgY29udHJvbFxuIgorCQkgIlBlcm1pdCBhbGwgbG9nZ2luZyBpbmZvcm1hdGlvblxuIiAiTG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsID0gTE9HX0RFQlVHOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19yZWNvcmRfcHJpb3JpdHksCisgICAgICBjb25maWdfbG9nX3JlY29yZF9wcmlvcml0eV9jbWQsCisgICAgICAibG9nIHJlY29yZC1wcmlvcml0eSIsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiTG9nIHRoZSBwcmlvcml0eSBvZiB0aGUgbWVzc2FnZSB3aXRoaW4gdGhlIG1lc3NhZ2VcbiIpCit7CisJemxvZ19kZWZhdWx0LT5yZWNvcmRfcHJpb3JpdHkgPSAxOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fY29uZmlnX2xvZ19yZWNvcmRfcHJpb3JpdHksCisgICAgICBub19jb25maWdfbG9nX3JlY29yZF9wcmlvcml0eV9jbWQsCisgICAgICAibm8gbG9nIHJlY29yZC1wcmlvcml0eSIsCisgICAgICBOT19TVFIKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJEbyBub3QgbG9nIHRoZSBwcmlvcml0eSBvZiB0aGUgbWVzc2FnZSB3aXRoaW4gdGhlIG1lc3NhZ2VcbiIpCit7CisJemxvZ19kZWZhdWx0LT5yZWNvcmRfcHJpb3JpdHkgPSAwOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKyNlbmRpZgorCitERUZVTihiYW5uZXJfbW90ZF9maWxlLAorICAgICAgYmFubmVyX21vdGRfZmlsZV9jbWQsCisgICAgICAiYmFubmVyIG1vdGQgZmlsZSBbRklMRV0iLAorICAgICAgIlNldCBiYW5uZXJcbiIgIkJhbm5lciBmb3IgbW90ZFxuIiAiQmFubmVyIGZyb20gYSBmaWxlXG4iICJGaWxlbmFtZVxuIikKK3sKKwlpZiAoaG9zdC5tb3RkZmlsZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5tb3RkZmlsZSk7CisJaG9zdC5tb3RkZmlsZSA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGJhbm5lcl9tb3RkX2RlZmF1bHQsCisgICAgICBiYW5uZXJfbW90ZF9kZWZhdWx0X2NtZCwKKyAgICAgICJiYW5uZXIgbW90ZCBkZWZhdWx0IiwKKyAgICAgICJTZXQgYmFubmVyIHN0cmluZ1xuIiAiU3RyaW5ncyBmb3IgbW90ZFxuIiAiRGVmYXVsdCBzdHJpbmdcbiIpCit7CisJaG9zdC5tb3RkID0gZGVmYXVsdF9tb3RkOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fYmFubmVyX21vdGQsCisgICAgICBub19iYW5uZXJfbW90ZF9jbWQsCisgICAgICAibm8gYmFubmVyIG1vdGQiLCBOT19TVFIgIlNldCBiYW5uZXIgc3RyaW5nXG4iICJTdHJpbmdzIGZvciBtb3RkXG4iKQoreworCWhvc3QubW90ZCA9IE5VTEw7CisJaWYgKGhvc3QubW90ZGZpbGUpCisJCXRhbGxvY19mcmVlKGhvc3QubW90ZGZpbGUpOworCWhvc3QubW90ZGZpbGUgPSBOVUxMOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogU2V0IGNvbmZpZyBmaWxlbmFtZS4gIENhbGxlZCBmcm9tIHZ0eS5jICovCit2b2lkIGhvc3RfY29uZmlnX3NldChjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlob3N0LmNvbmZpZyA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgZmlsZW5hbWUpOworfQorCit2b2lkIGluc3RhbGxfZGVmYXVsdChlbnVtIG5vZGVfdHlwZSBub2RlKQoreworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX2V4aXRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ19xdWl0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfZW5kX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfaGVscF9jbWQpOworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX2xpc3RfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX3dyaXRlX3Rlcm1pbmFsX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfd3JpdGVfZmlsZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX3dyaXRlX21lbW9yeV9jbWQpOworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX3dyaXRlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZzaG93X3J1bm5pbmdfY29uZmlnX2NtZCk7Cit9CisKKy8qIEluaXRpYWxpemUgY29tbWFuZCBpbnRlcmZhY2UuIEluc3RhbGwgYmFzaWMgbm9kZXMgYW5kIGNvbW1hbmRzLiAqLwordm9pZCBjbWRfaW5pdChpbnQgdGVybWluYWwpCit7CisJLyogQWxsb2NhdGUgaW5pdGlhbCB0b3AgdmVjdG9yIG9mIGNvbW1hbmRzLiAqLworCWNtZHZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7CisKKwkvKiBEZWZhdWx0IGhvc3QgdmFsdWUgc2V0dGluZ3MuICovCisJaG9zdC5uYW1lID0gTlVMTDsKKwlob3N0LnBhc3N3b3JkID0gTlVMTDsKKwlob3N0LmVuYWJsZSA9IE5VTEw7CisJaG9zdC5sb2dmaWxlID0gTlVMTDsKKwlob3N0LmNvbmZpZyA9IE5VTEw7CisJaG9zdC5saW5lcyA9IC0xOworCWhvc3QubW90ZCA9IGRlZmF1bHRfbW90ZDsKKwlob3N0Lm1vdGRmaWxlID0gTlVMTDsKKworCS8qIEluc3RhbGwgdG9wIG5vZGVzLiAqLworCWluc3RhbGxfbm9kZSgmdmlld19ub2RlLCBOVUxMKTsKKwlpbnN0YWxsX25vZGUoJmVuYWJsZV9ub2RlLCBOVUxMKTsKKwlpbnN0YWxsX25vZGUoJmF1dGhfbm9kZSwgTlVMTCk7CisJaW5zdGFsbF9ub2RlKCZhdXRoX2VuYWJsZV9ub2RlLCBOVUxMKTsKKwlpbnN0YWxsX25vZGUoJmNvbmZpZ19ub2RlLCBjb25maWdfd3JpdGVfaG9zdCk7CisKKwkvKiBFYWNoIG5vZGUncyBiYXNpYyBjb21tYW5kcy4gKi8KKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd192ZXJzaW9uX2NtZCk7CisJaWYgKHRlcm1pbmFsKSB7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfbGlzdF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX2V4aXRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ19xdWl0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfaGVscF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX2VuYWJsZV9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX3Rlcm1pbmFsX2xlbmd0aF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX3Rlcm1pbmFsX25vX2xlbmd0aF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmZWNob19jbWQpOworCX0KKworCWlmICh0ZXJtaW5hbCkgeworCQlpbnN0YWxsX2RlZmF1bHQoRU5BQkxFX05PREUpOworCQlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZjb25maWdfZGlzYWJsZV9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZjb25maWdfdGVybWluYWxfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50IChFTkFCTEVfTk9ERSwgJmNvcHlfcnVubmluZ2NvbmZpZ19zdGFydHVwY29uZmlnX2NtZCk7CisJfQorCWluc3RhbGxfZWxlbWVudCAoRU5BQkxFX05PREUsICZzaG93X3N0YXJ0dXBfY29uZmlnX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmc2hvd192ZXJzaW9uX2NtZCk7CisKKwlpZiAodGVybWluYWwpIHsKKwkJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmY29uZmlnX3Rlcm1pbmFsX2xlbmd0aF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZjb25maWdfdGVybWluYWxfbm9fbGVuZ3RoX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmVjaG9fY21kKTsKKworCQlpbnN0YWxsX2RlZmF1bHQoQ09ORklHX05PREUpOworCX0KKworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmhvc3RuYW1lX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9faG9zdG5hbWVfY21kKTsKKworCWlmICh0ZXJtaW5hbCkgeworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZwYXNzd29yZF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZwYXNzd29yZF90ZXh0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmVuYWJsZV9wYXNzd29yZF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZlbmFibGVfcGFzc3dvcmRfdGV4dF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19lbmFibGVfcGFzc3dvcmRfY21kKTsKKworI2lmZGVmIFZUWV9DUllQVF9QVworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZzZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9fc2VydmljZV9wYXNzd29yZF9lbmNyeXB0X2NtZCk7CisjZW5kaWYKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmYmFubmVyX21vdGRfZGVmYXVsdF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZiYW5uZXJfbW90ZF9maWxlX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJm5vX2Jhbm5lcl9tb3RkX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnNlcnZpY2VfdGVybWluYWxfbGVuZ3RoX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJm5vX3NlcnZpY2VfdGVybWluYWxfbGVuZ3RoX2NtZCk7CisKKwl9CisJc3JhbmQodGltZShOVUxMKSk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHkvdmVjdG9yLmMgYi9vcGVuYnNjL3NyYy92dHkvdmVjdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI0N2FlNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eS92ZWN0b3IuYwpAQCAtMCwwICsxLDE5MiBAQAorLyogR2VuZXJpYyB2ZWN0b3IgaW50ZXJmYWNlIHJvdXRpbmUKKyAqIENvcHlyaWdodCAoQykgMTk5NyBLdW5paGlybyBJc2hpZ3VybworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKyAqCisgKiBHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICogMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHZ0eS92ZWN0b3IuaD4KKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisKK3ZvaWQgKnRhbGxfdnR5X3ZlY19jdHg7CisKKy8qIEluaXRpYWxpemUgdmVjdG9yIDogYWxsb2NhdGUgbWVtb3J5IGFuZCByZXR1cm4gdmVjdG9yLiAqLwordmVjdG9yIHZlY3Rvcl9pbml0KHVuc2lnbmVkIGludCBzaXplKQoreworCXZlY3RvciB2ID0gdGFsbG9jX3plcm8odGFsbF92dHlfdmVjX2N0eCwgc3RydWN0IF92ZWN0b3IpOworCWlmICghdikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBhbGxvY2F0ZSBhdCBsZWFzdCBvbmUgc2xvdCAqLworCWlmIChzaXplID09IDApCisJCXNpemUgPSAxOworCisJdi0+YWxsb2NlZCA9IHNpemU7CisJdi0+YWN0aXZlID0gMDsKKwl2LT5pbmRleCA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV92ZWNfY3R4LCBzaXplb2Yodm9pZCAqKSAqIHNpemUsCisJCQkJInZlY3Rvcl9pbml0OmluZGV4Iik7CisJaWYgKCF2LT5pbmRleCkgeworCQl0YWxsb2NfZnJlZSh2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiB2OworfQorCit2b2lkIHZlY3Rvcl9vbmx5X3dyYXBwZXJfZnJlZSh2ZWN0b3IgdikKK3sKKwl0YWxsb2NfZnJlZSh2KTsKK30KKwordm9pZCB2ZWN0b3Jfb25seV9pbmRleF9mcmVlKHZvaWQgKmluZGV4KQoreworCXRhbGxvY19mcmVlKGluZGV4KTsKK30KKwordm9pZCB2ZWN0b3JfZnJlZSh2ZWN0b3IgdikKK3sKKwl0YWxsb2NfZnJlZSh2LT5pbmRleCk7CisJdGFsbG9jX2ZyZWUodik7Cit9CisKK3ZlY3RvciB2ZWN0b3JfY29weSh2ZWN0b3IgdikKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl2ZWN0b3IgbmV3ID0gdGFsbG9jX3plcm8odGFsbF92dHlfdmVjX2N0eCwgc3RydWN0IF92ZWN0b3IpOworCWlmICghbmV3KQorCQlyZXR1cm4gTlVMTDsKKworCW5ldy0+YWN0aXZlID0gdi0+YWN0aXZlOworCW5ldy0+YWxsb2NlZCA9IHYtPmFsbG9jZWQ7CisKKwlzaXplID0gc2l6ZW9mKHZvaWQgKikgKiAodi0+YWxsb2NlZCk7CisJbmV3LT5pbmRleCA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV92ZWNfY3R4LCBzaXplLCAidmVjdG9yX2NvcHk6aW5kZXgiKTsKKwlpZiAoIW5ldy0+aW5kZXgpIHsKKwkJdGFsbG9jX2ZyZWUobmV3KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1lbWNweShuZXctPmluZGV4LCB2LT5pbmRleCwgc2l6ZSk7CisKKwlyZXR1cm4gbmV3OworfQorCisvKiBDaGVjayBhc3NpZ25lZCBpbmRleCwgYW5kIGlmIGl0IHJ1bnMgc2hvcnQgZG91YmxlIGluZGV4IHBvaW50ZXIgKi8KK3ZvaWQgdmVjdG9yX2Vuc3VyZSh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IG51bSkKK3sKKwlpZiAodi0+YWxsb2NlZCA+IG51bSkKKwkJcmV0dXJuOworCisJdi0+aW5kZXggPSB0YWxsb2NfcmVhbGxvY19zaXplKHRhbGxfdnR5X3ZlY19jdHgsIHYtPmluZGV4LAorCQkJCSAgICAgICBzaXplb2Yodm9pZCAqKSAqICh2LT5hbGxvY2VkICogMikpOworCW1lbXNldCgmdi0+aW5kZXhbdi0+YWxsb2NlZF0sIDAsIHNpemVvZih2b2lkICopICogdi0+YWxsb2NlZCk7CisJdi0+YWxsb2NlZCAqPSAyOworCisJaWYgKHYtPmFsbG9jZWQgPD0gbnVtKQorCQl2ZWN0b3JfZW5zdXJlKHYsIG51bSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gb25seSByZXR1cm5zIG5leHQgZW1wdHkgc2xvdCBpbmRleC4gIEl0IGRvc2Ugbm90IG1lYW4KKyAgIHRoZSBzbG90J3MgaW5kZXggbWVtb3J5IGlzIGFzc2lnbmVkLCBwbGVhc2UgY2FsbCB2ZWN0b3JfZW5zdXJlKCkKKyAgIGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gKi8KK2ludCB2ZWN0b3JfZW1wdHlfc2xvdCh2ZWN0b3IgdikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICh2LT5hY3RpdmUgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdi0+YWN0aXZlOyBpKyspCisJCWlmICh2LT5pbmRleFtpXSA9PSAwKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gaTsKK30KKworLyogU2V0IHZhbHVlIHRvIHRoZSBzbWFsbGVzdCBlbXB0eSBzbG90LiAqLworaW50IHZlY3Rvcl9zZXQodmVjdG9yIHYsIHZvaWQgKnZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWkgPSB2ZWN0b3JfZW1wdHlfc2xvdCh2KTsKKwl2ZWN0b3JfZW5zdXJlKHYsIGkpOworCisJdi0+aW5kZXhbaV0gPSB2YWw7CisKKwlpZiAodi0+YWN0aXZlIDw9IGkpCisJCXYtPmFjdGl2ZSA9IGkgKyAxOworCisJcmV0dXJuIGk7Cit9CisKKy8qIFNldCB2YWx1ZSB0byBzcGVjaWZpZWQgaW5kZXggc2xvdC4gKi8KK2ludCB2ZWN0b3Jfc2V0X2luZGV4KHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSwgdm9pZCAqdmFsKQoreworCXZlY3Rvcl9lbnN1cmUodiwgaSk7CisKKwl2LT5pbmRleFtpXSA9IHZhbDsKKworCWlmICh2LT5hY3RpdmUgPD0gaSkKKwkJdi0+YWN0aXZlID0gaSArIDE7CisKKwlyZXR1cm4gaTsKK30KKworLyogTG9vayB1cCB2ZWN0b3IuICAqLwordm9pZCAqdmVjdG9yX2xvb2t1cCh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IGkpCit7CisJaWYgKGkgPj0gdi0+YWN0aXZlKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gdi0+aW5kZXhbaV07Cit9CisKKy8qIExvb2t1cCB2ZWN0b3IsIGVuc3VyZSBpdC4gKi8KK3ZvaWQgKnZlY3Rvcl9sb29rdXBfZW5zdXJlKHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSkKK3sKKwl2ZWN0b3JfZW5zdXJlKHYsIGkpOworCXJldHVybiB2LT5pbmRleFtpXTsKK30KKworLyogVW5zZXQgdmFsdWUgYXQgc3BlY2lmaWVkIGluZGV4IHNsb3QuICovCit2b2lkIHZlY3Rvcl91bnNldCh2ZWN0b3IgdiwgdW5zaWduZWQgaW50IGkpCit7CisJaWYgKGkgPj0gdi0+YWxsb2NlZCkKKwkJcmV0dXJuOworCisJdi0+aW5kZXhbaV0gPSBOVUxMOworCisJaWYgKGkgKyAxID09IHYtPmFjdGl2ZSkgeworCQl2LT5hY3RpdmUtLTsKKwkJd2hpbGUgKGkgJiYgdi0+aW5kZXhbLS1pXSA9PSBOVUxMICYmIHYtPmFjdGl2ZS0tKSA7CS8qIElzIHRoaXMgdWdseSA/ICovCisJfQorfQorCisvKiBDb3VudCB0aGUgbnVtYmVyIG9mIG5vdCBlbXBsdHkgc2xvdC4gKi8KK3Vuc2lnbmVkIGludCB2ZWN0b3JfY291bnQodmVjdG9yIHYpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgY291bnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHYtPmFjdGl2ZTsgaSsrKQorCQlpZiAodi0+aW5kZXhbaV0gIT0gTlVMTCkKKwkJCWNvdW50Kys7CisKKwlyZXR1cm4gY291bnQ7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHkvdnR5LmMgYi9vcGVuYnNjL3NyYy92dHkvdnR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2MGYzOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eS92dHkuYwpAQCAtMCwwICsxLDE2NzggQEAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNpbmNsdWRlIDxhcnBhL3RlbG5ldC5oPgorCisjaW5jbHVkZSAiY2FyZHNoZWxsLmgiCisjaW5jbHVkZSA8dnR5L3Z0eS5oPgorI2luY2x1ZGUgPHZ0eS9jb21tYW5kLmg+CisjaW5jbHVkZSA8dnR5L2J1ZmZlci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCisvKiBvdXIgY2FsbGJhY2ssIGxvY2F0ZWQgaW4gdGVsbmV0X2ludGVyZmFjZS5jICovCit2b2lkIHZ0eV9ldmVudChlbnVtIGV2ZW50IGV2ZW50LCBpbnQgc29jaywgc3RydWN0IHZ0eSAqdnR5KTsKKworZXh0ZXJuIHN0cnVjdCBob3N0IGhvc3Q7CisKKy8qIFZlY3RvciB3aGljaCBzdG9yZSBlYWNoIHZ0eSBzdHJ1Y3R1cmUuICovCitzdGF0aWMgdmVjdG9yIHZ0eXZlYzsKKwordmVjdG9yIFZ2dHlfc2Vydl90aHJlYWQ7CisKK2NoYXIgKnZ0eV9jd2QgPSBOVUxMOworCisvKiBDb25maWd1cmUgbG9jay4gKi8KK3N0YXRpYyBpbnQgdnR5X2NvbmZpZzsKKworc3RhdGljIGludCBub19wYXNzd29yZF9jaGVjayA9IDE7CisKK3ZvaWQgKnRhbGxfdnR5X2N0eDsKKworc3RhdGljIHZvaWQgdnR5X2NsZWFyX2J1ZihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJbWVtc2V0KHZ0eS0+YnVmLCAwLCB2dHktPm1heCk7Cit9CisKKy8qIEFsbG9jYXRlIG5ldyB2dHkgc3RydWN0LiAqLworc3RydWN0IHZ0eSAqdnR5X25ldygpCit7CisJc3RydWN0IHZ0eSAqbmV3ID0gdGFsbG9jX3plcm8odGFsbF92dHlfY3R4LCBzdHJ1Y3QgdnR5KTsKKworCWlmICghbmV3KQorCQlnb3RvIG91dDsKKworCW5ldy0+b2J1ZiA9IGJ1ZmZlcl9uZXcoMCk7CS8qIFVzZSBkZWZhdWx0IGJ1ZmZlciBzaXplLiAqLworCWlmICghbmV3LT5vYnVmKQorCQlnb3RvIG91dF9uZXc7CisJbmV3LT5idWYgPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY3R4LCBWVFlfQlVGU0laLCAidnR5X25ldy0+YnVmIik7CisJaWYgKCFuZXctPmJ1ZikKKwkJZ290byBvdXRfb2J1ZjsKKworCW5ldy0+bWF4ID0gVlRZX0JVRlNJWjsKKworCXJldHVybiBuZXc7CisKK291dF9vYnVmOgorCWJ1ZmZlcl9mcmVlKG5ldy0+b2J1Zik7CitvdXRfbmV3OgorCXRhbGxvY19mcmVlKG5ldyk7CisJbmV3ID0gTlVMTDsKK291dDoKKwlyZXR1cm4gbmV3OworfQorCisvKiBBdXRoZW50aWNhdGlvbiBvZiB2dHkgKi8KK3N0YXRpYyB2b2lkIHZ0eV9hdXRoKHN0cnVjdCB2dHkgKnZ0eSwgY2hhciAqYnVmKQoreworCWNoYXIgKnBhc3N3ZCA9IE5VTEw7CisJZW51bSBub2RlX3R5cGUgbmV4dF9ub2RlID0gMDsKKwlpbnQgZmFpbDsKKwljaGFyICpjcnlwdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgQVVUSF9OT0RFOgorI2lmZGVmIFZUWV9DUllQVF9QVworCQlpZiAoaG9zdC5lbmNyeXB0KQorCQkJcGFzc3dkID0gaG9zdC5wYXNzd29yZF9lbmNyeXB0OworCQllbHNlCisjZW5kaWYKKwkJCXBhc3N3ZCA9IGhvc3QucGFzc3dvcmQ7CisJCWlmIChob3N0LmFkdmFuY2VkKQorCQkJbmV4dF9ub2RlID0gaG9zdC5lbmFibGUgPyBWSUVXX05PREUgOiBFTkFCTEVfTk9ERTsKKwkJZWxzZQorCQkJbmV4dF9ub2RlID0gVklFV19OT0RFOworCQlicmVhazsKKwljYXNlIEFVVEhfRU5BQkxFX05PREU6CisjaWZkZWYgVlRZX0NSWVBUX1BXCisJCWlmIChob3N0LmVuY3J5cHQpCisJCQlwYXNzd2QgPSBob3N0LmVuYWJsZV9lbmNyeXB0OworCQllbHNlCisjZW5kaWYKKwkJCXBhc3N3ZCA9IGhvc3QuZW5hYmxlOworCQluZXh0X25vZGUgPSBFTkFCTEVfTk9ERTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHBhc3N3ZCkgeworI2lmZGVmIFZUWV9DUllQVF9QVworCQlpZiAoaG9zdC5lbmNyeXB0KQorCQkJZmFpbCA9IHN0cmNtcChjcnlwdChidWYsIHBhc3N3ZCksIHBhc3N3ZCk7CisJCWVsc2UKKyNlbmRpZgorCQkJZmFpbCA9IHN0cmNtcChidWYsIHBhc3N3ZCk7CisJfSBlbHNlCisJCWZhaWwgPSAxOworCisJaWYgKCFmYWlsKSB7CisJCXZ0eS0+ZmFpbCA9IDA7CisJCXZ0eS0+bm9kZSA9IG5leHRfbm9kZTsJLyogU3VjY2VzcyAhICovCisJfSBlbHNlIHsKKwkJdnR5LT5mYWlsKys7CisJCWlmICh2dHktPmZhaWwgPj0gMykgeworCQkJaWYgKHZ0eS0+bm9kZSA9PSBBVVRIX05PREUpIHsKKwkJCQl2dHlfb3V0KHZ0eSwKKwkJCQkJIiUlIEJhZCBwYXNzd29yZHMsIHRvbyBtYW55IGZhaWx1cmVzISVzIiwKKwkJCQkJVlRZX05FV0xJTkUpOworCQkJCXZ0eS0+c3RhdHVzID0gVlRZX0NMT1NFOworCQkJfSBlbHNlIHsKKwkJCQkvKiBBVVRIX0VOQUJMRV9OT0RFICovCisJCQkJdnR5LT5mYWlsID0gMDsKKwkJCQl2dHlfb3V0KHZ0eSwKKwkJCQkJIiUlIEJhZCBlbmFibGUgcGFzc3dvcmRzLCB0b28gbWFueSBmYWlsdXJlcyElcyIsCisJCQkJCVZUWV9ORVdMSU5FKTsKKwkJCQl2dHktPm5vZGUgPSBWSUVXX05PREU7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIENsb3NlIHZ0eSBpbnRlcmZhY2UuICovCit2b2lkIHZ0eV9jbG9zZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGk7CisKKwlpZiAodnR5LT5vYnVmKSAgeworCQkvKiBGbHVzaCBidWZmZXIuICovCisJCWJ1ZmZlcl9mbHVzaF9hbGwodnR5LT5vYnVmLCB2dHktPmZkKTsKKworCQkvKiBGcmVlIGlucHV0IGJ1ZmZlci4gKi8KKwkJYnVmZmVyX2ZyZWUodnR5LT5vYnVmKTsKKwkJdnR5LT5vYnVmID0gTlVMTDsKKwl9CisKKwkvKiBGcmVlIGNvbW1hbmQgaGlzdG9yeS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgVlRZX01BWEhJU1Q7IGkrKykKKwkJaWYgKHZ0eS0+aGlzdFtpXSkKKwkJCXRhbGxvY19mcmVlKHZ0eS0+aGlzdFtpXSk7CisKKwkvKiBVbnNldCB2ZWN0b3IuICovCisJdmVjdG9yX3Vuc2V0KHZ0eXZlYywgdnR5LT5mZCk7CisKKwkvKiBDbG9zZSBzb2NrZXQuICovCisJaWYgKHZ0eS0+ZmQgPiAwKQorCQljbG9zZSh2dHktPmZkKTsKKworCWlmICh2dHktPmJ1ZikgeworCQl0YWxsb2NfZnJlZSh2dHktPmJ1Zik7CisJCXZ0eS0+YnVmID0gTlVMTDsKKwl9CisKKwkvKiBDaGVjayBjb25maWd1cmUuICovCisJdnR5X2NvbmZpZ191bmxvY2sodnR5KTsKKworCS8qIEZJWE1FOiBtZW1vcnkgbGVhay4gV2UgbmVlZCB0byBjYWxsIHRlbG5ldF9jbG9zZV9jbGllbnQoKSBidXQgZG9uJ3QKKwkgKiBoYXZlIGJmZCAqLworCXZ0eV9ldmVudChWVFlfQ0xPU0VELCB2dHktPmZkLCB2dHkpOworCisJLyogT0sgZnJlZSB2dHkuICovCisJdGFsbG9jX2ZyZWUodnR5KTsKK30KKworaW50IHZ0eV9zaGVsbChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJcmV0dXJuIHZ0eS0+dHlwZSA9PSBWVFlfU0hFTEwgPyAxIDogMDsKK30KKworCisvKiBWVFkgc3RhbmRhcmQgb3V0cHV0IGZ1bmN0aW9uLiAqLworaW50IHZ0eV9vdXQoc3RydWN0IHZ0eSAqdnR5LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IGxlbiA9IDA7CisJaW50IHNpemUgPSAxMDI0OworCWNoYXIgYnVmWzEwMjRdOworCWNoYXIgKnAgPSBOVUxMOworCisJaWYgKHZ0eV9zaGVsbCh2dHkpKSB7CisJCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJCXZwcmludGYoZm9ybWF0LCBhcmdzKTsKKwkJdmFfZW5kKGFyZ3MpOworCX0gZWxzZSB7CisJCS8qIFRyeSB0byB3cml0ZSB0byBpbml0aWFsIGJ1ZmZlci4gICovCisJCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJCWxlbiA9IHZzbnByaW50ZihidWYsIHNpemVvZiBidWYsIGZvcm1hdCwgYXJncyk7CisJCXZhX2VuZChhcmdzKTsKKworCQkvKiBJbml0aWFsIGJ1ZmZlciBpcyBub3QgZW5vdWdoLiAgKi8KKwkJaWYgKGxlbiA8IDAgfHwgbGVuID49IHNpemUpIHsKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKGxlbiA+IC0xKQorCQkJCQlzaXplID0gbGVuICsgMTsKKwkJCQllbHNlCisJCQkJCXNpemUgPSBzaXplICogMjsKKworCQkJCXAgPSB0YWxsb2NfcmVhbGxvY19zaXplKHRhbGxfdnR5X2N0eCwgcCwgc2l6ZSk7CisJCQkJaWYgKCFwKQorCQkJCQlyZXR1cm4gLTE7CisKKwkJCQl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCQkJCWxlbiA9IHZzbnByaW50ZihwLCBzaXplLCBmb3JtYXQsIGFyZ3MpOworCQkJCXZhX2VuZChhcmdzKTsKKworCQkJCWlmIChsZW4gPiAtMSAmJiBsZW4gPCBzaXplKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIFdoZW4gaW5pdGlhbCBidWZmZXIgaXMgZW5vdWdoIHRvIHN0b3JlIGFsbCBvdXRwdXQuICAqLworCQlpZiAoIXApCisJCQlwID0gYnVmOworCisJCS8qIFBvaW50ZXIgcCBtdXN0IHBvaW50IG91dCBidWZmZXIuICovCisJCWJ1ZmZlcl9wdXQodnR5LT5vYnVmLCAodV9jaGFyICopIHAsIGxlbik7CisKKwkJLyogSWYgcCBpcyBub3QgZGlmZmVyZW50IHdpdGggYnVmLCBpdCBpcyBhbGxvY2F0ZWQgYnVmZmVyLiAgKi8KKwkJaWYgKHAgIT0gYnVmKQorCQkJdGFsbG9jX2ZyZWUocCk7CisJfQorCisJdnR5X2V2ZW50KFZUWV9XUklURSwgdnR5LT5mZCwgdnR5KTsKKworCXJldHVybiBsZW47Cit9CisKK2ludCB2dHlfb3V0X25ld2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCWNoYXIgKnAgPSB2dHlfbmV3bGluZSh2dHkpOworCWJ1ZmZlcl9wdXQodnR5LT5vYnVmLCBwLCBzdHJsZW4ocCkpOworCXJldHVybiAwOworfQorCitpbnQgdnR5X2NvbmZpZ19sb2NrKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAodnR5X2NvbmZpZyA9PSAwKSB7CisJCXZ0eS0+Y29uZmlnID0gMTsKKwkJdnR5X2NvbmZpZyA9IDE7CisJfQorCXJldHVybiB2dHktPmNvbmZpZzsKK30KKworaW50IHZ0eV9jb25maWdfdW5sb2NrKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAodnR5X2NvbmZpZyA9PSAxICYmIHZ0eS0+Y29uZmlnID09IDEpIHsKKwkJdnR5LT5jb25maWcgPSAwOworCQl2dHlfY29uZmlnID0gMDsKKwl9CisJcmV0dXJuIHZ0eS0+Y29uZmlnOworfQorCisvKiBTYXkgaGVsbG8gdG8gdnR5IGludGVyZmFjZS4gKi8KK3ZvaWQgdnR5X2hlbGxvKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAoaG9zdC5tb3RkZmlsZSkgeworCQlGSUxFICpmOworCQljaGFyIGJ1Zls0MDk2XTsKKworCQlmID0gZm9wZW4oaG9zdC5tb3RkZmlsZSwgInIiKTsKKwkJaWYgKGYpIHsKKwkJCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSkgeworCQkJCWNoYXIgKnM7CisJCQkJLyogd29yayBiYWNrd2FyZHMgdG8gaWdub3JlIHRyYWlsbGluZyBpc3NwYWNlKCkgKi8KKwkJCQlmb3IgKHMgPSBidWYgKyBzdHJsZW4oYnVmKTsKKwkJCQkgICAgIChzID4gYnVmKSAmJiBpc3NwYWNlKCoocyAtIDEpKTsgcy0tKSA7CisJCQkJKnMgPSAnXDAnOworCQkJCXZ0eV9vdXQodnR5LCAiJXMlcyIsIGJ1ZiwgVlRZX05FV0xJTkUpOworCQkJfQorCQkJZmNsb3NlKGYpOworCQl9IGVsc2UKKwkJCXZ0eV9vdXQodnR5LCAiTU9URCBmaWxlIG5vdCBmb3VuZCVzIiwgVlRZX05FV0xJTkUpOworCX0gZWxzZSBpZiAoaG9zdC5tb3RkKQorCQl2dHlfb3V0KHZ0eSwgIiVzIiwgaG9zdC5tb3RkKTsKK30KKworLyogUHV0IG91dCBwcm9tcHQgYW5kIHdhaXQgaW5wdXQgZnJvbSB1c2VyLiAqLworc3RhdGljIHZvaWQgdnR5X3Byb21wdChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJc3RydWN0IHV0c25hbWUgbmFtZXM7CisJY29uc3QgY2hhciAqaG9zdG5hbWU7CisKKwlpZiAodnR5LT50eXBlID09IFZUWV9URVJNKSB7CisJCWhvc3RuYW1lID0gaG9zdC5uYW1lOworCQlpZiAoIWhvc3RuYW1lKSB7CisJCQl1bmFtZSgmbmFtZXMpOworCQkJaG9zdG5hbWUgPSBuYW1lcy5ub2RlbmFtZTsKKwkJfQorCQl2dHlfb3V0KHZ0eSwgY21kX3Byb21wdCh2dHktPm5vZGUpLCBob3N0bmFtZSk7CisJfQorfQorCisvKiBDb21tYW5kIGV4ZWN1dGlvbiBvdmVyIHRoZSB2dHkgaW50ZXJmYWNlLiAqLworc3RhdGljIGludCB2dHlfY29tbWFuZChzdHJ1Y3QgdnR5ICp2dHksIGNoYXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCXZlY3RvciB2bGluZTsKKworCS8qIFNwbGl0IHJlYWRsaW5lIHN0cmluZyB1cCBpbnRvIHRoZSB2ZWN0b3IgKi8KKwl2bGluZSA9IGNtZF9tYWtlX3N0cnZlYyhidWYpOworCisJaWYgKHZsaW5lID09IE5VTEwpCisJCXJldHVybiBDTURfU1VDQ0VTUzsKKworCXJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmQodmxpbmUsIHZ0eSwgTlVMTCwgMCk7CisJaWYgKHJldCAhPSBDTURfU1VDQ0VTUykKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSBDTURfV0FSTklORzoKKwkJCWlmICh2dHktPnR5cGUgPT0gVlRZX0ZJTEUpCisJCQkJdnR5X291dCh2dHksICJXYXJuaW5nLi4uJXMiLCBWVFlfTkVXTElORSk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfRVJSX0FNQklHVU9VUzoKKwkJCXZ0eV9vdXQodnR5LCAiJSUgQW1iaWd1b3VzIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfRVJSX05PX01BVENIOgorCQkJdnR5X291dCh2dHksICIlJSBVbmtub3duIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfRVJSX0lOQ09NUExFVEU6CisJCQl2dHlfb3V0KHZ0eSwgIiUlIENvbW1hbmQgaW5jb21wbGV0ZS4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJCWJyZWFrOworCQl9CisJY21kX2ZyZWVfc3RydmVjKHZsaW5lKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHRlbG5ldF9iYWNrd2FyZF9jaGFyID0gMHgwODsKK3N0YXRpYyBjb25zdCBjaGFyIHRlbG5ldF9zcGFjZV9jaGFyID0gJyAnOworCisvKiBCYXNpYyBmdW5jdGlvbiB0byB3cml0ZSBidWZmZXIgdG8gdnR5LiAqLworc3RhdGljIHZvaWQgdnR5X3dyaXRlKHN0cnVjdCB2dHkgKnZ0eSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbmJ5dGVzKQoreworCWlmICgodnR5LT5ub2RlID09IEFVVEhfTk9ERSkgfHwgKHZ0eS0+bm9kZSA9PSBBVVRIX0VOQUJMRV9OT0RFKSkKKwkJcmV0dXJuOworCisJLyogU2hvdWxkIHdlIGRvIGJ1ZmZlcmluZyBoZXJlID8gIEFuZCBtYWtlIHZ0eV9mbHVzaCAodnR5KSA/ICovCisJYnVmZmVyX3B1dCh2dHktPm9idWYsIGJ1ZiwgbmJ5dGVzKTsKK30KKworLyogRW5zdXJlIGxlbmd0aCBvZiBpbnB1dCBidWZmZXIuICBJcyBidWZmZXIgaXMgc2hvcnQsIGRvdWJsZSBpdC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9lbnN1cmUoc3RydWN0IHZ0eSAqdnR5LCBpbnQgbGVuZ3RoKQoreworCWlmICh2dHktPm1heCA8PSBsZW5ndGgpIHsKKwkJdnR5LT5tYXggKj0gMjsKKwkJdnR5LT5idWYgPSB0YWxsb2NfcmVhbGxvY19zaXplKHRhbGxfdnR5X2N0eCwgdnR5LT5idWYsIHZ0eS0+bWF4KTsKKwkJLy8gRklYTUU6IGNoZWNrIHJldHVybgorCX0KK30KKworLyogQmFzaWMgZnVuY3Rpb24gdG8gaW5zZXJ0IGNoYXJhY3RlciBpbnRvIHZ0eS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9zZWxmX2luc2VydChzdHJ1Y3QgdnR5ICp2dHksIGNoYXIgYykKK3sKKwlpbnQgaTsKKwlpbnQgbGVuZ3RoOworCisJdnR5X2Vuc3VyZSh2dHksIHZ0eS0+bGVuZ3RoICsgMSk7CisJbGVuZ3RoID0gdnR5LT5sZW5ndGggLSB2dHktPmNwOworCW1lbW1vdmUoJnZ0eS0+YnVmW3Z0eS0+Y3AgKyAxXSwgJnZ0eS0+YnVmW3Z0eS0+Y3BdLCBsZW5ndGgpOworCXZ0eS0+YnVmW3Z0eS0+Y3BdID0gYzsKKworCXZ0eV93cml0ZSh2dHksICZ2dHktPmJ1Zlt2dHktPmNwXSwgbGVuZ3RoICsgMSk7CisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorCQl2dHlfd3JpdGUodnR5LCAmdGVsbmV0X2JhY2t3YXJkX2NoYXIsIDEpOworCisJdnR5LT5jcCsrOworCXZ0eS0+bGVuZ3RoKys7Cit9CisKKy8qIFNlbGYgaW5zZXJ0IGNoYXJhY3RlciAnYycgaW4gb3ZlcndyaXRlIG1vZGUuICovCitzdGF0aWMgdm9pZCB2dHlfc2VsZl9pbnNlcnRfb3ZlcndyaXRlKHN0cnVjdCB2dHkgKnZ0eSwgY2hhciBjKQoreworCXZ0eV9lbnN1cmUodnR5LCB2dHktPmxlbmd0aCArIDEpOworCXZ0eS0+YnVmW3Z0eS0+Y3ArK10gPSBjOworCisJaWYgKHZ0eS0+Y3AgPiB2dHktPmxlbmd0aCkKKwkJdnR5LT5sZW5ndGgrKzsKKworCWlmICgodnR5LT5ub2RlID09IEFVVEhfTk9ERSkgfHwgKHZ0eS0+bm9kZSA9PSBBVVRIX0VOQUJMRV9OT0RFKSkKKwkJcmV0dXJuOworCisJdnR5X3dyaXRlKHZ0eSwgJmMsIDEpOworfQorCisvKiBJbnNlcnQgYSB3b3JkIGludG8gdnR5IGludGVyZmFjZSB3aXRoIG92ZXJ3cml0ZSBtb2RlLiAqLworc3RhdGljIHZvaWQgdnR5X2luc2VydF93b3JkX292ZXJ3cml0ZShzdHJ1Y3QgdnR5ICp2dHksIGNoYXIgKnN0cikKK3sKKwlpbnQgbGVuID0gc3RybGVuKHN0cik7CisJdnR5X3dyaXRlKHZ0eSwgc3RyLCBsZW4pOworCXN0cmNweSgmdnR5LT5idWZbdnR5LT5jcF0sIHN0cik7CisJdnR5LT5jcCArPSBsZW47CisJdnR5LT5sZW5ndGggPSB2dHktPmNwOworfQorCisvKiBGb3J3YXJkIGNoYXJhY3Rlci4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9mb3J3YXJkX2NoYXIoc3RydWN0IHZ0eSAqdnR5KQoreworCWlmICh2dHktPmNwIDwgdnR5LT5sZW5ndGgpIHsKKwkJdnR5X3dyaXRlKHZ0eSwgJnZ0eS0+YnVmW3Z0eS0+Y3BdLCAxKTsKKwkJdnR5LT5jcCsrOworCX0KK30KKworLyogQmFja3dhcmQgY2hhcmFjdGVyLiAqLworc3RhdGljIHZvaWQgdnR5X2JhY2t3YXJkX2NoYXIoc3RydWN0IHZ0eSAqdnR5KQoreworCWlmICh2dHktPmNwID4gMCkgeworCQl2dHktPmNwLS07CisJCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfYmFja3dhcmRfY2hhciwgMSk7CisJfQorfQorCisvKiBNb3ZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUuICovCitzdGF0aWMgdm9pZCB2dHlfYmVnaW5uaW5nX29mX2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwKQorCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworfQorCisvKiBNb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuICovCitzdGF0aWMgdm9pZCB2dHlfZW5kX29mX2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwIDwgdnR5LT5sZW5ndGgpCisJCXZ0eV9mb3J3YXJkX2NoYXIodnR5KTsKK30KKworLyogQWRkIGN1cnJlbnQgY29tbWFuZCBsaW5lIHRvIHRoZSBoaXN0b3J5IGJ1ZmZlci4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9oaXN0X2FkZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGluZGV4OworCisJaWYgKHZ0eS0+bGVuZ3RoID09IDApCisJCXJldHVybjsKKworCWluZGV4ID0gdnR5LT5oaW5kZXggPyB2dHktPmhpbmRleCAtIDEgOiBWVFlfTUFYSElTVCAtIDE7CisKKwkvKiBJZ25vcmUgdGhlIHNhbWUgc3RyaW5nIGFzIHByZXZpb3VzIG9uZS4gKi8KKwlpZiAodnR5LT5oaXN0W2luZGV4XSkKKwkJaWYgKHN0cmNtcCh2dHktPmJ1ZiwgdnR5LT5oaXN0W2luZGV4XSkgPT0gMCkgeworCQkJdnR5LT5ocCA9IHZ0eS0+aGluZGV4OworCQkJcmV0dXJuOworCQl9CisKKwkvKiBJbnNlcnQgaGlzdG9yeSBlbnRyeS4gKi8KKwlpZiAodnR5LT5oaXN0W3Z0eS0+aGluZGV4XSkKKwkJdGFsbG9jX2ZyZWUodnR5LT5oaXN0W3Z0eS0+aGluZGV4XSk7CisJdnR5LT5oaXN0W3Z0eS0+aGluZGV4XSA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY3R4LCB2dHktPmJ1Zik7CisKKwkvKiBIaXN0b3J5IGluZGV4IHJvdGF0aW9uLiAqLworCXZ0eS0+aGluZGV4Kys7CisJaWYgKHZ0eS0+aGluZGV4ID09IFZUWV9NQVhISVNUKQorCQl2dHktPmhpbmRleCA9IDA7CisKKwl2dHktPmhwID0gdnR5LT5oaW5kZXg7Cit9CisKKy8qIEdldCB0ZWxuZXQgd2luZG93IHNpemUuICovCitzdGF0aWMgaW50Cit2dHlfdGVsbmV0X29wdGlvbiAoc3RydWN0IHZ0eSAqdnR5LCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBuYnl0ZXMpCit7CisjaWZkZWYgVEVMTkVUX09QVElPTl9ERUJVRworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbmJ5dGVzOyBpKyspCisgICAgeworICAgICAgc3dpdGNoIChidWZbaV0pCisJeworCWNhc2UgSUFDOgorCSAgdnR5X291dCAodnR5LCAiSUFDICIpOworCSAgYnJlYWs7CisJY2FzZSBXSUxMOgorCSAgdnR5X291dCAodnR5LCAiV0lMTCAiKTsKKwkgIGJyZWFrOworCWNhc2UgV09OVDoKKwkgIHZ0eV9vdXQgKHZ0eSwgIldPTlQgIik7CisJICBicmVhazsKKwljYXNlIERPOgorCSAgdnR5X291dCAodnR5LCAiRE8gIik7CisJICBicmVhazsKKwljYXNlIERPTlQ6CisJICB2dHlfb3V0ICh2dHksICJET05UICIpOworCSAgYnJlYWs7CisJY2FzZSBTQjoKKwkgIHZ0eV9vdXQgKHZ0eSwgIlNCICIpOworCSAgYnJlYWs7CisJY2FzZSBTRToKKwkgIHZ0eV9vdXQgKHZ0eSwgIlNFICIpOworCSAgYnJlYWs7CisJY2FzZSBURUxPUFRfRUNITzoKKwkgIHZ0eV9vdXQgKHZ0eSwgIlRFTE9QVF9FQ0hPICVzIiwgVlRZX05FV0xJTkUpOworCSAgYnJlYWs7CisJY2FzZSBURUxPUFRfU0dBOgorCSAgdnR5X291dCAodnR5LCAiVEVMT1BUX1NHQSAlcyIsIFZUWV9ORVdMSU5FKTsKKwkgIGJyZWFrOworCWNhc2UgVEVMT1BUX05BV1M6CisJICB2dHlfb3V0ICh2dHksICJURUxPUFRfTkFXUyAlcyIsIFZUWV9ORVdMSU5FKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICB2dHlfb3V0ICh2dHksICIleCAiLCBidWZbaV0pOworCSAgYnJlYWs7CisJfQorICAgIH0KKyAgdnR5X291dCAodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKyNlbmRpZiAvKiBURUxORVRfT1BUSU9OX0RFQlVHICovCisKKyAgc3dpdGNoIChidWZbMF0pCisgICAgeworICAgIGNhc2UgU0I6CisgICAgICB2dHktPnNiX2xlbiA9IDA7CisgICAgICB2dHktPmlhY19zYl9pbl9wcm9ncmVzcyA9IDE7CisgICAgICByZXR1cm4gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0U6IAorICAgICAgeworCWlmICghdnR5LT5pYWNfc2JfaW5fcHJvZ3Jlc3MpCisJICByZXR1cm4gMDsKKworCWlmICgodnR5LT5zYl9sZW4gPT0gMCkgfHwgKHZ0eS0+c2JfYnVmWzBdID09ICdcMCcpKQorCSAgeworCSAgICB2dHktPmlhY19zYl9pbl9wcm9ncmVzcyA9IDA7CisJICAgIHJldHVybiAwOworCSAgfQorCXN3aXRjaCAodnR5LT5zYl9idWZbMF0pCisJICB7CisJICBjYXNlIFRFTE9QVF9OQVdTOgorCSAgICBpZiAodnR5LT5zYl9sZW4gIT0gVEVMTkVUX05BV1NfU0JfTEVOKQorCSAgICAgIHZ0eV9vdXQodnR5LCJSRkMgMTA3MyB2aW9sYXRpb24gZGV0ZWN0ZWQ6IHRlbG5ldCBOQVdTIG9wdGlvbiAiCisJCQkic2hvdWxkIHNlbmQgJWQgY2hhcmFjdGVycywgYnV0IHdlIHJlY2VpdmVkICVsdSIsCisJCQlURUxORVRfTkFXU19TQl9MRU4sICh1X2xvbmcpdnR5LT5zYl9sZW4pOworCSAgICBlbHNlIGlmIChzaXplb2YodnR5LT5zYl9idWYpIDwgVEVMTkVUX05BV1NfU0JfTEVOKQorCSAgICAgIHZ0eV9vdXQodnR5LCAiQnVnIGRldGVjdGVkOiBzaXplb2YodnR5LT5zYl9idWYpICVsdSA8ICVkLCAiCisJCSAgICAgICAidG9vIHNtYWxsIHRvIGhhbmRsZSB0aGUgdGVsbmV0IE5BV1Mgb3B0aW9uIiwKKwkJICAgICAgICh1X2xvbmcpc2l6ZW9mKHZ0eS0+c2JfYnVmKSwgVEVMTkVUX05BV1NfU0JfTEVOKTsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJdnR5LT53aWR0aCA9ICgodnR5LT5zYl9idWZbMV0gPDwgOCl8dnR5LT5zYl9idWZbMl0pOworCQl2dHktPmhlaWdodCA9ICgodnR5LT5zYl9idWZbM10gPDwgOCl8dnR5LT5zYl9idWZbNF0pOworI2lmZGVmIFRFTE5FVF9PUFRJT05fREVCVUcKKwkJdnR5X291dCh2dHksICJURUxORVQgTkFXUyB3aW5kb3cgc2l6ZSBuZWdvdGlhdGlvbiBjb21wbGV0ZWQ6ICIKKwkJCSAgICAgICJ3aWR0aCAlZCwgaGVpZ2h0ICVkJXMiLAorCQkJdnR5LT53aWR0aCwgdnR5LT5oZWlnaHQsIFZUWV9ORVdMSU5FKTsKKyNlbmRpZgorCSAgICAgIH0KKwkgICAgYnJlYWs7CisJICB9CisJdnR5LT5pYWNfc2JfaW5fcHJvZ3Jlc3MgPSAwOworCXJldHVybiAwOworCWJyZWFrOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiAxOworfQorCisvKiBFeGVjdXRlIGN1cnJlbnQgY29tbWFuZCBsaW5lLiAqLworc3RhdGljIGludCB2dHlfZXhlY3V0ZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IHJldDsKKworCXJldCA9IENNRF9TVUNDRVNTOworCisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIEFVVEhfTk9ERToKKwljYXNlIEFVVEhfRU5BQkxFX05PREU6CisJCXZ0eV9hdXRoKHZ0eSwgdnR5LT5idWYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSB2dHlfY29tbWFuZCh2dHksIHZ0eS0+YnVmKTsKKwkJaWYgKHZ0eS0+dHlwZSA9PSBWVFlfVEVSTSkKKwkJCXZ0eV9oaXN0X2FkZCh2dHkpOworCQlicmVhazsKKwl9CisKKwkvKiBDbGVhciBjb21tYW5kIGxpbmUgYnVmZmVyLiAqLworCXZ0eS0+Y3AgPSB2dHktPmxlbmd0aCA9IDA7CisJdnR5X2NsZWFyX2J1Zih2dHkpOworCisJaWYgKHZ0eS0+c3RhdHVzICE9IFZUWV9DTE9TRSkKKwkJdnR5X3Byb21wdCh2dHkpOworCisJcmV0dXJuIHJldDsKK30KKworLyogU2VuZCBXSUxMIFRFTE9QVF9FQ0hPIHRvIHJlbW90ZSBzZXJ2ZXIuICovCitzdGF0aWMgdm9pZAordnR5X3dpbGxfZWNobyAoc3RydWN0IHZ0eSAqdnR5KQoreworCXVuc2lnbmVkIGNoYXIgY21kW10gPSB7IElBQywgV0lMTCwgVEVMT1BUX0VDSE8sICdcMCcgfTsKKwl2dHlfb3V0ICh2dHksICIlcyIsIGNtZCk7Cit9CisKKy8qIE1ha2Ugc3VwcHJlc3MgR28tQWhlYWQgdGVsbmV0IG9wdGlvbi4gKi8KK3N0YXRpYyB2b2lkCit2dHlfd2lsbF9zdXBwcmVzc19nb19haGVhZCAoc3RydWN0IHZ0eSAqdnR5KQoreworCXVuc2lnbmVkIGNoYXIgY21kW10gPSB7IElBQywgV0lMTCwgVEVMT1BUX1NHQSwgJ1wwJyB9OworCXZ0eV9vdXQgKHZ0eSwgIiVzIiwgY21kKTsKK30KKworLyogTWFrZSBkb24ndCB1c2UgbGluZW1vZGUgb3ZlciB0ZWxuZXQuICovCitzdGF0aWMgdm9pZAordnR5X2RvbnRfbGluZW1vZGUgKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl1bnNpZ25lZCBjaGFyIGNtZFtdID0geyBJQUMsIERPTlQsIFRFTE9QVF9MSU5FTU9ERSwgJ1wwJyB9OworCXZ0eV9vdXQgKHZ0eSwgIiVzIiwgY21kKTsKK30KKworLyogVXNlIHdpbmRvdyBzaXplLiAqLworc3RhdGljIHZvaWQKK3Z0eV9kb193aW5kb3dfc2l6ZSAoc3RydWN0IHZ0eSAqdnR5KQoreworCXVuc2lnbmVkIGNoYXIgY21kW10gPSB7IElBQywgRE8sIFRFTE9QVF9OQVdTLCAnXDAnIH07CisJdnR5X291dCAodnR5LCAiJXMiLCBjbWQpOworfQorCitzdGF0aWMgdm9pZCB2dHlfa2lsbF9saW5lX2Zyb21fYmVnaW5uaW5nKHN0cnVjdCB2dHkgKik7CitzdGF0aWMgdm9pZCB2dHlfcmVkcmF3X2xpbmUoc3RydWN0IHZ0eSAqKTsKKworLyogUHJpbnQgY29tbWFuZCBsaW5lIGhpc3RvcnkuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tCisgICB2dHlfbmV4dF9saW5lIGFuZCB2dHlfcHJldmlvdXNfbGluZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9oaXN0b3J5X3ByaW50KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgbGVuZ3RoOworCisJdnR5X2tpbGxfbGluZV9mcm9tX2JlZ2lubmluZyh2dHkpOworCisJLyogR2V0IHByZXZpb3VzIGxpbmUgZnJvbSBoaXN0b3J5IGJ1ZmZlciAqLworCWxlbmd0aCA9IHN0cmxlbih2dHktPmhpc3RbdnR5LT5ocF0pOworCW1lbWNweSh2dHktPmJ1ZiwgdnR5LT5oaXN0W3Z0eS0+aHBdLCBsZW5ndGgpOworCXZ0eS0+Y3AgPSB2dHktPmxlbmd0aCA9IGxlbmd0aDsKKworCS8qIFJlZHJhdyBjdXJyZW50IGxpbmUgKi8KKwl2dHlfcmVkcmF3X2xpbmUodnR5KTsKK30KKworLyogU2hvdyBuZXh0IGNvbW1hbmQgbGluZSBoaXN0b3J5LiAqLworc3RhdGljIHZvaWQgdnR5X25leHRfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IHRyeV9pbmRleDsKKworCWlmICh2dHktPmhwID09IHZ0eS0+aGluZGV4KQorCQlyZXR1cm47CisKKwkvKiBUcnkgaXMgdGhlcmUgaGlzdG9yeSBleGlzdCBvciBub3QuICovCisJdHJ5X2luZGV4ID0gdnR5LT5ocDsKKwlpZiAodHJ5X2luZGV4ID09IChWVFlfTUFYSElTVCAtIDEpKQorCQl0cnlfaW5kZXggPSAwOworCWVsc2UKKwkJdHJ5X2luZGV4Kys7CisKKwkvKiBJZiB0aGVyZSBpcyBub3QgaGlzdG9yeSByZXR1cm4uICovCisJaWYgKHZ0eS0+aGlzdFt0cnlfaW5kZXhdID09IE5VTEwpCisJCXJldHVybjsKKwllbHNlCisJCXZ0eS0+aHAgPSB0cnlfaW5kZXg7CisKKwl2dHlfaGlzdG9yeV9wcmludCh2dHkpOworfQorCisvKiBTaG93IHByZXZpb3VzIGNvbW1hbmQgbGluZSBoaXN0b3J5LiAqLworc3RhdGljIHZvaWQgdnR5X3ByZXZpb3VzX2xpbmUoc3RydWN0IHZ0eSAqdnR5KQoreworCWludCB0cnlfaW5kZXg7CisKKwl0cnlfaW5kZXggPSB2dHktPmhwOworCWlmICh0cnlfaW5kZXggPT0gMCkKKwkJdHJ5X2luZGV4ID0gVlRZX01BWEhJU1QgLSAxOworCWVsc2UKKwkJdHJ5X2luZGV4LS07CisKKwlpZiAodnR5LT5oaXN0W3RyeV9pbmRleF0gPT0gTlVMTCkKKwkJcmV0dXJuOworCWVsc2UKKwkJdnR5LT5ocCA9IHRyeV9pbmRleDsKKworCXZ0eV9oaXN0b3J5X3ByaW50KHZ0eSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmVkcmF3IGFsbCBvZiB0aGUgY29tbWFuZCBsaW5lIGNoYXJhY3Rlci4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9yZWRyYXdfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X3dyaXRlKHZ0eSwgdnR5LT5idWYsIHZ0eS0+bGVuZ3RoKTsKKwl2dHktPmNwID0gdnR5LT5sZW5ndGg7Cit9CisKKy8qIEZvcndhcmQgd29yZC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9mb3J3YXJkX3dvcmQoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwICE9IHZ0eS0+bGVuZ3RoICYmIHZ0eS0+YnVmW3Z0eS0+Y3BdICE9ICcgJykKKwkJdnR5X2ZvcndhcmRfY2hhcih2dHkpOworCisJd2hpbGUgKHZ0eS0+Y3AgIT0gdnR5LT5sZW5ndGggJiYgdnR5LT5idWZbdnR5LT5jcF0gPT0gJyAnKQorCQl2dHlfZm9yd2FyZF9jaGFyKHZ0eSk7Cit9CisKKy8qIEJhY2t3YXJkIHdvcmQgd2l0aG91dCBza2lwcGluZyB0cmFpbmluZyBzcGFjZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9iYWNrd2FyZF9wdXJlX3dvcmQoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwID4gMCAmJiB2dHktPmJ1Zlt2dHktPmNwIC0gMV0gIT0gJyAnKQorCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworfQorCisvKiBCYWNrd2FyZCB3b3JkLiAqLworc3RhdGljIHZvaWQgdnR5X2JhY2t3YXJkX3dvcmQoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwID4gMCAmJiB2dHktPmJ1Zlt2dHktPmNwIC0gMV0gPT0gJyAnKQorCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCisJd2hpbGUgKHZ0eS0+Y3AgPiAwICYmIHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXSAhPSAnICcpCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7Cit9CisKKy8qIFdoZW4gJ15EJyBpcyB0eXBlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIHdlIG1vdmUgdG8gdGhlIGRvd24KKyAgIGxldmVsLiAqLworc3RhdGljIHZvaWQgdnR5X2Rvd25fbGV2ZWwoc3RydWN0IHZ0eSAqdnR5KQoreworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisJKCpjb25maWdfZXhpdF9jbWQuZnVuYykgKE5VTEwsIHZ0eSwgMCwgTlVMTCk7CisJdnR5X3Byb21wdCh2dHkpOworCXZ0eS0+Y3AgPSAwOworfQorCisvKiBXaGVuICdeWicgaXMgcmVjZWl2ZWQgZnJvbSB2dHksIG1vdmUgZG93biB0byB0aGUgZW5hYmxlIG1vZGUuICovCitzdGF0aWMgdm9pZCB2dHlfZW5kX2NvbmZpZyhzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBWSUVXX05PREU6CisJY2FzZSBFTkFCTEVfTk9ERToKKwkJLyogTm90aGluZyB0byBkby4gKi8KKwkJYnJlYWs7CisJY2FzZSBDT05GSUdfTk9ERToKKwljYXNlIFZUWV9OT0RFOgorCQl2dHlfY29uZmlnX3VubG9jayh2dHkpOworCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogVW5rbm93biBub2RlLCB3ZSBoYXZlIHRvIGlnbm9yZSBpdC4gKi8KKwkJYnJlYWs7CisJfQorCisJdnR5X3Byb21wdCh2dHkpOworCXZ0eS0+Y3AgPSAwOworfQorCisvKiBEZWxldGUgYSBjaGFyY3RlciBhdCB0aGUgY3VycmVudCBwb2ludC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9kZWxldGVfY2hhcihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGk7CisJaW50IHNpemU7CisKKwlpZiAodnR5LT5ub2RlID09IEFVVEhfTk9ERSB8fCB2dHktPm5vZGUgPT0gQVVUSF9FTkFCTEVfTk9ERSkKKwkJcmV0dXJuOworCisJaWYgKHZ0eS0+bGVuZ3RoID09IDApIHsKKwkJdnR5X2Rvd25fbGV2ZWwodnR5KTsKKwkJcmV0dXJuOworCX0KKworCWlmICh2dHktPmNwID09IHZ0eS0+bGVuZ3RoKQorCQlyZXR1cm47CQkvKiBjb21wbGV0aW9uIG5lZWQgaGVyZT8gKi8KKworCXNpemUgPSB2dHktPmxlbmd0aCAtIHZ0eS0+Y3A7CisKKwl2dHktPmxlbmd0aC0tOworCW1lbW1vdmUoJnZ0eS0+YnVmW3Z0eS0+Y3BdLCAmdnR5LT5idWZbdnR5LT5jcCArIDFdLCBzaXplIC0gMSk7CisJdnR5LT5idWZbdnR5LT5sZW5ndGhdID0gJ1wwJzsKKworCXZ0eV93cml0ZSh2dHksICZ2dHktPmJ1Zlt2dHktPmNwXSwgc2l6ZSAtIDEpOworCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfc3BhY2VfY2hhciwgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQl2dHlfd3JpdGUodnR5LCAmdGVsbmV0X2JhY2t3YXJkX2NoYXIsIDEpOworfQorCisvKiBEZWxldGUgYSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBwb2ludC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9kZWxldGVfYmFja3dhcmRfY2hhcihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaWYgKHZ0eS0+Y3AgPT0gMCkKKwkJcmV0dXJuOworCisJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKKwl2dHlfZGVsZXRlX2NoYXIodnR5KTsKK30KKworLyogS2lsbCByZXN0IG9mIGxpbmUgZnJvbSBjdXJyZW50IHBvaW50LiAqLworc3RhdGljIHZvaWQgdnR5X2tpbGxfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGk7CisJaW50IHNpemU7CisKKwlzaXplID0gdnR5LT5sZW5ndGggLSB2dHktPmNwOworCisJaWYgKHNpemUgPT0gMCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJdnR5X3dyaXRlKHZ0eSwgJnRlbG5ldF9zcGFjZV9jaGFyLCAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQl2dHlfd3JpdGUodnR5LCAmdGVsbmV0X2JhY2t3YXJkX2NoYXIsIDEpOworCisJbWVtc2V0KCZ2dHktPmJ1Zlt2dHktPmNwXSwgMCwgc2l6ZSk7CisJdnR5LT5sZW5ndGggPSB2dHktPmNwOworfQorCisvKiBLaWxsIGxpbmUgZnJvbSB0aGUgYmVnaW5uaW5nLiAqLworc3RhdGljIHZvaWQgdnR5X2tpbGxfbGluZV9mcm9tX2JlZ2lubmluZyhzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X2JlZ2lubmluZ19vZl9saW5lKHZ0eSk7CisJdnR5X2tpbGxfbGluZSh2dHkpOworfQorCisvKiBEZWxldGUgYSB3b3JkIGJlZm9yZSB0aGUgcG9pbnQuICovCitzdGF0aWMgdm9pZCB2dHlfZm9yd2FyZF9raWxsX3dvcmQoc3RydWN0IHZ0eSAqdnR5KQoreworCXdoaWxlICh2dHktPmNwICE9IHZ0eS0+bGVuZ3RoICYmIHZ0eS0+YnVmW3Z0eS0+Y3BdID09ICcgJykKKwkJdnR5X2RlbGV0ZV9jaGFyKHZ0eSk7CisJd2hpbGUgKHZ0eS0+Y3AgIT0gdnR5LT5sZW5ndGggJiYgdnR5LT5idWZbdnR5LT5jcF0gIT0gJyAnKQorCQl2dHlfZGVsZXRlX2NoYXIodnR5KTsKK30KKworLyogRGVsZXRlIGEgd29yZCBiZWZvcmUgdGhlIHBvaW50LiAqLworc3RhdGljIHZvaWQgdnR5X2JhY2t3YXJkX2tpbGxfd29yZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgPiAwICYmIHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXSA9PSAnICcpCisJCXZ0eV9kZWxldGVfYmFja3dhcmRfY2hhcih2dHkpOworCXdoaWxlICh2dHktPmNwID4gMCAmJiB2dHktPmJ1Zlt2dHktPmNwIC0gMV0gIT0gJyAnKQorCQl2dHlfZGVsZXRlX2JhY2t3YXJkX2NoYXIodnR5KTsKK30KKworLyogVHJhbnNwb3NlIGNoYXJzIGJlZm9yZSBvciBhdCB0aGUgcG9pbnQuICovCitzdGF0aWMgdm9pZCB2dHlfdHJhbnNwb3NlX2NoYXJzKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwljaGFyIGMxLCBjMjsKKworCS8qIElmIGxlbmd0aCBpcyBzaG9ydCBvciBwb2ludCBpcyBuZWFyIGJ5IHRoZSBiZWdpbm5pbmcgb2YgbGluZSB0aGVuCisJICAgcmV0dXJuLiAqLworCWlmICh2dHktPmxlbmd0aCA8IDIgfHwgdnR5LT5jcCA8IDEpCisJCXJldHVybjsKKworCS8qIEluIGNhc2Ugb2YgcG9pbnQgaXMgbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLiAqLworCWlmICh2dHktPmNwID09IHZ0eS0+bGVuZ3RoKSB7CisJCWMxID0gdnR5LT5idWZbdnR5LT5jcCAtIDFdOworCQljMiA9IHZ0eS0+YnVmW3Z0eS0+Y3AgLSAyXTsKKworCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCQl2dHlfc2VsZl9pbnNlcnRfb3ZlcndyaXRlKHZ0eSwgYzEpOworCQl2dHlfc2VsZl9pbnNlcnRfb3ZlcndyaXRlKHZ0eSwgYzIpOworCX0gZWxzZSB7CisJCWMxID0gdnR5LT5idWZbdnR5LT5jcF07CisJCWMyID0gdnR5LT5idWZbdnR5LT5jcCAtIDFdOworCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCXZ0eV9zZWxmX2luc2VydF9vdmVyd3JpdGUodnR5LCBjMSk7CisJCXZ0eV9zZWxmX2luc2VydF9vdmVyd3JpdGUodnR5LCBjMik7CisJfQorfQorCisvKiBEbyBjb21wbGV0aW9uIGF0IHZ0eSBpbnRlcmZhY2UuICovCitzdGF0aWMgdm9pZCB2dHlfY29tcGxldGVfY29tbWFuZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGk7CisJaW50IHJldDsKKwljaGFyICoqbWF0Y2hlZCA9IE5VTEw7CisJdmVjdG9yIHZsaW5lOworCisJaWYgKHZ0eS0+bm9kZSA9PSBBVVRIX05PREUgfHwgdnR5LT5ub2RlID09IEFVVEhfRU5BQkxFX05PREUpCisJCXJldHVybjsKKworCXZsaW5lID0gY21kX21ha2Vfc3RydmVjKHZ0eS0+YnVmKTsKKwlpZiAodmxpbmUgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogSW4gY2FzZSBvZiAnaGVscCBcdCcuICovCisJaWYgKGlzc3BhY2UoKGludCl2dHktPmJ1Zlt2dHktPmxlbmd0aCAtIDFdKSkKKwkJdmVjdG9yX3NldCh2bGluZSwgJ1wwJyk7CisKKwltYXRjaGVkID0gY21kX2NvbXBsZXRlX2NvbW1hbmQodmxpbmUsIHZ0eSwgJnJldCk7CisKKwljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgQ01EX0VSUl9BTUJJR1VPVVM6CisJCXZ0eV9vdXQodnR5LCAiJSUgQW1iaWd1b3VzIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgQ01EX0VSUl9OT19NQVRDSDoKKwkJLyogdnR5X291dCAodnR5LCAiJSUgVGhlcmUgaXMgbm8gbWF0Y2hlZCBjb21tYW5kLiVzIiwgVlRZX05FV0xJTkUpOyAqLworCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQlicmVhazsKKwljYXNlIENNRF9DT01QTEVURV9GVUxMX01BVENIOgorCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQl2dHlfYmFja3dhcmRfcHVyZV93b3JkKHZ0eSk7CisJCXZ0eV9pbnNlcnRfd29yZF9vdmVyd3JpdGUodnR5LCBtYXRjaGVkWzBdKTsKKwkJdnR5X3NlbGZfaW5zZXJ0KHZ0eSwgJyAnKTsKKwkJLy90YWxsb2NfZnJlZShtYXRjaGVkWzBdKTsKKwkJYnJlYWs7CisJY2FzZSBDTURfQ09NUExFVEVfTUFUQ0g6CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCXZ0eV9iYWNrd2FyZF9wdXJlX3dvcmQodnR5KTsKKwkJdnR5X2luc2VydF93b3JkX292ZXJ3cml0ZSh2dHksIG1hdGNoZWRbMF0pOworCQl0YWxsb2NfZnJlZShtYXRjaGVkWzBdKTsKKwkJdmVjdG9yX29ubHlfaW5kZXhfZnJlZShtYXRjaGVkKTsKKwkJcmV0dXJuOworCQlicmVhazsKKwljYXNlIENNRF9DT01QTEVURV9MSVNUX01BVENIOgorCQlmb3IgKGkgPSAwOyBtYXRjaGVkW2ldICE9IE5VTEw7IGkrKykgeworCQkJaWYgKGkgIT0gMCAmJiAoKGkgJSA2KSA9PSAwKSkKKwkJCQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCQkJdnR5X291dCh2dHksICIlLTEwcyAiLCBtYXRjaGVkW2ldKTsKKwkJCXRhbGxvY19mcmVlKG1hdGNoZWRbaV0pOworCQl9CisJCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJYnJlYWs7CisJY2FzZSBDTURfRVJSX05PVEhJTkdfVE9ETzoKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWlmIChtYXRjaGVkKQorCQl2ZWN0b3Jfb25seV9pbmRleF9mcmVlKG1hdGNoZWQpOworfQorCitzdGF0aWMgdm9pZAordnR5X2Rlc2NyaWJlX2ZvbGQoc3RydWN0IHZ0eSAqdnR5LCBpbnQgY21kX3dpZHRoLAorCQkgIHVuc2lnbmVkIGludCBkZXNjX3dpZHRoLCBzdHJ1Y3QgZGVzYyAqZGVzYykKK3sKKwljaGFyICpidWY7CisJY29uc3QgY2hhciAqY21kLCAqcDsKKwlpbnQgcG9zOworCisJY21kID0gZGVzYy0+Y21kWzBdID09ICcuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQ7CisKKwlpZiAoZGVzY193aWR0aCA8PSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiICAlLSpzICAlcyVzIiwgY21kX3dpZHRoLCBjbWQsIGRlc2MtPnN0ciwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuOworCX0KKworCWJ1ZiA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsIHN0cmxlbihkZXNjLT5zdHIpICsgMSwgImRlc2NyaWJlX2ZvbGQiKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCisJZm9yIChwID0gZGVzYy0+c3RyOyBzdHJsZW4ocCkgPiBkZXNjX3dpZHRoOyBwICs9IHBvcyArIDEpIHsKKwkJZm9yIChwb3MgPSBkZXNjX3dpZHRoOyBwb3MgPiAwOyBwb3MtLSkKKwkJCWlmICgqKHAgKyBwb3MpID09ICcgJykKKwkJCQlicmVhazsKKworCQlpZiAocG9zID09IDApCisJCQlicmVhazsKKworCQlzdHJuY3B5KGJ1ZiwgcCwgcG9zKTsKKwkJYnVmW3Bvc10gPSAnXDAnOworCQl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAgJXMlcyIsIGNtZF93aWR0aCwgY21kLCBidWYsIFZUWV9ORVdMSU5FKTsKKworCQljbWQgPSAiIjsKKwl9CisKKwl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAgJXMlcyIsIGNtZF93aWR0aCwgY21kLCBwLCBWVFlfTkVXTElORSk7CisKKwl0YWxsb2NfZnJlZShidWYpOworfQorCisvKiBEZXNjcmliZSBtYXRjaGVkIGNvbW1hbmQgZnVuY3Rpb24uICovCitzdGF0aWMgdm9pZCB2dHlfZGVzY3JpYmVfY29tbWFuZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IHJldDsKKwl2ZWN0b3IgdmxpbmU7CisJdmVjdG9yIGRlc2NyaWJlOworCXVuc2lnbmVkIGludCBpLCB3aWR0aCwgZGVzY193aWR0aDsKKwlzdHJ1Y3QgZGVzYyAqZGVzYywgKmRlc2NfY3IgPSBOVUxMOworCisJdmxpbmUgPSBjbWRfbWFrZV9zdHJ2ZWModnR5LT5idWYpOworCisJLyogSW4gY2FzZSBvZiAnPiA/Jy4gKi8KKwlpZiAodmxpbmUgPT0gTlVMTCkgeworCQl2bGluZSA9IHZlY3Rvcl9pbml0KDEpOworCQl2ZWN0b3Jfc2V0KHZsaW5lLCAnXDAnKTsKKwl9IGVsc2UgaWYgKGlzc3BhY2UoKGludCl2dHktPmJ1Zlt2dHktPmxlbmd0aCAtIDFdKSkKKwkJdmVjdG9yX3NldCh2bGluZSwgJ1wwJyk7CisKKwlkZXNjcmliZSA9IGNtZF9kZXNjcmliZV9jb21tYW5kKHZsaW5lLCB2dHksICZyZXQpOworCisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCS8qIEFtYmlndW91cyBlcnJvci4gKi8KKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgQ01EX0VSUl9BTUJJR1VPVVM6CisJCWNtZF9mcmVlX3N0cnZlYyh2bGluZSk7CisJCXZ0eV9vdXQodnR5LCAiJSUgQW1iaWd1b3VzIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCXJldHVybjsKKwkJYnJlYWs7CisJY2FzZSBDTURfRVJSX05PX01BVENIOgorCQljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCQl2dHlfb3V0KHZ0eSwgIiUlIFRoZXJlIGlzIG5vIG1hdGNoZWQgY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJcmV0dXJuOworCQlicmVhazsKKwl9CisKKwkvKiBHZXQgd2lkdGggb2YgY29tbWFuZCBzdHJpbmcuICovCisJd2lkdGggPSAwOworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKGRlc2NyaWJlKTsgaSsrKQorCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjcmliZSwgaSkpICE9IE5VTEwpIHsKKwkJCXVuc2lnbmVkIGludCBsZW47CisKKwkJCWlmIChkZXNjLT5jbWRbMF0gPT0gJ1wwJykKKwkJCQljb250aW51ZTsKKworCQkJbGVuID0gc3RybGVuKGRlc2MtPmNtZCk7CisJCQlpZiAoZGVzYy0+Y21kWzBdID09ICcuJykKKwkJCQlsZW4tLTsKKworCQkJaWYgKHdpZHRoIDwgbGVuKQorCQkJCXdpZHRoID0gbGVuOworCQl9CisKKwkvKiBHZXQgd2lkdGggb2YgZGVzY3JpcHRpb24gc3RyaW5nLiAqLworCWRlc2Nfd2lkdGggPSB2dHktPndpZHRoIC0gKHdpZHRoICsgNik7CisKKwkvKiBQcmludCBvdXQgZGVzY3JpcHRpb24uICovCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoZGVzY3JpYmUpOyBpKyspCisJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2NyaWJlLCBpKSkgIT0gTlVMTCkgeworCQkJaWYgKGRlc2MtPmNtZFswXSA9PSAnXDAnKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc3RyY21wKGRlc2MtPmNtZCwgIjxjcj4iKSA9PSAwKSB7CisJCQkJZGVzY19jciA9IGRlc2M7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICghZGVzYy0+c3RyKQorCQkJCXZ0eV9vdXQodnR5LCAiICAlLXMlcyIsCisJCQkJCWRlc2MtPmNtZFswXSA9PQorCQkJCQknLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kLAorCQkJCQlWVFlfTkVXTElORSk7CisJCQllbHNlIGlmIChkZXNjX3dpZHRoID49IHN0cmxlbihkZXNjLT5zdHIpKQorCQkJCXZ0eV9vdXQodnR5LCAiICAlLSpzICAlcyVzIiwgd2lkdGgsCisJCQkJCWRlc2MtPmNtZFswXSA9PQorCQkJCQknLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kLAorCQkJCQlkZXNjLT5zdHIsIFZUWV9ORVdMSU5FKTsKKwkJCWVsc2UKKwkJCQl2dHlfZGVzY3JpYmVfZm9sZCh2dHksIHdpZHRoLCBkZXNjX3dpZHRoLCBkZXNjKTsKKworI2lmIDAKKwkJCXZ0eV9vdXQodnR5LCAiICAlLSpzICVzJXMiLCB3aWR0aAorCQkJCWRlc2MtPmNtZFswXSA9PSAnLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kLAorCQkJCWRlc2MtPnN0ciA/IGRlc2MtPnN0ciA6ICIiLCBWVFlfTkVXTElORSk7CisjZW5kaWYJCQkJLyogMCAqLworCQl9CisKKwlpZiAoKGRlc2MgPSBkZXNjX2NyKSkgeworCQlpZiAoIWRlc2MtPnN0cikKKwkJCXZ0eV9vdXQodnR5LCAiICAlLXMlcyIsCisJCQkJZGVzYy0+Y21kWzBdID09ICcuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQsCisJCQkJVlRZX05FV0xJTkUpOworCQllbHNlIGlmIChkZXNjX3dpZHRoID49IHN0cmxlbihkZXNjLT5zdHIpKQorCQkJdnR5X291dCh2dHksICIgICUtKnMgICVzJXMiLCB3aWR0aCwKKwkJCQlkZXNjLT5jbWRbMF0gPT0gJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZCwKKwkJCQlkZXNjLT5zdHIsIFZUWV9ORVdMSU5FKTsKKwkJZWxzZQorCQkJdnR5X2Rlc2NyaWJlX2ZvbGQodnR5LCB3aWR0aCwgZGVzY193aWR0aCwgZGVzYyk7CisJfQorCisJY21kX2ZyZWVfc3RydmVjKHZsaW5lKTsKKwl2ZWN0b3JfZnJlZShkZXNjcmliZSk7CisKKwl2dHlfcHJvbXB0KHZ0eSk7CisJdnR5X3JlZHJhd19saW5lKHZ0eSk7Cit9CisKKy8qIF5DIHN0b3AgY3VycmVudCBpbnB1dCBhbmQgZG8gbm90IGFkZCBjb21tYW5kIGxpbmUgdG8gdGhlIGhpc3RvcnkuICovCitzdGF0aWMgdm9pZCB2dHlfc3RvcF9pbnB1dChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5LT5jcCA9IHZ0eS0+bGVuZ3RoID0gMDsKKwl2dHlfY2xlYXJfYnVmKHZ0eSk7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBWSUVXX05PREU6CisJY2FzZSBFTkFCTEVfTk9ERToKKwkJLyogTm90aGluZyB0byBkby4gKi8KKwkJYnJlYWs7CisJY2FzZSBDT05GSUdfTk9ERToKKwljYXNlIFZUWV9OT0RFOgorCQl2dHlfY29uZmlnX3VubG9jayh2dHkpOworCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogVW5rbm93biBub2RlLCB3ZSBoYXZlIHRvIGlnbm9yZSBpdC4gKi8KKwkJYnJlYWs7CisJfQorCXZ0eV9wcm9tcHQodnR5KTsKKworCS8qIFNldCBoaXN0b3J5IHBvaW50ZXIgdG8gdGhlIGxhdGVzdCBvbmUuICovCisJdnR5LT5ocCA9IHZ0eS0+aGluZGV4OworfQorCisjZGVmaW5lIENPTlRST0woWCkgICgoWCkgLSAnQCcpCisjZGVmaW5lIFZUWV9OT1JNQUwgICAgIDAKKyNkZWZpbmUgVlRZX1BSRV9FU0NBUEUgMQorI2RlZmluZSBWVFlfRVNDQVBFICAgICAyCisKKy8qIEVzY2FwZSBjaGFyYWN0ZXIgY29tbWFuZCBtYXAuICovCitzdGF0aWMgdm9pZCB2dHlfZXNjYXBlX21hcCh1bnNpZ25lZCBjaGFyIGMsIHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICgnQScpOgorCQl2dHlfcHJldmlvdXNfbGluZSh2dHkpOworCQlicmVhazsKKwljYXNlICgnQicpOgorCQl2dHlfbmV4dF9saW5lKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgKCdDJyk6CisJCXZ0eV9mb3J3YXJkX2NoYXIodnR5KTsKKwkJYnJlYWs7CisJY2FzZSAoJ0QnKToKKwkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogR28gYmFjayB0byBub3JtYWwgbW9kZS4gKi8KKwl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7Cit9CisKKy8qIFF1aXQgcHJpbnQgb3V0IHRvIHRoZSBidWZmZXIuICovCitzdGF0aWMgdm9pZCB2dHlfYnVmZmVyX3Jlc2V0KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlidWZmZXJfcmVzZXQodnR5LT5vYnVmKTsKKwl2dHlfcHJvbXB0KHZ0eSk7CisJdnR5X3JlZHJhd19saW5lKHZ0eSk7Cit9CisKKy8qIFJlYWQgZGF0YSB2aWEgdnR5IHNvY2tldC4gKi8KK2ludCB2dHlfcmVhZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IGk7CisJaW50IG5ieXRlczsKKwl1bnNpZ25lZCBjaGFyIGJ1ZltWVFlfUkVBRF9CVUZTSVpdOworCisJaW50IHZ0eV9zb2NrID0gdnR5LT5mZDsKKworCS8qIFJlYWQgcmF3IGRhdGEgZnJvbSBzb2NrZXQgKi8KKwlpZiAoKG5ieXRlcyA9IHJlYWQodnR5LT5mZCwgYnVmLCBWVFlfUkVBRF9CVUZTSVopKSA8PSAwKSB7CisJCWlmIChuYnl0ZXMgPCAwKSB7CisJCQlpZiAoRVJSTk9fSU9fUkVUUlkoZXJybm8pKSB7CisJCQkJdnR5X2V2ZW50KFZUWV9SRUFELCB2dHlfc29jaywgdnR5KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlidWZmZXJfcmVzZXQodnR5LT5vYnVmKTsKKwkJdnR5LT5zdGF0dXMgPSBWVFlfQ0xPU0U7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5ieXRlczsgaSsrKSB7CisJCWlmIChidWZbaV0gPT0gSUFDKSB7CisJCQlpZiAoIXZ0eS0+aWFjKSB7CisJCQkJdnR5LT5pYWMgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQl2dHktPmlhYyA9IDA7CisJCQl9CisJCX0KKworCQlpZiAodnR5LT5pYWNfc2JfaW5fcHJvZ3Jlc3MgJiYgIXZ0eS0+aWFjKSB7CisJCQlpZiAodnR5LT5zYl9sZW4gPCBzaXplb2YodnR5LT5zYl9idWYpKQorCQkJCXZ0eS0+c2JfYnVmW3Z0eS0+c2JfbGVuXSA9IGJ1ZltpXTsKKwkJCXZ0eS0+c2JfbGVuKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh2dHktPmlhYykgeworCQkJLyogSW4gY2FzZSBvZiB0ZWxuZXQgY29tbWFuZCAqLworCQkJaW50IHJldCA9IDA7CisJCQlyZXQgPSB2dHlfdGVsbmV0X29wdGlvbih2dHksIGJ1ZiArIGksIG5ieXRlcyAtIGkpOworCQkJdnR5LT5pYWMgPSAwOworCQkJaSArPSByZXQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh2dHktPnN0YXR1cyA9PSBWVFlfTU9SRSkgeworCQkJc3dpdGNoIChidWZbaV0pIHsKKwkJCWNhc2UgQ09OVFJPTCgnQycpOgorCQkJY2FzZSAncSc6CisJCQljYXNlICdRJzoKKwkJCQl2dHlfYnVmZmVyX3Jlc2V0KHZ0eSk7CisJCQkJYnJlYWs7CisjaWYgMAkJCQkvKiBNb3JlIGxpbmUgZG9lcyBub3Qgd29yayBmb3IgInNob3cgaXAgYmdwIi4gICovCisJCQljYXNlICdcbic6CisJCQljYXNlICdccic6CisJCQkJdnR5LT5zdGF0dXMgPSBWVFlfTU9SRUxJTkU7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEVzY2FwZSBjaGFyYWN0ZXIuICovCisJCWlmICh2dHktPmVzY2FwZSA9PSBWVFlfRVNDQVBFKSB7CisJCQl2dHlfZXNjYXBlX21hcChidWZbaV0sIHZ0eSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFByZS1lc2NhcGUgc3RhdHVzLiAqLworCQlpZiAodnR5LT5lc2NhcGUgPT0gVlRZX1BSRV9FU0NBUEUpIHsKKwkJCXN3aXRjaCAoYnVmW2ldKSB7CisJCQljYXNlICdbJzoKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9FU0NBUEU7CisJCQkJYnJlYWs7CisJCQljYXNlICdiJzoKKwkJCQl2dHlfYmFja3dhcmRfd29yZCh2dHkpOworCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2YnOgorCQkJCXZ0eV9mb3J3YXJkX3dvcmQodnR5KTsKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7CisJCQkJYnJlYWs7CisJCQljYXNlICdkJzoKKwkJCQl2dHlfZm9yd2FyZF9raWxsX3dvcmQodnR5KTsKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7CisJCQkJYnJlYWs7CisJCQljYXNlIENPTlRST0woJ0gnKToKKwkJCWNhc2UgMHg3ZjoKKwkJCQl2dHlfYmFja3dhcmRfa2lsbF93b3JkKHZ0eSk7CisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaCAoYnVmW2ldKSB7CisJCWNhc2UgQ09OVFJPTCgnQScpOgorCQkJdnR5X2JlZ2lubmluZ19vZl9saW5lKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdCJyk6CisJCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnQycpOgorCQkJdnR5X3N0b3BfaW5wdXQodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0QnKToKKwkJCXZ0eV9kZWxldGVfY2hhcih2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnRScpOgorCQkJdnR5X2VuZF9vZl9saW5lKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdGJyk6CisJCQl2dHlfZm9yd2FyZF9jaGFyKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdIJyk6CisJCWNhc2UgMHg3ZjoKKwkJCXZ0eV9kZWxldGVfYmFja3dhcmRfY2hhcih2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnSycpOgorCQkJdnR5X2tpbGxfbGluZSh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnTicpOgorCQkJdnR5X25leHRfbGluZSh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnUCcpOgorCQkJdnR5X3ByZXZpb3VzX2xpbmUodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ1QnKToKKwkJCXZ0eV90cmFuc3Bvc2VfY2hhcnModnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ1UnKToKKwkJCXZ0eV9raWxsX2xpbmVfZnJvbV9iZWdpbm5pbmcodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ1cnKToKKwkJCXZ0eV9iYWNrd2FyZF9raWxsX3dvcmQodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ1onKToKKwkJCXZ0eV9lbmRfY29uZmlnKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSAnXG4nOgorCQljYXNlICdccic6CisJCQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCQkJdnR5X2V4ZWN1dGUodnR5KTsKKwkJCWJyZWFrOworCQljYXNlICdcdCc6CisJCQl2dHlfY29tcGxldGVfY29tbWFuZCh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJaWYgKHZ0eS0+bm9kZSA9PSBBVVRIX05PREUKKwkJCSAgICB8fCB2dHktPm5vZGUgPT0gQVVUSF9FTkFCTEVfTk9ERSkKKwkJCQl2dHlfc2VsZl9pbnNlcnQodnR5LCBidWZbaV0pOworCQkJZWxzZQorCQkJCXZ0eV9kZXNjcmliZV9jb21tYW5kKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSAnXDAzMyc6CisJCQlpZiAoaSArIDEgPCBuYnl0ZXMgJiYgYnVmW2kgKyAxXSA9PSAnWycpIHsKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9FU0NBUEU7CisJCQkJaSsrOworCQkJfSBlbHNlCisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfUFJFX0VTQ0FQRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKGJ1ZltpXSA+IDMxICYmIGJ1ZltpXSA8IDEyNykKKwkJCQl2dHlfc2VsZl9pbnNlcnQodnR5LCBidWZbaV0pOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBDaGVjayBzdGF0dXMuICovCisJaWYgKHZ0eS0+c3RhdHVzID09IFZUWV9DTE9TRSkKKwkJdnR5X2Nsb3NlKHZ0eSk7CisJZWxzZSB7CisJCXZ0eV9ldmVudChWVFlfV1JJVEUsIHZ0eV9zb2NrLCB2dHkpOworCQl2dHlfZXZlbnQoVlRZX1JFQUQsIHZ0eV9zb2NrLCB2dHkpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogUmVhZCB1cCBjb25maWd1cmF0aW9uIGZpbGUgKi8KK3N0YXRpYyBpbnQKK3Z0eV9yZWFkX2ZpbGUoRklMRSAqY29uZnApCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdnR5ICp2dHk7CisKKwl2dHkgPSB2dHlfbmV3KCk7CisJdnR5LT5mZCA9IDA7CisJdnR5LT50eXBlID0gVlRZX0ZJTEU7CisJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisKKwlyZXQgPSBjb25maWdfZnJvbV9maWxlKHZ0eSwgY29uZnApOworCisJaWYgKHJldCAhPSBDTURfU1VDQ0VTUykgeworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIENNRF9FUlJfQU1CSUdVT1VTOgorCQkJZnByaW50ZihzdGRlcnIsICJBbWJpZ3VvdXMgY29tbWFuZC5cbiIpOworCQkJYnJlYWs7CisJCWNhc2UgQ01EX0VSUl9OT19NQVRDSDoKKwkJCWZwcmludGYoc3RkZXJyLCAiVGhlcmUgaXMgbm8gc3VjaCBjb21tYW5kLlxuIik7CisJCQlicmVhazsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIG9jY3VycmVkIGR1cmluZyByZWFkaW5nIGJlbG93ICIKKwkJCSJsaW5lOlxuJXNcbiIsIHZ0eS0+YnVmKTsKKwkJdnR5X2Nsb3NlKHZ0eSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZ0eV9jbG9zZSh2dHkpOworCXJldHVybiAwOworfQorCisvKiBDcmVhdGUgbmV3IHZ0eSBzdHJ1Y3R1cmUuICovCitzdHJ1Y3QgdnR5ICoKK3Z0eV9jcmVhdGUgKGludCB2dHlfc29jaywgdm9pZCAqcHJpdikKK3sKKyAgc3RydWN0IHZ0eSAqdnR5OworCisJc3RydWN0IHRlcm1pb3MgdDsKKworCXRjZ2V0YXR0cih2dHlfc29jaywgJnQpOworCWNmbWFrZXJhdygmdCk7CisJdGNzZXRhdHRyKHZ0eV9zb2NrLCBUQ1NBTk9XLCAmdCk7CisKKyAgLyogQWxsb2NhdGUgbmV3IHZ0eSBzdHJ1Y3R1cmUgYW5kIHNldCB1cCBkZWZhdWx0IHZhbHVlcy4gKi8KKyAgdnR5ID0gdnR5X25ldyAoKTsKKyAgdnR5LT5mZCA9IHZ0eV9zb2NrOworICB2dHktPnByaXYgPSBwcml2OworICB2dHktPnR5cGUgPSBWVFlfVEVSTTsKKyAgaWYgKG5vX3Bhc3N3b3JkX2NoZWNrKQorICAgIHsKKyAgICAgIGlmIChob3N0LmFkdmFuY2VkKQorCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworICAgICAgZWxzZQorCXZ0eS0+bm9kZSA9IFZJRVdfTk9ERTsKKyAgICB9CisgIGVsc2UKKyAgICB2dHktPm5vZGUgPSBBVVRIX05PREU7CisgIHZ0eS0+ZmFpbCA9IDA7CisgIHZ0eS0+Y3AgPSAwOworICB2dHlfY2xlYXJfYnVmICh2dHkpOworICB2dHktPmxlbmd0aCA9IDA7CisgIG1lbXNldCAodnR5LT5oaXN0LCAwLCBzaXplb2YgKHZ0eS0+aGlzdCkpOworICB2dHktPmhwID0gMDsKKyAgdnR5LT5oaW5kZXggPSAwOworICB2ZWN0b3Jfc2V0X2luZGV4ICh2dHl2ZWMsIHZ0eV9zb2NrLCB2dHkpOworICB2dHktPnN0YXR1cyA9IFZUWV9OT1JNQUw7CisgIGlmIChob3N0LmxpbmVzID49IDApCisgICAgdnR5LT5saW5lcyA9IGhvc3QubGluZXM7CisgIGVsc2UKKyAgICB2dHktPmxpbmVzID0gLTE7CisKKyAgaWYgKCEgbm9fcGFzc3dvcmRfY2hlY2spCisgICAgeworICAgICAgLyogVnR5IGlzIG5vdCBhdmFpbGFibGUgaWYgcGFzc3dvcmQgaXNuJ3Qgc2V0LiAqLworICAgICAgaWYgKGhvc3QucGFzc3dvcmQgPT0gTlVMTCAmJiBob3N0LnBhc3N3b3JkX2VuY3J5cHQgPT0gTlVMTCkKKwl7CisJICB2dHlfb3V0ICh2dHksICJWdHkgcGFzc3dvcmQgaXMgbm90IHNldC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkgIHZ0eS0+c3RhdHVzID0gVlRZX0NMT1NFOworCSAgdnR5X2Nsb3NlICh2dHkpOworCSAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICAvKiBTYXkgaGVsbG8gdG8gdGhlIHdvcmxkLiAqLworICB2dHlfaGVsbG8gKHZ0eSk7CisgIGlmICghIG5vX3Bhc3N3b3JkX2NoZWNrKQorICAgIHZ0eV9vdXQgKHZ0eSwgIiVzVXNlciBBY2Nlc3MgVmVyaWZpY2F0aW9uJXMlcyIsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUpOworCisgIC8qIFNldHRpbmcgdXAgdGVybWluYWwuICovCisgIHZ0eV93aWxsX2VjaG8gKHZ0eSk7CisgIHZ0eV93aWxsX3N1cHByZXNzX2dvX2FoZWFkICh2dHkpOworCisgIHZ0eV9kb250X2xpbmVtb2RlICh2dHkpOworICB2dHlfZG9fd2luZG93X3NpemUgKHZ0eSk7CisgIC8qIHZ0eV9kb250X2xmbG93X2FoZWFkICh2dHkpOyAqLworCisgIHZ0eV9wcm9tcHQgKHZ0eSk7CisKKyAgLyogQWRkIHJlYWQvd3JpdGUgdGhyZWFkLiAqLworICB2dHlfZXZlbnQgKFZUWV9XUklURSwgdnR5X3NvY2ssIHZ0eSk7CisgIHZ0eV9ldmVudCAoVlRZX1JFQUQsIHZ0eV9zb2NrLCB2dHkpOworCisgIHJldHVybiB2dHk7Cit9CisKK0RFRlVOKGNvbmZpZ193aG8sIGNvbmZpZ193aG9fY21kLCAid2hvIiwgIkRpc3BsYXkgd2hvIGlzIG9uIHZ0eVxuIikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgdnR5ICp2OworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodnR5dmVjKTsgaSsrKQorCQlpZiAoKHYgPSB2ZWN0b3Jfc2xvdCh2dHl2ZWMsIGkpKSAhPSBOVUxMKQorCQkJdnR5X291dCh2dHksICIlc3Z0eVslZF0gJXMiLAorCQkJCXYtPmNvbmZpZyA/ICIqIiA6ICIgIiwgaSwgVlRZX05FV0xJTkUpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogTW92ZSB0byB2dHkgY29uZmlndXJhdGlvbiBtb2RlLiAqLworREVGVU4obGluZV92dHksCisgICAgICBsaW5lX3Z0eV9jbWQsCisgICAgICAibGluZSB2dHkiLCAiQ29uZmlndXJlIGEgdGVybWluYWwgbGluZVxuIiAiVmlydHVhbCB0ZXJtaW5hbFxuIikKK3sKKwl2dHktPm5vZGUgPSBWVFlfTk9ERTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIHZ0eSBsb2dpbi4gKi8KK0RFRlVOKHZ0eV9sb2dpbiwgdnR5X2xvZ2luX2NtZCwgImxvZ2luIiwgIkVuYWJsZSBwYXNzd29yZCBjaGVja2luZ1xuIikKK3sKKwlub19wYXNzd29yZF9jaGVjayA9IDA7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub192dHlfbG9naW4sCisgICAgICBub192dHlfbG9naW5fY21kLCAibm8gbG9naW4iLCBOT19TVFIgIkVuYWJsZSBwYXNzd29yZCBjaGVja2luZ1xuIikKK3sKKwlub19wYXNzd29yZF9jaGVjayA9IDE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihzZXJ2aWNlX2FkdmFuY2VkX3Z0eSwKKyAgICAgIHNlcnZpY2VfYWR2YW5jZWRfdnR5X2NtZCwKKyAgICAgICJzZXJ2aWNlIGFkdmFuY2VkLXZ0eSIsCisgICAgICAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIiAiRW5hYmxlIGFkdmFuY2VkIG1vZGUgdnR5IGludGVyZmFjZVxuIikKK3sKKwlob3N0LmFkdmFuY2VkID0gMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX3NlcnZpY2VfYWR2YW5jZWRfdnR5LAorICAgICAgbm9fc2VydmljZV9hZHZhbmNlZF92dHlfY21kLAorICAgICAgIm5vIHNlcnZpY2UgYWR2YW5jZWQtdnR5IiwKKyAgICAgIE5PX1NUUgorICAgICAgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIgIkVuYWJsZSBhZHZhbmNlZCBtb2RlIHZ0eSBpbnRlcmZhY2VcbiIpCit7CisJaG9zdC5hZHZhbmNlZCA9IDA7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTih0ZXJtaW5hbF9tb25pdG9yLAorICAgICAgdGVybWluYWxfbW9uaXRvcl9jbWQsCisgICAgICAidGVybWluYWwgbW9uaXRvciIsCisgICAgICAiU2V0IHRlcm1pbmFsIGxpbmUgcGFyYW1ldGVyc1xuIgorICAgICAgIkNvcHkgZGVidWcgb3V0cHV0IHRvIHRoZSBjdXJyZW50IHRlcm1pbmFsIGxpbmVcbiIpCit7CisJdnR5LT5tb25pdG9yID0gMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHRlcm1pbmFsX25vX21vbml0b3IsCisgICAgICB0ZXJtaW5hbF9ub19tb25pdG9yX2NtZCwKKyAgICAgICJ0ZXJtaW5hbCBubyBtb25pdG9yIiwKKyAgICAgICJTZXQgdGVybWluYWwgbGluZSBwYXJhbWV0ZXJzXG4iCisgICAgICBOT19TVFIgIkNvcHkgZGVidWcgb3V0cHV0IHRvIHRoZSBjdXJyZW50IHRlcm1pbmFsIGxpbmVcbiIpCit7CisJdnR5LT5tb25pdG9yID0gMDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNob3dfaGlzdG9yeSwKKyAgICAgIHNob3dfaGlzdG9yeV9jbWQsCisgICAgICAic2hvdyBoaXN0b3J5IiwgU0hPV19TVFIgIkRpc3BsYXkgdGhlIHNlc3Npb24gY29tbWFuZCBoaXN0b3J5XG4iKQoreworCWludCBpbmRleDsKKworCWZvciAoaW5kZXggPSB2dHktPmhpbmRleCArIDE7IGluZGV4ICE9IHZ0eS0+aGluZGV4OykgeworCQlpZiAoaW5kZXggPT0gVlRZX01BWEhJU1QpIHsKKwkJCWluZGV4ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZ0eS0+aGlzdFtpbmRleF0gIT0gTlVMTCkKKwkJCXZ0eV9vdXQodnR5LCAiICAlcyVzIiwgdnR5LT5oaXN0W2luZGV4XSwgVlRZX05FV0xJTkUpOworCisJCWluZGV4Kys7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBEaXNwbGF5IGN1cnJlbnQgY29uZmlndXJhdGlvbi4gKi8KK3N0YXRpYyBpbnQgdnR5X2NvbmZpZ193cml0ZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICJsaW5lIHZ0eSVzIiwgVlRZX05FV0xJTkUpOworCisJLyogbG9naW4gKi8KKwlpZiAobm9fcGFzc3dvcmRfY2hlY2spCisJCXZ0eV9vdXQodnR5LCAiIG5vIGxvZ2luJXMiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIiElcyIsIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RydWN0IGNtZF9ub2RlIHZ0eV9ub2RlID0geworCVZUWV9OT0RFLAorCSIlcyhjb25maWctbGluZSkjICIsCisJMSwKK307CisKKy8qIFJlc2V0IGFsbCBWVFkgc3RhdHVzLiAqLwordm9pZCB2dHlfcmVzZXQoKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCB2dHkgKnZ0eTsKKwlzdHJ1Y3QgdGhyZWFkICp2dHlfc2Vydl90aHJlYWQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2dHl2ZWMpOyBpKyspCisJCWlmICgodnR5ID0gdmVjdG9yX3Nsb3QodnR5dmVjLCBpKSkgIT0gTlVMTCkgeworCQkJYnVmZmVyX3Jlc2V0KHZ0eS0+b2J1Zik7CisJCQl2dHktPnN0YXR1cyA9IFZUWV9DTE9TRTsKKwkJCXZ0eV9jbG9zZSh2dHkpOworCQl9CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShWdnR5X3NlcnZfdGhyZWFkKTsgaSsrKQorCQlpZiAoKHZ0eV9zZXJ2X3RocmVhZCA9CisJCSAgICAgdmVjdG9yX3Nsb3QoVnZ0eV9zZXJ2X3RocmVhZCwgaSkpICE9IE5VTEwpIHsKKwkJCS8vdGhyZWFkX2NhbmNlbCAodnR5X3NlcnZfdGhyZWFkKTsKKwkJCXZlY3Rvcl9zbG90KFZ2dHlfc2Vydl90aHJlYWQsIGkpID0gTlVMTDsKKwkJCWNsb3NlKGkpOworCQl9Cit9CisKK3N0YXRpYyB2b2lkIHZ0eV9zYXZlX2N3ZCh2b2lkKQoreworCWNoYXIgY3dkW01BWFBBVEhMRU5dOworCWNoYXIgKmMgOworCisJYyA9IGdldGN3ZChjd2QsIE1BWFBBVEhMRU4pOworCisJaWYgKCFjKSB7CisJCWlmIChjaGRpcihTWVNDT05GRElSKSAhPSAwKQorCQkgICAgcGVycm9yKCJjaGRpciBmYWlsZWQiKTsKKwkJaWYgKGdldGN3ZChjd2QsIE1BWFBBVEhMRU4pID09IE5VTEwpCisJCSAgICBwZXJyb3IoImdldGN3ZCBmYWlsZWQiKTsKKwl9CisKKwl2dHlfY3dkID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2N0eCwgc3RybGVuKGN3ZCkgKyAxLCAic2F2ZV9jd2QiKTsKKwlzdHJjcHkodnR5X2N3ZCwgY3dkKTsKK30KKworY2hhciAqdnR5X2dldF9jd2QoKQoreworCXJldHVybiB2dHlfY3dkOworfQorCitpbnQgdnR5X3NoZWxsX3NlcnYoc3RydWN0IHZ0eSAqdnR5KQoreworCXJldHVybiB2dHktPnR5cGUgPT0gVlRZX1NIRUxMX1NFUlYgPyAxIDogMDsKK30KKwordm9pZCB2dHlfaW5pdF92dHlzaCgpCit7CisJdnR5dmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKK30KKworZXh0ZXJuIHZvaWQgKnRhbGxfYnNjX2N0eDsKKy8qIEluc3RhbGwgdnR5J3Mgb3duIGNvbW1hbmRzIGxpa2UgYHdobycgY29tbWFuZC4gKi8KK3ZvaWQgdnR5X2luaXQoKQoreworCXRhbGxfdnR5X2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAwLCAidnR5Iik7CisJdGFsbF92dHlfdmVjX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX3Z0eV9jdHgsIDAsICJ2dHlfdmVjdG9yIik7CisJdGFsbF92dHlfY21kX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX3Z0eV9jdHgsIDAsICJ2dHlfY29tbWFuZCIpOworCisJLyogRm9yIGZ1cnRoZXIgY29uZmlndXJhdGlvbiByZWFkLCBwcmVzZXJ2ZSBjdXJyZW50IGRpcmVjdG9yeS4gKi8KKwl2dHlfc2F2ZV9jd2QoKTsKKworCXZ0eXZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7CisKKwkvKiBJbnN0YWxsIGJncCB0b3Agbm9kZS4gKi8KKwlpbnN0YWxsX25vZGUoJnZ0eV9ub2RlLCB2dHlfY29uZmlnX3dyaXRlKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfd2hvX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfaGlzdG9yeV9jbWQpOworCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ193aG9fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZsaW5lX3Z0eV9jbWQpOworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnNlcnZpY2VfYWR2YW5jZWRfdnR5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9fc2VydmljZV9hZHZhbmNlZF92dHlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZzaG93X2hpc3RvcnlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZ0ZXJtaW5hbF9tb25pdG9yX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmdGVybWluYWxfbm9fbW9uaXRvcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJnNob3dfaGlzdG9yeV9jbWQpOworCisJaW5zdGFsbF9kZWZhdWx0KFZUWV9OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoVlRZX05PREUsICZ2dHlfbG9naW5fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVlRZX05PREUsICZub192dHlfbG9naW5fY21kKTsKK30KKworaW50IHZ0eV9yZWFkX2NvbmZpZ19maWxlKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSkKK3sKKwlGSUxFICpjZmlsZTsKKwlpbnQgcmM7CisKKwljZmlsZSA9IGZvcGVuKGZpbGVfbmFtZSwgInIiKTsKKwlpZiAoIWNmaWxlKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJjID0gdnR5X3JlYWRfZmlsZShjZmlsZSk7CisJZmNsb3NlKGNmaWxlKTsKKworCWhvc3RfY29uZmlnX3NldChmaWxlX25hbWUpOworCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdnR5X2ludGVyZmFjZS5jIGIvb3BlbmJzYy9zcmMvdnR5X2ludGVyZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTUwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlLmMKQEAgLTAsMCArMSwyMDUxIEBACisvKiBPcGVuQlNDIGludGVyZmFjZSB0byBxdWFnZ2EgVlRZICovCisvKiAoQykgMjAwOS0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8dnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDx2dHkvYnVmZmVyLmg+CisjaW5jbHVkZSA8dnR5L3Z0eS5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWVhc19yZXAuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldDsKKworc3RydWN0IGNtZF9ub2RlIG5ldF9ub2RlID0geworCUdTTU5FVF9OT0RFLAorCSIlcyhuZXR3b3JrKSMiLAorCTEsCit9OworCitzdHJ1Y3QgY21kX25vZGUgYnRzX25vZGUgPSB7CisJQlRTX05PREUsCisJIiVzKGJ0cykjIiwKKwkxLAorfTsKKworc3RydWN0IGNtZF9ub2RlIHRyeF9ub2RlID0geworCVRSWF9OT0RFLAorCSIlcyh0cngpIyIsCisJMSwKK307CisKK3N0cnVjdCBjbWRfbm9kZSB0c19ub2RlID0geworCVRTX05PREUsCisJIiVzKHRzKSMiLAorCTEsCit9OworCitzdGF0aWMgaW50IGR1bW15X2NvbmZpZ193cml0ZShzdHJ1Y3QgdnR5ICp2KQoreworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgbmV0X2R1bXBfbm1zdGF0ZShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fbm1fc3RhdGUgKm5tcykKK3sKKwl2dHlfb3V0KHZ0eSwiT3BlciAnJXMnLCBBZG1pbiAldSwgQXZhaWwgJyVzJyVzIiwKKwkJbm1fb3BzdGF0ZV9uYW1lKG5tcy0+b3BlcmF0aW9uYWwpLCBubXMtPmFkbWluaXN0cmF0aXZlLAorCQlubV9hdmFpbF9uYW1lKG5tcy0+YXZhaWxhYmlsaXR5KSwgVlRZX05FV0xJTkUpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3BjaGFuX2xvYWRfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgY2hhciAqcHJlZml4LAorCQkJCWNvbnN0IHN0cnVjdCBwY2hhbl9sb2FkICpwbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBsLT5wY2hhbik7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgbG9hZF9jb3VudGVyICpsYyA9ICZwbC0+cGNoYW5baV07CisJCXVuc2lnbmVkIGludCBwZXJjZW50OworCisJCWlmIChsYy0+dG90YWwgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXBlcmNlbnQgPSAobGMtPnVzZWQgKiAxMDApIC8gbGMtPnRvdGFsOworCisJCXZ0eV9vdXQodnR5LCAiJXMlMjBzOiAlM3UlJSAoJXUvJXUpJXMiLCBwcmVmaXgsCisJCQlnc21fcGNoYW5fbmFtZShpKSwgcGVyY2VudCwgbGMtPnVzZWQsIGxjLT50b3RhbCwKKwkJCVZUWV9ORVdMSU5FKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5ldF9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCXN0cnVjdCBwY2hhbl9sb2FkIHBsOworCisJdnR5X291dCh2dHksICJCU0MgaXMgb24gQ291bnRyeSBDb2RlICV1LCBOZXR3b3JrIENvZGUgJXUgIgorCQkiYW5kIGhhcyAldSBCVFMlcyIsIG5ldC0+Y291bnRyeV9jb2RlLCBuZXQtPm5ldHdvcmtfY29kZSwKKwkJbmV0LT5udW1fYnRzLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIExvbmcgbmV0d29yayBuYW1lOiAnJXMnJXMiLAorCQluZXQtPm5hbWVfbG9uZywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBTaG9ydCBuZXR3b3JrIG5hbWU6ICclcyclcyIsCisJCW5ldC0+bmFtZV9zaG9ydCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBBdXRoZW50aWNhdGlvbiBwb2xpY3k6ICVzJXMiLAorCQlnc21fYXV0aF9wb2xpY3lfbmFtZShuZXQtPmF1dGhfcG9saWN5KSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBMb2NhdGlvbiB1cGRhdGluZyByZWplY3QgY2F1c2U6ICV1JXMiLAorCQluZXQtPnJlamVjdF9jYXVzZSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBFbmNyeXB0aW9uOiBBNS8ldSVzIiwgbmV0LT5hNV9lbmNyeXB0aW9uLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIE5FQ0kgKFRDSC9IKTogJXUlcyIsIG5ldC0+bmVjaSwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBSUkxQIE1vZGU6ICVzJXMiLCBycmxwX21vZGVfbmFtZShuZXQtPnJybHAubW9kZSksCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgTU0gSW5mbzogJXMlcyIsIG5ldC0+c2VuZF9tbV9pbmZvID8gIk9uIiA6ICJPZmYiLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIEhhbmRvdmVyOiAlcyVzIiwgbmV0LT5oYW5kb3Zlci5hY3RpdmUgPyAiT24iIDogIk9mZiIsCisJCVZUWV9ORVdMSU5FKTsKKwluZXR3b3JrX2NoYW5fbG9hZCgmcGwsIG5ldCk7CisJdnR5X291dCh2dHksICIgIEN1cnJlbnQgQ2hhbm5lbCBMb2FkOiVzIiwgVlRZX05FV0xJTkUpOworCWR1bXBfcGNoYW5fbG9hZF92dHkodnR5LCAiICAgICIsICZwbCk7Cit9CisKK0RFRlVOKHNob3dfbmV0LCBzaG93X25ldF9jbWQsICJzaG93IG5ldHdvcmsiLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgR1NNIE5FVFdPUktcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXQ7CisJbmV0X2R1bXBfdnR5KHZ0eSwgbmV0KTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgZTFpc2xfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICplMWwpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisKKwlpZiAoIWUxbCkgeworCQl2dHlfb3V0KHZ0eSwgIiAgIE5vbmUlcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuOworCX0KKworCWxpbmUgPSBlMWwtPnRzLT5saW5lOworCisJdnR5X291dCh2dHksICIgICAgRTEgTGluZSAldSwgVHlwZSAlczogVGltZXNsb3QgJXUsIE1vZGUgJXMlcyIsCisJCWxpbmUtPm51bSwgbGluZS0+ZHJpdmVyLT5uYW1lLCBlMWwtPnRzLT5udW0sCisJCWUxaW5wX3NpZ250eXBlX25hbWUoZTFsLT50eXBlKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICAgIEUxIFRFSSAldSwgU0FQSSAldSVzIiwKKwkJZTFsLT50ZWksIGUxbC0+c2FwaSwgVlRZX05FV0xJTkUpOworfQorCitzdGF0aWMgdm9pZCBidHNfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBwY2hhbl9sb2FkIHBsOworCisJdnR5X291dCh2dHksICJCVFMgJXUgaXMgb2YgJXMgdHlwZSBpbiBiYW5kICVzLCBoYXMgQ0kgJXUgTEFDICV1LCAiCisJCSJCU0lDICV1LCBUU0MgJXUgYW5kICV1IFRSWCVzIiwKKwkJYnRzLT5uciwgYnRzdHlwZTJzdHIoYnRzLT50eXBlKSwgZ3NtX2JhbmRfbmFtZShidHMtPmJhbmQpLAorCQlidHMtPmNlbGxfaWRlbnRpdHksCisJCWJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlLCBidHMtPmJzaWMsIGJ0cy0+dHNjLCAKKwkJYnRzLT5udW1fdHJ4LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJNUyBNYXggcG93ZXI6ICV1IGRCbSVzIiwgYnRzLT5tc19tYXhfcG93ZXIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIk1pbmltdW0gUnggTGV2ZWwgZm9yIEFjY2VzczogJWkgZEJtJXMiLAorCQlyeGxldjJkYm0oYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLnJ4bGV2X2FjY19taW4pLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJDZWxsIFJlc2VsZWN0aW9uIEh5c3RlcmVzaXM6ICV1IGRCbSVzIiwKKwkJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLmNlbGxfcmVzZWxfaHlzdCoyLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJSQUNIIFRYLUludGVnZXI6ICV1JXMiLCBidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wudHhfaW50ZWdlciwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiUkFDSCBNYXggdHJhbnNtaXNzaW9uczogJXUlcyIsCisJCXJhY2hfbWF4X3RyYW5zX3JhdzJ2YWwoYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLm1heF90cmFucyksCisJCVZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLmNlbGxfYmFyKQorCQl2dHlfb3V0KHZ0eSwgIiAgQ0VMTCBJUyBCQVJSRUQlcyIsIFZUWV9ORVdMSU5FKTsKKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKGJ0cykpCisJCXZ0eV9vdXQodnR5LCAiICBVbml0IElEOiAldS8ldS8wLCBPTUwgU3RyZWFtIElEIDB4JTAyeCVzIiwKKwkJCWJ0cy0+aXBfYWNjZXNzLnNpdGVfaWQsIGJ0cy0+aXBfYWNjZXNzLmJ0c19pZCwKKwkJCWJ0cy0+b21sX3RlaSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBOTSBTdGF0ZTogIik7CisJbmV0X2R1bXBfbm1zdGF0ZSh2dHksICZidHMtPm5tX3N0YXRlKTsKKwl2dHlfb3V0KHZ0eSwgIiAgU2l0ZSBNZ3IgTk0gU3RhdGU6ICIpOworCW5ldF9kdW1wX25tc3RhdGUodnR5LCAmYnRzLT5zaXRlX21nci5ubV9zdGF0ZSk7CisJdnR5X291dCh2dHksICIgIFBhZ2luZzogRklYTUUgcGVuZGluZyByZXF1ZXN0cywgJXUgZnJlZSBzbG90cyVzIiwKKwkJYnRzLT5wYWdpbmcuYXZhaWxhYmxlX3Nsb3RzLCBWVFlfTkVXTElORSk7CisJaWYgKCFpc19pcGFjY2Vzc19idHMoYnRzKSkgeworCQl2dHlfb3V0KHZ0eSwgIiAgRTEgU2lnbmFsbGluZyBMaW5rOiVzIiwgVlRZX05FV0xJTkUpOworCQllMWlzbF9kdW1wX3Z0eSh2dHksIGJ0cy0+b21sX2xpbmspOworCX0KKwkvKiBGSVhNRTogb21sX2xpbmssIGNoYW5fZGVzYyAqLworCW1lbXNldCgmcGwsIDAsIHNpemVvZihwbCkpOworCWJ0c19jaGFuX2xvYWQoJnBsLCBidHMpOworCXZ0eV9vdXQodnR5LCAiICBDdXJyZW50IENoYW5uZWwgTG9hZDolcyIsIFZUWV9ORVdMSU5FKTsKKwlkdW1wX3BjaGFuX2xvYWRfdnR5KHZ0eSwgIiAgICAiLCAmcGwpOworfQorCitERUZVTihzaG93X2J0cywgc2hvd19idHNfY21kLCAic2hvdyBidHMgW251bWJlcl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgQlRTXG4iCisJCSJCVFMgbnVtYmVyIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKwlpbnQgYnRzX25yOworCisJaWYgKGFyZ2MgIT0gMCkgeworCQkvKiB1c2UgdGhlIEJUUyBudW1iZXIgdGhhdCB0aGUgdXNlciBoYXMgc3BlY2lmaWVkICovCisJCWJ0c19uciA9IGF0b2koYXJndlswXSk7CisJCWlmIChidHNfbnIgPiBuZXQtPm51bV9idHMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBCVFMgJyVzJyVzIiwgYXJndlswXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJYnRzX2R1bXBfdnR5KHZ0eSwgZ3NtX2J0c19udW0obmV0LCBidHNfbnIpKTsKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKwkvKiBwcmludCBhbGwgQlRTJ3MgKi8KKwlmb3IgKGJ0c19uciA9IDA7IGJ0c19uciA8IG5ldC0+bnVtX2J0czsgYnRzX25yKyspCisJCWJ0c19kdW1wX3Z0eSh2dHksIGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIHV0aWxpdHkgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBwYXJzZV9lMV9saW5rKHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZTFfbGluaywgY29uc3QgY2hhciAqbGluZSwKKwkJCSAgY29uc3QgY2hhciAqdHMsIGNvbnN0IGNoYXIgKnNzKQoreworCWUxX2xpbmstPmUxX25yID0gYXRvaShsaW5lKTsKKwllMV9saW5rLT5lMV90cyA9IGF0b2kodHMpOworCWlmICghc3RyY21wKHNzLCAiZnVsbCIpKQorCQllMV9saW5rLT5lMV90c19zcyA9IDI1NTsKKwllbHNlCisJCWUxX2xpbmstPmUxX3RzX3NzID0gYXRvaShzcyk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ193cml0ZV9lMV9saW5rKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMV9saW5rLAorCQkJCSBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaWYgKCFlMV9saW5rLT5lMV90cykKKwkJcmV0dXJuOworCisJaWYgKGUxX2xpbmstPmUxX3RzX3NzID09IDI1NSkKKwkJdnR5X291dCh2dHksICIlc2UxIGxpbmUgJXUgdGltZXNsb3QgJXUgc3ViLXNsb3QgZnVsbCVzIiwKKwkJCXByZWZpeCwgZTFfbGluay0+ZTFfbnIsIGUxX2xpbmstPmUxX3RzLCBWVFlfTkVXTElORSk7CisJZWxzZQorCQl2dHlfb3V0KHZ0eSwgIiVzZTEgbGluZSAldSB0aW1lc2xvdCAldSBzdWItc2xvdCAldSVzIiwKKwkJCXByZWZpeCwgZTFfbGluay0+ZTFfbnIsIGUxX2xpbmstPmUxX3RzLAorCQkJZTFfbGluay0+ZTFfdHNfc3MsIFZUWV9ORVdMSU5FKTsKK30KKworCitzdGF0aWMgdm9pZCBjb25maWdfd3JpdGVfdHNfc2luZ2xlKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cykKK3sKKwl2dHlfb3V0KHZ0eSwgIiAgICB0aW1lc2xvdCAldSVzIiwgdHMtPm5yLCBWVFlfTkVXTElORSk7CisJaWYgKHRzLT5wY2hhbiAhPSBHU01fUENIQU5fTk9ORSkKKwkJdnR5X291dCh2dHksICIgICAgIHBoeXNfY2hhbl9jb25maWcgJXMlcyIsCisJCQlnc21fcGNoYW5fbmFtZSh0cy0+cGNoYW4pLCBWVFlfTkVXTElORSk7CisJY29uZmlnX3dyaXRlX2UxX2xpbmsodnR5LCAmdHMtPmUxX2xpbmssICIgICAgICIpOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfd3JpdGVfdHJ4X3NpbmdsZShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCWludCBpOworCisJdnR5X291dCh2dHksICIgIHRyeCAldSVzIiwgdHJ4LT5uciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICAgYXJmY24gJXUlcyIsIHRyeC0+YXJmY24sIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgIG5vbWluYWwgcG93ZXIgJXUlcyIsIHRyeC0+bm9taW5hbF9wb3dlciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICAgbWF4X3Bvd2VyX3JlZCAldSVzIiwgdHJ4LT5tYXhfcG93ZXJfcmVkLCBWVFlfTkVXTElORSk7CisJY29uZmlnX3dyaXRlX2UxX2xpbmsodnR5LCAmdHJ4LT5yc2xfZTFfbGluaywgIiAgIHJzbCAiKTsKKwl2dHlfb3V0KHZ0eSwgIiAgIHJzbCBlMSB0ZWkgJXUlcyIsIHRyeC0+cnNsX3RlaSwgVlRZX05FV0xJTkUpOworCisJZm9yIChpID0gMDsgaSA8IFRSWF9OUl9UUzsgaSsrKQorCQljb25maWdfd3JpdGVfdHNfc2luZ2xlKHZ0eSwgJnRyeC0+dHNbaV0pOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfd3JpdGVfYnRzX3NpbmdsZShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJaW50IGk7CisKKwl2dHlfb3V0KHZ0eSwgIiBidHMgJXUlcyIsIGJ0cy0+bnIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgdHlwZSAlcyVzIiwgYnRzdHlwZTJzdHIoYnRzLT50eXBlKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBiYW5kICVzJXMiLCBnc21fYmFuZF9uYW1lKGJ0cy0+YmFuZCksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgY2VsbF9pZGVudGl0eSAldSVzIiwgYnRzLT5jZWxsX2lkZW50aXR5LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGxvY2F0aW9uX2FyZWFfY29kZSAldSVzIiwgYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUsCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSAldSVzIiwgYnRzLT50c2MsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgJXUlcyIsIGJ0cy0+YnNpYywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBtcyBtYXggcG93ZXIgJXUlcyIsIGJ0cy0+bXNfbWF4X3Bvd2VyLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGNlbGwgcmVzZWxlY3Rpb24gaHlzdGVyZXNpcyAldSVzIiwKKwkJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLmNlbGxfcmVzZWxfaHlzdCoyLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIHJ4bGV2IGFjY2VzcyBtaW4gJXUlcyIsCisJCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5yeGxldl9hY2NfbWluLCBWVFlfTkVXTElORSk7CisJaWYgKGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy50MzIxMikKKwkJdnR5X291dCh2dHksICIgIHBlcmlvZGljIGxvY2F0aW9uIHVwZGF0ZSAldSVzIiwKKwkJCWJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy50MzIxMiAqIDEwLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGNoYW5uZWwgYWxsb2NhdG9yICVzJXMiLAorCQlidHMtPmNoYW5fYWxsb2NfcmV2ZXJzZSA/ICJkZXNjZW5kaW5nIiA6ICJhc2NlbmRpbmciLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIHJhY2ggdHggaW50ZWdlciAldSVzIiwKKwkJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLnR4X2ludGVnZXIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgcmFjaCBtYXggdHJhbnNtaXNzaW9uICV1JXMiLAorCQlyYWNoX21heF90cmFuc19yYXcydmFsKGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5tYXhfdHJhbnMpLAorCQlWVFlfTkVXTElORSk7CisJaWYgKGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5jZWxsX2JhcikKKwkJdnR5X291dCh2dHksICIgIGNlbGwgYmFycmVkIDElcyIsIFZUWV9ORVdMSU5FKTsKKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKGJ0cykpIHsKKwkJdnR5X291dCh2dHksICIgIGlwLmFjY2VzcyB1bml0X2lkICV1ICV1JXMiLAorCQkJYnRzLT5pcF9hY2Nlc3Muc2l0ZV9pZCwgYnRzLT5pcF9hY2Nlc3MuYnRzX2lkLCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICBvbWwgaXAuYWNjZXNzIHN0cmVhbV9pZCAldSVzIiwgYnRzLT5vbWxfdGVpLCBWVFlfTkVXTElORSk7CisJfSBlbHNlIHsKKwkJY29uZmlnX3dyaXRlX2UxX2xpbmsodnR5LCAmYnRzLT5vbWxfZTFfbGluaywgIiAgb21sICIpOworCQl2dHlfb3V0KHZ0eSwgIiAgb21sIGUxIHRlaSAldSVzIiwgYnRzLT5vbWxfdGVpLCBWVFlfTkVXTElORSk7CisJfQorCXZ0eV9vdXQodnR5LCAiICBncHJzIGVuYWJsZWQgJXUlcyIsIGJ0cy0+Z3Bycy5lbmFibGVkLCBWVFlfTkVXTElORSk7CisJaWYgKGJ0cy0+Z3Bycy5lbmFibGVkKSB7CisJCXZ0eV9vdXQodnR5LCAiICBncHJzIHJvdXRpbmcgYXJlYSAldSVzIiwgYnRzLT5ncHJzLnJhYywKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgIGdwcnMgY2VsbCBidmNpICV1JXMiLCBidHMtPmdwcnMuY2VsbC5idmNpLAorCQkJVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc2VpICV1JXMiLCBidHMtPmdwcnMubnNlLm5zZWksCisJCQlWVFlfTkVXTElORSk7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ0cy0+Z3Bycy5uc3ZjKTsgaSsrKSB7CisJCQlzdHJ1Y3QgZ3NtX2J0c19ncHJzX25zdmMgKm5zdmMgPQorCQkJCQkJJmJ0cy0+Z3Bycy5uc3ZjW2ldOworCQkJc3RydWN0IGluX2FkZHIgaWE7CisKKwkJCWlhLnNfYWRkciA9IGh0b25sKG5zdmMtPnJlbW90ZV9pcCk7CisJCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc3ZjICV1IG5zdmNpICV1JXMiLCBpLAorCQkJCW5zdmMtPm5zdmNpLCBWVFlfTkVXTElORSk7CisJCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc3ZjICV1IGxvY2FsIHVkcCBwb3J0ICV1JXMiLCBpLAorCQkJCW5zdmMtPmxvY2FsX3BvcnQsIFZUWV9ORVdMSU5FKTsKKwkJCXZ0eV9vdXQodnR5LCAiICBncHJzIG5zdmMgJXUgcmVtb3RlIHVkcCBwb3J0ICV1JXMiLCBpLAorCQkJCW5zdmMtPnJlbW90ZV9wb3J0LCBWVFlfTkVXTElORSk7CisJCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBuc3ZjICV1IHJlbW90ZSBpcCAlcyVzIiwgaSwKKwkJCQlpbmV0X250b2EoaWEpLCBWVFlfTkVXTElORSk7CisJCX0KKwl9CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KQorCQljb25maWdfd3JpdGVfdHJ4X3NpbmdsZSh2dHksIHRyeCk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3dyaXRlX2J0cyhzdHJ1Y3QgdnR5ICp2KQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShidHMsICZnc21uZXQtPmJ0c19saXN0LCBsaXN0KQorCQljb25maWdfd3JpdGVfYnRzX3NpbmdsZSh2LCBidHMpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgaW50IGNvbmZpZ193cml0ZV9uZXQoc3RydWN0IHZ0eSAqdnR5KQoreworCXZ0eV9vdXQodnR5LCAibmV0d29yayVzIiwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIG5ldHdvcmsgY291bnRyeSBjb2RlICV1JXMiLCBnc21uZXQtPmNvdW50cnlfY29kZSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIG1vYmlsZSBuZXR3b3JrIGNvZGUgJXUlcyIsIGdzbW5ldC0+bmV0d29ya19jb2RlLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgc2hvcnQgbmFtZSAlcyVzIiwgZ3NtbmV0LT5uYW1lX3Nob3J0LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbG9uZyBuYW1lICVzJXMiLCBnc21uZXQtPm5hbWVfbG9uZywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGF1dGggcG9saWN5ICVzJXMiLCBnc21fYXV0aF9wb2xpY3lfbmFtZShnc21uZXQtPmF1dGhfcG9saWN5KSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGxvY2F0aW9uIHVwZGF0aW5nIHJlamVjdCBjYXVzZSAldSVzIiwKKwkJZ3NtbmV0LT5yZWplY3RfY2F1c2UsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBlbmNyeXB0aW9uIGE1ICV1JXMiLCBnc21uZXQtPmE1X2VuY3J5cHRpb24sIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBuZWNpICV1JXMiLCBnc21uZXQtPm5lY2ksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBycmxwIG1vZGUgJXMlcyIsIHJybHBfbW9kZV9uYW1lKGdzbW5ldC0+cnJscC5tb2RlKSwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIG1tIGluZm8gJXUlcyIsIGdzbW5ldC0+c2VuZF9tbV9pbmZvLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgaGFuZG92ZXIgJXUlcyIsIGdzbW5ldC0+aGFuZG92ZXIuYWN0aXZlLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgaGFuZG92ZXIgd2luZG93IHJ4bGV2IGF2ZXJhZ2luZyAldSVzIiwKKwkJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhsZXZfYXZnLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgaGFuZG92ZXIgd2luZG93IHJ4cXVhbCBhdmVyYWdpbmcgJXUlcyIsCisJCWdzbW5ldC0+aGFuZG92ZXIud2luX3J4cXVhbF9hdmcsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciB3aW5kb3cgcnhsZXYgbmVpZ2hib3IgYXZlcmFnaW5nICV1JXMiLAorCQlnc21uZXQtPmhhbmRvdmVyLndpbl9yeGxldl9hdmdfbmVpZ2gsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciBwb3dlciBidWRnZXQgaW50ZXJ2YWwgJXUlcyIsCisJCWdzbW5ldC0+aGFuZG92ZXIucHdyX2ludGVydmFsLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgaGFuZG92ZXIgcG93ZXIgYnVkZ2V0IGh5c3RlcmVzaXMgJXUlcyIsCisJCWdzbW5ldC0+aGFuZG92ZXIucHdyX2h5c3RlcmVzaXMsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciBtYXhpbXVtIGRpc3RhbmNlICV1JXMiLAorCQlnc21uZXQtPmhhbmRvdmVyLm1heF9kaXN0YW5jZSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTAxICV1JXMiLCBnc21uZXQtPlQzMTAxLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMDMgJXUlcyIsIGdzbW5ldC0+VDMxMDMsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzEwNSAldSVzIiwgZ3NtbmV0LT5UMzEwNSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTA3ICV1JXMiLCBnc21uZXQtPlQzMTA3LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMDkgJXUlcyIsIGdzbW5ldC0+VDMxMDksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzExMSAldSVzIiwgZ3NtbmV0LT5UMzExMSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTEzICV1JXMiLCBnc21uZXQtPlQzMTEzLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMTUgJXUlcyIsIGdzbW5ldC0+VDMxMTUsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzExNyAldSVzIiwgZ3NtbmV0LT5UMzExNywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTE5ICV1JXMiLCBnc21uZXQtPlQzMTE5LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxNDEgJXUlcyIsIGdzbW5ldC0+VDMxNDEsIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgdHJ4X2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJdnR5X291dCh2dHksICJUUlggJXUgb2YgQlRTICV1IGlzIG9uIEFSRkNOICV1JXMiLAorCQl0cngtPm5yLCB0cngtPmJ0cy0+bnIsIHRyeC0+YXJmY24sIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgUkYgTm9taW5hbCBQb3dlcjogJWQgZEJtLCByZWR1Y2VkIGJ5ICV1IGRCLCAiCisJCSJyZXN1bHRpbmcgQlMgcG93ZXI6ICVkIGRCbSVzIiwKKwkJdHJ4LT5ub21pbmFsX3Bvd2VyLCB0cngtPm1heF9wb3dlcl9yZWQsCisJCXRyeC0+bm9taW5hbF9wb3dlciAtIHRyeC0+bWF4X3Bvd2VyX3JlZCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBOTSBTdGF0ZTogIik7CisJbmV0X2R1bXBfbm1zdGF0ZSh2dHksICZ0cngtPm5tX3N0YXRlKTsKKwl2dHlfb3V0KHZ0eSwgIiAgQmFzZWJhbmQgVHJhbnNjZWl2ZXIgTk0gU3RhdGU6ICIpOworCW5ldF9kdW1wX25tc3RhdGUodnR5LCAmdHJ4LT5iYl90cmFuc2Mubm1fc3RhdGUpOworCWlmIChpc19pcGFjY2Vzc19idHModHJ4LT5idHMpKSB7CisJCXZ0eV9vdXQodnR5LCAiICBpcC5hY2Nlc3Mgc3RyZWFtIElEOiAweCUwMnglcyIsCisJCQl0cngtPnJzbF90ZWksIFZUWV9ORVdMSU5FKTsKKwl9IGVsc2UgeworCQl2dHlfb3V0KHZ0eSwgIiAgRTEgU2lnbmFsbGluZyBMaW5rOiVzIiwgVlRZX05FV0xJTkUpOworCQllMWlzbF9kdW1wX3Z0eSh2dHksIHRyeC0+cnNsX2xpbmspOworCX0KK30KKworREVGVU4oc2hvd190cngsCisgICAgICBzaG93X3RyeF9jbWQsCisgICAgICAic2hvdyB0cnggW2J0c19ucl0gW3RyeF9ucl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgVFJYXG4iKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0OworCXN0cnVjdCBnc21fYnRzICpidHMgPSBOVUxMOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCWludCBidHNfbnIsIHRyeF9ucjsKKworCWlmIChhcmdjID49IDEpIHsKKwkJLyogdXNlIHRoZSBCVFMgbnVtYmVyIHRoYXQgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCAqLworCQlidHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCQlpZiAoYnRzX25yID49IG5ldC0+bnVtX2J0cykgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIEJUUyAnJXMnJXMiLCBhcmd2WzBdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJfQorCWlmIChhcmdjID49IDIpIHsKKwkJdHJ4X25yID0gYXRvaShhcmd2WzFdKTsKKwkJaWYgKHRyeF9uciA+PSBidHMtPm51bV90cngpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBUUlggJyVzJyVzIiwgYXJndlsxXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwkJdHJ4X2R1bXBfdnR5KHZ0eSwgdHJ4KTsKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKwlpZiAoYnRzKSB7CisJCS8qIHByaW50IGFsbCBUUlggaW4gdGhpcyBCVFMgKi8KKwkJZm9yICh0cnhfbnIgPSAwOyB0cnhfbnIgPCBidHMtPm51bV90cng7IHRyeF9ucisrKSB7CisJCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfbnIpOworCQkJdHJ4X2R1bXBfdnR5KHZ0eSwgdHJ4KTsKKwkJfQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCisJZm9yIChidHNfbnIgPSAwOyBidHNfbnIgPCBuZXQtPm51bV9idHM7IGJ0c19ucisrKSB7CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwkJZm9yICh0cnhfbnIgPSAwOyB0cnhfbnIgPCBidHMtPm51bV90cng7IHRyeF9ucisrKSB7CisJCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfbnIpOworCQkJdHJ4X2R1bXBfdnR5KHZ0eSwgdHJ4KTsKKwkJfQorCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitzdGF0aWMgdm9pZCB0c19kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpCit7CisJdnR5X291dCh2dHksICJUaW1lc2xvdCAldSBvZiBUUlggJXUgaW4gQlRTICV1LCBwaHlzIGNmZyAlcyVzIiwKKwkJdHMtPm5yLCB0cy0+dHJ4LT5uciwgdHMtPnRyeC0+YnRzLT5uciwKKwkJZ3NtX3BjaGFuX25hbWUodHMtPnBjaGFuKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBOTSBTdGF0ZTogIik7CisJbmV0X2R1bXBfbm1zdGF0ZSh2dHksICZ0cy0+bm1fc3RhdGUpOworCWlmICghaXNfaXBhY2Nlc3NfYnRzKHRzLT50cngtPmJ0cykpCisJCXZ0eV9vdXQodnR5LCAiICBFMSBMaW5lICV1LCBUaW1lc2xvdCAldSwgU3Vic2xvdCAldSVzIiwKKwkJCXRzLT5lMV9saW5rLmUxX25yLCB0cy0+ZTFfbGluay5lMV90cywKKwkJCXRzLT5lMV9saW5rLmUxX3RzX3NzLCBWVFlfTkVXTElORSk7Cit9CisKK0RFRlVOKHNob3dfdHMsCisgICAgICBzaG93X3RzX2NtZCwKKyAgICAgICJzaG93IHRpbWVzbG90IFtidHNfbnJdIFt0cnhfbnJdIFt0c19ucl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgVFNcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXQ7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCWludCBidHNfbnIsIHRyeF9uciwgdHNfbnI7CisKKwlpZiAoYXJnYyA+PSAxKSB7CisJCS8qIHVzZSB0aGUgQlRTIG51bWJlciB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgKi8KKwkJYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwkJaWYgKGJ0c19uciA+PSBuZXQtPm51bV9idHMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBCVFMgJyVzJyVzIiwgYXJndlswXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCX0KKwlpZiAoYXJnYyA+PSAyKSB7CisJCXRyeF9uciA9IGF0b2koYXJndlsxXSk7CisJCWlmICh0cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgVFJYICclcyclcyIsIGFyZ3ZbMV0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJfQorCWlmIChhcmdjID49IDMpIHsKKwkJdHNfbnIgPSBhdG9pKGFyZ3ZbMl0pOworCQlpZiAodHNfbnIgPj0gVFJYX05SX1RTKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgVFMgJyVzJyVzIiwgYXJndlsyXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHMgPSAmdHJ4LT50c1t0c19ucl07CisJCXRzX2R1bXBfdnR5KHZ0eSwgdHMpOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCWZvciAoYnRzX25yID0gMDsgYnRzX25yIDwgbmV0LT5udW1fYnRzOyBidHNfbnIrKykgeworCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJCWZvciAodHJ4X25yID0gMDsgdHJ4X25yIDwgYnRzLT5udW1fdHJ4OyB0cnhfbnIrKykgeworCQkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwkJCWZvciAodHNfbnIgPSAwOyB0c19uciA8IFRSWF9OUl9UUzsgdHNfbnIrKykgeworCQkJCXRzID0gJnRyeC0+dHNbdHNfbnJdOworCQkJCXRzX2R1bXBfdnR5KHZ0eSwgdHMpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBzdWJzY3JfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlpbnQgcmM7CisJc3RydWN0IGdzbV9hdXRoX2luZm8gYWluZm87CisJc3RydWN0IGdzbV9hdXRoX3R1cGxlIGF0dXBsZTsKKworCXZ0eV9vdXQodnR5LCAiICAgIElEOiAlbGx1LCBBdXRob3JpemVkOiAlZCVzIiwgc3Vic2NyLT5pZCwKKwkJc3Vic2NyLT5hdXRob3JpemVkLCBWVFlfTkVXTElORSk7CisJaWYgKHN1YnNjci0+bmFtZSkKKwkJdnR5X291dCh2dHksICIgICAgTmFtZTogJyVzJyVzIiwgc3Vic2NyLT5uYW1lLCBWVFlfTkVXTElORSk7CisJaWYgKHN1YnNjci0+ZXh0ZW5zaW9uKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBFeHRlbnNpb246ICVzJXMiLCBzdWJzY3ItPmV4dGVuc2lvbiwKKwkJCVZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5pbXNpKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBJTVNJOiAlcyVzIiwgc3Vic2NyLT5pbXNpLCBWVFlfTkVXTElORSk7CisJaWYgKHN1YnNjci0+dG1zaSAhPSBHU01fUkVTRVJWRURfVE1TSSkKKwkJdnR5X291dCh2dHksICIgICAgVE1TSTogJTA4WCVzIiwgc3Vic2NyLT50bXNpLAorCQkJVlRZX05FV0xJTkUpOworCisJdnR5X291dCh2dHksICIgICAgVXNlIGNvdW50OiAldSVzIiwgc3Vic2NyLT51c2VfY291bnQsIFZUWV9ORVdMSU5FKTsKK30KKworc3RhdGljIHZvaWQgbWVhc19yZXBfZHVtcF91bmlfdnR5KHN0cnVjdCB2dHkgKnZ0eSwKKwkJCQkgIHN0cnVjdCBnc21fbWVhc19yZXBfdW5pZGlyICptcnUsCisJCQkJICBjb25zdCBjaGFyICpwcmVmaXgsCisJCQkJICBjb25zdCBjaGFyICpkaXIpCit7CisJdnR5X291dCh2dHksICIlcyAgUlhMLUZVTEwtJXM6ICU0ZCBkQm0sIFJYTC1TVUItJXM6ICU0ZCBkQm0gIiwKKwkJcHJlZml4LCBkaXIsIHJ4bGV2MmRibShtcnUtPmZ1bGwucnhfbGV2KSwKKwkJCWRpciwgcnhsZXYyZGJtKG1ydS0+c3ViLnJ4X2xldikpOworCXZ0eV9vdXQodnR5LCAiUlhRLUZVTEwtJXM6ICVkLCBSWFEtU1VCLSVzOiAlZCVzIiwKKwkJZGlyLCBtcnUtPmZ1bGwucnhfcXVhbCwgZGlyLCBtcnUtPnN1Yi5yeF9xdWFsLAorCQlWVFlfTkVXTElORSk7Cit9CisKK3N0YXRpYyB2b2lkIG1lYXNfcmVwX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9tZWFzX3JlcCAqbXIsCisJCQkgICAgICBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJdnR5X291dCh2dHksICIlc01lYXN1cmVtZW50IFJlcG9ydDolcyIsIHByZWZpeCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiJXMgIEZsYWdzOiAlcyVzJXMlcyVzIiwgcHJlZml4LAorCQkJbXItPmZsYWdzICYgTUVBU19SRVBfRl9VTF9EVFggPyAiRFRYdSAiIDogIiIsCisJCQltci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0RMX0RUWCA/ICJEVFhkICIgOiAiIiwKKwkJCW1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRlBDID8gIkZQQyAiIDogIiIsCisJCQltci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0RMX1ZBTElEID8gIiAiIDogIkRMaW52YWwgIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9NU19UTykKKwkJdnR5X291dCh2dHksICIlcyAgTVMgVGltaW5nIE9mZnNldDogJXUlcyIsIHByZWZpeCwKKwkJCW1yLT5tc190aW1pbmdfb2Zmc2V0LCBWVFlfTkVXTElORSk7CisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfTVNfTDEpCisJCXZ0eV9vdXQodnR5LCAiJXMgIEwxIE1TIFBvd2VyOiAldSBkQm0sIFRpbWluZyBBZHZhbmNlOiAldSVzIiwKKwkJCXByZWZpeCwgbXItPm1zX2wxLnB3ciwgbXItPm1zX2wxLnRhLCBWVFlfTkVXTElORSk7CisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRExfVkFMSUQpCisJCW1lYXNfcmVwX2R1bXBfdW5pX3Z0eSh2dHksICZtci0+ZGwsIHByZWZpeCwgImRsIik7CisJbWVhc19yZXBfZHVtcF91bmlfdnR5KHZ0eSwgJm1yLT51bCwgcHJlZml4LCAidWwiKTsKK30KKworc3RhdGljIHZvaWQgbGNoYW5fZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlpbnQgaWR4OworCisJdnR5X291dCh2dHksICJMY2hhbiAldSBpbiBUaW1lc2xvdCAldSBvZiBUUlggJXUgaW4gQlRTICV1LCBUeXBlICVzJXMiLAorCQlsY2hhbi0+bnIsIGxjaGFuLT50cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgCisJCWxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBnc21fbGNoYW50X25hbWUobGNoYW4tPnR5cGUpLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIFVzZSBDb3VudDogJXUsIFN0YXRlOiAlcyVzIiwgbGNoYW4tPmNvbm4udXNlX2NvdW50LAorCQlnc21fbGNoYW5zX25hbWUobGNoYW4tPnN0YXRlKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBCUyBQb3dlcjogJXUgZEJtLCBNUyBQb3dlcjogJXUgZEJtJXMiLAorCQlsY2hhbi0+dHMtPnRyeC0+bm9taW5hbF9wb3dlciAtIGxjaGFuLT50cy0+dHJ4LT5tYXhfcG93ZXJfcmVkCisJCS0gbGNoYW4tPmJzX3Bvd2VyKjIsCisJCW1zX3B3cl9kYm0obGNoYW4tPnRzLT50cngtPmJ0cy0+YmFuZCwgbGNoYW4tPm1zX3Bvd2VyKSwKKwkJVlRZX05FV0xJTkUpOworCWlmIChsY2hhbi0+Y29ubi5zdWJzY3IpIHsKKwkJdnR5X291dCh2dHksICIgIFN1YnNjcmliZXI6JXMiLCBWVFlfTkVXTElORSk7CisJCXN1YnNjcl9kdW1wX3Z0eSh2dHksIGxjaGFuLT5jb25uLnN1YnNjcik7CisJfSBlbHNlCisJCXZ0eV9vdXQodnR5LCAiICBObyBTdWJzY3JpYmVyJXMiLCBWVFlfTkVXTElORSk7CisJaWYgKGlzX2lwYWNjZXNzX2J0cyhsY2hhbi0+dHMtPnRyeC0+YnRzKSkgeworCQlzdHJ1Y3QgaW5fYWRkciBpYTsKKwkJaWEuc19hZGRyID0gbGNoYW4tPmFiaXNfaXAuYm91bmRfaXA7CisJCXZ0eV9vdXQodnR5LCAiICBCb3VuZCBJUDogJXMgUG9ydCAldSBSVFBfVFlQRTI9JXUgQ09OTl9JRD0ldSVzIiwKKwkJCWluZXRfbnRvYShpYSksIGxjaGFuLT5hYmlzX2lwLmJvdW5kX3BvcnQsCisJCQlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIsIGxjaGFuLT5hYmlzX2lwLmNvbm5faWQsCisJCQlWVFlfTkVXTElORSk7CisJfQorCisJLyogd2Ugd2FudCB0byByZXBvcnQgdGhlIGxhc3QgbWVhc3VyZW1lbnQgcmVwb3J0ICovCisJaWR4ID0gY2FsY19pbml0aWFsX2lkeChBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCksCisJCQkgICAgICAgbGNoYW4tPm1lYXNfcmVwX2lkeCwgMSk7CisJbWVhc19yZXBfZHVtcF92dHkodnR5LCAmbGNoYW4tPm1lYXNfcmVwW2lkeF0sICIgICIpOworfQorCisjaWYgMAorVE9ETzogY2FsbHJlZiBhbmQgcmVtb3RlIGNhbGxyZWYgb2YgY2FsbCBtdXN0IGJlIHJlc29sdmVkIHRvIGdldCBnc21fdHJhbnMgb2JqZWN0CitzdGF0aWMgdm9pZCBjYWxsX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9jYWxsICpjYWxsKQoreworCXZ0eV9vdXQodnR5LCAiQ2FsbCBUeXBlICV1LCBTdGF0ZSAldSwgVHJhbnNhY3Rpb24gSUQgJXUlcyIsCisJCWNhbGwtPnR5cGUsIGNhbGwtPnN0YXRlLCBjYWxsLT50cmFuc2FjdGlvbl9pZCwgVlRZX05FV0xJTkUpOworCisJaWYgKGNhbGwtPmxvY2FsX2xjaGFuKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FsbCBMb2NhbCBDaGFubmVsOiVzIiwgVlRZX05FV0xJTkUpOworCQlsY2hhbl9kdW1wX3Z0eSh2dHksIGNhbGwtPmxvY2FsX2xjaGFuKTsKKwl9IGVsc2UKKwkJdnR5X291dCh2dHksICJDYWxsIGhhcyBubyBMb2NhbCBDaGFubmVsJXMiLCBWVFlfTkVXTElORSk7CisKKwlpZiAoY2FsbC0+cmVtb3RlX2xjaGFuKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FsbCBSZW1vdGUgQ2hhbm5lbDolcyIsIFZUWV9ORVdMSU5FKTsKKwkJbGNoYW5fZHVtcF92dHkodnR5LCBjYWxsLT5yZW1vdGVfbGNoYW4pOworCX0gZWxzZQorCQl2dHlfb3V0KHZ0eSwgIkNhbGwgaGFzIG5vIFJlbW90ZSBDaGFubmVsJXMiLCBWVFlfTkVXTElORSk7CisKKwlpZiAoY2FsbC0+Y2FsbGVkX3N1YnNjcikgeworCQl2dHlfb3V0KHZ0eSwgIkNhbGxlZCBTdWJzY3JpYmVyOiVzIiwgVlRZX05FV0xJTkUpOworCQlzdWJzY3JfZHVtcF92dHkodnR5LCBjYWxsLT5jYWxsZWRfc3Vic2NyKTsKKwl9IGVsc2UKKwkJdnR5X291dCh2dHksICJDYWxsIGhhcyBubyBDYWxsZWQgU3Vic2NyaWJlciVzIiwgVlRZX05FV0xJTkUpOworfQorI2VuZGlmCisKK0RFRlVOKHNob3dfbGNoYW4sCisgICAgICBzaG93X2xjaGFuX2NtZCwKKyAgICAgICJzaG93IGxjaGFuIFtidHNfbnJdIFt0cnhfbnJdIFt0c19ucl0gW2xjaGFuX25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBsb2dpY2FsIGNoYW5uZWxcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXQ7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCWludCBidHNfbnIsIHRyeF9uciwgdHNfbnIsIGxjaGFuX25yOworCisJaWYgKGFyZ2MgPj0gMSkgeworCQkvKiB1c2UgdGhlIEJUUyBudW1iZXIgdGhhdCB0aGUgdXNlciBoYXMgc3BlY2lmaWVkICovCisJCWJ0c19uciA9IGF0b2koYXJndlswXSk7CisJCWlmIChidHNfbnIgPj0gbmV0LT5udW1fYnRzKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgQlRTICVzJXMiLCBhcmd2WzBdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJfQorCWlmIChhcmdjID49IDIpIHsKKwkJdHJ4X25yID0gYXRvaShhcmd2WzFdKTsKKwkJaWYgKHRyeF9uciA+PSBidHMtPm51bV90cngpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBUUlggJXMlcyIsIGFyZ3ZbMV0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJfQorCWlmIChhcmdjID49IDMpIHsKKwkJdHNfbnIgPSBhdG9pKGFyZ3ZbMl0pOworCQlpZiAodHNfbnIgPj0gVFJYX05SX1RTKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgVFMgJXMlcyIsIGFyZ3ZbMl0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXRzID0gJnRyeC0+dHNbdHNfbnJdOworCX0KKwlpZiAoYXJnYyA+PSA0KSB7CisJCWxjaGFuX25yID0gYXRvaShhcmd2WzNdKTsKKwkJaWYgKGxjaGFuX25yID49IFRTX01BWF9MQ0hBTikgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIExDSEFOICVzJXMiLCBhcmd2WzNdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlsY2hhbiA9ICZ0cy0+bGNoYW5bbGNoYW5fbnJdOworCQlsY2hhbl9kdW1wX3Z0eSh2dHksIGxjaGFuKTsKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKwlmb3IgKGJ0c19uciA9IDA7IGJ0c19uciA8IG5ldC0+bnVtX2J0czsgYnRzX25yKyspIHsKKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCQlmb3IgKHRyeF9uciA9IDA7IHRyeF9uciA8IGJ0cy0+bnVtX3RyeDsgdHJ4X25yKyspIHsKKwkJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJCQlmb3IgKHRzX25yID0gMDsgdHNfbnIgPCBUUlhfTlJfVFM7IHRzX25yKyspIHsKKwkJCQl0cyA9ICZ0cngtPnRzW3RzX25yXTsKKwkJCQlmb3IgKGxjaGFuX25yID0gMDsgbGNoYW5fbnIgPCBUU19NQVhfTENIQU47CisJCQkJICAgICBsY2hhbl9ucisrKSB7CisJCQkJCWxjaGFuID0gJnRzLT5sY2hhbltsY2hhbl9ucl07CisJCQkJCWlmIChsY2hhbi0+dHlwZSA9PSBHU01fTENIQU5fTk9ORSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlsY2hhbl9kdW1wX3Z0eSh2dHksIGxjaGFuKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGUxZHJ2X2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGUxaW5wX2RyaXZlciAqZHJ2KQoreworCXZ0eV9vdXQodnR5LCAiRTEgSW5wdXQgRHJpdmVyICVzJXMiLCBkcnYtPm5hbWUsIFZUWV9ORVdMSU5FKTsKK30KKworREVGVU4oc2hvd19lMWRydiwKKyAgICAgIHNob3dfZTFkcnZfY21kLAorICAgICAgInNob3cgZTFfZHJpdmVyIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGUgRTEgZHJpdmVyc1xuIikKK3sKKwlzdHJ1Y3QgZTFpbnBfZHJpdmVyICpkcnY7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShkcnYsICZlMWlucF9kcml2ZXJfbGlzdCwgbGlzdCkKKwkJZTFkcnZfZHVtcF92dHkodnR5LCBkcnYpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBlMWxpbmVfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSkKK3sKKwl2dHlfb3V0KHZ0eSwgIkUxIExpbmUgTnVtYmVyICV1LCBOYW1lICVzLCBEcml2ZXIgJXMlcyIsCisJCWxpbmUtPm51bSwgbGluZS0+bmFtZSA/IGxpbmUtPm5hbWUgOiAiIiwKKwkJbGluZS0+ZHJpdmVyLT5uYW1lLCBWVFlfTkVXTElORSk7Cit9CisKK0RFRlVOKHNob3dfZTFsaW5lLAorICAgICAgc2hvd19lMWxpbmVfY21kLAorICAgICAgInNob3cgZTFfbGluZSBbbGluZV9ucl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgRTEgbGluZVxuIikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKworCWlmIChhcmdjID49IDEpIHsKKwkJaW50IG51bSA9IGF0b2koYXJndlswXSk7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmUsICZlMWlucF9saW5lX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChsaW5lLT5udW0gPT0gbnVtKSB7CisJCQkJZTFsaW5lX2R1bXBfdnR5KHZ0eSwgbGluZSk7CisJCQkJcmV0dXJuIENNRF9TVUNDRVNTOworCQkJfQorCQl9CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CQorCQorCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmUsICZlMWlucF9saW5lX2xpc3QsIGxpc3QpCisJCWUxbGluZV9kdW1wX3Z0eSh2dHksIGxpbmUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBlMXRzX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGUxaW5wX3RzICp0cykKK3sKKwlpZiAodHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9OT05FKQorCQlyZXR1cm47CisJdnR5X291dCh2dHksICJFMSBUaW1lc2xvdCAlMnUgb2YgTGluZSAldSBpcyBUeXBlICVzJXMiLAorCQl0cy0+bnVtLCB0cy0+bGluZS0+bnVtLCBlMWlucF90c3R5cGVfbmFtZSh0cy0+dHlwZSksCisJCVZUWV9ORVdMSU5FKTsKK30KKworREVGVU4oc2hvd19lMXRzLAorICAgICAgc2hvd19lMXRzX2NtZCwKKyAgICAgICJzaG93IGUxX3RpbWVzbG90IFtsaW5lX25yXSBbdHNfbnJdIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIEUxIHRpbWVzbG90XG4iKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gTlVMTDsKKwlzdHJ1Y3QgZTFpbnBfdHMgKnRzOworCWludCB0c19ucjsKKworCWlmIChhcmdjID09IDApIHsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkobGluZSwgJmUxaW5wX2xpbmVfbGlzdCwgbGlzdCkgeworCQkJZm9yICh0c19uciA9IDA7IHRzX25yIDwgTlVNX0UxX1RTOyB0c19ucisrKSB7CisJCQkJdHMgPSAmbGluZS0+dHNbdHNfbnJdOworCQkJCWUxdHNfZHVtcF92dHkodnR5LCB0cyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0KKwlpZiAoYXJnYyA+PSAxKSB7CisJCWludCBudW0gPSBhdG9pKGFyZ3ZbMF0pOworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5lLCAmZTFpbnBfbGluZV9saXN0LCBsaXN0KSB7CisJCQlpZiAobGluZS0+bnVtID09IG51bSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoIWxpbmUgfHwgbGluZS0+bnVtICE9IG51bSkgeworCQkJdnR5X291dCh2dHksICJFMSBsaW5lICVzIGlzIGludmFsaWQlcyIsCisJCQkJYXJndlswXSwgVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJfQkKKwlpZiAoYXJnYyA+PSAyKSB7CisJCXRzX25yID0gYXRvaShhcmd2WzFdKTsKKwkJaWYgKHRzX25yID4gTlVNX0UxX1RTKSB7CisJCQl2dHlfb3V0KHZ0eSwgIkUxIHRpbWVzbG90ICVzIGlzIGludmFsaWQlcyIsCisJCQkJYXJndlsxXSwgVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCXRzID0gJmxpbmUtPnRzW3RzX25yXTsKKwkJZTF0c19kdW1wX3Z0eSh2dHksIHRzKTsKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCX0gZWxzZSB7CisJCWZvciAodHNfbnIgPSAwOyB0c19uciA8IE5VTV9FMV9UUzsgdHNfbnIrKykgeworCQkJdHMgPSAmbGluZS0+dHNbdHNfbnJdOworCQkJZTF0c19kdW1wX3Z0eSh2dHksIHRzKTsKKwkJfQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgcGFnaW5nX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqcGFnKQoreworCXZ0eV9vdXQodnR5LCAiUGFnaW5nIG9uIEJUUyAldSVzIiwgcGFnLT5idHMtPm5yLCBWVFlfTkVXTElORSk7CisJc3Vic2NyX2R1bXBfdnR5KHZ0eSwgcGFnLT5zdWJzY3IpOworfQorCitzdGF0aWMgdm9pZCBidHNfcGFnaW5nX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpwYWc7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShwYWcsICZidHMtPnBhZ2luZy5wZW5kaW5nX3JlcXVlc3RzLCBlbnRyeSkKKwkJcGFnaW5nX2R1bXBfdnR5KHZ0eSwgcGFnKTsKK30KKworREVGVU4oc2hvd19wYWdpbmcsCisgICAgICBzaG93X3BhZ2luZ19jbWQsCisgICAgICAic2hvdyBwYWdpbmcgW2J0c19ucl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHBhZ2luZyByZXVxZXN0cyBvZiBhIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWludCBidHNfbnI7CisKKwlpZiAoYXJnYyA+PSAxKSB7CisJCS8qIHVzZSB0aGUgQlRTIG51bWJlciB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgKi8KKwkJYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwkJaWYgKGJ0c19uciA+PSBuZXQtPm51bV9idHMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBCVFMgJXMlcyIsIGFyZ3ZbMF0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwkJYnRzX3BhZ2luZ19kdW1wX3Z0eSh2dHksIGJ0cyk7CisJCQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCWZvciAoYnRzX25yID0gMDsgYnRzX25yIDwgbmV0LT5udW1fYnRzOyBidHNfbnIrKykgeworCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJCWJ0c19wYWdpbmdfZHVtcF92dHkodnR5LCBidHMpOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgX3Z0eV9vdXRwdXQoc3RydWN0IGxvZ190YXJnZXQgKnRndCwgY29uc3QgY2hhciAqbGluZSkKK3sKKwlzdHJ1Y3QgdnR5ICp2dHkgPSB0Z3QtPnRndF92dHkudnR5OworCXZ0eV9vdXQodnR5LCAiJXMiLCBsaW5lKTsKKwkvKiBUaGlzIGlzIGFuIHVnbHkgaGFjaywgYnV0IHRoZXJlIGlzIG5vIGVhc3kgd2F5Li4uICovCisJaWYgKHN0cmNocihsaW5lLCAnXG4nKSkKKwkJdnR5X291dCh2dHksICJcciIpOworfQorCitzdHJ1Y3QgbG9nX3RhcmdldCAqbG9nX3RhcmdldF9jcmVhdGVfdnR5KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlzdHJ1Y3QgbG9nX3RhcmdldCAqdGFyZ2V0OworCisJdGFyZ2V0ID0gbG9nX3RhcmdldF9jcmVhdGUoKTsKKwlpZiAoIXRhcmdldCkKKwkJcmV0dXJuIE5VTEw7CisKKwl0YXJnZXQtPnRndF92dHkudnR5ID0gdnR5OworCXRhcmdldC0+b3V0cHV0ID0gX3Z0eV9vdXRwdXQ7CisJcmV0dXJuIHRhcmdldDsKK30KKworREVGVU4oZW5hYmxlX2xvZ2dpbmcsCisgICAgICBlbmFibGVfbG9nZ2luZ19jbWQsCisgICAgICAibG9nZ2luZyBlbmFibGUiLAorICAgICAgIkVuYWJsZXMgbG9nZ2luZyB0byB0aGlzIHZ0eVxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKGNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgYWxyZWFkeSBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJY29ubi0+ZGJnID0gbG9nX3RhcmdldF9jcmVhdGVfdnR5KHZ0eSk7CisJaWYgKCFjb25uLT5kYmcpCisJCXJldHVybiBDTURfV0FSTklORzsKKworCWxvZ19hZGRfdGFyZ2V0KGNvbm4tPmRiZyk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihsb2dnaW5nX2ZsdHJfaW1zaSwKKyAgICAgIGxvZ2dpbmdfZmx0cl9pbXNpX2NtZCwKKyAgICAgICJsb2dnaW5nIGZpbHRlciBpbXNpIElNU0kiLAorICAgICAgIlByaW50IGFsbCBtZXNzYWdlcyByZWxhdGVkIHRvIGEgSU1TSVxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWxvZ19zZXRfaW1zaV9maWx0ZXIoY29ubi0+ZGJnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGxvZ2dpbmdfZmx0cl9hbGwsCisgICAgICBsb2dnaW5nX2ZsdHJfYWxsX2NtZCwKKyAgICAgICJsb2dnaW5nIGZpbHRlciBhbGwgPDAtMT4iLAorICAgICAgIlByaW50IGFsbCBtZXNzYWdlcyB0byB0aGUgY29uc29sZVxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWxvZ19zZXRfYWxsX2ZpbHRlcihjb25uLT5kYmcsIGF0b2koYXJndlswXSkpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obG9nZ2luZ191c2VfY2xyLAorICAgICAgbG9nZ2luZ191c2VfY2xyX2NtZCwKKyAgICAgICJsb2dnaW5nIGNvbG9yIDwwLTE+IiwKKyAgICAgICJVc2UgY29sb3IgZm9yIHByaW50aW5nIG1lc3NhZ2VzXG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJbG9nX3NldF91c2VfY29sb3IoY29ubi0+ZGJnLCBhdG9pKGFyZ3ZbMF0pKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGxvZ2dpbmdfcHJudF90aW1lc3RhbXAsCisgICAgICBsb2dnaW5nX3BybnRfdGltZXN0YW1wX2NtZCwKKyAgICAgICJsb2dnaW5nIHRpbWVzdGFtcCA8MC0xPiIsCisgICAgICAiUHJpbnQgdGhlIHRpbWVzdGFtcCBvZiBlYWNoIG1lc3NhZ2VcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlsb2dfc2V0X3ByaW50X3RpbWVzdGFtcChjb25uLT5kYmcsIGF0b2koYXJndlswXSkpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogRklYTUU6IHRob3NlIGhhdmUgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGxvZyBsZXZlbHMgYW5kIGNhdGVnb3JpZXMgKi8KKyNkZWZpbmUgVlRZX0RFQlVHX0NBVEVHT1JJRVMgIihybGx8Y2N8bW18cnJ8cnNsfG5tfHNtc3xwYWd8bW5jY3xpbnB8bWl8bWlifG11eHxtZWFzfHNjY3B8bXNjfG1nY3B8aG98ZGJ8cmVmKSIKKyNkZWZpbmUgVlRZX0RFQlVHX0xFVkVMUyAiKGV2ZXJ5dGhpbmd8ZGVidWd8aW5mb3xub3RpY2V8ZXJyb3J8ZmF0YWwpIgorREVGVU4obG9nZ2luZ19sZXZlbCwKKyAgICAgIGxvZ2dpbmdfbGV2ZWxfY21kLAorICAgICAgImxvZ2dpbmcgbGV2ZWwgIiBWVFlfREVCVUdfQ0FURUdPUklFUyAiICIgVlRZX0RFQlVHX0xFVkVMUywKKyAgICAgICJTZXQgdGhlIGxvZyBsZXZlbCBmb3IgYSBzcGVjaWZpZWQgY2F0ZWdvcnlcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCWludCBjYXRlZ29yeSA9IGxvZ19wYXJzZV9jYXRlZ29yeShhcmd2WzBdKTsKKwlpbnQgbGV2ZWwgPSBsb2dfcGFyc2VfbGV2ZWwoYXJndlsxXSk7CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChjYXRlZ29yeSA8IDApIHsKKwkJdnR5X291dCh2dHksICJJbnZhbGlkIGNhdGVnb3J5IGAlcyclcyIsIGFyZ3ZbMF0sIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChsZXZlbCA8IDApIHsKKwkJdnR5X291dCh2dHksICJJbnZhbGlkIGxldmVsIGAlcyclcyIsIGFyZ3ZbMV0sIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWNvbm4tPmRiZy0+Y2F0ZWdvcmllc1tjYXRlZ29yeV0uZW5hYmxlZCA9IDE7CisJY29ubi0+ZGJnLT5jYXRlZ29yaWVzW2NhdGVnb3J5XS5sb2dsZXZlbCA9IGxldmVsOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihsb2dnaW5nX3NldF9jYXRlZ29yeV9tYXNrLAorICAgICAgbG9nZ2luZ19zZXRfY2F0ZWdvcnlfbWFza19jbWQsCisgICAgICAibG9nZ2luZyBzZXQgbG9nIG1hc2sgTUFTSyIsCisgICAgICAiRGVjaWRlIHdoaWNoIGNhdGVnb3JpZXMgdG8gb3V0cHV0LlxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWxvZ19wYXJzZV9jYXRlZ29yeV9tYXNrKGNvbm4tPmRiZywgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihsb2dnaW5nX3NldF9sb2dfbGV2ZWwsCisgICAgICBsb2dnaW5nX3NldF9sb2dfbGV2ZWxfY21kLAorICAgICAgImxvZ2dpbmcgc2V0IGxvZyBsZXZlbCA8MC04PiIsCisgICAgICAiU2V0IHRoZSBnbG9iYWwgbG9nIGxldmVsLiBUaGUgdmFsdWUgMCBpbXBsaWVzIG5vIGZpbHRlcmluZy5cbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlsb2dfc2V0X2xvZ19sZXZlbChjb25uLT5kYmcsIGF0b2koYXJndlswXSkpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oZGlhYmxlX2xvZ2dpbmcsCisgICAgICBkaXNhYmxlX2xvZ2dpbmdfY21kLAorICAgICAgImxvZ2dpbmcgZGlzYWJsZSIsCisgICAgICAiRGlzYWJsZXMgbG9nZ2luZyB0byB0aGlzIHZ0eVxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWxvZ19kZWxfdGFyZ2V0KGNvbm4tPmRiZyk7CisJdGFsbG9jX2ZyZWUoY29ubi0+ZGJnKTsKKwljb25uLT5kYmcgPSBOVUxMOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19zdGF0cywKKyAgICAgIHNob3dfc3RhdHNfY21kLAorICAgICAgInNob3cgc3RhdGlzdGljcyIsCisJU0hPV19TVFIgIkRpc3BsYXkgbmV0d29yayBzdGF0aXN0aWNzXG4iKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0OworCisJdnR5X291dCh2dHksICJDaGFubmVsIFJlcXVlc3RzICAgICAgICA6ICVsdSB0b3RhbCwgJWx1IG5vIGNoYW5uZWwlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuY2hyZXEudG90YWwpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmNocmVxLm5vX2NoYW5uZWwpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJMb2NhdGlvbiBVcGRhdGUgICAgICAgICA6ICVsdSBhdHRhY2gsICVsdSBub3JtYWwsICVsdSBwZXJpb2RpYyVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUuYXR0YWNoKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUubm9ybWFsKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUucGVyaW9kaWMpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJJTVNJIERldGFjaCBJbmRpY2F0aW9ucyA6ICVsdSVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUuZGV0YWNoKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiTG9jYXRpb24gVXBkYXRlIFJlc3BvbnNlOiAlbHUgYWNjZXB0LCAlbHUgcmVqZWN0JXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmxvY191cGRfcmVzcC5hY2NlcHQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmxvY191cGRfcmVzcC5yZWplY3QpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJQYWdpbmcgICAgICAgICAgICAgICAgICA6ICVsdSBhdHRlbXB0ZWQsICVsdSBjb21wbGV0ZSwgJWx1IGV4cGlyZWQlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMucGFnaW5nLmF0dGVtcHRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMucGFnaW5nLmNvbXBsZXRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMucGFnaW5nLmV4cGlyZWQpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJIYW5kb3ZlciAgICAgICAgICAgICAgICA6ICVsdSBhdHRlbXB0ZWQsICVsdSBub19jaGFubmVsLCAlbHUgdGltZW91dCwgIgorCQkiJWx1IGNvbXBsZXRlZCwgJWx1IGZhaWxlZCVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci5hdHRlbXB0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLm5vX2NoYW5uZWwpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLnRpbWVvdXQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLmNvbXBsZXRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuaGFuZG92ZXIuZmFpbGVkKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiU01TIE1PICAgICAgICAgICAgICAgICAgOiAlbHUgc3VibWl0dGVkLCAlbHUgbm8gcmVjZWl2ZXIlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLnN1Ym1pdHRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLm5vX3JlY2VpdmVyKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiU01TIE1UICAgICAgICAgICAgICAgICAgOiAlbHUgZGVsaXZlcmVkLCAlbHUgbm8gbWVtb3J5LCAlbHUgb3RoZXIgZXJyb3IlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLmRlbGl2ZXJlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLnJwX2Vycl9tZW0pLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5ycF9lcnJfb3RoZXIpLCBWVFlfTkVXTElORSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0LAorICAgICAgY2ZnX25ldF9jbWQsCisgICAgICAibmV0d29yayIsCisgICAgICAiQ29uZmlndXJlIHRoZSBHU00gbmV0d29yayIpCit7CisJdnR5LT5pbmRleCA9IGdzbW5ldDsKKwl2dHktPm5vZGUgPSBHU01ORVRfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitERUZVTihjZmdfbmV0X25jYywKKyAgICAgIGNmZ19uZXRfbmNjX2NtZCwKKyAgICAgICJuZXR3b3JrIGNvdW50cnkgY29kZSA8MS05OTk+IiwKKyAgICAgICJTZXQgdGhlIEdTTSBuZXR3b3JrIGNvdW50cnkgY29kZSIpCit7CisJZ3NtbmV0LT5jb3VudHJ5X2NvZGUgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X21uYywKKyAgICAgIGNmZ19uZXRfbW5jX2NtZCwKKyAgICAgICJtb2JpbGUgbmV0d29yayBjb2RlIDwxLTk5OT4iLAorICAgICAgIlNldCB0aGUgR1NNIG1vYmlsZSBuZXR3b3JrIGNvZGUiKQoreworCWdzbW5ldC0+bmV0d29ya19jb2RlID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9uYW1lX3Nob3J0LAorICAgICAgY2ZnX25ldF9uYW1lX3Nob3J0X2NtZCwKKyAgICAgICJzaG9ydCBuYW1lIE5BTUUiLAorICAgICAgIlNldCB0aGUgc2hvcnQgR1NNIG5ldHdvcmsgbmFtZSIpCit7CisJaWYgKGdzbW5ldC0+bmFtZV9zaG9ydCkKKwkJdGFsbG9jX2ZyZWUoZ3NtbmV0LT5uYW1lX3Nob3J0KTsKKworCWdzbW5ldC0+bmFtZV9zaG9ydCA9IHRhbGxvY19zdHJkdXAoZ3NtbmV0LCBhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9uYW1lX2xvbmcsCisgICAgICBjZmdfbmV0X25hbWVfbG9uZ19jbWQsCisgICAgICAibG9uZyBuYW1lIE5BTUUiLAorICAgICAgIlNldCB0aGUgbG9uZyBHU00gbmV0d29yayBuYW1lIikKK3sKKwlpZiAoZ3NtbmV0LT5uYW1lX2xvbmcpCisJCXRhbGxvY19mcmVlKGdzbW5ldC0+bmFtZV9sb25nKTsKKworCWdzbW5ldC0+bmFtZV9sb25nID0gdGFsbG9jX3N0cmR1cChnc21uZXQsIGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2F1dGhfcG9saWN5LAorICAgICAgY2ZnX25ldF9hdXRoX3BvbGljeV9jbWQsCisgICAgICAiYXV0aCBwb2xpY3kgKGNsb3NlZHxhY2NlcHQtYWxsfHRva2VuKSIsCisgICAgICAiU2V0IHRoZSBHU00gbmV0d29yayBhdXRoZW50aWNhdGlvbiBwb2xpY3lcbiIpCit7CisJZW51bSBnc21fYXV0aF9wb2xpY3kgcG9saWN5ID0gZ3NtX2F1dGhfcG9saWN5X3BhcnNlKGFyZ3ZbMF0pOworCisJZ3NtbmV0LT5hdXRoX3BvbGljeSA9IHBvbGljeTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9yZWplY3RfY2F1c2UsCisgICAgICBjZmdfbmV0X3JlamVjdF9jYXVzZV9jbWQsCisgICAgICAibG9jYXRpb24gdXBkYXRpbmcgcmVqZWN0IGNhdXNlIDwyLTExMT4iLAorICAgICAgIlNldCB0aGUgcmVqZWN0IGNhdXNlIG9mIGxvY2F0aW9uIHVwZGF0aW5nIHJlamVjdFxuIikKK3sKKwlnc21uZXQtPnJlamVjdF9jYXVzZSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfZW5jcnlwdGlvbiwKKyAgICAgIGNmZ19uZXRfZW5jcnlwdGlvbl9jbWQsCisgICAgICAiZW5jcnlwdGlvbiBhNSAoMHwxfDIpIiwKKyAgICAgICJFbmFibGUgb3IgZGlzYWJsZSBlbmNyeXB0aW9uIChBNSkgZm9yIHRoaXMgbmV0d29ya1xuIikKK3sKKwlnc21uZXQtPmE1X2VuY3J5cHRpb249IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfbmVjaSwKKyAgICAgIGNmZ19uZXRfbmVjaV9jbWQsCisgICAgICAibmVjaSAoMHwxKSIsCisgICAgICAiU2V0IGlmIE5FQ0kgb2YgY2VsbCBzZWxlY3Rpb24gaXMgdG8gYmUgc2V0IikKK3sKKwlnc21uZXQtPm5lY2kgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9ycmxwX21vZGUsIGNmZ19uZXRfcnJscF9tb2RlX2NtZCwKKyAgICAgICJycmxwIG1vZGUgKG5vbmV8bXMtYmFzZWR8bXMtcHJlZmVycmVkfGFzcy1wcmVmZXJyZWQpIiwKKwkiU2V0IHRoZSBSYWRpbyBSZXNvdXJjZSBMb2NhdGlvbiBQcm90b2NvbCBNb2RlIikKK3sKKwlnc21uZXQtPnJybHAubW9kZSA9IHJybHBfbW9kZV9wYXJzZShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9tbV9pbmZvLCBjZmdfbmV0X21tX2luZm9fY21kLAorICAgICAgIm1tIGluZm8gKDB8MSkiLAorCSJXaGV0aGVyIHRvIHNlbmQgTU0gSU5GTyBhZnRlciBMT0MgVVBEIEFDQ0VQVCIpCit7CisJZ3NtbmV0LT5zZW5kX21tX2luZm8gPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hhbmRvdmVyLCBjZmdfbmV0X2hhbmRvdmVyX2NtZCwKKyAgICAgICJoYW5kb3ZlciAoMHwxKSIsCisJIldoZXRoZXIgb3Igbm90IHRvIHVzZSBpbi1jYWxsIGhhbmRvdmVyIikKK3sKKwlpbnQgZW5hYmxlID0gYXRvaShhcmd2WzBdKTsKKworCWlmIChlbmFibGUgJiYgaXBhY2NfcnRwX2RpcmVjdCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIENhbm5vdCBlbmFibGUgaGFuZG92ZXIgdW5sZXNzIFJUUCBQcm94eSBtb2RlICIKKwkJCSJpcyBlbmFibGVkIGJ5IHVzaW5nIHRoZSAtUCBjb21tYW5kIGxpbmUgb3B0aW9uJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWdzbW5ldC0+aGFuZG92ZXIuYWN0aXZlID0gZW5hYmxlOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3dpbl9yeGxldl9hdmcsIGNmZ19uZXRfaG9fd2luX3J4bGV2X2F2Z19jbWQsCisgICAgICAiaGFuZG92ZXIgd2luZG93IHJ4bGV2IGF2ZXJhZ2luZyA8MS0xMD4iLAorCSJIb3cgbWFueSBSeExldiBtZWFzdXJlbWVudHMgYXJlIHVzZWQgZm9yIGF2ZXJhZ2luZyIpCit7CisJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhsZXZfYXZnID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfaG9fd2luX3J4cXVhbF9hdmcsIGNmZ19uZXRfaG9fd2luX3J4cXVhbF9hdmdfY21kLAorICAgICAgImhhbmRvdmVyIHdpbmRvdyByeHF1YWwgYXZlcmFnaW5nIDwxLTEwPiIsCisJIkhvdyBtYW55IFJ4UXVhbCBtZWFzdXJlbWVudHMgYXJlIHVzZWQgZm9yIGF2ZXJhZ2luZyIpCit7CisJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhxdWFsX2F2ZyA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3dpbl9yeGxldl9uZWlnaF9hdmcsIGNmZ19uZXRfaG9fd2luX3J4bGV2X2F2Z19uZWlnaF9jbWQsCisgICAgICAiaGFuZG92ZXIgd2luZG93IHJ4bGV2IG5laWdoYm9yIGF2ZXJhZ2luZyA8MS0xMD4iLAorCSJIb3cgbWFueSBSeFF1YWwgbWVhc3VyZW1lbnRzIGFyZSB1c2VkIGZvciBhdmVyYWdpbmciKQoreworCWdzbW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2Z19uZWlnaCA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3B3cl9pbnRlcnZhbCwgY2ZnX25ldF9ob19wd3JfaW50ZXJ2YWxfY21kLAorICAgICAgImhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBpbnRlcnZhbCA8MS05OT4iLAorCSJIb3cgb2Z0ZW4gdG8gY2hlY2sgaWYgd2UgaGF2ZSBhIGJldHRlciBjZWxsIChTQUNDSCBmcmFtZXMpIikKK3sKKwlnc21uZXQtPmhhbmRvdmVyLnB3cl9pbnRlcnZhbCA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3B3cl9oeXN0ZXJlc2lzLCBjZmdfbmV0X2hvX3B3cl9oeXN0ZXJlc2lzX2NtZCwKKyAgICAgICJoYW5kb3ZlciBwb3dlciBidWRnZXQgaHlzdGVyZXNpcyA8MC05OTk+IiwKKwkiSG93IG1hbnkgZEIgZG9lcyBhIG5laWdoYm9yIHRvIGJlIHN0cm9uZ2VyIHRvIGJlY29tZSBhIEhPIGNhbmRpZGF0ZSIpCit7CisJZ3NtbmV0LT5oYW5kb3Zlci5wd3JfaHlzdGVyZXNpcyA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX21heF9kaXN0YW5jZSwgY2ZnX25ldF9ob19tYXhfZGlzdGFuY2VfY21kLAorICAgICAgImhhbmRvdmVyIG1heGltdW0gZGlzdGFuY2UgPDAtOTk5OT4iLAorCSJIb3cgYmlnIGlzIHRoZSBtYXhpbXVtIHRpbWluZyBhZHZhbmNlIGJlZm9yZSBITyBpcyBmb3JjZWQiKQoreworCWdzbW5ldC0+aGFuZG92ZXIubWF4X2Rpc3RhbmNlID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgREVDTEFSRV9USU1FUihudW1iZXIsIGRvYykgXAorICAgIERFRlVOKGNmZ19uZXRfVCMjbnVtYmVyLAkJCQkJXAorICAgICAgY2ZnX25ldF9UIyNudW1iZXIjI19jbWQsCQkJCQlcCisgICAgICAidGltZXIgdCIgI251bWJlciAgIiA8MC02NTUzNT4iLAkJCQlcCisgICAgICBkb2MpCQkJCQkJCVwKK3sJCQkJCQkJCVwKKwlpbnQgdmFsdWUgPSBhdG9pKGFyZ3ZbMF0pOwkJCQlcCisJCQkJCQkJCVwKKwlpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNjU1MzUpIHsJCQlcCisJCXZ0eV9vdXQodnR5LCAiVGltZXIgdmFsdWUgJXMgb3V0IG9mIHJhbmdlLiVzIiwJXAorCQkgICAgICAgIGFyZ3ZbMF0sIFZUWV9ORVdMSU5FKTsJCQlcCisJCXJldHVybiBDTURfV0FSTklORzsJCQkJXAorCX0JCQkJCQkJXAorCQkJCQkJCQlcCisJZ3NtbmV0LT5UIyNudW1iZXIgPSB2YWx1ZTsJCQkJXAorCXJldHVybiBDTURfU1VDQ0VTUzsJCQkJCVwKK30KKworREVDTEFSRV9USU1FUigzMTAxLCAiU2V0IHRoZSB0aW1lb3V0IHZhbHVlIGZvciBJTU1FRElBVEUgQVNTSUdOTUVOVC4iKQorREVDTEFSRV9USU1FUigzMTAzLCAiU2V0IHRoZSB0aW1lb3V0IHZhbHVlIGZvciBIQU5ET1ZFUi4iKQorREVDTEFSRV9USU1FUigzMTA1LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMDcsICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzEwOSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorREVDTEFSRV9USU1FUigzMTExLCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMTMsICJTZXQgdGhlIHRpbWUgdG8gdHJ5IHBhZ2luZyBhIHN1YnNjcmliZXIuIikKK0RFQ0xBUkVfVElNRVIoMzExNSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorREVDTEFSRV9USU1FUigzMTE3LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMTksICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzE0MSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorCisKKy8qIHBlci1CVFMgY29uZmlndXJhdGlvbiAqLworREVGVU4oY2ZnX2J0cywKKyAgICAgIGNmZ19idHNfY21kLAorICAgICAgImJ0cyBCVFNfTlIiLAorICAgICAgIlNlbGVjdCBhIEJUUyB0byBjb25maWd1cmVcbiIpCit7CisJaW50IGJ0c19uciA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCWlmIChidHNfbnIgPiBnc21uZXQtPm51bV9idHMpIHsKKwkJdnR5X291dCh2dHksICIlJSBUaGUgbmV4dCB1bnVzZWQgQlRTIG51bWJlciBpcyAldSVzIiwKKwkJCWdzbW5ldC0+bnVtX2J0cywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfSBlbHNlIGlmIChidHNfbnIgPT0gZ3NtbmV0LT5udW1fYnRzKSB7CisJCS8qIGFsbG9jYXRlIGEgbmV3IG9uZSAqLworCQlidHMgPSBnc21fYnRzX2FsbG9jKGdzbW5ldCwgR1NNX0JUU19UWVBFX1VOS05PV04sCisJCQkJICAgIEhBUkRDT0RFRF9UU0MsIEhBUkRDT0RFRF9CU0lDKTsKKwl9IGVsc2UgCisJCWJ0cyA9IGdzbV9idHNfbnVtKGdzbW5ldCwgYnRzX25yKTsKKworCWlmICghYnRzKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgVW5hYmxlIHRvIGFsbG9jYXRlIEJUUyAldSVzIiwKKwkJCWdzbW5ldC0+bnVtX2J0cywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJdnR5LT5pbmRleCA9IGJ0czsKKwl2dHktPm5vZGUgPSBCVFNfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c190eXBlLAorICAgICAgY2ZnX2J0c190eXBlX2NtZCwKKyAgICAgICJ0eXBlIFRZUEUiLAorICAgICAgIlNldCB0aGUgQlRTIHR5cGVcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IHJjOworCisJcmMgPSBnc21fc2V0X2J0c190eXBlKGJ0cywgcGFyc2VfYnRzdHlwZShhcmd2WzBdKSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2JhbmQsCisgICAgICBjZmdfYnRzX2JhbmRfY21kLAorICAgICAgImJhbmQgQkFORCIsCisgICAgICAiU2V0IHRoZSBmcmVxdWVuY3kgYmFuZCBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgYmFuZCA9IGdzbV9iYW5kX3BhcnNlKGFyZ3ZbMF0pOworCisJaWYgKGJhbmQgPCAwKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQkFORCAlZCBpcyBub3QgYSB2YWxpZCBHU00gYmFuZCVzIiwKKwkJCWJhbmQsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+YmFuZCA9IGJhbmQ7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfY2ksCisgICAgICBjZmdfYnRzX2NpX2NtZCwKKyAgICAgICJjZWxsX2lkZW50aXR5IDwwLTY1NTM1PiIsCisgICAgICAiU2V0IHRoZSBDZWxsIGlkZW50aXR5IG9mIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBjaSA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoY2kgPCAwIHx8IGNpID4gMHhmZmZmKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQ0kgJWQgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSAoMC02NTUzNSklcyIsCisJCQljaSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWJ0cy0+Y2VsbF9pZGVudGl0eSA9IGNpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2xhYywKKyAgICAgIGNmZ19idHNfbGFjX2NtZCwKKyAgICAgICJsb2NhdGlvbl9hcmVhX2NvZGUgPDAtNjU1MzU+IiwKKyAgICAgICJTZXQgdGhlIExvY2F0aW9uIEFyZWEgQ29kZSAoTEFDKSBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgbGFjID0gYXRvaShhcmd2WzBdKTsKKworCWlmIChsYWMgPCAwIHx8IGxhYyA+IDB4ZmZmZikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIExBQyAlZCBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlICgwLTY1NTM1KSVzIiwKKwkJCWxhYywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGxhYyA9PSBHU01fTEFDX1JFU0VSVkVEX0RFVEFDSEVEIHx8IGxhYyA9PSBHU01fTEFDX1JFU0VSVkVEX0FMTF9CVFMpIHsKKwkJdnR5X291dCh2dHksICIlJSBMQUMgJWQgaXMgcmVzZXJ2ZWQgYnkgR1NNIDA0LjA4JXMiLAorCQkJbGFjLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmxvY2F0aW9uX2FyZWFfY29kZSA9IGxhYzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitERUZVTihjZmdfYnRzX3RzYywKKyAgICAgIGNmZ19idHNfdHNjX2NtZCwKKyAgICAgICJ0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDwwLTI1NT4iLAorICAgICAgIlNldCB0aGUgVHJhaW5pbmcgU2VxdWVuY2UgQ29kZSAoVFNDKSBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgdHNjID0gYXRvaShhcmd2WzBdKTsKKworCWlmICh0c2MgPCAwIHx8IHRzYyA+IDB4ZmYpIHsKKwkJdnR5X291dCh2dHksICIlJSBUU0MgJWQgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSAoMC0yNTUpJXMiLAorCQkJdHNjLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJYnRzLT50c2MgPSB0c2M7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfYnNpYywKKyAgICAgIGNmZ19idHNfYnNpY19jbWQsCisgICAgICAiYmFzZV9zdGF0aW9uX2lkX2NvZGUgPDAtNjM+IiwKKyAgICAgICJTZXQgdGhlIEJhc2UgU3RhdGlvbiBJZGVudGl0eSBDb2RlIChCU0lDKSBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgYnNpYyA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoYnNpYyA8IDAgfHwgYnNpYyA+IDB4M2YpIHsKKwkJdnR5X291dCh2dHksICIlJSBCU0lDICVkIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2UgKDAtMjU1KSVzIiwKKwkJCWJzaWMsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlidHMtPmJzaWMgPSBic2ljOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19idHNfdW5pdF9pZCwKKyAgICAgIGNmZ19idHNfdW5pdF9pZF9jbWQsCisgICAgICAiaXAuYWNjZXNzIHVuaXRfaWQgPDAtNjU1MzQ+IDwwLTI1NT4iLAorICAgICAgIlNldCB0aGUgaXAuYWNjZXNzIEJUUyBVbml0IElEIG9mIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBzaXRlX2lkID0gYXRvaShhcmd2WzBdKTsKKwlpbnQgYnRzX2lkID0gYXRvaShhcmd2WzFdKTsKKworCWlmICghaXNfaXBhY2Nlc3NfYnRzKGJ0cykpIHsKKwkJdnR5X291dCh2dHksICIlJSBCVFMgaXMgbm90IG9mIGlwLmFjY2VzcyB0eXBlJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmlwX2FjY2Vzcy5zaXRlX2lkID0gc2l0ZV9pZDsKKwlidHMtPmlwX2FjY2Vzcy5idHNfaWQgPSBidHNfaWQ7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfc3RyZWFtX2lkLAorICAgICAgY2ZnX2J0c19zdHJlYW1faWRfY21kLAorICAgICAgIm9tbCBpcC5hY2Nlc3Mgc3RyZWFtX2lkIDwwLTI1NT4iLAorICAgICAgIlNldCB0aGUgaXAuYWNjZXNzIFN0cmVhbSBJRCBvZiB0aGUgT01MIGxpbmsgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IHN0cmVhbV9pZCA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoIWlzX2lwYWNjZXNzX2J0cyhidHMpKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQlRTIGlzIG5vdCBvZiBpcC5hY2Nlc3MgdHlwZSVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5vbWxfdGVpID0gc3RyZWFtX2lkOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19idHNfb21sX2UxLAorICAgICAgY2ZnX2J0c19vbWxfZTFfY21kLAorICAgICAgIm9tbCBlMSBsaW5lIEUxX0xJTkUgdGltZXNsb3QgPDEtMzE+IHN1Yi1zbG90ICgwfDF8MnwzfGZ1bGwpIiwKKyAgICAgICJFMSBpbnRlcmZhY2UgdG8gYmUgdXNlZCBmb3IgT01MXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJcGFyc2VfZTFfbGluaygmYnRzLT5vbWxfZTFfbGluaywgYXJndlswXSwgYXJndlsxXSwgYXJndlsyXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworREVGVU4oY2ZnX2J0c19vbWxfZTFfdGVpLAorICAgICAgY2ZnX2J0c19vbWxfZTFfdGVpX2NtZCwKKyAgICAgICJvbWwgZTEgdGVpIDwwLTYzPiIsCisgICAgICAiU2V0IHRoZSBURUkgdG8gYmUgdXNlZCBmb3IgT01MIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWJ0cy0+b21sX3RlaSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfY2hhbGxvYywgY2ZnX2J0c19jaGFsbG9jX2NtZCwKKyAgICAgICJjaGFubmVsIGFsbG9jYXRvciAoYXNjZW5kaW5nfGRlc2NlbmRpbmcpIiwKKyAgICAgICJTaG91bGQgdGhlIGNoYW5uZWwgYWxsb2NhdG9yIGFsbG9jYXRlIGluIHJldmVyc2UgVFJYIG9yZGVyPyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoIXN0cmNtcChhcmd2WzBdLCAiYXNjZW5kaW5nIikpCisJCWJ0cy0+Y2hhbl9hbGxvY19yZXZlcnNlID0gMDsKKwllbHNlCisJCWJ0cy0+Y2hhbl9hbGxvY19yZXZlcnNlID0gMTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19yYWNoX3R4X2ludGVnZXIsCisgICAgICBjZmdfYnRzX3JhY2hfdHhfaW50ZWdlcl9jbWQsCisgICAgICAicmFjaCB0eCBpbnRlZ2VyIDwwLTE1PiIsCisgICAgICAiU2V0IHRoZSByYXcgdHggaW50ZWdlciB2YWx1ZSBpbiBSQUNIIENvbnRyb2wgcGFyYW1ldGVycyBJRSIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLnR4X2ludGVnZXIgPSBhdG9pKGFyZ3ZbMF0pICYgMHhmOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19yYWNoX21heF90cmFucywKKyAgICAgIGNmZ19idHNfcmFjaF9tYXhfdHJhbnNfY21kLAorICAgICAgInJhY2ggbWF4IHRyYW5zbWlzc2lvbiAoMXwyfDR8NykiLAorICAgICAgIlNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgUkFDSCBidXJzdCB0cmFuc21pc3Npb25zIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wubWF4X3RyYW5zID0gcmFjaF9tYXhfdHJhbnNfdmFsMnJhdyhhdG9pKGFyZ3ZbMF0pKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfY2VsbF9iYXJyZWQsIGNmZ19idHNfY2VsbF9iYXJyZWRfY21kLAorICAgICAgImNlbGwgYmFycmVkICgwfDEpIiwKKyAgICAgICJTaG91bGQgdGhpcyBjZWxsIGJlIGJhcnJlZCBmcm9tIGFjY2Vzcz8iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLmNlbGxfYmFyID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19tc19tYXhfcG93ZXIsIGNmZ19idHNfbXNfbWF4X3Bvd2VyX2NtZCwKKyAgICAgICJtcyBtYXggcG93ZXIgPDAtNDA+IiwKKyAgICAgICJNYXhpbXVtIHRyYW5zbWl0IHBvd2VyIG9mIHRoZSBNUyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPm1zX21heF9wb3dlciA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfY2VsbF9yZXNlbF9oeXN0LCBjZmdfYnRzX2NlbGxfcmVzZWxfaHlzdF9jbWQsCisgICAgICAiY2VsbCByZXNlbGVjdGlvbiBoeXN0ZXJlc2lzIDwwLTE0PiIsCisgICAgICAiQ2VsbCBSZS1TZWxlY3Rpb24gSHlzdGVyZXNpcyBpbiBkQiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuY2VsbF9yZXNlbF9oeXN0ID0gYXRvaShhcmd2WzBdKS8yOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3J4bGV2X2FjY19taW4sIGNmZ19idHNfcnhsZXZfYWNjX21pbl9jbWQsCisgICAgICAicnhsZXYgYWNjZXNzIG1pbiA8MC02Mz4iLAorICAgICAgIk1pbmltdW0gUnhMZXYgbmVlZGVkIGZvciBjZWxsIGFjY2VzcyAoYmV0dGVyIHRoYW4gLTExMGRCbSkiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLnJ4bGV2X2FjY19taW4gPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3Blcl9sb2NfdXBkLCBjZmdfYnRzX3Blcl9sb2NfdXBkX2NtZCwKKyAgICAgICJwZXJpb2RpYyBsb2NhdGlvbiB1cGRhdGUgPDAtMTUzMD4iLAorICAgICAgIlBlcmlvZGljIExvY2F0aW9uIFVwZGF0aW5nIEludGVydmFsIGluIE1pbnV0ZXMiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLnQzMjEyID0gYXRvaShhcmd2WzBdKSAvIDEwOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3Byc19idmNpLCBjZmdfYnRzX2dwcnNfYnZjaV9jbWQsCisJImdwcnMgY2VsbCBidmNpIDwwLTY1NTM1PiIsCisJIkdQUlMgQlNTR1AgVkMgSWRlbnRpZmllciIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLmNlbGwuYnZjaSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc2VpLCBjZmdfYnRzX2dwcnNfbnNlaV9jbWQsCisJImdwcnMgbnNlaSA8MC02NTUzNT4iLAorCSJHUFJTIE5TIEVudGl0eSBJZGVudGlmaWVyIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWlmICghYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmdwcnMubnNlLm5zZWkgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc3ZjaSwgY2ZnX2J0c19ncHJzX25zdmNpX2NtZCwKKwkiZ3BycyBuc3ZjIDwwLTE+IG5zdmNpIDwwLTY1NTM1PiIsCisJIkdQUlMgTlMgVkMgSWRlbnRpZmllciIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGlkeCA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLm5zdmNbaWR4XS5uc3ZjaSA9IGF0b2koYXJndlsxXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc3ZjX2xwb3J0LCBjZmdfYnRzX2dwcnNfbnN2Y19scG9ydF9jbWQsCisJImdwcnMgbnN2YyA8MC0xPiBsb2NhbCB1ZHAgcG9ydCA8MC02NTUzNT4iLAorCSJHUFJTIE5TIExvY2FsIFVEUCBQb3J0IikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgaWR4ID0gYXRvaShhcmd2WzBdKTsKKworCWlmICghYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmdwcnMubnN2Y1tpZHhdLmxvY2FsX3BvcnQgPSBhdG9pKGFyZ3ZbMV0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2dwcnNfbnN2Y19ycG9ydCwgY2ZnX2J0c19ncHJzX25zdmNfcnBvcnRfY21kLAorCSJncHJzIG5zdmMgPDAtMT4gcmVtb3RlIHVkcCBwb3J0IDwwLTY1NTM1PiIsCisJIkdQUlMgTlMgUmVtb3RlIFVEUCBQb3J0IikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgaWR4ID0gYXRvaShhcmd2WzBdKTsKKworCWlmICghYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmdwcnMubnN2Y1tpZHhdLnJlbW90ZV9wb3J0ID0gYXRvaShhcmd2WzFdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19ncHJzX25zdmNfcmlwLCBjZmdfYnRzX2dwcnNfbnN2Y19yaXBfY21kLAorCSJncHJzIG5zdmMgPDAtMT4gcmVtb3RlIGlwIEEuQi5DLkQiLAorCSJHUFJTIE5TIFJlbW90ZSBJUCBBZGRyZXNzIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgaWR4ID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCWlmICghYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpbmV0X2F0b24oYXJndlsxXSwgJmlhKTsKKwlidHMtPmdwcnMubnN2Y1tpZHhdLnJlbW90ZV9pcCA9IG50b2hsKGlhLnNfYWRkcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19yYWMsIGNmZ19idHNfZ3Byc19yYWNfY21kLAorCSJncHJzIHJvdXRpbmcgYXJlYSA8MC0yNTU+IiwKKwkiR1BSUyBSb3V0aW5nIEFyZWEgQ29kZSIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLnJhYyA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19lbmFibGVkLCBjZmdfYnRzX2dwcnNfZW5hYmxlZF9jbWQsCisJImdwcnMgZW5hYmxlZCA8MC0xPiIsCisJIkdQUlMgRW5hYmxlZCBvbiB0aGlzIEJUUyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPmdwcnMuZW5hYmxlZCA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworLyogcGVyIFRSWCBjb25maWd1cmF0aW9uICovCitERUZVTihjZmdfdHJ4LAorICAgICAgY2ZnX3RyeF9jbWQsCisgICAgICAidHJ4IFRSWF9OUiIsCisgICAgICAiU2VsZWN0IGEgVFJYIHRvIGNvbmZpZ3VyZSIpCit7CisJaW50IHRyeF9uciA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlpZiAodHJ4X25yID4gYnRzLT5udW1fdHJ4KSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgVGhlIG5leHQgdW51c2VkIFRSWCBudW1iZXIgaW4gdGhpcyBCVFMgaXMgJXUlcyIsCisJCQlidHMtPm51bV90cngsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0gZWxzZSBpZiAodHJ4X25yID09IGJ0cy0+bnVtX3RyeCkgeworCQkvKiB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IG9uZSAqLworCQl0cnggPSBnc21fYnRzX3RyeF9hbGxvYyhidHMpOworCX0gZWxzZSAKKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwkKKwlpZiAoIXRyeCkKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJdnR5LT5pbmRleCA9IHRyeDsKKwl2dHktPm5vZGUgPSBUUlhfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9hcmZjbiwKKyAgICAgIGNmZ190cnhfYXJmY25fY21kLAorICAgICAgImFyZmNuIDwxLTEwMjQ+IiwKKyAgICAgICJTZXQgdGhlIEFSRkNOIGZvciB0aGlzIFRSWFxuIikKK3sKKwlpbnQgYXJmY24gPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKworCS8qIEZJWE1FOiBjaGVjayBpZiB0aGlzIEFSRkNOIGlzIHN1cHBvcnRlZCBieSB0aGlzIFRSWCAqLworCisJdHJ4LT5hcmZjbiA9IGFyZmNuOworCisJLyogRklYTUU6IHBhdGNoIEFSRkNOIGludG8gU1lTVEVNIElORk9STUFUSU9OICovCisJLyogRklYTUU6IHVzZSBPTUwgbGF5ZXIgdG8gdXBkYXRlIHRoZSBBUkZDTiAqLworCS8qIEZJWE1FOiB1c2UgUlNMIGxheWVyIHRvIHVwZGF0ZSBTWVNURU0gSU5GT1JNQVRJT04gKi8KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9ub21pbmFsX3Bvd2VyLAorICAgICAgY2ZnX3RyeF9ub21pbmFsX3Bvd2VyX2NtZCwKKyAgICAgICJub21pbmFsIHBvd2VyIDwwLTEwMD4iLAorICAgICAgIk5vbWluYWwgVFJYIFJGIFBvd2VyIGluIGRCXG4iKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKworCXRyeC0+bm9taW5hbF9wb3dlciA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190cnhfbWF4X3Bvd2VyX3JlZCwKKyAgICAgIGNmZ190cnhfbWF4X3Bvd2VyX3JlZF9jbWQsCisgICAgICAibWF4X3Bvd2VyX3JlZCA8MC0xMDA+IiwKKyAgICAgICJSZWR1Y3Rpb24gb2YgbWF4aW11bSBCUyBSRiBQb3dlciBpbiBkQlxuIikKK3sKKwlpbnQgbWF4cHdyX3IgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKwlpbnQgdXBwZXJfbGltaXQgPSAyNDsJLyogZGVmYXVsdCAxMi4yMSBtYXggcG93ZXIgcmVkLiAqLworCisJLyogRklYTUU6IGNoZWNrIGlmIG91ciBCVFMgdHlwZSBzdXBwb3J0cyBtb3JlIHRoYW4gMTIgKi8KKwlpZiAobWF4cHdyX3IgPCAwIHx8IG1heHB3cl9yID4gdXBwZXJfbGltaXQpIHsKKwkJdnR5X291dCh2dHksICIlJSBQb3dlciAlZCBkQiBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlJXMiLAorCQkJbWF4cHdyX3IsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlpZiAobWF4cHdyX3IgJiAxKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgUG93ZXIgJWQgZEIgaXMgbm90IGFuIGV2ZW4gdmFsdWUlcyIsCisJCQltYXhwd3JfciwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJdHJ4LT5tYXhfcG93ZXJfcmVkID0gbWF4cHdyX3I7CisKKwkvKiBGSVhNRTogbWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGlzIHVzaW5nIE9NTCAqLworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHJ4X3JzbF9lMSwKKyAgICAgIGNmZ190cnhfcnNsX2UxX2NtZCwKKyAgICAgICJyc2wgZTEgbGluZSBFMV9MSU5FIHRpbWVzbG90IDwxLTMxPiBzdWItc2xvdCAoMHwxfDJ8M3xmdWxsKSIsCisgICAgICAiRTEgaW50ZXJmYWNlIHRvIGJlIHVzZWQgZm9yIFJTTFxuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisKKwlwYXJzZV9lMV9saW5rKCZ0cngtPnJzbF9lMV9saW5rLCBhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9yc2xfZTFfdGVpLAorICAgICAgY2ZnX3RyeF9yc2xfZTFfdGVpX2NtZCwKKyAgICAgICJyc2wgZTEgdGVpIDwwLTYzPiIsCisgICAgICAiU2V0IHRoZSBURUkgdG8gYmUgdXNlZCBmb3IgUlNMIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisKKwl0cngtPnJzbF90ZWkgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHJ4X3JmX2xvY2tlZCwKKyAgICAgIGNmZ190cnhfcmZfbG9ja2VkX2NtZCwKKyAgICAgICJyZl9sb2NrZWQgKDB8MSkiLAorICAgICAgIlR1cm4gb2ZmIFJGIG9mIHRoZSBUUlguXG4iKQoreworCWludCBsb2NrZWQgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKworCWdzbV90cnhfbG9ja19yZih0cngsIGxvY2tlZCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBwZXIgVFMgY29uZmlndXJhdGlvbiAqLworREVGVU4oY2ZnX3RzLAorICAgICAgY2ZnX3RzX2NtZCwKKyAgICAgICJ0aW1lc2xvdCA8MC03PiIsCisgICAgICAiU2VsZWN0IGEgVGltZXNsb3QgdG8gY29uZmlndXJlIikKK3sKKwlpbnQgdHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCisJaWYgKHRzX25yID49IFRSWF9OUl9UUykgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEEgR1NNIFRSWCBvbmx5IGhhcyAldSBUaW1lc2xvdHMgcGVyIFRSWCVzIiwKKwkJCVRSWF9OUl9UUywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJdHMgPSAmdHJ4LT50c1t0c19ucl07CisKKwl2dHktPmluZGV4ID0gdHM7CisJdnR5LT5ub2RlID0gVFNfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RzX3BjaGFuLAorICAgICAgY2ZnX3RzX3BjaGFuX2NtZCwKKyAgICAgICJwaHlzX2NoYW5fY29uZmlnIFBDSEFOIiwKKyAgICAgICJQaHlzaWNhbCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gKFRDSC9TRENDSC8uLi4pIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gdnR5LT5pbmRleDsKKwlpbnQgcGNoYW5jOworCisJcGNoYW5jID0gZ3NtX3BjaGFuX3BhcnNlKGFyZ3ZbMF0pOworCWlmIChwY2hhbmMgPCAwKQorCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwl0cy0+cGNoYW4gPSBwY2hhbmM7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190c19lMV9zdWJzbG90LAorICAgICAgY2ZnX3RzX2UxX3N1YnNsb3RfY21kLAorICAgICAgImUxIGxpbmUgRTFfTElORSB0aW1lc2xvdCA8MS0zMT4gc3ViLXNsb3QgKDB8MXwyfDN8ZnVsbCkiLAorICAgICAgIkUxIHN1Yi1zbG90IGNvbm5lY3RlZCB0byB0aGlzIG9uLWFpciB0aW1lc2xvdCIpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IHZ0eS0+aW5kZXg7CisKKwlwYXJzZV9lMV9saW5rKCZ0cy0+ZTFfbGluaywgYXJndlswXSwgYXJndlsxXSwgYXJndlsyXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK2ludCBic2NfdnR5X2luaXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJZ3NtbmV0ID0gbmV0OworCisJY21kX2luaXQoMSk7CisJdnR5X2luaXQoKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X25ldF9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X2J0c19jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3RyeF9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3RzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfbGNoYW5fY21kKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X2UxZHJ2X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfZTFsaW5lX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfZTF0c19jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfcGFnaW5nX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfc3RhdHNfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZlbmFibGVfbG9nZ2luZ19jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZkaXNhYmxlX2xvZ2dpbmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19mbHRyX2ltc2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19mbHRyX2FsbF9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZsb2dnaW5nX3VzZV9jbHJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19wcm50X3RpbWVzdGFtcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZsb2dnaW5nX3NldF9jYXRlZ29yeV9tYXNrX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmxvZ2dpbmdfbGV2ZWxfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19zZXRfbG9nX2xldmVsX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfbmV0X2NtZCk7CisJaW5zdGFsbF9ub2RlKCZuZXRfbm9kZSwgY29uZmlnX3dyaXRlX25ldCk7CisJaW5zdGFsbF9kZWZhdWx0KEdTTU5FVF9OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X25jY19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfbW5jX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9uYW1lX3Nob3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9uYW1lX2xvbmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2F1dGhfcG9saWN5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9yZWplY3RfY2F1c2VfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2VuY3J5cHRpb25fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X25lY2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X3JybHBfbW9kZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfbW1faW5mb19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfaGFuZG92ZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3dpbl9yeGxldl9hdmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3dpbl9yeHF1YWxfYXZnX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob193aW5fcnhsZXZfYXZnX25laWdoX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob19wd3JfaW50ZXJ2YWxfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3B3cl9oeXN0ZXJlc2lzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob19tYXhfZGlzdGFuY2VfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTAxX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzEwM19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMDVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTA3X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzEwOV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMTFfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTEzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzExNV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMTdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTE5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzE0MV9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX2J0c19jbWQpOworCWluc3RhbGxfbm9kZSgmYnRzX25vZGUsIGNvbmZpZ193cml0ZV9idHMpOworCWluc3RhbGxfZGVmYXVsdChCVFNfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c190eXBlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19iYW5kX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19jaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfbGFjX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c190c2NfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2JzaWNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3VuaXRfaWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3N0cmVhbV9pZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfb21sX2UxX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19vbWxfZTFfdGVpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19jaGFsbG9jX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19yYWNoX3R4X2ludGVnZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3JhY2hfbWF4X3RyYW5zX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19jZWxsX2JhcnJlZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfbXNfbWF4X3Bvd2VyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19wZXJfbG9jX3VwZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfY2VsbF9yZXNlbF9oeXN0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19yeGxldl9hY2NfbWluX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX2VuYWJsZWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfcmFjX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX2J2Y2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbnNlaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19uc3ZjaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19uc3ZjX2xwb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX25zdmNfcnBvcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbnN2Y19yaXBfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ190cnhfY21kKTsKKwlpbnN0YWxsX25vZGUoJnRyeF9ub2RlLCBkdW1teV9jb25maWdfd3JpdGUpOworCWluc3RhbGxfZGVmYXVsdChUUlhfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9hcmZjbl9jbWQpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfbm9taW5hbF9wb3dlcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfbWF4X3Bvd2VyX3JlZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfcnNsX2UxX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9yc2xfZTFfdGVpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9yZl9sb2NrZWRfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190c19jbWQpOworCWluc3RhbGxfbm9kZSgmdHNfbm9kZSwgZHVtbXlfY29uZmlnX3dyaXRlKTsKKwlpbnN0YWxsX2RlZmF1bHQoVFNfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KFRTX05PREUsICZjZmdfdHNfcGNoYW5fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFNfTk9ERSwgJmNmZ190c19lMV9zdWJzbG90X2NtZCk7CisKKwlic2NfdnR5X2luaXRfZXh0cmEobmV0KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdnR5X2ludGVyZmFjZV9sYXllcjMuYyBiL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2VfbGF5ZXIzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyNGMzZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2VfbGF5ZXIzLmMKQEAgLTAsMCArMSw1MzEgQEAKKy8qIE9wZW5CU0MgaW50ZXJmYWNlIHRvIHF1YWdnYSBWVFkgKi8KKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHZ0eS9jb21tYW5kLmg+CisjaW5jbHVkZSA8dnR5L2J1ZmZlci5oPgorI2luY2x1ZGUgPHZ0eS92dHkuaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpbGVudF9jYWxsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMTEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCitzdGF0aWMgc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQ7CisKK3N0cnVjdCBjbWRfbm9kZSBzdWJzY3Jfbm9kZSA9IHsKKwlTVUJTQ1JfTk9ERSwKKwkiJXMoc3Vic2NyaWJlcikjIiwKKwkxLAorfTsKKworc3RhdGljIGludCBkdW1teV9jb25maWdfd3JpdGUoc3RydWN0IHZ0eSAqdikKK3sKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyICphcmd2X3RvX2J1ZmZlcihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdLCBpbnQgYmFzZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyICpiID0gYnVmZmVyX25ldygxMDI0KTsKKwlpbnQgaTsKKworCWlmICghYikKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSBiYXNlOyBpIDwgYXJnYzsgaSsrKSB7CisJCWJ1ZmZlcl9wdXRzdHIoYiwgYXJndltpXSk7CisJCWJ1ZmZlcl9wdXRjKGIsICcgJyk7CisJfQorCWJ1ZmZlcl9wdXRjKGIsICdcMCcpOworCisJcmV0dXJuIGI7Cit9CisKK3N0YXRpYyBpbnQgaGV4cGFyc2UoY29uc3QgY2hhciAqc3RyLCB1X2ludDhfdCAqYiwgaW50IG1heF9sZW4pCisKK3sKKwlpbnQgaSwgbCwgdjsKKworCWwgPSBzdHJsZW4oc3RyKTsKKwlpZiAoKGwmMSkgfHwgKChsPj4xKSA+IG1heF9sZW4pKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQoYiwgMHgwMCwgbWF4X2xlbik7CisKKwlmb3IgKGk9MDsgaTxsOyBpKyspIHsKKwkJY2hhciBjID0gc3RyW2ldOworCQlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJCQl2ID0gYyAtICcwJzsKKwkJZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisJCQl2ID0gMTAgKyAoYyAtICdhJyk7CisJCWVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorCQkJdiA9IDEwICsgKGMgLSAnYScpOworCQllbHNlCisJCQlyZXR1cm4gLTE7CisJCWJbaT4+MV0gfD0gdiA8PCAoaSYxID8gMCA6IDQpOworCX0KKworCXJldHVybiBpPj4xOworfQorCisvKiBwZXItc3Vic2NyaWJlciBjb25maWd1cmF0aW9uICovCitERUZVTihjZmdfc3Vic2NyLAorICAgICAgY2ZnX3N1YnNjcl9jbWQsCisgICAgICAic3Vic2NyaWJlciBJTVNJIiwKKyAgICAgICJTZWxlY3QgYSBTdWJzY3JpYmVyIHRvIGNvbmZpZ3VyZVxuIikKK3sKKwljb25zdCBjaGFyICppbXNpID0gYXJndlswXTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShnc21uZXQsIGltc2kpOworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3IgSU1TSSAlcyVzIiwKKwkJCWltc2ksIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCS8qIHZ0eV9nb19wYXJlbnQgc2hvdWxkIHB1dCB0aGlzIHN1YnNjcmliZXIgKi8KKwl2dHktPmluZGV4ID0gc3Vic2NyOworCXZ0eS0+bm9kZSA9IFNVQlNDUl9OT0RFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBzdWJzY3JfZHVtcF9mdWxsX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyBhaW5mbzsKKwlzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgYXR1cGxlOworCisJdnR5X291dCh2dHksICIgICAgSUQ6ICVsbHUsIEF1dGhvcml6ZWQ6ICVkJXMiLCBzdWJzY3ItPmlkLAorCQlzdWJzY3ItPmF1dGhvcml6ZWQsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5uYW1lKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBOYW1lOiAnJXMnJXMiLCBzdWJzY3ItPm5hbWUsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5leHRlbnNpb24pCisJCXZ0eV9vdXQodnR5LCAiICAgIEV4dGVuc2lvbjogJXMlcyIsIHN1YnNjci0+ZXh0ZW5zaW9uLAorCQkJVlRZX05FV0xJTkUpOworCWlmIChzdWJzY3ItPmltc2kpCisJCXZ0eV9vdXQodnR5LCAiICAgIElNU0k6ICVzJXMiLCBzdWJzY3ItPmltc2ksIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT50bXNpICE9IEdTTV9SRVNFUlZFRF9UTVNJKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBUTVNJOiAlMDhYJXMiLCBzdWJzY3ItPnRtc2ksCisJCQlWVFlfTkVXTElORSk7CisKKwlyYyA9IGdldF9hdXRoaW5mb19ieV9zdWJzY3IoJmFpbmZvLCBzdWJzY3IpOworCWlmICghcmMpIHsKKwkJdnR5X291dCh2dHksICIgICAgQTNBOCBhbGdvcml0aG0gaWQ6ICVkJXMiLAorCQkJYWluZm8uYXV0aF9hbGdvLCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICAgIEEzQTggS2k6ICVzJXMiLAorCQkJaGV4ZHVtcChhaW5mby5hM2E4X2tpLCBhaW5mby5hM2E4X2tpX2xlbiksCisJCQlWVFlfTkVXTElORSk7CisJfQorCisJcmMgPSBnZXRfYXV0aHR1cGxlX2J5X3N1YnNjcigmYXR1cGxlLCBzdWJzY3IpOworCWlmICghcmMpIHsKKwkJdnR5X291dCh2dHksICIgICAgQTNBOCBsYXN0IHR1cGxlICh1c2VkICVkIHRpbWVzKTolcyIsCisJCQlhdHVwbGUudXNlX2NvdW50LCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICAgICBzZXEgIyA6ICVkJXMiLAorCQkJYXR1cGxlLmtleV9zZXEsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgICAgIFJBTkQgIDogJXMlcyIsCisJCQloZXhkdW1wKGF0dXBsZS5yYW5kLCBzaXplb2YoYXR1cGxlLnJhbmQpKSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgICAgIFNSRVMgIDogJXMlcyIsCisJCQloZXhkdW1wKGF0dXBsZS5zcmVzLCBzaXplb2YoYXR1cGxlLnNyZXMpKSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgICAgIEtjICAgIDogJXMlcyIsCisJCQloZXhkdW1wKGF0dXBsZS5rYywgc2l6ZW9mKGF0dXBsZS5rYykpLAorCQkJVlRZX05FV0xJTkUpOworCX0KKworCXZ0eV9vdXQodnR5LCAiICAgIFVzZSBjb3VudDogJXUlcyIsIHN1YnNjci0+dXNlX2NvdW50LCBWVFlfTkVXTElORSk7Cit9CisKKworLyogU3Vic2NyaWJlciAqLworREVGVU4oc2hvd19zdWJzY3IsCisgICAgICBzaG93X3N1YnNjcl9jbWQsCisgICAgICAic2hvdyBzdWJzY3JpYmVyIFtJTVNJXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBzdWJzY3JpYmVyXG4iKQoreworCWNvbnN0IGNoYXIgKmltc2k7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwlpZiAoYXJnYyA+PSAxKSB7CisJCWltc2kgPSBhcmd2WzBdOworCQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2ltc2koZ3NtbmV0LCBpbXNpKTsKKwkJaWYgKCFzdWJzY3IpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgdW5rbm93biBzdWJzY3JpYmVyJXMiLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlzdWJzY3JfZHVtcF9mdWxsX3Z0eSh2dHksIHN1YnNjcik7CisJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCisJLyogRklYTUU6IGl0ZXJhdGUgb3ZlciBhbGwgc3Vic2NyaWJlcnMgPyAqLworCXJldHVybiBDTURfV0FSTklORzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19zdWJzY3JfY2FjaGUsCisgICAgICBzaG93X3N1YnNjcl9jYWNoZV9jbWQsCisgICAgICAic2hvdyBzdWJzY3JpYmVyIGNhY2hlIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBjb250ZW50cyBvZiBzdWJzY3JpYmVyIGNhY2hlXG4iKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoc3Vic2NyLCAmYWN0aXZlX3N1YnNjcmliZXJzLCBlbnRyeSkgeworCQl2dHlfb3V0KHZ0eSwgIiAgU3Vic2NyaWJlcjolcyIsIFZUWV9ORVdMSU5FKTsKKwkJc3Vic2NyX2R1bXBfZnVsbF92dHkodnR5LCBzdWJzY3IpOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc21zX3NlbmRfcGVuZCwKKyAgICAgIHNtc19zZW5kX3BlbmRfY21kLAorICAgICAgInNtcyBzZW5kIHBlbmRpbmciLAorICAgICAgIlNlbmQgYWxsIHBlbmRpbmcgU01TIikKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCWludCBpZCA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlzbXMgPSBkYl9zbXNfZ2V0X3Vuc2VudF9ieV9zdWJzY3IoZ3NtbmV0LCBpZCk7CisJCWlmICghc21zKQorCQkJYnJlYWs7CisKKwkJZ3NtNDExX3NlbmRfc21zX3N1YnNjcihzbXMtPnJlY2VpdmVyLCBzbXMpOworCisJCWlkID0gc21zLT5yZWNlaXZlci0+aWQgKyAxOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RydWN0IGdzbV9zbXMgKnNtc19mcm9tX3RleHQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpyZWNlaXZlciwgY29uc3QgY2hhciAqdGV4dCkKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zID0gc21zX2FsbG9jKCk7CisKKwlpZiAoIXNtcykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIXJlY2VpdmVyLT5sYWMpIHsKKwkJLyogc3Vic2NyaWJlciBjdXJyZW50bHkgbm90IGF0dGFjaGVkLCBzdG9yZSBpbiBkYXRhYmFzZT8gKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc21zLT5yZWNlaXZlciA9IHN1YnNjcl9nZXQocmVjZWl2ZXIpOworCXN0cm5jcHkoc21zLT50ZXh0LCB0ZXh0LCBzaXplb2Yoc21zLT50ZXh0KS0xKTsKKworCS8qIEZJWE1FOiBkb24ndCB1c2UgSUQgMSBzdGF0aWMgKi8KKwlzbXMtPnNlbmRlciA9IHN1YnNjcl9nZXRfYnlfaWQoZ3NtbmV0LCAxKTsKKwlzbXMtPnJlcGx5X3BhdGhfcmVxID0gMDsKKwlzbXMtPnN0YXR1c19yZXBfcmVxID0gMDsKKwlzbXMtPnVkX2hkcl9pbmQgPSAwOworCXNtcy0+cHJvdG9jb2xfaWQgPSAwOyAvKiBpbXBsaWNpdCAqLworCXNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lID0gMDsgLyogZGVmYXVsdCA3Yml0ICovCisJc3RybmNweShzbXMtPmRlc3RfYWRkciwgcmVjZWl2ZXItPmV4dGVuc2lvbiwgc2l6ZW9mKHNtcy0+ZGVzdF9hZGRyKS0xKTsKKwkvKiBHZW5lcmF0ZSB1c2VyX2RhdGEgKi8KKwlzbXMtPnVzZXJfZGF0YV9sZW4gPSBnc21fN2JpdF9lbmNvZGUoc21zLT51c2VyX2RhdGEsIHNtcy0+dGV4dCk7CisKKwlyZXR1cm4gc21zOworfQorCitzdGF0aWMgaW50IF9zZW5kX3Ntc19idWZmZXIoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpyZWNlaXZlciwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlciAqYiwgdV9pbnQ4X3QgdHBfcGlkKQoreworCXN0cnVjdCBnc21fc21zICpzbXM7CisKKwlzbXMgPSBzbXNfZnJvbV90ZXh0KHJlY2VpdmVyLCBidWZmZXJfZ2V0c3RyKGIpKTsKKwlzbXMtPnByb3RvY29sX2lkID0gdHBfcGlkOworCWdzbTQxMV9zZW5kX3Ntc19zdWJzY3IocmVjZWl2ZXIsIHNtcyk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKmdldF9zdWJzY3JfYnlfYXJndihjb25zdCBjaGFyICp0eXBlLAorCQkJCQkJIGNvbnN0IGNoYXIgKmlkKQoreworCWlmICghc3RyY21wKHR5cGUsICJleHRlbnNpb24iKSkKKwkJcmV0dXJuIHN1YnNjcl9nZXRfYnlfZXh0ZW5zaW9uKGdzbW5ldCwgaWQpOworCWVsc2UgaWYgKCFzdHJjbXAodHlwZSwgImltc2kiKSkKKwkJcmV0dXJuIHN1YnNjcl9nZXRfYnlfaW1zaShnc21uZXQsIGlkKTsKKwllbHNlIGlmICghc3RyY21wKHR5cGUsICJ0bXNpIikpCisJCXJldHVybiBzdWJzY3JfZ2V0X2J5X3Rtc2koZ3NtbmV0LCBhdG9pKGlkKSk7CisJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAiaWQiKSkKKwkJcmV0dXJuIHN1YnNjcl9nZXRfYnlfaWQoZ3NtbmV0LCBhdG9pKGlkKSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKyNkZWZpbmUgU1VCU0NSX1RZUEVTICIoZXh0ZW5zaW9ufGltc2l8dG1zaXxpZCkiCisKK0RFRlVOKHN1YnNjcmliZXJfc2VuZF9zbXMsCisgICAgICBzdWJzY3JpYmVyX3NlbmRfc21zX2NtZCwKKyAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgRVhURU4gc21zIHNlbmQgLkxJTkUiLAorICAgICAgIlNlbGVjdCBzdWJzY3JpYmVyIGJhc2VkIG9uIGV4dGVuc2lvbiIpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBnZXRfc3Vic2NyX2J5X2FyZ3YoYXJndlswXSwgYXJndlsxXSk7CisJc3RydWN0IGJ1ZmZlciAqYjsKKwlpbnQgcmM7CisKKwlpZiAoIXN1YnNjcikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIE5vIHN1YnNjcmliZXIgZm91bmQgZm9yICVzICVzJXMiLAorCQkJYXJndlswXSwgYXJndlsxXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWIgPSBhcmd2X3RvX2J1ZmZlcihhcmdjLCBhcmd2LCAyKTsKKwlyYyA9IF9zZW5kX3Ntc19idWZmZXIoc3Vic2NyLCBiLCAwKTsKKwlidWZmZXJfZnJlZShiKTsKKworCXN1YnNjcl9wdXQoc3Vic2NyKTsKKworCXJldHVybiByYzsKK30KKworREVGVU4oc3Vic2NyaWJlcl9zaWxlbnRfc21zLAorICAgICAgc3Vic2NyaWJlcl9zaWxlbnRfc21zX2NtZCwKKyAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgRVhURU4gc2lsZW50IHNtcyBzZW5kIC5MSU5FIiwKKyAgICAgICJTZWxlY3Qgc3Vic2NyaWJlciBiYXNlZCBvbiBleHRlbnNpb24iKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCXN0cnVjdCBidWZmZXIgKmI7CisJaW50IHJjOworCisJaWYgKCFzdWJzY3IpIHsKKwkJdnR5X291dCh2dHksICIlJSBObyBzdWJzY3JpYmVyIGZvdW5kIGZvciAlcyAlcyVzIiwKKwkJCWFyZ3ZbMF0sIGFyZ3ZbMV0sIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWIgPSBhcmd2X3RvX2J1ZmZlcihhcmdjLCBhcmd2LCAyKTsKKwlyYyA9IF9zZW5kX3Ntc19idWZmZXIoc3Vic2NyLCBiLCA2NCk7CisJYnVmZmVyX2ZyZWUoYik7CisKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwlyZXR1cm4gcmM7Cit9CisKK0RFRlVOKHN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RhcnQsCisgICAgICBzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0YXJ0X2NtZCwKKyAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgRVhURU4gc2lsZW50IGNhbGwgc3RhcnQgKGFueXx0Y2gvZnx0Y2gvYW55fHNkY2NoKSIsCisgICAgICAiU3RhcnQgYSBzaWxlbnQgY2FsbCB0byBhIHN1YnNjcmliZXIiKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCWludCByYywgdHlwZTsKKworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3VuZCBmb3IgJXMgJXMlcyIsCisJCQlhcmd2WzBdLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoIXN0cmNtcChhcmd2WzJdLCAidGNoL2YiKSkKKwkJdHlwZSA9IFJTTF9DSEFOTkVFRF9UQ0hfRjsKKwllbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0Y2gvYW55IikpCisJCXR5cGUgPSBSU0xfQ0hBTk5FRURfVENIX0Zvckg7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAic2RjY2giKSkKKwkJdHlwZSA9IFJTTF9DSEFOTkVFRF9TRENDSDsKKwllbHNlCisJCXR5cGUgPSBSU0xfQ0hBTk5FRURfQU5ZOwkvKiBEZWZhdWx0cyB0byBBTlkgKi8KKworCXJjID0gZ3NtX3NpbGVudF9jYWxsX3N0YXJ0KHN1YnNjciwgdnR5LCB0eXBlKTsKKwlpZiAocmMgPD0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFN1YnNjcmliZXIgbm90IGF0dGFjaGVkJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RvcCwKKyAgICAgIHN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RvcF9jbWQsCisgICAgICAic3Vic2NyaWJlciAiIFNVQlNDUl9UWVBFUyAiIEVYVEVOIHNpbGVudCBjYWxsIHN0b3AiLAorICAgICAgIlN0b3AgYSBzaWxlbnQgY2FsbCB0byBhIHN1YnNjcmliZXIiKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCWludCByYzsKKworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3VuZCBmb3IgJXMgJXMlcyIsCisJCQlhcmd2WzBdLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlyYyA9IGdzbV9zaWxlbnRfY2FsbF9zdG9wKHN1YnNjcik7CisJaWYgKHJjIDwgMCkgeworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19zdWJzY3JfbmFtZSwKKyAgICAgIGNmZ19zdWJzY3JfbmFtZV9jbWQsCisgICAgICAibmFtZSBOQU1FIiwKKyAgICAgICJTZXQgdGhlIG5hbWUgb2YgdGhlIHN1YnNjcmliZXIiKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBhcmd2WzBdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gdnR5LT5pbmRleDsKKworCXN0cm5jcHkoc3Vic2NyLT5uYW1lLCBuYW1lLCBzaXplb2Yoc3Vic2NyLT5uYW1lKSk7CisKKwlkYl9zeW5jX3N1YnNjcmliZXIoc3Vic2NyKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3N1YnNjcl9leHRlbnNpb24sCisgICAgICBjZmdfc3Vic2NyX2V4dGVuc2lvbl9jbWQsCisgICAgICAiZXh0ZW5zaW9uIEVYVEVOU0lPTiIsCisgICAgICAiU2V0IHRoZSBleHRlbnNpb24gb2YgdGhlIHN1YnNjcmliZXIiKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBhcmd2WzBdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gdnR5LT5pbmRleDsKKworCXN0cm5jcHkoc3Vic2NyLT5leHRlbnNpb24sIG5hbWUsIHNpemVvZihzdWJzY3ItPmV4dGVuc2lvbikpOworCisJZGJfc3luY19zdWJzY3JpYmVyKHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19zdWJzY3JfYXV0aG9yaXplZCwKKyAgICAgIGNmZ19zdWJzY3JfYXV0aG9yaXplZF9jbWQsCisgICAgICAiYXV0aCA8MC0xPiIsCisgICAgICAiU2V0IHRoZSBhdXRob3JpemF0aW9uIHN0YXR1cyBvZiB0aGUgc3Vic2NyaWJlciIpCit7CisJaW50IGF1dGggPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gdnR5LT5pbmRleDsKKworCWlmIChhdXRoKQorCQlzdWJzY3ItPmF1dGhvcml6ZWQgPSAxOworCWVsc2UKKwkJc3Vic2NyLT5hdXRob3JpemVkID0gMDsKKworCWRiX3N5bmNfc3Vic2NyaWJlcihzdWJzY3IpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjZGVmaW5lIEEzQThfQUxHX1RZUEVTICIobm9uZXxjb21wMTI4djEpIgorCitERUZVTihjZmdfc3Vic2NyX2EzYTgsCisgICAgICBjZmdfc3Vic2NyX2EzYThfY21kLAorICAgICAgImEzYTggIiBBM0E4X0FMR19UWVBFUyAiIFtLSV0iLAorICAgICAgIlNldCBhM2E4IHBhcmFtZXRlcnMgZm9yIHRoZSBzdWJzY3JpYmVyIikKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHZ0eS0+aW5kZXg7CisJY29uc3QgY2hhciAqYWxnX3N0ciA9IGFyZ3ZbMF07CisJY29uc3QgY2hhciAqa2lfc3RyID0gYXJndlsxXTsKKwlzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyBhaW5mbzsKKwlpbnQgcmM7CisKKwlpZiAoIXN0cmNhc2VjbXAoYWxnX3N0ciwgIm5vbmUiKSkgeworCQkvKiBKdXN0IGVyYXNlICovCisJCXJjID0gc2V0X2F1dGhpbmZvX2Zvcl9zdWJzY3IoTlVMTCwgc3Vic2NyKTsKKwl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFsZ19zdHIsICJjb21wMTI4djEiKSkgeworCQkvKiBQYXJzZSBoZXggc3RyaW5nIEtpICovCisJCXJjID0gaGV4cGFyc2Uoa2lfc3RyLCBhaW5mby5hM2E4X2tpLCBzaXplb2YoYWluZm8uYTNhOF9raSkpOworCQlpZiAocmMgIT0gMTYpCisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwkJLyogU2V0IHRoZSBpbmZvcyAqLworCQlhaW5mby5hdXRoX2FsZ28gPSBBVVRIX0FMR09fQ09NUDEyOHYxOworCQlhaW5mby5hM2E4X2tpX2xlbiA9IHJjOworCQlyYyA9IHNldF9hdXRoaW5mb19mb3Jfc3Vic2NyKCZhaW5mbywgc3Vic2NyKTsKKwl9IGVsc2UgeworCQkvKiBVbmtub3duIG1ldGhvZCAqLworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJcmV0dXJuIHJjID8gQ01EX1dBUk5JTkcgOiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzY2FsbF9jYmZuKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQl2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBzY2FsbF9zaWduYWxfZGF0YSAqc2lnZGF0YSA9IHNpZ25hbF9kYXRhOworCXN0cnVjdCB2dHkgKnZ0eSA9IHNpZ2RhdGEtPmRhdGE7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19TQ0FMTF9TVUNDRVNTOgorCQl2dHlfb3V0KHZ0eSwgIiUlIHNpbGVudCBjYWxsIG9uIEFSRkNOICV1IHRpbWVzbG90ICV1JXMiLAorCQkJc2lnZGF0YS0+bGNoYW4tPnRzLT50cngtPmFyZmNuLCBzaWdkYXRhLT5sY2hhbi0+dHMtPm5yLAorCQkJVlRZX05FV0xJTkUpOworCQlicmVhazsKKwljYXNlIFNfU0NBTExfRVhQSVJFRDoKKwkJdnR5X291dCh2dHksICIlJSBzaWxlbnQgY2FsbCBleHBpcmVkIHBhZ2luZyVzIiwgVlRZX05FV0xJTkUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBic2NfdnR5X2luaXRfZXh0cmEoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJZ3NtbmV0ID0gbmV0OworCisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfU0NBTEwsIHNjYWxsX2NiZm4sIE5VTEwpOworCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfc3Vic2NyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfc3Vic2NyX2NhY2hlX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc21zX3NlbmRfcGVuZF9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnN1YnNjcmliZXJfc2VuZF9zbXNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc3Vic2NyaWJlcl9zaWxlbnRfc21zX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RhcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc3Vic2NyaWJlcl9zaWxlbnRfY2FsbF9zdG9wX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfc3Vic2NyX2NtZCk7CisJaW5zdGFsbF9ub2RlKCZzdWJzY3Jfbm9kZSwgZHVtbXlfY29uZmlnX3dyaXRlKTsKKworCWluc3RhbGxfZGVmYXVsdChTVUJTQ1JfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KFNVQlNDUl9OT0RFLCAmY2ZnX3N1YnNjcl9uYW1lX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFNVQlNDUl9OT0RFLCAmY2ZnX3N1YnNjcl9leHRlbnNpb25fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoU1VCU0NSX05PREUsICZjZmdfc3Vic2NyX2F1dGhvcml6ZWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoU1VCU0NSX05PREUsICZjZmdfc3Vic2NyX2EzYThfY21kKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9NYWtlZmlsZS5hbSBiL29wZW5ic2MvdGVzdHMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxYjkzMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSBAQAorU1VCRElSUyA9IGRlYnVnIGdzbTA0MDggZGIgY2hhbm5lbCBzY2NwCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2NoYW5uZWwvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3Rlc3RzL2NoYW5uZWwvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyOTY1OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvY2hhbm5lbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE1IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsIC1nZ2RiMyAkKExJQk9TTU9DT1JFX0NGTEFHUykKKworbm9pbnN0X1BST0dSQU1TID0gY2hhbm5lbF90ZXN0CisKK2NoYW5uZWxfdGVzdF9TT1VSQ0VTID0gY2hhbm5lbF90ZXN0LmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2RiLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2dzbV9zdWJzY3JpYmVyX2Jhc2UuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvZ3NtX3N1YnNjcmliZXIuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvZGVidWcuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvZ3NtX2RhdGEuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvYnRzX2lwYWNjZXNzX25hbm9idHMuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvYnRzX3NpZW1lbnNfYnMxMS5jCitjaGFubmVsX3Rlc3RfTERBREQgPSAtbGRsIC1sZGJpICQoTElCT1NNT0NPUkVfTElCUykKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9jaGFubmVsL2NoYW5uZWxfdGVzdC5jIGIvb3BlbmJzYy90ZXN0cy9jaGFubmVsL2NoYW5uZWxfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OTAwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2NoYW5uZWwvY2hhbm5lbF90ZXN0LmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKworLyogb3VyIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgc3Vic2NyX2NiKHVuc2lnbmVkIGludCBob29rLCB1bnNpZ25lZCBpbnQgZXZlbnQsIHN0cnVjdCBtc2diICptc2csIHZvaWQgKmRhdGEsIHZvaWQgKnBhcmFtKQoreworCWFzc2VydChob29rID09IDEwMSk7CisJYXNzZXJ0KGV2ZW50ID09IDIwMCk7CisJYXNzZXJ0KG1zZyA9PSAodm9pZCopMHgxMzIzTCk7CisJYXNzZXJ0KGRhdGEgPT0gKHZvaWQqKTB4NDI0MkwpOworCWFzc2VydChwYXJhbSA9PSAodm9pZCopMHgyMzQyTCk7CisJcHJpbnRmKCJSZWFjaGVkLCBkaWRuJ3QgY3Jhc2gsIHRlc3QgcGFzc2VkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogbW9jayBvYmplY3QgZm9yIHRlc3RpbmcsIGRpcmVjdGx5IGludm9rZSB0aGUgY2IuLi4gbWF5YmUgbGF0ZXIgdGhyb3VnaCB0aGUgdGltZXIgKi8KK3ZvaWQgcGFnaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyLCBpbnQgdHlwZSwgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmRhdGEpCit7CisJY2JmbigxMDEsIDIwMCwgKHZvaWQqKTB4MTMyM0wsICh2b2lkKikweDQyNDJMLCBkYXRhKTsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrOworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlwcmludGYoIlRlc3RpbmcgdGhlIGdzbV9zdWJzY3JpYmVyIGNoYW4gbG9naWNcbiIpOworCisJLyogQ3JlYXRlIGEgZHVtbXkgbmV0d29yayAqLworCW5ldHdvcmsgPSBnc21fbmV0d29ya19pbml0KDEsIDEsIE5VTEwpOworCWlmICghbmV0d29yaykKKwkJZXhpdCgxKTsKKwlidHMgPSBnc21fYnRzX2FsbG9jKG5ldHdvcmssIEdTTV9CVFNfVFlQRV9CUzExLCAwLCAwKTsKKwlidHMtPmxvY2F0aW9uX2FyZWFfY29kZSA9IDIzOworCisJLyogQ3JlYXRlIGEgZHVtbXkgc3Vic2NyaWJlciAqLworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gc3Vic2NyX2FsbG9jKCk7CisJc3Vic2NyLT5sYWMgPSAyMzsKKwlzdWJzY3ItPm5ldCA9IG5ldHdvcms7CisKKwkvKiBBc2sgZm9yIGEgY2hhbm5lbC4uLiAqLworCXN1YnNjcl9nZXRfY2hhbm5lbChzdWJzY3IsIFJTTF9DSEFOTkVFRF9UQ0hfRiwgc3Vic2NyX2NiLCAodm9pZCopMHgyMzQyTCk7CisKKwl3aGlsZSAoMSkgeworCQlic2Nfc2VsZWN0X21haW4oMCk7CisJfQorfQorCit2b2lkIG5tX3N0YXRlX2V2ZW50KCkge30KK3ZvaWQgaW5wdXRfZXZlbnQoKSB7fQordm9pZCBzbXNfYWxsb2MoKSB7fQorCitzdHJ1Y3QgdGx2X2RlZmluaXRpb24gbm1fYXR0X3RsdmRlZjsKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9kYi9NYWtlZmlsZS5hbSBiL29wZW5ic2MvdGVzdHMvZGIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmViOTE4MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZGIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsIC1nZ2RiMyAkKExJQk9TTU9DT1JFX0NGTEFHUykKKworbm9pbnN0X1BST0dSQU1TID0gZGJfdGVzdAorCitkYl90ZXN0X1NPVVJDRVMgPSBkYl90ZXN0LmMKK2RiX3Rlc3RfTERBREQgPSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYmJzYy5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGlibXNjLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKExJQk9TTU9DT1JFX0xJQlMpIC1sZGwgLWxkYmkKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9kYi9kYl90ZXN0LmMgYi9vcGVuYnNjL3Rlc3RzL2RiL2RiX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTY4YWNiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9kYi9kYl90ZXN0LmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIChDKSAyMDA4IGJ5IEphbiBMdWViYmUgPGpsdWViYmVAZGViaWFuLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBDT01QQVJFKG9yaWdpbmFsLCBjb3B5KSBcCisJaWYgKG9yaWdpbmFsLT5pZCAhPSBjb3B5LT5pZCkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIklkcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJWxsdSAlbGx1XG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+aWQsIGNvcHktPmlkKTsgXAorCWlmIChvcmlnaW5hbC0+bGFjICE9IGNvcHktPmxhYykgXAorCQlmcHJpbnRmKHN0ZGVyciwgIkxBQyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJWQgJWRcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT5sYWMsIGNvcHktPmxhYyk7IFwKKwlpZiAob3JpZ2luYWwtPmF1dGhvcml6ZWQgIT0gY29weS0+YXV0aG9yaXplZCkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIkF1dGhvcml6ZSBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJWQgJWRcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT5hdXRob3JpemVkLCBcCisJCQljb3B5LT5hdXRob3JpemVkKTsgXAorCWlmIChzdHJjbXAob3JpZ2luYWwtPmltc2ksIGNvcHktPmltc2kpICE9IDApIFwKKwkJZnByaW50ZihzdGRlcnIsICJJTVNJcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJyVzJyAnJXMnXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+aW1zaSwgY29weS0+aW1zaSk7IFwKKwlpZiAob3JpZ2luYWwtPnRtc2kgIT0gY29weS0+dG1zaSkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIlRNU0lzIGRvIG5vdCBtYXRjaCBpbiAlczolZCAnJXUnICcldSdcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT50bXNpLCBjb3B5LT50bXNpKTsgXAorCWlmIChzdHJjbXAob3JpZ2luYWwtPm5hbWUsIGNvcHktPm5hbWUpICE9IDApIFwKKwkJZnByaW50ZihzdGRlcnIsICJuYW1lcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJyVzJyAnJXMnXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+bmFtZSwgY29weS0+bmFtZSk7IFwKKwlpZiAoc3RyY21wKG9yaWdpbmFsLT5leHRlbnNpb24sIGNvcHktPmV4dGVuc2lvbikgIT0gMCkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIm5hbWVzIGRvIG5vdCBtYXRjaCBpbiAlczolZCAnJXMnICclcydcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT5leHRlbnNpb24sIGNvcHktPmV4dGVuc2lvbik7IFwKKworaW50IG1haW4oKSB7CisKKwlpZiAoZGJfaW5pdCgiaGxyLnNxbGl0ZTMiKSkgeworCQlwcmludGYoIkRCOiBGYWlsZWQgdG8gaW5pdCBkYXRhYmFzZS4gUGxlYXNlIGNoZWNrIHRoZSBvcHRpb24gc2V0dGluZ3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQkgCisJcHJpbnRmKCJEQjogRGF0YWJhc2UgaW5pdGlhbGl6ZWQuXG4iKTsKKworCWlmIChkYl9wcmVwYXJlKCkpIHsKKwkJcHJpbnRmKCJEQjogRmFpbGVkIHRvIHByZXBhcmUgZGF0YWJhc2UuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXByaW50ZigiREI6IERhdGFiYXNlIHByZXBhcmVkLlxuIik7CisKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKmFsaWNlID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKmFsaWNlX2RiOworCisJY2hhciAqYWxpY2VfaW1zaSA9ICIzMjQzMjQ1NDMyMzQ1IjsKKwlhbGljZSA9IGRiX2NyZWF0ZV9zdWJzY3JpYmVyKE5VTEwsIGFsaWNlX2ltc2kpOworCWRiX3N5bmNfc3Vic2NyaWJlcihhbGljZSk7CisJYWxpY2VfZGIgPSBkYl9nZXRfc3Vic2NyaWJlcihOVUxMLCBHU01fU1VCU0NSSUJFUl9JTVNJLCBhbGljZS0+aW1zaSk7CisJQ09NUEFSRShhbGljZSwgYWxpY2VfZGIpOworCXN1YnNjcl9wdXQoYWxpY2VfZGIpOworCXN1YnNjcl9wdXQoYWxpY2UpOworCisJYWxpY2VfaW1zaSA9ICIzNjkzMjQ1NDIzNDQ1IjsKKwlhbGljZSA9IGRiX2NyZWF0ZV9zdWJzY3JpYmVyKE5VTEwsIGFsaWNlX2ltc2kpOworCWRiX3N1YnNjcmliZXJfYXNzb2NfaW1laShhbGljZSwgIjEyMzQ1Njc4OTAiKTsKKwlkYl9zdWJzY3JpYmVyX2FsbG9jX3Rtc2koYWxpY2UpOworCWFsaWNlLT5sYWM9NDI7CisJZGJfc3luY19zdWJzY3JpYmVyKGFsaWNlKTsKKwlhbGljZV9kYiA9IGRiX2dldF9zdWJzY3JpYmVyKE5VTEwsIEdTTV9TVUJTQ1JJQkVSX0lNU0ksIGFsaWNlX2ltc2kpOworCUNPTVBBUkUoYWxpY2UsIGFsaWNlX2RiKTsKKwlzdWJzY3JfcHV0KGFsaWNlKTsKKwlzdWJzY3JfcHV0KGFsaWNlX2RiKTsKKworCWFsaWNlX2ltc2kgPSAiOTk5MzI0NTQyMzQ0NSI7CisJYWxpY2UgPSBkYl9jcmVhdGVfc3Vic2NyaWJlcihOVUxMLCBhbGljZV9pbXNpKTsKKwlkYl9zdWJzY3JpYmVyX2FsbG9jX3Rtc2koYWxpY2UpOworCWFsaWNlLT5sYWM9NDI7CisJZGJfc3luY19zdWJzY3JpYmVyKGFsaWNlKTsKKwlkYl9zdWJzY3JpYmVyX2Fzc29jX2ltZWkoYWxpY2UsICIxMjM0NTY3ODkwIik7CisJZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKGFsaWNlLCAiNjU0MzU2MDkyMCIpOworCWFsaWNlX2RiID0gZGJfZ2V0X3N1YnNjcmliZXIoTlVMTCwgR1NNX1NVQlNDUklCRVJfSU1TSSwgYWxpY2VfaW1zaSk7CisJQ09NUEFSRShhbGljZSwgYWxpY2VfZGIpOworCXN1YnNjcl9wdXQoYWxpY2UpOworCXN1YnNjcl9wdXQoYWxpY2VfZGIpOworCisJZGJfZmluaSgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHN0dWJzICovCit2b2lkIGlucHV0X2V2ZW50KHZvaWQpIHt9Cit2b2lkIG5tX3N0YXRlX2V2ZW50KHZvaWQpIHt9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2RlYnVnL01ha2VmaWxlLmFtIGIvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDIzZmQxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDYgQEAKK0lOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCitBTV9DRkxBR1M9LVdhbGwgJChMSUJPU01PQ09SRV9DRkxBR1MpCitub2luc3RfUFJPR1JBTVMgPSBkZWJ1Z190ZXN0CisKK2RlYnVnX3Rlc3RfU09VUkNFUyA9IGRlYnVnX3Rlc3QuYyAkKHRvcF9zcmNkaXIpL3NyYy9kZWJ1Zy5jIAorZGVidWdfdGVzdF9MREFERCA9ICQoTElCT1NNT0NPUkVfTElCUykKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZGVidWcvZGVidWdfdGVzdC5jIGIvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9kZWJ1Z190ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1ZDY1YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZGVidWcvZGVidWdfdGVzdC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIHNpbXBsZSB0ZXN0IGZvciB0aGUgZGVidWcgaW50ZXJmYWNlICovCisvKgorICogKEMpIDIwMDgsIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCXN0cnVjdCBsb2dfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OworCisJbG9nX2luaXQoJmxvZ19pbmZvKTsKKwlzdGRlcnJfdGFyZ2V0ID0gbG9nX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJbG9nX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7CisJbG9nX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCisJbG9nX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgIkRSTEwiKTsKKwlERUJVR1AoRENDLCAiWW91IHNob3VsZCBub3Qgc2VlIHRoaXNcbiIpOworCisJbG9nX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgIkRSTEw6RENDIik7CisJREVCVUdQKERSTEwsICJZb3Ugc2hvdWxkIHNlZSB0aGlzXG4iKTsKKwlERUJVR1AoRENDLCAiWW91IHNob3VsZCBzZWUgdGhpc1xuIik7CisJREVCVUdQKERNTSwgIllvdSBzaG91bGQgbm90IHNlZSB0aGlzXG4iKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9NYWtlZmlsZS5hbSBiL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOThjNjczCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9nc20wNDA4L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNiBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0FNX0NGTEFHUz0tV2FsbCAkKExJQk9TTU9DT1JFX0NGTEFHUykKK25vaW5zdF9QUk9HUkFNUyA9IGdzbTA0MDhfdGVzdAorCitnc20wNDA4X3Rlc3RfU09VUkNFUyA9IGdzbTA0MDhfdGVzdC5jCitnc20wNDA4X3Rlc3RfTERBREQgPSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYmJzYy5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGlibXNjLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKExJQk9TTU9DT1JFX0xJQlMpIC1sZGJpCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2dzbTA0MDgvZ3NtMDQwOF90ZXN0LmMgYi9vcGVuYnNjL3Rlc3RzL2dzbTA0MDgvZ3NtMDQwOF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3ZDRlZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9nc20wNDA4X3Rlc3QuYwpAQCAtMCwwICsxLDExMiBAQAorLyogc2ltcGxlIHRlc3QgZm9yIHRoZSBnc20wNDA4IGZvcm1hdHRpbmcgZnVuY3Rpb25zICovCisvKgorICogKEMpIDIwMDggYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKyNkZWZpbmUgQ09NUEFSRShyZXN1bHQsIG9wLCB2YWx1ZSkgXAorICAgIGlmICghKChyZXN1bHQpIG9wICh2YWx1ZSkpKSB7XAorCWZwcmludGYoc3RkZXJyLCAiQ29tcGFyZSBmYWlsZWQuIFdhcyAleCBzaG91bGQgYmUgJXggaW4gJXM6JWRcbiIscmVzdWx0LCB2YWx1ZSwgX19GSUxFX18sIF9fTElORV9fKTsgXAorCWV4aXQoLTEpOyBcCisgICAgfQorCisjZGVmaW5lIENPTVBBUkVfU1RSKHJlc3VsdCwgdmFsdWUpIFwKKwlpZiAoc3RyY21wKHJlc3VsdCwgdmFsdWUpICE9IDApIHsgXAorCQlmcHJpbnRmKHN0ZGVyciwgIkNvbXBhcmUgZmFpbGVkLiBXYXMgJXMgc2hvdWxkIGJlICVzIGluICVzOiVkXG4iLHJlc3VsdCwgdmFsdWUsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKwkJZXhpdCgtMSk7IFwKKwl9CisKKy8qCisgKiBUZXN0IExvY2F0aW9uIEFyZWEgSWRlbnRpZmllciBmb3JtYXR0aW5nLiBUYWJsZSAxMC41LjMgb2YgMDQuMDgKKyAqLworc3RhdGljIHZvaWQgdGVzdF9sb2NhdGlvbl9hcmVhX2lkZW50aWZpZXIodm9pZCkKK3sKKyAgICBzdHJ1Y3QgZ3NtNDhfbG9jX2FyZWFfaWQgbGFpNDg7CisKKyAgICBwcmludGYoIlRlc3RpbmcgdGVzdCBsb2NhdGlvbiBhcmVhIGlkZW50aWZpZXJcbiIpOworCisgICAgLyoKKyAgICAgKiBUZXN0IHRoZSBkZWZhdWx0L3Rlc3Qgc2V0dXAuIENvbWluZyBmcm9tCisgICAgICogYnNjX2hhY2suYyBkdW1wcworICAgICAqLworICAgIGdzbTQ4X2dlbmVyYXRlX2xhaSgmbGFpNDgsIDEsIDEsIDEpOworICAgIENPTVBBUkUobGFpNDguZGlnaXRzWzBdLCA9PSwgMHgwMCk7CisgICAgQ09NUEFSRShsYWk0OC5kaWdpdHNbMV0sID09LCAweEYxKTsKKyAgICBDT01QQVJFKGxhaTQ4LmRpZ2l0c1syXSwgPT0sIDB4MTApOworICAgIENPTVBBUkUobGFpNDgubGFjLCA9PSwgaHRvbnMoMHgwMDAxKSk7CisKKyAgICBnc200OF9nZW5lcmF0ZV9sYWkoJmxhaTQ4LCA2MDIsIDEsIDE1KTsKKyAgICBDT01QQVJFKGxhaTQ4LmRpZ2l0c1swXSwgPT0sIDB4MDYpOworICAgIENPTVBBUkUobGFpNDguZGlnaXRzWzFdLCA9PSwgMHhGMik7CisgICAgQ09NUEFSRShsYWk0OC5kaWdpdHNbMl0sID09LCAweDEwKTsKKyAgICBDT01QQVJFKGxhaTQ4LmxhYywgPT0sIGh0b25zKDB4MDAwZikpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X21pX2Z1bmN0aW9uYWxpdHkodm9pZCkKK3sKKwljb25zdCBjaGFyICppbXNpX29kZCAgPSAiOTg3NjU0MzIxMDk4NzYzIjsKKwljb25zdCBjaGFyICppbXNpX2V2ZW4gPSAiOTg3NjU0MzIxMDk4NzY1NCI7CisJY29uc3QgdV9pbnQzMl90IHRtc2kgPSAweGZhYmVhY2QwOworCXVfaW50OF90IG1pWzEyOF07CisJdW5zaWduZWQgaW50IG1pX2xlbjsKKwljaGFyIG1pX3BhcnNlZFtHU000OF9NSV9TSVpFXTsKKworCXByaW50ZigiVGVzdGluZyBwYXJzaW5nIGFuZCBnZW5lcmF0aW5nIFRNU0kvSU1TSVxuIik7CisKKwkvKiB0bXNpIGNvZGUgKi8KKwltaV9sZW4gPSBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV90bXNpKG1pLCB0bXNpKTsKKwlnc200OF9taV90b19zdHJpbmcobWlfcGFyc2VkLCBzaXplb2YobWlfcGFyc2VkKSwgbWkgKyAyLCBtaV9sZW4gLSAyKTsKKwlDT01QQVJFKCh1X2ludDMyX3Qpc3RydG91bChtaV9wYXJzZWQsIE5VTEwsIDEwKSwgPT0sIHRtc2kpOworCisJLyogaW1zaSBjb2RlICovCisJbWlfbGVuID0gZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21faW1zaShtaSwgaW1zaV9vZGQpOworCWdzbTQ4X21pX3RvX3N0cmluZyhtaV9wYXJzZWQsIHNpemVvZihtaV9wYXJzZWQpLCBtaSArIDIsIG1pX2xlbiAtMik7CisJcHJpbnRmKCJoZXg6ICVzXG4iLCBoZXhkdW1wKG1pLCBtaV9sZW4pKTsKKwlDT01QQVJFX1NUUihtaV9wYXJzZWQsIGltc2lfb2RkKTsKKworCW1pX2xlbiA9IGdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX2ltc2kobWksIGltc2lfZXZlbik7CisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3BhcnNlZCwgc2l6ZW9mKG1pX3BhcnNlZCksIG1pICsgMiwgbWlfbGVuIC0yKTsKKwlwcmludGYoImhleDogJXNcbiIsIGhleGR1bXAobWksIG1pX2xlbikpOworCUNPTVBBUkVfU1RSKG1pX3BhcnNlZCwgaW1zaV9ldmVuKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCXRlc3RfbG9jYXRpb25fYXJlYV9pZGVudGlmaWVyKCk7CisJdGVzdF9taV9mdW5jdGlvbmFsaXR5KCk7CisKKwlleGl0KDApOworfQorCisKKworLyoKKyAqIFN0dWJzIHRvIGNvbXBpbGUgYW5kIGxpbmsKKyAqLwordm9pZCBpbnB1dF9ldmVudCh2b2lkKSB7fQordm9pZCBubV9zdGF0ZV9ldmVudCh2b2lkKSB7fQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9zY2NwL01ha2VmaWxlLmFtIGIvb3BlbmJzYy90ZXN0cy9zY2NwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNTY5M2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL3NjY3AvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsIC1nZ2RiMyAkKExJQk9TTU9DT1JFX0NGTEFHUykKKworbm9pbnN0X1BST0dSQU1TID0gc2NjcF90ZXN0CisKK3NjY3BfdGVzdF9TT1VSQ0VTID0gc2NjcF90ZXN0LmMKK3NjY3BfdGVzdF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9zcmMvbGlic2NjcC5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGliYnNjLmEgJChMSUJPU01PQ09SRV9MSUJTKQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL3NjY3Avc2NjcF90ZXN0LmMgYi9vcGVuYnNjL3Rlc3RzL3NjY3Avc2NjcF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0MWQzZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvc2NjcC9zY2NwX3Rlc3QuYwpAQCAtMCwwICsxLDgyOCBAQAorLyoKKyAqIFNDQ1AgdGVzdGluZyBjb2RlCisgKgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDkgYnkgT24tV2F2ZXMKKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCisjaW5jbHVkZSA8c2NjcC9zY2NwLmg+CisKKyNkZWZpbmUgTUlOKHgsIHkpICgoeCkgPCAoeSkgPyAoeCkgOiAoeSkpCisKKy8qIEJTQyAtPiBNU0MgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfcmVzZXRbXSA9IHsKKwkweDA5LCAweDAwLCAweDAzLCAweDA1LCAweDA3LCAweDAyLCAweDQyLCAweGZlLAorCTB4MDIsIDB4NDIsIDB4ZmUsIDB4MDYsIDB4MDAsIDB4MDQsIDB4MzAsIDB4MDQsCisJMHgwMSwgMHgyMCwKK307CisKKy8qIE1TQyAtPiBCU0MgcmVzZXQgYWNrICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX3Jlc2V0X2Fja1tdID0geworCTB4MDksIDB4MDAsIDB4MDMsIDB4MDcsIDB4MGIsIDB4MDQsIDB4NDMsIDB4MDEsCisJMHgwMCwgMHhmZSwgMHgwNCwgMHg0MywgMHg1YywgMHgwMCwgMHhmZSwgMHgwMywKKwkweDAwLCAweDAxLCAweDMxLAorfTsKKworLyogTVNDIC0+IEJTQyBwYWdpbmcsIGNvbm5lY3Rpb24gbGVzcyAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9wYWdpbmdbXSA9IHsKKwkweDA5LCAweDAwLCAweDAzLCAweDA3LCAweDBiLCAweDA0LCAweDQzLCAweDAxLAorCTB4MDAsIDB4ZmUsIDB4MDQsIDB4NDMsIDB4NWMsIDB4MDAsIDB4ZmUsIDB4MTAsCisJMHgwMCwgMHgwZSwgMHg1MiwgMHgwOCwgMHgwOCwgMHgyOSwgMHg0NywgMHgxMCwKKwkweDAyLCAweDAxLCAweDMxLCAweDk3LCAweDYxLCAweDFhLCAweDAxLCAweDA2LAorfTsKKworLyogTVNDIC0+IEJTQyBwYWdpbmcsIFVEVCB3aXRob3V0IFBDICAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF91ZHRbXSA9IHsKKwkweDA5LCAweDAwLCAweDAzLCAweDA1LCAweDA3LCAweDAyLCAweDQyLCAweGZlLAorCTB4MDIsIDB4NDIsIDB4ZmUsIDB4MTAsIDB4MDAsIDB4MGUsIDB4NTIsIDB4MDgsCisJMHgwOCwgMHgyOSwgMHg0NywgMHgxMCwgMHgwMiwgMHgwMSwgMHgzMSwgMHg5NywKKwkweDYxLCAweDFhLCAweDAxLCAweDA2LAorfTsKKworLyogQlNDIC0+IE1TQyBjb25uZWN0aW9uIG9wZW4gKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfY3JbXSA9IHsKKwkweDAxLCAweDAxLCAweDAyLCAweDAzLCAweDAyLCAweDAyLCAweDA0LCAweDAyLAorCTB4NDIsIDB4ZmUsIDB4MGYsIDB4MWYsIDB4MDAsIDB4MWQsIDB4NTcsIDB4MDUsCisJMHgwOCwgMHgwMCwgMHg3MiwgMHhmNCwgMHg4MCwgMHgyMCwgMHgxMiwgMHhjMywKKwkweDUwLCAweDE3LCAweDEwLCAweDA1LCAweDI0LCAweDExLCAweDAzLCAweDMzLAorCTB4MTksIDB4YTIsIDB4MDgsIDB4MjksIDB4NDcsIDB4MTAsIDB4MDIsIDB4MDEsCisJMHgzMSwgMHg5NywgMHg2MSwgMHgwMAorfTsKKworLyogTVNDIC0+IEJTQyBjb25uZWN0aW9uIGNvbmZpcm0gKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfY2NbXSA9IHsKKwkweDAyLCAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDAwLCAweDAzLCAweDAyLCAweDAxLCAweDAwLAorfTsKKworLyogTVNDIC0+IEJTQyBEVEFQCisgKgorICogd2UgZmFrZSBhIGJpdCBhbmQgbWFrZSBpdCBCU0MgLT4gTVNDLi4uIHNvIHRoZQorICogcGF5bG9hZCBkb2VzIG5vdCBtYWtlIGFueSBzZW5zZS4uCisgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfZHRhcFtdID0geworCTB4MDYsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDEsIDB4MGYsIDB4MDEsIDB4MDAsIDB4MGMsCisJMHgwMywgMHgwNSwgMHg1YywgMHgwOCwgMHgxMSwgMHg4MSwgMHgzMywgMHg2NiwgMHgwMiwgMHgxMywKKwkweDQ1LCAweGY0LAorfTsKKworLyogTVNDIC0+IEJTQyBjbGVhciBjb21tYW5kICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX2NsZWFyW10gPSB7CisJMHgwNiwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMSwgMHgwNiwgMHgwMCwgMHgwNCwgMHgyMCwKKwkweDA0LCAweDAxLCAweDA5LAorfTsKKworLyogTVNDIC0+IEJTQyByZWxlYXNlZCAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9yZWxlYXNlZFtdID0geworCTB4MDQsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDEsIDB4MGYsCisJMHgwMiwgMHgyMywgMHg0MiwgMHgwMCwKK307CisKKy8qIEJTQyAtPiBNU0MgcmVsZWFzZWQgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfcmVsZWFzZV9jb21wbGV0ZVtdID0geworCTB4MDUsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDMKK307CisKK3N0cnVjdCB0ZXN0X2RhdGEgeworCWludCBsZW5ndGg7CisJY29uc3QgdV9pbnQ4X3QgKmRhdGE7CisJaW50IHBheWxvYWRfc3RhcnQ7CisJaW50IHBheWxvYWRfbGVuZ3RoOworCXVfaW50OF90IGZpcnN0X2J5dGU7CisKKyAgICAgICAgLyogaW4gY2FzZSBpdCBzaG91bGQgdHJpZ2dlciBhIHNjY3AgcmVzcG9uc2UgKi8KKwlpbnQgd3JpdGU7CisJY29uc3QgdV9pbnQ4X3QgICpyZXNwb25zZTsKKwlpbnQgcmVzcG9uc2VfbGVuZ3RoOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZXN0X2RhdGEgdGVzdF9kYXRhW10gPSB7CisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0KSwKKwkJLmRhdGEJCT0gJmJzc21hcF9yZXNldFswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSAxMiwKKwkJLnBheWxvYWRfbGVuZ3RoID0gQVJSQVlfU0laRShic3NtYXBfcmVzZXQpIC0gMTIsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0X2FjayksCisJCS5kYXRhCQk9ICZic3NtYXBfcmVzZXRfYWNrWzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDE2LAorCQkucGF5bG9hZF9sZW5ndGggPSBBUlJBWV9TSVpFKGJzc21hcF9yZXNldF9hY2spIC0gMTYsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3BhZ2luZyksCisJCS5kYXRhCQk9ICZic3NtYXBfcGFnaW5nWzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDE2LAorCQkucGF5bG9hZF9sZW5ndGggPSBBUlJBWV9TSVpFKGJzc21hcF9wYWdpbmcpIC0gMTYsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX2NyKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9jclswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSAxMiwKKwkJLyogMHgwMCBpcyBlbmQgb2Ygb3B0aW9uYWwgZGF0YSwgc3VidHJhY3QgdGhpcyBieXRlICovCisJCS5wYXlsb2FkX2xlbmd0aCA9IDMxLAorCQkuZmlyc3RfYnl0ZQk9IDB4MCwKKworCQkvKiB0aGUgY29ubmVjdGlvbiByZXF1ZXN0IHNob3VsZCB0cmlnZ2VyIGEgY29ubmVjdGlvbiBjb25maXJtICovCisJCS53cml0ZQkJPSAxLAorCQkucmVzcG9uc2UJPSAmYnNzbWFwX2NjWzBdLAorCQkucmVzcG9uc2VfbGVuZ3RoPSBBUlJBWV9TSVpFKGJzc21hcF9jYyksCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfZHRhcCksCisJCS5kYXRhCQk9ICZic3NtYXBfZHRhcFswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSA3LAorCQkucGF5bG9hZF9sZW5ndGggPSAxNSwKKwkJLmZpcnN0X2J5dGUJPSAweDAxLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX2NsZWFyKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9jbGVhclswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSA3LAorCQkucGF5bG9hZF9sZW5ndGggPSA2LAorCQkuZmlyc3RfYnl0ZQk9IDB4MDAsCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfcmVsZWFzZWQpLAorCQkuZGF0YQkJPSAmYnNzbWFwX3JlbGVhc2VkWzBdLAorCQkucGF5bG9hZF9sZW5ndGggPSAyLAorCQkucGF5bG9hZF9zdGFydCAgPSAxMSwKKwkJLmZpcnN0X2J5dGUJPSAweDIzLAorCisJCS53cml0ZQkJPSAxLAorCQkucmVzcG9uc2UJPSAmYnNzbWFwX3JlbGVhc2VfY29tcGxldGVbMF0sCisJCS5yZXNwb25zZV9sZW5ndGg9IEFSUkFZX1NJWkUoYnNzbWFwX3JlbGVhc2VfY29tcGxldGUpLAorCX0sCit9OworCisvKiB3ZSB3aWxsIHNlbmQgVURUcyBhbmQgdmVyaWZ5IHRoZXkgbG9vayBsaWtlIHRoaXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGVzdF9kYXRhIHNlbmRfZGF0YVtdID0geworCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF91ZHQpLAorCQkuZGF0YQkJPSAmYnNzbWFwX3VkdFswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSAxMiwKKwkJLnBheWxvYWRfbGVuZ3RoID0gQVJSQVlfU0laRShic3NtYXBfdWR0KSAtIDEyLAorCQkuZmlyc3RfYnl0ZQk9IDB4MCwKKwl9LAorCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF9yZXNldCksCisJCS5kYXRhCQk9ICZic3NtYXBfcmVzZXRbMF0sCisJCS5wYXlsb2FkX3N0YXJ0CT0gMTIsCisJCS5wYXlsb2FkX2xlbmd0aCA9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0KSAtIDEyLAorCQkuZmlyc3RfYnl0ZQk9IDB4MCwKKwl9LAorfTsKKworc3RydWN0IGNvbm5lY3Rpb25fdGVzdCB7CisJLyogc2hvdWxkIHRoZSBjb25uZWN0aW9uIGJlIHJlZnVzZWQ/ICovCisJaW50IHJlZnVzZTsKKworCWludCB3aXRoX2RhdGE7CisKKwkvKiBvbiB3aGljaCBzaWRlIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uPyAqLworCWludCBjbG9zZV9zaWRlOworCWludCBjbG9zZV9jYXVzZTsKK307CisKKy8qIHNjY3AgY29ubmVjdGlvbiBoYW5kbGluZyB3ZSB3YW50IHRvIHRlc3QgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29ubmVjdGlvbl90ZXN0IGNvbm5lY3Rpb25fdGVzdHNbXSA9IHsKKwl7CisJCS5yZWZ1c2UJPSAxLAorCX0sCisJeworCQkucmVmdXNlCT0gMSwKKwkJLndpdGhfZGF0YSA9IDEsCisJfSwKKwl7CisJCS5yZWZ1c2UgPSAwLAorCQkuY2xvc2Vfc2lkZSA9IDAsCisJCS5jbG9zZV9jYXVzZSA9IDUsCisJfSwKKwl7CisJCS5yZWZ1c2UgPSAwLAorCQkuY2xvc2Vfc2lkZSA9IDAsCisJCS5jbG9zZV9jYXVzZSA9IDUsCisJCS53aXRoX2RhdGEgPSAxLAorCX0sCisJeworCQkucmVmdXNlID0gMCwKKwkJLmNsb3NlX3NpZGUgPSAxLAorCQkuY2xvc2VfY2F1c2UgPSA1LAorCX0sCisJeworCQkucmVmdXNlID0gMCwKKwkJLmNsb3NlX3NpZGUgPSAxLAorCQkuY2xvc2VfY2F1c2UgPSA1LAorCQkud2l0aF9kYXRhID0gMSwKKwl9LAorfTsKKworc3RydWN0IHNjY3BfcGFyc2VfaGVhZGVyX3Jlc3VsdCB7CisJLyogcmVzdWx0cyAqLworCWludCBtc2dfdHlwZTsKKwlpbnQgd2FudGVkX2xlbjsKKwlpbnQgc3JjX3NzbjsKKwlpbnQgZHN0X3NzbjsKKworCWludCBoYXNfc3JjX3JlZiwgaGFzX2RzdF9yZWY7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBzcmNfcmVmOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgZHN0X3JlZjsKKworCS8qIHRoZSBpbnB1dCAqLworCWNvbnN0IHVfaW50OF90ICppbnB1dDsKKwlpbnQgaW5wdXRfbGVuOworfTsKKworc3RhdGljIGNvbnN0IHVfaW50OF90IGl0X3Rlc3RbXSA9IHsKKzB4MTAsIDB4MDEsIDB4MDcsIAorMHg5NCwgMHgwMSwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCB9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNjY3BfcGFyc2VfaGVhZGVyX3Jlc3VsdCBwYXJzZV9yZXN1bHRbXSA9IHsKKwl7CisJCS5tc2dfdHlwZQk9IFNDQ1BfTVNHX1RZUEVfSVQsCisJCS53YW50ZWRfbGVuCT0gMCwKKwkJLnNyY19zc24JPSAtMSwKKwkJLmRzdF9zc24JPSAtMSwKKwkJLmhhc19zcmNfcmVmCT0gMSwKKwkJLmhhc19kc3RfcmVmCT0gMSwKKworCQkuc3JjX3JlZgk9IHsKKwkJCS5vY3RldDEgPSAweDAxLAorCQkJLm9jdGV0MiA9IDB4MDQsCisJCQkub2N0ZXQzID0gMHgwMAorCQl9LAorCQkuZHN0X3JlZgk9IHsKKwkJCS5vY3RldDEgPSAweDAxLAorCQkJLm9jdGV0MiA9IDB4MDcsCisJCQkub2N0ZXQzID0gMHg5NCwKKwkJfSwKKworCQkuaW5wdXQJCT0gaXRfdGVzdCwKKwkJLmlucHV0X2xlbgk9IHNpemVvZihpdF90ZXN0KSwKKwl9LAorfTsKKworCisvKiB0ZXN0aW5nIHByb2NlZHVyZToKKyAqCS0gd2Ugd2lsbCB1c2Ugc2NjcF93cml0ZSBhbmQgc2VlIHdoYXQgd2lsbCBiZSBzZXQgaW4gdGhlCisgKgkgIG91dGdvaW5nIGNhbGxiYWNrCisgKgktIHdlIHdpbGwgY2FsbCBzY2NwX3N5c3RlbV9pbmNvbWluZyBhbmQgc2VlIHdoaWNoIGNhbGxzCisgKgkgIGFyZSBtYWRlLiBBbmQgdGhlbiBjb21wYXJlIGl0IHRvIHRoZSBvbmVzIHdlIGV4cGVjdC4gV2UKKyAqCSAgd2FudCB0aGUgcGF5bG9hZCB0byBhcnJpdmUsIG9yIGNhbGxiYWNrcyB0byBiZSBjYWxsZWQuCisgKgktIHdlIHdpbGwgdXNlIHNjY3BfY29ubmVjdGlvbl9zb2NrZXQgYW5kIHNjY3BfY29ubmVjdGlvbl93cml0ZQorICoJICBhbmQgdmVyaWZ5IHN0YXRlIGhhbmRsaW5nIG9mIGNvbm5lY3Rpb25zCisgKi8KKworc3RhdGljIGludCBjdXJyZW50X3Rlc3Q7CisKKy8qCisgKiB0ZXN0IHN0YXRlLi4uCisgKi8KK3N0YXRpYyBpbnQgY2FsbGVkICA9IDA7CitzdGF0aWMgaW50IG1hdGNoZWQgPSAwOworc3RhdGljIGludCB3cml0ZV9jYWxsZWQgPSAwOworCisjZGVmaW5lIEZBSUwoeCwgYXJncy4uLikgcHJpbnRmKCJGQUlMVVJFIGluICVzOiVkOiAiIHgsIF9fRklMRV9fLCBfX0xJTkVfXywgIyMgYXJncykKKworLyoKKyAqIHdyaXRpbmcgdGhlc2UgcGFja2V0cyBhbmQgZXhwZWN0aW5nIGEgcmVzdWx0CisgKi8KK2ludCBzY2NwX3JlYWRfY2Ioc3RydWN0IG1zZ2IgKmRhdGEsIHVuc2lnbmVkIGxlbiwgdm9pZCAqY29udGV4dCkKK3sKKwl1X2ludDE2X3QgcGF5bG9hZF9sZW5ndGggPSB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5wYXlsb2FkX2xlbmd0aDsKKwljb25zdCB1X2ludDhfdCAqZ290LCAqd2FudGVkOworCWludCBpOworCisJY2FsbGVkID0gMTsKKworCWlmIChtc2diX2wzbGVuKGRhdGEpIDwgbGVuKSB7CisJCS8qIHRoaXMgc2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQgKi8KKwkJRkFJTCgiU29tZXRoaW5nIGhvcnJpYmxlIGhhcHBlbmVkLi4gaW52YWxpZCBwYWNrZXQuLlxuIik7CisJCWV4aXQoLTEpOworCX0KKworCWlmIChsZW4gPT0gMCB8fCBsZW4gIT0gcGF5bG9hZF9sZW5ndGgpIHsKKwkJRkFJTCgibGVuZ3RoIG1pc21hdGNoOiBnb3Q6ICVkIHdhbnRlZDogJWRcbiIsIG1zZ2JfbDNsZW4oZGF0YSksIHBheWxvYWRfbGVuZ3RoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChkYXRhLT5sM2hbMF0gIT0gIHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmZpcnN0X2J5dGUpIHsKKwkJRkFJTCgiVGhlIGZpcnN0IGJ5dGVzIG9mIGwzIGRvIG5vdCBtYXRjaDogMHgleCAweCV4XG4iLAorCQkJZGF0YS0+bDNoWzBdLCB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5maXJzdF9ieXRlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWdvdCA9ICZkYXRhLT5sM2hbMF07CisJd2FudGVkID0gdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0uZGF0YSArIHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLnBheWxvYWRfc3RhcnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJaWYgKGdvdFtpXSAhPSB3YW50ZWRbaV0pIHsKKwkJCUZBSUwoIkZhaWxlZCB0byBjb21wYXJlIGJ5dGUuIEdvdDogMHgleCBXYW50ZWQ6IDB4JXggYXQgJWRcbiIsCisJCQkgICAgIGdvdFtpXSwgd2FudGVkW2ldLCBpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCW1hdGNoZWQgPSAxOworCXJldHVybiAwOworfQorCitpbnQgc2NjcF93cml0ZV9jYihzdHJ1Y3QgbXNnYiAqZGF0YSwgdm9pZCAqY3R4KQoreworCWludCBpID0gMDsKKwljb25zdCB1X2ludDhfdCAqZ290LCAqd2FudGVkOworCisJaWYgKHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLnJlc3BvbnNlID09IE5VTEwpIHsKKwkJRkFJTCgiRGlkbid0IGV4cGVjdCB3cml0ZSBjYWxsYmFja1xuIik7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgaWYgKHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLnJlc3BvbnNlX2xlbmd0aCAhPSBtc2diX2wybGVuKGRhdGEpKSB7CisJCUZBSUwoIlNpemUgZG9lcyBub3QgbWF0Y2guIEdvdDogJWQgV2FudGVkOiAlZFxuIiwKKwkJICAgICBtc2diX2wybGVuKGRhdGEpLCB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5yZXNwb25zZV9sZW5ndGgpOworCX0KKworCWdvdCA9ICZkYXRhLT5sMmhbMF07CisJd2FudGVkID0gdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ucmVzcG9uc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNnYl9sMmxlbihkYXRhKTsgKytpKSB7CisJCWlmIChnb3RbaV0gIT0gd2FudGVkW2ldKSB7CisJCQlGQUlMKCJGYWlsZWQgdG8gY29tcGFyZSBieXRlLiBHb3Q6IDB4JXggV2FudGVkOiAweCV4IGF0ICVkXG4iLAorCQkJICAgICBnb3RbaV0sIHdhbnRlZFtpXSwgaSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwl3cml0ZV9jYWxsZWQgPSAxOworCXJldHVybiAwOworfQorCit2b2lkIHNjY3BfY19yZWFkKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBtc2diICptc2diLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXNjY3BfcmVhZF9jYihtc2diLCBsZW4sIGNvbm5lY3Rpb24tPmRhdGFfY3R4KTsKK30KKwordm9pZCBzY2NwX2Nfc3RhdGUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgaW50IG9sZF9zdGF0ZSkKK3sKKwlpZiAoY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA+PSBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSkKKwkJc2NjcF9jb25uZWN0aW9uX2ZyZWUoY29ubmVjdGlvbik7Cit9CisKK2ludCBzY2NwX2FjY2VwdF9jYihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB2b2lkICp1c2VyX2RhdGEpCit7CisJY2FsbGVkID0gMTsKKwl1bnNpZ25lZCBpbnQgcmVmID0gMDsKKwlyZWYgfD0gY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLm9jdGV0MSA8PCAyNDsKKwlyZWYgfD0gY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLm9jdGV0MiA8PCAxNjsKKwlyZWYgfD0gY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLm9jdGV0MyA8PCAgODsKKwlyZWYgPSBudG9obChyZWYpOworCisJY29ubmVjdGlvbi0+ZGF0YV9jYiA9IHNjY3BfY19yZWFkOworCWNvbm5lY3Rpb24tPnN0YXRlX2NiID0gc2NjcF9jX3N0YXRlOworCisJLyogYWNjZXB0IHRoaXMgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2NwX3VkdF93cml0ZV9jYihzdHJ1Y3QgbXNnYiAqZGF0YSwgdm9pZCAqY29udGV4dCkKK3sKKwljb25zdCB1X2ludDhfdCAqZ290LCAqd2FudGVkOworCWludCBpOworCisJd3JpdGVfY2FsbGVkID0gMTsKKworCWlmIChzZW5kX2RhdGFbY3VycmVudF90ZXN0XS5sZW5ndGggIT0gbXNnYl9sMmxlbihkYXRhKSkgeworCQlGQUlMKCJTaXplIGRvZXMgbm90IG1hdGNoLiBHb3Q6ICVkIFdhbnRlZDogJWRcbiIsCisJCSAgICAgbXNnYl9sMmxlbihkYXRhKSwgc2VuZF9kYXRhW2N1cnJlbnRfdGVzdF0ubGVuZ3RoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWdvdCA9ICZkYXRhLT5sMmhbMF07CisJd2FudGVkID0gc2VuZF9kYXRhW2N1cnJlbnRfdGVzdF0uZGF0YTsKKworCWZvciAoaSA9IDA7IGkgPCBtc2diX2wybGVuKGRhdGEpOyArK2kpIHsKKwkJaWYgKGdvdFtpXSAhPSB3YW50ZWRbaV0pIHsKKwkJCUZBSUwoIkZhaWxlZCB0byBjb21wYXJlIGJ5dGUuIEdvdDogMHgleCBXYW50ZWQ6IDB4JXggYXQgJWRcbiIsCisJCQkgICAgIGdvdFtpXSwgd2FudGVkW2ldLCBpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCW1hdGNoZWQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NjY3Bfc3lzdGVtKHZvaWQpCit7CisJc2NjcF9zeXN0ZW1faW5pdChzY2NwX3dyaXRlX2NiLCBOVUxMKTsKKwlzY2NwX3NldF9yZWFkKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF9yZWFkX2NiLCBOVUxMKTsKKwlzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF9hY2NlcHRfY2IsIE5VTEwpOworCisJZm9yIChjdXJyZW50X3Rlc3QgPSAwOyBjdXJyZW50X3Rlc3QgPCBBUlJBWV9TSVpFKHRlc3RfZGF0YSk7ICsrY3VycmVudF90ZXN0KSB7CisJCXVuc2lnbmVkIGludCBsZW5ndGggPSB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5sZW5ndGg7CisJCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKGxlbmd0aCArIDIsIDIsIF9fZnVuY19fKTsKKwkJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIGxlbmd0aCk7CisJCW1lbWNweShtc2ctPmwyaCwgdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0uZGF0YSwgbGVuZ3RoKTsKKworCQljYWxsZWQgPSBtYXRjaGVkID0gd3JpdGVfY2FsbGVkID0gMDsKKwkJcHJpbnRmKCJUZXN0aW5nIHBhY2tldDogJWRcbiIsIGN1cnJlbnRfdGVzdCk7CisJCXNjY3Bfc3lzdGVtX2luY29taW5nKG1zZyk7CisKKwkJaWYgKCFjYWxsZWQgfHwgIW1hdGNoZWQgfHwgKHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLndyaXRlICE9IHdyaXRlX2NhbGxlZCkpCisJCQlGQUlMKCJjdXJyZW50IHRlc3Q6ICVkIGNhbGxlZDogJWQgbWF0Y2hlZDogJWQgd3JpdGU6ICVkXG4iLAorCQkJICAgICBjdXJyZW50X3Rlc3QsIGNhbGxlZCwgbWF0Y2hlZCwgd3JpdGVfY2FsbGVkKTsKKworCQltc2diX2ZyZWUobXNnKTsKKwl9Cit9CisKKy8qIHRlc3Qgc2VuZGluZyBvZiB1ZHQgKi8KK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF9zZW5kX3VkdCh2b2lkKQoreworCXNjY3Bfc3lzdGVtX2luaXQoc2NjcF91ZHRfd3JpdGVfY2IsIE5VTEwpOworCXNjY3Bfc2V0X3JlYWQoTlVMTCwgTlVMTCwgTlVMTCk7CisJc2NjcF9jb25uZWN0aW9uX3NldF9pbmNvbWluZyhOVUxMLCBOVUxMLCBOVUxMKTsKKworCWZvciAoY3VycmVudF90ZXN0ID0gMDsgY3VycmVudF90ZXN0IDwgQVJSQVlfU0laRShzZW5kX2RhdGEpOyArK2N1cnJlbnRfdGVzdCkgeworCQljb25zdCBzdHJ1Y3QgdGVzdF9kYXRhICp0ZXN0ID0gJnNlbmRfZGF0YVtjdXJyZW50X3Rlc3RdOworCisJCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKHRlc3QtPnBheWxvYWRfbGVuZ3RoLCBfX2Z1bmNfXyk7CisJCW1zZy0+bDNoID0gbXNnYl9wdXQobXNnLCB0ZXN0LT5wYXlsb2FkX2xlbmd0aCk7CisJCW1lbWNweShtc2ctPmwzaCwgdGVzdC0+ZGF0YSArIHRlc3QtPnBheWxvYWRfc3RhcnQsIHRlc3QtPnBheWxvYWRfbGVuZ3RoKTsKKworCQltYXRjaGVkID0gd3JpdGVfY2FsbGVkID0gMDsKKwkJcHJpbnRmKCJUZXN0aW5nIHBhY2tldDogJWRcbiIsIGN1cnJlbnRfdGVzdCk7CisJCXNjY3Bfd3JpdGUobXNnLCAmc2NjcF9zc25fYnNzYXAsICZzY2NwX3Nzbl9ic3NhcCwgMCk7CisKKwkJaWYgKCFtYXRjaGVkIHx8ICF3cml0ZV9jYWxsZWQpCisJCQlGQUlMKCJjdXJyZW50IHRlc3Q6ICVkIG1hdGNoZWQ6ICVkIHdyaXRlOiAlZFxuIiwKKwkJCSAgICAgY3VycmVudF90ZXN0LCBtYXRjaGVkLCB3cml0ZV9jYWxsZWQpOworCisJCW1zZ2JfZnJlZShtc2cpOworCX0KK30KKworLyogc2VuZCB1ZHQgZnJvbSBvbmUgZW5kIHRvIGFub3RoZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGVzdF92YWx1ZSA9IDB4MjQ0MjsKK3N0YXRpYyBpbnQgc2NjcF91ZHRfcmVhZChzdHJ1Y3QgbXNnYiAqZGF0YSwgdW5zaWduZWQgaW50IGxlbiwgdm9pZCAqY29udGV4dCkKK3sKKwl1bnNpZ25lZCBpbnQgKnZhbDsKKworCWlmIChsZW4gIT0gNCkgeworCQlGQUlMKCJXcm9uZyBzaXplOiAlZFxuIiwgbXNnYl9sM2xlbihkYXRhKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwl2YWwgPSAodW5zaWduZWQgaW50KilkYXRhLT5sM2g7CisJbWF0Y2hlZCA9IHRlc3RfdmFsdWUgPT0gKnZhbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjY3Bfd3JpdGVfbG9vcChzdHJ1Y3QgbXNnYiAqZGF0YSwgdm9pZCAqY29udGV4dCkKK3sKKwkvKiBzZW5kIGl0IGJhY2sgdG8gdXMgKi8KKwlzY2NwX3N5c3RlbV9pbmNvbWluZyhkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zY2NwX3VkdF9jb21tdW5pY2F0aW9uKHZvaWQpCit7CisJc3RydWN0IG1zZ2IgKmRhdGE7CisJdW5zaWduZWQgaW50ICp2YWw7CisKKwlzY2NwX3N5c3RlbV9pbml0KHNjY3Bfd3JpdGVfbG9vcCwgTlVMTCk7CisJc2NjcF9zZXRfcmVhZCgmc2NjcF9zc25fYnNzYXAsIHNjY3BfdWR0X3JlYWQsIE5VTEwpOworCXNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoTlVMTCwgTlVMTCwgTlVMTCk7CisKKworCWRhdGEgPSBtc2diX2FsbG9jKDQsICJ0ZXN0IGRhdGEiKTsKKwlkYXRhLT5sM2ggPSAmZGF0YS0+ZGF0YVswXTsKKwl2YWwgPSAodW5zaWduZWQgaW50ICopbXNnYl9wdXQoZGF0YSwgNCk7CisJKnZhbCA9IHRlc3RfdmFsdWU7CisKKwltYXRjaGVkID0gMDsKKwlzY2NwX3dyaXRlKGRhdGEsICZzY2NwX3Nzbl9ic3NhcCwgJnNjY3Bfc3NuX2Jzc2FwLCAwKTsKKworCWlmICghbWF0Y2hlZCkKKwkgICAgRkFJTCgiVGFsa2luZyB3aXRoIHVzIGRpZG4ndCB3b3JrXG4iKTsKKworCW1zZ2JfZnJlZShkYXRhKTsKK30KKworCisvKiBjb25uZWN0aW9uIHRlc3RpbmcuLi4gb3Blbiwgc2VuZCwgY2xvc2UgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29ubmVjdGlvbl90ZXN0ICpjdXJyZW50X2Nvbl90ZXN0Oworc3RhdGljIHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKm91dGdvaW5nX2NvbjsKK3N0YXRpYyBzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICppbmNvbWluZ19jb247CitzdGF0aWMgaW50IG91dGdvaW5nX2RhdGEsIGluY29taW5nX2RhdGEsIGluY29taW5nX3N0YXRlLCBvdXRnb2luZ19zdGF0ZTsKKworc3RhdGljIHN0cnVjdCBtc2diICp0ZXN0X2RhdGExLCAqdGVzdF9kYXRhMiwgKnRlc3RfZGF0YTM7CisKK3N0YXRpYyB2b2lkIHNjY3BfY29ubl9pbl9zdGF0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCBpbnQgb2xkX3N0YXRlKQoreworCXByaW50ZigiXHRpbmNvbWU6ICVkIC0+ICVkXG4iLCBvbGRfc3RhdGUsIGNvbm4tPmNvbm5lY3Rpb25fc3RhdGUpOworCWlmIChjb25uLT5jb25uZWN0aW9uX3N0YXRlID49IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFKSB7CisJCWlmIChjb25uID09IGluY29taW5nX2NvbikgeworCQkJc2NjcF9jb25uZWN0aW9uX2ZyZWUoY29ubik7CisJCQlpbmNvbWluZ19jb24gPSBOVUxMOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzY2NwX2Nvbm5faW5fZGF0YShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgbXNnYiAqbXNnLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCS8qIGNvbXBhcmUgdGhlIGRhdGEgKi8KKwkrK2luY29taW5nX2RhdGE7CisJcHJpbnRmKCJcdGluY29taW5nIGRhdGE6ICVkXG4iLCBsZW4pOworCisJLyogY29tcGFyZSB0aGUgZGF0YSAqLworCWlmIChsZW4gIT0gNCkgeworCQlGQUlMKCJMZW5ndGggb2YgcGFja2V0IGlzIHdyb25nOiAldSAldVxuIiwgbXNnYl9sM2xlbihtc2cpLCBsZW4pOworCQlyZXR1cm47CisJfQorCisJaWYgKGluY29taW5nX2RhdGEgPT0gMSkgeworCQlpZiAobWVtY21wKG1zZy0+bDNoLCB0ZXN0X2RhdGExLT5sM2gsIGxlbikgIT0gMCkgeworCQkJRkFJTCgiQ29tcGFyaW5nIHRoZSBkYXRhIGZhaWxlZDogJWRcbiIsIGluY29taW5nX2RhdGEpOworCQkJaW5jb21pbmdfc3RhdGUgPSAwOworCQkJcHJpbnRmKCJHb3Q6ICAgICVzXG4iLCBoZXhkdW1wKG1zZy0+bDNoLCBsZW4pKTsKKwkJCXByaW50ZigiV2FudGVkOiAlc1xuIiwgaGV4ZHVtcCh0ZXN0X2RhdGExLT5sM2gsIGxlbikpOworCisJCX0KKwl9IGVsc2UgaWYgKGluY29taW5nX2RhdGEgPT0gMikgeworCQlpZiAobWVtY21wKG1zZy0+bDNoLCB0ZXN0X2RhdGEyLT5sM2gsIGxlbikgIT0gMCkgeworCQkJRkFJTCgiQ29tcGFyaW5nIHRoZSBkYXRhIGZhaWxlZDogJWRcbiIsIGluY29taW5nX2RhdGEpOworCQkJaW5jb21pbmdfc3RhdGUgPSAwOworCQkJcHJpbnRmKCJHb3Q6ICAgICVzXG4iLCBoZXhkdW1wKG1zZy0+bDNoLCBsZW4pKTsKKwkJCXByaW50ZigiV2FudGVkOiAlc1xuIiwgaGV4ZHVtcCh0ZXN0X2RhdGEyLT5sM2gsIGxlbikpOworCQl9CisJfQorCisJLyogc2VuZGluZyBvdXQgZGF0YSAqLworCWlmIChpbmNvbWluZ19kYXRhID09IDIpIHsKKwkJcHJpbnRmKCJcdFJldHVybmluZyBkYXRhM1xuIik7CisJCXNjY3BfY29ubmVjdGlvbl93cml0ZShjb25uLCB0ZXN0X2RhdGEzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2NjcF9jb25uX2FjY2VwdChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCB2b2lkICpjdHgpCit7CisJcHJpbnRmKCJcdGFjY2VwdDogJXBcbiIsIGNvbm4pOworCWNvbm4tPnN0YXRlX2NiID0gc2NjcF9jb25uX2luX3N0YXRlOworCWNvbm4tPmRhdGFfY2IgPSBzY2NwX2Nvbm5faW5fZGF0YTsKKworCWlmIChjdXJyZW50X2Nvbl90ZXN0LT5yZWZ1c2UpCisJCXJldHVybiAtMTsKKworCWluY29taW5nX2NvbiA9IGNvbm47CisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxiYWNrcyBmb3IgdGhlIG91dGdvaW5nIHNpZGUgKi8KK3N0YXRpYyB2b2lkIHNjY3BfY29ubl9vdXRfc3RhdGUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwgaW50IG9sZF9zdGF0ZSkKK3sKKwlwcmludGYoIlx0b3V0Z29pbmc6ICVwICVkIC0+ICVkXG4iLCBjb25uLCBvbGRfc3RhdGUsIGNvbm4tPmNvbm5lY3Rpb25fc3RhdGUpOworCisJaWYgKGNvbm4tPmNvbm5lY3Rpb25fc3RhdGUgPj0gU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFTEVBU0VfQ09NUExFVEUpIHsKKwkJaWYgKGNvbm4gPT0gb3V0Z29pbmdfY29uKSB7CisJCQlzY2NwX2Nvbm5lY3Rpb25fZnJlZShjb25uKTsKKwkJCW91dGdvaW5nX2NvbiA9IE5VTEw7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjY3BfY29ubl9vdXRfZGF0YShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3QgbXNnYiAqbXNnLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCSsrb3V0Z29pbmdfZGF0YTsKKwlwcmludGYoIlx0b3V0Z29pbmcgZGF0YTogJXAgJWRcbiIsIGNvbm4sIGxlbik7CisKKwlpZiAobGVuICE9IDQpCisJCUZBSUwoIkxlbmd0aCBvZiBwYWNrZXQgaXMgd3Jvbmc6ICV1ICV1XG4iLCBtc2diX2wzbGVuKG1zZyksIGxlbik7CisKKwlpZiAob3V0Z29pbmdfZGF0YSA9PSAxKSB7CisJCWlmIChtZW1jbXAobXNnLT5sM2gsIHRlc3RfZGF0YTMtPmwzaCwgbGVuKSAhPSAwKSB7CisJCQlGQUlMKCJDb21wYXJpbmcgdGhlIGRhdGEgZmFpbGVkXG4iKTsKKwkJCW91dGdvaW5nX3N0YXRlID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZG9fdGVzdF9zY2NwX2Nvbm5lY3Rpb24oY29uc3Qgc3RydWN0IGNvbm5lY3Rpb25fdGVzdCAqdGVzdCkKK3sKKwlpbnQgcmV0OworCisJY3VycmVudF9jb25fdGVzdCA9IHRlc3Q7CisJb3V0Z29pbmdfY29uID0gaW5jb21pbmdfY29uID0gMDsKKworCW91dGdvaW5nX2NvbiA9IHNjY3BfY29ubmVjdGlvbl9zb2NrZXQoKTsKKwlpZiAoIW91dGdvaW5nX2NvbikgeworCQlGQUlMKCJDb25uZWN0aW9uIGlzIE5VTExcbiIpOworCQlyZXR1cm47CisJfQorCisJb3V0Z29pbmdfY29uLT5zdGF0ZV9jYiA9IHNjY3BfY29ubl9vdXRfc3RhdGU7CisJb3V0Z29pbmdfY29uLT5kYXRhX2NiID0gc2NjcF9jb25uX291dF9kYXRhOworCW91dGdvaW5nX2RhdGEgPSBpbmNvbWluZ19kYXRhID0gMDsKKwlpbmNvbWluZ19zdGF0ZSA9IG91dGdvaW5nX3N0YXRlID0gMTsKKworCS8qIHN0YXJ0IHRlc3RpbmcgKi8KKwlpZiAodGVzdC0+d2l0aF9kYXRhKSB7CisJCWlmIChzY2NwX2Nvbm5lY3Rpb25fY29ubmVjdChvdXRnb2luZ19jb24sICZzY2NwX3Nzbl9ic3NhcCwgdGVzdF9kYXRhMSkgIT0gMCkKKwkJCUZBSUwoIkJpbmRpbmcgZmFpbGVkXG4iKTsKKwl9IGVsc2UgeworCQkrK2luY29taW5nX2RhdGE7CisJCWlmIChzY2NwX2Nvbm5lY3Rpb25fY29ubmVjdChvdXRnb2luZ19jb24sICZzY2NwX3Nzbl9ic3NhcCwgTlVMTCkgIT0gMCkKKwkJCUZBSUwoIkJpbmRpbmcgZmFpbGVkXG4iKTsKKwl9CisKKwlpZiAodGVzdC0+cmVmdXNlKSB7CisJCWlmIChvdXRnb2luZ19jb24pCisJCQlGQUlMKCJPdXRnb2luZyBjb25uZWN0aW9uIHNob3VsZCBoYXZlIGJlZW4gcmVmdXNlZC5cbiIpOworCX0gZWxzZSB7CisJCWlmICghaW5jb21pbmdfY29uKQorCQkJRkFJTCgiQ3JlYXRpbmcgaW5jb21pbmcgZGlkbid0IHdvcmsuXG4iKTsKKworCQlwcmludGYoIlx0V3JpdGluZyB0ZXN0IGRhdGEyXG4iKTsKKwkJc2NjcF9jb25uZWN0aW9uX3dyaXRlKG91dGdvaW5nX2NvbiwgdGVzdF9kYXRhMik7CisJCXNjY3BfY29ubmVjdGlvbl9zZW5kX2l0KG91dGdvaW5nX2Nvbik7CisKKwkJLyogY2xvc2luZyBjb25uZWN0aW9uICovCisJCWlmICh0ZXN0LT5jbG9zZV9zaWRlID09IDApCisJCQlyZXQgPSBzY2NwX2Nvbm5lY3Rpb25fY2xvc2Uob3V0Z29pbmdfY29uLCAwKTsKKwkJZWxzZQorCQkJcmV0ID0gc2NjcF9jb25uZWN0aW9uX2Nsb3NlKGluY29taW5nX2NvbiwgMCk7CisKKwkJaWYgKHJldCAhPSAwKQorCQkJRkFJTCgiQ2xvc2luZyB0aGUgY29ubmVjdGlvbiBmYWlsZWRcbiIpOworCX0KKworCS8qIG91dGdvaW5nIHNob3VsZCBiZSBnb25lIG5vdyAqLworCWlmIChvdXRnb2luZ19jb24pCisJCUZBSUwoIk91dGdvaW5nIGNvbm5lY3Rpb24gd2FzIG5vdCBwcm9wZXJseSBjbG9zZWRcbiIpOworCisJaWYgKGluY29taW5nX2NvbikKKwkJRkFJTCgiSW5jb21pbmcgY29ubmVjdGlvbiB3YXMgbm90IHByb3BlcnkgY2xvc2VkLlxuIik7CisKKwlpZiAodGVzdC0+cmVmdXNlID09IDApIHsKKwkJaWYgKG91dGdvaW5nX2RhdGEgIT0gMSB8fCBpbmNvbWluZ19kYXRhICE9IDIpIHsKKwkJCUZBSUwoIkRhdGEgc2VuZGluZyBmYWlsZWQ6ICVkLyVkICVkLyVkXG4iLAorCQkJICAgICBvdXRnb2luZ19kYXRhLCAxLAorCQkJICAgICBpbmNvbWluZ19kYXRhLCAyKTsKKwkJfQorCX0KKworCWlmICghaW5jb21pbmdfc3RhdGUgfHwgIW91dGdvaW5nX3N0YXRlKQorCQlGQUlMKCJGYWlsdXJlIHdpdGggdGhlIHN0YXRlIHRyYW5zaXRpb24uICVkICVkXG4iLAorCQkgICAgIG91dGdvaW5nX3N0YXRlLCBpbmNvbWluZ19zdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF9jb25uZWN0aW9uKHZvaWQpCit7CisJc2NjcF9zeXN0ZW1faW5pdChzY2NwX3dyaXRlX2xvb3AsIE5VTEwpOworCXNjY3Bfc2V0X3JlYWQoTlVMTCwgTlVMTCwgTlVMTCk7CisJc2NjcF9jb25uZWN0aW9uX3NldF9pbmNvbWluZygmc2NjcF9zc25fYnNzYXAsIHNjY3BfY29ubl9hY2NlcHQsIE5VTEwpOworCisJdGVzdF9kYXRhMSA9IG1zZ2JfYWxsb2MoNCwgImRhdGExIik7CisJdGVzdF9kYXRhMS0+bDNoID0gbXNnYl9wdXQodGVzdF9kYXRhMSwgNCk7CisJKigodW5zaWduZWQgaW50Kil0ZXN0X2RhdGExLT5sM2gpID0gMHgyMzQyMTEyMjsKKworCXRlc3RfZGF0YTIgPSBtc2diX2FsbG9jKDQsICJkYXRhMiIpOworCXRlc3RfZGF0YTItPmwzaCA9IG1zZ2JfcHV0KHRlc3RfZGF0YTIsIDQpOworCSooKHVuc2lnbmVkIGludCopdGVzdF9kYXRhMi0+bDNoKSA9IDB4NDIyMzIyMTE7CisKKwl0ZXN0X2RhdGEzID0gbXNnYl9hbGxvYyg0LCAiZGF0YTMiKTsKKwl0ZXN0X2RhdGEzLT5sM2ggPSBtc2diX3B1dCh0ZXN0X2RhdGEzLCA0KTsKKwkqKCh1bnNpZ25lZCBpbnQqKXRlc3RfZGF0YTMtPmwzaCkgPSAweDIzMjNmZjU1OworCisKKwlmb3IgKGN1cnJlbnRfdGVzdCA9IDA7IGN1cnJlbnRfdGVzdCA8IEFSUkFZX1NJWkUoY29ubmVjdGlvbl90ZXN0cyk7ICsrY3VycmVudF90ZXN0KSB7CisJCXByaW50ZigiVGVzdGluZyAlZCByZWZ1c2U6ICVkIHdpdGhfZGF0YTogJWRcbiIsCisJCQljdXJyZW50X3Rlc3QsIGNvbm5lY3Rpb25fdGVzdHNbY3VycmVudF90ZXN0XS5yZWZ1c2UsCisJCQljb25uZWN0aW9uX3Rlc3RzW2N1cnJlbnRfdGVzdF0ud2l0aF9kYXRhKTsKKwkJZG9fdGVzdF9zY2NwX2Nvbm5lY3Rpb24oJmNvbm5lY3Rpb25fdGVzdHNbY3VycmVudF90ZXN0XSk7CisJfQorCisJbXNnYl9mcmVlKHRlc3RfZGF0YTEpOworCW1zZ2JfZnJlZSh0ZXN0X2RhdGEyKTsKKwltc2diX2ZyZWUodGVzdF9kYXRhMyk7Cit9CisKKy8qIGludmFsaWQgaW5wdXQgKi8KK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF9zeXN0ZW1fY3Jhc2godm9pZCkKK3sKKwlwcmludGYoInRyeWluZyB0byBwcm92b2tlIGEgY3Jhc2ggd2l0aCBpbnZhbGlkIGlucHV0XG4iKTsKKwlzY2NwX3NldF9yZWFkKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF9yZWFkX2NiLCBOVUxMKTsKKwlzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF9hY2NlcHRfY2IsIE5VTEwpOworCisJZm9yIChjdXJyZW50X3Rlc3QgPSAwOyBjdXJyZW50X3Rlc3QgPCBBUlJBWV9TSVpFKHRlc3RfZGF0YSk7ICsrY3VycmVudF90ZXN0KSB7CisJCWludCBvcmlnaW5hbF9sZW5ndGggPSB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5sZW5ndGg7CisJCWludCBsZW5ndGggPSBvcmlnaW5hbF9sZW5ndGggKyAyOworCQlpbnQgaTsKKworCQlwcmludGYoIlRlc3RpbmcgcGFja2V0OiAlZFxuIiwgY3VycmVudF90ZXN0KTsKKworCQlmb3IgKGkgPSBsZW5ndGg7IGkgPj0gMDsgLS1pKSB7CisJCQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gTUlOKHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmxlbmd0aCwgaSk7CisJCQlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbShsZW5ndGggKyAyLCAyLCBfX2Z1bmNfXyk7CisJCQltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgbGVuZ3RoKTsKKwkJCW1lbWNweShtc2ctPmwyaCwgdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0uZGF0YSwgbGVuZ3RoKTsKKwkJCXNjY3Bfc3lzdGVtX2luY29taW5nKG1zZyk7CisJCQltc2diX2ZyZWUobXNnKTsKKwkJfQorCX0KKworCXByaW50Zigic3Vydml2ZWRcbiIpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NjY3BfcGFyc2luZyh2b2lkKQoreworCWZvciAoY3VycmVudF90ZXN0ID0gMDsgY3VycmVudF90ZXN0IDwgQVJSQVlfU0laRShwYXJzZV9yZXN1bHQpOyArK2N1cnJlbnRfdGVzdCkgeworCQlzdHJ1Y3QgbXNnYiAqbXNnOworCQlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCisJCW1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oMTAyNCwgMTI4LCAicGFyc2UtdGVzdCIpOworCQltc2diX3B1dChtc2csIDEpOworCQltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgcGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uaW5wdXRfbGVuKTsKKwkJbWVtY3B5KG1zZy0+bDJoLCBwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5pbnB1dCwgbXNnYl9sMmxlbihtc2cpKTsKKworCQltZW1zZXQoJnJlc3VsdCwgMCwgc2l6ZW9mKHJlc3VsdCkpOworCQlpZiAoc2NjcF9wYXJzZV9oZWFkZXIobXNnLCAmcmVzdWx0KSAhPSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSB0ZXN0OiAlZFxuIiwgY3VycmVudF90ZXN0KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS53YW50ZWRfbGVuICE9IHJlc3VsdC5kYXRhX2xlbikgeworCQkJCWZwcmludGYoc3RkZXJyLCAiVW5leHBlY3RlZCBkYXRhIGxlbmd0aC5cbiIpOworCQkJCWFib3J0KCk7CisJCQl9CisKKwkJCWlmIChwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5oYXNfc3JjX3JlZikgeworCQkJCWlmIChtZW1jbXAocmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkJCSAgICZwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5zcmNfcmVmLAorCQkJCQkgICBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpICE9IDApIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJTUkMgUkVGIGRpZCBub3QgbWF0Y2hcbiIpOworCQkJCQlhYm9ydCgpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLmhhc19kc3RfcmVmKSB7CisJCQkJaWYgKG1lbWNtcChyZXN1bHQuZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJCQkgICAmcGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uZHN0X3JlZiwKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKSAhPSAwKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiRFNUIFJFRiBkaWQgbm90IG1hdGNoXG4iKTsKKwkJCQkJYWJvcnQoKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5zcmNfc3NuICE9IC0xKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJOb3QgaW1wbGVtZW50ZWQuXG4iKTsKKwkJCQlhYm9ydCgpOworCQkJfQorCisJCQlpZiAocGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uZHN0X3NzbiAhPSAtMSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiTm90IGltcGxlbWVudGVkLlxuIik7CisJCQkJYWJvcnQoKTsKKwkJCX0KKwkJfQorCisJCW1zZ2JfZnJlZShtc2cpOworCX0KK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdGVzdF9zY2NwX3N5c3RlbSgpOworCXRlc3Rfc2NjcF9zZW5kX3VkdCgpOworCXRlc3Rfc2NjcF91ZHRfY29tbXVuaWNhdGlvbigpOworCXRlc3Rfc2NjcF9jb25uZWN0aW9uKCk7CisJdGVzdF9zY2NwX3N5c3RlbV9jcmFzaCgpOworCXRlc3Rfc2NjcF9wYXJzaW5nKCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZGJfc3RvcmVfY291bnRlcigpIHt9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL3Ntcy50eHQgYi9vcGVuYnNjL3Rlc3RzL3Ntcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjODg1YgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvc21zLnR4dApAQCAtMCwwICsxLDUwIEBACiswMyAwMiAwMSAwYSAwMiA0MyAwYiAwMCAxZCAzOSAwMSAxYSAwMCAwMSAwMCAwNyA5MSA1NSAxMSAxOCAzMSAyOCAwMCAwZSAzMSAyMCAwNCA4MSAyMSA0MyAwMCAwMCBmZiAwNCBkNCBmMiA5YyAwZQorCiswMyAwMiAwMSAwYSAwMiA0MyAwYiAwMCAxZCAtCiszOSAtIFRyYW5zYWN0aW9uSUQgMywgU01TIG1lc3NhZ2VzCTo6IGdoLT5wcm90b19kaXNjcgorMDEgLSBDUC1EQVRBCQkJCTo6IGdoLT5tc2dfdHlwZQorMWEgLSBMZW5ndGg6IDI2CQkJCTo6IGdoLT5kYXRhWzBdCiswMCAtIE1USSAwIFJQLURBVEEgKG1zLT5uKQorMDEgLSBNUiAxCiswMCAtIFJQLU9BCiswNyAtIFJQLURBIChTTVNDIExlbmd0aCkKKzkxIC0gSW50ZXJuYXRpb25hbCBObywgTnVtYmVyaW5nIFBsYW4KKzU1IDExIDE4IDMxIDI4IDAwIC0gNTUxMTgxMTM4MjAwCiswZSAtIFJQLVVEIGxlbiAoMTQpCisKK1RQRFUgKDE0IGJ5dGUpOgorMzEgLSBNVEkoMDEpLCBWUEYoMjpyZWxhdGl2ZSksIE1NUygwKSwgU1JJKDEpLCBVREhJKDApLCBSUCgwKQorMjAgLSBNZXNzYWdlIFJlZmVyZW5jZQorMDQgLSBEQSBsZW5ndGgKKzgxIC0gTnVtYmVyaW5nIFBsYW4sIE5hdGlvbmFsIG51bWJlcgorMjEgNDMgLSBEQSAxMjM0CiswMCAtIFBJRAorMDAgLSBEQ1MKK2ZmIC0gVmFsaWRpdHkgcGVyaW9kCiswNCAtIFVzZXIgRGF0YSBsZW5ndGggKDA0KQorZDQgZjIgOWMgMGUgLSBnc21fZGVmYXVsdCA3Yml0IGVuY29kZWQgIlRlc3QiICg0IGJ5dGUpCisKKzAzIDAyIDAxIDBhIDAyIDQzIDBiIDAwIDlmIDA5IDAxIDljIDAwIGRhIDAwIDA3IDkxIDg4IDk2IDEzIDAwIDAwIDk5IDkwIDExIDdiIDA0IDgxIDIyIDIyIDAwIDA4IGZmIDg2IDZjIDM4IDhjIDUwIDkyIDgwIDg4IDRjIDAwIDRkIDAwIDRkIDAwIDQxIDZhIDE5IDY3IDAzIDc0IDA2IDhjIGExIDdkIGIyIDAwIDIwIDAwIDIwIDUxIDY4IDc0IDAzIDk5IDk2IDUyIDc1IDdkIGIyIDhkIGVmIDZhIDE5IDY3IDAzIGZmIDBjIDZhIDE5IDY3IDAzIDk2IGY2IDk4IGE4IDk2IGFhIGZmIDAxIDhiIDkzIDYwIGE4IDgwIDcwIDY2IDBlIDUxIDMyIDg0IGM0IGZmIDBjIDk3IDQ4IDZkIDNiIDYyIDk1IDhjIGM3IGZmIDAxIDczIGZlIDU3IDI4IDUyIGEwIDUxIDY1IDkwIDAxIDk2IDUwIDkxIGNmIDU5IDI3IDgwIDZmIDc2IGRmIDZkIDBiIDU3IGZhIDk2IDhhIDkxIDc3IDVlIDYzIDUzIDYxIGZmIDBjIDhhIGNiIDRlIDBhIDdkIGIyIDY0IDFjIDVjIDBiIDMwIDBjIDZhIDE5IDY3IDAzIDMwIDBkCisKKzAzIDAyIDAxIDBhIDAyIDQzIDBiIDAwIDlmIC0gbG93ZXIgbGV2ZWxzCiswOSAtIFRyYW5zYWN0aW9uSUQgMCwgU01TIG1lc3NhZ2VzCiswMSAtIENQLURBVEEKKzljIC0gTGVuZ3RoOiAoMTU2KQorMDAgLSBNVEkgMCBSUC1EQVRBIChtcy0+bikKK2RhIC0gTVIgKD8pCiswMCAtIFJQLU9BCiswNyAtIFJQLURBIChTTVNDIExlbmd0aCkKKzkxIC0gSW50ZXJuYXRpb25hbCBOby4KKzg4IDk2IDEzIDAwIDAwIDk5Cis5MCAtIFJQLVVEIGxlbiAoMTQ0KQorMTEgLQorN2IgLSBNZXNzYWdlIFJlZmVyZW5jZQorMDQgLSBEQSBsZW5ndGgKKzgxIC0gTnVtYmVyaW5nIFBsYW4KKzIyIDIyIC0gQWRkcmVzcyAyMjIyCiswMCAtIFBJRAorMDggLSBEQ1MgKFVDUzIgY2hhcnNldCkKK2ZmIC0gVmFsaWRpdHkgcGVyaW9kCis4NiAtIFVzZXIgRGF0YSBsZW5ndGggKDEzNCkKKzZjIDM4IDhjIDUwIDkyIDgwIDg4IDRjIDAwIDRkIDAwIDRkIDAwIDQxIDZhIDE5IDY3IDAzIDc0IDA2IDhjIGExIDdkIGIyIDAwIDIwIDAwIDIwIDUxIDY4IDc0IDAzIDk5IDk2IDUyIDc1IDdkIGIyIDhkIGVmIDZhIDE5IDY3IDAzIGZmIDBjIDZhIDE5IDY3IDAzIDk2IGY2IDk4IGE4IDk2IGFhIGZmIDAxIDhiIDkzIDYwIGE4IDgwIDcwIDY2IDBlIDUxIDMyIDg0IGM0IGZmIDBjIDk3IDQ4IDZkIDNiIDYyIDk1IDhjIGM3IGZmIDAxIDczIGZlIDU3IDI4IDUyIGEwIDUxIDY1IDkwIDAxIDk2IDUwIDkxIGNmIDU5IDI3IDgwIDZmIDc2IGRmIDZkIDBiIDU3IGZhIDk2IDhhIDkxIDc3IDVlIDYzIDUzIDYxIGZmIDBjIDhhIGNiIDRlIDBhIDdkIGIyIDY0IDFjIDVjIDBiIDMwIDBjIDZhIDE5IDY3IDAzIDMwIDBkCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvdG9vbHMvaGxyc3RhdC5wbCBiL29wZW5ic2MvdG9vbHMvaGxyc3RhdC5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NjhmYzlhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90b29scy9obHJzdGF0LnBsCkBAIC0wLDAgKzEsNzMgQEAKKyMhL3Vzci9iaW4vcGVybAorCit1c2Ugc3RyaWN0OwordXNlIERCSTsKK215ICRkYmggPSBEQkktPmNvbm5lY3QoImRiaTpTUUxpdGU6ZGJuYW1lPWhsci5zcWxpdGUzIiwiIiwiIik7CisKKworbXkgJW1jY19uYW1lczsKK215ICVtY2NfbW5jX25hbWVzOworCitzdWIgZ2V0X21jY19tbmNfbmFtZSgkKQoreworCW15ICRtY2NfbW5jID0gc2hpZnQ7CisJbXkgJHJldCA9ICRtY2NfbW5jOworCisJaWYgKCRtY2NfbW5jX25hbWVzeyRtY2NfbW5jfSBuZSAnJykgeworCQkkcmV0ID0gJG1jY19tbmNfbmFtZXN7JG1jY19tbmN9OworCX0KKworCXJldHVybiAkcmV0OworfQorCitzdWIgcmVhZF9uZXR3b3JrcygkKQoreworCW15ICRmaWxlbmFtZSA9IHNoaWZ0OworCW15ICRjdXJfbmFtZTsKKworCW9wZW4oSU5GSUxFLCAkZmlsZW5hbWUpOworCXdoaWxlIChteSAkbCA9IDxJTkZJTEU+KSB7CisJCWNob21wKCRsKTsKKwkJaWYgKCRsID1+IC9eIy8pIHsKKwkJCW5leHQ7CisJCX0KKwkJaWYgKCRsID1+IC9eXHQvKSB7CisJCQlteSAoJG1jYywgJG1uYywgJGJyYW5kLCAkcikgPSBzcGxpdCgnICcsICRsLCA0KTsKKwkJCSNwcmludGYoIiVzfCVzfCVzXG4iLCAkbWNjLCAkbW5jLCAkYnJhbmQpOworCQkJJG1jY19tbmNfbmFtZXN7IiRtY2MtJG1uYyJ9ID0gJGJyYW5kOworCQkJJG1jY19uYW1lc3skbWNjfSA9ICRjdXJfbmFtZTsKKwkJfSBlbHNpZiAoJGwgPX4gL14oXHdcdylcdCguKikvKSB7CisJCQkjcHJpbnRmKCIlc3wlc1xuIiwgJDEsICQyKTsKKwkJCSRjdXJfbmFtZSA9ICQyOworCQl9CisJfQorCWNsb3NlKElORklMRSk7Cit9CisKK3JlYWRfbmV0d29ya3MoIm5ldHdvcmtzLnRhYiIpOworCitteSAlb3Blcl9jb3VudDsKK215ICVjb3VudHJ5X2NvdW50OworCisjbXkgJHN0aCA9ICRkYmgtPnByZXBhcmUoIlNFTEVDVCBpbXNpIEZST00gc3Vic2NyaWJlciB3aGVyZSBhdXRob3JpemVkPTEiKTsKK215ICRzdGggPSAkZGJoLT5wcmVwYXJlKCJTRUxFQ1QgaW1zaSBGUk9NIHN1YnNjcmliZXIiKTsKKworJHN0aC0+ZXhlY3V0ZSgpOworCit3aGlsZSAobXkgJGhyZWYgPSAkc3RoLT5mZXRjaHJvd19oYXNocmVmKSB7CisJbXkgKCRtY2MsICRtbmMpID0gJCRocmVme2ltc2l9ID1+IC8oXGR7M30pKFxkezJ9KS4qLzsKKwkjcHJpbnRmKCIlcyAlcy0lcyBcbiIsICQkaHJlZntpbXNpfSwgJG1jYywgJG1uYyk7CisJJG9wZXJfY291bnR7IiRtY2MtJG1uYyJ9Kys7CisJJGNvdW50cnlfY291bnR7JG1jY30rKzsKK30KKworCitmb3JlYWNoIG15ICRjIChzb3J0eyRjb3VudHJ5X2NvdW50eyRifSA8PT4gJGNvdW50cnlfY291bnR7JGF9fSBrZXlzICVjb3VudHJ5X2NvdW50KSB7CisJcHJpbnRmKCIlczogJWRcbiIsICRtY2NfbmFtZXN7JGN9LCAkY291bnRyeV9jb3VudHskY30pOworCisJZm9yZWFjaCBteSAkayAoc29ydHskb3Blcl9jb3VudHskYn0gPD0+ICRvcGVyX2NvdW50eyRhfX0ga2V5cyAlb3Blcl9jb3VudCkgeworCQlpZiAoJGsgPX4gL14kYy0vKSB7CisJCQlwcmludGYoIlx0JXM6ICVkXG4iLCBnZXRfbWNjX21uY19uYW1lKCRrKSwgJG9wZXJfY291bnR7JGt9KTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzLy5naXRpZ25vcmUgYi9ycmxwLWVwaGVtZXJpcy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YjQ1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNCBAQAorYXNuMV9nZW4vKgorKi5vCisqLmEKK3JybHAtdGVzdApkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvQ09QWUlORyBiL3JybHAtZXBoZW1lcmlzL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3MDg4ZQotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL0NPUFlJTkcKQEAgLTAsMCArMSwyIEBACitTZWUgdGhlIGluY2x1ZGVkIGdwbC0yLjAudHh0IG9yIGdwbC0zLjAudHh0IGRlcGVuZGluZyBvbiB5b3VyCitwcmVmZXJlbmNlcy4KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL01ha2VmaWxlIGIvcnJscC1lcGhlbWVyaXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyY2FjNwotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL01ha2VmaWxlCkBAIC0wLDAgKzEsNDQgQEAKKworQVNOMUM9Li4vLi4vLi4vdG1wL3JybHAvYXNuMWMvYXNuMWMvYXNuMWMKK0FTTjFfSU5DTFVERT0vaG9tZS90bnQvdG1wL3JybHAvYXNuMWMvc2tlbGV0b25zCitDQz1nY2MKK0NGTEFHUz0tSSQoQVNOMV9JTkNMVURFKSAtSWFzbjFfZ2VuIC1PMyAtV2FsbAorCitBU04xX0ZJTEVTPSQod2lsZGNhcmQgYXNuMS8qLmFzbikKKworCithbGw6IHJybHAtdGVzdAorCisKK3JybHAtdGVzdDogbGliZ3NtLWFzbjEuYSBncHMubyB1YngubyB1YngtcGFyc2UubyBycmxwLm8gbWFpbi5vCisJJChDQykgLW8gJEAgZ3BzLm8gdWJ4Lm8gdWJ4LXBhcnNlLm8gcnJscC5vIG1haW4ubyAtTC4gLWxnc20tYXNuMSAtbG0KKworCisjCisjIEFTTjEgZmlsZSBhdXRvZ2VuZXJhdGlvbiAobmVlZCByZWN1cnNpdmUgbWFrZWZpbGUgY2FsbCkKKyMKKworQVNOMV9TT1VSQ0VTID0gJCh3aWxkY2FyZCBhc24xX2dlbi8qLmMpCitBU04xX09CSkVDVFMgPSAkKEFTTjFfU09VUkNFUzouYz0ubykKKworbGliZ3NtLWFzbjEuYTogJChBU04xX0ZJTEVTKQorCW1rZGlyIC1wIGFzbjFfZ2VuICYmIFwKKwljZCBhc24xX2dlbiAmJiBcCisJJChBU04xQykgLWZza2VsZXRvbnMtY29weSAtZm5hdGl2ZS10eXBlcyAtZ2VuLVBFUiAkKGFkZHByZWZpeCAuLi8sJF4pCisJQHJtIGFzbjFfZ2VuL2NvbnZlcnRlci1zYW1wbGUuYyBhc24xX2dlbi9NYWtlZmlsZS5hbS5zYW1wbGUKKwlAJChNQUtFKSBsaWJnc20tYXNuMS5hLnN1Ym1ha2UKKworbGliZ3NtLWFzbjEuYS5zdWJtYWtlOiAkKEFTTjFfT0JKRUNUUykKKwkkKEFSKSByY3MgbGliZ3NtLWFzbjEuYSAkXgorCisuUEhPTlk6IGxpYmdzbS1hc24xLmEuc3VibWFrZQorCisKKyMKKyMgQ2xlYW4KKyMKKworY2xlYW46CisJcm0gLVJmIGFzbjFfZ2VuCisJcm0gLWYgbGliZ3NtLWFzbjEuYSAqLm8gcnJscC10ZXN0CisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUJTLUNvZGUuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQlMtQ29kZS5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyNTM2NgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUJTLUNvZGUuYXNuCkBAIC0wLDAgKzEsMTMxIEBACistLSAkSWQ6IE1BUC1CUy1Db2RlLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KSAKKy0tIDE3LjcuMTAJQmVhcmVyIFNlcnZpY2UgQ29kZXMKKyAKK01BUC1CUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUJTLUNvZGUgKDIwKSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworOjo9CisKK0JFR0lOCisKK0JlYXJlclNlcnZpY2VDb2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29kZSBpZGVudGlmeWluZyBhIHNpbmdsZQorCS0tIGJlYXJlciBzZXJ2aWNlLCBhIGdyb3VwIG9mIGJlYXJlciBzZXJ2aWNlcywgb3IgYWxsIGJlYXJlcgorCS0tIHNlcnZpY2VzLiBUaGUgc2VydmljZXMgYXJlIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMi4wMDIgWzNdLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tCisJLS0gcGxtbi1zcGVjaWZpYyBiZWFyZXIgc2VydmljZXM6CisJLS0gYml0cyA4NzY1NDMyMTogZGVmaW5lZCBieSB0aGUgSFBMTU4gb3BlcmF0b3IKKworCS0tIHJlc3Qgb2YgYmVhcmVyIHNlcnZpY2VzOgorCS0tIGJpdCA4OiAwICh1bnVzZWQpCisJLS0gYml0cyA3NjU0MzIxOiBncm91cCAoYml0cyA3NjU0KSwgYW5kIHJhdGUsIGlmIGFwcGxpY2FibGUKKwktLSAoYml0cyAzMjEpCisKK0V4dC1CZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi41KSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvZGUgaWRlbnRpZnlpbmcgYSBzaW5nbGUKKwktLSBiZWFyZXIgc2VydmljZSwgYSBncm91cCBvZiBiZWFyZXIgc2VydmljZXMsIG9yIGFsbCBiZWFyZXIKKwktLSBzZXJ2aWNlcy4gVGhlIHNlcnZpY2VzIGFyZSBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjIuMDAyIFszXS4KKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLQorCS0tIE9DVEVUIDE6CisJLS0gcGxtbi1zcGVjaWZpYyBiZWFyZXIgc2VydmljZXM6CisJLS0gYml0cyA4NzY1NDMyMTogZGVmaW5lZCBieSB0aGUgSFBMTU4gb3BlcmF0b3IKKwktLQorCS0tIHJlc3Qgb2YgYmVhcmVyIHNlcnZpY2VzOgorCS0tIGJpdCA4OiAwICh1bnVzZWQpCisJLS0gYml0cyA3NjU0MzIxOiBncm91cCAoYml0cyA3NjU0KSwgYW5kIHJhdGUsIGlmIGFwcGxpY2FibGUKKwktLSAoYml0cyAzMjEpCisKKwktLSBPQ1RFVFMgMi01OiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gSWYgcmVjZWl2ZWQgdGhlCisgICAgLS0gRXh0LVRlbGVzZXJ2aWNlQ29kZSBzaGFsbCBiZQorCS0tIHRyZWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgZGVmaW5lZCBmb3IgdGhlCisJLS0gb3BlcmF0aW9uIHRoYXQgdXNlcyB0aGlzIHR5cGUuIAorCisKKwktLSBFeHQtQmVhcmVyU2VydmljZUNvZGUgaW5jbHVkZXMgYWxsIHZhbHVlcyBkZWZpbmVkIGZvciBCZWFyZXJTZXJ2aWNlQ29kZS4KKworYWxsQmVhcmVyU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAwMDAwMCdCCisKK2FsbERhdGFDREEtU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDAwMCdCCitkYXRhQ0RBLTMwMGJwcwkJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDAwMSdCCitkYXRhQ0RBLTEyMDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDAxMCdCCitkYXRhQ0RBLTEyMDAtNzVicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDAxMSdCCitkYXRhQ0RBLTI0MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDEwMCdCCitkYXRhQ0RBLTQ4MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDEwMSdCCitkYXRhQ0RBLTk2MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDExMCdCCitnZW5lcmFsLWRhdGFDREEJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMDExMSdCCisKK2FsbERhdGFDRFMtU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTAwMCdCCitkYXRhQ0RTLTEyMDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTAxMCdCCitkYXRhQ0RTLTI0MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTEwMCdCCitkYXRhQ0RTLTQ4MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTEwMSdCCitkYXRhQ0RTLTk2MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTExMCdCCitnZW5lcmFsLWRhdGFDRFMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDAxMTExMSdCCisKK2FsbFBhZEFjY2Vzc0NBLVNlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMDAnQgorcGFkQWNjZXNzQ0EtMzAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMDEnQgorcGFkQWNjZXNzQ0EtMTIwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDEwJ0IKK3BhZEFjY2Vzc0NBLTEyMDAtNzVicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDAxMSdCCitwYWRBY2Nlc3NDQS0yNDAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAxMDAnQgorcGFkQWNjZXNzQ0EtNDgwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMTAxJ0IKK3BhZEFjY2Vzc0NBLTk2MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDExMCdCCitnZW5lcmFsLXBhZEFjY2Vzc0NBCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAxMTEnQgorCithbGxEYXRhUERTLVNlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDEwMDAnQgorZGF0YVBEUy0yNDAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDExMDAnQgorZGF0YVBEUy00ODAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDExMDEnQgorZGF0YVBEUy05NjAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDExMTAnQgorZ2VuZXJhbC1kYXRhUERTCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDExMTEnQgorCithbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEQQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTEwMDAwJ0IKKworYWxsQWx0ZXJuYXRlU3BlZWNoLURhdGFDRFMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDExMTAwMCdCCisKK2FsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RBCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDEwMDAwMDAnQgorCithbGxTcGVlY2hGb2xsb3dlZEJ5RGF0YUNEUwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAxMDAxMDAwJ0IKKworLS0gVGhlIGZvbGxvd2luZyBub24taGllcmFyY2hpY2FsIENvbXBvdW5kIEJlYXJlciBTZXJ2aWNlCistLSBHcm91cHMgYXJlIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMi4wMzA6CithbGxEYXRhQ2lyY3VpdEFzeW5jaHJvbm91cwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAxMDEwMDAwJ0IKKwktLSBjb3ZlcnMgImFsbERhdGFDREEtU2VydmljZXMiLCAiYWxsQWx0ZXJuYXRlU3BlZWNoLURhdGFDREEiIGFuZAorCS0tICJhbGxTcGVlY2hGb2xsb3dlZEJ5RGF0YUNEQSIKK2FsbEFzeW5jaHJvbm91c1NlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDExMDAwMDAnQgorCS0tIGNvdmVycyAiYWxsRGF0YUNEQS1TZXJ2aWNlcyIsICJhbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEQSIsCisJLS0gImFsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RBIiBhbmQgImFsbFBhZEFjY2Vzc0NEQS1TZXJ2aWNlcyIKK2FsbERhdGFDaXJjdWl0U3luY2hyb25vdXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMTAxMTAwMCdCCisJLS0gY292ZXJzICJhbGxEYXRhQ0RTLVNlcnZpY2VzIiwgImFsbEFsdGVybmF0ZVNwZWVjaC1EYXRhQ0RTIiBhbmQKKwktLSAiYWxsU3BlZWNoRm9sbG93ZWRCeURhdGFDRFMiCithbGxTeW5jaHJvbm91c1NlcnZpY2VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDExMDEwMDAnQgorCS0tIGNvdmVycyAiYWxsRGF0YUNEUy1TZXJ2aWNlcyIsICJhbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEUyIsCisJLS0gImFsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RTIiBhbmQgImFsbERhdGFQRFMtU2VydmljZXMiCistLQorLS0gQ29tcG91bmQgQmVhcmVyIFNlcnZpY2UgR3JvdXAgQ29kZXMgYXJlIG9ubHkgdXNlZCBpbiBjYWxsCistLSBpbmRlcGVuZGVudCBzdXBwbGVtZW50YXJ5IHNlcnZpY2Ugb3BlcmF0aW9ucywgaS5lLiB0aGV5CistLSBhcmUgbm90IHVzZWQgaW4gSW5zZXJ0U3Vic2NyaWJlckRhdGEgb3IgaW4KKy0tIERlbGV0ZVN1YnNjcmliZXJEYXRhIG1lc3NhZ2VzLgorCithbGxQTE1OLXNwZWNpZmljQlMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDAwMCdCCitwbG1uLXNwZWNpZmljQlMtMQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDAxJ0IKK3BsbW4tc3BlY2lmaWNCUy0yCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAwMTAnQgorcGxtbi1zcGVjaWZpY0JTLTMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDAxMSdCCitwbG1uLXNwZWNpZmljQlMtNAlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTAwJ0IKK3BsbW4tc3BlY2lmaWNCUy01CUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMDEnQgorcGxtbi1zcGVjaWZpY0JTLTYJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDExMCdCCitwbG1uLXNwZWNpZmljQlMtNwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTExJ0IKK3BsbW4tc3BlY2lmaWNCUy04CUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMDAnQgorcGxtbi1zcGVjaWZpY0JTLTkJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTAwMSdCCitwbG1uLXNwZWNpZmljQlMtQQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDEwJ0IKK3BsbW4tc3BlY2lmaWNCUy1CCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMTEnQgorcGxtbi1zcGVjaWZpY0JTLUMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTEwMCdCCitwbG1uLXNwZWNpZmljQlMtRAlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTAxJ0IKK3BsbW4tc3BlY2lmaWNCUy1FCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTExMTAnQgorcGxtbi1zcGVjaWZpY0JTLUYJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTExMSdCCisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1Db21tb25EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQ29tbW9uRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2QyMDJlCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQ29tbW9uRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDYzMyBAQAorLS0gJElkOiBNQVAtQ29tbW9uRGF0YVR5cGVzLmFzbiAzMDQ3MCAyMDA5LTEwLTEwIDEyOjM3OjU2WiBrcmogJAorLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KQorLS0gMTcuNy44CUNvbW1vbiBkYXRhIHR5cGVzCisKK01BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKK0lNUExJQ0lUIFRBR1MKKworOjo9CisKK0JFR0lOCisKK0VYUE9SVFMKKworCS0tIGdlbmVyYWwgZGF0YSB0eXBlcyBhbmQgdmFsdWVzCisJQWRkcmVzc1N0cmluZywKKwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJbWF4SVNETi1BZGRyZXNzTGVuZ3RoLAorCUZUTi1BZGRyZXNzU3RyaW5nLAorCUlTRE4tU3ViYWRkcmVzc1N0cmluZywKKwlFeHRlcm5hbFNpZ25hbEluZm8sIAorCUV4dC1FeHRlcm5hbFNpZ25hbEluZm8sIAorQWNjZXNzTmV0d29ya1NpZ25hbEluZm8sCisJU2lnbmFsSW5mbywKKwltYXhTaWduYWxJbmZvTGVuZ3RoLAorCUFsZXJ0aW5nUGF0dGVybiwKKwlUQkNELVNUUklORywKKworCS0tIGRhdGEgdHlwZXMgZm9yIG51bWJlcmluZyBhbmQgaWRlbnRpZmljYXRpb24KKwlJTVNJLAorCVRNU0ksIAorCUlkZW50aXR5LAorCVN1YnNjcmliZXJJZCwKKwlJTUVJLAorCUhMUi1MaXN0LAorCUxNU0ksCisJR2xvYmFsQ2VsbElkLAorCU5ldHdvcmtSZXNvdXJjZSwKKwlBZGRpdGlvbmFsTmV0d29ya1Jlc291cmNlLAorCU5BRUEtUHJlZmVycmVkQ0ksIAorCU5BRUEtQ0lDLCAKKwlBU0NJLUNhbGxSZWZlcmVuY2UsCisJU3Vic2NyaWJlcklkZW50aXR5LAorCVBMTU4tSWQsCisKKwktLSBkYXRhIHR5cGVzIGZvciBDQU1FTAorCUNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJLCAKKwlDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRGaXhlZExlbmd0aCwKKwlMQUlGaXhlZExlbmd0aCwKKworCS0tIGRhdGEgdHlwZXMgZm9yIHN1YnNjcmliZXIgbWFuYWdlbWVudAorCUJhc2ljU2VydmljZUNvZGUsCisJRXh0LUJhc2ljU2VydmljZUNvZGUsCisJRU1MUFAtSW5mbywKKwlFTUxQUC1Qcmlvcml0eSwgCisJTUMtU1MtSW5mbywKKwlNYXhNQy1CZWFyZXJzLAorCU1DLUJlYXJlcnMsCisJRXh0LVNTLVN0YXR1cywKKworCS0tIGRhdGEgdHlwZXMgZm9yIGdlb2dyYXBoaWMgbG9jYXRpb24KKwlBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24sCisJTENTQ2xpZW50RXh0ZXJuYWxJRCwKKwlMQ1NDbGllbnRJbnRlcm5hbElELAorCUxDU1NlcnZpY2VUeXBlSUQsCistLS0gV1MgYWRkZWQgZXhwb3J0cyBuZWVkZWQgYnkgZ3NtX21hcC5hc24gKGV4dHJhIGFzbjEgZmlsZSB0byBoYW5kbGUgb2xkZXIgcHJvdC4gdmVyLikKKwlQcm90b2NvbElkLAorCUxDU1NlcnZpY2VUeXBlSUQJCis7CisKK0lNUE9SVFMKKwlUZWxlc2VydmljZUNvZGUsCisJRXh0LVRlbGVzZXJ2aWNlQ29kZQorRlJPTSBNQVAtVFMtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1UUy1Db2RlICgxOSkgdmVyc2lvbjExICgxMSl9CisKKwlCZWFyZXJTZXJ2aWNlQ29kZSwKKwlFeHQtQmVhcmVyU2VydmljZUNvZGUKK0ZST00gTUFQLUJTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQlMtQ29kZSAoMjApIHZlcnNpb24xMSAoMTEpfQorCisJU1MtQ29kZQorRlJPTSBNQVAtU1MtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1Db2RlICgxNSkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKzsKKworCistLSBnZW5lcmFsIGRhdGEgdHlwZXMKKworVEJDRC1TVFJJTkcgOjo9IE9DVEVUIFNUUklORworCS0tIFRoaXMgdHlwZSAoVGVsZXBob255IEJpbmFyeSBDb2RlZCBEZWNpbWFsIFN0cmluZykgaXMgdXNlZCB0bworCS0tIHJlcHJlc2VudCBzZXZlcmFsIGRpZ2l0cyBmcm9tIDAgdGhyb3VnaCA5LCAqLCAjLCBhLCBiLCBjLCB0d28KKwktLSBkaWdpdHMgcGVyIG9jdGV0LCBlYWNoIGRpZ2l0IGVuY29kZWQgMDAwMCB0byAxMDAxICgwIHRvIDkpLAorCS0tIDEwMTAgKCopLCAxMDExICgjKSwgMTEwMCAoYSksIDExMDEgKGIpIG9yIDExMTAgKGMpOyAxMTExIHVzZWQKKwktLSBhcyBmaWxsZXIgd2hlbiB0aGVyZSBpcyBhbiBvZGQgbnVtYmVyIG9mIGRpZ2l0cy4KKworCS0tIGJpdHMgODc2NSBvZiBvY3RldCBuIGVuY29kaW5nIGRpZ2l0IDJuCisJLS0gYml0cyA0MzIxIG9mIG9jdGV0IG4gZW5jb2RpbmcgZGlnaXQgMihuLTEpICsxCisKK0FkZHJlc3NTdHJpbmcgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4QWRkcmVzc0xlbmd0aCkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IGEgbnVtYmVyIGZvciBhZGRyZXNzaW5nCisJLS0gcHVycG9zZXMuIEl0IGlzIGNvbXBvc2VkIG9mCisJLS0JYSkJb25lIG9jdGV0IGZvciBuYXR1cmUgb2YgYWRkcmVzcywgYW5kIG51bWJlcmluZyBwbGFuCisJLS0JCWluZGljYXRvci4KKwktLQliKQlkaWdpdHMgb2YgYW4gYWRkcmVzcyBlbmNvZGVkIGFzIFRCQ0QtU3RyaW5nLgorCisJLS0gYSkJVGhlIGZpcnN0IG9jdGV0IGluY2x1ZGVzIGEgb25lIGJpdCBleHRlbnNpb24gaW5kaWNhdG9yLCBhCisJLS0JCTMgYml0cyBuYXR1cmUgb2YgYWRkcmVzcyBpbmRpY2F0b3IgYW5kIGEgNCBiaXRzIG51bWJlcmluZworCS0tCQlwbGFuIGluZGljYXRvciwgZW5jb2RlZCBhcyBmb2xsb3dzOgorCisJLS0gYml0IDg6IDEgIChubyBleHRlbnNpb24pCisKKwktLSBiaXRzIDc2NTogbmF0dXJlIG9mIGFkZHJlc3MgaW5kaWNhdG9yCisJLS0JMDAwICB1bmtub3duCisJLS0JMDAxICBpbnRlcm5hdGlvbmFsIG51bWJlcgorCS0tCTAxMCAgbmF0aW9uYWwgc2lnbmlmaWNhbnQgbnVtYmVyCisJLS0JMDExICBuZXR3b3JrIHNwZWNpZmljIG51bWJlcgorCS0tCTEwMCAgc3Vic2NyaWJlciBudW1iZXIKKwktLQkxMDEgIHJlc2VydmVkCisJLS0JMTEwICBhYmJyZXZpYXRlZCBudW1iZXIKKwktLQkxMTEgIHJlc2VydmVkIGZvciBleHRlbnNpb24KKworCS0tIGJpdHMgNDMyMTogbnVtYmVyaW5nIHBsYW4gaW5kaWNhdG9yCisJLS0JMDAwMCAgdW5rbm93bgorCS0tCTAwMDEgIElTRE4vVGVsZXBob255IE51bWJlcmluZyBQbGFuIChSZWMgSVRVLVQgRS4xNjQpCisJLS0JMDAxMCAgc3BhcmUKKwktLQkwMDExICBkYXRhIG51bWJlcmluZyBwbGFuIChJVFUtVCBSZWMgWC4xMjEpCisJLS0JMDEwMCAgdGVsZXggbnVtYmVyaW5nIHBsYW4gKElUVS1UIFJlYyBGLjY5KQorCS0tCTAxMDEgIHNwYXJlCisJLS0JMDExMCAgbGFuZCBtb2JpbGUgbnVtYmVyaW5nIHBsYW4gKElUVS1UIFJlYyBFLjIxMikKKwktLQkwMTExICBzcGFyZQorCS0tCTEwMDAgIG5hdGlvbmFsIG51bWJlcmluZyBwbGFuCisJLS0JMTAwMSAgcHJpdmF0ZSBudW1iZXJpbmcgcGxhbgorCS0tCTExMTEgIHJlc2VydmVkIGZvciBleHRlbnNpb24KKworCS0tCWFsbCBvdGhlciB2YWx1ZXMgYXJlIHJlc2VydmVkLgorCisJLS0gYikJVGhlIGZvbGxvd2luZyBvY3RldHMgcmVwcmVzZW50aW5nIGRpZ2l0cyBvZiBhbiBhZGRyZXNzCisJLS0JCWVuY29kZWQgYXMgYSBUQkNELVNUUklORy4KKworbWF4QWRkcmVzc0xlbmd0aCAgSU5URUdFUiA6Oj0gMjAKKworSVNETi1BZGRyZXNzU3RyaW5nIDo6PSAKKwkJCUFkZHJlc3NTdHJpbmcgKFNJWkUgKDEuLm1heElTRE4tQWRkcmVzc0xlbmd0aCkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IElTRE4gbnVtYmVycy4KKworbWF4SVNETi1BZGRyZXNzTGVuZ3RoICBJTlRFR0VSIDo6PSA5CisKK0ZUTi1BZGRyZXNzU3RyaW5nIDo6PSAKKwkJCUFkZHJlc3NTdHJpbmcgKFNJWkUgKDEuLm1heEZUTi1BZGRyZXNzTGVuZ3RoKSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgZm9yd2FyZGVkLXRvIG51bWJlcnMuIAorCS0tIElmIE5BSSA9IGludGVybmF0aW9uYWwgdGhlIGZpcnN0IGRpZ2l0cyByZXByZXNlbnQgdGhlIGNvdW50cnkgY29kZSAoQ0MpCisJLS0gYW5kIHRoZSBuZXR3b3JrIGRlc3RpbmF0aW9uIGNvZGUgKE5EQykgYXMgZm9yIEUuMTY0LgorCittYXhGVE4tQWRkcmVzc0xlbmd0aCAgSU5URUdFUiA6Oj0gMTUKKworSVNETi1TdWJhZGRyZXNzU3RyaW5nIDo6PSAKKwkJCU9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4SVNETi1TdWJhZGRyZXNzTGVuZ3RoKSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgSVNETiBzdWJhZGRyZXNzZXMuCisJLS0gSXQgaXMgY29tcG9zZWQgb2YKKwktLQlhKQlvbmUgb2N0ZXQgZm9yIHR5cGUgb2Ygc3ViYWRkcmVzcyBhbmQgb2RkL2V2ZW4gaW5kaWNhdG9yLgorCS0tCWIpCTIwIG9jdGV0cyBmb3Igc3ViYWRkcmVzcyBpbmZvcm1hdGlvbi4KKworCS0tCWEpCVRoZSBmaXJzdCBvY3RldCBpbmNsdWRlcyBhIG9uZSBiaXQgZXh0ZW5zaW9uIGluZGljYXRvciwgYQorCS0tCQkzIGJpdHMgdHlwZSBvZiBzdWJhZGRyZXNzIGFuZCBhIG9uZSBiaXQgb2RkL2V2ZW4gaW5kaWNhdG9yLAorCS0tCQllbmNvZGVkIGFzIGZvbGxvd3M6CisKKwktLQliaXQgODogMSAgKG5vIGV4dGVuc2lvbikKKworCS0tCWJpdHMgNzY1OiB0eXBlIG9mIHN1YmFkZHJlc3MKKwktLQkJMDAwICBOU0FQIChYLjIxMy9JU08gODM0OCBBRDIpCisJLS0JCTAxMCAgVXNlciBTcGVjaWZpZWQKKwktLQkJQWxsIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQKKworCS0tCWJpdCA0OiBvZGQvZXZlbiBpbmRpY2F0b3IKKwktLQkJMCAgZXZlbiBudW1iZXIgb2YgYWRkcmVzcyBzaWduYWxzCisJLS0JCTEgIG9kZCBudW1iZXIgb2YgYWRkcmVzcyBzaWduYWxzCisJLS0JCVRoZSBvZGQvZXZlbiBpbmRpY2F0b3IgaXMgdXNlZCB3aGVuIHRoZSB0eXBlIG9mIHN1YmFkZHJlc3MKKwktLQkJaXMgInVzZXIgc3BlY2lmaWVkIiBhbmQgdGhlIGNvZGluZyBpcyBCQ0QuCisKKwktLQliaXRzIDMyMTogMDAwICh1bnVzZWQpCisKKwktLQliKSBTdWJhZGRyZXNzIGluZm9ybWF0aW9uLgorCS0tCVRoZSBOU0FQIFguMjEzL0lTTzgzNDhBRDIgYWRkcmVzcyBzaGFsbCBiZSBmb3JtYXR0ZWQgYXMgc3BlY2lmaWVkCisJLS0JYnkgb2N0ZXQgNCB3aGljaCBjb250YWlucyB0aGUgQXV0aG9yaXR5IGFuZCBGb3JtYXQgSWRlbnRpZmllcgorCS0tCShBRkkpLiBUaGUgZW5jb2RpbmcgaXMgbWFkZSBhY2NvcmRpbmcgdG8gdGhlICJwcmVmZXJyZWQgYmluYXJ5CisJLS0JZW5jb2RpbmciIGFzIGRlZmluZWQgaW4gWC4yMTMvSVNPODM0QUQyLiBGb3IgdGhlIGRlZmluaXRpb24KKwktLQlvZiB0aGlzIHR5cGUgb2Ygc3ViYWRkcmVzcywgc2VlIElUVS1UIFJlYyBJLjMzNC4KKworCS0tCUZvciBVc2VyLXNwZWNpZmljIHN1YmFkZHJlc3MsIHRoaXMgZmllbGQgaXMgZW5jb2RlZCBhY2NvcmRpbmcKKwktLQl0byB0aGUgdXNlciBzcGVjaWZpY2F0aW9uLCBzdWJqZWN0IHRvIGEgbWF4aW11bSBsZW5ndGggb2YgMjAKKwktLQlvY3RldHMuIFdoZW4gaW50ZXJ3b3JraW5nIHdpdGggWC4yNSBuZXR3b3JrcyBCQ0QgY29kaW5nIHNob3VsZAorCS0tCWJlIGFwcGxpZWQuCisKK21heElTRE4tU3ViYWRkcmVzc0xlbmd0aCAgSU5URUdFUiA6Oj0gMjEKKworRXh0ZXJuYWxTaWduYWxJbmZvIDo6PSBTRVFVRU5DRSB7CisJcHJvdG9jb2xJZAlQcm90b2NvbElkLAorCXNpZ25hbEluZm8JU2lnbmFsSW5mbywKKwktLSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGdpdmVuIGluCisJLS0gY2xhdXNlIDcuNi45LgorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLS0gZXh0ZW5zaW9uQ29udGFpbmVyIG11c3Qgbm90IGJlIHVzZWQgaW4gdmVyc2lvbiAyCisJLi4ufQorCitTaWduYWxJbmZvIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heFNpZ25hbEluZm9MZW5ndGgpKQorCittYXhTaWduYWxJbmZvTGVuZ3RoICBJTlRFR0VSIDo6PSAyMDAKKwktLSBUaGlzIE5hbWVkVmFsdWUgcmVwcmVzZW50cyB0aGUgdGhlb3JldGljYWwgbWF4aW11bSBudW1iZXIgb2Ygb2N0ZXRzIHdoaWNoIGlzCisJLS0gYXZhaWxhYmxlIHRvIGNhcnJ5IGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSBTaWduYWxJbmZvIGRhdGEgdHlwZSwKKwktLSB3aXRob3V0IHJlcXVpcmluZyBzZWdtZW50YXRpb24gdG8gY29wZSB3aXRoIHRoZSBuZXR3b3JrIGxheWVyIHNlcnZpY2UuCisJLS0gSG93ZXZlciwgdGhlIGFjdHVhbCBtYXhpbXVtIHNpemUgYXZhaWxhYmxlIGZvciBhbiBpbnN0YW5jZSBvZiB0aGUgZGF0YQorCS0tIHR5cGUgbWF5IGJlIGxvd2VyLCBlc3BlY2lhbGx5IHdoZW4gb3RoZXIgaW5mb3JtYXRpb24gZWxlbWVudHMKKwktLSBoYXZlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzYW1lIGNvbXBvbmVudC4KKworUHJvdG9jb2xJZCA6Oj0gRU5VTUVSQVRFRCB7CisJZ3NtLTA0MDggICgxKSwKKwlnc20tMDgwNiAgKDIpLAorCWdzbS1CU1NNQVAgICgzKSwKKwktLSBWYWx1ZSAzIGlzIHJlc2VydmVkIGFuZCBtdXN0IG5vdCBiZSB1c2VkCisJZXRzLTMwMDEwMi0xICAoNCl9CisKK0V4dC1FeHRlcm5hbFNpZ25hbEluZm8gOjo9IFNFUVVFTkNFIHsKKwlleHQtUHJvdG9jb2xJZAlFeHQtUHJvdG9jb2xJZCwKKwlzaWduYWxJbmZvCVNpZ25hbEluZm8sCisJLS0gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBnaXZlbiBpbgorCS0tIGNsYXVzZSA3LjYuOS4xMAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFeHQtUHJvdG9jb2xJZCA6Oj0gRU5VTUVSQVRFRCB7CisJZXRzLTMwMDM1NiAgKDEpLAorCS4uLiAKKwkgfQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gRm9yIEV4dC1FeHRlcm5hbFNpZ25hbEluZm8gc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkKKy0tIG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlIAorLS0gRXh0LUV4dGVybmFsU2lnbmFsSW5mbyBzZXF1ZW5jZS4KKworQWNjZXNzTmV0d29ya1NpZ25hbEluZm8gOjo9IFNFUVVFTkNFIHsKKwlhY2Nlc3NOZXR3b3JrUHJvdG9jb2xJZAlBY2Nlc3NOZXR3b3JrUHJvdG9jb2xJZCwKKwlzaWduYWxJbmZvCUxvbmdTaWduYWxJbmZvLAorCS0tIEluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZ2l2ZW4gaW4gY2xhdXNlIDcuNi45LjEKKwkKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTG9uZ1NpZ25hbEluZm8gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4TG9uZ1NpZ25hbEluZm9MZW5ndGgpKQorCittYXhMb25nU2lnbmFsSW5mb0xlbmd0aCAgSU5URUdFUiA6Oj0gMjU2MAorCS0tIFRoaXMgTmFtZWQgVmFsdWUgcmVwcmVzZW50cyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb2N0ZXRzIHdoaWNoIGlzIGF2YWlsYWJsZQorCS0tIHRvIGNhcnJ5IGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSBMb25nU2lnbmFsSW5mbyBkYXRhIHR5cGUgdXNpbmcKKwktLSBXaGl0ZSBCb29rIFNDQ1Agd2l0aCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VnbWVudHMuCisJLS0gSXQgdGFrZXMgYWNjb3VudCBvZiB0aGUgb2N0ZXRzIHVzZWQgYnkgdGhlIGxvd2VyIGxheWVycyBvZiB0aGUgcHJvdG9jb2wsIGFuZAorCS0tIG90aGVyIGluZm9ybWF0aW9uIGVsZW1lbnRzIHdoaWNoIG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgc2FtZSBjb21wb25lbnQuCisKK0FjY2Vzc05ldHdvcmtQcm90b2NvbElkIDo6PSBFTlVNRVJBVEVEIHsKKwl0czNHLTQ4MDA2ICAgKDEpLAorCXRzM0ctMjU0MTMgKDIpLAorCS4uLn0KKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gRm9yIEFjY2Vzc05ldHdvcmtTaWduYWxJbmZvIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgcGFyYW1ldGVyIHdpdGggYW55CisJLS0gb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUgCisJLS0gQWNjZXNzTmV0d29ya1NpZ25hbEluZm8gc2VxdWVuY2UuCisKK0FsZXJ0aW5nUGF0dGVybiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSApCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IEFsZXJ0aW5nIFBhdHRlcm4KKworCS0tCWJpdHMgODc2NSA6IDAwMDAgKHVudXNlZCkKKworCS0tCWJpdHMgNDMgOiB0eXBlIG9mIFBhdHRlcm4KKwktLQkJMDAgbGV2ZWwKKwktLQkJMDEgY2F0ZWdvcnkKKwktLQkJMTAgY2F0ZWdvcnkKKwktLQkJYWxsIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQuCisKKwktLQliaXRzIDIxIDogdHlwZSBvZiBhbGVydGluZworCithbGVydGluZ0xldmVsLTAgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDAwMCdCCithbGVydGluZ0xldmVsLTEgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDAwMSdCCithbGVydGluZ0xldmVsLTIgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDAxMCdCCisJLS0gYWxsIG90aGVyIHZhbHVlcyBvZiBBbGVydGluZyBsZXZlbCBhcmUgcmVzZXJ2ZWQKKwktLSBBbGVydGluZyBMZXZlbHMgYXJlIGRlZmluZWQgaW4gR1NNIDAyLjA3CisJCithbGVydGluZ0NhdGVnb3J5LTEgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDEwMCdCCithbGVydGluZ0NhdGVnb3J5LTIgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDEwMSdCCithbGVydGluZ0NhdGVnb3J5LTMgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDExMCdCCithbGVydGluZ0NhdGVnb3J5LTQgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMDExMSdCCithbGVydGluZ0NhdGVnb3J5LTUgICBBbGVydGluZ1BhdHRlcm4gOjo9ICcwMDAwMTAwMCdCCisJLS0gYWxsIG90aGVyIHZhbHVlcyBvZiBBbGVydGluZyBDYXRlZ29yeSBhcmUgcmVzZXJ2ZWQKKwktLSBBbGVydGluZyBjYXRlZ29yaWVzIGFyZSBkZWZpbmVkIGluIEdTTSAwMi4wNworCistLSBkYXRhIHR5cGVzIGZvciBudW1iZXJpbmcgYW5kIGlkZW50aWZpY2F0aW9uCisKK0lNU0kgOjo9IFRCQ0QtU1RSSU5HIChTSVpFICgzLi44KSkKKwktLSBkaWdpdHMgb2YgTUNDLCBNTkMsIE1TSU4gYXJlIGNvbmNhdGVuYXRlZCBpbiB0aGlzIG9yZGVyLgorCitJZGVudGl0eSA6Oj0gQ0hPSUNFIHsKKwlpbXNpCQkJSU1TSSwKKwlpbXNpLVdpdGhMTVNJCUlNU0ktV2l0aExNU0l9CisKK0lNU0ktV2l0aExNU0kgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSSwKKwlsbXNpCQkJTE1TSSwKKwktLSBhIHNwZWNpYWwgdmFsdWUgMDAwMDAwMDAgaW5kaWNhdGVzIHRoYXQgdGhlIExNU0kgaXMgbm90IGluIHVzZQorCS4uLn0KKworQVNDSS1DYWxsUmVmZXJlbmNlIDo6PSBUQkNELVNUUklORyAoU0laRSAoMS4uOCkpCisJLS0gZGlnaXRzIG9mIFZHQ1MvVkJTLWFyZWEsR3JvdXAtSUQgYXJlIGNvbmNhdGVuYXRlZCBpbiB0aGlzIG9yZGVyIGlmIHRoZXJlIGlzIGEKKwktLSBWR0NTL1ZCUy1hcmVhLgorCitUTVNJIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjQpKQorCitTdWJzY3JpYmVySWQgOjo9IENIT0lDRSB7CisJaW1zaQkJCVswXSBJTVNJLAorCXRtc2kJCQlbMV0gVE1TSX0KKworSU1FSSA6Oj0gVEJDRC1TVFJJTkcgKFNJWkUgKDgpKQorCS0tCVJlZmVycyB0byBJbnRlcm5hdGlvbmFsIE1vYmlsZSBTdGF0aW9uIEVxdWlwbWVudCBJZGVudGl0eQorCS0tCWFuZCBTb2Z0d2FyZSBWZXJzaW9uIE51bWJlciAoU1ZOKSBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10uCisJLS0JSWYgdGhlIFNWTiBpcyBub3QgcHJlc2VudCB0aGUgbGFzdCBvY3RldCBzaGFsbCBjb250YWluIHRoZQorCS0tCWRpZ2l0IDAgYW5kIGEgZmlsbGVyLgorCS0tCUlmIHByZXNlbnQgdGhlIFNWTiBzaGFsbCBiZSBpbmNsdWRlZCBpbiB0aGUgbGFzdCBvY3RldC4KKworSExSLUlkIDo6PSBJTVNJCisJLS0gbGVhZGluZyBkaWdpdHMgb2YgSU1TSSwgaS5lLiAoTUNDLCBNTkMsIGxlYWRpbmcgZGlnaXRzIG9mCisJLS0gTVNJTikgZm9ybWluZyBITFIgSWQgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIzLjAwMyBbMTddLgorCitITFItTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZITFItSWQpIE9GCisJCQkJSExSLUlkCisKK21heE51bU9mSExSLUlkICBJTlRFR0VSIDo6PSA1MAorCitMTVNJIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDQpKQorCitHbG9iYWxDZWxsSWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNS4uNykpCisJLS0gUmVmZXJzIHRvIENlbGwgR2xvYmFsIElkZW50aWZpY2F0aW9uIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XS4KKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLSBvY3RldCAxIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBDb3VudHJ5IENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXQgMiBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAzcmQgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDNyZCBkaWdpdAorCS0tCQkJb3IgZmlsbGVyICgxMTExKSBmb3IgMiBkaWdpdCBNTkNzCisJLS0gb2N0ZXQgMyBiaXRzIDQzMjEJTW9iaWxlIE5ldHdvcmsgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0cyA0IGFuZCA1CUxvY2F0aW9uIEFyZWEgQ29kZSBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyNC4wMDggWzM1XQorCS0tIG9jdGV0cyA2IGFuZCA3CUNlbGwgSWRlbnRpdHkgKENJKSBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyNC4wMDggWzM1XQorCitOZXR3b3JrUmVzb3VyY2UgOjo9IEVOVU1FUkFURUQgeworCXBsbW4gICgwKSwKKwlobHIgICgxKSwKKwl2bHIgICgyKSwKKwlwdmxyICAoMyksCisJY29udHJvbGxpbmdNU0MgICg0KSwKKwl2bXNjICAoNSksCisJZWlyICAoNiksCisJcnNzICAoNyl9CisKK0FkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UgOjo9IEVOVU1FUkFURUQgeworCXNnc24gKDApLAorCWdnc24gKDEpLAorCWdtbGMgKDIpLAorCWdzbVNDRiAoMyksCisJbnBsciAoNCksCisJYXVjICg1KSwKKwkuLi4gLAorCXVlICg2KSwKKwltbWUgKDcpfQorCS0tIGlmIHVua25vd24gdmFsdWUgaXMgcmVjZWl2ZWQgaW4gQWRkaXRpb25hbE5ldHdvcmtSZXNvdXJjZQorCS0tIGl0IHNoYWxsIGJlIGlnbm9yZWQuCisKKworTkFFQS1QcmVmZXJyZWRDSSA6Oj0gU0VRVUVOQ0UgeworCW5hZWEtUHJlZmVycmVkQ0lDCVswXSBOQUVBLUNJQywKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK05BRUEtQ0lDIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBieSB0aGUgQ2FycmllciBJZGVudGlmaWNhdGlvbgorCS0tIHBhcmFtZXRlciBpbiBBTlNJIFQxLjExMy4zLiBDYXJyaWVyIGNvZGVzIGJldHdlZW4gIjAwMCIgYW5kICI5OTkiIG1heQorCS0tIGJlIGVuY29kZWQgYXMgMyBkaWdpdHMgdXNpbmcgIjAwMCIgdG8gIjk5OSIgb3IgYXMgNCBkaWdpdHMgdXNpbmcgCisJLS0gIjAwMDAiIHRvICIwOTk5Ii4gQ2FycmllciBjb2RlcyBiZXR3ZWVuICIxMDAwIiBhbmQgIjk5OTkiIGFyZSBlbmNvZGVkCisJLS0gdXNpbmcgNCBkaWdpdHMuCisKK1N1YnNjcmliZXJJZGVudGl0eSA6Oj0gQ0hPSUNFIHsKKwlpbXNpCQkJWzBdIElNU0ksCisJbXNpc2RuCQlbMV0gSVNETi1BZGRyZXNzU3RyaW5nCisJfQorCitMQ1NDbGllbnRFeHRlcm5hbElEIDo6PSBTRVFVRU5DRSB7CisJZXh0ZXJuYWxBZGRyZXNzCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworTENTQ2xpZW50SW50ZXJuYWxJRCA6Oj0gRU5VTUVSQVRFRCB7CisJYnJvYWRjYXN0U2VydmljZQkoMCksCisJby1hbmRNLUhQTE1OCSgxKSwKKwlvLWFuZE0tVlBMTU4JKDIpLAorCWFub255bW91c0xvY2F0aW9uCSgzKSwKKwl0YXJnZXRNU3N1YnNjcmliZWRTZXJ2aWNlCSg0KSwKKwkuLi4gfQorLS0gZm9yIGEgQ0FNRUwgcGhhc2UgMyBQTE1OIG9wZXJhdG9yIGNsaWVudCwgdGhlIHZhbHVlIHRhcmdldE1Tc3Vic2NyaWJlZFNlcnZpY2Ugc2hhbGwgYmUgdXNlZAorCitMQ1NTZXJ2aWNlVHlwZUlEIDo6PSBJTlRFR0VSICgwLi4xMjcpCisJLS0gdGhlIGludGVnZXIgdmFsdWVzIDAtNjMgYXJlIHJlc2VydmVkIGZvciBTdGFuZGFyZCBMQ1Mgc2VydmljZSB0eXBlcworCS0tIHRoZSBpbnRlZ2VyIHZhbHVlcyA2NC0xMjcgYXJlIHJlc2VydmVkIGZvciBOb24gU3RhbmRhcmQgTENTIHNlcnZpY2UgdHlwZXMKKworLS0gU3RhbmRhcmQgTENTIFNlcnZpY2UgVHlwZXMKK2VtZXJnZW5jeVNlcnZpY2VzCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAwCitlbWVyZ2VuY3lBbGVydFNlcnZpY2VzCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxCitwZXJzb25UcmFja2luZwkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDIKK2ZsZWV0TWFuYWdlbWVudAkJTENTU2VydmljZVR5cGVJRCA6Oj0gMworYXNzZXRNYW5hZ2VtZW50CQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA0Cit0cmFmZmljQ29uZ2VzdGlvblJlcG9ydGluZwkJTENTU2VydmljZVR5cGVJRCA6Oj0gNQorcm9hZHNpZGVBc3Npc3RhbmNlCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2Cityb3V0aW5nVG9OZWFyZXN0Q29tbWVyY2lhbEVudGVycHJpc2UJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDcKK25hdmlnYXRpb24JCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4CisJLS10aGlzIHNlcnZpY2UgdHlwZSBpcyByZXNlcnZlZCBmb3IgdXNlIGluIHByZXZpb3VzIHJlbGVhc2VzCitjaXR5U2lnaHRzZWVpbmcJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDkKK2xvY2FsaXplZEFkdmVydGlzaW5nCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMAorbW9iaWxlWWVsbG93UGFnZXMJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExIAordHJhZmZpY0FuZFB1YmxpY1RyYW5zcG9ydGF0aW9uSW5mbwkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTIKK3dlYXRoZXIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTMKK2Fzc2V0QW5kU2VydmljZUZpbmRpbmcJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDE0CitnYW1pbmcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTUKK2ZpbmRZb3VyRnJpZW5kCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTYKK2RhdGluZwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxNworY2hhdHRpbmcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTgKK3JvdXRlRmluZGluZwkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDE5Cit3aGVyZUFtSQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAyMAorCistLSBUaGUgdmFsdWVzIG9mIExDU1NlcnZpY2VUeXBlSUQgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjIuMDcxLgorCistLSBOb24gU3RhbmRhcmQgTENTIFNlcnZpY2UgVHlwZXMKK3NlcnY2NAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2NAorc2VydjY1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDY1CitzZXJ2NjYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNjYKK3NlcnY2NwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2Nworc2VydjY4CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDY4CitzZXJ2NjkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNjkKK3NlcnY3MAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3MAorc2VydjcxCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDcxCitzZXJ2NzIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzIKK3NlcnY3MwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3Mworc2Vydjc0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDc0CitzZXJ2NzUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzUKK3NlcnY3NgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3Ngorc2Vydjc3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDc3CitzZXJ2NzgJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzgKK3NlcnY3OQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3OQorc2VydjgwCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDgwCitzZXJ2ODEJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODEKK3NlcnY4MgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4Mgorc2VydjgzCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDgzCitzZXJ2ODQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODQKK3NlcnY4NQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4NQorc2Vydjg2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDg2CitzZXJ2ODcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODcKK3NlcnY4OAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4OAorc2Vydjg5CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDg5CitzZXJ2OTAJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTAKK3NlcnY5MQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5MQorc2VydjkyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDkyCitzZXJ2OTMJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTMKK3NlcnY5NAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5NAorc2Vydjk1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDk1CitzZXJ2OTYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTYKK3NlcnY5NwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5Nworc2Vydjk4CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDk4CitzZXJ2OTkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTkKK3NlcnYxMDAJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTAwCitzZXJ2MTAxCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwMQorc2VydjEwMgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDIKK3NlcnYxMDMJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTAzCitzZXJ2MTA0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwNAorc2VydjEwNQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDUKK3NlcnYxMDYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTA2CitzZXJ2MTA3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwNworc2VydjEwOAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDgKK3NlcnYxMDkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTA5CitzZXJ2MTEwCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExMAorc2VydjExMQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTEKK3NlcnYxMTIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTEyCitzZXJ2MTEzCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExMworc2VydjExNAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTQKK3NlcnYxMTUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTE1CitzZXJ2MTE2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExNgorc2VydjExNwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTcKK3NlcnYxMTgJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTE4CitzZXJ2MTE5CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExOQorc2VydjEyMAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjAKK3NlcnYxMjEJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTIxCitzZXJ2MTIyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyMgorc2VydjEyMwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjMKK3NlcnYxMjQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTI0CitzZXJ2MTI1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyNQorc2VydjEyNgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjYKK3NlcnYxMjcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTI3CisKK1BMTU4tSWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMykpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0gb2N0ZXQgMSBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgQ291bnRyeSBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0IDIgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgM3JkIGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAzcmQgZGlnaXQKKwktLQkJCW9yIGZpbGxlciAoMTExMSkgZm9yIDIgZGlnaXQgTU5DcworCS0tIG9jdGV0IDMgYml0cyA0MzIxCU1vYmlsZSBOZXR3b3JrIENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAybmQgZGlnaXQKKworLS0gZGF0YSB0eXBlcyBmb3IgQ0FNRUwKKworQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkgOjo9IENIT0lDRSB7CisJY2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkRml4ZWRMZW5ndGgJWzBdIENlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZEZpeGVkTGVuZ3RoLAorCWxhaUZpeGVkTGVuZ3RoCVsxXSBMQUlGaXhlZExlbmd0aH0KKworQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkRml4ZWRMZW5ndGggOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNykpCisJLS0gUmVmZXJzIHRvIENlbGwgR2xvYmFsIElkZW50aWZpY2F0aW9uIG9yIFNlcnZpY2UgQXJlIElkZW50aWZpY2F0aW9uCisJLS0gZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAwMy4KKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLSBvY3RldCAxIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBDb3VudHJ5IENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXQgMiBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAzcmQgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDNyZCBkaWdpdAorCS0tCQkJb3IgZmlsbGVyICgxMTExKSBmb3IgMiBkaWdpdCBNTkNzCisJLS0gb2N0ZXQgMyBiaXRzIDQzMjEJTW9iaWxlIE5ldHdvcmsgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0cyA0IGFuZCA1CUxvY2F0aW9uIEFyZWEgQ29kZSBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDgKKwktLSBvY3RldHMgNiBhbmQgNwlDZWxsIElkZW50aXR5IChDSSkgdmFsdWUgb3IgCisJLS0gCQkJU2VydmljZSBBcmVhIENvZGUgKFNBQykgdmFsdWUgCisJLS0JCQlhY2NvcmRpbmcgdG8gM0dQUCBUUyAyMy4wMDMKKworTEFJRml4ZWRMZW5ndGggOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNSkpCisJLS0gUmVmZXJzIHRvIExvY2F0aW9uIEFyZWEgSWRlbnRpZmljYXRpb24gZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAwMyBbMTddLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tIG9jdGV0IDEgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIENvdW50cnkgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldCAyIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDNyZCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgM3JkIGRpZ2l0CisJLS0JCQlvciBmaWxsZXIgKDExMTEpIGZvciAyIGRpZ2l0IE1OQ3MKKwktLSBvY3RldCAzIGJpdHMgNDMyMQlNb2JpbGUgTmV0d29yayBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXRzIDQgYW5kIDUJTG9jYXRpb24gQXJlYSBDb2RlIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdCisKKy0tIGRhdGEgdHlwZXMgZm9yIHN1YnNjcmliZXIgbWFuYWdlbWVudAorCitCYXNpY1NlcnZpY2VDb2RlIDo6PSBDSE9JQ0UgeworCWJlYXJlclNlcnZpY2UJWzJdIEJlYXJlclNlcnZpY2VDb2RlLAorCXRlbGVzZXJ2aWNlCVszXSBUZWxlc2VydmljZUNvZGV9CisKK0V4dC1CYXNpY1NlcnZpY2VDb2RlIDo6PSBDSE9JQ0UgeworCWV4dC1CZWFyZXJTZXJ2aWNlCVsyXSBFeHQtQmVhcmVyU2VydmljZUNvZGUsCisJZXh0LVRlbGVzZXJ2aWNlCVszXSBFeHQtVGVsZXNlcnZpY2VDb2RlfQorCitFTUxQUC1JbmZvIDo6PSBTRVFVRU5DRSB7CisJbWF4aW11bWVudGl0bGVkUHJpb3JpdHkJRU1MUFAtUHJpb3JpdHksCisJZGVmYXVsdFByaW9yaXR5CUVNTFBQLVByaW9yaXR5LAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFTUxQUC1Qcmlvcml0eSA6Oj0gSU5URUdFUiAoMC4uMTUpCisJLS0gVGhlIG1hcHBpbmcgZnJvbSB0aGUgdmFsdWVzIEEsQiwwLDEsMiwzLDQgdG8gdGhlIGludGVnZXItdmFsdWUgaXMKKwktLSBzcGVjaWZpZWQgYXMgZm9sbG93cyB3aGVyZSBBIGlzIHRoZSBoaWdoZXN0IGFuZCA0IGlzIHRoZSBsb3dlc3QKKwktLSBwcmlvcml0eSBsZXZlbAorCS0tIHRoZSBpbnRlZ2VyIHZhbHVlcyA3LTE1IGFyZSBzcGFyZSBhbmQgc2hhbGwgYmUgbWFwcGVkIHRvIHZhbHVlIDQKKworcHJpb3JpdHlMZXZlbEEJCUVNTFBQLVByaW9yaXR5IDo6PSA2Citwcmlvcml0eUxldmVsQgkJRU1MUFAtUHJpb3JpdHkgOjo9IDUKK3ByaW9yaXR5TGV2ZWwwCQlFTUxQUC1Qcmlvcml0eSA6Oj0gMAorcHJpb3JpdHlMZXZlbDEJCUVNTFBQLVByaW9yaXR5IDo6PSAxCitwcmlvcml0eUxldmVsMgkJRU1MUFAtUHJpb3JpdHkgOjo9IDIKK3ByaW9yaXR5TGV2ZWwzCQlFTUxQUC1Qcmlvcml0eSA6Oj0gMworcHJpb3JpdHlMZXZlbDQJCUVNTFBQLVByaW9yaXR5IDo6PSA0CisKK01DLVNTLUluZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0gU1MtQ29kZSwKKwlzcy1TdGF0dXMJCVsxXSBFeHQtU1MtU3RhdHVzLAorCW5iclNCCQlbMl0gTWF4TUMtQmVhcmVycywKKwluYnJVc2VyCQlbM10gTUMtQmVhcmVycywKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01heE1DLUJlYXJlcnMgOjo9IElOVEVHRVIgKDIuLm1heE51bU9mTUMtQmVhcmVycykKKworTUMtQmVhcmVycyA6Oj0gSU5URUdFUiAoMS4ubWF4TnVtT2ZNQy1CZWFyZXJzKQorCittYXhOdW1PZk1DLUJlYXJlcnMgIElOVEVHRVIgOjo9IDcKKworRXh0LVNTLVN0YXR1cyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi41KSkKKworCS0tIE9DVEVUIDE6CisJLS0KKwktLSBiaXRzIDg3NjU6IDAwMDAgKHVudXNlZCkKKwktLSBiaXRzIDQzMjE6IFVzZWQgdG8gY29udmV5IHRoZSAiUCBiaXQiLCJSIGJpdCIsIkEgYml0IiBhbmQgIlEgYml0IiwKKwktLQkJICAgIHJlcHJlc2VudGluZyBzdXBwbGVtZW50YXJ5IHNlcnZpY2Ugc3RhdGUgaW5mb3JtYXRpb24KKwktLQkJICAgIGFzIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMy4wMTEgWzIyXQorCisJLS0gYml0IDQ6ICJRIGJpdCIKKworCS0tIGJpdCAzOiAiUCBiaXQiCisKKwktLSBiaXQgMjogIlIgYml0IgorCisJLS0gYml0IDE6ICJBIGJpdCIKKworCS0tIE9DVEVUUyAyLTU6IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBUaGV5IHNoYWxsIGJlIGRpc2NhcmRlZCBpZgorCS0tIHJlY2VpdmVkIGFuZCBub3QgdW5kZXJzdG9vZC4KKworCisJLS0gZGF0YSB0eXBlcyBmb3IgZ2VvZ3JhcGhpYyBsb2NhdGlvbgorCitBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24gOjo9IElOVEVHRVIgKDAuLjMyNzY3KQorLS0gdGhlIHZhbHVlIHJlcHJlc2VudHMgdGhlIGVsYXBzZWQgdGltZSBpbiBtaW51dGVzIHNpbmNlIHRoZSBsYXN0CistLSBuZXR3b3JrIGNvbnRhY3Qgb2YgdGhlIG1vYmlsZSBzdGF0aW9uIChpLmUuIHRoZSBhY3R1YWxpdHkgb2YgdGhlCistLSBsb2NhdGlvbiBpbmZvcm1hdGlvbikuCistLSB2YWx1ZSAiMCIgaW5kaWNhdGVzIHRoYXQgdGhlIE1TIGlzIGN1cnJlbnRseSBpbiBjb250YWN0IHdpdGggdGhlCistLSAgICAgICAgICAgbmV0d29yaworLS0gdmFsdWUgIjMyNzY3IiBpbmRpY2F0ZXMgdGhhdCB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gaXMgYXQgbGVhc3QKKy0tICAgICAgICAgICAgICAgMzI3NjcgbWludXRlcyBvbGQKKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUVSLURhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FUi1EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYjkwZmMKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FUi1EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsNDE1IEBACistLSAkSWQ6IE1BUC1FUi1EYXRhVHlwZXMuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpIAorLS0gMTcuNy43CUVycm9yIGRhdGEgdHlwZXMKKworTUFQLUVSLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FUi1EYXRhVHlwZXMgKDE3KSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCVJvYW1pbmdOb3RBbGxvd2VkUGFyYW0sCisJQ2FsbEJhcnJlZFBhcmFtLAorCUNVRy1SZWplY3RQYXJhbSwKKwlTUy1JbmNvbXBhdGliaWxpdHlDYXVzZSwKKwlQVy1SZWdpc3RyYXRpb25GYWlsdXJlQ2F1c2UsCisJU00tRGVsaXZlcnlGYWlsdXJlQ2F1c2UsCisJU3lzdGVtRmFpbHVyZVBhcmFtLAorCURhdGFNaXNzaW5nUGFyYW0sCisJVW5leHBlY3RlZERhdGFQYXJhbSwKKwlGYWNpbGl0eU5vdFN1cFBhcmFtLAorCU9SLU5vdEFsbG93ZWRQYXJhbSwKKwlVbmtub3duU3Vic2NyaWJlclBhcmFtLAorCU51bWJlckNoYW5nZWRQYXJhbSwKKwlVbmlkZW50aWZpZWRTdWJQYXJhbSwKKwlJbGxlZ2FsU3Vic2NyaWJlclBhcmFtLAorCUlsbGVnYWxFcXVpcG1lbnRQYXJhbSwKKwlCZWFyZXJTZXJ2Tm90UHJvdlBhcmFtLAorCVRlbGVzZXJ2Tm90UHJvdlBhcmFtLAorCVRyYWNpbmdCdWZmZXJGdWxsUGFyYW0sCisJTm9Sb2FtaW5nTmJQYXJhbSwKKwlBYnNlbnRTdWJzY3JpYmVyUGFyYW0sCisJQnVzeVN1YnNjcmliZXJQYXJhbSwKKwlOb1N1YnNjcmliZXJSZXBseVBhcmFtLAorCUZvcndhcmRpbmdWaW9sYXRpb25QYXJhbSwKKwlGb3J3YXJkaW5nRmFpbGVkUGFyYW0sIAorCUFUSS1Ob3RBbGxvd2VkUGFyYW0sCisJU3ViQnVzeUZvck1ULVNNUy1QYXJhbSwKKwlNZXNzYWdlV2FpdExpc3RGdWxsUGFyYW0sCisJQWJzZW50U3Vic2NyaWJlclNNLVBhcmFtLAorCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00sCisJUmVzb3VyY2VMaW1pdGF0aW9uUGFyYW0sCisJTm9Hcm91cENhbGxOYlBhcmFtLAorCUluY29tcGF0aWJsZVRlcm1pbmFsUGFyYW0sCisJU2hvcnRUZXJtRGVuaWFsUGFyYW0sCisJTG9uZ1Rlcm1EZW5pYWxQYXJhbSwKKwlVbmF1dGhvcml6ZWRSZXF1ZXN0aW5nTmV0d29yay1QYXJhbSwKKwlVbmF1dGhvcml6ZWRMQ1NDbGllbnQtUGFyYW0sCisJUG9zaXRpb25NZXRob2RGYWlsdXJlLVBhcmFtLAorVW5rbm93bk9yVW5yZWFjaGFibGVMQ1NDbGllbnQtUGFyYW0sCisJTU0tRXZlbnROb3RTdXBwb3J0ZWQtUGFyYW0sCitBVFNJLU5vdEFsbG93ZWRQYXJhbSwKK0FUTS1Ob3RBbGxvd2VkUGFyYW0sCitJbGxlZ2FsU1MtT3BlcmF0aW9uUGFyYW0sCitTUy1Ob3RBdmFpbGFibGVQYXJhbSwKK1NTLVN1YnNjcmlwdGlvblZpb2xhdGlvblBhcmFtLAorSW5mb3JtYXRpb25Ob3RBdmFpbGFibGVQYXJhbSwKK1RhcmdldENlbGxPdXRzaWRlR0NBLVBhcmFtLAorT25nb2luZ0dyb3VwQ2FsbFBhcmFtCisKKzsKKworSU1QT1JUUworCVNTLVN0YXR1cworRlJPTSBNQVAtU1MtRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLURhdGFUeXBlcyAoMTQpIHZlcnNpb24xMSAoMTEpfQorCisJU2lnbmFsSW5mbywKKwlCYXNpY1NlcnZpY2VDb2RlLAorCU5ldHdvcmtSZXNvdXJjZSwKKwlBZGRpdGlvbmFsTmV0d29ya1Jlc291cmNlCitGUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKKworCVNTLUNvZGUKK0ZST00gTUFQLVNTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtQ29kZSAoMTUpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9Cis7CisKK1JvYW1pbmdOb3RBbGxvd2VkUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlyb2FtaW5nTm90QWxsb3dlZENhdXNlCVJvYW1pbmdOb3RBbGxvd2VkQ2F1c2UsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkaXRpb25hbFJvYW1pbmdOb3RBbGxvd2VkQ2F1c2UJWzBdIEFkZGl0aW9uYWxSb2FtaW5nTm90QWxsb3dlZENhdXNlIE9QVElPTkFMIH0KKworLS0JaWYgdGhlIGFkZGl0aW9uYWxSb2FtaW5nTm90YWxsb3dlZENhdXNlIGlzIHJlY2VpdmVkIGJ5IHRoZSBNU0MvVkxSIG9yIFNHU04gdGhlbiB0aGUgCistLQlyb2FtaW5nTm90QWxsb3dlZENhdXNlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworQWRkaXRpb25hbFJvYW1pbmdOb3RBbGxvd2VkQ2F1c2UgOjo9IEVOVU1FUkFURUQgeworCXN1cHBvcnRlZFJBVC1UeXBlc05vdEFsbG93ZWQgKDApLAorCS4uLn0KKworUm9hbWluZ05vdEFsbG93ZWRDYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJcGxtblJvYW1pbmdOb3RBbGxvd2VkICAoMCksCisJb3BlcmF0b3JEZXRlcm1pbmVkQmFycmluZyAgKDMpfQorCitDYWxsQmFycmVkUGFyYW0gOjo9IENIT0lDRSB7CisJY2FsbEJhcnJpbmdDYXVzZQlDYWxsQmFycmluZ0NhdXNlLAorCS0tIGNhbGwgQmFycmluZ0NhdXNlIG11c3Qgbm90IGJlIHVzZWQgaW4gdmVyc2lvbiAzIGFuZCBoaWdoZXIKKwlleHRlbnNpYmxlQ2FsbEJhcnJlZFBhcmFtCUV4dGVuc2libGVDYWxsQmFycmVkUGFyYW0KKwktLSBleHRlbnNpYmxlQ2FsbEJhcnJlZFBhcmFtIG11c3Qgbm90IGJlIHVzZWQgaW4gdmVyc2lvbiA8MworCX0KKworQ2FsbEJhcnJpbmdDYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJYmFycmluZ1NlcnZpY2VBY3RpdmUgICgwKSwKKwlvcGVyYXRvckJhcnJpbmcgICgxKX0KKworRXh0ZW5zaWJsZUNhbGxCYXJyZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWNhbGxCYXJyaW5nQ2F1c2UJQ2FsbEJhcnJpbmdDYXVzZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJdW5hdXRob3Jpc2VkTWVzc2FnZU9yaWdpbmF0b3IJWzFdIE5VTEwJCU9QVElPTkFMIH0KKworQ1VHLVJlamVjdFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJY3VnLVJlamVjdENhdXNlCUNVRy1SZWplY3RDYXVzZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ1VHLVJlamVjdENhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwlpbmNvbWluZ0NhbGxzQmFycmVkV2l0aGluQ1VHICAoMCksCisJc3Vic2NyaWJlck5vdE1lbWJlck9mQ1VHICAoMSksCisJcmVxdWVzdGVkQmFzaWNTZXJ2aWNlVmlvbGF0ZXNDVUctQ29uc3RyYWludHMgICg1KSwKKwljYWxsZWRQYXJ0eVNTLUludGVyYWN0aW9uVmlvbGF0aW9uICAoNyl9CisKK1NTLUluY29tcGF0aWJpbGl0eUNhdXNlIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzFdIFNTLUNvZGUJT1BUSU9OQUwsCisJYmFzaWNTZXJ2aWNlCUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJc3MtU3RhdHVzCQlbNF0gU1MtU3RhdHVzCU9QVElPTkFMLAorCS4uLn0KKworUFctUmVnaXN0cmF0aW9uRmFpbHVyZUNhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwl1bmRldGVybWluZWQgICgwKSwKKwlpbnZhbGlkRm9ybWF0ICAoMSksCisJbmV3UGFzc3dvcmRzTWlzbWF0Y2ggICgyKX0KKworU00tRW51bWVyYXRlZERlbGl2ZXJ5RmFpbHVyZUNhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwltZW1vcnlDYXBhY2l0eUV4Y2VlZGVkICAoMCksCisJZXF1aXBtZW50UHJvdG9jb2xFcnJvciAgKDEpLAorCWVxdWlwbWVudE5vdFNNLUVxdWlwcGVkICAoMiksCisJdW5rbm93blNlcnZpY2VDZW50cmUgICgzKSwKKwlzYy1Db25nZXN0aW9uICAoNCksCisJaW52YWxpZFNNRS1BZGRyZXNzICAoNSksCisJc3Vic2NyaWJlck5vdFNDLVN1YnNjcmliZXIgICg2KX0KKworU00tRGVsaXZlcnlGYWlsdXJlQ2F1c2UgOjo9IFNFUVVFTkNFIHsKKwlzbS1FbnVtZXJhdGVkRGVsaXZlcnlGYWlsdXJlQ2F1c2UJU00tRW51bWVyYXRlZERlbGl2ZXJ5RmFpbHVyZUNhdXNlLAorCWRpYWdub3N0aWNJbmZvCVNpZ25hbEluZm8JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0Fic2VudFN1YnNjcmliZXJTTS1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlPUFRJT05BTCwKKwktLSBBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGNhbiBiZSBlaXRoZXIgZm9yIG5vbi1HUFJTIAorCS0tIG9yIGZvciBHUFJTCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gIAlbMF0gCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JT1BUSU9OQUwgfQorCS0tIGlmIHJlY2VpdmVkLCBhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSAKKwktLSBpcyBmb3IgR1BSUyBhbmQgYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBpcyAKKwktLSBmb3Igbm9uLUdQUlMKKworQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSA6Oj0gSU5URUdFUiAoMC4uMjU1KQorCS0tIEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gdmFsdWVzIGFyZSBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDQwCisKK1N5c3RlbUZhaWx1cmVQYXJhbSA6Oj0gQ0hPSUNFIHsKKwluZXR3b3JrUmVzb3VyY2UJTmV0d29ya1Jlc291cmNlLAorCS0tIG5ldHdvcmtSZXNvdXJjZSBtdXN0IG5vdCBiZSB1c2VkIGluIHZlcnNpb24gMworCWV4dGVuc2libGVTeXN0ZW1GYWlsdXJlUGFyYW0JRXh0ZW5zaWJsZVN5c3RlbUZhaWx1cmVQYXJhbQorCS0tIGV4dGVuc2libGVTeXN0ZW1GYWlsdXJlUGFyYW0gbXVzdCBub3QgYmUgdXNlZCBpbiB2ZXJzaW9uIDwzCisJfQorCitFeHRlbnNpYmxlU3lzdGVtRmFpbHVyZVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJbmV0d29ya1Jlc291cmNlCU5ldHdvcmtSZXNvdXJjZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsTmV0d29ya1Jlc291cmNlCVswXSBBZGRpdGlvbmFsTmV0d29ya1Jlc291cmNlCU9QVElPTkFMLAorCWZhaWx1cmVDYXVzZVBhcmFtCVsxXSBGYWlsdXJlQ2F1c2VQYXJhbQlPUFRJT05BTCB9CisKK0ZhaWx1cmVDYXVzZVBhcmFtIDo6PSBFTlVNRVJBVEVEIHsKKwlsaW1pdFJlYWNoZWRPbk51bWJlck9mQ29uY3VycmVudExvY2F0aW9uUmVxdWVzdHMgKDApLAorCS4uLiB9CisJLS0gaWYgdW5rbm93biB2YWx1ZSBpcyByZWNlaXZlZCBpbiBGYWlsdXJlQ2F1c2VQYXJhbSBpdCBzaGFsbCBiZSBpZ25vcmVkCisKKworRGF0YU1pc3NpbmdQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitVbmV4cGVjdGVkRGF0YVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ZhY2lsaXR5Tm90U3VwUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlzaGFwZU9mTG9jYXRpb25Fc3RpbWF0ZU5vdFN1cHBvcnRlZCBbMF0JTlVMTAkJT1BUSU9OQUwsCisJbmVlZGVkTGNzQ2FwYWJpbGl0eU5vdFN1cHBvcnRlZEluU2VydmluZ05vZGUgWzFdIE5VTEwJT1BUSU9OQUwgfQorCitPUi1Ob3RBbGxvd2VkUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVW5rbm93blN1YnNjcmliZXJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXVua25vd25TdWJzY3JpYmVyRGlhZ25vc3RpYwlVbmtub3duU3Vic2NyaWJlckRpYWdub3N0aWMJT1BUSU9OQUx9CisKK1Vua25vd25TdWJzY3JpYmVyRGlhZ25vc3RpYyA6Oj0gRU5VTUVSQVRFRCB7CisJaW1zaVVua25vd24gICgwKSwKKwlncHJzLWVwcy1TdWJzY3JpcHRpb25Vbmtub3duICAoMSksCisJLi4uLAorCW5wZGJNaXNtYXRjaCAgKDIpfQorCS0tIGlmIHVua25vd24gdmFsdWVzIGFyZSByZWNlaXZlZCBpbiAJCisJLS0gVW5rbm93blN1YnNjcmliZXJEaWFnbm9zdGljIHRoZXkgc2hhbGwgYmUgZGlzY2FyZGVkCisKK051bWJlckNoYW5nZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitVbmlkZW50aWZpZWRTdWJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitJbGxlZ2FsU3Vic2NyaWJlclBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0lsbGVnYWxFcXVpcG1lbnRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitCZWFyZXJTZXJ2Tm90UHJvdlBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1RlbGVzZXJ2Tm90UHJvdlBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1RyYWNpbmdCdWZmZXJGdWxsUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTm9Sb2FtaW5nTmJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBYnNlbnRTdWJzY3JpYmVyUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhYnNlbnRTdWJzY3JpYmVyUmVhc29uCVswXSBBYnNlbnRTdWJzY3JpYmVyUmVhc29uCU9QVElPTkFMfQorCitBYnNlbnRTdWJzY3JpYmVyUmVhc29uIDo6PSBFTlVNRVJBVEVEIHsKKwlpbXNpRGV0YWNoICgwKSwKKwlyZXN0cmljdGVkQXJlYSAoMSksCisJbm9QYWdlUmVzcG9uc2UgKDIpLAorCS4uLiAsCisJcHVyZ2VkTVMgKDMpfQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiBhdCByZWNlcHRpb24gb2Ygb3RoZXIgdmFsdWVzIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSAKKy0tIEFic2VudFN1YnNjcmliZXJSZWFzb24gc2hhbGwgYmUgaWdub3JlZC4gCistLSBUaGUgQWJzZW50U3Vic2NyaWJlclJlYXNvbjogcHVyZ2VkTVMgaXMgZGVmaW5lZCBmb3IgdGhlIFN1cGVyLUNoYXJnZXIgZmVhdHVyZSAKKy0tIChzZWUgVFMgMjMuMTE2KS4gSWYgdGhpcyB2YWx1ZSBpcyByZWNlaXZlZCBpbiBhIFByb3ZpZGUgUm9hbWluZyBOdW1iZXIgcmVzcG9uc2UKKy0tIGl0IHNoYWxsIGJlIG1hcHBlZCB0byB0aGUgQWJzZW50U3Vic2NyaWJlclJlYXNvbjogaW1zaURldGFjaCBpbiB0aGUgU2VuZCBSb3V0ZWluZworLS0gSW5mb3JtYXRpb24gcmVzcG9uc2UKKworQnVzeVN1YnNjcmliZXJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWNjYnMtUG9zc2libGUJWzBdIE5VTEwJCU9QVElPTkFMLAorCWNjYnMtQnVzeQkJWzFdIE5VTEwJCU9QVElPTkFMfQorCitOb1N1YnNjcmliZXJSZXBseVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ZvcndhcmRpbmdWaW9sYXRpb25QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitGb3J3YXJkaW5nRmFpbGVkUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQVRJLU5vdEFsbG93ZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBVFNJLU5vdEFsbG93ZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBVE0tTm90QWxsb3dlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0lsbGVnYWxTUy1PcGVyYXRpb25QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTUy1Ob3RBdmFpbGFibGVQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTUy1TdWJzY3JpcHRpb25WaW9sYXRpb25QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitJbmZvcm1hdGlvbk5vdEF2YWlsYWJsZVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1N1YkJ1c3lGb3JNVC1TTVMtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJZ3Byc0Nvbm5lY3Rpb25TdXNwZW5kZWQJTlVMTAkJCU9QVElPTkFMIH0KKwktLSBJZiBHcHJzQ29ubmVjdGlvblN1c3BlbmRlZCBpcyBub3QgdW5kZXJzdG9vZCBpdCBzaGFsbCAKKwktLSBiZSBkaXNjYXJkZWQKKworTWVzc2FnZVdhaXRMaXN0RnVsbFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1Jlc291cmNlTGltaXRhdGlvblBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK05vR3JvdXBDYWxsTmJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitJbmNvbXBhdGlibGVUZXJtaW5hbFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1Nob3J0VGVybURlbmlhbFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJLi4ufQorCitMb25nVGVybURlbmlhbFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJLi4ufQorCitVbmF1dGhvcml6ZWRSZXF1ZXN0aW5nTmV0d29yay1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitVbmF1dGhvcml6ZWRMQ1NDbGllbnQtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwl1bmF1dGhvcml6ZWRMQ1NDbGllbnQtRGlhZ25vc3RpYwlbMF0gVW5hdXRob3JpemVkTENTQ2xpZW50LURpYWdub3N0aWMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJCQlPUFRJT05BTCwKKwkuLi4gfQorCitVbmF1dGhvcml6ZWRMQ1NDbGllbnQtRGlhZ25vc3RpYyA6Oj0gRU5VTUVSQVRFRCB7CisJbm9BZGRpdGlvbmFsSW5mb3JtYXRpb24gKDApLAorCWNsaWVudE5vdEluTVNQcml2YWN5RXhjZXB0aW9uTGlzdCAoMSksCisJY2FsbFRvQ2xpZW50Tm90U2V0dXAgKDIpLAorCXByaXZhY3lPdmVycmlkZU5vdEFwcGxpY2FibGUgKDMpLAorCWRpc2FsbG93ZWRCeUxvY2FsUmVndWxhdG9yeVJlcXVpcmVtZW50cyAoNCksCisJLi4uLAorCXVuYXV0aG9yaXplZFByaXZhY3lDbGFzcyAoNSksCisJdW5hdXRob3JpemVkQ2FsbFNlc3Npb25VbnJlbGF0ZWRFeHRlcm5hbENsaWVudCAoNiksCisJdW5hdXRob3JpemVkQ2FsbFNlc3Npb25SZWxhdGVkRXh0ZXJuYWxDbGllbnQgKDcpIH0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCWFueSB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgaWdub3JlZAorCitQb3NpdGlvbk1ldGhvZEZhaWx1cmUtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlwb3NpdGlvbk1ldGhvZEZhaWx1cmUtRGlhZ25vc3RpYwlbMF0gUG9zaXRpb25NZXRob2RGYWlsdXJlLURpYWdub3N0aWMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJCQlPUFRJT05BTCwKKwkuLi4gfQorCitQb3NpdGlvbk1ldGhvZEZhaWx1cmUtRGlhZ25vc3RpYyA6Oj0gRU5VTUVSQVRFRCB7CisJY29uZ2VzdGlvbiAgKDApLAorCWluc3VmZmljaWVudFJlc291cmNlcyAgKDEpLAorCWluc3VmZmljaWVudE1lYXN1cmVtZW50RGF0YSAgKDIpLAorCWluY29uc2lzdGVudE1lYXN1cmVtZW50RGF0YSAgKDMpLAorCWxvY2F0aW9uUHJvY2VkdXJlTm90Q29tcGxldGVkICAoNCksCisJbG9jYXRpb25Qcm9jZWR1cmVOb3RTdXBwb3J0ZWRCeVRhcmdldE1TICAoNSksCisJcW9TTm90QXR0YWluYWJsZSAgKDYpLAorCXBvc2l0aW9uTWV0aG9kTm90QXZhaWxhYmxlSW5OZXR3b3JrCSg3KSwKKwlwb3NpdGlvbk1ldGhvZE5vdEF2YWlsYWJsZUluTG9jYXRpb25BcmVhCSg4KSwKKwkuLi4gfQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JYW55IHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSBpZ25vcmVkCisKK1Vua25vd25PclVucmVhY2hhYmxlTENTQ2xpZW50LVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01NLUV2ZW50Tm90U3VwcG9ydGVkLVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1RhcmdldENlbGxPdXRzaWRlR0NBLVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK09uZ29pbmdHcm91cENhbGxQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FeHRlbnNpb25EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtRXh0ZW5zaW9uRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTRjMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtRXh0ZW5zaW9uRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDc0IEBACistLSAkSWQ6IE1BUC1FeHRlbnNpb25EYXRhVHlwZXMuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzLmFzbgorLS0KKy0tIFRha2VuIGZyb20gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KQorLS0KKy0tIDE3LjcuMTEgRXh0ZW5zaW9uIGRhdGEgdHlwZXMKKy0tCisKK01BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKK0lNUExJQ0lUIFRBR1MKKworOjo9CisKK0JFR0lOCisKK0VYUE9SVFMKKworCVByaXZhdGVFeHRlbnNpb24sCisJRXh0ZW5zaW9uQ29udGFpbmVyLAorCVNMUi1BcmdFeHRlbnNpb25Db250YWluZXI7CisKKworLS0gSU9DIGZvciBwcml2YXRlIE1BUCBleHRlbnNpb25zCisKKworTUFQLUVYVEVOU0lPTiAgOjo9IENMQVNTIHsKKwkmRXh0ZW5zaW9uVHlwZQkJCQlPUFRJT05BTCwKKwkmZXh0ZW5zaW9uSWQgCU9CSkVDVCBJREVOVElGSUVSIH0KKwktLSBUaGUgbGVuZ3RoIG9mIHRoZSBPYmplY3QgSWRlbnRpZmllciBzaGFsbCBub3QgZXhjZWVkIDE2IG9jdGV0cyBhbmQgdGhlCisJLS0gbnVtYmVyIG9mIGNvbXBvbmVudHMgb2YgdGhlIE9iamVjdCBJZGVudGlmaWVyIHNoYWxsIG5vdCBleGNlZWQgMTYKKworLS0gZGF0YSB0eXBlcworCitFeHRlbnNpb25Db250YWluZXIgOjo9IFNFUVVFTkNFIHsKKwlwcml2YXRlRXh0ZW5zaW9uTGlzdAlbMF1Qcml2YXRlRXh0ZW5zaW9uTGlzdAlPUFRJT05BTCwgCisJcGNzLUV4dGVuc2lvbnMJWzFdUENTLUV4dGVuc2lvbnMJT1BUSU9OQUwsCisJLi4ufQorCitTTFItQXJnRXh0ZW5zaW9uQ29udGFpbmVyIDo6PSBTRVFVRU5DRSB7CisJcHJpdmF0ZUV4dGVuc2lvbkxpc3QJWzBdUHJpdmF0ZUV4dGVuc2lvbkxpc3QJT1BUSU9OQUwsIAorCXNsci1BcmctUENTLUV4dGVuc2lvbnMJWzFdU0xSLUFyZy1QQ1MtRXh0ZW5zaW9ucwlPUFRJT05BTCwKKwkuLi59CisKK1ByaXZhdGVFeHRlbnNpb25MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlByaXZhdGVFeHRlbnNpb25zKSBPRgorCQkJCVByaXZhdGVFeHRlbnNpb24KKworUHJpdmF0ZUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCWV4dElkCQlNQVAtRVhURU5TSU9OLiZleHRlbnNpb25JZAorCQkJCSh7RXh0ZW5zaW9uU2V0fSksCisJZXh0VHlwZQkJTUFQLUVYVEVOU0lPTi4mRXh0ZW5zaW9uVHlwZQorCQkJCSh7RXh0ZW5zaW9uU2V0fXtAZXh0SWR9KQlPUFRJT05BTH0KKworbWF4TnVtT2ZQcml2YXRlRXh0ZW5zaW9ucyAgSU5URUdFUiA6Oj0gMTAKKworRXh0ZW5zaW9uU2V0CQlNQVAtRVhURU5TSU9OIDo6PQorCQl7Li4uCisJCSAtLSBFeHRlbnNpb25TZXQgaXMgdGhlIHNldCBvZiBhbGwgZGVmaW5lZCBwcml2YXRlIGV4dGVuc2lvbnMKKwl9CisJLS0gVW5zdXBwb3J0ZWQgcHJpdmF0ZSBleHRlbnNpb25zIHNoYWxsIGJlIGRpc2NhcmRlZCBpZiByZWNlaXZlZC4KKworUENTLUV4dGVuc2lvbnMgOjo9IFNFUVVFTkNFIHsKKwkuLi59CisKK1NMUi1BcmctUENTLUV4dGVuc2lvbnMgOjo9IFNFUVVFTkNFIHsKKwkuLi4sCisJbmEtRVNSSy1SZXF1ZXN0CVswXQlOVUxMCQlPUFRJT05BTCB9CisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1MQ1MtRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUxDUy1EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MzRiODkKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1MQ1MtRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDY1NyBAQAorLS0gJElkOiBNQVAtTENTLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIE1BUC1MQ1MtRGF0YVR5cGVzLmFzbgorLS0KKy0tIFRha2VuIGZyb20gM0dQUCBUUyAyOS4wMDIgIFY4LjkuMCAoMjAwOS0wNCkKKy0tCistLSAxNy43LjEzIExvY2F0aW9uIHNlcnZpY2UgZGF0YSB0eXBlcworLS0KKworTUFQLUxDUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtTENTLURhdGFUeXBlcyAoMjUpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworSU1QTElDSVQgVEFHUworOjo9CitCRUdJTgorCitFWFBPUlRTCisJUm91dGluZ0luZm9Gb3JMQ1MtQXJnLAorCVJvdXRpbmdJbmZvRm9yTENTLVJlcywKKwlQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZywKKwlQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLVJlcywKKwlTdWJzY3JpYmVyTG9jYXRpb25SZXBvcnQtQXJnLAorCVN1YnNjcmliZXJMb2NhdGlvblJlcG9ydC1SZXMsCitMb2NhdGlvblR5cGUsIAorRGVmZXJyZWRMb2NhdGlvbkV2ZW50VHlwZSwKK0xDU0NsaWVudE5hbWUsCitMQ1MtUW9TLAorSG9yaXpvbnRhbC1BY2N1cmFjeSwKK1Jlc3BvbnNlVGltZSwKK0V4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwgCitWZWxvY2l0eUVzdGltYXRlLAorU3VwcG9ydGVkR0FEU2hhcGVzLAorQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uLAorTENTUmVxdWVzdG9ySUQsIAorTENTLVJlZmVyZW5jZU51bWJlciwKK0xDU0NvZGV3b3JkLAorQXJlYUV2ZW50SW5mbywKK1JlcG9ydGluZ1BMTU5MaXN0LAorUGVyaW9kaWNMRFJJbmZvLAorU2VxdWVuY2VOdW1iZXIKKzsKKworSU1QT1JUUworCUFkZHJlc3NTdHJpbmcsCisJSVNETi1BZGRyZXNzU3RyaW5nLAorCUlNRUksCisJSU1TSSwKKwlMTVNJLAorCVN1YnNjcmliZXJJZGVudGl0eSwKKwlBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24sCisJTENTQ2xpZW50RXh0ZXJuYWxJRCwKKwlMQ1NDbGllbnRJbnRlcm5hbElELAorTENTU2VydmljZVR5cGVJRCwKK0NlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJLAorUExNTi1JZAorRlJPTSBNQVAtQ29tbW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUNvbW1vbkRhdGFUeXBlcyAoMTgpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyLAorCVNMUi1BcmdFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKworCVVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKK1VTU0QtU3RyaW5nCitGUk9NIE1BUC1TUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpCisgICBtYXAtU1MtRGF0YVR5cGVzICgxNCkgdmVyc2lvbjExICgxMSl9CisKKwlBUE4sCisJR1NOLUFkZHJlc3MsCisJU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCitGUk9NIE1BUC1NUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtTVMtRGF0YVR5cGVzICgxMSkgdmVyc2lvbjExICgxMSl9CisKKwlBZGRpdGlvbmFsLU51bWJlcgorRlJPTSBNQVAtU00tRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNNLURhdGFUeXBlcyAoMTYpIHZlcnNpb24xMSAoMTEpfQorOworCisKK1JvdXRpbmdJbmZvRm9yTENTLUFyZyA6Oj0gU0VRVUVOQ0UgeworCW1sY051bWJlcgkJWzBdIElTRE4tQWRkcmVzc1N0cmluZywKKwl0YXJnZXRNUwkJWzFdIFN1YnNjcmliZXJJZGVudGl0eSwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1JvdXRpbmdJbmZvRm9yTENTLVJlcyA6Oj0gU0VRVUVOQ0UgeworCXRhcmdldE1TCQlbMF0gU3Vic2NyaWJlcklkZW50aXR5LAorCWxjc0xvY2F0aW9uSW5mbwlbMV0gTENTTG9jYXRpb25JbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl2LWdtbGMtQWRkcmVzcwlbM10JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJaC1nbWxjLUFkZHJlc3MJWzRdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCXBwci1BZGRyZXNzCVs1XQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlhZGRpdGlvbmFsLXYtZ21sYy1BZGRyZXNzCVs2XQlHU04tQWRkcmVzcwlPUFRJT05BTCB9CisKK0xDU0xvY2F0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworCW5ldHdvcmtOb2RlLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCisJLS0gTmV0d29ya05vZGUtbnVtYmVyIGNhbiBiZSBlaXRoZXIgbXNjLW51bWJlciBvciBzZ3NuLW51bWJlcgorCWxtc2kJCQlbMF0gTE1TSQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlncHJzTm9kZUluZGljYXRvciAJWzJdIE5VTEwJCU9QVElPTkFMLAorCS0tIGdwcnNOb2RlSW5kaWNhdG9yIGlzIHNldCBvbmx5IGlmIHRoZSBTR1NOIG51bWJlciBpcyBzZW50IGFzIHRoZSBOZXR3b3JrIE5vZGUgTnVtYmVyCisJYWRkaXRpb25hbC1OdW1iZXIJWzNdIEFkZGl0aW9uYWwtTnVtYmVyCU9QVElPTkFMLAorCXN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlbNF0JU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCU9QVElPTkFMLAorCWFkZGl0aW9uYWwtTENTLUNhcGFiaWxpdHlTZXRzCVs1XQlTdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMJT1BUSU9OQUwKKwl9CisKK1Byb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnIDo6PSBTRVFVRU5DRSB7CisJbG9jYXRpb25UeXBlCUxvY2F0aW9uVHlwZSwKKwltbGMtTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlsY3MtQ2xpZW50SUQJWzBdIExDUy1DbGllbnRJRAlPUFRJT05BTCwKKwlwcml2YWN5T3ZlcnJpZGUJWzFdIE5VTEwJCU9QVElPTkFMLAorCWltc2kJCQlbMl0gSU1TSQkJT1BUSU9OQUwsCisJbXNpc2RuCQlbM10gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWxtc2kJCQlbNF0gTE1TSQkJT1BUSU9OQUwsCisJaW1laQkJCVs1XSBJTUVJCQlPUFRJT05BTCwKKwlsY3MtUHJpb3JpdHkJWzZdIExDUy1Qcmlvcml0eQlPUFRJT05BTCwKKwlsY3MtUW9TCQlbN10gTENTLVFvUwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzhdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXN1cHBvcnRlZEdBRFNoYXBlcwlbOV0JU3VwcG9ydGVkR0FEU2hhcGVzCU9QVElPTkFMLAorCWxjcy1SZWZlcmVuY2VOdW1iZXIJWzEwXQlMQ1MtUmVmZXJlbmNlTnVtYmVyCU9QVElPTkFMLAorCWxjc1NlcnZpY2VUeXBlSUQJWzExXQlMQ1NTZXJ2aWNlVHlwZUlECU9QVElPTkFMLAorCWxjc0NvZGV3b3JkCVsxMl0JTENTQ29kZXdvcmQJT1BUSU9OQUwsCisJbGNzLVByaXZhY3lDaGVjawlbMTNdCUxDUy1Qcml2YWN5Q2hlY2sJT1BUSU9OQUwsCisJYXJlYUV2ZW50SW5mbwlbMTRdCUFyZWFFdmVudEluZm8JT1BUSU9OQUwsCisJaC1nbWxjLUFkZHJlc3MJWzE1XQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwltby1sclNob3J0Q2lyY3VpdEluZGljYXRvcglbMTZdIE5VTEwJCU9QVElPTkFMLAorCXBlcmlvZGljTERSSW5mbwlbMTddIFBlcmlvZGljTERSSW5mbwlPUFRJT05BTCwKKwlyZXBvcnRpbmdQTE1OTGlzdAlbMThdIFJlcG9ydGluZ1BMTU5MaXN0CU9QVElPTkFMIH0KKworCS0tIG9uZSBvZiBpbXNpIG9yIG1zaXNkbiBpcyBtYW5kYXRvcnkKKwktLSBJZiBhIGxvY2F0aW9uIGVzdGltYXRlIHR5cGUgaW5kaWNhdGVzIGFjdGl2YXRlIGRlZmVycmVkIGxvY2F0aW9uIG9yIGNhbmNlbCBkZWZlcnJlZCAKKwktLSBsb2NhdGlvbiwgYSBsY3MtUmVmZXJlbmNlIG51bWJlciBzaGFsbCBiZSBpbmNsdWRlZC4KKworTG9jYXRpb25UeXBlIDo6PSBTRVFVRU5DRSB7CisJbG9jYXRpb25Fc3RpbWF0ZVR5cGUJWzBdIExvY2F0aW9uRXN0aW1hdGVUeXBlLAorCS4uLiwKKwlkZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlCVsxXSBEZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlCU9QVElPTkFMIH0KKworTG9jYXRpb25Fc3RpbWF0ZVR5cGUgOjo9IEVOVU1FUkFURUQgeworCWN1cnJlbnRMb2NhdGlvbgkoMCksCisJY3VycmVudE9yTGFzdEtub3duTG9jYXRpb24JKDEpLAorCWluaXRpYWxMb2NhdGlvbgkoMiksCisJLi4uLAorCWFjdGl2YXRlRGVmZXJyZWRMb2NhdGlvbgkoMyksCisJY2FuY2VsRGVmZXJyZWRMb2NhdGlvbgkoNCkgLAorCW5vdGlmaWNhdGlvblZlcmlmaWNhdGlvbk9ubHkJKDUpIH0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCWEgUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcgY29udGFpbmluZyBhbiB1bnJlY29nbml6ZWQgTG9jYXRpb25Fc3RpbWF0ZVR5cGUKKy0tCXNoYWxsIGJlIHJlamVjdGVkIGJ5IHRoZSByZWNlaXZlciB3aXRoIGEgcmV0dXJuIGVycm9yIGNhdXNlIG9mIHVuZXhwZWN0ZWQgZGF0YSB2YWx1ZQorCitEZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlIDo6PSBCSVQgU1RSSU5HIHsKKwltc0F2YWlsYWJsZQkoMCkgLAorCWVudGVyaW5nSW50b0FyZWEJKDEpLAorCWxlYXZpbmdGcm9tQXJlYQkoMiksCisJYmVpbmdJbnNpZGVBcmVhCSgzKSAsCisJcGVyaW9kaWNMRFIJKDQpICB9IChTSVpFICgxLi4xNikpIAorLS0gYmVpbmdJbnNpZGVBcmVhIGlzIGFsd2F5cyB0cmVhdGVkIGFzIG9uZVRpbWVFdmVudCByZWdhcmRsZXNzIG9mIHRoZSBwb3NzaWJsZSB2YWx1ZQorLS0gb2Ygb2NjdXJyZW5jZUluZm8gaW5zaWRlIGFyZWFFdmVudEluZm8uCistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBhIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnIGNvbnRhaW5pbmcgb3RoZXIgdmFsdWVzIHRoYW4gbGlzdGVkIGFib3ZlIGluIAorLS0gRGVmZXJyZWRMb2NhdGlvbkV2ZW50VHlwZSBzaGFsbCBiZSByZWplY3RlZCBieSB0aGUgcmVjZWl2ZXIgd2l0aCBhIHJldHVybiBlcnJvciBjYXVzZSBvZiAKKy0tIHVuZXhwZWN0ZWQgZGF0YSB2YWx1ZS4KKworTENTLUNsaWVudElEIDo6PSBTRVFVRU5DRSB7CisJbGNzQ2xpZW50VHlwZQlbMF0gTENTQ2xpZW50VHlwZSwKKwlsY3NDbGllbnRFeHRlcm5hbElECVsxXSBMQ1NDbGllbnRFeHRlcm5hbElECU9QVElPTkFMLAorCWxjc0NsaWVudERpYWxlZEJ5TVMJWzJdIEFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbGNzQ2xpZW50SW50ZXJuYWxJRAlbM10gTENTQ2xpZW50SW50ZXJuYWxJRAlPUFRJT05BTCwKKwlsY3NDbGllbnROYW1lCVs0XSBMQ1NDbGllbnROYW1lCU9QVElPTkFMLAorCS4uLiwKKwlsY3NBUE4JCVs1XSBBUE4JCU9QVElPTkFMLAorCWxjc1JlcXVlc3RvcklECVs2XSBMQ1NSZXF1ZXN0b3JJRAlPUFRJT05BTCB9CisKK0xDU0NsaWVudFR5cGUgOjo9IEVOVU1FUkFURUQgeworCWVtZXJnZW5jeVNlcnZpY2VzCSgwKSwKKwl2YWx1ZUFkZGVkU2VydmljZXMJKDEpLAorCXBsbW5PcGVyYXRvclNlcnZpY2VzCSgyKSwKKwlsYXdmdWxJbnRlcmNlcHRTZXJ2aWNlcwkoMyksCisJLi4uIH0KKwktLQlleGNlcHRpb24gaGFuZGxpbmc6CisJLS0JdW5yZWNvZ25pemVkIHZhbHVlcyBtYXkgYmUgaWdub3JlZCBpZiB0aGUgTENTIGNsaWVudCB1c2VzIHRoZSBwcml2YWN5IG92ZXJyaWRlCisJLS0Jb3RoZXJ3aXNlLCBhbiB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgdHJlYXRlZCBhcyB1bmV4cGVjdGVkIGRhdGEgYnkgYSByZWNlaXZlcgorCS0tCWEgcmV0dXJuIGVycm9yIHNoYWxsIHRoZW4gYmUgcmV0dXJuZWQgaWYgcmVjZWl2ZWQgaW4gYSBNQVAgaW52b2tlIAorCitMQ1NDbGllbnROYW1lIDo6PSBTRVFVRU5DRSB7CisJZGF0YUNvZGluZ1NjaGVtZQlbMF0gVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAorCW5hbWVTdHJpbmcJWzJdIE5hbWVTdHJpbmcsCisJLi4uLAorCWxjcy1Gb3JtYXRJbmRpY2F0b3IJWzNdIExDUy1Gb3JtYXRJbmRpY2F0b3IJT1BUSU9OQUwgfQorCistLSBUaGUgVVNTRC1EYXRhQ29kaW5nU2NoZW1lIHNoYWxsIGluZGljYXRlIHVzZSBvZiB0aGUgZGVmYXVsdCBhbHBoYWJldCB0aHJvdWdoIHRoZQorLS0gZm9sbG93aW5nIGVuY29kaW5nCistLQliaXQJNyA2IDUgNCAzIDIgMSAwCistLQkJMCAwIDAgMCAxIDEgMSAxCisKK05hbWVTdHJpbmcgOjo9IFVTU0QtU3RyaW5nIChTSVpFICgxLi5tYXhOYW1lU3RyaW5nTGVuZ3RoKSkKKworbWF4TmFtZVN0cmluZ0xlbmd0aCAgSU5URUdFUiA6Oj0gNjMKKworTENTUmVxdWVzdG9ySUQgOjo9IFNFUVVFTkNFIHsKKwlkYXRhQ29kaW5nU2NoZW1lCVswXSBVU1NELURhdGFDb2RpbmdTY2hlbWUsCisJcmVxdWVzdG9ySURTdHJpbmcJWzFdIFJlcXVlc3RvcklEU3RyaW5nLAorCS4uLiwKKwlsY3MtRm9ybWF0SW5kaWNhdG9yCVsyXSBMQ1MtRm9ybWF0SW5kaWNhdG9yCU9QVElPTkFMIH0KKworUmVxdWVzdG9ySURTdHJpbmcgOjo9IFVTU0QtU3RyaW5nIChTSVpFICgxLi5tYXhSZXF1ZXN0b3JJRFN0cmluZ0xlbmd0aCkpCisKK21heFJlcXVlc3RvcklEU3RyaW5nTGVuZ3RoICBJTlRFR0VSIDo6PSA2MworCitMQ1MtRm9ybWF0SW5kaWNhdG9yIDo6PSBFTlVNRVJBVEVEIHsKKwlsb2dpY2FsTmFtZQkoMCksCisJZS1tYWlsQWRkcmVzcwkoMSksCisJbXNpc2RuCQkoMiksCisJdXJsCQkJKDMpLAorCXNpcFVybAkJKDQpLAorCS4uLiB9CisKK0xDUy1Qcmlvcml0eSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSAwID0gaGlnaGVzdCBwcmlvcml0eQorCS0tIDEgPSBub3JtYWwgcHJpb3JpdHkKKwktLSBhbGwgb3RoZXIgdmFsdWVzIHRyZWF0ZWQgYXMgMSAKKworTENTLVFvUyA6Oj0gU0VRVUVOQ0UgeworCWhvcml6b250YWwtYWNjdXJhY3kJWzBdIEhvcml6b250YWwtQWNjdXJhY3kJT1BUSU9OQUwsCisJdmVydGljYWxDb29yZGluYXRlUmVxdWVzdAlbMV0gTlVMTAkJT1BUSU9OQUwsCisJdmVydGljYWwtYWNjdXJhY3kJWzJdIFZlcnRpY2FsLUFjY3VyYWN5CU9QVElPTkFMLAlyZXNwb25zZVRpbWUJWzNdIFJlc3BvbnNlVGltZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJdmVsb2NpdHlSZXF1ZXN0CVs1XSBOVUxMCQlPUFRJT05BTAorfQorCitIb3Jpem9udGFsLUFjY3VyYWN5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIGJpdCA4ID0gMAorCS0tIGJpdHMgNy0xID0gNyBiaXQgVW5jZXJ0YWludHkgQ29kZSBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLiBUaGUgaG9yaXpvbnRhbCBsb2NhdGlvbiAKKwktLSBlcnJvciBzaG91bGQgYmUgbGVzcyB0aGFuIHRoZSBlcnJvciBpbmRpY2F0ZWQgYnkgdGhlIHVuY2VydGFpbnR5IGNvZGUgd2l0aCA2NyUKKwktLSBjb25maWRlbmNlLgorCitWZXJ0aWNhbC1BY2N1cmFjeSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBiaXQgOCA9IDAKKwktLSBiaXRzIDctMSA9IDcgYml0IFZlcnRpY2FsIFVuY2VydGFpbnR5IENvZGUgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMi4gCisJLS0gVGhlIHZlcnRpY2FsIGxvY2F0aW9uIGVycm9yIHNob3VsZCBiZSBsZXNzIHRoYW4gdGhlIGVycm9yIGluZGljYXRlZCAKKwktLSBieSB0aGUgdW5jZXJ0YWludHkgY29kZSB3aXRoIDY3JSBjb25maWRlbmNlLgorCitSZXNwb25zZVRpbWUgOjo9IFNFUVVFTkNFIHsKKwlyZXNwb25zZVRpbWVDYXRlZ29yeQlSZXNwb25zZVRpbWVDYXRlZ29yeSwKKwkuLi59CistLQlub3RlOiBhbiBleHBhbmRhYmxlIFNFUVVFTkNFIHNpbXBsaWZpZXMgbGF0ZXIgYWRkaXRpb24gb2YgYSBudW1lcmljIHJlc3BvbnNlIHRpbWUuCisKK1Jlc3BvbnNlVGltZUNhdGVnb3J5IDo6PSBFTlVNRVJBVEVEIHsKKwlsb3dkZWxheSAgKDApLAorCWRlbGF5dG9sZXJhbnQgICgxKSwKKwkuLi4gfQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JYW4gdW5yZWNvZ25pemVkIHZhbHVlIHNoYWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgdmFsdWUgMSAoZGVsYXl0b2xlcmFudCkKKworU3VwcG9ydGVkR0FEU2hhcGVzIDo6PSBCSVQgU1RSSU5HIHsKKwllbGxpcHNvaWRQb2ludCAgKDApLAorCWVsbGlwc29pZFBvaW50V2l0aFVuY2VydGFpbnR5Q2lyY2xlICgxKSwKKwllbGxpcHNvaWRQb2ludFdpdGhVbmNlcnRhaW50eUVsbGlwc2UgKDIpLAorCXBvbHlnb24gKDMpLAorCWVsbGlwc29pZFBvaW50V2l0aEFsdGl0dWRlICg0KSwKKwllbGxpcHNvaWRQb2ludFdpdGhBbHRpdHVkZUFuZFVuY2VydGFpbnR5RWxpcHNvaWQgKDUpLAorCWVsbGlwc29pZEFyYyAgKDYpIH0gKFNJWkUgKDcuLjE2KSkKKy0tIEEgbm9kZSBzaGFsbCBtYXJrIGluIHRoZSBCSVQgU1RSSU5HIGFsbCBTaGFwZXMgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMiBpdCBzdXBwb3J0cy4KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzogYml0cyA3IHRvIDE1IHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQuCisKK0xDUy1SZWZlcmVuY2VOdW1iZXI6Oj0gT0NURVQgU1RSSU5HIChTSVpFKDEpKQorCitMQ1NDb2Rld29yZCA6Oj0gU0VRVUVOQ0UgeworCWRhdGFDb2RpbmdTY2hlbWUJWzBdIFVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKKwlsY3NDb2Rld29yZFN0cmluZwlbMV0gTENTQ29kZXdvcmRTdHJpbmcsCisJLi4ufQorCitMQ1NDb2Rld29yZFN0cmluZyA6Oj0gVVNTRC1TdHJpbmcgKFNJWkUgKDEuLm1heExDU0NvZGV3b3JkU3RyaW5nTGVuZ3RoKSkKKworbWF4TENTQ29kZXdvcmRTdHJpbmdMZW5ndGggIElOVEVHRVIgOjo9IDIwCisKK0xDUy1Qcml2YWN5Q2hlY2sgOjo9IFNFUVVFTkNFIHsKKwljYWxsU2Vzc2lvblVucmVsYXRlZAlbMF0gUHJpdmFjeUNoZWNrUmVsYXRlZEFjdGlvbiwKKwljYWxsU2Vzc2lvblJlbGF0ZWQJWzFdIFByaXZhY3lDaGVja1JlbGF0ZWRBY3Rpb24JT1BUSU9OQUwsCisJLi4ufQorCitQcml2YWN5Q2hlY2tSZWxhdGVkQWN0aW9uIDo6PSBFTlVNRVJBVEVEIHsKKwlhbGxvd2VkV2l0aG91dE5vdGlmaWNhdGlvbiAoMCksCisJYWxsb3dlZFdpdGhOb3RpZmljYXRpb24gKDEpLAorCWFsbG93ZWRJZk5vUmVzcG9uc2UgKDIpLAorCXJlc3RyaWN0ZWRJZk5vUmVzcG9uc2UgKDMpLAorCW5vdEFsbG93ZWQgKDQpLAorCS4uLn0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCWEgUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcgY29udGFpbmluZyBhbiB1bnJlY29nbml6ZWQgUHJpdmFjeUNoZWNrUmVsYXRlZEFjdGlvbgorLS0Jc2hhbGwgYmUgcmVqZWN0ZWQgYnkgdGhlIHJlY2VpdmVyIHdpdGggYSByZXR1cm4gZXJyb3IgY2F1c2Ugb2YgdW5leHBlY3RlZCBkYXRhIHZhbHVlCisKK0FyZWFFdmVudEluZm8gOjo9IFNFUVVFTkNFIHsKKwlhcmVhRGVmaW5pdGlvbglbMF0JQXJlYURlZmluaXRpb24sCisJb2NjdXJyZW5jZUluZm8JWzFdCU9jY3VycmVuY2VJbmZvCU9QVElPTkFMLAorCWludGVydmFsVGltZQlbMl0JSW50ZXJ2YWxUaW1lCU9QVElPTkFMLAorCS4uLn0KKworQXJlYURlZmluaXRpb24gOjo9IFNFUVVFTkNFIHsKKwlhcmVhTGlzdAkJWzBdCUFyZWFMaXN0LAorCS4uLn0KKworQXJlYUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQXJlYXMpIE9GIEFyZWEKKworbWF4TnVtT2ZBcmVhcyAgSU5URUdFUiA6Oj0gMTAKKworQXJlYSA6Oj0gU0VRVUVOQ0UgeworCWFyZWFUeXBlCQlbMF0JQXJlYVR5cGUsCisJYXJlYUlkZW50aWZpY2F0aW9uCVsxXQlBcmVhSWRlbnRpZmljYXRpb24sCisJLi4ufQorCitBcmVhVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJY291bnRyeUNvZGUJKDApLAorCXBsbW5JZAkJKDEpLAorCWxvY2F0aW9uQXJlYUlkCSgyKSwKKwlyb3V0aW5nQXJlYUlkCSgzKSwKKwljZWxsR2xvYmFsSWQJKDQpLAorCS4uLiwKKwl1dHJhbkNlbGxJZAkoNSkgfQorCitBcmVhSWRlbnRpZmljYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMi4uNykpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0gb2N0ZXQgMSBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgQ291bnRyeSBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0IDIgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgM3JkIGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAzcmQgZGlnaXQgaWYgMyBkaWdpdCBNTkMgaW5jbHVkZWQKKwktLQkJCW9yIGZpbGxlciAoMTExMSkKKwktLSBvY3RldCAzIGJpdHMgNDMyMQlNb2JpbGUgTmV0d29yayBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXRzIDQgYW5kIDUJTG9jYXRpb24gQXJlYSBDb2RlIChMQUMpIGZvciBMb2NhbCBBcmVhIElkLAorCS0tCQkJUm91dGluZyBBcmVhIElkIGFuZCBDZWxsIEdsb2JhbCBJZAorCS0tIG9jdGV0IDYJUm91dGluZyBBcmVhIENvZGUgKFJBQykgZm9yIFJvdXRpbmcgQXJlYSBJZAorCS0tIG9jdGV0cyA2IGFuZCA3CUNlbGwgSWRlbnRpdHkgKENJKSBmb3IgQ2VsbCBHbG9iYWwgSWQKKwktLSBvY3RldHMgNCB1bnRpbCA3CVV0cmFuIENlbGwgSWRlbnRpdHkgKFVDLUlkKSBmb3IgVXRyYW4gQ2VsbCBJZAorCitPY2N1cnJlbmNlSW5mbyA6Oj0gRU5VTUVSQVRFRCB7CisJb25lVGltZUV2ZW50CSgwKSwKKwltdWx0aXBsZVRpbWVFdmVudAkoMSksCisJLi4ufQorCitJbnRlcnZhbFRpbWUgOjo9IElOVEVHRVIgKDEuLjMyNzY3KQorCS0tIG1pbmltdW0gaW50ZXJ2YWwgdGltZSBiZXR3ZWVuIGFyZWEgcmVwb3J0cyBpbiBzZWNvbmRzCisKK1BlcmlvZGljTERSSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXJlcG9ydGluZ0Ftb3VudAkJUmVwb3J0aW5nQW1vdW50LAorCXJlcG9ydGluZ0ludGVydmFsCVJlcG9ydGluZ0ludGVydmFsLAorCS4uLn0KKy0tIHJlcG9ydGluZ0ludGVydmFsIHggcmVwb3J0aW5nQW1vdW50IHNoYWxsIG5vdCBleGNlZWQgODYzOTk5OSAoOTkgZGF5cywgMjMgaG91cnMsCistLSA1OSBtaW51dGVzIGFuZCA1OSBzZWNvbmRzKSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE9NQSBNTFAgYW5kIFJMUAorCitSZXBvcnRpbmdBbW91bnQgOjo9IElOVEVHRVIgKDEuLm1heFJlcG9ydGluZ0Ftb3VudCkKKworbWF4UmVwb3J0aW5nQW1vdW50IElOVEVHRVIgOjo9IDg2Mzk5OTkKKworUmVwb3J0aW5nSW50ZXJ2YWwgOjo9IElOVEVHRVIgKDEuLm1heFJlcG9ydGluZ0ludGVydmFsKQorLS0gUmVwb3J0aW5nSW50ZXJ2YWwgaXMgaW4gc2Vjb25kcworCittYXhSZXBvcnRpbmdJbnRlcnZhbCBJTlRFR0VSIDo6PSA4NjM5OTk5CisKK1JlcG9ydGluZ1BMTU5MaXN0Ojo9IFNFUVVFTkNFIHsKKwlwbG1uLUxpc3RQcmlvcml0aXplZAkJCVswXSBOVUxMCQkJCQlPUFRJT05BTCwKKwlwbG1uLUxpc3QgCQkJCQkJWzFdIFBMTU5MaXN0LAorCS4uLn0KKworUExNTkxpc3Q6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZSZXBvcnRpbmdQTE1OKSBPRgorCQkJCVJlcG9ydGluZ1BMTU4KKworbWF4TnVtT2ZSZXBvcnRpbmdQTE1OIElOVEVHRVIgOjo9IDIwCisKK1JlcG9ydGluZ1BMTU46Oj0gU0VRVUVOQ0UgeworCXBsbW4tSWQgCQkJCQkJWzBdIFBMTU4tSWQsCisJcmFuLVRlY2hub2xvZ3kgCQkJCQlbMV0gUkFOLVRlY2hub2xvZ3kJCQlPUFRJT05BTCwKKwlyYW4tUGVyaW9kaWNMb2NhdGlvblN1cHBvcnQJCVsyXSBOVUxMCQkJCQlPUFRJT05BTCwKKwkuLi59CisKK1JBTi1UZWNobm9sb2d5IDo6PSBFTlVNRVJBVEVEIHsKKwlnc20JCQkoMCksCisJdW10cwkJKDEpLAorCS4uLn0KKworUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1SZXMgOjo9IFNFUVVFTkNFIHsKKwlsb2NhdGlvbkVzdGltYXRlCUV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwKKwlhZ2VPZkxvY2F0aW9uRXN0aW1hdGUJWzBdIEFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWFkZC1Mb2NhdGlvbkVzdGltYXRlCVsyXSBBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gCU9QVElPTkFMLAorCWRlZmVycmVkbXQtbHJSZXNwb25zZUluZGljYXRvcglbM10gTlVMTAkJT1BUSU9OQUwsCisJZ2VyYW5Qb3NpdGlvbmluZ0RhdGEJWzRdIFBvc2l0aW9uaW5nRGF0YUluZm9ybWF0aW9uCU9QVElPTkFMLAorCXV0cmFuUG9zaXRpb25pbmdEYXRhCVs1XSBVdHJhblBvc2l0aW9uaW5nRGF0YUluZm8JT1BUSU9OQUwsCisJY2VsbElkT3JTYWkJWzZdIENlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJCU9QVElPTkFMLAorCXNhaS1QcmVzZW50CVs3XSBOVUxMCQlPUFRJT05BTCwKKwlhY2N1cmFjeUZ1bGZpbG1lbnRJbmRpY2F0b3IJWzhdIEFjY3VyYWN5RnVsZmlsbWVudEluZGljYXRvcgkJT1BUSU9OQUwsCisJdmVsb2NpdHlFc3RpbWF0ZQlbOV0gVmVsb2NpdHlFc3RpbWF0ZQlPUFRJT05BTCwKKwltby1sclNob3J0Q2lyY3VpdEluZGljYXRvcglbMTBdIE5VTEwJCU9QVElPTkFMIH0KKworLS0JaWYgZGVmZXJyZWRtdC1sclJlc3BvbnNlSW5kaWNhdG9yIGlzIHNldCwgbG9jYXRpb25Fc3RpbWF0ZSBpcyBpZ25vcmVkLgorCistLSB0aGUgYWRkLUxvY2F0aW9uRXN0aW1hdGUgcGFyYW1ldGVyIHNoYWxsIG5vdCBiZSBzZW50IHRvIGEgbm9kZSB0aGF0IGRpZCBub3QgaW5kaWNhdGUgdGhlCistLSBnZW9ncmFwaGljIHNoYXBlcyBzdXBwb3J0ZWQgaW4gdGhlIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnCistLSBUaGUgbG9jYXRpb25Fc3RpbWF0ZSBhbmQgdGhlIGFkZC1sb2NhdGlvbkVzdGltYXRlIHBhcmFtZXRlcnMgc2hhbGwgbm90IGJlIHNlbnQgaWYKKy0tIHRoZSBzdXBwb3J0ZWRHQURTaGFwZXMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlY2VpdmVkIGluIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnCistLSBhbmQgdGhlIHNoYXBlIGVuY29kZWQgaW4gbG9jYXRpb25Fc3RpbWF0ZSBvciBhZGQtTG9jYXRpb25Fc3RpbWF0ZSBpcyBub3QgbWFya2VkCistLSBhcyBzdXBwb3J0ZWQgaW4gc3VwcG9ydGVkR0FEU2hhcGVzLiBJbiBzdWNoIGEgY2FzZSBQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uCistLSBzaGFsbCBiZSByZWplY3RlZCB3aXRoIGVycm9yIEZhY2lsaXR5Tm90U3VwcG9ydGVkIHdpdGggYWRkaXRpb25hbCBpbmRpY2F0aW9uCistLSBzaGFwZU9mTG9jYXRpb25Fc3RpbWF0ZU5vdFN1cHBvcnRlZC4KKy0tIHNhaS1QcmVzZW50IGluZGljYXRlcyB0aGF0IHRoZSBjZWxsSWRPclNhaSBwYXJhbWV0ZXIgY29udGFpbnMgYSBTZXJ2aWNlIEFyZWEgSWRlbnRpdHkuCisKK0FjY3VyYWN5RnVsZmlsbWVudEluZGljYXRvciA6Oj0gRU5VTUVSQVRFRCB7CisJcmVxdWVzdGVkQWNjdXJhY3lGdWxmaWxsZWQgICgwKSwKKwlyZXF1ZXN0ZWRBY2N1cmFjeU5vdEZ1bGZpbGxlZCAgKDEpLAorCS4uLgl9CisKK0V4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24pKQorCS0tIFJlZmVycyB0byBnZW9ncmFwaGljYWwgSW5mb3JtYXRpb24gZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMi4KKwktLSBUaGlzIGlzIGNvbXBvc2VkIG9mIDEgb3IgbW9yZSBvY3RldHMgd2l0aCBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvCisJLS0gM0dQUCBUUyAyMy4wMzIKKwktLSBPY3RldCAxOiBUeXBlIG9mIHNoYXBlLCBvbmx5IHRoZSBmb2xsb3dpbmcgc2hhcGVzIGluIDNHUFAgVFMgMjMuMDMyIGFyZSBhbGxvd2VkOgorCS0tCQkoYSkgRWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCisJLS0JCShiKSBFbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBlbGxpcHNlCisJLS0JCShjKSBFbGxpcHNvaWQgcG9pbnQgd2l0aCBhbHRpdHVkZSBhbmQgdW5jZXJ0YWludHkgZWxsaXBzb2lkCisJLS0JCShkKSBFbGxpcHNvaWQgQXJjCisJLS0JCShlKSBFbGxpcHNvaWQgUG9pbnQKKwktLSBBbnkgb3RoZXIgdmFsdWUgaW4gb2N0ZXQgMSBzaGFsbCBiZSB0cmVhdGVkIGFzIGludmFsaWQKKwktLSBPY3RldHMgMiB0byA4IGZvciBjYXNlIChhKSCWIEVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGNpcmNsZQorCS0tCQlEZWdyZWVzIG9mIExhdGl0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCVVuY2VydGFpbnR5IGNvZGUJCQkJMSBvY3RldAorCS0tIE9jdGV0cyAyIHRvIDExIGZvciBjYXNlIChiKSCWIEVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGVsbGlwc2U6CisJLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJRGVncmVlcyBvZiBMb25naXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJVW5jZXJ0YWludHkgc2VtaS1tYWpvciBheGlzCQkJCTEgb2N0ZXQKKwktLQkJVW5jZXJ0YWludHkgc2VtaS1taW5vciBheGlzCQkJCTEgb2N0ZXQKKwktLQkJQW5nbGUgb2YgbWFqb3IgYXhpcwkJCQkxIG9jdGV0CisJLS0JCUNvbmZpZGVuY2UJCQkJMSBvY3RldAorCS0tIE9jdGV0cyAyIHRvIDE0IGZvciBjYXNlIChjKSCWIEVsbGlwc29pZCBwb2ludCB3aXRoIGFsdGl0dWRlIGFuZCB1bmNlcnRhaW50eSBlbGxpcHNvaWQKKwktLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlBbHRpdHVkZQkJCQkyIG9jdGV0cworCS0tCQlVbmNlcnRhaW50eSBzZW1pLW1ham9yIGF4aXMJCQkJMSBvY3RldAorCS0tCQlVbmNlcnRhaW50eSBzZW1pLW1pbm9yIGF4aXMJCQkJMSBvY3RldAorCS0tCQlBbmdsZSBvZiBtYWpvciBheGlzCQkJCTEgb2N0ZXQKKwktLQkJVW5jZXJ0YWludHkgYWx0aXR1ZGUJCQkJMSBvY3RldAorCS0tCQlDb25maWRlbmNlCQkJCTEgb2N0ZXQKKwktLSBPY3RldHMgMiB0byAxMyBmb3IgY2FzZSAoZCkgliBFbGxpcHNvaWQgQXJjCisJLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJRGVncmVlcyBvZiBMb25naXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJSW5uZXIgcmFkaXVzCQkJCTIgb2N0ZXRzCisJLS0JCVVuY2VydGFpbnR5IHJhZGl1cwkJCQkxIG9jdGV0CisJLS0JCU9mZnNldCBhbmdsZQkJCQkxIG9jdGV0CisJLS0JCUluY2x1ZGVkIGFuZ2xlCQkJCTEgb2N0ZXQKKwktLQkJQ29uZmlkZW5jZQkJCQkxIG9jdGV0CisJLS0gT2N0ZXRzIDIgdG8gNyBmb3IgY2FzZSAoZSkgliBFbGxpcHNvaWQgUG9pbnQKKwktLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworCisJLS0KKwktLSBBbiBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGNvbXByaXNpbmcgbW9yZSB0aGFuIG9uZSBvY3RldCBhbmQKKwktLSBjb250YWluaW5nIGFueSBvdGhlciBzaGFwZSBvciBhbiBpbmNvcnJlY3QgbnVtYmVyIG9mIG9jdGV0cyBvciBjb2RpbmcgYWNjb3JkaW5nCisJLS0gdG8gM0dQUCBUUyAyMy4wMzIgc2hhbGwgYmUgdHJlYXRlZCBhcyBpbnZhbGlkIGRhdGEgYnkgYSByZWNlaXZlci4KKwktLQorCS0tIEFuIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgY29tcHJpc2luZyBvbmUgb2N0ZXQgc2hhbGwgYmUgZGlzY2FyZGVkCisJLS0gYnkgdGhlIHJlY2VpdmVyIGlmIGFuIEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgaXMgcmVjZWl2ZWQgCisJLS0gaW4gdGhlIHNhbWUgbWVzc2FnZS4KKwktLQorCS0tIEFuIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgY29tcHJpc2luZyBvbmUgb2N0ZXQgc2hhbGwgYmUgdHJlYXRlZCBhcworCS0tIGludmFsaWQgZGF0YSBieSB0aGUgcmVjZWl2ZXIgaWYgYW4gQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBpcyBub3QKKwktLSByZWNlaXZlZCBpbiB0aGUgc2FtZSBtZXNzYWdlLgorCittYXhFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gIElOVEVHRVIgOjo9IDIwCisJLS0gdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93cyBmb3IgZnVydGhlciBzaGFwZXMgaW4gM0dQUCBUUyAyMy4wMzIgdG8gYmUgaW5jbHVkZWQgaW4gbGF0ZXIgCisJLS0gdmVyc2lvbnMgb2YgM0dQUCBUUyAyOS4wMDIKKworVmVsb2NpdHlFc3RpbWF0ZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0Li43KSkKKwktLSBSZWZlcnMgdG8gVmVsb2NpdHkgZGVzY3JpcHRpb24gZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMi4KKwktLSBUaGlzIGlzIGNvbXBvc2VkIG9mIDQgb3IgbW9yZSBvY3RldHMgd2l0aCBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvCisJLS0gM0dQUCBUUyAyMy4wMzIKKwktLSBPY3RldCAxOiBUeXBlIG9mIHZlbG9jaXR5LCBvbmx5IHRoZSBmb2xsb3dpbmcgdHlwZXMgaW4gM0dQUCBUUyAyMy4wMzIgYXJlIGFsbG93ZWQ6CisJLS0JCShhKSBIb3Jpem9udGFsIFZlbG9jaXR5CisJLS0JCShiKSBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHkKKwktLQkJKGMpIEhvcml6b250YWwgVmVsb2NpdHkgd2l0aCBVbmNlcnRhaW50eQorCS0tCQkoZCkgSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5IGFuZCBVbmNlcnRhaW50eQorCS0tIEZvciB0eXBlcyBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHkgYW5kIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eQorCS0tIGFuZCBVbmNlcnRhaW50eSwgdGhlIGRpcmVjdGlvbiBvZiB0aGUgVmVydGljYWwgU3BlZWQgaXMgYWxzbyBpbmNsdWRlZCBpbiBPY3RldCAxCisJLS0gQW55IG90aGVyIHZhbHVlIGluIG9jdGV0IDEgc2hhbGwgYmUgdHJlYXRlZCBhcyBpbnZhbGlkCisJLS0gT2N0ZXRzIDIgdG8gNCBmb3IgY2FzZSAoYSkgSG9yaXpvbnRhbCB2ZWxvY2l0eToKKwktLQkJQmVhcmluZwkJCQkxIG9jdGV0CisJLS0JCUhvcml6b250YWwgU3BlZWQJCQkJMiBvY3RldHMKKwktLSBPY3RldHMgMiB0byA1IGZvciBjYXNlIChiKSCWIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eToKKwktLQkJQmVhcmluZwkJCQkxIG9jdGV0CisJLS0JCUhvcml6b250YWwgU3BlZWQJCQkJMiBvY3RldHMKKwktLQkJVmVydGljYWwgU3BlZWQJCQkJMSBvY3RldAorCS0tIE9jdGV0cyAyIHRvIDUgZm9yIGNhc2UgKGMpIJYgSG9yaXpvbnRhbCB2ZWxvY2l0eSB3aXRoIFVuY2VydGFpbnR5OgorCS0tCQlCZWFyaW5nCQkJCTEgb2N0ZXQKKwktLQkJSG9yaXpvbnRhbCBTcGVlZAkJCQkyIG9jdGV0cworCS0tCQlVbmNlcnRhaW50eSBTcGVlZAkJCQkxIG9jdGV0CisJLS0gT2N0ZXRzIDIgdG8gNyBmb3IgY2FzZSAoZCkgliBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHkgYW5kIFVuY2VydGFpbnR5OgorCS0tCQlCZWFyaW5nCQkJCTEgb2N0ZXQKKwktLQkJSG9yaXpvbnRhbCBTcGVlZAkJCQkyIG9jdGV0cworCS0tCQlWZXJ0aWNhbCBTcGVlZAkJCQkxIG9jdGV0CisJLS0JCUhvcml6b250YWwgVW5jZXJ0YWludHkgU3BlZWQJCQkxIG9jdGV0CisJLS0JCVZlcnRpY2FsIFVuY2VydGFpbnR5IFNwZWVkCQkJCTEgb2N0ZXQKKworUG9zaXRpb25pbmdEYXRhSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMi4ubWF4UG9zaXRpb25pbmdEYXRhSW5mb3JtYXRpb24pKQorCS0tIFJlZmVycyB0byB0aGUgUG9zaXRpb25pbmcgRGF0YSBkZWZpbmVkIGluIDNHUFAgVFMgNDkuMDMxLgorCS0tIFRoaXMgaXMgY29tcG9zZWQgb2YgMiBvciBtb3JlIG9jdGV0cyB3aXRoIGFuIGludGVybmFsIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8KKwktLSAzR1BQIFRTIDQ5LjAzMS4gCisKK21heFBvc2l0aW9uaW5nRGF0YUluZm9ybWF0aW9uIElOVEVHRVIgOjo9IDEwCisJLS0gCisKK1V0cmFuUG9zaXRpb25pbmdEYXRhSW5mbyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzLi5tYXhVdHJhblBvc2l0aW9uaW5nRGF0YUluZm8pKQorCS0tIFJlZmVycyB0byB0aGUgUG9zaXRpb24gRGF0YSBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLgorCS0tIFRoaXMgaXMgY29tcG9zZWQgb2YgdGhlIHBvc2l0aW9uaW5nRGF0YURpc2NyaW1pbmF0b3IgYW5kIHRoZSBwb3NpdGlvbmluZ0RhdGFTZXQKKwktLSBpbmNsdWRlZCBpbiBwb3NpdGlvbkRhdGEgYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMy4KKworbWF4VXRyYW5Qb3NpdGlvbmluZ0RhdGFJbmZvIElOVEVHRVIgOjo9IDExCisJLS0gCisKK0FkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24pKQorCS0tIFJlZmVycyB0byBnZW9ncmFwaGljYWwgSW5mb3JtYXRpb24gZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMi4KKwktLSBUaGlzIGlzIGNvbXBvc2VkIG9mIDEgb3IgbW9yZSBvY3RldHMgd2l0aCBhbiBpbnRlcm5hbCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIAorCS0tIDNHUFAgVFMgMjMuMDMyCisJLS0gT2N0ZXQgMTogVHlwZSBvZiBzaGFwZSwgYWxsIHRoZSBzaGFwZXMgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMiBhcmUgYWxsb3dlZDoKKwktLSBPY3RldHMgMiB0byBuICh3aGVyZSBuIGlzIHRoZSB0b3RhbCBudW1iZXIgb2Ygb2N0ZXRzIG5lY2Vzc2FyeSB0byBlbmNvZGUgdGhlIHNoYXBlCisJLS0gYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjMuMDMyKSBhcmUgdXNlZCB0byBlbmNvZGUgdGhlIHNoYXBlIGl0c2VsZiBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCisJLS0gZW5jb2RpbmcgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMgorCS0tCisJLS0gQW4gQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciwgd2hldGhlciB2YWxpZCBvciBpbnZhbGlkLCByZWNlaXZlZCAKKwktLSB0b2dldGhlciB3aXRoIGEgdmFsaWQgRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBpbiB0aGUgc2FtZSBtZXNzYWdlIAorCS0tIHNoYWxsIGJlIGRpc2NhcmRlZC4KKwktLQorCS0tIEFuIEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgY29udGFpbmluZyBhbnkgc2hhcGUgbm90IGRlZmluZWQgaW4gCisJLS0gM0dQUCBUUyAyMy4wMzIgb3IgYW4gaW5jb3JyZWN0IG51bWJlciBvZiBvY3RldHMgb3IgY29kaW5nIGFjY29yZGluZyB0byAKKwktLSAzR1BQIFRTIDIzLjAzMiBzaGFsbCBiZSB0cmVhdGVkIGFzIGludmFsaWQgZGF0YSBieSBhIHJlY2VpdmVyIGlmIG5vdCByZWNlaXZlZCAKKwktLSB0b2dldGhlciB3aXRoIGEgdmFsaWQgRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBpbiB0aGUgc2FtZSBtZXNzYWdlLgorCittYXhBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gIElOVEVHRVIgOjo9IDkxCisJLS0gdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93cyBzdXBwb3J0IGZvciBhbGwgdGhlIHNoYXBlcyBjdXJyZW50bHkgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMgorCitTdWJzY3JpYmVyTG9jYXRpb25SZXBvcnQtQXJnIDo6PSBTRVFVRU5DRSB7CisJbGNzLUV2ZW50CQlMQ1MtRXZlbnQsCisJbGNzLUNsaWVudElECUxDUy1DbGllbnRJRCwgCisJbGNzTG9jYXRpb25JbmZvCUxDU0xvY2F0aW9uSW5mbywKKwltc2lzZG4JCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJaW1zaQkJCVsxXSBJTVNJCQlPUFRJT05BTCwKKwlpbWVpCQkJWzJdIElNRUkJCU9QVElPTkFMLAorCW5hLUVTUkQJCVszXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbmEtRVNSSwkJWzRdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlsb2NhdGlvbkVzdGltYXRlCVs1XSBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJYWdlT2ZMb2NhdGlvbkVzdGltYXRlCVs2XSBBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJc2xyLUFyZ0V4dGVuc2lvbkNvbnRhaW5lcglbN10gU0xSLUFyZ0V4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWFkZC1Mb2NhdGlvbkVzdGltYXRlCVs4XSBBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJZGVmZXJyZWRtdC1sckRhdGEJWzldIERlZmVycmVkbXQtbHJEYXRhCU9QVElPTkFMLCAKKwlsY3MtUmVmZXJlbmNlTnVtYmVyCVsxMF0gTENTLVJlZmVyZW5jZU51bWJlcglPUFRJT05BTCwKKwlnZXJhblBvc2l0aW9uaW5nRGF0YQlbMTFdIFBvc2l0aW9uaW5nRGF0YUluZm9ybWF0aW9uCU9QVElPTkFMLAorCXV0cmFuUG9zaXRpb25pbmdEYXRhCVsxMl0gVXRyYW5Qb3NpdGlvbmluZ0RhdGFJbmZvCU9QVElPTkFMLAorCWNlbGxJZE9yU2FpCVsxM10JQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkJT1BUSU9OQUwsCisJaC1nbWxjLUFkZHJlc3MJWzE0XQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlsY3NTZXJ2aWNlVHlwZUlECVsxNV0JTENTU2VydmljZVR5cGVJRAlPUFRJT05BTCwKKwlzYWktUHJlc2VudAlbMTddIE5VTEwJCU9QVElPTkFMLAorCXBzZXVkb255bUluZGljYXRvcglbMThdIE5VTEwJCU9QVElPTkFMLAorCWFjY3VyYWN5RnVsZmlsbWVudEluZGljYXRvcglbMTldIEFjY3VyYWN5RnVsZmlsbWVudEluZGljYXRvcglPUFRJT05BTCwKKwl2ZWxvY2l0eUVzdGltYXRlCVsyMF0gVmVsb2NpdHlFc3RpbWF0ZQlPUFRJT05BTCwKKwlzZXF1ZW5jZU51bWJlcglbMjFdIFNlcXVlbmNlTnVtYmVyCU9QVElPTkFMLAorCXBlcmlvZGljTERSSW5mbwlbMjJdIFBlcmlvZGljTERSSW5mbwlPUFRJT05BTCwKKwltby1sclNob3J0Q2lyY3VpdEluZGljYXRvcglbMjNdIE5VTEwJCU9QVElPTkFMIH0KKworCS0tIG9uZSBvZiBtc2lzZG4gb3IgaW1zaSBpcyBtYW5kYXRvcnkKKwktLSBhIGxvY2F0aW9uIGVzdGltYXRlIHRoYXQgaXMgdmFsaWQgZm9yIHRoZSBsb2NhdGlvbkVzdGltYXRlIHBhcmFtZXRlciBzaG91bGQgCisJLS0gYmUgdHJhbnNmZXJyZWQgaW4gdGhpcyBwYXJhbWV0ZXIgaW4gcHJlZmVyZW5jZSB0byB0aGUgYWRkLUxvY2F0aW9uRXN0aW1hdGUuCisJLS0gdGhlIGRlZmVycmVkbXQtbHJEYXRhIHBhcmFtZXRlciBzaGFsbCBiZSBpbmNsdWRlZCBpZiBhbmQgb25seSBpZiB0aGUgbGNzLUV2ZW50CisJLS0gaW5kaWNhdGVzIGEgZGVmZXJyZWRtdC1sclJlc3BvbnNlLgorCS0tIGlmIHRoZSBsY3MtRXZlbnQgaW5kaWNhdGVzIGEgZGVmZXJyZWRtdC1sclJlc3BvbnNlIHRoZW4gdGhlIGxvY2F0aW9uRXN0aW1hdGUgCisJLS0gYW5kIHRoZSBhZGQtbG9jYXRpb25Fc3RpbWF0ZSBwYXJhbWV0ZXJzIHNoYWxsIG5vdCBiZSBzZW50IGlmIHRoZSAKKwktLSBzdXBwb3J0ZWRHQURTaGFwZXMgcGFyYW1ldGVyIGhhZCBiZWVuIHJlY2VpdmVkIGluIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnCisJLS0gYW5kIHRoZSBzaGFwZSBlbmNvZGVkIGluIGxvY2F0aW9uRXN0aW1hdGUgb3IgYWRkLUxvY2F0aW9uRXN0aW1hdGUgd2FzIG5vdCBtYXJrZWQKKwktLSBhcyBzdXBwb3J0ZWQgaW4gc3VwcG9ydGVkR0FEU2hhcGVzLiBJbiBzdWNoIGEgY2FzZSB0ZXJtaW5hdGlvbkNhdXNlIAorCS0tIGluIGRlZmVycmVkbXQtbHJEYXRhIHNoYWxsIGJlIHByZXNlbnQgd2l0aCB2YWx1ZSAKKwktLSBzaGFwZU9mTG9jYXRpb25Fc3RpbWF0ZU5vdFN1cHBvcnRlZC4gCisJLS0gSWYgYSBsY3MgZXZlbnQgaW5kaWNhdGVzIGRlZmVycmVkIG10LWxyIHJlc3BvbnNlLCB0aGUgbGNzLVJlZmVyZW5jZSBudW1iZXIgc2hhbGwgYmUgCisJLS0gaW5jbHVkZWQuIAorCS0tIHNhaS1QcmVzZW50IGluZGljYXRlcyB0aGF0IHRoZSBjZWxsSWRPclNhaSBwYXJhbWV0ZXIgY29udGFpbnMgYSBTZXJ2aWNlIEFyZWEgSWRlbnRpdHkuCisKK0RlZmVycmVkbXQtbHJEYXRhIDo6PSBTRVFVRU5DRSB7CisJZGVmZXJyZWRMb2NhdGlvbkV2ZW50VHlwZQlEZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlLAorCXRlcm1pbmF0aW9uQ2F1c2UJWzBdIFRlcm1pbmF0aW9uQ2F1c2UJT1BUSU9OQUwsCisJbGNzTG9jYXRpb25JbmZvCVsxXSBMQ1NMb2NhdGlvbkluZm8JT1BUSU9OQUwsCisJLi4ufQorCS0tIGxjc0xvY2F0aW9uSW5mbyBtYXkgYmUgaW5jbHVkZWQgb25seSBpZiBhIHRlcm1pbmF0aW9uQ2F1c2UgaXMgcHJlc2VudCAKKwktLSBpbmRpY2F0aW5nIG10LWxyUmVzdGFydC4KKworTENTLUV2ZW50IDo6PSBFTlVNRVJBVEVEIHsKKwllbWVyZ2VuY3lDYWxsT3JpZ2luYXRpb24gICgwKSwKKwllbWVyZ2VuY3lDYWxsUmVsZWFzZSAgKDEpLCAKKwltby1sciAgKDIpLAorCS4uLiwKKwlkZWZlcnJlZG10LWxyUmVzcG9uc2UgICgzKSAsCisJZGVmZXJyZWRtby1sclRUVFBJbml0aWF0aW9uICAoNCkgIH0KKwktLQlkZWZlcnJlZG10LWxyUmVzcG9uc2UgaXMgYXBwbGljYWJsZSB0byB0aGUgZGVsaXZlcnkgb2YgYSBsb2NhdGlvbiBlc3RpbWF0ZSAKKwktLQlmb3IgYW4gTERSIGluaXRpYXRlZCBlYXJsaWVyIGJ5IGVpdGhlciB0aGUgbmV0d29yayAodmlhIGFuIE1ULUxSIGFjdGl2YXRlIGRlZmVycmVkIAorCS0tCWxvY2F0aW9uKSBvciB0aGUgVUUgKHZpYSBhIGRlZmVycmVkIE1PLUxSIFRUVFAgaW5pdGlhdGlvbikKKwktLQlleGNlcHRpb24gaGFuZGxpbmc6CisJLS0JYSBTdWJzY3JpYmVyTG9jYXRpb25SZXBvcnQtQXJnIGNvbnRhaW5pbmcgYW4gdW5yZWNvZ25pemVkIExDUy1FdmVudAorCS0tCXNoYWxsIGJlIHJlamVjdGVkIGJ5IGEgcmVjZWl2ZXIgd2l0aCBhIHJldHVybiBlcnJvciBjYXVzZSBvZiB1bmV4cGVjdGVkIGRhdGEgdmFsdWUKKworVGVybWluYXRpb25DYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJbm9ybWFsICAoMCksCisJZXJyb3J1bmRlZmluZWQgICgxKSwKKwlpbnRlcm5hbFRpbWVvdXQgICgyKSwKKwljb25nZXN0aW9uICAoMyksCisJbXQtbHJSZXN0YXJ0ICAoNCksCisJcHJpdmFjeVZpb2xhdGlvbiAgKDUpLAorCS4uLiwKKwlzaGFwZU9mTG9jYXRpb25Fc3RpbWF0ZU5vdFN1cHBvcnRlZCAoNikgLAorCXN1YnNjcmliZXJUZXJtaW5hdGlvbiAoNyksCisJdUVUZXJtaW5hdGlvbiAoOCksCisJbmV0d29ya1Rlcm1pbmF0aW9uICg5KSAgfSAKKy0tIG10LWxyUmVzdGFydCBzaGFsbCBiZSB1c2VkIHRvIHRyaWdnZXIgdGhlIEdNTEMgdG8gcmVzdGFydCB0aGUgbG9jYXRpb24gcHJvY2VkdXJlLCAKKy0tIGVpdGhlciBiZWNhdXNlIHRoZSBzZW5kaW5nIG5vZGUga25vd3MgdGhhdCB0aGUgdGVybWluYWwgaGFzIG1vdmVkIHVuZGVyIGNvdmVyYWdlIAorLS0gb2YgYW5vdGhlciBNU0Mgb3IgU0dTTiAoZS5nLiBTZW5kIElkZW50aWZpY2F0aW9uIHJlY2VpdmVkKSwgb3IgYmVjYXVzZSB0aGUgc3Vic2NyaWJlcgorLS0gaGFzIGJlZW4gZGVyZWdpc3RlcmVkIGR1ZSB0byBhIENhbmNlbCBMb2NhdGlvbiByZWNlaXZlZCBmcm9tIEhMUi4KKy0tCistLSBleGNlcHRpb24gaGFuZGxpbmcKKy0tIGFuIHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIHZhbHVlIDEgKGVycm9ydW5kZWZpbmVkKSAKKworU2VxdWVuY2VOdW1iZXIgOjo9IElOVEVHRVIgKDEuLm1heFJlcG9ydGluZ0Ftb3VudCkKKworU3Vic2NyaWJlckxvY2F0aW9uUmVwb3J0LVJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsIAorCS4uLiwgCisJbmEtRVNSSwkJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwluYS1FU1JECQlbMV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWgtZ21sYy1BZGRyZXNzCVsyXQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwltby1sclNob3J0Q2lyY3VpdEluZGljYXRvcglbM10gTlVMTAkJT1BUSU9OQUwsCisJcmVwb3J0aW5nUExNTkxpc3QJWzRdIFJlcG9ydGluZ1BMTU5MaXN0CU9QVElPTkFMLAorCWxjcy1SZWZlcmVuY2VOdW1iZXIJWzVdCUxDUy1SZWZlcmVuY2VOdW1iZXIJT1BUSU9OQUwgfQorCistLSBuYS1FU1JLIGFuZCBuYS1FU1JEIGFyZSBtdXR1YWxseSBleGNsdXNpdmUKKy0tCistLSBleGNlcHRpb24gaGFuZGxpbmcKKy0tIHJlY2VpcHQgb2YgYm90aCBuYS1FU1JLIGFuZCBuYS1FU1JEIHNoYWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYSByZXR1cm4gZXJyb3IKKworCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtTVMtRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLU1TLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxMmEwMgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLU1TLURhdGFUeXBlcy5hc24KQEAgLTAsMCArMSwyNzgwIEBACistLSAkSWQ6IE1BUC1NUy1EYXRhVHlwZXMuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpIAorLS0gMTcuNy4xCU1vYmlsZSBTZXJ2aWNlIGRhdGEgdHlwZXMKKworTUFQLU1TLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1NUy1EYXRhVHlwZXMgKDExKSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCisJLS0gbG9jYXRpb24gcmVnaXN0cmF0aW9uIHR5cGVzCisJVXBkYXRlTG9jYXRpb25BcmcsCisJVXBkYXRlTG9jYXRpb25SZXMsCisJQ2FuY2VsTG9jYXRpb25BcmcsCisJQ2FuY2VsTG9jYXRpb25SZXMsIAorCVB1cmdlTVMtQXJnLCAKKwlQdXJnZU1TLVJlcywKKwlTZW5kSWRlbnRpZmljYXRpb25BcmcsCisJU2VuZElkZW50aWZpY2F0aW9uUmVzLCAKKwlVcGRhdGVHcHJzTG9jYXRpb25BcmcsCisJVXBkYXRlR3Byc0xvY2F0aW9uUmVzLAorCUlTVC1TdXBwb3J0SW5kaWNhdG9yLCAKKwlTdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMsCisKKwktLSBncHJzIGxvY2F0aW9uIHJlZ2lzdHJhdGlvbiB0eXBlcworCUdTTi1BZGRyZXNzLAorCisJLS0gaGFuZG92ZXIgdHlwZXMKKwlGb3J3YXJkQWNjZXNzU2lnbmFsbGluZy1BcmcsCisJUHJlcGFyZUhPLUFyZywKKwlQcmVwYXJlSE8tUmVzLAorCVByZXBhcmVTdWJzZXF1ZW50SE8tQXJnLCAKKwlQcmVwYXJlU3Vic2VxdWVudEhPLVJlcywKKwlQcm9jZXNzQWNjZXNzU2lnbmFsbGluZy1BcmcsCisJU2VuZEVuZFNpZ25hbC1BcmcsCisJU2VuZEVuZFNpZ25hbC1SZXMsCisKKwktLSBhdXRoZW50aWNhdGlvbiBtYW5hZ2VtZW50IHR5cGVzCisJU2VuZEF1dGhlbnRpY2F0aW9uSW5mb0FyZywKKwlTZW5kQXV0aGVudGljYXRpb25JbmZvUmVzLCAKKwlBdXRoZW50aWNhdGlvbkZhaWx1cmVSZXBvcnRBcmcsCitBdXRoZW50aWNhdGlvbkZhaWx1cmVSZXBvcnRSZXMsCisKKwktLSBzZWN1cml0eSBtYW5hZ2VtZW50IHR5cGVzCisJS2MsIAorCUNrc24sCisKKwktLSBlcXVpcG1lbnQgbWFuYWdlbWVudCB0eXBlcworCUNoZWNrSU1FSS1BcmcsCisJQ2hlY2tJTUVJLVJlcywKKworCS0tIHN1YnNjcmliZXIgbWFuYWdlbWVudCB0eXBlcworCUluc2VydFN1YnNjcmliZXJEYXRhQXJnLAorCUluc2VydFN1YnNjcmliZXJEYXRhUmVzLCAKKwlMU0FJZGVudGl0eSwKKwlEZWxldGVTdWJzY3JpYmVyRGF0YUFyZywKKwlEZWxldGVTdWJzY3JpYmVyRGF0YVJlcywKKwlFeHQtUW9TLVN1YnNjcmliZWQsCisJRXh0Mi1Rb1MtU3Vic2NyaWJlZCwgCisJRXh0My1Rb1MtU3Vic2NyaWJlZCwKKwlTdWJzY3JpYmVyRGF0YSwKKwlPREItRGF0YSwKKwlTdWJzY3JpYmVyU3RhdHVzLAorCVpvbmVDb2RlTGlzdCwKKwltYXhOdW1PZlpvbmVDb2RlcywgCisJTy1DU0ksIAorRC1DU0ksCisJTy1CY3NtQ2FtZWxURFBDcml0ZXJpYUxpc3QsIAorCVQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0LAorCVNTLUNTSSwKKwlTZXJ2aWNlS2V5LAorCURlZmF1bHRDYWxsSGFuZGxpbmcsCisJQ2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcsCisJQmFzaWNTZXJ2aWNlQ3JpdGVyaWEsCisJU3VwcG9ydGVkQ2FtZWxQaGFzZXMsCisJT2ZmZXJlZENhbWVsNENTSXMsCisJT2ZmZXJlZENhbWVsNEZ1bmN0aW9uYWxpdGllcywKKwltYXhOdW1PZkNhbWVsVERQRGF0YSwKKwlDVUctSW5kZXgsIAorCUNVRy1JbmZvLAorCUNVRy1JbnRlcmxvY2ssCisJSW50ZXJDVUctUmVzdHJpY3Rpb25zLAorCUludHJhQ1VHLU9wdGlvbnMsCisJTm90aWZpY2F0aW9uVG9NU1VzZXIsIAorCVFvUy1TdWJzY3JpYmVkLAorSVNULUFsZXJ0VGltZXJWYWx1ZSwKKwlULUNTSSwKKwlULUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCitBUE4sCitBZGRpdGlvbmFsSW5mbywKKworCS0tIGZhdWx0IHJlY292ZXJ5IHR5cGVzCisJUmVzZXRBcmcsCisJUmVzdG9yZURhdGFBcmcsCisJUmVzdG9yZURhdGFSZXMsCisKKy0tIHByb3ZpZGUgc3Vic2NyaWJlciBpbmZvIHR5cGVzIAorR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sIAorTVMtQ2xhc3NtYXJrMiwKK0dQUlNNU0NsYXNzLAorCisJLS0gc3Vic2NyaWJlciBpbmZvcm1hdGlvbiBlbnF1aXJ5IHR5cGVzCisJUHJvdmlkZVN1YnNjcmliZXJJbmZvQXJnLAorCVByb3ZpZGVTdWJzY3JpYmVySW5mb1JlcywKKwlTdWJzY3JpYmVySW5mbywKKwlMb2NhdGlvbkluZm9ybWF0aW9uLAorCUxvY2F0aW9uSW5mb3JtYXRpb25HUFJTLAorCVJBSWRlbnRpdHksCisJU3Vic2NyaWJlclN0YXRlLAorCUdQUlNDaGFyZ2luZ0lELCAKK01OUEluZm9SZXMsCisJUm91dGVpbmdOdW1iZXIsCisKKwktLSBhbnkgdGltZSBpbmZvcm1hdGlvbiBlbnF1aXJ5IHR5cGVzCisJQW55VGltZUludGVycm9nYXRpb25BcmcsCisJQW55VGltZUludGVycm9nYXRpb25SZXMsCisKKwktLSBhbnkgdGltZSBpbmZvcm1hdGlvbiBoYW5kbGluZyB0eXBlcworCUFueVRpbWVTdWJzY3JpcHRpb25JbnRlcnJvZ2F0aW9uQXJnLAorCUFueVRpbWVTdWJzY3JpcHRpb25JbnRlcnJvZ2F0aW9uUmVzLAorCUFueVRpbWVNb2RpZmljYXRpb25BcmcsCisJQW55VGltZU1vZGlmaWNhdGlvblJlcywKKworCS0tIHN1YnNjcmliZXIgZGF0YSBtb2RpZmljYXRpb24gbm90aWZpY2F0aW9uIHR5cGVzCisJTm90ZVN1YnNjcmliZXJEYXRhTW9kaWZpZWRBcmcsCisJTm90ZVN1YnNjcmliZXJEYXRhTW9kaWZpZWRSZXMsCisKKwktLSBncHJzIGxvY2F0aW9uIGluZm9ybWF0aW9uIHJldHJpZXZhbCB0eXBlcworCVNlbmRSb3V0aW5nSW5mb0ZvckdwcnNBcmcsCisJU2VuZFJvdXRpbmdJbmZvRm9yR3Byc1JlcywKKworCS0tIGZhaWx1cmUgcmVwb3J0aW5nIHR5cGVzCisJRmFpbHVyZVJlcG9ydEFyZywKKwlGYWlsdXJlUmVwb3J0UmVzLAorCisJLS0gZ3BycyBub3RpZmljYXRpb24gdHlwZXMKKwlOb3RlTXNQcmVzZW50Rm9yR3Byc0FyZywKKwlOb3RlTXNQcmVzZW50Rm9yR3Byc1JlcywKKworCS0tIE1vYmlsaXR5IE1hbmFnZW1lbnQgdHlwZXMKK05vdGVNTS1FdmVudEFyZywKKwlOb3RlTU0tRXZlbnRSZXMsCisJTnVtYmVyUG9ydGFiaWxpdHlTdGF0dXMsCisJUGFnaW5nQXJlYSwKKworCS0tIFZHQ1MgLyBWQlMgdHlwZXMgdHlwZXMKK0dyb3VwSWQsIAorTG9uZy1Hcm91cElkLAorQWRkaXRpb25hbFN1YnNjcmlwdGlvbnMKKworOworCitJTVBPUlRTCisJbWF4TnVtT2ZTUywKKwlTUy1TdWJzY3JpcHRpb25PcHRpb24sCisJU1MtTGlzdCwKKwlTUy1Gb3JCUy1Db2RlLAorCVBhc3N3b3JkCitGUk9NIE1BUC1TUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtRGF0YVR5cGVzICgxNCkgdmVyc2lvbjExICgxMSl9CisKKwlTUy1Db2RlCitGUk9NIE1BUC1TUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLUNvZGUgKDE1KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dC1CZWFyZXJTZXJ2aWNlQ29kZQorRlJPTSBNQVAtQlMtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1CUy1Db2RlICgyMCkgdmVyc2lvbjExICgxMSl9CisKKwlFeHQtVGVsZXNlcnZpY2VDb2RlCitGUk9NIE1BUC1UUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVRTLUNvZGUgKDE5KSB2ZXJzaW9uMTEgKDExKX0KKworCUFkZHJlc3NTdHJpbmcsCitJU0ROLUFkZHJlc3NTdHJpbmcsIAorCUlTRE4tU3ViYWRkcmVzc1N0cmluZywgCisJRlROLUFkZHJlc3NTdHJpbmcsCisJQWNjZXNzTmV0d29ya1NpZ25hbEluZm8sCisJSU1TSSwgCisJSU1FSSwKKwlUTVNJLAorCUhMUi1MaXN0LAorCUxNU0ksCisJSWRlbnRpdHksCisJR2xvYmFsQ2VsbElkLAorCUNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJLAorCUV4dC1CYXNpY1NlcnZpY2VDb2RlLAorCU5BRUEtUHJlZmVycmVkQ0ksCisJRU1MUFAtSW5mbywgCisJTUMtU1MtSW5mbywKKwlTdWJzY3JpYmVySWRlbnRpdHksCisJQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uLAorCUxDU0NsaWVudEV4dGVybmFsSUQsCisJTENTQ2xpZW50SW50ZXJuYWxJRCwKKwlFeHQtU1MtU3RhdHVzLAorCUxDU1NlcnZpY2VUeXBlSUQsCisJQVNDSS1DYWxsUmVmZXJlbmNlLAorCVRCQ0QtU1RSSU5HLAorCUxBSUZpeGVkTGVuZ3RoLAorCVBMTU4tSWQsCitFTUxQUC1Qcmlvcml0eQorRlJPTSBNQVAtQ29tbW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUNvbW1vbkRhdGFUeXBlcyAoMTgpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9CisKKwlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCitGUk9NIE1BUC1FUi1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRVItRGF0YVR5cGVzICgxNykgdmVyc2lvbjExICgxMSl9CisKKwlUcmFjZVByb3BhZ2F0aW9uTGlzdAorRlJPTSBNQVAtT00tRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLU9NLURhdGFUeXBlcyAoMTIpIHZlcnNpb24xMSAoMTEpfQorCis7CisKKy0tIGxvY2F0aW9uIHJlZ2lzdHJhdGlvbiB0eXBlcworCitVcGRhdGVMb2NhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCW1zYy1OdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZywKKwl2bHItTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlsbXNpCQkJWzEwXSBMTVNJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJdmxyLUNhcGFiaWxpdHkJWzZdIFZMUi1DYXBhYmlsaXR5CU9QVElPTkFMLAorCWluZm9ybVByZXZpb3VzTmV0d29ya0VudGl0eQlbMTFdCU5VTEwJCU9QVElPTkFMLAorCWNzLUxDUy1Ob3RTdXBwb3J0ZWRCeVVFCVsxMl0JTlVMTAkJT1BUSU9OQUwsCisJdi1nbWxjLUFkZHJlc3MJWzJdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWFkZC1pbmZvCQlbMTNdIEFERC1JbmZvCU9QVElPTkFMLAorCXBhZ2luZ0FyZWEJWzE0XSBQYWdpbmdBcmVhCU9QVElPTkFMLAorCXNraXBTdWJzY3JpYmVyRGF0YVVwZGF0ZQlbMTVdIE5VTEwJCU9QVElPTkFMIAorCS0tIFRoZSBza2lwU3Vic2NyaWJlckRhdGFVcGRhdGUgcGFyYW1ldGVyIGluIHRoZSBVcGRhdGVMb2NhdGlvbkFyZyBhbmQgdGhlIEFERC1JbmZvCisJLS0gc3RydWN0dXJlcyBjYXJyeSB0aGUgc2FtZSBzZW1hbnRpYy4KKwkgfQorCitWTFItQ2FwYWJpbGl0eSA6Oj0gU0VRVUVOQ0V7CisJc3VwcG9ydGVkQ2FtZWxQaGFzZXMgIAlbMF0gU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXNvbHNhU3VwcG9ydEluZGljYXRvcglbMl0gTlVMTAkJT1BUSU9OQUwsCisJaXN0U3VwcG9ydEluZGljYXRvcglbMV0gSVNULVN1cHBvcnRJbmRpY2F0b3IJT1BUSU9OQUwsCisJc3VwZXJDaGFyZ2VyU3VwcG9ydGVkSW5TZXJ2aW5nTmV0d29ya0VudGl0eQlbM10gU3VwZXJDaGFyZ2VySW5mbwlPUFRJT05BTCwKKwlsb25nRlROLVN1cHBvcnRlZAlbNF0JTlVMTAkJT1BUSU9OQUwsCisJc3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCVs1XQlTdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMJT1BUSU9OQUwsCisJb2ZmZXJlZENhbWVsNENTSXMJWzZdIE9mZmVyZWRDYW1lbDRDU0lzCU9QVElPTkFMLAorCXN1cHBvcnRlZFJBVC1UeXBlc0luZGljYXRvcglbN10JU3VwcG9ydGVkUkFULVR5cGVzCU9QVElPTkFMLAorCWxvbmdHcm91cElELVN1cHBvcnRlZAlbOF0JTlVMTAkJT1BUSU9OQUwgfQorCitTdXBwb3J0ZWRSQVQtVHlwZXM6Oj0gQklUIFNUUklORyB7CisJdXRyYW4gICgwKSwKKwlnZXJhbiAgKDEpLAorCWdhbiAgICAoMiksCisJaS1oc3BhLWV2b2x1dGlvbiAoMyksCisJZS11dHJhbgkoNCl9IChTSVpFICgyLi44KSkKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6IGJpdHMgNSB0byA3IHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kCisJIAorCisKK1N1cGVyQ2hhcmdlckluZm8gOjo9IENIT0lDRSB7CisJc2VuZFN1YnNjcmliZXJEYXRhCVswXSBOVUxMLAorCXN1YnNjcmliZXJEYXRhU3RvcmVkCVsxXSBBZ2VJbmRpY2F0b3IgfQorCitBZ2VJbmRpY2F0b3IgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNikpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBvZiB0aGlzIHBhcmFtZXRlciBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy4KKworSVNULVN1cHBvcnRJbmRpY2F0b3IgOjo9ICBFTlVNRVJBVEVEIHsKKwliYXNpY0lTVFN1cHBvcnRlZAkoMCksCisJaXN0Q29tbWFuZFN1cHBvcnRlZAkoMSksCisJLi4ufQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyA+IDEgc2hhbGwgYmUgbWFwcGVkIHRvICcgaXN0Q29tbWFuZFN1cHBvcnRlZCAnCisKK1N1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cyA6Oj0gQklUIFNUUklORyB7CisJbGNzQ2FwYWJpbGl0eVNldDEgKDApLAorCWxjc0NhcGFiaWxpdHlTZXQyICgxKSwKKwlsY3NDYXBhYmlsaXR5U2V0MyAoMiksCisJbGNzQ2FwYWJpbGl0eVNldDQgKDMpICwKKwlsY3NDYXBhYmlsaXR5U2V0NSAoNCkgfSAoU0laRSAoMi4uMTYpKSAKKy0tIENvcmUgbmV0d29yayBzaWduYWxsaW5nIGNhcGFiaWxpdHkgc2V0MSBpbmRpY2F0ZXMgTENTIFJlbGVhc2U5OCBvciBSZWxlYXNlOTkgdmVyc2lvbi4KKy0tIENvcmUgbmV0d29yayBzaWduYWxsaW5nIGNhcGFiaWxpdHkgc2V0MiBpbmRpY2F0ZXMgTENTIFJlbGVhc2U0LgorLS0gQ29yZSBuZXR3b3JrIHNpZ25hbGxpbmcgY2FwYWJpbGl0eSBzZXQzIGluZGljYXRlcyBMQ1MgUmVsZWFzZTUuCistLSBDb3JlIG5ldHdvcmsgc2lnbmFsbGluZyBjYXBhYmlsaXR5IHNldDQgaW5kaWNhdGVzIExDUyBSZWxlYXNlNi4KKy0tIENvcmUgbmV0d29yayBzaWduYWxsaW5nIGNhcGFiaWxpdHkgc2V0NSBpbmRpY2F0ZXMgTENTIFJlbGVhc2U3IG9yIGxhdGVyIHZlcnNpb24uCistLSBBIG5vZGUgc2hhbGwgbWFyayBpbiB0aGUgQklUIFNUUklORyBhbGwgTENTIGNhcGFiaWxpdHkgc2V0cyBpdCBzdXBwb3J0cy4gCistLSBJZiBubyBiaXQgaXMgc2V0IHRoZW4gdGhlIHNlbmRpbmcgbm9kZSBkb2VzIG5vdCBzdXBwb3J0IExDUy4KKy0tIElmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHNlbnQgYnkgYW4gVkxSIHRoZW4gdGhlIFZMUiBtYXkgc3VwcG9ydCBhdCBtb3N0IGNhcGFiaWxpdHkgc2V0MS4KKy0tIElmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHNlbnQgYnkgYW4gU0dTTiB0aGVuIG5vIHN1cHBvcnQgZm9yIExDUyBpcyBhc3N1bWVkLgorLS0gQW4gU0dTTiBpcyBub3QgYWxsb3dlZCB0byBpbmRpY2F0ZSBzdXBwb3J0IG9mIGNhcGFiaWxpdHkgc2V0MS4KKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitVcGRhdGVMb2NhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCWhsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZC1DYXBhYmlsaXR5CU5VTEwJCQlPUFRJT05BTCwKKwlwYWdpbmdBcmVhLUNhcGFiaWxpdHkJWzBdTlVMTAkJCU9QVElPTkFMIH0KKworQURELUluZm8gOjo9IFNFUVVFTkNFIHsKKwlpbWVpc3YJCVswXSBJTUVJLAorCXNraXBTdWJzY3JpYmVyRGF0YVVwZGF0ZQlbMV0gTlVMTAkJT1BUSU9OQUwsCisJLS0gVGhlIHNraXBTdWJzY3JpYmVyRGF0YVVwZGF0ZSBwYXJhbWV0ZXIgaW4gdGhlIFVwZGF0ZUxvY2F0aW9uQXJnIGFuZCB0aGUgQURELUluZm8KKwktLSBzdHJ1Y3R1cmVzIGNhcnJ5IHRoZSBzYW1lIHNlbWFudGljLgorCS4uLn0KKworCitQYWdpbmdBcmVhIDo6PSBTRVFVRU5DRSBTSVpFICgxLi41KSBPRiBMb2NhdGlvbkFyZWEgCisKKworTG9jYXRpb25BcmVhIDo6PSBDSE9JQ0UgeworCWxhaUZpeGVkTGVuZ3RoCVswXSBMQUlGaXhlZExlbmd0aCwKKwlsYWMJCQlbMV0gTEFDfQorCisKK0xBQyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyKSkKKwktLSBSZWZlcnMgdG8gTG9jYXRpb24gQXJlYSBDb2RlIG9mIHRoZSBMb2NhdGlvbiBBcmVhIElkZW50aWZpY2F0aW9uIGRlZmluZWQgaW4gCisgICAgIC0tIDNHUFAgVFMgMjMuMDAzIFsxN10uCisJLS0gTG9jYXRpb24gQXJlYSBDb2RlIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdCisKK0NhbmNlbExvY2F0aW9uQXJnIDo6PSBbM10gU0VRVUVOQ0UgeworCWlkZW50aXR5CQlJZGVudGl0eSwKKwljYW5jZWxsYXRpb25UeXBlCUNhbmNlbGxhdGlvblR5cGUJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJdHlwZU9mVXBkYXRlCVswXSBUeXBlT2ZVcGRhdGUJT1BUSU9OQUwgfQorCitUeXBlT2ZVcGRhdGUgOjo9IEVOVU1FUkFURUQgeworCXNnc24tY2hhbmdlICgwKSwKKwltbWUtY2hhbmdlICgxKSwKKwkuLi59CisJLS0gVHlwZU9mVXBkYXRlIHNoYWxsIGJlIGFic2VudCBpZiBDYW5jZWxsYXRpb25UeXBlIGlzIGRpZmZlcmVudCBmcm9tIHVwZGF0ZVByb2NlZHVyZQorCitDYW5jZWxsYXRpb25UeXBlIDo6PSBFTlVNRVJBVEVEIHsKKwl1cGRhdGVQcm9jZWR1cmUJKDApLAorCXN1YnNjcmlwdGlvbldpdGhkcmF3CSgxKSwKKwkuLi59CisJLS0gVGhlIEhMUiBzaGFsbCBub3Qgc2VuZCB2YWx1ZXMgb3RoZXIgdGhhbiBsaXN0ZWQgYWJvdmUKKworQ2FuY2VsTG9jYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUHVyZ2VNUy1BcmcgOjo9IFszXSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJdmxyLU51bWJlcglbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCXNnc24tTnVtYmVyCVsxXQlJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1B1cmdlTVMtUmVzIDo6PSBTRVFVRU5DRSB7CisJZnJlZXplVE1TSQlbMF0JTlVMTAkJT1BUSU9OQUwsCisJZnJlZXplUC1UTVNJCVsxXQlOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlmcmVlemVNLVRNU0kJWzJdCU5VTEwJCU9QVElPTkFMIH0KKworU2VuZElkZW50aWZpY2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7CisJdG1zaQkJCVRNU0ksCisJbnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzCU51bWJlck9mUmVxdWVzdGVkVmVjdG9ycyAJT1BUSU9OQUwsCisJLS0gd2l0aGluIGEgZGlhbG9ndWUgbnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzIHNoYWxsIGJlIHByZXNlbnQgaW4gCisJLS0gdGhlIGZpcnN0IHNlcnZpY2UgcmVxdWVzdCBhbmQgc2hhbGwgbm90IGJlIHByZXNlbnQgaW4gc3Vic2VxdWVudCBzZXJ2aWNlIHJlcXVlc3RzLiAKKwktLSBJZiByZWNlaXZlZCBpbiBhIHN1YnNlcXVlbnQgc2VydmljZSByZXF1ZXN0IGl0IHNoYWxsIGJlIGRpc2NhcmRlZC4gCisJc2VnbWVudGF0aW9uUHJvaGliaXRlZAlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJbXNjLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcgCU9QVElPTkFMLAorCXByZXZpb3VzLUxBSQlbMF0gTEFJRml4ZWRMZW5ndGgJT1BUSU9OQUwsCisJaG9wQ291bnRlcglbMV0gSG9wQ291bnRlcglPUFRJT05BTCB9CisKK0hvcENvdW50ZXIgOjo9IElOVEVHRVIgKDAuLjMpCisKK1NlbmRJZGVudGlmaWNhdGlvblJlcyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSQkJCU9QVElPTkFMLAorCS0tIElNU0kgc2hhbGwgYmUgcHJlc2VudCBpbiB0aGUgZmlyc3QgKG9yIG9ubHkpIHNlcnZpY2UgcmVzcG9uc2Ugb2YgYSBkaWFsb2d1ZS4KKwktLSBJZiBtdWx0aXBsZSBzZXJ2aWNlIHJlcXVlc3RzIGFyZSBwcmVzZW50IGluIGEgZGlhbG9ndWUgdGhlbiBJTVNJCisJLS0gc2hhbGwgbm90IGJlIHByZXNlbnQgaW4gYW55IHNlcnZpY2UgcmVzcG9uc2Ugb3RoZXIgdGhhbiB0aGUgZmlyc3Qgb25lLgorCWF1dGhlbnRpY2F0aW9uU2V0TGlzdAlBdXRoZW50aWNhdGlvblNldExpc3QJT1BUSU9OQUwsCisJY3VycmVudFNlY3VyaXR5Q29udGV4dAlbMl1DdXJyZW50U2VjdXJpdHlDb250ZXh0CU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gYXV0aGVudGljYXRpb24gbWFuYWdlbWVudCB0eXBlcworCitBdXRoZW50aWNhdGlvblNldExpc3QgOjo9IENIT0lDRSB7CisJdHJpcGxldExpc3QJWzBdIFRyaXBsZXRMaXN0LAorCXF1aW50dXBsZXRMaXN0CVsxXSBRdWludHVwbGV0TGlzdCB9CisKK1RyaXBsZXRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi41KSBPRgorCQkJCUF1dGhlbnRpY2F0aW9uVHJpcGxldAorCitRdWludHVwbGV0TGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uNSkgT0YKKwkJCQlBdXRoZW50aWNhdGlvblF1aW50dXBsZXQKKworQXV0aGVudGljYXRpb25UcmlwbGV0IDo6PSBTRVFVRU5DRSB7CisJcmFuZAkJCVJBTkQsCisJc3JlcwkJCVNSRVMsCisJa2MJCQlLYywKKwkuLi59CisKK0F1dGhlbnRpY2F0aW9uUXVpbnR1cGxldCA6Oj0gU0VRVUVOQ0UgeworCXJhbmQJCQlSQU5ELAorCXhyZXMJCQlYUkVTLAorCWNrCQkJQ0ssCisJaWsJCQlJSywKKwlhdXRuCQkJQVVUTiwKKwkuLi59CisKK0N1cnJlbnRTZWN1cml0eUNvbnRleHQgOjo9IENIT0lDRSB7CisJZ3NtLVNlY3VyaXR5Q29udGV4dERhdGEJWzBdIEdTTS1TZWN1cml0eUNvbnRleHREYXRhLAorCXVtdHMtU2VjdXJpdHlDb250ZXh0RGF0YQlbMV0gVU1UUy1TZWN1cml0eUNvbnRleHREYXRhIH0KKworR1NNLVNlY3VyaXR5Q29udGV4dERhdGEgOjo9IFNFUVVFTkNFIHsKKwlrYwkJCUtjLAorCWNrc24JCQlDa3NuLAorCS4uLiB9CisKK1VNVFMtU2VjdXJpdHlDb250ZXh0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWNrCQkJQ0ssCisJaWsJCQlJSywKKwlrc2kJCQlLU0ksCisJLi4uIH0KKworUkFORCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCisKK1NSRVMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCisKK0tjIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDgpKQorCitYUkVTIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDQuLjE2KSkKKworQ0sgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTYpKQorCitJSyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCisKK0FVVE4gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTYpKQorCitBVVRTIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE0KSkKKworQ2tzbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gM0dQUCBUUyAyNC4wMDgKKworS1NJIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI0LjAwOAorCitBdXRoZW50aWNhdGlvbkZhaWx1cmVSZXBvcnRBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSSwKKwlmYWlsdXJlQ2F1c2UJRmFpbHVyZUNhdXNlLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlyZS1hdHRlbXB0CUJPT0xFQU4JCU9QVElPTkFMLAorCWFjY2Vzc1R5cGUJQWNjZXNzVHlwZQlPUFRJT05BTCwKKwlyYW5kCQkJUkFORAkJCU9QVElPTkFMLAorCXZsci1OdW1iZXIJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlzZ3NuLU51bWJlcglbMV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMIH0KKworQWNjZXNzVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJY2FsbCAoMCksCisJZW1lcmdlbmN5Q2FsbCAoMSksCisJbG9jYXRpb25VcGRhdGluZyAoMiksCisJc3VwcGxlbWVudGFyeVNlcnZpY2UgKDMpLAorCXNob3J0TWVzc2FnZSAoNCksCisJZ3Byc0F0dGFjaCAoNSksCisJcm91dGluZ0FyZWFVcGRhdGluZyAoNiksCisJc2VydmljZVJlcXVlc3QgKDcpLAorCXBkcENvbnRleHRBY3RpdmF0aW9uICg4KSwKKwlwZHBDb250ZXh0RGVhY3RpdmF0aW9uICg5KSwKKwkuLi4sCisJZ3Byc0RldGFjaCAoMTApfQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSByZWNlaXZlZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEwIHNoYWxsIGJlIGlnbm9yZWQuCisKK0F1dGhlbnRpY2F0aW9uRmFpbHVyZVJlcG9ydFJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitGYWlsdXJlQ2F1c2UgOjo9IEVOVU1FUkFURUQgeworCXdyb25nVXNlclJlc3BvbnNlICAoMCksCisJd3JvbmdOZXR3b3JrU2lnbmF0dXJlICAoMSl9CisKKy0tIGdwcnMgbG9jYXRpb24gcmVnaXN0cmF0aW9uIHR5cGVzCisKK1VwZGF0ZUdwcnNMb2NhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCXNnc24tTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywJCisJc2dzbi1BZGRyZXNzCUdTTi1BZGRyZXNzLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlzZ3NuLUNhcGFiaWxpdHkJWzBdIFNHU04tQ2FwYWJpbGl0eQlPUFRJT05BTCwKKwlpbmZvcm1QcmV2aW91c05ldHdvcmtFbnRpdHkJWzFdCU5VTEwJCU9QVElPTkFMLAorCXBzLUxDUy1Ob3RTdXBwb3J0ZWRCeVVFCVsyXQlOVUxMCQlPUFRJT05BTCwKKwl2LWdtbGMtQWRkcmVzcwlbM10JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJYWRkLWluZm8JCVs0XSAgQURELUluZm8JT1BUSU9OQUwsCisJZXBzLWluZm8JCVs1XQlFUFMtSW5mbwlPUFRJT05BTCwKKwlzZXJ2aW5nTm9kZVR5cGVJbmRpY2F0b3IJWzZdCU5VTEwJCU9QVElPTkFMLAorCXNraXBTdWJzY3JpYmVyRGF0YVVwZGF0ZQlbN10gTlVMTAkJT1BUSU9OQUwsCisJdXNlZFJBVC1UeXBlCVs4XSBVc2VkLVJBVC1UeXBlCU9QVElPTkFMIAorCSB9CisKK1VzZWQtUkFULVR5cGU6Oj0gRU5VTUVSQVRFRCB7CisJdXRyYW4gICgwKSwKKwlnZXJhbiAgKDEpLAorCWdhbiAgICAoMiksCisJaS1oc3BhLWV2b2x1dGlvbiAoMyksCisJZS11dHJhbgkoNCksCisJLi4ufQorCitFUFMtSW5mbyA6Oj0gQ0hPSUNFeworCXBkbi1ndy11cGRhdGUJWzBdIFBETi1HVy1VcGRhdGUsCisJaXNyLUluZm9ybWF0aW9uCVsxXSBJU1ItSW5mb3JtYXRpb24gfQorCitQRE4tR1ctVXBkYXRlIDo6PSBTRVFVRU5DRXsKKwlhcG4JCQlbMF0gQVBOCQlPUFRJT05BTCwKKwlwZG4tZ3ctSWRlbnRpdHkJWzFdIFBETi1HVy1JZGVudGl0eQlPUFRJT05BTCwKKwljb250ZXh0SWQJCVsyXSBDb250ZXh0SWQgICAgICAgICAgICAgICAgICAgICBPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitJU1ItSW5mb3JtYXRpb246Oj0gQklUIFNUUklORyB7CisJdXBkYXRlTU1FICAoMCksCisJY2FuY2VsU0dTTiAgKDEpfSAoU0laRSAoMi4uOCkpCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiByZWNlcHRpb24gb2YgdW5rbm93biBiaXQgYXNzaWdubWVudHMgaW4gdGhlCisJLS0gSVNSLUluZm9ybWF0aW9uIGRhdGEgdHlwZSBzaGFsbCBiZSBkaXNjYXJkZWQgYnkgdGhlIHJlY2VpdmVyIAorCitTR1NOLUNhcGFiaWxpdHkgOjo9IFNFUVVFTkNFeworCXNvbHNhU3VwcG9ydEluZGljYXRvcglOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlzdXBlckNoYXJnZXJTdXBwb3J0ZWRJblNlcnZpbmdOZXR3b3JrRW50aXR5CVsyXSBTdXBlckNoYXJnZXJJbmZvCU9QVElPTkFMICwKKwlncHJzRW5oYW5jZW1lbnRzU3VwcG9ydEluZGljYXRvciAJWzNdIE5VTEwJCU9QVElPTkFMLAorCXN1cHBvcnRlZENhbWVsUGhhc2VzICAJWzRdIFN1cHBvcnRlZENhbWVsUGhhc2VzCU9QVElPTkFMLAorCXN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlbNV0gIFN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlPUFRJT05BTCwKKwlvZmZlcmVkQ2FtZWw0Q1NJcwlbNl0gT2ZmZXJlZENhbWVsNENTSXMJT1BUSU9OQUwsCisJc21zQ2FsbEJhcnJpbmdTdXBwb3J0SW5kaWNhdG9yCVs3XQlOVUxMCQlPUFRJT05BTCwJc3VwcG9ydGVkUkFULVR5cGVzSW5kaWNhdG9yCVs4XQlTdXBwb3J0ZWRSQVQtVHlwZXMJT1BUSU9OQUwsCisJc3VwcG9ydGVkRmVhdHVyZXMJWzldIFN1cHBvcnRlZEZlYXR1cmVzCU9QVElPTkFMIH0KKworU3VwcG9ydGVkRmVhdHVyZXM6Oj0gQklUIFNUUklORyB7CisJb2RiLWFsbCAoMCksCisJb2RiLUhQTE1OLUFQTiAoMSksCisJb2RiLVZQTE1OLUFQTiAoMiksCisJcmVnU3ViICgzKX0gKFNJWkUgKDQuLjgpKQorCitHU04tQWRkcmVzcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg1Li4xNykpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XQorCitVcGRhdGVHcHJzTG9jYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKKwlobHItTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGQtQ2FwYWJpbGl0eQlOVUxMCQkJT1BUSU9OQUwsCisJc2dzbi1tbWVTZXBhcmF0aW9uU3VwcG9ydGVkCVswXSBOVUxMCQlPUFRJT05BTCB9CisKKy0tIGhhbmRvdmVyIHR5cGVzCisKK0ZvcndhcmRBY2Nlc3NTaWduYWxsaW5nLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlhbi1BUERVCQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlpbnRlZ3JpdHlQcm90ZWN0aW9uSW5mbwlbMF0gSW50ZWdyaXR5UHJvdGVjdGlvbkluZm9ybWF0aW9uCQlPUFRJT05BTCwKKwllbmNyeXB0aW9uSW5mbwlbMV0gRW5jcnlwdGlvbkluZm9ybWF0aW9uCQlPUFRJT05BTCwKKwlrZXlTdGF0dXMJCVsyXQlLZXlTdGF0dXMJT1BUSU9OQUwsCisJYWxsb3dlZEdTTS1BbGdvcml0aG1zCVs0XQlBbGxvd2VkR1NNLUFsZ29yaXRobXMJT1BUSU9OQUwsCisJYWxsb3dlZFVNVFMtQWxnb3JpdGhtcwlbNV0JQWxsb3dlZFVNVFMtQWxnb3JpdGhtcwlPUFRJT05BTCwKKwlyYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JWzZdIFJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4uLAorCXJhZGlvUmVzb3VyY2VMaXN0CVs3XQlSYWRpb1Jlc291cmNlTGlzdAlPUFRJT05BTCwKKwlic3NtYXAtU2VydmljZUhhbmRvdmVyCVs5XQlCU1NNQVAtU2VydmljZUhhbmRvdmVyCU9QVElPTkFMLAorCXJhbmFwLVNlcnZpY2VIYW5kb3ZlcglbOF0JUkFOQVAtU2VydmljZUhhbmRvdmVyCU9QVElPTkFMLAorCWJzc21hcC1TZXJ2aWNlSGFuZG92ZXJMaXN0CVsxMF0JQlNTTUFQLVNlcnZpY2VIYW5kb3Zlckxpc3QJT1BUSU9OQUwsCisJY3VycmVudGx5VXNlZENvZGVjCVsxMV0gQ29kZWMJT1BUSU9OQUwsCisJaXVTdXBwb3J0ZWRDb2RlY3NMaXN0CVsxMl0gU3VwcG9ydGVkQ29kZWNzTGlzdAlPUFRJT05BTCwKKwlyYWItQ29uZmlndXJhdGlvbkluZGljYXRvcglbMTNdIE5VTEwJCU9QVElPTkFMLAorCWl1U2VsZWN0ZWRDb2RlYwlbMTRdCUNvZGVjCU9QVElPTkFMLAorCWFsdGVybmF0aXZlQ2hhbm5lbFR5cGUJWzE1XQlSYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJdHJhY2VQcm9wYWdhdGlvbkxpc3QJWzE3XQlUcmFjZVByb3BhZ2F0aW9uTGlzdAlPUFRJT05BTCB9CisKK0FsbG93ZWRHU00tQWxnb3JpdGhtcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgY29kZWQgYXMgQWxnb3JpdGhtIGlkZW50aWZpZXIgb2N0ZXQgZnJvbQorCS0tIFBlcm1pdHRlZCBBbGdvcml0aG1zIGRlZmluZWQgaW4gM0dQUCBUUyA0OC4wMDgKKwktLSBBIG5vZGUgc2hhbGwgbWFyayBhbGwgR1NNIGFsZ29yaXRobXMgdGhhdCBhcmUgYWxsb3dlZCBpbiBNU0MtQgorCitBbGxvd2VkVU1UUy1BbGdvcml0aG1zIDo6PSBTRVFVRU5DRSB7CisJaW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXMJWzBdIAlQZXJtaXR0ZWRJbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtcwlPUFRJT05BTCwKKwllbmNyeXB0aW9uQWxnb3JpdGhtcwlbMV0gCVBlcm1pdHRlZEVuY3J5cHRpb25BbGdvcml0aG1zCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1Blcm1pdHRlZEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG1zIDo6PQorCQlPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heFBlcm1pdHRlZEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG1zTGVuZ3RoKSkKKwktLSBPY3RldHMgY29udGFpbiBhIGNvbXBsZXRlIFBlcm1pdHRlZEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG1zIGRhdGEgdHlwZSAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLCBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgZW5jb2Rpbmcgc2NoZW1lIAorCS0tIG1hbmRhdGVkIGJ5IDNHUFAgVFMgMjUuNDEzLiAKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkLCBpZiBuZWVkZWQsIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSAKKwktLSBsYXN0IG9jdGV0IG9mIHRoZSBvY3RldCBzdHJpbmcuIAorCisKK21heFBlcm1pdHRlZEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG1zTGVuZ3RoIElOVEVHRVIgOjo9IDkKKworUGVybWl0dGVkRW5jcnlwdGlvbkFsZ29yaXRobXMgOjo9CisJCU9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4UGVybWl0dGVkRW5jcnlwdGlvbkFsZ29yaXRobXNMZW5ndGgpKQorCS0tIE9jdGV0cyBjb250YWluIGEgY29tcGxldGUgUGVybWl0dGVkRW5jcnlwdGlvbkFsZ29yaXRobXMgZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkLCBpZiBuZWVkZWQsIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSAKKwktLSBsYXN0IG9jdGV0IG9mIHRoZSBvY3RldCBzdHJpbmcuIAorCisKK21heFBlcm1pdHRlZEVuY3J5cHRpb25BbGdvcml0aG1zTGVuZ3RoIElOVEVHRVIgOjo9IDkKKworS2V5U3RhdHVzIDo6PSBFTlVNRVJBVEVEIHsKKwlvbGQgICgwKSwKKwluZXcgICgxKSwKKwkuLi59CisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIHJlY2VpdmVkIHZhbHVlcyBpbiByYW5nZSAyLTMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgIm9sZCIKKwktLSByZWNlaXZlZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgIm5ldyIKKworUHJlcGFyZUhPLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwl0YXJnZXRDZWxsSWQJWzBdIEdsb2JhbENlbGxJZAlPUFRJT05BTCwKKwloby1OdW1iZXJOb3RSZXF1aXJlZAlOVUxMCQkJT1BUSU9OQUwsIAorCXRhcmdldFJOQ0lkCVsxXSBSTkNJZAkJT1BUSU9OQUwsCisJYW4tQVBEVQkJWzJdIEFjY2Vzc05ldHdvcmtTaWduYWxJbmZvCU9QVElPTkFMLAorCW11bHRpcGxlQmVhcmVyUmVxdWVzdGVkCVszXSBOVUxMCQlPUFRJT05BTCwKKwlpbXNpCQkJWzRdIElNU0kJCU9QVElPTkFMLAorCWludGVncml0eVByb3RlY3Rpb25JbmZvCVs1XSBJbnRlZ3JpdHlQcm90ZWN0aW9uSW5mb3JtYXRpb24JCU9QVElPTkFMLAorCWVuY3J5cHRpb25JbmZvCVs2XSBFbmNyeXB0aW9uSW5mb3JtYXRpb24JCU9QVElPTkFMLAorCXJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglbN10gUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCU9QVElPTkFMLAorCWFsbG93ZWRHU00tQWxnb3JpdGhtcwlbOV0JQWxsb3dlZEdTTS1BbGdvcml0aG1zCU9QVElPTkFMLAorCWFsbG93ZWRVTVRTLUFsZ29yaXRobXMJWzEwXQlBbGxvd2VkVU1UUy1BbGdvcml0aG1zCU9QVElPTkFMLAorCXJhZGlvUmVzb3VyY2VMaXN0CVsxMV0gUmFkaW9SZXNvdXJjZUxpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs4XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlyYWItSWQJCVsxMl0gUkFCLUlkCU9QVElPTkFMLAorCWJzc21hcC1TZXJ2aWNlSGFuZG92ZXIJWzEzXQlCU1NNQVAtU2VydmljZUhhbmRvdmVyCU9QVElPTkFMLAorCXJhbmFwLVNlcnZpY2VIYW5kb3ZlcglbMTRdCVJBTkFQLVNlcnZpY2VIYW5kb3ZlcglPUFRJT05BTCwgCisJYnNzbWFwLVNlcnZpY2VIYW5kb3Zlckxpc3QJWzE1XQlCU1NNQVAtU2VydmljZUhhbmRvdmVyTGlzdAlPUFRJT05BTCwKKwlhc2NpQ2FsbFJlZmVyZW5jZQlbMjBdCUFTQ0ktQ2FsbFJlZmVyZW5jZQlPUFRJT05BTCwKKwlnZXJhbi1jbGFzc21hcmsJWzE2XSBHRVJBTi1DbGFzc21hcmsJT1BUSU9OQUwsCisJaXVDdXJyZW50bHlVc2VkQ29kZWMJWzE3XSBDb2RlYwlPUFRJT05BTCwKKwlpdVN1cHBvcnRlZENvZGVjc0xpc3QJWzE4XSBTdXBwb3J0ZWRDb2RlY3NMaXN0CU9QVElPTkFMLAorCXJhYi1Db25maWd1cmF0aW9uSW5kaWNhdG9yCVsxOV0gTlVMTAkJT1BUSU9OQUwsCisJdWVzYmktSXUJCVsyMV0JVUVTQkktSXUJT1BUSU9OQUwsCisJaW1laXN2CQlbMjJdCUlNRUkJCU9QVElPTkFMLAorCWFsdGVybmF0aXZlQ2hhbm5lbFR5cGUJWzIzXQlSYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJdHJhY2VQcm9wYWdhdGlvbkxpc3QJWzI1XQlUcmFjZVByb3BhZ2F0aW9uTGlzdAlPUFRJT05BTAkgfQorCitCU1NNQVAtU2VydmljZUhhbmRvdmVyTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uIG1heE51bU9mU2VydmljZUhhbmRvdmVycykgT0YKKwkJCQlCU1NNQVAtU2VydmljZUhhbmRvdmVySW5mbworCitCU1NNQVAtU2VydmljZUhhbmRvdmVySW5mbyA6Oj0gU0VRVUVOQ0UgeworCWJzc21hcC1TZXJ2aWNlSGFuZG92ZXIJQlNTTUFQLVNlcnZpY2VIYW5kb3ZlciwKKwlyYWItSWQJCVJBQi1JZCwKKwktLSBSQUIgSWRlbnRpdHkgaXMgbmVlZGVkIHRvIHJlbGF0ZSB0aGUgc2VydmljZSBoYW5kb3ZlcnMgd2l0aCB0aGUgcmFkaW8gYWNjZXNzIGJlYXJlcnMuIAorCS4uLn0KKworbWF4TnVtT2ZTZXJ2aWNlSGFuZG92ZXJzICBJTlRFR0VSIDo6PSA3CisKK0JTU01BUC1TZXJ2aWNlSGFuZG92ZXIgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdGhlIFNlcnZpY2UgSGFuZG92ZXIgaW5mb3JtYXRpb24gZWxlbWVudCBpbgorCS0tIDNHUFAgVFMgNDguMDA4LgorCitSQU5BUC1TZXJ2aWNlSGFuZG92ZXIgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXQgY29udGFpbnMgYSBjb21wbGV0ZSBTZXJ2aWNlLUhhbmRvdmVyIGRhdGEgdHlwZSAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLCBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgZW5jb2Rpbmcgc2NoZW1lIAorCS0tIG1hbmRhdGVkIGJ5IDNHUFAgVFMgMjUuNDEzCisJLS0gUGFkZGluZyBiaXRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cy4gCisKKworUmFkaW9SZXNvdXJjZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLiBtYXhOdW1PZlJhZGlvUmVzb3VyY2VzKSBPRgorCQkJCVJhZGlvUmVzb3VyY2UKKworUmFkaW9SZXNvdXJjZSA6Oj0gU0VRVUVOQ0UgeworCXJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglSYWRpb1Jlc291cmNlSW5mb3JtYXRpb24sCisJcmFiLUlkCQlSQUItSWQsCisJLS0gUkFCIElkZW50aXR5IGlzIG5lZWRlZCB0byByZWxhdGUgdGhlIHJhZGlvIHJlc291cmNlcyB3aXRoIHRoZSByYWRpbyBhY2Nlc3MgYmVhcmVycy4gCisJLi4ufQorCittYXhOdW1PZlJhZGlvUmVzb3VyY2VzICBJTlRFR0VSIDo6PSA3CisKK1ByZXBhcmVITy1SZXMgOjo9IFszXSBTRVFVRU5DRSB7CisJaGFuZG92ZXJOdW1iZXIJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlyZWxvY2F0aW9uTnVtYmVyTGlzdAlbMV0JUmVsb2NhdGlvbk51bWJlckxpc3QJT1BUSU9OQUwsCisJYW4tQVBEVQkJWzJdCUFjY2Vzc05ldHdvcmtTaWduYWxJbmZvCU9QVElPTkFMLAorCW11bHRpY2FsbEJlYXJlckluZm8JWzNdCU11bHRpY2FsbEJlYXJlckluZm8JT1BUSU9OQUwsCisJbXVsdGlwbGVCZWFyZXJOb3RTdXBwb3J0ZWQJTlVMTAkJCU9QVElPTkFMLAorCXNlbGVjdGVkVU1UUy1BbGdvcml0aG1zCVs1XQlTZWxlY3RlZFVNVFMtQWxnb3JpdGhtcwlPUFRJT05BTCwKKwljaG9zZW5SYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JWzZdIENob3NlblJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbgkgT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWl1U2VsZWN0ZWRDb2RlYwlbN10gQ29kZWMJCU9QVElPTkFMLAorCWl1QXZhaWxhYmxlQ29kZWNzTGlzdAlbOF0gQ29kZWNMaXN0CU9QVElPTkFMIH0KKworU2VsZWN0ZWRVTVRTLUFsZ29yaXRobXMgOjo9IFNFUVVFTkNFIHsKKwlpbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtCVswXSAJQ2hvc2VuSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobQlPUFRJT05BTCwKKwllbmNyeXB0aW9uQWxnb3JpdGhtCVsxXSAJQ2hvc2VuRW5jcnlwdGlvbkFsZ29yaXRobQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0Nob3NlbkludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG0gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXQgY29udGFpbnMgYSBjb21wbGV0ZSBJbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtIGRhdGEgdHlwZSAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLCBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgZW5jb2Rpbmcgc2NoZW1lIAorCS0tIG1hbmRhdGVkIGJ5IDNHUFAgVFMgMjUuNDEzCisJLS0gUGFkZGluZyBiaXRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cy4gCisKK0Nob3NlbkVuY3J5cHRpb25BbGdvcml0aG0gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXQgY29udGFpbnMgYSBjb21wbGV0ZSBFbmNyeXB0aW9uQWxnb3JpdGhtIGRhdGEgdHlwZSAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLCBlbmNvZGVkIGFjY29yZGluZyB0byB0aGUgZW5jb2Rpbmcgc2NoZW1lIAorCS0tIG1hbmRhdGVkIGJ5IDNHUFAgVFMgMjUuNDEzCisJLS0gUGFkZGluZyBiaXRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cy4gCisKK0Nob3NlblJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWNob3NlbkNoYW5uZWxJbmZvCVswXSBDaG9zZW5DaGFubmVsSW5mbwlPUFRJT05BTCwKKwljaG9zZW5TcGVlY2hWZXJzaW9uCVsxXSBDaG9zZW5TcGVlY2hWZXJzaW9uCU9QVElPTkFMLAorCS4uLn0KKworQ2hvc2VuQ2hhbm5lbEluZm8gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdGhlIENob3NlbiBDaGFubmVsIGluZm9ybWF0aW9uIGVsZW1lbnQgaW4gM0dQUCBUUyA0OC4wMDgKKworQ2hvc2VuU3BlZWNoVmVyc2lvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0aGUgU3BlZWNoIFZlcnNpb24gKGNob3NlbikgaW5mb3JtYXRpb24gZWxlbWVudCBpbiAzR1BQIFRTCisJLS0gNDguMDA4IAorCitQcmVwYXJlU3Vic2VxdWVudEhPLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwl0YXJnZXRDZWxsSWQJWzBdIEdsb2JhbENlbGxJZAlPUFRJT05BTCwKKwl0YXJnZXRNU0MtTnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJdGFyZ2V0Uk5DSWQJWzJdIFJOQ0lkCQlPUFRJT05BTCwKKwlhbi1BUERVCQlbM10JQWNjZXNzTmV0d29ya1NpZ25hbEluZm8JT1BUSU9OQUwsCisJc2VsZWN0ZWRSYWItSWQJWzRdCVJBQi1JZAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzVdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJZ2VyYW4tY2xhc3NtYXJrCVs2XSBHRVJBTi1DbGFzc21hcmsJT1BUSU9OQUwsCisJcmFiLUNvbmZpZ3VyYXRpb25JbmRpY2F0b3IJWzddIE5VTEwJCU9QVElPTkFMIH0KKworUHJlcGFyZVN1YnNlcXVlbnRITy1SZXMgOjo9IFszXSBTRVFVRU5DRSB7CisJYW4tQVBEVQkJQWNjZXNzTmV0d29ya1NpZ25hbEluZm8sCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitQcm9jZXNzQWNjZXNzU2lnbmFsbGluZy1BcmcgOjo9IFszXSBTRVFVRU5DRSB7CisJYW4tQVBEVQkJQWNjZXNzTmV0d29ya1NpZ25hbEluZm8sCisJc2VsZWN0ZWRVTVRTLUFsZ29yaXRobXMJWzFdCVNlbGVjdGVkVU1UUy1BbGdvcml0aG1zCU9QVElPTkFMLAorCXNlbGVjdGVkR1NNLUFsZ29yaXRobQlbMl0JU2VsZWN0ZWRHU00tQWxnb3JpdGhtCU9QVElPTkFMLAorCWNob3NlblJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglbM10gQ2hvc2VuUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uIE9QVElPTkFMLAorCXNlbGVjdGVkUmFiLUlkCVs0XSBSQUItSWQJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXQlFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLiwKKwlpVVNlbGVjdGVkQ29kZWMJWzVdIENvZGVjCQlPUFRJT05BTCwKKwlpdUF2YWlsYWJsZUNvZGVjc0xpc3QJWzZdIENvZGVjTGlzdAlPUFRJT05BTCB9CisKK1N1cHBvcnRlZENvZGVjc0xpc3QgOjo9IFNFUVVFTkNFIHsKKwl1dHJhbkNvZGVjTGlzdAlbMF0gQ29kZWNMaXN0CU9QVElPTkFMLAorCWdlcmFuQ29kZWNMaXN0CVsxXSBDb2RlY0xpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDb2RlY0xpc3QgOjo9IFNFUVVFTkNFIHsKKwljb2RlYzEJCVsxXSBDb2RlYywKKwljb2RlYzIJCVsyXSBDb2RlYwkJT1BUSU9OQUwsCisJY29kZWMzCQlbM10gQ29kZWMJCU9QVElPTkFMLAorCWNvZGVjNAkJWzRdIENvZGVjCQlPUFRJT05BTCwKKwljb2RlYzUJCVs1XSBDb2RlYwkJT1BUSU9OQUwsCisJY29kZWM2CQlbNl0gQ29kZWMJCU9QVElPTkFMLAorCWNvZGVjNwkJWzddIENvZGVjCQlPUFRJT05BTCwKKwljb2RlYzgJCVs4XSBDb2RlYwkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs5XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCS0tIENvZGVjcyBhcmUgc2VudCBpbiBwcmlvcml0eSBvcmRlciB3aGVyZSBjb2RlYzEgaGFzIGhpZ2hlc3QgcHJpb3JpdHkKKworQ29kZWMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNCkpCisKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLSBvY3RldCAxCUNvZGVkIGFzIENvZGVjIElkZW50aWZpY2F0aW9uIGNvZGUgaW4gM0dQUCBUUyAyNi4xMDMKKwktLSBvY3RldHMgMiwzLDQJUGFyYW1ldGVycyBmb3IgdGhlIENvZGVjIGFzIGRlZmluZWQgaW4gM0dQUCBUUworCS0tCQkJMjYuMTAzLCBpZiBhdmFpbGFibGUsIGxlbmd0aCBkZXBlbmRpbmcgb24gdGhlIGNvZGVjCisKK0dFUkFOLUNsYXNzbWFyayA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyLi44NykpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdGhlIEdFUkFOIENsYXNzbWFyayBpbmZvcm1hdGlvbiBlbGVtZW50IGluIDNHUFAgVFMgNDguMDA4CisKK1NlbGVjdGVkR1NNLUFsZ29yaXRobSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgY29kZWQgYXMgQWxnb3JpdGhtIGlkZW50aWZpZXIgb2N0ZXQgZnJvbSBDaG9zZW4gRW5jcnlwdGlvbgorCS0tIEFsZ29yaXRobSBkZWZpbmVkIGluIDNHUFAgVFMgNDguMDA4CisJLS0gQSBub2RlIHNoYWxsIG1hcmsgb25seSB0aGUgc2VsZWN0ZWQgR1NNIGFsZ29yaXRobQorCitTZW5kRW5kU2lnbmFsLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlhbi1BUERVCQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlleHRlbnNpb25Db250YWluZXIJWzBdCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4ufQorCitTZW5kRW5kU2lnbmFsLVJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0JRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi59CisKK1JOQ0lkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDcpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tIG9jdGV0IDEgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIENvdW50cnkgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldCAyIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDNyZCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgM3JkIGRpZ2l0CisJLS0JCQlvciBmaWxsZXIgKDExMTEpIGZvciAyIGRpZ2l0IE1OQ3MKKwktLSBvY3RldCAzIGJpdHMgNDMyMQlNb2JpbGUgTmV0d29yayBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXRzIDQgYW5kIDUJTG9jYXRpb24gQXJlYSBDb2RlIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOAorCS0tIG9jdGV0cyA2IGFuZCA3CVJOQyBJZCB2YWx1ZSBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNS40MTMKKworUmVsb2NhdGlvbk51bWJlckxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUmVsb2NhdGlvbk51bWJlcikgT0YKKwkJCQlSZWxvY2F0aW9uTnVtYmVyCisKK011bHRpY2FsbEJlYXJlckluZm8gOjo9IElOVEVHRVIgKDEuLm1heE51bU9mUmVsb2NhdGlvbk51bWJlcikKKworUmVsb2NhdGlvbk51bWJlciA6Oj0gU0VRVUVOQ0UgeworCWhhbmRvdmVyTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlyYWItSWQJCVJBQi1JZCwKKwktLSBSQUIgSWRlbnRpdHkgaXMgbmVlZGVkIHRvIHJlbGF0ZSB0aGUgY2FsbHMgd2l0aCB0aGUgcmFkaW8gYWNjZXNzIGJlYXJlcnMuIAorCS4uLn0KKworUkFCLUlkIDo6PSBJTlRFR0VSICgxLi5tYXhOck9mUkFCcykKKworbWF4TnJPZlJBQnMgSU5URUdFUiA6Oj0gMjU1CisKK21heE51bU9mUmVsb2NhdGlvbk51bWJlciAgSU5URUdFUiA6Oj0gNworCitSYWRpb1Jlc291cmNlSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMy4uMTMpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRoZSBDaGFubmVsIFR5cGUgaW5mb3JtYXRpb24gZWxlbWVudCBpbiAzR1BQIFRTIDQ4LjAwOAorCitJbnRlZ3JpdHlQcm90ZWN0aW9uSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTguLm1heE51bU9mSW50ZWdyaXR5SW5mbykpCisJLS0gT2N0ZXRzIGNvbnRhaW4gYSBjb21wbGV0ZSBJbnRlZ3JpdHlQcm90ZWN0aW9uSW5mb3JtYXRpb24gZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkLCBpZiBuZWVkZWQsIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSAKKwktLSBsYXN0IG9jdGV0IG9mIHRoZSBvY3RldCBzdHJpbmcuIAorCittYXhOdW1PZkludGVncml0eUluZm8gSU5URUdFUiA6Oj0gMTAwCisKK0VuY3J5cHRpb25JbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxOC4ubWF4TnVtT2ZFbmNyeXB0aW9uSW5mbykpCisJLS0gT2N0ZXRzIGNvbnRhaW4gYSBjb21wbGV0ZSBFbmNyeXB0aW9uSW5mb3JtYXRpb24gZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkLCBpZiBuZWVkZWQsIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSAKKwktLSBsYXN0IG9jdGV0IG9mIHRoZSBvY3RldCBzdHJpbmcuIAorCittYXhOdW1PZkVuY3J5cHRpb25JbmZvIElOVEVHRVIgOjo9IDEwMAorCistLSBhdXRoZW50aWNhdGlvbiBtYW5hZ2VtZW50IHR5cGVzCisKK1NlbmRBdXRoZW50aWNhdGlvbkluZm9BcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJWzBdIElNU0ksCisJbnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzCU51bWJlck9mUmVxdWVzdGVkVmVjdG9ycywKKwlzZWdtZW50YXRpb25Qcm9oaWJpdGVkCU5VTEwJCQlPUFRJT05BTCwKKwlpbW1lZGlhdGVSZXNwb25zZVByZWZlcnJlZAlbMV0gTlVMTAkJCU9QVElPTkFMLAorCXJlLXN5bmNocm9uaXNhdGlvbkluZm8JUmUtc3luY2hyb25pc2F0aW9uSW5mbwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJcmVxdWVzdGluZ05vZGVUeXBlCVszXSBSZXF1ZXN0aW5nTm9kZVR5cGUJT1BUSU9OQUwsCisJcmVxdWVzdGluZ1BMTU4tSWQJWzRdIFBMTU4tSWQJT1BUSU9OQUwsCisJbnVtYmVyT2ZSZXF1ZXN0ZWRBZGRpdGlvbmFsLVZlY3RvcnMJWzVdIE51bWJlck9mUmVxdWVzdGVkVmVjdG9ycwlPUFRJT05BTCwKKwlhZGRpdGlvbmFsVmVjdG9yc0FyZUZvckVQUwlbNl0gTlVMTAkJT1BUSU9OQUwgfQkKKworCitOdW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMgOjo9IElOVEVHRVIgKDEuLjUpCisKK1JlLXN5bmNocm9uaXNhdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlyYW5kCQkJUkFORCwKKwlhdXRzCQkJQVVUUywKKwkuLi59CisKK1NlbmRBdXRoZW50aWNhdGlvbkluZm9SZXMgOjo9IFszXSBTRVFVRU5DRSB7CisJYXV0aGVudGljYXRpb25TZXRMaXN0CUF1dGhlbnRpY2F0aW9uU2V0TGlzdCAJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJZXBzLUF1dGhlbnRpY2F0aW9uU2V0TGlzdAlbMl0gRVBTLUF1dGhlbnRpY2F0aW9uU2V0TGlzdAlPUFRJT05BTCB9CisKK0VQUy1BdXRoZW50aWNhdGlvblNldExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLjUpIE9GCisJCQkJRVBDLUFWCisKK0VQQy1BViA6Oj0gU0VRVUVOQ0UgeworCXJhbmQJCQlSQU5ELAorCXhyZXMJCQlYUkVTLAorCWF1dG4JCQlBVVROLAorCWthc21lCQlLQVNNRSwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworS0FTTUUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTYpKQorCitSZXF1ZXN0aW5nTm9kZVR5cGUgOjo9IEVOVU1FUkFURUQgeworCXZsciAgKDApLAorCXNnc24gICgxKSwKKwkuLi4sCisJcy1jc2NmICAoMiksCisJYnNmICAoMyksCisJZ2FuLWFhYS1zZXJ2ZXIgICg0KSwKKwl3bGFuLWFhYS1zZXJ2ZXIgICg1KSwKKwltbWUJCSgxNiksCisJbW1lLXNnc24JKDE3KQorCX0KKwktLSB0aGUgdmFsdWVzIDIsIDMsIDQgYW5kIDUgc2hhbGwgbm90IGJlIHVzZWQgb24gdGhlIE1BUC1EIG9yIEdyIGludGVyZmFjZXMKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gcmVjZWl2ZWQgdmFsdWVzIGluIHRoZSByYW5nZSAoNi0xNSkgc2hhbGwgYmUgdHJlYXRlZCBhcyAidmxyIgorCS0tIHJlY2VpdmVkIHZhbHVlcyBncmVhdGVyIHRoYW4gMTcgc2hhbGwgYmUgdHJlYXRlZCBhcyAic2dzbiIKKworLS0gZXF1aXBtZW50IG1hbmFnZW1lbnQgdHlwZXMKKworQ2hlY2tJTUVJLUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltZWkJCQlJTUVJLAorCXJlcXVlc3RlZEVxdWlwbWVudEluZm8JUmVxdWVzdGVkRXF1aXBtZW50SW5mbywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ2hlY2tJTUVJLVJlcyA6Oj0gU0VRVUVOQ0UgeworCWVxdWlwbWVudFN0YXR1cwlFcXVpcG1lbnRTdGF0dXMJT1BUSU9OQUwsCisJYm11ZWYJCVVFU0JJLUl1CQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1JlcXVlc3RlZEVxdWlwbWVudEluZm86Oj0gQklUIFNUUklORyB7CisJZXF1aXBtZW50U3RhdHVzICAoMCksCisJYm11ZWYgICgxKX0gKFNJWkUgKDIuLjgpKQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogcmVjZXB0aW9uIG9mIHVua25vd24gYml0IGFzc2lnbm1lbnRzIGluIHRoZQorCS0tIFJlcXVlc3RlZEVxdWlwbWVudEluZm8gZGF0YSB0eXBlIHNoYWxsIGJlIGRpc2NhcmRlZCBieSB0aGUgcmVjZWl2ZXIgCisKK1VFU0JJLUl1IDo6PSBTRVFVRU5DRSB7CisJdWVzYmktSXVBCVswXSBVRVNCSS1JdUEJCQkJT1BUSU9OQUwsCisJdWVzYmktSXVCCVsxXSBVRVNCSS1JdUIJCQkJT1BUSU9OQUwsCisJLi4ufQorCitVRVNCSS1JdUEJCQkJOjo9IEJJVCBTVFJJTkcgKFNJWkUoMS4uMTI4KSkKKy0tIFNlZSAzR1BQIFRTIDI1LjQxMworCitVRVNCSS1JdUIJCQkJOjo9IEJJVCBTVFJJTkcgKFNJWkUoMS4uMTI4KSkKKy0tIFNlZSAzR1BQIFRTIDI1LjQxMworCitFcXVpcG1lbnRTdGF0dXMgOjo9IEVOVU1FUkFURUQgeworCXdoaXRlTGlzdGVkICAoMCksCisJYmxhY2tMaXN0ZWQgICgxKSwKKwlncmV5TGlzdGVkICAoMil9CisKKy0tIHN1YnNjcmliZXIgbWFuYWdlbWVudCB0eXBlcworCitJbnNlcnRTdWJzY3JpYmVyRGF0YUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSQkJT1BUSU9OQUwsCisJQ09NUE9ORU5UUyBPRglTdWJzY3JpYmVyRGF0YSwKKwlleHRlbnNpb25Db250YWluZXIJWzE0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwJCisJbmFlYS1QcmVmZXJyZWRDSQlbMTVdIE5BRUEtUHJlZmVycmVkQ0kJT1BUSU9OQUwsCisJLS0gbmFlYS1QcmVmZXJyZWRDSSBpcyBpbmNsdWRlZCBhdCB0aGUgZGlzY3JldGlvbiBvZiB0aGUgSExSIG9wZXJhdG9yLgorCWdwcnNTdWJzY3JpcHRpb25EYXRhCVsxNl0gR1BSU1N1YnNjcmlwdGlvbkRhdGEJT1BUSU9OQUwsCisJcm9hbWluZ1Jlc3RyaWN0ZWRJblNnc25EdWVUb1Vuc3VwcG9ydGVkRmVhdHVyZSBbMjNdIAlOVUxMCQorCQkJCQkJCU9QVElPTkFMLCAKKwluZXR3b3JrQWNjZXNzTW9kZQlbMjRdIE5ldHdvcmtBY2Nlc3NNb2RlCU9QVElPTkFMLAorCWxzYUluZm9ybWF0aW9uCVsyNV0gTFNBSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJbG11LUluZGljYXRvcglbMjFdCU5VTEwJCU9QVElPTkFMLAorCWxjc0luZm9ybWF0aW9uCVsyMl0JTENTSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJaXN0QWxlcnRUaW1lcglbMjZdIElTVC1BbGVydFRpbWVyVmFsdWUJT1BUSU9OQUwsCisJc3VwZXJDaGFyZ2VyU3VwcG9ydGVkSW5ITFIJWzI3XSBBZ2VJbmRpY2F0b3IJT1BUSU9OQUwsCisJbWMtU1MtSW5mbwlbMjhdIE1DLVNTLUluZm8JT1BUSU9OQUwsCisJY3MtQWxsb2NhdGlvblJldGVudGlvblByaW9yaXR5CVsyOV0gQ1MtQWxsb2NhdGlvblJldGVudGlvblByaW9yaXR5CQlPUFRJT05BTCwKKwlzZ3NuLUNBTUVMLVN1YnNjcmlwdGlvbkluZm8JWzE3XSBTR1NOLUNBTUVMLVN1YnNjcmlwdGlvbkluZm8JT1BUSU9OQUwsCisJY2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MgCVsxOF0JQ2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MgCU9QVElPTkFMLAorCWFjY2Vzc1Jlc3RyaWN0aW9uRGF0YQlbMTldIEFjY2Vzc1Jlc3RyaWN0aW9uRGF0YQlPUFRJT05BTCwKKwlpY3MtSW5kaWNhdG9yCVsyMF0JQk9PTEVBTglPUFRJT05BTCwKKwllcHMtU3Vic2NyaXB0aW9uRGF0YQlbMzFdCUVQUy1TdWJzY3JpcHRpb25EYXRhCU9QVElPTkFMLAorCWNzZy1TdWJzY3JpcHRpb25EYXRhTGlzdAlbMzJdIENTRy1TdWJzY3JpcHRpb25EYXRhTGlzdAlPUFRJT05BTCB9CisJLS0gSWYgdGhlIE5ldHdvcmsgQWNjZXNzIE1vZGUgcGFyYW1ldGVyIGlzIHNlbnQsIGl0IHNoYWxsIGJlIHByZXNlbnQgb25seSBpbiAKKwktLSB0aGUgZmlyc3Qgc2VxdWVuY2UgaWYgc2VxbWVudGF0aW9uIGlzIHVzZWQKKworQ1NHLVN1YnNjcmlwdGlvbkRhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi41MCkgT0YKKwkJCQlDU0ctU3Vic2NyaXB0aW9uRGF0YQorCitDU0ctU3Vic2NyaXB0aW9uRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWNzZy1JZAkgCQlDU0ctSWQsCisJZXhwaXJhdGlvbkRhdGUJCVRpbWUJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi59CisKK0NTRy1JZCA6Oj0gQklUIFNUUklORyAoU0laRSAoMjcpKQorCS0tIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDIzLjAwMyBbMTddLgorCitUaW1lIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDQpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIElFVEYgUkZDIDM1ODggWzEzOV0KKworCitFUFMtU3Vic2NyaXB0aW9uRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWFwbi1vaS1SZXBsYWNlbWVudAlbMF0JQVBOLU9JLVJlcGxhY2VtZW50CU9QVElPTkFMLAorCXJmc3AtaWQJCVsyXQlSRlNQLUlECQlPUFRJT05BTCwKKwlhbWJyCQkJWzNdCUFNQlIJCU9QVElPTkFMLAorCWFwbi1Db25maWd1cmF0aW9uUHJvZmlsZQlbNF0JQVBOLUNvbmZpZ3VyYXRpb25Qcm9maWxlCU9QVElPTkFMLAorCXN0bi1zcgkJWzZdCUlTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzVdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitBUE4tT0ktUmVwbGFjZW1lbnQgOjo9ICBPQ1RFVCBTVFJJTkcgKFNJWkUgKDkuLjEwMCkpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhcyBBUE4gT3BlcmF0b3IgSWRlbnRpZmllciBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XSAKKworUkZTUC1JRCA6Oj0gIElOVEVHRVIgKDEuLjI1NikKKworQVBOLUNvbmZpZ3VyYXRpb25Qcm9maWxlIDo6PSBTRVFVRU5DRSB7CisJZGVmYXVsdENvbnRleHQJQ29udGV4dElkLAorCWNvbXBsZXRlRGF0YUxpc3RJbmNsdWRlZAlOVUxMCQkJT1BUSU9OQUwsCisJCS0tIElmIHNlZ21lbnRhdGlvbiBpcyB1c2VkLCBjb21wbGV0ZURhdGFMaXN0SW5jbHVkZWQgbWF5IG9ubHkgYmUgcHJlc2VudCBpbiB0aGUKKwkJLS0gZmlyc3Qgc2VnbWVudCBvZiBBUE4tQ29uZmlndXJhdGlvblByb2ZpbGUuCisJZXBzRGF0YUxpc3QJWzFdCUVQUy1EYXRhTGlzdCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitFUFMtRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQVBOLUNvbmZpZ3VyYXRpb25zKSBPRgorCQkJCUFQTi1Db25maWd1cmF0aW9uCisKKworbWF4TnVtT2ZBUE4tQ29uZmlndXJhdGlvbnMgIElOVEVHRVIgOjo9IDUwCisKKworQVBOLUNvbmZpZ3VyYXRpb24gOjo9IFNFUVVFTkNFIHsKKwljb250ZXh0SWQJCVswXSBDb250ZXh0SWQsCisJc2VydmVkUGFydHlJUC1BZGRyZXNzCVsxXSBQRFAtQWRkcmVzcwlPUFRJT05BTCwKKwlhcG4JCQlbMl0gQVBOLAorCWVwcy1xb3MtU3Vic2NyaWJlZAlbM10gRVBTLVFvUy1TdWJzY3JpYmVkLAorCXBkbi1ndy1JZGVudGl0eQlbNF0gUEROLUdXLUlkZW50aXR5CU9QVElPTkFMLAorCXBkbi1ndy1BbGxvY2F0aW9uVHlwZQlbNV0gUEROLUdXLUFsbG9jYXRpb25UeXBlCU9QVElPTkFMLAorCXZwbG1uQWRkcmVzc0FsbG93ZWQJWzZdIE5VTEwJCU9QVElPTkFMLAorCWNoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCVs3XSBDaGFyZ2luZ0NoYXJhY3RlcmlzdGljcwlPUFRJT05BTCwKKwlhbWJyCQkJWzhdIEFNQlIJCU9QVElPTkFMLAorCXNwZWNpZmljQVBOSW5mb0xpc3QJWzldIFNwZWNpZmljQVBOSW5mb0xpc3QJT1BUSU9OQUwsCWV4dGVuc2lvbkNvbnRhaW5lcglbMTBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitFUFMtUW9TLVN1YnNjcmliZWQgOjo9IFNFUVVFTkNFIHsKKwlxb3MtQ2xhc3MtSWRlbnRpZmllcglbMF0gUW9TLUNsYXNzLUlkZW50aWZpZXIsCisJYWxsb2NhdGlvbi1SZXRlbnRpb24tUHJpb3JpdHkJWzFdIEFsbG9jYXRpb24tUmV0ZW50aW9uLVByaW9yaXR5LAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0FNQlIgOjo9IFNFUVVFTkNFIHsKKwltYXgtUmVxdWVzdGVkQmFuZHdpZHRoLVVMCVswXSBCYW5kd2lkdGgsCisJbWF4LVJlcXVlc3RlZEJhbmR3aWR0aC1ETAlbMV0gQmFuZHdpZHRoLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKKworU3BlY2lmaWNBUE5JbmZvTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZTcGVjaWZpY0FQTkluZm9zKSBPRgorCQkJCVNwZWNpZmljQVBOSW5mbworCittYXhOdW1PZlNwZWNpZmljQVBOSW5mb3MgIElOVEVHRVIgOjo9IDUwCisKK1NwZWNpZmljQVBOSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWFwbgkJCVswXSBBUE4sCisJcGRuLWd3LUlkZW50aXR5CVsxXSBQRE4tR1ctSWRlbnRpdHksCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworQmFuZHdpZHRoIDo6PSBJTlRFR0VSIAorCS0tIGJpdHMgcGVyIHNlY29uZAorCitRb1MtQ2xhc3MtSWRlbnRpZmllciA6Oj0gSU5URUdFUiAoMS4uOSkKKwktLSB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gIDNHUFAgVFMgMjkuMjEyCisKKworCitBbGxvY2F0aW9uLVJldGVudGlvbi1Qcmlvcml0eSA6Oj0gU0VRVUVOQ0UgeworCXByaW9yaXR5LWxldmVsCVswXSBJTlRFR0VSLAorCXByZS1lbXB0aW9uLWNhcGFiaWxpdHkJWzFdIEJPT0xFQU4JT1BUSU9OQUwsCisJcHJlLWVtcHRpb24tdnVsbmVyYWJpbGl0eQlbMl0gQk9PTEVBTglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitQRE4tR1ctSWRlbnRpdHkgOjo9IFNFUVVFTkNFIHsKKwlwZG4tZ3ctaXB2NC1BZGRyZXNzCVswXSBQRFAtQWRkcmVzcwlPUFRJT05BTCwKKwlwZG4tZ3ctaXB2Ni1BZGRyZXNzCVsxXSBQRFAtQWRkcmVzcwlPUFRJT05BTCwKKwlwZG4tZ3ctbmFtZQlbMl0gRlFETgkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworRlFETiA6Oj0gIE9DVEVUIFNUUklORyAoU0laRSAoOS4uMTAwKSkKKworCitQRE4tR1ctQWxsb2NhdGlvblR5cGUgOjo9IEVOVU1FUkFURUQgeworCXN0YXRpYwkoMCksCisJZHluYW1pYwkoMSl9CisKKworQWNjZXNzUmVzdHJpY3Rpb25EYXRhIDo6PSBCSVQgU1RSSU5HIHsKKwl1dHJhbk5vdEFsbG93ZWQgKDApLAorCWdlcmFuTm90QWxsb3dlZCAoMSksCisJZ2FuTm90QWxsb3dlZCAgICgyKSwKKwlpLWhzcGEtZXZvbHV0aW9uTm90QWxsb3dlZCAoMyksCisJZS11dHJhbk5vdEFsbG93ZWQgKDQpLAorCWhvLXRvTm9uM0dQUC1BY2Nlc3NOb3RBbGxvd2VkICg1KSB9IChTSVpFICgyLi44KSkKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6IAorCS0tIGFjY2VzcyByZXN0cmljdGlvbiBkYXRhIHJlbGF0ZWQgdG8gYW4gYWNjZXNzIHR5cGUgbm90IHN1cHBvcnRlZCBieSBhIG5vZGUKKwktLSBzaGFsbCBiZSBpZ25vcmVkCisJLS0gYml0cyA2IHRvIDcgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QKKwkKKworQ1MtQWxsb2NhdGlvblJldGVudGlvblByaW9yaXR5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoaXMgZGF0YSB0eXBlIGVuY29kZXMgZWFjaCBwcmlvcml0eSBsZXZlbCBkZWZpbmVkIGluIFRTIDIzLjEwNyBhcyB0aGUgYmluYXJ5IHZhbHVlCisJLS0gb2YgdGhlIHByaW9yaXR5IGxldmVsLgorCitJU1QtQWxlcnRUaW1lclZhbHVlIDo6PSBJTlRFR0VSICgxNS4uMjU1KQorCitMQ1NJbmZvcm1hdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWdtbGMtTGlzdAlbMF0JR01MQy1MaXN0CU9QVElPTkFMLAorCWxjcy1Qcml2YWN5RXhjZXB0aW9uTGlzdAlbMV0JTENTLVByaXZhY3lFeGNlcHRpb25MaXN0CU9QVElPTkFMLAorCW1vbHItTGlzdAkJWzJdCU1PTFItTGlzdAlPUFRJT05BTCwKKwkuLi4sCisJYWRkLWxjcy1Qcml2YWN5RXhjZXB0aW9uTGlzdAlbM10JTENTLVByaXZhY3lFeGNlcHRpb25MaXN0CU9QVElPTkFMIH0KKwktLSBhZGQtbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0IG1heSBiZSBzZW50IG9ubHkgaWYgbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0IGlzCisJLS0gcHJlc2VudCBhbmQgY29udGFpbnMgZm91ciBpbnN0YW5jZXMgb2YgTENTLVByaXZhY3lDbGFzcy4gSWYgdGhlIG1lbnRpb25lZCBjb25kaXRpb24KKwktLSBpcyBub3Qgc2F0aXNmaWVkIHRoZSByZWNlaXZpbmcgbm9kZSBzaGFsbCBkaXNjYXJkIGFkZC1sY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QuCisJLS0gSWYgYW4gTENTLVByaXZhY3lDbGFzcyBpcyByZWNlaXZlZCBib3RoIGluIGxjcy1Qcml2YWN5RXhjZXB0aW9uTGlzdCBhbmQgaW4KKwktLSBhZGQtbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0IHdpdGggdGhlIHNhbWUgU1MtQ29kZSwgdGhlbiB0aGUgZXJyb3IgdW5leHBlY3RlZCAKKwktLSBkYXRhIHZhbHVlIHNoYWxsIGJlIHJldHVybmVkLgorCitHTUxDLUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mR01MQykgT0YKKwkJCQlJU0ROLUFkZHJlc3NTdHJpbmcKKwktLSBpZiBzZWdtZW50YXRpb24gaXMgdXNlZCwgdGhlIGNvbXBsZXRlIEdNTEMtTGlzdCBzaGFsbCBiZSBzZW50IGluIG9uZSBzZWdtZW50CisKK21heE51bU9mR01MQyAgSU5URUdFUiA6Oj0gNQorCitOZXR3b3JrQWNjZXNzTW9kZSA6Oj0gRU5VTUVSQVRFRCB7CisJcGFja2V0QW5kQ2lyY3VpdAkoMCksCisJb25seUNpcmN1aXQJCSgxKSwKKwlvbmx5UGFja2V0CQkoMiksCisJLi4ufQorCS0tIGlmIHVua25vd24gdmFsdWVzIGFyZSByZWNlaXZlZCBpbiBOZXR3b3JrQWNjZXNzTW9kZQorCS0tIHRoZXkgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitHUFJTRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUERQLUNvbnRleHRzKSBPRgorCQkJCVBEUC1Db250ZXh0CisKK21heE51bU9mUERQLUNvbnRleHRzICBJTlRFR0VSIDo6PSA1MAorCitQRFAtQ29udGV4dCA6Oj0gU0VRVUVOQ0UgeworCXBkcC1Db250ZXh0SWQJQ29udGV4dElkLAorCXBkcC1UeXBlCQlbMTZdIFBEUC1UeXBlLAorCXBkcC1BZGRyZXNzCVsxN10gUERQLUFkZHJlc3MJT1BUSU9OQUwsCisJcW9zLVN1YnNjcmliZWQJWzE4XSBRb1MtU3Vic2NyaWJlZCwKKwl2cGxtbkFkZHJlc3NBbGxvd2VkCVsxOV0gTlVMTAlPUFRJT05BTCwKKwlhcG4JCQlbMjBdIEFQTiwKKwlleHRlbnNpb25Db250YWluZXIJWzIxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlleHQtUW9TLVN1YnNjcmliZWQJWzBdIEV4dC1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwgCisJcGRwLUNoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCVsxXSBDaGFyZ2luZ0NoYXJhY3RlcmlzdGljcwlPUFRJT05BTCwKKwlleHQyLVFvUy1TdWJzY3JpYmVkCVsyXSBFeHQyLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCS0tIGV4dDItUW9TLVN1YnNjcmliZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBleHQtUW9TLVN1YnNjcmliZWQgaXMgcHJlc2VudC4KKwlleHQzLVFvUy1TdWJzY3JpYmVkCVszXSBFeHQzLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMCisJLS0gZXh0My1Rb1MtU3Vic2NyaWJlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIGV4dDItUW9TLVN1YnNjcmliZWQgaXMgcHJlc2VudC4KKwkgfQorCitDb250ZXh0SWQgOjo9IElOVEVHRVIgKDEuLm1heE51bU9mUERQLUNvbnRleHRzKQorCitHUFJTU3Vic2NyaXB0aW9uRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWNvbXBsZXRlRGF0YUxpc3RJbmNsdWRlZAlOVUxMCQkJT1BUSU9OQUwsCisJCS0tIElmIHNlZ21lbnRhdGlvbiBpcyB1c2VkLCBjb21wbGV0ZURhdGFMaXN0SW5jbHVkZWQgbWF5IG9ubHkgYmUgcHJlc2VudCBpbiB0aGUKKwkJLS0gZmlyc3Qgc2VnbWVudCBvZiBHUFJTU3Vic2NyaXB0aW9uRGF0YS4KKwlncHJzRGF0YUxpc3QJWzFdCUdQUlNEYXRhTGlzdCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitTR1NOLUNBTUVMLVN1YnNjcmlwdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlncHJzLUNTSQkJWzBdCUdQUlMtQ1NJCU9QVElPTkFMLAorCW1vLXNtcy1DU0kJWzFdCVNNUy1DU0kJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCW10LXNtcy1DU0kJWzNdCVNNUy1DU0kJT1BUSU9OQUwsCisJbXQtc21zQ0FNRUxURFAtQ3JpdGVyaWFMaXN0CVs0XQlNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJbWctY3NpCQlbNV0JTUctQ1NJCU9QVElPTkFMCisJfQorCitHUFJTLUNTSSA6Oj0gU0VRVUVOQ0UgeworCWdwcnMtQ2FtZWxURFBEYXRhTGlzdAlbMF0gR1BSUy1DYW1lbFREUERhdGFMaXN0CU9QVElPTkFMLAorCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCVsxXSBDYW1lbENhcGFiaWxpdHlIYW5kbGluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbM10JTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbNF0JTlVMTAkJT1BUSU9OQUwsCisJLi4ufQorLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQgd2hlbiBHUFJTLUNTSSBpcyBzZW50IHRvIFNHU04uCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuIAorLS0JR1BSUy1DYW1lbFREUERhdGEgYW5kICBjYW1lbENhcGFiaWxpdHlIYW5kbGluZyBzaGFsbCBiZSBwcmVzZW50IGluIAorLS0JdGhlIEdQUlMtQ1NJIHNlcXVlbmNlLgorLS0JSWYgR1BSUy1DU0kgaXMgc2VnbWVudGVkLCBncHJzLUNhbWVsVERQRGF0YUxpc3QgYW5kIGNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nIHNoYWxsIGJlIAorLS0JcHJlc2VudCBpbiB0aGUgZmlyc3Qgc2VnbWVudAorCitHUFJTLUNhbWVsVERQRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCUdQUlMtQ2FtZWxURFBEYXRhCistLQlHUFJTLUNhbWVsVERQRGF0YUxpc3Qgc2hhbGwgbm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZgorLS0JR1BSUy1DYW1lbFREUERhdGEgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZSBmb3IgZ3Bycy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQuCisKK0dQUlMtQ2FtZWxURFBEYXRhIDo6PSBTRVFVRU5DRSB7CisJZ3Bycy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQJWzBdIEdQUlMtVHJpZ2dlckRldGVjdGlvblBvaW50LAorCXNlcnZpY2VLZXkJWzFdIFNlcnZpY2VLZXksCisJZ3NtU0NGLUFkZHJlc3MJWzJdIElTRE4tQWRkcmVzc1N0cmluZywKKwlkZWZhdWx0U2Vzc2lvbkhhbmRsaW5nCVszXSBEZWZhdWx0R1BSUy1IYW5kbGluZywKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4KKwl9CisKK0RlZmF1bHRHUFJTLUhhbmRsaW5nIDo6PSBFTlVNRVJBVEVEIHsKKwljb250aW51ZVRyYW5zYWN0aW9uICgwKSAsCisJcmVsZWFzZVRyYW5zYWN0aW9uICgxKSAsCisJLi4ufQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyBpbiByYW5nZSAyLTMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgImNvbnRpbnVlVHJhbnNhY3Rpb24iCistLSByZWNlcHRpb24gb2YgdmFsdWVzIGdyZWF0ZXIgdGhhbiAzMSBzaGFsbCBiZSB0cmVhdGVkIGFzICJyZWxlYXNlVHJhbnNhY3Rpb24iCisKK0dQUlMtVHJpZ2dlckRldGVjdGlvblBvaW50IDo6PSBFTlVNRVJBVEVEIHsKKwlhdHRhY2ggCQkJKDEpLAorCWF0dGFjaENoYW5nZU9mUG9zaXRpb24gCQkoMiksCisJcGRwLUNvbnRleHRFc3RhYmxpc2htZW50IAkJKDExKSwKKwlwZHAtQ29udGV4dEVzdGFibGlzaG1lbnRBY2tub3dsZWRnZW1lbnQJKDEyKSwKKwlwZHAtQ29udGV4dENoYW5nZU9mUG9zaXRpb24gCQkoMTQpLAorCS4uLiB9CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBGb3IgR1BSUy1DYW1lbFREUERhdGEgc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkKKy0tIG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlIAorLS0gR1BSUy1DYW1lbFREUERhdGFzZXF1ZW5jZS4KKworQVBOIDo6PSAgT0NURVQgU1RSSU5HIChTSVpFICgyLi42MykpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XSAKKworUERQLVR5cGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMikpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyOS4wNjAgWzEwNV0KKworUERQLUFkZHJlc3MgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uMTYpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjkuMDYwIFsxMDVdCisKKwktLSBUaGUgcG9zc2libGUgc2l6ZSB2YWx1ZXMgYXJlOgorCS0tIDEtNyBvY3RldHMgIFguMjUgYWRkcmVzcyB0eXBlCisJLS0gIDQgIG9jdGV0cyAgSVB2NCBhZGRyZXNzIHR5cGUKKwktLSAxNiAgb2N0ZXRzICBJcHY2IGFkZHJlc3MgdHlwZQorCitRb1MtU3Vic2NyaWJlZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDI0LjAwOCBbMzVdIFF1YWxpdHkgb2YgU2VydmljZSBPY3RldHMgCisJLS0gMy01LgorCitFeHQtUW9TLVN1YnNjcmliZWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uOSkpCisJLS0gT0NURVQgMTogCisJLS0gIEFsbG9jYXRpb24vUmV0ZW50aW9uIFByaW9yaXR5IChUaGlzIG9jdGV0IGVuY29kZXMgZWFjaCBwcmlvcml0eSBsZXZlbCBkZWZpbmVkIGluCisJLS0gICAgIDIzLjEwNyBhcyB0aGUgYmluYXJ5IHZhbHVlIG9mIHRoZSBwcmlvcml0eSBsZXZlbCwgZGVjbGFyYXRpb24gaW4gMjkuMDYwKQorCS0tIE9jdGV0cyAyLTkgYXJlIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdIFF1YWxpdHkgb2YgU2VydmljZSBPY3RldHMgCisJLS0gNi0xMy4KKworRXh0Mi1Rb1MtU3Vic2NyaWJlZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4zKSkKKwktLSBPY3RldHMgMS0zIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDggWzM1XSBRdWFsaXR5IG9mIFNlcnZpY2UgT2N0ZXRzIDE0LTE2LgorCS0tIElmIFF1YWxpdHkgb2YgU2VydmljZSBpbmZvcm1hdGlvbiBpcyBzdHJ1Y3R1cmVkIHdpdGggMTQgb2N0ZXQgbGVuZ3RoLCB0aGVuCisJLS0gT2N0ZXQgMSBpcyBjb2RlZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDggWzM1XSBRdWFsaXR5IG9mIFNlcnZpY2UgT2N0ZXQgMTQuCisKK0V4dDMtUW9TLVN1YnNjcmliZWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uMikpCisJLS0gT2N0ZXRzIDEtMiBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4IFszNV0gUXVhbGl0eSBvZiBTZXJ2aWNlIE9jdGV0cyAxNy0xOC4KKworQ2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMikpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAzMi4yMTUuCisKK0xTQU9ubHlBY2Nlc3NJbmRpY2F0b3IgOjo9IEVOVU1FUkFURUQgeworCWFjY2Vzc091dHNpZGVMU0FzQWxsb3dlZCAgKDApLAorCWFjY2Vzc091dHNpZGVMU0FzUmVzdHJpY3RlZCAoMSl9CisKK0xTQURhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkxTQXMpIE9GCisJCQkJTFNBRGF0YQorCittYXhOdW1PZkxTQXMgIElOVEVHRVIgOjo9IDIwCisKK0xTQURhdGEgOjo9IFNFUVVFTkNFIHsKKwlsc2FJZGVudGl0eQlbMF0gTFNBSWRlbnRpdHksCisJbHNhQXR0cmlidXRlcwlbMV0gTFNBQXR0cmlidXRlcywKKwlsc2FBY3RpdmVNb2RlSW5kaWNhdG9yCVsyXSBOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0xTQUluZm9ybWF0aW9uIDo6PSBTRVFVRU5DRSB7CisJY29tcGxldGVEYXRhTGlzdEluY2x1ZGVkCU5VTEwJCQlPUFRJT05BTCwKKworCQktLSBJZiBzZWdtZW50YXRpb24gaXMgdXNlZCwgY29tcGxldGVEYXRhTGlzdEluY2x1ZGVkIG1heSBvbmx5IGJlIHByZXNlbnQgaW4gdGhlCisJCS0tIGZpcnN0IHNlZ21lbnQuCisJbHNhT25seUFjY2Vzc0luZGljYXRvcglbMV0JTFNBT25seUFjY2Vzc0luZGljYXRvcglPUFRJT05BTCwKKwlsc2FEYXRhTGlzdAlbMl0JTFNBRGF0YUxpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitMU0FJZGVudGl0eSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDIzLjAwMyBbMTddCisKK0xTQUF0dHJpYnV0ZXMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyA0OC4wMDggWzQ5XQorCitTdWJzY3JpYmVyRGF0YSA6Oj0gU0VRVUVOQ0UgeworCW1zaXNkbgkJWzFdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwljYXRlZ29yeQkJWzJdIENhdGVnb3J5CU9QVElPTkFMLAorCXN1YnNjcmliZXJTdGF0dXMJWzNdIFN1YnNjcmliZXJTdGF0dXMJT1BUSU9OQUwsCisJYmVhcmVyU2VydmljZUxpc3QJWzRdIEJlYXJlclNlcnZpY2VMaXN0CU9QVElPTkFMLAorCS0tIFRoZSBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHJlY2VwdGlvbiBvZiB1bnN1cHBvcnRlZCAvIG5vdCBhbGxvY2F0ZWQKKwktLSBiZWFyZXJTZXJ2aWNlQ29kZXMgaXMgZGVmaW5lZCBpbiBzZWN0aW9uIDguOC4xCisJdGVsZXNlcnZpY2VMaXN0CVs2XSBUZWxlc2VydmljZUxpc3QJT1BUSU9OQUwsCisJLS0gVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3IgcmVjZXB0aW9uIG9mIHVuc3VwcG9ydGVkIC8gbm90IGFsbG9jYXRlZAorCS0tIHRlbGVzZXJ2aWNlQ29kZXMgaXMgZGVmaW5lZCBpbiBzZWN0aW9uIDguOC4xCisJcHJvdmlzaW9uZWRTUwlbN10gRXh0LVNTLUluZm9MaXN0CU9QVElPTkFMLAorCW9kYi1EYXRhCQlbOF0gT0RCLURhdGEJT1BUSU9OQUwsCisJcm9hbWluZ1Jlc3RyaWN0aW9uRHVlVG9VbnN1cHBvcnRlZEZlYXR1cmUgIFs5XSBOVUxMCU9QVElPTkFMLAorCXJlZ2lvbmFsU3Vic2NyaXB0aW9uRGF0YQlbMTBdIFpvbmVDb2RlTGlzdAlPUFRJT05BTCwKKwl2YnNTdWJzY3JpcHRpb25EYXRhCVsxMV0gVkJTRGF0YUxpc3QJT1BUSU9OQUwsCisJdmdjc1N1YnNjcmlwdGlvbkRhdGEJWzEyXSBWR0NTRGF0YUxpc3QJT1BUSU9OQUwsCisJdmxyQ2FtZWxTdWJzY3JpcHRpb25JbmZvCVsxM10gVmxyQ2FtZWxTdWJzY3JpcHRpb25JbmZvCU9QVElPTkFMCisJfQorCitDYXRlZ29yeSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gSVRVLVQgUmVjIFEuNzYzLgorCitTdWJzY3JpYmVyU3RhdHVzIDo6PSBFTlVNRVJBVEVEIHsKKwlzZXJ2aWNlR3JhbnRlZCAgKDApLAorCW9wZXJhdG9yRGV0ZXJtaW5lZEJhcnJpbmcgICgxKX0KKworQmVhcmVyU2VydmljZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQmVhcmVyU2VydmljZXMpIE9GCisJCQkJRXh0LUJlYXJlclNlcnZpY2VDb2RlCisKK21heE51bU9mQmVhcmVyU2VydmljZXMgIElOVEVHRVIgOjo9IDUwCisKK1RlbGVzZXJ2aWNlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZUZWxlc2VydmljZXMpIE9GCisJCQkJRXh0LVRlbGVzZXJ2aWNlQ29kZQorCittYXhOdW1PZlRlbGVzZXJ2aWNlcyAgSU5URUdFUiA6Oj0gMjAKKworT0RCLURhdGEgOjo9IFNFUVVFTkNFIHsKKwlvZGItR2VuZXJhbERhdGEJT0RCLUdlbmVyYWxEYXRhLAorCW9kYi1IUExNTi1EYXRhCU9EQi1IUExNTi1EYXRhCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitPREItR2VuZXJhbERhdGEgOjo9IEJJVCBTVFJJTkcgeworCWFsbE9HLUNhbGxzQmFycmVkICAoMCksCisJaW50ZXJuYXRpb25hbE9HQ2FsbHNCYXJyZWQgICgxKSwKKwlpbnRlcm5hdGlvbmFsT0dDYWxsc05vdFRvSFBMTU4tQ291bnRyeUJhcnJlZCAgKDIpLAorCWludGVyem9uYWxPR0NhbGxzQmFycmVkICg2KSwKKwlpbnRlcnpvbmFsT0dDYWxsc05vdFRvSFBMTU4tQ291bnRyeUJhcnJlZCAoNyksCisJaW50ZXJ6b25hbE9HQ2FsbHNBbmRJbnRlcm5hdGlvbmFsT0dDYWxsc05vdFRvSFBMTU4tQ291bnRyeUJhcnJlZCAoOCksCisJcHJlbWl1bVJhdGVJbmZvcm1hdGlvbk9HQ2FsbHNCYXJyZWQgICgzKSwKKwlwcmVtaXVtUmF0ZUVudGVydGFpbmVtZW50T0dDYWxsc0JhcnJlZCAgKDQpLAorCXNzLUFjY2Vzc0JhcnJlZCAgKDUpLAorCWFsbEVDVC1CYXJyZWQgKDkpLAorCWNoYXJnZWFibGVFQ1QtQmFycmVkICgxMCksCisJaW50ZXJuYXRpb25hbEVDVC1CYXJyZWQgKDExKSwKKwlpbnRlcnpvbmFsRUNULUJhcnJlZCAoMTIpLAorCWRvdWJseUNoYXJnZWFibGVFQ1QtQmFycmVkICgxMyksCisJbXVsdGlwbGVFQ1QtQmFycmVkICgxNCksCisJYWxsUGFja2V0T3JpZW50ZWRTZXJ2aWNlc0JhcnJlZCAoMTUpLAorCXJvYW1lckFjY2Vzc1RvSFBMTU4tQVAtQmFycmVkICAoMTYpLAorCXJvYW1lckFjY2Vzc1RvVlBMTU4tQVAtQmFycmVkICAoMTcpLAorCXJvYW1pbmdPdXRzaWRlUExNTk9HLUNhbGxzQmFycmVkICAoMTgpLAorCWFsbElDLUNhbGxzQmFycmVkICAoMTkpLAorCXJvYW1pbmdPdXRzaWRlUExNTklDLUNhbGxzQmFycmVkICAoMjApLAorCXJvYW1pbmdPdXRzaWRlUExNTklDb3VudHJ5SUMtQ2FsbHNCYXJyZWQgICgyMSksCisJcm9hbWluZ091dHNpZGVQTE1OLUJhcnJlZCAgKDIyKSwKKwlyb2FtaW5nT3V0c2lkZVBMTU4tQ291bnRyeUJhcnJlZCAgKDIzKSwKKwlyZWdpc3RyYXRpb25BbGxDRi1CYXJyZWQgICgyNCksCisJcmVnaXN0cmF0aW9uQ0ZOb3RUb0hQTE1OLUJhcnJlZCAgKDI1KSwKKwlyZWdpc3RyYXRpb25JbnRlcnpvbmFsQ0YtQmFycmVkICAoMjYpLAorCXJlZ2lzdHJhdGlvbkludGVyem9uYWxDRk5vdFRvSFBMTU4tQmFycmVkICAoMjcpLAorCXJlZ2lzdHJhdGlvbkludGVybmF0aW9uYWxDRi1CYXJyZWQgICgyOCl9IChTSVpFICgxNS4uMzIpKQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogcmVjZXB0aW9uIG9mIHVua25vd24gYml0IGFzc2lnbm1lbnRzIGluIHRoZQorCS0tIE9EQi1HZW5lcmFsRGF0YSB0eXBlIHNoYWxsIGJlIHRyZWF0ZWQgbGlrZSB1bnN1cHBvcnRlZCBPREItR2VuZXJhbERhdGEKKwktLSBXaGVuIHRoZSBPREItR2VuZXJhbERhdGEgdHlwZSBpcyByZW1vdmVkIGZyb20gdGhlIEhMUiBmb3IgYSBnaXZlbiBzdWJzY3JpYmVyLCAKKwktLSBpbiBOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZCBvcGVyYXRpb24gc2VudCB0b3dhcmQgdGhlIGdzbVNDRiAKKwktLSBhbGwgYml0cyBzaGFsbCBiZSBzZXQgdG8gIk8iLgorCitPREItSFBMTU4tRGF0YSA6Oj0gQklUIFNUUklORyB7CisJcGxtbi1TcGVjaWZpY0JhcnJpbmdUeXBlMSAgKDApLAorCXBsbW4tU3BlY2lmaWNCYXJyaW5nVHlwZTIgICgxKSwKKwlwbG1uLVNwZWNpZmljQmFycmluZ1R5cGUzICAoMiksCisJcGxtbi1TcGVjaWZpY0JhcnJpbmdUeXBlNCAgKDMpfSAoU0laRSAoNC4uMzIpKQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogcmVjZXB0aW9uIG9mIHVua25vd24gYml0IGFzc2lnbm1lbnRzIGluIHRoZQorCS0tIE9EQi1IUExNTi1EYXRhIHR5cGUgc2hhbGwgYmUgdHJlYXRlZCBsaWtlIHVuc3VwcG9ydGVkIE9EQi1IUExNTi1EYXRhIAorCS0tIFdoZW4gdGhlIE9EQi1IUExNTi1EYXRhIHR5cGUgaXMgcmVtb3ZlZCBmcm9tIHRoZSBITFIgZm9yIGEgZ2l2ZW4gc3Vic2NyaWJlciwgCisJLS0gaW4gTm90ZVN1YnNjcmliZXJEYXRhTW9kaWZpZWQgb3BlcmF0aW9uIHNlbnQgdG93YXJkIHRoZSBnc21TQ0YKKwktLSBhbGwgYml0cyBzaGFsbCBiZSBzZXQgdG8gIk8iLgorCitFeHQtU1MtSW5mb0xpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mU1MpIE9GCisJCQkJRXh0LVNTLUluZm8KKworRXh0LVNTLUluZm8gOjo9IENIT0lDRSB7CisJZm9yd2FyZGluZ0luZm8JWzBdIEV4dC1Gb3J3SW5mbywKKwljYWxsQmFycmluZ0luZm8JWzFdIEV4dC1DYWxsQmFySW5mbywKKwljdWctSW5mbwkJWzJdIENVRy1JbmZvLAorCXNzLURhdGEJCVszXSBFeHQtU1MtRGF0YSwKKwllbWxwcC1JbmZvCVs0XSBFTUxQUC1JbmZvfQorCitFeHQtRm9yd0luZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCWZvcndhcmRpbmdGZWF0dXJlTGlzdAlFeHQtRm9yd0ZlYXR1cmVMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRXh0LUZvcndGZWF0dXJlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZFeHQtQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgorCQkJCUV4dC1Gb3J3RmVhdHVyZQorCitFeHQtRm9yd0ZlYXR1cmUgOjo9IFNFUVVFTkNFIHsKKwliYXNpY1NlcnZpY2UJRXh0LUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJc3MtU3RhdHVzCQlbNF0gRXh0LVNTLVN0YXR1cywKKwlmb3J3YXJkZWRUb051bWJlcglbNV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCS0tIFdoZW4gdGhpcyBkYXRhIHR5cGUgaXMgc2VudCBmcm9tIGFuIEhMUiB3aGljaCBzdXBwb3J0cyBDQU1FTCBQaGFzZSAyCisJLS0gdG8gYSBWTFIgdGhhdCBzdXBwb3J0cyBDQU1FTCBQaGFzZSAyIHRoZSBWTFIgc2hhbGwgbm90IGNoZWNrIHRoZQorCS0tIGZvcm1hdCBvZiB0aGUgbnVtYmVyCisJZm9yd2FyZGVkVG9TdWJhZGRyZXNzCVs4XSBJU0ROLVN1YmFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZm9yd2FyZGluZ09wdGlvbnMJWzZdIEV4dC1Gb3J3T3B0aW9ucwlPUFRJT05BTCwKKwlub1JlcGx5Q29uZGl0aW9uVGltZQlbN10gRXh0LU5vUmVwQ29uZFRpbWUJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs5XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWxvbmdGb3J3YXJkZWRUb051bWJlcglbMTBdIEZUTi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMIH0KKworRXh0LUZvcndPcHRpb25zIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjUpKQorCisJLS0gT0NURVQgMToKKworCS0tICBiaXQgODogbm90aWZpY2F0aW9uIHRvIGZvcndhcmRpbmcgcGFydHkKKwktLQkwICBubyBub3RpZmljYXRpb24KKwktLQkxICBub3RpZmljYXRpb24KKworCS0tICBiaXQgNzogcmVkaXJlY3RpbmcgcHJlc2VudGF0aW9uCisJLS0JMCBubyBwcmVzZW50YXRpb24gIAorCS0tCTEgIHByZXNlbnRhdGlvbgorCisJLS0gIGJpdCA2OiBub3RpZmljYXRpb24gdG8gY2FsbGluZyBwYXJ0eQorCS0tCTAgIG5vIG5vdGlmaWNhdGlvbgorCS0tCTEgIG5vdGlmaWNhdGlvbgorCisJLS0gIGJpdCA1OiAwICh1bnVzZWQpCisKKwktLSAgYml0cyA0MzogZm9yd2FyZGluZyByZWFzb24KKwktLQkwMCAgbXMgbm90IHJlYWNoYWJsZQorCS0tCTAxICBtcyBidXN5CisJLS0JMTAgIG5vIHJlcGx5CisJLS0JMTEgIHVuY29uZGl0aW9uYWwKKworCS0tIGJpdHMgMjE6IDAwICh1bnVzZWQpCisKKwktLSBPQ1RFVFMgMi01OiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gVGhleSBzaGFsbCBiZSBkaXNjYXJkZWQgaWYKKwktLSByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QuCisKK0V4dC1Ob1JlcENvbmRUaW1lIDo6PSBJTlRFR0VSICgxLi4xMDApCisJLS0gT25seSB2YWx1ZXMgNS0zMCBhcmUgdXNlZC4KKwktLSBWYWx1ZXMgaW4gdGhlIHJhbmdlcyAxLTQgYW5kIDMxLTEwMCBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKwktLSBJZiByZWNlaXZlZDoKKwktLQkJdmFsdWVzIDEtNCBzaGFsbCBiZSBtYXBwZWQgb24gdG8gdmFsdWUgNQorCS0tCQl2YWx1ZXMgMzEtMTAwIHNoYWxsIGJlIG1hcHBlZCBvbiB0byB2YWx1ZSAzMAorCitFeHQtQ2FsbEJhckluZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCWNhbGxCYXJyaW5nRmVhdHVyZUxpc3QJRXh0LUNhbGxCYXJGZWF0dXJlTGlzdCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRXh0LUNhbGxCYXJGZWF0dXJlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZFeHQtQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgorCQkJCUV4dC1DYWxsQmFycmluZ0ZlYXR1cmUKKworRXh0LUNhbGxCYXJyaW5nRmVhdHVyZSA6Oj0gU0VRVUVOQ0UgeworCWJhc2ljU2VydmljZQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJCVs0XSBFeHQtU1MtU3RhdHVzLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDVUctSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWN1Zy1TdWJzY3JpcHRpb25MaXN0CUNVRy1TdWJzY3JpcHRpb25MaXN0LAorCWN1Zy1GZWF0dXJlTGlzdAlDVUctRmVhdHVyZUxpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDVUctU3Vic2NyaXB0aW9uTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMC4ubWF4TnVtT2ZDVUcpIE9GCisJCQkJQ1VHLVN1YnNjcmlwdGlvbgorCitDVUctU3Vic2NyaXB0aW9uIDo6PSBTRVFVRU5DRSB7CisJY3VnLUluZGV4CUNVRy1JbmRleCwKKwljdWctSW50ZXJsb2NrCUNVRy1JbnRlcmxvY2ssCisJaW50cmFDVUctT3B0aW9ucwlJbnRyYUNVRy1PcHRpb25zLAorCWJhc2ljU2VydmljZUdyb3VwTGlzdAlFeHQtQmFzaWNTZXJ2aWNlR3JvdXBMaXN0CU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ1VHLUluZGV4IDo6PSBJTlRFR0VSICgwLi4zMjc2NykKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gRVRTIDMwMCAxMzguCisKK0NVRy1JbnRlcmxvY2sgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCisKK0ludHJhQ1VHLU9wdGlvbnMgOjo9IEVOVU1FUkFURUQgeworCW5vQ1VHLVJlc3RyaWN0aW9ucyAgKDApLAorCWN1Z0lDLUNhbGxCYXJyZWQgICgxKSwKKwljdWdPRy1DYWxsQmFycmVkICAoMil9CisKK21heE51bU9mQ1VHICBJTlRFR0VSIDo6PSAxMAorCitDVUctRmVhdHVyZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mRXh0LUJhc2ljU2VydmljZUdyb3VwcykgT0YKKwkJCQlDVUctRmVhdHVyZQorCitFeHQtQmFzaWNTZXJ2aWNlR3JvdXBMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkV4dC1CYXNpY1NlcnZpY2VHcm91cHMpIE9GCisJCQkJRXh0LUJhc2ljU2VydmljZUNvZGUKKworbWF4TnVtT2ZFeHQtQmFzaWNTZXJ2aWNlR3JvdXBzICBJTlRFR0VSIDo6PSAzMgorCitDVUctRmVhdHVyZSA6Oj0gU0VRVUVOQ0UgeworCWJhc2ljU2VydmljZQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlwcmVmZXJlbnRpYWxDVUctSW5kaWNhdG9yCUNVRy1JbmRleAlPUFRJT05BTCwKKwlpbnRlckNVRy1SZXN0cmljdGlvbnMJSW50ZXJDVUctUmVzdHJpY3Rpb25zLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitJbnRlckNVRy1SZXN0cmljdGlvbnMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisKKwktLSBiaXRzIDg3NjU0MzogMDAwMDAwICh1bnVzZWQpCisJLS0gRXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIGJpdHMgODc2NTQzIHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kCisKKwktLSBiaXRzIDIxCisJLS0JMDAgIENVRyBvbmx5IGZhY2lsaXRpZXMKKwktLQkwMSAgQ1VHIHdpdGggb3V0Z29pbmcgYWNjZXNzCisJLS0JMTAgIENVRyB3aXRoIGluY29taW5nIGFjY2VzcworCS0tCTExICBDVUcgd2l0aCBib3RoIG91dGdvaW5nIGFuZCBpbmNvbWluZyBhY2Nlc3MKKworRXh0LVNTLURhdGEgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCXNzLVN0YXR1cwlbNF0gRXh0LVNTLVN0YXR1cywKKwlzcy1TdWJzY3JpcHRpb25PcHRpb24JU1MtU3Vic2NyaXB0aW9uT3B0aW9uCU9QVElPTkFMLAorCWJhc2ljU2VydmljZUdyb3VwTGlzdAlFeHQtQmFzaWNTZXJ2aWNlR3JvdXBMaXN0CU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTENTLVByaXZhY3lFeGNlcHRpb25MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlByaXZhY3lDbGFzcykgT0YKKwkJCQlMQ1MtUHJpdmFjeUNsYXNzCisKK21heE51bU9mUHJpdmFjeUNsYXNzICBJTlRFR0VSIDo6PSA0CisKK0xDUy1Qcml2YWN5Q2xhc3MgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCXNzLVN0YXR1cwkJRXh0LVNTLVN0YXR1cywKKwlub3RpZmljYXRpb25Ub01TVXNlcglbMF0gTm90aWZpY2F0aW9uVG9NU1VzZXIJT1BUSU9OQUwsCisJLS0gbm90aWZpY2F0aW9uVG9NU1VzZXIgbWF5IGJlIHNlbnQgb25seSBmb3IgU1MtY29kZXMgY2FsbFNlc3Npb25SZWxhdGVkCisJLS0gYW5kIGNhbGxTZXNzaW9uVW5yZWxhdGVkLiBJZiBub3QgcmVjZWl2ZWQgZm9yIFNTLWNvZGVzIGNhbGxTZXNzaW9uUmVsYXRlZAorCS0tIGFuZCBjYWxsU2Vzc2lvblVucmVsYXRlZCwKKwktLSB0aGUgZGVmYXVsdCB2YWx1ZXMgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjMuMjcxIHNoYWxsIGJlIGFzc3VtZWQuCisJZXh0ZXJuYWxDbGllbnRMaXN0CVsxXSBFeHRlcm5hbENsaWVudExpc3QJT1BUSU9OQUwsCisJLS0gZXh0ZXJuYWxDbGllbnRMaXN0IG1heSBiZSBzZW50IG9ubHkgZm9yIFNTLWNvZGUgY2FsbFNlc3Npb25VbnJlbGF0ZWQgdG8gYQorCS0tIHZpc2l0ZWQgbm9kZSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgTENTIFJlbGVhc2UgNCBvciBsYXRlciB2ZXJzaW9ucy4KKwktLSBleHRlcm5hbENsaWVudExpc3QgbWF5IGJlIHNlbnQgb25seSBmb3IgU1MtY29kZXMgY2FsbFNlc3Npb25VbnJlbGF0ZWQgYW5kCisJLS0gY2FsbFNlc3Npb25SZWxhdGVkIHRvIGEgdmlzaXRlZCBub2RlIHRoYXQgc3VwcG9ydHMgTENTIFJlbGVhc2UgNCBvciBsYXRlciB2ZXJzaW9ucy4KKwlwbG1uQ2xpZW50TGlzdAlbMl0gUExNTkNsaWVudExpc3QJT1BUSU9OQUwsCisJLS0gcGxtbkNsaWVudExpc3QgbWF5IGJlIHNlbnQgb25seSBmb3IgU1MtY29kZSBwbG1ub3BlcmF0b3IuCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWV4dC1leHRlcm5hbENsaWVudExpc3QJWzRdIEV4dC1FeHRlcm5hbENsaWVudExpc3QJT1BUSU9OQUwsCisJLS0gRXh0LWV4dGVybmFsQ2xpZW50TGlzdCBtYXkgYmUgc2VudCBvbmx5IGlmIHRoZSB2aXNpdGVkIG5vZGUgc3VwcG9ydHMgTENTIFJlbGVhc2UgNCBvcgorCS0tIGxhdGVyIHZlcnNpb25zLCB0aGUgdXNlciBkaWQgc3BlY2lmeSBtb3JlIHRoYW4gNSBjbGllbnRzLCBhbmQgV2hpdGUgQm9vayBTQ0NQIGlzIHVzZWQuCisJc2VydmljZVR5cGVMaXN0CVs1XQlTZXJ2aWNlVHlwZUxpc3QJT1BUSU9OQUwKKwktLSBzZXJ2aWNlVHlwZUxpc3QgbWF5IGJlIHNlbnQgb25seSBmb3IgU1MtY29kZSBzZXJ2aWNlVHlwZSBhbmQgaWYgdGhlIHZpc2l0ZWQgbm9kZQorCS0tIHN1cHBvcnRzIExDUyBSZWxlYXNlIDUgb3IgbGF0ZXIgdmVyc2lvbnMuCisJLS0gCisJLS0gaWYgc2VnbWVudGF0aW9uIGlzIHVzZWQsIHRoZSBjb21wbGV0ZSBMQ1MtUHJpdmFjeUNsYXNzIHNoYWxsIGJlIHNlbnQgaW4gb25lIHNlZ21lbnQKK30KKworRXh0ZXJuYWxDbGllbnRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgwLi5tYXhOdW1PZkV4dGVybmFsQ2xpZW50KSBPRgorCQkJCUV4dGVybmFsQ2xpZW50CisKK21heE51bU9mRXh0ZXJuYWxDbGllbnQgIElOVEVHRVIgOjo9IDUKKworUExNTkNsaWVudExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUExNTkNsaWVudCkgT0YKKwkJCQlMQ1NDbGllbnRJbnRlcm5hbElECisKK21heE51bU9mUExNTkNsaWVudCAgSU5URUdFUiA6Oj0gNQorCitFeHQtRXh0ZXJuYWxDbGllbnRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkV4dC1FeHRlcm5hbENsaWVudCkgT0YKKwkJCQlFeHRlcm5hbENsaWVudAorCittYXhOdW1PZkV4dC1FeHRlcm5hbENsaWVudCAgSU5URUdFUiA6Oj0gMzUKKworRXh0ZXJuYWxDbGllbnQgOjo9IFNFUVVFTkNFIHsKKwljbGllbnRJZGVudGl0eQlMQ1NDbGllbnRFeHRlcm5hbElELAorCWdtbGMtUmVzdHJpY3Rpb24JWzBdIEdNTEMtUmVzdHJpY3Rpb24JT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9NU1VzZXIJWzFdIE5vdGlmaWNhdGlvblRvTVNVc2VyCU9QVElPTkFMLAorCS0tIElmIG5vdGlmaWNhdGlvblRvTVNVc2VyIGlzIG5vdCByZWNlaXZlZCwgdGhlIGRlZmF1bHQgdmFsdWUgYWNjb3JkaW5nIHRvIAorCS0tIDNHUFAgVFMgMjMuMjcxIHNoYWxsIGJlIGFzc3VtZWQuCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworR01MQy1SZXN0cmljdGlvbiA6Oj0gRU5VTUVSQVRFRCB7CisJZ21sYy1MaXN0CQkoMCksCisJaG9tZS1Db3VudHJ5CSgxKSAsCisJLi4uIH0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIEF0IHJlY2VwdGlvbiBvZiBhbnkgb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZQorLS0gR01MQy1SZXN0cmljdGlvbi4KKworTm90aWZpY2F0aW9uVG9NU1VzZXIgOjo9IEVOVU1FUkFURUQgeworCW5vdGlmeUxvY2F0aW9uQWxsb3dlZAkoMCksCisJbm90aWZ5QW5kVmVyaWZ5LUxvY2F0aW9uQWxsb3dlZElmTm9SZXNwb25zZQkoMSksCisJbm90aWZ5QW5kVmVyaWZ5LUxvY2F0aW9uTm90QWxsb3dlZElmTm9SZXNwb25zZQkoMiksCisJLi4uLAorCWxvY2F0aW9uTm90QWxsb3dlZCAoMykgfQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gQXQgcmVjZXB0aW9uIG9mIGFueSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlCistLSBOb3RpZmljYXRpb25Ub01TVXNlci4KKworU2VydmljZVR5cGVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlNlcnZpY2VUeXBlKSBPRgorCQkJCVNlcnZpY2VUeXBlCisKK21heE51bU9mU2VydmljZVR5cGUgIElOVEVHRVIgOjo9IDMyCisKK1NlcnZpY2VUeXBlIDo6PSBTRVFVRU5DRSB7CisJc2VydmljZVR5cGVJZGVudGl0eQlMQ1NTZXJ2aWNlVHlwZUlELAorCWdtbGMtUmVzdHJpY3Rpb24JWzBdIEdNTEMtUmVzdHJpY3Rpb24JT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9NU1VzZXIJWzFdIE5vdGlmaWNhdGlvblRvTVNVc2VyCU9QVElPTkFMLAorCS0tIElmIG5vdGlmaWNhdGlvblRvTVNVc2VyIGlzIG5vdCByZWNlaXZlZCwgdGhlIGRlZmF1bHQgdmFsdWUgYWNjb3JkaW5nIHRvIAorCS0tIDNHUFAgVFMgMjMuMjcxIHNoYWxsIGJlIGFzc3VtZWQuCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworTU9MUi1MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZk1PTFItQ2xhc3MpIE9GCisJCQkJTU9MUi1DbGFzcworCittYXhOdW1PZk1PTFItQ2xhc3MgIElOVEVHRVIgOjo9IDMKKworTU9MUi1DbGFzcyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUsCisJc3MtU3RhdHVzCQlFeHQtU1MtU3RhdHVzLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworWm9uZUNvZGVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlpvbmVDb2RlcykKKwkJCQlPRiBab25lQ29kZQorCitab25lQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyKSkKKwktLSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIzLjAwMyBbMTddCisKK21heE51bU9mWm9uZUNvZGVzICBJTlRFR0VSIDo6PSAxMAorCitJbnNlcnRTdWJzY3JpYmVyRGF0YVJlcyA6Oj0gU0VRVUVOQ0UgeworCXRlbGVzZXJ2aWNlTGlzdAlbMV0gVGVsZXNlcnZpY2VMaXN0CU9QVElPTkFMLAorCWJlYXJlclNlcnZpY2VMaXN0CVsyXSBCZWFyZXJTZXJ2aWNlTGlzdAlPUFRJT05BTCwKKwlzcy1MaXN0CQlbM10gU1MtTGlzdAlPUFRJT05BTCwKKwlvZGItR2VuZXJhbERhdGEJWzRdIE9EQi1HZW5lcmFsRGF0YQlPUFRJT05BTCwKKwlyZWdpb25hbFN1YnNjcmlwdGlvblJlc3BvbnNlCVs1XSBSZWdpb25hbFN1YnNjcmlwdGlvblJlc3BvbnNlCU9QVElPTkFMLAorCXN1cHBvcnRlZENhbWVsUGhhc2VzCVs2XSBTdXBwb3J0ZWRDYW1lbFBoYXNlcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzddIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCW9mZmVyZWRDYW1lbDRDU0lzCVs4XSBPZmZlcmVkQ2FtZWw0Q1NJcwlPUFRJT05BTCwKKwlzdXBwb3J0ZWRGZWF0dXJlcwlbOV0gU3VwcG9ydGVkRmVhdHVyZXMJT1BUSU9OQUwgfQorCitSZWdpb25hbFN1YnNjcmlwdGlvblJlc3BvbnNlIDo6PSBFTlVNRVJBVEVEIHsKKwluZXR3b3JrTm9kZS1BcmVhUmVzdHJpY3RlZAkoMCksCisJdG9vTWFueVpvbmVDb2RlcwkoMSksCisJem9uZUNvZGVzQ29uZmxpY3QJKDIpLAorCXJlZ2lvbmFsU3Vic2NOb3RTdXBwb3J0ZWQJKDMpfQorCitEZWxldGVTdWJzY3JpYmVyRGF0YUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSSwKKwliYXNpY1NlcnZpY2VMaXN0CVsxXSBCYXNpY1NlcnZpY2VMaXN0CU9QVElPTkFMLAorCS0tIFRoZSBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHJlY2VwdGlvbiBvZiB1bnN1cHBvcnRlZC9ub3QgYWxsb2NhdGVkCisJLS0gYmFzaWNTZXJ2aWNlQ29kZXMgaXMgZGVmaW5lZCBpbiBzZWN0aW9uIDYuOC4yCisJc3MtTGlzdAkJWzJdIFNTLUxpc3QJT1BUSU9OQUwsCisJcm9hbWluZ1Jlc3RyaWN0aW9uRHVlVG9VbnN1cHBvcnRlZEZlYXR1cmUgWzRdIE5VTEwJT1BUSU9OQUwsCisJcmVnaW9uYWxTdWJzY3JpcHRpb25JZGVudGlmaWVyCVs1XSBab25lQ29kZQlPUFRJT05BTCwKKwl2YnNHcm91cEluZGljYXRpb24JWzddIE5VTEwJCU9QVElPTkFMLAorCXZnY3NHcm91cEluZGljYXRpb24JWzhdIE5VTEwJIAlPUFRJT05BTCwKKwljYW1lbFN1YnNjcmlwdGlvbkluZm9XaXRoZHJhdwlbOV0gTlVMTAkgCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNl0gRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi4sCisJZ3Byc1N1YnNjcmlwdGlvbkRhdGFXaXRoZHJhdwlbMTBdIEdQUlNTdWJzY3JpcHRpb25EYXRhV2l0aGRyYXcJT1BUSU9OQUwsCisJcm9hbWluZ1Jlc3RyaWN0ZWRJblNnc25EdWVUb1Vuc3VwcHBvcnRlZEZlYXR1cmUgWzExXSBOVUxMCU9QVElPTkFMLAorCWxzYUluZm9ybWF0aW9uV2l0aGRyYXcJWzEyXSBMU0FJbmZvcm1hdGlvbldpdGhkcmF3CU9QVElPTkFMLAorCWdtbGMtTGlzdFdpdGhkcmF3IAlbMTNdCU5VTEwJCU9QVElPTkFMLAorCWlzdEluZm9ybWF0aW9uV2l0aGRyYXcJWzE0XSBOVUxMCQlPUFRJT05BTCwKKwlzcGVjaWZpY0NTSS1XaXRoZHJhdwlbMTVdIFNwZWNpZmljQ1NJLVdpdGhkcmF3CU9QVElPTkFMLAorCWNoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzV2l0aGRyYXcJWzE2XSBOVUxMCQlPUFRJT05BTCwKKwlzdG4tc3JXaXRoZHJhdwlbMTddIE5VTEwJCU9QVElPTkFMLAorCWVwc1N1YnNjcmlwdGlvbkRhdGFXaXRoZHJhdwlbMThdIEVQUy1TdWJzY3JpcHRpb25EYXRhV2l0aGRyYXcJT1BUSU9OQUwsCisJYXBuLW9pLXJlcGxhY2VtZW50V2l0aGRyYXcJWzE5XSBOVUxMCQlPUFRJT05BTCwKKwljc2ctU3Vic2NyaXB0aW9uRGVsZXRlZAlbMjBdCU5VTEwJCU9QVElPTkFMIH0KKworU3BlY2lmaWNDU0ktV2l0aGRyYXcgOjo9IEJJVCBTVFJJTkcgeworCW8tY3NpICgwKSwKKwlzcy1jc2kgKDEpLAorCXRpZi1jc2kgKDIpLAorCWQtY3NpICgzKSwKKwl2dC1jc2kgKDQpLAorCW1vLXNtcy1jc2kgKDUpLAorCW0tY3NpICg2KSwKKwlncHJzLWNzaSAoNyksCisJdC1jc2kgKDgpLAorCW10LXNtcy1jc2kgKDkpLAorCW1nLWNzaSAoMTApLAorCW8tSU0tQ1NJICgxMSksIAorCWQtSU0tQ1NJICgxMiksCisJdnQtSU0tQ1NJICgxMykgfSAoU0laRSg4Li4zMikpIAorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gYml0cyAxMSB0byAzMSBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkIGJ5IGEgbm9uLUlQIE11bHRpbWVkaWEgQ29yZSBOZXR3b3JrIGVudGl0eS4KKy0tIGJpdHMgMC0xMCBhbmQgMTQtMzEgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBieSBhbiBJUCBNdWx0aW1lZGlhIENvcmUgTmV0d29yayBlbnRpdHkuCistLSBiaXRzIDExLTEzIGFyZSBvbmx5IGFwcGxpY2FibGUgaW4gYW4gSVAgTXVsdGltZWRpYSBDb3JlIE5ldHdvcmsuCistLSBCaXQgOCBhbmQgYml0cyAxMS0xMyBhcmUgb25seSBhcHBsaWNhYmxlIGZvciB0aGUgTm90ZVN1YnNjcmliZXJEYXRhTW9kaWZpZWQgb3BlcmF0aW9uLgorCitHUFJTU3Vic2NyaXB0aW9uRGF0YVdpdGhkcmF3IDo6PSBDSE9JQ0UgeworCWFsbEdQUlNEYXRhCU5VTEwsCisJY29udGV4dElkTGlzdAlDb250ZXh0SWRMaXN0fQorCitFUFMtU3Vic2NyaXB0aW9uRGF0YVdpdGhkcmF3IDo6PSBDSE9JQ0UgeworCWFsbEVQUy1EYXRhCU5VTEwsCisJY29udGV4dElkTGlzdAlDb250ZXh0SWRMaXN0fQorCitDb250ZXh0SWRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlBEUC1Db250ZXh0cykgT0YKKwkJCQlDb250ZXh0SWQKKworTFNBSW5mb3JtYXRpb25XaXRoZHJhdyA6Oj0gQ0hPSUNFIHsKKwlhbGxMU0FEYXRhCU5VTEwsCisJbHNhSWRlbnRpdHlMaXN0CUxTQUlkZW50aXR5TGlzdCB9CisKK0xTQUlkZW50aXR5TGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZMU0FzKSBPRgorCQkJCUxTQUlkZW50aXR5CisKK0Jhc2ljU2VydmljZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQmFzaWNTZXJ2aWNlcykgT0YKKwkJCQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQorCittYXhOdW1PZkJhc2ljU2VydmljZXMgIElOVEVHRVIgOjo9IDcwCisKK0RlbGV0ZVN1YnNjcmliZXJEYXRhUmVzIDo6PSBTRVFVRU5DRSB7CisJcmVnaW9uYWxTdWJzY3JpcHRpb25SZXNwb25zZQlbMF0gUmVnaW9uYWxTdWJzY3JpcHRpb25SZXNwb25zZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVmxyQ2FtZWxTdWJzY3JpcHRpb25JbmZvIDo6PSBTRVFVRU5DRSB7CisJby1DU0kJCVswXSBPLUNTSQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXNzLUNTSQkJWzJdIFNTLUNTSQlPUFRJT05BTCwKKwlvLUJjc21DYW1lbFREUC1Dcml0ZXJpYUxpc3QJWzRdIE8tQmNzbUNhbWVsVERQQ3JpdGVyaWFMaXN0CU9QVElPTkFMLAorCXRpZi1DU0kJCVszXSBOVUxMCU9QVElPTkFMLAorCW0tQ1NJCQlbNV0gTS1DU0kJT1BUSU9OQUwsCisJbW8tc21zLUNTSQlbNl0gU01TLUNTSQlPUFRJT05BTCwKKwl2dC1DU0kJCVs3XSBULUNTSQlPUFRJT05BTCwKKwl0LUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlbOF0gVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJZC1DU0kJCVs5XSBELUNTSQlPUFRJT05BTCwKKwltdC1zbXMtQ1NJCVsxMF0gU01TLUNTSQlPUFRJT05BTCwKKwltdC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJWzExXQlNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwKKwl9CisKK01ULXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uIG1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCU1ULXNtc0NBTUVMVERQLUNyaXRlcmlhCisKK01ULXNtc0NBTUVMVERQLUNyaXRlcmlhIDo6PSBTRVFVRU5DRSB7CisJc21zLVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlTTVMtVHJpZ2dlckRldGVjdGlvblBvaW50LAorCXRwZHUtVHlwZUNyaXRlcmlvbglbMF0JVFBEVS1UeXBlQ3JpdGVyaW9uCQlPUFRJT05BTCwKKwkuLi4gfQorCitUUERVLVR5cGVDcml0ZXJpb24gOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mVFBEVVR5cGVzKSBPRgorCU1ULVNNUy1UUERVLVR5cGUKKworCittYXhOdW1PZlRQRFVUeXBlcyBJTlRFR0VSIDo6PSA1CisKK01ULVNNUy1UUERVLVR5cGUgOjo9IEVOVU1FUkFURUQgeworCXNtcy1ERUxJVkVSIAkoMCksCisJc21zLVNVQk1JVC1SRVBPUlQgCSgxKSwKKwlzbXMtU1RBVFVTLVJFUE9SVCAJKDIpLAorCS4uLiB9CisKKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCUZvciBUUERVLVR5cGVDcml0ZXJpb24gc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkKKy0tCW90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIGFib3ZlIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgCistLQl0aGUgd2hvbGUgVFBEVS1UeXBlQ3JpdGVyaW9uIHNlcXVlbmNlLgorLS0JSW4gQ0FNRUwgcGhhc2UgNCwgc21zLVNVQk1JVC1SRVBPUlQgc2hhbGwgbm90IGJlIHVzZWQgYW5kIGEgcmVjZWl2ZWQgVFBEVS1UeXBlQ3JpdGVyaW9uCistLQlzZXF1ZW5jZSBjb250YWluaW5nIHNtcy1TVUJNSVQtUkVQT1JUIHNoYWxsIGJlIHdob2xseSBpZ25vcmVkLgorCitELUNTSSA6Oj0gU0VRVUVOQ0UgeworCWRwLUFuYWx5c2VkSW5mb0NyaXRlcmlhTGlzdAlbMF0gRFAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0CU9QVElPTkFMLAorCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCVsxXSBDYW1lbENhcGFiaWxpdHlIYW5kbGluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbM10JTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbNF0JTlVMTAkJT1BUSU9OQUwsCisJLi4ufSAKKy0tCW5vdGlmaWNhdGlvblRvQ1NFIGFuZCBjc2ktQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gRC1DU0kgaXMgc2VudCB0byBWTFIvR01TQy4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKy0tCURQLUFuYWx5c2VkSW5mb0NyaXRlcmlhIGFuZCAgY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcgc2hhbGwgYmUgcHJlc2VudCBpbiAKKy0tCXRoZSBELUNTSSBzZXF1ZW5jZS4KKy0tCUlmIEQtQ1NJIGlzIHNlZ21lbnRlZCwgdGhlbiB0aGUgZmlyc3Qgc2VnbWVudCBzaGFsbCBjb250YWluIGRwLUFuYWx5c2VkSW5mb0NyaXRlcmlhTGlzdAorLS0JYW5kIGNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nLiBTdWJzZXF1ZW50IHNlZ21lbnRzIHNoYWxsIG5vdCBjb250YWluCistLQljYW1lbENhcGFiaWxpdHlIYW5kbGluZywgYnV0IG1heSBjb250YWluIGRwLUFuYWx5c2VkSW5mb0NyaXRlcmlhTGlzdC4KKworRFAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0ICA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZEUC1BbmFseXNlZEluZm9Dcml0ZXJpYSkgT0YKKwkJCQlEUC1BbmFseXNlZEluZm9Dcml0ZXJpdW0KKworbWF4TnVtT2ZEUC1BbmFseXNlZEluZm9Dcml0ZXJpYSBJTlRFR0VSIDo6PSAxMAorCitEUC1BbmFseXNlZEluZm9Dcml0ZXJpdW0gOjo9IFNFUVVFTkNFIHsKKwlkaWFsbGVkTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlzZXJ2aWNlS2V5CVNlcnZpY2VLZXksCisJZ3NtU0NGLUFkZHJlc3MJSVNETi1BZGRyZXNzU3RyaW5nLAorCWRlZmF1bHRDYWxsSGFuZGxpbmcJRGVmYXVsdENhbGxIYW5kbGluZywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU1MtQ1NJIDo6PSBTRVFVRU5DRSB7CisJc3MtQ2FtZWxEYXRhCVNTLUNhbWVsRGF0YSwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlub3RpZmljYXRpb25Ub0NTRQlbMF0JTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbMV0JTlVMTAkJT1BUSU9OQUwKKy0tCW5vdGlmaWNhdGlvblRvQ1NFIGFuZCBjc2ktQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gU1MtQ1NJIGlzIHNlbnQgdG8gVkxSLgorLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgorfQorCitTUy1DYW1lbERhdGEgIDo6PSBTRVFVRU5DRSB7CisJc3MtRXZlbnRMaXN0CVNTLUV2ZW50TGlzdCwKKwlnc21TQ0YtQWRkcmVzcwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsIAorCS4uLn0KKworU1MtRXZlbnRMaXN0ICA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFNTRXZlbnRzKSBPRiBTUy1Db2RlCisJLS0gQWN0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBTUy1Db2RlIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiBDQU1FTCBQaGFzZSAzOgorCS0tIGVjdAkJU1MtQ29kZSA6Oj0gJzAwMTEwMDAxJ0IKKwktLSBtdWx0aVBUWQlTUy1Db2RlIDo6PSAnMDEwMTAwMDEnQgorCS0tIGNkCQlTUy1Db2RlIDo6PSAnMDAxMDAxMDAnQgorCS0tIGNjYnMJCVNTLUNvZGUgOjo9ICcwMTAwMDEwMCdCCisJLS0gYWxsIG90aGVyIFNTIGNvZGVzIHNoYWxsIGJlIGlnbm9yZWQKKwktLSBXaGVuIFNTLUNTSSBpcyBzZW50IHRvIHRoZSBWTFIsIGl0IHNoYWxsIG5vdCBjb250YWluIGEgbWFya2luZyBmb3IgY2Nicy4KKwktLSBJZiB0aGUgVkxSIHJlY2VpdmVzIFNTLUNTSSBjb250YWluaW5nIGEgbWFya2luZyBmb3IgY2NicywgdGhlIFZMUiBzaGFsbCBkaXNjYXJkIHRoZQorCS0tIGNjYnMgbWFya2luZyBpbiBTUy1DU0kuCisKK21heE51bU9mQ2FtZWxTU0V2ZW50cyBJTlRFR0VSIDo6PSAxMAorCitPLUNTSSA6Oj0gU0VRVUVOQ0UgeworCW8tQmNzbUNhbWVsVERQRGF0YUxpc3QJTy1CY3NtQ2FtZWxURFBEYXRhTGlzdCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwljYW1lbENhcGFiaWxpdHlIYW5kbGluZwlbMF0gQ2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9DU0UJWzFdCU5VTEwJCU9QVElPTkFMLAorCWNzaUFjdGl2ZQkJWzJdCU5VTEwJCU9QVElPTkFMfQorLS0Jbm90aWZpY2F0aW9udG9DU0UgYW5kIGNzaUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIE8tQ1NJIGlzIHNlbnQgdG8gVkxSL0dNU0MuCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuCistLQlPLUNTSSBzaGFsbCBub3QgYmUgc2VnbWVudGVkLgorCitPLUJjc21DYW1lbFREUERhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsVERQRGF0YSkgT0YKKwlPLUJjc21DYW1lbFREUERhdGEKKwktLSBPLUJjc21DYW1lbFREUERhdGFMaXN0IHNoYWxsIG5vdCBjb250YWluIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YKKwktLSBPLUJjc21DYW1lbFREUERhdGEgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZSBmb3Igby1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50LgorCS0tIEZvciBDQU1FTCBQaGFzZSAyLCB0aGlzIG1lYW5zIHRoYXQgb25seSBvbmUgaW5zdGFuY2Ugb2YgTy1CY3NtQ2FtZWxURFBEYXRhIGlzIGFsbG93ZWQKKwktLSB3aXRoIG8tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCBiZWluZyBlcXVhbCB0byBEUDIuCisKK21heE51bU9mQ2FtZWxURFBEYXRhICBJTlRFR0VSIDo6PSAxMAorCitPLUJjc21DYW1lbFREUERhdGEgOjo9IFNFUVVFTkNFIHsKKwlvLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQJTy1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50LAorCXNlcnZpY2VLZXkJU2VydmljZUtleSwKKwlnc21TQ0YtQWRkcmVzcwlbMF0gSVNETi1BZGRyZXNzU3RyaW5nLAorCWRlZmF1bHRDYWxsSGFuZGxpbmcJWzFdIERlZmF1bHRDYWxsSGFuZGxpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uCisJfQorCitTZXJ2aWNlS2V5IDo6PSBJTlRFR0VSICgwLi4yMTQ3NDgzNjQ3KQorCitPLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQgOjo9IEVOVU1FUkFURUQgeworCWNvbGxlY3RlZEluZm8gKDIpLAorCS4uLiwKKwlyb3V0ZVNlbGVjdEZhaWx1cmUgKDQpIH0KKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gRm9yIE8tQmNzbUNhbWVsVERQRGF0YSBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQorCS0tIG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlIAorCS0tIE8tQmNzbUNhbWVsVERQRGF0YXNlcXVlbmNlLiAKKwktLSBGb3IgTy1CY3NtQ2FtZWxURFAtQ3JpdGVyaWEgc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkKKwktLSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIHRoZSB3aG9sZQorCS0tIE8tQmNzbUNhbWVsVERQLUNyaXRlcmlhIHNlcXVlbmNlLgorCitPLUJjc21DYW1lbFREUENyaXRlcmlhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCisJTy1CY3NtQ2FtZWxURFAtQ3JpdGVyaWEgCisKK1QtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsVERQRGF0YSkgT0YKKwlULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhIAorCitPLUJjc21DYW1lbFREUC1Dcml0ZXJpYSA6Oj0gU0VRVUVOQ0UgeworCW8tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlPLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCQorCWRlc3RpbmF0aW9uTnVtYmVyQ3JpdGVyaWEgCVswXSBEZXN0aW5hdGlvbk51bWJlckNyaXRlcmlhCU9QVElPTkFMLAorCWJhc2ljU2VydmljZUNyaXRlcmlhCVsxXSBCYXNpY1NlcnZpY2VDcml0ZXJpYQlPUFRJT05BTCwKKwljYWxsVHlwZUNyaXRlcmlhCVsyXSBDYWxsVHlwZUNyaXRlcmlhCU9QVElPTkFMLAorCS4uLiwKKwlvLUNhdXNlVmFsdWVDcml0ZXJpYQlbM10gTy1DYXVzZVZhbHVlQ3JpdGVyaWEJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwgfQorCitULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhIDo6PSBTRVFVRU5DRSB7CisJdC1CQ1NNLVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlULUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCQorCWJhc2ljU2VydmljZUNyaXRlcmlhCVswXSBCYXNpY1NlcnZpY2VDcml0ZXJpYQlPUFRJT05BTCwKKwl0LUNhdXNlVmFsdWVDcml0ZXJpYQlbMV0gVC1DYXVzZVZhbHVlQ3JpdGVyaWEJT1BUSU9OQUwsCisJLi4uIH0KKworRGVzdGluYXRpb25OdW1iZXJDcml0ZXJpYSAgOjo9IFNFUVVFTkNFIHsKKwltYXRjaFR5cGUJCVswXSBNYXRjaFR5cGUsCisJZGVzdGluYXRpb25OdW1iZXJMaXN0IAlbMV0gRGVzdGluYXRpb25OdW1iZXJMaXN0CU9QVElPTkFMLAorCWRlc3RpbmF0aW9uTnVtYmVyTGVuZ3RoTGlzdAlbMl0gRGVzdGluYXRpb25OdW1iZXJMZW5ndGhMaXN0CU9QVElPTkFMLAorCS0tIG9uZSBvciBib3RoIG9mIGRlc3RpbmF0aW9uTnVtYmVyTGlzdCBhbmQgZGVzdGluYXRpb25OdW1iZXJMZW5ndGhMaXN0IAorCS0tIHNoYWxsIGJlIHByZXNlbnQKKwkuLi59CisKK0Rlc3RpbmF0aW9uTnVtYmVyTGlzdCAgOjo9IFNFUVVFTkNFIFNJWkUJKDEuLm1heE51bU9mQ2FtZWxEZXN0aW5hdGlvbk51bWJlcnMpIE9GCisJCQkJSVNETi1BZGRyZXNzU3RyaW5nCisJLS0gVGhlIHJlY2VpdmluZyBlbnRpdHkgc2hhbGwgbm90IGNoZWNrIHRoZSBmb3JtYXQgb2YgYSBudW1iZXIgaW4KKwktLSB0aGUgZGlhbGxlZCBudW1iZXIgbGlzdAorCitEZXN0aW5hdGlvbk51bWJlckxlbmd0aExpc3QgIDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsRGVzdGluYXRpb25OdW1iZXJMZW5ndGhzKSBPRiAKKwkJCQkJSU5URUdFUigxLi5tYXhOdW1PZklTRE4tQWRkcmVzc0RpZ2l0cykKKworQmFzaWNTZXJ2aWNlQ3JpdGVyaWEgICA6Oj0gU0VRVUVOQ0UgU0laRSgxLi5tYXhOdW1PZkNhbWVsQmFzaWNTZXJ2aWNlQ3JpdGVyaWEpIE9GCisJRXh0LUJhc2ljU2VydmljZUNvZGUKKworbWF4TnVtT2ZJU0ROLUFkZHJlc3NEaWdpdHMgIElOVEVHRVIgOjo9IDE1CisKK21heE51bU9mQ2FtZWxEZXN0aW5hdGlvbk51bWJlcnMgIElOVEVHRVIgOjo9IDEwCisKK21heE51bU9mQ2FtZWxEZXN0aW5hdGlvbk51bWJlckxlbmd0aHMgIElOVEVHRVIgOjo9IDMKKworbWF4TnVtT2ZDYW1lbEJhc2ljU2VydmljZUNyaXRlcmlhICBJTlRFR0VSIDo6PSA1CisKK0NhbGxUeXBlQ3JpdGVyaWEgICAgICAgOjo9IEVOVU1FUkFURUQgeworCWZvcndhcmRlZCAJKDApLAorCW5vdEZvcndhcmRlZAkoMSl9CisKK01hdGNoVHlwZSAgICAgICA6Oj0gRU5VTUVSQVRFRCB7CisJaW5oaWJpdGluZyAJKDApLAorCWVuYWJsaW5nCQkoMSl9CisKK08tQ2F1c2VWYWx1ZUNyaXRlcmlhICAgOjo9IFNFUVVFTkNFIFNJWkUoMS4ubWF4TnVtT2ZDQU1FTC1PLUNhdXNlVmFsdWVDcml0ZXJpYSkgT0YKKwlDYXVzZVZhbHVlCisKK1QtQ2F1c2VWYWx1ZUNyaXRlcmlhICAgOjo9IFNFUVVFTkNFIFNJWkUoMS4ubWF4TnVtT2ZDQU1FTC1ULUNhdXNlVmFsdWVDcml0ZXJpYSkgT0YKKwlDYXVzZVZhbHVlCisKK21heE51bU9mQ0FNRUwtTy1DYXVzZVZhbHVlQ3JpdGVyaWEgIElOVEVHRVIgOjo9IDUKKworbWF4TnVtT2ZDQU1FTC1ULUNhdXNlVmFsdWVDcml0ZXJpYSAgSU5URUdFUiA6Oj0gNQorCitDYXVzZVZhbHVlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUoMSkpCistLSBUeXBlIGV4dHJhY3RlZCBmcm9tIENhdXNlIHBhcmFtZXRlciBpbiBJVFUtVCBSZWNvbW1lbmRhdGlvbiBRLjc2My4KKy0tIEZvciB0aGUgdXNlIG9mIGNhdXNlIHZhbHVlIHJlZmVyIHRvIElUVS1UIFJlY29tbWVuZGF0aW9uIFEuODUwLgorCitEZWZhdWx0Q2FsbEhhbmRsaW5nIDo6PSBFTlVNRVJBVEVEIHsKKwljb250aW51ZUNhbGwgKDApICwKKwlyZWxlYXNlQ2FsbCAoMSkgLAorCS4uLn0KKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyBpbiByYW5nZSAyLTMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgImNvbnRpbnVlQ2FsbCIKKwktLSByZWNlcHRpb24gb2YgdmFsdWVzIGdyZWF0ZXIgdGhhbiAzMSBzaGFsbCBiZSB0cmVhdGVkIGFzICJyZWxlYXNlQ2FsbCIKKworQ2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcgOjo9IElOVEVHRVIoMS4uMTYpIAorCS0tIHZhbHVlIDEgPSBDQU1FTCBwaGFzZSAxLAorCS0tIHZhbHVlIDIgPSBDQU1FTCBwaGFzZSAyLAorCS0tIHZhbHVlIDMgPSBDQU1FTCBQaGFzZSAzLAorCS0tIHZhbHVlIDQgPSBDQU1FTCBwaGFzZSA0OgorCS0tIHJlY2VwdGlvbiBvZiB2YWx1ZXMgZ3JlYXRlciB0aGFuIDQgc2hhbGwgYmUgdHJlYXRlZCBhcyBDQU1FTCBwaGFzZSA0LgorCitTdXBwb3J0ZWRDYW1lbFBoYXNlcyA6Oj0gQklUIFNUUklORyB7CisJcGhhc2UxICgwKSwKKwlwaGFzZTIgKDEpLAorCXBoYXNlMyAoMiksCisJcGhhc2U0ICgzKX0gKFNJWkUgKDEuLjE2KSkgCistLSBBIG5vZGUgc2hhbGwgbWFyayBpbiB0aGUgQklUIFNUUklORyBhbGwgQ0FNRUwgUGhhc2VzIGl0IHN1cHBvcnRzLgorLS0gT3RoZXIgdmFsdWVzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworT2ZmZXJlZENhbWVsNENTSXMgOjo9IEJJVCBTVFJJTkcgeyAJCisJby1jc2kJCSgwKSwKKwlkLWNzaQkJKDEpLAorCXZ0LWNzaQkJKDIpLAorCXQtY3NpCQkoMyksCisJbXQtc21zLWNzaQkoNCksCisJbWctY3NpCQkoNSksCisJcHNpLWVuaGFuY2VtZW50cwkoNikgCit9IChTSVpFICg3Li4xNikpCistLSBBIG5vZGUgc3VwcG9ydGluZyBDYW1lbCBwaGFzZSA0IHNoYWxsIG1hcmsgaW4gdGhlIEJJVCBTVFJJTkcgYWxsIENhbWVsNCBDU0lzIAorLS0gaXQgb2ZmZXJzLgorLS0gT3RoZXIgdmFsdWVzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworT2ZmZXJlZENhbWVsNEZ1bmN0aW9uYWxpdGllcyA6Oj0gQklUIFNUUklORyB7IAkKKwlpbml0aWF0ZUNhbGxBdHRlbXB0CSgwKSwKKwlzcGxpdExlZwkJKDEpLAorCW1vdmVMZWcJCSgyKSwKKwlkaXNjb25uZWN0TGVnCSgzKSwKKwllbnRpdHlSZWxlYXNlZAkoNCksCisJZGZjLVdpdGhBcmd1bWVudAkoNSksCisJcGxheVRvbmUJCSg2KSwKKwlkdG1mLU1pZENhbGwJKDcpLAorCWNoYXJnaW5nSW5kaWNhdG9yCSg4KSwKKwlhbGVydGluZ0RQCSg5KSwKKwlsb2NhdGlvbkF0QWxlcnRpbmcJKDEwKSwKKwljaGFuZ2VPZlBvc2l0aW9uRFAJKDExKSwKKwlvci1JbnRlcmFjdGlvbnMJKDEyKSwKKwl3YXJuaW5nVG9uZUVuaGFuY2VtZW50cwkoMTMpLAorCWNmLUVuaGFuY2VtZW50cwkoMTQpLAorCXN1YnNjcmliZWRFbmhhbmNlZERpYWxsZWRTZXJ2aWNlcyAJKDE1KSwKKwlzZXJ2aW5nTmV0d29ya0VuaGFuY2VkRGlhbGxlZFNlcnZpY2VzICgxNiksCisJY3JpdGVyaWFGb3JDaGFuZ2VPZlBvc2l0aW9uRFAJKDE3KSwKKwlzZXJ2aWNlQ2hhbmdlRFAJKDE4KSwKKwljb2xsZWN0SW5mb3JtYXRpb24JKDE5KQorfSAoU0laRSAoMTUuLjY0KSkKKy0tIEEgbm9kZSBzdXBwb3J0aW5nIENhbWVsIHBoYXNlIDQgc2hhbGwgbWFyayBpbiB0aGUgQklUIFNUUklORyBhbGwgQ0FNRUw0IAorLS0gZnVuY3Rpb25hbGl0aWVzIGl0IG9mZmVycy4KKy0tIE90aGVyIHZhbHVlcyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1NNUy1DU0kgOjo9IFNFUVVFTkNFIHsKKwlzbXMtQ0FNRUwtVERQLURhdGFMaXN0CVswXSBTTVMtQ0FNRUwtVERQLURhdGFMaXN0CU9QVElPTkFMLAorCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCVsxXSBDYW1lbENhcGFiaWxpdHlIYW5kbGluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbM10gTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbNF0gTlVMTAkJT1BUSU9OQUwsCisJLi4ufQorLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQKKy0tCXdoZW4gTU8tU01TLUNTSSBvciBNVC1TTVMtQ1NJIGlzIHNlbnQgdG8gVkxSIG9yIFNHU04uCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuCistLQlTTVMtQ0FNRUwtVERQLURhdGEgYW5kICBjYW1lbENhcGFiaWxpdHlIYW5kbGluZyBzaGFsbCBiZSBwcmVzZW50IGluIAorLS0JdGhlIFNNUy1DU0kgc2VxdWVuY2UuCistLQlJZiBTTVMtQ1NJIGlzIHNlZ21lbnRlZCwgc21zLUNBTUVMLVREUC1EYXRhTGlzdCBhbmQgY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcgc2hhbGwgYmUgCistLQlwcmVzZW50IGluIHRoZSBmaXJzdCBzZWdtZW50CisKK1NNUy1DQU1FTC1URFAtRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCVNNUy1DQU1FTC1URFAtRGF0YQorLS0JU01TLUNBTUVMLVREUC1EYXRhTGlzdCBzaGFsbCBub3QgY29udGFpbiBtb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mCistLQlTTVMtQ0FNRUwtVERQLURhdGEgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZSBmb3Igc21zLVRyaWdnZXJEZXRlY3Rpb25Qb2ludC4KKworU01TLUNBTUVMLVREUC1EYXRhIDo6PSBTRVFVRU5DRSB7CisJc21zLVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlbMF0gU01TLVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwKKwlzZXJ2aWNlS2V5CVsxXSBTZXJ2aWNlS2V5LAorCWdzbVNDRi1BZGRyZXNzCVsyXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJZGVmYXVsdFNNUy1IYW5kbGluZwlbM10gRGVmYXVsdFNNUy1IYW5kbGluZywKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4KKwl9CisKK1NNUy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQgOjo9IEVOVU1FUkFURUQgeworCXNtcy1Db2xsZWN0ZWRJbmZvICgxKSwKKwkuLi4sCisJc21zLURlbGl2ZXJ5UmVxdWVzdCAoMikKKwl9CistLQlleGNlcHRpb24gaGFuZGxpbmc6CistLQlGb3IgU01TLUNBTUVMLVREUC1EYXRhIGFuZCBNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYSBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIAorLS0JcGFyYW1ldGVyIHdpdGggYW55IG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUKKy0tCXRoZSB3aG9sZSBzZXF1ZW5jZS4KKy0tCistLQlJZiB0aGlzIHBhcmFtZXRlciBpcyByZWNlaXZlZCB3aXRoIGFueSBvdGhlciB2YWx1ZSB0aGFuIHNtcy1Db2xsZWN0ZWRJbmZvCistLQlpbiBhbiBTTVMtQ0FNRUwtVERQLURhdGEgc2VxdWVuY2UgY29udGFpbmVkIGluIG1vLXNtcy1DU0ksIHRoZW4gdGhlIHJlY2VpdmVyIHNoYWxsCistLQlpZ25vcmUgdGhlIHdob2xlIFNNUy1DQU1FTC1URFAtRGF0YSBzZXF1ZW5jZS4KKy0tCistLQlJZiB0aGlzIHBhcmFtZXRlciBpcyByZWNlaXZlZCB3aXRoIGFueSBvdGhlciB2YWx1ZSB0aGFuIHNtcy1EZWxpdmVyeVJlcXVlc3QKKy0tCWluIGFuIFNNUy1DQU1FTC1URFAtRGF0YSBzZXF1ZW5jZSBjb250YWluZWQgaW4gbXQtc21zLUNTSSB0aGVuIHRoZSByZWNlaXZlciBzaGFsbAorLS0JaWdub3JlIHRoZSB3aG9sZSBTTVMtQ0FNRUwtVERQLURhdGEgc2VxdWVuY2UuCistLQorLS0JSWYgdGhpcyBwYXJhbWV0ZXIgaXMgcmVjZWl2ZWQgd2l0aCBhbnkgb3RoZXIgdmFsdWUgdGhhbiBzbXMtRGVsaXZlcnlSZXF1ZXN0CistLQlpbiBhbiBNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYSBzZXF1ZW5jZSB0aGVuIHRoZSByZWNlaXZlciBzaGFsbAorLS0JaWdub3JlIHRoZSB3aG9sZSBNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYSBzZXF1ZW5jZS4KKworRGVmYXVsdFNNUy1IYW5kbGluZyA6Oj0gRU5VTUVSQVRFRCB7CisJY29udGludWVUcmFuc2FjdGlvbiAoMCkgLAorCXJlbGVhc2VUcmFuc2FjdGlvbiAoMSkgLAorCS4uLn0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCXJlY2VwdGlvbiBvZiB2YWx1ZXMgaW4gcmFuZ2UgMi0zMSBzaGFsbCBiZSB0cmVhdGVkIGFzICJjb250aW51ZVRyYW5zYWN0aW9uIgorLS0JcmVjZXB0aW9uIG9mIHZhbHVlcyBncmVhdGVyIHRoYW4gMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAicmVsZWFzZVRyYW5zYWN0aW9uIgorCitNLUNTSSA6Oj0gU0VRVUVOQ0UgeworCW1vYmlsaXR5VHJpZ2dlcnMJTW9iaWxpdHlUcmlnZ2VycywKKwlzZXJ2aWNlS2V5CVNlcnZpY2VLZXksCisJZ3NtU0NGLUFkZHJlc3MJWzBdCUlTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJWzFdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbMl0gTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbM10gTlVMTAkJT1BUSU9OQUwsCisJLi4ufQorLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQgd2hlbiBNLUNTSSBpcyBzZW50IHRvIFZMUi4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKworTUctQ1NJIDo6PSBTRVFVRU5DRSB7CisJbW9iaWxpdHlUcmlnZ2VycwlNb2JpbGl0eVRyaWdnZXJzLAorCXNlcnZpY2VLZXkJU2VydmljZUtleSwKKwlnc21TQ0YtQWRkcmVzcwlbMF0JSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVsyXSBOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVszXSBOVUxMCQlPUFRJT05BTCwKKwkuLi59CistLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIE1HLUNTSSBpcyBzZW50IHRvIFNHU04uCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuCisKK01vYmlsaXR5VHJpZ2dlcnMgIDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZk1vYmlsaXR5VHJpZ2dlcnMpIE9GCisJTU0tQ29kZQorCittYXhOdW1PZk1vYmlsaXR5VHJpZ2dlcnMgSU5URUdFUiA6Oj0gMTAKKworTU0tQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKy0tCVRoaXMgdHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGEgTW9iaWxpdHkgTWFuYWdlbWVudCBldmVudC4KKy0tCUFjdGlvbnMgZm9yIHRoZSBmb2xsb3dpbmcgTU0tQ29kZSB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gQ0FNRUwgUGhhc2UgNDoKKy0tCistLQlDUyBkb21haW4gTU0gZXZlbnRzOgorLS0JTG9jYXRpb24tdXBkYXRlLWluLXNhbWUtVkxSCU1NLUNvZGUgOjo9ICcwMDAwMDAwMCdCCistLQlMb2NhdGlvbi11cGRhdGUtdG8tb3RoZXItVkxSCU1NLUNvZGUgOjo9ICcwMDAwMDAwMSdCCistLQlJTVNJLUF0dGFjaAlNTS1Db2RlIDo6PSAnMDAwMDAwMTAnQgorLS0JTVMtaW5pdGlhdGVkLUlNU0ktRGV0YWNoCU1NLUNvZGUgOjo9ICcwMDAwMDAxMSdCCistLQlOZXR3b3JrLWluaXRpYXRlZC1JTVNJLURldGFjaAlNTS1Db2RlIDo6PSAnMDAwMDAxMDAnQgorLS0KKy0tCVBTIGRvbWFpbiBNTSBldmVudHM6CistLQlSb3V0ZWluZy1BcmVhLXVwZGF0ZS1pbi1zYW1lLVNHU04JTU0tQ29kZSA6Oj0gJzEwMDAwMDAwJ0IKKy0tCVJvdXRlaW5nLUFyZWEtdXBkYXRlLXRvLW90aGVyLVNHU04tdXBkYXRlLWZyb20tbmV3LVNHU04KKy0tCQkJCU1NLUNvZGUgOjo9ICcxMDAwMDAwMSdCCistLQlSb3V0ZWluZy1BcmVhLXVwZGF0ZS10by1vdGhlci1TR1NOLWRpc2Nvbm5lY3QtYnktZGV0YWNoCistLQkJCQlNTS1Db2RlIDo6PSAnMTAwMDAwMTAnQgorLS0JR1BSUy1BdHRhY2gJTU0tQ29kZSA6Oj0gJzEwMDAwMDExJ0IKKy0tCU1TLWluaXRpYXRlZC1HUFJTLURldGFjaAlNTS1Db2RlIDo6PSAnMTAwMDAxMDAnQgorLS0JTmV0d29yay1pbml0aWF0ZWQtR1BSUy1EZXRhY2gJTU0tQ29kZSA6Oj0gJzEwMDAwMTAxJ0IgCistLQlOZXR3b3JrLWluaXRpYXRlZC10cmFuc2Zlci10by1NUy1ub3QtcmVhY2hhYmxlLWZvci1wYWdpbmcKKy0tCQkJCU1NLUNvZGUgOjo9ICcxMDAwMDExMCdCCistLQorLS0JSWYgdGhlIE1TQyByZWNlaXZlcyBhbnkgb3RoZXIgTU0tY29kZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCBhYm92ZSBmb3IgdGhlCistLQlDUyBkb21haW4sIHRoZW4gdGhlIE1TQyBzaGFsbCBpZ25vcmUgdGhhdCBNTS1jb2RlLgorLS0JSWYgdGhlIFNHU04gcmVjZWl2ZXMgYW55IG90aGVyIE1NLWNvZGUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgYWJvdmUgZm9yIHRoZQorLS0JUFMgZG9tYWluLCB0aGVuIHRoZSBTR1NOIHNoYWxsIGlnbm9yZSB0aGF0IE1NLWNvZGUuCisKK1QtQ1NJIDo6PSBTRVFVRU5DRSB7CisJdC1CY3NtQ2FtZWxURFBEYXRhTGlzdAlULUJjc21DYW1lbFREUERhdGFMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCVswXSBDYW1lbENhcGFiaWxpdHlIYW5kbGluZwlPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbMV0gTlVMTAkJT1BUSU9OQUwsCisJY3NpLUFjdGl2ZQlbMl0gTlVMTAkJT1BUSU9OQUx9CistLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIFZULUNTSS9ULUNTSSBpcyBzZW50CistLQl0byBWTFIvR01TQy4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKy0tCVQtQ1NJIHNoYWxsIG5vdCBiZSBzZWdtZW50ZWQuCisKK1QtQmNzbUNhbWVsVERQRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCVQtQmNzbUNhbWVsVERQRGF0YQorCS0tLSBULUJjc21DYW1lbFREUERhdGFMaXN0IHNoYWxsIG5vdCBjb250YWluIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YKKwktLS0gVC1CY3NtQ2FtZWxURFBEYXRhIGNvbnRhaW5pbmcgdGhlIHNhbWUgdmFsdWUgZm9yIHQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludC4KKwktLS0gRm9yIENBTUVMIFBoYXNlIDIsIHRoaXMgbWVhbnMgdGhhdCBvbmx5IG9uZSBpbnN0YW5jZSBvZiBULUJjc21DYW1lbFREUERhdGEgaXMgYWxsb3dlZAorCS0tLSB3aXRoIHQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCBiZWluZyBlcXVhbCB0byBEUDEyLiAKKwktLS0gRm9yIENBTUVMIFBoYXNlIDMsIG1vcmUgVERQknMgYXJlIGFsbG93ZWQuCisKK1QtQmNzbUNhbWVsVERQRGF0YSA6Oj0gU0VRVUVOQ0UgeworCXQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlULUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCisJc2VydmljZUtleQlTZXJ2aWNlS2V5LAorCWdzbVNDRi1BZGRyZXNzCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJZGVmYXVsdENhbGxIYW5kbGluZwlbMV0gRGVmYXVsdENhbGxIYW5kbGluZywKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1QtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCA6Oj0gRU5VTUVSQVRFRCB7CisJdGVybUF0dGVtcHRBdXRob3JpemVkICgxMiksCisJLi4uICwKKwl0QnVzeSAoMTMpLAorCXROb0Fuc3dlciAoMTQpfQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSBGb3IgVC1CY3NtQ2FtZWxURFBEYXRhIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgcGFyYW1ldGVyIHdpdGggYW55IG90aGVyCisJLS0gdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgYWJvdmUsIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlCisJLS0gVC1CY3NtQ2FtZWxURFBEYXRhIHNlcXVlbmNlLgorCistLSBncHJzIGxvY2F0aW9uIGluZm9ybWF0aW9uIHJldHJpZXZhbCB0eXBlcworCitTZW5kUm91dGluZ0luZm9Gb3JHcHJzQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCQlbMF0gSU1TSSwKKwlnZ3NuLUFkZHJlc3MJCVsxXSBHU04tQWRkcmVzcwlPUFRJT05BTCwgCisJZ2dzbi1OdW1iZXIJCVsyXQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU2VuZFJvdXRpbmdJbmZvRm9yR3Byc1JlcyA6Oj0gU0VRVUVOQ0UgeworCXNnc24tQWRkcmVzcwkJWzBdIEdTTi1BZGRyZXNzLAorCWdnc24tQWRkcmVzcwkJWzFdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCW1vYmlsZU5vdFJlYWNoYWJsZVJlYXNvbgkJWzJdCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKKy0tIGZhaWx1cmUgcmVwb3J0IHR5cGVzCisKK0ZhaWx1cmVSZXBvcnRBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJCVswXSBJTVNJLAorCWdnc24tTnVtYmVyCQlbMV0gSVNETi1BZGRyZXNzU3RyaW5nCSwKKwlnZ3NuLUFkZHJlc3MJCVsyXSBHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitGYWlsdXJlUmVwb3J0UmVzIDo6PSBTRVFVRU5DRSB7CisJZ2dzbi1BZGRyZXNzCQlbMF0gR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gZ3BycyBub3RpZmljYXRpb24gdHlwZXMKKworTm90ZU1zUHJlc2VudEZvckdwcnNBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJCVswXSBJTVNJLAorCXNnc24tQWRkcmVzcwkJWzFdIEdTTi1BZGRyZXNzLAorCWdnc24tQWRkcmVzcwkJWzJdIEdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK05vdGVNc1ByZXNlbnRGb3JHcHJzUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCQlbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gZmF1bHQgcmVjb3ZlcnkgdHlwZXMKKworUmVzZXRBcmcgOjo9IFNFUVVFTkNFIHsKKwlobHItTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwlobHItTGlzdAkJSExSLUxpc3QJCU9QVElPTkFMLAorCS4uLn0KKworUmVzdG9yZURhdGFBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSSwKKwlsbXNpCQkJTE1TSQkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwl2bHItQ2FwYWJpbGl0eQlbNl0gVkxSLUNhcGFiaWxpdHkJT1BUSU9OQUwgfQorCitSZXN0b3JlRGF0YVJlcyA6Oj0gU0VRVUVOQ0UgeworCWhsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCW1zTm90UmVhY2hhYmxlCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gVkJTL1ZHQ1MgdHlwZXMKK1ZCU0RhdGFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlZCU0dyb3VwSWRzKSBPRgorCQkJCVZvaWNlQnJvYWRjYXN0RGF0YQorCitWR0NTRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mVkdDU0dyb3VwSWRzKSBPRgorCQkJCVZvaWNlR3JvdXBDYWxsRGF0YQorCittYXhOdW1PZlZCU0dyb3VwSWRzICBJTlRFR0VSIDo6PSA1MAorCittYXhOdW1PZlZHQ1NHcm91cElkcyAgSU5URUdFUiA6Oj0gNTAKKworVm9pY2VHcm91cENhbGxEYXRhICA6Oj0gU0VRVUVOQ0UgeworCWdyb3VwSWQJCUdyb3VwSWQsIAorCS0tIGdyb3VwSWQgc2hhbGwgYmUgZmlsbGVkIHdpdGggc2l4IFRCQ0QgZmlsbGVycyAoMTExMSlpZiB0aGUgbG9uZ0dyb3VwSWQgaXMgcHJlc2VudCAgCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkaXRpb25hbFN1YnNjcmlwdGlvbnMJQWRkaXRpb25hbFN1YnNjcmlwdGlvbnMJT1BUSU9OQUwsCisJYWRkaXRpb25hbEluZm8JWzBdIEFkZGl0aW9uYWxJbmZvCU9QVElPTkFMLAorCWxvbmdHcm91cElkCVsxXSBMb25nLUdyb3VwSWQJT1BUSU9OQUwgfQorCisJLS0gVm9pY2VHcm91cENhbGxEYXRhIGNvbnRhaW5pbmcgYSBsb25nR3JvdXBJZCBzaGFsbCBub3QgYmUgc2VudCB0byBWTFJzIHRoYXQgZGlkIG5vdAorCS0tIGluZGljYXRlIHN1cHBvcnQgb2YgbG9uZyBHcm91cCBJRHMgd2l0aGluIHRoZSBVcGRhdGUgTG9jYXRpb24gb3IgUmVzdG9yZSBEYXRhIAorCS0tIHJlcXVlc3QgbWVzc2FnZQorCitBZGRpdGlvbmFsSW5mbyA6Oj0gQklUIFNUUklORyAoU0laRSAoMS4uMTM2KSkKKy0tCSBSZWZlcnMgdG8gQWRkaXRpb25hbCBJbmZvIGFzIHNwZWNpZmllZCBpbiAzR1BQIFRTIDQzLjA2OCAKKworQWRkaXRpb25hbFN1YnNjcmlwdGlvbnMgOjo9IEJJVCBTVFJJTkcgeworCXByaXZpbGVnZWRVcGxpbmtSZXF1ZXN0ICgwKSwKKwllbWVyZ2VuY3lVcGxpbmtSZXF1ZXN0ICgxKSwKKwllbWVyZ2VuY3lSZXNldCAoMil9IChTSVpFICgzLi44KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitWb2ljZUJyb2FkY2FzdERhdGEgOjo9IFNFUVVFTkNFIHsKKwlncm91cGlkCQlHcm91cElkLCAKKwktLSBncm91cElkIHNoYWxsIGJlIGZpbGxlZCB3aXRoIHNpeCBUQkNEIGZpbGxlcnMgKDExMTEpaWYgdGhlIGxvbmdHcm91cElkIGlzIHByZXNlbnQKKwlicm9hZGNhc3RJbml0RW50aXRsZW1lbnQJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWxvbmdHcm91cElkCVswXSBMb25nLUdyb3VwSWQJT1BUSU9OQUwgfQorCQorLS0gVm9pY2VCcm9hZGNhc3REYXRhIGNvbnRhaW5pbmcgYSBsb25nR3JvdXBJZCBzaGFsbCBub3QgYmUgc2VudCB0byBWTFJzIHRoYXQgZGlkIG5vdAorLS0gaW5kaWNhdGUgc3VwcG9ydCBvZiBsb25nIEdyb3VwIElEcyB3aXRoaW4gdGhlIFVwZGF0ZSBMb2NhdGlvbiBvciBSZXN0b3JlIERhdGEgCisJLS0gcmVxdWVzdCBtZXNzYWdlCisKK0dyb3VwSWQgIDo6PSBUQkNELVNUUklORyAoU0laRSAoMykpCisJLS0gV2hlbiBHcm91cC1JZCBpcyBsZXNzIHRoYW4gc2l4IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLCB0aGUgVEJDRCBmaWxsZXIgKDExMTEpCisJLS0gaXMgdXNlZCB0byBmaWxsIHVudXNlZCBoYWxmIG9jdGV0cy4KKwktLSBSZWZlcnMgdG8gdGhlIEdyb3VwIElkZW50aWZpY2F0aW9uIGFzIHNwZWNpZmllZCBpbiAzR1BQIFRTIDIzLjAwMyAKKwktLSBhbmQgM0dQUCBUUyA0My4wNjgvIDQzLjA2OQorCitMb25nLUdyb3VwSWQgIDo6PSBUQkNELVNUUklORyAoU0laRSAoNCkpCisJLS0gV2hlbiBMb25nLUdyb3VwLUlkIGlzIGxlc3MgdGhhbiBlaWdodCBjaGFyYWN0ZXJzIGluIGxlbmd0aCwgdGhlIFRCQ0QgZmlsbGVyICgxMTExKQorCS0tIGlzIHVzZWQgdG8gZmlsbCB1bnVzZWQgaGFsZiBvY3RldHMuCisJLS0gUmVmZXJzIHRvIHRoZSBHcm91cCBJZGVudGlmaWNhdGlvbiBhcyBzcGVjaWZpZWQgaW4gM0dQUCBUUyAyMy4wMDMgCisJLS0gYW5kIDNHUFAgVFMgNDMuMDY4LyA0My4wNjkKKworCistLSBwcm92aWRlIHN1YnNjcmliZXIgaW5mbyB0eXBlcworCitQcm92aWRlU3Vic2NyaWJlckluZm9BcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQlbMF0gSU1TSSwKKwlsbXNpCQlbMV0gTE1TSQlPUFRJT05BTCwKKwlyZXF1ZXN0ZWRJbmZvCVsyXSBSZXF1ZXN0ZWRJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwljYWxsUHJpb3JpdHkJWzRdCUVNTFBQLVByaW9yaXR5CU9QVElPTkFMCisJfQorCitQcm92aWRlU3Vic2NyaWJlckluZm9SZXMgOjo9IFNFUVVFTkNFIHsKKwlzdWJzY3JpYmVySW5mbwlTdWJzY3JpYmVySW5mbywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU3Vic2NyaWJlckluZm8gOjo9IFNFUVVFTkNFIHsKKwlsb2NhdGlvbkluZm9ybWF0aW9uCVswXSBMb2NhdGlvbkluZm9ybWF0aW9uCU9QVElPTkFMLAorCXN1YnNjcmliZXJTdGF0ZQlbMV0gU3Vic2NyaWJlclN0YXRlCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJbG9jYXRpb25JbmZvcm1hdGlvbkdQUlMJWzNdIExvY2F0aW9uSW5mb3JtYXRpb25HUFJTCU9QVElPTkFMLAorCXBzLVN1YnNjcmliZXJTdGF0ZQlbNF0gUFMtU3Vic2NyaWJlclN0YXRlCU9QVElPTkFMLAorCWltZWkJCQlbNV0gSU1FSQkJT1BUSU9OQUwsCisJbXMtQ2xhc3NtYXJrMglbNl0gTVMtQ2xhc3NtYXJrMglPUFRJT05BTCwKKwlncHJzLU1TLUNsYXNzCVs3XSBHUFJTTVNDbGFzcwlPUFRJT05BTCwKKwltbnBJbmZvUmVzCVs4XSBNTlBJbmZvUmVzCU9QVElPTkFMIH0KKworLS0JSWYgdGhlIEhMUiByZWNlaXZlcyBsb2NhdGlvbkluZm9ybWF0aW9uLCBzdWJzY3JpYmVyU3RhdGUgb3IgbXMtQ2xhc3NtYXJrMiBmcm9tIGFuIFNHU04KKy0tCWl0IHNoYWxsIGRpc2NhcmQgdGhlbS4KKy0tCUlmIHRoZSBITFIgcmVjZWl2ZXMgbG9jYXRpb25JbmZvcm1hdGlvbkdQUlMsIHBzLVN1YnNjcmliZXJTdGF0ZSBvciBncHJzLU1TLUNsYXNzIGZyb20KKy0tCWEgVkxSIGl0IHNoYWxsIGRpc2NhcmQgdGhlbS4KKy0tCUlmIHRoZSBITFIgcmVjZWl2ZXMgcGFyYW1ldGVycyB3aGljaCBpdCBoYXMgbm90IHJlcXVlc3RlZCwgaXQgc2hhbGwgZGlzY2FyZCB0aGVtLgorCitNTlBJbmZvUmVzIDo6PSBTRVFVRU5DRSB7CisJcm91dGVpbmdOdW1iZXIJWzBdIFJvdXRlaW5nTnVtYmVyIAlPUFRJT05BTCwKKwlpbXNpCQkJWzFdIElNU0kJCU9QVElPTkFMLAorCW1zaXNkbgkJWzJdIElTRE4tQWRkcmVzc1N0cmluZyAJT1BUSU9OQUwsCisJbnVtYmVyUG9ydGFiaWxpdHlTdGF0dXMJWzNdIE51bWJlclBvcnRhYmlsaXR5U3RhdHVzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CistLQlUaGUgSU1TSSBwYXJhbWV0ZXIgY29udGFpbnMgYSBnZW5lcmljIElNU0ksIGkuZS4gaXQgaXMgbm90IHRpZWQgbmVjZXNzYXJpbHkgdG8gdGhlIAorLS0JU3Vic2NyaWJlci4gTUNDIGFuZCBNTkMgdmFsdWVzIGluIHRoaXMgSU1TSSBzaGFsbCBwb2ludCB0byB0aGUgU3Vic2NyaXB0aW9uIE5ldHdvcmsgb2YgCistLQl0aGUgU3Vic2NyaWJlci4gU2VlIDNHUFAgVFMgMjMuMDY2IFsxMDhdLgorCitSb3V0ZWluZ051bWJlciA6Oj0gVEJDRC1TVFJJTkcgKFNJWkUgKDEuLjUpKQorCisKK051bWJlclBvcnRhYmlsaXR5U3RhdHVzIDo6PSBFTlVNRVJBVEVEIHsKKwlub3RLbm93blRvQmVQb3J0ZWQJKDApLAorCW93bk51bWJlclBvcnRlZE91dAkoMSksCisJZm9yZWlnbk51bWJlclBvcnRlZFRvRm9yZWlnbk5ldHdvcmsJKDIpLAorCS4uLiwKKwlvd25OdW1iZXJOb3RQb3J0ZWRPdXQJKDQpLAorCWZvcmVpZ25OdW1iZXJQb3J0ZWRJbgkoNSkKKwl9CisJLS0JZXhjZXB0aW9uIGhhbmRsaW5nOiAKKwktLSAgcmVjZXB0aW9uIG9mIG90aGVyIHZhbHVlcyB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIHRoZSAKKwktLSAgd2hvbGUgTnVtYmVyUG9ydGFiaWxpdHlTdGF0dXM7CisJLS0gIG93bk51bWJlck5vdFBvcnRlZE91dCBvciBmb3JlaWduTnVtYmVyUG9ydGVkSW4gbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQW55IFRpbWUgCisJLS0gIEludGVycm9nYXRpb24gbWVzc2FnZS4KKworTVMtQ2xhc3NtYXJrMiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzKSkKKwktLSBUaGlzIHBhcmFtZXRlciBjYXJyaWVzIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBNUyBDbGFzc21hcmsgMiBJRSBkZWZpbmVkIGluIAorCS0tIDNHUFAgVFMgMjQuMDA4IFszNV0uCisKK0dQUlNNU0NsYXNzIDo6PSBTRVFVRU5DRSB7CisJbVNOZXR3b3JrQ2FwYWJpbGl0eQlbMF0gTVNOZXR3b3JrQ2FwYWJpbGl0eSwKKwltU1JhZGlvQWNjZXNzQ2FwYWJpbGl0eQlbMV0gTVNSYWRpb0FjY2Vzc0NhcGFiaWxpdHkJT1BUSU9OQUwKKwl9CisKK01TTmV0d29ya0NhcGFiaWxpdHkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uOCkpCisJLS0gVGhpcyBwYXJhbWV0ZXIgY2FycmllcyB0aGUgdmFsdWUgcGFydCBvZiB0aGUgTVMgTmV0d29yayBDYXBhYmlsaXR5IElFIGRlZmluZWQgaW4gCisJLS0gM0dQUCBUUyAyNC4wMDggWzM1XS4KKwkKK01TUmFkaW9BY2Nlc3NDYXBhYmlsaXR5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjUwKSkKKwktLSBUaGlzIHBhcmFtZXRlciBjYXJyaWVzIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBNUyBSYWRpbyBBY2Nlc3MgQ2FwYWJpbGl0eSBJRSBkZWZpbmVkIGluCisJLS0gM0dQUCBUUyAyNC4wMDggWzM1XS4KKworUmVxdWVzdGVkSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWxvY2F0aW9uSW5mb3JtYXRpb24JWzBdIE5VTEwJCU9QVElPTkFMLAorCXN1YnNjcmliZXJTdGF0ZQlbMV0gTlVMTAkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLCAKKwljdXJyZW50TG9jYXRpb24JWzNdIE5VTEwJCU9QVElPTkFMLAorCXJlcXVlc3RlZERvbWFpbglbNF0gRG9tYWluVHlwZQlPUFRJT05BTCwKKwlpbWVpCQkJWzZdIE5VTEwJCU9QVElPTkFMLAorCW1zLWNsYXNzbWFyawlbNV0gTlVMTAkJT1BUSU9OQUwsCisJbW5wUmVxdWVzdGVkSW5mbwlbN10gTlVMTCAJCU9QVElPTkFMIH0KKworLS0JY3VycmVudExvY2F0aW9uIHNoYWxsIGJlIGFic2VudCBpZiBsb2NhdGlvbkluZm9ybWF0aW9uIGlzIGFic2VudAorCitEb21haW5UeXBlIDo6PSAgRU5VTUVSQVRFRCB7CisJY3MtRG9tYWluCQkoMCksCisJcHMtRG9tYWluCQkoMSksCisJLi4ufQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyA+IDEgc2hhbGwgYmUgbWFwcGVkIHRvICdjcy1Eb21haW4nCisKK0xvY2F0aW9uSW5mb3JtYXRpb24gOjo9IFNFUVVFTkNFIHsKKwlhZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uCU9QVElPTkFMLAorCWdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCVswXSBHZW9ncmFwaGljYWxJbmZvcm1hdGlvbglPUFRJT05BTCwKKwl2bHItbnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbG9jYXRpb25OdW1iZXIJWzJdIExvY2F0aW9uTnVtYmVyCU9QVElPTkFMLAorCWNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJCVszXSBDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXNlbGVjdGVkTFNBLUlkCVs1XSBMU0FJZGVudGl0eQlPUFRJT05BTCwKKwltc2MtTnVtYmVyCVs2XSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZ2VvZGV0aWNJbmZvcm1hdGlvbglbN10gR2VvZGV0aWNJbmZvcm1hdGlvbglPUFRJT05BTCwgCisJY3VycmVudExvY2F0aW9uUmV0cmlldmVkCVs4XSBOVUxMCQlPUFRJT05BTCwKKwlzYWktUHJlc2VudAlbOV0gTlVMTAkJT1BUSU9OQUwgfQorLS0gc2FpLVByZXNlbnQgaW5kaWNhdGVzIHRoYXQgdGhlIGNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJIHBhcmFtZXRlciBjb250YWlucworLS0gYSBTZXJ2aWNlIEFyZWEgSWRlbnRpdHkuCistLSBjdXJyZW50TG9jYXRpb25SZXRyaWV2ZWQgc2hhbGwgYmUgcHJlc2VudCAKKy0tIGlmIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3ZXJlIHJldHJpZXZlZCBhZnRlciBhIHN1Y2Nlc3NmdWxsIHBhZ2luZy4KKworTG9jYXRpb25JbmZvcm1hdGlvbkdQUlMgOjo9IFNFUVVFTkNFIHsKKwljZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSQlbMF0gQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkgT1BUSU9OQUwsCisJcm91dGVpbmdBcmVhSWRlbnRpdHkJWzFdIFJBSWRlbnRpdHkJT1BUSU9OQUwsCisJZ2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JWzJdIEdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCU9QVElPTkFMLAorCXNnc24tTnVtYmVyCVszXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJc2VsZWN0ZWRMU0FJZGVudGl0eQlbNF0gTFNBSWRlbnRpdHkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs1XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXNhaS1QcmVzZW50CVs2XSBOVUxMCQlPUFRJT05BTCwKKwlnZW9kZXRpY0luZm9ybWF0aW9uCVs3XSBHZW9kZXRpY0luZm9ybWF0aW9uCU9QVElPTkFMLAorCWN1cnJlbnRMb2NhdGlvblJldHJpZXZlZAlbOF0gTlVMTAkJT1BUSU9OQUwsCisJYWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uCVs5XSBBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JT1BUSU9OQUwgfQorLS0gc2FpLVByZXNlbnQgaW5kaWNhdGVzIHRoYXQgdGhlIGNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJIHBhcmFtZXRlciBjb250YWlucworLS0gYSBTZXJ2aWNlIEFyZWEgSWRlbnRpdHkuCistLSBjdXJyZW50TG9jYXRpb25SZXRyaWV2ZWQgc2hhbGwgYmUgcHJlc2VudCBpZiB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24KKy0tIHdhcyByZXRyaWV2ZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCBwYWdpbmcuCisKK1JBSWRlbnRpdHkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNikpCistLSBSb3V0aW5nIEFyZWEgSWRlbnRpdHkgaXMgY29kZWQgaW4gYWNjb3JkYW5jZSB3aXRoIDNHUFAgVFMgMjkuMDYwIFsxMDVdLgorLS0gSXQgc2hhbGwgY29udGFpbiB0aGUgdmFsdWUgcGFydCBkZWZpbmVkIGluIDNHUFAgVFMgMjkuMDYwIG9ubHkuIEkuZS4gdGhlIDNHUFAgVFMgMjkuMDYwCistLSB0eXBlIGlkZW50aWZpZXIgb2N0ZXQgc2hhbGwgbm90IGJlIGluY2x1ZGVkLgorCisKK0dlb2dyYXBoaWNhbEluZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDgpKQorLS0JUmVmZXJzIHRvIGdlb2dyYXBoaWNhbCBJbmZvcm1hdGlvbiBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLgorLS0JT25seSB0aGUgZGVzY3JpcHRpb24gb2YgYW4gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCistLQlhcyBzcGVjaWZpZWQgaW4gM0dQUCBUUyAyMy4wMzIgaXMgYWxsb3dlZCB0byBiZSB1c2VkCistLQlUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGFjY29yZGluZyB0byAzR1BQIFRTIDIzLjAzMiBpcyBhcyBmb2xsb3dzOgorLS0JCVR5cGUgb2Ygc2hhcGUgKGVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGNpcmNsZSkJMSBvY3RldAorLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKKy0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworLS0JCVVuY2VydGFpbnR5IGNvZGUJCQkJMSBvY3RldAorCitHZW9kZXRpY0luZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEwKSkKKy0tCVJlZmVycyB0byBDYWxsaW5nIEdlb2RldGljIExvY2F0aW9uIGRlZmluZWQgaW4gUS43NjMgKDE5OTkpLgorLS0JT25seSB0aGUgZGVzY3JpcHRpb24gb2YgYW4gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCistLQlhcyBzcGVjaWZpZWQgaW4gUS43NjMgKDE5OTkpIGlzIGFsbG93ZWQgdG8gYmUgdXNlZAorLS0JVGhlIGludGVybmFsIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8gUS43NjMgKDE5OTkpIGlzIGFzIGZvbGxvd3M6CistLQkJU2NyZWVuaW5nIGFuZCBwcmVzZW50YXRpb24gaW5kaWNhdG9ycwkJMSBvY3RldAorLS0JCVR5cGUgb2Ygc2hhcGUgKGVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGNpcmNsZSkJMSBvY3RldAorLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKKy0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworLS0JCVVuY2VydGFpbnR5IGNvZGUJCQkJMSBvY3RldAorLS0JCUNvbmZpZGVuY2UJCQkJMSBvY3RldAorCitMb2NhdGlvbk51bWJlciA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyLi4xMCkpCisJLS0gdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIElUVS1UIFJlYyBRLjc2MworCitTdWJzY3JpYmVyU3RhdGUgOjo9IENIT0lDRSB7CisJYXNzdW1lZElkbGUJWzBdIE5VTEwsCisJY2FtZWxCdXN5CQlbMV0gTlVMTCwKKwluZXREZXROb3RSZWFjaGFibGUJTm90UmVhY2hhYmxlUmVhc29uLAorCW5vdFByb3ZpZGVkRnJvbVZMUglbMl0gTlVMTH0KKworUFMtU3Vic2NyaWJlclN0YXRlIDo6PSBDSE9JQ0UgeworCW5vdFByb3ZpZGVkRnJvbVNHU04JWzBdIE5VTEwsCisJcHMtRGV0YWNoZWQJWzFdIE5VTEwsCisJcHMtQXR0YWNoZWROb3RSZWFjaGFibGVGb3JQYWdpbmcJWzJdIE5VTEwsCisJcHMtQXR0YWNoZWRSZWFjaGFibGVGb3JQYWdpbmcJWzNdIE5VTEwsCisJcHMtUERQLUFjdGl2ZU5vdFJlYWNoYWJsZUZvclBhZ2luZwlbNF0gUERQLUNvbnRleHRJbmZvTGlzdCwKKwlwcy1QRFAtQWN0aXZlUmVhY2hhYmxlRm9yUGFnaW5nCVs1XSBQRFAtQ29udGV4dEluZm9MaXN0LAorCW5ldERldE5vdFJlYWNoYWJsZQlOb3RSZWFjaGFibGVSZWFzb24gfQorCitQRFAtQ29udGV4dEluZm9MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlBEUC1Db250ZXh0cykgT0YKKwkJCQlQRFAtQ29udGV4dEluZm8KKworUERQLUNvbnRleHRJbmZvIDo6PSBTRVFVRU5DRSB7CisJcGRwLUNvbnRleHRJZGVudGlmaWVyCVswXSBDb250ZXh0SWQsCisJcGRwLUNvbnRleHRBY3RpdmUJWzFdIE5VTEwJCU9QVElPTkFMLAorCXBkcC1UeXBlCQlbMl0gUERQLVR5cGUsCisJcGRwLUFkZHJlc3MJWzNdIFBEUC1BZGRyZXNzCU9QVElPTkFMLAorCWFwbi1TdWJzY3JpYmVkCVs0XSBBUE4JCU9QVElPTkFMLAorCWFwbi1JblVzZQkJWzVdIEFQTgkJT1BUSU9OQUwsCisJbnNhcGkJCVs2XSBOU0FQSQkJT1BUSU9OQUwsCisJdHJhbnNhY3Rpb25JZAlbN10gVHJhbnNhY3Rpb25JZAlPUFRJT05BTCwKKwl0ZWlkLUZvckduQW5kR3AJWzhdIFRFSUQJCU9QVElPTkFMLAorCXRlaWQtRm9ySXUJWzldIFRFSUQJCU9QVElPTkFMLAorCWdnc24tQWRkcmVzcwlbMTBdIEdTTi1BZGRyZXNzIAlPUFRJT05BTCwKKwlxb3MtU3Vic2NyaWJlZAlbMTFdIEV4dC1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKKwlxb3MtUmVxdWVzdGVkCVsxMl0gRXh0LVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCXFvcy1OZWdvdGlhdGVkCVsxM10gRXh0LVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCWNoYXJnaW5nSWQJWzE0XSBHUFJTQ2hhcmdpbmdJRAlPUFRJT05BTCwKKwljaGFyZ2luZ0NoYXJhY3RlcmlzdGljcwlbMTVdIENoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCU9QVElPTkFMLAorCXJuYy1BZGRyZXNzCVsxNl0gR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxN10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlxb3MyLVN1YnNjcmliZWQJWzE4XSBFeHQyLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCS0tIHFvczItU3Vic2NyaWJlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIHFvcy1TdWJzY3JpYmVkIGlzIHByZXNlbnQuCisJcW9zMi1SZXF1ZXN0ZWQJWzE5XSBFeHQyLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCS0tIHFvczItUmVxdWVzdGVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgcW9zLVJlcXVlc3RlZCBpcyBwcmVzZW50LgorCXFvczItTmVnb3RpYXRlZAlbMjBdIEV4dDItUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJLS0gcW9zMi1OZWdvdGlhdGVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgcW9zLU5lZ290aWF0ZWQgaXMgcHJlc2VudC4KKwkJcW9zMy1TdWJzY3JpYmVkCVsyMV0gRXh0My1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKKwktLSBxb3MzLVN1YnNjcmliZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MyLVN1YnNjcmliZWQgaXMgcHJlc2VudC4KKwlxb3MzLVJlcXVlc3RlZAlbMjJdIEV4dDMtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJLS0gcW9zMy1SZXF1ZXN0ZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MyLVJlcXVlc3RlZCBpcyBwcmVzZW50LgorCXFvczMtTmVnb3RpYXRlZAlbMjNdIEV4dDMtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwKKwktLSBxb3MzLU5lZ290aWF0ZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MyLU5lZ290aWF0ZWQgaXMgcHJlc2VudC4KK30KKworTlNBUEkgOjo9IElOVEVHRVIgKDAuLjE1KQorLS0JVGhpcyB0eXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIE5ldHdvcmsgbGF5ZXIgU2VydmljZSBBY2Nlc3MgUG9pbnQKKworVHJhbnNhY3Rpb25JZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4yKSkKKy0tCVRoaXMgdHlwZSBjYXJyaWVzIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbiBpZGVudGlmaWVyIHdoaWNoIGlzIHVzZWQgaW4gdGhlIAorLS0Jc2Vzc2lvbiBtYW5hZ2VtZW50IG1lc3NhZ2VzIG9uIHRoZSBhY2Nlc3MgaW50ZXJmYWNlLiBUaGUgZW5jb2RpbmcgaXMgZGVmaW5lZCBpbiAKKy0tCTNHUFAgVFMgMjQuMDA4CisKK1RFSUQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCistLQlUaGlzIHR5cGUgY2FycmllcyB0aGUgdmFsdWUgcGFydCBvZiB0aGUgVHVubmVsIEVuZHBvaW50IElkZW50aWZpZXIgd2hpY2ggaXMgdXNlZCB0byAKKy0tCWRpc3Rpbmd1aXNoIGJldHdlZW4gZGlmZmVyZW50IHR1bm5lbHMgYmV0d2VlbiB0aGUgc2FtZSBwYWlyIG9mIGVudGl0aWVzIHdoaWNoIGNvbW11bmljYXRlIAorLS0JdXNpbmcgdGhlIEdQUlMgVHVubmVsbGluZyBQcm90b2NvbCBUaGUgZW5jb2RpbmcgaXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI5LjA2MC4KKworR1BSU0NoYXJnaW5nSUQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCistLQlUaGUgQ2hhcmdpbmcgSUQgaXMgYSB1bmlxdWUgZm91ciBvY3RldCB2YWx1ZSBnZW5lcmF0ZWQgYnkgdGhlIEdHU04gd2hlbiAKKy0tCWEgUERQIENvbnRleHQgaXMgYWN0aXZhdGVkLiBBIENoYXJnaW5nIElEIGlzIGdlbmVyYXRlZCBmb3IgZWFjaCBhY3RpdmF0ZWQgY29udGV4dC4KKy0tCVRoZSBlbmNvZGluZyBpcyBkZWZpbmVkIGluIDNHUFAgVFMgMjkuMDYwLgorCitOb3RSZWFjaGFibGVSZWFzb24gOjo9IEVOVU1FUkFURUQgeworCW1zUHVyZ2VkICgwKSwKKwlpbXNpRGV0YWNoZWQgKDEpLAorCXJlc3RyaWN0ZWRBcmVhICgyKSwKKwlub3RSZWdpc3RlcmVkICgzKX0KKworLS0gYW55IHRpbWUgaW50ZXJyb2dhdGlvbiBpbmZvIHR5cGVzCisKK0FueVRpbWVJbnRlcnJvZ2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7CisJc3Vic2NyaWJlcklkZW50aXR5CVswXSBTdWJzY3JpYmVySWRlbnRpdHksCisJcmVxdWVzdGVkSW5mbwlbMV0gUmVxdWVzdGVkSW5mbywKKwlnc21TQ0YtQWRkcmVzcwlbM10gSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQW55VGltZUludGVycm9nYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKKwlzdWJzY3JpYmVySW5mbwlTdWJzY3JpYmVySW5mbywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gYW55IHRpbWUgaW5mb3JtYXRpb24gaGFuZGxpbmcgdHlwZXMKKworQW55VGltZVN1YnNjcmlwdGlvbkludGVycm9nYXRpb25BcmcgOjo9IFNFUVVFTkNFIHsKKwlzdWJzY3JpYmVySWRlbnRpdHkJWzBdIFN1YnNjcmliZXJJZGVudGl0eSwKKwlyZXF1ZXN0ZWRTdWJzY3JpcHRpb25JbmZvCVsxXSBSZXF1ZXN0ZWRTdWJzY3JpcHRpb25JbmZvLAorCWdzbVNDRi1BZGRyZXNzCVsyXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJbG9uZ0ZUTi1TdXBwb3J0ZWQJWzRdCU5VTEwJCU9QVElPTkFMLAorCS4uLn0KKworQW55VGltZVN1YnNjcmlwdGlvbkludGVycm9nYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKKwljYWxsRm9yd2FyZGluZ0RhdGEJWzFdIENhbGxGb3J3YXJkaW5nRGF0YQlPUFRJT05BTCwKKwljYWxsQmFycmluZ0RhdGEJWzJdIENhbGxCYXJyaW5nRGF0YQlPUFRJT05BTCwKKwlvZGItSW5mbwkJWzNdIE9EQi1JbmZvCU9QVElPTkFMLAorCWNhbWVsLVN1YnNjcmlwdGlvbkluZm8JWzRdIENBTUVMLVN1YnNjcmlwdGlvbkluZm8JT1BUSU9OQUwsCisJc3VwcG9ydGVkVkxSLUNBTUVMLVBoYXNlcwlbNV0gU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCisJc3VwcG9ydGVkU0dTTi1DQU1FTC1QaGFzZXMJWzZdIFN1cHBvcnRlZENhbWVsUGhhc2VzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbN10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJb2ZmZXJlZENhbWVsNENTSXNJblZMUglbOF0gT2ZmZXJlZENhbWVsNENTSXMJT1BUSU9OQUwsCisJb2ZmZXJlZENhbWVsNENTSXNJblNHU04JWzldIE9mZmVyZWRDYW1lbDRDU0lzCU9QVElPTkFMLAorCW1zaXNkbi1CUy1MaXN0CVsxMF0gTVNJU0ROLUJTLUxpc3QJT1BUSU9OQUwgfQorCitSZXF1ZXN0ZWRTdWJzY3JpcHRpb25JbmZvIDo6PSBTRVFVRU5DRSB7CisJcmVxdWVzdGVkU1MtSW5mbwlbMV0gU1MtRm9yQlMtQ29kZQlPUFRJT05BTCwKKwlvZGIJCQlbMl0gTlVMTAkJT1BUSU9OQUwsCisJcmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlbM10gUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwkJT1BUSU9OQUwsCisJc3VwcG9ydGVkVkxSLUNBTUVMLVBoYXNlcwlbNF0gTlVMTAkJT1BUSU9OQUwsCisJc3VwcG9ydGVkU0dTTi1DQU1FTC1QaGFzZXMJWzVdIE5VTEwJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbworCQkJCVs3XSBBZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbworCQkJCQkJCU9QVElPTkFMLAorCW1zaXNkbi1CUy1MaXN0CVs4XSBOVUxMCQlPUFRJT05BTCB9CisKK01TSVNETi1CUy1MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZk1TSVNETikgT0YKKwkJCQlNU0lTRE4tQlMKKworbWF4TnVtT2ZNU0lTRE4gIElOVEVHRVIgOjo9IDUwCisKKworTVNJU0ROLUJTIDo6PSBTRVFVRU5DRSB7CisJbXNpc2RuCQkJSVNETi1BZGRyZXNzU3RyaW5nLAkKKwliYXNpY1NlcnZpY2VMaXN0CVswXQlCYXNpY1NlcnZpY2VMaXN0CU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbyA6Oj0gRU5VTUVSQVRFRCB7CisJby1DU0kJCSgwKSwKKwl0LUNTSQkJKDEpLAorCXZ0LUNTSQkJKDIpLAorCXRpZi1DU0kJCSgzKSwKKwlncHJzLUNTSQkJKDQpLAorCW1vLXNtcy1DU0kJKDUpLAorCXNzLUNTSQkJKDYpLAorCW0tQ1NJCQkoNyksCisJZC1jc2kJCSg4KX0KKworQWRkaXRpb25hbFJlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8gOjo9IEVOVU1FUkFURUQgeworCW10LXNtcy1DU0kJKDApLAorCW1nLWNzaQkJKDEpLAorCW8tSU0tQ1NJIAkJKDIpLAorCWQtSU0tQ1NJCQkoMyksCisJdnQtSU0tQ1NJCSAJKDQpLAorCS4uLn0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzogdW5rbm93biB2YWx1ZXMgc2hhbGwgYmUgZGlzY2FyZGVkIGJ5IHRoZSByZWNlaXZlci4KKworQ2FsbEZvcndhcmRpbmdEYXRhIDo6PSBTRVFVRU5DRSB7CisJZm9yd2FyZGluZ0ZlYXR1cmVMaXN0CUV4dC1Gb3J3RmVhdHVyZUxpc3QsCisJbm90aWZpY2F0aW9uVG9DU0UJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ2FsbEJhcnJpbmdEYXRhIDo6PSBTRVFVRU5DRSB7CisJY2FsbEJhcnJpbmdGZWF0dXJlTGlzdAlFeHQtQ2FsbEJhckZlYXR1cmVMaXN0LAorCXBhc3N3b3JkCQlQYXNzd29yZAkJT1BUSU9OQUwsCisJd3JvbmdQYXNzd29yZEF0dGVtcHRzQ291bnRlcglXcm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworV3JvbmdQYXNzd29yZEF0dGVtcHRzQ291bnRlciA6Oj0gSU5URUdFUiAoMC4uNCkKKworT0RCLUluZm8gOjo9IFNFUVVFTkNFIHsKKwlvZGItRGF0YQkJT0RCLURhdGEsCisJbm90aWZpY2F0aW9uVG9DU0UJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDQU1FTC1TdWJzY3JpcHRpb25JbmZvIDo6PSBTRVFVRU5DRSB7CisJby1DU0kJCVswXQlPLUNTSQlPUFRJT05BTCwKKwlvLUJjc21DYW1lbFREUC1Dcml0ZXJpYUxpc3QJWzFdCU8tQmNzbUNhbWVsVERQQ3JpdGVyaWFMaXN0CU9QVElPTkFMLCAKKwlkLUNTSQkJWzJdCUQtQ1NJCU9QVElPTkFMLAorCXQtQ1NJCQlbM10JVC1DU0kJT1BUSU9OQUwsCisJdC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJWzRdCVQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CU9QVElPTkFMLAorCXZ0LUNTSQkJWzVdCVQtQ1NJCU9QVElPTkFMLAorCXZ0LUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlbNl0JVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJdGlmLUNTSQkJWzddCU5VTEwJCU9QVElPTkFMLAorCXRpZi1DU0ktTm90aWZpY2F0aW9uVG9DU0UJWzhdCU5VTEwJCU9QVElPTkFMLAorCWdwcnMtQ1NJCQlbOV0JR1BSUy1DU0kJT1BUSU9OQUwsCisJbW8tc21zLUNTSQlbMTBdCVNNUy1DU0kJT1BUSU9OQUwsCisJc3MtQ1NJCQlbMTFdCVNTLUNTSQlPUFRJT05BTCwKKwltLUNTSQkJWzEyXQlNLUNTSQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzEzXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXNwZWNpZmljQ1NJRGVsZXRlZExpc3QJWzE0XQlTcGVjaWZpY0NTSS1XaXRoZHJhdwlPUFRJT05BTCwKKwltdC1zbXMtQ1NJCVsxNV0JU01TLUNTSQlPUFRJT05BTCwKKwltdC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJWzE2XQlNVC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJbWctY3NpCQlbMTddCU1HLUNTSQlPUFRJT05BTCwKKwlvLUlNLUNTSQkJWzE4XSBPLUNTSQlPUFRJT05BTCwKKwlvLUlNLUJjc21DYW1lbFREUC1Dcml0ZXJpYUxpc3QJWzE5XSBPLUJjc21DYW1lbFREUENyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwlkLUlNLUNTSQkJWzIwXSBELUNTSQlPUFRJT05BTCwKKwl2dC1JTS1DU0kJCVsyMV0gVC1DU0kJT1BUSU9OQUwsCisJdnQtSU0tQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CVsyMl0JVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwKKwl9CisKK0FueVRpbWVNb2RpZmljYXRpb25BcmcgOjo9IFNFUVVFTkNFIHsKKwlzdWJzY3JpYmVySWRlbnRpdHkJWzBdCVN1YnNjcmliZXJJZGVudGl0eSwKKwlnc21TQ0YtQWRkcmVzcwlbMV0JSVNETi1BZGRyZXNzU3RyaW5nLAorCW1vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ0YtSW5mbwlbMl0JTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DRi1JbmZvIE9QVElPTkFMLAorCW1vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ0ItSW5mbwlbM10JTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DQi1JbmZvIE9QVElPTkFMLAorCW1vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ1NJCVs0XQlNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNTSQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzVdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlsb25nRlROLVN1cHBvcnRlZAlbNl0JTlVMTAkJT1BUSU9OQUwsCisJLi4uLAorCW1vZGlmaWNhdGlvblJlcXVlc3RGb3ItT0RCLWRhdGEJWzddCU1vZGlmaWNhdGlvblJlcXVlc3RGb3ItT0RCLWRhdGEgT1BUSU9OQUwsCisJbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1JUC1TTS1HVy1EYXRhCVs4XQlNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUlQLVNNLUdXLURhdGEgT1BUSU9OQUwgfQorCitBbnlUaW1lTW9kaWZpY2F0aW9uUmVzIDo6PSBTRVFVRU5DRSB7CisJc3MtSW5mb0Zvci1DU0UJWzBdCUV4dC1TUy1JbmZvRm9yLUNTRQlPUFRJT05BTCwKKwljYW1lbC1TdWJzY3JpcHRpb25JbmZvCVsxXQlDQU1FTC1TdWJzY3JpcHRpb25JbmZvCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlvZGItSW5mbwkJWzNdCU9EQi1JbmZvCU9QVElPTkFMIH0KKworTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DRi1JbmZvIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdCVNTLUNvZGUsCisJYmFzaWNTZXJ2aWNlCVsxXQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJCVsyXQlFeHQtU1MtU3RhdHVzCU9QVElPTkFMLAorCWZvcndhcmRlZFRvTnVtYmVyCVszXQlBZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWZvcndhcmRlZFRvU3ViYWRkcmVzcwlbNF0JSVNETi1TdWJhZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCW5vUmVwbHlDb25kaXRpb25UaW1lCVs1XQlFeHQtTm9SZXBDb25kVGltZQlPUFRJT05BTCwKKwltb2RpZnlOb3RpZmljYXRpb25Ub0NTRQlbNl0JTW9kaWZpY2F0aW9uSW5zdHJ1Y3Rpb24JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs3XQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNCLUluZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0JU1MtQ29kZSwKKwliYXNpY1NlcnZpY2UJWzFdCUV4dC1CYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXNzLVN0YXR1cwkJWzJdCUV4dC1TUy1TdGF0dXMJT1BUSU9OQUwsCisJcGFzc3dvcmQJCVszXQlQYXNzd29yZAlPUFRJT05BTCwKKwl3cm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCVs0XQlXcm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCU9QVElPTkFMLAorCW1vZGlmeU5vdGlmaWNhdGlvblRvQ1NFCVs1XQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzZdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01vZGlmaWNhdGlvblJlcXVlc3RGb3ItT0RCLWRhdGEgOjo9IFNFUVVFTkNFIHsKKwlvZGItZGF0YQkJWzBdCU9EQi1EYXRhCU9QVElPTkFMLAorCW1vZGlmeU5vdGlmaWNhdGlvblRvQ1NFCVsxXQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ1NJIDo6PSBTRVFVRU5DRSB7CisJcmVxdWVzdGVkQ2FtZWwtU3Vic2NyaXB0aW9uSW5mbwlbMF0JUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbywKKwltb2RpZnlOb3RpZmljYXRpb25Ub0NTRQlbMV0JTW9kaWZpY2F0aW9uSW5zdHJ1Y3Rpb24JT1BUSU9OQUwsCisJbW9kaWZ5Q1NJLVN0YXRlCVsyXQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkaXRpb25hbFJlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8KKwkJCQlbNF0gQWRkaXRpb25hbFJlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8KKwkJCQkJCQlPUFRJT05BTCB9CistLSByZXF1ZXN0ZWRDYW1lbC1TdWJzY3JpcHRpb25JbmZvIHNoYWxsIGJlIGRpc2NhcmRlZCBpZgorLS0gYWRkaXRpb25hbFJlcXVlc3RlZENBTUVMLVN1YnNjcmlwdGlvbkluZm8gaXMgcmVjZWl2ZWQKKworTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1JUC1TTS1HVy1EYXRhIDo6PSBTRVFVRU5DRSB7CisJbW9kaWZ5UmVnaXN0cmF0aW9uU3RhdHVzCVswXQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01vZGlmaWNhdGlvbkluc3RydWN0aW9uIDo6PSBFTlVNRVJBVEVEIHsKKwlkZWFjdGl2YXRlCSgwKSwKKwlhY3RpdmF0ZQkJKDEpfQorCistLSBzdWJzY3JpYmVyIGRhdGEgbW9kaWZpY2F0aW9uIG5vdGlmaWNhdGlvbiB0eXBlcworCitOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZEFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCW1zaXNkbgkJSVNETi1BZGRyZXNzU3RyaW5nLAorCWZvcndhcmRpbmdJbmZvRm9yLUNTRQlbMF0gRXh0LUZvcndhcmRpbmdJbmZvRm9yLUNTRQlPUFRJT05BTCwKKwljYWxsQmFycmluZ0luZm9Gb3ItQ1NFCVsxXSBFeHQtQ2FsbEJhcnJpbmdJbmZvRm9yLUNTRQlPUFRJT05BTCwKKwlvZGItSW5mbwkJWzJdIE9EQi1JbmZvCU9QVElPTkFMLAorCWNhbWVsLVN1YnNjcmlwdGlvbkluZm8JWzNdIENBTUVMLVN1YnNjcmlwdGlvbkluZm8JT1BUSU9OQUwsCisJYWxsSW5mb3JtYXRpb25TZW50CVs0XSBOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTm90ZVN1YnNjcmliZXJEYXRhTW9kaWZpZWRSZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gbW9iaWxpdHkgbWFuYWdlbWVudCBldmVudCBub3RpZmljYXRpb29uIGluZm8gdHlwZXMKKworTm90ZU1NLUV2ZW50QXJnOjo9IFNFUVVFTkNFIHsKKwlzZXJ2aWNlS2V5CVNlcnZpY2VLZXksCisJZXZlbnRNZXQJCVswXQlNTS1Db2RlLAorCWltc2kJCQlbMV0JSU1TSSwKKwltc2lzZG4JCVsyXQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJbG9jYXRpb25JbmZvcm1hdGlvbglbM10JTG9jYXRpb25JbmZvcm1hdGlvbglPUFRJT05BTCwKKwlzdXBwb3J0ZWRDQU1FTFBoYXNlcwlbNV0JU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs2XQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWxvY2F0aW9uSW5mb3JtYXRpb25HUFJTCVs3XQlMb2NhdGlvbkluZm9ybWF0aW9uR1BSUwlPUFRJT05BTCwKKwlvZmZlcmVkQ2FtZWw0RnVuY3Rpb25hbGl0aWVzCVs4XSBPZmZlcmVkQ2FtZWw0RnVuY3Rpb25hbGl0aWVzCU9QVElPTkFMCit9CisKK05vdGVNTS1FdmVudFJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLn0KKworRXh0LVNTLUluZm9Gb3ItQ1NFIDo6PSBDSE9JQ0UgeworCWZvcndhcmRpbmdJbmZvRm9yLUNTRQlbMF0gRXh0LUZvcndhcmRpbmdJbmZvRm9yLUNTRSwKKwljYWxsQmFycmluZ0luZm9Gb3ItQ1NFCVsxXSBFeHQtQ2FsbEJhcnJpbmdJbmZvRm9yLUNTRQorCX0KKworRXh0LUZvcndhcmRpbmdJbmZvRm9yLUNTRSA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXQlTUy1Db2RlLAorCWZvcndhcmRpbmdGZWF0dXJlTGlzdAlbMV0JRXh0LUZvcndGZWF0dXJlTGlzdCwKKwlub3RpZmljYXRpb25Ub0NTRQlbMl0JTlVMTAkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFeHQtQ2FsbEJhcnJpbmdJbmZvRm9yLUNTRSA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXQlTUy1Db2RlLAorCWNhbGxCYXJyaW5nRmVhdHVyZUxpc3QJWzFdCUV4dC1DYWxsQmFyRmVhdHVyZUxpc3QsCisJcGFzc3dvcmQJCVsyXQlQYXNzd29yZAlPUFRJT05BTCwKKwl3cm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCVszXQlXcm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVs0XQlOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzVdCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4ufQorCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtT00tRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLU9NLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0ZGQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLU9NLURhdGFUeXBlcy5hc24KQEAgLTAsMCArMSwyMTYgQEAKKy0tICRJZDogTUFQLU9NLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDE3LjcuMglPcGVyYXRpb24gYW5kIG1haW50ZW5hbmNlIGRhdGEgdHlwZXMKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkKKyAKK01BUC1PTS1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtT00tRGF0YVR5cGVzICgxMikgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKK0lNUExJQ0lUIFRBR1MKKworOjo9CisKK0JFR0lOCisKK0VYUE9SVFMKKwlBY3RpdmF0ZVRyYWNlTW9kZUFyZywKKwlBY3RpdmF0ZVRyYWNlTW9kZVJlcywKKwlEZWFjdGl2YXRlVHJhY2VNb2RlQXJnLAorCURlYWN0aXZhdGVUcmFjZU1vZGVSZXMsCisJVHJhY2VQcm9wYWdhdGlvbkxpc3QKKzsKKworSU1QT1JUUworCUFkZHJlc3NTdHJpbmcsCisJSU1TSQorRlJPTSBNQVAtQ29tbW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUNvbW1vbkRhdGFUeXBlcyAoMTgpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9CisKKzsKKworQWN0aXZhdGVUcmFjZU1vZGVBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJWzBdIElNU0kJCU9QVElPTkFMLAorCXRyYWNlUmVmZXJlbmNlCVsxXSBUcmFjZVJlZmVyZW5jZSwKKwl0cmFjZVR5cGUJCVsyXSBUcmFjZVR5cGUsCisJb21jLUlkCQlbM10gQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJdHJhY2VSZWZlcmVuY2UyCVs1XSBUcmFjZVJlZmVyZW5jZTIJT1BUSU9OQUwsCisJdHJhY2VEZXB0aExpc3QJWzZdIFRyYWNlRGVwdGhMaXN0CU9QVElPTkFMLAorCXRyYWNlTkUtVHlwZUxpc3QJWzddIFRyYWNlTkUtVHlwZUxpc3QJT1BUSU9OQUwsCisJdHJhY2VJbnRlcmZhY2VMaXN0CVs4XSBUcmFjZUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJdHJhY2VFdmVudExpc3QJWzldIFRyYWNlRXZlbnRMaXN0CU9QVElPTkFMCisJfQorCitUcmFjZVJlZmVyZW5jZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4yKSkKKworVHJhY2VSZWZlcmVuY2UyIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQorCitUcmFjZVJlY29yZGluZ1Nlc3Npb25SZWZlcmVuY2UgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMikpCisKK1RyYWNlVHlwZSA6Oj0gSU5URUdFUgorCSgwLi4yNTUpCisJLS0gVHJhY2UgdHlwZXMgYXJlIGZ1bGx5IGRlZmluZWQgaW4gIDNHUFAgVFMgNTIuMDA4LiBbNjFdCisKK1RyYWNlRGVwdGhMaXN0IDo6PSBTRVFVRU5DRSB7CisJbXNjLXMtVHJhY2VEZXB0aAlbMF0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwltZ3ctVHJhY2VEZXB0aAlbMV0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwlzZ3NuLVRyYWNlRGVwdGgJWzJdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJZ2dzbi1UcmFjZURlcHRoCVszXSBUcmFjZURlcHRoCU9QVElPTkFMLAorCXJuYy1UcmFjZURlcHRoCVs0XSBUcmFjZURlcHRoCU9QVElPTkFMLAorCWJtc2MtVHJhY2VEZXB0aAlbNV0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwkuLi59CisKK1RyYWNlRGVwdGggOjo9IEVOVU1FUkFURUQgeworCW1pbmltdW0gKDApLAorCW1lZGl1bSAoMSksCisJbWF4aW11bSAoMiksCisJLi4ufQorLS0gVGhlIHZhbHVlIG1lZGl1bSBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIFJOQy4gRm9yIG90aGVyIG5ldHdvcmsgZWxlbWVudHMsIGlmIHZhbHVlIG1lZGl1bQorLS0gaXMgcmVjZWl2ZWQsIHZhbHVlIG1pbmltdW0gc2hhbGwgYmUgYXBwbGllZC4KKworVHJhY2VORS1UeXBlTGlzdCA6Oj0gQklUIFNUUklORyB7CisJbXNjLXMgKDApLAorCW1ndyAoMSksCisJc2dzbiAoMiksCisJZ2dzbiAoMyksCisJcm5jICg0KSwKKwlibS1zYyAoNSl9IChTSVpFICg2Li4xNikpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworVHJhY2VJbnRlcmZhY2VMaXN0IDo6PSBTRVFVRU5DRSB7CisJbXNjLXMtTGlzdAlbMF0gTVNDLVMtSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwltZ3ctTGlzdAkJWzFdIE1HVy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCXNnc24tTGlzdAkJWzJdIFNHU04tSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwlnZ3NuLUxpc3QJCVszXSBHR1NOLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJcm5jLUxpc3QJCVs0XSBSTkMtSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwlibXNjLUxpc3QJCVs1XSBCTVNDLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJLi4ufQorCitNU0MtUy1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwlhICgwKSwKKwlpdSAoMSksCisJbWMgKDIpLAorCW1hcC1nICgzKSwKKwltYXAtYiAoNCksCisJbWFwLWUgKDUpLAorCW1hcC1mICg2KSwKKwljYXAgKDcpLAorCW1hcC1kICg4KSwKKwltYXAtYyAoOSl9IChTSVpFICgxMC4uMTYpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK01HVy1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwltYyAoMCksCisJbmItdXAgKDEpLAorCWl1LXVwICgyKX0gKFNJWkUgKDMuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1NHU04tSW50ZXJmYWNlTGlzdCA6Oj0gQklUIFNUUklORyB7CisJZ2IgKDApLAorCWl1ICgxKSwKKwlnbiAoMiksCisJbWFwLWdyICgzKSwKKwltYXAtZ2QgKDQpLAorCW1hcC1nZiAoNSksCisJZ3MgKDYpLAorCWdlICg3KX0gKFNJWkUgKDguLjE2KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitHR1NOLUludGVyZmFjZUxpc3QgOjo9IEJJVCBTVFJJTkcgeworCWduICgwKSwKKwlnaSAoMSksCisJZ21iICgyKX0gKFNJWkUgKDMuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1JOQy1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwlpdSAoMCksCisJaXVyICgxKSwKKwlpdWIgKDIpLAorCXV1ICgzKX0gKFNJWkUgKDQuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK0JNU0MtSW50ZXJmYWNlTGlzdCA6Oj0gQklUIFNUUklORyB7CisJZ21iICgwKX0gKFNJWkUgKDEuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1RyYWNlRXZlbnRMaXN0IDo6PSBTRVFVRU5DRSB7CisJbXNjLXMtTGlzdAlbMF0gTVNDLVMtRXZlbnRMaXN0CU9QVElPTkFMLAorCW1ndy1MaXN0CQlbMV0gTUdXLUV2ZW50TGlzdAlPUFRJT05BTCwKKwlzZ3NuLUxpc3QJCVsyXSBTR1NOLUV2ZW50TGlzdAlPUFRJT05BTCwKKwlnZ3NuLUxpc3QJCVszXSBHR1NOLUV2ZW50TGlzdAlPUFRJT05BTCwKKwlibXNjLUxpc3QJCVs0XSBCTVNDLUV2ZW50TGlzdAlPUFRJT05BTCwKKwkuLi59CisKK01TQy1TLUV2ZW50TGlzdCA6Oj0gQklUIFNUUklORyB7CisJbW8tbXRDYWxsICgwKSwKKwltby1tdC1zbXMgKDEpLAorCWx1LWltc2lBdHRhY2gtaW1zaURldGFjaCAoMiksCisJaGFuZG92ZXJzICgzKSwKKwlzcyAoNCl9IChTSVpFICg1Li4xNikpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworTUdXLUV2ZW50TGlzdCA6Oj0gQklUIFNUUklORyB7CisJY29udGV4dCAoMCl9IChTSVpFICgxLi44KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitTR1NOLUV2ZW50TGlzdCA6Oj0gQklUIFNUUklORyB7CisJcGRwQ29udGV4dCAoMCksCisJbW8tbXQtc21zICgxKSwKKwlyYXUtZ3Byc0F0dGFjaC1ncHJzRGV0YWNoICgyKSwKKwltYm1zQ29udGV4dCAoMyl9IChTSVpFICg0Li4xNikpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworR0dTTi1FdmVudExpc3QgOjo9IEJJVCBTVFJJTkcgeworCXBkcENvbnRleHQgKDApLAorCW1ibXNDb250ZXh0ICgxKX0gKFNJWkUgKDIuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK0JNU0MtRXZlbnRMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwltYm1zTXVsdGljYXN0U2VydmljZUFjdGl2YXRpb24gKDApfSAoU0laRSAoMS4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworCitUcmFjZVByb3BhZ2F0aW9uTGlzdCA6Oj0gU0VRVUVOQ0UgeworCXRyYWNlUmVmZXJlbmNlCVswXSBUcmFjZVJlZmVyZW5jZQlPUFRJT05BTCwKKwl0cmFjZVR5cGUJCVsxXSBUcmFjZVR5cGUJT1BUSU9OQUwsCisJdHJhY2VSZWZlcmVuY2UyCVsyXSBUcmFjZVJlZmVyZW5jZTIJT1BUSU9OQUwsCisJdHJhY2VSZWNvcmRpbmdTZXNzaW9uUmVmZXJlbmNlCVszXSBUcmFjZVJlY29yZGluZ1Nlc3Npb25SZWZlcmVuY2UgT1BUSU9OQUwsCisJcm5jLVRyYWNlRGVwdGgJWzRdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJcm5jLUludGVyZmFjZUxpc3QJWzVdIFJOQy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCW1zYy1zLVRyYWNlRGVwdGgJWzZdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJbXNjLXMtSW50ZXJmYWNlTGlzdAlbN10gTVNDLVMtSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwltc2Mtcy1FdmVudExpc3QJWzhdIE1TQy1TLUV2ZW50TGlzdAlPUFRJT05BTCwKKwltZ3ctVHJhY2VEZXB0aAlbOV0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwltZ3ctSW50ZXJmYWNlTGlzdAlbMTBdIE1HVy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCW1ndy1FdmVudExpc3QJWzExXSBNR1ctRXZlbnRMaXN0CU9QVElPTkFMLAorCS4uLn0KKworQWN0aXZhdGVUcmFjZU1vZGVSZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJdHJhY2VTdXBwb3J0SW5kaWNhdG9yCVsxXQlOVUxMCQlPUFRJT05BTAorCX0KKworRGVhY3RpdmF0ZVRyYWNlTW9kZUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSQkJT1BUSU9OQUwsCisJdHJhY2VSZWZlcmVuY2UJWzFdIFRyYWNlUmVmZXJlbmNlLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl0cmFjZVJlZmVyZW5jZTIJWzNdIFRyYWNlUmVmZXJlbmNlMglPUFRJT05BTAorCX0KKworRGVhY3RpdmF0ZVRyYWNlTW9kZVJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNNLURhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TTS1EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZjk0MWYKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TTS1EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsMjcwIEBACistLSAkSWQ6IE1BUC1TTS1EYXRhVHlwZXMuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiAgVjguOS4wICgyMDA5LTA0KSAgCistLSAxNy43LjYJU2hvcnQgbWVzc2FnZSBkYXRhIHR5cGVzCisKK01BUC1TTS1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU00tRGF0YVR5cGVzICgxNikgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKK0lNUExJQ0lUIFRBR1MKKworOjo9CisKK0JFR0lOCisKK0VYUE9SVFMKKwlSb3V0aW5nSW5mb0ZvclNNLUFyZywKKwlSb3V0aW5nSW5mb0ZvclNNLVJlcywKKwlNTy1Gb3J3YXJkU00tQXJnLAorCU1PLUZvcndhcmRTTS1SZXMsCisJTVQtRm9yd2FyZFNNLUFyZywKKwlNVC1Gb3J3YXJkU00tUmVzLAorCVJlcG9ydFNNLURlbGl2ZXJ5U3RhdHVzQXJnLAorCVJlcG9ydFNNLURlbGl2ZXJ5U3RhdHVzUmVzLAorCUFsZXJ0U2VydmljZUNlbnRyZUFyZywKKwlJbmZvcm1TZXJ2aWNlQ2VudHJlQXJnLAorCVJlYWR5Rm9yU00tQXJnLCAKKwlSZWFkeUZvclNNLVJlcywKKwlTTS1EZWxpdmVyeU91dGNvbWUsCisJQWxlcnRSZWFzb24sCisJQWRkaXRpb25hbC1OdW1iZXIsCisJTVQtRm9yd2FyZFNNLVZHQ1MtQXJnLAorCU1ULUZvcndhcmRTTS1WR0NTLVJlcworOworCitJTVBPUlRTCisJQWRkcmVzc1N0cmluZywKKwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJU2lnbmFsSW5mbywKKwlJTVNJLAorCUxNU0ksCisJQVNDSS1DYWxsUmVmZXJlbmNlCisKK0ZST00gTUFQLUNvbW1vbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1Db21tb25EYXRhVHlwZXMgKDE4KSB2ZXJzaW9uMTEgKDExKX0KKworCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00KK0ZST00gTUFQLUVSLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FUi1EYXRhVHlwZXMgKDE3KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorOworCisKK1JvdXRpbmdJbmZvRm9yU00tQXJnIDo6PSBTRVFVRU5DRSB7CisJbXNpc2RuCQlbMF0gSVNETi1BZGRyZXNzU3RyaW5nLAorCXNtLVJQLVBSSQkJWzFdIEJPT0xFQU4sCisJc2VydmljZUNlbnRyZUFkZHJlc3MJWzJdIEFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs2XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlncHJzU3VwcG9ydEluZGljYXRvcglbN10JTlVMTAkJT1BUSU9OQUwsCisJLS0gZ3Byc1N1cHBvcnRJbmRpY2F0b3IgaXMgc2V0IG9ubHkgaWYgdGhlIFNNUy1HTVNDIHN1cHBvcnRzCisJLS0gcmVjZWl2aW5nIG9mIHR3byBudW1iZXJzIGZyb20gdGhlIEhMUgorCXNtLVJQLU1USQkJWzhdIFNNLVJQLU1USQlPUFRJT05BTCwKKwlzbS1SUC1TTUVBCVs5XSBTTS1SUC1TTUVBCU9QVElPTkFMLAorCXNtLWRlbGl2ZXJ5Tm90SW50ZW5kZWQJWzEwXSBTTS1EZWxpdmVyeU5vdEludGVuZGVkCU9QVElPTkFMIH0KKworU00tRGVsaXZlcnlOb3RJbnRlbmRlZCA6Oj0gRU5VTUVSQVRFRCB7CisJb25seUlNU0ktcmVxdWVzdGVkICAoMCksCisJb25seU1DQy1NTkMtcmVxdWVzdGVkICAoMSksCisJLi4ufQorCitTTS1SUC1NVEkgOjo9IElOVEVHRVIgKDAuLjEwKQorCS0tIDAgU01TIERlbGl2ZXIgCisJLS0gMSBTTVMgU3RhdHVzIFJlcG9ydAorCS0tIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIHNoYWxsIGJlIGRpc2NhcmRlZCBpZgorCS0tIHJlY2VpdmVkCisKK1NNLVJQLVNNRUEgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uMTIpKQorCS0tIHRoaXMgcGFyYW1ldGVyIGNvbnRhaW5zIGFuIGFkZHJlc3MgZmllbGQgd2hpY2ggaXMgZW5jb2RlZCAKKwktLSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDQwLiBBbiBhZGRyZXNzIGZpZWxkIGNvbnRhaW5zIDMgZWxlbWVudHMgOgorCS0tIAkJYWRkcmVzcy1sZW5ndGgKKwktLSAJCXR5cGUtb2YtYWRkcmVzcworCS0tIAkJYWRkcmVzcy12YWx1ZQorCitSb3V0aW5nSW5mb0ZvclNNLVJlcyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCWxvY2F0aW9uSW5mb1dpdGhMTVNJCVswXSBMb2NhdGlvbkluZm9XaXRoTE1TSSwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0xvY2F0aW9uSW5mb1dpdGhMTVNJIDo6PSBTRVFVRU5DRSB7CisJbmV0d29ya05vZGUtTnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJbG1zaQkJCUxNU0kJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlncHJzTm9kZUluZGljYXRvcglbNV0JTlVMTAkJT1BUSU9OQUwsCisJLS0gZ3Byc05vZGVJbmRpY2F0b3IgaXMgc2V0IG9ubHkgaWYgdGhlIFNHU04gbnVtYmVyIGlzIHNlbnQgYXMgdGhlIAorCS0tIE5ldHdvcmsgTm9kZSBOdW1iZXIKKwlhZGRpdGlvbmFsLU51bWJlcglbNl0gQWRkaXRpb25hbC1OdW1iZXIJT1BUSU9OQUwgCisJLS0gTmV0d29ya05vZGUtbnVtYmVyIGNhbiBiZSBlaXRoZXIgbXNjLW51bWJlciBvciBzZ3NuLW51bWJlciBvciBJUC1TTS1HVworCS0tIG51bWJlciBvciBTTVMgUm91dGVyIG51bWJlcgorCX0KKworQWRkaXRpb25hbC1OdW1iZXIgOjo9IENIT0lDRSB7CisJbXNjLU51bWJlcglbMF0gSVNETi1BZGRyZXNzU3RyaW5nLAorCXNnc24tTnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmd9CisJLS0gYWRkaXRpb25hbC1udW1iZXIgY2FuIGJlIGVpdGhlciBtc2MtbnVtYmVyIG9yIHNnc24tbnVtYmVyCisJLS0gaWYgcmVjZWl2ZWQgbmV0d29ya05vZGUtbnVtYmVyIGlzIG1zYy1udW1iZXIgdGhlbiB0aGUgCQorCS0tIGFkZGl0aW9uYWwgbnVtYmVyIGlzIHNnc24tbnVtYmVyIAorCS0tIGlmIHJlY2VpdmVkIG5ldHdvcmtOb2RlLW51bWJlciBpcyBzZ3NuLW51bWJlciB0aGVuIHRoZSAKKwktLSBhZGRpdGlvbmFsIG51bWJlciBpcyBtc2MtbnVtYmVyIAorCitNTy1Gb3J3YXJkU00tQXJnIDo6PSBTRVFVRU5DRSB7CisJc20tUlAtREEJCVNNLVJQLURBLAorCXNtLVJQLU9BCQlTTS1SUC1PQSwKKwlzbS1SUC1VSQkJU2lnbmFsSW5mbywKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJaW1zaQkJCUlNU0kgCQlPUFRJT05BTCB9CisKK01PLUZvcndhcmRTTS1SZXMgOjo9IFNFUVVFTkNFIHsKKwlzbS1SUC1VSQkJU2lnbmFsSW5mbyAJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01ULUZvcndhcmRTTS1BcmcgOjo9IFNFUVVFTkNFIHsKKwlzbS1SUC1EQQkJU00tUlAtREEsCisJc20tUlAtT0EJCVNNLVJQLU9BLAorCXNtLVJQLVVJCQlTaWduYWxJbmZvLAorCW1vcmVNZXNzYWdlc1RvU2VuZAlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01ULUZvcndhcmRTTS1SZXMgOjo9IFNFUVVFTkNFIHsKKwlzbS1SUC1VSQkJU2lnbmFsSW5mbwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU00tUlAtREEgOjo9IENIT0lDRSB7CisJaW1zaQkJCVswXSBJTVNJLAorCWxtc2kJCQlbMV0gTE1TSSwKKwlzZXJ2aWNlQ2VudHJlQWRkcmVzc0RBCVs0XSBBZGRyZXNzU3RyaW5nLAorCW5vU00tUlAtREEJWzVdIE5VTEx9CisKK1NNLVJQLU9BIDo6PSBDSE9JQ0UgeworCW1zaXNkbgkJWzJdIElTRE4tQWRkcmVzc1N0cmluZywKKwlzZXJ2aWNlQ2VudHJlQWRkcmVzc09BCVs0XSBBZGRyZXNzU3RyaW5nLAorCW5vU00tUlAtT0EJWzVdIE5VTEx9CisKK1JlcG9ydFNNLURlbGl2ZXJ5U3RhdHVzQXJnIDo6PSBTRVFVRU5DRSB7CisJbXNpc2RuCQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJc2VydmljZUNlbnRyZUFkZHJlc3MJQWRkcmVzc1N0cmluZywKKwlzbS1EZWxpdmVyeU91dGNvbWUJU00tRGVsaXZlcnlPdXRjb21lLAorCWFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JWzBdIEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00KKwkJCQkJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJZ3Byc1N1cHBvcnRJbmRpY2F0b3IJWzJdCU5VTEwJCU9QVElPTkFMLAorCS0tIGdwcnNTdXBwb3J0SW5kaWNhdG9yIGlzIHNldCBvbmx5IGlmIHRoZSBTTVMtR01TQyBzdXBwb3J0cyAKKwktLSBoYW5kbGluZyBvZiB0d28gZGVsaXZlcnkgb3V0Y29tZXMKKwlkZWxpdmVyeU91dGNvbWVJbmRpY2F0b3IJWzNdIAlOVUxMCQlPUFRJT05BTCwKKwktLSBEZWxpdmVyeU91dGNvbWVJbmRpY2F0b3IgaXMgc2V0IHdoZW4gdGhlIFNNLURlbGl2ZXJ5T3V0Y29tZQorCS0tIGlzIGZvciBHUFJTCisJYWRkaXRpb25hbFNNLURlbGl2ZXJ5T3V0Y29tZQlbNF0gCVNNLURlbGl2ZXJ5T3V0Y29tZSAJT1BUSU9OQUwsCisJLS0gSWYgcmVjZWl2ZWQsIGFkZGl0aW9uYWxTTS1EZWxpdmVyeU91dGNvbWUgaXMgZm9yIEdQUlMKKwktLSBJZiBEZWxpdmVyeU91dGNvbWVJbmRpY2F0b3IgaXMgc2V0LCB0aGVuIEFkZGl0aW9uYWxTTS1EZWxpdmVyeU91dGNvbWUgc2hhbGwgYmUgYWJzZW50CisJYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JWzVdIAlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIE9QVElPTkFMLAorCS0tIElmIHJlY2VpdmVkIGFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIGZvciBHUFJTCisJLS0gSWYgRGVsaXZlcnlPdXRjb21lSW5kaWNhdG9yIGlzIHNldCwgdGhlbiBBZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSAKKwktLSBzaGFsbCBiZSBhYnNlbnQKKwlpcC1zbS1ndy1JbmRpY2F0b3IJWzZdIAlOVUxMCQlPUFRJT05BTCwKKwktLSB0aGUgaXAtc20tZ3cgaW5kaWNhdG9yIGluZGljYXRlcyBieSBpdHMgcHJlc2VuY2UgdGhhdCBzbS1kZWxpdmVyeU91dGNvbWUKKwktLSBpcyBmb3IgZGVsaXZlcnkgdmlhIElNUworCS0tIElmIHByZXNlbnQsIGRlbGl2ZXJ5T3V0Y29tZUluZGljYXRvciBzaGFsbCBiZSBhYnNlbnQuCisJaXAtc20tZ3ctc20tZGVsaXZlcnlPdXRjb21lCVs3XSAJU00tRGVsaXZlcnlPdXRjb21lCU9QVElPTkFMLCAKKwktLSBJZiByZWNlaXZlZCBpcC1zbS1ndy1zbS1kZWxpdmVyeU91dGNvbWUgaXMgZm9yIGRlbGl2ZXJ5IHZpYSBJTVMKKwktLSBJZiBpcC1zbS1ndy1JbmRpY2F0b3IgaXMgc2V0LCB0aGVuIGlwLXNtLWd3LXNtLWRlbGl2ZXJ5T3V0Y29tZSBzaGFsbCBiZSBhYnNlbnQKKwlpcC1zbS1ndy1hYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCVs4XQlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCU9QVElPTkFMCisJLS0gSWYgcmVjZWl2ZWQgaXAtc20tZ3ctc20tYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBpcyBmb3IgZGVsaXZlcnkgdmlhIElNUworCS0tIElmIGlwLXNtLWd3LUluZGljYXRvciBpcyBzZXQsIHRoZW4gaXAtc20tZ3ctc20tYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSAKKwktLSBzaGFsbCBiZSBhYnNlbnQKK30KKworU00tRGVsaXZlcnlPdXRjb21lIDo6PSBFTlVNRVJBVEVEIHsKKwltZW1vcnlDYXBhY2l0eUV4Y2VlZGVkICAoMCksCisJYWJzZW50U3Vic2NyaWJlciAgKDEpLAorCXN1Y2Nlc3NmdWxUcmFuc2ZlciAgKDIpfQorCitSZXBvcnRTTS1EZWxpdmVyeVN0YXR1c1JlcyA6Oj0gU0VRVUVOQ0UgeworCXN0b3JlZE1TSVNETglJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0FsZXJ0U2VydmljZUNlbnRyZUFyZyA6Oj0gU0VRVUVOQ0UgeworCW1zaXNkbgkJSVNETi1BZGRyZXNzU3RyaW5nLAorCXNlcnZpY2VDZW50cmVBZGRyZXNzCUFkZHJlc3NTdHJpbmcsCisJLi4ufQorCitJbmZvcm1TZXJ2aWNlQ2VudHJlQXJnIDo6PSBTRVFVRU5DRSB7CisJc3RvcmVkTVNJU0ROCUlTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwltdy1TdGF0dXMJTVctU3RhdHVzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlhYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JT1BUSU9OQUwsCisJYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JWzBdCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JT1BUSU9OQUwgfQorCS0tIGFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgCisJLS0gYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBpcyBwcmVzZW50LgorCS0tIGlmIGluY2x1ZGVkLCBhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSBpcyBmb3IgR1BSUyBhbmQKKwktLSBhYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIGZvciBub24tR1BSUworCitNVy1TdGF0dXMgOjo9IEJJVCBTVFJJTkcgeworCXNjLUFkZHJlc3NOb3RJbmNsdWRlZCAgKDApLAorCW1ucmYtU2V0ICAoMSksCisJbWNlZi1TZXQgICgyKSAsCisJbW5yZy1TZXQJICAoMyl9IChTSVpFICg2Li4xNikpCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIGJpdHMgNCB0byAxNSBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkIGFuZCBub3QgdW5kZXJzdG9vZAorCitSZWFkeUZvclNNLUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSSwKKwlhbGVydFJlYXNvbglBbGVydFJlYXNvbiwKKwlhbGVydFJlYXNvbkluZGljYXRvcglOVUxMCQkJT1BUSU9OQUwsCisJLS0gYWxlcnRSZWFzb25JbmRpY2F0b3IgaXMgc2V0IG9ubHkgd2hlbiB0aGUgYWxlcnRSZWFzb24gCisJLS0gc2VudCB0byBITFIgaXMgZm9yIEdQUlMKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsQWxlcnRSZWFzb25JbmRpY2F0b3IJWzFdIE5VTEwJCU9QVElPTkFMCisJLS0gYWRkaXRpb25hbEFsZXJ0UmVhc29uSW5kaWNhdG9yIGlzIHNldCBvbmx5IHdoZW4gdGhlIGFsZXJ0UmVhc29uCisJLS0gc2VudCB0byBITFIgaXMgZm9yIElQLVNNLUdXCisJfQorCitSZWFkeUZvclNNLVJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBbGVydFJlYXNvbiA6Oj0gRU5VTUVSQVRFRCB7CisJbXMtUHJlc2VudCAgKDApLAorCW1lbW9yeUF2YWlsYWJsZSAgKDEpfQorCitNVC1Gb3J3YXJkU00tVkdDUy1BcmcgOjo9IFNFUVVFTkNFIHsKKwlhc2NpQ2FsbFJlZmVyZW5jZQlBU0NJLUNhbGxSZWZlcmVuY2UsCisJc20tUlAtT0EJCVNNLVJQLU9BLAorCXNtLVJQLVVJCQlTaWduYWxJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitNVC1Gb3J3YXJkU00tVkdDUy1SZXMgOjo9IFNFUVVFTkNFIHsKKwlzbS1SUC1VSQkJWzBdIFNpZ25hbEluZm8JT1BUSU9OQUwsCisJZGlzcGF0Y2hlckxpc3QJWzFdIERpc3BhdGNoZXJMaXN0CU9QVElPTkFMLAorCW9uZ29pbmdDYWxsCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0Rpc3BhdGNoZXJMaXN0IDo6PSAKKwlTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkRpc3BhdGNoZXJzKSBPRgorCQkJCUlTRE4tQWRkcmVzc1N0cmluZworCittYXhOdW1PZkRpc3BhdGNoZXJzICBJTlRFR0VSIDo6PSA1CisKKworCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtQ29kZS5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TUy1Db2RlLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjNmMmRjCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtQ29kZS5hc24KQEAgLTAsMCArMSwxOTAgQEAKKy0tICRJZDogTUFQLVNTLUNvZGUuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpCistLSAxNy43LjUJU3VwcGxlbWVudGFyeSBzZXJ2aWNlIGNvZGVzCisKK01BUC1TUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLUNvZGUgKDE1KSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworOjo9CisKK0JFR0lOCisKK1NTLUNvZGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb2RlIGlkZW50aWZ5aW5nIGEgc2luZ2xlCisJLS0gc3VwcGxlbWVudGFyeSBzZXJ2aWNlLCBhIGdyb3VwIG9mIHN1cHBsZW1lbnRhcnkgc2VydmljZXMsIG9yCisJLS0gYWxsIHN1cHBsZW1lbnRhcnkgc2VydmljZXMuIFRoZSBzZXJ2aWNlcyBhbmQgYWJicmV2aWF0aW9ucworCS0tIHVzZWQgYXJlIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMi4wMDQgWzVdLiBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzCisJLS0gZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tCisJLS0gYml0cyA4NzY1NDMyMTogZ3JvdXAgKGJpdHMgODc2NSksIGFuZCBzcGVjaWZpYyBzZXJ2aWNlCisJLS0gKGJpdHMgNDMyMSkKKworYWxsU1MJCQlTUy1Db2RlIDo6PSAnMDAwMDAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIFNTCisKK2FsbExpbmVJZGVudGlmaWNhdGlvblNTCVNTLUNvZGUgOjo9ICcwMDAxMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgbGluZSBpZGVudGlmaWNhdGlvbiBTUworY2xpcAkJCQlTUy1Db2RlIDo6PSAnMDAwMTAwMDEnQgorCS0tIGNhbGxpbmcgbGluZSBpZGVudGlmaWNhdGlvbiBwcmVzZW50YXRpb24KK2NsaXIJCQkJU1MtQ29kZSA6Oj0gJzAwMDEwMDEwJ0IKKwktLSBjYWxsaW5nIGxpbmUgaWRlbnRpZmljYXRpb24gcmVzdHJpY3Rpb24KK2NvbHAJCQkJU1MtQ29kZSA6Oj0gJzAwMDEwMDExJ0IKKwktLSBjb25uZWN0ZWQgbGluZSBpZGVudGlmaWNhdGlvbiBwcmVzZW50YXRpb24KK2NvbHIJCQkJU1MtQ29kZSA6Oj0gJzAwMDEwMTAwJ0IKKwktLSBjb25uZWN0ZWQgbGluZSBpZGVudGlmaWNhdGlvbiByZXN0cmljdGlvbgorbWNpCQkJCVNTLUNvZGUgOjo9ICcwMDAxMDEwMSdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBtYWxpY2lvdXMgY2FsbCBpZGVudGlmaWNhdGlvbgorCithbGxOYW1lSWRlbnRpZmljYXRpb25TUwlTUy1Db2RlIDo6PSAnMDAwMTEwMDAnQgorCS0tIGFsbCBuYW1lIGlkZW50aWZpY2F0aW9uIFNTCitjbmFwCQkJCVNTLUNvZGUgOjo9ICcwMDAxMTAwMSdCCisJLS0gY2FsbGluZyBuYW1lIHByZXNlbnRhdGlvbgorCisJLS0gU1MtQ29kZXMgJzAwMDExMDEwJ0IgdG8gJzAwMDExMTExJ0IgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgCisJLS0gTmFtZUlkZW50aWZpY2F0aW9uIFN1cHBsZW1lbnRhcnkgU2VydmljZSB1c2UuCisKK2FsbEZvcndhcmRpbmdTUwlTUy1Db2RlIDo6PSAnMDAxMDAwMDAnQgorCS0tIGFsbCBmb3J3YXJkaW5nIFNTCitjZnUJCQkJU1MtQ29kZSA6Oj0gJzAwMTAwMDAxJ0IKKwktLSBjYWxsIGZvcndhcmRpbmcgdW5jb25kaXRpb25hbAorYWxsQ29uZEZvcndhcmRpbmdTUwlTUy1Db2RlIDo6PSAnMDAxMDEwMDAnQgorCS0tIGFsbCBjb25kaXRpb25hbCBmb3J3YXJkaW5nIFNTCitjZmIJCQkJU1MtQ29kZSA6Oj0gJzAwMTAxMDAxJ0IKKwktLSBjYWxsIGZvcndhcmRpbmcgb24gbW9iaWxlIHN1YnNjcmliZXIgYnVzeQorY2ZucnkJCQlTUy1Db2RlIDo6PSAnMDAxMDEwMTAnQgorCS0tIGNhbGwgZm9yd2FyZGluZyBvbiBubyByZXBseQorY2ZucmMJCQlTUy1Db2RlIDo6PSAnMDAxMDEwMTEnQgorCS0tIGNhbGwgZm9yd2FyZGluZyBvbiBtb2JpbGUgc3Vic2NyaWJlciBub3QgcmVhY2hhYmxlIAorY2QJCQkJU1MtQ29kZSA6Oj0gJzAwMTAwMTAwJ0IKKwktLSBjYWxsIGRlZmxlY3Rpb24KKworYWxsQ2FsbE9mZmVyaW5nU1MJU1MtQ29kZSA6Oj0gJzAwMTEwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBjYWxsIG9mZmVyaW5nIFNTIGluY2x1ZGVzIGFsc28gYWxsIGZvcndhcmRpbmcgU1MKK2VjdAkJCQlTUy1Db2RlIDo6PSAnMDAxMTAwMDEnQgorCQktLSBleHBsaWNpdCBjYWxsIHRyYW5zZmVyCittYWgJCQkJU1MtQ29kZSA6Oj0gJzAwMTEwMDEwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIG1vYmlsZSBhY2Nlc3MgaHVudGluZworCithbGxDYWxsQ29tcGxldGlvblNTCVNTLUNvZGUgOjo9ICcwMTAwMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgQ2FsbCBjb21wbGV0aW9uIFNTCitjdwkJCQlTUy1Db2RlIDo6PSAnMDEwMDAwMDEnQgorCS0tIGNhbGwgd2FpdGluZworaG9sZAkJCQlTUy1Db2RlIDo6PSAnMDEwMDAwMTAnQgorCS0tIGNhbGwgaG9sZAorY2Nicy1BCQkJU1MtQ29kZSA6Oj0gJzAxMDAwMDExJ0IKKwktLSBjb21wbGV0aW9uIG9mIGNhbGwgdG8gYnVzeSBzdWJzY3JpYmVycywgb3JpZ2luYXRpbmcgc2lkZQorCS0tIHRoaXMgU1MtQ29kZSBpcyB1c2VkIG9ubHkgaW4gSW5zZXJ0U3Vic2NyaWJlckRhdGEsIERlbGV0ZVN1YnNjcmliZXJEYXRhIAorCS0tIGFuZCBJbnRlcnJvZ2F0ZVNTCitjY2JzLUIJCQlTUy1Db2RlIDo6PSAnMDEwMDAxMDAnQgorCS0tIGNvbXBsZXRpb24gb2YgY2FsbCB0byBidXN5IHN1YnNjcmliZXJzLCBkZXN0aW5hdGlvbiBzaWRlCisJLS0gdGhpcyBTUy1Db2RlIGlzIHVzZWQgb25seSBpbiBJbnNlcnRTdWJzY3JpYmVyRGF0YSBhbmQgRGVsZXRlU3Vic2NyaWJlckRhdGEKK21jCQkJCVNTLUNvZGUgOjo9ICcwMTAwMDEwMSdCCisJLS0gbXVsdGljYWxsCisKK2FsbE11bHRpUGFydHlTUwlTUy1Db2RlIDo6PSAnMDEwMTAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIG11bHRpcGFydHkgU1MKK211bHRpUFRZCQkJU1MtQ29kZSA6Oj0gJzAxMDEwMDAxJ0IKKwktLSBtdWx0aXBhcnR5CisKK2FsbENvbW11bml0eU9mSW50ZXJlc3QtU1MJU1MtQ29kZSA6Oj0gJzAxMTAwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBjb21tdW5pdHkgb2YgaW50ZXJlc3QgU1MKK2N1ZwkJCQlTUy1Db2RlIDo6PSAnMDExMDAwMDEnQgorCS0tIGNsb3NlZCB1c2VyIGdyb3VwCisKK2FsbENoYXJnaW5nU1MJCVNTLUNvZGUgOjo9ICcwMTExMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgY2hhcmdpbmcgU1MKK2FvY2kJCQkJU1MtQ29kZSA6Oj0gJzAxMTEwMDAxJ0IKKwktLSBhZHZpY2Ugb2YgY2hhcmdlIGluZm9ybWF0aW9uCithb2NjCQkJCVNTLUNvZGUgOjo9ICcwMTExMDAxMCdCCisJLS0gYWR2aWNlIG9mIGNoYXJnZSBjaGFyZ2luZworCithbGxBZGRpdGlvbmFsSW5mb1RyYW5zZmVyU1MJU1MtQ29kZSA6Oj0gJzEwMDAwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRyYW5zZmVyIFNTCit1dXMxCQkJCVNTLUNvZGUgOjo9ICcxMDAwMDAwMSdCCisJLS0gVVVTMSB1c2VyLXRvLXVzZXIgc2lnbmFsbGluZyAKK3V1czIJCQkJU1MtQ29kZSA6Oj0gJzEwMDAwMDEwJ0IKKwktLSBVVVMyIHVzZXItdG8tdXNlciBzaWduYWxsaW5nCit1dXMzCQkJCVNTLUNvZGUgOjo9ICcxMDAwMDAxMSdCCisJLS0gVVVTMyB1c2VyLXRvLXVzZXIgc2lnbmFsbGluZworCithbGxCYXJyaW5nU1MJCVNTLUNvZGUgOjo9ICcxMDAxMDAwMCdCCisJLS0gYWxsIGJhcnJpbmcgU1MKK2JhcnJpbmdPZk91dGdvaW5nQ2FsbHMJU1MtQ29kZSA6Oj0gJzEwMDEwMDAxJ0IKKwktLSBiYXJyaW5nIG9mIG91dGdvaW5nIGNhbGxzCitiYW9jCQkJCVNTLUNvZGUgOjo9ICcxMDAxMDAxMCdCCisJLS0gYmFycmluZyBvZiBhbGwgb3V0Z29pbmcgY2FsbHMKK2JvaWMJCQkJU1MtQ29kZSA6Oj0gJzEwMDEwMDExJ0IKKwktLSBiYXJyaW5nIG9mIG91dGdvaW5nIGludGVybmF0aW9uYWwgY2FsbHMKK2JvaWNFeEhDCQkJU1MtQ29kZSA6Oj0gJzEwMDEwMTAwJ0IKKwktLSBiYXJyaW5nIG9mIG91dGdvaW5nIGludGVybmF0aW9uYWwgY2FsbHMgZXhjZXB0IHRob3NlIGRpcmVjdGVkCisJLS0gdG8gdGhlIGhvbWUgUExNTiBDb3VudHJ5CitiYXJyaW5nT2ZJbmNvbWluZ0NhbGxzCVNTLUNvZGUgOjo9ICcxMDAxMTAwMSdCCisJLS0gYmFycmluZyBvZiBpbmNvbWluZyBjYWxscworYmFpYwkJCQlTUy1Db2RlIDo6PSAnMTAwMTEwMTAnQgorCS0tIGJhcnJpbmcgb2YgYWxsIGluY29taW5nIGNhbGxzCitiaWNSb2FtCQkJU1MtQ29kZSA6Oj0gJzEwMDExMDExJ0IKKwktLSBiYXJyaW5nIG9mIGluY29taW5nIGNhbGxzIHdoZW4gcm9hbWluZyBvdXRzaWRlIGhvbWUgUExNTgorCS0tIENvdW50cnkKKworYWxsUExNTi1zcGVjaWZpY1NTCVNTLUNvZGUgOjo9ICcxMTExMDAwMCdCCitwbG1uLXNwZWNpZmljU1MtMQlTUy1Db2RlIDo6PSAnMTExMTAwMDEnQgorcGxtbi1zcGVjaWZpY1NTLTIJU1MtQ29kZSA6Oj0gJzExMTEwMDEwJ0IKK3BsbW4tc3BlY2lmaWNTUy0zCVNTLUNvZGUgOjo9ICcxMTExMDAxMSdCCitwbG1uLXNwZWNpZmljU1MtNAlTUy1Db2RlIDo6PSAnMTExMTAxMDAnQgorcGxtbi1zcGVjaWZpY1NTLTUJU1MtQ29kZSA6Oj0gJzExMTEwMTAxJ0IKK3BsbW4tc3BlY2lmaWNTUy02CVNTLUNvZGUgOjo9ICcxMTExMDExMCdCCitwbG1uLXNwZWNpZmljU1MtNwlTUy1Db2RlIDo6PSAnMTExMTAxMTEnQgorcGxtbi1zcGVjaWZpY1NTLTgJU1MtQ29kZSA6Oj0gJzExMTExMDAwJ0IKK3BsbW4tc3BlY2lmaWNTUy05CVNTLUNvZGUgOjo9ICcxMTExMTAwMSdCCitwbG1uLXNwZWNpZmljU1MtQQlTUy1Db2RlIDo6PSAnMTExMTEwMTAnQgorcGxtbi1zcGVjaWZpY1NTLUIJU1MtQ29kZSA6Oj0gJzExMTExMDExJ0IKK3BsbW4tc3BlY2lmaWNTUy1DCVNTLUNvZGUgOjo9ICcxMTExMTEwMCdCCitwbG1uLXNwZWNpZmljU1MtRAlTUy1Db2RlIDo6PSAnMTExMTExMDEnQgorcGxtbi1zcGVjaWZpY1NTLUUJU1MtQ29kZSA6Oj0gJzExMTExMTEwJ0IKK3BsbW4tc3BlY2lmaWNTUy1GCVNTLUNvZGUgOjo9ICcxMTExMTExMSdCCisKK2FsbENhbGxQcmlvcml0eVNTCVNTLUNvZGUgOjo9ICcxMDEwMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgY2FsbCBwcmlvcml0eSBTUworZW1scHAJCQlTUy1Db2RlIDo6PSAnMTAxMDAwMDEnQgorCS0tIGVuaGFuY2VkIE11bHRpbGV2ZWwgUHJlY2VkZW5jZSBQcmUtZW1wdGlvbiAoRU1MUFApIHNlcnZpY2UKKworYWxsTENTUHJpdmFjeUV4Y2VwdGlvbglTUy1Db2RlIDo6PSAnMTAxMTAwMDAnQgorCS0tIGFsbCBMQ1MgUHJpdmFjeSBFeGNlcHRpb24gQ2xhc3NlcwordW5pdmVyc2FsCQkJU1MtQ29kZSA6Oj0gJzEwMTEwMDAxJ0IKKwktLSBhbGxvdyBsb2NhdGlvbiBieSBhbnkgTENTIGNsaWVudAorY2FsbFNlc3Npb25SZWxhdGVkCVNTLUNvZGUgOjo9ICcxMDExMDAxMCdCCisJLS0gYWxsb3cgbG9jYXRpb24gYnkgYW55IHZhbHVlIGFkZGVkIExDUyBjbGllbnQgdG8gd2hpY2ggYSBjYWxsL3Nlc3Npb24gCisJLS0gaXMgZXN0YWJsaXNoZWQgZnJvbSB0aGUgdGFyZ2V0IE1TCitjYWxsU2Vzc2lvblVucmVsYXRlZAlTUy1Db2RlIDo6PSAnMTAxMTAwMTEnQgorCS0tIGFsbG93IGxvY2F0aW9uIGJ5IGRlc2lnbmF0ZWQgZXh0ZXJuYWwgdmFsdWUgYWRkZWQgTENTIGNsaWVudHMKK3BsbW5vcGVyYXRvcgkJU1MtQ29kZSA6Oj0gJzEwMTEwMTAwJ0IKKwktLSBhbGxvdyBsb2NhdGlvbiBieSBkZXNpZ25hdGVkIFBMTU4gb3BlcmF0b3IgTENTIGNsaWVudHMgCitzZXJ2aWNlVHlwZQkJU1MtQ29kZSA6Oj0gJzEwMTEwMTAxJ0IKKwktLSBhbGxvdyBsb2NhdGlvbiBieSBMQ1MgY2xpZW50cyBvZiBhIGRlc2lnbmF0ZWQgTENTIHNlcnZpY2UgdHlwZQorCithbGxNT0xSLVNTCQlTUy1Db2RlIDo6PSAnMTEwMDAwMDAnQgorCS0tIGFsbCBNb2JpbGUgT3JpZ2luYXRpbmcgTG9jYXRpb24gUmVxdWVzdCBDbGFzc2VzCitiYXNpY1NlbGZMb2NhdGlvbglTUy1Db2RlIDo6PSAnMTEwMDAwMDEnQgorCS0tIGFsbG93IGFuIE1TIHRvIHJlcXVlc3QgaXRzIG93biBsb2NhdGlvbgorYXV0b25vbW91c1NlbGZMb2NhdGlvbglTUy1Db2RlIDo6PSAnMTEwMDAwMTAnQgorCS0tIGFsbG93IGFuIE1TIHRvIHBlcmZvcm0gc2VsZiBsb2NhdGlvbiB3aXRob3V0IGludGVyYWN0aW9uCisJLS0gd2l0aCB0aGUgUExNTiBmb3IgYSBwcmVkZXRlcm1pbmVkIHBlcmlvZCBvZiB0aW1lCit0cmFuc2ZlclRvVGhpcmRQYXJ0eQlTUy1Db2RlIDo6PSAnMTEwMDAwMTEnQgorCS0tIGFsbG93IGFuIE1TIHRvIHJlcXVlc3QgdHJhbnNmZXIgb2YgaXRzIGxvY2F0aW9uIHRvIGFub3RoZXIgTENTIGNsaWVudAorCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNTLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzZjdmMAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNTLURhdGFUeXBlcy5hc24KQEAgLTAsMCArMSwzNDIgQEAKKy0tICRJZDogTUFQLVNTLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkgIAorLS0gMTcuNy40CVN1cHBsZW1lbnRhcnkgc2VydmljZSBkYXRhIHR5cGVzCisgCitNQVAtU1MtRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLURhdGFUeXBlcyAoMTQpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCitJTVBMSUNJVCBUQUdTCisKKzo6PQorCitCRUdJTgorCitFWFBPUlRTCisJUmVnaXN0ZXJTUy1BcmcsCisJU1MtSW5mbywKKwlTUy1TdGF0dXMsCisJU1MtU3Vic2NyaXB0aW9uT3B0aW9uLAorCVNTLUZvckJTLUNvZGUsCisJSW50ZXJyb2dhdGVTUy1SZXMsCisJVVNTRC1BcmcsCisJVVNTRC1SZXMsIAorCVVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKKwlVU1NELVN0cmluZywKKwlQYXNzd29yZCwKKwlHdWlkYW5jZUluZm8sCisJU1MtTGlzdCwKKwlTUy1JbmZvTGlzdCwKKwlPdmVycmlkZUNhdGVnb3J5LAorCUNsaVJlc3RyaWN0aW9uT3B0aW9uLAorCU5vUmVwbHlDb25kaXRpb25UaW1lLAorCUZvcndhcmRpbmdPcHRpb25zLAorCW1heE51bU9mU1MsCisJU1MtRGF0YSwKKwlTUy1JbnZvY2F0aW9uTm90aWZpY2F0aW9uQXJnLAorCVNTLUludm9jYXRpb25Ob3RpZmljYXRpb25SZXMsCisJQ0NCUy1GZWF0dXJlLAorCVJlZ2lzdGVyQ0MtRW50cnlBcmcsCisJUmVnaXN0ZXJDQy1FbnRyeVJlcywKKwlFcmFzZUNDLUVudHJ5QXJnLAorCUVyYXNlQ0MtRW50cnlSZXMKKzsKKworSU1QT1JUUworCUFkZHJlc3NTdHJpbmcsCisJSVNETi1BZGRyZXNzU3RyaW5nLAorCUlTRE4tU3ViYWRkcmVzc1N0cmluZywKKwlGVE4tQWRkcmVzc1N0cmluZywKKwlJTVNJLAorCUJhc2ljU2VydmljZUNvZGUsCisJQWxlcnRpbmdQYXR0ZXJuLAorCUVNTFBQLVByaW9yaXR5LCAKKwlNYXhNQy1CZWFyZXJzLAorCU1DLUJlYXJlcnMsCisJRXh0ZXJuYWxTaWduYWxJbmZvCitGUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKworCVNTLUNvZGUKK0ZST00gTUFQLVNTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtQ29kZSAoMTUpIHZlcnNpb24xMSAoMTEpfQorOworCisKK1JlZ2lzdGVyU1MtQXJnIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZSwKKwliYXNpY1NlcnZpY2UJQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlmb3J3YXJkZWRUb051bWJlcglbNF0gQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlmb3J3YXJkZWRUb1N1YmFkZHJlc3MJWzZdIElTRE4tU3ViYWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlub1JlcGx5Q29uZGl0aW9uVGltZQlbNV0gTm9SZXBseUNvbmRpdGlvblRpbWUJT1BUSU9OQUwsCisJLi4uLAorCWRlZmF1bHRQcmlvcml0eQlbN10gRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwsCisJbmJyVXNlcgkJWzhdIE1DLUJlYXJlcnMJT1BUSU9OQUwsCisJbG9uZ0ZUTi1TdXBwb3J0ZWQJWzldCU5VTEwJCU9QVElPTkFMIH0KKworTm9SZXBseUNvbmRpdGlvblRpbWUgOjo9IElOVEVHRVIgKDUuLjMwKQorCitTUy1JbmZvIDo6PSBDSE9JQ0UgeworCWZvcndhcmRpbmdJbmZvCVswXSBGb3J3YXJkaW5nSW5mbywKKwljYWxsQmFycmluZ0luZm8JWzFdIENhbGxCYXJyaW5nSW5mbywKKwlzcy1EYXRhCQlbM10gU1MtRGF0YX0KKworRm9yd2FyZGluZ0luZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlCQlPUFRJT05BTCwKKwlmb3J3YXJkaW5nRmVhdHVyZUxpc3QJRm9yd2FyZGluZ0ZlYXR1cmVMaXN0LAorCS4uLn0KKworRm9yd2FyZGluZ0ZlYXR1cmVMaXN0IDo6PSAKKwlTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkJhc2ljU2VydmljZUdyb3VwcykgT0YKKwkJCQlGb3J3YXJkaW5nRmVhdHVyZQorCitGb3J3YXJkaW5nRmVhdHVyZSA6Oj0gU0VRVUVOQ0UgeworCWJhc2ljU2VydmljZQlCYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXNzLVN0YXR1cwkJWzRdIFNTLVN0YXR1cwlPUFRJT05BTCwKKwlmb3J3YXJkZWRUb051bWJlcglbNV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWZvcndhcmRlZFRvU3ViYWRkcmVzcwlbOF0gSVNETi1TdWJhZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWZvcndhcmRpbmdPcHRpb25zCVs2XSBGb3J3YXJkaW5nT3B0aW9ucwlPUFRJT05BTCwKKwlub1JlcGx5Q29uZGl0aW9uVGltZQlbN10gTm9SZXBseUNvbmRpdGlvblRpbWUJT1BUSU9OQUwsCisJLi4uLAorCWxvbmdGb3J3YXJkZWRUb051bWJlcglbOV0gRlROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwgfQorCitTUy1TdGF0dXMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisKKwktLSBiaXRzIDg3NjU6IDAwMDAgKHVudXNlZCkKKwktLSBiaXRzIDQzMjE6IFVzZWQgdG8gY29udmV5IHRoZSAiUCBiaXQiLCJSIGJpdCIsIkEgYml0IiBhbmQgIlEgYml0IiwKKwktLQkJICAgIHJlcHJlc2VudGluZyBzdXBwbGVtZW50YXJ5IHNlcnZpY2Ugc3RhdGUgaW5mb3JtYXRpb24KKwktLQkJICAgIGFzIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMy4wMTEgWzIyXQorCisJLS0gYml0IDQ6ICJRIGJpdCIKKworCS0tIGJpdCAzOiAiUCBiaXQiCisKKwktLSBiaXQgMjogIlIgYml0IgorCisJLS0gYml0IDE6ICJBIGJpdCIKKworRm9yd2FyZGluZ09wdGlvbnMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisKKwktLSBiaXQgODogbm90aWZpY2F0aW9uIHRvIGZvcndhcmRpbmcgcGFydHkKKwktLQkwICBubyBub3RpZmljYXRpb24KKwktLQkxICBub3RpZmljYXRpb24KKworCS0tIGJpdCA3OiByZWRpcmVjdGluZyBwcmVzZW50YXRpb24KKwktLQkwIG5vIHByZXNlbnRhdGlvbiAgCisJLS0JMSAgcHJlc2VudGF0aW9uCisKKwktLSBiaXQgNjogbm90aWZpY2F0aW9uIHRvIGNhbGxpbmcgcGFydHkKKwktLQkwICBubyBub3RpZmljYXRpb24KKwktLQkxICBub3RpZmljYXRpb24KKworCS0tIGJpdCA1OiAwICh1bnVzZWQpCisKKwktLSBiaXRzIDQzOiBmb3J3YXJkaW5nIHJlYXNvbgorCS0tCTAwICBtcyBub3QgcmVhY2hhYmxlCisJLS0JMDEgIG1zIGJ1c3kKKwktLQkxMCAgbm8gcmVwbHkKKwktLQkxMSAgdW5jb25kaXRpb25hbCB3aGVuIHVzZWQgaW4gYSBTUkkgUmVzdWx0LCAKKwktLQkgICAgb3IgY2FsbCBkZWZsZWN0aW9uIHdoZW4gdXNlZCBpbiBhIFJDSCBBcmd1bWVudAorCS0tIGJpdHMgMjE6IDAwICh1bnVzZWQpCisKK0NhbGxCYXJyaW5nSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUJCU9QVElPTkFMLAorCWNhbGxCYXJyaW5nRmVhdHVyZUxpc3QJQ2FsbEJhcnJpbmdGZWF0dXJlTGlzdCwKKwkuLi59CisKK0NhbGxCYXJyaW5nRmVhdHVyZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgorCQkJCUNhbGxCYXJyaW5nRmVhdHVyZQorCitDYWxsQmFycmluZ0ZlYXR1cmUgOjo9IFNFUVVFTkNFIHsKKwliYXNpY1NlcnZpY2UJQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJWzRdIFNTLVN0YXR1cwlPUFRJT05BTCwKKwkuLi59CisKK1NTLURhdGEgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlCQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJCVs0XSBTUy1TdGF0dXMJT1BUSU9OQUwsCisJc3MtU3Vic2NyaXB0aW9uT3B0aW9uCVNTLVN1YnNjcmlwdGlvbk9wdGlvbglPUFRJT05BTCwKKwliYXNpY1NlcnZpY2VHcm91cExpc3QJQmFzaWNTZXJ2aWNlR3JvdXBMaXN0CU9QVElPTkFMLAorCS4uLiwKKwlkZWZhdWx0UHJpb3JpdHkJRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwsCisJbmJyVXNlcgkJWzVdIE1DLUJlYXJlcnMJT1BUSU9OQUwKKwl9CisKK1NTLVN1YnNjcmlwdGlvbk9wdGlvbiA6Oj0gQ0hPSUNFIHsKKwljbGlSZXN0cmljdGlvbk9wdGlvbglbMl0gQ2xpUmVzdHJpY3Rpb25PcHRpb24sCisJb3ZlcnJpZGVDYXRlZ29yeQlbMV0gT3ZlcnJpZGVDYXRlZ29yeX0KKworQ2xpUmVzdHJpY3Rpb25PcHRpb24gOjo9IEVOVU1FUkFURUQgeworCXBlcm1hbmVudCAgKDApLAorCXRlbXBvcmFyeURlZmF1bHRSZXN0cmljdGVkICAoMSksCisJdGVtcG9yYXJ5RGVmYXVsdEFsbG93ZWQgICgyKX0KKworT3ZlcnJpZGVDYXRlZ29yeSA6Oj0gRU5VTUVSQVRFRCB7CisJb3ZlcnJpZGVFbmFibGVkICAoMCksCisJb3ZlcnJpZGVEaXNhYmxlZCAgKDEpfQorCitTUy1Gb3JCUy1Db2RlIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZSwKKwliYXNpY1NlcnZpY2UJQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwkuLi4sCisJbG9uZ0ZUTi1TdXBwb3J0ZWQJWzRdCU5VTEwJCU9QVElPTkFMIH0KKworR2VuZXJpY1NlcnZpY2VJbmZvIDo6PSBTRVFVRU5DRSB7CisJc3MtU3RhdHVzCVNTLVN0YXR1cywKKwljbGlSZXN0cmljdGlvbk9wdGlvbglDbGlSZXN0cmljdGlvbk9wdGlvbglPUFRJT05BTCwKKwkuLi4sCisJbWF4aW11bUVudGl0bGVkUHJpb3JpdHkJWzBdIEVNTFBQLVByaW9yaXR5CU9QVElPTkFMLAorCWRlZmF1bHRQcmlvcml0eQlbMV0gRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwsCisJY2Nicy1GZWF0dXJlTGlzdAlbMl0gQ0NCUy1GZWF0dXJlTGlzdAlPUFRJT05BTCwKKwluYnJTQgkJWzNdIE1heE1DLUJlYXJlcnMJT1BUSU9OQUwsCisJbmJyVXNlcgkJWzRdIE1DLUJlYXJlcnMJT1BUSU9OQUwsCisJbmJyU04JCVs1XSBNQy1CZWFyZXJzCU9QVElPTkFMIH0KKworQ0NCUy1GZWF0dXJlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDQ0JTLVJlcXVlc3RzKSBPRgorCQkJCUNDQlMtRmVhdHVyZQorCittYXhOdW1PZkNDQlMtUmVxdWVzdHMgIElOVEVHRVIgOjo9IDUKKworQ0NCUy1GZWF0dXJlIDo6PSBTRVFVRU5DRSB7CisJY2Nicy1JbmRleAlbMF0gQ0NCUy1JbmRleAlPUFRJT05BTCwKKwliLXN1YnNjcmliZXJOdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwliLXN1YnNjcmliZXJTdWJhZGRyZXNzCVsyXSBJU0ROLVN1YmFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJYmFzaWNTZXJ2aWNlR3JvdXAJWzNdIEJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJLi4ufQorCitDQ0JTLUluZGV4ICA6Oj0gSU5URUdFUiAoMS4ubWF4TnVtT2ZDQ0JTLVJlcXVlc3RzKQorCitJbnRlcnJvZ2F0ZVNTLVJlcyA6Oj0gQ0hPSUNFIHsKKwlzcy1TdGF0dXMJCVswXSBTUy1TdGF0dXMsCisJYmFzaWNTZXJ2aWNlR3JvdXBMaXN0CVsyXSBCYXNpY1NlcnZpY2VHcm91cExpc3QsCisJZm9yd2FyZGluZ0ZlYXR1cmVMaXN0CVszXSBGb3J3YXJkaW5nRmVhdHVyZUxpc3QsCisJZ2VuZXJpY1NlcnZpY2VJbmZvCVs0XQlHZW5lcmljU2VydmljZUluZm8gfQorCitVU1NELUFyZyA6Oj0gU0VRVUVOQ0UgeworCXVzc2QtRGF0YUNvZGluZ1NjaGVtZQlVU1NELURhdGFDb2RpbmdTY2hlbWUsCisJdXNzZC1TdHJpbmcJVVNTRC1TdHJpbmcsCisJLi4uICwKKwlhbGVydGluZ1BhdHRlcm4JQWxlcnRpbmdQYXR0ZXJuCU9QVElPTkFMLAorCW1zaXNkbgkJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCB9CisKK1VTU0QtUmVzIDo6PSBTRVFVRU5DRSB7CisJdXNzZC1EYXRhQ29kaW5nU2NoZW1lCVVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKKwl1c3NkLVN0cmluZwlVU1NELVN0cmluZywKKwkuLi59CisKK1VTU0QtRGF0YUNvZGluZ1NjaGVtZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBUaGUgc3RydWN0dXJlIG9mIHRoZSBVU1NELURhdGFDb2RpbmdTY2hlbWUgaXMgZGVmaW5lZCBieQorCS0tIHRoZSBDZWxsIEJyb2FkY2FzdCBEYXRhIENvZGluZyBTY2hlbWUgYXMgZGVzY3JpYmVkIGluCisJLS0gVFMgM0dQUCBUUyAyMy4wMzggWzI1XQorCitVU1NELVN0cmluZyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhVU1NELVN0cmluZ0xlbmd0aCkpCisJLS0gVGhlIHN0cnVjdHVyZSBvZiB0aGUgY29udGVudHMgb2YgdGhlIFVTU0QtU3RyaW5nIGlzIGRlcGVuZGVudAorCS0tIG9uIHRoZSBVU1NELURhdGFDb2RpbmdTY2hlbWUgYXMgZGVzY3JpYmVkIGluIFRTIDNHUFAgVFMgMjMuMDM4IFsyNV0uCisKK21heFVTU0QtU3RyaW5nTGVuZ3RoICBJTlRFR0VSIDo6PSAxNjAKKworUGFzc3dvcmQgOjo9IE51bWVyaWNTdHJpbmcKKwkoRlJPTSAoIjAifCIxInwiMiJ8IjMifCI0InwiNSJ8IjYifCI3InwiOCJ8IjkiKSkKKwkoU0laRSAoNCkpCisKK0d1aWRhbmNlSW5mbyA6Oj0gRU5VTUVSQVRFRCB7CisJZW50ZXJQVyAgKDApLAorCWVudGVyTmV3UFcgICgxKSwKKwllbnRlck5ld1BXLUFnYWluICAoMil9CisJLS0gSG93IHRoaXMgaW5mb3JtYXRpb24gaXMgcmVhbGx5IGRlbGl2ZXJlZCB0byB0aGUgc3Vic2NyaWJlcgorCS0tIChkaXNwbGF5LCBhbm5vdW5jZW1lbnQsIC4uLikgaXMgbm90IHBhcnQgb2YgdGhpcworCS0tIHNwZWNpZmljYXRpb24uCisKK1NTLUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mU1MpIE9GCisJCQkJU1MtQ29kZQorCittYXhOdW1PZlNTICBJTlRFR0VSIDo6PSAzMAorCitTUy1JbmZvTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZTUykgT0YKKwkJCQlTUy1JbmZvCisKK0Jhc2ljU2VydmljZUdyb3VwTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZCYXNpY1NlcnZpY2VHcm91cHMpIE9GCisJCQkJQmFzaWNTZXJ2aWNlQ29kZQorCittYXhOdW1PZkJhc2ljU2VydmljZUdyb3VwcyAgSU5URUdFUiA6Oj0gMTMKKworU1MtSW52b2NhdGlvbk5vdGlmaWNhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSSwKKwltc2lzZG4JCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJc3MtRXZlbnQJCVsyXSBTUy1Db2RlLAorCS0tIFRoZSBmb2xsb3dpbmcgU1MtQ29kZSB2YWx1ZXMgYXJlIGFsbG93ZWQgOgorCS0tIGVjdAkJU1MtQ29kZSA6Oj0gJzAwMTEwMDAxJ0IKKwktLSBtdWx0aVBUWQlTUy1Db2RlIDo6PSAnMDEwMTAwMDEnQgorCS0tIGNkCQlTUy1Db2RlIDo6PSAnMDAxMDAxMDAnQgorCS0tIGNjYnMJCVNTLUNvZGUgOjo9ICcwMTAwMDEwMCdCCisJc3MtRXZlbnRTcGVjaWZpY2F0aW9uCVszXSBTUy1FdmVudFNwZWNpZmljYXRpb24JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWItc3Vic2NyaWJlck51bWJlcglbNV0JSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWNjYnMtUmVxdWVzdFN0YXRlCVs2XQlDQ0JTLVJlcXVlc3RTdGF0ZQlPUFRJT05BTAorCX0KKworQ0NCUy1SZXF1ZXN0U3RhdGUgOjo9IEVOVU1FUkFURUQgeworCXJlcXVlc3QgIAkoMCksCisJcmVjYWxsICAJKDEpLAorCWFjdGl2ZSAgCSgyKSwKKwljb21wbGV0ZWQJKDMpLAorCXN1c3BlbmRlZAkoNCksCisJZnJvemVuCSg1KSwKKwlkZWxldGVkCSg2KQorCX0KKworU1MtSW52b2NhdGlvbk5vdGlmaWNhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uCisJfQorCitTUy1FdmVudFNwZWNpZmljYXRpb24gOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heEV2ZW50U3BlY2lmaWNhdGlvbikgT0YKKwkJCQlBZGRyZXNzU3RyaW5nCisKK21heEV2ZW50U3BlY2lmaWNhdGlvbiAgSU5URUdFUiA6Oj0gMgorCitSZWdpc3RlckNDLUVudHJ5QXJnIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdCVNTLUNvZGUsCisJY2Nicy1EYXRhCQlbMV0JQ0NCUy1EYXRhCU9QVElPTkFMLAorCS4uLn0KKworQ0NCUy1EYXRhIDo6PSBTRVFVRU5DRSB7CisJY2Nicy1GZWF0dXJlCVswXQlDQ0JTLUZlYXR1cmUsCisJdHJhbnNsYXRlZEItTnVtYmVyCVsxXQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJc2VydmljZUluZGljYXRvcglbMl0JU2VydmljZUluZGljYXRvcglPUFRJT05BTCwKKwljYWxsSW5mbwkJWzNdCUV4dGVybmFsU2lnbmFsSW5mbywKKwluZXR3b3JrU2lnbmFsSW5mbwlbNF0JRXh0ZXJuYWxTaWduYWxJbmZvLAorCS4uLn0KKworU2VydmljZUluZGljYXRvciA6Oj0gQklUIFNUUklORyB7CisJY2xpci1pbnZva2VkICgwKSwKKwljYW1lbC1pbnZva2VkICgxKX0gKFNJWkUoMi4uMzIpKSAKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gYml0cyAyIHRvIDMxIHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kCisKK1JlZ2lzdGVyQ0MtRW50cnlSZXMgOjo9IFNFUVVFTkNFIHsKKwljY2JzLUZlYXR1cmUJWzBdIENDQlMtRmVhdHVyZQlPUFRJT05BTCwKKwkuLi59CisKK0VyYXNlQ0MtRW50cnlBcmcgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0JU1MtQ29kZSwKKwljY2JzLUluZGV4CVsxXQlDQ0JTLUluZGV4CU9QVElPTkFMLAorCS4uLn0KKworRXJhc2VDQy1FbnRyeVJlcyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXQlTUy1Db2RlLAorCXNzLVN0YXR1cwkJWzFdIFNTLVN0YXR1cwlPUFRJT05BTCwKKwkuLi59CisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1UUy1Db2RlLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVRTLUNvZGUuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYzAwYmYKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1UUy1Db2RlLmFzbgpAQCAtMCwwICsxLDkyIEBACistLSAkSWQ6IE1BUC1UUy1Db2RlLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KSAKKy0tIDE3LjcuOQlUZWxlc2VydmljZSBDb2RlcworIAorTUFQLVRTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtVFMtQ29kZSAoMTkpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCis6Oj0KKworQkVHSU4KKworVGVsZXNlcnZpY2VDb2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29kZSBpZGVudGlmeWluZyBhIHNpbmdsZQorCS0tIHRlbGVzZXJ2aWNlLCBhIGdyb3VwIG9mIHRlbGVzZXJ2aWNlcywgb3IgYWxsIHRlbGVzZXJ2aWNlcy4gVGhlCisJLS0gc2VydmljZXMgYXJlIGRlZmluZWQgaW4gVFMgR1NNIDIyLjAwMyBbNF0uCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisKKwktLSBiaXRzIDg3NjU0MzIxOiBncm91cCAoYml0cyA4NzY1KSBhbmQgc3BlY2lmaWMgc2VydmljZQorCS0tIChiaXRzIDQzMjEpCisKK0V4dC1UZWxlc2VydmljZUNvZGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNSkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb2RlIGlkZW50aWZ5aW5nIGEgc2luZ2xlCisJLS0gdGVsZXNlcnZpY2UsIGEgZ3JvdXAgb2YgdGVsZXNlcnZpY2VzLCBvciBhbGwgdGVsZXNlcnZpY2VzLiBUaGUKKwktLSBzZXJ2aWNlcyBhcmUgZGVmaW5lZCBpbiBUUyBHU00gMjIuMDAzIFs0XS4KKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKworCS0tIE9DVEVUIDE6CisJLS0gYml0cyA4NzY1NDMyMTogZ3JvdXAgKGJpdHMgODc2NSkgYW5kIHNwZWNpZmljIHNlcnZpY2UKKwktLSAoYml0cyA0MzIxKQorCisJLS0gT0NURVRTIDItNTogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIElmIHJlY2VpdmVkIHRoZQorICAgIC0tIEV4dC1UZWxlc2VydmljZUNvZGUgc2hhbGwgYmUKKyAJLS0gdHJlYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBkZWZpbmVkIGZvciB0aGUKKwktLSBvcGVyYXRpb24gdGhhdCB1c2VzIHRoaXMgdHlwZS4KKworCS0tIEV4dC1UZWxlc2VydmljZUNvZGUgaW5jbHVkZXMgYWxsIHZhbHVlcyBkZWZpbmVkIGZvciBUZWxlc2VydmljZUNvZGUuCisKK2FsbFRlbGVzZXJ2aWNlcwlUZWxlc2VydmljZUNvZGUgOjo9ICcwMDAwMDAwMCdCCisKK2FsbFNwZWVjaFRyYW5zbWlzc2lvblNlcnZpY2VzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDAwJ0IKK3RlbGVwaG9ueQkJCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDAxJ0IKK2VtZXJnZW5jeUNhbGxzCQlUZWxlc2VydmljZUNvZGUgOjo9ICcwMDAxMDAxMCdCCisKK2FsbFNob3J0TWVzc2FnZVNlcnZpY2VzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDAwJ0IKK3Nob3J0TWVzc2FnZU1ULVBQCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDAxJ0IKK3Nob3J0TWVzc2FnZU1PLVBQCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDEwJ0IKKworYWxsRmFjc2ltaWxlVHJhbnNtaXNzaW9uU2VydmljZXMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDExMDAwMDAnQgorZmFjc2ltaWxlR3JvdXAzQW5kQWx0ZXJTcGVlY2gJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDExMDAwMDEnQgorYXV0b21hdGljRmFjc2ltaWxlR3JvdXAzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAxMTAwMDEwJ0IKK2ZhY3NpbWlsZUdyb3VwNAlUZWxlc2VydmljZUNvZGUgOjo9ICcwMTEwMDAxMSdCCisKKy0tIFRoZSBmb2xsb3dpbmcgbm9uLWhpZXJhcmNoaWNhbCBDb21wb3VuZCBUZWxlc2VydmljZSBHcm91cHMKKy0tIGFyZSBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjIuMDMwOgorYWxsRGF0YVRlbGVzZXJ2aWNlcwlUZWxlc2VydmljZUNvZGUgOjo9ICcwMTExMDAwMCdCCisJLS0gY292ZXJzIFRlbGVzZXJ2aWNlIEdyb3VwcyAnYWxsRmFjc2ltaWxlVHJhbnNtaXNzaW9uU2VydmljZXMnCisJLS0gYW5kICdhbGxTaG9ydE1lc3NhZ2VTZXJ2aWNlcycKK2FsbFRlbGVzZXJ2aWNlcy1FeGVwdFNNUwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMDAwMDAwMCdCCisJLS0gY292ZXJzIFRlbGVzZXJ2aWNlIEdyb3VwcyAnYWxsU3BlZWNoVHJhbnNtaXNzaW9uU2VydmljZXMnIGFuZAorCS0tICdhbGxGYWNzaW1pbGVUcmFuc21pc3Npb25TZXJ2aWNlcycKKy0tCistLSBDb21wb3VuZCBUZWxlc2VydmljZSBHcm91cCBDb2RlcyBhcmUgb25seSB1c2VkIGluIGNhbGwKKy0tIGluZGVwZW5kZW50IHN1cHBsZW1lbnRhcnkgc2VydmljZSBvcGVyYXRpb25zLCBpLmUuIHRoZXkKKy0tIGFyZSBub3QgdXNlZCBpbiBJbnNlcnRTdWJzY3JpYmVyRGF0YSBvciBpbgorLS0gRGVsZXRlU3Vic2NyaWJlckRhdGEgbWVzc2FnZXMuCisKK2FsbFZvaWNlR3JvdXBDYWxsU2VydmljZXMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTAwMTAwMDAnQgordm9pY2VHcm91cENhbGwJCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzEwMDEwMDAxJ0IKK3ZvaWNlQnJvYWRjYXN0Q2FsbAlUZWxlc2VydmljZUNvZGUgOjo9ICcxMDAxMDAxMCdCCisKK2FsbFBMTU4tc3BlY2lmaWNUUwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDAwMCdCCitwbG1uLXNwZWNpZmljVFMtMQlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDAwMSdCCitwbG1uLXNwZWNpZmljVFMtMglUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDAxMCdCCitwbG1uLXNwZWNpZmljVFMtMwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDAxMSdCCitwbG1uLXNwZWNpZmljVFMtNAlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDEwMCdCCitwbG1uLXNwZWNpZmljVFMtNQlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDEwMSdCCitwbG1uLXNwZWNpZmljVFMtNglUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDExMCdCCitwbG1uLXNwZWNpZmljVFMtNwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMDExMSdCCitwbG1uLXNwZWNpZmljVFMtOAlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTAwMCdCCitwbG1uLXNwZWNpZmljVFMtOQlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTAwMSdCCitwbG1uLXNwZWNpZmljVFMtQQlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTAxMCdCCitwbG1uLXNwZWNpZmljVFMtQglUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTAxMSdCCitwbG1uLXNwZWNpZmljVFMtQwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTEwMCdCCitwbG1uLXNwZWNpZmljVFMtRAlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTEwMSdCCitwbG1uLXNwZWNpZmljVFMtRQlUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTExMCdCCitwbG1uLXNwZWNpZmljVFMtRglUZWxlc2VydmljZUNvZGUgOjo9ICcxMTAxMTExMSdCCisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL1JSTFAtQ29tcG9uZW50cy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL1JSTFAtQ29tcG9uZW50cy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhZGU2YQotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvUlJMUC1Db21wb25lbnRzLmFzbgpAQCAtMCwwICsxLDE0ODggQEAKKy0tIFJSTFAtQ29tcG9uZW50cy5hc24KKy0tICRJZCQKKy0tIFRha2VuIGZyb20gM0dQUCBUUyA0NC4wMzEgVjcuNC4wICgyMDA3LTAzKQorLS0gaHR0cDovL3d3dy4zZ3BwLm9yZy9mdHAvU3BlY3MvYXJjaGl2ZS80NF9zZXJpZXMvNDQuMDMxLzQ0MDMxLTc0MC56aXAvNDQwMzEtNzQwLmRvYworLS0KKy0tIDQgQ29tcG9uZW50cworLS0gNSBFbGVtZW50cyBvZiBDb21wb25lbnRzCistLQorCitSUkxQLUNvbXBvbmVudHMKKy0tIHsgUlJMUC1Db21wb25lbnRzIH0KKworREVGSU5JVElPTlMgQVVUT01BVElDIFRBR1MgOjo9CisKK0JFR0lOCisKK0lNUE9SVFMKKwlFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sIFZlbG9jaXR5RXN0aW1hdGUKK0ZST00KKwlNQVAtTENTLURhdGFUeXBlcyB7CisJaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKwlnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUxDUy1EYXRhVHlwZXMgKDI1KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKwlpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9Cis7CisKKworLS0gQWRkIGhlcmUgb3RoZXIgQVNOLjEgZGVmaW5pdGlvbnMgcHJlc2VudGVkIGJlbG93CistLSBpbiBjaGFwdGVycyA0IGFuZCA1LgorCistLSBNZWFzdXJlbWVudCBQb3NpdGlvbiByZXF1ZXN0IGNvbXBvbmVudAorTXNyUG9zaXRpb24tUmVxIDo6PSBTRVFVRU5DRSB7CisJcG9zaXRpb25JbnN0cnVjdAkJUG9zaXRpb25JbnN0cnVjdCwKKwlyZWZlcmVuY2VBc3Npc3REYXRhCQlSZWZlcmVuY2VBc3Npc3REYXRhCQlPUFRJT05BTCwKKwltc3JBc3Npc3REYXRhCQkJTXNyQXNzaXN0RGF0YQkJCU9QVElPTkFMLAorCXN5c3RlbUluZm9Bc3Npc3REYXRhCVN5c3RlbUluZm9Bc3Npc3REYXRhCU9QVElPTkFMLAorCWdwcy1Bc3Npc3REYXRhCQkJR1BTLUFzc2lzdERhdGEJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCUV4dGVuc2lvbkNvbnRhaW5lcgkJT1BUSU9OQUwsCisJLi4uLAorCS0tIFJlbGVhc2UgOTggZXh0ZW5zaW9uIGVsZW1lbnQKK3JlbDk4LU1zclBvc2l0aW9uLVJlcS1leHRlbnNpb24JCQlSZWw5OC1Nc3JQb3NpdGlvbi1SZXEtRXh0ZW5zaW9uCQkJT1BUSU9OQUwsCQorCS0tIFJlbGVhc2UgNSBleHRlbnNpb24gZWxlbWVudAorcmVsNS1Nc3JQb3NpdGlvbi1SZXEtZXh0ZW5zaW9uCQkJUmVsNS1Nc3JQb3NpdGlvbi1SZXEtRXh0ZW5zaW9uCQkJT1BUSU9OQUwsCisJLS0gUmVsZWFzZSA3IGV4dGVuc2lvbiBlbGVtZW50CityZWw3LU1zclBvc2l0aW9uLVJlcS1leHRlbnNpb24JCQlSZWw3LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24JCQlPUFRJT05BTAorfQorCistLSBNZWFzdXJlbWVudCBQb3NpdGlvbiByZXNwb25zZSBjb21wb25lbnQKK01zclBvc2l0aW9uLVJzcCA6Oj0gU0VRVUVOQ0UgeworCW11bHRpcGxlU2V0cwkJCU11bHRpcGxlU2V0cwkJCU9QVElPTkFMLAorCXJlZmVyZW5jZUlkZW50aXR5CQlSZWZlcmVuY2VJZGVudGl0eQkJT1BUSU9OQUwsCisJb3RkLU1lYXN1cmVJbmZvCQkJT1RELU1lYXN1cmVJbmZvCQkJT1BUSU9OQUwsCisJbG9jYXRpb25JbmZvCQkJTG9jYXRpb25JbmZvCQkJT1BUSU9OQUwsCisJZ3BzLU1lYXN1cmVJbmZvCQkJR1BTLU1lYXN1cmVJbmZvCQkJT1BUSU9OQUwsCisJbG9jYXRpb25FcnJvcgkJCUxvY2F0aW9uRXJyb3IJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCUV4dGVuc2lvbkNvbnRhaW5lcgkJT1BUSU9OQUwsCisJLi4uLAkKKwktLSBSZWxlYXNlIGV4dGVuc2lvbiBoZXJlCisJcmVsLTk4LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24JCQorCQkJCQkJCVJlbC05OC1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uCQlPUFRJT05BTCwKKwlyZWwtNS1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uCisJCQkJCQkJUmVsLTUtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbgkJT1BUSU9OQUwsCisJLS0gcmVsLTUtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbiBhbmQgb3RoZXIgcG9zc2libGUgZnV0dXJlIGV4dGVuc2lvbnMKKwktLSBhcmUgdGhlIG9ubHkgaW5mb3JtYXRpb24gZWxlbWVudHMgdGhhdCBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIDJuZAorCS0tIE1zclBvc2l0aW9uLVJzcCBjb21wb25lbnQgd2hlbiBSUkxQIHBzZXVkby1zZWdtZW50YXRpb24gaXMgdXNlZAorCXJlbC03LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24KKwkJCQkJCQlSZWwtNy1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uCQlPUFRJT05BTAorfQorCistLSBBc3Npc3RhbmNlIERhdGEgY29tcG9uZW50CitBc3Npc3RhbmNlRGF0YSA6Oj0gU0VRVUVOQ0UgeworCXJlZmVyZW5jZUFzc2lzdERhdGEJUmVmZXJlbmNlQXNzaXN0RGF0YQkJCU9QVElPTkFMLAorCW1zckFzc2lzdERhdGEJCQlNc3JBc3Npc3REYXRhCQkJT1BUSU9OQUwsCisJc3lzdGVtSW5mb0Fzc2lzdERhdGEJU3lzdGVtSW5mb0Fzc2lzdERhdGEJT1BUSU9OQUwsCisJZ3BzLUFzc2lzdERhdGEJCQlHUFMtQXNzaXN0RGF0YQkJCU9QVElPTkFMLAkKKwltb3JlQXNzRGF0YVRvQmVTZW50CQlNb3JlQXNzRGF0YVRvQmVTZW50CQlPUFRJT05BTCwJLS0gSWYgbm90IHByZXNlbnQsIGludGVycHJldCBhcyBvbmx5CisJCQkJCQkJCQkJCQkJCQkJLS0gQXNzaXN0YW5jZSBEYXRhIGNvbXBvbmVudCB1c2VkIHRvCisJCQkJCQkJCQkJCQkJCQkJLS0gZGVsaXZlciBlbnRpcmUgc2V0IG9mIGFzc2lzdGFuY2UKKwkJCQkJCQkJCQkJCQkJCQktLSBkYXRhLgorCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyCQlPUFRJT05BTCwKKwkuLi4sCisJLS0gUmVsZWFzZSBleHRlbnNpb24gaGVyZQorCXJlbDk4LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbglSZWw5OC1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24JT1BUSU9OQUwsCisJcmVsNS1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24JUmVsNS1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24JT1BUSU9OQUwsCisgcmVsNy1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24gUmVsNy1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24gT1BUSU9OQUwJCit9CisKKy0tIFByb3RvY29sIEVycm9yIGNvbXBvbmVudAorUHJvdG9jb2xFcnJvciA6Oj0gU0VRVUVOQ0UgeworCWVycm9yQ2F1c2UJCQkJRXJyb3JDb2RlcywJCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlFeHRlbnNpb25Db250YWluZXIJCU9QVElPTkFMLAorCS4uLiwKKwktLSBSZWxlYXNlIGV4dGVuc2lvbnMgaGVyZQorCXJlbC01LVByb3RvY29sRXJyb3ItRXh0ZW5zaW9uIFJlbC01LVByb3RvY29sRXJyb3ItRXh0ZW5zaW9uCQlPUFRJT05BTAorfQorCistLSBQb3NpdGlvbiBpbnN0cnVjdGlvbnMKK1Bvc2l0aW9uSW5zdHJ1Y3QgOjo9IFNFUVVFTkNFIHsKKwktLSBNZXRob2QgdHlwZQorCW1ldGhvZFR5cGUJCQkJTWV0aG9kVHlwZSwJCisJcG9zaXRpb25NZXRob2QJCQlQb3NpdGlvbk1ldGhvZCwKKwltZWFzdXJlUmVzcG9uc2VUaW1lCQlNZWFzdXJlUmVzcG9uc2VUaW1lLAkJCisJdXNlTXVsdGlwbGVTZXRzCQkJVXNlTXVsdGlwbGVTZXRzLAkJCisJZW52aXJvbm1lbnRDaGFyYWN0ZXIJRW52aXJvbm1lbnRDaGFyYWN0ZXIJT1BUSU9OQUwJCit9CisKKy0tCitNZXRob2RUeXBlIDo6PSBDSE9JQ0UgeworCW1zQXNzaXN0ZWQJCUFjY3VyYWN5T3B0LAktLSBhY2N1cmFjeSBpcyBvcHRpb25hbAorCW1zQmFzZWQJCQlBY2N1cmFjeSwJCS0tIGFjY3VyYWN5IGlzIG1hbmRhdG9yeQorCW1zQmFzZWRQcmVmCQlBY2N1cmFjeSwJCS0tIGFjY3VyYWN5IGlzIG1hbmRhdG9yeQorCW1zQXNzaXN0ZWRQcmVmCUFjY3VyYWN5IAkJLS0gYWNjdXJhY3kgaXMgbWFuZGF0b3J5Cit9CisKKy0tIEFjY3VyYWN5IG9mIHRoZSBsb2NhdGlvbiBlc3RpbWF0aW9uCitBY2N1cmFjeU9wdCA6Oj0gU0VRVUVOQ0UgeworCWFjY3VyYWN5CQlBY2N1cmFjeQlPUFRJT05BTAorfQorCistLSBUaGUgdmFsdWVzIG9mIHRoaXMgZmllbGQgYXJlIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIgKFVuY2VydGFpbnR5IGNvZGUpCitBY2N1cmFjeSA6Oj0gSU5URUdFUiAoMC4uMTI3KQorCisKKy0tIFBvc2l0aW9uIE1ldGhvZAorUG9zaXRpb25NZXRob2QgOjo9IEVOVU1FUkFURUQgeworCWVvdGQgKDApLAorCWdwcyAoMSksCisJZ3BzT3JFT1REICgyKQorfQorCistLSBNZWFzdXJlbWVudCByZXF1ZXN0IHJlc3BvbnNlIHRpbWUKK01lYXN1cmVSZXNwb25zZVRpbWUgOjo9IElOVEVHRVIgKDAuLjcpCisKKy0tIHVzZU11bHRpcGxlIFNldHMsIEZGUyEKK1VzZU11bHRpcGxlU2V0cyA6Oj0gRU5VTUVSQVRFRCB7CisJbXVsdGlwbGVTZXRzICgwKSwJCS0tIG11bHRpcGxlIHNldHMgYXJlIGFsbG93ZWQKKwlvbmVTZXQgKDEpCQkJCS0tIHNlbmRpbmcgb2YgbXVsdGlwbGUgaXMgbm90IGFsbG93ZWQKK30KKworLS0gRW52aXJvbm1lbnQgY2hhcmFjdGVyaXphdGlvbgorRW52aXJvbm1lbnRDaGFyYWN0ZXIgOjo9IEVOVU1FUkFURUQgeworCWJhZEFyZWEgKDApLAkJLS0gYmFkIHVyYmFuIG9yIHN1YnVyYmFuLCBoZWF2eSBtdWx0aXBhdGggYW5kIE5MT1MKKwlub3RCYWRBcmVhICgxKSwJCS0tIGxpZ2h0IG11bHRpcGF0aCBhbmQgTkxPUworCW1peGVkQXJlYSAoMiksCQktLSBub3QgZGVmaW5lZCBvciBtaXhlZCBlbnZpcm9ubWVudAorCS4uLgorfQorCistLSBFLU9URCByZWZlcmVuY2UgQlRTIGZvciBBc3NpdGFuY2UgZGF0YSBJRQorUmVmZXJlbmNlQXNzaXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWJjY2hDYXJyaWVyCQlCQ0NIQ2FycmllciwJCQkJCQktLSBCQ0NIIGNhcnJpZXIKKwlic2ljCQkJQlNJQywJCQkJCQkJCS0tIEJTSUMKKwl0aW1lU2xvdFNjaGVtZQlUaW1lU2xvdFNjaGVtZSwgCQkJCQktLSBUaW1lc2xvdCBzY2hlbWUKKwlidHNQb3NpdGlvbgkJQlRTUG9zaXRpb24JCQlPUFRJT05BTAorfQorCistLSBlbGxpcHNvaWQgcG9pbnQgYW5kCistLSBlbGxpcHNvaWQgcG9pbnQgd2l0aCBhbHRpdHVkZSBhbmQgdW5jZXJ0YWludHkgZWxsaXBzb2lkIHNoYXBlcyBhcmUgc3VwcG9ydGVkCitCVFNQb3NpdGlvbiA6Oj0gRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCisKKy0tIFJGIGNoYW5uZWwgbnVtYmVyIG9mIEJDQ0gKK0JDQ0hDYXJyaWVyIDo6PSBJTlRFR0VSICgwLi4xMDIzKQorCistLSBCYXNlIHN0YXRpb24gSWRlbnRpdHkgQ29kZQorQlNJQyA6Oj0gSU5URUdFUiAoMC4uNjMpCisKKy0tIFRpbWVzbG90IHNjaGVtZQorVGltZVNsb3RTY2hlbWUgOjo9IEVOVU1FUkFURUQgeworCWVxdWFsTGVuZ3RoICgwKSwKKwl2YXJpb3VzTGVuZ3RoICgxKQorfQorCistLSBUaW1lIHNsb3QgKG1vZHVsbykKK01vZHVsb1RpbWVTbG90IDo6PSBJTlRFR0VSICgwLi4zKQorCistLSBFLU9URCBtZWFzdXJlbWVudCBhc3Npc3RhbmNlIGRhdGEgSUUKKy0tIFRoZSB0b3RhbCBudW1iZXIgb2YgbmVpZ2hib3JzIGluIHRoaXMgZWxlbWVudCAoTXNyQXNzaXN0RGF0YSkKKy0tIGFuZCBpbiBTeXN0ZW1JbmZvQXNzaXN0RGF0YSBlbGVtZW50IChwcmVzZW50ZWQgbmVpZ2hib3JzCistLSBjYW4gYmUgYXQgYSBtYXhpbXVtIDE1ISkKK01zckFzc2lzdERhdGEgOjo9IFNFUVVFTkNFIHsKKwkgbXNyQXNzaXN0TGlzdCBTZXFPZk1zckFzc2lzdEJUUworfQorU2VxT2ZNc3JBc3Npc3RCVFMgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE1KSkgT0YgTXNyQXNzaXN0QlRTCisKK01zckFzc2lzdEJUUyA6Oj0gU0VRVUVOQ0UgeworCWJjY2hDYXJyaWVyCQkJQkNDSENhcnJpZXIsCQktLSBCQ0NIIGNhcnJpZXIKKwlic2ljCQkJCUJTSUMsCQkJCS0tIEJTSUMKKwltdWx0aUZyYW1lT2Zmc2V0CU11bHRpRnJhbWVPZmZzZXQsIAktLSBtdWx0aWZyYW1lIG9mZnNldAorCXRpbWVTbG90U2NoZW1lCQlUaW1lU2xvdFNjaGVtZSwJCS0tIFRpbWVzbG90IHNjaGVtZQorCXJvdWdoUlRECQkJUm91Z2hSVEQsCQkJLS0gcm91Z2ggUlREIHZhbHVlCisKKwktLSBMb2NhdGlvbiBDYWxjdWxhdGlvbiBBc3Npc3RhbmNlIGRhdGEgaXMgbW92ZWQgaGVyZQorCWNhbGNBc3Npc3RhbmNlQlRTCUNhbGNBc3Npc3RhbmNlQlRTCU9QVElPTkFMCit9CisKKy0tIE11bHRpZnJhbWUgb2Zmc2V0CitNdWx0aUZyYW1lT2Zmc2V0IDo6PSBJTlRFR0VSICgwLi41MSkKKy0tIFRoZSBNdWx0aWZyYW1lIE9mZnNldCB2YWx1ZSA1MSBzaGFsbCBub3QgYmUgZW5jb2RlZCBieSB0aGUgdHJhbnNtaXR0aW5nIGVudGl0eSBhbmQKKy0tIHNoYWxsIGJlIHRyZWF0ZWQgYnkgdGhlIHJlY2VpdmluZyBlbnRpdHkgYXMgMC4KKworLS0gUm91Z2ggUlREIHZhbHVlIGJldHdlZW4gb25lIGJhc2Ugc3RhdGlvbiBhbmQgcmVmZXJlbmNlIEJUUworUm91Z2hSVEQgOjo9IElOVEVHRVIgKDAuLjEyNTApCistLSBUaGUgUm91Z2hSVEQgdmFsdWUgMTI1MCBzaGFsbCBub3QgYmUgZW5jb2RlZCBieSB0aGUgdHJhbnNtaXR0aW5nIGVudGl0eSBhbmQgc2hhbGwKKy0tIGJlIHRyZWF0ZWQgYnkgdGhlIHJlY2VpdmluZyBlbnRpdHkgYXMgMC4KKworLS0gRS1PVEQgTWVhc3VyZW1lbnQgYXNzaXN0YW5jZSBkYXRhIGZvciBzeXN0ZW0gaW5mb3JtYXRpb24gTGlzdCBJRQorLS0gVGhlIHRvdGFsIG51bWJlciBvZiBiYXNlIHN0YXRpb25zIGluIHRoaXMgZWxlbWVudCAoU3lzdGVtSW5mb0Fzc2lzdERhdGEKKy0tIHByZXNlbnRlZCBuZWlnaGJvcnMpIGFuZCBpbiBNc3JBc3Npc3REYXRhIGVsZW1lbnQgY2FuIGJlIGF0IGEgbWF4aW11bSAxNS4KK1N5c3RlbUluZm9Bc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7CisJc3lzdGVtSW5mb0Fzc2lzdExpc3QgCVNlcU9mU3lzdGVtSW5mb0Fzc2lzdEJUUworfQorU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMyKSkgT0YgU3lzdGVtSW5mb0Fzc2lzdEJUUworCistLSB3aGV0aGVyIG4udGggaXMgcHJlc2VudCBvciBub3QgPworU3lzdGVtSW5mb0Fzc2lzdEJUUyA6Oj0gQ0hPSUNFIHsKKwlub3RQcmVzZW50CQlOVUxMLAorCXByZXNlbnQJCQlBc3Npc3RCVFNEYXRhCit9CisKKy0tIEFjdHVhbCBhc3Npc3RhbmNlIGRhdGEgZm9yIHN5c3RlbSBpbmZvcm1hdGlvbiBiYXNlIHN0YXRpb24KK0Fzc2lzdEJUU0RhdGEgOjo9IFNFUVVFTkNFIHsKKwlic2ljCQkJCUJTSUMsCQkJCS0tIEJTSUMKKwltdWx0aUZyYW1lT2Zmc2V0CU11bHRpRnJhbWVPZmZzZXQsCS0tIG11bHRpZnJhbWUgb2Zmc2V0CisJdGltZVNsb3RTY2hlbWUJCVRpbWVTbG90U2NoZW1lLAkJLS0gVGltZXNsb3Qgc2NoZW1lCisJcm91Z2hSVEQJCQlSb3VnaFJURCwJCQktLSByb3VnaCBSVEQgdmFsdWUKKworCS0tIExvY2F0aW9uIENhbGN1bGF0aW9uIEFzc2lzdGFuY2UgZGF0YQorCWNhbGNBc3Npc3RhbmNlQlRTCUNhbGNBc3Npc3RhbmNlQlRTCU9QVElPTkFMCit9CisKKy0tIEUtT1REIExvY2F0aW9uIGNhbGN1bGF0aW9uIGFzc2lzdGFuY2UgZGF0YSwKKy0tIENhbGNBc3Npc3RhbmNlQlRTIGVsZW1lbnQgaXMgb3B0aW9uYWwgbm90IHN1YmZpZWxkcworQ2FsY0Fzc2lzdGFuY2VCVFMgOjo9IFNFUVVFTkNFIHsKKwlmaW5lUlRECQkJCUZpbmVSVEQsCQktLSBmaW5lIFJURCB2YWx1ZSBiZXR3ZWVuIGJhc2Ugc3RhdGlvbnMKKwlyZWZlcmVuY2VXR1M4NAkJUmVmZXJlbmNlV0dTODQJLS0gcmVmZXJlbmNlIGNvb3JkaW5hdGVzCit9CisKKy0tIENvb3JkaW5hdGVzIG9mIG5laWdoYm91ciBCVFMsIFdHUy04NCBlbGxpcHNvaWQKK1JlZmVyZW5jZVdHUzg0IDo6PSBTRVFVRU5DRSB7CisJcmVsYXRpdmVOb3J0aAlSZWxEaXN0YW5jZSwJCQkJLS0gcmVsYXRpdmUgZGlzdGFuY2UgKHNvdXRoIG5lZ2F0aXZlKQorCXJlbGF0aXZlRWFzdAlSZWxEaXN0YW5jZSwJCQkJLS0gcmVsYXRpdmUgZGlzdGFuY2UgKHdlc3QgbmVnYXRpdmUpCisJLS0gUmVsYXRpdmUgQWx0aXR1ZGUgaXMgbm90IGFsd2F5cyBrbm93bgorCXJlbGF0aXZlQWx0CQlSZWxhdGl2ZUFsdAkJT1BUSU9OQUwJLS0gcmVsYXRpdmUgYWx0aXR1ZGUKK30KKworLS0gRmluZSBSVEQgdmFsdWUgYmV0d2VlbiB0aGlzIEJUUyBhbmQgdGhlIHJlZmVyZW5jZSBCVFMJCitGaW5lUlREIDo6PSBJTlRFR0VSICgwLi4yNTUpCisKKy0tIFJlbGF0aXZlIG5vcnRoL2Vhc3QgZGlzdGFuY2UKK1JlbERpc3RhbmNlIDo6PSBJTlRFR0VSICgtMjAwMDAwLi4yMDAwMDApCisKKy0tIFJlbGF0aXZlIGFsdGl0dWRlCitSZWxhdGl2ZUFsdCA6Oj0gSU5URUdFUiAoLTQwMDAuLjQwMDApCisKKy0tIE1lYXN1cmUgcG9zaXRpb24gcmVzcG9uc2UgSUVzCistLSBSZWZlcmVuY2UgSWRlbnRpdHkKKy0tIE11bHRpcGxlIHNldHMKK011bHRpcGxlU2V0cyA6Oj0gU0VRVUVOQ0UgeworCS0tIG51bWJlciBvZiByZWZlcmVuY2Ugc2V0cworCW5ick9mU2V0cwkJCUlOVEVHRVIgKDIuLjMpLAkJCisKKwktLSBUaGlzIGZpZWxkIGFjdHVhbGx5IHRlbGxzIHRoZSBudW1iZXIgb2YgcmVmZXJlbmNlIEJUU3MKKwluYnJPZlJlZmVyZW5jZUJUU3MJSU5URUdFUiAoMS4uMyksCisKKwktLSBUaGlzIGZpZWxkIGlzIGNvbmRpdGlvbmFsIGFuZCBpbmNsdWRlZCBvcHRpb25hbGx5IG9ubHkgaWYKKwktLSBuYnJPZlNldHMgaXMgMyBhbmQgbnVtYmVyIG9mIHJlZmVyZW5jZSBCVFNzIGlzIDIuCisJcmVmZXJlbmNlUmVsYXRpb24JCVJlZmVyZW5jZVJlbGF0aW9uCQlPUFRJT05BTAorfQorCistLSBSZWxhdGlvbiBiZXR3ZWVuIHJlZmVuY2UgQlRTcyBhbmQgc2V0cworUmVmZXJlbmNlUmVsYXRpb24gOjo9IEVOVU1FUkFURUQgeworCXNlY29uZEJUU1RoaXJkU2V0ICgwKSwJLS0gMXN0IEJUUyByZWxhdGVkIHRvIDFzdCBhbmQgMm5kIHNldHMKKwlzZWNvbmRCVFNTZWNvbmRTZXQgKDEpLAktLSAxc3QgQlRTIHJlbGF0ZWQgdG8gMXN0IGFuZCAzcmQgc2V0cworCWZpcnN0QlRTRmlyc3RTZXQgKDIpCS0tIDFzdCBCVFMgcmVsYXRlZCB0byAxc3Qgc2V0Cit9CisKKy0tIFJlZmVyZW5jZSBCVFMgSWRlbnRpdHksIHRoaXMgZWxlbWVudCBjb250YWlucyBudW1iZXIgb2YKKy0tIEJUU3MgdG9sZCBuYnJPZlJlZmVyZW5jZUJUU3MgZmllbGQgaW4gTXVsdGlwbGUgc2V0cyBlbGVtZW50KQorUmVmZXJlbmNlSWRlbnRpdHkgOjo9IFNFUVVFTkNFIHsKKwktLSBSZWZlcmVuY2UgQlRTIGxpc3QKKwlyZWZCVFNMaXN0CQlTZXFPZlJlZmVyZW5jZUlkZW50aXR5VHlwZQorfQorU2VxT2ZSZWZlcmVuY2VJZGVudGl0eVR5cGUgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMpKSBPRiBSZWZlcmVuY2VJZGVudGl0eVR5cGUKKworLS0gQ2VsbCBpZGVudGl0eQorUmVmZXJlbmNlSWRlbnRpdHlUeXBlIDo6PSBDSE9JQ0UgeworCWJzaWNBbmRDYXJyaWVyCUJTSUNBbmRDYXJyaWVyLAkJLS0gQlNJQyBhbmQgQ2FycmllcgorCWNpCQkJCUNlbGxJRCwJCQkJLS0gQ2VsbCBJRCwgTEFDIG5vdCBuZWVkZWQKKwlyZXF1ZXN0SW5kZXgJUmVxdWVzdEluZGV4LAkJLS0gSW5kZXggdG8gUmVxdWVzdGVkIE5laWdoYm9yIExpc3QKKwlzeXN0ZW1JbmZvSW5kZXgJU3lzdGVtSW5mb0luZGV4LAktLSBJbmRleCB0byBTeXN0ZW0gaW5mbyBsaXN0LCB0aGlzIHR5cGUgb2YgcmVmLiBpZGVudGl0eQorCQkJCQkJCQkJCS0tIHNoYWxsIG5vdCBiZSB1c2VkIGJ5IHRoZSBNUyB1bmxlc3MgaXQgaGFzIHJlY2VpdmVkCisJCQkJCQkJCQkJLS0gdGhlIFN5c3RlbUluZm9Bc3Npc3REYXRhIGZyb20gdGhlIFNNTEMgZm9yIHRoaXMgY2VsbC4KKwljaUFuZExBQwkJQ2VsbElEQW5kTEFDCQktLSBDSSBhbmQgTEFDCit9CisKK0JTSUNBbmRDYXJyaWVyIDo6PSBTRVFVRU5DRSB7CisJY2FycmllcglCQ0NIQ2FycmllciwKKwlic2ljCQlCU0lDCit9CisKK1JlcXVlc3RJbmRleCA6Oj0gSU5URUdFUiAoMS4uMTYpCisKK1N5c3RlbUluZm9JbmRleCA6Oj0gSU5URUdFUiAoMS4uMzIpCisKK0NlbGxJREFuZExBQyA6Oj0gU0VRVUVOQ0UgeworCXJlZmVyZW5jZUxBQwlMQUNJRCwJCQkJLS0gTG9jYXRpb24gYXJlYSBjb2RlCisJcmVmZXJlbmNlQ0kJCUNlbGxJRAkJCQktLSBDZWxsIGlkZW50aXR5Cit9CitDZWxsSUQgOjo9IElOVEVHRVIgKDAuLjY1NTM1KQorTEFDSUQgOjo9IElOVEVHRVIgKDAuLjY1NTM1KQorCistLSBPVEQtTWVhc3VyZUluZm8KK09URC1NZWFzdXJlSW5mbyA6Oj0gU0VRVUVOQ0UgeworCS0tIE1lYXN1cmVtZW50IGluZm8gZWxlbWVudHMsIE9URC1Nc3JFbGVtZW50IGlzIHJlcGVhdGVkIG51bWJlciBvZiB0aW1lcworCS0tIHRvbGQgaW4gbmJyT2ZSZWZlcmVuY2VCVFNzIGluIE11bHRpcGxlU2V0cywgZGVmYXVsdCB2YWx1ZSBpcyAxCisJb3RkTXNyRmlyc3RTZXRzCQlPVEQtTXNyRWxlbWVudEZpcnN0LAorCisJLS0gaWYgbW9yZSB0aGFuIG9uZSBzZXRzIGFyZSBwcmVzZW50IHRoaXMgZWxlbWVudCBpcyByZXBlYXRlZAorCS0tIE51bWJlck9mU2V0cyAtIDEgKC0xID0gZmlyc3Qgc2V0KQorCW90ZE1zclJlc3RTZXRzCQlTZXFPZk9URC1Nc3JFbGVtZW50UmVzdAkJT1BUSU9OQUwKK30KKworU2VxT2ZPVEQtTXNyRWxlbWVudFJlc3QgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjIpKSBPRiBPVEQtTXNyRWxlbWVudFJlc3QKKworLS0gT1REIG1lYXN1cmVudCBpbmZvcm1hdGlvbiBmb3IgMSBzZXQKK09URC1Nc3JFbGVtZW50Rmlyc3QgOjo9IFNFUVVFTkNFIHsKKwlyZWZGcmFtZU51bWJlcgkJCUlOVEVHRVIgKDAuLjQyNDMxKSwgCQkJCS0tIEZyYW1lIG51bWJlciBtb2R1bG8gNDI0MzIKKwlyZWZlcmVuY2VUaW1lU2xvdAkJTW9kdWxvVGltZVNsb3QsCisJdG9hTWVhc3VyZW1lbnRzT2ZSZWYJVE9BLU1lYXN1cmVtZW50c09mUmVmCU9QVElPTkFMLAorCXN0ZFJlc29sdXRpb24JCQlTdGRSZXNvbHV0aW9uLAorCXRhQ29ycmVjdGlvbgkJCUlOVEVHRVIgKDAuLjk2MCkJCU9QVElPTkFMLAktLSBUQSBjb3JyZWN0aW9uCisKKwktLSBtZWFzdXJlZCBuZWlnaGJvcnMgaW4gT1REIG1lYXN1cmVtZW50cworCW90ZC1GaXJzdFNldE1zcnMgCQlTZXFPZk9URC1GaXJzdFNldE1zcnMgCU9QVElPTkFMCit9CitTZXFPZk9URC1GaXJzdFNldE1zcnMgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjEwKSkgT0YgT1RELUZpcnN0U2V0TXNycworCistLSBPVEQgbWVhc3VyZW50IGluZm9ybWF0aW9uIDIgYW5kIDMgc2V0cyBpZiBleGlzdAorT1RELU1zckVsZW1lbnRSZXN0IDo6PSBTRVFVRU5DRSB7CisJcmVmRnJhbWVOdW1iZXIJCQlJTlRFR0VSICgwLi40MjQzMSksIAkJCQkJLS0gRnJhbWUgbnVtYmVyIG1vZHVsbyA0MjQzMgorCXJlZmVyZW5jZVRpbWVTbG90CQlNb2R1bG9UaW1lU2xvdCwKKwl0b2FNZWFzdXJlbWVudHNPZlJlZglUT0EtTWVhc3VyZW1lbnRzT2ZSZWYJCU9QVElPTkFMLAorCXN0ZFJlc29sdXRpb24JCQlTdGRSZXNvbHV0aW9uLAorCXRhQ29ycmVjdGlvbgkJCUlOVEVHRVIgKDAuLjk2MCkJCQlPUFRJT05BTCwJLS0gVEEgY29ycmVjdGlvbgorCisJLS0gbWVhc3VyZWQgbmVpZ2hib3JzIGluIE9URCBtZWFzdXJlbWVudHMKKwlvdGQtTXNyc09mT3RoZXJTZXRzIAlTZXFPZk9URC1Nc3JzT2ZPdGhlclNldHMJT1BUSU9OQUwKK30KK1NlcU9mT1RELU1zcnNPZk90aGVyU2V0cyA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTApKSBPRiBPVEQtTXNyc09mT3RoZXJTZXRzCisKKy0tIFN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgVE9BIG1lYXN1cmVtZW50cyBmcm9tIHRoZSByZWZlcmVuY2UgQlRTCitUT0EtTWVhc3VyZW1lbnRzT2ZSZWYgOjo9IFNFUVVFTkNFIHsKKwlyZWZRdWFsaXR5CQkJUmVmUXVhbGl0eSwKKwludW1PZk1lYXN1cmVtZW50cwlOdW1PZk1lYXN1cmVtZW50cworfQorCitSZWZRdWFsaXR5IDo6PSBJTlRFR0VSICgwLi4zMSkJCQktLSBTdCBEZXYgb2YgVE9BIG9mIHJlZmVyZW5jZSBhcyBkZWZpbmVkIGluIGFubmV4CitOdW1PZk1lYXN1cmVtZW50cyA6Oj0gSU5URUdFUiAoMC4uNykJLS0gTm8uIG9mIG1lYXN1cmVtZW50cyBmb3IgUmVmUXVhbGl0eSBhcyBkZWZpbmVkIGluIGFubmV4CitTdGRSZXNvbHV0aW9uIDo6PSBJTlRFR0VSICgwLi4zKQkJLS0gVmFsdWVzIG9mIHJlc29sdXRpb24gYXJlIGRlZmluZWQgaW4gYW5uZXgKKworT1RELUZpcnN0U2V0TXNycyA6Oj0gT1RELU1lYXN1cmVtZW50V2l0aElECisKKy0tIE5laWdoYm91ciBpbmZvIGluIE9URCBtZWFzdXJlbWVudHMgMC0xMCB0aW1lcyBpbiBURCBtZWFzdXJlbWVudCBpbmZvCitPVEQtTXNyc09mT3RoZXJTZXRzIDo6PSBDSE9JQ0UgeworCWlkZW50aXR5Tm90UHJlc2VudAlPVEQtTWVhc3VyZW1lbnQsCQorCWlkZW50aXR5UHJlc2VudAkJT1RELU1lYXN1cmVtZW50V2l0aElECit9CisKKy0tIEZvciB0aGlzIE9URCBtZWFzdXJlbWVudCBpZGVudGl0eSBpcyBzYW1lIGFzIHRoZSBpZGVudGl0eSBvZiBCVFMKKy0tIGluIHRoZSBmaXJzdCBzZXQgd2l0aCBzYW1lIHNlcXVlbmNlIG51bWJlcgorT1RELU1lYXN1cmVtZW50IDo6PSBTRVFVRU5DRSB7CisJbmJvclRpbWVTbG90CU1vZHVsb1RpbWVTbG90LAorCWVvdGRRdWFsaXR5CQlFT1REUXVhbGl0eSwKKwlvdGRWYWx1ZQkJT1REVmFsdWUKK30KKworLS0gVGhpcyBtZWFzdXJlbWVudCBjb250YWlucyB0aGUgQlRTIGlkZW50aXR5IGFuZCBtZWFzdXJlbWVudAorT1RELU1lYXN1cmVtZW50V2l0aElEIDo6PVNFUVVFTkNFIHsKKwluZWlnaGJvcklkZW50aXR5CU5laWdoYm9ySWRlbnRpdHksCisJbmJvclRpbWVTbG90CQlNb2R1bG9UaW1lU2xvdCwKKwllb3RkUXVhbGl0eQkJCUVPVERRdWFsaXR5LAorCW90ZFZhbHVlCQkJT1REVmFsdWUKK30KKworRU9URFF1YWxpdHkgOjo9IFNFUVVFTkNFIHsKKwluYnJPZk1lYXN1cmVtZW50cwlJTlRFR0VSCSgwLi43KSwKKwlzdGRPZkVPVEQJCQlJTlRFR0VSICgwLi4zMSkKK30KKworTmVpZ2hib3JJZGVudGl0eSA6Oj0gQ0hPSUNFIHsKKwlic2ljQW5kQ2FycmllcgkJQlNJQ0FuZENhcnJpZXIsCQktLSBCU0lDIGFuZCBDYXJyaWVyCisJY2kJCQkJCUNlbGxJRCwJCQkJLS0gQ2VsbCBJRCwgTEFDIG5vdCBuZWVkZWQKKwltdWx0aUZyYW1lQ2FycmllcglNdWx0aUZyYW1lQ2FycmllciwgCS0tIE11bHRpRnJhbWVPZmZlc3QgYW5kIEJTSUMKKwlyZXF1ZXN0SW5kZXgJCVJlcXVlc3RJbmRleCwJCS0tIEluZGV4IHRvIFJlcXVlc3RlZCBOZWlnaGJvciBMaXN0CisJc3lzdGVtSW5mb0luZGV4CQlTeXN0ZW1JbmZvSW5kZXgsCS0tIEluZGV4IHRvIFN5c3RlbSBpbmZvIGxpc3QsIHRoaXMgdHlwZSBvZiBuZWlnaGJvdXIKKwkJCQkJCQkJCQkJLS0gaWRlbnRpdHkgc2hhbGwgbm90IGJlIHVzZWQgYnkgdGhlIE1TIHVubGVzcyBpdCBoYXMKKwkJCQkJCQkJCQkJLS0gcmVjZWl2ZWQgdGhlIFN5c3RlbUluZm9Bc3Npc3REYXRhIGZyb20gdGhlIFNNTEMgZm9yCisJCQkJCQkJCQkJCS0tIHRoaXMgY2VsbC4KKwljaUFuZExBQwkJCUNlbGxJREFuZExBQwkJLS0gQ0kgYW5kIExBQworfQorCistLSBNdWx0aWZyYW1lIGFuZCBjYXJyaWVyCitNdWx0aUZyYW1lQ2FycmllciA6Oj0gU0VRVUVOQ0UgeworCWJjY2hDYXJyaWVyCQkJQkNDSENhcnJpZXIsCisJbXVsdGlGcmFtZU9mZnNldAlNdWx0aUZyYW1lT2Zmc2V0Cit9CisKKy0tIE9URCBtZWFzdXJlbWVudCB2YWx1ZSBmb3IgbmVpZ2hib3VyCitPVERWYWx1ZSA6Oj0gSU5URUdFUiAoMC4uMzk5OTkpCisKKy0tIExvY2F0aW9uIGluZm9ybWF0aW9uIElFCitMb2NhdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlyZWZGcmFtZQkJSU5URUdFUiAoMC4uNjU1MzUpLAkJCS0tIFJlZmVyZW5jZSBGcmFtZSBudW1iZXIKKwktLSBJZiByZWZGcmFtZSBpcyB3aXRoaW4gKDQyNDMyLi42NTUzNSksIGl0IHNoYWxsIGJlIGlnbm9yZWQgYnkgdGhlIHJlY2VpdmVyCisJLS0gaW4gdGhhdCBjYXNlIHRoZSBNUyBzaG91bGQgcHJvdmlkZSBHUFMgVE9XIGlmIGF2YWlsYWJsZQorCWdwc1RPVwkJCUlOVEVHRVIgKDAuLjE0Mzk5OTk5KQlPUFRJT05BTCwJLS0gR1BTIFRPVworCWZpeFR5cGUJCQlGaXhUeXBlLAorCS0tIE5vdGUgdGhhdCBhcHBsaWNhYmxlIHJhbmdlIGZvciByZWZGcmFtZSBpcyAwIC0gNDI0MzEKKwktLSBQb3NzaWJsZSBzaGFwZXMgY2FycmllZCBpbiBwb3NFc3RpbWF0ZSBhcmUKKwktLSBlbGxpcHNvaWQgcG9pbnQsCisJLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCisJLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgZWxsaXBzZQorCS0tIGVsbGlwc29pZCBwb2ludCB3aXRoIGFsdGl0dWRlIGFuZCB1bmNlcnRhaW50eSBlbGxpcHNvaWQKKwlwb3NFc3RpbWF0ZQkJRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCit9CisKK0ZpeFR5cGUgOjo9IElOVEVHRVIgeworCXR3b0RGaXggKDApLAorCXRocmVlREZpeCAoMSkKK30gKDAuLjEpCisKKy0tIEdQUy1NZWFzdXJlbWVudCBpbmZvcm1hdGlvbgorR1BTLU1lYXN1cmVJbmZvIDo6PSBTRVFVRU5DRSB7CisJLS0gTWVhc3VyZW1lbnQgaW5mbyBlbGVtZW50cworCS0tIHVzZXIgaGFzIHRvIG1ha2Ugc3VyZSB0aGF0IGluIHRoaXMgZWxlbWVudCBpcyBudW1iZXIgb2YgZWxlbWVudHMKKwktLSBkZWZpbmVkIGluIHJlZmVyZW5jZSBCVFMgaWRlbnRpdHkKKwlncHNNc3JTZXRMaXN0CVNlcU9mR1BTLU1zclNldEVsZW1lbnQJCit9CitTZXFPZkdQUy1Nc3JTZXRFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4zKSkgT0YgR1BTLU1zclNldEVsZW1lbnQKKworLS0gT1REIG1lYXN1cmVudCBpbmZvcm1hdGlvbiAxLTMgdGltZXMgaW4gbWVzc2FnZQorR1BTLU1zclNldEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlyZWZGcmFtZQkJSU5URUdFUiAoMC4uNjU1MzUpCU9QVElPTkFMLCAJLS0gUmVmZXJlbmNlIEZyYW1lIG51bWJlcgorCWdwc1RPVwkJCUdQU1RPVzI0YiwJCQkJCQktLSBHUFMgVE9XCisJLS0gTm90ZSB0aGF0IGFwcGxpY2FibGUgcmFuZ2UgZm9yIHJlZkZyYW1lIGlzIDAgLSA0MjQzMQorCistLU5fU0FUIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGdwcy1tc3JMaXN0CisKKwlncHMtbXNyTGlzdAkJU2VxT2ZHUFMtTXNyRWxlbWVudAorfQorCistLSAyNCBiaXQgcHJlc2VudGF0aW9uIGZvciBHUFNUT1cKK0dQU1RPVzI0YiA6Oj0gSU5URUdFUiAoMC4uMTQzOTk5OTkpCisKKy0tIG1lYXN1cmVkIGVsZW1lbnRzIGluIG1lYXN1cmVtZW50IHBhcmFtZXRlcnMgZmllbGQKK1NlcU9mR1BTLU1zckVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE2KSkgT0YgR1BTLU1zckVsZW1lbnQKKworR1BTLU1zckVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzYXRlbGxpdGVJRAkJU2F0ZWxsaXRlSUQsCQkJCS0tIFNhdGVsbGl0ZSBpZGVudGlmaWVyCisJY05vCQkJCUlOVEVHRVIgKDAuLjYzKSwJCQktLSBjYXJyaWVyIG5vaXNlIHJhdGlvCisJZG9wcGxlcgkJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLCAJLS0gZG9wcGxlciwgbXVsbHRpcGx5IGJ5IDAuMgorCXdob2xlQ2hpcHMJCUlOVEVHRVIgKDAuLjEwMjIpLAkJCS0tIHdob2xlIHZhbHVlIG9mIHRoZSBjb2RlIHBoYXNlIG1lYXN1cmVtZW50CisJZnJhY0NoaXBzCQlJTlRFR0VSICgwLi4xMDI0KSwJCQktLSBmcmFjdGlvbmFsIHZhbHVlIG9mIHRoZSBjb2RlIHBoYXNlIG1lYXN1cmVtZW50CisJCQkJCQkJCQkJCS0tIGEgdmFsdWUgb2YgMTAyNCBzaGFsbCBub3QgYmUgZW5jb2RlZCBieSB0aGUgc2VuZGVyCisJCQkJCQkJCQkJCS0tIHRoZSByZWNlaXZlciBzaGFsbCBjb25zaWRlciBhIHZhbHVlIG9mIDEwMjQgdG8gYmUKKwkJCQkJCQkJCQkJLS0gaW52YWxpZCBkYXRhCisJbXBhdGhJbmRpYwkJTXBhdGhJbmRpYywJCQkJCS0tIG11bHRpcGF0aCBpbmRpY2F0b3IKKwlwc2V1UmFuZ2VSTVNFcnIJSU5URUdFUiAoMC4uNjMpCQkJCS0tIGluZGV4CQkKK30KKworLS0gTXVsdGlwYXRoIGluZGljYXRvcgorTXBhdGhJbmRpYyA6Oj0gRU5VTUVSQVRFRCB7CisJbm90TWVhc3VyZWQgKDApLAorCWxvdyAoMSksCisJbWVkaXVtICgyKSwKKwloaWdoICgzKQorfQorCistLSBMb2NhdGlvbiBlcnJvciBJRQorTG9jYXRpb25FcnJvciA6Oj0gU0VRVUVOQ0UgeworCWxvY0Vycm9yUmVhc29uCQkJCUxvY0Vycm9yUmVhc29uLAorCWFkZGl0aW9uYWxBc3Npc3RhbmNlRGF0YQlBZGRpdGlvbmFsQXNzaXN0YW5jZURhdGEJT1BUSU9OQUwsCisJLi4uCit9CisKK0xvY0Vycm9yUmVhc29uIDo6PSBFTlVNRVJBVEVEIHsKKwl1bkRlZmluZWQgKDApLAkKKwlub3RFbm91Z2hCVFNzICgxKSwKKwlub3RFbm91Z2hTYXRzICgyKSwKKwllb3RkTG9jQ2FsQXNzRGF0YU1pc3NpbmcgKDMpLAorCWVvdGRBc3NEYXRhTWlzc2luZyAoNCksCisJZ3BzTG9jQ2FsQXNzRGF0YU1pc3NpbmcgKDUpLAorCWdwc0Fzc0RhdGFNaXNzaW5nICg2KSwKKwltZXRob2ROb3RTdXBwb3J0ZWQgKDcpLAorCW5vdFByb2Nlc3NlZCAoOCksCisJcmVmQlRTRm9yR1BTTm90U2VydmluZ0JUUyAoOSksCisJcmVmQlRTRm9yRU9URE5vdFNlcnZpbmdCVFMgKDEwKSwKKwkuLi4sCisJbm90RW5vdWdoR0FOU1NTYXRzICgxMSksCQorIGdhbnNzQXNzRGF0YU1pc3NpbmcgKDEyKSwKKwlyZWZCVFNGb3JHQU5TU05vdFNlcnZpbmdCVFMgKDEzKQorfQorCistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBhbiB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyB2YWx1ZSAwCisKKworLS0gZGVmaW5lcyBhZGRpdGlvbmFsIGFzc2lzdGFuY2UgZGF0YSBuZWVkZWQgZm9yIGFueSBuZXcgbG9jYXRpb24gYXR0ZW1wdAorLS0gTVMgc2hhbGwgcmV0YWluIGFueSBhc3Npc3RhbmNlIGRhdGEgYWxyZWFkeSByZWNlaXZlZAorQWRkaXRpb25hbEFzc2lzdGFuY2VEYXRhIDo6PSBTRVFVRU5DRSB7CisJZ3BzQXNzaXN0YW5jZURhdGEJCUdQU0Fzc2lzdGFuY2VEYXRhCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCUV4dGVuc2lvbkNvbnRhaW5lcgkJT1BUSU9OQUwsCisJLi4uLAorCWdhbnNzQXNzaXN0YW5jZURhdGEgR0FOU1NBc3Npc3RhbmNlRGF0YSBPUFRJT05BTAorfQorCitHUFNBc3Npc3RhbmNlRGF0YSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhHUFNBc3Npc3RhbmNlRGF0YSkpCistLSBHUFNBc3Npc3RhbmNlRGF0YSBoYXMgaWRlbnRpY2FsIHN0cnVjdHVyZSBhbmQgZW5jb2RpbmcgdG8gb2N0ZXRzIDMgdG8gbiBvZiB0aGUKKy0tIEdQUyBBc3Npc3RhbmNlIERhdGEgSUUgaW4gM0dQUCBUUyA0OS4wMzEKKworbWF4R1BTQXNzaXN0YW5jZURhdGEJSU5URUdFUiA6Oj0gNDAKKworR0FOU1NBc3Npc3RhbmNlRGF0YSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhHQU5TU0Fzc2lzdGFuY2VEYXRhKSkKKy0tIEdBTlNTQXNzaXN0YW5jZURhdGEgaGFzIGlkZW50aWNhbCBzdHJ1Y3R1cmUgYW5kIGVuY29kaW5nIHRvIG9jdGV0cyAzIHRvIG4gb2YgdGhlCistLSBHQU5TUyBBc3Npc3RhbmNlIERhdGEgSUUgaW4gM0dQUCBUUyA0OS4wMzEKKworbWF4R0FOU1NBc3Npc3RhbmNlRGF0YQlJTlRFR0VSIDo6PSA0MAorCisKKy0tIFByb3RvY29sIEVycm9yIENhdXNlcworRXJyb3JDb2RlcyA6Oj0gRU5VTUVSQVRFRCB7CisJdW5EZWZpbmVkICgwKSwKK21pc3NpbmdDb21wb25ldCAoMSksCQkJCitpbmNvcnJlY3REYXRhICgyKSwJCQkKK21pc3NpbmdJRW9yQ29tcG9uZW50RWxlbWVudCAoMyksCQkKK21lc3NhZ2VUb29TaG9ydCAoNCksCQkJCit1bmtub3dSZWZlcmVuY2VOdW1iZXIgKDUpLAkJCisuLi4KK30KKworLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gYW4gdW5yZWNvZ25pemVkIHZhbHVlIHNoYWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgdmFsdWUgMAorCistLSBHUFMgYXNzaXN0YW5jZSBkYXRhIElFCitHUFMtQXNzaXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWNvbnRyb2xIZWFkZXIJCUNvbnRyb2xIZWFkZXIKK30KKworLS0gTW9yZSBBc3Npc3RhbmNlIERhdGEgVG8gQmUgU2VudCBJRQorLS0gTW9yZSBBc3Npc3RhbmNlIERhdGEgQ29tcG9uZW50cyBPbiB0aGUgV2F5IGluZGljYXRpb24gZm9yIGRlbGl2ZXJ5IG9mIGFuIGVudGlyZSBzZXQgb2YgYXNzaXN0YW5jZQorLS0gZGF0YSBpbiBtdWx0aXBsZSBBc3Npc3RhbmNlIERhdGEgY29tcG9uZW50cy4KKworTW9yZUFzc0RhdGFUb0JlU2VudCA6Oj0gRU5VTUVSQVRFRCB7CisJbm9Nb3JlTWVzc2FnZXMgKDApLAkJCS0tIFRoaXMgaXMgdGhlIG9ubHkgb3IgbGFzdCBBc3Npc3RhbmNlIERhdGEgbWVzc2FnZSB1c2VkIHRvIGRlbGl2ZXIKKwkJCQkJCQkJLS0gdGhlIGVudGlyZSBzZXQgb2YgYXNzaXN0YW5jZSBkYXRhLgorCW1vcmVNZXNzYWdlc09uVGhlV2F5ICgxKQktLSBUaGUgU01MQyB3aWxsIHNlbmQgbW9yZSBBc3Npc3RhbmNlIERhdGEgbWVzc2FnZXMgb3IgYSBmaW5hbCBSUkxQCisJCQkJCQkJCS0tIE1lYXN1cmUgUG9zaXRpb24gUmVxdWVzdCBtZXNzYWdlIHRvIGRlbGl2ZXIgdGhlCisJCQkJCQkJCS0tIHRoZSBlbnRpcmUgc2V0IG9mIGFzc2lzdGFuY2UgZGF0YS4KK30KKworLS0gQ29udHJvbCBoZWFkZXIgb2YgdGhlIEdQUyBhc3Npc3RhbmNlIGRhdGEKK0NvbnRyb2xIZWFkZXIgOjo9IFNFUVVFTkNFIHsKKworCS0tIEZpZWxkIHR5cGUgUHJlc2VudCBpbmZvcm1hdGlvbgorCXJlZmVyZW5jZVRpbWUJCVJlZmVyZW5jZVRpbWUJCU9QVElPTkFMLAorCXJlZkxvY2F0aW9uCQkJUmVmTG9jYXRpb24JCQlPUFRJT05BTCwKKwlkZ3BzQ29ycmVjdGlvbnMJCURHUFNDb3JyZWN0aW9ucwkJT1BUSU9OQUwsCisJbmF2aWdhdGlvbk1vZGVsCQlOYXZpZ2F0aW9uTW9kZWwJCU9QVElPTkFMLAorCWlvbm9zcGhlcmljTW9kZWwJCUlvbm9zcGhlcmljTW9kZWwJCU9QVElPTkFMLAorCXV0Y01vZGVsCQkJVVRDTW9kZWwJCQlPUFRJT05BTCwKKwlhbG1hbmFjCQkJQWxtYW5hYwkJCU9QVElPTkFMLAorCWFjcXVpc0Fzc2lzdAkJQWNxdWlzQXNzaXN0CQlPUFRJT05BTCwKKwlyZWFsVGltZUludGVncml0eSBTZXFPZi1CYWRTYXRlbGxpdGVTZXQgT1BUSU9OQUwKK30KKworUmVmZXJlbmNlVGltZSA6Oj0gU0VRVUVOQ0UgeworCWdwc1RpbWUJCQkJR1BTVGltZSwKKwlnc21UaW1lCQkJCUdTTVRpbWUJCQkJT1BUSU9OQUwsCisJZ3BzVG93QXNzaXN0CQlHUFNUT1dBc3Npc3QJCU9QVElPTkFMCit9CisKKy0tIEdQUyBUaW1lIGluY2x1ZGVzIHdlZWsgbnVtYmVyIGFuZCB0aW1lLW9mLXdlZWsgKFRPVykKK0dQU1RpbWUgOjo9IFNFUVVFTkNFIHsKKwlncHNUT1cyM2IJCQlHUFNUT1cyM2IsCisJZ3BzV2VlawkJCQlHUFNXZWVrCit9CisKKy0tIEdQU1RPVywgcmFuZ2UgMC02MDQ3OTkuOTIsIHJlc29sdXRpb24gMC4wOCBzZWMsIDIzLWJpdCBwcmVzZW50YXRpb24KK0dQU1RPVzIzYiA6Oj0gSU5URUdFUiAoMC4uNzU1OTk5OSkKKworLS0gR1BTIHdlZWsgbnVtYmVyCitHUFNXZWVrIDo6PSBJTlRFR0VSICgwLi4xMDIzKQorCistLSBHUFNUT1dBc3Npc3QgY29uc2lzdHMgb2YgVExNIG1lc3NhZ2UsIEFudGktc3Bvb2YgZmxhZywgQWxlcnQgZmxhZywgYW5kIDIgcmVzZXJ2ZWQgYml0cyBpbiBUTE0gV29yZAorLS0gZm9yIGVhY2ggdmlzaWJsZSBzYXRlbGxpdGUuCistLSBOX1NBVCBjYW4gYmUgcmVhZCBmcm9tIG51bWJlciBvZiBlbGVtZW50cyBpbiBHUFNUT1dBc3Npc3QKK0dQU1RPV0Fzc2lzdCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTIpKSBPRiBHUFNUT1dBc3Npc3RFbGVtZW50CisKK0dQU1RPV0Fzc2lzdEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzYXRlbGxpdGVJRAkJCVNhdGVsbGl0ZUlELAorCXRsbVdvcmQJCQkJVExNV29yZCwKKwlhbnRpU3Bvb2YJCQlBbnRpU3Bvb2ZGbGFnLAorCWFsZXJ0CQkJCUFsZXJ0RmxhZywKKwl0bG1Sc3ZkQml0cwkJCVRMTVJlc2VydmVkQml0cworfQorCistLSBUTE0gV29yZCwgMTQgYml0cworVExNV29yZCA6Oj0gSU5URUdFUiAoMC4uMTYzODMpCisKKy0tIEFudGktU3Bvb2YgZmxhZworQW50aVNwb29mRmxhZyA6Oj0gSU5URUdFUiAoMC4uMSkKKworLS0gQWxlcnQgZmxhZworQWxlcnRGbGFnIDo6PSBJTlRFR0VSICgwLi4xKQorCistLSBSZXNlcnZlZCBiaXRzIGluIFRMTSB3b3JkLCBNU0Igb2NjdXJzIGVhcmxpZXIgaW4gVExNIFdvcmQgdHJhbnNtaXR0ZWQgYnkgc2F0ZWxsaXRlCitUTE1SZXNlcnZlZEJpdHMgOjo9IElOVEVHRVIgKDAuLjMpCisKK0dTTVRpbWUgOjo9IFNFUVVFTkNFIHsKKwliY2NoQ2FycmllcgkJQkNDSENhcnJpZXIsCS0tIEJDQ0ggY2FycmllcgorCWJzaWMJCQlCU0lDLAkJCS0tIEJTSUMKKwlmcmFtZU51bWJlcgkJRnJhbWVOdW1iZXIsCisJdGltZVNsb3QJCVRpbWVTbG90LAorCWJpdE51bWJlcgkJQml0TnVtYmVyCit9CisKKy0tIEZyYW1lIG51bWJlcgorRnJhbWVOdW1iZXIgOjo9IElOVEVHRVIgKDAuLjIwOTcxNTEpCisKKy0tIFRpbWUgc2xvdCBudW1iZXIKK1RpbWVTbG90IDo6PSBJTlRFR0VSICgwLi43KQorCistLSBCaXQgbnVtYmVyCitCaXROdW1iZXIgOjo9IElOVEVHRVIgKDAuLjE1NikKKworCistLSBSZWZlcmVuY2UgTG9jYXRpb24gSUUKK1JlZkxvY2F0aW9uIDo6PSBTRVFVRU5DRSB7CisJdGhyZWVETG9jYXRpb24JCQlFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24KK30KKworLS0gREdQUyBDb3JyZWN0aW9ucyBJRQorREdQU0NvcnJlY3Rpb25zIDo6PSBTRVFVRU5DRSB7CisKKwlncHNUT1cJCUlOVEVHRVIgKDAuLjYwNDc5OSksCS0tIERHUFMgcmVmZXJlbmNlIHRpbWUKKwlzdGF0dXMJCUlOVEVHRVIgKDAuLjcpLAorCS0tIE5fU0FUIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHNhdExpc3QKKwlzYXRMaXN0CQlTZXFPZlNhdEVsZW1lbnQgCQorfQorU2VxT2ZTYXRFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSAoMS4uMTYpKSBPRiBTYXRFbGVtZW50CisKKy0tIG51bWJlciBvZiBjb3JyZWN0aW9uIGZvciBzYXRlbGxpdGVzCitTYXRFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc2F0ZWxsaXRlSUQJCVNhdGVsbGl0ZUlELAorCisKKy0tLSBTZXF1ZW5jZSBudW1iZXIgZm9yIGVwaGVtZXJpcworCWlvZGUgCQkJSU5URUdFUiAoMC4uMjM5KSwKKwktLSBVc2VyIERpZmZlcmVudGlhbCBSYW5nZSBFcnJvcgorCXVkcmUJCQlJTlRFR0VSICgwLi4zKSwJCQorCisJLS0gUHNldWRvIFJhbmdlIENvcnJlY3Rpb24sIHJhbmdlIGlzCisJLS0gLTY1NS4wNCAtICs2NTUuMDQsCisJcHNldWRvUmFuZ2VDb3IJSU5URUdFUiAoLTIwNDcuLjIwNDcpLCAJCisKKwktLSBQc2V1ZG8gUmFuZ2UgUmF0ZSBDb3JyZWN0aW9uLCByYW5nZSBpcworCS0tIC00LjA2NCAtICs0LjA2NCwKKwlyYW5nZVJhdGVDb3IJSU5URUdFUiAoLTEyNy4uMTI3KSwKKworLS0gRGVsdGEgUHNldWRvIFJhbmdlIENvcnJlY3Rpb24gMiAJCisJZGVsdGFQc2V1ZG9SYW5nZUNvcjIgCUlOVEVHRVIgKC0xMjcuLjEyNyksCS0tIFRoaXMgSUUgc2hhbGwgYmUgaWdub3JlZCBieSB0aGUgcmVjZWl2ZXIgYW5kCisJCQkJCQkJCQkJCQkJLS0gc2V0IHRvIHplcm8gYnkgdGhlIHNlbmRlcgorCS0tIERlbHRhIFBzZXVkbyBSYW5nZSBDb3JyZWN0aW9uIDIJCisJZGVsdGFSYW5nZVJhdGVDb3IyCQlJTlRFR0VSICgtNy4uNyksCQktLSBUaGlzIElFIHNoYWxsIGJlIGlnbm9yZWQgYnkgdGhlIHJlY2VpdmVyIGFuZAorCQkJCQkJCQkJCQkJCS0tIHNldCB0byB6ZXJvIGJ5IHRoZSBzZW5kZXIKKwktLSBEZWx0YSBQc2V1ZG8gUmFuZ2UgQ29ycmVjdGlvbiAzCisJZGVsdGFQc2V1ZG9SYW5nZUNvcjMgCUlOVEVHRVIgKC0xMjcuLjEyNyksCS0tIFRoaXMgSUUgc2hhbGwgYmUgaWdub3JlZCBieSB0aGUgcmVjZWl2ZXIgYW5kCisJCQkJCQkJCQkJCQkJLS0gc2V0IHRvIHplcm8gYnkgdGhlIHNlbmRlcgorCS0tIERlbHRhIFBzZXVkbyBSYW5nZSBDb3JyZWN0aW9uIDMKKwlkZWx0YVJhbmdlUmF0ZUNvcjMJCUlOVEVHRVIgKC03Li43KQkJCS0tIFRoaXMgSUUgc2hhbGwgYmUgaWdub3JlZCBieSB0aGUgcmVjZWl2ZXIgYW5kCisJCQkJCQkJCQkJCQkJLS0gc2V0IHRvIHplcm8gYnkgdGhlIHNlbmRlcgorfQorCitTYXRlbGxpdGVJRCA6Oj0gSU5URUdFUiAoMC4uNjMpCS0tIGlkZW50aWZpZXMgc2F0ZWxsaXRlCisKKy0tIE5hdmlnYXRpb24gTW9kZWwgSUUKK05hdmlnYXRpb25Nb2RlbCA6Oj0gU0VRVUVOQ0UgeworCW5hdk1vZGVsTGlzdAlTZXFPZk5hdk1vZGVsRWxlbWVudAkKK30KKworLS0gbmF2aWdhdGlvbiBtb2RlbCBzYXRlbGxpdGUgbGlzdAorU2VxT2ZOYXZNb2RlbEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE2KSkgT0YgTmF2TW9kZWxFbGVtZW50CisKK05hdk1vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXNhdGVsbGl0ZUlECQlTYXRlbGxpdGVJRCwJCQkKKwlzYXRTdGF0dXMJCVNhdFN0YXR1cwkJLS0gc2F0ZWxsaXRlIHN0YXR1cworfQorCistLSB0aGUgU3RhdHVzIG9mIHRoZSBuYXZpZ2F0aW9uIG1vZGVsCitTYXRTdGF0dXMgOjo9IENIT0lDRSB7CisJLS0gTmV3IHNhdGVsbGl0ZSwgbmV3IE5hdmlnYXRpb24gTW9kZWwKKwluZXdTYXRlbGxpdGVBbmRNb2RlbFVDCVVuY29tcHJlc3NlZEVwaGVtZXJpcywKKworCS0tIEV4aXN0aW5nIHNhdGVsbGl0ZSwgRXhpc3RpbmcgTmF2aWdhdGlvbiBNb2RlbAorCW9sZFNhdGVsbGl0ZUFuZE1vZGVsCU5VTEwsCisKKwktLSBFeGlzdGluZyBzYXRlbGxpdGUsIG5ldyBOYXZpZ2F0aW9uIE1vZGVsCisJbmV3TmF2aU1vZGVsVUMJCQlVbmNvbXByZXNzZWRFcGhlbWVyaXMsCisJLi4uCit9CisKKy0tIFVuY29tcHJlc3NlZCBzYXRlbGxpdGUgZW1oZW1lcmlzIGFuZCBjbG9jayBjb3JyZWN0aW9ucworVW5jb21wcmVzc2VkRXBoZW1lcmlzIDo6PSBTRVFVRU5DRSB7CisJZXBoZW1Db2RlT25MMglJTlRFR0VSICgwLi4zKSwKKwllcGhlbVVSQQkJSU5URUdFUiAoMC4uMTUpLAorCWVwaGVtU1ZoZWFsdGgJSU5URUdFUiAoMC4uNjMpLAorCWVwaGVtSU9EQwkJSU5URUdFUgkoMC4uMTAyMyksCisJZXBoZW1MMlBmbGFnCUlOVEVHRVIgKDAuLjEpLAorCWVwaGVtU0YxUnN2ZAlFcGhlbWVyaXNTdWJmcmFtZTFSZXNlcnZlZCwKKwllcGhlbVRnZAkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwllcGhlbVRvYwkJSU5URUdFUiAoMC4uMzc3OTkpLAorCWVwaGVtQUYyCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWVwaGVtQUYxCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbUFGMAkJSU5URUdFUiAoLTIwOTcxNTIuLjIwOTcxNTEpLAorCWVwaGVtQ3JzCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbURlbHRhTgkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1NMAkJCUlOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwllcGhlbUN1YwkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1FCQkJSU5URUdFUiAoMC4uNDI5NDk2NzI5NSksCisJZXBoZW1DdXMJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWVwaGVtQVBvd2VySGFsZglJTlRFR0VSICgwLi40Mjk0OTY3Mjk1KSwKKwllcGhlbVRvZQkJSU5URUdFUiAoMC4uMzc3OTkpLAorCWVwaGVtRml0RmxhZwlJTlRFR0VSICgwLi4xKSwKKwllcGhlbUFPREEJCUlOVEVHRVIgKDAuLjMxKSwKKwllcGhlbUNpYwkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1PbWVnYUEwCUlOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwllcGhlbUNpcwkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1JMAkJCUlOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwllcGhlbUNyYwkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1XCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWVwaGVtT21lZ2FBRG90CUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwllcGhlbUlEb3QJCUlOVEVHRVIgKC04MTkyLi44MTkxKQorfQorCistLSBSZXNlcnZlZCBiaXRzIGluIHN1YmZyYW1lIDEgb2YgbmF2aWdhdGlvbiBtZXNzYWdlCitFcGhlbWVyaXNTdWJmcmFtZTFSZXNlcnZlZCA6Oj0gU0VRVUVOQ0UgeworCXJlc2VydmVkMQkJSU5URUdFUiAoMC4uODM4ODYwNyksCS0tIDIzLWJpdCBmaWVsZAorCXJlc2VydmVkMgkJSU5URUdFUiAoMC4uMTY3NzcyMTUpLAktLSAyNC1iaXQgZmllbGQKKwlyZXNlcnZlZDMJCUlOVEVHRVIgKDAuLjE2Nzc3MjE1KSwJLS0gMjQtYml0IGZpZWxkCisJcmVzZXJ2ZWQ0CQlJTlRFR0VSICgwLi42NTUzNSkJCS0tIDE2LWJpdCBmaWVsZAorfQorCistLSBJb25vc3BoZXJpYyBNb2RlbCBJRQorSW9ub3NwaGVyaWNNb2RlbCA6Oj0gU0VRVUVOQ0UgeworCWFsZmEwCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwlhbGZhMQkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJYWxmYTIJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWFsZmEzCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwliZXRhMAkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJYmV0YTEJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWJldGEyCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwliZXRhMwkJCUlOVEVHRVIgKC0xMjguLjEyNykKK30KKworLS0gVW5pdmVyc2FsIFRpbWUgQ29vcmRpbmF0ZSBNb2RlbAorVVRDTW9kZWwgOjo9IFNFUVVFTkNFIHsKKwl1dGNBMQkJCUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwl1dGNBMAkJCUlOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwl1dGNUb3QJCQlJTlRFR0VSICgwLi4yNTUpLAorCXV0Y1dOdAkJCUlOVEVHRVIgKDAuLjI1NSksCisJdXRjRGVsdGFUbHMJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJdXRjV05sc2YJCUlOVEVHRVIgKDAuLjI1NSksCisJdXRjRE4JCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCXV0Y0RlbHRhVGxzZglJTlRFR0VSICgtMTI4Li4xMjcpCit9CisKKy0tIEFsbWFuYWMsIExvbmcgdGVybSBtb2RlbAorLS0gTk9URTogVGhlc2UgYXJlIHBhcmFtZXRlcnMgYXJlIHN1YnNldCBvZiB0aGUgZXBoZW1lcmlzCistLSBOT1RFOiBCdXQgd2l0aCByZWR1Y2VkIHJlc29sdXRpb24gYW5kIGFjY3VyYWN5CitBbG1hbmFjIDo6PSBTRVFVRU5DRSB7CisJYWxhbWFuYWNXTmEJCUlOVEVHRVIgKDAuLjI1NSksCS0tIE9uY2UgcGVyIG1lc3NhZ2UKKworCS0tIG5hdmlnYXRpb24gbW9kZWwgc2F0ZWxsaXRlIGxpc3QuCisJLS0gVGhlIHNpemUgb2YgYWxtYW5hY0xpc3QgaXMgYWN0dWFsbHkgTnVtc19TYXRzX1RvdGFsIGZpZWxkCisJYWxtYW5hY0xpc3QJCVNlcU9mQWxtYW5hY0VsZW1lbnQJCQorfQorU2VxT2ZBbG1hbmFjRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uNjQpKSBPRiBBbG1hbmFjRWxlbWVudAorCistLSBBbG1hbmFjIGluZm8gb25jZSBwZXIgc2F0ZWxsaXRlCitBbG1hbmFjRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXNhdGVsbGl0ZUlECQkJU2F0ZWxsaXRlSUQsCisJYWxtYW5hY0UJCQlJTlRFR0VSICgwLi42NTUzNSksCisJYWxhbWFuYWNUb2EJCQlJTlRFR0VSICgwLi4yNTUpLAorCWFsbWFuYWNLc2lpCQkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJYWxtYW5hY09tZWdhRG90CQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwlhbG1hbmFjU1ZoZWFsdGgJCUlOVEVHRVIgKDAuLjI1NSksCisJYWxtYW5hY0FQb3dlckhhbGYJSU5URUdFUiAoMC4uMTY3NzcyMTUpLAorCWFsbWFuYWNPbWVnYTAJCUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwlhbG1hbmFjVwkJCUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwlhbG1hbmFjTTAJCQlJTlRFR0VSICgtODM4ODYwOC4uODM4ODYwNyksCisJYWxtYW5hY0FGMAkJCUlOVEVHRVIgKC0xMDI0Li4xMDIzKSwKKwlhbG1hbmFjQUYxCQkJSU5URUdFUiAoLTEwMjQuLjEwMjMpCit9CisKKy0tIEFjcXVpc2l0aW9uIEFzc2lzdGFuY2UKK0FjcXVpc0Fzc2lzdCA6Oj0gU0VRVUVOQ0UgeworCisJLS0gTnVtYmVyIG9mIFNhdGVsbGl0ZXMgY2FuIGJlIHJlYWQgZnJvbSBhY3F1aXN0TGlzdAorCXRpbWVSZWxhdGlvbglUaW1lUmVsYXRpb24sCisKKwktLSBBY3F1aXNpdGlvbiBhc3Npc3RhbmNlIGxpc3QKKwktLSBUaGUgc2l6ZSBvZiBOdW1iZXIgb2YgU2F0ZWxsaXRlcyBpcyBhY3R1YWxseSBOdW1iZXIgb2YgU2F0ZWxsaXRlcyBmaWVsZAorCWFjcXVpc0xpc3QJCVNlcU9mQWNxdWlzRWxlbWVudAkJCit9CitTZXFPZkFjcXVpc0VsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE2KSkgT0YgQWNxdWlzRWxlbWVudAorCistLSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gR1BTIHRpbWUgYW5kIGFpci1pbnRlcmZhY2UgdGltaW5nCitUaW1lUmVsYXRpb24gOjo9IFNFUVVFTkNFIHsKKwktLQorCWdwc1RPVwkJR1BTVE9XMjNiLAkJLS0gMjNiIHByZXNlbnRhdGlvbgorCWdzbVRpbWUJCUdTTVRpbWUJCU9QVElPTkFMCit9CisKKy0tIGRhdGEgb2NjdXJpbmcgcGVyIG51bWJlciBvZiBzYXRlbGxpdGVzCitBY3F1aXNFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc3ZpZAkJCQkJU2F0ZWxsaXRlSUQsCisKKwktLSBEb3BwbGVyIDB0aCBvcmRlciB0ZXJtLAorCS0tIC01MTIwLjAgLSA1MTE3LjUgSHogKD0gLTIwNDggLSAyMDQ3IHdpdGggMi41IEh6IHJlc29sdXRpb24pCisJZG9wcGxlcjAJCQkJSU5URUdFUiAoLTIwNDguLjIwNDcpLAkKKwlhZGRpb25hbERvcHBsZXIJCQlBZGRpb25hbERvcHBsZXJGaWVsZHMJT1BUSU9OQUwsCisJY29kZVBoYXNlCQkJCUlOVEVHRVIgKDAuLjEwMjIpLAktLSBDb2RlIFBoYXNlCisJaW50Q29kZVBoYXNlCQkJSU5URUdFUiAoMC4uMTkpLAktLSBJbnRlZ2VyIENvZGUgUGhhc2UKKwlncHNCaXROdW1iZXIJCQlJTlRFR0VSICgwLi4zKSwgCS0tIEdQUyBiaXQgbnVtYmVyCisJY29kZVBoYXNlU2VhcmNoV2luZG93CUlOVEVHRVIgKDAuLjE1KSwJLS0gQ29kZSBQaGFzZSBTZWFyY2ggV2luZG93CisJYWRkaW9uYWxBbmdsZQkJCUFkZGlvbmFsQW5nbGVGaWVsZHMJCU9QVElPTkFMCit9CisKK0FkZGlvbmFsRG9wcGxlckZpZWxkcyA6Oj0gU0VRVUVOQ0UgeworCS0tIERvcHBsZXIgMXN0IG9yZGVyIHRlcm0sIC0xLjAgLSArMC41IEh6L3NlYworIC0tICg9IC00MiArICgwIHRvIDYzKSB3aXRoIDEvNDIgSHovc2VjLiByZXNvbHV0aW9uKQorCWRvcHBsZXIxCQkJCUlOVEVHRVIgKDAuLjYzKSwKKwlkb3BwbGVyVW5jZXJ0YWludHkJCUlOVEVHRVIgKDAuLjcpCisgLS0gYSBzZW5kZXIgc2hhbGwgbm90IGVuY29kZSBhbnkgRG9wcGxlclVuY2VydGFpbnR5IHZhbHVlIGluIHRoZSByYW5nZSA1IHRvIDcKKyAtLSBhIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSBhbnkgdmFsdWUgYmV0d2VlbiA1IGFuZCA3LgorfQorCitBZGRpb25hbEFuZ2xlRmllbGRzCTo6PSBTRVFVRU5DRSB7CisJLS0gYXppbXV0aCBhbmdsZSwgMCAtIDM0OC43NSBkZWcgKD0gMCAtIDMxIHdpdGggMTEuMjUgZGVnIHJlc29sdXRpb24pCisJYXppbXV0aAkJCQkJSU5URUdFUiAoMC4uMzEpLAorCS0tIGVsZXZhdGlvbiBhbmdsZSwgMCAtIDc4Ljc1IGRlZyAoPSAwIC0gNyB3aXRoIDExLjI1IGRlZyByZXNvbHV0aW9uKQorCWVsZXZhdGlvbgkJCQlJTlRFR0VSICgwLi43KQorfQorCistLSBSZWFsLVRpbWUgSW50ZWdyaXR5CistLSBudW1iZXIgb2YgYmFkIHNhdGVsbGl0ZXMgY2FuIGJlIHJlYWQgZnJvbSB0aGlzIGVsZW1lbnQKK1NlcU9mLUJhZFNhdGVsbGl0ZVNldCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBTYXRlbGxpdGVJRAorCistLSBFeHRlbnNpb24gRWxlbWVudHMKKworLS0gUmVsZWFzZSA5OCBFeHRlbnNpb25zIGhlcmUKK1JlbDk4LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKKwlyZWw5OC1FeHQtRXhwT1RECQkJUmVsOTgtRXh0LUV4cE9URAkJT1BUSU9OQUwsCS0tIEV4cGVjdGVkT1REIGV4dGVuc2lvbgorCS4uLiwgCisgZ3BzVGltZUFzc2lzdGFuY2VNZWFzdXJlbWVudFJlcXVlc3QgTlVMTCBPUFRJT05BTCwgCisgZ3BzUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IEdQU1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBPUFRJT05BTAorCistLSBGdXJ0aGVyIFI5OCBleHRlbnNpb25zIGhlcmUKK30KK1JlbDk4LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCXJlbDk4LUV4dC1FeHBPVEQJCQlSZWw5OC1FeHQtRXhwT1RECQlPUFRJT05BTCwJLS0gRXhwZWN0ZWRPVEQgZXh0ZW5zaW9uCisJLi4uLCAKKyBncHNUaW1lQXNzaXN0YW5jZU1lYXN1cmVtZW50UmVxdWVzdCBOVUxMIE9QVElPTkFMLAorIGdwc1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBHUFNSZWZlcmVuY2VUaW1lVW5jZXJ0YWludHkgT1BUSU9OQUwKKworLS0gRnVydGhlciBSOTggZXh0ZW5zaW9ucyBoZXJlCit9CisKKy0tIFJlbGVhc2UgOTggRXhwT1REIGV4dGVuc2lvbgorUmVsOTgtRXh0LUV4cE9URCA6Oj0gU0VRVUVOQ0UgeworLS0gSWYgTXNyQXNzaXN0QlRTIGlzIGluY2x1ZGVkIGluIG1lc3NhZ2UsIG1zckFzc2lzdERhdGEtUjk4LUV4cE9URCBzaGFsbCBiZSBpbmNsdWRlZC4KKwltc3JBc3Npc3REYXRhLVI5OC1FeHBPVEQJCQlNc3JBc3Npc3REYXRhLVI5OC1FeHBPVEQJCQlPUFRJT05BTCwKKworLS0gSWYgU3lzdGVtSW5mb0Fzc2lzdGFEYXRhIGlzIGluY2x1ZGVkIGluIG1lc3NhZ2UsIHN5c3RlbUluZm9Bc3Npc3REYXRhLVI5OC1FeHBPVEQgc2hhbGwgYmUKKy0tIGluY2x1ZGVkLgorCXN5c3RlbUluZm9Bc3Npc3REYXRhLVI5OC1FeHBPVEQJU3lzdGVtSW5mb0Fzc2lzdERhdGEtUjk4LUV4cE9URAlPUFRJT05BTAorfQorCistLSBNc3JBc3Npc3REYXRhIFI5OCBleHRlbnNpb24KK01zckFzc2lzdERhdGEtUjk4LUV4cE9URCA6Oj0gU0VRVUVOQ0UgeworCSBtc3JBc3Npc3RMaXN0LVI5OC1FeHBPVEQJCQkgU2VxT2ZNc3JBc3Npc3RCVFMtUjk4LUV4cE9URAorfQorCistLSBJbmRleGVzIGluIFNlcU9mTXNyQXNzaXN0QlRTLVI5OC1FeHBPVEQgcmVmZXIgdG8gU2VxT2ZNc3JBc3Npc3RCVFMKKy0tIElmIHRoZSBpbmRleCBleGNlZWRzIHRoZSBTZWdPZk1zckFzc2lzdEJUUyByYW5nZSBvciBpZiB0aGVyZSBpcyBvdGhlcgorLS0gaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gdGhlIEJUUyBpbmRpY2VzLCB0aGUgTVMgc2hhbGwgYXBwbHkgcHJvdG9jb2wKKy0tIGVycm9yIGNhdXNlIGluY29ycmVjdERhdGEKK1NlcU9mTXNyQXNzaXN0QlRTLVI5OC1FeHBPVEQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE1KSkgT0YgTXNyQXNzaXN0QlRTLVI5OC1FeHBPVEQKKworLS0gVGhpcyBlbGVtZW50IGNvbXBsZXRlcyBNc3JBc3Npc3RCVFMgSUUKK01zckFzc2lzdEJUUy1SOTgtRXhwT1REIDo6PSBTRVFVRU5DRSB7CisJZXhwZWN0ZWRPVEQJCQkJRXhwZWN0ZWRPVEQsCisJZXhwT1REVW5jZXJ0YWludHkJCUV4cE9URFVuY2VydGFpbnR5Cit9CisKKy0tIFN5c3RlbUluZm9Bc3Npc3REYXRhIFI5OCBleHRlbnNpb24KK1N5c3RlbUluZm9Bc3Npc3REYXRhLVI5OC1FeHBPVEQgOjo9IFNFUVVFTkNFIHsKKwlzeXN0ZW1JbmZvQXNzaXN0TGlzdFI5OC1FeHBPVEQgCVNlcU9mU3lzdGVtSW5mb0Fzc2lzdEJUUy1SOTgtRXhwT1RECit9CisKKy0tIFNlcU9mU3lzdGVtSW5mb0Fzc2lzdEJUUy1SOTgtRXhwT1REIGluZGV4IHJlZmVyIHRvIFNlcU9mU3lzdGVtSW5mb0Fzc2lzdEJUUworLS0gSWYgdGhlIGluZGV4IGV4Y2VlZHMgdGhlIFNlZ09mU3lzdGVtSW5mb0Fzc2lzdEJUUyByYW5nZSBvciBpZiB0aGVyZSBpcyBvdGhlcgorLS0gaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gdGhlIEJUUyBpbmRpY2VzLCB0aGUgTVMgc2hhbGwgYXBwbHkgcHJvdG9jb2wKKy0tIGVycm9yIGNhdXNlIGluY29ycmVjdERhdGEKK1NlcU9mU3lzdGVtSW5mb0Fzc2lzdEJUUy1SOTgtRXhwT1REIDo6PSBTRVFVRU5DRSAoU0laRSgxLi4zMikpIE9GIFN5c3RlbUluZm9Bc3Npc3RCVFMtUjk4LUV4cE9URAorCistLSB3aGV0aGVyIG4udGggaXMgcHJlc2VudCBvciBub3QgPworU3lzdGVtSW5mb0Fzc2lzdEJUUy1SOTgtRXhwT1REIDo6PSBDSE9JQ0UgeworCW5vdFByZXNlbnQJCU5VTEwsCisJcHJlc2VudAkJCUFzc2lzdEJUU0RhdGEtUjk4LUV4cE9URAorfQorCistLSBUaGlzIGVsZW1lbnQgY29tcGxldGVzIEFzc2lzdEJUU0RhdGEgSUUKK0Fzc2lzdEJUU0RhdGEtUjk4LUV4cE9URCA6Oj0gU0VRVUVOQ0UgeworCWV4cGVjdGVkT1RECQkJCUV4cGVjdGVkT1RELAorCWV4cE9URHVuY2VydGFpbnR5CQlFeHBPVERVbmNlcnRhaW50eQktLSBVbmNlcnRhaW50eSBvZiBleHBlY3RlZCBPVEQKK30KKworLS0gRXhwZWN0ZWQgT1REIHZhbHVlIGJldHdlZW4gbmJvciBiYXNlIHN0YXRpb24gYW5kIHJlZmVyZW5jZSBCVFMKKy0tIGF0IE1TJ3MgY3VycmVudCBlc3RpbWF0ZWQgbG9jYXRpb24uCitFeHBlY3RlZE9URCA6Oj0gSU5URUdFUiAoMC4uMTI1MCkKKy0tIFRoZSBFeHBlY3RlZE9URCB2YWx1ZSAxMjUwIHNoYWxsIG5vdCBiZSBlbmNvZGVkIGJ5IHRoZSB0cmFuc21pdHRpbmcgZW50aXR5IGFuZAorLS0gc2hhbGwgYmUgdHJlYXRlZCBieSB0aGUgcmVjZWl2aW5nIGVudGl0eSBhcyAwLgorLS0gVW5jZXJ0YWludHkgb2YgRXhwdGVjdGVkIE9URCBpbiBiaXRzCitFeHBPVERVbmNlcnRhaW50eSA6Oj0gSU5URUdFUigwLi43KQorCistLSBSZWxlYXNlIDk4IGV4dGVuc2lvbnMKKworR1BTUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IDo6PSBJTlRFR0VSICgwIC4uIDEyNykgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCitHUFNUaW1lQXNzaXN0YW5jZU1lYXN1cmVtZW50cyA6Oj0gU0VRVUVOQ0UgeworIHJlZmVyZW5jZUZyYW1lTVNCIElOVEVHRVIgKDAgLi4gNjMpLCAtLSBNU0Igb2YgZnJhbWUgbnVtYmVyCisgZ3BzVG93U3VibXMgSU5URUdFUiAoMCAuLiA5OTk5KSBPUFRJT05BTCwgLS0gaW4gdW5pdHMgb2YgMTAwbnMsIGZvciBNUyBiYXNlZCBBR1BTCisgZGVsdGFUb3cgSU5URUdFUiAoMCAuLiAxMjcpIE9QVElPTkFMLCAtLSBmb3IgTVMgYXNzaXN0ZWQgQUdQUworIGdwc1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBHUFNSZWZlcmVuY2VUaW1lVW5jZXJ0YWludHkgT1BUSU9OQUwKK30KKworUmVsLTk4LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKKworCS0tIEZpcnN0IGV4dGVuc2lvbiB0byBSZWxlYXNlIDk4CisJcmVsLTk4LUV4dC1NZWFzdXJlSW5mbwlTRVFVRU5DRSB7CisJCW90ZC1NZWFzdXJlSW5mby1SOTgtRXh0CU9URC1NZWFzdXJlSW5mby1SOTgtRXh0CQlPUFRJT05BTAorCX0sCisJLi4uLCAKKyB0aW1lQXNzaXN0YW5jZU1lYXN1cmVtZW50cyBHUFNUaW1lQXNzaXN0YW5jZU1lYXN1cmVtZW50cyBPUFRJT05BTCAKKyAtLSBGdXJ0aGVyIFI5OCBleHRlbnNpb25zIGhlcmUKK30KKworLS0gVGhpcyBpcyBhbiBhZGRpdGlvbiB0byBPVEQtTWVhc3VyZUluZm8gZWxlbWVudCBkZWZpbmVkIGluIG9yaWdpbmFsIG1lc3NhZ2UsCistLSBJZiBPVEQtTWVhc3VyZUluZm8gaXMgYWJzZW50LCBvciBpZiBvbmUgb3IgbW9yZSBPVEQtTXNyRWxlbWVudFJlc3QgYXJlIHByZXNlbnQKKy0tIE9URC1NZWFzdXJlSW5mby1SOTgtRXh0IHNoYWxsIGJlIGFic2VudC4KKy0tIE9URC1NZWFzdXJlSW5mby1SOTgtRXh0CitPVEQtTWVhc3VyZUluZm8tUjk4LUV4dCA6Oj0gU0VRVUVOQ0UgeworCS0tIE1lYXN1cmVtZW50IGluZm8gZWxlbWVudHMKKwlvdGRNc3JGaXJzdFNldHMtUjk4LUV4dAkJT1RELU1zckVsZW1lbnRGaXJzdC1SOTgtRXh0Cit9CisKKy0tIE9URCBtZWFzdXJlbWVudCBpbmZvcm1hdGlvbiBFeHQgZm9yIHRoZSBmaXJzdCBzZXQgb25seQorT1RELU1zckVsZW1lbnRGaXJzdC1SOTgtRXh0IDo6PSBTRVFVRU5DRSB7CisJLS0gYWRkaXRpb25hbCBtZWFzdXJlZCBuZWlnaGJvcnMgaW4gT1REIG1lYXN1cmVtZW50cworCW90ZC1GaXJzdFNldE1zcnMtUjk4LUV4dCAJU2VxT2ZPVEQtRmlyc3RTZXRNc3JzLVI5OC1FeHQgCU9QVElPTkFMCit9CitTZXFPZk9URC1GaXJzdFNldE1zcnMtUjk4LUV4dCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uNSkpIE9GIE9URC1GaXJzdFNldE1zcnMKKworUmVsLTUtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCisJZXh0ZW5kZWQtcmVmZXJlbmNlCUV4dGVuZGVkLXJlZmVyZW5jZSAJT1BUSU9OQUwsCisJLS0gVGhlIGV4dGVuZGVkLXJlZmVyZW5jZSBzaGFsbCBiZSBpbmNsdWRlZCBieSB0aGUgTVMgaWYgYW5kIG9ubHkgaWYgcHJldmlvdXNseQorCS0tIHJlY2VpdmVkIGZyb20gdGhlIFNNTEMgaW4gYSBNZWFzdXJlIFBvc2l0aW9uIFJlcXVlc3QuIFdoZW4gaW5jbHVkZWQsIHRoZSB2YWx1ZSBzZW50CisJLS0gYnkgdGhlIE1TIHNoYWxsIGVxdWFsIHRoZSB2YWx1ZSByZWNlaXZlZCBmcm9tIHRoZSBTTUxDLgorCisJLS0gZXh0ZW5zaW9uIHRvIFJlbGVhc2UgNSwgZm9yIFJSTFAgcHNldWRvLXNlZ21lbnRhdGlvbiBoZXJlCisJb3RkLU1lYXN1cmVJbmZvLTUtRXh0CU9URC1NZWFzdXJlSW5mby01LUV4dAlPUFRJT05BTCwKKwl1bFBzZXVkb1NlZ0luZAkJCVVsUHNldWRvU2VnSW5kCQkJT1BUSU9OQUwsCS0tIEluY2x1ZGVkIHdoZW4gdXBsaW5rIFJSTFAKKwktLSBQc2V1ZG8tc2VnbWVudGF0aW9uIGlzIHVzZWQsIG5vdCBpbmNsdWRlZCB3aGVuIG5vIHVwbGluayBwc2V1ZG8tc2VnbWVudGF0aW9uIGlzIHVzZWQKKwkuLi4KKwkJCQkJLS0gUG9zc2libHkgbW9yZSBleHRlbnNpb25zIGZvciBSZWxlYXNlIDUgaGVyZSBsYXRlcgorfQorCitFeHRlbmRlZC1yZWZlcmVuY2UgOjo9IFNFUVVFTkNFIHsKKwlzbWxjLWNvZGUJCQlJTlRFR0VSICgwLi42MyksCisJdHJhbnNhY3Rpb24tSUQJCUlOVEVHRVIgKDAuLjI2MjE0MykKK30KKworT1RELU1lYXN1cmVJbmZvLTUtRXh0IDo6PSBTZXFPZk9URC1Nc3JFbGVtZW50UmVzdAorCS0tIGlmIG1vcmUgdGhhbiBvbmUgbWVhc3VyZW1lbnQgc2V0cyBhcmUgcHJlc2VudCB0aGlzIGVsZW1lbnQgaXMgcmVwZWF0ZWQKKwktLSBOdW1iZXJPZlNldHMgLSAxICgtMSA9IGZpcnN0IHNldCkgY29tYmluZWQgaW4gT1RELU1lYXN1cmVJbmZvLTUtRXh0IGFuZAorCS0tIE9URC1NZWFzdXJlSW5mbyAoZS5nLiBpZiBOdW1iZXJPZlNldHMgaXMgMywgdGhlbiBvbmUgb3RkTXNyUmVzdFNldHMgbWF5CisJLS0gYmUgc2VudCBpbiBPVEQtTWVhc3VyZUluZm8tNS1FeHQgYW5kIG9uZSBpbiBPVEQtTWVhc3VyZUluZm8pCisKKy0tIEZpcnN0IHBhcnQgb2YgVXBsaW5rIFJSTFAgUHNldWRvLXNlZ21lbnRhdGlvbiBpbmRpY2F0aW9uLCBwb3NzaWJseSBtb3JlIG1heSBiZSBkZWZpbmVkCistLSBpbiB0aGUgZnV0dXJlIGZvciBzZWdtZW50YXRpb24gd2l0aCBtb3JlIHRoYW4gdHdvIHNlZ21lbnRzLgorVWxQc2V1ZG9TZWdJbmQgOjo9IEVOVU1FUkFURUQgeworCWZpcnN0T2ZNYW55ICgwKSwKKwlzZWNvbmRPZk1hbnkoMSkKK30KKworUmVsNS1Nc3JQb3NpdGlvbi1SZXEtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5kZWQtcmVmZXJlbmNlCQkJRXh0ZW5kZWQtcmVmZXJlbmNlLAorCS4uLgorCS0tIFBvc3NpYmx5IG1vcmUgZXh0ZW5zaW9ucyBmb3IgUmVsZWFzZSA1IGhlcmUgbGF0ZXIKK30KKworUmVsNS1Bc3Npc3RhbmNlRGF0YS1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKKwlleHRlbmRlZC1yZWZlcmVuY2UJCQlFeHRlbmRlZC1yZWZlcmVuY2UsCisJLi4uCisKKy0tIFBvc3NpYmx5IG1vcmUgZXh0ZW5zaW9ucyBmb3IgUmVsZWFzZSA1IGhlcmUgbGF0ZXIKK30KKworUmVsLTUtUHJvdG9jb2xFcnJvci1FeHRlbnNpb246Oj0gU0VRVUVOQ0UgeworCWV4dGVuZGVkLXJlZmVyZW5jZQkJCUV4dGVuZGVkLXJlZmVyZW5jZSAJT1BUSU9OQUwsCisJLS0gVGhlIGV4dGVuZGVkLXJlZmVyZW5jZSBzaGFsbCBiZSBpbmNsdWRlZCBieSB0aGUgTVMgaWYgYW5kIG9ubHkgaWYgcHJldmlvdXNseQorCS0tIHJlY2VpdmVkIGZyb20gdGhlIFNNTEMuCisJLS0gV2hlbiBpbmNsdWRlZCwgdGhlIHZhbHVlIHNlbnQgYnkgdGhlIE1TIHNoYWxsIGVxdWFsIHRoZSB2YWx1ZSByZWNlaXZlZCBmcm9tIHRoZSBTTUxDLgorCS4uLgorCisJLS0gUG9zc2libHkgbW9yZSBleHRlbnNpb25zIGZvciBSZWxlYXNlIDUgaGVyZSBsYXRlcgorfQorCistLSBSZWxlYXNlIDcgRXh0ZW5zaW9ucyBoZXJlCisKK1JlbDctTXNyUG9zaXRpb24tUmVxLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgewordmVsb2NpdHlSZXF1ZXN0ZWQJCSBOVUxMCQkgT1BUSU9OQUwsCisgZ2Fuc3NQb3NpdGlvbk1ldGhvZCBHQU5TU1Bvc2l0aW9uaW5nTWV0aG9kIE9QVElPTkFMLAorIGdhbnNzLUFzc2lzdERhdGEgR0FOU1MtQXNzaXN0RGF0YSBPUFRJT05BTCwKKyBnYW5zc0NhcnJpZXJQaGFzZU1lYXN1cmVtZW50UmVxdWVzdCBOVUxMIE9QVElPTkFMLAorIGdhbnNzVE9ER1NNVGltZUFzc29jaWF0aW9uTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCityZXF1aXJlZFJlc3BvbnNlVGltZQlSZXF1aXJlZFJlc3BvbnNlVGltZQlPUFRJT05BTCwKKwkuLi4KKwktLSBGdXJ0aGVyIFJlbGVhc2UgNyBleHRlbnRpb25zIGhlcmUKK30KKworLS0gYWRkaXRpb25hbCBzYXRlbGxpdGUgc3lzdGVtcyBtYXkgYmUgYWRkZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBwcm90b2NvbAorR0FOU1NQb3NpdGlvbmluZ01ldGhvZCA6Oj0gQklUIFNUUklORyB7CisJZ3BzICgwKSwKKwlnYWxpbGVvICgxKX0gKFNJWkUgKDIuLjE2KSkKKworR0FOU1MtQXNzaXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzLWNvbnRyb2xIZWFkZXIJR0FOU1MtQ29udHJvbEhlYWRlcgorfQorCitHQU5TUy1Db250cm9sSGVhZGVyIDo6PSBTRVFVRU5DRSB7CisgZ2Fuc3NDb21tb25Bc3Npc3REYXRhIEdBTlNTQ29tbW9uQXNzaXN0RGF0YSBPUFRJT05BTCwKKyBnYW5zc0dlbmVyaWNBc3Npc3REYXRhTGlzdCBTZXFPZkdBTlNTR2VuZXJpY0Fzc2lzdERhdGFFbGVtZW50IE9QVElPTkFMCit9CisKKy0tIEdBTlNTIENvbW1vbiBBc3Npc3RhbmNlIERhdGEgRWxlbWVudHMKK0dBTlNTQ29tbW9uQXNzaXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzUmVmZXJlbmNlVGltZQkJIEdBTlNTUmVmZXJlbmNlVGltZQkJIE9QVElPTkFMLAorCWdhbnNzUmVmTG9jYXRpb24JCQlHQU5TU1JlZkxvY2F0aW9uCQkgT1BUSU9OQUwsCisJZ2Fuc3NJb25vc3BoZXJpY01vZGVsCQlHQU5TU0lvbm9zcGhlcmljTW9kZWwJIE9QVElPTkFMLAorCS4uLgorfQorCistLSBMaXN0IG9mIEdBTlNTIEdlbmVyaWMgQXNzaXN0YW5jZSBEYXRhIEVsZW1lbnRzLCB1cCB0byA4IEdBTlNTCitTZXFPZkdBTlNTR2VuZXJpY0Fzc2lzdERhdGFFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSAoMS4uOCkpIE9GIEdBTlNTR2VuZXJpY0Fzc2lzdERhdGFFbGVtZW50CisKKy0tIEdBTlNTIEdlbmVyaWMgQXNzaXN0YW5jZSBEYXRhIEVsZW1lbnRzCitHQU5TU0dlbmVyaWNBc3Npc3REYXRhRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworIGdhbnNzSUQgSU5URUdFUiAoMC4uNykgT1BUSU9OQUwsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBnYW5zc1RpbWVNb2RlbCBTZXFPZkdBTlNTVGltZU1vZGVsIE9QVElPTkFMLAorCWdhbnNzRGlmZkNvcnJlY3Rpb25zCQkgR0FOU1NEaWZmQ29ycmVjdGlvbnMJIE9QVElPTkFMLAorCWdhbnNzTmF2aWdhdGlvbk1vZGVsCQkgR0FOU1NOYXZNb2RlbCBPUFRJT05BTCwKKwlnYW5zc1JlYWxUaW1lSW50ZWdyaXR5CSBHQU5TU1JlYWxUaW1lSW50ZWdyaXR5CSBPUFRJT05BTCwKKwlnYW5zc0RhdGFCaXRBc3Npc3QJCQkgR0FOU1NEYXRhQml0QXNzaXN0CQkgT1BUSU9OQUwsCisJZ2Fuc3NSZWZNZWFzdXJlbWVudEFzc2lzdAkgR0FOU1NSZWZNZWFzdXJlbWVudEFzc2lzdCBPUFRJT05BTCwKKyBnYW5zc0FsbWFuYWNNb2RlbCBHQU5TU0FsbWFuYWNNb2RlbCBPUFRJT05BTCwKKyBnYW5zc1VUQ01vZGVsIEdBTlNTVVRDTW9kZWwgT1BUSU9OQUwsCisJLi4uCit9CisKKy0tIEdBTlNTIENPTU1PTiBBU1NJU1RBTkNFIERBVEEgRUxFTUVOVFMKKworLS0gR0FOU1MgUmVmZXJlbmNlIFRpbWUgSUUKK0dBTlNTUmVmZXJlbmNlVGltZSA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzUmVmVGltZUluZm8JCQkgR0FOU1NSZWZUaW1lSW5mbywKKwlnYW5zc1RPRC1HU01UaW1lQXNzb2NpYXRpb24gR0FOU1NUT0QtR1NNVGltZUFzc29jaWF0aW9uIE9QVElPTkFMCit9CisKKy0tIEdBTlNTIFJlZmVyZW5jZSBUaW1lIGluY2x1ZGVzIEdBTlNTIFRPRCwgR0FOU1MgRGF5LCB1bmNlcnRhaW50eQorR0FOU1NSZWZUaW1lSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzRGF5CQkJIElOVEVHRVIoMCAuLiA4MTkxKSBPUFRJT05BTCwKKyBnYW5zc1RPRCBHQU5TU1RPRCwKKwlnYW5zc1RPRFVuY2VydGFpbnR5CSBHQU5TU1RPRFVuY2VydGFpbnR5IE9QVElPTkFMLAorIGdhbnNzVGltZUlEIElOVEVHRVIgKDAgLi4gNykgT1BUSU9OQUwKK30KKworLS0gR0FOU1MgVE9EIGludGVnZXIgc2Vjb25kcworR0FOU1NUT0QgOjo9IElOVEVHRVIgKDAgLi4gODYzOTkpCisKKy0tIEdBTlNTIFRPRCB1bmNlcnRhaW50eQorR0FOU1NUT0RVbmNlcnRhaW50eSA6Oj0gSU5URUdFUiAoMCAuLiAxMjcpIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKworLS0gR0FOU1MgVE9ELUdTTSBUaW1lIGFzc29jaWF0aW9uIAorR0FOU1NUT0QtR1NNVGltZUFzc29jaWF0aW9uIDo6PSBTRVFVRU5DRSB7CisJYmNjaENhcnJpZXIJCUJDQ0hDYXJyaWVyLAktLSBCQ0NIIGNhcnJpZXIKKwlic2ljCQkJQlNJQywJCQktLSBCU0lDCisJZnJhbWVOdW1iZXIJCUZyYW1lTnVtYmVyLAorCXRpbWVTbG90CQlUaW1lU2xvdCwKKwliaXROdW1iZXIJCUJpdE51bWJlciwKKyBmcmFtZURyaWZ0IEZyYW1lRHJpZnQgT1BUSU9OQUwKK30KKworLS0gRnJhbWUgZHJpZnQKK0ZyYW1lRHJpZnQgOjo9IElOVEVHRVIoLTY0IC4uIDYzKQorCistLSBHQU5TUyBSZWZlcmVuY2UgTG9jYXRpb24gSUUKK0dBTlNTUmVmTG9jYXRpb24gOjo9IFNFUVVFTkNFIHsKKwl0aHJlZURMb2NhdGlvbgkJCUV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbgorfQorCistLSBHQU5TUyBJb25vc3BoZXJpYyBNb2RlbCBJRQorLS0gR0FOU1MgSW9ub3NwaGVyaWMgTW9kZWwgY29uc2lzdHMgb2YgTmVRdWljayBtb2RlbCBwYXJhbWV0ZXJzIGFuZCBzdG9ybSBmbGFncworCitHQU5TU0lvbm9zcGhlcmljTW9kZWwgOjo9IFNFUVVFTkNFIHsKKyBnYW5zc0lvbm9Nb2RlbCBHQU5TU0lvbm9zcGhlcmVNb2RlbCwKKyBnYW5zc0lvbm9TdG9ybUZsYWdzIEdBTlNTSW9ub1N0b3JtRmxhZ3MgT1BUSU9OQUwsCisgLi4uCit9CisKKy0tIEdBTlNTIGlvbm9zcGhlcmUgbW9kZWwuIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXggCitHQU5TU0lvbm9zcGhlcmVNb2RlbCA6Oj0gU0VRVUVOQ0UgeworIGFpMCBJTlRFR0VSICgwIC4uIDQwOTUpLAorIGFpMSBJTlRFR0VSICgwIC4uIDQwOTUpLAorIGFpMiBJTlRFR0VSICgwIC4uIDQwOTUpCit9CisKKy0tIEdBTlNTIGlvbm9zcGhlcmUgc3Rvcm0gZmxhZ3MKK0dBTlNTSW9ub1N0b3JtRmxhZ3MgOjo9IFNFUVVFTkNFIHsKKwlpb25vU3Rvcm1GbGFnMQlJTlRFR0VSICgwIC4uIDEpLAorCWlvbm9TdG9ybUZsYWcyCUlOVEVHRVIgKDAgLi4gMSksCisJaW9ub1N0b3JtRmxhZzMJSU5URUdFUiAoMCAuLiAxKSwKKwlpb25vU3Rvcm1GbGFnNAlJTlRFR0VSICgwIC4uIDEpLAorCWlvbm9TdG9ybUZsYWc1CUlOVEVHRVIgKDAgLi4gMSkKK30KKworLS0gR0FOU1MgR0VORVJJQyBBU1NJU1RBTkNFIERBVEEgRUxFTUVOVFMKKworLS0gR0FOU1MgVGltZSBNb2RlbCBJRSBjb25zaXN0cyBvZiB0aW1lIG9mZnNldCBhbmQgZmlyc3QgYW5kIHNlY29uZCBvcmRlciBwYXJhbWV0ZXJzIHRvIHJlbGF0ZSBHTlNTCistLSBzcGVjaWZpYyBzeXN0ZW0gdGltZSB0byBzZWxlY3RlZCB0aW1lIHJlZmVyZW5jZQorU2VxT2ZHQU5TU1RpbWVNb2RlbCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uNykpIE9GIEdBTlNTVGltZU1vZGVsRWxlbWVudAorCitHQU5TU1RpbWVNb2RlbEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlnYW5zc1RpbWVNb2RlbFJlZlRpbWUJCUlOVEVHRVIoMCAuLiA2NTUzNSksCisJdEEwCQkgVEEwLAorCXRBMQkJIFRBMSBPUFRJT05BTCwKKwl0QTIJCSBUQTIgT1BUSU9OQUwsCisgZ25zc1RPSUQgSU5URUdFUiAoMCAuLiA3KSwKKyB3ZWVrTnVtYmVyIElOVEVHRVIgKDAgLi4gODE5MSkgT1BUSU9OQUwgCit9CisKKy0tIEdBTlNTIHRpbWUgbW9kZWwgcGFyYW1ldGVyIEEwCitUQTAgOjo9IElOVEVHRVIgKC0yMTQ3NDgzNjQ4IC4uIDIxNDc0ODM2NDcpCisKKy0tIEdBTlNTIHRpbWUgbW9kZWwgcGFyYW1ldGVyIEExCitUQTEgOjo9IElOVEVHRVIgKC04Mzg4NjA4IC4uIDgzODg2MDcpCisKKy0tIEdBTlNTIHRpbWUgbW9kZWwgcGFyYW1ldGVyIEEyCitUQTIgOjo9IElOVEVHRVIgKC02NCAuLiA2MykKKworLS0gREdBTlNTIENvcnJlY3Rpb25zIElFCitHQU5TU0RpZmZDb3JyZWN0aW9ucyA6Oj0gU0VRVUVOQ0UgeworCWRnYW5zc1JlZlRpbWUJCUlOVEVHRVIgKDAgLi4gMTE5KSwJIC0tIERHQU5TUyByZWZlcmVuY2UgdGltZQorCisJLS0gTl9TR05fVFlQRSBjYW4gYmUgcmVhZCBmcm9tIG51bWJlciBvZiBlbGVtZW50cyBvZiBzZ25UeXBlTGlzdAorCXNnblR5cGVMaXN0CQkgU2VxT2ZTZ25UeXBlRWxlbWVudAorfQorCitTZXFPZlNnblR5cGVFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSAoMS4uMykpIE9GIFNnblR5cGVFbGVtZW50IC0tIG1heCB0aHJlZSBzaWduYWxzIHBlciBHTlNTCisKKy0tIERHQU5TUyBzaWduYWwgdHlwZSBlbGVtZW50LCBvbmNlIHBlciBHTlNTIHNpZ25hbCB0eXBlIGluY2x1ZGVkIGluIERHQU5TUworU2duVHlwZUVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlnYW5zc1NpZ25hbElECQkgR0FOU1NTaWduYWxJRCBPUFRJT05BTCwgLS0gc2lnbmFsIHR5cGUgaWRlbnRpdHkKKyBnYW5zc1N0YXR1c0hlYWx0aCBJTlRFR0VSICgwIC4uIDcpLAorCS0tIE5fU0dOIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGRnYW5zc1Nnbkxpc3QKKyBkZ2Fuc3NTZ25MaXN0IFNlcU9mREdBTlNTU2duRWxlbWVudAorfQorCitHQU5TU1NpZ25hbElEIDo6PSBJTlRFR0VSICgwIC4uIDMpCS0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKK1NlcU9mREdBTlNTU2duRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUgKDEuLjE2KSkgT0YgREdBTlNTU2duRWxlbWVudAorCistLSBudW1iZXIgb2YgY29ycmVjdGlvbiBmb3Igc2lnbmFscworREdBTlNTU2duRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXN2SUQJCSBTVklELCAtLSBTYXRlbGxpdGUgaWRlbnRpdHkKKworLS0tIFNlcXVlbmNlIG51bWJlciBmb3IgR0FOU1MgTmF2aWdhdGlvbiBNb2RlbCB0aGF0IG1hdGNoZXMgdGhlIERHQU5TUyBjb3JyZWN0aW9uIHNldAorCWlvZCAJCQlJTlRFR0VSICgwIC4uIDEwMjMpLAorCisJLS0gVXNlciBEaWZmZXJlbnRpYWwgUmFuZ2UgRXJyb3IKKwl1ZHJlCQkJSU5URUdFUiAoMC4uMyksCQkKKworCS0tIFBzZXVkbyBSYW5nZSBDb3JyZWN0aW9uLCByYW5nZSBpcworCS0tIC02NTUuMDQgLSArNjU1LjA0LAorCXBzZXVkb1JhbmdlQ29yCUlOVEVHRVIgKC0yMDQ3Li4yMDQ3KSwgCQorCisJLS0gUHNldWRvIFJhbmdlIFJhdGUgQ29ycmVjdGlvbiwgcmFuZ2UgaXMKKwktLSAtNC4wNjQgLSArNC4wNjQsCisJcmFuZ2VSYXRlQ29yCUlOVEVHRVIgKC0xMjcuLjEyNykKK30KKworU1ZJRCA6Oj0gSU5URUdFUiAoMCAuLiA2MykJLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCistLSBHQU5TUyBOYXZpZ2F0aW9uIE1vZGVsIElFCitHQU5TU05hdk1vZGVsIDo6PSBTRVFVRU5DRSB7Cisgbm9uQnJvYWRjYXN0SW5kRmxhZyBJTlRFR0VSICgwIC4uIDEpLAorIHRvZU1TQiBJTlRFR0VSICgwIC4uIDMxKSBPUFRJT05BTCwgLS0gNSBNU0Igb2YgdG9lIGFuZCB0b2MgCisgZU1TQiBJTlRFR0VSICgwIC4uIDEyNykgT1BUSU9OQUwsCisgc3FydEFNQlMgSU5URUdFUiAoMCAuLiA2MykgT1BUSU9OQUwsCisJZ2Fuc3NTYXRlbGxpdGVMaXN0IFNlcU9mR0FOU1NTYXRlbGxpdGVFbGVtZW50Cit9CisKK1NlcU9mR0FOU1NTYXRlbGxpdGVFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4zMikpIE9GIEdBTlNTU2F0ZWxsaXRlRWxlbWVudAorCitHQU5TU1NhdGVsbGl0ZUVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzdklEIFNWSUQsCisgc3ZIZWFsdGggSU5URUdFUiAoLTcgLi4gMTMpLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgaW9kIElOVEVHRVIgKDAgLi4gMTAyMyksIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBnYW5zc0Nsb2NrTW9kZWwgR0FOU1NDbG9ja01vZGVsLCAKKyBnYW5zc09yYml0TW9kZWwgR0FOU1NPcmJpdE1vZGVsLCAKKyAuLi4KK30KKworLS0gR0FOU1Mgb3JiaXQgbW9kZWwgZm9yIHRoZSBHTlNTIHNhdGVsbGl0ZSBhY2NvcmRpbmcgdG8gdGhlIGNob2ljZQorR0FOU1NPcmJpdE1vZGVsIDo6PSBDSE9JQ0UgeworCWtlcGxlcmlhblNldAkgTmF2TW9kZWwtS2VwbGVyaWFuU2V0LAkKKyAuLi4KK30KKworLS0gTmF2aWdhdGlvbiBtb2RlbCBpbiBLZXBsZXJpYW4gcGFyYW1ldGVycworTmF2TW9kZWwtS2VwbGVyaWFuU2V0IDo6PSBTRVFVRU5DRSB7Cisga2VwbGVyVG9lTFNCIElOVEVHRVIgKDAgLi4gNTExKSwgLS0gOUxTQiBhcmUgZ2l2ZW4gaW4gR0FOU1NOYXZpZ2F0aW9uTW9kZWwKKwlrZXBsZXJXCQkJIElOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwlrZXBsZXJEZWx0YU4JIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlck0wCQkgSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWtlcGxlck9tZWdhRG90CSBJTlRFR0VSICgtODM4ODYwOC4uODM4ODYwNyksCisJa2VwbGVyRUxTQiAJIElOVEVHRVIgKDAuLjMzNTU0NDMxKSwKKwlrZXBsZXJJRG90CQkgSU5URUdFUiAoLTgxOTIuLjgxOTEpLAorCWtlcGxlckFQb3dlckhhbGZMU0IgSU5URUdFUiAoMC4uIDY3MTA4ODYzKSwKKwlrZXBsZXJJMAkJIElOVEVHRVIgKC0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3KSwKKwlrZXBsZXJPbWVnYTAgSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWtlcGxlckNycwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlckNpcwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlckN1cwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlckNyYwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlckNpYwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWtlcGxlckN1YwkJIElOVEVHRVIgKC0zMjc2OC4uMzI3NjcpCit9CisKKy0tIEdBTlNTIGNsb2NrIG1vZGVsIGZvciB0aGUgR05TUyBzYXRlbGxpdGUgYWNjb3JkaW5nIHRvIHRoZSBjaG9pY2UKK0dBTlNTQ2xvY2tNb2RlbCA6Oj0gQ0hPSUNFIHsKKwlzdGFuZGFyZENsb2NrTW9kZWxMaXN0CSBTZXFPZlN0YW5kYXJkQ2xvY2tNb2RlbEVsZW1lbnQsCQorIC4uLgorfQorCitTZXFPZlN0YW5kYXJkQ2xvY2tNb2RlbEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjIpKSBPRiBTdGFuZGFyZENsb2NrTW9kZWxFbGVtZW50CisKK1N0YW5kYXJkQ2xvY2tNb2RlbEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKyBzdGFuQ2xvY2tUb2NMU0IgSU5URUdFUiAoMCAuLiA1MTEpLCAtLSA5TFNCIG9mIHRpbWUgb2YgY2xvY2sKKyBzdGFuQ2xvY2tBRjIgSU5URUdFUiAoLTIwNDggLi4gMjA0NyksIAorIHN0YW5DbG9ja0FGMSBJTlRFR0VSICgtMTMxMDcyIC4uIDEzMTA3MSksIAorIHN0YW5DbG9ja0FGMCBJTlRFR0VSICgtMTM0MjE3NzI4IC4uIDEzNDIxNzcyNyksCisgc3RhbkNsb2NrVGdkIElOVEVHRVIgKC01MTIgLi4gNTExKSBPUFRJT05BTCwKKyBzdGFuTW9kZWxJRCBJTlRFR0VSICgwIC4uIDEpIE9QVElPTkFMLAorIC4uLgorfSAKKworLS0gR0FOU1MgUmVhbC1UaW1lIEludGVncml0eSBJRQorR0FOU1NSZWFsVGltZUludGVncml0eSA6Oj0gU0VRVUVOQ0UgeworIC0tIGxpc3Qgb2YgYmFkIHNpZ25hbHMKKyAtLSBOQlMgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgaW4gU2VxT2YtQmFkU2lnbmFsU2V0CisgZ2Fuc3NCYWRTaWduYWxMaXN0IFNlcU9mQmFkU2lnbmFsRWxlbWVudAorfQorCitTZXFPZkJhZFNpZ25hbEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjE2KSkgT0YgQmFkU2lnbmFsRWxlbWVudAorCitCYWRTaWduYWxFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisgYmFkU1ZJRCBTVklELCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgYmFkU2lnbmFsSUQgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4Cit9CisKKworLS0gR0FOU1MgRGF0YSBCaXQgQXNzaXN0YW5jZSBJRQorR0FOU1NEYXRhQml0QXNzaXN0IDo6PSBTRVFVRU5DRSB7CisgZ2Fuc3NUT0QgSU5URUdFUiAoMCAuLiA1OSksCisgc3ZJRCBTVklELAorIGdhbnNzRGF0YVR5cGVJRCBJTlRFR0VSICgwIC4uIDIpLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgLS0gbGlzdCBvZiBuYXZpZ2F0aW9uIGRhdGEgYml0cworIC0tIE5fQklUIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIGluIFNlcU9mLURhdGFCaXRzCisgZ2Fuc3NEYXRhQml0cyBTZXFPZi1HQU5TU0RhdGFCaXRzCit9CisKK1NlcU9mLUdBTlNTRGF0YUJpdHMgOjo9IFNFUVVFTkNFIChTSVpFKDEgLi4gMTAyNCkpIE9GIEdBTlNTRGF0YUJpdAorR0FOU1NEYXRhQml0IDo6PSBJTlRFR0VSKDAgLi4gMSkKKworLS0gR0FOU1MgUmVmZXJlbmNlIE1lYXN1cmVtZW50IEFzc2lzdGFuY2UgSUUKKy0tIENvZGUgYW5kIERvcHBsZXIgYXNzaXN0YW5jZSBmcm9tIHRoZSBuZXR3b3JrLiAKK0dBTlNTUmVmTWVhc3VyZW1lbnRBc3Npc3QgOjo9IFNFUVVFTkNFIHsKKyBnYW5zc1NpZ25hbElEIElOVEVHRVIgKDAgLi4gMykgT1BUSU9OQUwsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBnYW5zc1JlZk1lYXNBc3NpdExpc3QgU2VxT2ZHQU5TU1JlZk1lYXN1cmVtZW50RWxlbWVudAorfQorCitTZXFPZkdBTlNTUmVmTWVhc3VyZW1lbnRFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxIC4uIDE2KSkgT0YgR0FOU1NSZWZNZWFzdXJlbWVudEVsZW1lbnQKKworR0FOU1NSZWZNZWFzdXJlbWVudEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKyBzdklEIFNWSUQsCisJLS0gRG9wcGxlciAwdGggb3JkZXIgdGVybSwKKwktLSAtMTAyNCBtL3MgdG8gMTAyMy41IG0vcyB3aXRoIDAuNSBtL3MgcmVzb2x1dGlvbikKKwlkb3BwbGVyMAkJCQlJTlRFR0VSICgtMjA0OCAuLiAyMDQ3KSwJLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCWFkZGl0aW9uYWxEb3BwbGVyCQlBZGRpdGlvbmFsRG9wcGxlckZpZWxkcwkgT1BUSU9OQUwsCisJY29kZVBoYXNlCQkJCUlOVEVHRVIgKDAgLi4gMTAyMiksCSAtLSBDb2RlIFBoYXNlIGluIG1zCisJaW50Q29kZVBoYXNlCQkJSU5URUdFUiAoMCAuLiAxMjcpLAkgLS0gSW50ZWdlciBDb2RlIFBoYXNlIGluIG1zCisJY29kZVBoYXNlU2VhcmNoV2luZG93CUlOVEVHRVIgKDAgLi4gMzEpLAkgLS0gQ29kZSBQaGFzZSBTZWFyY2ggV2luZG93LCBzZWUgQW5uZXgKKwlhZGRpdGlvbmFsQW5nbGUJCQlBZGRpb25hbEFuZ2xlRmllbGRzCQkgT1BUSU9OQUwsCisgLi4uCit9CisKK0FkZGl0aW9uYWxEb3BwbGVyRmllbGRzIDo6PSBTRVFVRU5DRSB7CisJLS0gRG9wcGxlciAxc3Qgb3JkZXIgdGVybSwgLTAuMiAtICswLjEgbS9zMgorCWRvcHBsZXIxCQkJCUlOVEVHRVIgKDAuLjYzKSwKKwlkb3BwbGVyVW5jZXJ0YWludHkJCUlOVEVHRVIgKDAuLjQpCit9CisKKy0tIEdBTlNTIEFsbWFuYWMgTW9kZWwgSUUKK0dBTlNTQWxtYW5hY01vZGVsIDo6PSBTRVFVRU5DRSB7Cisgd2Vla051bWJlciBJTlRFR0VSICgwIC4uIDI1NSksCisgc3ZJRE1hc2sgU1ZJRE1BU0ssCisgdG9hIElOVEVHRVIgKDAgLi4gMjU1KSBPUFRJT05BTCwKKyBpb2RhIElOVEVHRVIgKDAgLi4gMykgT1BUSU9OQUwsCisgZ2Fuc3NBbG1hbmFjTGlzdCBTZXFPZkdBTlNTQWxtYW5hY0VsZW1lbnQKK30KKworLS0gU1YgSUQgTWFzaywgTFNCIGZvciBJRCAxIGFuZCBNU0IgZm9yIElEIDM2CitTVklETUFTSyA6Oj0gQklUIFNUUklORyAoU0laRSAoMS4uMzYpKQorCitTZXFPZkdBTlNTQWxtYW5hY0VsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEgLi4gMzYpKSBPRiBHQU5TU0FsbWFuYWNFbGVtZW50CisKKy0tIEdBTlNTIEFsbWFuYWMgTW9kZWwgCitHQU5TU0FsbWFuYWNFbGVtZW50IDo6PSBDSE9JQ0UgeworCWtlcGxlcmlhbkFsbWFuYWNTZXQJIEFsbWFuYWMtS2VwbGVyaWFuU2V0LAkKKyAuLi4KK30KKworLS0gQWxtYW5hYyBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBLZXBsZXJpYW4gcGFyYW1ldGVycworQWxtYW5hYy1LZXBsZXJpYW5TZXQgOjo9IFNFUVVFTkNFIHsKKyAJa2VwQWxtYW5hY0UJCQkgSU5URUdFUiAoMCAuLiAyMDQ3KSwKKwlrZXBBbG1hbmFjRGVsdGFJCQlJTlRFR0VSICgtMTAyNCAuLiAxMDIzKSwKKwlrZXBBbG1hbmFjT21lZ2FEb3QJCUlOVEVHRVIgKC0xMDI0IC4uIDEwMjMpLAorIGtlcFNWSGVhbHRoIElOVEVHRVIgKDAgLi4gMTUpLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisJa2VwQWxtYW5hY0FQb3dlckhhbGYJSU5URUdFUiAoLTY1NTM2IC4uIDY1NTM1KSwKKwlrZXBBbG1hbmFjT21lZ2EwCQlJTlRFR0VSICgtMzI3NjggLi4gMzI3NjcpLAorCWtlcEFsbWFuYWNXCQkJIElOVEVHRVIgKC0zMjc2OCAuLiAzMjc2NyksCisJa2VwQWxtYW5hY00wCQkJSU5URUdFUiAoLTMyNzY4IC4uIDMyNzY3KSwKKwlrZXBBbG1hbmFjQUYwCQkJSU5URUdFUiAoLTgxOTIgLi4gODE5MSksCisJa2VwQWxtYW5hY0FGMQkJCUlOVEVHRVIgKC0xMDI0Li4xMDIzKQorfQorCistLSBHQU5TUyBVbml2ZXJzYWwgVGltZSBDb29yZGluYXRlIE1vZGVsCitHQU5TU1VUQ01vZGVsIDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3NVdGNBMQkJCUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwlnYW5zc1V0Y0EwCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWdhbnNzVXRjVG90CQkJSU5URUdFUiAoMC4uMjU1KSwKKwlnYW5zc1V0Y1dOdAkJCUlOVEVHRVIgKDAuLjI1NSksCisJZ2Fuc3NVdGNEZWx0YVRscwlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWdhbnNzVXRjV05sc2YJCUlOVEVHRVIgKDAuLjI1NSksCisJZ2Fuc3NVdGNETgkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJZ2Fuc3NVdGNEZWx0YVRsc2YJSU5URUdFUiAoLTEyOC4uMTI3KQorfQorCistLVJlcXVpcmVkIE1lYXN1cmVtZW50IFJlcXVlc3QgUmVzcG9uc2UgVGltZSwgcmFuZ2UgaXMgMSB0byAxMjggc2Vjb25kcy4gCitSZXF1aXJlZFJlc3BvbnNlVGltZSA6Oj0gSU5URUdFUiAgKDEuLjEyOCkKKworUmVsLTctTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCisJdmVsRXN0aW1hdGUgCVZlbG9jaXR5RXN0aW1hdGUgT1BUSU9OQUwsCisgLS0gSG9yaXpvbnRhbCBWZWxvY2l0eQorIC0tIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eQorIC0tIEhvcml6b250YWwgVmVsb2NpdHkgd2l0aCBVbmNlcnRhaW50eQorIC0tIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eSBhbmQgVW5jZXJ0YWludHkKKyBnYW5zc0xvY2F0aW9uSW5mbyBHQU5TU0xvY2F0aW9uSW5mbyBPUFRJT05BTCwKKyBnYW5zc01lYXN1cmVJbmZvIEdBTlNTTWVhc3VyZUluZm8gT1BUSU9OQUwsCisJLi4uCistLSBGdXJ0aGVyIFJlbGVhc2UgNyBleHRlbnNpb25zIGhlcmUKK30KKworLS0gR0FOU1MgTG9jYXRpb24gSW5mb3JtYXRpb24gY29udGFpbnMgbG9jYXRpb24gZXN0aW1hdGUsIHRpbWUgc3RhbXAgd2l0aCB1bmNlcnRhaW50eSAKKy0tIGFuZCBvcHRpb25hbGx5IFJlZmVyZW5jZSBGcmFtZSBmaWVsZAorR0FOU1NMb2NhdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKyByZWZlcmVuY2VGcmFtZSBSZWZlcmVuY2VGcmFtZSBPUFRJT05BTCwgLS0gUmVmZXJlbmNlIEZyYW1lIE51bWJlcgorIGdhbnNzVE9EbSBHQU5TU1RPRG0gT1BUSU9OQUwsIC0tIEdOU1MgVE9EIG1vZHVsbworIGdhbnNzVE9ERnJhYyBJTlRFR0VSICgwIC4uIDE2Mzg0KSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCWdhbnNzVE9EVW5jZXJ0YWludHkgR0FOU1NUT0RVbmNlcnRhaW50eSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGdhbnNzVGltZUlEIElOVEVHRVIgKDAgLi4gMykgT1BUSU9OQUwsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKwlmaXhUeXBlCQkJIEZpeFR5cGUsCisgcG9zRGF0YSBQb3NpdGlvbkRhdGEsCisgc3RhdGlvbmFyeUluZGljYXRpb24gSU5URUdFUigwIC4uIDEpIE9QVElPTkFMLCAtLSAnMCcgaWYgbW92aW5nIG9yIG1vdGlvbiBub3Qga25vd24gCisJLS0gUG9zc2libGUgc2hhcGVzIGNhcnJpZWQgaW4gcG9zRXN0aW1hdGUgYXJlCisJLS0gZWxsaXBzb2lkIHBvaW50LAorCS0tIGVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGNpcmNsZQorCS0tIGVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGVsbGlwc2UKKwktLSBlbGxpcHNvaWQgcG9pbnQgd2l0aCBhbHRpdHVkZSBhbmQgdW5jZXJ0YWludHkgZWxsaXBzb2lkCisJcG9zRXN0aW1hdGUJCSBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sCisgLi4uCit9CisKK1Bvc2l0aW9uRGF0YSA6Oj0gQklUIFNUUklORyB7CisgZS1vdGQoMCksCisJZ3BzICgxKSwKKwlnYWxpbGVvICgyKSB9IChTSVpFICgzLi4xNikpCisKKworLS0gR0FOU1MgVE9EIG1vZHVsbyAxIGhvdXIKK0dBTlNTVE9EbSA6Oj0gSU5URUdFUiAoMCAuLiAzNTk5OTk5KQorCitSZWZlcmVuY2VGcmFtZSA6Oj0gU0VRVUVOQ0UgeworIHJlZmVyZW5jZUZOIElOVEVHRVIgKDAgLi4gNjU1MzUpLAorCS0tIE5vdGUgdGhhdCBhcHBsaWNhYmxlIHJhbmdlIGZvciByZWZlcmVuY2VGTiBpcyAwIC0gNDI0MzEKKyByZWZlcmVuY2VGTk1TQiBJTlRFR0VSICgwIC4uIDYzKSBPUFRJT05BTCAtLSBNU0Igb2YgUmVmZXJlbmNlIEZyYW1lIE51bWJlcgorfQorCisKKworLS0gR0FOU1MgTWVhc3VyZW1lbnQgSW5mb3JtYXRpb24gCitHQU5TU01lYXN1cmVJbmZvIDo6PSBTRVFVRU5DRSB7CisJLS0gTWVhc3VyZW1lbnQgaW5mbyBlbGVtZW50cworCS0tIHVzZXIgaGFzIHRvIG1ha2Ugc3VyZSB0aGF0IGluIHRoaXMgZWxlbWVudCBpcyBudW1iZXIgb2YgZWxlbWVudHMKKwktLSBkZWZpbmVkIGluIHJlZmVyZW5jZSBCVFMgaWRlbnRpdHkKKyBnYW5zc01zclNldExpc3QgU2VxT2ZHQU5TUy1Nc3JTZXRFbGVtZW50Cit9CitTZXFPZkdBTlNTLU1zclNldEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMpKSBPRiBHQU5TUy1Nc3JTZXRFbGVtZW50CisKKy0tIEdBTlNTIG1lYXN1cmVtZW50IGluZm9ybWF0aW9uIDEtMyB0aW1lcyBpbiBhIG1lc3NhZ2UKK0dBTlNTLU1zclNldEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKyByZWZlcmVuY2VGcmFtZSBSZWZlcmVuY2VGcmFtZSBPUFRJT05BTCwgLS0gUmVmZXJlbmNlIEZyYW1lIE51bWJlcgorIGdhbnNzVE9EbSBHQU5TU1RPRG0gT1BUSU9OQUwsIC0tIEdBTlNTIFRPRCBtb2R1bG8KKyBkZWx0YUdOQVNTVE9EIElOVEVHRVIgKDAgLi4gMTI3KSBPUFRJT05BTCwKKwlnYW5zc1RPRFVuY2VydGFpbnR5IEdBTlNTVE9EVW5jZXJ0YWludHkgT1BUSU9OQUwsIC0tIENvZGluZyBhY2NvcmluZyB0byBBbm5leAorCisgLS1OX1NHTl9UWVBFIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIFNlcU9mR0FOU1MtU2duVHlwZUVsZW1lbnQKKyBnYW5zcy1TZ25UeXBlTGlzdCBTZXFPZkdBTlNTLVNnblR5cGVFbGVtZW50Cit9CisKKy0tIE1lYXN1cmVtZW50cyBjYW4gYmUgcmV0dXJuZWQgdXAgdG8gNiBkaWZmZXJlbnQgc2lnbmFsIHR5cGVzIAorU2VxT2ZHQU5TUy1TZ25UeXBlRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uNikpIE9GIEdBTlNTLVNnblR5cGVFbGVtZW50CisKK0dBTlNTLVNnblR5cGVFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3NTaWduYWxJRAkJSU5URUdFUiAoMCAuLiAxNSksIC0tIENvZGluZyBhY2Nyb2RpbmcgdG8gQW5uZXgKKyAtLU5fU0dOIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIFNlcU9mR0FOU1MtU2duRWxlbWVudAorIGdhbnNzLVNnbkxpc3QgU2VxT2ZHQU5TUy1TZ25FbGVtZW50Cit9CisKKy0tIE1lYXN1cmVtZW50cyBjYW4gYmUgcmV0dXJuZWQgdXAgdG8gMTYgcGVyIHNpZ25hbCB0eXBlcyAKK1NlcU9mR0FOU1MtU2duRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBHQU5TUy1TZ25FbGVtZW50CisKKworR0FOU1MtU2duRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworIHN2SUQgU1ZJRCwKKyBjTm8gSU5URUdFUiAoMCAuLiA2MyksCisgbXBhdGhEZXQgTXBhdGhJbmRpYywgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGNhcnJpZXJRdWFsaXR5SW5kIElOVEVHRVIgKDAgLi4gMykgT1BUSU9OQUwsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBjb2RlUGhhc2UgSU5URUdFUiAoMCAuLiAyMDk3MTUxKSwKKyBpbnRlZ2VyQ29kZVBoYXNlIElOVEVHRVIgKDAgLi4gNjMpIE9QVElPTkFMLAorIGNvZGVQaGFzZVJNU0Vycm9yIElOVEVHRVIgKDAuLjYzKSwgLS0gQ29kaW5nIGFjY29yaW5nIHRvIEFubmV4CisgZG9wcGxlciBJTlRFR0VSICgtMzI3NjggLi4gMzI3NjcpIE9QVElPTkFMLAorIGFkciBJTlRFR0VSICgwIC4uIDMzNTU0NDMxKSBPUFRJT05BTAorfQorCitSZWw3LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworIGdhbnNzLUFzc2lzdERhdGEgR0FOU1MtQXNzaXN0RGF0YSBPUFRJT05BTCwKKyBnYW5zc0NhcnJpZXJQaGFzZU1lYXN1cmVtZW50UmVxdWVzdCBOVUxMIE9QVElPTkFMLAorIGdhbnNzVE9ER1NNVGltZUFzc29jaWF0aW9uTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCisJLi4uCistLSBQb3NzaWJseSBtb3JlIGV4dGVuc2lvbnMgZm9yIFJlbGVhc2UgNyBoZXJlCit9CisKK0VORApkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9SUkxQLU1lc3NhZ2VzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvUlJMUC1NZXNzYWdlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxNDBlMgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvUlJMUC1NZXNzYWdlcy5hc24KQEAgLTAsMCArMSwzOCBAQAorLS0gUlJMUC1NZXNzYWdlcy5hc24KKy0tICRJZCQKKy0tIFRha2VuIGZyb20gM0dQUCBUUyA0NC4wMzEgVjcuNC4wICgyMDA3LTAzKQorLS0gaHR0cDovL3d3dy4zZ3BwLm9yZy9mdHAvU3BlY3MvYXJjaGl2ZS80NF9zZXJpZXMvNDQuMDMxLzQ0MDMxLTc0MC56aXAvNDQwMzEtNzQwLmRvYworLS0KKy0tIDMuMSBHZW5lcmFsIEZvcm1hdCBvZiBSUkxQIE1lc3NhZ2UKKy0tCisKK1JSTFAtTWVzc2FnZXMKKy0tIHsgUlJMUC1tZXNzYWdlcyB9CisKK0RFRklOSVRJT05TIEFVVE9NQVRJQyBUQUdTIDo6PQorCitCRUdJTgorCitJTVBPUlRTCisJTXNyUG9zaXRpb24tUmVxLCBNc3JQb3NpdGlvbi1Sc3AsIEFzc2lzdGFuY2VEYXRhLAorCVByb3RvY29sRXJyb3IKK0ZST00KKwlSUkxQLUNvbXBvbmVudHMgCS0tIHsgUlJMUC1Db21wb25lbnRzIH0KKzsKKworUERVIDo6PSBTRVFVRU5DRSB7CisJcmVmZXJlbmNlTnVtYmVyCQkJSU5URUdFUiAoMC4uNyksCisJY29tcG9uZW50CQkJCVJSTFAtQ29tcG9uZW50Cit9CisKK1JSTFAtQ29tcG9uZW50IDo6PSBDSE9JQ0UgeworCW1zclBvc2l0aW9uUmVxCQkJTXNyUG9zaXRpb24tUmVxLAorCW1zclBvc2l0aW9uUnNwCQkJTXNyUG9zaXRpb24tUnNwLAorCWFzc2lzdGFuY2VEYXRhCQkJQXNzaXN0YW5jZURhdGEsCisJYXNzaXN0YW5jZURhdGFBY2sJCU5VTEwsCisJcHJvdG9jb2xFcnJvcgkJCVByb3RvY29sRXJyb3IsCisJLi4uCisKK30KKworRU5ECmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL3BhdGNoLXJybHAtY29tcG9uZW50cy5kaWZmIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9wYXRjaC1ycmxwLWNvbXBvbmVudHMuZGlmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU1NWFlCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9wYXRjaC1ycmxwLWNvbXBvbmVudHMuZGlmZgpAQCAtMCwwICsxLDM2IEBACistLS0gUlJMUC1Db21wb25lbnRzLmFzbgkyMDA5LTEwLTI2IDIyOjEwOjQ0LjAwMDAwMDAwMCArMDEwMAorKysrIFJSTFAtQ29tcG9uZW50cy5hc24JMjAwOS0xMC0yNiAyMjoxMDo0NC4wMDAwMDAwMDAgKzAxMDAKK0BAIC0xOCwxNiArMTgsMTYgQEAKKyAJRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uLCBWZWxvY2l0eUVzdGltYXRlCisgRlJPTQorIAlNQVAtTENTLURhdGFUeXBlcyB7CistCWNjaXR0IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCistCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtTENTLURhdGFUeXBlcyAoMjUpIHZlcnNpb241ICg1KX0KKysJaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKysJZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1MQ1MtRGF0YVR5cGVzICgyNSkgdmVyc2lvbjExICgxMSl9CisgCisgCUV4dGVuc2lvbkNvbnRhaW5lcgorIEZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CistCWNjaXR0IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCistCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjQgKDQpfQorKwlpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorKwlnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorIDsKKyAKKyAtLSBBZGQgaGVyZSBvdGhlciBBU04uMSBkZWZpbml0aW9ucyBwcmVzZW50ZWQgYmVsb3cKKyAtLSBpbiBjaGFwdGVycyA0IGFuZCA1LgorIAorQEAgLTMwNSwxMSArMzA1LDExIEBACisgU3lzdGVtSW5mb0luZGV4IDo6PSBJTlRFR0VSICgxLi4zMikKKyAKKyBDZWxsSURBbmRMQUMgOjo9IFNFUVVFTkNFIHsKKy0JcmVmZXJlbmNlTEFDCUxBQywJCQkJLS0gTG9jYXRpb24gYXJlYSBjb2RlCisrCXJlZmVyZW5jZUxBQwlMQUNJRCwJCQkJLS0gTG9jYXRpb24gYXJlYSBjb2RlCisgCXJlZmVyZW5jZUNJCQlDZWxsSUQJCQkJLS0gQ2VsbCBpZGVudGl0eQorIH0KKyBDZWxsSUQgOjo9IElOVEVHRVIgKDAuLjY1NTM1KQorLUxBQyA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCisrTEFDSUQgOjo9IElOVEVHRVIgKDAuLjY1NTM1KQorIAorIC0tIE9URC1NZWFzdXJlSW5mbworIE9URC1NZWFzdXJlSW5mbyA6Oj0gU0VRVUVOQ0UgewpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMF9hZGRfZW51bWVyYXRlZF92ZXJib3NlLmRpZmYgYi9ycmxwLWVwaGVtZXJpcy9hc24xY19wYXRjaGVzLzAwX2FkZF9lbnVtZXJhdGVkX3ZlcmJvc2UuZGlmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGMyMmEzCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMF9hZGRfZW51bWVyYXRlZF92ZXJib3NlLmRpZmYKQEAgLTAsMCArMSw1NiBAQAorSW5kZXg6IHNrZWxldG9ucy9OYXRpdmVFbnVtZXJhdGVkLmMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLSBza2VsZXRvbnMvTmF0aXZlRW51bWVyYXRlZC5jCShyZXZpc2lvbiAxNDA3KQorKysrIHNrZWxldG9ucy9OYXRpdmVFbnVtZXJhdGVkLmMJKHdvcmtpbmcgY29weSkKK0BAIC0yMiw3ICsyMiw3IEBACisgCSJFTlVNRVJBVEVEIiwJCQkvKiBUaGUgQVNOLjEgdHlwZSBpcyBzdGlsbCBFTlVNRVJBVEVEICovCisgCSJFTlVNRVJBVEVEIiwKKyAJTmF0aXZlSW50ZWdlcl9mcmVlLAorLQlOYXRpdmVJbnRlZ2VyX3ByaW50LAorKwlOYXRpdmVFbnVtZXJhdGVkX3ByaW50LAorIAlhc25fZ2VuZXJpY19ub19jb25zdHJhaW50LAorIAlOYXRpdmVJbnRlZ2VyX2RlY29kZV9iZXIsCisgCU5hdGl2ZUludGVnZXJfZW5jb2RlX2RlciwKK0BAIC0yMDUsMyArMjA1LDMwIEBACisgCV9BU05fRU5DT0RFRF9PSyhlcik7CisgfQorIAorK2ludAorK05hdGl2ZUVudW1lcmF0ZWRfcHJpbnQoYXNuX1RZUEVfZGVzY3JpcHRvcl90ICp0ZCwgY29uc3Qgdm9pZCAqc3B0ciwgaW50IGlsZXZlbCwKKysJYXNuX2FwcF9jb25zdW1lX2J5dGVzX2YgKmNiLCB2b2lkICphcHBfa2V5KSB7CisrCWFzbl9JTlRFR0VSX3NwZWNpZmljc190ICpzcGVjcz0oYXNuX0lOVEVHRVJfc3BlY2lmaWNzX3QgKil0ZC0+c3BlY2lmaWNzOworKwljb25zdCBsb25nICpuYXRpdmUgPSAoY29uc3QgbG9uZyAqKXNwdHI7CisrCWNoYXIgc2NyYXRjaFsyNTZdOworKwlpbnQgcmV0OworKworKwkodm9pZCl0ZDsJLyogVW51c2VkIGFyZ3VtZW50ICovCisrCSh2b2lkKWlsZXZlbDsJLyogVW51c2VkIGFyZ3VtZW50ICovCisrCisrCWlmKG5hdGl2ZSkgeworKwkJY29uc3QgYXNuX0lOVEVHRVJfZW51bV9tYXBfdCAqbWFwID0gSU5URUdFUl9tYXBfdmFsdWUyZW51bShzcGVjcywgKm5hdGl2ZSk7CisrCQlpZiAobWFwICYmIG1hcC0+ZW51bV9sZW4gJiYgbWFwLT5lbnVtX25hbWUpIHsKKysJCQlyZXQgPSBzbnByaW50ZihzY3JhdGNoLCBzaXplb2Yoc2NyYXRjaCksCisrCQkJCSIlcyIsIG1hcC0+ZW51bV9uYW1lKTsKKysJCX0gZWxzZSB7CisrCQkJcmV0ID0gc25wcmludGYoc2NyYXRjaCwgc2l6ZW9mKHNjcmF0Y2gpLAorKwkJCQkoc3BlY3MgJiYgc3BlY3MtPmZpZWxkX3Vuc2lnbmVkKQorKwkJCQk/ICIlbHUiIDogIiVsZCIsICpuYXRpdmUpOworKwkJfQorKwkJYXNzZXJ0KHJldCA+IDAgJiYgKHNpemVfdClyZXQgPCBzaXplb2Yoc2NyYXRjaCkpOworKwkJcmV0dXJuIChjYihzY3JhdGNoLCByZXQsIGFwcF9rZXkpIDwgMCkgPyAtMSA6IDA7CisrCX0gZWxzZSB7CisrCQlyZXR1cm4gKGNiKCI8YWJzZW50PiIsIDgsIGFwcF9rZXkpIDwgMCkgPyAtMSA6IDA7CisrCX0KKyt9CitJbmRleDogc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuaAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHNrZWxldG9ucy9OYXRpdmVFbnVtZXJhdGVkLmgJKHJldmlzaW9uIDE0MDcpCisrKysgc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuaAkod29ya2luZyBjb3B5KQorQEAgLTI0LDYgKzI0LDcgQEAKKyB4ZXJfdHlwZV9lbmNvZGVyX2YgTmF0aXZlRW51bWVyYXRlZF9lbmNvZGVfeGVyOworIHBlcl90eXBlX2RlY29kZXJfZiBOYXRpdmVFbnVtZXJhdGVkX2RlY29kZV91cGVyOworIHBlcl90eXBlX2VuY29kZXJfZiBOYXRpdmVFbnVtZXJhdGVkX2VuY29kZV91cGVyOworK2Fzbl9zdHJ1Y3RfcHJpbnRfZiBOYXRpdmVFbnVtZXJhdGVkX3ByaW50OworIAorICNpZmRlZiBfX2NwbHVzcGx1cworIH0KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjFjX3BhdGNoZXMvMDFfZml4X3Blcl9lbmNvZGluZ19kaWV0ZXIuZGlmZiBiL3JybHAtZXBoZW1lcmlzL2FzbjFjX3BhdGNoZXMvMDFfZml4X3Blcl9lbmNvZGluZ19kaWV0ZXIuZGlmZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDljMjAxCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMV9maXhfcGVyX2VuY29kaW5nX2RpZXRlci5kaWZmCkBAIC0wLDAgKzEsMTcgQEAKK0luZGV4OiBza2VsZXRvbnMvcGVyX3N1cHBvcnQuYworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHNrZWxldG9ucy9wZXJfc3VwcG9ydC5jCShyZXZpc2lvbiAxNDA3KQorKysrIHNrZWxldG9ucy9wZXJfc3VwcG9ydC5jCSh3b3JraW5nIGNvcHkpCitAQCAtMzM2LDcgKzMzNiwxMiBAQAorIAkJYnVmWzNdID0gYml0czsKKyAJZWxzZSB7CisgCQlBU05fREVCVUcoIi0+W1BFUiBvdXQgc3BsaXQgJWRdIiwgb2JpdHMpOworKyNpZiAxIC8vIERpZXRlcgorKwkJcG8tPm5ib2ZmIC09IG9iaXRzOyAvLyB1bmRvIGluY3JlbWVudGF0aW9uIGZyb20gYSBmZXcgbGluZXMgYWJvdmUKKysJCXBlcl9wdXRfZmV3X2JpdHMocG8sIGJpdHMgPj4gKG9iaXRzIC0gMjQpLCAyNCk7IC8vIHNoaWZ0IGFjY29yZGluZyB0byB0aGUgcmVzdCBvZiB0aGUgYml0cyAKKysjZWxzZQkJCisgCQlwZXJfcHV0X2Zld19iaXRzKHBvLCBiaXRzID4+IDgsIDI0KTsKKysjZW5kaWYKKyAJCXBlcl9wdXRfZmV3X2JpdHMocG8sIGJpdHMsIG9iaXRzIC0gMjQpOworIAkJQVNOX0RFQlVHKCI8LVtQRVIgb3V0IHNwbGl0ICVkXSIsIG9iaXRzKTsKKyAJfQpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvZGF0YS51YnggYi9ycmxwLWVwaGVtZXJpcy9kYXRhLnVieApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2NkZGRjCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvZGF0YS51YngKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvZ2V0LXRlc3QtZGF0YS5zaCBiL3JybHAtZXBoZW1lcmlzL2dldC10ZXN0LWRhdGEuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTY5ZjQzYwotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2dldC10ZXN0LWRhdGEuc2gKQEAgLTAsMCArMSwxNyBAQAorIyEvYmluL3NoCisKK0RFVj0kMQorT1VURj0kMgorCisjIENoYW5nZSBtb2RlCitlY2hvIC1lbiAiXCRQVUJYLDQxLDEsMDAwMSwwMDAxLDk2MDAsMCoxNFxyXG4iID4gJHtERVZ9CisKKyMgV2FpdCBhIGxpdHRsZQorc2xlZXAgMgorCisjIFN0YXJ0IGR1bXAKK2VjaG8gLWVuICJceGI1XHg2Mlx4MDFceDAyXHgwMFx4MDBceDAzXHgwYSIgfCBcCisJc29jYXQgLXQ1ICR7REVWfSxiOTYwMCxyYXcsY2xvY2FsPTEsZWNobz0wIC0gPiAke09VVEZ9CitlY2hvIC1lbiAiXHhiNVx4NjJceDBiXHgxMFx4MDBceDAwXHgxYlx4NWMiIHwgXAorCXNvY2F0IC10MTAgJHtERVZ9LGI5NjAwLHJhdyxjbG9jYWw9MSxlY2hvPTAgLSA+PiAke09VVEZ9CisKZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9ycmxwLWVwaGVtZXJpcy9ncGwtMi4wLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIENPUFlJTkcKY29weSB0byBycmxwLWVwaGVtZXJpcy9ncGwtMi4wLnR4dApkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvZ3BsLTMuMC50eHQgYi9ycmxwLWVwaGVtZXJpcy9ncGwtMy4wLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGE5ZWQwCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvZ3BsLTMuMC50eHQKQEAgLTAsMCArMSw2NzQgQEAKKyAgICAgICAgICAgICAgICAgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAzLCAyOSBKdW5lIDIwMDcKKworIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gPGh0dHA6Ly9mc2Yub3JnLz4KKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWFtYmxlCisKKyAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGEgZnJlZSwgY29weWxlZnQgbGljZW5zZSBmb3IKK3NvZnR3YXJlIGFuZCBvdGhlciBraW5kcyBvZiB3b3Jrcy4KKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYW5kIG90aGVyIHByYWN0aWNhbCB3b3JrcyBhcmUgZGVzaWduZWQKK3RvIHRha2UgYXdheSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSB0aGUgd29ya3MuICBCeSBjb250cmFzdCwKK3RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvCitzaGFyZSBhbmQgY2hhbmdlIGFsbCB2ZXJzaW9ucyBvZiBhIHByb2dyYW0tLXRvIG1ha2Ugc3VyZSBpdCByZW1haW5zIGZyZWUKK3NvZnR3YXJlIGZvciBhbGwgaXRzIHVzZXJzLiAgV2UsIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHVzZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3N0IG9mIG91ciBzb2Z0d2FyZTsgaXQgYXBwbGllcyBhbHNvIHRvCithbnkgb3RoZXIgd29yayByZWxlYXNlZCB0aGlzIHdheSBieSBpdHMgYXV0aG9ycy4gIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGVtIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0IGlmIHlvdQord2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdCBpbiBuZXcKK2ZyZWUgcHJvZ3JhbXMsIGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gcHJldmVudCBvdGhlcnMgZnJvbSBkZW55aW5nIHlvdQordGhlc2UgcmlnaHRzIG9yIGFza2luZyB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuICBUaGVyZWZvcmUsIHlvdSBoYXZlCitjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYKK3lvdSBtb2RpZnkgaXQ6IHJlc3BvbnNpYmlsaXRpZXMgdG8gcmVzcGVjdCB0aGUgZnJlZWRvbSBvZiBvdGhlcnMuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgcGFzcyBvbiB0byB0aGUgcmVjaXBpZW50cyB0aGUgc2FtZQorZnJlZWRvbXMgdGhhdCB5b3UgcmVjZWl2ZWQuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUKK29yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5Citrbm93IHRoZWlyIHJpZ2h0cy4KKworICBEZXZlbG9wZXJzIHRoYXQgdXNlIHRoZSBHTlUgR1BMIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6CisoMSkgYXNzZXJ0IGNvcHlyaWdodCBvbiB0aGUgc29mdHdhcmUsIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgTGljZW5zZQorZ2l2aW5nIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSBpdC4KKworICBGb3IgdGhlIGRldmVsb3BlcnMnIGFuZCBhdXRob3JzJyBwcm90ZWN0aW9uLCB0aGUgR1BMIGNsZWFybHkgZXhwbGFpbnMKK3RoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gIEZvciBib3RoIHVzZXJzJyBhbmQKK2F1dGhvcnMnIHNha2UsIHRoZSBHUEwgcmVxdWlyZXMgdGhhdCBtb2RpZmllZCB2ZXJzaW9ucyBiZSBtYXJrZWQgYXMKK2NoYW5nZWQsIHNvIHRoYXQgdGhlaXIgcHJvYmxlbXMgd2lsbCBub3QgYmUgYXR0cmlidXRlZCBlcnJvbmVvdXNseSB0bworYXV0aG9ycyBvZiBwcmV2aW91cyB2ZXJzaW9ucy4KKworICBTb21lIGRldmljZXMgYXJlIGRlc2lnbmVkIHRvIGRlbnkgdXNlcnMgYWNjZXNzIHRvIGluc3RhbGwgb3IgcnVuCittb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgc29mdHdhcmUgaW5zaWRlIHRoZW0sIGFsdGhvdWdoIHRoZSBtYW51ZmFjdHVyZXIKK2NhbiBkbyBzby4gIFRoaXMgaXMgZnVuZGFtZW50YWxseSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgYWltIG9mCitwcm90ZWN0aW5nIHVzZXJzJyBmcmVlZG9tIHRvIGNoYW5nZSB0aGUgc29mdHdhcmUuICBUaGUgc3lzdGVtYXRpYworcGF0dGVybiBvZiBzdWNoIGFidXNlIG9jY3VycyBpbiB0aGUgYXJlYSBvZiBwcm9kdWN0cyBmb3IgaW5kaXZpZHVhbHMgdG8KK3VzZSwgd2hpY2ggaXMgcHJlY2lzZWx5IHdoZXJlIGl0IGlzIG1vc3QgdW5hY2NlcHRhYmxlLiAgVGhlcmVmb3JlLCB3ZQoraGF2ZSBkZXNpZ25lZCB0aGlzIHZlcnNpb24gb2YgdGhlIEdQTCB0byBwcm9oaWJpdCB0aGUgcHJhY3RpY2UgZm9yIHRob3NlCitwcm9kdWN0cy4gIElmIHN1Y2ggcHJvYmxlbXMgYXJpc2Ugc3Vic3RhbnRpYWxseSBpbiBvdGhlciBkb21haW5zLCB3ZQorc3RhbmQgcmVhZHkgdG8gZXh0ZW5kIHRoaXMgcHJvdmlzaW9uIHRvIHRob3NlIGRvbWFpbnMgaW4gZnV0dXJlIHZlcnNpb25zCitvZiB0aGUgR1BMLCBhcyBuZWVkZWQgdG8gcHJvdGVjdCB0aGUgZnJlZWRvbSBvZiB1c2Vycy4KKworICBGaW5hbGx5LCBldmVyeSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLgorU3RhdGVzIHNob3VsZCBub3QgYWxsb3cgcGF0ZW50cyB0byByZXN0cmljdCBkZXZlbG9wbWVudCBhbmQgdXNlIG9mCitzb2Z0d2FyZSBvbiBnZW5lcmFsLXB1cnBvc2UgY29tcHV0ZXJzLCBidXQgaW4gdGhvc2UgdGhhdCBkbywgd2Ugd2lzaCB0bworYXZvaWQgdGhlIHNwZWNpYWwgZGFuZ2VyIHRoYXQgcGF0ZW50cyBhcHBsaWVkIHRvIGEgZnJlZSBwcm9ncmFtIGNvdWxkCittYWtlIGl0IGVmZmVjdGl2ZWx5IHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB0aGUgR1BMIGFzc3VyZXMgdGhhdAorcGF0ZW50cyBjYW5ub3QgYmUgdXNlZCB0byByZW5kZXIgdGhlIHByb2dyYW0gbm9uLWZyZWUuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisKKyAgICAgICAgICAgICAgICAgICAgICAgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAwLiBEZWZpbml0aW9ucy4KKworICAiVGhpcyBMaWNlbnNlIiByZWZlcnMgdG8gdmVyc2lvbiAzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICAiQ29weXJpZ2h0IiBhbHNvIG1lYW5zIGNvcHlyaWdodC1saWtlIGxhd3MgdGhhdCBhcHBseSB0byBvdGhlciBraW5kcyBvZgord29ya3MsIHN1Y2ggYXMgc2VtaWNvbmR1Y3RvciBtYXNrcy4KKworICAiVGhlIFByb2dyYW0iIHJlZmVycyB0byBhbnkgY29weXJpZ2h0YWJsZSB3b3JrIGxpY2Vuc2VkIHVuZGVyIHRoaXMKK0xpY2Vuc2UuICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4gICJMaWNlbnNlZXMiIGFuZAorInJlY2lwaWVudHMiIG1heSBiZSBpbmRpdmlkdWFscyBvciBvcmdhbml6YXRpb25zLgorCisgIFRvICJtb2RpZnkiIGEgd29yayBtZWFucyB0byBjb3B5IGZyb20gb3IgYWRhcHQgYWxsIG9yIHBhcnQgb2YgdGhlIHdvcmsKK2luIGEgZmFzaGlvbiByZXF1aXJpbmcgY29weXJpZ2h0IHBlcm1pc3Npb24sIG90aGVyIHRoYW4gdGhlIG1ha2luZyBvZiBhbgorZXhhY3QgY29weS4gIFRoZSByZXN1bHRpbmcgd29yayBpcyBjYWxsZWQgYSAibW9kaWZpZWQgdmVyc2lvbiIgb2YgdGhlCitlYXJsaWVyIHdvcmsgb3IgYSB3b3JrICJiYXNlZCBvbiIgdGhlIGVhcmxpZXIgd29yay4KKworICBBICJjb3ZlcmVkIHdvcmsiIG1lYW5zIGVpdGhlciB0aGUgdW5tb2RpZmllZCBQcm9ncmFtIG9yIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0uCisKKyAgVG8gInByb3BhZ2F0ZSIgYSB3b3JrIG1lYW5zIHRvIGRvIGFueXRoaW5nIHdpdGggaXQgdGhhdCwgd2l0aG91dAorcGVybWlzc2lvbiwgd291bGQgbWFrZSB5b3UgZGlyZWN0bHkgb3Igc2Vjb25kYXJpbHkgbGlhYmxlIGZvcgoraW5mcmluZ2VtZW50IHVuZGVyIGFwcGxpY2FibGUgY29weXJpZ2h0IGxhdywgZXhjZXB0IGV4ZWN1dGluZyBpdCBvbiBhCitjb21wdXRlciBvciBtb2RpZnlpbmcgYSBwcml2YXRlIGNvcHkuICBQcm9wYWdhdGlvbiBpbmNsdWRlcyBjb3B5aW5nLAorZGlzdHJpYnV0aW9uICh3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uKSwgbWFraW5nIGF2YWlsYWJsZSB0byB0aGUKK3B1YmxpYywgYW5kIGluIHNvbWUgY291bnRyaWVzIG90aGVyIGFjdGl2aXRpZXMgYXMgd2VsbC4KKworICBUbyAiY29udmV5IiBhIHdvcmsgbWVhbnMgYW55IGtpbmQgb2YgcHJvcGFnYXRpb24gdGhhdCBlbmFibGVzIG90aGVyCitwYXJ0aWVzIHRvIG1ha2Ugb3IgcmVjZWl2ZSBjb3BpZXMuICBNZXJlIGludGVyYWN0aW9uIHdpdGggYSB1c2VyIHRocm91Z2gKK2EgY29tcHV0ZXIgbmV0d29yaywgd2l0aCBubyB0cmFuc2ZlciBvZiBhIGNvcHksIGlzIG5vdCBjb252ZXlpbmcuCisKKyAgQW4gaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2UgZGlzcGxheXMgIkFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMiCit0byB0aGUgZXh0ZW50IHRoYXQgaXQgaW5jbHVkZXMgYSBjb252ZW5pZW50IGFuZCBwcm9taW5lbnRseSB2aXNpYmxlCitmZWF0dXJlIHRoYXQgKDEpIGRpc3BsYXlzIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UsIGFuZCAoMikKK3RlbGxzIHRoZSB1c2VyIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoZSB3b3JrIChleGNlcHQgdG8gdGhlCitleHRlbnQgdGhhdCB3YXJyYW50aWVzIGFyZSBwcm92aWRlZCksIHRoYXQgbGljZW5zZWVzIG1heSBjb252ZXkgdGhlCit3b3JrIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZgordGhlIGludGVyZmFjZSBwcmVzZW50cyBhIGxpc3Qgb2YgdXNlciBjb21tYW5kcyBvciBvcHRpb25zLCBzdWNoIGFzIGEKK21lbnUsIGEgcHJvbWluZW50IGl0ZW0gaW4gdGhlIGxpc3QgbWVldHMgdGhpcyBjcml0ZXJpb24uCisKKyAgMS4gU291cmNlIENvZGUuCisKKyAgVGhlICJzb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsKK2ZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gICJPYmplY3QgY29kZSIgbWVhbnMgYW55IG5vbi1zb3VyY2UKK2Zvcm0gb2YgYSB3b3JrLgorCisgIEEgIlN0YW5kYXJkIEludGVyZmFjZSIgbWVhbnMgYW4gaW50ZXJmYWNlIHRoYXQgZWl0aGVyIGlzIGFuIG9mZmljaWFsCitzdGFuZGFyZCBkZWZpbmVkIGJ5IGEgcmVjb2duaXplZCBzdGFuZGFyZHMgYm9keSwgb3IsIGluIHRoZSBjYXNlIG9mCitpbnRlcmZhY2VzIHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIHByb2dyYW1taW5nIGxhbmd1YWdlLCBvbmUgdGhhdAoraXMgd2lkZWx5IHVzZWQgYW1vbmcgZGV2ZWxvcGVycyB3b3JraW5nIGluIHRoYXQgbGFuZ3VhZ2UuCisKKyAgVGhlICJTeXN0ZW0gTGlicmFyaWVzIiBvZiBhbiBleGVjdXRhYmxlIHdvcmsgaW5jbHVkZSBhbnl0aGluZywgb3RoZXIKK3RoYW4gdGhlIHdvcmsgYXMgYSB3aG9sZSwgdGhhdCAoYSkgaXMgaW5jbHVkZWQgaW4gdGhlIG5vcm1hbCBmb3JtIG9mCitwYWNrYWdpbmcgYSBNYWpvciBDb21wb25lbnQsIGJ1dCB3aGljaCBpcyBub3QgcGFydCBvZiB0aGF0IE1ham9yCitDb21wb25lbnQsIGFuZCAoYikgc2VydmVzIG9ubHkgdG8gZW5hYmxlIHVzZSBvZiB0aGUgd29yayB3aXRoIHRoYXQKK01ham9yIENvbXBvbmVudCwgb3IgdG8gaW1wbGVtZW50IGEgU3RhbmRhcmQgSW50ZXJmYWNlIGZvciB3aGljaCBhbgoraW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIHRvIHRoZSBwdWJsaWMgaW4gc291cmNlIGNvZGUgZm9ybS4gIEEKKyJNYWpvciBDb21wb25lbnQiLCBpbiB0aGlzIGNvbnRleHQsIG1lYW5zIGEgbWFqb3IgZXNzZW50aWFsIGNvbXBvbmVudAorKGtlcm5lbCwgd2luZG93IHN5c3RlbSwgYW5kIHNvIG9uKSBvZiB0aGUgc3BlY2lmaWMgb3BlcmF0aW5nIHN5c3RlbQorKGlmIGFueSkgb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgd29yayBydW5zLCBvciBhIGNvbXBpbGVyIHVzZWQgdG8KK3Byb2R1Y2UgdGhlIHdvcmssIG9yIGFuIG9iamVjdCBjb2RlIGludGVycHJldGVyIHVzZWQgdG8gcnVuIGl0LgorCisgIFRoZSAiQ29ycmVzcG9uZGluZyBTb3VyY2UiIGZvciBhIHdvcmsgaW4gb2JqZWN0IGNvZGUgZm9ybSBtZWFucyBhbGwKK3RoZSBzb3VyY2UgY29kZSBuZWVkZWQgdG8gZ2VuZXJhdGUsIGluc3RhbGwsIGFuZCAoZm9yIGFuIGV4ZWN1dGFibGUKK3dvcmspIHJ1biB0aGUgb2JqZWN0IGNvZGUgYW5kIHRvIG1vZGlmeSB0aGUgd29yaywgaW5jbHVkaW5nIHNjcmlwdHMgdG8KK2NvbnRyb2wgdGhvc2UgYWN0aXZpdGllcy4gIEhvd2V2ZXIsIGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlIHdvcmsncworU3lzdGVtIExpYnJhcmllcywgb3IgZ2VuZXJhbC1wdXJwb3NlIHRvb2xzIG9yIGdlbmVyYWxseSBhdmFpbGFibGUgZnJlZQorcHJvZ3JhbXMgd2hpY2ggYXJlIHVzZWQgdW5tb2RpZmllZCBpbiBwZXJmb3JtaW5nIHRob3NlIGFjdGl2aXRpZXMgYnV0Cit3aGljaCBhcmUgbm90IHBhcnQgb2YgdGhlIHdvcmsuICBGb3IgZXhhbXBsZSwgQ29ycmVzcG9uZGluZyBTb3VyY2UKK2luY2x1ZGVzIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBzb3VyY2UgZmlsZXMgZm9yCit0aGUgd29yaywgYW5kIHRoZSBzb3VyY2UgY29kZSBmb3Igc2hhcmVkIGxpYnJhcmllcyBhbmQgZHluYW1pY2FsbHkKK2xpbmtlZCBzdWJwcm9ncmFtcyB0aGF0IHRoZSB3b3JrIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byByZXF1aXJlLAorc3VjaCBhcyBieSBpbnRpbWF0ZSBkYXRhIGNvbW11bmljYXRpb24gb3IgY29udHJvbCBmbG93IGJldHdlZW4gdGhvc2UKK3N1YnByb2dyYW1zIGFuZCBvdGhlciBwYXJ0cyBvZiB0aGUgd29yay4KKworICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IHVzZXJzCitjYW4gcmVnZW5lcmF0ZSBhdXRvbWF0aWNhbGx5IGZyb20gb3RoZXIgcGFydHMgb2YgdGhlIENvcnJlc3BvbmRpbmcKK1NvdXJjZS4KKworICBUaGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGEgd29yayBpbiBzb3VyY2UgY29kZSBmb3JtIGlzIHRoYXQKK3NhbWUgd29yay4KKworICAyLiBCYXNpYyBQZXJtaXNzaW9ucy4KKworICBBbGwgcmlnaHRzIGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGFyZSBncmFudGVkIGZvciB0aGUgdGVybSBvZgorY29weXJpZ2h0IG9uIHRoZSBQcm9ncmFtLCBhbmQgYXJlIGlycmV2b2NhYmxlIHByb3ZpZGVkIHRoZSBzdGF0ZWQKK2NvbmRpdGlvbnMgYXJlIG1ldC4gIFRoaXMgTGljZW5zZSBleHBsaWNpdGx5IGFmZmlybXMgeW91ciB1bmxpbWl0ZWQKK3Blcm1pc3Npb24gdG8gcnVuIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0uICBUaGUgb3V0cHV0IGZyb20gcnVubmluZyBhCitjb3ZlcmVkIHdvcmsgaXMgY292ZXJlZCBieSB0aGlzIExpY2Vuc2Ugb25seSBpZiB0aGUgb3V0cHV0LCBnaXZlbiBpdHMKK2NvbnRlbnQsIGNvbnN0aXR1dGVzIGEgY292ZXJlZCB3b3JrLiAgVGhpcyBMaWNlbnNlIGFja25vd2xlZGdlcyB5b3VyCityaWdodHMgb2YgZmFpciB1c2Ugb3Igb3RoZXIgZXF1aXZhbGVudCwgYXMgcHJvdmlkZWQgYnkgY29weXJpZ2h0IGxhdy4KKworICBZb3UgbWF5IG1ha2UsIHJ1biBhbmQgcHJvcGFnYXRlIGNvdmVyZWQgd29ya3MgdGhhdCB5b3UgZG8gbm90Citjb252ZXksIHdpdGhvdXQgY29uZGl0aW9ucyBzbyBsb25nIGFzIHlvdXIgbGljZW5zZSBvdGhlcndpc2UgcmVtYWlucworaW4gZm9yY2UuICBZb3UgbWF5IGNvbnZleSBjb3ZlcmVkIHdvcmtzIHRvIG90aGVycyBmb3IgdGhlIHNvbGUgcHVycG9zZQorb2YgaGF2aW5nIHRoZW0gbWFrZSBtb2RpZmljYXRpb25zIGV4Y2x1c2l2ZWx5IGZvciB5b3UsIG9yIHByb3ZpZGUgeW91Cit3aXRoIGZhY2lsaXRpZXMgZm9yIHJ1bm5pbmcgdGhvc2Ugd29ya3MsIHByb3ZpZGVkIHRoYXQgeW91IGNvbXBseSB3aXRoCit0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGluIGNvbnZleWluZyBhbGwgbWF0ZXJpYWwgZm9yIHdoaWNoIHlvdSBkbworbm90IGNvbnRyb2wgY29weXJpZ2h0LiAgVGhvc2UgdGh1cyBtYWtpbmcgb3IgcnVubmluZyB0aGUgY292ZXJlZCB3b3JrcworZm9yIHlvdSBtdXN0IGRvIHNvIGV4Y2x1c2l2ZWx5IG9uIHlvdXIgYmVoYWxmLCB1bmRlciB5b3VyIGRpcmVjdGlvbgorYW5kIGNvbnRyb2wsIG9uIHRlcm1zIHRoYXQgcHJvaGliaXQgdGhlbSBmcm9tIG1ha2luZyBhbnkgY29waWVzIG9mCit5b3VyIGNvcHlyaWdodGVkIG1hdGVyaWFsIG91dHNpZGUgdGhlaXIgcmVsYXRpb25zaGlwIHdpdGggeW91LgorCisgIENvbnZleWluZyB1bmRlciBhbnkgb3RoZXIgY2lyY3Vtc3RhbmNlcyBpcyBwZXJtaXR0ZWQgc29sZWx5IHVuZGVyCit0aGUgY29uZGl0aW9ucyBzdGF0ZWQgYmVsb3cuICBTdWJsaWNlbnNpbmcgaXMgbm90IGFsbG93ZWQ7IHNlY3Rpb24gMTAKK21ha2VzIGl0IHVubmVjZXNzYXJ5LgorCisgIDMuIFByb3RlY3RpbmcgVXNlcnMnIExlZ2FsIFJpZ2h0cyBGcm9tIEFudGktQ2lyY3VtdmVudGlvbiBMYXcuCisKKyAgTm8gY292ZXJlZCB3b3JrIHNoYWxsIGJlIGRlZW1lZCBwYXJ0IG9mIGFuIGVmZmVjdGl2ZSB0ZWNobm9sb2dpY2FsCittZWFzdXJlIHVuZGVyIGFueSBhcHBsaWNhYmxlIGxhdyBmdWxmaWxsaW5nIG9ibGlnYXRpb25zIHVuZGVyIGFydGljbGUKKzExIG9mIHRoZSBXSVBPIGNvcHlyaWdodCB0cmVhdHkgYWRvcHRlZCBvbiAyMCBEZWNlbWJlciAxOTk2LCBvcgorc2ltaWxhciBsYXdzIHByb2hpYml0aW5nIG9yIHJlc3RyaWN0aW5nIGNpcmN1bXZlbnRpb24gb2Ygc3VjaAorbWVhc3VyZXMuCisKKyAgV2hlbiB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCB5b3Ugd2FpdmUgYW55IGxlZ2FsIHBvd2VyIHRvIGZvcmJpZAorY2lyY3VtdmVudGlvbiBvZiB0ZWNobm9sb2dpY2FsIG1lYXN1cmVzIHRvIHRoZSBleHRlbnQgc3VjaCBjaXJjdW12ZW50aW9uCitpcyBlZmZlY3RlZCBieSBleGVyY2lzaW5nIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2Ugd2l0aCByZXNwZWN0IHRvCit0aGUgY292ZXJlZCB3b3JrLCBhbmQgeW91IGRpc2NsYWltIGFueSBpbnRlbnRpb24gdG8gbGltaXQgb3BlcmF0aW9uIG9yCittb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgYXMgYSBtZWFucyBvZiBlbmZvcmNpbmcsIGFnYWluc3QgdGhlIHdvcmsncwordXNlcnMsIHlvdXIgb3IgdGhpcmQgcGFydGllcycgbGVnYWwgcmlnaHRzIHRvIGZvcmJpZCBjaXJjdW12ZW50aW9uIG9mCit0ZWNobm9sb2dpY2FsIG1lYXN1cmVzLgorCisgIDQuIENvbnZleWluZyBWZXJiYXRpbSBDb3BpZXMuCisKKyAgWW91IG1heSBjb252ZXkgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291cmNlIGNvZGUgYXMgeW91CityZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5IGFuZAorYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlOwora2VlcCBpbnRhY3QgYWxsIG5vdGljZXMgc3RhdGluZyB0aGF0IHRoaXMgTGljZW5zZSBhbmQgYW55Citub24tcGVybWlzc2l2ZSB0ZXJtcyBhZGRlZCBpbiBhY2NvcmQgd2l0aCBzZWN0aW9uIDcgYXBwbHkgdG8gdGhlIGNvZGU7CitrZWVwIGludGFjdCBhbGwgbm90aWNlcyBvZiB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFsbAorcmVjaXBpZW50cyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIFByb2dyYW0uCisKKyAgWW91IG1heSBjaGFyZ2UgYW55IHByaWNlIG9yIG5vIHByaWNlIGZvciBlYWNoIGNvcHkgdGhhdCB5b3UgY29udmV5LAorYW5kIHlvdSBtYXkgb2ZmZXIgc3VwcG9ydCBvciB3YXJyYW50eSBwcm90ZWN0aW9uIGZvciBhIGZlZS4KKworICA1LiBDb252ZXlpbmcgTW9kaWZpZWQgU291cmNlIFZlcnNpb25zLgorCisgIFlvdSBtYXkgY29udmV5IGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgb3IgdGhlIG1vZGlmaWNhdGlvbnMgdG8KK3Byb2R1Y2UgaXQgZnJvbSB0aGUgUHJvZ3JhbSwgaW4gdGhlIGZvcm0gb2Ygc291cmNlIGNvZGUgdW5kZXIgdGhlCit0ZXJtcyBvZiBzZWN0aW9uIDQsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFRoZSB3b3JrIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IHlvdSBtb2RpZmllZAorICAgIGl0LCBhbmQgZ2l2aW5nIGEgcmVsZXZhbnQgZGF0ZS4KKworICAgIGIpIFRoZSB3b3JrIG11c3QgY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZyB0aGF0IGl0IGlzCisgICAgcmVsZWFzZWQgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZCBhbnkgY29uZGl0aW9ucyBhZGRlZCB1bmRlciBzZWN0aW9uCisgICAgNy4gIFRoaXMgcmVxdWlyZW1lbnQgbW9kaWZpZXMgdGhlIHJlcXVpcmVtZW50IGluIHNlY3Rpb24gNCB0bworICAgICJrZWVwIGludGFjdCBhbGwgbm90aWNlcyIuCisKKyAgICBjKSBZb3UgbXVzdCBsaWNlbnNlIHRoZSBlbnRpcmUgd29yaywgYXMgYSB3aG9sZSwgdW5kZXIgdGhpcworICAgIExpY2Vuc2UgdG8gYW55b25lIHdobyBjb21lcyBpbnRvIHBvc3Nlc3Npb24gb2YgYSBjb3B5LiAgVGhpcworICAgIExpY2Vuc2Ugd2lsbCB0aGVyZWZvcmUgYXBwbHksIGFsb25nIHdpdGggYW55IGFwcGxpY2FibGUgc2VjdGlvbiA3CisgICAgYWRkaXRpb25hbCB0ZXJtcywgdG8gdGhlIHdob2xlIG9mIHRoZSB3b3JrLCBhbmQgYWxsIGl0cyBwYXJ0cywKKyAgICByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IGFyZSBwYWNrYWdlZC4gIFRoaXMgTGljZW5zZSBnaXZlcyBubworICAgIHBlcm1pc3Npb24gdG8gbGljZW5zZSB0aGUgd29yayBpbiBhbnkgb3RoZXIgd2F5LCBidXQgaXQgZG9lcyBub3QKKyAgICBpbnZhbGlkYXRlIHN1Y2ggcGVybWlzc2lvbiBpZiB5b3UgaGF2ZSBzZXBhcmF0ZWx5IHJlY2VpdmVkIGl0LgorCisgICAgZCkgSWYgdGhlIHdvcmsgaGFzIGludGVyYWN0aXZlIHVzZXIgaW50ZXJmYWNlcywgZWFjaCBtdXN0IGRpc3BsYXkKKyAgICBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzOyBob3dldmVyLCBpZiB0aGUgUHJvZ3JhbSBoYXMgaW50ZXJhY3RpdmUKKyAgICBpbnRlcmZhY2VzIHRoYXQgZG8gbm90IGRpc3BsYXkgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcywgeW91cgorICAgIHdvcmsgbmVlZCBub3QgbWFrZSB0aGVtIGRvIHNvLgorCisgIEEgY29tcGlsYXRpb24gb2YgYSBjb3ZlcmVkIHdvcmsgd2l0aCBvdGhlciBzZXBhcmF0ZSBhbmQgaW5kZXBlbmRlbnQKK3dvcmtzLCB3aGljaCBhcmUgbm90IGJ5IHRoZWlyIG5hdHVyZSBleHRlbnNpb25zIG9mIHRoZSBjb3ZlcmVkIHdvcmssCithbmQgd2hpY2ggYXJlIG5vdCBjb21iaW5lZCB3aXRoIGl0IHN1Y2ggYXMgdG8gZm9ybSBhIGxhcmdlciBwcm9ncmFtLAoraW4gb3Igb24gYSB2b2x1bWUgb2YgYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0sIGlzIGNhbGxlZCBhbgorImFnZ3JlZ2F0ZSIgaWYgdGhlIGNvbXBpbGF0aW9uIGFuZCBpdHMgcmVzdWx0aW5nIGNvcHlyaWdodCBhcmUgbm90Cit1c2VkIHRvIGxpbWl0IHRoZSBhY2Nlc3Mgb3IgbGVnYWwgcmlnaHRzIG9mIHRoZSBjb21waWxhdGlvbidzIHVzZXJzCitiZXlvbmQgd2hhdCB0aGUgaW5kaXZpZHVhbCB3b3JrcyBwZXJtaXQuICBJbmNsdXNpb24gb2YgYSBjb3ZlcmVkIHdvcmsKK2luIGFuIGFnZ3JlZ2F0ZSBkb2VzIG5vdCBjYXVzZSB0aGlzIExpY2Vuc2UgdG8gYXBwbHkgdG8gdGhlIG90aGVyCitwYXJ0cyBvZiB0aGUgYWdncmVnYXRlLgorCisgIDYuIENvbnZleWluZyBOb24tU291cmNlIEZvcm1zLgorCisgIFlvdSBtYXkgY29udmV5IGEgY292ZXJlZCB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgdGhlIHRlcm1zCitvZiBzZWN0aW9ucyA0IGFuZCA1LCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGNvbnZleSB0aGUKK21hY2hpbmUtcmVhZGFibGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwKK2luIG9uZSBvZiB0aGVzZSB3YXlzOgorCisgICAgYSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAorICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgZml4ZWQgb24gYSBkdXJhYmxlIHBoeXNpY2FsIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgorCisgICAgYikgQ29udmV5IHRoZSBvYmplY3QgY29kZSBpbiwgb3IgZW1ib2RpZWQgaW4sIGEgcGh5c2ljYWwgcHJvZHVjdAorICAgIChpbmNsdWRpbmcgYSBwaHlzaWNhbCBkaXN0cmlidXRpb24gbWVkaXVtKSwgYWNjb21wYW5pZWQgYnkgYQorICAgIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZSB5ZWFycyBhbmQgdmFsaWQgZm9yIGFzCisgICAgbG9uZyBhcyB5b3Ugb2ZmZXIgc3BhcmUgcGFydHMgb3IgY3VzdG9tZXIgc3VwcG9ydCBmb3IgdGhhdCBwcm9kdWN0CisgICAgbW9kZWwsIHRvIGdpdmUgYW55b25lIHdobyBwb3NzZXNzZXMgdGhlIG9iamVjdCBjb2RlIGVpdGhlciAoMSkgYQorICAgIGNvcHkgb2YgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGZvciBhbGwgdGhlIHNvZnR3YXJlIGluIHRoZQorICAgIHByb2R1Y3QgdGhhdCBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgb24gYSBkdXJhYmxlIHBoeXNpY2FsCisgICAgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLCBmb3IgYSBwcmljZSBubworICAgIG1vcmUgdGhhbiB5b3VyIHJlYXNvbmFibGUgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgdGhpcworICAgIGNvbnZleWluZyBvZiBzb3VyY2UsIG9yICgyKSBhY2Nlc3MgdG8gY29weSB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmcm9tIGEgbmV0d29yayBzZXJ2ZXIgYXQgbm8gY2hhcmdlLgorCisgICAgYykgQ29udmV5IGluZGl2aWR1YWwgY29waWVzIG9mIHRoZSBvYmplY3QgY29kZSB3aXRoIGEgY29weSBvZiB0aGUKKyAgICB3cml0dGVuIG9mZmVyIHRvIHByb3ZpZGUgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhpcworICAgIGFsdGVybmF0aXZlIGlzIGFsbG93ZWQgb25seSBvY2Nhc2lvbmFsbHkgYW5kIG5vbmNvbW1lcmNpYWxseSwgYW5kCisgICAgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlIG9iamVjdCBjb2RlIHdpdGggc3VjaCBhbiBvZmZlciwgaW4gYWNjb3JkCisgICAgd2l0aCBzdWJzZWN0aW9uIDZiLgorCisgICAgZCkgQ29udmV5IHRoZSBvYmplY3QgY29kZSBieSBvZmZlcmluZyBhY2Nlc3MgZnJvbSBhIGRlc2lnbmF0ZWQKKyAgICBwbGFjZSAoZ3JhdGlzIG9yIGZvciBhIGNoYXJnZSksIGFuZCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBpbiB0aGUgc2FtZSB3YXkgdGhyb3VnaCB0aGUgc2FtZSBwbGFjZSBhdCBubworICAgIGZ1cnRoZXIgY2hhcmdlLiAgWW91IG5lZWQgbm90IHJlcXVpcmUgcmVjaXBpZW50cyB0byBjb3B5IHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLiAgSWYgdGhlIHBsYWNlIHRvCisgICAgY29weSB0aGUgb2JqZWN0IGNvZGUgaXMgYSBuZXR3b3JrIHNlcnZlciwgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlCisgICAgbWF5IGJlIG9uIGEgZGlmZmVyZW50IHNlcnZlciAob3BlcmF0ZWQgYnkgeW91IG9yIGEgdGhpcmQgcGFydHkpCisgICAgdGhhdCBzdXBwb3J0cyBlcXVpdmFsZW50IGNvcHlpbmcgZmFjaWxpdGllcywgcHJvdmlkZWQgeW91IG1haW50YWluCisgICAgY2xlYXIgZGlyZWN0aW9ucyBuZXh0IHRvIHRoZSBvYmplY3QgY29kZSBzYXlpbmcgd2hlcmUgdG8gZmluZCB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFJlZ2FyZGxlc3Mgb2Ygd2hhdCBzZXJ2ZXIgaG9zdHMgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UsIHlvdSByZW1haW4gb2JsaWdhdGVkIHRvIGVuc3VyZSB0aGF0IGl0IGlzCisgICAgYXZhaWxhYmxlIGZvciBhcyBsb25nIGFzIG5lZWRlZCB0byBzYXRpc2Z5IHRoZXNlIHJlcXVpcmVtZW50cy4KKworICAgIGUpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbiwgcHJvdmlkZWQKKyAgICB5b3UgaW5mb3JtIG90aGVyIHBlZXJzIHdoZXJlIHRoZSBvYmplY3QgY29kZSBhbmQgQ29ycmVzcG9uZGluZworICAgIFNvdXJjZSBvZiB0aGUgd29yayBhcmUgYmVpbmcgb2ZmZXJlZCB0byB0aGUgZ2VuZXJhbCBwdWJsaWMgYXQgbm8KKyAgICBjaGFyZ2UgdW5kZXIgc3Vic2VjdGlvbiA2ZC4KKworICBBIHNlcGFyYWJsZSBwb3J0aW9uIG9mIHRoZSBvYmplY3QgY29kZSwgd2hvc2Ugc291cmNlIGNvZGUgaXMgZXhjbHVkZWQKK2Zyb20gdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGFzIGEgU3lzdGVtIExpYnJhcnksIG5lZWQgbm90IGJlCitpbmNsdWRlZCBpbiBjb252ZXlpbmcgdGhlIG9iamVjdCBjb2RlIHdvcmsuCisKKyAgQSAiVXNlciBQcm9kdWN0IiBpcyBlaXRoZXIgKDEpIGEgImNvbnN1bWVyIHByb2R1Y3QiLCB3aGljaCBtZWFucyBhbnkKK3RhbmdpYmxlIHBlcnNvbmFsIHByb3BlcnR5IHdoaWNoIGlzIG5vcm1hbGx5IHVzZWQgZm9yIHBlcnNvbmFsLCBmYW1pbHksCitvciBob3VzZWhvbGQgcHVycG9zZXMsIG9yICgyKSBhbnl0aGluZyBkZXNpZ25lZCBvciBzb2xkIGZvciBpbmNvcnBvcmF0aW9uCitpbnRvIGEgZHdlbGxpbmcuICBJbiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgcHJvZHVjdCBpcyBhIGNvbnN1bWVyIHByb2R1Y3QsCitkb3VidGZ1bCBjYXNlcyBzaGFsbCBiZSByZXNvbHZlZCBpbiBmYXZvciBvZiBjb3ZlcmFnZS4gIEZvciBhIHBhcnRpY3VsYXIKK3Byb2R1Y3QgcmVjZWl2ZWQgYnkgYSBwYXJ0aWN1bGFyIHVzZXIsICJub3JtYWxseSB1c2VkIiByZWZlcnMgdG8gYQordHlwaWNhbCBvciBjb21tb24gdXNlIG9mIHRoYXQgY2xhc3Mgb2YgcHJvZHVjdCwgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdHVzCitvZiB0aGUgcGFydGljdWxhciB1c2VyIG9yIG9mIHRoZSB3YXkgaW4gd2hpY2ggdGhlIHBhcnRpY3VsYXIgdXNlcgorYWN0dWFsbHkgdXNlcywgb3IgZXhwZWN0cyBvciBpcyBleHBlY3RlZCB0byB1c2UsIHRoZSBwcm9kdWN0LiAgQSBwcm9kdWN0CitpcyBhIGNvbnN1bWVyIHByb2R1Y3QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwcm9kdWN0IGhhcyBzdWJzdGFudGlhbAorY29tbWVyY2lhbCwgaW5kdXN0cmlhbCBvciBub24tY29uc3VtZXIgdXNlcywgdW5sZXNzIHN1Y2ggdXNlcyByZXByZXNlbnQKK3RoZSBvbmx5IHNpZ25pZmljYW50IG1vZGUgb2YgdXNlIG9mIHRoZSBwcm9kdWN0LgorCisgICJJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24iIGZvciBhIFVzZXIgUHJvZHVjdCBtZWFucyBhbnkgbWV0aG9kcywKK3Byb2NlZHVyZXMsIGF1dGhvcml6YXRpb24ga2V5cywgb3Igb3RoZXIgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gaW5zdGFsbAorYW5kIGV4ZWN1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgYSBjb3ZlcmVkIHdvcmsgaW4gdGhhdCBVc2VyIFByb2R1Y3QgZnJvbQorYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGl0cyBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFRoZSBpbmZvcm1hdGlvbiBtdXN0CitzdWZmaWNlIHRvIGVuc3VyZSB0aGF0IHRoZSBjb250aW51ZWQgZnVuY3Rpb25pbmcgb2YgdGhlIG1vZGlmaWVkIG9iamVjdAorY29kZSBpcyBpbiBubyBjYXNlIHByZXZlbnRlZCBvciBpbnRlcmZlcmVkIHdpdGggc29sZWx5IGJlY2F1c2UKK21vZGlmaWNhdGlvbiBoYXMgYmVlbiBtYWRlLgorCisgIElmIHlvdSBjb252ZXkgYW4gb2JqZWN0IGNvZGUgd29yayB1bmRlciB0aGlzIHNlY3Rpb24gaW4sIG9yIHdpdGgsIG9yCitzcGVjaWZpY2FsbHkgZm9yIHVzZSBpbiwgYSBVc2VyIFByb2R1Y3QsIGFuZCB0aGUgY29udmV5aW5nIG9jY3VycyBhcworcGFydCBvZiBhIHRyYW5zYWN0aW9uIGluIHdoaWNoIHRoZSByaWdodCBvZiBwb3NzZXNzaW9uIGFuZCB1c2Ugb2YgdGhlCitVc2VyIFByb2R1Y3QgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIHJlY2lwaWVudCBpbiBwZXJwZXR1aXR5IG9yIGZvciBhCitmaXhlZCB0ZXJtIChyZWdhcmRsZXNzIG9mIGhvdyB0aGUgdHJhbnNhY3Rpb24gaXMgY2hhcmFjdGVyaXplZCksIHRoZQorQ29ycmVzcG9uZGluZyBTb3VyY2UgY29udmV5ZWQgdW5kZXIgdGhpcyBzZWN0aW9uIG11c3QgYmUgYWNjb21wYW5pZWQKK2J5IHRoZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24uICBCdXQgdGhpcyByZXF1aXJlbWVudCBkb2VzIG5vdCBhcHBseQoraWYgbmVpdGhlciB5b3Ugbm9yIGFueSB0aGlyZCBwYXJ0eSByZXRhaW5zIHRoZSBhYmlsaXR5IHRvIGluc3RhbGwKK21vZGlmaWVkIG9iamVjdCBjb2RlIG9uIHRoZSBVc2VyIFByb2R1Y3QgKGZvciBleGFtcGxlLCB0aGUgd29yayBoYXMKK2JlZW4gaW5zdGFsbGVkIGluIFJPTSkuCisKKyAgVGhlIHJlcXVpcmVtZW50IHRvIHByb3ZpZGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIGRvZXMgbm90IGluY2x1ZGUgYQorcmVxdWlyZW1lbnQgdG8gY29udGludWUgdG8gcHJvdmlkZSBzdXBwb3J0IHNlcnZpY2UsIHdhcnJhbnR5LCBvciB1cGRhdGVzCitmb3IgYSB3b3JrIHRoYXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkIGJ5IHRoZSByZWNpcGllbnQsIG9yIGZvcgordGhlIFVzZXIgUHJvZHVjdCBpbiB3aGljaCBpdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQuICBBY2Nlc3MgdG8gYQorbmV0d29yayBtYXkgYmUgZGVuaWVkIHdoZW4gdGhlIG1vZGlmaWNhdGlvbiBpdHNlbGYgbWF0ZXJpYWxseSBhbmQKK2FkdmVyc2VseSBhZmZlY3RzIHRoZSBvcGVyYXRpb24gb2YgdGhlIG5ldHdvcmsgb3IgdmlvbGF0ZXMgdGhlIHJ1bGVzIGFuZAorcHJvdG9jb2xzIGZvciBjb21tdW5pY2F0aW9uIGFjcm9zcyB0aGUgbmV0d29yay4KKworICBDb3JyZXNwb25kaW5nIFNvdXJjZSBjb252ZXllZCwgYW5kIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBwcm92aWRlZCwKK2luIGFjY29yZCB3aXRoIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIGEgZm9ybWF0IHRoYXQgaXMgcHVibGljbHkKK2RvY3VtZW50ZWQgKGFuZCB3aXRoIGFuIGltcGxlbWVudGF0aW9uIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluCitzb3VyY2UgY29kZSBmb3JtKSwgYW5kIG11c3QgcmVxdWlyZSBubyBzcGVjaWFsIHBhc3N3b3JkIG9yIGtleSBmb3IKK3VucGFja2luZywgcmVhZGluZyBvciBjb3B5aW5nLgorCisgIDcuIEFkZGl0aW9uYWwgVGVybXMuCisKKyAgIkFkZGl0aW9uYWwgcGVybWlzc2lvbnMiIGFyZSB0ZXJtcyB0aGF0IHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMKK0xpY2Vuc2UgYnkgbWFraW5nIGV4Y2VwdGlvbnMgZnJvbSBvbmUgb3IgbW9yZSBvZiBpdHMgY29uZGl0aW9ucy4KK0FkZGl0aW9uYWwgcGVybWlzc2lvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGUgZW50aXJlIFByb2dyYW0gc2hhbGwKK2JlIHRyZWF0ZWQgYXMgdGhvdWdoIHRoZXkgd2VyZSBpbmNsdWRlZCBpbiB0aGlzIExpY2Vuc2UsIHRvIHRoZSBleHRlbnQKK3RoYXQgdGhleSBhcmUgdmFsaWQgdW5kZXIgYXBwbGljYWJsZSBsYXcuICBJZiBhZGRpdGlvbmFsIHBlcm1pc3Npb25zCithcHBseSBvbmx5IHRvIHBhcnQgb2YgdGhlIFByb2dyYW0sIHRoYXQgcGFydCBtYXkgYmUgdXNlZCBzZXBhcmF0ZWx5Cit1bmRlciB0aG9zZSBwZXJtaXNzaW9ucywgYnV0IHRoZSBlbnRpcmUgUHJvZ3JhbSByZW1haW5zIGdvdmVybmVkIGJ5Cit0aGlzIExpY2Vuc2Ugd2l0aG91dCByZWdhcmQgdG8gdGhlIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMuCisKKyAgV2hlbiB5b3UgY29udmV5IGEgY29weSBvZiBhIGNvdmVyZWQgd29yaywgeW91IG1heSBhdCB5b3VyIG9wdGlvbgorcmVtb3ZlIGFueSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGZyb20gdGhhdCBjb3B5LCBvciBmcm9tIGFueSBwYXJ0IG9mCitpdC4gIChBZGRpdGlvbmFsIHBlcm1pc3Npb25zIG1heSBiZSB3cml0dGVuIHRvIHJlcXVpcmUgdGhlaXIgb3duCityZW1vdmFsIGluIGNlcnRhaW4gY2FzZXMgd2hlbiB5b3UgbW9kaWZ5IHRoZSB3b3JrLikgIFlvdSBtYXkgcGxhY2UKK2FkZGl0aW9uYWwgcGVybWlzc2lvbnMgb24gbWF0ZXJpYWwsIGFkZGVkIGJ5IHlvdSB0byBhIGNvdmVyZWQgd29yaywKK2ZvciB3aGljaCB5b3UgaGF2ZSBvciBjYW4gZ2l2ZSBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgcGVybWlzc2lvbi4KKworICBOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIGZvciBtYXRlcmlhbCB5b3UKK2FkZCB0byBhIGNvdmVyZWQgd29yaywgeW91IG1heSAoaWYgYXV0aG9yaXplZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgb2YKK3RoYXQgbWF0ZXJpYWwpIHN1cHBsZW1lbnQgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHRlcm1zOgorCisgICAgYSkgRGlzY2xhaW1pbmcgd2FycmFudHkgb3IgbGltaXRpbmcgbGlhYmlsaXR5IGRpZmZlcmVudGx5IGZyb20gdGhlCisgICAgdGVybXMgb2Ygc2VjdGlvbnMgMTUgYW5kIDE2IG9mIHRoaXMgTGljZW5zZTsgb3IKKworICAgIGIpIFJlcXVpcmluZyBwcmVzZXJ2YXRpb24gb2Ygc3BlY2lmaWVkIHJlYXNvbmFibGUgbGVnYWwgbm90aWNlcyBvcgorICAgIGF1dGhvciBhdHRyaWJ1dGlvbnMgaW4gdGhhdCBtYXRlcmlhbCBvciBpbiB0aGUgQXBwcm9wcmlhdGUgTGVnYWwKKyAgICBOb3RpY2VzIGRpc3BsYXllZCBieSB3b3JrcyBjb250YWluaW5nIGl0OyBvcgorCisgICAgYykgUHJvaGliaXRpbmcgbWlzcmVwcmVzZW50YXRpb24gb2YgdGhlIG9yaWdpbiBvZiB0aGF0IG1hdGVyaWFsLCBvcgorICAgIHJlcXVpcmluZyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIG9mIHN1Y2ggbWF0ZXJpYWwgYmUgbWFya2VkIGluCisgICAgcmVhc29uYWJsZSB3YXlzIGFzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCB2ZXJzaW9uOyBvcgorCisgICAgZCkgTGltaXRpbmcgdGhlIHVzZSBmb3IgcHVibGljaXR5IHB1cnBvc2VzIG9mIG5hbWVzIG9mIGxpY2Vuc29ycyBvcgorICAgIGF1dGhvcnMgb2YgdGhlIG1hdGVyaWFsOyBvcgorCisgICAgZSkgRGVjbGluaW5nIHRvIGdyYW50IHJpZ2h0cyB1bmRlciB0cmFkZW1hcmsgbGF3IGZvciB1c2Ugb2Ygc29tZQorICAgIHRyYWRlIG5hbWVzLCB0cmFkZW1hcmtzLCBvciBzZXJ2aWNlIG1hcmtzOyBvcgorCisgICAgZikgUmVxdWlyaW5nIGluZGVtbmlmaWNhdGlvbiBvZiBsaWNlbnNvcnMgYW5kIGF1dGhvcnMgb2YgdGhhdAorICAgIG1hdGVyaWFsIGJ5IGFueW9uZSB3aG8gY29udmV5cyB0aGUgbWF0ZXJpYWwgKG9yIG1vZGlmaWVkIHZlcnNpb25zIG9mCisgICAgaXQpIHdpdGggY29udHJhY3R1YWwgYXNzdW1wdGlvbnMgb2YgbGlhYmlsaXR5IHRvIHRoZSByZWNpcGllbnQsIGZvcgorICAgIGFueSBsaWFiaWxpdHkgdGhhdCB0aGVzZSBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBkaXJlY3RseSBpbXBvc2Ugb24KKyAgICB0aG9zZSBsaWNlbnNvcnMgYW5kIGF1dGhvcnMuCisKKyAgQWxsIG90aGVyIG5vbi1wZXJtaXNzaXZlIGFkZGl0aW9uYWwgdGVybXMgYXJlIGNvbnNpZGVyZWQgImZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyIgd2l0aGluIHRoZSBtZWFuaW5nIG9mIHNlY3Rpb24gMTAuICBJZiB0aGUgUHJvZ3JhbSBhcyB5b3UKK3JlY2VpdmVkIGl0LCBvciBhbnkgcGFydCBvZiBpdCwgY29udGFpbnMgYSBub3RpY2Ugc3RhdGluZyB0aGF0IGl0IGlzCitnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCBhIHRlcm0gdGhhdCBpcyBhIGZ1cnRoZXIKK3Jlc3RyaWN0aW9uLCB5b3UgbWF5IHJlbW92ZSB0aGF0IHRlcm0uICBJZiBhIGxpY2Vuc2UgZG9jdW1lbnQgY29udGFpbnMKK2EgZnVydGhlciByZXN0cmljdGlvbiBidXQgcGVybWl0cyByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcgdW5kZXIgdGhpcworTGljZW5zZSwgeW91IG1heSBhZGQgdG8gYSBjb3ZlcmVkIHdvcmsgbWF0ZXJpYWwgZ292ZXJuZWQgYnkgdGhlIHRlcm1zCitvZiB0aGF0IGxpY2Vuc2UgZG9jdW1lbnQsIHByb3ZpZGVkIHRoYXQgdGhlIGZ1cnRoZXIgcmVzdHJpY3Rpb24gZG9lcworbm90IHN1cnZpdmUgc3VjaCByZWxpY2Vuc2luZyBvciBjb252ZXlpbmcuCisKKyAgSWYgeW91IGFkZCB0ZXJtcyB0byBhIGNvdmVyZWQgd29yayBpbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24sIHlvdQorbXVzdCBwbGFjZSwgaW4gdGhlIHJlbGV2YW50IHNvdXJjZSBmaWxlcywgYSBzdGF0ZW1lbnQgb2YgdGhlCithZGRpdGlvbmFsIHRlcm1zIHRoYXQgYXBwbHkgdG8gdGhvc2UgZmlsZXMsIG9yIGEgbm90aWNlIGluZGljYXRpbmcKK3doZXJlIHRvIGZpbmQgdGhlIGFwcGxpY2FibGUgdGVybXMuCisKKyAgQWRkaXRpb25hbCB0ZXJtcywgcGVybWlzc2l2ZSBvciBub24tcGVybWlzc2l2ZSwgbWF5IGJlIHN0YXRlZCBpbiB0aGUKK2Zvcm0gb2YgYSBzZXBhcmF0ZWx5IHdyaXR0ZW4gbGljZW5zZSwgb3Igc3RhdGVkIGFzIGV4Y2VwdGlvbnM7Cit0aGUgYWJvdmUgcmVxdWlyZW1lbnRzIGFwcGx5IGVpdGhlciB3YXkuCisKKyAgOC4gVGVybWluYXRpb24uCisKKyAgWW91IG1heSBub3QgcHJvcGFnYXRlIG9yIG1vZGlmeSBhIGNvdmVyZWQgd29yayBleGNlcHQgYXMgZXhwcmVzc2x5Citwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdCBvdGhlcndpc2UgdG8gcHJvcGFnYXRlIG9yCittb2RpZnkgaXQgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIKK3RoaXMgTGljZW5zZSAoaW5jbHVkaW5nIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCB1bmRlciB0aGUgdGhpcmQKK3BhcmFncmFwaCBvZiBzZWN0aW9uIDExKS4KKworICBIb3dldmVyLCBpZiB5b3UgY2Vhc2UgYWxsIHZpb2xhdGlvbiBvZiB0aGlzIExpY2Vuc2UsIHRoZW4geW91cgorbGljZW5zZSBmcm9tIGEgcGFydGljdWxhciBjb3B5cmlnaHQgaG9sZGVyIGlzIHJlaW5zdGF0ZWQgKGEpCitwcm92aXNpb25hbGx5LCB1bmxlc3MgYW5kIHVudGlsIHRoZSBjb3B5cmlnaHQgaG9sZGVyIGV4cGxpY2l0bHkgYW5kCitmaW5hbGx5IHRlcm1pbmF0ZXMgeW91ciBsaWNlbnNlLCBhbmQgKGIpIHBlcm1hbmVudGx5LCBpZiB0aGUgY29weXJpZ2h0Citob2xkZXIgZmFpbHMgdG8gbm90aWZ5IHlvdSBvZiB0aGUgdmlvbGF0aW9uIGJ5IHNvbWUgcmVhc29uYWJsZSBtZWFucworcHJpb3IgdG8gNjAgZGF5cyBhZnRlciB0aGUgY2Vzc2F0aW9uLgorCisgIE1vcmVvdmVyLCB5b3VyIGxpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcworcmVpbnN0YXRlZCBwZXJtYW5lbnRseSBpZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3RpZmllcyB5b3Ugb2YgdGhlCit2aW9sYXRpb24gYnkgc29tZSByZWFzb25hYmxlIG1lYW5zLCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBoYXZlCityZWNlaXZlZCBub3RpY2Ugb2YgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSAoZm9yIGFueSB3b3JrKSBmcm9tIHRoYXQKK2NvcHlyaWdodCBob2xkZXIsIGFuZCB5b3UgY3VyZSB0aGUgdmlvbGF0aW9uIHByaW9yIHRvIDMwIGRheXMgYWZ0ZXIKK3lvdXIgcmVjZWlwdCBvZiB0aGUgbm90aWNlLgorCisgIFRlcm1pbmF0aW9uIG9mIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgc2VjdGlvbiBkb2VzIG5vdCB0ZXJtaW5hdGUgdGhlCitsaWNlbnNlcyBvZiBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcyBvciByaWdodHMgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZS4gIElmIHlvdXIgcmlnaHRzIGhhdmUgYmVlbiB0ZXJtaW5hdGVkIGFuZCBub3QgcGVybWFuZW50bHkKK3JlaW5zdGF0ZWQsIHlvdSBkbyBub3QgcXVhbGlmeSB0byByZWNlaXZlIG5ldyBsaWNlbnNlcyBmb3IgdGhlIHNhbWUKK21hdGVyaWFsIHVuZGVyIHNlY3Rpb24gMTAuCisKKyAgOS4gQWNjZXB0YW5jZSBOb3QgUmVxdWlyZWQgZm9yIEhhdmluZyBDb3BpZXMuCisKKyAgWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSBpbiBvcmRlciB0byByZWNlaXZlIG9yCitydW4gYSBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgQW5jaWxsYXJ5IHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZCB3b3JrCitvY2N1cnJpbmcgc29sZWx5IGFzIGEgY29uc2VxdWVuY2Ugb2YgdXNpbmcgcGVlci10by1wZWVyIHRyYW5zbWlzc2lvbgordG8gcmVjZWl2ZSBhIGNvcHkgbGlrZXdpc2UgZG9lcyBub3QgcmVxdWlyZSBhY2NlcHRhbmNlLiAgSG93ZXZlciwKK25vdGhpbmcgb3RoZXIgdGhhbiB0aGlzIExpY2Vuc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIHByb3BhZ2F0ZSBvcgorbW9kaWZ5IGFueSBjb3ZlcmVkIHdvcmsuICBUaGVzZSBhY3Rpb25zIGluZnJpbmdlIGNvcHlyaWdodCBpZiB5b3UgZG8KK25vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieSBtb2RpZnlpbmcgb3IgcHJvcGFnYXRpbmcgYQorY292ZXJlZCB3b3JrLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzby4KKworICAxMC4gQXV0b21hdGljIExpY2Vuc2luZyBvZiBEb3duc3RyZWFtIFJlY2lwaWVudHMuCisKKyAgRWFjaCB0aW1lIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseQorcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlIG9yaWdpbmFsIGxpY2Vuc29ycywgdG8gcnVuLCBtb2RpZnkgYW5kCitwcm9wYWdhdGUgdGhhdCB3b3JrLCBzdWJqZWN0IHRvIHRoaXMgTGljZW5zZS4gIFlvdSBhcmUgbm90IHJlc3BvbnNpYmxlCitmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB3aXRoIHRoaXMgTGljZW5zZS4KKworICBBbiAiZW50aXR5IHRyYW5zYWN0aW9uIiBpcyBhIHRyYW5zYWN0aW9uIHRyYW5zZmVycmluZyBjb250cm9sIG9mIGFuCitvcmdhbml6YXRpb24sIG9yIHN1YnN0YW50aWFsbHkgYWxsIGFzc2V0cyBvZiBvbmUsIG9yIHN1YmRpdmlkaW5nIGFuCitvcmdhbml6YXRpb24sIG9yIG1lcmdpbmcgb3JnYW5pemF0aW9ucy4gIElmIHByb3BhZ2F0aW9uIG9mIGEgY292ZXJlZAord29yayByZXN1bHRzIGZyb20gYW4gZW50aXR5IHRyYW5zYWN0aW9uLCBlYWNoIHBhcnR5IHRvIHRoYXQKK3RyYW5zYWN0aW9uIHdobyByZWNlaXZlcyBhIGNvcHkgb2YgdGhlIHdvcmsgYWxzbyByZWNlaXZlcyB3aGF0ZXZlcgorbGljZW5zZXMgdG8gdGhlIHdvcmsgdGhlIHBhcnR5J3MgcHJlZGVjZXNzb3IgaW4gaW50ZXJlc3QgaGFkIG9yIGNvdWxkCitnaXZlIHVuZGVyIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgsIHBsdXMgYSByaWdodCB0byBwb3NzZXNzaW9uIG9mIHRoZQorQ29ycmVzcG9uZGluZyBTb3VyY2Ugb2YgdGhlIHdvcmsgZnJvbSB0aGUgcHJlZGVjZXNzb3IgaW4gaW50ZXJlc3QsIGlmCit0aGUgcHJlZGVjZXNzb3IgaGFzIGl0IG9yIGNhbiBnZXQgaXQgd2l0aCByZWFzb25hYmxlIGVmZm9ydHMuCisKKyAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyIHJlc3RyaWN0aW9ucyBvbiB0aGUgZXhlcmNpc2Ugb2YgdGhlCityaWdodHMgZ3JhbnRlZCBvciBhZmZpcm1lZCB1bmRlciB0aGlzIExpY2Vuc2UuICBGb3IgZXhhbXBsZSwgeW91IG1heQorbm90IGltcG9zZSBhIGxpY2Vuc2UgZmVlLCByb3lhbHR5LCBvciBvdGhlciBjaGFyZ2UgZm9yIGV4ZXJjaXNlIG9mCityaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UsIGFuZCB5b3UgbWF5IG5vdCBpbml0aWF0ZSBsaXRpZ2F0aW9uCisoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdAorYW55IHBhdGVudCBjbGFpbSBpcyBpbmZyaW5nZWQgYnkgbWFraW5nLCB1c2luZywgc2VsbGluZywgb2ZmZXJpbmcgZm9yCitzYWxlLCBvciBpbXBvcnRpbmcgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24gb2YgaXQuCisKKyAgMTEuIFBhdGVudHMuCisKKyAgQSAiY29udHJpYnV0b3IiIGlzIGEgY29weXJpZ2h0IGhvbGRlciB3aG8gYXV0aG9yaXplcyB1c2UgdW5kZXIgdGhpcworTGljZW5zZSBvZiB0aGUgUHJvZ3JhbSBvciBhIHdvcmsgb24gd2hpY2ggdGhlIFByb2dyYW0gaXMgYmFzZWQuICBUaGUKK3dvcmsgdGh1cyBsaWNlbnNlZCBpcyBjYWxsZWQgdGhlIGNvbnRyaWJ1dG9yJ3MgImNvbnRyaWJ1dG9yIHZlcnNpb24iLgorCisgIEEgY29udHJpYnV0b3IncyAiZXNzZW50aWFsIHBhdGVudCBjbGFpbXMiIGFyZSBhbGwgcGF0ZW50IGNsYWltcworb3duZWQgb3IgY29udHJvbGxlZCBieSB0aGUgY29udHJpYnV0b3IsIHdoZXRoZXIgYWxyZWFkeSBhY3F1aXJlZCBvcgoraGVyZWFmdGVyIGFjcXVpcmVkLCB0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCBieSBzb21lIG1hbm5lciwgcGVybWl0dGVkCitieSB0aGlzIExpY2Vuc2UsIG9mIG1ha2luZywgdXNpbmcsIG9yIHNlbGxpbmcgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24sCitidXQgZG8gbm90IGluY2x1ZGUgY2xhaW1zIHRoYXQgd291bGQgYmUgaW5mcmluZ2VkIG9ubHkgYXMgYQorY29uc2VxdWVuY2Ugb2YgZnVydGhlciBtb2RpZmljYXRpb24gb2YgdGhlIGNvbnRyaWJ1dG9yIHZlcnNpb24uICBGb3IKK3B1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wiIGluY2x1ZGVzIHRoZSByaWdodCB0byBncmFudAorcGF0ZW50IHN1YmxpY2Vuc2VzIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mCit0aGlzIExpY2Vuc2UuCisKKyAgRWFjaCBjb250cmlidXRvciBncmFudHMgeW91IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUKK3BhdGVudCBsaWNlbnNlIHVuZGVyIHRoZSBjb250cmlidXRvcidzIGVzc2VudGlhbCBwYXRlbnQgY2xhaW1zLCB0bworbWFrZSwgdXNlLCBzZWxsLCBvZmZlciBmb3Igc2FsZSwgaW1wb3J0IGFuZCBvdGhlcndpc2UgcnVuLCBtb2RpZnkgYW5kCitwcm9wYWdhdGUgdGhlIGNvbnRlbnRzIG9mIGl0cyBjb250cmlidXRvciB2ZXJzaW9uLgorCisgIEluIHRoZSBmb2xsb3dpbmcgdGhyZWUgcGFyYWdyYXBocywgYSAicGF0ZW50IGxpY2Vuc2UiIGlzIGFueSBleHByZXNzCithZ3JlZW1lbnQgb3IgY29tbWl0bWVudCwgaG93ZXZlciBkZW5vbWluYXRlZCwgbm90IHRvIGVuZm9yY2UgYSBwYXRlbnQKKyhzdWNoIGFzIGFuIGV4cHJlc3MgcGVybWlzc2lvbiB0byBwcmFjdGljZSBhIHBhdGVudCBvciBjb3ZlbmFudCBub3QgdG8KK3N1ZSBmb3IgcGF0ZW50IGluZnJpbmdlbWVudCkuICBUbyAiZ3JhbnQiIHN1Y2ggYSBwYXRlbnQgbGljZW5zZSB0byBhCitwYXJ0eSBtZWFucyB0byBtYWtlIHN1Y2ggYW4gYWdyZWVtZW50IG9yIGNvbW1pdG1lbnQgbm90IHRvIGVuZm9yY2UgYQorcGF0ZW50IGFnYWluc3QgdGhlIHBhcnR5LgorCisgIElmIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIGtub3dpbmdseSByZWx5aW5nIG9uIGEgcGF0ZW50IGxpY2Vuc2UsCithbmQgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIG9mIHRoZSB3b3JrIGlzIG5vdCBhdmFpbGFibGUgZm9yIGFueW9uZQordG8gY29weSwgZnJlZSBvZiBjaGFyZ2UgYW5kIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIHRocm91Z2ggYQorcHVibGljbHkgYXZhaWxhYmxlIG5ldHdvcmsgc2VydmVyIG9yIG90aGVyIHJlYWRpbHkgYWNjZXNzaWJsZSBtZWFucywKK3RoZW4geW91IG11c3QgZWl0aGVyICgxKSBjYXVzZSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgdG8gYmUgc28KK2F2YWlsYWJsZSwgb3IgKDIpIGFycmFuZ2UgdG8gZGVwcml2ZSB5b3Vyc2VsZiBvZiB0aGUgYmVuZWZpdCBvZiB0aGUKK3BhdGVudCBsaWNlbnNlIGZvciB0aGlzIHBhcnRpY3VsYXIgd29yaywgb3IgKDMpIGFycmFuZ2UsIGluIGEgbWFubmVyCitjb25zaXN0ZW50IHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiB0aGlzIExpY2Vuc2UsIHRvIGV4dGVuZCB0aGUgcGF0ZW50CitsaWNlbnNlIHRvIGRvd25zdHJlYW0gcmVjaXBpZW50cy4gICJLbm93aW5nbHkgcmVseWluZyIgbWVhbnMgeW91IGhhdmUKK2FjdHVhbCBrbm93bGVkZ2UgdGhhdCwgYnV0IGZvciB0aGUgcGF0ZW50IGxpY2Vuc2UsIHlvdXIgY29udmV5aW5nIHRoZQorY292ZXJlZCB3b3JrIGluIGEgY291bnRyeSwgb3IgeW91ciByZWNpcGllbnQncyB1c2Ugb2YgdGhlIGNvdmVyZWQgd29yaworaW4gYSBjb3VudHJ5LCB3b3VsZCBpbmZyaW5nZSBvbmUgb3IgbW9yZSBpZGVudGlmaWFibGUgcGF0ZW50cyBpbiB0aGF0Citjb3VudHJ5IHRoYXQgeW91IGhhdmUgcmVhc29uIHRvIGJlbGlldmUgYXJlIHZhbGlkLgorCisgIElmLCBwdXJzdWFudCB0byBvciBpbiBjb25uZWN0aW9uIHdpdGggYSBzaW5nbGUgdHJhbnNhY3Rpb24gb3IKK2FycmFuZ2VtZW50LCB5b3UgY29udmV5LCBvciBwcm9wYWdhdGUgYnkgcHJvY3VyaW5nIGNvbnZleWFuY2Ugb2YsIGEKK2NvdmVyZWQgd29yaywgYW5kIGdyYW50IGEgcGF0ZW50IGxpY2Vuc2UgdG8gc29tZSBvZiB0aGUgcGFydGllcworcmVjZWl2aW5nIHRoZSBjb3ZlcmVkIHdvcmsgYXV0aG9yaXppbmcgdGhlbSB0byB1c2UsIHByb3BhZ2F0ZSwgbW9kaWZ5CitvciBjb252ZXkgYSBzcGVjaWZpYyBjb3B5IG9mIHRoZSBjb3ZlcmVkIHdvcmssIHRoZW4gdGhlIHBhdGVudCBsaWNlbnNlCit5b3UgZ3JhbnQgaXMgYXV0b21hdGljYWxseSBleHRlbmRlZCB0byBhbGwgcmVjaXBpZW50cyBvZiB0aGUgY292ZXJlZAord29yayBhbmQgd29ya3MgYmFzZWQgb24gaXQuCisKKyAgQSBwYXRlbnQgbGljZW5zZSBpcyAiZGlzY3JpbWluYXRvcnkiIGlmIGl0IGRvZXMgbm90IGluY2x1ZGUgd2l0aGluCit0aGUgc2NvcGUgb2YgaXRzIGNvdmVyYWdlLCBwcm9oaWJpdHMgdGhlIGV4ZXJjaXNlIG9mLCBvciBpcworY29uZGl0aW9uZWQgb24gdGhlIG5vbi1leGVyY2lzZSBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgcmlnaHRzIHRoYXQgYXJlCitzcGVjaWZpY2FsbHkgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBZb3UgbWF5IG5vdCBjb252ZXkgYSBjb3ZlcmVkCit3b3JrIGlmIHlvdSBhcmUgYSBwYXJ0eSB0byBhbiBhcnJhbmdlbWVudCB3aXRoIGEgdGhpcmQgcGFydHkgdGhhdCBpcworaW4gdGhlIGJ1c2luZXNzIG9mIGRpc3RyaWJ1dGluZyBzb2Z0d2FyZSwgdW5kZXIgd2hpY2ggeW91IG1ha2UgcGF5bWVudAordG8gdGhlIHRoaXJkIHBhcnR5IGJhc2VkIG9uIHRoZSBleHRlbnQgb2YgeW91ciBhY3Rpdml0eSBvZiBjb252ZXlpbmcKK3RoZSB3b3JrLCBhbmQgdW5kZXIgd2hpY2ggdGhlIHRoaXJkIHBhcnR5IGdyYW50cywgdG8gYW55IG9mIHRoZQorcGFydGllcyB3aG8gd291bGQgcmVjZWl2ZSB0aGUgY292ZXJlZCB3b3JrIGZyb20geW91LCBhIGRpc2NyaW1pbmF0b3J5CitwYXRlbnQgbGljZW5zZSAoYSkgaW4gY29ubmVjdGlvbiB3aXRoIGNvcGllcyBvZiB0aGUgY292ZXJlZCB3b3JrCitjb252ZXllZCBieSB5b3UgKG9yIGNvcGllcyBtYWRlIGZyb20gdGhvc2UgY29waWVzKSwgb3IgKGIpIHByaW1hcmlseQorZm9yIGFuZCBpbiBjb25uZWN0aW9uIHdpdGggc3BlY2lmaWMgcHJvZHVjdHMgb3IgY29tcGlsYXRpb25zIHRoYXQKK2NvbnRhaW4gdGhlIGNvdmVyZWQgd29yaywgdW5sZXNzIHlvdSBlbnRlcmVkIGludG8gdGhhdCBhcnJhbmdlbWVudCwKK29yIHRoYXQgcGF0ZW50IGxpY2Vuc2Ugd2FzIGdyYW50ZWQsIHByaW9yIHRvIDI4IE1hcmNoIDIwMDcuCisKKyAgTm90aGluZyBpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgY29uc3RydWVkIGFzIGV4Y2x1ZGluZyBvciBsaW1pdGluZworYW55IGltcGxpZWQgbGljZW5zZSBvciBvdGhlciBkZWZlbnNlcyB0byBpbmZyaW5nZW1lbnQgdGhhdCBtYXkKK290aGVyd2lzZSBiZSBhdmFpbGFibGUgdG8geW91IHVuZGVyIGFwcGxpY2FibGUgcGF0ZW50IGxhdy4KKworICAxMi4gTm8gU3VycmVuZGVyIG9mIE90aGVycycgRnJlZWRvbS4KKworICBJZiBjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdCBjb252ZXkgYQorY292ZXJlZCB3b3JrIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heQorbm90IGNvbnZleSBpdCBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFncmVlIHRvIHRlcm1zIHRoYXQgb2JsaWdhdGUgeW91Cit0byBjb2xsZWN0IGEgcm95YWx0eSBmb3IgZnVydGhlciBjb252ZXlpbmcgZnJvbSB0aG9zZSB0byB3aG9tIHlvdSBjb252ZXkKK3RoZSBQcm9ncmFtLCB0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCB0aG9zZSB0ZXJtcyBhbmQgdGhpcworTGljZW5zZSB3b3VsZCBiZSB0byByZWZyYWluIGVudGlyZWx5IGZyb20gY29udmV5aW5nIHRoZSBQcm9ncmFtLgorCisgIDEzLiBVc2Ugd2l0aCB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgeW91IGhhdmUKK3Blcm1pc3Npb24gdG8gbGluayBvciBjb21iaW5lIGFueSBjb3ZlcmVkIHdvcmsgd2l0aCBhIHdvcmsgbGljZW5zZWQKK3VuZGVyIHZlcnNpb24gMyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGludG8gYSBzaW5nbGUKK2NvbWJpbmVkIHdvcmssIGFuZCB0byBjb252ZXkgdGhlIHJlc3VsdGluZyB3b3JrLiAgVGhlIHRlcm1zIG9mIHRoaXMKK0xpY2Vuc2Ugd2lsbCBjb250aW51ZSB0byBhcHBseSB0byB0aGUgcGFydCB3aGljaCBpcyB0aGUgY292ZXJlZCB3b3JrLAorYnV0IHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50cyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorc2VjdGlvbiAxMywgY29uY2VybmluZyBpbnRlcmFjdGlvbiB0aHJvdWdoIGEgbmV0d29yayB3aWxsIGFwcGx5IHRvIHRoZQorY29tYmluYXRpb24gYXMgc3VjaC4KKworICAxNC4gUmV2aXNlZCBWZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YKK3RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKKyAgRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUKK1Byb2dyYW0gc3BlY2lmaWVzIHRoYXQgYSBjZXJ0YWluIG51bWJlcmVkIHZlcnNpb24gb2YgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSAib3IgYW55IGxhdGVyIHZlcnNpb24iIGFwcGxpZXMgdG8gaXQsIHlvdSBoYXZlIHRoZQorb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgbnVtYmVyZWQKK3ZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkCitieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIElmIHRoZSBQcm9ncmFtIHNwZWNpZmllcyB0aGF0IGEgcHJveHkgY2FuIGRlY2lkZSB3aGljaCBmdXR1cmUKK3ZlcnNpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdXNlZCwgdGhhdCBwcm94eSdzCitwdWJsaWMgc3RhdGVtZW50IG9mIGFjY2VwdGFuY2Ugb2YgYSB2ZXJzaW9uIHBlcm1hbmVudGx5IGF1dGhvcml6ZXMgeW91Cit0byBjaG9vc2UgdGhhdCB2ZXJzaW9uIGZvciB0aGUgUHJvZ3JhbS4KKworICBMYXRlciBsaWNlbnNlIHZlcnNpb25zIG1heSBnaXZlIHlvdSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudAorcGVybWlzc2lvbnMuICBIb3dldmVyLCBubyBhZGRpdGlvbmFsIG9ibGlnYXRpb25zIGFyZSBpbXBvc2VkIG9uIGFueQorYXV0aG9yIG9yIGNvcHlyaWdodCBob2xkZXIgYXMgYSByZXN1bHQgb2YgeW91ciBjaG9vc2luZyB0byBmb2xsb3cgYQorbGF0ZXIgdmVyc2lvbi4KKworICAxNS4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4KKworICBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZCitBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUCitIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZCitPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKK1RIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNCitJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YKK0FMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxNi4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuCisKKyAgSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1PRElGSUVTIEFORC9PUiBDT05WRVlTCitUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkKK0dFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRQorVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRgorREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQKK1BBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpLAorRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorU1VDSCBEQU1BR0VTLgorCisgIDE3LiBJbnRlcnByZXRhdGlvbiBvZiBTZWN0aW9ucyAxNSBhbmQgMTYuCisKKyAgSWYgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudHkgYW5kIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5IHByb3ZpZGVkCithYm92ZSBjYW5ub3QgYmUgZ2l2ZW4gbG9jYWwgbGVnYWwgZWZmZWN0IGFjY29yZGluZyB0byB0aGVpciB0ZXJtcywKK3Jldmlld2luZyBjb3VydHMgc2hhbGwgYXBwbHkgbG9jYWwgbGF3IHRoYXQgbW9zdCBjbG9zZWx5IGFwcHJveGltYXRlcworYW4gYWJzb2x1dGUgd2FpdmVyIG9mIGFsbCBjaXZpbCBsaWFiaWxpdHkgaW4gY29ubmVjdGlvbiB3aXRoIHRoZQorUHJvZ3JhbSwgdW5sZXNzIGEgd2FycmFudHkgb3IgYXNzdW1wdGlvbiBvZiBsaWFiaWxpdHkgYWNjb21wYW5pZXMgYQorY29weSBvZiB0aGUgUHJvZ3JhbSBpbiByZXR1cm4gZm9yIGEgZmVlLgorCisgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgICAgICAgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK3N0YXRlIHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworICBJZiB0aGUgcHJvZ3JhbSBkb2VzIHRlcm1pbmFsIGludGVyYWN0aW9uLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0Citub3RpY2UgbGlrZSB0aGlzIHdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICA8cHJvZ3JhbT4gIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisgICAgVGhpcyBwcm9ncmFtIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB5b3VyIHByb2dyYW0ncyBjb21tYW5kcworbWlnaHQgYmUgZGlmZmVyZW50OyBmb3IgYSBHVUkgaW50ZXJmYWNlLCB5b3Ugd291bGQgdXNlIGFuICJhYm91dCBib3giLgorCisgIFlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciBzY2hvb2wsCitpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYgbmVjZXNzYXJ5LgorRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcywgYW5kIGhvdyB0byBhcHBseSBhbmQgZm9sbG93IHRoZSBHTlUgR1BMLCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtCitpbnRvIHByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UKK21heSBjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aAordGhlIGxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4gIEJ1dCBmaXJzdCwgcGxlYXNlIHJlYWQKKzxodHRwOi8vd3d3LmdudS5vcmcvcGhpbG9zb3BoeS93aHktbm90LWxncGwuaHRtbD4uCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9ncHMuYyBiL3JybHAtZXBoZW1lcmlzL2dwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMzU3NDgKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9ncHMuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIGdwcy5jCisgKgorICogQSBmZXcgdXRpbGl0eSBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGxvdyBsZXZlbCBHUFMgZGF0YQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJncHMuaCIKKworCisjZGVmaW5lIEdFVF9GSUVMRF9VKHcsIG5iLCBwb3MpICgoKHcpID4+IChwb3MpKSAmICgoMTw8KG5iKSktMSkpCisjZGVmaW5lIEdFVF9GSUVMRF9TKHcsIG5iLCBwb3MpICgoKGludCkoKHcpIDw8ICgzMi0obmIpLShwb3MpKSkpID4+ICgzMi0obmIpKSkKKworLyoKKyAqIFVucGFja3MgR1BTIFN1YmZyYW1lIDEsMiwzIHBheWxvYWRzICgzICogOCB3b3JkcykKKyAqCisgKiBOb3RlOiBlcGgtPnN2X2lkIGlzIG5vdCBmaWxsZWQgaGVyZSBzaW5jZSBub3QgcHJlc2VudCBpbiB0aG9zZSBzdWJmcmFtZXMKKyAqCisgKiAobm8gcGFyaXR5IGJpdCBjaGVja2luZyBpcyBkb25lLCBvbmx5IHRoZSBsb3dlciAyNCBiaXRzIG9mIGVhY2ggd29yZAorICogIGFyZSB1c2VkKQorICovCitpbnQKK2dwc191bnBhY2tfc2YxMjModWludDMyX3QgKnNmLCBzdHJ1Y3QgZ3BzX2VwaGVtZXJpc19zdiAqZXBoKQoreworCXVpbnQzMl90ICpzZjEgPSAmc2ZbMF07CisJdWludDMyX3QgKnNmMiA9ICZzZls4XTsKKwl1aW50MzJfdCAqc2YzID0gJnNmWzE2XTsKKworCWludCBpb2RlMSwgaW9kZTI7CisKKwllcGgtPndlZWtfbm8JPSBHRVRfRklFTERfVShzZjFbMF0sIDEwLCAxNCk7CisJZXBoLT5jb2RlX29uX2wyCT0gR0VUX0ZJRUxEX1Uoc2YxWzBdLCAgMiwgMTIpOworCWVwaC0+c3ZfdXJhCT0gR0VUX0ZJRUxEX1Uoc2YxWzBdLCAgNCwgIDgpOworCWVwaC0+c3ZfaGVhbHRoCT0gR0VUX0ZJRUxEX1Uoc2YxWzBdLCAgNiwgIDIpOworCWVwaC0+bDJfcF9mbGFnCT0gR0VUX0ZJRUxEX1Uoc2YxWzFdLCAgMSwgMjMpOworCWVwaC0+dF9nZAk9IEdFVF9GSUVMRF9TKHNmMVs0XSwgIDgsICAwKTsKKwllcGgtPmlvZGMJPSAoR0VUX0ZJRUxEX1Uoc2YxWzBdLCAgMiwgIDApIDw8IDgpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjFbNV0sICA4LCAxNik7CisJZXBoLT50X29jCT0gR0VUX0ZJRUxEX1Uoc2YxWzVdLCAxNiwgIDApOworCWVwaC0+YV9mMgk9IEdFVF9GSUVMRF9TKHNmMVs2XSwgIDgsIDE2KTsKKwllcGgtPmFfZjEJPSBHRVRfRklFTERfUyhzZjFbNl0sIDE2LCAgMCk7CisJZXBoLT5hX2YwCT0gR0VUX0ZJRUxEX1Moc2YxWzddLCAyMiwgIDIpOworCisJaW9kZTEJCT0gR0VUX0ZJRUxEX1Uoc2YyWzBdLCAgOCwgMTYpOworCWVwaC0+Y19ycwk9IEdFVF9GSUVMRF9TKHNmMlswXSwgMTYsICAwKTsKKwllcGgtPmRlbHRhX24JPSBHRVRfRklFTERfUyhzZjJbMV0sIDE2LCAgOCk7CisJZXBoLT5tXzAJPSAoR0VUX0ZJRUxEX1Moc2YyWzFdLCAgOCwgIDApIDw8IDI0KSB8IFwKKwkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2YyWzJdLCAyNCwgIDApOworCWVwaC0+Y191Ywk9IEdFVF9GSUVMRF9TKHNmMlszXSwgMTYsICA4KTsKKwllcGgtPmUJCT0gKEdFVF9GSUVMRF9VKHNmMlszXSwgIDgsICAwKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmMls0XSwgMjQsICAwKTsKKwllcGgtPmNfdXMJPSBHRVRfRklFTERfUyhzZjJbNV0sIDE2LCAgOCk7CisJZXBoLT5hX3Bvd2hhbGYJPSAoR0VUX0ZJRUxEX1Uoc2YyWzVdLCAgOCwgIDApIDw8IDI0KSB8IFwKKwkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2YyWzZdLCAyNCwgIDApOworCWVwaC0+dF9vZQk9IEdFVF9GSUVMRF9VKHNmMls3XSwgMTYsICA4KTsKKwllcGgtPmZpdF9mbGFnCT0gR0VUX0ZJRUxEX1Uoc2YyWzddLCAgMSwgIDcpOworCisJZXBoLT5jX2ljCT0gR0VUX0ZJRUxEX1Moc2YzWzBdLCAxNiwgIDgpOworCWVwaC0+b21lZ2FfMAk9IChHRVRfRklFTERfUyhzZjNbMF0sICA4LCAgMCkgPDwgMjQpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjNbMV0sIDI0LCAgMCk7CisJZXBoLT5jX2lzCT0gR0VUX0ZJRUxEX1Moc2YzWzJdLCAxNiwgIDgpOworCWVwaC0+aV8wCT0gKEdFVF9GSUVMRF9TKHNmM1syXSwgIDgsICAwKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmM1szXSwgMjQsICAwKTsKKwllcGgtPmNfcmMJPSBHRVRfRklFTERfUyhzZjNbNF0sIDE2LCAgOCk7CisJZXBoLT53CQk9IChHRVRfRklFTERfUyhzZjNbNF0sICA4LCAgMCkgPDwgMjQpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjNbNV0sIDI0LCAgMCk7CisJZXBoLT5vbWVnYV9kb3QJPSBHRVRfRklFTERfUyhzZjNbNl0sIDI0LCAgMCk7CisJaW9kZTIJCT0gR0VUX0ZJRUxEX1Uoc2YzWzddLCAgOCwgMTYpOworCWVwaC0+aWRvdAk9IEdFVF9GSUVMRF9TKHNmM1s3XSwgMTQsICAyKTsKKworCWVwaC0+X3JzdmQxCT0gR0VUX0ZJRUxEX1Uoc2YxWzFdLCAyMywgIDApOworCWVwaC0+X3JzdmQyCT0gR0VUX0ZJRUxEX1Uoc2YxWzJdLCAyNCwgIDApOworCWVwaC0+X3JzdmQzCT0gR0VUX0ZJRUxEX1Uoc2YxWzNdLCAyNCwgIDApOworCWVwaC0+X3JzdmQ0CT0gR0VUX0ZJRUxEX1Uoc2YxWzRdLCAxNiwgIDgpOworCWVwaC0+YW9kbwk9IEdFVF9GSUVMRF9VKHNmMls3XSwgIDUsICAyKTsKKworCS8qIENoZWNrICYgY3Jvc3MtdmFsaWRhdGUgaW9kY1s3OjBdLCBpb2RlMSwgaW9kZTIgKi8KKwlpZiAoKGlvZGUxICE9IGlvZGUyKSB8fCAoaW9kZTEgIT0gKGVwaC0+aW9kYyAmIDB4ZmYpKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFVucGFja3MgR1BTIFN1YmZyYW1lIDQgb3IgNSBBbG1hbmFjIHBhZ2VzIHBheWxvYWQgKDggd29yZHMpCisgKgorICogKG5vIHBhcml0eSBiaXQgY2hlY2tpbmcgaXMgZG9uZSwgb25seSB0aGUgbG93ZXIgMjQgYml0cyBvZiBlYWNoIHdvcmQKKyAqICBhcmUgdXNlZCkKKyAqLworaW50CitncHNfdW5wYWNrX3NmNDVfYWxtYW5hYyh1aW50MzJfdCAqc2YsIHN0cnVjdCBncHNfYWxtYW5hY19zdiAqYWxtKQoreworCWFsbS0+c3ZfaWQgICAgICA9IEdFVF9GSUVMRF9VKHNmWzBdLCAgNiwgMTYpOworCisJYWxtLT5lCQk9IEdFVF9GSUVMRF9VKHNmWzBdLCAxNiwgIDApOworCWFsbS0+dF9vYQk9IEdFVF9GSUVMRF9VKHNmWzFdLCAgOCwgMTYpOworCWFsbS0+a3NpaQk9IEdFVF9GSUVMRF9TKHNmWzFdLCAxNiwgIDApOworCWFsbS0+b21lZ2FfZG90CT0gR0VUX0ZJRUxEX1Moc2ZbMl0sIDE2LCAgOCk7CisJYWxtLT5zdl9oZWFsdGgJPSBHRVRfRklFTERfVShzZlsyXSwgIDgsICAwKTsKKwlhbG0tPmFfcG93aGFsZgk9IEdFVF9GSUVMRF9VKHNmWzNdLCAyNCwgIDApOworCWFsbS0+b21lZ2FfMAk9IEdFVF9GSUVMRF9TKHNmWzRdLCAyNCwgIDApOworCWFsbS0+dwkJPSBHRVRfRklFTERfUyhzZls1XSwgMjQsICAwKTsKKwlhbG0tPm1fMAk9IEdFVF9GSUVMRF9TKHNmWzZdLCAyNCwgIDApOworCWFsbS0+YV9mMAk9IChHRVRfRklFTERfUyhzZls3XSwgOCwgMTYpIDw8IDMpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZls3XSwgMywgIDIpOworCWFsbS0+YV9mMQk9IEdFVF9GSUVMRF9TKHNmWzddLCAxMSwgIDUpOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2dwcy5oIGIvcnJscC1lcGhlbWVyaXMvZ3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxYjlkNwotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2dwcy5oCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogZ3BzLmgKKyAqCisgKiBIZWFkZXIgdG8gZGVhbCB3aXRoIGxvdyBsZXZlbCBHUFMgZGF0YQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX19HUFNfSF9fCisjZGVmaW5lIF9fR1BTX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisjZGVmaW5lIE1BWF9TVgk2NAorCisKKy8qIElvbm9zcGVyaWMgbW9kZWwgZGF0YSAqLworc3RydWN0IGdwc19pb25vc3BoZXJlX21vZGVsIHsKKwkJCS8qICNiaXRzICBTY2FsZSBmYWN0b3IgIEVmZmVjdGl2ZSAgVW5pdHMgICAgICAgICAgICAqLworCQkJLyogICAgICAgICAgIChMU0IpICAgICAgIHJhbmdlICAgICAgICAgICAgICAgICAgICAgICovCisKKwlpbnQgYWxwaGFfMDsJLyogcyA4ICAgICAgIDJeLTMwICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGFscGhhXzE7CS8qIHMgOCAgICAgICAyXi0yNyAgICAgICAgICAgICAgICAgcyAvIHNlbWktY2lyY2xlcyAqLworCWludCBhbHBoYV8yOwkvKiBzIDggICAgICAgMl4tMjQgICAgICAgICAgICAgICAgIHMgLyAoc2VtaS1jaXJjbGVzKV4yICovCisJaW50IGFscGhhXzM7CS8qIHMgOCAgICAgICAyXi0yNCAgICAgICAgICAgICAgICAgcyAvIChzZW1pLWNpcmNsZXMpXjMgKi8KKwlpbnQgYmV0YV8wOwkvKiBzIDggICAgICAgMl4xMSAgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgYmV0YV8xOwkvKiBzIDggICAgICAgMl4xNCAgICAgICAgICAgICAgICAgIHMgLyBzZW1pLWNpcmNsZXMgKi8KKwlpbnQgYmV0YV8yOwkvKiBzIDggICAgICAgMl4xNiAgICAgICAgICAgICAgICAgIHMgLyAoc2VtaS1jaXJjbGVzKV4yICovCisJaW50IGJldGFfMzsJLyogcyA4ICAgICAgIDJeMTYgICAgICAgICAgICAgICAgICBzIC8gKHNlbWktY2lyY2xlcyleMyAqLworfTsKKworCisvKiBVVEMgbW9kZWwgZGF0YSAqLworc3RydWN0IGdwc191dGNfbW9kZWwgeworCQkJLyogI2JpdHMgIFNjYWxlIGZhY3RvciAgRWZmZWN0aXZlICBVbml0cyAgICAgICAgICAgICovCisJCQkvKiAgICAgICAgICAgKExTQikgICAgICAgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgKi8KKworCWludCBhMDsJCS8qIHMgMzIgICAgICAyXi0zMCAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBhMTsJCS8qIHMgMjQgICAgICAyXi01MCAgICAgICAgICAgICAgICAgc2Vjb25kcyAvIHNlY29uZHMgKi8KKwlpbnQgZGVsdGFfdF9sczsJLyogcyAgOCAgICAgIDEgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IHRfb3Q7CS8qIHUgIDggICAgICAyXjEyICAgICAgIDYwMiwxMTIgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCB3bl90OwkvKiB1ICA4ICAgICAgMSAgICAgICAgICAgICAgICAgICAgIHdlZWtzICAgICAgICAgICAgKi8KKwlpbnQgd25fbHNmOwkvKiB1ICA4ICAgICAgMSAgICAgICAgICAgICAgICAgICAgIHdlZWtzICAgICAgICAgICAgKi8KKwlpbnQgZG47CQkvKiB1ICA4ICAgICAgMSAgICAgICAgICAgICAgICA3ICAgIGRheXMgICAgICAgICAgICAgKi8KKwlpbnQgZGVsdGFfdF9sc2Y7LyogcyAgOCAgICAgIDEgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCit9OworCisKKy8qIEFsbWFuYWNoIGRhdGEgKi8KK3N0cnVjdCBncHNfYWxtYW5hY19zdiB7CisJaW50IHN2X2lkOworCWludCBzdl9oZWFsdGg7CisKKwkJCS8qICNiaXRzICBTY2FsZSBmYWN0b3IgIEVmZmVjdGl2ZSAgVW5pdHMgICAgICAgICAgICAqLworCQkJLyogICAgICAgICAgIChMU0IpICAgICAgIHJhbmdlICAgICAgICAgICAgICAgICAgICAgICovCisKKwlpbnQgZTsJCS8qIHUgMTYgICAgICAyXi0yMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWludCB0X29hOwkvKiB1ICA4ICAgICAgMl4xMiAgICAgICA2MDIsMTEyICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQga3NpaTsJLyogcyAxNiAgICAgIDJeLTE5ICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IG9tZWdhX2RvdDsJLyogcyAxNiAgICAgIDJeLTM4ICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgLyBzICovCisJaW50IGFfcG93aGFsZjsJLyogdSAyNCAgICAgIDJeLTExICAgICAgICAgICAgICAgICBtZXRlcnMgICAgICAgICAgICovCisJaW50IG9tZWdhXzA7CS8qIHMgMjQgICAgICAyXi0yMyAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLworCWludCB3OwkJLyogcyAyNCAgICAgIDJeLTIzICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IG1fMDsJLyogcyAyNCAgICAgIDJeLTIzICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IGFfZjA7CS8qIHMgMTEgICAgICAyXi0yMCAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBhX2YxOwkvKiBzIDExICAgICAgMl4tMzggICAgICAgICAgICAgICAgIHNlY29uZHMgLyBzZWNvbmRzICovCit9OworCitzdHJ1Y3QgZ3BzX2FsbWFuYWMgeworCWludCB3bmE7CisJaW50IG5fc3Y7CisJc3RydWN0IGdwc19hbG1hbmFjX3N2IHN2c1tNQVhfU1ZdOworfTsKKworCisvKiBFcGhlbWVyaXMgZGF0YSAqLworc3RydWN0IGdwc19lcGhlbWVyaXNfc3YgeworCWludCBzdl9pZDsKKworCQkJLyogI2JpdHMgIFNjYWxlIGZhY3RvciAgRWZmZWN0aXZlICBVbml0cyAgICAgICAgICAgICovCisJCQkvKiAgICAgICAgICAgKExTQikgICAgICAgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgKi8KKworCWludCBjb2RlX29uX2wyOwkvKiB1ICAyICAgICAgMSAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgd2Vla19ubzsJLyogdSAxMCAgICAgIDEgICAgICAgICAgICAgICAgICAgICB3ZWVrICAgICAgICAgICAgICovCisJaW50IGwyX3BfZmxhZzsJLyogdSAgMSAgICAgIDEgICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICovCisJaW50IHN2X3VyYTsJLyogdSAgNCAgICAgIC8gICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICovCisJaW50IHN2X2hlYWx0aDsJLyogdSAgNiAgICAgIC8gICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICovCisJaW50IHRfZ2Q7CS8qIHMgIDggICAgICAyXi0zMSAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBpb2RjOwkvKiB1IDEwICAgICAgLyAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgdF9vYzsJLyogdSAxNiAgICAgIDJeNCAgICAgICAgNjA0LDc4NCAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGFfZjI7CS8qIHMgIDggICAgICAyXi01NSAgICAgICAgICAgICAgICAgc2VjIC8gc2VjXjIgICAgICAqLworCWludCBhX2YxOwkvKiBzIDE2ICAgICAgMl4tNDMgICAgICAgICAgICAgICAgIHNlYyAvIHNlYyAgICAgICAgKi8KKwlpbnQgYV9mMDsJLyogcyAyMiAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisKKwlpbnQgY19yczsJLyogcyAxNiAgICAgIDJeLTUgICAgICAgICAgICAgICAgICBtZXRlcnMgICAgICAgICAgICovCisJaW50IGRlbHRhX247CS8qIHMgMTYgICAgICAyXi00MyAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzIC8gcyAqLworCWludCBtXzA7CS8qIHMgMzIgICAgICAyXi0zMSAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLworCWludCBjX3VjOwkvKiBzIDE2ICAgICAgMl4tMjkgICAgICAgICAgICAgICAgIHJhZGlhbnMgICAgICAgICAgKi8KKwl1bnNpZ25lZCBpbnQgZTsJLyogdSAzMiAgICAgIDJeLTMzICAgICAgMC4wMyAgICAgICAvICAgICAgICAgICAgICAgICovCisJaW50IGNfdXM7CS8qIHMgMTYgICAgICAyXi0yOSAgICAgICAgICAgICAgICAgcmFkaWFucyAgICAgICAgICAqLworCXVuc2lnbmVkIGludCBhX3Bvd2hhbGY7IC8qIHUgMzIgIDJeLTE5ICAgICAgICAgICAgIG1ldGVyc14oMS8yKSAgICAgKi8KKwlpbnQgdF9vZTsJLyogdSAxNiAgICAgIDJeNCAgICAgICAgNjA0LDc4NCAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGZpdF9mbGFnOwkvKiB1ICAxICAgICAgLyAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKworCWludCBjX2ljOwkvKiBzIDE2ICAgICAgMl4tMjkgICAgICAgICAgICAgICAgIHJhZGlhbnMgICAgICAgICAgKi8KKwlpbnQgb21lZ2FfMDsJLyogcyAzMiAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IGNfaXM7CS8qIHMgMTYgICAgICAyXi0yOSAgICAgICAgICAgICAgICAgcmFkaWFucyAgICAgICAgICAqLworCWludCBpXzA7CS8qIHMgMzIgICAgICAyXi0zMSAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLworCWludCBjX3JjOwkvKiBzIDE2ICAgICAgMl4tNSAgICAgICAgICAgICAgICAgIG1ldGVycyAgICAgICAgICAgKi8KKwlpbnQgdzsJCS8qIHMgMzIgICAgICAyXi0zMSAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzICAgICAqLworCWludCBvbWVnYV9kb3Q7CS8qIHMgMjQgICAgICAyXi00MyAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzIC8gcyAqLworCWludCBpZG90OwkvKiBzIDE0ICAgICAgMl4tNDMgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAvIHMgKi8KKworCWludCBfcnN2ZDE7CS8qIDIzIGJpdHMgKi8KKwlpbnQgX3JzdmQyOwkvKiAyNCBiaXRzICovCisJaW50IF9yc3ZkMzsJLyogMjQgYml0cyAqLworCWludCBfcnN2ZDQ7CS8qIDE2IGJpdHMgKi8KKwlpbnQgYW9kbzsJLyogOCBiaXRzICBOb3Qgc3VyZSBpdCBuZWVkcyB0byBiZSBoZXJlIC4uLiAqLworfTsKKworc3RydWN0IGdwc19lcGhlbWVyaXMgeworCWludCBuX3N2OworCXN0cnVjdCBncHNfZXBoZW1lcmlzX3N2IHN2c1tNQVhfU1ZdOworfTsKKworCisvKiBSZWZlcmVuY2UgcG9zaXRpb24gKi8KK3N0cnVjdCBncHNfcmVmX3BvcyB7CS8qIFdTRzg0IGVsbGlwc29pZCAqLworCWRvdWJsZSBsYXRpdHVkZTsJLyogZGVnICovCisJZG91YmxlIGxvbmdpdHVkZTsJLyogZGVnICovCisJZG91YmxlIGFsdGl0dWRlOwkvKiBtIGFib3ZlIGVsbGlwc29pZCAqLworfTsKKworCisvKiBSZWZlcmVuY2UgdGltZSAqLworc3RydWN0IGdwc19yZWZfdGltZSB7CisJaW50IHduOwkJCS8qIEdQUyB3ZWVrIG51bWJlciAqLworCWRvdWJsZSB0b3c7CQkvKiBpbiBzZWNvbmRzICovCit9OworCisKKy8qIEFsbCBhc3Npc3QgZGF0YSAqLworI2RlZmluZSBHUFNfRklFTERfSU9OT1NQSEVSRQkoMTw8MCkKKyNkZWZpbmUgR1BTX0ZJRUxEX1VUQwkJKDE8PDEpCisjZGVmaW5lIEdQU19GSUVMRF9BTE1BTkFDCSgxPDwyKQorI2RlZmluZSBHUFNfRklFTERfRVBIRU1FUklTCSgxPDwzKQorI2RlZmluZSBHUFNfRklFTERfUkVGUE9TCSgxPDw0KQorI2RlZmluZSBHUFNfRklFTERfUkVGVElNRQkoMTw8NSkKKworc3RydWN0IGdwc19hc3Npc3RfZGF0YSB7CisJaW50IGZpZWxkczsKKwlzdHJ1Y3QgZ3BzX2lvbm9zcGhlcmVfbW9kZWwJaW9ub3NwaGVyZTsKKwlzdHJ1Y3QgZ3BzX3V0Y19tb2RlbAkJdXRjOworCXN0cnVjdCBncHNfYWxtYW5hYwkJYWxtYW5hYzsKKwlzdHJ1Y3QgZ3BzX2VwaGVtZXJpcwkJZXBoZW1lcmlzOworCXN0cnVjdCBncHNfcmVmX3BvcwkJcmVmX3BvczsKKwlzdHJ1Y3QgZ3BzX3JlZl90aW1lCQlyZWZfdGltZTsKK307CisKKworLyogR1BTIFN1YmZyYW1lIHV0aWxpdHkgbWV0aG9kcyAoc2VlIGdwcy5jIGZvciBkZXRhaWxzKSAqLworaW50IGdwc191bnBhY2tfc2YxMjModWludDMyX3QgKnNmLCBzdHJ1Y3QgZ3BzX2VwaGVtZXJpc19zdiAqZXBoKTsKK2ludCBncHNfdW5wYWNrX3NmNDVfYWxtYW5hYyh1aW50MzJfdCAqc2YsIHN0cnVjdCBncHNfYWxtYW5hY19zdiAqYWxtKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19HUFNfSF9fICovCisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL21haW4uYyBiL3JybHAtZXBoZW1lcmlzL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjAyNWEyCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvbWFpbi5jCkBAIC0wLDAgKzEsOTkgQEAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiZ3BzLmgiCisjaW5jbHVkZSAidWJ4LmgiCisjaW5jbHVkZSAidWJ4LXBhcnNlLmgiCisjaW5jbHVkZSAicnJscC5oIgorCitzdGF0aWMgaW50Citkb191YnhfcmVhZChzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWludCBydiwgZmQsIGk7CisJc3RydWN0IHN0YXQgc3Q7CisJdm9pZCAqYnVmOworCisJLyogTG9hZCBmaWxlICovCisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcnYgPSBmc3RhdChmZCwgJnN0KTsKKwlpZiAocnYgPCAwKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWJ1ZiA9IG1hbGxvYyhzdC5zdF9zaXplKTsKKwlpZiAoIWJ1ZikgeworCQljbG9zZShmZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlydiA9IHJlYWQoZmQsIGJ1Ziwgc3Quc3Rfc2l6ZSk7CisJaWYgKHJ2ICE9IHN0LnN0X3NpemUpIHsKKwkJZnJlZShidWYpOworCQljbG9zZShmZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBQYXJzZSBlYWNoIG1lc3NhZ2UgKi8KKwlmb3IgKGk9MDsgaTxzdC5zdF9zaXplOykgeworCQlpbnQgcnY7CisJCXJ2ID0gdWJ4X21zZ19kaXNwYXRjaCh1YnhfcGFyc2VfZHQsIGJ1ZiArIGksIHN0LnN0X3NpemUgLSBpLCBncHMpOworCQlpZiAocnYgPCAwKQorCQkJaSsrOwkvKiBJbnZhbGlkIG1lc3NhZ2U6IHRyeSBvbmUgYnl0ZSBsYXRlciAqLworCQllbHNlCisJCQlpICs9IHJ2OworCX0KKworCS8qIERvbmUgKi8KKwlmcmVlKGJ1Zik7CisJY2xvc2UoZmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RvX3JybHAoc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzKQoreworCXN0cnVjdCBycmxwX2Fzc2lzdF9yZXEgYXI7CisJdm9pZCAqcGR1c1s2NF07CisJaW50IGxlbls2NF07CisJaW50IGksIHJ2OworCisJY2hhciAqdGVzdCA9ICJceDI4XHgwMFx4ODBceDEwXHgwMVx4MzJceDAwXHgxOVx4NEZceDA3XHgxNVx4MDQiOworCisJcnJscF9kZWNvZGVfYXNzaXN0YW5jZV9yZXF1ZXN0KCZhciwgdGVzdCwgMTIpOworCXByaW50ZigiJTA4eCAlMDE2bGx4XG4iLCBhci5yZXFfZWxlbXMsIChsb25nIGxvbmcgdW5zaWduZWQpIGFyLmVwaF9zdnMpOworCisJYXIucmVxX2VsZW1zID0gLTE7CisJYXIuZXBoX3N2cyA9IC0xTEw7CisJcnYgPSBycmxwX2dwc19hc3Npc3RfcGR1cyhncHMsICZhciwgcGR1cywgbGVuLCA2NCk7CisJcHJpbnRmKCIlZFxuIiwgcnYpOworCWZvciAoaT0wOyBpPHJ2OyBpKyspIHsKKwkJcHJpbnRmKCIlcCAlZFxuIiwgcGR1c1tpXSwgbGVuW2ldKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSBncHM7CisJaW50IHJ2OworCisJbWVtc2V0KCZncHMsIDB4MDAsIHNpemVvZihncHMpKTsKKworCXJ2ID0gZG9fdWJ4X3JlYWQoJmdwcywgImRhdGEudWJ4Iik7CisJCisJcnYgPSBkb19ycmxwKCZncHMpOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL3JybHAuYyBiL3JybHAtZXBoZW1lcmlzL3JybHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjBjM2FiCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvcnJscC5jCkBAIC0wLDAgKzEsNjQ4IEBACisvKgorICogcnJscC5jCisgKgorICogUlJMUCBpbXBsZW1lbnRhdGlvbgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiZ3BzLmgiCisjaW5jbHVkZSAicnJscC5oIgorCisjaW5jbHVkZSA8UERVLmg+CisjaW5jbHVkZSA8R1BTLUFzc2lzdERhdGEuaD4KKyNpbmNsdWRlIDxOYXZpZ2F0aW9uTW9kZWwuaD4KKyNpbmNsdWRlIDxJb25vc3BoZXJpY01vZGVsLmg+CisjaW5jbHVkZSA8VVRDTW9kZWwuaD4KKyNpbmNsdWRlIDxBbG1hbmFjLmg+CisjaW5jbHVkZSA8UmVmTG9jYXRpb24uaD4KKyNpbmNsdWRlIDxSZWZlcmVuY2VUaW1lLmg+CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSUkxQIEFzc2lzdGFuY2UgcmVxdWVzdCBkZWNvZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXt7eyAqLworLyogRGVjb2RlIGFuZCB2YWxpZGF0ZSB0aGUgYXNzaXN0YW5jZSBkYXRhIHJlcXVlc3QgbWVzc2FnZXMuCisgKiBTZWUgc2VjdGlvbiAxMC4xMCBvZgorICogIC4gRVRTSSBUUyAxNDkgMDMxIFY4LjEuMCAoMjAwOS0wMSkKKyAqICAuIDNHUFAgVFMgNDkuMDMxIHZlcnNpb24gOC4xLjAgUmVsZWFzZSA4CisgKi8KKworLyogUGFja2VkIHN0cnVjdHVyZSBmcm9tIDQ5LjAzMSBzcGVjIChSR0EgPSBSZXF1ZXN0IEdQUyBBc3Npc3RhbmNlKSAqLworCisjZGVmaW5lIFJSTFBfUkdBMF9BTE1BTkFDCSgxPDwwKQorI2RlZmluZSBSUkxQX1JHQTBfVVRDX01PREVMCSgxPDwxKQorI2RlZmluZSBSUkxQX1JHQTBfSU9OT19NT0RFTAkoMTw8MikKKyNkZWZpbmUgUlJMUF9SR0EwX05BVl9NT0RFTAkoMTw8MykKKyNkZWZpbmUgUlJMUF9SR0EwX0RHUFMJCSgxPDw0KQorI2RlZmluZSBSUkxQX1JHQTBfUkVGX0xPQwkoMTw8NSkKKyNkZWZpbmUgUlJMUF9SR0EwX1JFRl9USU1FCSgxPDw2KQorI2RlZmluZSBSUkxQX1JHQTBfQUNRX0FTU0lTVAkoMTw8NykKKworI2RlZmluZSBSUkxQX1JHQTFfUkVBTFRJTUVfSU5UCSgxPDwwKQorI2RlZmluZSBSUkxQX1JHQTFfRVBIX0VYVAkoMTw8MSkKKyNkZWZpbmUgUlJMUF9SR0ExX0VQSF9FWFRfQ0hFQ0sJKDE8PDIpCisKK3N0cnVjdCBycmxwX3JnYV9oZHIgeworCXVpbnQ4X3QgaXRlbXMwOworCXVpbnQ4X3QgaXRlbXMxOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJybHBfcmdhX2VwaF9zdiB7CisJdWludDhfdCBzdl9pZDsJCS8qIFs3OjZdIHJlc2VydmVkLCBbNTowXSBzdl9pZCAqLworCXVpbnQ4X3QgaW9kZTsJCS8qIGxhdGVzdCBlcGggaW4gdGhlIE1TIG1lbW9yeSBpbiBob3VycyAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJybHBfcmdhX2VwaCB7CisJdWludDhfdCB3bl9oaTsJCS8qIFs3OjZdID0gd25bOTo4XSAqLworCXVpbnQ4X3Qgd25fbG87CQkvKiB3bls3OjBdICovCisJdWludDhfdCB0b2U7CQkvKiBsYXRlc3QgZXBoIGluIHRoZSBNUyBtZW1vcnkgaW4gaG91cnMgKi8KKwl1aW50OF90IG5zYXRfdG10b2U7CS8qIFs3OjRdIG5zdGF0LCBbMzowXSBULVRvZSBsaW1pdCAqLworCXN0cnVjdCBycmxwX3JnYV9lcGhfc3Ygc3ZzWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJybHBfcmdhX2VwaF9leHQgeworCXVpbnQ4X3QgdmFsaWRpdHk7CS8qIGluIDQgaG91cnMgdW5pdHMgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBycmxwX3JnYV9lcGhfZXh0X2NoZWNrIHsKKwkJLyogd2Vla3MgYXJlIGluIGdwcyB3ZWVrIG1vZHVsbyA0ICovCisJdWludDhfdCB3bl9iZWdpbl9lbmQ7CS8qIFs3OjRdIGJlZ2luLCBbMzowXSBlbmQgKi8KKwl1aW50OF90IHRvd19iZWdpbjsKKwl1aW50OF90IHRvd19lbmQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qIFBhcnNpbmcgZnVuY3Rpb24gKi8KKworaW50CitycmxwX2RlY29kZV9hc3Npc3RhbmNlX3JlcXVlc3QoCisJc3RydWN0IHJybHBfYXNzaXN0X3JlcSAqYXIsCisJdm9pZCAqcmVxLCBpbnQgcmVxX2xlbikKK3sKKwlzdHJ1Y3QgcnJscF9yZ2FfaGRyICpoZHIgPSBOVUxMOworCXN0cnVjdCBycmxwX3JnYV9lcGggKmVwaCA9IE5VTEw7CisJc3RydWN0IHJybHBfcmdhX2VwaF9leHQgKmVwaF9leHQgPSBOVUxMOworCXN0cnVjdCBycmxwX3JnYV9lcGhfZXh0X2NoZWNrICplcGhfZXh0X2NoZWNrID0gTlVMTDsKKwlpbnQgcCA9IDA7CisKKwkvKiBSZXNldCAqLworCWFyLT5yZXFfZWxlbXMgPSAwOworCWFyLT5lcGhfc3ZzID0gMDsKKworCS8qIFBhcnNlIG1lc3NhZ2UgKi8KKwloZHIgPSByZXE7CisJcCArPSBzaXplb2Yoc3RydWN0IHJybHBfcmdhX2hkcik7CisJaWYgKHAgPiByZXFfbGVuKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoaGRyLT5pdGVtczAgJiBSUkxQX1JHQTBfTkFWX01PREVMKSB7CisJCWVwaCA9IHJlcSArIHA7CisJCXAgKz0gc2l6ZW9mKHN0cnVjdCBycmxwX3JnYV9lcGgpOworCQlpZiAocCA+IHJlcV9sZW4pCisJCQlyZXR1cm4gLTE7CisJCXAgKz0gKGVwaC0+bnNhdF90bXRvZSA+PiA0KSAqIHNpemVvZihzdHJ1Y3QgcnJscF9yZ2FfZXBoX3N2KTsKKwkJaWYgKHAgPiByZXFfbGVuKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmIChoZHItPml0ZW1zMSAmIFJSTFBfUkdBMV9FUEhfRVhUKSB7CisJCWVwaF9leHQgPSByZXEgKyBwOworCQlwICs9IHNpemVvZihzdHJ1Y3QgcnJscF9yZ2FfZXBoX2V4dCk7CisJCWlmIChwID4gcmVxX2xlbikKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaGRyLT5pdGVtczEgJiBSUkxQX1JHQTFfRVBIX0VYVF9DSEVDSykgeworCQllcGhfZXh0X2NoZWNrID0gcmVxICsgcDsKKwkJcCArPSBzaXplb2Yoc3RydWN0IHJybHBfcmdhX2VwaF9leHRfY2hlY2spOworCQlpZiAocCA+IHJlcV9sZW4pCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHAgIT0gcmVxX2xlbikKKwkJcmV0dXJuIC0yOyAvKiBub3QgYWxsIGJ5dGVzIGNvbnN1bWVkID8/PyAqLworCisJLyogUHJpbnQgYSB3YXJuaW5nIGZvciB1bnN1cHBvcnRlZCByZXF1ZXN0cyAqLworCWlmICgoZXBoX2V4dCAhPSBOVUxMKSB8fAorCSAgICAoZXBoX2V4dF9jaGVjayAhPSBOVUxMKSB8fAorCSAgICAoaGRyLT5pdGVtczAgJiAoUlJMUF9SR0EwX0RHUFMgfCBSUkxQX1JHQTBfQUNRX0FTU0lTVCkpIHx8CisJICAgIChoZHItPml0ZW1zMSAmIFJSTFBfUkdBMV9SRUFMVElNRV9JTlQpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiW3ddIFVuc3VwcG9ydGVkIGFzc2lzdGFuY2UgZGF0YSByZXF1ZXN0ZWQsIGlnbm9yZWQgLi4uXG4iKTsKKwl9CisKKwkvKiBDb3B5IHRoZSByZXF1ZXN0ICovCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX0FMTUFOQUMpCisJCWFyLT5yZXFfZWxlbXMgfD0gUlJMUF9BUl9BTE1BTkFDOworCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX1VUQ19NT0RFTCkKKwkJYXItPnJlcV9lbGVtcyB8PSBSUkxQX0FSX1VUQ19NT0RFTDsKKworCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9JT05PX01PREVMKQorCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfSU9OT19NT0RFTDsKKworCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9SRUZfTE9DKQorCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfUkVGX0xPQzsKKworCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9SRUZfVElNRSkKKwkJYXItPnJlcV9lbGVtcyB8PSBSUkxQX0FSX1JFRl9USU1FOworCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX05BVl9NT0RFTCkgeworCQlpbnQgaSwgbl9zdnMgPSBlcGgtPm5zYXRfdG10b2UgPj4gNDsKKwkJYXItPnJlcV9lbGVtcyB8PSBSUkxQX0FSX0VQSEVNRVJJUzsKKwkJZm9yIChpPTA7IGk8bl9zdnM7IGkrKykKKwkJCWFyLT5lcGhfc3ZzIHw9ICgxVUxMIDw8IChlcGgtPnN2c1tpXS5zdl9pZCAtIDEpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogfX19ICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSUkxQIGVsZW1lbnRzIGZpbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXt7eyAqLworCisJLyogSGVscGVycyAqLworCitzdGF0aWMgdm9pZAorX3RzXzIzXzAzMl9zdG9yZV9sYXRpdHVkZShkb3VibGUgbGF0LCB1aW50OF90ICpiKQoreworCXVpbnQzMl90IHg7CisJeCA9ICh1aW50MzJfdCkgZmxvb3IoZmFicyhsYXQvOTAuMCkgKiAoKGRvdWJsZSkoMTw8MjMpKSk7CisJaWYgKHggPj0gKDE8PDIzKSkKKwkJeCA9ICgxPDwyMykgLSAxOworCWlmIChsYXQgPCAwLjApCisJCXggfD0gKDE8PDIzKTsKKwliWzBdID0gKHggPj4gMTYpICYgMHhmZjsKKwliWzFdID0gKHggPj4gIDgpICYgMHhmZjsKKwliWzJdID0gIHggICAgICAgICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQKK190c18yM18wMzJfc3RvcmVfbG9uZ2l0dWRlKGRvdWJsZSBsb24sIHVpbnQ4X3QgKmIpCit7CisJaW50MzJfdCB4OworCXggPSBmbG9vcigobG9uLzM2MC4wKSAqICgoZG91YmxlKSgxPDwyNCkpKTsKKwlpZiAoeCA+PSAoMTw8MjMpKQorCQl4ID0gMHgwMDdmZmZmZjsKKwllbHNlIGlmICh4IDwgLSgxPDwyMykpCisJCXggPSAweDAwODAwMDAwOworCWJbMF0gPSAoeCA+PiAxNikgJiAweGZmOworCWJbMV0gPSAoeCA+PiAgOCkgJiAweGZmOworCWJbMl0gPSAgeCAgICAgICAgJiAweGZmOworfQorCitzdGF0aWMgdm9pZAorX3RzXzIzXzAzMl9zdG9yZV9hbHRpdHVkZShkb3VibGUgYWx0LCB1aW50OF90ICpiKQoreworCWludCBhbHRfaSA9IChpbnQpZmFicyhhbHQpOworCWJbMF0gPSAoKGFsdF9pID4+IDgpICYgMHg3ZikgfCAoYWx0PDAuMCA/IDB4ODAgOiAweDAwKTsKKwliWzFdID0gYWx0X2kgJiAweGZmOworfQorCisKKwkvKiBGaWxsIG1ldGhvZHMgKi8KKworc3RhdGljIHZvaWQKK19ycmxwX2ZpbGxfbmF2aWdhdGlvbl9tb2RlbF9lbGVtZW50KAorCXN0cnVjdCBOYXZNb2RlbEVsZW1lbnQgKnJybHBfbm1lLAorCXN0cnVjdCBncHNfZXBoZW1lcmlzX3N2ICpncHNfZXBoX3N2KQoreworCXN0cnVjdCBVbmNvbXByZXNzZWRFcGhlbWVyaXMgKnJybHBfZXBoOworCisJcnJscF9ubWUtPnNhdFN0YXR1cy5wcmVzZW50ID0gU2F0U3RhdHVzX1BSX25ld1NhdGVsbGl0ZUFuZE1vZGVsVUM7CisJcnJscF9ubWUtPnNhdGVsbGl0ZUlEID0gZ3BzX2VwaF9zdi0+c3ZfaWQ7CisKKwlycmxwX2VwaCA9ICZycmxwX25tZS0+c2F0U3RhdHVzLmNob2ljZS5uZXdTYXRlbGxpdGVBbmRNb2RlbFVDOworCisJcnJscF9lcGgtPmVwaGVtQ29kZU9uTDIgICA9IGdwc19lcGhfc3YtPmNvZGVfb25fbDI7CisJcnJscF9lcGgtPmVwaGVtVVJBICAgICAgICA9IGdwc19lcGhfc3YtPnN2X3VyYTsKKwlycmxwX2VwaC0+ZXBoZW1TVmhlYWx0aCAgID0gZ3BzX2VwaF9zdi0+c3ZfaGVhbHRoOworCXJybHBfZXBoLT5lcGhlbUlPREMgICAgICAgPSBncHNfZXBoX3N2LT5pb2RjOworCXJybHBfZXBoLT5lcGhlbUwyUGZsYWcgICAgPSBncHNfZXBoX3N2LT5sMl9wX2ZsYWc7CisJcnJscF9lcGgtPmVwaGVtVGdkICAgICAgICA9IGdwc19lcGhfc3YtPnRfZ2Q7CisJcnJscF9lcGgtPmVwaGVtVG9jICAgICAgICA9IGdwc19lcGhfc3YtPnRfb2M7CisJcnJscF9lcGgtPmVwaGVtQUYyICAgICAgICA9IGdwc19lcGhfc3YtPmFfZjI7CisJcnJscF9lcGgtPmVwaGVtQUYxICAgICAgICA9IGdwc19lcGhfc3YtPmFfZjE7CisJcnJscF9lcGgtPmVwaGVtQUYwICAgICAgICA9IGdwc19lcGhfc3YtPmFfZjA7CisJcnJscF9lcGgtPmVwaGVtQ3JzICAgICAgICA9IGdwc19lcGhfc3YtPmNfcnM7CisJcnJscF9lcGgtPmVwaGVtRGVsdGFOICAgICA9IGdwc19lcGhfc3YtPmRlbHRhX247CisJcnJscF9lcGgtPmVwaGVtTTAgICAgICAgICA9IGdwc19lcGhfc3YtPm1fMDsKKwlycmxwX2VwaC0+ZXBoZW1DdWMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y191YzsKKwlycmxwX2VwaC0+ZXBoZW1FICAgICAgICAgID0gZ3BzX2VwaF9zdi0+ZTsKKwlycmxwX2VwaC0+ZXBoZW1DdXMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y191czsKKwlycmxwX2VwaC0+ZXBoZW1BUG93ZXJIYWxmID0gZ3BzX2VwaF9zdi0+YV9wb3doYWxmOworCXJybHBfZXBoLT5lcGhlbVRvZSAgICAgICAgPSBncHNfZXBoX3N2LT50X29lOworCXJybHBfZXBoLT5lcGhlbUZpdEZsYWcgICAgPSBncHNfZXBoX3N2LT5maXRfZmxhZzsKKwlycmxwX2VwaC0+ZXBoZW1BT0RBICAgICAgID0gZ3BzX2VwaF9zdi0+YW9kbzsKKwlycmxwX2VwaC0+ZXBoZW1DaWMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y19pYzsKKwlycmxwX2VwaC0+ZXBoZW1PbWVnYUEwICAgID0gZ3BzX2VwaF9zdi0+b21lZ2FfMDsKKwlycmxwX2VwaC0+ZXBoZW1DaXMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y19pczsKKwlycmxwX2VwaC0+ZXBoZW1JMCAgICAgICAgID0gZ3BzX2VwaF9zdi0+aV8wOworCXJybHBfZXBoLT5lcGhlbUNyYyAgICAgICAgPSBncHNfZXBoX3N2LT5jX3JjOworCXJybHBfZXBoLT5lcGhlbVcgICAgICAgICAgPSBncHNfZXBoX3N2LT53OworCXJybHBfZXBoLT5lcGhlbU9tZWdhQURvdCAgPSBncHNfZXBoX3N2LT5vbWVnYV9kb3Q7CisJcnJscF9lcGgtPmVwaGVtSURvdCAgICAgICA9IGdwc19lcGhfc3YtPmlkb3Q7CisKKwlycmxwX2VwaC0+ZXBoZW1TRjFSc3ZkLnJlc2VydmVkMSA9IGdwc19lcGhfc3YtPl9yc3ZkMTsKKwlycmxwX2VwaC0+ZXBoZW1TRjFSc3ZkLnJlc2VydmVkMiA9IGdwc19lcGhfc3YtPl9yc3ZkMjsKKwlycmxwX2VwaC0+ZXBoZW1TRjFSc3ZkLnJlc2VydmVkMyA9IGdwc19lcGhfc3YtPl9yc3ZkMzsKKwlycmxwX2VwaC0+ZXBoZW1TRjFSc3ZkLnJlc2VydmVkNCA9IGdwc19lcGhfc3YtPl9yc3ZkNDsKK30KKworc3RhdGljIHZvaWQKK19ycmxwX2ZpbGxfYWxtYW5hY19lbGVtZW50KAorCXN0cnVjdCBBbG1hbmFjRWxlbWVudCAqcnJscF9hZSwKKwlzdHJ1Y3QgZ3BzX2FsbWFuYWNfc3YgKmdwc19hbG1fc3YpCit7CisJcnJscF9hZS0+c2F0ZWxsaXRlSUQgPSBncHNfYWxtX3N2LT5zdl9pZDsKKworCXJybHBfYWUtPmFsbWFuYWNFICAgICAgICAgID0gZ3BzX2FsbV9zdi0+ZTsKKwlycmxwX2FlLT5hbGFtYW5hY1RvYSAgICAgICA9IGdwc19hbG1fc3YtPnRfb2E7CisJcnJscF9hZS0+YWxtYW5hY0tzaWkgICAgICAgPSBncHNfYWxtX3N2LT5rc2lpOworCXJybHBfYWUtPmFsbWFuYWNPbWVnYURvdCAgID0gZ3BzX2FsbV9zdi0+b21lZ2FfZG90OworCXJybHBfYWUtPmFsbWFuYWNTVmhlYWx0aCAgID0gZ3BzX2FsbV9zdi0+c3ZfaGVhbHRoOworCXJybHBfYWUtPmFsbWFuYWNBUG93ZXJIYWxmID0gZ3BzX2FsbV9zdi0+YV9wb3doYWxmOworCXJybHBfYWUtPmFsbWFuYWNPbWVnYTAgICAgID0gZ3BzX2FsbV9zdi0+b21lZ2FfMDsKKwlycmxwX2FlLT5hbG1hbmFjVyAgICAgICAgICA9IGdwc19hbG1fc3YtPnc7CisJcnJscF9hZS0+YWxtYW5hY00wICAgICAgICAgPSBncHNfYWxtX3N2LT5tXzA7CisJcnJscF9hZS0+YWxtYW5hY0FGMCAgICAgICAgPSBncHNfYWxtX3N2LT5hX2YwOworCXJybHBfYWUtPmFsbWFuYWNBRjEgICAgICAgID0gZ3BzX2FsbV9zdi0+YV9mMTsKKworfQorCitzdGF0aWMgdm9pZAorX3JybHBfZmlsbF9pb25vc3BoZXJpY19tb2RlbCgKKwlzdHJ1Y3QgSW9ub3NwaGVyaWNNb2RlbCAqcnJscF9pb25vLAorCXN0cnVjdCBncHNfaW9ub3NwaGVyZV9tb2RlbCAqZ3BzX2lvbm8pCit7CisJcnJscF9pb25vLT5hbGZhMCA9IGdwc19pb25vLT5hbHBoYV8wOworCXJybHBfaW9uby0+YWxmYTEgPSBncHNfaW9uby0+YWxwaGFfMTsKKwlycmxwX2lvbm8tPmFsZmEyID0gZ3BzX2lvbm8tPmFscGhhXzI7CisJcnJscF9pb25vLT5hbGZhMyA9IGdwc19pb25vLT5hbHBoYV8zOworCXJybHBfaW9uby0+YmV0YTAgPSBncHNfaW9uby0+YmV0YV8wOworCXJybHBfaW9uby0+YmV0YTEgPSBncHNfaW9uby0+YmV0YV8xOworCXJybHBfaW9uby0+YmV0YTIgPSBncHNfaW9uby0+YmV0YV8yOworCXJybHBfaW9uby0+YmV0YTMgPSBncHNfaW9uby0+YmV0YV8zOworfQorCitzdGF0aWMgdm9pZAorX3JybHBfZmlsbF91dGNfbW9kZWwoCisJc3RydWN0IFVUQ01vZGVsICpycmxwX3V0YywKKwlzdHJ1Y3QgZ3BzX3V0Y19tb2RlbCAqZ3BzX3V0YykKK3sKKwlycmxwX3V0Yy0+dXRjQTEgICAgICAgID0gZ3BzX3V0Yy0+YTE7CisJcnJscF91dGMtPnV0Y0EwICAgICAgICA9IGdwc191dGMtPmEwOworCXJybHBfdXRjLT51dGNUb3QgICAgICAgPSBncHNfdXRjLT50X290OworCXJybHBfdXRjLT51dGNXTnQgICAgICAgPSBncHNfdXRjLT53bl90ICYgMHhmZjsKKwlycmxwX3V0Yy0+dXRjRGVsdGFUbHMgID0gZ3BzX3V0Yy0+ZGVsdGFfdF9sczsKKwlycmxwX3V0Yy0+dXRjV05sc2YgICAgID0gZ3BzX3V0Yy0+d25fbHNmICYgMHhmZjsKKwlycmxwX3V0Yy0+dXRjRE4gICAgICAgID0gZ3BzX3V0Yy0+ZG47CisJcnJscF91dGMtPnV0Y0RlbHRhVGxzZiA9IGdwc191dGMtPmRlbHRhX3RfbHNmOworfQorCisvKiB9fX0gKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFJSTFAgQXNzaXN0YW5jZSBQRFUgR2VuZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0te3t7ICovCisKK3N0cnVjdCBQRFUgKgorX3JybHBfY3JlYXRlX2dwc19hc3Npc3RfcGR1KGludCByZWZudW0sIHN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqKm9fZ3BzX2FkKQoreworCXN0cnVjdCBQRFUgKnBkdTsKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKmdwc19hZDsKKworCXBkdSA9IGNhbGxvYygxLCBzaXplb2YoKnBkdSkpOworCWlmICghcGR1KQorCQlyZXR1cm4gTlVMTDsKKworCWdwc19hZCA9IGNhbGxvYygxLCBzaXplb2YoKmdwc19hZCkpOworCWlmICghZ3BzX2FkKSB7CisJCWZyZWUocGR1KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKG9fZ3BzX2FkKQorCQkqb19ncHNfYWQgPSBncHNfYWQ7CisKKwlwZHUtPnJlZmVyZW5jZU51bWJlciA9IHJlZm51bTsKKwlwZHUtPmNvbXBvbmVudC5wcmVzZW50ID0gUlJMUF9Db21wb25lbnRfUFJfYXNzaXN0YW5jZURhdGE7CisJcGR1LT5jb21wb25lbnQuY2hvaWNlLmFzc2lzdGFuY2VEYXRhLmdwc19Bc3Npc3REYXRhID0gZ3BzX2FkOworCisJcmV0dXJuIHBkdTsKK30KKworc3RhdGljIGludAorX3JybHBfYWRkX2lvbm9zcGhlcmljX21vZGVsKAorCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkKQoreworCXN0cnVjdCBJb25vc3BoZXJpY01vZGVsICpycmxwX2lvbm87CisKKwlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9JT05PU1BIRVJFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlycmxwX2lvbm8gPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX2lvbm8pKTsKKwlpZiAoIXJybHBfaW9ubykKKwkJcmV0dXJuIC1FTk9NRU07CisJcnJscF9ncHNfYWQtPmNvbnRyb2xIZWFkZXIuaW9ub3NwaGVyaWNNb2RlbCA9IHJybHBfaW9ubzsKKworCV9ycmxwX2ZpbGxfaW9ub3NwaGVyaWNfbW9kZWwocnJscF9pb25vLCAmZ3BzX2FkLT5pb25vc3BoZXJlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfdXRjX21vZGVsKAorCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkKQoreworCXN0cnVjdCBVVENNb2RlbCAqcnJscF91dGM7CisKKwlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9VVEMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfdXRjID0gY2FsbG9jKDEsIHNpemVvZigqcnJscF91dGMpKTsKKwlpZiAoIXJybHBfdXRjKQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci51dGNNb2RlbCA9IHJybHBfdXRjOworCisJX3JybHBfZmlsbF91dGNfbW9kZWwocnJscF91dGMsICZncHNfYWQtPnV0Yyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorX3JybHBfYWRkX3JlZmVyZW5jZV9sb2NhdGlvbigKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKnJybHBfZ3BzX2FkLAorCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCkKK3sKKwlzdHJ1Y3QgUmVmTG9jYXRpb24gKnJybHBfcmVmbG9jOworCXVpbnQ4X3QgKmI7CisKKwlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9SRUZQT1MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfcmVmbG9jID0gY2FsbG9jKDEsIHNpemVvZigqcnJscF9yZWZsb2MpKTsKKwlpZiAoIXJybHBfcmVmbG9jKQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci5yZWZMb2NhdGlvbiA9IHJybHBfcmVmbG9jOworCisJYiA9IG1hbGxvYyg5KTsKKworCWJbMF0gPSAweDgwOyAvKiBFbGxpcHNvaWQgUG9pbnQgd2l0aCBhbHRpdHVkZSAqLworCV90c18yM18wMzJfc3RvcmVfbGF0aXR1ZGUoZ3BzX2FkLT5yZWZfcG9zLmxhdGl0dWRlLCAmYlsxXSk7CisJX3RzXzIzXzAzMl9zdG9yZV9sb25naXR1ZGUoZ3BzX2FkLT5yZWZfcG9zLmxvbmdpdHVkZSwgJmJbNF0pOworCV90c18yM18wMzJfc3RvcmVfYWx0aXR1ZGUoZ3BzX2FkLT5yZWZfcG9zLmFsdGl0dWRlLCAmYls3XSk7CisKKwlycmxwX3JlZmxvYy0+dGhyZWVETG9jYXRpb24uYnVmID0gYjsKKwlycmxwX3JlZmxvYy0+dGhyZWVETG9jYXRpb24uc2l6ZSA9IDk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorX3JybHBfYWRkX3JlZmVyZW5jZV90aW1lKAorCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkKQoreworCXN0cnVjdCBSZWZlcmVuY2VUaW1lICpycmxwX3JlZnRpbWU7CisKKwlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9SRUZUSU1FKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlycmxwX3JlZnRpbWUgPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX3JlZnRpbWUpKTsKKwlpZiAoIXJybHBfcmVmdGltZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcnJscF9ncHNfYWQtPmNvbnRyb2xIZWFkZXIucmVmZXJlbmNlVGltZSA9IHJybHBfcmVmdGltZTsKKworCXJybHBfcmVmdGltZS0+Z3BzVGltZS5ncHNXZWVrICAgPSBncHNfYWQtPnJlZl90aW1lLnduICYgMHgzZmY7IC8qIDEwYiAqLworCXJybHBfcmVmdGltZS0+Z3BzVGltZS5ncHNUT1cyM2IgPQorCQkoKGludClmbG9vcihncHNfYWQtPnJlZl90aW1lLnRvdyAvIDAuMDgpKSAmIDB4N2ZmZmZmOyAgLyogMjNiICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorX3JybHBfYWRkX2FsbWFuYWMoCisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCwKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQsIGludCAqc3RhcnQsIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgQWxtYW5hYyAqcnJscF9hbG07CisJc3RydWN0IGdwc19hbG1hbmFjICpncHNfYWxtID0gJmdwc19hZC0+YWxtYW5hYzsKKworCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX0FMTUFOQUMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfYWxtID0gY2FsbG9jKDEsIHNpemVvZigqcnJscF9hbG0pKTsKKwlpZiAoIXJybHBfYWxtKQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci5hbG1hbmFjID0gcnJscF9hbG07CisKKwlycmxwX2FsbS0+YWxhbWFuYWNXTmEgPSBncHNfYWxtLT53bmE7CisJaWYgKGNvdW50ID09IC0xKQorCQljb3VudCA9IGdwc19hbG0tPm5fc3YgLSAqc3RhcnQ7CisJZm9yIChpPSpzdGFydDsgKGk8KnN0YXJ0K2NvdW50KSAmJiAoaTxncHNfYWxtLT5uX3N2KTsgaSsrKSB7CisJCXN0cnVjdCBBbG1hbmFjRWxlbWVudCAqYWU7CisJCWFlID0gY2FsbG9jKDEsIHNpemVvZigqYWUpKTsKKwkJaWYgKCFhZSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlfcnJscF9maWxsX2FsbWFuYWNfZWxlbWVudChhZSwgJmdwc19hbG0tPnN2c1tpXSk7CisJCUFTTl9TRVFVRU5DRV9BREQoJnJybHBfYWxtLT5hbG1hbmFjTGlzdC5saXN0LCBhZSk7CisJfQorCisJKnN0YXJ0ID0gaTsKKworCXJldHVybiBpIDwgZ3BzX2FsbS0+bl9zdjsKK30KKworc3RhdGljIGludAorX3JybHBfYWRkX2VwaGVtZXJpcygKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKnJybHBfZ3BzX2FkLAorCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCwgaW50ICpzdGFydCwgaW50IGNvdW50LCB1aW50NjRfdCBtYXNrKQoreworCWludCBpLCBqOworCXN0cnVjdCBOYXZpZ2F0aW9uTW9kZWwgKnJybHBfbmF2OworCXN0cnVjdCBncHNfZXBoZW1lcmlzICpncHNfZXBoID0gJmdwc19hZC0+ZXBoZW1lcmlzOworCisJaWYgKCEoZ3BzX2FkLT5maWVsZHMgJiBHUFNfRklFTERfRVBIRU1FUklTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlycmxwX25hdiA9IGNhbGxvYygxLCBzaXplb2YoKnJybHBfbmF2KSk7CisJaWYgKCFycmxwX25hdikKKwkJcmV0dXJuIC1FTk9NRU07CisJcnJscF9ncHNfYWQtPmNvbnRyb2xIZWFkZXIubmF2aWdhdGlvbk1vZGVsID0gcnJscF9uYXY7CisKKwlpZiAoY291bnQgPT0gLTEpCisJCWNvdW50ID0gZ3BzX2VwaC0+bl9zdiAtICpzdGFydDsKKwlmb3IgKGk9KnN0YXJ0LGo9MDsgKGo8Y291bnQpICYmIChpPGdwc19lcGgtPm5fc3YpOyBpKyspIHsKKwkJaWYgKCEobWFzayAmICgxVUxMPDwoZ3BzX2VwaC0+c3ZzW2ldLnN2X2lkLTEpKSkpCisJCQljb250aW51ZTsKKwkJc3RydWN0IE5hdk1vZGVsRWxlbWVudCAqbm1lOworCQlubWUgPSBjYWxsb2MoMSwgc2l6ZW9mKCpubWUpKTsKKwkJaWYgKCFubWUpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJX3JybHBfZmlsbF9uYXZpZ2F0aW9uX21vZGVsX2VsZW1lbnQobm1lLCAmZ3BzX2VwaC0+c3ZzW2ldKTsKKwkJQVNOX1NFUVVFTkNFX0FERCgmcnJscF9uYXYtPm5hdk1vZGVsTGlzdC5saXN0LCBubWUpOworCQlqKys7CisJfQorCisJKnN0YXJ0ID0gaTsKKworCXJldHVybiBpIDwgZ3BzX2VwaC0+bl9zdjsKK30KKworCisjZGVmaW5lIE1BWF9QRFVTIDY0CisKK2ludAorcnJscF9ncHNfYXNzaXN0X3BkdXMoCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkLCBzdHJ1Y3QgcnJscF9hc3Npc3RfcmVxICpyZXEsCisJdm9pZCAqKm9fcGR1LCBpbnQgKm9fbGVuLCBpbnQgb19tYXhfcGR1cykKK3sKKwlzdHJ1Y3QgUERVICpsc3RfcGR1W01BWF9QRFVTXTsKKwlpbnQgbHN0X2NudCA9IDA7CisKKwlzdHJ1Y3QgUERVICpycmxwX3BkdSA9IE5VTEw7CisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCA9IE5VTEw7CisJdWludDMyX3QgcmUgPSByZXEtPnJlcV9lbGVtczsKKwlpbnQgaSwgcnYgPSAwOworCisJLyogSW9ub3NwaGVyaWNNb2RlbCwgVVRDTW9kZWwsIFJlZkxvY2F0aW9uLCBSZWZlcmVuY2VUaW1lICovCisJaWYgKHJlICYgKFJSTFBfQVJfSU9OT19NT0RFTCB8CisJICAgICAgICAgIFJSTFBfQVJfVVRDX01PREVMIHwKKwkgICAgICAgICAgUlJMUF9BUl9SRUZfVElNRSB8CisJICAgICAgICAgIFJSTFBfQVJfUkVGX0xPQykpCisJeworCQlpbnQgcGR1X2hhc19kYXRhID0gMDsKKworCQlycmxwX3BkdSA9IF9ycmxwX2NyZWF0ZV9ncHNfYXNzaXN0X3BkdSgxLCAmcnJscF9ncHNfYWQpOworCQlpZiAoIXJybHBfcGR1KSB7CisJCQlydiA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJaWYgKHJlICYgUlJMUF9BUl9JT05PX01PREVMKQorCQkJaWYgKCFfcnJscF9hZGRfaW9ub3NwaGVyaWNfbW9kZWwocnJscF9ncHNfYWQsIGdwc19hZCkpCisJCQkJcGR1X2hhc19kYXRhID0gMTsKKworCQlpZiAocmUgJiBSUkxQX0FSX1VUQ19NT0RFTCkKKwkJCWlmICghX3JybHBfYWRkX3V0Y19tb2RlbChycmxwX2dwc19hZCwgZ3BzX2FkKSkKKwkJCQlwZHVfaGFzX2RhdGEgPSAxOworCisJCWlmIChyZSAmIFJSTFBfQVJfUkVGX1RJTUUpCisJCQlpZiAoIV9ycmxwX2FkZF9yZWZlcmVuY2VfdGltZShycmxwX2dwc19hZCwgZ3BzX2FkKSkKKwkJCQlwZHVfaGFzX2RhdGEgPSAxOworCisJCWlmIChyZSAmIFJSTFBfQVJfUkVGX0xPQykKKwkJCWlmICghX3JybHBfYWRkX3JlZmVyZW5jZV9sb2NhdGlvbihycmxwX2dwc19hZCwgZ3BzX2FkKSkKKwkJCQlwZHVfaGFzX2RhdGEgPSAxOworCisJCWlmIChwZHVfaGFzX2RhdGEpIHsKKwkJCWxzdF9wZHVbbHN0X2NudCsrXSA9IHJybHBfcGR1OworCQkJcnJscF9wZHUgPSBOVUxMOworCQl9CisJfQorCisJLyogQWxtYW5hYyAqLworCWlmIChyZSAmIFJSTFBfQVJfQUxNQU5BQykgeworCQlpID0gMDsKKwkJZG8geworCQkJaWYgKCEoZ3BzX2FkLT5maWVsZHMgJiBHUFNfRklFTERfQUxNQU5BQykpCisJCQkJYnJlYWs7CisKKwkJCWlmICghcnJscF9wZHUpIHsKKwkJCQlycmxwX3BkdSA9IF9ycmxwX2NyZWF0ZV9ncHNfYXNzaXN0X3BkdSgxLCAmcnJscF9ncHNfYWQpOworCQkJCWlmICghcnJscF9wZHUpIHsKKwkJCQkJcnYgPSAtRU5PTUVNOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKwkJCX0KKworCQkJcnYgPSBfcnJscF9hZGRfYWxtYW5hYyhycmxwX2dwc19hZCwgZ3BzX2FkLCAmaSwgMTApOworCQkJaWYgKHJ2IDwgMCkKKwkJCQlnb3RvIGVycm9yOworCisJCQlsc3RfcGR1W2xzdF9jbnQrK10gPSBycmxwX3BkdTsKKwkJCXJybHBfcGR1ID0gTlVMTDsKKwkJfSB3aGlsZSAocnYpOworCX0KKworCS8qIEVwaGVtZXJpcyAqLworCWlmIChyZSAmIFJSTFBfQVJfRVBIRU1FUklTKSB7CisJCWkgPSAwOworCQlkbyB7CisJCQlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9FUEhFTUVSSVMpKQorCQkJCWJyZWFrOworCisJCQlpZiAoIXJybHBfcGR1KSB7CisJCQkJcnJscF9wZHUgPSBfcnJscF9jcmVhdGVfZ3BzX2Fzc2lzdF9wZHUoMSwgJnJybHBfZ3BzX2FkKTsKKwkJCQlpZiAoIXJybHBfcGR1KSB7CisJCQkJCXJ2ID0gLUVOT01FTTsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CisJCQl9CisKKwkJCXJ2ID0gX3JybHBfYWRkX2VwaGVtZXJpcyhycmxwX2dwc19hZCwgZ3BzX2FkLCAmaSwgMiwgcmVxLT5lcGhfc3ZzKTsKKworCQkJbHN0X3BkdVtsc3RfY250KytdID0gcnJscF9wZHU7CisJCQlycmxwX3BkdSA9IE5VTEw7CisKKwkJfSB3aGlsZSAocnYpOworCX0KKworCS8qIFNlcmlhbGl6ZSAmIFJlbGVhc2UgYWxsIFBEVXMgKi8KKwlmb3IgKGk9MDsgaTxsc3RfY250ICYmIGk8b19tYXhfcGR1czsgaSsrKSB7CisJCS8qIFBzZXVkbyBzZWdtZW50YXRpb24gZmxhZ3MgKi8KKwkJTW9yZUFzc0RhdGFUb0JlU2VudF90ICptYWQgPSBjYWxsb2MoMSwgc2l6ZW9mKCptYWQpKTsKKwkJKm1hZCA9IChpID09IChsc3RfY250LTEpKSA/CisJCQkJTW9yZUFzc0RhdGFUb0JlU2VudF9ub01vcmVNZXNzYWdlcyA6CisJCQkJTW9yZUFzc0RhdGFUb0JlU2VudF9tb3JlTWVzc2FnZXNPblRoZVdheTsKKwkJbHN0X3BkdVtpXS0+Y29tcG9uZW50LmNob2ljZS5hc3Npc3RhbmNlRGF0YS5tb3JlQXNzRGF0YVRvQmVTZW50ID0gbWFkOworCisJCS8qIFNlcmlhbGl6YXRpb24gKi8KKwkJLy8gYXNuX2ZwcmludChzdGRvdXQsICZhc25fREVGX1BEVSwgbHN0X3BkdVtpXSk7CisJCXJ2ID0gdXBlcl9lbmNvZGVfdG9fbmV3X2J1ZmZlcigmYXNuX0RFRl9QRFUsIE5VTEwsIGxzdF9wZHVbaV0sICZvX3BkdVtpXSk7CisJCWlmIChydiA8IDApCisJCQlnb3RvIGVycm9yOworCQlvX2xlbltpXSA9IHJ2OworCX0KKworCXJ2ID0gbHN0X2NudDsKKworCS8qIFJlbGVhc2UgQVNOLjEgb2JqZWN0cyAqLworZXJyb3I6CisJaWYgKHJybHBfcGR1KQorCQlhc25fREVGX1BEVS5mcmVlX3N0cnVjdCgmYXNuX0RFRl9QRFUsICh2b2lkKilycmxwX3BkdSwgMCk7CisKKwlmb3IgKGk9MDsgaTxsc3RfY250OyBpKyspCisJCWFzbl9ERUZfUERVLmZyZWVfc3RydWN0KCZhc25fREVGX1BEVSwgbHN0X3BkdVtpXSwgMCk7CisKKwlyZXR1cm4gcnY7Cit9CisKKy8qIH19fSAqLworCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9ycmxwLmggYi9ycmxwLWVwaGVtZXJpcy9ycmxwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVlNDM0NAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL3JybHAuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogcnJscC5oCisgKgorICogUlJMUCBIZWFkZXIKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fUlJMUF9IX18KKyNkZWZpbmUgX19SUkxQX0hfXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJncHMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIE91ciBpbnRlcm5hbCBzaW1wbGlmaWVkIHN0cnVjdHVyZSBmb3IgcmVxdWVzdHMgKi8KKworI2RlZmluZSBSUkxQX0FSX1JFRl9MT0MJCSgxPDwwKQorI2RlZmluZSBSUkxQX0FSX1JFRl9USU1FCSgxPDwxKQorI2RlZmluZSBSUkxQX0FSX1VUQ19NT0RFTAkoMTw8MikKKyNkZWZpbmUgUlJMUF9BUl9JT05PX01PREVMCSgxPDwzKQorI2RlZmluZSBSUkxQX0FSX0FMTUFOQUMJCSgxPDw0KQorI2RlZmluZSBSUkxQX0FSX0VQSEVNRVJJUwkoMTw8NSkKKworc3RydWN0IHJybHBfYXNzaXN0X3JlcSB7CisJdWludDMyX3QgcmVxX2VsZW1zOworCXVpbnQ2NF90IGVwaF9zdnM7Cit9OworCisKKy8qIE1ldGhvZHMgKi8KK2ludCBycmxwX2RlY29kZV9hc3Npc3RhbmNlX3JlcXVlc3Qoc3RydWN0IHJybHBfYXNzaXN0X3JlcSAqYXIsCisJdm9pZCAqcmVxLCBpbnQgcmVxX2xlbik7CisKK2ludCBycmxwX2dwc19hc3Npc3RfcGR1cygKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQsIHN0cnVjdCBycmxwX2Fzc2lzdF9yZXEgKnJlcSwKKwl2b2lkICoqb19wZHUsIGludCAqb19sZW4sIGludCBvX21heF9wZHVzKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19SUkxQX0hfXyAqLworCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuYyBiL3JybHAtZXBoZW1lcmlzL3VieC1wYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZDBmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuYwpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIHVieC1wYXJzZS5jCisgKgorICogSW1wbGVtZW50YXRpb24gb2YgcGFyc2luZyBjb2RlIGNvbnZlcnRpbmcgVUJYIG1lc3NhZ2VzIHRvIEdQUyBhc3Npc3QKKyAqIGRhdGEKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImdwcy5oIgorI2luY2x1ZGUgInVieC5oIgorI2luY2x1ZGUgInVieC1wYXJzZS5oIgorCisKKy8qIEhlbHBlcnMgKi8KKworc3RhdGljIGludAorZmxvYXRfdG9fZml4ZWRwb2ludChmbG9hdCBmLCBpbnQgc2YpCit7CisJaWYgKHNmIDwgMCkgeworCQl3aGlsZSAoc2YrKyA8IDApCisJCQlmICo9IDIuMGY7CisJfSBlbHNlIHsKKwkJd2hpbGUgKHNmLS0gPiAwKQorCQkJZiAqPSAwLjVmOworCX0KKworCXJldHVybiAoaW50KWY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citkb3VibGVfdG9fZml4ZWRwb2ludChkb3VibGUgZCwgaW50IHNmKQoreworCWlmIChzZiA8IDApIHsKKwkJd2hpbGUgKHNmKysgPCAwKQorCQkJZCAqPSAyLjA7CisJfSBlbHNlIHsKKwkJd2hpbGUgKHNmLS0gPiAwKQorCQkJZCAqPSAwLjU7CisJfQorCisJcmV0dXJuIChpbnQpZDsKK30KKworCisvKiBVQlggbWVzc2FnZSBwYXJzaW5nIHRvIGZpbGwgZ3BzIGFzc2lzdCBkYXRhICovCisKK3N0YXRpYyB2b2lkCitfdWJ4X21zZ19wYXJzZV9uYXZfcG9zbGxoKHN0cnVjdCB1YnhfaGRyICpoZHIsIHZvaWQgKnBsLCBpbnQgcGxfbGVuLCB2b2lkICp1ZCkKK3sKKwlzdHJ1Y3QgdWJ4X25hdl9wb3NsbGggKm5hdl9wb3NsbGggPSBwbDsKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHMgPSB1ZDsKKworCS8vcHJpbnRmKCJbLl0gTkFWX1BPU0xMSFxuIik7CisKKwlncHMtPmZpZWxkcyB8PSBHUFNfRklFTERfUkVGUE9TOworCisJZ3BzLT5yZWZfcG9zLmxhdGl0dWRlICA9IChkb3VibGUpKG5hdl9wb3NsbGgtPmxhdCkgKiAxZS03OworCWdwcy0+cmVmX3Bvcy5sb25naXR1ZGUgPSAoZG91YmxlKShuYXZfcG9zbGxoLT5sb24pICogMWUtNzsKKwlncHMtPnJlZl9wb3MuYWx0aXR1ZGUgID0gKGRvdWJsZSkobmF2X3Bvc2xsaC0+aGVpZ2h0KSAqIDFlLTM7Cit9CisKK3N0YXRpYyB2b2lkCitfdWJ4X21zZ19wYXJzZV9haWRfaW5pKHN0cnVjdCB1YnhfaGRyICpoZHIsIHZvaWQgKnBsLCBpbnQgcGxfbGVuLCB2b2lkICp1ZCkKK3sKKwlzdHJ1Y3QgdWJ4X2FpZF9pbmkgKmFpZF9pbmkgPSBwbDsKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHMgPSB1ZDsKKworCS8vcHJpbnRmKCJbLl0gQUlEX0lOSVxuIik7CisKKwkvKiBFeHRyYWN0IGluZm8gZm9yICJSZWZlcmVuY2UgVGltZSIgKi8KKwlncHMtPmZpZWxkcyB8PSBHUFNfRklFTERfUkVGVElNRTsKKworCWdwcy0+cmVmX3RpbWUud24gPSBhaWRfaW5pLT53bjsKKwlncHMtPnJlZl90aW1lLnRvdyA9IChkb3VibGUpYWlkX2luaS0+dG93ICogMWUtMzsKKworCS8vIEZJWE1FOiBXZSBjb3VsZCBleHRyYWN0IHJlZiBwb3NpdGlvbiBhcyB3ZWxsIGJ1dCB3ZSBuZWVkIGl0IGluCisJLy8gICAgICAgIFdHUzg0IGdlb2RldGljIGNvb3JkaW5hdGVzIGFuZCBpdCdzIHByb3ZpZGVkIGFzIGVjZWYsIHNvCisJLy8gICAgICAgIHdlIG5lZWQgYSBsb3Qgb2YgbWF0aCAuLi4KK30KKworc3RhdGljIHZvaWQKK191YnhfbXNnX3BhcnNlX2FpZF9odWkoc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGwsIGludCBwbF9sZW4sIHZvaWQgKnVkKQoreworCXN0cnVjdCB1YnhfYWlkX2h1aSAqYWlkX2h1aSA9IHBsOworCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcyA9IHVkOworCisJLy9wcmludGYoIlsuXSBBSURfSFVJXG4iKTsKKworCWlmIChhaWRfaHVpLT5mbGFncyAmIDB4MikgeyAvKiBVVEMgcGFyYW1ldGVycyB2YWxpZCAqLworCQlzdHJ1Y3QgZ3BzX3V0Y19tb2RlbCAqdXRjID0gJmdwcy0+dXRjOworCisJCWdwcy0+ZmllbGRzIHw9IEdQU19GSUVMRF9VVEM7CisKKwkJdXRjLT5hMCAgICAgICAgICA9IGRvdWJsZV90b19maXhlZHBvaW50KGFpZF9odWktPnV0Y19hMCwgLTMwKTsKKwkJdXRjLT5hMSAgICAgICAgICA9IGRvdWJsZV90b19maXhlZHBvaW50KGFpZF9odWktPnV0Y19hMSwgLTUwKTsKKwkJdXRjLT5kZWx0YV90X2xzICA9IGFpZF9odWktPnV0Y19sczsKKwkJdXRjLT50X290ICAgICAgICA9IGFpZF9odWktPnV0Y190b3QgPj4gMTI7CisJCXV0Yy0+d25fdCAgICAgICAgPSBhaWRfaHVpLT51dGNfd250OworCQl1dGMtPnduX2xzZiAgICAgID0gYWlkX2h1aS0+dXRjX3duZjsKKwkJdXRjLT5kbiAgICAgICAgICA9IGFpZF9odWktPnV0Y19kbjsKKwkJdXRjLT5kZWx0YV90X2xzZiA9IGFpZF9odWktPnV0Y19sc2Y7CisJfQorCisJaWYgKGFpZF9odWktPmZsYWdzICYgMHgwNCkgeyAvKiBLbG9idWNoYXIgcGFyYW1ldGVycyB2YWxpZCAqLworCQlzdHJ1Y3QgZ3BzX2lvbm9zcGhlcmVfbW9kZWwgKmlvbm8gPSAmZ3BzLT5pb25vc3BoZXJlOworCisJCWdwcy0+ZmllbGRzIHw9IEdQU19GSUVMRF9JT05PU1BIRVJFOworCisJCWlvbm8tPmFscGhhXzAgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYTAsIC0zMCk7CisJCWlvbm8tPmFscGhhXzEgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYTEsIC0yNyk7CisJCWlvbm8tPmFscGhhXzIgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYTIsIC0yNCk7CisJCWlvbm8tPmFscGhhXzMgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYTMsIC0yNCk7CisJCWlvbm8tPmJldGFfMCA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9iMCwgMTEpOworCQlpb25vLT5iZXRhXzEgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYjEsIDE0KTsKKwkJaW9uby0+YmV0YV8yID0gZmxvYXRfdG9fZml4ZWRwb2ludChhaWRfaHVpLT5rbG9iX2IyLCAxNik7CisJCWlvbm8tPmJldGFfMyA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9iMywgMTYpOworCX0KK30KKworc3RhdGljIHZvaWQKK191YnhfbXNnX3BhcnNlX2FpZF9hbG0oc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGwsIGludCBwbF9sZW4sIHZvaWQgKnVkKQoreworCXN0cnVjdCB1YnhfYWlkX2FsbSAqYWlkX2FsbSA9IHBsOworCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcyA9IHVkOworCisJLy9wcmludGYoIlsuXSBBSURfQUxNICVkIC0gJWRcbiIsIGFpZF9hbG0tPnN2X2lkLCBhaWRfYWxtLT5ncHNfd2Vlayk7CisKKwlpZiAoYWlkX2FsbS0+Z3BzX3dlZWspIHsKKwkJZ3BzLT5maWVsZHMgfD0gR1BTX0ZJRUxEX0FMTUFOQUM7CisJCWdwcy0+YWxtYW5hYy53bmEgPSBhaWRfYWxtLT5ncHNfd2VlayAmIDB4ZmY7CisJCWdwc191bnBhY2tfc2Y0NV9hbG1hbmFjKGFpZF9hbG0tPmFsbV93b3JkcywgJmdwcy0+YWxtYW5hYy5zdnNbZ3BzLT5hbG1hbmFjLm5fc3YrK10pOworCX0KK30KKworc3RhdGljIHZvaWQKK191YnhfbXNnX3BhcnNlX2FpZF9lcGgoc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGwsIGludCBwbF9sZW4sIHZvaWQgKnVkKQoreworCXN0cnVjdCB1YnhfYWlkX2VwaCAqYWlkX2VwaCA9IHBsOworCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcyA9IHVkOworCisJLy9wcmludGYoIlsuXSBBSURfRVBIICVkIC0gJXNcbiIsIGFpZF9lcGgtPnN2X2lkLCBhaWRfZXBoLT5wcmVzZW50ID8gInByZXNlbnQiIDogIm5vdCBwcmVzZW50Iik7CisKKwlpZiAoYWlkX2VwaC0+cHJlc2VudCkgeworCQlpbnQgaSA9IGdwcy0+ZXBoZW1lcmlzLm5fc3YrKzsKKwkJZ3BzLT5maWVsZHMgfD0gR1BTX0ZJRUxEX0VQSEVNRVJJUzsKKwkJZ3BzLT5lcGhlbWVyaXMuc3ZzW2ldLnN2X2lkID0gYWlkX2VwaC0+c3ZfaWQ7CisJCWdwc191bnBhY2tfc2YxMjMoYWlkX2VwaC0+ZXBoX3dvcmRzLCAmZ3BzLT5lcGhlbWVyaXMuc3ZzW2ldKTsKKwl9Cit9CisKKworLyogRGlzcGF0Y2ggdGFibGUgKi8KK3N0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgdWJ4X3BhcnNlX2R0W10gPSB7CisJVUJYX0RJU1BBVENIKE5BViwgUE9TTExILCBfdWJ4X21zZ19wYXJzZV9uYXZfcG9zbGxoKSwKKwlVQlhfRElTUEFUQ0goQUlELCBJTkksIF91YnhfbXNnX3BhcnNlX2FpZF9pbmkpLAorCVVCWF9ESVNQQVRDSChBSUQsIEhVSSwgX3VieF9tc2dfcGFyc2VfYWlkX2h1aSksCisJVUJYX0RJU1BBVENIKEFJRCwgQUxNLCBfdWJ4X21zZ19wYXJzZV9haWRfYWxtKSwKKwlVQlhfRElTUEFUQ0goQUlELCBFUEgsIF91YnhfbXNnX3BhcnNlX2FpZF9lcGgpLAorfTsKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvdWJ4LXBhcnNlLmggYi9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjE0NzVkCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvdWJ4LXBhcnNlLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIHVieC1wYXJzZS5oCisgKgorICogSGVhZGVyIGZvciBwYXJzaW5nIGNvZGUgY29udmVydGluZyBVQlggbWVzc2FnZXMgdG8gR1BTIGFzc2lzdCBkYXRhCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX1VCWF9QQVJTRV9IX18KKyNkZWZpbmUgX19VQlhfUEFSU0VfSF9fCisKKworI2luY2x1ZGUgImdwcy5oIgorI2luY2x1ZGUgInVieC5oIgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBEaXNwYXRjaCB0YWJsZSAqLworZXh0ZXJuIHN0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgdWJ4X3BhcnNlX2R0W107CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fVUJYX1BBUlNFX0hfXyAqLworCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy91YnguYyBiL3JybHAtZXBoZW1lcmlzL3VieC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZGQxZjAKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy91YnguYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogdWJ4LmMKKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBnZW5lcmljIFVCWCBoZWxwZXJzCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJ1YnguaCIKKworCitzdGF0aWMgdm9pZAordWJ4X2NoZWNrc3VtKHVpbnQ4X3QgKmRhdGEsIGludCBsZW4sIHVpbnQ4X3QgKmNrc3VtKQoreworCWludCBpOworCXVpbnQ4X3QgY2swID0gMCwgY2sxID0gMDsKKwlmb3IgKGk9MDsgaTxsZW47IGkrKykgeworCQljazAgKz0gZGF0YVtpXTsKKwkJY2sxICs9IGNrMDsKKwl9CisJY2tzdW1bMF0gPSBjazA7CisJY2tzdW1bMV0gPSBjazE7Cit9CisKKworc3RhdGljIHVieF9tc2dfaGFuZGxlcl90Cit1YnhfZmluZF9oYW5kbGVyKHN0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgKmR0LCB1aW50OF90IG1zZ19jbGFzcywgdWludDhfdCBtc2dfaWQpCit7CisJd2hpbGUgKGR0LT5oYW5kbGVyKSB7CisJCWlmICgoZHQtPm1zZ19jbGFzcyA9PSBtc2dfY2xhc3MpICYmIChkdC0+bXNnX2lkID09IG1zZ19pZCkpCisJCQlyZXR1cm4gZHQtPmhhbmRsZXI7CisJCWR0Kys7CisJfQorCXJldHVybiBOVUxMOworfQorCisKK2ludAordWJ4X21zZ19kaXNwYXRjaChzdHJ1Y3QgdWJ4X2Rpc3BhdGNoX2VudHJ5ICpkdCwKKyAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCBpbnQgbGVuLCB2b2lkICp1c2VyZGF0YSkKK3sKKwlzdHJ1Y3QgdWJ4X2hkciAqaGRyID0gbXNnOworCXVpbnQ4X3QgY2tzdW1bMl0sICpja3N1bV9wdHI7CisJdWJ4X21zZ19oYW5kbGVyX3QgaDsKKworCWlmICgoaGRyLT5zeW5jWzBdICE9IFVCWF9TWU5DMCkgfHwgKGhkci0+c3luY1sxXSAhPSBVQlhfU1lOQzEpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiWyFdIEludmFsaWQgc3luYyBieXRlc1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwl1YnhfY2hlY2tzdW0obXNnICsgMiwgc2l6ZW9mKHN0cnVjdCB1YnhfaGRyKSArIGhkci0+cGF5bG9hZF9sZW4gLSAyLCBja3N1bSk7CisJY2tzdW1fcHRyID0gbXNnICsgKHNpemVvZihzdHJ1Y3QgdWJ4X2hkcikgKyBoZHItPnBheWxvYWRfbGVuKTsKKwlpZiAoKGNrc3VtX3B0clswXSAhPSBja3N1bVswXSkgfHwgKGNrc3VtX3B0clsxXSAhPSBja3N1bVsxXSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJbIV0gSW52YWxpZCBjaGVja3N1bVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwloID0gdWJ4X2ZpbmRfaGFuZGxlcihkdCwgaGRyLT5tc2dfY2xhc3MsIGhkci0+bXNnX2lkKTsKKwlpZiAoaCkKKwkJaChoZHIsIG1zZyArIHNpemVvZihzdHJ1Y3QgdWJ4X2hkciksIGhkci0+cGF5bG9hZF9sZW4sIHVzZXJkYXRhKTsKKworCXJldHVybiBzaXplb2Yoc3RydWN0IHVieF9oZHIpICsgaGRyLT5wYXlsb2FkX2xlbiArIDI7Cit9CisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL3VieC5oIGIvcnJscC1lcGhlbWVyaXMvdWJ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2NDM4NgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL3VieC5oCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogdWJ4LmgKKyAqCisgKiBIZWFkZXIgZm9yIFVCWCByZWxhdGVkIHN0dWZmCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX1VCWF9IX18KKyNkZWZpbmUgX19VQlhfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBDb25zdGFudHMgdXNlZCBpbiBVQlggKi8KKworCS8qIFN5bmMgYnl0ZXMgKHR3byBmaXJzdCBieXRlcyBvZiBlYWNoIG1lc3NhZ2UpICovCisjZGVmaW5lIFVCWF9TWU5DMAkJMHhiNQorI2RlZmluZSBVQlhfU1lOQzEJCTB4NjIKKworCS8qIFVCWCBtZXNzYWdlcyBjbGFzc2VzICovCisjZGVmaW5lIFVCWF9DTEFTU19OQVYJCTB4MDEKKyNkZWZpbmUgVUJYX0NMQVNTX1JYTQkJMHgwMgorI2RlZmluZSBVQlhfQ0xBU1NfSU5GCQkweDA0CisjZGVmaW5lIFVCWF9DTEFTU19BQ0sJCTB4MDUKKyNkZWZpbmUgVUJYX0NMQVNTX0NGRwkJMHgwNgorI2RlZmluZSBVQlhfQ0xBU1NfVVBECQkweDA5CisjZGVmaW5lIFVCWF9DTEFTU19NT04JCTB4MGEKKyNkZWZpbmUgVUJYX0NMQVNTX0FJRAkJMHgwYgorI2RlZmluZSBVQlhfQ0xBU1NfVElNCQkweDBkCisKKwkvKiBVQlggbWVzc2FnZXMgdHlwZSBJRCAoYnkgY2xhc3MpICovCisjZGVmaW5lIFVCWF9OQVZfUE9TRUNFRgkJMHgwMQorI2RlZmluZSBVQlhfTkFWX1BPU0xMSAkJMHgwMgorI2RlZmluZSBVQlhfTkFWX1NUQVRVUwkJMHgwMworI2RlZmluZSBVQlhfTkFWX0RPUAkJMHgwNAorI2RlZmluZSBVQlhfTkFWX1NPTAkJMHgwNgorI2RlZmluZSBVQlhfTkFWX1BPU1VUTQkJMHgwOAorI2RlZmluZSBVQlhfTkFWX1ZFTEVDRUYJCTB4MTEKKyNkZWZpbmUgVUJYX05BVl9WRUxORUQJCTB4MTIKKyNkZWZpbmUgVUJYX05BVl9USU1FR1BTCQkweDIwCisjZGVmaW5lIFVCWF9OQVZfVElNRVVUQwkJMHgyMQorI2RlZmluZSBVQlhfTkFWX0NMT0NLCQkweDIyCisjZGVmaW5lIFVCWF9OQVZfU1ZJTkZPCQkweDMwCisjZGVmaW5lIFVCWF9OQVZfREdQUwkJMHgzMQorI2RlZmluZSBVQlhfTkFWX1NCQVMJCTB4MzIKKyNkZWZpbmUgVUJYX05BVl9FS0ZTVEFUVVMJMHg0MAorCisjZGVmaW5lIFVCWF9SWE1fUkFXCQkweDEwCisjZGVmaW5lIFVCWF9SWE1fU0ZSQgkJMHgxMQorI2RlZmluZSBVQlhfUlhNX1NWU0kJCTB4MjAKKyNkZWZpbmUgVUJYX1JYTV9TVlNJX0dQUwkweDIwCisjZGVmaW5lIFVCWF9SWE1fQUxNCQkweDMwCisjZGVmaW5lIFVCWF9SWE1fRVBICQkweDMxCisjZGVmaW5lIFVCWF9SWE1fUE9TUkVRCQkweDQwCisKKyNkZWZpbmUgVUJYX0lORl9FUlJPUgkJMHgwMAorI2RlZmluZSBVQlhfSU5GX1dBUk5JTkcJCTB4MDEKKyNkZWZpbmUgVUJYX0lORl9OT1RJQ0UJCTB4MDIKKyNkZWZpbmUgVUJYX0lORl9URVNUCQkweDAzCisjZGVmaW5lIFVCWF9JTkZfREVCVUcJCTB4MDQKKyNkZWZpbmUgVUJYX0lORl9VU0VSCQkweDA3CisKKyNkZWZpbmUgVUJYX0FDS19OQUsJCTB4MDAKKyNkZWZpbmUgVUJYX0FDS19BQ0sJCTB4MDEKKworI2RlZmluZSBVQlhfQ0ZHX1BSVAkJMHgwMAorI2RlZmluZSBVQlhfQ0ZHX1VTQgkJMHgxYgorI2RlZmluZSBVQlhfQ0ZHX01TRwkJMHgwMQorI2RlZmluZSBVQlhfQ0ZHX05NRUEJCTB4MTcKKyNkZWZpbmUgVUJYX0NGR19SQVRFCQkweDA4CisjZGVmaW5lIFVCWF9DRkdfQ0ZHCQkweDA5CisjZGVmaW5lIFVCWF9DRkdfVFAJCTB4MDcKKyNkZWZpbmUgVUJYX0NGR19OQVYyCQkweDFhCisjZGVmaW5lIFVCWF9DRkdfREFUCQkweDA2CisjZGVmaW5lIFVCWF9DRkdfSU5GCQkweDAyCisjZGVmaW5lIFVCWF9DRkdfUlNUCQkweDA0CisjZGVmaW5lIFVCWF9DRkdfUlhNCQkweDExCisjZGVmaW5lIFVCWF9DRkdfQU5UCQkweDEzCisjZGVmaW5lIFVCWF9DRkdfRlhOCQkweDBlCisjZGVmaW5lIFVCWF9DRkdfU0JBUwkJMHgxNgorI2RlZmluZSBVQlhfQ0ZHX0xJQwkJMHg4MAorI2RlZmluZSBVQlhfQ0ZHX1RNCQkweDEwCisjZGVmaW5lIFVCWF9DRkdfVE0yCQkweDE5CisjZGVmaW5lIFVCWF9DRkdfVE1PREUJCTB4MWQKKyNkZWZpbmUgVUJYX0NGR19FS0YJCTB4MTIKKworI2RlZmluZSBVQlhfVVBEX0RPV05MCQkweDAxCisjZGVmaW5lIFVCWF9VUERfVVBMT0FECQkweDAyCisjZGVmaW5lIFVCWF9VUERfRVhFQwkJMHgwMworI2RlZmluZSBVQlhfVVBEX01FTUNQWQkJMHgwNAorCisjZGVmaW5lIFVCWF9NT05fU0NIRAkJMHgwMQorI2RlZmluZSBVQlhfTU9OX0lPCQkweDAyCisjZGVmaW5lIFVCWF9NT05fSVBDCQkweDAzCisjZGVmaW5lIFVCWF9NT05fVkVSCQkweDA0CisjZGVmaW5lIFVCWF9NT05fRVhDRVBUCQkweDA1CisjZGVmaW5lIFVCWF9NT05fTVNHUFAJCTB4MDYKKyNkZWZpbmUgVUJYX01PTl9SWEJVRgkJMHgwNworI2RlZmluZSBVQlhfTU9OX1RYQlVGCQkweDA4CisjZGVmaW5lIFVCWF9NT05fSFcJCTB4MDkKKyNkZWZpbmUgVUJYX01PTl9VU0IJCTB4MGEKKworI2RlZmluZSBVQlhfQUlEX1JFUQkJMHgwMAorI2RlZmluZSBVQlhfQUlEX0lOSQkJMHgwMQorI2RlZmluZSBVQlhfQUlEX0hVSQkJMHgwMgorI2RlZmluZSBVQlhfQUlEX0RBVEEJCTB4MTAKKyNkZWZpbmUgVUJYX0FJRF9BTE0JCTB4MzAKKyNkZWZpbmUgVUJYX0FJRF9FUEgJCTB4MzEKKworI2RlZmluZSBVQlhfVElNX1RQCQkweDAxCisjZGVmaW5lIFVCWF9USU1fVE0JCTB4MDIKKyNkZWZpbmUgVUJYX1RJTV9UTTIJCTB4MDMKKyNkZWZpbmUgVUJYX1RJTV9TVklOCQkweDA0CisKKworLyogSGVhZGVyICovCitzdHJ1Y3QgdWJ4X2hkciB7CisgICAgICAgIHVpbnQ4X3QgIHN5bmNbMl07CisgICAgICAgIHVpbnQ4X3QgIG1zZ19jbGFzczsKKyAgICAgICAgdWludDhfdCAgbXNnX2lkOworICAgICAgICB1aW50MTZfdCBwYXlsb2FkX2xlbjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyogUGF5bG9hZCBmb3JtYXRzIChzb21lIG9mIHRoZW0pICovCitzdHJ1Y3QgdWJ4X25hdl9wb3NsbGggeworCXVpbnQzMl90IGl0b3c7CisJaW50MzJfdCAgbG9uOwkvKiBzY2FsaW5nIDFlLTcgKi8KKwlpbnQzMl90ICBsYXQ7CS8qIHNjYWxpbmcgMWUtNyAqLworCWludDMyX3QgIGhlaWdodDsvKiBtbSAqLworCWludDMyX3QgIGhzbDsJLyogbW0gKi8KKwl1aW50MzJfdCBoYWNjOwkvKiBtbSAqLworCXVpbnQzMl90IHZhY2M7CS8qIG1tICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdWJ4X2FpZF9pbmkgeworCWludDMyX3QgIHg7CisJaW50MzJfdCAgeTsKKwlpbnQzMl90ICB6OworCXVpbnQzMl90IHBvc2FjYzsKKwl1aW50MTZfdCB0bV9jZmc7CisJdWludDE2X3Qgd247CisJdWludDMyX3QgdG93OworCWludDMyX3QgIHRvd19uczsKKwl1aW50MzJfdCB0YWNjX21zOworCXVpbnQzMl90IHRhY2NfbnM7CisJaW50MzJfdCAgY2xrZDsKKwl1aW50MzJfdCBjbGtkYWNjOworCXVpbnQzMl90IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHVieF9haWRfaHVpIHsKKwl1aW50MzJfdCBoZWFsdGg7CisJZG91YmxlICAgdXRjX2ExOworCWRvdWJsZSAgIHV0Y19hMDsKKwlpbnQzMl90ICB1dGNfdG90OworCWludDE2X3QgIHV0Y193bnQ7CisJaW50MTZfdCAgdXRjX2xzOworCWludDE2X3QgIHV0Y193bmY7CisJaW50MTZfdCAgdXRjX2RuOworCWludDE2X3QgIHV0Y19sc2Y7CisJaW50MTZfdCAgdXRjX3NwYXJlOworCWZsb2F0ICAgIGtsb2JfYTA7CisJZmxvYXQgICAga2xvYl9hMTsKKwlmbG9hdCAgICBrbG9iX2EyOworCWZsb2F0ICAgIGtsb2JfYTM7CisJZmxvYXQgICAga2xvYl9iMDsKKwlmbG9hdCAgICBrbG9iX2IxOworCWZsb2F0ICAgIGtsb2JfYjI7CisJZmxvYXQgICAga2xvYl9iMzsKKwl1aW50MzJfdCBmbGFnczsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB1YnhfYWlkX2FsbSB7CisJdWludDMyX3Qgc3ZfaWQ7CisJdWludDMyX3QgZ3BzX3dlZWs7CisJdWludDMyX3QgYWxtX3dvcmRzWzhdOwkvKiBQcmVzZW50IG9ubHkgaWYgJ2dwc193ZWVrJyAhPSAwICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdWJ4X2FpZF9lcGggeworCXVpbnQzMl90IHN2X2lkOworCXVpbnQzMl90IHByZXNlbnQ7CisJdWludDMyX3QgZXBoX3dvcmRzWzI0XTsJLyogUHJlc2VudCBvbmx5IGlmICdwcmVzZW50JyAhPSAwICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKy8qIE1lc3NhZ2UgaGFuZGxlciAqLwordHlwZWRlZiB2b2lkICgqdWJ4X21zZ19oYW5kbGVyX3QpKAorCXN0cnVjdCB1YnhfaGRyICpoZHIsIHZvaWQgKnBheWxvYWQsIGludCBwYXlsb2FkX2xlbiwgdm9pZCAqdXNlcmRhdGEpOworCitzdHJ1Y3QgdWJ4X2Rpc3BhdGNoX2VudHJ5IHsKKwl1aW50OF90IG1zZ19jbGFzczsKKwl1aW50OF90IG1zZ19pZDsKKwl1YnhfbXNnX2hhbmRsZXJfdCBoYW5kbGVyOworfTsKKworI2RlZmluZSBVQlhfRElTUEFUQ0goa2xzLGlkLGhkbCkgewkJXAorCS5tc2dfY2xhc3MgPSBVQlhfQ0xBU1NfICMjIGtscyAsCVwKKwkubXNnX2lkID0gVUJYXyAjIyBrbHMgIyMgXyAjIyBpZCwJXAorCS5oYW5kbGVyID0gKGhkbCksCQkJXAorfQorCisKKy8qIE1ldGhvZHMgKi8KK2ludCB1YnhfbXNnX2Rpc3BhdGNoKHN0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgKmR0LAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLCBpbnQgbGVuLCB2b2lkICp1c2VyZGF0YSk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fVUJYX0hfXyAqLworCmRpZmYgLS1naXQgYS93aXJlc2hhcmsvYWJpc19vbWwucGF0Y2ggYi93aXJlc2hhcmsvYWJpc19vbWwucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwNmI0ZAotLS0gL2Rldi9udWxsCisrKyBiL3dpcmVzaGFyay9hYmlzX29tbC5wYXRjaApAQCAtMCwwICsxLDIxOTIgQEAKK0luZGV4OiB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHdpcmVzaGFyay5vcmlnL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24KKysrKyB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgorQEAgLTQ3NCw2ICs0NzQsNyBAQAorIAlwYWNrZXQtZ3NtX2FfZ20uYwkJXAorIAlwYWNrZXQtZ3NtX2FfcnAuYwkJXAorIAlwYWNrZXQtZ3NtX2FfcnIuYwlcCisrCXBhY2tldC1nc21fYWJpc19vbWwuYwlcCisgCXBhY2tldC1nc21faXBhLmMJXAorIAlwYWNrZXQtZ3NtX2Jzc2xhcC5jCQlcCisgCXBhY2tldC1nc21fYnNzbWFwX2xlLmMJXAorZGlmZiAtLWdpdCBhL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmMgYi9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5jCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMmRlOWRjYQorLS0tIC9kZXYvbnVsbAorKysrIGIvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuYworQEAgLTAsMCArMSwxMzgyIEBACisrLyogcGFja2V0LWFiaXNfb21sLmMKKysgKiBSb3V0aW5lcyBmb3IgcGFja2V0IGRpc3NlY3Rpb24gb2YgR1NNIEEtYmlzIG92ZXIgSVAgKDNHUFAgVFMgMTIuMjEpCisrICogQ29weXJpZ2h0IDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKysgKiBDb3B5cmlnaHQgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisrICogYmFzZWQgb24gQS1iaXMgT01MIGNvZGUgaW4gT3BlbkJTQworKyAqCisrICogJElkJAorKyAqCisrICogV2lyZXNoYXJrIC0gTmV0d29yayB0cmFmZmljIGFuYWx5emVyCisrICogQnkgR2VyYWxkIENvbWJzIDxnZXJhbGRAd2lyZXNoYXJrLm9yZz4KKysgKiBDb3B5cmlnaHQgMTk5OCBHZXJhbGQgQ29tYnMKKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKysgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisrICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisrICoKKysgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKysgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKyAqCisrICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKysgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisrICovCisrCisrI2lmZGVmIEhBVkVfQ09ORklHX0gKKysjIGluY2x1ZGUgImNvbmZpZy5oIgorKyNlbmRpZgorKworKyNpbmNsdWRlIDxnbGliLmg+CisrCisrI2luY2x1ZGUgPGVwYW4vcGFja2V0Lmg+CisrI2luY2x1ZGUgPGVwYW4vZW1lbS5oPgorKyNpbmNsdWRlIDxlcGFuL2xhcGRfc2FwaS5oPgorKyNpbmNsdWRlIDxlcGFuL3ByZWZzLmg+CisrCisrI2luY2x1ZGUgInBhY2tldC1nc21fYWJpc19vbWwuaCIKKysjaW5jbHVkZSAicGFja2V0LWdzbV9hX2NvbW1vbi5oIgorKworKy8qIGluaXRpYWxpemUgdGhlIHByb3RvY29sIGFuZCByZWdpc3RlcmVkIGZpZWxkcyAqLworK3N0YXRpYyBpbnQgcHJvdG9fYWJpc19vbWwgPSAtMTsKKysKKysvKiBPTUwgaGVhZGVyICovCisrc3RhdGljIGludCBoZl9vbWxfbXNnX2Rpc2MgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9wbGFjZW1lbnQgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9zZXF1ZW5jZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2xlbmd0aCA9IC0xOworKy8qIEZPTSBoZWFkZXIgKi8KKytzdGF0aWMgaW50IGhmX29tbF9mb21fbXNndHlwZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9vYmpjbGFzcyA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9pbnN0X2J0cyA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9pbnN0X3RyeCA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9pbnN0X3RzID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2F0dHJfdGFnID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2F0dHJfbGVuID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2F0dHJfdmFsID0gLTE7CisrLyogRk9NIGF0dHJpYnV0ZXMgKi8KKytzdGF0aWMgaW50IGhmX2F0dHJfYWRtX3N0YXRlID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2FyZmNuID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX29wZXJfc3RhdGUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYXZhaWxfc3RhdGUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfZXZlbnRfdHlwZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9zZXZlcml0eSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9iY2NoX2FyZmNuID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2JzaWMgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfdGVzdF9ubyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl90c2MgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfdGVpID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2FjaF9idHNwID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2FjaF90c2xvdCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9hY2hfc3Nsb3QgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfZ3NtX3RpbWUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfY2hhbl9jb21iID0gLTE7CisrLyogSXBhY2Nlc3MgKi8KKytzdGF0aWMgaW50IGhmX29tbF9pcGFfdHJlc19hdHRyX3RhZyA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX2lwYV90cmVzX2F0dHJfbGVuID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90ZXN0X3JlcyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfcnhsZXYgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2JfcnhsZXYgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2FyZmNuID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9mX3F1YWwgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2ZfZXJyID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9yeHF1YWwgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2ZyYW1lX29mZnMgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2ZyYW1lbnJfb2ZmcyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfYnNpYyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfY2VsbF9pZCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfc2kyID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9zaTJiaXMgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX3NpMnRlciA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfY2hhbl9kZXNjID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9yc2xfaXAgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3JzbF9wb3J0ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9wcmltX29tbF9pcCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfcHJpbV9vbWxfcG9ydCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbG9jYXRpb25fbmFtZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdW5pdF9pZCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdW5pdF9uYW1lID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9udl9mbGFncyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnZfbWFzayA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnNsX3Nwb3J0ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9uc2xfZGFkZHIgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX25zbF9kcG9ydCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnNlaSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnN2Y2kgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX2J2Y2kgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3JhYyA9IC0xOworKworKy8qIGluaXRpYWxpemUgdGhlIHN1YnRyZWUgcG9pbnRlcnMgKi8KKytzdGF0aWMgaW50IGV0dF9vbWwgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9vbWxfZm9tID0gLTE7Cisrc3RhdGljIGludCBldHRfb21sX2ZvbV9hdHQgPSAtMTsKKysKKysvKiBEZWNvZGUgdGhpbmdzIGFzIG5hbm9CVFMgdHJhY2VzICovCisrc3RhdGljIGdib29sZWFuIGdsb2JhbF9vbWxfdXNlX25hbm9fYnRzID0gRkFMU0U7CisrCisrc3RhdGljIHByb3RvX3RyZWUgKnRvcF90cmVlOworKworKy8qIFRTIDEyLjIxIENoYXB0ZXIgOC4xIC8gVFMgMDguNTkgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9tc2dfZGlzY192YWxzW10gPSB7CisrCXsgQUJJU19PTV9NRElTQ19GT00sCSJGb3JtYXR0ZWQgTyZNIiB9LAorKwl7IEFCSVNfT01fTURJU0NfTU1JLAkiTU1JIFRyYW5zZmVyIiB9LAorKwl7IEFCSVNfT01fTURJU0NfVFJBVSwJIlRSQVUgTyZNIiB9LAorKwl7IEFCSVNfT01fTURJU0NfTUFOVUYsCSJNYW51ZmFjdHVyZXIgc3BlY2lmaWMiIH0sCisrfTsKKysKKysvKiBUUyAxMi4yMSBDaGFwdGVyIDguMS4xICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfcGxhY2VtZW50X3ZhbHNbXSA9IHsKKysJeyBBQklTX09NX1BMQUNFTUVOVF9PTkxZLAkiT25seSIgfSwKKysJeyBBQklTX09NX1BMQUNFTUVOVF9GSVJTVCwJIkZpcnN0IiB9LAorKwl7IEFCSVNfT01fUExBQ0VNRU5UX01JRERMRSwJIk1pZGRsZSIgfSwKKysJeyBBQklTX09NX1BMQUNFTUVOVF9MQVNULAkiTGFzdCIgfSwKKyt9OworKworKy8qIFRTIDEyLjIxIENoYXB0ZXIgOS4yICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfZm9tX21zZ3R5cGVfdmFsc1tdID0geworKwl7IE5NX01UX0xPQURfSU5JVCwJCSJTb2Z0d2FyZSBMb2FkIEluaXQiIH0sCisrCXsgTk1fTVRfTE9BRF9JTklUX0FDSywJCSJTb2Z0d2FyZSBMb2FkIEluaXQgQUNLIiB9LAorKwl7IE5NX01UX0xPQURfSU5JVF9OQUNLLAkJIlNvZnR3YXJlIExvYWQgSW5pdCBOQUNLIiB9LAorKwl7IE5NX01UX0xPQURfU0VHLAkJIlNvZnR3YXJlIExvYWQgU2VnbWVudCIgfSwKKysJeyBOTV9NVF9MT0FEX1NFR19BQ0ssCQkiU29mdHdhcmUgTG9hZCBTZWdtZW50IEFDSyIgfSwKKysJeyBOTV9NVF9MT0FEX0VORCwJCSJTb2Z0d2FyZSBMb2FkIEVuZCIgfSwKKysJeyBOTV9NVF9MT0FEX0VORF9BQ0ssCQkiU29mdHdhcmUgTG9hZCBFbmQgQUNLIiB9LAorKwl7IE5NX01UX0xPQURfRU5EX05BQ0ssCQkiU29mdHdhcmUgTG9hZCBFbmQgTkFDSyIgfSwKKysJeyBOTV9NVF9TV19BQ1RfUkVRLAkJIlNvZnR3YXJlIEFjdGl2YXRlIFJlcXVlc3QiIH0sCisrCXsgTk1fTVRfU1dfQUNUX1JFUV9BQ0ssCQkiU29mdHdhcmUgQWN0aXZhdGUgUmVxdWVzdCBBQ0siIH0sCisrCXsgTk1fTVRfU1dfQUNUX1JFUV9OQUNLLAkiU29mdHdhcmUgQWN0aXZhdGUgUmVxdWVzdCBOQUNLIiB9LAorKwl7IE5NX01UX0FDVElWQVRFX1NXLAkJIkFjdGl2YXRlIFNvZnR3YXJlIiB9LAorKwl7IE5NX01UX0FDVElWQVRFX1NXX0FDSywJIkFjdGl2YXRlIFNvZnR3YXJlIEFDSyIgfSwKKysJeyBOTV9NVF9BQ1RJVkFURV9TV19OQUNLLAkiQWN0aXZhdGUgU29mdHdhcmUgTkFDSyIgfSwKKysJeyBOTV9NVF9TV19BQ1RJVkFURURfUkVQLAkiU29mdHdhcmUgQWN0aXZhdGVkIFJlcG9ydCIgfSwKKysJeyBOTV9NVF9FU1RBQkxJU0hfVEVJLAkJIkVzdGFibGlzaCBURUkiIH0sCisrCXsgTk1fTVRfRVNUQUJMSVNIX1RFSV9BQ0ssCSJFc3RhYmxpc2ggVEVJIEFDSyIgfSwKKysJeyBOTV9NVF9FU1RBQkxJU0hfVEVJX05BQ0ssCSJFc3RhYmxpc2ggVEVJIE5BQ0siIH0sCisrCXsgTk1fTVRfQ09OTl9URVJSX1NJR04sCQkiQ29ubmVjdCBUZXJyZXN0cmlhbCBTaWduYWxsaW5nIiB9LAorKwl7IE5NX01UX0NPTk5fVEVSUl9TSUdOX0FDSywJIkNvbm5lY3QgVGVycmVzdHJpYWwgU2lnbmFsbGluZyBBQ0siIH0sCisrCXsgTk1fTVRfQ09OTl9URVJSX1NJR05fTkFDSywJIkNvbm5lY3QgVGVycmVzdHJpYWwgU2lnbmFsbGluZyBOQUNLIiB9LAorKwl7IE5NX01UX0RJU0NfVEVSUl9TSUdOLAkJIkRpc2Nvbm5lY3QgVGVycmVzdHJpYWwgU2lnbmFsbGluZyIgfSwKKysJeyBOTV9NVF9ESVNDX1RFUlJfU0lHTl9BQ0ssCSJEaXNjb25uZWN0IFRlcnJlc3RyaWFsIFNpZ25hbGxpbmcgQUNLIiB9LAorKwl7IE5NX01UX0RJU0NfVEVSUl9TSUdOX05BQ0ssCSJEaXNjb25uZWN0IFRlcnJlc3RyaWFsIFNpZ25hbGxpbmcgTkFDSyIgfSwKKysJeyBOTV9NVF9DT05OX1RFUlJfVFJBRiwJCSJDb25uZWN0IFRlcnJlc3RyaWFsIFRyYWZmaWMiIH0sCisrCXsgTk1fTVRfQ09OTl9URVJSX1RSQUZfQUNLLAkiQ29ubmVjdCBUZXJyZXN0cmlhbCBUcmFmZmljIEFDSyIgfSwKKysJeyBOTV9NVF9DT05OX1RFUlJfVFJBRl9OQUNLLAkiQ29ubmVjdCBUZXJyZXN0cmlhbCBUcmFmZmljIE5BQ0siIH0sCisrCXsgTk1fTVRfRElTQ19URVJSX1RSQUYsCQkiRGlzY29ubmVjdCBUZXJyZXN0cmlhbCBUcmFmZmljIiB9LAorKwl7IE5NX01UX0RJU0NfVEVSUl9UUkFGX0FDSywJIkRpc2Nvbm5lY3QgVGVycmVzdHJpYWwgVHJhZmZpYyBBQ0siIH0sCisrCXsgTk1fTVRfRElTQ19URVJSX1RSQUZfTkFDSywJIkRpc2Nvbm5lY3QgVGVycmVzdHJpYWwgVHJhZmZpYyBOQUNLIiB9LAorKwl7IE5NX01UX0NPTk5fTURST1BfTElOSywJIkNvbm5lY3QgTXVsdGktRHJvcCBMaW5rIiB9LAorKwl7IE5NX01UX0NPTk5fTURST1BfTElOS19BQ0ssCSJDb25uZWN0IE11bHRpLURyb3AgTGluayBBQ0siIH0sCisrCXsgTk1fTVRfQ09OTl9NRFJPUF9MSU5LX05BQ0ssCSJDb25uZWN0IE11bHRpLURyb3AgTGluayBOQUNLIiB9LAorKwl7IE5NX01UX0RJU0NfTURST1BfTElOSywJIkRpc2Nvbm5lY3QgTXVsdGktRHJvcCBMaW5rIiB9LAorKwl7IE5NX01UX0RJU0NfTURST1BfTElOS19BQ0ssCSJEaXNjb25uZWN0IE11bHRpLURyb3AgTGluayBBQ0siIH0sCisrCXsgTk1fTVRfRElTQ19NRFJPUF9MSU5LX05BQ0ssCSJEaXNjb25uZWN0IE11bHRpLURyb3AgTGluayBOQUNLIiB9LAorKwl7IE5NX01UX1NFVF9CVFNfQVRUUiwJCSJTZXQgQlRTIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfU0VUX0JUU19BVFRSX0FDSywJIlNldCBCVFMgQXR0cmlidXRlcyBBQ0siIH0sCisrCXsgTk1fTVRfU0VUX0JUU19BVFRSX05BQ0ssCSJTZXQgQlRTIEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9TRVRfUkFESU9fQVRUUiwJCSJTZXQgUmFkaW8gQ2FycmllciBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX1NFVF9SQURJT19BVFRSX0FDSywJIlNldCBSYWRpbyBDYXJyaWVyIEF0dHJpYnV0ZXMgQUNLIiB9LAorKwl7IE5NX01UX1NFVF9SQURJT19BVFRSX05BQ0ssCSJTZXQgUmFkaW8gQ2FycmllciBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfU0VUX0NIQU5fQVRUUiwJCSJTZXQgQ2hhbm5lbCBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX1NFVF9DSEFOX0FUVFJfQUNLLAkiU2V0IENoYW5uZWwgQXR0cmlidXRlcyBBQ0siIH0sCisrCXsgTk1fTVRfU0VUX0NIQU5fQVRUUl9OQUNLLAkiU2V0IENoYW5uZWwgQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX1BFUkZfVEVTVCwJCSJQZXJmb3JtIFRlc3QiIH0sCisrCXsgTk1fTVRfUEVSRl9URVNUX0FDSywJCSJQZXJmb3JtIFRlc3QgQUNLIiB9LAorKwl7IE5NX01UX1BFUkZfVEVTVF9OQUNLLAkJIlBlcmZvcm0gVGVzdCBOQUNLIiB9LAorKwl7IE5NX01UX1RFU1RfUkVQLAkJIlRlc3QgUmVwb3J0IiB9LAorKwl7IE5NX01UX1NFTkRfVEVTVF9SRVAsCQkiU2VuZCBUZXN0IFJlcG9ydCIgfSwKKysJeyBOTV9NVF9TRU5EX1RFU1RfUkVQX0FDSywJIlNlbmQgVGVzdCBSZXBvcnQgQUNLIiB9LAorKwl7IE5NX01UX1NFTkRfVEVTVF9SRVBfTkFDSywJIlNlbmQgVGVzdCBSZXBvcnQgTkFDSyIgfSwKKysJeyBOTV9NVF9TVE9QX1RFU1QsCQkiU3RvcCBUZXN0IiB9LAorKwl7IE5NX01UX1NUT1BfVEVTVF9BQ0ssCQkiU3RvcCBUZXN0IEFDSyIgfSwKKysJeyBOTV9NVF9TVE9QX1RFU1RfTkFDSywJCSJTdG9wIFRlc3QgTkFDSyIgfSwKKysJeyBOTV9NVF9TVEFURUNIR19FVkVOVF9SRVAsCSJTdGF0ZSBDaGFuZ2VkIEV2ZW50IFJlcG9ydCIgfSwKKysJeyBOTV9NVF9GQUlMVVJFX0VWRU5UX1JFUCwJIkZhaWx1cmUgRXZlbnQgUmVwb3J0IiB9LAorKwl7IE5NX01UX1NUT1BfRVZFTlRfUkVQLAkJIlN0b3AgU2VuZGluZyBFdmVudCBSZXBvcnRzIiB9LAorKwl7IE5NX01UX1NUT1BfRVZFTlRfUkVQX0FDSywJIlN0b3AgU2VuZGluZyBFdmVudCBSZXBvcnRzIEFDSyIgfSwKKysJeyBOTV9NVF9TVE9QX0VWRU5UX1JFUF9OQUNLLAkiU3RvcCBTZW5kaW5nIEV2ZW50IFJlcG9ydHMgTkFDSyIgfSwKKysJeyBOTV9NVF9SRVNUX0VWRU5UX1JFUCwJCSJSZXN0YXJ0IFNlbmRpbmcgRXZlbnQgUmVwb3J0cyIgfSwKKysJeyBOTV9NVF9SRVNUX0VWRU5UX1JFUF9BQ0ssCSJSZXN0YXJ0IFNlbmRpbmcgRXZlbnQgUmVwb3J0cyBBQ0siIH0sCisrCXsgTk1fTVRfUkVTVF9FVkVOVF9SRVBfTkFDSywJIlJlc3RhcnQgU2VuZGluZyBFdmVudCBSZXBvcnRzIE5BQ0siIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURSwJCSJDaGFuZ2UgQWRtaW5pc3RyYXRpdmUgU3RhdGUiIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9BQ0ssCSJDaGFuZ2UgQWRtaW5pc3RyYXRpdmUgU3RhdGUgQUNLIiB9LAorKwl7IE5NX01UX0NIR19BRE1fU1RBVEVfTkFDSywJIkNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSBOQUNLIiB9LAorKwl7IE5NX01UX0NIR19BRE1fU1RBVEVfUkVRLAkiQ2hhbmdlIEFkbWluaXN0cmF0aXZlIFN0YXRlIFJlcXVlc3QiIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfQUNLLAkiQ2hhbmdlIEFkbWluaXN0cmF0aXZlIFN0YXRlIFJlcXVlc3QgQUNLIiB9LAorKwl7IE5NX01UX0NIR19BRE1fU1RBVEVfUkVRX05BQ0ssCSJDaGFuZ2UgQWRtaW5pc3RyYXRpdmUgU3RhdGUgUmVxdWVzdCBOQUNLIiB9LAorKwl7IE5NX01UX1JFUF9PVVRTVF9BTEFSTVMsCSJSZXBvcnQgT3V0c3RhbmRpbmcgQWxhcm1zIiB9LAorKwl7IE5NX01UX1JFUF9PVVRTVF9BTEFSTVNfQUNLLAkiUmVwb3J0IE91dHN0YW5kaW5nIEFsYXJtcyBBQ0siIH0sCisrCXsgTk1fTVRfUkVQX09VVFNUX0FMQVJNU19OQUNLLAkiUmVwb3J0IE91dHN0YW5kaW5nIEFsYXJtcyBOQUNLIiB9LAorKwl7IE5NX01UX0NIQU5HRU9WRVIsCQkiQ2hhbmdlb3ZlciIgfSwKKysJeyBOTV9NVF9DSEFOR0VPVkVSX0FDSywJCSJDaGFuZ2VvdmVyIEFDSyIgfSwKKysJeyBOTV9NVF9DSEFOR0VPVkVSX05BQ0ssCSJDaGFuZ2VvdmVyIE5BQ0siIH0sCisrCXsgTk1fTVRfT1BTVEFSVCwJCSJPcHN0YXJ0IiB9LAorKwl7IE5NX01UX09QU1RBUlRfQUNLLAkJIk9wc3RhcnQgQUNLIiB9LAorKwl7IE5NX01UX09QU1RBUlRfTkFDSywJCSJPcHN0YXJ0IE5BQ0siIH0sCisrCXsgTk1fTVRfUkVJTklULAkJCSJSZWluaXRpYWxpemUiIH0sCisrCXsgTk1fTVRfUkVJTklUX0FDSywJCSJSZWluaXRpYWxpemUgQUNLIiB9LAorKwl7IE5NX01UX1JFSU5JVF9OQUNLLAkJIlJlaW5pdGlhbGl6ZSBOQUNLIiB9LAorKwl7IE5NX01UX1NFVF9TSVRFX09VVCwJCSJTZXQgU2l0ZSBPdXRwdXRzIiB9LAorKwl7IE5NX01UX1NFVF9TSVRFX09VVF9BQ0ssCSJTZXQgU2l0ZSBPdXRwdXRzIEFDSyIgfSwKKysJeyBOTV9NVF9TRVRfU0lURV9PVVRfTkFDSywJIlNldCBTaXRlIE91dHB1dHMgTkFDSyIgfSwKKysJeyBOTV9NVF9DSEdfSFdfQ09ORiwJCSJDaGFuZ2UgSFcgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9NVF9DSEdfSFdfQ09ORl9BQ0ssCSJDaGFuZ2UgSFcgQ29uZmlndXJhdGlvbiBBQ0siIH0sCisrCXsgTk1fTVRfQ0hHX0hXX0NPTkZfTkFDSywJIkNoYW5nZSBIVyBDb25maWd1cmF0aW9uIE5BQ0siIH0sCisrCXsgTk1fTVRfTUVBU19SRVNfUkVRLAkJIk1lYXN1cmVtZW50IFJlc3VsdCBSZXF1ZXN0IiB9LAorKwl7IE5NX01UX01FQVNfUkVTX1JFU1AsCQkiTWVhc3VyZW1lbnQgUmVzdWx0IFJlc3BvbnNlIiB9LAorKwl7IE5NX01UX1NUT1BfTUVBUywJCSJTdG9wIE1lYXN1cmVtZW50IiB9LAorKwl7IE5NX01UX1NUQVJUX01FQVMsCQkiU3RhcnQgTWVhc3VyZW1lbnQiIH0sCisrCXsgTk1fTVRfR0VUX0FUVFIsCQkiR2V0IEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfR0VUX0FUVFJfUkVTUCwJCSJHZXQgQXR0cmlidXRlcyBSZXNwb25zZSIgfSwKKysJeyBOTV9NVF9HRVRfQVRUUl9OQUNLLAkJIkdldCBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfU0VUX0FMQVJNX1RIUkVTLAkiU2V0IEFsYXJtIFRocmVzaG9sZCIgfSwKKysJeyBOTV9NVF9TRVRfQUxBUk1fVEhSRVNfQUNLLAkiU2V0IEFsYXJtIFRocmVzaG9sZCBBQ0siIH0sCisrCXsgTk1fTVRfU0VUX0FMQVJNX1RIUkVTX05BQ0ssCSJTZXQgQWxhcm0gVGhyZXNob2xkIE5BQ0siIH0sCisrCS8qIHByb3ByaWV0YXJ5LCBub3QgaW4gdGhlIHN0YW5kYXJkICovCisrCXsgTk1fTVRfSVBBQ0NfUkVTVEFSVCwJCSJJUEEgUmVzdGFydCIgfSwKKysJeyBOTV9NVF9JUEFDQ19SRVNUQVJUX0FDSywJIklQQSBSZXN0YXJ0IEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVCwJIklQQSBSU0wgQ29ubmVjdCIgfSwKKysJeyBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9BQ0ssCSJJUEEgUlNMIENvbm5lY3QgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9DT05ORUNUX05BQ0ssCSJJUEEgUlNMIENvbm5lY3QgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVCwJIklQQSBSU0wgRGlzY29ubmVjdCIgfSwKKysJeyBOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVF9BQ0ssICJJUEEgUlNMIERpc2Nvbm5lY3QgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNUX05BQ0ssICJJUEEgUlNMIERpc2Nvbm5lY3QgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19DT05OX1RSQUYsCSJJUEEgQ29ubmVjdCBUcmFmZmljIiB9LAorKwl7IE5NX01UX0lQQUNDX0NPTk5fVFJBRl9BQ0ssCSJJUEEgQ29ubmVjdCBUcmFmZmljIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19DT05OX1RSQUZfTkFDSywJIklQQSBDb25uZWN0IFRyYWZmaWMgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19ESVNDX1RSQUYsCSJJUEEgRGlzY29ubmVjdCBUcmFmZmljIiB9LAorKwl7IE5NX01UX0lQQUNDX0RJU0NfVFJBRl9BQ0ssCSJJUEEgRGlzY29ubmVjdCBUcmFmZmljIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19ESVNDX1RSQUZfTkFDSywJIklQQSBEaXNjb25uZWN0IFRyYWZmaWMgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19ERUZfQk9PVF9TVywJIklQQSBEZWZhdWx0IEJvb3QgU29mdHdhcmUiIH0sCisrCXsgTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1dfQUNLLAkiSVBBIERlZmF1bHQgQm9vdCBTb2Z0d2FyZSBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1dfTkFDSywJIklQQSBEZWZhdWx0IEJvb3QgU29mdHdhcmUgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSLAkiSVBBIFNldCBOVlJBTSBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfQUNLLAkiSVBBIFNldCBOVlJBTSBBdHRyaWJ1dGVzIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0ssCSJJUEEgU2V0IE5WUkFNIEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19HRVRfTlZBVFRSLAkiSVBBIEdldCBOVlJBTSBBdHRyaWJ1dGVzIiB9LAorKwl7IE5NX01UX0lQQUNDX0dFVF9OVkFUVFJfQUNLLAkiSVBBIEdldCBOVlJBTSBBdHRyaWJ1dGVzIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19HRVRfTlZBVFRSX05BQ0ssCSJJUEEgR2V0IE5WUkFNIEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TRVRfQVRUUiwJCSJJUEEgU2V0IEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfSVBBQ0NfU0VUX0FUVFJfQUNLLAkiSVBBIFNldCBBdHRyaWJ1dGVzIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TRVRfQVRUUl9OQUNLLAkiSVBBIFNldCBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfQVRUUl9DSEdfRVZULAkiSVBBIEF0dHJpYnV0ZSBDaGFuZ2UgRXZlbnQiIH0sCisrCXsgTk1fTVRfSVBBQ0NfU1dfREVBQ1QsCQkiSVBBIFNvZnR3YXJlIERlYWN0aXZhdGUiIH0sCisrCXsgTk1fTVRfSVBBQ0NfU1dfREVBQ1RfQUNLLAkiSVBBIFNvZnR3YXJlIERlYWN0aXZhdGUgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NXX0RFQUNUX05BQ0ssCSJJUEEgU29mdHdhcmUgRGVhY3RpdmF0ZSBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX01FQVNfUkVTX1JFUV9OQUNLLCJJUEEgTWVhc3VyZW1lbnQgUmVzdWx0IFJlcXVlc3QgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TVEFSVF9NRUFTX05BQ0ssCSJJUEEgU3RhcnQgTWVhc3VyZW1lbnQgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TVE9QX01FQVNfTkFDSywJIklQQSBTdG9wIE1lYXN1cmVtZW50IE5BQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9SRVNFVF9SRVNPVVJDRSwJIlNJRSBSZXNldCBSZXNvdXJjZSIgfSwKKysJeyBOTV9NVF9CUzExX0JFR0lOX0RCX1RYLAkiU0lFIEJlZ2luIERhdGFiYXNlIFRyYW5zbWlzc2lvbiIgfSwKKysJeyBOTV9NVF9CUzExX0JFR0lOX0RCX1RYX0FDSywJIlNJRSBCZWdpbiBEYXRhYmFzZSBUcmFuc21pc3Npb24gQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfQkVHSU5fREJfVFhfTkFDSywJIlNJRSBCZWdpbiBEYXRhYmFzZSBUcmFuc21pc3Npb24gTkFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0VORF9EQl9UWCwJCSJTSUUgRW5kIERhdGFiYXNlIFRyYW5zbWlzc2lvbiIgfSwKKysJeyBOTV9NVF9CUzExX0VORF9EQl9UWF9BQ0ssCSJTSUUgRW5kIERhdGFiYXNlIFRyYW5zbWlzc2lvbiBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9FTkRfREJfVFhfTkFDSywJIlNJRSBFbmQgRGF0YWJhc2UgVHJhbnNtaXNzaW9uIE5BQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9DUkVBVEVfT0JKLAkiU0lFIENyZWF0ZSBPYmplY3QiIH0sCisrCXsgTk1fTVRfQlMxMV9DUkVBVEVfT0JKX0FDSywJIlNJRSBDcmVhdGUgT2JqZWN0IEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0NSRUFURV9PQkpfTkFDSywJIlNJRSBDcmVhdGUgT2JqZWN0IE5BQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9ERUxFVEVfT0JKLAkiU0lFIERlbGV0ZSBPYmplY3QiIH0sCisrCXsgTk1fTVRfQlMxMV9ERUxFVEVfT0JKX0FDSywJIlNJRSBEZWxldGUgT2JqZWN0IEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0RFTEVURV9PQkpfTkFDSywJIlNJRSBEZWxldGUgT2JqZWN0IE5BQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9HRVRfU1RBVEUsCQkiU0lFIEdldCBTdGF0ZSIgfSwKKysJeyBOTV9NVF9CUzExX0dFVF9TVEFURV9BQ0ssCSJTSUUgR2V0IFN0YXRlIEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0xNVF9MT0dPTiwJCSJTSUUgTE1UIExvZ29uIiB9LAorKwl7IE5NX01UX0JTMTFfTE1UX0xPR09OX0FDSywJIlNJRSBMTVQgTG9nb24gQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfUkVTVEFSVCwJCSJTSUUgUmVzdGFydCIgfSwKKysJeyBOTV9NVF9CUzExX1JFU1RBUlRfQUNLLAkiU0lFIFJlc3RhcnQgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfRElTQ09OTkVDVCwJIlNJRSBEaXNjb25uZWN0IEJUUyIgfSwKKysJeyBOTV9NVF9CUzExX0RJU0NPTk5FQ1RfQUNLLAkiU0lFIERpc2Nvbm5lY3QgQlRTIEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0xNVF9MT0dPRkYsCSJTSUUgTE1UIExvZ29mZiIgfSwKKysJeyBOTV9NVF9CUzExX0xNVF9MT0dPRkZfQUNLLAkiU0lFIExNVCBMb2dvZmYgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfUkVDT05ORUNULAkJIlNJRSBSZWNvbm5lY3QgQlRTIiB9LAorKwl7IE5NX01UX0JTMTFfUkVDT05ORUNUX0FDSywJIlNJRSBSZWNvbm5lY3QgQlRTIEFDSyIgfSwKKyt9OworKworKy8qIFRTIDEyLjIxIFNlY3Rpb24gOS4yOiBPYmplY3QgQ2xhc3MgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9mb21fb2JqY2xhc3NfdmFsc1tdID0geworKwl7IE5NX09DX1NJVEVfTUFOQUdFUiwJCSJCVFMgU2l0ZSBNYW5hZ2VyIiB9LAorKwl7IE5NX09DX0JUUywJCQkiQlRTIiB9LAorKwl7IE5NX09DX1JBRElPX0NBUlJJRVIsCQkiUmFkaW8gQ2FycmllciIgfSwKKysJeyBOTV9PQ19DSEFOTkVMLAkJIlJhZGlvIENoYW5uZWwiIH0sCisrCXsgTk1fT0NfQkFTRUJfVFJBTlNDLAkJIkJhc2ViYW5kIFRyYW5zY2VpdmVyIiB9LAorKwkvKiBwcm9wcmlldGFyeSwgdmVuZG9yIHNwZWNpZmljICovCisrCXsgTk1fT0NfQlMxMV9BREpDLAkJIlNJRSBBZGphY2VuZCBDaGFubmVsIiB9LAorKwl7IE5NX09DX0JTMTFfSEFORE9WRVIsCQkiU0lFIEhhbmRvdmVyIiB9LAorKwl7IE5NX09DX0JTMTFfUFdSX0NUUkwsCQkiU0lFIFBvd2VyIENvbnRyb2wiIH0sCisrCXsgTk1fT0NfQlMxMV9CVFNFLAkJIlNJRSBCVFNFIiB9LAorKwl7IE5NX09DX0JTMTFfUkFDSywJCSJTSUUgUmFjayIgfSwKKysJeyBOTV9PQ19CUzExLAkJCSJTSUUgU2llbWVuc0hXIiB9LAorKwl7IE5NX09DX0JTMTFfVEVTVCwJCSJTSUUgVGVzdCIgfSwKKysJeyBOTV9PQ19CUzExX0VOVkFCVFNFLAkJIlNJRSBFbnZhQlRTRSIgfSwKKysJeyBOTV9PQ19CUzExX0JQT1JULAkJIlNJRSBCUG9ydCIgfSwKKysJeyBOTV9PQ19HUFJTX05TRSwJCSJHUFJTIE5TRSIgfSwKKysJeyBOTV9PQ19HUFJTX0NFTEwsCQkiR1BSUyBDZWxsIiB9LAorKwl7IE5NX09DX0dQUlNfTlNWQzAsCQkiR1BSUyBOU1ZDMCIgfSwKKysJeyBOTV9PQ19HUFJTX05TVkMxLAkJIkdQUlMgTlNWQzEiIH0sCisrCXsgTk1fT0NfTlVMTCwJCQkiTlVMTCIgfSwKKyt9OworKworKy8qIFRTIDEyLjIxIFNlY3Rpb24gOS40OiBBdHRyaWJ1dGVzICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfZm9tX2F0dHJfdmFsc1tdID0geworKwl7IE5NX0FUVF9BQklTX0NIQU5ORUwsCQkiQS1iaXMgQ2hhbm5lbCIgfSwKKysJeyBOTV9BVFRfQUREX0lORk8sCQkiQWRkaXRpb25hbCBJbmZvcm1hdGlvbiIgfSwKKysJeyBOTV9BVFRfQUREX1RFWFQsCQkiQWRkaXRpb25hbCBUZXh0IiB9LAorKwl7IE5NX0FUVF9BRE1fU1RBVEUsCQkiQWRtaW5pc3RyYXRpdmUgU3RhdGUiIH0sCisrCXsgTk1fQVRUX0FSRkNOX0xJU1QsCQkiQVJGQ04gTGlzdCIgfSwKKysJeyBOTV9BVFRfQVVUT05fUkVQT1JULAkJIkF1dG9ub21vdXNseSBSZXBvcnQiIH0sCisrCXsgTk1fQVRUX0FWQUlMX1NUQVRVUywJCSJBdmFpbGFiaWxpdHkgU3RhdHVzIiB9LAorKwl7IE5NX0FUVF9CQ0NIX0FSRkNOLAkJIkJDQ0ggQVJGQ04iIH0sCisrCXsgTk1fQVRUX0JTSUMsCQkJIkJTSUMiIH0sCisrCXsgTk1fQVRUX0JUU19BSVJfVElNRVIsCQkiQlRTIEFpciBUaW1lciIgfSwKKysJeyBOTV9BVFRfQ0NDSF9MX0lfUCwJCSJDQ0NIIExvYWQgSW5kaWNhdGlvbiBQZXJpb2QiIH0sCisrCXsgTk1fQVRUX0NDQ0hfTF9ULAkJIkNDQ0ggTG9hZCBUaHJlc2hvbGQiIH0sCisrCXsgTk1fQVRUX0NIQU5fQ09NQiwJCSJDaGFubmVsIENvbWJpbmF0aW9uIiB9LAorKwl7IE5NX0FUVF9DT05OX0ZBSUxfQ1JJVCwJIkNvbm5lY3Rpb24gRmFpbCBDcml0ZXJpb24iIH0sCisrCXsgTk1fQVRUX0RFU1QsCQkJIkRlc3RpbmF0aW9uIiB9LAorKwl7IE5NX0FUVF9FVkVOVF9UWVBFLAkJIkV2ZW50IFR5cGUiIH0sCisrCXsgTk1fQVRUX0ZJTEVfSUQsCQkiRmlsZSBJRCIgfSwKKysJeyBOTV9BVFRfRklMRV9WRVJTSU9OLAkJIkZpbGUgVmVyc2lvbiIgfSwKKysJeyBOTV9BVFRfR1NNX1RJTUUsCQkiR1NNIFRpbWUiIH0sCisrCXsgTk1fQVRUX0hTTiwJCQkiSFNOIiB9LAorKwl7IE5NX0FUVF9IV19DT05GSUcsCQkiSFcgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSFdfREVTQywJCSJIVyBEZXNjcmlwdGlvbiIgfSwKKysJeyBOTV9BVFRfSU5UQVZFX1BBUkFNLAkJIkludGF2ZSBQYXJhbWV0ZXIiIH0sCisrCXsgTk1fQVRUX0lOVEVSRl9CT1VORCwJCSJJbnRlcmZlcmVuY2UgQm91bmRhcmllcyIgfSwKKysJeyBOTV9BVFRfTElTVF9SRVFfQVRUUiwJCSJMaXN0IG9mIHJlcXVpcmVkIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fQVRUX01BSU8sCQkJIk1BSU8iIH0sCisrCXsgTk1fQVRUX01BTlVGX1NUQVRFLAkJIk1hbnVmYWN0dXJlciBEZXBlbmRlbnQgU3RhdGUiIH0sCisrCXsgTk1fQVRUX01BTlVGX1RIUkVTSCwJCSJNYW51ZmFjdHVyZXIgRGVwZW5kZW50IFRocmVzaG9sZHMiIH0sCisrCXsgTk1fQVRUX01BTlVGX0lELAkJIk1hbnVmYWN0dXJlciBJZCIgfSwKKysJeyBOTV9BVFRfTUFYX1RBLAkJIk1heGltdW0gVGltaW5nIEFkdmFuY2UiIH0sCisrCXsgTk1fQVRUX01EUk9QX0xJTkssCQkiTXVsdGktZHJvcCBCU0MgTGluayIgfSwKKysJeyBOTV9BVFRfTURST1BfTkVYVCwJCSJNdWx0aS1kcm9wIG5leHQgQlRTIExpbmsiIH0sCisrCXsgTk1fQVRUX05BQ0tfQ0FVU0VTLAkJIk5BQ0sgQ2F1c2VzIiB9LAorKwl7IE5NX0FUVF9OWTEsCQkJIk55MSIgfSwKKysJeyBOTV9BVFRfT1BFUl9TVEFURSwJCSJPcGVyYXRpb25hbCBTdGF0ZSIgfSwKKysJeyBOTV9BVFRfT1ZFUkxfUEVSSU9ELAkJIk92ZXJsb2FkIFBlcmlvZCIgfSwKKysJeyBOTV9BVFRfUEhZU19DT05GLAkJIlBoeXNpY2FsIENvbmZpZyIgfSwKKysJeyBOTV9BVFRfUE9XRVJfQ0xBU1MsCQkiUG93ZXIgQ2xhc3MiIH0sCisrCXsgTk1fQVRUX1BPV0VSX1RIUkVTSCwJCSJQb3dlciBPdXRwdXQgVGhyZXNob2xkcyIgfSwKKysJeyBOTV9BVFRfUFJPQl9DQVVTRSwJCSJQcm9iYWJsZSBDYXVzZSIgfSwKKysJeyBOTV9BVFRfUkFDSF9CX1RIUkVTSCwJCSJSQUNIIEJ1c3kgVGhyZXNob2xkIiB9LAorKwl7IE5NX0FUVF9MREFWR19TTE9UUywJCSJSQUNIIExvYWQgQXZlcmFnaW5nIFNsb3RzIiB9LAorKwl7IE5NX0FUVF9SQURfU1VCQywJCSJSYWRpbyBTdWIgQ2hhbm5lbCIgfSwKKysJeyBOTV9BVFRfUkZfTUFYUE9XUl9SLAkJIlJGIE1heCBQb3dlciBSZWR1Y3Rpb24iIH0sCisrCXsgTk1fQVRUX1NJVEVfSU5QVVRTLAkJIlNpdGUgSW5wdXRzIiB9LAorKwl7IE5NX0FUVF9TSVRFX09VVFBVVFMsCQkiU2l0ZSBPdXRwdXRzIiB9LAorKwl7IE5NX0FUVF9TT1VSQ0UsCQkiU291cmNlIiB9LAorKwl7IE5NX0FUVF9TUEVDX1BST0IsCQkiU3BlY2lmaWMgUHJvYmxlbXMiIH0sCisrCXsgTk1fQVRUX1NUQVJUX1RJTUUsCQkiU3RhcnRpbmcgVGltZSIgfSwKKysJeyBOTV9BVFRfVDIwMCwJCQkiVDIwMCIgfSwKKysJeyBOTV9BVFRfVEVJLAkJCSJURUkiIH0sCisrCXsgTk1fQVRUX1RFU1RfRFVSLAkJIlRlc3QgRHVyYXRpb24iIH0sCisrCXsgTk1fQVRUX1RFU1RfTk8sCQkiVGVzdCBObyIgfSwKKysJeyBOTV9BVFRfVEVTVF9SRVBPUlQsCQkiVGVzdCBSZXBvcnQgSW5mbyIgfSwKKysJeyBOTV9BVFRfVlNXUl9USFJFU0gsCQkiVlNXUiBUaHJlc2hvbGRzICIgfSwKKysJeyBOTV9BVFRfV0lORE9XX1NJWkUsCQkiV2luZG93IFNpemUiIH0sCisrCXsgTk1fQVRUX0JTMTFfUlNTSV9PRkZTLAkiU0lFIFJTU0kgT2Zmc2V0IiB9LAorKwl7IE5NX0FUVF9CUzExX1RYUFdSLAkJIlNJRSBUWCBQb3dlciIgfSwKKysJeyBOTV9BVFRfQlMxMV9ESVZFUlNJVFksCSJTSUUgRGl2ZXJzaXR5IiB9LAorKwl7IE5NX0FUVF9UU0MsCQkJIlRyYWluaW5nIFNlcXVlbmNlIENvZGUiIH0sCisrCXsgTk1fQVRUX1NXX0NPTkZJRywJCSJTVyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9TV19ERVNDUiwJCSJTVyBEZXNjcmlwdGlvbiIgfSwKKysJeyBOTV9BVFRfU0VWRVJJVFksCQkiUGVyY2VpdmVkIFNldmVyaXR5IiB9LAorKwl7IE5NX0FUVF9HRVRfQVJJLAkJIkdldCBBUkkiIH0sCisrCXsgTk1fQVRUX0hXX0NPTkZfQ0hHLAkJIkhXIENvbmZpZ3VyYXRpb24gQ2hhbmdlIiB9LAorKwl7IE5NX0FUVF9PVVRTVF9BTEFSTSwJCSJPdXRzdGFuZGluZyBBbGFybSIgfSwKKysJeyBOTV9BVFRfRklMRV9EQVRBLAkJIkZpbGUgRGF0YSIgfSwKKysJeyBOTV9BVFRfTUVBU19SRVMsCQkiTWVhc3VyZW1lbnQgUmVzdWx0IiB9LAorKwl7IE5NX0FUVF9NRUFTX1RZUEUsCQkiTWVhc3VyZW1lbnQgVHlwZSIgfSwKKysJeyBOTV9BVFRfQlMxMV9FU05fRldfQ09ERV9OTywJIlNJRSBFU04gRlcgQ29kZSBOdW1iZXIiIH0sCisrCXsgTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk8sCSJTSUUgRVNOIEhXIENvZGUgTnVtYmVyIiB9LAorKwl7IE5NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMLAkiU0lFIEVTTiBQQ0IgU2VyaWFsIE51bWJlciIgfSwKKysJeyBOTV9BVFRfQlMxMV9FWENFU1NJVkVfRElTVEFOQ0UsICJTSUUgRXhjZXNzaXZlIERpc3RhbmNlIiB9LAorKwl7IE5NX0FUVF9CUzExX0FMTF9URVNUX0NBVEcsCSJTSUUgQWxsIFRlc3QgQ2F0ZWdvcmllcyIgfSwKKysJeyBOTV9BVFRfQlMxMV9CVFNMU19IT1BQSU5HLAkiU0lFIEJUUyBMUyBIb3BwaW5nIiB9LAorKwl7IE5NX0FUVF9CUzExX0NFTExfQUxMT0NfTlIsCSJTSUUgQ2VsbCBBbGxvY2F0aW9uIE51bWJlciIgfSwKKysJeyBOTV9BVFRfQlMxMV9DRUxMX0dMT0JBTF9JRCwJIlNJRSBDZWxsIEdsb2JhbCBJRCIgfSwKKysJeyBOTV9BVFRfQlMxMV9FTkFfSU5URVJGX0NMQVNTLAkiU0lFIEVuYWJsZSBJbnRlcmZlcmVuY2UgQ2xhc3MiIH0sCisrCS8qIEZJWE1FICovCisrCXsgTk1fQVRUX0JTMTFfRU5BX01TX1BXUl9DVFJMLAkiU0lFIEVuYWJsZSBNUyBQb3dlciBDb250cm9sIiB9LAorKwl7IE5NX0FUVF9CUzExX0VOQV9QV1JfQkRHVF9ITywJIlNJRSBFbmFibGUgUG93ZXIgQnVkZ2V0IEhPIiB9LAorKwl7IE5NX0FUVF9CUzExX0VOQV9SWExFVl9ITywJIlNJRSBFbmFibGUgUnhMZXZlbCBITyIgfSwKKysJeyBOTV9BVFRfQlMxMV9FTkFfUlhRVUFMX0hPLAkiU0lFIEVuYWJsZSBSeFF1YWwgSE8iIH0sCisrCXsgTk1fQVRUX0JTMTFfRkFDQ0hfUVVBTCwJIlNJRSBGQUNDSCBRdWFsaXR5IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19EU1RfSVAsCQkiSVBBIERlc3RpbmF0aW9uIElQIEFkZHJlc3MiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JULAkiSVBBIERlc3Rpb25hdGlvbiBJUCBQb3J0IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TU1JDLAkJIklQQSBSVFAgU1NSQyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUlRQX1BBWUxEX1RZUEUsCSJJUEEgUlRQIFBheWxvYWQgVHlwZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQkFTRUJfSUQsCSJJUEEgQmFzZWJhbmQgSWRlbnRpZmllciIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU1RSRUFNX0lELAkiSVBBIFN0cmVhbSBJZGVudGlmaWVyIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19OVl9GTEFHUywJIklQQSBOVlJBTSBGbGFncyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfRlJFUV9DVFJMLAkiSVBBIEZyZXF1ZW5jeSBDb250cm9sIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkcsCSJJUEEgUHJpbWFyeSBPTUwgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TRUNfT01MX0NGRywJIklQQSBTZWNvbmRhcnkgT01MIENvbmZpZyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfSVBfSUZfQ0ZHLAkiSVBBIElQIEludGVyZmFjZSBDb25maWciIH0sCisrCXsgTk1fQVRUX0lQQUNDX0lQX0dXX0NGRywJIklQQSBJUCBHYXRld2F5IENvbmZpZyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfSU5fU0VSVl9USU1FLAkiSVBBIEluIFNlcnZpY2UgVGltZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVFJYX0JUU19BU1MsCSJJUEEgVFJYIEJUUyBBc3NpZ25tZW50IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19MT0NBVElPTiwJIklQQSBCVFMgTG9jYXRpb24gTmFtZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUEFHSU5HX0NGRywJIklQQSBQYWdpbmcgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfRklMRV9EQVRBLAkiSVBBIEZpbGUgRGF0YSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVU5JVF9JRCwJCSJJUEEgVW5pdCBJRCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUEFSRU5UX1VOSVRfSUQsCSJJUEEgUGFyZW50IFVuaXQgSUQiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1VOSVRfTkFNRSwJIklQQSBVbml0IE5hbWUiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NOTVBfQ0ZHLAkiSVBBIFNOTVAgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkdfTElTVCwgIklQQSBQcmltYXJ5IE9NTCBDb25maWcgTGlzdCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfRkJfVE9VVCwiSVBBIFByaW1hcnkgT01MIEZhbGxiYWNrIFRpbWVvdXQiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0NVUl9TV19DRkcsCSJJUEEgQ3VycmVudCBTb2Z0d2FyZSBDb25maWciIH0sCisrCXsgTk1fQVRUX0lQQUNDX1RJTUlOR19CVVMsCSJJUEEgVGltaW5nIEJ1cyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQ0dJLAkJIklQQSBDR0kiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1JBQywJCSJJUEEgUkFDIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19PQkpfVkVSU0lPTiwJIklQQSBPYmplY3QgVmVyc2lvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfR1BSU19QQUdJTkdfQ0ZHLAkiSVBBIEdQUlMgUGFnaW5nIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX05TRUksCQkiSVBBIE5TRUkiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0JWQ0ksCQkiSVBBIEJWQ0kiIH0sCisrCXsgTk1fQVRUX0lQQUNDX05TVkNJLAkJIklQQSBOU1ZDSSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTlNfQ0ZHLAkJIklQQSBOUyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19CU1NHUF9DRkcsCSJJUEEgQlNTR1AgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTlNfTElOS19DRkcsCSJJUEEgTlMgTGluayBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19STENfQ0ZHLAkJIklQQSBSTEMgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQUxNX1RIUkVTSF9MSVNULAkiSVBBIEFsYXJtIFRocmVzaG9sZCBMaXN0IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19NT05JVF9WQUxfTElTVCwJIklQQSBNb25pdG9yZWQgVmFsdWUgTGlzdCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVElCX0NPTlRST0wsCSJJUEEgVGltaW5nIEludGVyZmFjZSBCdXMgQ29udHJvbCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU1VQUF9GRUFUVVJFUywJIklQQSBTdXBwb3J0ZWQgRmVhdHVyZXMiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0NPRElOR19TQ0hFTUVTLAkiSVBBIENvZGluZyBTY2hlbWVzIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19STENfQ0ZHXzIsCSJJUEEgUkxDIENvbmZpZ3VyYXRpb24gMiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfSEVBUlRCX1RPVVQsCSJJUEEgSGVhcnRiZWF0IFRpbWVvdXQiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1VQVElNRSwJCSJJUEEgVXB0aW1lIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19STENfQ0ZHXzMsCSJJUEEgUkxDIENvbmZpZ3VyYXRpb24gMyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU1NMX0NGRywJCSJJUEEgU1NMIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NFQ19QT1NTSUJMRSwJIklQQSBTZWN1cml0eSBQb3NzaWJsZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfSU1MX1NTTF9TVEFURSwJIklQQSBJTUwgU1NMIFN0YXRlIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19SRVZPQ19EQVRFLAkiSVBBIFJldm9jYXRpb24gRGF0ZSIgfSwKKysJLyogRklYTUU6IE1vcmUgU0lFICovCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC40OiBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2FkbV9zdGF0ZV92YWxzW10gPSB7CisrCXsgTk1fU1RBVEVfTE9DS0VELAkJIkxvY2tlZCIgfSwKKysJeyBOTV9TVEFURV9VTkxPQ0tFRCwJCSJVbmxvY2tlZCIgfSwKKysJeyBOTV9TVEFURV9TSFVURE9XTiwJCSJTaHV0ZG93biIgfSwKKysJeyBOTV9TVEFURV9OVUxMLAkJIk51bGwiIH0sCisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9vcGVyX3N0YXRlX3ZhbHNbXSA9IHsKKysJeyAxLAkiRGlzYWJsZWQiIH0sCisrCXsgMiwJIkVuYWJsZWQiIH0sCisrCXsgMHhmZiwJIk5VTEwiIH0sCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC43IEF2YWlsYWJpbGl0eSBTdGF0dXMgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9hdmFpbF9zdGF0ZV92YWxzW10gPSB7CisrCXsgMCwJIkluIHRlc3QiIH0sCisrCXsgMSwJIkZhaWxlZCIgfSwKKysJeyAyLAkiUG93ZXIgb2ZmIiB9LAorKwl7IDMsCSJPZmYgbGluZSIgfSwKKysJeyA1LAkiRGVwZW5kZW5jeSIgfSwKKysJeyA2LAkiRGVncmFkZWQiIH0sCisrCXsgNywgCSJOb3QgaW5zdGFsbGVkIiB9LAorKwl7IDB4ZmYsCSJPSyIgfSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjEzOiBDaGFubmVsIENvbWJpbmF0aW9uICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfY2hhbl9jb21iX3ZhbHNbXSA9IHsKKysJeyBOTV9DSEFOQ19UQ0hGdWxsLAkJIlRDSC9GIiB9LAorKwl7IE5NX0NIQU5DX1RDSEhhbGYsCQkiVENIL0giIH0sCisrCXsgTk1fQ0hBTkNfVENISGFsZjIsCQkiVENIL0ggMiIgfSwKKysJeyBOTV9DSEFOQ19TRENDSCwJCSJTRENDSCIgfSwKKysJeyBOTV9DSEFOQ19tYWluQkNDSCwJCSJNYWluIEJDQ0giIH0sCisrCXsgTk1fQ0hBTkNfQkNDSENvbWIsCQkiQ29tYmluZWQgQkNDSCIgfSwKKysJeyBOTV9DSEFOQ19CQ0NILAkJIkJDQ0giIH0sCisrCXsgTk1fQ0hBTkNfQkNDSF9DQkNILAkJIkJDQ0grQ0JDSCIgfSwKKysJeyBOTV9DSEFOQ19TRENDSF9DQkNILAkJIlNEQ0NIK0NCQ0giIH0sCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC4xNjogRXZlbnQgVHlwZSAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2V2ZW50X3R5cGVfdmFsc1tdID0geworKwl7IE5NX0VWVF9DT01NX0ZBSUwsCQkiQ29tbXVuaWNhdGlvbiBGYWlsdXJlIiB9LAorKwl7IE5NX0VWVF9RT1NfRkFJTCwJCSJRb1MgRmFpbHVyZSIgfSwKKysJeyBOTV9FVlRfUFJPQ19GQUlMLAkJIlByb2Nlc3NvciBGYWlsdXJlIiB9LAorKwl7IE5NX0VWVF9FUVVJUF9GQUlMLAkJIkVxdWlwbWVudCBGYWlsdXJlIiB9LAorKwl7IE5NX0VWVF9FTlZfRkFJTCwJCSJFbnZpcm9ubWVudCBGYWlsdXJlIiB9LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuNjM6IFBlcmNlaXZlZCBTZXZlcml0eSAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX3NldmVyaXR5X3ZhbHNbXSA9IHsKKysJeyBOTV9TRVZFUl9DRUFTRUQsCQkiQ2Vhc2VkIiB9LAorKwl7IE5NX1NFVkVSX0NSSVRJQ0FMLAkJIkNyaXRpY2FsIiB9LAorKwl7IE5NX1NFVkVSX01BSk9SLAkJIk1ham9yIiB9LAorKwl7IE5NX1NFVkVSX01JTk9SLAkJIk1pbm9yIiB9LAorKwl7IE5NX1NFVkVSX1dBUk5JTkcsCQkiV2FybmluZyIgfSwKKysJeyBOTV9TRVZFUl9JTkRFVEVSTUlOQVRFLAkiSW5kZXRlcm1pbmF0ZSIgfSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjM2OiBOQUNLIENhdXNlcyAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX25hY2tfY2F1c2VbXSA9IHsKKysJeyBOTV9OQUNLX0lOQ09SUl9TVFJVQ1QsCSJJbmNvcnJlY3QgbWVzc2FnZSBzdHJ1Y3R1cmUiIH0sCisrCXsgTk1fTkFDS19NU0dUWVBFX0lOVkFMLAkiSW52YWxpZCBtZXNzYWdlIHR5cGUgdmFsdWUiIH0sCisrCXsgTk1fTkFDS19PQkpDTEFTU19JTlZBTCwJIkludmFsaWQgT2JqZWN0IGNsYXNzIHZhbHVlIiB9LAorKwl7IE5NX05BQ0tfT0JKQ0xBU1NfTk9UU1VQUCwJIk9iamVjdCBDbGFzcyBub3Qgc3VwcG9ydGVkIiB9LAorKwl7IE5NX05BQ0tfQlRTTlJfVU5LTiwJCSJCVFMgTnVtYmVyIHVua25vd24iIH0sCisrCXsgTk1fTkFDS19UUlhOUl9VTktOLAkJIlRSWCBOdW1iZXIgdW5rbm93biIgfSwKKysJeyBOTV9OQUNLX09CSklOU1RfVU5LTiwJCSJPYmplY3QgSW5zdGFuY2UgdW5rbm93biIgfSwKKysJeyBOTV9OQUNLX0FUVFJJRF9JTlZBTCwJCSJJbnZhbGlkIEF0dHJpYnV0ZSBJRCB2YWx1ZSIgfSwKKysJeyBOTV9OQUNLX0FUVFJJRF9OT1RTVVBQLAkiQXR0cmlidXRlIElEIG5vdCBzdXBwb3J0ZWQiIH0sCisrCXsgTk1fTkFDS19QQVJBTV9SQU5HRSwJCSJQYXJhbWV0ZXIgdmFsdWUgb3V0IG9mIHJhbmdlIiB9LAorKwl7IE5NX05BQ0tfQVRUUkxJU1RfSU5DT05TSVNURU5ULCAiSW5jb25zaXN0ZW5jeSBpbiBBdHRyaWJ1dGUgbGlzdCIgfSwKKysJeyBOTV9OQUNLX1NQRUNfSU1QTF9OT1RTVVBQLAkiU3BlY2lmaWVkIEltcGxlbWVudGF0aW9uIG5vdCBzdXBwb3J0ZWQiIH0sCisrCXsgTk1fTkFDS19DQU5UX1BFUkZPUk0sCQkiTWVzc2FnZSBjYW5ub3QgYmUgcGVyZm9ybWVkIiB9LAorKwl7IE5NX05BQ0tfUkVTX05PVElNUEwsCQkiUmVzb3VyY2Ugbm90IGltcGxlbWVudGVkIiB9LAorKwl7IE5NX05BQ0tfUkVTX05PVEFWQUlMLAkJIlJlc291cmNlIG5vdCBhdmFpbGFibGUiIH0sCisrCXsgTk1fTkFDS19GUkVRX05PVEFWQUlMLAkiRnJlcXVlbmN5IG5vdCBhdmFpbGFibGUiIH0sCisrCXsgTk1fTkFDS19URVNUX05PVFNVUFAsCQkiVGVzdCBub3Qgc3VwcG9ydGVkIiB9LAorKwl7IE5NX05BQ0tfQ0FQQUNJVFlfUkVTVFIsCSJDYXBhY2l0eSByZXN0cmljdGlvbnMiIH0sCisrCXsgTk1fTkFDS19QSFlTQ0ZHX05PVFBFUkZPUk0sCSJQaHlzIGNvbmZpZyBjYW5ub3QgYmUgcGVyZm9ybWVkIiB9LAorKwl7IE5NX05BQ0tfVEVTVF9OT1RJTklULAkJIlRlc3Qgbm90IGluaXRpYXRlZCIgfSwKKysJeyBOTV9OQUNLX1BIWVNDRkdfTk9UUkVTVE9SRSwJIlBoeXMgY29uZmlnIGNhbm5vdCBiZSByZXN0b3JlZCIgfSwKKysJeyBOTV9OQUNLX1RFU1RfTk9TVUNILAkJIk5vIHN1Y2ggVGVzdCIgfSwKKysJeyBOTV9OQUNLX1RFU1RfTk9TVE9QLAkJIlRlc3QgY2Fubm90IGJlIHN0b3BwZWQiIH0sCisrCXsgTk1fTkFDS19NU0dJTkNPTlNJU1RfUEhZU0NGRywJIk1lc3NhZ2UgaW5jb25zaXN0ZW4gd2l0aCBwaHlzaWNhbCBjb25maWciIH0sCisrCXsgTk1fTkFDS19GSUxFX0lOQ09NUExFVEUsCSJDb21wbGV0ZSBmaWxlIG5vdCByZWNlaXZlZCIgfSwKKysJeyBOTV9OQUNLX0ZJTEVfTk9UQVZBSUwsCSJGaWxlIG5vdCBhdmFpbGFibGUgYXQgZGVzdGluYXRpb24iIH0sCisrCXsgTk1fTkFDS19GSUxFX05PVEFDVElWQVRFLAkiRmlsZSBjYW5ub3QgYmUgYWN0aXZhdGVkIiB9LAorKwl7IE5NX05BQ0tfUkVRX05PVF9HUkFOVCwJIlJlcXVlc3Qgbm90IGdyYW50ZWQiIH0sCisrCXsgTk1fTkFDS19XQUlULAkJCSJXYWl0IiB9LAorKwl7IE5NX05BQ0tfTk9USF9SRVBPUlRfRVhJU1QsCSJOb3RoaW5nIHJlcG9ydGFibGUgZXhpc3RpbmciIH0sCisrCXsgTk1fTkFDS19NRUFTX05PVFNVUFAsCQkiTWVhc3VyZW1lbnQgbm90IHN1cHBvcnRlZCIgfSwKKysJeyBOTV9OQUNLX01FQVNfTk9UU1RBUlQsCSJNZWFzdXJlbWVudCBub3Qgc3RhcnRlZCIgfSwKKysJeyAweGZmLAkJCQkiTlVMTCIgfSwKKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX3Rlc3Rfbm9fdmFsc1tdID0geworKwl7IE5NX0lQQUNDX1RFU1ROT19STE9PUF9BTlQsCSJSYWRpbyBMb29wIHRlc3QgdmlhIGFudGVubmEiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX1JMT09QX1hDVlIsCSJSYWRpbyBMb29wIHRlc3QgdmlhIHRyYW5zY2VpdmVyIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19GVU5DX09CSiwJIkJUUyBGdW5jdGlvbmFsIG9iamVjdCBzZWxmIHRlc3QiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0NIQU5fVVNBR0UsCSJDaGFubmVsIFVzYWdlIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NIX0NIQU5fVVNBR0UsICJCQ0NIIENoYW5uZWwgVXNhZ2UiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0ZSRVFfU1lOQywJIkZyZXF1ZW5jeSBTeW5jaHJvbml6YXRpb24iIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0JDQ0hfSU5GTywJIkJDQ0ggSW5mb3JtYXRpb24iIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX1RYX0JFQUNPTiwJIlRyYW5zbWl0IEJlYWNvbiIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fU1lTSU5GT19NT05JVE9SLCAiU3lzSW5mbyBNb25pdG9yIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NDSF9NT05JVE9SLCAiQkNDSCAmIENDQ0ggTW9uaXRvciIgfSwKKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgaXBhY2NfdGVzdF9yZXNfdmFsc1tdID0geworKwl7IE5NX0lQQUNDX1RFU1RSRVNfU1VDQ0VTUywJIlN1Y2Nlc3MiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVFJFU19USU1FT1VULAkiVGltZW91dCIgfSwKKysJeyBOTV9JUEFDQ19URVNUUkVTX05PX0NIQU5TLAkiTm8gc3VpdGFibGUgY2hhbm5lbHMgYXZhaWxhYmxlIiB9LAorKwl7IE5NX0lQQUNDX1RFU1RSRVNfUEFSVElBTCwJIlBhcnRpYWwiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVFJFU19TVE9QUEVELAkiU3RvcHBlZCIgfSwKKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgaXBhY2NfdGVzdHJlc19pZV92YWxzW10gPSB7CisrCXsgTk1fSVBBQ0NfVFJfSUVfRlJFUV9FUlJfTElTVCwJIkZyZXF1ZW5jeSBFcnJvciBMaXN0IiB9LAorKwl7IE5NX0lQQUNDX1RSX0lFX0NIQU5fVVNBR0UsCSJDaGFubmVsIFVzYWdlIiB9LAorKwl7IE5NX0lQQUNDX1RSX0lFX0JDQ0hfSU5GTywJIkJDQ0ggSW5mb3JtYXRpb24iIH0sCisrCXsgTk1fSVBBQ0NfVFJfSUVfUkVTVUxUX0RFVEFJTFMsIlJlc3VsdCBEZXRhaWxzIiB9LAorKwl7IE5NX0lQQUNDX1RSX0lFX0ZSRVFfRVJSLAkiRnJlcXVlbmN5IEVycm9yIiB9LAorK307CisrCisrLyogUGFyc2UgdGhlIGlwLmFjY2VzcyBzcGVjaWZpYyBCQ0NIIEluZm9ybWF0aW9uIElFIGVtYmVkZGVkIGludG8gdGhlIFRlc3QKKysgKiBSZXBvcnQgSUUgKi8KKytzdGF0aWMgZ2ludAorK2lwYWNjX3RyX2llX2JjY2godHZidWZmX3QgKnR2YiwgcHJvdG9fdHJlZSAqYXR0X3RyZWUsIGludCBvZmZzZXQpCisreworKwlndWludDE2IGJpbmZvX3R5cGUsIHRtcDsKKysKKysJYmluZm9fdHlwZSA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwlvZmZzZXQgKz0gMjsKKysKKysJdG1wID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCisrCS8qIEZJWE1FOiB0aGVyZSBhcmUgc3RpbGwgc29tZSBidWdzIHJlbWFpbmluZyBoZXJlICovCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2FyZmNuLAorKwkJCSAgICB0dmIsIG9mZnNldCwgMiwgVFJVRSk7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2ZfcXVhbCwKKysJCQkgICAgdHZiLCBvZmZzZXQsIDIsIFRSVUUpOworKwlvZmZzZXQgKz0gMjsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfYl9yeGxldiwKKysJCQkgICAgdHZiLCBvZmZzZXQrKywgMSwgVFJVRSk7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX3J4cXVhbCwKKysJCQkgICAgdHZiLCBvZmZzZXQrKywgMSwgVFJVRSk7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2ZfZXJyLAorKwkJCSAgICB0dmIsIG9mZnNldCwgMiwgVFJVRSk7CisrCW9mZnNldCArPSAyOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9mcmFtZV9vZmZzLAorKwkJCSAgICB0dmIsIG9mZnNldCwgMiwgVFJVRSk7CisrCW9mZnNldCArPSAyOworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9mcmFtZW5yX29mZnMsCisrCQkJICAgIHR2Yiwgb2Zmc2V0LCA0LCBUUlVFKTsKKysJb2Zmc2V0ICs9IDQ7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2JzaWMsCisrCQkJICAgIHR2Yiwgb2Zmc2V0KyssIDEsIFRSVUUpOworKworKwlkZV9sYWkodHZiLCBhdHRfdHJlZSwgb2Zmc2V0LCA1LCBOVUxMLCAwKTsKKysJb2Zmc2V0ICs9IDU7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2NlbGxfaWQsCisrCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCBUUlVFKTsKKysJb2Zmc2V0ICs9IDI7CisrCisrCWlmIChiaW5mb190eXBlICYgMHg4MDAwKSB7CisrCQkvKiBTeXN0ZW0gSW5mb3JtYXRpb24gMiAqLworKwkJLyogRklYTUU6IFBhcnNlIDA0LjE4IE5laWdoYm91ciBDZWxsIERlc2NyaXB0aW9uICovCisrCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9zaTIsCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMTYsIFRSVUUpOworKwkJb2Zmc2V0ICs9IDE2OworKwl9CisrCWlmIChiaW5mb190eXBlICYgMHgwMDAxKSB7CisrCQkvKiBTeXN0ZW0gSW5mb3JtYXRpb24gMmJpcyAqLworKwkJLyogRklYTUU6IFBhcnNlIDA0LjE4IE5laWdoYm91ciBDZWxsIERlc2NyaXB0aW9uICovCisrCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9zaTJiaXMsCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMTYsIFRSVUUpOworKwkJb2Zmc2V0ICs9IDE2OworKwl9CisrCWlmIChiaW5mb190eXBlICYgMHgwMDAyKSB7CisrCQkvKiBTeXN0ZW0gSW5mb3JtYXRpb24gMnRlciAqLworKwkJLyogRklYTUU6IFBhcnNlIDA0LjE4IE5laWdoYm91ciBDZWxsIERlc2NyaXB0aW9uICovCisrCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9zaTJ0ZXIsCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMTYsIFRSVUUpOworKwkJb2Zmc2V0ICs9IDE2OworKwl9CisrCWlmIChiaW5mb190eXBlICYgMHgwMDA0KSB7CisrCQkvKiBGSVhNRTogUGFyc2UgMDQuMTggQ2VsbCBDaGFubmVsIERlc2NyaXB0aW9uICovCisrCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9jaGFuX2Rlc2MsCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMTYsIFRSVUUpOworKwkJb2Zmc2V0ICs9IDE2OworKwl9CisrCisrCXJldHVybiBvZmZzZXQ7CisrfQorKworKy8qIFBhcnNlIHRoZSBpcC5hY2Nlc3Mgc3BlY2lmaWMgQ2hhbm5lbCBVc2FnZSBJRSBlbWJlZGRlZCBpbnRvIHRoZSBUZXN0CisrICogUmVwb3J0IElFICovCisrc3RhdGljIGdpbnQKKytpcGFjY190cl9pZV9jaGFuX3VzYWdlKHR2YnVmZl90ICp0dmIsIHByb3RvX3RyZWUgKmF0dF90cmVlLCBpbnQgb2Zmc2V0KQorK3sKKysJd2hpbGUgKHR2Yl9yZXBvcnRlZF9sZW5ndGhfcmVtYWluaW5nKHR2Yiwgb2Zmc2V0KSAhPSAwKSB7CisrCQlndWludDE2IHJlc3VsdCA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfYXJmY24sCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMiwgcmVzdWx0KTsKKysJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX3J4bGV2LAorKwkJCQkgICAgdHZiLCBvZmZzZXQsIDIsIHJlc3VsdCk7CisrCQlvZmZzZXQgKz0gMjsKKysJfQorKwlyZXR1cm4gb2Zmc2V0OworK30KKysKKysvKiBQYXJzZSB0aGUgaXAuYWNjZXNzIHNwZWNpZmljIGZvcm1hdCBvZiB0aGUgc3RhbmRhcmQgdGVzdCByZXBvcnQgSUUgKi8KKytzdGF0aWMgZ2ludAorK2Rpc3NlY3RfaXBhY2NfdGVzdF9yZXAocHJvdG9fdHJlZSAqdHJlZSwgdHZidWZmX3QgKnR2YikKKyt7CisrCWdpbnQgb2Zmc2V0ID0gMDsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9hdHRyX2lwYV90ZXN0X3JlcywgdHZiLCBvZmZzZXQrKywKKysJCQkgICAgMSwgRkFMU0UpOworKworKwl3aGlsZSAodHZiX3JlcG9ydGVkX2xlbmd0aF9yZW1haW5pbmcodHZiLCBvZmZzZXQpICE9IDApIHsKKysJCWd1aW50OCBpZSA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCWd1aW50MTYgbGVuID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCsxKTsKKysJCXByb3RvX2l0ZW0gKnRpOworKwkJcHJvdG9fdHJlZSAqYXR0X3RyZWU7CisrCisrCQl0aSA9IHByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfb21sX2lwYV90cmVzX2F0dHJfdGFnLCB0dmIsCisrCQkJCQkgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysJCWF0dF90cmVlID0gcHJvdG9faXRlbV9hZGRfc3VidHJlZSh0aSwgZXR0X29tbF9mb21fYXR0KTsKKysJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX29tbF9pcGFfdHJlc19hdHRyX2xlbiwgdHZiLAorKwkJCQkgICAgb2Zmc2V0LCAyLCBsZW4pOworKwkJb2Zmc2V0ICs9IDI7CisrCisrCQlzd2l0Y2ggKGllKSB7CisrCQljYXNlIE5NX0lQQUNDX1RSX0lFX0NIQU5fVVNBR0U6CisrCQkJb2Zmc2V0ID0gaXBhY2NfdHJfaWVfY2hhbl91c2FnZSh0dmIsCisrCQkJCQkJIAlhdHRfdHJlZSwgb2Zmc2V0KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fSVBBQ0NfVFJfSUVfQkNDSF9JTkZPOgorKwkJCW9mZnNldCA9IGlwYWNjX3RyX2llX2JjY2godHZiLAorKwkJCQkJCSAgYXR0X3RyZWUsIG9mZnNldCk7CisrCQkJYnJlYWs7CisrCQlkZWZhdWx0OgorKwkJCWJyZWFrOworKwkJfQorKwl9CisrCXJldHVybiBvZmZzZXQ7CisrfQorKworKy8qIERpc3NlY3QgT01MIEZPTSBBdHRyaWJ1dGVzIGFmdGVyIE9NTCArIEZPTSBoZWFkZXIgKi8KKytzdGF0aWMgZ2ludAorK2Rpc3NlY3Rfb21sX2F0dHJzKHR2YnVmZl90ICp0dmIsIGludCBiYXNlX29mZnMsIHBhY2tldF9pbmZvICpwaW5mbywKKysJCSAgcHJvdG9fdHJlZSAqdHJlZSkKKyt7CisrCWludCBvZmZzZXQgPSBiYXNlX29mZnM7CisrCisrCXdoaWxlICh0dmJfcmVwb3J0ZWRfbGVuZ3RoX3JlbWFpbmluZyh0dmIsIG9mZnNldCkgIT0gMCkgeworKwkJZ3VpbnQgaTsKKysJCWd1aW50OCB0YWcsIHZhbDg7CisrCQlndWludDE2IHZhbDE2OworKwkJZ3VpbnQzMiB2YWwzMjsKKysJCXVuc2lnbmVkIGludCBsZW4sIGxlbl9sZW4sIGhsZW47CisrCQljb25zdCBzdHJ1Y3QgdGx2X2RlZiAqdGRlZjsKKysJCXByb3RvX2l0ZW0gKnRpOworKwkJcHJvdG9fdHJlZSAqYXR0X3RyZWU7CisrCQl0dmJ1ZmZfdCAqc3ViX3R2YjsKKysKKysJCXRhZyA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCXRkZWYgPSAmbm1fYXR0X3RsdmRlZi5kZWZbdGFnXTsKKysKKysJCXN3aXRjaCAodGRlZi0+dHlwZSkgeworKwkJY2FzZSBUTFZfVFlQRV9GSVhFRDoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSB0ZGVmLT5maXhlZF9sZW47CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1Q6CisrCQkJaGxlbiA9IDE7CisrCQkJbGVuX2xlbiA9IDA7CisrCQkJbGVuID0gMDsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVFY6CisrCQkJaGxlbiA9IDE7CisrCQkJbGVuX2xlbiA9IDA7CisrCQkJbGVuID0gMTsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVExWOgorKwkJCWhsZW4gPSAyOworKwkJCWxlbl9sZW4gPSAxOworKwkJCWxlbiA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzEpOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UTDE2VjoKKysJCQlobGVuID0gMzsKKysJCQlsZW5fbGVuID0gMjsKKysJCQlsZW4gPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsxKSA8PCA4IHwKKysJCQkJCQl0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsyKTsKKysJCQlicmVhazsKKysJCWRlZmF1bHQ6CisrCQkJaGxlbiA9IGxlbl9sZW4gPSBsZW4gPSAwOworKwkJCURJU1NFQ1RPUl9BU1NFUlRfTk9UX1JFQUNIRUQoKTsKKysJCQlicmVhazsKKysJCX0KKysKKysJCXRpID0gcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9vbWxfZm9tX2F0dHJfdGFnLCB0dmIsCisrCQkJCQkgb2Zmc2V0LCAxLCBGQUxTRSk7CisrCQlhdHRfdHJlZSA9IHByb3RvX2l0ZW1fYWRkX3N1YnRyZWUodGksIGV0dF9vbWxfZm9tX2F0dCk7CisrCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9vbWxfZm9tX2F0dHJfbGVuLCB0dmIsCisrCQkJCSAgICBvZmZzZXQrMSwgbGVuX2xlbiwgbGVuKTsKKysJCW9mZnNldCArPSBobGVuOworKworKwkJc3ViX3R2YiA9IHR2Yl9uZXdfc3Vic2V0KHR2Yiwgb2Zmc2V0LCBsZW4sIGxlbik7CisrCisrCQlzd2l0Y2ggKHRhZykgeworKwkJLyogcGFyc2Ugb25seSB0aGUgbW9zdCBjb21tb24gSUUgZm9yIG5vdyAqLworKwkJY2FzZSBOTV9BVFRfQUJJU19DSEFOTkVMOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYWNoX2J0c3AsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIDEsIFRSVUUpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYWNoX3RzbG90LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzEsIDEsIFRSVUUpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYWNoX3NzbG90LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzIsIDEsIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQURNX1NUQVRFOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYWRtX3N0YXRlLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQl2YWw4ID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJCWNvbF9hcHBlbmRfZnN0cihwaW5mby0+Y2luZm8sIENPTF9JTkZPLCAiJXMgIiwKKysJCQkJCXZhbF90b19zdHIodmFsOCwgb21sX2FkbV9zdGF0ZV92YWxzLAorKwkJCQkJCSAgICIlMDJ4IikpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQVJGQ05fTElTVDoKKysJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHsKKysJCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0ICsgaSk7CisrCQkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfYXJmY24sCisrCQkJCQkJICAgIHR2Yiwgb2Zmc2V0ICsgaSwgMiwgdmFsMTYpOworKwkJCX0KKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0FWQUlMX1NUQVRVUzoKKysJCQkvKiBBdmFpbGFiaWxpdHkgc3RhdHVzIGNhbiBoYXZlIGxlbmd0aCAwICovCisrCQkJaWYgKGxlbikgeworKwkJCQl2YWw4ID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLAorKwkJCQkJCSAgICBoZl9hdHRyX2F2YWlsX3N0YXRlLCB0dmIsCisrCQkJCQkgICAgCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCX0gZWxzZQorKwkJCQl2YWw4ID0gMHhmZjsKKysJCQljb2xfYXBwZW5kX2ZzdHIocGluZm8tPmNpbmZvLCBDT0xfSU5GTywgIiVzICIsCisrCQkJCQl2YWxfdG9fc3RyKHZhbDgsIG9tbF9hdmFpbF9zdGF0ZV92YWxzLAorKwkJCQkJCSAgICIlMDJ4IikpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQkNDSF9BUkZDTjoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2JjY2hfYXJmY24sIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9CU0lDOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYnNpYywgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0NIQU5fQ09NQjoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2NoYW5fY29tYiwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0VWRU5UX1RZUEU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9ldmVudF90eXBlLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfR1NNX1RJTUU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9nc21fdGltZSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX09QRVJfU1RBVEU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9vcGVyX3N0YXRlLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQl2YWw4ID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJCWNvbF9hcHBlbmRfZnN0cihwaW5mby0+Y2luZm8sIENPTF9JTkZPLCAiJXMgIiwKKysJCQkJCXZhbF90b19zdHIodmFsOCwgb21sX29wZXJfc3RhdGVfdmFscywKKysJCQkJCQkgICAiJTAyeCIpKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1RFSToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX3RlaSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1RTQzoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX3RzYywgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1NFVkVSSVRZOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfc2V2ZXJpdHksIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9URVNUX1JFUE9SVDoKKysJCQlkaXNzZWN0X2lwYWNjX3Rlc3RfcmVwKGF0dF90cmVlLCBzdWJfdHZiKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1RFU1RfTk86CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl90ZXN0X25vLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCXZhbDggPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQkJY29sX2FwcGVuZF9mc3RyKHBpbmZvLT5jaW5mbywgQ09MX0lORk8sICIlcyAiLAorKwkJCQkJdmFsX3RvX3N0cih2YWw4LCBvbWxfdGVzdF9ub192YWxzLAorKwkJCQkJCSAgICIlMDJ4IikpOworKwkJCWJyZWFrOworKworKwkJLyogcHJvcHJpZXRhcnkgaXAuYWNjZXNzIGV4dGVuc2lvbnMgKi8KKysJCWNhc2UgTk1fQVRUX0lQQUNDX0RTVF9JUDoKKysJCQl2YWwzMiA9IHR2Yl9nZXRfbnRvaGwodHZiLCBvZmZzZXQpOworKwkJCXByb3RvX3RyZWVfYWRkX2lwdjQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3JzbF9pcCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCB2YWwzMik7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVDoKKysJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3JzbF9wb3J0LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX0xPQ0FUSU9OOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX2xvY2F0aW9uX25hbWUsCisrCQkJCQkgICAgdHZiLCBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19VTklUX0lEOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3VuaXRfaWQsCisrCQkJCQkgICAgdHZiLCBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19VTklUX05BTUU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdW5pdF9uYW1lLAorKwkJCQkJICAgIHR2Yiwgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHX0xJU1Q6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfcHJpbV9vbWxfaXAsCisrCQkJCQkgICAgdHZiLCBvZmZzZXQrMSwgNCwgVFJVRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfcHJpbV9vbWxfcG9ydCwKKysJCQkJCSAgICB0dmIsIG9mZnNldCsxKzQsIDIsIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfTlZfRkxBR1M6CisrCQkJeworKwkJCQlndWludCBmbGFncywgbWFzazsKKysJCQkJZmxhZ3MgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQkJCW1hc2sgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsxKTsKKysJCQkJZmxhZ3MgfD0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMikgPDwgODsKKysJCQkJbWFzayB8PSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCszKSA8PCA4OworKwkJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9udl9mbGFncywKKysJCQkJCQkgICAgdHZiLCBvZmZzZXQsIDMsIGZsYWdzKTsKKysJCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnZfbWFzaywKKysJCQkJCQkgICAgdHZiLCBvZmZzZXQrMSwgMywgbWFzayk7CisrCQkJfQorKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfUkFDOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3JhYywKKysJCQkJCSAgICB0dmIsIG9mZnNldCwgMSwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19OU0VJOgorKwkJCXZhbDE2ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnNlaSwKKysJCQkJCSAgIHR2Yiwgb2Zmc2V0LCAyLCB2YWwxNik7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19OU1ZDSToKKysJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX25zdmNpLAorKwkJCQkJICAgdHZiLCBvZmZzZXQsIDIsIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX0JWQ0k6CisrCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9idmNpLAorKwkJCQkJICAgdHZiLCBvZmZzZXQsIDIsIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHOgorKwkJCXZhbDE2ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnNsX3Nwb3J0LAorKwkJCQkJICAgdHZiLCBvZmZzZXQsIDIsIHZhbDE2KTsKKysJCQl2YWwzMiA9IHR2Yl9nZXRfaXB2NCh0dmIsIG9mZnNldCsyKTsKKysJCQlwcm90b190cmVlX2FkZF9pcHY0KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9uc2xfZGFkZHIsCisrCQkJCQkgICB0dmIsIG9mZnNldCsyLCA0LCB2YWwzMik7CisrCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KzYpOworKwkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX25zbF9kcG9ydCwKKysJCQkJCSAgIHR2Yiwgb2Zmc2V0KzYsIDIsIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWRlZmF1bHQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfb21sX2ZvbV9hdHRyX3ZhbCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQl9CisrCQlvZmZzZXQgKz0gbGVuOworKwl9CisrCXJldHVybiBvZmZzZXQ7CisrfQorKworK3N0YXRpYyBpbnQKKytkaXNzZWN0X29tbF9mb20odHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLAorKwkJaW50IG9mZnNldCwgcHJvdG9faXRlbSAqdG9wX3RpKQorK3sKKysJZ3VpbnQ4IG1zZ190eXBlLCBvYmpfY2xhc3MsIGJ0c19uciwgdHJ4X25yLCB0c19ucjsKKysJcHJvdG9faXRlbSAqdGk7CisrCXByb3RvX3RyZWUgKmZvbV90cmVlOworKworKwltc2dfdHlwZSA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJb2JqX2NsYXNzID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMSk7CisrCWJ0c19uciA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzIpOworKwl0cnhfbnIgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCszKTsKKysJdHNfbnIgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCs0KTsKKysJcHJvdG9faXRlbV9hcHBlbmRfdGV4dCh0b3BfdGksICIsICVzKCUwMngsJTAyeCwlMDJ4KSAlcyAiLAorKwkJCXZhbF90b19zdHIob2JqX2NsYXNzLCBvbWxfZm9tX29iamNsYXNzX3ZhbHMsICIlMDJ4IiksCisrCQkJYnRzX25yLCB0cnhfbnIsIHRzX25yLAorKwkJCXZhbF90b19zdHIobXNnX3R5cGUsIG9tbF9mb21fbXNndHlwZV92YWxzLAorKwkJCQkgICAidW5rbm93biAweCV4IikpOworKwljb2xfYXBwZW5kX2ZzdHIocGluZm8tPmNpbmZvLCBDT0xfSU5GTywgIiVzKCUwMngsJTAyeCwlMDJ4KSAlcyAiLAorKwkJCXZhbF90b19zdHIob2JqX2NsYXNzLCBvbWxfZm9tX29iamNsYXNzX3ZhbHMsICIlMDJ4IiksCisrCQkJYnRzX25yLCB0cnhfbnIsIHRzX25yLAorKwkJCXZhbF90b19zdHIobXNnX3R5cGUsIG9tbF9mb21fbXNndHlwZV92YWxzLAorKwkJCQkgICAidW5rbm93biAweCV4IikpOworKwl0aSA9IHByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfb21sX2ZvbV9tc2d0eXBlLCB0dmIsIG9mZnNldCsrLCAxLCBGQUxTRSk7CisrCWZvbV90cmVlID0gcHJvdG9faXRlbV9hZGRfc3VidHJlZSh0aSwgZXR0X29tbF9mb20pOworKwlwcm90b190cmVlX2FkZF9pdGVtKGZvbV90cmVlLCBoZl9vbWxfZm9tX29iamNsYXNzLCB0dmIsIG9mZnNldCsrLCAxLCBGQUxTRSk7CisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oZm9tX3RyZWUsIGhmX29tbF9mb21faW5zdF9idHMsIHR2Yiwgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShmb21fdHJlZSwgaGZfb21sX2ZvbV9pbnN0X3RyeCwgdHZiLCBvZmZzZXQrKywgMSwgRkFMU0UpOworKwlwcm90b190cmVlX2FkZF9pdGVtKGZvbV90cmVlLCBoZl9vbWxfZm9tX2luc3RfdHMsIHR2Yiwgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysKKysKKysJLyogZGlzc2VjdCB0aGUgVExWIG9iamVjdHMgaW4gdGhlIG1lc3NhZ2UgYm9keSAqLworKwlvZmZzZXQgPSBkaXNzZWN0X29tbF9hdHRycyh0dmIsIG9mZnNldCwgcGluZm8sIGZvbV90cmVlKTsKKysKKysJcmV0dXJuIG9mZnNldDsKKyt9CisrCisrc3RhdGljIGNvbnN0IGd1aW50OCBpcGFjY2Vzc19tYWdpY1tdID0gImNvbS5pcGFjY2VzcyI7CisrCisrc3RhdGljIGludAorK2Rpc3NlY3Rfb21sX21hbnVmKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSwKKysJCSAgaW50IG9mZnNldCwgcHJvdG9faXRlbSAqdG9wX3RpKQorK3sKKysJaWYgKHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KSAhPSAweDBkIHx8CisrCSAgICB0dmJfbWVtZXFsKHR2Yiwgb2Zmc2V0KzEsIGlwYWNjZXNzX21hZ2ljLCBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpKSkKKysJCXJldHVybiBvZmZzZXQ7CisrCisrCW9mZnNldCArPSBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpICsgMTsKKysKKysJcmV0dXJuIGRpc3NlY3Rfb21sX2ZvbSh0dmIsIHBpbmZvLCB0cmVlLCBvZmZzZXQsIHRvcF90aSk7CisrfQorKworK3N0YXRpYyB2b2lkCisrZGlzc2VjdF9hYmlzX29tbCh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUpCisreworKwlwcm90b19pdGVtICp0aTsKKysJcHJvdG9fdHJlZSAqb21sX3RyZWU7CisrCisrCWludCBvZmZzZXQgPSAwOworKworKwljb2xfc2V0X3N0cihwaW5mby0+Y2luZm8sIENPTF9QUk9UT0NPTCwgIk9NTCIpOworKworKwl0b3BfdHJlZSA9IHRyZWU7CisrCWlmICh0cmVlKSB7CisrCQl1X2ludDhfdCBtc2dfZGlzYyA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysKKysJCXRpID0gcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBwcm90b19hYmlzX29tbCwgdHZiLCAwLCAtMSwgRkFMU0UpOworKwkJb21sX3RyZWUgPSBwcm90b19pdGVtX2FkZF9zdWJ0cmVlKHRpLCBldHRfb21sKTsKKysKKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0ob21sX3RyZWUsIGhmX29tbF9tc2dfZGlzYywgdHZiLCBvZmZzZXQrKywKKysJCQkJICAgIDEsIFRSVUUpOworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShvbWxfdHJlZSwgaGZfb21sX3BsYWNlbWVudCwgdHZiLCBvZmZzZXQrKywKKysJCQkJICAgIDEsIFRSVUUpOworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShvbWxfdHJlZSwgaGZfb21sX3NlcXVlbmNlLCB0dmIsIG9mZnNldCsrLAorKwkJCQkgICAgMSwgVFJVRSk7CisrCQlwcm90b190cmVlX2FkZF9pdGVtKG9tbF90cmVlLCBoZl9vbWxfbGVuZ3RoLCB0dmIsIG9mZnNldCsrLAorKwkJCQkgICAgMSwgVFJVRSk7CisrCisrCQlzd2l0Y2ggKG1zZ19kaXNjKSB7CisrCQljYXNlIEFCSVNfT01fTURJU0NfRk9NOgorKwkJCW9mZnNldCA9IGRpc3NlY3Rfb21sX2ZvbSh0dmIsIHBpbmZvLCBvbWxfdHJlZSwKKysJCQkJCQkgb2Zmc2V0LCB0aSk7CisrCQkJYnJlYWs7CisrCQljYXNlIEFCSVNfT01fTURJU0NfTUFOVUY6CisrCQkJb2Zmc2V0ID0gZGlzc2VjdF9vbWxfbWFudWYodHZiLCBwaW5mbywgb21sX3RyZWUsCQkJCQkJCSAgICAgICBvZmZzZXQsIHRpKTsKKysJCQlicmVhazsKKysJCWNhc2UgQUJJU19PTV9NRElTQ19NTUk6CisrCQljYXNlIEFCSVNfT01fTURJU0NfVFJBVToKKysJCWRlZmF1bHQ6CisrCQkJYnJlYWs7CisrCQl9CisrCX0KKyt9CisrCisrdm9pZAorK3Byb3RvX3JlZ19oYW5kb2ZmX2FiaXNfb21sKHZvaWQpOworKworK3ZvaWQKKytwcm90b19yZWdpc3Rlcl9hYmlzX29tbCh2b2lkKQorK3sKKysJc3RhdGljIGhmX3JlZ2lzdGVyX2luZm8gaGZbXSA9IHsKKysJCXsgJmhmX29tbF9tc2dfZGlzYywKKysJCQl7ICJNZXNzYWdlIERpc2NyaW1pbmF0b3IiLCAib21sLm1zZ19kc2MiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9tc2dfZGlzY192YWxzKSwgMCwKKysJCQkgICJHU00gMTIuMjEgTWVzc2FnZSBEaXNjcmltaW5hdG9yIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9wbGFjZW1lbnQsCisrCQkJeyAiUGxhY2VtZW50IEluZGljYXRvciIsICJvbWwucGxhY2VtZW50IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfcGxhY2VtZW50X3ZhbHMpLCAwLAorKwkJCSAgIkdTTSAxMi4yMSBQbGFjZW1lbnQgSW5kaWNhdG9yIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9zZXF1ZW5jZSwKKysJCQl7ICJTZXF1ZW5jZSBOdW1iZXIiLCAib21sLnNlcXVlbmNlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgTlVMTCwgMCwKKysJCQkgICJTZXF1ZW5jZSBOdW1iZXIgKGlmIG11bHRpLXBhcnQgbXNnKSIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfbGVuZ3RoLAorKwkJCXsgIkxlbmd0aCBJbmRpY2F0b3IiLCAib21sLmxlbmd0aCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICAiVG90YWwgbGVuZ3RoIG9mIHBheWxvYWQiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9tc2d0eXBlLAorKwkJCXsgIkZPTSBNZXNzYWdlIFR5cGUiLCAib21sLmZvbS5tc2dfdHlwZSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2ZvbV9tc2d0eXBlX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21fb2JqY2xhc3MsCisrCQkJeyAiRk9NIE9iamVjdCBDbGFzcyIsICJvbWwuZm9tLm9ial9jbGFzcyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2ZvbV9vYmpjbGFzc192YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2luc3RfYnRzLAorKwkJCXsgIkZPTSBPYmplY3QgSW5zdGFuY2UgQlRTIiwgIm9tbC5mb20ub2JqX2luc3QuYnRzIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2luc3RfdHJ4LAorKwkJCXsgIkZPTSBPYmplY3QgSW5zdGFuY2UgVFJYIiwgIm9tbC5mb20ub2JqX2luc3QudHJ4IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2luc3RfdHMsCisrCQkJeyAiRk9NIE9iamVjdCBJbnN0YW5jZSBUUyIsICJvbWwuZm9tLm9ial9pbnN0LnRzIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2F0dHJfdGFnLAorKwkJCXsgIkZPTSBBdHRyaWJ1dGUgSUQiLCAib21sLmZvbS5hdHRyX2lkIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfZm9tX2F0dHJfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9hdHRyX2xlbiwKKysJCQl7ICJGT00gQXR0cmlidXRlIExlbmd0aCIsICJvbWwuZm9tLmF0dHJfbGVuIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9hdHRyX3ZhbCwKKysJCQl7ICJGT00gQXR0cmlidXRlIFZhbHVlIiwgIm9tbC5mb20uYXR0cl92YWwiLAorKwkJCSAgRlRfQllURVMsIEJBU0VfTk9ORSwgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCisrCisrCisrCQkvKiBPTUwgQXR0cmlidXRlcyAqLworKwkJeyAmaGZfYXR0cl9hZG1fc3RhdGUsCisrCQkJeyAiQWRtaW5pc3RyYXRpdmUgU3RhdGUiLCAib21sLmZvbS5hdHRyLmFkbV9zdGF0ZSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2FkbV9zdGF0ZV92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2FyZmNuLAorKwkJCXsgIkFSRkNOIiwgIm9tbC5mb20uYXR0ci5hcmZjbiIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9vcGVyX3N0YXRlLAorKwkJCXsgIk9wZXJhdGlvbmFsIFN0YXRlIiwgIm9tbC5mb20uYXR0ci5vcGVyX3N0YXRlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfb3Blcl9zdGF0ZV92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2F2YWlsX3N0YXRlLAorKwkJCXsgIkF2YWlsYWJpbGl0eSBTdGF0dXMiLCAib21sLmZvbS5hdHRyLmF2YWlsX3N0YXRlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfYXZhaWxfc3RhdGVfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9ldmVudF90eXBlLAorKwkJCXsgIkV2ZW50IFR5cGUiLCAib21sLmZvbS5hdHRyLmV2ZW50X3R5cGUiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9ldmVudF90eXBlX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfc2V2ZXJpdHksCisrCQkJeyAiU2V2ZXJpdHkiLCAib21sLmZvbS5hdHRyLnNldmVyaXR5IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfc2V2ZXJpdHlfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9iY2NoX2FyZmNuLAorKwkJCXsgIkJDQ0ggQVJGQ04iLCAib21sLmZvbS5hdHRyLmJjY2hfYXJmY24iLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJBUkZDTiBvZiB0aGUgQkNDSCIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2JzaWMsCisrCQkJeyAiQlNJQyIsICJvbWwuZm9tLmF0dHIuYnNpYyIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfSEVYLCBOVUxMLCAwLAorKwkJCSAgIkJhc2UgU3RhdGlvbiBJZGVudGl0eSBDZG9lIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfdGVzdF9ubywKKysJCQl7ICJUZXN0IE51bWJlciIsICJvbWwuZm9tLmF0dHIudGVzdF9ubyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX3Rlc3Rfbm9fdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl90c2MsCisrCQkJeyAiVFNDIiwgIm9tbC5mb20uYXR0ci50c2MiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBOVUxMLCAwLAorKwkJCSAgIlRyYWluaW5nIFNlcXVlbmNlIENvZGUiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl90ZWksCisrCQkJeyAiVEVJIiwgIm9tbC5mb20uYXR0ci50ZWkiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYWNoX2J0c3AsCisrCQkJeyAiQlRTIEUxIFBvcnQiLCAib21sLmZvbS5hdHRyLmFiaXNfY2guYnRzX3BvcnQiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYWNoX3RzbG90LAorKwkJCXsgIkUxIFRpbWVzbG90IiwgIm9tbC5mb20uYXR0ci5hYmlzX2NoLnRpbWVzbG90IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2FjaF9zc2xvdCwKKysJCQl7ICJFMSBTdWJzbG90IiwgIm9tbC5mb20uYXR0ci5hYmlzX2NoLnN1YnNsb3QiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfZ3NtX3RpbWUsCisrCQkJeyAiR1NNIFRpbWUiLCAib21sLmZvbS5hdHRyLmdzbV90aW1lIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICAiR1NNIFRpbWUiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9jaGFuX2NvbWIsCisrCQkJeyAiQ2hhbm5lbCBDb21iaW5hdGlvbiIsICJvbWwuZm9tLmF0dHIuY2hhbl9jb21iIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfY2hhbl9jb21iX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCS8qIElQIEFjY2VzcyAqLworKwkJeyAmaGZfb21sX2lwYV90cmVzX2F0dHJfdGFnLAorKwkJCXsgIklQQSBUZXN0IFJlc3VsdCBFbWJlZGRlZCBJRSIsCisrCQkJCQkJIm9tbC5mb20udGVzdHJlcC5pcGFfdGFnIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhpcGFjY190ZXN0cmVzX2llX3ZhbHMpLCAwLAorKwkJCSAgIkluZm9ybWF0aW9uIEVsZW1lbnQgZW1iZWRkZWQgaW50byB0aGUgVGVzdCBSZXN1bHQgIgorKwkJCSAgIm9mIGlwLmFjY2VzcyBCVFMiLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX29tbF9pcGFfdHJlc19hdHRyX2xlbiwKKysJCQl7ICJJUEEgVGVzdCBSZXN1bHQgRW1iZWRkZWQgSUUgTGVuZ3RoIiwKKysJCQkJCQkib21sLmZvbS50ZXN0cmVwLmlwYV9sZW4iLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJMZW5ndGggb2YgaXAuYWNjZXNzIFRlc3QgUmVzdWx0IEVtYmVkZGVkIElFIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3Rlc3RfcmVzLAorKwkJCXsgIklQQSBUZXN0IFJlc3VsdCIsICJvbWwuZm9tLnRlc3RyZXAucmVzdWx0IiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgVkFMUyhpcGFjY190ZXN0X3Jlc192YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9yeGxldiwKKysJCQl7ICJSeCBMZXZlbCIsICJvbWwuZm9tLnRlc3RyZXAuaXBhX3J4bGV2IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDB4ZmMwMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2JfcnhsZXYsCisrCQkJeyAiUnggTGV2ZWwiLCAib21sLmZvbS50ZXN0cmVwLmlwYV9yeGxldl9iIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2FyZmNuLAorKwkJCXsgIkFSRkNOIiwgIm9tbC5mb20udGVzdHJlcC5pcGFfYXJmY24iLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHgwM2ZmLCAiQVJGQ04iLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfZl9xdWFsLAorKwkJCXsgIkZyZXF1ZW5jeSBRdWFsaXR5IiwgIm9tbC5mb20udGVzdHJlcC5pcGEuZnJlcV9xdWFsIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMHhmYywgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2ZfZXJyLAorKwkJCXsgIkZyZXF1ZW5jeSBFcnJvciIsICJvbWwuZm9tLnRlc3RyZXAuaXBhLmZyZXFfZXJyIiwKKysJCQkgIEZUX0lOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX3J4cXVhbCwKKysJCQl7ICJSeCBRdWFsaXR5IiwgIm9tbC5mb20udGVzdHJlcC5pcGEucnhfcXVhbCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDB4NywgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2ZyYW1lX29mZnMsCisrCQkJeyAiRnJhbWUgT2Zmc2V0IiwgIm9tbC5mb20udGVzdHJlcC5pcGEuZnJhbWVfb2Zmc2V0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9mcmFtZW5yX29mZnMsCisrCQkJeyAiRnJhbWUgTnVtYmVyIE9mZnNldCIsCisrCQkJCQkib21sLmZvbS50ZXN0cmVwLmlwYS5mcmFtZW5yX29mZnNldCIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfYnNpYywKKysJCQl7ICJCU0lDIiwgIm9tbC5mb20udGVzdHJlcC5pcGEuYnNpYyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDB4M2YsCisrCQkJICAiQmFzZSBTdGF0aW9uIElkZW50aXR5IENvZGUiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfY2VsbF9pZCwKKysJCQl7ICJDZWxsIElEIiwgIm9tbC5mb20udGVzdHJlcC5pcGEuY2VsbF9pZCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfSEVYLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcnNsX2lwLAorKwkJCXsgIkJTQyBSU0wgSVAgQWRkcmVzcyIsICJvbWwuZm9tLmF0dHIuaXBhLnJzbF9pcCIsCisrCQkJICBGVF9JUHY0LCBCQVNFX05PTkUsIE5VTEwsIDAsCisrCQkJICAiSVAgQWRkcmVzcyB0byB3aGljaCB0aGUgQlRTIGVzdGFibGlzaGVzICIKKysJCQkgICJ0aGUgUlNMIGxpbmsiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcnNsX3BvcnQsCisrCQkJeyAiQlNDIFJTTCBUQ1AgUG9ydCIsICJvbWwuZm9tLmF0dHIuaXBhLnJzbF9wb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICAiUG9ydCBudW1iZXIgdG8gd2hpY2ggdGhlIEJTVCBlc3RhYmxpc2hlcyAiCisrCQkJICAidGhlIFJTTCBsaW5rIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3ByaW1fb21sX2lwLAorKwkJCXsgIlByaW1hcnkgT01MIElQIEFkZHJlc3MiLAorKwkJCQkJIm9tbC5mb20uYXR0ci5pcGEucHJpbV9vbWxfaXAiLAorKwkJCSAgRlRfSVB2NCwgQkFTRV9OT05FLCBOVUxMLCAwLAorKwkJCSAgIklQIEFkZHJlc3Mgb2YgdGhlIEJTQyBmb3IgdGhlIHByaW1hcnkgT01MIGxpbmsiLAorKwkJCSAgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3ByaW1fb21sX3BvcnQsCisrCQkJeyAiUHJpbWFyeSBPTUwgVENQIFBvcnQiLAorKwkJCQkJIm9tbC5mb20uYXR0ci5pcGEucHJpbV9vbWxfcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgIlRDUCBQb3J0IG9mIHRoZSBCU0MgZm9yIHRoZSBwcmltYXJseSBPTUwgbGluayIsCisrCQkJICBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbG9jYXRpb25fbmFtZSwKKysJCQl7ICJMb2NhdGlvbiBOYW1lIiwgIm9tbC5mb20uYXR0ci5pcGEubG9jX25hbWUiLAorKwkJCSAgRlRfU1RSSU5HLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV91bml0X25hbWUsCisrCQkJeyAiVW5pdCBOYW1lIiwgIm9tbC5mb20uYXR0ci5pcGEudW5pdF9uYW1lIiwKKysJCQkgIEZUX1NUUklORywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdW5pdF9pZCwKKysJCQl7ICJVbml0IElEIiwgIm9tbC5mb20uYXR0ci5pcGEudW5pdF9pZCIsCisrCQkJICBGVF9TVFJJTkcsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX252X2ZsYWdzLAorKwkJCXsgIk5WUkFNIENvbmZpZyBGbGFncyIsICJvbWwuZm9tLmF0dHIuaXBhLm52X2ZsYWdzIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9IRVgsIE5VTEwsIDB4ZmZmZiwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX252X21hc2ssCisrCQkJeyAiTlZSQU0gQ29uZmlnIE1hc2siLCAib21sLmZvbS5hdHRyLmlwYS5udl9tYXNrIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9IRVgsIE5VTEwsIDB4ZmZmZiwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX3NpMiwKKysJCQl7ICJTeXN0ZW0gSW5mb3JtYXRpb24gMiIsICJvbWwuZm9tLmF0dHIuaXBhLnNpMiIsCisrCQkJICBGVF9CWVRFUywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfc2kyYmlzLAorKwkJCXsgIlN5c3RlbSBJbmZvcm1hdGlvbiAyYmlzIiwgIm9tbC5mb20uYXR0ci5pcGEuc2kyYmlzIiwKKysJCQkgIEZUX0JZVEVTLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9zaTJ0ZXIsCisrCQkJeyAiU3lzdGVtIEluZm9ybWF0aW9uIDJ0ZXIiLCAib21sLmZvbS5hdHRyLmlwYS5zaTJ0ZXIiLAorKwkJCSAgRlRfQllURVMsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2NoYW5fZGVzYywKKysJCQl7ICJDZWxsIENoYW5uZWwgRGVzY3JpcHRpb24iLAorKwkJCQkJCSJvbWwuZm9tLmF0dHIuaXBhLmNoYW5fZGVzYyIsCisrCQkJICBGVF9CWVRFUywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnNsX3Nwb3J0LAorKwkJCXsgIk5TIExpbmsgSVAgU291cmNlIFBvcnQiLAorKwkJCQkJCSJvbWwuZm9tLmF0dHIuaXBhLm5zbF9zcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnNsX2RhZGRyLAorKwkJCXsgIk5TIExpbmsgSVAgRGVzdGluYXRpb24gQWRkciIsCisrCQkJCQkJIm9tbC5mb20uYXR0ci5pcGEubnNsX2RhZGRyIiwKKysJCQkgIEZUX0lQdjQsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX25zbF9kcG9ydCwKKysJCQl7ICJOUyBMaW5rIElQIERlc3RpbmF0aW9uIFBvcnQiLAorKwkJCQkJCSJvbWwuZm9tLmF0dHIuaXBhLm5zbF9kcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnNlaSwKKysJCQl7ICJOU0VJIiwgIm9tbC5mb20uYXR0ci5pcGEubnNlaSIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnN2Y2ksCisrCQkJeyAiTlNWQ0kiLCAib21sLmZvbS5hdHRyLmlwYS5uc3ZjaSIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfYnZjaSwKKysJCQl7ICJCVkNJIiwgIm9tbC5mb20uYXR0ci5pcGEuYnZjaSIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcmFjLAorKwkJCXsgIlJBQyIsICJvbWwuZm9tLmF0dHIuaXBhLnJhYyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIE5VTEwsIDAsCisrCQkJICAiUm91dGluZyBBcmVhIENvZGUiLCBIRklMTCB9CisrCQl9LAorKwl9OworKwlzdGF0aWMgZ2ludCAqZXR0W10gPSB7CisrCQkmZXR0X29tbCwKKysJCSZldHRfb21sX2ZvbSwKKysJCSZldHRfb21sX2ZvbV9hdHQsCisrCX07CisrCisrCW1vZHVsZV90ICpvbWxfbW9kdWxlOworKworKwlwcm90b19hYmlzX29tbCA9IHByb3RvX3JlZ2lzdGVyX3Byb3RvY29sKCJHU00gQS1iaXMgT01MIiwgIk9NTCIsCisrCQkJCQkJICJnc21fYWJpc19vbWwiKTsKKysKKysJcHJvdG9fcmVnaXN0ZXJfZmllbGRfYXJyYXkocHJvdG9fYWJpc19vbWwsIGhmLCBhcnJheV9sZW5ndGgoaGYpKTsKKysKKysJcHJvdG9fcmVnaXN0ZXJfc3VidHJlZV9hcnJheShldHQsIGFycmF5X2xlbmd0aChldHQpKTsKKysKKysJcmVnaXN0ZXJfZGlzc2VjdG9yKCJnc21fYWJpc19vbWwiLCBkaXNzZWN0X2FiaXNfb21sLCBwcm90b19hYmlzX29tbCk7CisrCisrCisrCW9tbF9tb2R1bGUgPSBwcmVmc19yZWdpc3Rlcl9wcm90b2NvbChwcm90b19hYmlzX29tbCwgcHJvdG9fcmVnX2hhbmRvZmZfYWJpc19vbWwpOworKwlwcmVmc19yZWdpc3Rlcl9ib29sX3ByZWZlcmVuY2Uob21sX21vZHVsZSwgInVzZV9pcGFjY2Vzc19vbWwiLAorKwkJICAgICJVc2UgbmFub0JUUyBkZWZpbml0aW9ucyIsCisrCQkgICAgIlVzZSBpcGFjY2VzcyBuYW5vQlRTIHNwZWNpZmljIGRlZmluaXRpb25zIGZvciBPTUwiLAorKwkJICAgICZnbG9iYWxfb21sX3VzZV9uYW5vX2J0cyk7CisrfQorKworK3ZvaWQKKytwcm90b19yZWdfaGFuZG9mZl9hYmlzX29tbCh2b2lkKQorK3sKKysJZGlzc2VjdG9yX2hhbmRsZV90IGFiaXNfb21sX2hhbmRsZTsKKysKKysJYWJpc19vbWxfaGFuZGxlID0gY3JlYXRlX2Rpc3NlY3Rvcl9oYW5kbGUoZGlzc2VjdF9hYmlzX29tbCwgcHJvdG9fYWJpc19vbWwpOworKwlkaXNzZWN0b3JfYWRkKCJsYXBkLmdzbS5zYXBpIiwgTEFQRF9HU01fU0FQSV9PTV9QUk9DLCBhYmlzX29tbF9oYW5kbGUpOworK30KK0luZGV4OiB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuaAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIC9kZXYvbnVsbAorKysrIHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5oCitAQCAtMCwwICsxLDc4NiBAQAorKy8qIEdTTSBOZXR3b3JrIE1hbmFnZW1lbnQgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZQorKyAqIDNHUFAgVFMgMTIuMjEgdmVyc2lvbiA4LjAuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA2MjMgVjguMC4wICovCisrCisrLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisrICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKysgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisrICoKKysgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKysgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKysgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKyAqCisrICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKysgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisrICoKKysgKi8KKysKKysjaWZuZGVmIF9fUEFDS0VUX0FCSVNfT01MX0hfXworKyNkZWZpbmUgX19QQUNLRVRfQUJJU19PTUxfSF9fCisrCisrI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorKworKy8qIEZyb20gb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19ubS5oICovCisrCisrLyogZ2VuZXJpYyBoZWFkZXIgaW4gZnJvbnQgb2YgZXZlcnkgT01MIG1lc3NhZ2UgYWNjb3JkaW5nIHRvIFRTIDA4LjU5ICovCisrc3RydWN0IGFiaXNfb21faGRyIHsKKysJZ3VpbnQ4CW1kaXNjOworKwlndWludDgJcGxhY2VtZW50OworKwlndWludDgJc2VxdWVuY2U7CisrCWd1aW50OAlsZW5ndGg7CisrCWd1aW50OAlkYXRhWzBdOworK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworKworKyNkZWZpbmUgQUJJU19PTV9NRElTQ19GT00JCTB4ODAKKysjZGVmaW5lIEFCSVNfT01fTURJU0NfTU1JCQkweDQwCisrI2RlZmluZSBBQklTX09NX01ESVNDX1RSQVUJCTB4MjAKKysjZGVmaW5lIEFCSVNfT01fTURJU0NfTUFOVUYJCTB4MTAKKysjZGVmaW5lIEFCSVNfT01fUExBQ0VNRU5UX09OTFkJCTB4ODAKKysjZGVmaW5lIEFCSVNfT01fUExBQ0VNRU5UX0ZJUlNUIAkweDQwCisrI2RlZmluZSBBQklTX09NX1BMQUNFTUVOVF9NSURETEUJMHgyMAorKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfTEFTVAkJMHgxMAorKworK3N0cnVjdCBhYmlzX29tX29ial9pbnN0IHsKKysJZ3VpbnQ4CWJ0c19ucjsKKysJZ3VpbnQ4CXRyeF9ucjsKKysJZ3VpbnQ4CXRzX25yOworK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworKworK3N0cnVjdCBhYmlzX29tX2ZvbV9oZHIgeworKwlndWludDgJbXNnX3R5cGU7CisrCWd1aW50OAlvYmpfY2xhc3M7CisrCXN0cnVjdCBhYmlzX29tX29ial9pbnN0CW9ial9pbnN0OworKwlndWludDgJZGF0YVswXTsKKyt9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKysKKysjZGVmaW5lIEFCSVNfT01fRk9NX0hEUl9TSVpFCShzaXplb2Yoc3RydWN0IGFiaXNfb21faGRyKSArIHNpemVvZihzdHJ1Y3QgYWJpc19vbV9mb21faGRyKSkKKysKKysvKiBTZWN0aW9uIDkuMTogTWVzc2FnZSBUeXBlcyAqLworK2VudW0gYWJpc19ubV9tc2d0eXBlIHsKKysJLyogU1cgRG93bmxvYWQgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9MT0FEX0lOSVQJCQk9IDB4MDEsCisrCU5NX01UX0xPQURfSU5JVF9BQ0ssCisrCU5NX01UX0xPQURfSU5JVF9OQUNLLAorKwlOTV9NVF9MT0FEX1NFRywKKysJTk1fTVRfTE9BRF9TRUdfQUNLLAorKwlOTV9NVF9MT0FEX0FCT1JULAorKwlOTV9NVF9MT0FEX0VORCwKKysJTk1fTVRfTE9BRF9FTkRfQUNLLAorKwlOTV9NVF9MT0FEX0VORF9OQUNLLAorKwlOTV9NVF9TV19BQ1RfUkVRLAkJLyogQlRTLT5CU0MgKi8KKysJTk1fTVRfU1dfQUNUX1JFUV9BQ0ssCisrCU5NX01UX1NXX0FDVF9SRVFfTkFDSywKKysJTk1fTVRfQUNUSVZBVEVfU1csCQkvKiBCU0MtPkJUUyAqLworKwlOTV9NVF9BQ1RJVkFURV9TV19BQ0ssCisrCU5NX01UX0FDVElWQVRFX1NXX05BQ0ssCisrCU5NX01UX1NXX0FDVElWQVRFRF9SRVAsCQkvKiAweDEwICovCisrCS8qIEEtYmlzIEludGVyZmFjZSBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX0VTVEFCTElTSF9URUkJCT0gMHgyMSwKKysJTk1fTVRfRVNUQUJMSVNIX1RFSV9BQ0ssCisrCU5NX01UX0VTVEFCTElTSF9URUlfTkFDSywKKysJTk1fTVRfQ09OTl9URVJSX1NJR04sCisrCU5NX01UX0NPTk5fVEVSUl9TSUdOX0FDSywKKysJTk1fTVRfQ09OTl9URVJSX1NJR05fTkFDSywKKysJTk1fTVRfRElTQ19URVJSX1NJR04sCisrCU5NX01UX0RJU0NfVEVSUl9TSUdOX0FDSywKKysJTk1fTVRfRElTQ19URVJSX1NJR05fTkFDSywKKysJTk1fTVRfQ09OTl9URVJSX1RSQUYsCisrCU5NX01UX0NPTk5fVEVSUl9UUkFGX0FDSywKKysJTk1fTVRfQ09OTl9URVJSX1RSQUZfTkFDSywKKysJTk1fTVRfRElTQ19URVJSX1RSQUYsCisrCU5NX01UX0RJU0NfVEVSUl9UUkFGX0FDSywKKysJTk1fTVRfRElTQ19URVJSX1RSQUZfTkFDSywKKysJLyogVHJhbnNtaXNzaW9uIE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKysJTk1fTVRfQ09OTl9NRFJPUF9MSU5LCQk9IDB4MzEsCisrCU5NX01UX0NPTk5fTURST1BfTElOS19BQ0ssCisrCU5NX01UX0NPTk5fTURST1BfTElOS19OQUNLLAorKwlOTV9NVF9ESVNDX01EUk9QX0xJTkssCisrCU5NX01UX0RJU0NfTURST1BfTElOS19BQ0ssCisrCU5NX01UX0RJU0NfTURST1BfTElOS19OQUNLLAorKwkvKiBBaXIgSW50ZXJmYWNlIE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKysJTk1fTVRfU0VUX0JUU19BVFRSCQk9IDB4NDEsCisrCU5NX01UX1NFVF9CVFNfQVRUUl9BQ0ssCisrCU5NX01UX1NFVF9CVFNfQVRUUl9OQUNLLAorKwlOTV9NVF9TRVRfUkFESU9fQVRUUiwKKysJTk1fTVRfU0VUX1JBRElPX0FUVFJfQUNLLAorKwlOTV9NVF9TRVRfUkFESU9fQVRUUl9OQUNLLAorKwlOTV9NVF9TRVRfQ0hBTl9BVFRSLAorKwlOTV9NVF9TRVRfQ0hBTl9BVFRSX0FDSywKKysJTk1fTVRfU0VUX0NIQU5fQVRUUl9OQUNLLAorKwkvKiBUZXN0IE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKysJTk1fTVRfUEVSRl9URVNUCQkJPSAweDUxLAorKwlOTV9NVF9QRVJGX1RFU1RfQUNLLAorKwlOTV9NVF9QRVJGX1RFU1RfTkFDSywKKysJTk1fTVRfVEVTVF9SRVAsCisrCU5NX01UX1NFTkRfVEVTVF9SRVAsCisrCU5NX01UX1NFTkRfVEVTVF9SRVBfQUNLLAorKwlOTV9NVF9TRU5EX1RFU1RfUkVQX05BQ0ssCisrCU5NX01UX1NUT1BfVEVTVCwKKysJTk1fTVRfU1RPUF9URVNUX0FDSywKKysJTk1fTVRfU1RPUF9URVNUX05BQ0ssCisrCS8qIFN0YXRlIE1hbmFnZW1lbnQgYW5kIEV2ZW50IFJlcG9ydCBNZXNzYWdlcyAqLworKwlOTV9NVF9TVEFURUNIR19FVkVOVF9SRVAJPSAweDYxLAorKwlOTV9NVF9GQUlMVVJFX0VWRU5UX1JFUCwKKysJTk1fTVRfU1RPUF9FVkVOVF9SRVAsCisrCU5NX01UX1NUT1BfRVZFTlRfUkVQX0FDSywKKysJTk1fTVRfU1RPUF9FVkVOVF9SRVBfTkFDSywKKysJTk1fTVRfUkVTVF9FVkVOVF9SRVAsCisrCU5NX01UX1JFU1RfRVZFTlRfUkVQX0FDSywKKysJTk1fTVRfUkVTVF9FVkVOVF9SRVBfTkFDSywKKysJTk1fTVRfQ0hHX0FETV9TVEFURSwKKysJTk1fTVRfQ0hHX0FETV9TVEFURV9BQ0ssCisrCU5NX01UX0NIR19BRE1fU1RBVEVfTkFDSywKKysJTk1fTVRfQ0hHX0FETV9TVEFURV9SRVEsCisrCU5NX01UX0NIR19BRE1fU1RBVEVfUkVRX0FDSywKKysJTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfTkFDSywKKysJTk1fTVRfUkVQX09VVFNUX0FMQVJNUwkJPSAweDkzLAorKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX0FDSywKKysJTk1fTVRfUkVQX09VVFNUX0FMQVJNU19OQUNLLAorKwkvKiBFcXVpcG1lbnQgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9DSEFOR0VPVkVSCQk9IDB4NzEsCisrCU5NX01UX0NIQU5HRU9WRVJfQUNLLAorKwlOTV9NVF9DSEFOR0VPVkVSX05BQ0ssCisrCU5NX01UX09QU1RBUlQsCisrCU5NX01UX09QU1RBUlRfQUNLLAorKwlOTV9NVF9PUFNUQVJUX05BQ0ssCisrCU5NX01UX1JFSU5JVCwKKysJTk1fTVRfUkVJTklUX0FDSywKKysJTk1fTVRfUkVJTklUX05BQ0ssCisrCU5NX01UX1NFVF9TSVRFX09VVCwJCS8qIEJTMTE6IGdldCBhbGFybSA/IT8gKi8KKysJTk1fTVRfU0VUX1NJVEVfT1VUX0FDSywKKysJTk1fTVRfU0VUX1NJVEVfT1VUX05BQ0ssCisrCU5NX01UX0NIR19IV19DT05GCQk9IDB4OTAsCisrCU5NX01UX0NIR19IV19DT05GX0FDSywKKysJTk1fTVRfQ0hHX0hXX0NPTkZfTkFDSywKKysJLyogTWVhc3VyZW1lbnQgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9NRUFTX1JFU19SRVEJCT0gMHg4YSwKKysJTk1fTVRfTUVBU19SRVNfUkVTUCwKKysJTk1fTVRfU1RPUF9NRUFTLAorKwlOTV9NVF9TVEFSVF9NRUFTLAorKwkvKiBPdGhlciBNZXNzYWdlcyAqLworKwlOTV9NVF9HRVRfQVRUUgkJCT0gMHg4MSwKKysJTk1fTVRfR0VUX0FUVFJfUkVTUCwKKysJTk1fTVRfR0VUX0FUVFJfTkFDSywKKysJTk1fTVRfU0VUX0FMQVJNX1RIUkVTLAorKwlOTV9NVF9TRVRfQUxBUk1fVEhSRVNfQUNLLAorKwlOTV9NVF9TRVRfQUxBUk1fVEhSRVNfTkFDSywKKysKKysJTk1fTVRfSVBBQ0NfUkVTVEFSVAkJPSAweDg3LAorKwlOTV9NVF9JUEFDQ19SRVNUQVJUX0FDSywKKyt9OworKworK2VudW0gYWJpc19ubV9tc2d0eXBlX2JzMTEgeworKwlOTV9NVF9CUzExX1JFU0VUX1JFU09VUkNFCT0gMHg3NCwKKysKKysJTk1fTVRfQlMxMV9CRUdJTl9EQl9UWAkJPSAweGEzLAorKwlOTV9NVF9CUzExX0JFR0lOX0RCX1RYX0FDSywKKysJTk1fTVRfQlMxMV9CRUdJTl9EQl9UWF9OQUNLLAorKwlOTV9NVF9CUzExX0VORF9EQl9UWAkJPSAweGE2LAorKwlOTV9NVF9CUzExX0VORF9EQl9UWF9BQ0ssCisrCU5NX01UX0JTMTFfRU5EX0RCX1RYX05BQ0ssCisrCU5NX01UX0JTMTFfQ1JFQVRFX09CSgkJPSAweGE5LAorKwlOTV9NVF9CUzExX0NSRUFURV9PQkpfQUNLLAorKwlOTV9NVF9CUzExX0NSRUFURV9PQkpfTkFDSywKKysJTk1fTVRfQlMxMV9ERUxFVEVfT0JKCQk9IDB4YWMsCisrCU5NX01UX0JTMTFfREVMRVRFX09CSl9BQ0ssCisrCU5NX01UX0JTMTFfREVMRVRFX09CSl9OQUNLLAorKworKwlOTV9NVF9CUzExX1NFVF9BVFRSCQk9IDB4ZDAsCisrCU5NX01UX0JTMTFfU0VUX0FUVFJfQUNLLAorKwlOTV9NVF9CUzExX1NFVF9BVFRSX05BQ0ssCisrCU5NX01UX0JTMTFfTE1UX1NFU1NJT04JCT0gMHhkYywKKysKKysJTk1fTVRfQlMxMV9HRVRfU1RBVEUJCT0gMHhlMywKKysJTk1fTVRfQlMxMV9HRVRfU1RBVEVfQUNLLAorKwlOTV9NVF9CUzExX0xNVF9MT0dPTgkJPSAweGU1LAorKwlOTV9NVF9CUzExX0xNVF9MT0dPTl9BQ0ssCisrCU5NX01UX0JTMTFfUkVTVEFSVAkJPSAweGU3LAorKwlOTV9NVF9CUzExX1JFU1RBUlRfQUNLLAorKwlOTV9NVF9CUzExX0RJU0NPTk5FQ1QJCT0gMHhlOSwKKysJTk1fTVRfQlMxMV9ESVNDT05ORUNUX0FDSywKKysJTk1fTVRfQlMxMV9MTVRfTE9HT0ZGCQk9IDB4ZWMsCisrCU5NX01UX0JTMTFfTE1UX0xPR09GRl9BQ0ssCisrCU5NX01UX0JTMTFfUkVDT05ORUNUCQk9IDB4ZjEsCisrCU5NX01UX0JTMTFfUkVDT05ORUNUX0FDSywKKyt9OworKworK2VudW0gYWJpc19ubV9tc2d0eXBlX2lwYWNjIHsKKysJTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1QJCT0gMHhlMCwKKysJTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfQUNLLAorKwlOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9OQUNLLAorKwlOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVAk9IDB4ZTMsCisrCU5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNUX0FDSywKKysJTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1RfTkFDSywKKysJTk1fTVRfSVBBQ0NfQ09OTl9UUkFGCQk9IDB4ZTYsCisrCU5NX01UX0lQQUNDX0NPTk5fVFJBRl9BQ0ssCisrCU5NX01UX0lQQUNDX0NPTk5fVFJBRl9OQUNLLAorKwlOTV9NVF9JUEFDQ19ESVNDX1RSQUYJCT0gMHhlOSwKKysJTk1fTVRfSVBBQ0NfRElTQ19UUkFGX0FDSywKKysJTk1fTVRfSVBBQ0NfRElTQ19UUkFGX05BQ0ssCisrCU5NX01UX0lQQUNDX0RFRl9CT09UX1NXCQk9IDB4ZWMsCisrCU5NX01UX0lQQUNDX0RFRl9CT09UX1NXX0FDSywKKysJTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1dfTkFDSywKKysJTk1fTVRfSVBBQ0NfU0VUX05WQVRUUgkJPSAweGVmLAorKwlOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX0FDSywKKysJTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9OQUNLLAorKwlOTV9NVF9JUEFDQ19HRVRfTlZBVFRSCQk9IDB4ZjIsCisrCU5NX01UX0lQQUNDX0dFVF9OVkFUVFJfQUNLLAorKwlOTV9NVF9JUEFDQ19HRVRfTlZBVFRSX05BQ0ssCisrCU5NX01UX0lQQUNDX1NFVF9BVFRSCQk9IDB4ZjUsCisrCU5NX01UX0lQQUNDX1NFVF9BVFRSX0FDSywKKysJTk1fTVRfSVBBQ0NfU0VUX0FUVFJfTkFDSywKKysJTk1fTVRfSVBBQ0NfQVRUUl9DSEdfRVZUCT0gMHhmOCwKKysJTk1fTVRfSVBBQ0NfU1dfREVBQ1QJCT0gMHhmOSwKKysJTk1fTVRfSVBBQ0NfU1dfREVBQ1RfQUNLLAorKwlOTV9NVF9JUEFDQ19TV19ERUFDVF9OQUNLLAorKwlOTV9NVF9JUEFDQ19NRUFTX1JFU19SRVFfTkFDSwk9IDB4ZmMsCisrCU5NX01UX0lQQUNDX1NUQVJUX01FQVNfTkFDSywKKysJTk1fTVRfSVBBQ0NfU1RPUF9NRUFTX05BQ0ssCisrfTsKKysKKytlbnVtIGFiaXNfbm1fYnMxMV9jZWxsX2FsbG9jIHsKKysJTk1fQlMxMV9DQU5SX0dTTQk9IDB4MDAsCisrCU5NX0JTMTFfQ0FOUl9EQ1MxODAwCT0gMHgwMSwKKyt9OworKworKy8qIFNlY3Rpb24gOS4yOiBPYmplY3QgQ2xhc3MgKi8KKytlbnVtIGFiaXNfbm1fb2JqX2NsYXNzIHsKKysJTk1fT0NfU0lURV9NQU5BR0VSCQk9IDB4MDAsCisrCU5NX09DX0JUUywKKysJTk1fT0NfUkFESU9fQ0FSUklFUiwKKysJTk1fT0NfQ0hBTk5FTCwKKysJTk1fT0NfQkFTRUJfVFJBTlNDLAorKwkvKiBSRlU6IDA1LUZFICovCisrCU5NX09DX0JTMTFfQURKQwkJCT0gMHhhMCwKKysJTk1fT0NfQlMxMV9IQU5ET1ZFUgkJPSAweGExLAorKwlOTV9PQ19CUzExX1BXUl9DVFJMCQk9IDB4YTIsCisrCU5NX09DX0JTMTFfQlRTRQkJCT0gMHhhMywJCS8qIExNVD8gKi8KKysJTk1fT0NfQlMxMV9SQUNLCQkJPSAweGE0LAorKwlOTV9PQ19CUzExCQkJPSAweGE1LAkJLyogMDE6IEFMQ08gKi8KKysJTk1fT0NfQlMxMV9URVNUCQkJPSAweGE2LAorKwlOTV9PQ19CUzExX0VOVkFCVFNFCQk9IDB4YTgsCisrCU5NX09DX0JTMTFfQlBPUlQJCT0gMHhhOSwKKysKKysJTk1fT0NfR1BSU19OU0UJCQk9IDB4ZjAsCisrCU5NX09DX0dQUlNfQ0VMTAkJCT0gMHhmMSwKKysJTk1fT0NfR1BSU19OU1ZDMAkJPSAweGYyLAorKwlOTV9PQ19HUFJTX05TVkMxCQk9IDB4ZjMsCisrCisrCU5NX09DX05VTEwJCQk9IDB4ZmYsCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNDogQXR0cmlidXRlcyAqLworK2VudW0gYWJpc19ubV9hdHRyIHsKKysJTk1fQVRUX0FCSVNfQ0hBTk5FTAk9IDB4MDEsCisrCU5NX0FUVF9BRERfSU5GTywKKysJTk1fQVRUX0FERF9URVhULAorKwlOTV9BVFRfQURNX1NUQVRFLAorKwlOTV9BVFRfQVJGQ05fTElTVCwKKysJTk1fQVRUX0FVVE9OX1JFUE9SVCwKKysJTk1fQVRUX0FWQUlMX1NUQVRVUywKKysJTk1fQVRUX0JDQ0hfQVJGQ04sCisrCU5NX0FUVF9CU0lDLAorKwlOTV9BVFRfQlRTX0FJUl9USU1FUiwKKysJTk1fQVRUX0NDQ0hfTF9JX1AsCisrCU5NX0FUVF9DQ0NIX0xfVCwKKysJTk1fQVRUX0NIQU5fQ09NQiwKKysJTk1fQVRUX0NPTk5fRkFJTF9DUklULAorKwlOTV9BVFRfREVTVCwKKysJLyogcmVzICovCisrCU5NX0FUVF9FVkVOVF9UWVBFCT0gMHgxMSwgLyogQlMxMTogZmlsZSBkYXRhID8hPyAqLworKwlOTV9BVFRfRklMRV9JRCwKKysJTk1fQVRUX0ZJTEVfVkVSU0lPTiwKKysJTk1fQVRUX0dTTV9USU1FLAorKwlOTV9BVFRfSFNOLAorKwlOTV9BVFRfSFdfQ09ORklHLAorKwlOTV9BVFRfSFdfREVTQywKKysJTk1fQVRUX0lOVEFWRV9QQVJBTSwKKysJTk1fQVRUX0lOVEVSRl9CT1VORCwKKysJTk1fQVRUX0xJU1RfUkVRX0FUVFIsCisrCU5NX0FUVF9NQUlPLAorKwlOTV9BVFRfTUFOVUZfU1RBVEUsCisrCU5NX0FUVF9NQU5VRl9USFJFU0gsCisrCU5NX0FUVF9NQU5VRl9JRCwKKysJTk1fQVRUX01BWF9UQSwKKysJTk1fQVRUX01EUk9QX0xJTkssCS8qIDB4MjAgKi8KKysJTk1fQVRUX01EUk9QX05FWFQsCisrCU5NX0FUVF9OQUNLX0NBVVNFUywKKysJTk1fQVRUX05ZMSwKKysJTk1fQVRUX09QRVJfU1RBVEUsCisrCU5NX0FUVF9PVkVSTF9QRVJJT0QsCisrCU5NX0FUVF9QSFlTX0NPTkYsCisrCU5NX0FUVF9QT1dFUl9DTEFTUywKKysJTk1fQVRUX1BPV0VSX1RIUkVTSCwKKysJTk1fQVRUX1BST0JfQ0FVU0UsCisrCU5NX0FUVF9SQUNIX0JfVEhSRVNILAorKwlOTV9BVFRfTERBVkdfU0xPVFMsCisrCU5NX0FUVF9SQURfU1VCQywKKysJTk1fQVRUX1JGX01BWFBPV1JfUiwKKysJTk1fQVRUX1NJVEVfSU5QVVRTLAorKwlOTV9BVFRfU0lURV9PVVRQVVRTLAorKwlOTV9BVFRfU09VUkNFLAkJLyogMHgzMCAqLworKwlOTV9BVFRfU1BFQ19QUk9CLAorKwlOTV9BVFRfU1RBUlRfVElNRSwKKysJTk1fQVRUX1QyMDAsCisrCU5NX0FUVF9URUksCisrCU5NX0FUVF9URVNUX0RVUiwKKysJTk1fQVRUX1RFU1RfTk8sCisrCU5NX0FUVF9URVNUX1JFUE9SVCwKKysJTk1fQVRUX1ZTV1JfVEhSRVNILAorKwlOTV9BVFRfV0lORE9XX1NJWkUsCisrCS8qIFJlcyAgKi8KKysJTk1fQVRUX0JTMTFfUlNTSV9PRkZTCT0gMHgzZCwKKysJTk1fQVRUX0JTMTFfVFhQV1IJPSAweDNlLAorKwlOTV9BVFRfQlMxMV9ESVZFUlNJVFkJPSAweDNmLAorKwkvKiBSZXMgICovCisrCU5NX0FUVF9UU0MJCT0gMHg0MCwKKysJTk1fQVRUX1NXX0NPTkZJRywKKysJTk1fQVRUX1NXX0RFU0NSLAorKwlOTV9BVFRfU0VWRVJJVFksCisrCU5NX0FUVF9HRVRfQVJJLAorKwlOTV9BVFRfSFdfQ09ORl9DSEcsCisrCU5NX0FUVF9PVVRTVF9BTEFSTSwKKysJTk1fQVRUX0ZJTEVfREFUQSwKKysJTk1fQVRUX01FQVNfUkVTLAorKwlOTV9BVFRfTUVBU19UWVBFLAorKworKwlOTV9BVFRfQlMxMV9FU05fRldfQ09ERV9OTwk9IDB4NGMsCisrCU5NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PCT0gMHg0ZiwKKysKKysJTk1fQVRUX0JTMTFfRVNOX1BDQl9TRVJJQUwJPSAweDU1LAorKwlOTV9BVFRfQlMxMV9FWENFU1NJVkVfRElTVEFOQ0UJPSAweDU4LAorKworKwlOTV9BVFRfQlMxMV9BTExfVEVTVF9DQVRHCT0gMHg2MCwKKysJTk1fQVRUX0JTMTFfQlRTTFNfSE9QUElORywKKysJTk1fQVRUX0JTMTFfQ0VMTF9BTExPQ19OUiwKKysJTk1fQVRUX0JTMTFfQ0VMTF9HTE9CQUxfSUQsCisrCU5NX0FUVF9CUzExX0VOQV9JTlRFUkZfQ0xBU1MJPSAweDY2LAorKwlOTV9BVFRfQlMxMV9FTkFfSU5UX0lOVEVDX0hBTkRPCT0gMHg2NywKKysJTk1fQVRUX0JTMTFfRU5BX0lOVF9JTlRSQ19IQU5ETwk9IDB4NjgsCisrCU5NX0FUVF9CUzExX0VOQV9NU19QV1JfQ1RSTAk9IDB4NjksCisrCU5NX0FUVF9CUzExX0VOQV9QV1JfQkRHVF9ITwk9IDB4NmEsCisrCU5NX0FUVF9CUzExX0VOQV9QV1JfQ1RSTF9STEZXCT0gMHg2YiwKKysJTk1fQVRUX0JTMTFfRU5BX1JYTEVWX0hPCT0gMHg2YywKKysJTk1fQVRUX0JTMTFfRU5BX1JYUVVBTF9ITwk9IDB4NmQsCisrCU5NX0FUVF9CUzExX0ZBQ0NIX1FVQUwJCT0gMHg2ZSwKKysKKysJTk1fQVRUX0lQQUNDX0RTVF9JUAkJPSAweDgwLAorKwlOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlQJPSAweDgxLAorKwlOTV9BVFRfSVBBQ0NfU1NSQwkJPSAweDgyLAkJLyogUlRQIFN5bmMgU291cmNlICovCisrCU5NX0FUVF9JUEFDQ19SVFBfUEFZTERfVFlQRQk9IDB4ODMsCisrCU5NX0FUVF9JUEFDQ19CQVNFQl9JRAkJPSAweDg0LAorKwlOTV9BVFRfSVBBQ0NfU1RSRUFNX0lECQk9IDB4ODUsCisrCU5NX0FUVF9JUEFDQ19OVl9GTEFHUwkJPSAweDg2LAorKwlOTV9BVFRfSVBBQ0NfRlJFUV9DVFJMCQk9IDB4ODcsCisrCU5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkcJPSAweDg4LAorKwlOTV9BVFRfSVBBQ0NfU0VDX09NTF9DRkcJPSAweDg5LAorKwlOTV9BVFRfSVBBQ0NfSVBfSUZfQ0ZHCQk9IDB4OGEsCQkvKiBJUCBpbnRlcmZhY2UgKi8KKysJTk1fQVRUX0lQQUNDX0lQX0dXX0NGRwkJPSAweDhiLAkJLyogSVAgZ2F0ZXdheSAqLworKwlOTV9BVFRfSVBBQ0NfSU5fU0VSVl9USU1FCT0gMHg4YywKKysJTk1fQVRUX0lQQUNDX1RSWF9CVFNfQVNTCT0gMHg4ZCwKKysJTk1fQVRUX0lQQUNDX0xPQ0FUSU9OCQk9IDB4OGUsCQkvKiBzdHJpbmcgZGVzY3JpYmluZyBsb2NhdGlvbiAqLworKwlOTV9BVFRfSVBBQ0NfUEFHSU5HX0NGRwkJPSAweDhmLAorKwlOTV9BVFRfSVBBQ0NfRklMRV9EQVRBCQk9IDB4OTAsCisrCU5NX0FUVF9JUEFDQ19VTklUX0lECQk9IDB4OTEsCQkvKiBTaXRlL0JUUy9UUlggKi8KKysJTk1fQVRUX0lQQUNDX1BBUkVOVF9VTklUX0lECT0gMHg5MiwKKysJTk1fQVRUX0lQQUNDX1VOSVRfTkFNRQkJPSAweDkzLAkJLyogZGVmYXVsdDogbmJ0cy08bWFjLWFzLXN0cmluZz4gKi8KKysJTk1fQVRUX0lQQUNDX1NOTVBfQ0ZHCQk9IDB4OTQsCisrCU5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkdfTElTVAk9IDB4OTUsCisrCU5NX0FUVF9JUEFDQ19QUklNX09NTF9GQl9UT1VUCT0gMHg5NiwJCS8qIGZhbGxiYWNrIHRpbWVvdXQgKi8KKysJTk1fQVRUX0lQQUNDX0NVUl9TV19DRkcJCT0gMHg5NywKKysJTk1fQVRUX0lQQUNDX1RJTUlOR19CVVMJCT0gMHg5OCwKKysJTk1fQVRUX0lQQUNDX0NHSQkJPSAweDk5LAkJLyogQ2VsbCBHbG9iYWwgSUQgKi8KKysJTk1fQVRUX0lQQUNDX1JBQwkJPSAweDlhLAorKwlOTV9BVFRfSVBBQ0NfT0JKX1ZFUlNJT04JPSAweDliLAorKwlOTV9BVFRfSVBBQ0NfR1BSU19QQUdJTkdfQ0ZHCT0gMHg5YywKKysJTk1fQVRUX0lQQUNDX05TRUkJCT0gMHg5ZCwKKysJTk1fQVRUX0lQQUNDX0JWQ0kJCT0gMHg5ZSwKKysJTk1fQVRUX0lQQUNDX05TVkNJCQk9IDB4OWYsCisrCU5NX0FUVF9JUEFDQ19OU19DRkcJCT0gMHhhMCwKKysJTk1fQVRUX0lQQUNDX0JTU0dQX0NGRwkJPSAweGExLAorKwlOTV9BVFRfSVBBQ0NfTlNfTElOS19DRkcJPSAweGEyLAorKwlOTV9BVFRfSVBBQ0NfUkxDX0NGRwkJPSAweGEzLAorKwlOTV9BVFRfSVBBQ0NfQUxNX1RIUkVTSF9MSVNUCT0gMHhhNCwKKysJTk1fQVRUX0lQQUNDX01PTklUX1ZBTF9MSVNUCT0gMHhhNSwKKysJTk1fQVRUX0lQQUNDX1RJQl9DT05UUk9MCT0gMHhhNiwKKysJTk1fQVRUX0lQQUNDX1NVUFBfRkVBVFVSRVMJPSAweGE3LAorKwlOTV9BVFRfSVBBQ0NfQ09ESU5HX1NDSEVNRVMJPSAweGE4LAorKwlOTV9BVFRfSVBBQ0NfUkxDX0NGR18yCQk9IDB4YTksCisrCU5NX0FUVF9JUEFDQ19IRUFSVEJfVE9VVAk9IDB4YWEsCisrCU5NX0FUVF9JUEFDQ19VUFRJTUUJCT0gMHhhYiwKKysJTk1fQVRUX0lQQUNDX1JMQ19DRkdfMwkJPSAweGFjLAorKwlOTV9BVFRfSVBBQ0NfU1NMX0NGRwkJPSAweGFkLAorKwlOTV9BVFRfSVBBQ0NfU0VDX1BPU1NJQkxFCT0gMHhhZSwKKysJTk1fQVRUX0lQQUNDX0lNTF9TU0xfU1RBVEUJPSAweGFmLAorKwlOTV9BVFRfSVBBQ0NfUkVWT0NfREFURQkJPSAweGIwLAorKworKworKwlOTV9BVFRfQlMxMV9SRl9SRVNfSU5EX1BFUgk9IDB4OGYsCisrCisrCU5NX0FUVF9CUzExX1JYX0xFVl9NSU5fQ0VMTAk9IDB4OTAsCisrCU5NX0FUVF9CUzExX0FCSVNfRVhUX1RJTUUJPSAweDkxLAorKwlOTV9BVFRfQlMxMV9USU1FUl9IT19SRVFVRVNUCT0gMHg5MiwKKysJTk1fQVRUX0JTMTFfVElNRVJfTkNFTEwJCT0gMHg5MywKKysJTk1fQVRUX0JTMTFfVFNZTkMJCT0gMHg5NCwKKysJTk1fQVRUX0JTMTFfVFRSQVUJCT0gMHg5NSwKKysJTk1fQVRUX0JTMTFfRU1SR19DRkdfTUVNQkVSCT0gMHg5YiwKKysJTk1fQVRUX0JTMTFfVFJYX0FSRUEJCT0gMHg5ZiwKKysKKysJTk1fQVRUX0JTMTFfQkNDSF9SRUNPTkYJCT0gMHhkNywKKysJTk1fQVRUX0JTMTFfQklUX0VSUl9USEVTSAk9IDB4YTAsCisrCU5NX0FUVF9CUzExX0JPT1RfU1dfVkVSUwk9IDB4YTEsCisrCU5NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1kJPSAweGEzLAorKwlOTV9BVFRfQlMxMV9DQ0xLX1RZUEUJCT0gMHhhNCwKKysJTk1fQVRUX0JTMTFfSU5QX0lNUEVEQU5DRQk9IDB4YWEsCisrCU5NX0FUVF9CUzExX0wxX1BST1RfVFlQRQk9IDB4YWIsCisrCU5NX0FUVF9CUzExX0xJTkVfQ0ZHCQk9IDB4YWMsCisrCU5NX0FUVF9CUzExX0xJX1BPUlRfMQkJPSAweGFkLAorKwlOTV9BVFRfQlMxMV9MSV9QT1JUXzIJCT0gMHhhZSwKKysKKysJTk1fQVRUX0JTMTFfTDFfUkVNX0FMTV9UWVBFCT0gMHhiMCwKKysJTk1fQVRUX0JTMTFfU1dfTE9BRF9JTlRFTkRFRAk9IDB4YmIsCisrCU5NX0FUVF9CUzExX1NXX0xPQURfU0FGRVRZCT0gMHhiYywKKysJTk1fQVRUX0JTMTFfU1dfTE9BRF9TVE9SRUQJPSAweGJkLAorKworKwlOTV9BVFRfQlMxMV9WRU5ET1JfTkFNRQkJPSAweGMxLAorKwlOTV9BVFRfQlMxMV9IT1BQSU5HX01PREUJPSAweGM1LAorKwlOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTgk9IDB4YzYsCisrCU5NX0FUVF9CUzExX0xNVF9MT0dJTl9USU1FCT0gMHhjNywKKysJTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVgk9IDB4YzgsCisrCU5NX0FUVF9CUzExX0xNVF9VU0VSX05BTUUJPSAweGM5LAorKworKwlOTV9BVFRfQlMxMV9MMV9DT05UUk9MX1RTCT0gMHhkOCwKKysJTk1fQVRUX0JTMTFfUkFESU9fTUVBU19HUkFOCT0gMHhkYywJLyogaW4gU0FDQ0ggbXVsdGlmcmFtZXMgKi8KKysJTk1fQVRUX0JTMTFfUkFESU9fTUVBU19SRVAJPSAweGRkLAorKworKwlOTV9BVFRfQlMxMV9TSF9MQVBEX0lOVF9USU1FUgk9IDB4ZTgsCisrCisrCU5NX0FUVF9CUzExX0JUU19TVEFURQkJPSAweGYwLAorKwlOTV9BVFRfQlMxMV9FMV9TVEFURQkJPSAweGYxLAorKwlOTV9BVFRfQlMxMV9QTEwJCQk9IDB4ZjIsCisrCU5NX0FUVF9CUzExX1JYX09GRlNFVAkJPSAweGYzLAorKwlOTV9BVFRfQlMxMV9BTlRfVFlQRQkJPSAweGY0LAorKwlOTV9BVFRfQlMxMV9QTExfTU9ERQkJPSAweGZjLAorKwlOTV9BVFRfQlMxMV9QQVNTV09SRAkJPSAweGZkLAorK307CisrI2RlZmluZSBOTV9BVFRfQlMxMV9GSUxFX0RBVEEJTk1fQVRUX0VWRU5UX1RZUEUKKysKKysvKiBTZWN0aW9uIDkuNC40OiBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSAqLworK2VudW0gYWJpc19ubV9hZG1fc3RhdGUgeworKwlOTV9TVEFURV9MT0NLRUQJCT0gMHgwMSwKKysJTk1fU1RBVEVfVU5MT0NLRUQJPSAweDAyLAorKwlOTV9TVEFURV9TSFVURE9XTgk9IDB4MDMsCisrCU5NX1NUQVRFX05VTEwJCT0gMHhmZiwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjEzOiBDaGFubmVsIENvbWJpbmF0aW9uICovCisrZW51bSBhYmlzX25tX2NoYW5fY29tYiB7CisrCU5NX0NIQU5DX1RDSEZ1bGwJPSAweDAwLAorKwlOTV9DSEFOQ19UQ0hIYWxmCT0gMHgwMSwKKysJTk1fQ0hBTkNfVENISGFsZjIJPSAweDAyLAorKwlOTV9DSEFOQ19TRENDSAkJPSAweDAzLAorKwlOTV9DSEFOQ19tYWluQkNDSAk9IDB4MDQsCisrCU5NX0NIQU5DX0JDQ0hDb21iCT0gMHgwNSwKKysJTk1fQ0hBTkNfQkNDSAkJPSAweDA2LAorKwlOTV9DSEFOQ19CQ0NIX0NCQ0gJPSAweDA3LAorKwlOTV9DSEFOQ19TRENDSF9DQkNICT0gMHgwOCwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjE2OiBFdmVudCBUeXBlICovCisrZW51bSBhYmlzX25tX2V2ZW50X3R5cGUgeworKwlOTV9FVlRfQ09NTV9GQUlMCT0gMHgwMCwKKysJTk1fRVZUX1FPU19GQUlMCQk9IDB4MDEsCisrCU5NX0VWVF9QUk9DX0ZBSUwJPSAweDAyLAorKwlOTV9FVlRfRVFVSVBfRkFJTAk9IDB4MDMsCisrCU5NX0VWVF9FTlZfRkFJTAkJPSAweDA0LAorK307CisrCisrLyogU2VjdGlvbjogOS40LjYzOiBQZXJjZWl2ZWQgU2V2ZXJpdHkgKi8KKytlbnVtIGFiaXNfbm1fc2V2ZXJpdHkgeworKwlOTV9TRVZFUl9DRUFTRUQJCT0gMHgwMCwKKysJTk1fU0VWRVJfQ1JJVElDQUwJPSAweDAxLAorKwlOTV9TRVZFUl9NQUpPUgkJPSAweDAyLAorKwlOTV9TRVZFUl9NSU5PUgkJPSAweDAzLAorKwlOTV9TRVZFUl9XQVJOSU5HCT0gMHgwNCwKKysJTk1fU0VWRVJfSU5ERVRFUk1JTkFURQk9IDB4MDUsCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC40MzogUHJvYmFibGUgQ2F1c2UgVHlwZSAqLworK2VudW0gYWJpc19ubV9wY2F1c2VfdHlwZSB7CisrCU5NX1BDQVVTRV9UX1g3MjEJPSAweDAxLAorKwlOTV9QQ0FVU0VfVF9HU00JCT0gMHgwMiwKKysJTk1fUENBVVNFX1RfTUFOVUYJPSAweDAzLAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMzY6IE5BQ0sgQ2F1c2VzICovCisrZW51bSBhYmlzX25tX25hY2tfY2F1c2UgeworKwkvKiBHZW5lcmFsIE5hY2sgQ2F1c2VzICovCisrCU5NX05BQ0tfSU5DT1JSX1NUUlVDVAkJPSAweDAxLAorKwlOTV9OQUNLX01TR1RZUEVfSU5WQUwJCT0gMHgwMiwKKysJTk1fTkFDS19PQkpDTEFTU19JTlZBTAkJPSAweDA1LAorKwlOTV9OQUNLX09CSkNMQVNTX05PVFNVUFAJPSAweDA2LAorKwlOTV9OQUNLX0JUU05SX1VOS04JCT0gMHgwNywKKysJTk1fTkFDS19UUlhOUl9VTktOCQk9IDB4MDgsCisrCU5NX05BQ0tfT0JKSU5TVF9VTktOCQk9IDB4MDksCisrCU5NX05BQ0tfQVRUUklEX0lOVkFMCQk9IDB4MGMsCisrCU5NX05BQ0tfQVRUUklEX05PVFNVUFAJCT0gMHgwZCwKKysJTk1fTkFDS19QQVJBTV9SQU5HRQkJPSAweDBlLAorKwlOTV9OQUNLX0FUVFJMSVNUX0lOQ09OU0lTVEVOVAk9IDB4MGYsCisrCU5NX05BQ0tfU1BFQ19JTVBMX05PVFNVUFAJPSAweDEwLAorKwlOTV9OQUNLX0NBTlRfUEVSRk9STQkJPSAweDExLAorKwkvKiBTcGVjaWZpYyBOYWNrIENhdXNlcyAqLworKwlOTV9OQUNLX1JFU19OT1RJTVBMCQk9IDB4MTksCisrCU5NX05BQ0tfUkVTX05PVEFWQUlMCQk9IDB4MWEsCisrCU5NX05BQ0tfRlJFUV9OT1RBVkFJTAkJPSAweDFiLAorKwlOTV9OQUNLX1RFU1RfTk9UU1VQUAkJPSAweDFjLAorKwlOTV9OQUNLX0NBUEFDSVRZX1JFU1RSCQk9IDB4MWQsCisrCU5NX05BQ0tfUEhZU0NGR19OT1RQRVJGT1JNCT0gMHgxZSwKKysJTk1fTkFDS19URVNUX05PVElOSVQJCT0gMHgxZiwKKysJTk1fTkFDS19QSFlTQ0ZHX05PVFJFU1RPUkUJPSAweDIwLAorKwlOTV9OQUNLX1RFU1RfTk9TVUNICQk9IDB4MjEsCisrCU5NX05BQ0tfVEVTVF9OT1NUT1AJCT0gMHgyMiwKKysJTk1fTkFDS19NU0dJTkNPTlNJU1RfUEhZU0NGRwk9IDB4MjMsCisrCU5NX05BQ0tfRklMRV9JTkNPTVBMRVRFCQk9IDB4MjUsCisrCU5NX05BQ0tfRklMRV9OT1RBVkFJTAkJPSAweDI2LAorKwlOTV9OQUNLX0ZJTEVfTk9UQUNUSVZBVEUJPSAweDI3LAorKwlOTV9OQUNLX1JFUV9OT1RfR1JBTlQJCT0gMHgyOCwKKysJTk1fTkFDS19XQUlUCQkJPSAweDI5LAorKwlOTV9OQUNLX05PVEhfUkVQT1JUX0VYSVNUCT0gMHgyYSwKKysJTk1fTkFDS19NRUFTX05PVFNVUFAJCT0gMHgyYiwKKysJTk1fTkFDS19NRUFTX05PVFNUQVJUCQk9IDB4MmMsCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC4xICovCisrc3RydWN0IGFiaXNfbm1fY2hhbm5lbCB7CisrCWd1aW50OAlhdHRyaWI7CisrCWd1aW50OAlidHNfcG9ydDsKKysJZ3VpbnQ4CXRpbWVzbG90OworKwlndWludDgJc3Vic2xvdDsKKyt9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKysKKysvKiBTaWVtZW5zIEJTLTExIHNwZWNpZmljIG9iamVjdHMgaW4gdGhlIFNpZW5lbXNIVyAoMHhBNSkgb2JqZWN0IGNsYXNzICovCisrZW51bSBhYmlzX2JzMTFfb2JqdHlwZSB7CisrCUJTMTFfT0JKX0FMQ08JCT0gMHgwMSwKKysJQlMxMV9PQkpfQkJTSUcJCT0gMHgwMiwJLyogb2JqX2NsYXNzOiAwLDEgKi8KKysJQlMxMV9PQkpfVFJYMQkJPSAweDAzLAkvKiBvbmx5IERFQUNUSVZBVEUgVFJYMSAqLworKwlCUzExX09CSl9DQ0xLCQk9IDB4MDQsCisrCUJTMTFfT0JKX0dQU1UJCT0gMHgwNiwKKysJQlMxMV9PQkpfTEkJCT0gMHgwNywKKysJQlMxMV9PQkpfUEEJCT0gMHgwOSwJLyogb2JqX2NsYXNzOiAwLCAxKi8KKyt9OworKworK2VudW0gYWJpc19iczExX3RyeF9wb3dlciB7CisrCUJTMTFfVFJYX1BPV0VSX0dTTV8yVwk9IDB4MDYsCisrCUJTMTFfVFJYX1BPV0VSX0dTTV8yNTBtVz0gMHgwNywKKysJQlMxMV9UUlhfUE9XRVJfR1NNXzgwbVcJPSAweDA4LAorKwlCUzExX1RSWF9QT1dFUl9HU01fMzBtVwk9IDB4MDksCisrCUJTMTFfVFJYX1BPV0VSX0RDU18zVwk9IDB4MGEsCisrCUJTMTFfVFJYX1BPV0VSX0RDU18xVzYJPSAweDBiLAorKwlCUzExX1RSWF9QT1dFUl9EQ1NfNTAwbVc9IDB4MGMsCisrCUJTMTFfVFJYX1BPV0VSX0RDU18xNjBtVz0gMHgwZCwKKyt9OworKworK2VudW0gYWJpc19iczExX2xpX3BsbF9tb2RlIHsKKysJQlMxMV9MSV9QTExfTE9DS0VECT0gMiwKKysJQlMxMV9MSV9QTExfU1RBTkRBTE9ORQk9IDMsCisrfTsKKysKKytlbnVtIGFiaXNfYnMxMV9waGFzZSB7CisrCUJTMTFfU1RBVEVfU09GVFdBUkVfUlFECQk9IDB4MDEsCisrCUJTMTFfU1RBVEVfTE9BRF9TTVVfSU5URU5ERUQJPSAweDExLAorKwlCUzExX1NUQVRFX0xPQURfU01VX1NBRkVUWQk9IDB4MjEsCisrCUJTMTFfU1RBVEVfTE9BRF9GQUlMRUQJCT0gMHgzMSwKKysJQlMxMV9TVEFURV9MT0FEX0RJQUdOT1NUSUMJPSAweDQxLAorKwlCUzExX1NUQVRFX1dBUk1fVVAJCT0gMHg1MSwKKysJQlMxMV9TVEFURV9XQVJNX1VQXzIJCT0gMHg1MiwKKysJQlMxMV9TVEFURV9XQUlUX01JTl9DRkcJCT0gMHg2MiwKKysJQlMxMV9TVEFURV9NQUlOVEVOQU5DRQkJPSAweDcyLAorKwlCUzExX1NUQVRFX0xPQURfTUJDQ1UJCT0gMHg5MiwKKysJQlMxMV9TVEFURV9XQUlUX01JTl9DRkdfMgk9IDB4QTIsCisrCUJTMTFfU1RBVEVfTk9STUFMCQk9IDB4MDMsCisrCUJTMTFfU1RBVEVfQUJJU19MT0FECQk9IDB4MTMsCisrfTsKKysKKysvKiBGcm9tIG9wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Rsdi5oICovCisrZW51bSB0bHZfdHlwZSB7CisrCVRMVl9UWVBFX0ZJWEVELAorKwlUTFZfVFlQRV9ULAorKwlUTFZfVFlQRV9UViwKKysJVExWX1RZUEVfVExWLAorKwlUTFZfVFlQRV9UTDE2ViwKKyt9OworKworK3N0cnVjdCB0bHZfZGVmIHsKKysJZW51bSB0bHZfdHlwZSB0eXBlOworKwl1X2ludDhfdCBmaXhlZF9sZW47CisrfTsKKysKKytzdHJ1Y3QgdGx2X2RlZmluaXRpb24geworKwlzdHJ1Y3QgdGx2X2RlZiBkZWZbMHhmZl07CisrfTsKKysKKytlbnVtIGFiaXNfbm1faXBhY2NfdGVzdF9ubyB7CisrCU5NX0lQQUNDX1RFU1ROT19STE9PUF9BTlQJPSAweDAxLAorKwlOTV9JUEFDQ19URVNUTk9fUkxPT1BfWENWUgk9IDB4MDIsCisrCU5NX0lQQUNDX1RFU1ROT19GVU5DX09CSgk9IDB4MDMsCisrCU5NX0lQQUNDX1RFU1ROT19DSEFOX1VTQUdFCT0gMHg0MCwKKysJTk1fSVBBQ0NfVEVTVE5PX0JDQ0hfQ0hBTl9VU0FHRQk9IDB4NDEsCisrCU5NX0lQQUNDX1RFU1ROT19GUkVRX1NZTkMJPSAweDQyLAorKwlOTV9JUEFDQ19URVNUTk9fQkNDSF9JTkZPCT0gMHg0MywKKysJTk1fSVBBQ0NfVEVTVE5PX1RYX0JFQUNPTgk9IDB4NDQsCisrCU5NX0lQQUNDX1RFU1ROT19TWVNJTkZPX01PTklUT1IJPSAweDQ1LAorKwlOTV9JUEFDQ19URVNUTk9fQkNDQ0hfTU9OSVRPUgk9IDB4NDYsCisrfTsKKysKKysvKiBmaXJzdCBieXRlIGFmdGVyIGxlbmd0aCBpbnNpZGUgTk1fQVRUX1RFU1RfUkVQT1JUICovCisrZW51bSBhYmlzX25tX2lwYWNjX3Rlc3RfcmVzIHsKKysJTk1fSVBBQ0NfVEVTVFJFU19TVUNDRVNTCT0gMCwKKysJTk1fSVBBQ0NfVEVTVFJFU19USU1FT1VUCT0gMSwKKysJTk1fSVBBQ0NfVEVTVFJFU19OT19DSEFOUwk9IDIsCisrCU5NX0lQQUNDX1RFU1RSRVNfUEFSVElBTAk9IDMsCisrCU5NX0lQQUNDX1RFU1RSRVNfU1RPUFBFRAk9IDQsCisrfTsKKysKKysvKiBpbnRlcm5hbCBJRSBpbnNpZGUgTk1fQVRUX1RFU1RfUkVQT1JUICovCisrZW51bSBhYmlzX25tX2lwYWNjX3Rlc3RyZXNfaWUgeworKwlOTV9JUEFDQ19UUl9JRV9GUkVRX0VSUl9MSVNUCT0gMywKKysJTk1fSVBBQ0NfVFJfSUVfQ0hBTl9VU0FHRQk9IDQsCisrCU5NX0lQQUNDX1RSX0lFX0JDQ0hfSU5GTwk9IDYsCisrCU5NX0lQQUNDX1RSX0lFX1JFU1VMVF9ERVRBSUxTCT0gOCwKKysJTk1fSVBBQ0NfVFJfSUVfRlJFUV9FUlIJCT0gMTgsCisrfTsKKysKKysvKiBGcm9tIG9wZW5ic2Mvc3JjL2FiaXNfbm0uYyAqLworK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gbm1fYXR0X3RsdmRlZiA9IHsKKysJLmRlZiA9IHsKKysJCVtOTV9BVFRfQUJJU19DSEFOTkVMXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisrCQlbTk1fQVRUX0FERF9JTkZPXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0FERF9URVhUXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0FETV9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9BUkZDTl9MSVNUXT0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfQVVUT05fUkVQT1JUXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0FWQUlMX1NUQVRVU10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9CQ0NIX0FSRkNOXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX0JTSUNdID0JCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0JUU19BSVJfVElNRVJdID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9DQ0NIX0xfSV9QXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0NDQ0hfTF9UXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0NIQU5fQ09NQl0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9DT05OX0ZBSUxfQ1JJVF0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0RFU1RdID0JCQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0VWRU5UX1RZUEVdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfRklMRV9JRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9GSUxFX1ZFUlNJT05dID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfR1NNX1RJTUVdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfSFNOXSA9CQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9IV19DT05GSUddID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCS8vQlMxMSBbTk1fQVRUX0hXX0RFU0NdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSFdfREVTQ10gPQkJeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfSU5UQVZFX1BBUkFNXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0lOVEVSRl9CT1VORF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgNiB9LAorKwkJW05NX0FUVF9MSVNUX1JFUV9BVFRSXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfTUFJT10gPQkJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfTUFOVUZfU1RBVEVdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfTUFOVUZfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX01BTlVGX0lEXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX01BWF9UQV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9NRFJPUF9MSU5LXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX01EUk9QX05FWFRdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfTkFDS19DQVVTRVNdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfTlkxXSA9CQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9PUEVSX1NUQVRFXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX09WRVJMX1BFUklPRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9QSFlTX0NPTkZdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfUE9XRVJfQ0xBU1NdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfUE9XRVJfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisrCQlbTk1fQVRUX1BST0JfQ0FVU0VdID0JCXsgVExWX1RZUEVfRklYRUQsIDMgfSwKKysJCVtOTV9BVFRfUkFDSF9CX1RIUkVTSF0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0xEQVZHX1NMT1RTXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX1JBRF9TVUJDXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1JGX01BWFBPV1JfUl0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9TSVRFX0lOUFVUU10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9TSVRFX09VVFBVVFNdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfU09VUkNFXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1NQRUNfUFJPQl0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9TVEFSVF9USU1FXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX1QyMDBdID0JCQl7IFRMVl9UWVBFX0ZJWEVELCA3IH0sCisrCQlbTk1fQVRUX1RFSV0gPQkJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfVEVTVF9EVVJdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfVEVTVF9OT10gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9URVNUX1JFUE9SVF0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9WU1dSX1RIUkVTSF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9XSU5ET1dfU0laRV0gPSAJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfVFNDXSA9CQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9TV19DT05GSUddID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfU0VWRVJJVFldID0gCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0dFVF9BUkldID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSFdfQ09ORl9DSEddID0gCQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX09VVFNUX0FMQVJNXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0ZJTEVfREFUQV0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9NRUFTX1JFU10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKyNpZiAwCisrCQkvKiBCUzExIHNwZWNpZmljcyAqLworKwkJW05NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk9dID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTF0gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0JPT1RfU1dfVkVSU10gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJWzB4ZDVdID0JCQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJWzB4YThdID0JCQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX1BBU1NXT1JEXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfVFhQV1JdID0JCXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfUlNTSV9PRkZTXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTElORV9DRkddID0gCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9MMV9QUk9UX1RZUEVdID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0JJVF9FUlJfVEhFU0hdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9CUzExX0RJVkVSU0lUWV0gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OXT17IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0xNVF9MT0dJTl9USU1FXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVl0gPXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRV0gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0JUU19TVEFURV0JPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0UxX1NUQVRFXQk9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfUExMX01PREVdCT0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9QTExdCT0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9DQ0xLX0FDQ1VSQUNZXSA9CXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9DQ0xLX1RZUEVdID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJWzB4OTVdID0JCQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrI2VuZGlmCisrCQkvKiBpcC5hY2Nlc3Mgc3BlY2lmaWNzICovCisrCQlbTk1fQVRUX0lQQUNDX0RTVF9JUF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgNCB9LAorKwkJW05NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX05WX0ZMQUdTXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfRlJFUV9DVFJMXSA9CXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfSVBBQ0NfU0VDX09NTF9DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgNiB9LAorKwkJW05NX0FUVF9JUEFDQ19JUF9JRl9DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgOCB9LAorKwkJW05NX0FUVF9JUEFDQ19JUF9HV19DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgMTIgfSwKKysJCVtOTV9BVFRfSVBBQ0NfTE9DQVRJT05dID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19VTklUX0lEXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfVU5JVF9OQU1FXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfU05NUF9DRkddID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19BTE1fVEhSRVNIX0xJU1RdPSB7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0NVUl9TV19DRkddID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19TVFJFQU1fSURdID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19SQUNdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfT0JKX1ZFUlNJT05dID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkddID17IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX05TRUldID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfQlZDSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19OU1ZDSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19OU19DRkddID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfQlNTR1BfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfTlNfTElOS19DRkddID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19STENfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfU1VQUF9GRUFUVVJFU10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0NPRElOR19TQ0hFTUVTXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR18yXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR18zXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfRklMRV9EQVRBXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJfSwKKyt9OworKworKyNlbmRpZiAvKiBfTk1fSCAqLwpkaWZmIC0tZ2l0IGEvd2lyZXNoYXJrL2x1Y2VudC1obmIucGF0Y2ggYi93aXJlc2hhcmsvbHVjZW50LWhuYi5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzg1MTk1Ci0tLSAvZGV2L251bGwKKysrIGIvd2lyZXNoYXJrL2x1Y2VudC1obmIucGF0Y2gKQEAgLTAsMCArMSwxMjAgQEAKK0luZGV4OiB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1sdWNlbnRfaG5iLmMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLSAvZGV2L251bGwKKysrKyB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1sdWNlbnRfaG5iLmMKK0BAIC0wLDAgKzEsMTAzIEBACisrLyogcGFja2V0LWx1Y2VudF9obmIuYworKyAqIFJvdXRpbmVzIGZvciBwYWNrZXQgZGlzc2VjdGlvbiBvZiBBbGNhdGVsL0x1Y2VudCBIb21lTm9kZUIKKysgKiBDb3B5cmlnaHQgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorKyAqCisrICogVGhpcyBwcm90b2NvbCBkZWNvZGVyIGlzIGJhc2VkIGVudGlyZWx5IG9uIHJldmVyc2UgZW5naW5lZXJpbmcsIGkuZS4KKysgKiBvbiBlZHVjYXRlZCBndWVzc2VzLgorKyAqCisrICogJElkOiBwYWNrZXQtbHVjZW50X2huYi5jIDI5MjU0IDIwMDktMDctMzEgMTk6MTk6MjVaIGdlcmFsZCAkCisrICoKKysgKiBXaXJlc2hhcmsgLSBOZXR3b3JrIHRyYWZmaWMgYW5hbHl6ZXIKKysgKiBCeSBHZXJhbGQgQ29tYnMgPGdlcmFsZEB3aXJlc2hhcmsub3JnPgorKyAqIENvcHlyaWdodCAxOTk4IEdlcmFsZCBDb21icworKyAqCisrICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisrICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKysgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrICoKKysgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKysgKi8KKysKKysjaWZkZWYgSEFWRV9DT05GSUdfSAorKyMgaW5jbHVkZSAiY29uZmlnLmgiCisrI2VuZGlmCisrCisrI2RlZmluZSBMSE5CX1NDVFBfUFBJX01NCTEKKysjZGVmaW5lIExITkJfU0NUUF9QUElfR01NCTYKKysKKysjZGVmaW5lIExITkJfU0NUUF9QT1JUCQk2MDA1CisrCisrI2luY2x1ZGUgPGdsaWIuaD4KKysKKysjaW5jbHVkZSA8ZXBhbi9wYWNrZXQuaD4KKysKKysvKiBJbml0aWFsaXplIHRoZSBwcm90b2NvbCBhbmQgcmVnaXN0ZXJlZCBmaWVsZHMgKi8KKytzdGF0aWMgaW50IHByb3RvX2xobmIgPSAtMTsKKysKKytzdGF0aWMgaW50IGhmX2xobmJfbGVuZ3RoID0gLTE7CisrCisrLyogSW5pdGlhbGl6ZSB0aGUgc3VidHJlZSBwb2ludGVycyAqLworK3N0YXRpYyBnaW50IGV0dF9saG5iID0gLTE7CisrCisrc3RhdGljIGRpc3NlY3Rvcl9oYW5kbGVfdCByYW5hcF9oYW5kbGU7CisrCisrLyogQ29kZSB0byBhY3R1YWxseSBkaXNzZWN0IHRoZSBwYWNrZXRzICovCisrc3RhdGljIHZvaWQKKytkaXNzZWN0X2xobmIodHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlKQorK3sKKysKKysJaW50IG9mZnNldCA9IDA7CisrCXVfaW50MTZfdCBsZW47CisrCXR2YnVmZl90ICpuZXh0X3R2YjsKKysKKysJY29sX3NldF9zdHIocGluZm8tPmNpbmZvLCBDT0xfUFJPVE9DT0wsICJMSE5CIik7CisrCWNvbF9jbGVhcihwaW5mby0+Y2luZm8sIENPTF9JTkZPKTsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9saG5iX2xlbmd0aCwgdHZiLCBvZmZzZXQrMiwgMiwgRkFMU0UpOworKwlsZW4gPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KzIpOworKwluZXh0X3R2YiA9IHR2Yl9uZXdfc3Vic2V0KHR2Yiwgb2Zmc2V0KzIrNiwgbGVuLTQsIC0xKTsKKysKKysJY2FsbF9kaXNzZWN0b3IocmFuYXBfaGFuZGxlLCBuZXh0X3R2YiwgcGluZm8sIHRyZWUpOworK30KKysKKyt2b2lkIHByb3RvX3JlZ2lzdGVyX2x1Y2VudF9obmIodm9pZCkKKyt7CisrCXN0YXRpYyBoZl9yZWdpc3Rlcl9pbmZvIGhmW10gPSB7CisrCQl7JmhmX2xobmJfbGVuZ3RoLAorKwkJIHsiTGVuZ3RoIiwgImxobmIubGVuIiwKKysJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHgwLCBOVUxMLCBIRklMTH0KKysJCSB9LAorKwl9OworKworKwlzdGF0aWMgZ2ludCAqZXR0W10gPSB7CisrCQkmZXR0X2xobmIsCisrCX07CisrCisrCXByb3RvX2xobmIgPQorKwkgICAgcHJvdG9fcmVnaXN0ZXJfcHJvdG9jb2woIkFsY2F0ZWwvTHVjZW50IEhvbWVOb2RlQiIsCisrCQkJCSAgICAiTHVjZW50IEhOQiIsICJsaG5iIik7CisrCisrCXByb3RvX3JlZ2lzdGVyX2ZpZWxkX2FycmF5KHByb3RvX2xobmIsIGhmLCBhcnJheV9sZW5ndGgoaGYpKTsKKysJcHJvdG9fcmVnaXN0ZXJfc3VidHJlZV9hcnJheShldHQsIGFycmF5X2xlbmd0aChldHQpKTsKKyt9CisrCisrdm9pZCBwcm90b19yZWdfaGFuZG9mZl9sdWNlbnRfaG5iKHZvaWQpCisreworKwlkaXNzZWN0b3JfaGFuZGxlX3QgbGhuYl9oYW5kbGU7CisrCisrCXJhbmFwX2hhbmRsZSA9IGZpbmRfZGlzc2VjdG9yKCJyYW5hcCIpOworKworKwlsaG5iX2hhbmRsZSA9IGNyZWF0ZV9kaXNzZWN0b3JfaGFuZGxlKGRpc3NlY3RfbGhuYiwgcHJvdG9fbGhuYik7CisrCisrCWRpc3NlY3Rvcl9hZGQoInNjdHAucHBpIiwgTEhOQl9TQ1RQX1BQSV9NTSwgbGhuYl9oYW5kbGUpOworKwlkaXNzZWN0b3JfYWRkKCJzY3RwLnBwaSIsIExITkJfU0NUUF9QUElfR01NLCBsaG5iX2hhbmRsZSk7CisrCWRpc3NlY3Rvcl9hZGQoInNjdHAucG9ydCIsIExITkJfU0NUUF9QT1JULCBsaG5iX2hhbmRsZSk7CisrfQorSW5kZXg6IHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gd2lyZXNoYXJrLm9yaWcvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgorKysrIHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCitAQCAtNjA1LDYgKzYwNSw3IEBACisgCXBhY2tldC1sb29wLmMJCVwKKyAJcGFja2V0LWxwZC5jCQlcCisgCXBhY2tldC1sc2MuYwkJXAorKwlwYWNrZXQtbHVjZW50X2huYi5jCVwKKyAJcGFja2V0LWx3YXBwLmMJCVwKKyAJcGFja2V0LWx3cmVzLmMJCVwKKyAJcGFja2V0LW0ycGEuYwkJXApkaWZmIC0tZ2l0IGEvd2lyZXNoYXJrL3JzbC1pcGFjY2Vzcy5wYXRjaCBiL3dpcmVzaGFyay9yc2wtaXBhY2Nlc3MucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjMDljNQotLS0gL2Rldi9udWxsCisrKyBiL3dpcmVzaGFyay9yc2wtaXBhY2Nlc3MucGF0Y2gKQEAgLTAsMCArMSw2NTIgQEAKK0luZGV4OiB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHdpcmVzaGFyay5vcmlnL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMJMjAwOS0xMC0yMSAyMzowMzo0MS4wMDAwMDAwMDAgKzAyMDAKKysrKyB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYwkyMDA5LTEwLTIyIDEwOjAyOjUxLjAwMDAwMDAwMCArMDIwMAorQEAgLTIsNiArMiw3IEBACisgICogUm91dGluZXMgZm9yIFJhZGlvIFNpZ25hbGxpbmcgTGluayAoUlNMKSBkaXNzZWN0aW9uLgorICAqCisgICogQ29weXJpZ2h0IDIwMDcsIEFuZGVycyBCcm9tYW4gPGFuZGVycy5icm9tYW5AZXJpY3Nzb24uY29tPgorKyAqIENvcHlyaWdodCAyMDA5LCBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICAqCisgICogJElkOiBwYWNrZXQtcnNsLmMgMjk5NDQgMjAwOS0wOS0xNiAxMzozOTozN1ogbW9ycmlzcyAkCisgICoKK0BAIC00NCw2ICs0NSw4IEBACisgI2luY2x1ZGUgPGVwYW4vbGFwZF9zYXBpLmg+CisgCisgI2luY2x1ZGUgInBhY2tldC1nc21fYV9jb21tb24uaCIKKysjaW5jbHVkZSAicGFja2V0LXJ0cC5oIgorKyNpbmNsdWRlICJwYWNrZXQtcnRjcC5oIgorIAorIC8qIEluaXRpYWxpemUgdGhlIHByb3RvY29sIGFuZCByZWdpc3RlcmVkIGZpZWxkcyAqLworIHN0YXRpYyBpbnQgcHJvdG9fcnNsCQk9IC0xOworQEAgLTExNyw2ICsxMjAsMjQgQEAKKyBzdGF0aWMgaW50IGhmX3JzbF9ydGQJCQkJPSAtMTsKKyBzdGF0aWMgaW50IGhmX3JzbF9kZWxheV9pbmQJCQk9IC0xOworIHN0YXRpYyBpbnQgaGZfcnNsX3RmbwkJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3NwZWVjaF9tb2RlX3MJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3NwZWVjaF9tb2RlX20JCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2Nvbm5fc3RhdAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY29ubl9pZAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfcnRwX3BheWxvYWQJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3J0cF9jc2RfZm10X2QJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3J0cF9jc2RfZm10X2lyCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2xvY2FsX3BvcnQJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX3JlbW90ZV9wb3J0CQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9sb2NhbF9pcAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfcmVtb3RlX2lwCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF90eF9wa3RzCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF90eF9vY3RzCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF9yeF9wa3RzCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF9yeF9vY3RzCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF9sb3N0X3BrdHMJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY3N0YXRfaWFfaml0dGVyCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X2F2Z190eF9kbHkJCT0gLTE7CisgCisgLyogSW5pdGlhbGl6ZSB0aGUgc3VidHJlZSBwb2ludGVycyAqLworIHN0YXRpYyBpbnQgZXR0X3JzbCA9IC0xOworQEAgLTE3NCw2ICsxOTUsMTUgQEAKKyBzdGF0aWMgaW50IGV0dF9pZV9tZWFzX3Jlc19ubyA9IC0xOworIHN0YXRpYyBpbnQgZXR0X2llX21lc3NhZ2VfaWQgPSAtMTsKKyBzdGF0aWMgaW50IGV0dF9pZV9zeXNfaW5mb190eXBlID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfc3BlZWNoX21vZGUgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9jb25uX3N0YXQgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9jb25uX2lkID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfcmVtb3RlX2lwID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfcmVtb3RlX3BvcnQgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9sb2NhbF9wb3J0ID0gLTE7Cisrc3RhdGljIGludCBldHRfaWVfbG9jYWxfaXAgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9ydHBfcGF5bG9hZCA9IC0xOworKworIAorIHByb3RvX3RyZWUgKnRvcF90cmVlOworIGRpc3NlY3Rvcl9oYW5kbGVfdCBnc21fYV9jY2NoX2hhbmRsZTsKK0BAIC0yMDksOCArMjM5LDExIEBACisgCXsgIDB4MDYsCQkiQ29tbW9uIENoYW5uZWwgTWFuYWdlbWVudCBtZXNzYWdlcyIgfSwKKyAJeyAgMHgwOCwJCSJUUlggTWFuYWdlbWVudCBtZXNzYWdlcyIgfSwKKyAJeyAgMHgxNiwJCSJMb2NhdGlvbiBTZXJ2aWNlcyBtZXNzYWdlcyIgfSwKKysJeyAgMHgzZiwJCSJpcC5hY2Nlc3MgVmVuZG9yIFNwZWNpZmljIG1lc3NhZ2VzIiB9LAorIAl7IDAsCQkJTlVMTCB9CisgfTsKKysjZGVmaW5lIFJTTF9NU0dESVNDX0lQQUNDRVNTCTB4M2YKKysKKyAvKgorICAqIDkuMiBNRVNTQUdFIFRZUEUKKyAgKi8KK0BAIC0yNzcsNiArMzEwLDQ5IEBACisgCS8qIAkwIDEgLSAtIC0gLSAtIC0gTG9jYXRpb24gU2VydmljZXMgbWVzc2FnZXM6ICovCisgI2RlZmluZSBSU0xfTVNHX0xPQ19JTkYJCQkJCTY1CS8qIDguNy4xICovCisgCisrLyogVmVuZG9yLVNwZWNpZmljIG1lc3NhZ2VzIG9mIGlwLmFjY2VzcyBuYW5vQlRTLiBUaGVyZSBpcyBubyBwdWJsaWMgZG9jdW1lbnRhdGlvbgorKyAqIGFib3V0IHRob3NlIGV4dGVuc2lvbnMsIGFsbCBpbmZvcm1hdGlvbiBpbiB0aGlzIGRpc3NlY3RvciBpcyBiYXNlZCBvbiBsYXdmdWwKKysgKiBwcm90b2NvbCByZXZlcnNlIGVuZ2luZXJpbmcgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4gKi8KKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX01FQVNfUFBfREVGCTB4NjAKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0hPX0NBTkRfSU5RCTB4NjEKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0hPX0NBTkRfUkVTUAkweDYyCisrCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVAkweDQ4CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9BQ0sJMHg0OQorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1RfTkFDSwkweDRhCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUCTB4NGIKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1RfQUNLIDB4NGMKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1RfTkFDSyAweDRkCisrCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19CSU5ECQkweDcwCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19CSU5EX0FDSwkweDcxCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19CSU5EX05BQ0sJMHg3MgorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfQ09OTkVDVAkweDczCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19DT05ORUNUX0FDSwkweDc0CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19DT05ORUNUX05BQ0sJMHg3NQorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRElTQ19JTkQJMHg3NgorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRElTQwkJMHg3NworKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRElTQ19BQ0sJMHg3OAorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfRElTQ19OQUNLCTB4NzkKKysKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1NSVFBfQ09ORklHCQkweGUwCisrI2RlZmluZSBSU0xfSUVfSVBBQ19QUk9YWV9VRFAJCTB4ZTEKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0JTQ01QTF9UT1VUCQkweGUyCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SRU1PVEVfSVAJCTB4ZjAKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JUCQkweGYxCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRAkJMHhmMgorKyNkZWZpbmUgUlNMX0lFX0lQQUNfTE9DQUxfUE9SVAkJMHhmMworKyNkZWZpbmUgUlNMX0lFX0lQQUNfU1BFRUNIX01PREUJCTB4ZjQKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0xPQ0FMX0lQCQkweGY1CisrI2RlZmluZSBSU0xfSUVfSVBBQ19DT05OX1NUQVQJCTB4ZjYKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0hPX0NfUEFSTVMJCTB4ZjcKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0NPTk5fSUQJCTB4ZjgKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9DU0RfRk1UCQkweGY5CisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfSklUX0JVRgkJMHhmYQorKyNkZWZpbmUgUlNMX0lFX0lQQUNfUlRQX0NPTVBSCQkweGZiCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDIJMHhmYworKyNkZWZpbmUgUlNMX0lFX0lQQUNfUlRQX01QTEVYCQkweGZkCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfTVBMRVhfSUQJMHhmZQorIAorIHN0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX21zZ190eXBlX3ZhbHNbXSA9IHsKKyAJICAvKiAJMCAwIDAgMCAtIC0gLSAtIFJhZGlvIExpbmsgTGF5ZXIgTWFuYWdlbWVudCBtZXNzYWdlczogKi8KK0BAIC0zMzksNiArNDE1LDI2IEBACisgCXsgIDB4M2YsCSJURk8gTU9EaWZpY2F0aW9uIFJFUXVlc3QiIH0sCQkJCQkvKiA4LjQuMzEgKi8KKyAJLyogCTAgMSAtIC0gLSAtIC0gLSBMb2NhdGlvbiBTZXJ2aWNlcyBtZXNzYWdlczogKi8KKyAJeyAgMHg0MSwJIkxvY2F0aW9uIEluZm9ybWF0aW9uIiB9LAkJCQkJCS8qIDguNy4xICovCisrCS8qIGlwLmFjY2VzcyAqLworKwl7ICAweDQ4LAkiaXAuYWNjZXNzIFBEQ0ggQUNUSVZBVElPTiIgfSwKKysJeyAgMHg0OSwJImlwLmFjY2VzcyBQRENIIEFDVElWQVRJT04gQUNLIiB9LAorKwl7ICAweDRhLAkiaXAuYWNjZXNzIFBEQ0ggQUNUSVZBVElPTiBOQUNLIiB9LAorKwl7ICAweDRiLAkiaXAuYWNjZXNzIFBEQ0ggREVBQ1RJVkFUSU9OIiB9LAorKwl7ICAweDRjLAkiaXAuYWNjZXNzIFBEQ0ggREVBQ1RJVkFUSU9OIEFDSyIgfSwKKysJeyAgMHg0ZCwJImlwLmFjY2VzcyBQRENIIERFQUNUSVZBVElPTiBOQUNLIiB9LAorKwl7ICAweDYwLAkiaXAuYWNjZXNzIE1FQVN1cmVtZW50IFBSRVBST0Nlc3NpbmcgRGVGYXVMVCIgfSwKKysJeyAgMHg2MSwJImlwLmFjY2VzcyBIQU5ET292ZXIgQ0FORGlkYXRlIEVOUXVpcnkiIH0sCisrCXsgIDB4NjIsCSJpcC5hY2Nlc3MgSEFORE9vdmVyIENBTkRpZGF0ZSBSRVNQb25zZSIgfSwKKysJeyAgMHg3MCwJImlwLmFjY2VzcyBDUkNYIiB9LAorKwl7ICAweDcxLAkiaXAuYWNjZXNzIENSQ1ggQUNLIiB9LAorKwl7ICAweDcyLAkiaXAuYWNjZXNzIENSQ1ggTkFDSyIgfSwKKysJeyAgMHg3MywJImlwLmFjY2VzcyBNRENYIiB9LAorKwl7ICAweDc0LAkiaXAuYWNjZXNzIE1EQ1ggQUNLIiB9LAorKwl7ICAweDc1LAkiaXAuYWNjZXNzIE1EQ1ggTkFDSyIgfSwKKysJeyAgMHg3NiwJImlwLmFjY2VzcyBETENYIElORGljYXRpb24iIH0sCisrCXsgIDB4NzcsCSJpcC5hY2Nlc3MgRExDWCIgfSwKKysJeyAgMHg3OCwJImlwLmFjY2VzcyBETENYIEFDSyIgfSwKKysJeyAgMHg3OSwJImlwLmFjY2VzcyBETENYIE5BQ0siIH0sCisgCXsgMCwJCU5VTEwgfQorIH07CisgCitAQCAtMzcyLDEwICs0NjgsMTAgQEAgc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfbXNnX3R5cGVfdmFsc1tdID0geworICNkZWZpbmUgUlNMX0lFX01FU1NBR0VfSUQJCTI4CisgCisgI2RlZmluZSBSU0xfSUVfU1lTX0lORk9fVFlQRQkzMAorLQorLQorLQorLQorKyNkZWZpbmUgUlNMX0lFX01TX1BPV0VSX1BBUkFNCQkzMQorKyNkZWZpbmUgUlNMX0lFX0JTX1BPV0VSX1BBUkFNCQkzMgorKyNkZWZpbmUgUlNMX0lFX1BSRVBST0NfUEFSQU0JCTMzCisrI2RlZmluZSBSU0xfSUVfUFJFUFJPQ19NRUFTCQkzNAorICNkZWZpbmUgUlNMX0lFX0ZVTExfSU1NX0FTU19JTkYJCQkzNQorICNkZWZpbmUgUlNMX0lFX1NNU0NCX0lORgkJCQkzNgorICNkZWZpbmUgUlNMX0lFX0ZVTExfTVNfVElNSU5HX09GRlNFVAkzNworQEAgLTQ3OCw2ICs1NzQsMjQgQEAKKyAJCQlOb3QgdXNlZAorIAorIAkqLworKwl7IDB4ZTAsCQkiU1JUUCBDb25maWd1cmF0aW9uIiB9LAorKwl7IDB4ZTEsCQkiQlNDIFByb3h5IFVEUCBQb3J0IiB9LAorKwl7IDB4ZTIsCQkiQlNDIE11bHRpcGxleCBUaW1lb3V0IiB9LAorKwl7IDB4ZjAsCQkiUmVtb3RlIElQIEFkZHJlc3MiIH0sCisrCXsgMHhmMSwJCSJSZW1vdGUgUlRQIFBvcnQiIH0sCisrCXsgMHhmMiwJCSJSVFAgUGF5bG9hZCBUeXBlIiB9LAorKwl7IDB4ZjMsCQkiTG9jYWwgUlRQIFBvcnQiIH0sCisrCXsgMHhmNCwJCSJTcGVlY2ggTW9kZSIgfSwKKysJeyAweGY1LAkJIkxvY2FsIElQIEFkZHJlc3MiIH0sCisrCXsgMHhmNiwJCSJDb25uZWN0aW9uIFN0YXRpc3RpY3MiIH0sCisrCXsgMHhmNywJCSJIYW5kb3ZlciBDIFBhcmFtZXRlcnMiIH0sCisrCXsgMHhmOCwJCSJDb25uZWN0aW9uIElkZW50aWZpZXIiIH0sCisrCXsgMHhmOSwJCSJSVFAgQ1NEIEZvcm1hdCIgfSwKKysJeyAweGZhLAkJIlJUUCBKaXR0ZXIgQnVmZmVyIiB9LAorKwl7IDB4ZmIsCQkiUlRQIENvbXByZXNzaW9uIiB9LAorKwl7IDB4ZmMsCQkiUlRQIFBheWxvYWQgVHlwZSAyIiB9LAorKwl7IDB4ZmQsCQkiUlRQIE11bHRpcGxleCIgfSwKKysJeyAweGZlLAkJIlJUUCBNdWx0aXBsZXggSWRlbnRpZmllciIgfSwKKyAJeyAwLAkJCU5VTEwgfQorIH07CisgCitAQCAtNTE0LDYgKzYyOCw5NiBAQAorIAl7IDAsCQkJTlVMTCB9CisgfTsKKyAKKysvKiBGcm9tIG9wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3Rsdi5oICovCisrZW51bSB0bHZfdHlwZSB7CisrCVRMVl9UWVBFX0ZJWEVELAorKwlUTFZfVFlQRV9ULAorKwlUTFZfVFlQRV9UViwKKysJVExWX1RZUEVfVExWLAorKwlUTFZfVFlQRV9UTDE2ViwKKyt9OworKworK3N0cnVjdCB0bHZfZGVmIHsKKysJZW51bSB0bHZfdHlwZSB0eXBlOworKwl1X2ludDhfdCBmaXhlZF9sZW47CisrfTsKKysKKytzdHJ1Y3QgdGx2X2RlZmluaXRpb24geworKwlzdHJ1Y3QgdGx2X2RlZiBkZWZbMHhmZl07CisrfTsKKysKKytzdGF0aWMgY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIHJzbF9hdHRfdGx2ZGVmID0geworKwkuZGVmID0geworKwkJW1JTTF9JRV9DSF9OT10JCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfTElOS19JRF0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9BQ1RfVFlQRV0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9CU19QT1ddCQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0NIX0lEXQkJCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQ0hfTU9ERV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfRU5DX0lORl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfRlJBTUVfTk9dCQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfSE9fUkVGXQkJCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9MMV9JTkZdCQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbUlNMX0lFX0wzX0lORl0JCQk9IHsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtSU0xfSUVfTVNfSURdCQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9NU19QT1ddCQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1BBR0lOR19HUlBdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfUEFHSU5HX0xPQURdCQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfUEhZX0NUWF0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQUNDRVNTX0RFTEFZXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1JBQ0hfTE9BRF0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUkVRX1JFRl0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMyB9LAorKwkJW1JTTF9JRV9SRUxfTU9ERV0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9SRVNPVVJDRV9JTkZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX1JMTV9DQVVTRV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfU1RBUlRJTkdfVElNRV0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9USU1JTkdfQURWXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1VQTElOS19NRUFTXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DQVVTRV0JCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX01FQVNfUkVTX05PXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX01FU1NBR0VfSURdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfU1lTX0lORk9fVFlQRV0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9NU19QT1dFUl9QQVJBTV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQlNfUE9XRVJfUEFSQU1dCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX1BSRVBST0NfUEFSQU1dCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX1BSRVBST0NfTUVBU10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCS8vW1JTTF9JRV9JTU1fQVNTX0lORk9dCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQkvL1tSU0xfSUVfU01TQ0JfSU5GT10JCT0geyBUTFZfVFlQRV9GSVhFRCwgMjMgfSwKKysJCS8vW1JTTF9JRV9NU19USU1JTkdfT0ZGU0VUXQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfRVJSX01TR10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfRlVMTF9CQ0NIX0lORl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQ0hfTkVFREVEXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0NCX0NNRF9UWVBFXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1NNU0NCX01FU1NdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0ZVTExfSU1NX0FTU19JTkZdCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCS8vW1JTTF9JRV9TQUNDSF9JTkZPXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DQkNIX0xPQURfSU5GXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1NNU0NCX0NIX0lORF0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9HUlBfQ0FMTF9SRUZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NIX0RFU0NdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX05DSF9EUlhfSU5GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DTURfSU5EXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9FTUxQUF9QUklPXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1VJQ10JCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX01BSU5fQ0hfUkVGXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX01VTFRJUkFURV9DT05GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9NVUxUSVJBVEVfQ05UUkxdCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9TVVBfQ09ERUNfVFlQRVNdCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQ09ERUNfQ09ORl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUlREXQkJCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9URk9fU1RBVFVTXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0xMUF9BUERVXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9JUEFDX1JFTU9URV9JUF0JCT0geyBUTFZfVFlQRV9GSVhFRCwgNCB9LAorKwkJW1JTTF9JRV9JUEFDX1JFTU9URV9QT1JUXQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfSVBBQ19MT0NBTF9JUF0JCT0geyBUTFZfVFlQRV9GSVhFRCwgNCB9LAorKwkJW1JTTF9JRV9JUEFDX0NPTk5fU1RBVF0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfSVBBQ19MT0NBTF9QT1JUXQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERV0JPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0lQQUNfQ09OTl9JRF0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9JUEFDX1JUUF9QQVlMT0FEMl0JPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCX0sCisrfTsKKysKKyAvKiA5LjMuMSBDaGFubmVsIG51bWJlcgkJCTkuMy4xCU0gVFYgMiAqLworIHN0YXRpYyBpbnQKKyBkaXNzZWN0X3JzbF9pZV9jaF9ubyh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8gX1VfLCBwcm90b190cmVlICp0cmVlLCBpbnQgb2Zmc2V0LCBnYm9vbGVhbiBpc19tYW5kYXRvcnkpCitAQCAtMjA0NCw3ICsyMjQ4LDYgQEAKKyAJcHJvdG9faXRlbV9zZXRfbGVuKHRpLCBsZW5ndGgrMik7CisgCisgCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2llX2xlbmd0aCwgdHZiLCBvZmZzZXQsIDEsIEZBTFNFKTsKKy0Jb2Zmc2V0Kys7CisgCisgCS8qIFJlY2VpdmVkIE1lc3NhZ2UgKi8KKyAJb2Zmc2V0ID0gZGlzc2N0X3JzbF9tc2codHZiLCBwaW5mbywgaWVfdHJlZSwgb2Zmc2V0KTsKK0BAIC0yOTA5LDEyICszMTEyLDE4MyBAQAorIH0KKyAKKyBzdGF0aWMgaW50CisrZGlzc2N0X3JzbF9pcGFjY2Vzc19tc2codHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLAkJCQkgICAgaW50IG9mZnNldCkKKyt7CisrCWd1aW50OCBtc2dfdHlwZTsKKysJZ3VpbnQzMiBsb2NhbF9hZGRyID0gMDsKKysJZ3VpbnQxNiBsb2NhbF9wb3J0ID0gMDsKKysJYWRkcmVzcyBzcmNfYWRkcjsKKysKKysJbXNnX3R5cGUgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCkmMHg3ZjsKKysJb2Zmc2V0Kys7CisrCisrI2lmIDAKKysJc3dpdGNoIChtc2dfdHlwZSkgeworKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0JJTkQ6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQklORF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQklORF9OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0NPTk5FQ1Q6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQ09OTkVDVF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQ09OTkVDVF9OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0RJU0NfSU5EOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0RJU0M6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfRElTQ19BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfRElTQ19OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1Q6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9OQUNLOgorKwkJLyogQ2hhbm5lbCBudW1iZXIJCQk5LjMuMQlNIFRWIDIJCSovCisrCQlvZmZzZXQgPSBkaXNzZWN0X3JzbF9pZV9jaF9ubyh0dmIsIHBpbmZvLCB0cmVlLCBvZmZzZXQsIFRSVUUpOworKwkJYnJlYWs7CisrCX0KKysjZW5kaWYKKysJLyogcGFyc2UgVExWIGF0dHJpYnV0ZXMgKi8KKysJd2hpbGUgKHR2Yl9yZXBvcnRlZF9sZW5ndGhfcmVtYWluaW5nKHR2Yiwgb2Zmc2V0KSAhPSAwKSB7CisrCQlndWludDggdGFnOworKwkJdW5zaWduZWQgaW50IGxlbiwgaGxlbiwgbGVuX2xlbjsKKysJCWNvbnN0IHN0cnVjdCB0bHZfZGVmICp0ZGVmOworKwkJcHJvdG9faXRlbSAqdGk7CisrCQlwcm90b190cmVlICppZV90cmVlOworKworKwkJdGFnID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJdGRlZiA9ICZyc2xfYXR0X3RsdmRlZi5kZWZbdGFnXTsKKysKKysJCXN3aXRjaCAodGRlZi0+dHlwZSkgeworKwkJY2FzZSBUTFZfVFlQRV9GSVhFRDoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSB0ZGVmLT5maXhlZF9sZW47CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1Q6CisrCQkJaGxlbiA9IDE7CisrCQkJbGVuX2xlbiA9IDA7CisrCQkJbGVuID0gMDsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVFY6CisrCQkJaGxlbiA9IDE7CisrCQkJbGVuX2xlbiA9IDA7CisrCQkJbGVuID0gMTsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVExWOgorKwkJCWhsZW4gPSAyOworKwkJCWxlbl9sZW4gPSAxOworKwkJCWxlbiA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzEpOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UTDE2VjoKKysJCQlobGVuID0gMzsKKysJCQlsZW5fbGVuID0gMjsKKysJCQlsZW4gPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsxKSA8PCA4IHwKKysJCQkJCXR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzIpOworKwkJCWJyZWFrOworKwkJZGVmYXVsdDoKKysJCQlobGVuID0gbGVuX2xlbiA9IGxlbiA9IDA7CisrCQkJRElTU0VDVE9SX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworKwkJCWJyZWFrOworKwkJfQorKworKwkJdGkgPSBwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX3JzbF9pZV9pZCwgdHZiLCBvZmZzZXQsIDEsIEZBTFNFKTsKKysJCWllX3RyZWUgPSBwcm90b19pdGVtX2FkZF9zdWJ0cmVlKHRpLCBldHRfaWVfbG9jYWxfcG9ydCk7CisrCQlvZmZzZXQgKz0gaGxlbjsKKysKKysJCXN3aXRjaCAodGFnKSB7CisrCQljYXNlIFJTTF9JRV9DSF9OTzoKKysJCQlkaXNzZWN0X3JzbF9pZV9jaF9ubyh0dmIsIHBpbmZvLCBpZV90cmVlLCBvZmZzZXQsIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0ZSQU1FX05POgorKwkJCWRpc3NlY3RfcnNsX2llX2ZyYW1lX25vKHR2YiwgcGluZm8sIGllX3RyZWUsIG9mZnNldCwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfTVNfUE9XOgorKwkJCWRpc3NlY3RfcnNsX2llX21zX3Bvdyh0dmIsIHBpbmZvLCBpZV90cmVlLCBvZmZzZXQsIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfUkVNT1RFX0lQOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3JlbW90ZV9pcCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JUOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3JlbW90ZV9wb3J0LCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfTE9DQUxfSVA6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfbG9jYWxfaXAsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWxvY2FsX2FkZHIgPSB0dmJfZ2V0X2lwdjQodHZiLCBvZmZzZXQpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2xvY2FsX3BvcnQsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWxvY2FsX3BvcnQgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfU1BFRUNIX01PREU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfc3BlZWNoX21vZGVfcywgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfc3BlZWNoX21vZGVfbSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FEOgorKwkJY2FzZSBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDI6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfcnRwX3BheWxvYWQsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19SVFBfQ1NEX0ZNVDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9ydHBfY3NkX2ZtdF9kLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9ydHBfY3NkX2ZtdF9pciwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX0NPTk5fSUQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY29ubl9pZCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX0NPTk5fU1RBVDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF90eF9wa3RzLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfdHhfb2N0cywgdHZiLAorKwkJCQkJICAgIG9mZnNldCs0LCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfcnhfcGt0cywgdHZiLAorKwkJCQkJICAgIG9mZnNldCs4LCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfcnhfb2N0cywgdHZiLAorKwkJCQkJICAgIG9mZnNldCsxMiwgNCwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X2xvc3RfcGt0cywgdHZiLAorKwkJCQkJICAgIG9mZnNldCsxNiwgNCwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X2lhX2ppdHRlciwgdHZiLAorKwkJCQkJICAgIG9mZnNldCsyMCwgNCwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X2F2Z190eF9kbHksIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrMjQsIDQsIEZBTFNFKTsKKysJCQlicmVhazsKKysJCX0KKysJCW9mZnNldCArPSBsZW47CisrCX0KKysKKysJc3dpdGNoIChtc2dfdHlwZSkgeworKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX0JJTkRfQUNLOgorKwkJLyogTm90aWZ5IHRoZSBSVFAgYW5kIFJUQ1AgZGlzc2VjdG9ycyBhYm91dCBhIG5ldyBSVFAgc3RyZWFtICovCisrCQlzcmNfYWRkci50eXBlID0gQVRfSVB2NDsKKysJCXNyY19hZGRyLmxlbiA9IDQ7CisrCQlzcmNfYWRkci5kYXRhID0gKGd1aW50OCAqKSZsb2NhbF9hZGRyOworKwkJcnRwX2FkZF9hZGRyZXNzKHBpbmZvLCAmc3JjX2FkZHIsIGxvY2FsX3BvcnQsIDAsCisrCQkJCSJHU00gQS1iaXMvSVAiLCBwaW5mby0+ZmQtPm51bSwgMCwgTlVMTCk7CisrCQlydGNwX2FkZF9hZGRyZXNzKHBpbmZvLCAmc3JjX2FkZHIsIGxvY2FsX3BvcnQrMSwgMCwKKysJCQkJICJHU00gQS1iaXMvSVAiLCBwaW5mby0+ZmQtPm51bSk7CisrCQlicmVhazsKKysJfQorKwlyZXR1cm4gb2Zmc2V0OworK30KKysKKytzdGF0aWMgaW50CisgZGlzc2N0X3JzbF9tc2codHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLCBpbnQgb2Zmc2V0KQorIHsKKy0JZ3VpbnQ4CW1zZ190eXBlOworKwlndWludDgJbXNnX2Rpc2MsIG1zZ190eXBlOworIAorKwltc2dfZGlzYyA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KyspID4+IDE7CisgCW1zZ190eXBlID0gdHZiX2dldF9ndWludDgodHZiLG9mZnNldCkmMHg3ZjsKKyAJcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9yc2xfbXNnX3R5cGUsIHR2Yiwgb2Zmc2V0LCAxLCBGQUxTRSk7CisrCisrCWlmIChtc2dfZGlzYyA9PSBSU0xfTVNHRElTQ19JUEFDQ0VTUykgeworKwkJb2Zmc2V0ID0gZGlzc2N0X3JzbF9pcGFjY2Vzc19tc2codHZiLCBwaW5mbywgdHJlZSwgb2Zmc2V0KTsKKysJCXJldHVybiBvZmZzZXQ7CisrCX0KKyAJb2Zmc2V0Kys7CisgCisgCXN3aXRjaCAobXNnX3R5cGUpeworQEAgLTM0ODIsNiArMzg1NiwxOCBAQAorIAkJLyogTExQIEFQRFUgOS4zLjU4IE0gTFYgMi1OICovCisgCQlvZmZzZXQgPSBkaXNzZWN0X3JzbF9pZV9sbHBfYXBkdSh0dmIsIHBpbmZvLCB0cmVlLCBvZmZzZXQsIFRSVUUpOworIAkJYnJlYWs7CisrCS8qIHRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgYXJlIGlwLmFjY2VzcyBzcGVjaWZpYyBidXQgc2VudCB3aXRob3V0CisrCSAqIGlwLmFjY2VzcyBtZW1zc2FnZSBkaXNjcmltaW5hdG9yICovCisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfTUVBU19QUF9ERUY6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfSE9fQ0FORF9JTlE6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfSE9fQ0FORF9SRVNQOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9OQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1Q6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9OQUNLOgorKwkJb2Zmc2V0ID0gZGlzc2N0X3JzbF9pcGFjY2Vzc19tc2codHZiLCBwaW5mbywgdHJlZSwgb2Zmc2V0LTEpOworIAlkZWZhdWx0OgorIAkJYnJlYWs7CisgCX0KK0BAIC0zNDg5LDYgKzM4NzUsNDAgQEAKKyAJcmV0dXJuIG9mZnNldDsKKyAKKyB9CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfaXBhY2Nfc3BtX3NfdmFsc1tdID0geworKwl7IDAsCSJHU00gRlIgY29kZWMgKEdTTSB0eXBlIDEsIEZTKSIgfSwKKysJeyAxLAkiR1NNIEVGUiBjb2RlYyAoR1NNIHR5cGUgMiwgRlMpIiB9LAorKwl7IDIsIAkiR1NNIEFNUi9GUiBjb2RlYyAoR1NNIHR5cGUgMywgRlMpIiB9LAorKwl7IDMsCSJHU00gSFIgY29kZWMgKEdTTSB0eXBlIDEsIEhTKSIgfSwKKysJeyA1LAkiR1NNIEFNUi9IUiBjb2RlYyAoR1NNIHR5cGUgMywgSFMpIiB9LAorKwl7IDB4ZiwJIkFzIHNwZWNpZmllZCBieSBSVFAgUGF5bG9hZCBUeXBlIElFIiB9LAorKwl7IDAsCU5VTEwgfQorK307CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfaXBhY2Nfc3BtX21fdmFsc1tdID0geworKwl7IDAsCSJTZW5kIGFuZCBSZWNlaXZlIiB9LAorKwl7IDEsCSJSZWNlaXZlIE9ubHkiIH0sCisrCXsgMiwJIlNlbmQgT25seSIgfSwKKysJeyAwLCAJTlVMTCB9CisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9pcGFjY19ydHBfY3NkX2ZtdF9kX3ZhbHNbXSA9IHsKKysJeyAwLAkiRXh0ZXJuYWwgVFJBVSBmb3JtYXQiIH0sCisrCXsgMSwJIk5vbi1UUkFVIFBhY2tlZCBmb3JtYXQiIH0sCisrCXsgMiwJIlRSQVUgd2l0aGluIHRoZSBCVFMiIH0sCisrCXsgMywJIklXRi1GcmVlIEJUUy1CVFMgRGF0YSIgfSwKKysJeyAwLCAJTlVMTCB9CisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9pcGFjY19ydHBfY3NkX2ZtdF9pcl92YWxzW10gPSB7CisrCXsgMCwJIjhrYi9zIiB9LAorKwl7IDEsCSIxNmtiL3MiIH0sCisrCXsgMiwJIjMya2IvcyIgfSwKKysJeyAzLAkiNjRrYi9zIiB9LAorKwl7IDAsCU5VTEwgfQorK307CisrCisgc3RhdGljIHZvaWQKKyBkaXNzZWN0X3JzbCh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUpCisgeworQEAgLTM1MTYsNyArMzkzNiw2IEBACisgCQkvKiA5LjEgTWVzc2FnZSBkaXNjcmltaW5hdG9yICovCisgCQlwcm90b190cmVlX2FkZF9pdGVtKHJzbF90cmVlLCBoZl9yc2xfbXNnX2RzYywgdHZiLCBvZmZzZXQsIDEsIEZBTFNFKTsKKyAJCXByb3RvX3RyZWVfYWRkX2l0ZW0ocnNsX3RyZWUsIGhmX3JzbF9UX2JpdCwgdHZiLCBvZmZzZXQsIDEsIEZBTFNFKTsKKy0JCW9mZnNldCsrOworIAorIAkJb2Zmc2V0ID0gZGlzc2N0X3JzbF9tc2codHZiLCBwaW5mbywgcnNsX3RyZWUsIG9mZnNldCk7CisgCitAQCAtMzg4Niw2ICs0MzA1LDg2IEBACisgCQkJRlRfVUlOVDgsIEJBU0VfREVDLCBWQUxTKHJzbF9lbWxwcF9wcmlvX3ZhbHMpLCAweDAzLAorIAkJCU5VTEwsIEhGSUxMIH0KKyAJCX0sCisrCQl7ICZoZl9yc2xfc3BlZWNoX21vZGVfcywKKysJCQl7ICJpcC5hY2Nlc3MgU3BlZWNoIE1vZGUgUyIsICJyc2wuaXBhY2Muc3BlZWNoX21vZGVfcyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMocnNsX2lwYWNjX3NwbV9zX3ZhbHMpLAorKwkJCSAgMHhmLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX3NwZWVjaF9tb2RlX20sCisrCQkJeyAiaXAuYWNjZXNzIFNwZWVjaCBNb2RlIE0iLCAicnNsLmlwYWNjLnNwZWVjaF9tb2RlX20iLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKHJzbF9pcGFjY19zcG1fbV92YWxzKSwKKysJCQkgIDB4ZjAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY29ubl9zdGF0LAorKwkJCXsgImlwLmFjY2VzcyBDb25uZWN0aW9uIFN0YXRpc3RpY3MiLCJyc2wuaXBhY2MuY29ubl9zdGF0IiwKKysJCQkgIEZUX0JZVEVTLCBCQVNFX05PTkUsIE5VTEwsIDB4MCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jb25uX2lkLAorKwkJCXsgImlwLmFjY2VzcyBDb25uZWN0aW9uIElEIiwJInJzbC5pcGFjYy5jb25uX2lkIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDB4MCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9ydHBfcGF5bG9hZCwKKysJCQl7ICJpcC5hY2Nlc3MgUlRQIFBheWxvYWQgVHlwZSIsCSJyc2wuaXBhY2MucnRwX3BheWxvYWQiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAweDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfcnRwX2NzZF9mbXRfZCwKKysJCQl7ICJpcC5hY2Nlc3MgUlRQIENTRCBGb3JtYXQgRCIsICJyc2wuaXBhY2MucnRwX2NzZF9mbXRfZCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMocnNsX2lwYWNjX3J0cF9jc2RfZm10X2RfdmFscyksCisrCQkJICAweDBmLCBOVUxMLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9ydHBfY3NkX2ZtdF9pciwKKysJCQl7ICJpcC5hY2Nlc3MgUlRQIENTRCBGb3JtYXQgSVIiLCAicnNsLmlwYWNjLnJ0cF9jc2RfZm10X2lyIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhyc2xfaXBhY2NfcnRwX2NzZF9mbXRfaXJfdmFscyksCisrCQkJICAweGYwLCBOVUxMLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9sb2NhbF9wb3J0LAorKwkJCXsgImlwLmFjY2VzcyBMb2NhbCBSVFAgUG9ydCIsCSJyc2wuaXBhY2MubG9jYWxfcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAweDAsCisrCQkJICAiaXAuYWNjZXNzIExvY2FsIFJUUCBQb3J0IiwgSEZJTEwgfSwKKysJCX0sCisrCQl7ICZoZl9yc2xfcmVtb3RlX3BvcnQsCisrCQkJeyAiaXAuYWNjZXNzIFJlbW90ZSBSVFAgUG9ydCIsCSJyc2wuaXBhY2MucmVtb3RlX3BvcnQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHgwLAorKwkJCSAgImlwLmFjY2VzcyBSZW1vdGUgUlRQIFBvcnQiLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9sb2NhbF9pcCwKKysJCQl7ICJpcC5hY2Nlc3MgTG9jYWwgSVAgQWRkcmVzcyIsCSJyc2wuaXBhY2MubG9jYWxfaXAiLAorKwkJCSAgRlRfSVB2NCwgQkFTRV9OT05FLCBOVUxMLCAweDAsCisrCQkJICAiaXAuYWNjZXNzIExvY2FsIElQIEFkZHJlc3MiLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9yZW1vdGVfaXAsCisrCQkJeyAiaXAuYWNjZXNzIFJlbW90ZSBJUCBBZGRyZXNzIiwgInJzbC5pcGFjYy5yZW1vdGVfaXAiLAorKwkJCSAgRlRfSVB2NCwgQkFTRV9OT05FLCBOVUxMLCAweDAsCisrCQkJICAiaXAuYWNjZXNzIFJlbW90ZSBJUCBBZGRyZXNzIiwgSEZJTEwgfSwKKysJCX0sCisrCQl7ICZoZl9yc2xfY3N0YXRfdHhfcGt0cywKKysJCQl7ICJQYWNrZXRzIFNlbnQiLCAicnNsLmlwYWNjLmNzdGF0LnR4X3BrdHMiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF90eF9vY3RzLAorKwkJCXsgIk9jdGV0cyBTZW50IiwgInJzbC5pcGFjYy5jc3RhdC50eF9vY3RldHMiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF9yeF9wa3RzLAorKwkJCXsgIlBhY2tldHMgUmVjZWl2ZWQiLCAicnNsLmlwYWNjLmNzdGF0LnJ4X3BrdHMiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF9yeF9vY3RzLAorKwkJCXsgIk9jdGV0cyBSZWNlaXZlZCIsICJyc2wuaXBhY2MuY3N0YXQucnhfb2N0ZXRzIiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY3N0YXRfbG9zdF9wa3RzLAorKwkJCXsgIlBhY2tldHMgTG9zdCIsICJyc2wuaXBhY2MuY3N0YXQubG9zdF9wa3RzIiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfY3N0YXRfaWFfaml0dGVyLAorKwkJCXsgIkludGVyLWFycml2YWwgSml0dGVyIiwgInJzbC5pcGFjYy5jc3RhdC5pYV9qaXR0ZXIiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF9hdmdfdHhfZGx5LAorKwkJCXsgIkF2ZXJhZ2UgVHggRGVsYXkiLCAicnNsLmlwYWNjLmNzdGF0LmF2Z190eF9kZWxheSIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorIAl9OworIAlzdGF0aWMgZ2ludCAqZXR0W10gPSB7CisgCQkmZXR0X3JzbCwKK0BAIC0zOTQzLDYgKzQ0NDIsMTQgQEAKKyAJCSZldHRfaWVfbWVhc19yZXNfbm8sCisgCQkmZXR0X2llX21lc3NhZ2VfaWQsCisgCQkmZXR0X2llX3N5c19pbmZvX3R5cGUsCisrCQkmZXR0X2llX3NwZWVjaF9tb2RlLAorKwkJJmV0dF9pZV9jb25uX3N0YXQsCisrCQkmZXR0X2llX2Nvbm5faWQsCisrCQkmZXR0X2llX3JlbW90ZV9pcCwKKysJCSZldHRfaWVfcmVtb3RlX3BvcnQsCisrCQkmZXR0X2llX2xvY2FsX3BvcnQsCisrCQkmZXR0X2llX2xvY2FsX2lwLAorKwkJJmV0dF9pZV9ydHBfcGF5bG9hZCwKKyAJfTsKKyAKKyAJLyogUmVnaXN0ZXIgdGhlIHByb3RvY29sIG5hbWUgYW5kIGRlc2NyaXB0aW9uICovCmRpZmYgLS1naXQgYS93aXJlc2hhcmsvcnNsLXN5c3RlbV9pbmZvLnBhdGNoIGIvd2lyZXNoYXJrL3JzbC1zeXN0ZW1faW5mby5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTQ1YzY1Ci0tLSAvZGV2L251bGwKKysrIGIvd2lyZXNoYXJrL3JzbC1zeXN0ZW1faW5mby5wYXRjaApAQCAtMCwwICsxLDEzIEBACitJbmRleDogd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLSB3aXJlc2hhcmsub3JpZy9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXJzbC5jCisrKysgd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMKK0BAIC0yMjkxLDcgKzIyOTEsNyBAQAorIAorIAlwcm90b190cmVlX2FkZF90ZXh0KGllX3RyZWUsIHR2YixvZmZzZXQsbGVuZ3RoLCJMYXllciAzIG1lc3NhZ2UiKTsKKyAJbmV4dF90dmIgPSB0dmJfbmV3X3N1YnNldCh0dmIsIG9mZnNldCwgbGVuZ3RoLCBsZW5ndGgpOworLQkvKiBjYWxsX2Rpc3NlY3Rvcihnc21fYV9kdGFwX2hhbmRsZSwgbmV4dF90dmIsIHBpbmZvLCB0b3BfdHJlZSk7Ki8KKysJY2FsbF9kaXNzZWN0b3IoZ3NtX2FfY2NjaF9oYW5kbGUsIG5leHRfdHZiLCBwaW5mbywgdG9wX3RyZWUpOworIAorIAlvZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7CisgCg==